Files
kopalnia_2014/docs/SoftSPM_Instrukcja_Synchronizacja_Uzytkownikow_SYNDIS.html
T
2026-09-03 11:24:19 +02:00

605 lines
37 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>SoftSPM - Synchronizacja użytkowników z SYNDIS</title>
<link rel="shortcut icon" href="../images/SoftSPM.ico">
<style>
/* ============================================================================
* SoftSPM - instrukcja uzytkownika
* Kolorystyka i typografia zgodna ze strona logowania (style/login.css):
* turkus #29ABE2 / #0C7491, czerwien #C1272D, atrament #26323A.
* ========================================================================== */
:root{
--spm-teal:#29abe2; --spm-teal-dark:#0c7491; --spm-red:#c1272d;
--spm-ink:#26323a; --spm-muted:#7d8a93; --spm-line:#dfe6ea;
--spm-page:#f6f9fb; --spm-card:#ffffff; --spm-sunken:#eef3f6;
--spm-teal-bg:#eaf6fc;
--spm-ok:#1f8a53; --spm-ok-bg:#eaf6f0;
--spm-warn:#b3760a; --spm-warn-bg:#fdf5e6;
--spm-alarm:#c1272d; --spm-alarm-bg:#fceceb;
--font-sans:"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
--font-mono:Consolas,"Courier New",monospace;
--radius:8px;
--shadow-sm:0 1px 2px rgba(38,50,58,.06),0 1px 3px rgba(38,50,58,.08);
--shadow-md:0 6px 16px rgba(12,116,145,.14);
--sidebar-w:290px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--font-sans);background:var(--spm-page);color:var(--spm-ink);font-size:16px;line-height:1.6;-webkit-text-size-adjust:100%;text-size-adjust:100%}
h1,h2,h3,h4{color:var(--spm-ink);line-height:1.25;letter-spacing:-0.01em}
h1{font-size:32px;font-weight:800}
h2{font-size:25px;font-weight:700;margin-bottom:12px}
h3{font-size:18px;font-weight:600;margin-bottom:8px}
h4{font-size:15.5px;font-weight:600;margin-bottom:6px}
p{margin-bottom:12px;max-width:78ch}
ul,ol{margin:0 0 12px 22px}
li{margin-bottom:5px}
a{color:var(--spm-teal-dark)}
strong{color:var(--spm-ink);font-weight:600}
.mono{font-family:var(--font-mono)}
code{font-family:var(--font-mono);font-size:13.5px;background:var(--spm-sunken);border:1px solid var(--spm-line);border-radius:5px;padding:1px 6px;color:var(--spm-teal-dark)}
/* ---------------------------- uklad ------------------------------------- */
.shell{display:flex;min-height:100vh}
.sidebar{
width:var(--sidebar-w);flex-shrink:0;position:fixed;top:0;bottom:0;overflow-y:auto;
padding:26px 16px;z-index:20;color:#dbe8ee;
background:
radial-gradient(42% 42% at 96% 4%, rgba(255,255,255,.07) 0%, rgba(255,255,255,0) 70%),
radial-gradient(60% 55% at 22% 104%, rgba(41,171,226,.22) 0%, rgba(41,171,226,0) 60%),
linear-gradient(155deg,#0a5366 0%,#074152 45%,#052b39 75%,#04212c 100%);
}
.sidebar::before{
content:"";position:absolute;inset:0;top:0;left:0;right:0;bottom:0;z-index:0;pointer-events:none;
background-image:radial-gradient(rgba(255,255,255,.06) 1px, rgba(255,255,255,0) 1.6px);
background-size:24px 24px;opacity:.5;
-webkit-mask-image:linear-gradient(to bottom, rgba(0,0,0,.9) 0%, rgba(0,0,0,0) 65%);
mask-image:linear-gradient(to bottom, rgba(0,0,0,.9) 0%, rgba(0,0,0,0) 65%);
}
.sidebar>*{position:relative;z-index:1}
.logo{padding:0 8px 18px;border-bottom:1px solid rgba(255,255,255,.12);margin-bottom:16px}
.logo img{display:block;width:170px;max-width:100%;height:auto;margin-bottom:12px}
.logo .kick{font-size:10.5px;letter-spacing:.28em;text-transform:uppercase;color:rgba(41,171,226,.9);font-weight:600}
.logo .sub{font-size:12.5px;color:#9fb6c1;margin-top:5px}
.toc a{display:flex;gap:10px;align-items:baseline;padding:9px 10px;border-radius:var(--radius);text-decoration:none;color:#c8dae3;font-size:14.5px;line-height:1.3}
.toc a .num{font-family:var(--font-mono);font-size:11.5px;color:#6f8d9b;width:20px;flex-shrink:0}
.toc a:hover{background:rgba(255,255,255,.06);color:#fff}
.toc a.active{background:rgba(41,171,226,.18);color:#fff;font-weight:600;box-shadow:inset 2px 0 0 var(--spm-teal)}
.toc a.active .num{color:var(--spm-teal)}
.side-actions{margin-top:18px;padding-top:16px;border-top:1px solid rgba(255,255,255,.12)}
.side-actions button{
width:100%;font-family:var(--font-sans);font-size:13px;font-weight:600;padding:10px 12px;
border:0;border-radius:var(--radius);cursor:pointer;color:#fff;
background:linear-gradient(135deg,var(--spm-teal) 0%,var(--spm-teal-dark) 100%);
box-shadow:0 6px 16px rgba(12,116,145,.25);transition:filter .15s,box-shadow .15s}
.side-actions button:hover{filter:brightness(1.06)}
.side-actions button:focus-visible,.toc a:focus-visible,.navbtns a:focus-visible{outline:3px solid rgba(41,171,226,.45);outline-offset:2px}
.progress-track{position:fixed;top:0;left:var(--sidebar-w);right:0;height:3px;z-index:60}
.progress-bar{height:100%;width:0;background:linear-gradient(90deg,var(--spm-teal-dark),var(--spm-teal))}
main{margin-left:var(--sidebar-w);padding:44px 48px 80px;flex:1;max-width:calc(var(--sidebar-w) + 1060px);min-width:0}
.chapter{display:block}
.chapter + .chapter{margin-top:40px;padding-top:32px;border-top:1px solid var(--spm-line)}
html.js-nav .chapter{display:none;margin-top:0;padding-top:0;border-top:none}
html.js-nav .chapter.visible{display:block}
/* ---------------------------- pasek mobilny ----------------------------- */
.mobilebar{display:none;position:sticky;top:0;z-index:40;background:#04212c;padding:10px 14px;align-items:center;gap:12px}
.mobilebar .burger{flex-shrink:0;width:42px;height:42px;border:1px solid rgba(255,255,255,.2);background:transparent;border-radius:var(--radius);cursor:pointer;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:0}
.mobilebar .burger span{display:block;width:18px;height:2px;background:#dbe8ee;border-radius:2px}
.mobilebar .mb-title{font-size:15px;font-weight:700;color:#fff;line-height:1.2;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mobilebar .mb-title b{color:var(--spm-teal)}
.mobilebar .mb-step{margin-left:auto;font-family:var(--font-mono);font-size:12px;color:#9fb6c1;flex-shrink:0}
.backdrop{display:none;position:fixed;inset:0;background:rgba(6,18,26,.55);z-index:45}
.backdrop.show{display:block}
@media print{
.sidebar,.navbtns,.progress-track,.mobilebar,.backdrop,.side-actions{display:none!important}
main{margin:0;padding:10mm;max-width:none}
.chapter{display:block!important;page-break-after:always}
.diagram svg{min-width:0!important}
body{background:#fff}
}
@media (max-width:1180px){ :root{--sidebar-w:250px} main{padding:36px 28px 70px} }
@media (max-width:900px){
.shell{flex-direction:column}
.sidebar{position:static;width:100%}
html.js-nav .mobilebar{display:flex}
html.js-nav .sidebar{position:fixed;top:0;bottom:0;left:0;width:min(320px,86vw);transform:translateX(-100%);transition:transform .22s ease;z-index:50}
html.js-nav .sidebar.open{transform:none;box-shadow:var(--shadow-md)}
main{margin-left:0;padding:22px 16px 56px;max-width:none}
.progress-track{left:0}
h1{font-size:clamp(23px,6vw,30px)}
h2{font-size:clamp(20px,5vw,24px)}
.lead{font-size:16.5px}
.card{padding:16px}
.grid2,.grid3{grid-template-columns:1fr}
.navbtns{flex-wrap:wrap}
.navbtns a{flex:1 1 auto;text-align:center}
.diagram svg{min-width:660px}
.diagram .cap::before{content:"Rysunek przewija się w bok. ";color:var(--spm-teal-dark);font-weight:600}
table.tbl{min-width:520px}
}
@media (prefers-reduced-motion: reduce){ .sidebar{transition:none} html{scroll-behavior:auto} .flowline{animation:none} }
/* ---------------------------- komponenty -------------------------------- */
.kicker{font-size:11px;font-weight:600;letter-spacing:.28em;text-transform:uppercase;color:var(--spm-teal);margin-bottom:10px}
.lead{font-size:18px;color:#46555f;max-width:74ch}
.card{background:var(--spm-card);border:1px solid var(--spm-line);border-radius:12px;padding:20px 22px;box-shadow:var(--shadow-sm);margin:18px 0}
.card h3{margin-top:0}
.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;margin:18px 0}
.grid3{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin:18px 0}
.grid2 .card,.grid3 .card{margin:0}
.stat{background:var(--spm-card);border:1px solid var(--spm-line);border-radius:12px;padding:16px 18px;box-shadow:var(--shadow-sm);border-top:3px solid var(--spm-teal)}
.stat .v{font-family:var(--font-mono);font-size:26px;font-weight:700;color:var(--spm-teal-dark)}
.stat .l{font-size:13px;color:var(--spm-muted);margin-top:2px}
.pill{display:inline-block;font-size:12px;font-weight:600;padding:3px 11px;border-radius:999px;white-space:nowrap}
.pill.ok{background:var(--spm-ok-bg);color:var(--spm-ok)}
.pill.warn{background:var(--spm-warn-bg);color:var(--spm-warn)}
.pill.alarm{background:var(--spm-alarm-bg);color:var(--spm-alarm)}
.pill.info{background:var(--spm-teal-bg);color:var(--spm-teal-dark)}
.pill.neutral{background:var(--spm-sunken);color:var(--spm-muted)}
.note{border-left:3px solid var(--spm-teal);background:var(--spm-teal-bg);border-radius:0 var(--radius) var(--radius) 0;padding:13px 16px;margin:16px 0;font-size:15px}
.note.warn{border-left-color:var(--spm-warn);background:var(--spm-warn-bg)}
.note.ok{border-left-color:var(--spm-ok);background:var(--spm-ok-bg)}
.note.alarm{border-left-color:var(--spm-alarm);background:var(--spm-alarm-bg)}
.note p:last-child{margin-bottom:0}
table.tbl{width:100%;border-collapse:collapse;font-size:14.5px;margin:14px 0;background:var(--spm-card)}
table.tbl th{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:#fff;background:var(--spm-teal-dark);font-weight:600;text-align:left;padding:9px 11px}
table.tbl td{padding:10px 11px;border-bottom:1px solid var(--spm-line);vertical-align:top}
table.tbl tr:nth-child(even) td{background:#fafcfd}
.tblwrap{overflow-x:auto;border:1px solid var(--spm-line);border-radius:var(--radius)}
.navbtns{display:flex;justify-content:space-between;gap:12px;margin-top:36px;padding-top:18px;border-top:1px solid var(--spm-line)}
.navbtns a{display:inline-block;padding:11px 20px;border-radius:var(--radius);text-decoration:none;font-weight:600;font-size:14.5px}
.navbtns a.next{background:linear-gradient(135deg,var(--spm-teal) 0%,var(--spm-teal-dark) 100%);color:#fff;box-shadow:0 6px 16px rgba(12,116,145,.25)}
.navbtns a.next:hover{filter:brightness(1.06)}
.navbtns a.prev{border:1px solid var(--spm-line);color:var(--spm-ink);background:var(--spm-card)}
.navbtns a.prev:hover{background:var(--spm-sunken)}
/* akordeon */
.acc{border:1px solid var(--spm-line);border-radius:var(--radius);margin:10px 0;background:var(--spm-card)}
.acc>button{width:100%;font-family:var(--font-sans);font-size:15px;font-weight:600;color:var(--spm-ink);text-align:left;padding:13px 16px;background:none;border:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:10px}
.acc>button::after{content:"+";font-family:var(--font-mono);font-size:18px;color:var(--spm-teal)}
.acc.open>button::after{content:"–"}
.acc>.body{padding:2px 16px 14px;font-size:14.5px}
/* kroki */
.steps{counter-reset:step;display:flex;flex-direction:column;margin:18px 0}
.step{display:flex;gap:16px;position:relative;padding-bottom:22px}
.step:last-child{padding-bottom:0}
.step::before{counter-increment:step;content:counter(step);flex-shrink:0;width:32px;height:32px;border-radius:999px;background:linear-gradient(135deg,var(--spm-teal) 0%,var(--spm-teal-dark) 100%);color:#fff;font-family:var(--font-mono);font-weight:700;font-size:14px;display:flex;align-items:center;justify-content:center;z-index:1}
.step:not(:last-child)::after{content:"";position:absolute;left:15px;top:32px;bottom:0;width:2px;background:var(--spm-line)}
.step h4{margin-bottom:3px}
.step p{margin-bottom:0;font-size:14.5px}
/* rysunki */
.diagram{background:var(--spm-card);border:1px solid var(--spm-line);border-radius:12px;padding:16px;margin:18px 0;overflow-x:auto;box-shadow:var(--shadow-sm)}
.diagram svg{display:block;margin:0 auto;max-width:100%;height:auto}
.diagram .cap{text-align:center;font-size:13px;color:var(--spm-muted);margin-top:10px}
.flowline{stroke-dasharray:7 6;animation:dashmove 1.1s linear infinite}
@keyframes dashmove{to{stroke-dashoffset:-13}}
svg text{font-family:var(--font-sans)}
svg .t-mono{font-family:var(--font-mono)}
.footer-sig{margin-top:40px;font-size:12.5px;color:var(--spm-muted);border-top:1px solid var(--spm-line);padding-top:14px}
.footer-sig b{color:var(--spm-red);font-weight:600}
/* bez JavaScriptu dokument czyta sie jako calosc */
.side-actions{display:none}
html.js-nav .side-actions{display:block}
html.js-nav .acc>.body{display:none}
html.js-nav .acc.open>.body{display:block}
html.js-nav .acc>button::after{content:"+"}
html.js-nav .acc.open>button::after{content:"–"}
.acc>button::after{content:""}
</style>
<script>document.documentElement.className += ' js-nav';</script>
</head>
<body>
<div class="progress-track"><div class="progress-bar" id="progressBar"></div></div>
<header class="mobilebar">
<button class="burger" id="navToggle" type="button" aria-label="Otwórz spis rozdziałów" aria-expanded="false" aria-controls="sidebar"><span></span><span></span><span></span></button>
<div class="mb-title">Soft<b>SPM</b> · synchronizacja</div>
<div class="mb-step" id="mbStep">01 / 07</div>
</header>
<div class="backdrop" id="navBackdrop" hidden></div>
<div class="shell">
<nav class="sidebar" id="sidebar" aria-label="Spis rozdziałów">
<div class="logo">
<img src="../images/spm_logo_new.png" alt="SoftSPM">
<div class="kick">Submersible Pumps Management</div>
<div class="sub">Instrukcja użytkownika</div>
</div>
<div class="toc" id="toc">
<a href="#ch1"><span class="num">01</span>Czym jest ta funkcja</a>
<a href="#ch2"><span class="num">02</span>Zanim zaczniesz</a>
<a href="#ch3"><span class="num">03</span>Krok po kroku</a>
<a href="#ch4"><span class="num">04</span>Opis ekranu</a>
<a href="#ch5"><span class="num">05</span>Regiony, profile, hasło</a>
<a href="#ch6"><span class="num">06</span>Komunikaty i problemy</a>
<a href="#ch7"><span class="num">07</span>Ograniczenia</a>
</div>
<div class="side-actions">
<button id="printAll" type="button">Drukuj / zapisz PDF</button>
</div>
</nav>
<main id="content">
<!-- ============ 01 ============ -->
<section class="chapter" id="ch1">
<div class="kicker">Rozdział 01</div>
<h1>Synchronizacja użytkowników z systemem SYNDIS</h1>
<p class="lead" style="margin-top:14px">Nowa funkcja w module <strong>Administracja &raquo; Zarządzanie użytkownikami</strong>. Pozwala pobrać z systemu SYNDIS pełną listę kont i jednym ekranem założyć w SoftSPM te, których jeszcze nie ma - od razu z nadanymi regionami i uprawnieniami.</p>
<div class="grid3">
<div class="stat"><div class="v">1</div><div class="l">przycisk uruchamiający całą operację</div></div>
<div class="stat"><div class="v">0</div><div class="l">zapisów do bazy przed Twoim potwierdzeniem</div></div>
<div class="stat"><div class="v">2</div><div class="l">ekrany: wybór kont i podsumowanie</div></div>
</div>
<div class="card">
<h3>Jaki problem rozwiązuje</h3>
<p>Do tej pory konto założone w SYNDIS <strong>nie pojawiało się w SoftSPM automatycznie</strong>. Za każdym razem trzeba było zgłosić to administratorowi, ręcznie wypełnić formularz nowego użytkownika, a następnie osobno ustawić hasło w formacie wymaganym przez logowanie z SYNDIS. Pominięcie tego ostatniego kroku kończyło się zgłoszeniem „nie mogę wejść do SoftSPM z Syndisa".</p>
<p style="margin-bottom:0">Nowa funkcja robi to wszystko w jednym przebiegu: sama porównuje obie bazy, sama nadaje poprawne hasło i pozwala od razu przypisać regiony oraz profile uprawnień.</p>
</div>
<div class="diagram">
<svg viewBox="0 0 900 205" width="900" height="205" role="img" aria-label="Schemat działania synchronizacji">
<rect x="8" y="58" width="152" height="74" rx="10" fill="#0c7491"/>
<text x="84" y="88" text-anchor="middle" fill="#fff" font-size="15" font-weight="700">SYNDIS</text>
<text x="84" y="109" text-anchor="middle" fill="#bfe3f2" font-size="12">lista wszystkich kont</text>
<line class="flowline" x1="164" y1="95" x2="240" y2="95" stroke="#29abe2" stroke-width="3"/>
<text x="202" y="84" text-anchor="middle" fill="#7d8a93" font-size="11" class="t-mono">SOAP</text>
<rect x="244" y="58" width="176" height="74" rx="10" fill="#fff" stroke="#dfe6ea" stroke-width="1.5"/>
<text x="332" y="88" text-anchor="middle" fill="#26323a" font-size="14" font-weight="600">Porównanie</text>
<text x="332" y="109" text-anchor="middle" fill="#7d8a93" font-size="12">z bazą SoftSPM</text>
<line class="flowline" x1="424" y1="95" x2="500" y2="95" stroke="#29abe2" stroke-width="3"/>
<rect x="504" y="44" width="176" height="102" rx="10" fill="#fff" stroke="#dfe6ea" stroke-width="1.5"/>
<text x="592" y="74" text-anchor="middle" fill="#26323a" font-size="14" font-weight="600">Lista brakujących</text>
<text x="592" y="95" text-anchor="middle" fill="#7d8a93" font-size="12">wybierasz konta,</text>
<text x="592" y="113" text-anchor="middle" fill="#7d8a93" font-size="12">regiony i profile</text>
<line class="flowline" x1="684" y1="95" x2="760" y2="95" stroke="#1f8a53" stroke-width="3"/>
<text x="722" y="84" text-anchor="middle" fill="#1f8a53" font-size="11" font-weight="600">Zapisz</text>
<rect x="764" y="58" width="128" height="74" rx="10" fill="#1f8a53"/>
<text x="828" y="88" text-anchor="middle" fill="#fff" font-size="14" font-weight="700">Konta</text>
<text x="828" y="109" text-anchor="middle" fill="#d6efe1" font-size="12">utworzone</text>
<text x="450" y="180" text-anchor="middle" fill="#7d8a93" font-size="12">Konta istniejące w SoftSPM są pomijane - nie zobaczysz ich na liście</text>
</svg>
<div class="cap">Rysunek 1. Przebieg synchronizacji od pobrania danych do zapisu.</div>
</div>
<div class="note">
<p><strong>Najważniejsza zasada.</strong> Samo otwarcie ekranu synchronizacji <strong>niczego nie zmienia w bazie</strong>. Dane są jedynie odczytywane i porównywane. Konta powstają dopiero po zaznaczeniu ich i kliknięciu przycisku <strong>Zapisz</strong>.</p>
</div>
<div class="navbtns"><span></span><a class="next" href="#ch2">Dalej: Zanim zaczniesz</a></div>
</section>
<!-- ============ 02 ============ -->
<section class="chapter" id="ch2">
<div class="kicker">Rozdział 02</div>
<h2>Zanim zaczniesz</h2>
<p class="lead">Funkcja jest przeznaczona dla administratora systemu. Wymaga uprawnień do modułu użytkowników oraz działającego połączenia sieciowego z systemem SYNDIS.</p>
<div class="grid2">
<div class="card">
<h3>Kto zobaczy przycisk</h3>
<ul style="margin-bottom:0">
<li>Użytkownik z prawem <strong>edycji w module Zarządzanie użytkownikami</strong>.</li>
<li>Zalogowany na konto administratora systemu.</li>
</ul>
<p style="margin:10px 0 0">Jeżeli przycisk nie jest widoczny, oznacza to brak jednego z powyższych warunków - nie jest to usterka.</p>
</div>
<div class="card">
<h3>Co musi działać</h3>
<ul style="margin-bottom:0">
<li>Połączenie sieciowe z usługą SYNDIS - serwer SoftSPM musi ją widzieć.</li>
<li>Poprawnie ustawiony adres usługi - konfiguruje go administrator techniczny.</li>
</ul>
<p style="margin:10px 0 0">Brak połączenia objawia się czytelnym komunikatem, opisanym w rozdziale 06.</p>
</div>
</div>
<div class="note warn">
<p><strong>Dobra praktyka.</strong> Pierwsze uruchomienie wykonaj poza godzinami szczytu. Jeżeli usługa SYNDIS nie odpowiada, strona może ładować się nawet kilkadziesiąt sekund, zanim pokaże komunikat o braku połączenia.</p>
</div>
<div class="navbtns"><a class="prev" href="#ch1">Wstecz</a><a class="next" href="#ch3">Dalej: Krok po kroku</a></div>
</section>
<!-- ============ 03 ============ -->
<section class="chapter" id="ch3">
<div class="kicker">Rozdział 03</div>
<h2>Krok po kroku</h2>
<p class="lead">Cała operacja to sześć czynności. Zakładanie kont odbywa się zbiorczo - w jednym przebiegu możesz utworzyć jedno konto albo kilkanaście.</p>
<div class="steps">
<div class="step">
<div>
<h4>Wejdź na listę użytkowników</h4>
<p>Menu <strong>Administracja &raquo; Zarządzanie użytkownikami</strong>. Zobaczysz listę wszystkich kont istniejących w SoftSPM.</p>
</div>
</div>
<div class="step">
<div>
<h4>Kliknij przycisk „Synchronizuj z SYNDIS"</h4>
<p>Znajduje się na dole ekranu, obok dotychczasowego przycisku <strong>Dodaj</strong>.</p>
</div>
</div>
<div class="step">
<div>
<h4>Poczekaj na pobranie listy</h4>
<p>System łączy się z SYNDIS, pobiera wykaz kont i porównuje go z bazą SoftSPM. Na ekranie pojawią się <strong>wyłącznie konta, których w SoftSPM jeszcze nie ma</strong>. Konta już istniejące nie są pokazywane w ogóle.</p>
</div>
</div>
<div class="step">
<div>
<h4>Przejrzyj i uzupełnij dane</h4>
<p>Każde konto ma osobną sekcję z nagłówkiem <span class="mono">login &raquo; pełna nazwa</span>. Sprawdź imię i nazwisko, uzupełnij adres e-mail i telefon, w razie potrzeby zmień status.</p>
</div>
</div>
<div class="step">
<div>
<h4>Ustaw regiony i profile</h4>
<p>Regiony są wstępnie zaznaczone zgodnie z danymi z SYNDIS, a profil - zgodnie z uprawnieniami tam nadanymi. Możesz to dowolnie zmienić. Szczegóły w rozdziale 05.</p>
</div>
</div>
<div class="step">
<div>
<h4>Zaznacz konta do utworzenia i kliknij „Zapisz"</h4>
<p>Pole <strong>Utwórz to konto</strong> jest domyślnie odznaczone przy każdej pozycji. Zapisane zostaną tylko te konta, które zaznaczysz. Po zapisie zobaczysz tabelę podsumowania.</p>
</div>
</div>
</div>
<div class="note ok">
<p><strong>Możesz przerwać w dowolnym momencie.</strong> Przycisk <strong>Anuluj</strong> wraca do listy użytkowników bez zapisywania czegokolwiek. To samo dotyczy zamknięcia karty przeglądarki.</p>
</div>
<div class="navbtns"><a class="prev" href="#ch2">Wstecz</a><a class="next" href="#ch4">Dalej: Opis ekranu</a></div>
</section>
<!-- ============ 04 ============ -->
<section class="chapter" id="ch4">
<div class="kicker">Rozdział 04</div>
<h2>Opis ekranu - co oznaczają poszczególne pola</h2>
<p class="lead">Sekcja każdego konta dzieli się na dwie części: dane odczytane z SYNDIS (tylko do wglądu) oraz dane konta zakładanego w SoftSPM (do edycji).</p>
<h3 style="margin-top:24px">Dane pobrane z SYNDIS</h3>
<div class="tblwrap">
<table class="tbl">
<thead><tr><th style="width:220px">Pole</th><th>Znaczenie</th></tr></thead>
<tbody>
<tr><td><strong>Login</strong></td><td>Nazwa konta w SYNDIS. Pole edytowalne, ale zmieniaj je wyłącznie po to, by poprawić uszkodzone znaki - musi być identyczne po obu stronach, inaczej nie zadziała logowanie z SYNDIS. Patrz ostrzeżenie o znakach zapytania poniżej.</td></tr>
<tr><td><strong>Pełna nazwa w SYNDIS</strong></td><td>Imię i nazwisko w postaci, w jakiej przekazuje je SYNDIS - w jednym polu. System sam próbuje rozdzielić je na imię i nazwisko.</td></tr>
<tr><td><strong>Uprawnienia w SYNDIS</strong></td><td>Lista uprawnień nadanych w SYNDIS. Ma charakter informacyjny - na jej podstawie system podpowiada profil w SoftSPM.</td></tr>
<tr><td><strong>Regiony w SYNDIS</strong></td><td>Numery regionów przekazane przez SYNDIS wraz z ich rozwinięciem na nazwy oddziałów używane w SoftSPM.</td></tr>
</tbody>
</table>
</div>
<h3 style="margin-top:26px">Dane konta w SoftSPM</h3>
<div class="tblwrap">
<table class="tbl">
<thead><tr><th style="width:220px">Pole</th><th>Co zrobić</th></tr></thead>
<tbody>
<tr><td><strong>Utwórz to konto</strong></td><td>Zaznacz, jeśli konto ma powstać. Domyślnie odznaczone.</td></tr>
<tr><td><strong>Imię</strong> i <strong>Nazwisko</strong></td><td>Wypełnione automatycznie przez rozdzielenie pełnej nazwy po pierwszej spacji. Sprawdź i popraw - przy nazwiskach dwuczłonowych podział bywa błędny.</td></tr>
<tr><td><strong>e-mail</strong></td><td>Puste - SYNDIS nie przekazuje adresu. Warto uzupełnić, bo bez adresu nie zadziała funkcja resetu hasła, która wysyła nowe hasło pocztą.</td></tr>
<tr><td><strong>Telefon</strong></td><td>Puste - do uzupełnienia ręcznie, jeśli jest znany.</td></tr>
<tr><td><strong>Status</strong></td><td>Ustawiony na podstawie tego, czy konto jest aktywne w SYNDIS. Możesz zmienić na Nieaktywny lub Zablokowany.</td></tr>
<tr><td><strong>Hasło</strong></td><td>Pole informacyjne - pokazuje hasło, które zostanie nadane. Nie da się go zmienić na tym ekranie i jest to działanie zamierzone (rozdział 05).</td></tr>
<tr><td><strong>Regiony</strong></td><td>Pola wyboru z oddziałami. Wstępnie zaznaczone zgodnie z SYNDIS.</td></tr>
<tr><td><strong>Przypisz do profili</strong></td><td>Lista profili uprawnień SoftSPM wraz z opisami. Wstępnie zaznaczony jeden, sugerowany profil.</td></tr>
</tbody>
</table>
</div>
<div class="note alarm">
<p><strong>Znaki zapytania w loginie lub nazwisku.</strong> System SYNDIS przesyła część polskich liter jako znak zapytania - zamiast <span class="mono">mik-dębina</span> zobaczysz <span class="mono">mik-d?bina</span>. Zachowuje się wyłącznie litera <span class="mono">ó</span>, pozostałe (<span class="mono">ą ć ę ł ń ś ź ż</span>) są tracone jeszcze przed wysłaniem, więc SoftSPM nie ma jak ich odtworzyć.</p>
<p>Gdy tak się zdarzy, na górze ekranu pojawi się czerwone ostrzeżenie, a przy polu <strong>Login</strong> czerwony dopisek. <strong>Popraw wtedy login ręcznie</strong>, wpisując go dokładnie tak, jak brzmi w SYNDIS. Pole hasła pod spodem zaktualizuje się automatycznie.</p>
<p style="margin-bottom:0">Zapisanie konta z takim loginem oznacza, że logowanie z SYNDIS nigdy dla niego nie zadziała - nazwa nie zgodzi się z tą po stronie SYNDIS. Warto też zgłosić problem do dostawcy systemu SYNDIS, bo źródło błędu jest po jego stronie.</p>
</div>
<div class="note">
<p><strong>Po zapisie</strong> zobaczysz tabelę podsumowania z listą utworzonych kont: login, imię, nazwisko, nadane regiony, nadane profile i status. Warto ją przejrzeć - to potwierdzenie, że wszystko zostało zapisane zgodnie z zamiarem.</p>
</div>
<div class="navbtns"><a class="prev" href="#ch3">Wstecz</a><a class="next" href="#ch5">Dalej: Regiony, profile, hasło</a></div>
</section>
<!-- ============ 05 ============ -->
<section class="chapter" id="ch5">
<div class="kicker">Rozdział 05</div>
<h2>Regiony, profile i hasło</h2>
<p class="lead">To trzy elementy, które decydują o tym, co użytkownik faktycznie zobaczy po zalogowaniu. Warto poświęcić im chwilę przed kliknięciem „Zapisz".</p>
<div class="grid2">
<div class="card">
<h3>Regiony</h3>
<p>Region decyduje o tym, którego oddziału dane widzi użytkownik i dokąd trafia po wejściu z linku z SYNDIS. Do wyboru są <strong>P/Szczerców</strong>, <strong>Dębina</strong> i <strong>P/Bełchatów</strong>; można zaznaczyć kilka.</p>
<p style="margin-bottom:0">System zaznacza je wstępnie na podstawie numerów regionów z SYNDIS. Jeżeli w SYNDIS nie przypisano żadnego regionu, wszystkie pola pozostaną puste - <strong>warto wtedy zaznaczyć właściwy ręcznie</strong>.</p>
</div>
<div class="card">
<h3>Profile</h3>
<p>Profil decyduje o tym, które strony systemu użytkownik zobaczy i gdzie może zapisywać zmiany. Można zaznaczyć kilka profili jednocześnie - uprawnienia się sumują.</p>
<p style="margin-bottom:0">Podpowiedź systemu jest prosta: konta z prawem edycji w SYNDIS dostają profil <strong>Operator</strong>, pozostałe <strong>Tylko odczyt</strong>. To jedynie propozycja - decyzja należy do Ciebie.</p>
</div>
</div>
<div class="note warn">
<p><strong>Konto bez profilu zaloguje się, ale nie zobaczy żadnej strony.</strong> Jeżeli odznaczysz wszystkie profile, użytkownik zgłosi się z pustym ekranem. Przy każdym koncie zostaw zaznaczony przynajmniej jeden profil.</p>
</div>
<div class="card">
<h3>Dlaczego hasła nie da się tu ustawić dowolnie</h3>
<p>Hasło nowego konta jest zawsze nadawane według stałego wzorca: <strong>login użytkownika, kropka, cyfry 123</strong> - na przykład dla loginu <span class="mono">kowalski</span> będzie to <span class="mono">kowalski.123</span>.</p>
<p>Nie jest to uproszczenie, tylko wymóg techniczny: <strong>dokładnie takiego hasła oczekuje mechanizm logowania z systemu SYNDIS</strong>. Konto z innym hasłem będzie działać przy logowaniu formularzem, ale wejście z linku z SYNDIS zakończy się powrotem do ekranu logowania - bez żadnego komunikatu wyjaśniającego przyczynę.</p>
<p style="margin-bottom:0">Ta sama zależność działa w drugą stronę: <strong>jeśli hasło zostanie później zmienione</strong> - na przykład przez funkcję resetu hasła - logowanie z SYNDIS dla tego konta przestanie działać.</p>
</div>
<div class="note alarm">
<p><strong>Zalecenie bezpieczeństwa.</strong> Hasło w tym formacie jest łatwe do odgadnięcia. Traktuj je jako hasło startowe i przekaż użytkownikowi, żeby korzystał z logowania przez SYNDIS. Jeżeli konto ma być używane wyłącznie przez formularz logowania SoftSPM, ustaw mu po utworzeniu własne hasło - pamiętając, że wyłączy to logowanie z SYNDIS.</p>
</div>
<div class="navbtns"><a class="prev" href="#ch4">Wstecz</a><a class="next" href="#ch6">Dalej: Komunikaty i problemy</a></div>
</section>
<!-- ============ 06 ============ -->
<section class="chapter" id="ch6">
<div class="kicker">Rozdział 06</div>
<h2>Komunikaty i rozwiązywanie problemów</h2>
<p class="lead">Ekran synchronizacji komunikuje się prostymi zdaniami. Poniżej wszystkie sytuacje, które możesz napotkać, i co w nich zrobić.</p>
<div class="acc">
<button type="button">„Wszystkie konta z systemu SYNDIS istnieją już w SoftSPM. Brak kont do utworzenia."</button>
<div class="body">
<p style="margin:0">Komunikat pozytywny - połączenie zadziałało, lista została pobrana i porównana, ale nie ma nic do dodania. Wróć do listy użytkowników przyciskiem <strong>Wróć do listy</strong>.</p>
</div>
</div>
<div class="acc">
<button type="button">„Nie udało się połączyć z systemem SYNDIS."</button>
<div class="body">
<p>Pod komunikatem wyświetlana jest treść błędu oraz adres, pod który system próbował się połączyć. Najczęstsze przyczyny:</p>
<ul style="margin-bottom:0">
<li>usługa SYNDIS jest wyłączona lub restartowana,</li>
<li>serwer SoftSPM nie ma dostępu sieciowego do tego adresu,</li>
<li>adres usługi jest nieaktualny - wymaga korekty przez administratora technicznego.</li>
</ul>
<p style="margin:10px 0 0">Przekaż administratorowi technicznemu treść komunikatu wraz z widocznym adresem - to wystarczy do zdiagnozowania przyczyny.</p>
</div>
</div>
<div class="acc">
<button type="button">„Nie zaznaczono żadnego konta do utworzenia."</button>
<div class="body">
<p style="margin:0">Kliknięto <strong>Zapisz</strong> bez zaznaczenia pola <strong>Utwórz to konto</strong> przy żadnej pozycji. Wróć, zaznacz właściwe konta i zapisz ponownie.</p>
</div>
</div>
<div class="acc">
<button type="button">W podsumowaniu: „Konto już istnieje w systemie - pominięto."</button>
<div class="body">
<p style="margin:0">Oznacza, że konto o tym loginie powstało już po pobraniu listy - na przykład założył je w tym czasie inny administrator. Konto nie zostało zduplikowane ani nadpisane. Nie wymaga to żadnego działania.</p>
</div>
</div>
<div class="acc">
<button type="button">Strona długo się ładuje po kliknięciu „Synchronizuj z SYNDIS"</button>
<div class="body">
<p style="margin:0">System czeka na odpowiedź SYNDIS. Jeżeli usługa nie odpowiada, oczekiwanie może potrwać kilkadziesiąt sekund, po czym pojawi się komunikat o braku połączenia. Nie odświeżaj strony wielokrotnie - poczekaj na komunikat.</p>
</div>
</div>
<div class="acc">
<button type="button">Użytkownik został utworzony, ale „nic nie widzi" po zalogowaniu</button>
<div class="body">
<p style="margin:0">Najczęściej oznacza konto bez przypisanego profilu. Wejdź w <strong>Administracja &raquo; Zarządzanie użytkownikami</strong>, otwórz konto, kliknij <strong>Modyfikuj</strong> i zaznacz właściwe profile.</p>
</div>
</div>
<div class="acc">
<button type="button">Użytkownik nie może wejść do SoftSPM z linku w SYNDIS</button>
<div class="body">
<p style="margin:0">Sprawdź dwie rzeczy: czy login w SoftSPM jest identyczny jak w SYNDIS (co do znaku) oraz czy hasło konta nie zostało w międzyczasie zmienione lub zresetowane. Zmiana hasła wyłącza logowanie z SYNDIS - opisano to w rozdziale 05.</p>
</div>
</div>
<div class="navbtns"><a class="prev" href="#ch5">Wstecz</a><a class="next" href="#ch7">Dalej: Ograniczenia</a></div>
</section>
<!-- ============ 07 ============ -->
<section class="chapter" id="ch7">
<div class="kicker">Rozdział 07</div>
<h2>Ograniczenia - czego funkcja nie robi</h2>
<p class="lead">Świadome ograniczenie zakresu jest tu celowe. Funkcja zakłada konta, ale nie ingeruje w to, co już istnieje.</p>
<div class="grid2">
<div class="card">
<h3><span class="pill ok">Robi</span></h3>
<ul style="margin-bottom:0">
<li>Pobiera pełny, aktualny wykaz kont z SYNDIS.</li>
<li>Porównuje go z bazą SoftSPM i pokazuje różnicę.</li>
<li>Zakłada wybrane konta z poprawnym hasłem.</li>
<li>Przypisuje regiony i profile uprawnień.</li>
</ul>
</div>
<div class="card">
<h3><span class="pill neutral">Nie robi</span></h3>
<ul style="margin-bottom:0">
<li>Nie aktualizuje kont już istniejących - ani nazwiska, ani statusu, ani uprawnień.</li>
<li>Nie usuwa i nie blokuje kont skasowanych w SYNDIS.</li>
<li>Nie działa automatycznie - uruchamiasz ją ręcznie, kiedy jest potrzebna.</li>
<li>Nie przenosi adresu e-mail ani telefonu, bo SYNDIS ich nie przekazuje.</li>
</ul>
</div>
</div>
<div class="note">
<p><strong>Zmiana uprawnień w SYNDIS nie przeniesie się do SoftSPM.</strong> Jeżeli istniejącemu użytkownikowi zmieniono w SYNDIS zakres uprawnień lub przypisanie do oddziału, odpowiednią zmianę trzeba wprowadzić w SoftSPM ręcznie - przez <strong>Modyfikuj</strong> na karcie użytkownika.</p>
</div>
<div class="card">
<h3>Kiedy warto uruchomić synchronizację</h3>
<ul style="margin-bottom:0">
<li>Po zgłoszeniu, że w SYNDIS pojawił się nowy pracownik potrzebujący dostępu do SoftSPM.</li>
<li>Okresowo, na przykład raz w miesiącu - żeby wychwycić konta założone bez zgłoszenia.</li>
<li>Po większych zmianach kadrowych w obsłudze odwodnienia.</li>
</ul>
</div>
<div class="footer-sig">
<b>SoftSPM</b> - instrukcja użytkownika: synchronizacja kont z systemem SYNDIS. Dokument opisuje funkcję dostępną w module Administracja &raquo; Zarządzanie użytkownikami. W razie wątpliwości dotyczących adresu usługi SYNDIS lub uprawnień skontaktuj się z administratorem technicznym systemu.
</div>
<div class="navbtns"><a class="prev" href="#ch6">Wstecz</a><span></span></div>
</section>
</main>
</div>
<script>
(function(){
var chapters = Array.prototype.slice.call(document.querySelectorAll('.chapter'));
var links = Array.prototype.slice.call(document.querySelectorAll('.toc a'));
var bar = document.getElementById('progressBar');
var sidebar = document.getElementById('sidebar');
var backdrop = document.getElementById('navBackdrop');
var navToggle = document.getElementById('navToggle');
var mbStep = document.getElementById('mbStep');
function pad(n){ return (n < 10 ? '0' : '') + n; }
function setNav(open){
sidebar.classList.toggle('open', open);
backdrop.classList.toggle('show', open);
backdrop.hidden = !open;
navToggle.setAttribute('aria-expanded', open ? 'true' : 'false');
document.body.style.overflow = open ? 'hidden' : '';
}
function closeNav(){ setNav(false); }
function show(id){
var target = document.getElementById(id) || chapters[0];
chapters.forEach(function(c){ c.classList.toggle('visible', c === target); });
links.forEach(function(a){ a.classList.toggle('active', a.getAttribute('href') === '#' + target.id); });
var idx = chapters.indexOf(target);
bar.style.width = ((idx + 1) / chapters.length * 100) + '%';
if (mbStep) mbStep.textContent = pad(idx + 1) + ' / ' + pad(chapters.length);
closeNav();
window.scrollTo({top:0, behavior:'auto'});
}
function fromHash(){ show((location.hash || '#ch1').substring(1)); }
window.addEventListener('hashchange', fromHash);
fromHash();
navToggle.addEventListener('click', function(){ setNav(!sidebar.classList.contains('open')); });
backdrop.addEventListener('click', closeNav);
document.addEventListener('keydown', function(e){ if (e.key === 'Escape') closeNav(); });
window.addEventListener('resize', function(){ if (window.innerWidth > 900) closeNav(); });
document.getElementById('printAll').addEventListener('click', function(){ window.print(); });
document.addEventListener('click', function(e){
var ab = e.target.closest('.acc > button');
if (ab){ ab.parentElement.classList.toggle('open'); }
});
})();
</script>
</body>
</html>