{"openapi":"3.0.1","info":{"title":"OptimAPI","description":"**OptimAPI** — REST API dla **Comarch ERP Optima** — warstwa integracyjna, która daje systemom zewnętrznym (sklepom, aplikacjom mobilnym, platformom B2B, narzędziom BI) dostęp do danych ERP przez standardowe żądania HTTP, bez modyfikacji Optimy.\n\nAPI instalowane jest jako usługa Windows w sieci klienta, obok Optimy. Ta dokumentacja jest wygenerowana z kodu źródłowego (25.09.2026): **129 operacji** w **28 grupach**. Na każdej instancji ta sama dokumentacja jest dostępna pod adresami `/swagger` i `/docs`.\n\n## Uwierzytelnianie\n1. Utwórz klienta API w panelu administracyjnym instancji — otrzymasz `client_id` i jednorazowo widoczny `client_secret`.\n2. Wywołaj `POST /oauth/token` z ciałem JSON: `grant_type=client_credentials`, `client_id`, `client_secret` i opcjonalnym `scope` (zakresy oddzielone spacją; pominięcie = wszystkie zakresy klienta).\n3. Przekazuj token w nagłówku każdego żądania: `Authorization: Bearer <access_token>`.\n4. Token ważny jest przez czas podany w `expires_in` (sekundy). Nie ma tokenu odświeżania — po wygaśnięciu pobierz nowy.\n\nKlient API może mieć listę dozwolonych adresów IP oraz przypisaną bazę firmy — wtedy wszystkie jego żądania działają w kontekście tej firmy.\n\n## Zakresy (scope)\nZakresy mają postać `zasób.read`, `zasób.write` lub `zasób.read.write` (np. `towary.read`, `dokumenty.read.write`). Endpoint przyjmuje token, który zawiera dowolny z wymaganych dla niego zakresów. Superzakresy: `all.read.write` (pełny dostęp) oraz `all.read` (odczyt wszystkiego, bez zapisu). Brak zakresu kończy się kodem `403` i błędem `insufficient_scope`.\n\n## Stronicowanie\nEndpointy zwracające duże listy przyjmują `strona` (od 1) i `rozmiar` (zwykle do 500). Odpowiedź ma postać `{ dane: [...], strona, rozmiar, lacznie, stron }`.\n\n## Zapisy przez COM Optimy\nOperacje zapisu wykonywane są przez COM Optimy, tak jak przy ręcznej pracy operatora — dokumenty przechodzą walidację systemu. Żądania są kolejkowane; przy przekroczeniu limitu kolejki lub czasu operacji API zwraca `503`. Wynik operacji zapisu zawiera pola `success` i `message`.\n\n## Zadania wsadowe\nDuże paczki (dokumenty, kontrahenci, wpisy do rejestrów VAT, pracownicy) zlecasz przez `POST /api/jobs/...` — API odpowiada `202 Accepted` z `jobId`, a stan każdej pozycji sprawdzisz przez `GET /api/jobs/{jobId}`.\n\n## Kody odpowiedzi\n- `400` — błędne dane wejściowe lub odrzucenie operacji przez Optimę\n- `401` — brak tokenu, token nieprawidłowy lub wygasły\n- `403` — brak wymaganego zakresu lub adres IP spoza listy dozwolonych\n- `404` — zasób nie istnieje\n- `503` — brak sesji Optimy albo przekroczony limit lub czas kolejki COM\n\nDaty przekazuj w formacie ISO 8601 (`RRRR-MM-DD`).","version":"v1","contact":{"name":"ERPower.pl","url":"https://erpower.pl"}},"servers":[{"url":"{scheme}://{host}","description":"Instancja API w sieci klienta","variables":{"scheme":{"default":"http","enum":["http","https"],"description":"Protokół"},"host":{"default":"localhost:5000","description":"Adres i port serwera API"}}}],"tags":[{"name":"Dokumenty HaMag","description":"Dokumenty handlowo-magazynowe: tworzenie, edycja, zatwierdzanie z bufora, anulowanie, generowanie FS/FZ/WZ/PZ, przekształcanie rezerwacji odbiorcy (RO), płatności i rozliczenia."},{"name":"Towary","description":"Kartoteka towarów i usług: ceny, kody EAN, atrybuty i przypisanie do grup."},{"name":"Grupy towarowe","description":"Wielopoziomowa hierarchia grup towarowych — odczyt i zarządzanie."},{"name":"Atrybuty","description":"Definicje atrybutów i ich wartości dla towarów, kontrahentów i dokumentów (również wsadowo)."},{"name":"Magazyny","description":"Magazyny — odczyt, dodawanie, edycja i usuwanie."},{"name":"Stany magazynowe","description":"Stany ilościowe towarów w magazynach."},{"name":"Cennik","description":"Cennik zbiorczy: towary ze wszystkimi cenami."},{"name":"Definicje cen","description":"Definicje cen (Cena1…CenaN) — odczyt i zarządzanie."},{"name":"Raporty","description":"Raport sprzedaży z agregacją wartości dokumentów."},{"name":"Kontrahenci","description":"Kartoteka kontrahentów, grupy, rozrachunki, zapisy kasowo-bankowe i rachunki bankowe."},{"name":"Kasa i bank","description":"Rejestry i raporty kasowo-bankowe oraz zapisy KP/KW."},{"name":"Rozliczenia","description":"Zdarzenia płatnicze (należności i zobowiązania) oraz rozliczanie zapisów kasowo-bankowych."},{"name":"Rejestry VAT","description":"Rejestry VAT zakupu i sprzedaży: wyszukiwanie, dodawanie, edycja i usuwanie dokumentów — także walutowych i z numerem KSeF."},{"name":"Kategorie","description":"Kategorie kosztów i przychodów (ogólne i szczegółowe)."},{"name":"Słowniki","description":"Waluty z bieżącymi kursami i formy płatności."},{"name":"Konta","description":"Plan kont oraz obroty i salda."},{"name":"Dekrety","description":"Dekrety księgowe i ich elementy (Wn/Ma)."},{"name":"Dzienniki","description":"Dzienniki cząstkowe okresu obrachunkowego."},{"name":"Okresy obrachunkowe","description":"Okresy obrachunkowe firmy."},{"name":"Pracownicy","description":"Kartoteki pracowników, etaty, dodatki płacowe, plan i czas pracy, limity urlopowe."},{"name":"Wydziały","description":"Drzewo wydziałów (działów) firmy."},{"name":"Centra","description":"Drzewo centrów kosztów."},{"name":"Projekty","description":"Drzewo aktywnych projektów."},{"name":"GUS / MF","description":"Dane firm z GUS REGON, Biała lista podatników VAT (MF) i walidacja numerów VAT w VIES."},{"name":"OAuth2 — autoryzacja","description":"Token dostępu Bearer (OAuth 2.0, grant `client_credentials`). Klientów API zakładasz w panelu administracyjnym instancji."},{"name":"Bazy","description":"Lista aktywnych baz firmowych."},{"name":"Kontekst firmy","description":"Przełączanie firmy (bazy), w której kontekście działają kolejne żądania."},{"name":"Batch — zadania","description":"Asynchroniczne zadania wsadowe (dokumenty, kontrahenci, rejestry VAT, pracownicy) ze śledzeniem postępu."}],"x-tagGroups":[{"name":"Handel i magazyn","tags":["Dokumenty HaMag","Towary","Grupy towarowe","Atrybuty","Magazyny","Stany magazynowe","Cennik","Definicje cen","Raporty"]},{"name":"Kontrahenci","tags":["Kontrahenci"]},{"name":"Finanse","tags":["Kasa i bank","Rozliczenia","Rejestry VAT","Kategorie","Słowniki"]},{"name":"Księgowość","tags":["Konta","Dekrety","Dzienniki","Okresy obrachunkowe"]},{"name":"Kadry i płace","tags":["Pracownicy","Wydziały","Centra","Projekty"]},{"name":"Dane zewnętrzne","tags":["GUS / MF"]},{"name":"Autoryzacja i administracja","tags":["OAuth2 — autoryzacja","Bazy","Kontekst firmy","Batch — zadania"]}],"paths":{"/atrybuty":{"get":{"tags":["Atrybuty"],"summary":"Zwraca listę definicji atrybutów z CDN.DefAtrybuty.","description":"Wszystkie parametry filtrowania są opcjonalne i łączone operatorem AND.\nBrak parametrów zwraca całą listę.\n\n### Typ atrybutu (`typ`)\n| Wartość | Znaczenie |\n|---|---|\n| 1 | Atrybut towaru |\n| 2 | Atrybut kontrahenta |\n| 3 | Atrybut środka trwałego |\n| 4 | Atrybut dokumentu |\n\n### Format danych (`format`)\n| Wartość | Znaczenie |\n|---|---|\n| 1 | Tekst |\n| 2 | Liczba |\n| 3 | Lista (wartości z kolekcji Wartosci) |\n| 4 | Data |\n| 5 | Binarna |\n\nWymagany scope tokenu: `atrybuty.read`, `atrybuty.read.write` lub `all.read.write`.","parameters":[{"name":"id","in":"query","description":"ID definicji atrybutu (DeA_DeAId) — dokładne dopasowanie.","schema":{"type":"integer","format":"int32"}},{"name":"typ","in":"query","description":"Typ atrybutu (1–4) — dokładne dopasowanie.","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod atrybutu — dokładne dopasowanie (wielkość liter bez znaczenia).","schema":{"type":"string"}},{"name":"nieaktywne","in":"query","description":"Gdy `true` — zwraca również nieaktywne atrybuty. Domyślnie `false`.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Lista definicji atrybutów spełniających kryteria (może być pusta)."},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Atrybuty"],"summary":"Dodaje nową definicję atrybutu przez COM Optimy (CDN.DefAtrybuty).","description":"Operacja wykonywana jest przez obiekty COM Comarch ERP Optima.\nPo pomyślnym dodaniu zwracane jest ID, Kod i Nazwa utworzonej definicji.\n\n### Typ atrybutu (`typ`)\n| Wartość | Znaczenie |\n|---|---|\n| 1 | Atrybut towaru |\n| 2 | Atrybut kontrahenta |\n| 3 | Atrybut środka trwałego |\n| 4 | Atrybut dokumentu |\n\n### Format danych (`format`)\n| Wartość | Znaczenie |\n|---|---|\n| 1 | Tekst (domyślnie) |\n| 2 | Liczba |\n| 3 | Lista |\n| 4 | Data |\n| 5 | Binarna |\n\nWymagany scope tokenu: `atrybuty.write`, `atrybuty.read.write` lub `all.read.write`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyAtrybut"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyAtrybut"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyAtrybut"}}}},"responses":{"200":{"description":"Definicja atrybutu dodana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}},"400":{"description":"Błąd COM Optimy (np. duplikat kodu).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}},"401":{"description":"Unauthorized","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM."}}},"put":{"tags":["Atrybuty"],"summary":"Aktualizuje definicję atrybutu przez COM Optimy.","description":"Podaj dokładnie jeden identyfikator: `id` (DeA_DeAId) lub `kod` (DeA_Kod).\nTylko pola body o wartości innej niż `null` są aktualizowane.\nPole `Typ` (przynależność atrybutu) nie może być zmienione po utworzeniu.\n\nWymagany scope tokenu: `atrybuty.write`, `atrybuty.read.write` lub `all.read.write`.\n\n**Przykład — dezaktywacja atrybutu po kodzie:**\n```\nPUT /atrybuty?kod=KOLOR\n{ \"nieaktywny\": true }\n```","parameters":[{"name":"id","in":"query","description":"ID definicji atrybutu (DeA_DeAId z GET /atrybuty).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod definicji atrybutu (DeA_Kod z GET /atrybuty).","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaAtrybutu"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaAtrybutu"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaAtrybutu"}}}},"responses":{"200":{"description":"Definicja atrybutu zaktualizowana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}},"400":{"description":"Błąd walidacji, błąd COM Optimy lub definicja nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}}}}},"/atrybuty/{id}":{"delete":{"tags":["Atrybuty"],"summary":"Usuwa definicję atrybutu przez COM Optimy.","description":"Usunięcie definicji atrybutu jest trwałe. Zalecane jest wcześniejsze dezaktywowanie\natrybutu (`PUT /atrybuty/{id}` z `\"nieaktywny\": true`) zamiast trwałego usuwania,\njeśli atrybut był już używany na dokumentach lub kartotekach.\n\nWymagany scope tokenu: `atrybuty.write`, `atrybuty.read.write` lub `all.read.write`.","parameters":[{"name":"id","in":"path","description":"ID definicji atrybutu (DeA_DeAId z GET /atrybuty).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Definicja atrybutu usunięta pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}},"400":{"description":"Błąd COM Optimy lub definicja o podanym ID nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/AtrybytResponse"}}}}}}},"/atrybuty/wartosci":{"get":{"tags":["Atrybuty"],"summary":"Zwraca listę wartości atrybutów przypisanych do obiektu.","description":"### Typ obiektu (`typObiektu`) i format `kodObiektu`\n| Wartość | Obiekt | Tabela | `kodObiektu` |\n|---|---|---|---|\n| **1** | Towar | CDN.Towary | kod skrócony towaru — `Twr_Kod` |\n| **2** | Kontrahent | CDN.Kontrahenci | kod skrócony kontrahenta — `Knt_Kod` |\n| **3** | Środek trwały | CDN.SrodkiTrwale | kod środka trwałego — `Srt_Kod` |\n| **4** | Dokument HaMag | CDN.DokumentyHaMag | numeryczny ID dokumentu — `TrN_TrNID` jako string, np. `\"1234\"` |\n\nWymagany scope tokenu: `atrybuty.read`, `atrybuty.read.write` lub `all.read.write`.","parameters":[{"name":"typObiektu","in":"query","description":"Typ obiektu (1–4) — patrz tabela powyżej.","schema":{"type":"integer","format":"int32"}},{"name":"kodObiektu","in":"query","description":"Identyfikator obiektu — format zależy od `typObiektu` (patrz tabela).","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista wartości atrybutów przypisanych do obiektu (może być pusta).","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuItem"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuItem"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuItem"}}}}},"400":{"description":"Nieprawidłowe parametry lub obiekt nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub błąd kolejki COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}}}},"post":{"tags":["Atrybuty"],"summary":"Dodaje wartość atrybutu do obiektu przez COM Optimy.","description":"Przypisuje nowy atrybut (wskazany przez `kodAtrybutu`) do obiektu i ustawia jego wartość.\nJeżeli ten atrybut jest już przypisany do obiektu, operacja zakończy się błędem —\nużyj `PUT /atrybuty/wartosci` aby zaktualizować istniejącą wartość.\n\n### Typ obiektu (`typObiektu`) i format `kodObiektu`\n| Wartość | Obiekt | Tabela | `kodObiektu` |\n|---|---|---|---|\n| **1** | Towar | CDN.Towary | kod skrócony towaru — `Twr_Kod` |\n| **2** | Kontrahent | CDN.Kontrahenci | kod skrócony kontrahenta — `Knt_Kod` |\n| **3** | Środek trwały | CDN.SrodkiTrwale | kod środka trwałego — `Srt_Kod` |\n| **4** | Dokument HaMag | CDN.DokumentyHaMag | numeryczny ID dokumentu — `TrN_TrNID` jako string, np. `\"1234\"` |\n\n### Format wartości atrybutu (`wartosc`)\n| Format (`DeA_Format`) | Oczekiwany format |\n|---|---|\n| **1** tekst | dowolny string, max 255 znaków |\n| **2** liczba | string dziesiętny, np. `\"12.50\"` (separator `.`) |\n| **3** lista | jedna z wartości słownikowych zdefiniowanych dla atrybutu |\n| **4** data | ISO 8601: `\"2024-06-15\"` |\n| **5** binarna | wartość binarna |\n\nKod atrybutu (`kodAtrybutu`) musi mieć typ (`DeA_Typ`) zgodny z `typObiektu`.\n\nWymagany scope tokenu: `atrybuty.write`, `atrybuty.read.write` lub `all.read.write`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}}}},"responses":{"200":{"description":"Wartość atrybutu dodana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"400":{"description":"Błąd COM, obiekt lub definicja atrybutu nie istnieje, atrybut już przypisany.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub błąd kolejki COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}}}},"put":{"tags":["Atrybuty"],"summary":"Aktualizuje wartość atrybutu przypisanego do obiektu przez COM Optimy.","description":"Modyfikuje wartość istniejącego atrybutu obiektu.\nJeżeli atrybut nie jest jeszcze przypisany do obiektu, użyj `POST /atrybuty/wartosci`.\n\n### Typ obiektu (`typObiektu`) i format `kodObiektu`\n| Wartość | Obiekt | Tabela | `kodObiektu` |\n|---|---|---|---|\n| **1** | Towar | CDN.Towary | kod skrócony towaru — `Twr_Kod` |\n| **2** | Kontrahent | CDN.Kontrahenci | kod skrócony kontrahenta — `Knt_Kod` |\n| **3** | Środek trwały | CDN.SrodkiTrwale | kod środka trwałego — `Srt_Kod` |\n| **4** | Dokument HaMag | CDN.DokAtrybuty | numeryczny ID dokumentu — `TrN_TrNID` jako string, np. `\"1234\"` (zapis przez SQL, nie COM) |\n\nWymagany scope tokenu: `atrybuty.write`, `atrybuty.read.write` lub `all.read.write`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}}}},"responses":{"200":{"description":"Wartość atrybutu zaktualizowana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"400":{"description":"Błąd COM, obiekt lub atrybut nie istnieje, atrybut nie jest przypisany do obiektu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub błąd kolejki COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}}}},"delete":{"tags":["Atrybuty"],"summary":"Usuwa wartość atrybutu przypisanego do obiektu przez COM Optimy.","description":"### Typ obiektu (`typObiektu`) i format `kodObiektu`\n| Wartość | Obiekt | Tabela | `kodObiektu` |\n|---|---|---|---|\n| **1** | Towar | CDN.Towary | kod skrócony towaru — `Twr_Kod` |\n| **2** | Kontrahent | CDN.Kontrahenci | kod skrócony kontrahenta — `Knt_Kod` |\n| **3** | Środek trwały | CDN.SrodkiTrwale | kod środka trwałego — `Srt_Kod` |\n| **4** | Dokument HaMag | CDN.DokAtrybuty | numeryczny ID dokumentu — `TrN_TrNID` jako string, np. `\"1234\"` (zapis przez SQL, nie COM) |\n\nWymagany scope tokenu: `atrybuty.write`, `atrybuty.read.write` lub `all.read.write`.","parameters":[{"name":"typObiektu","in":"query","description":"Typ obiektu (1–4) — patrz tabela powyżej.","schema":{"type":"integer","format":"int32"}},{"name":"kodObiektu","in":"query","description":"Identyfikator obiektu — format zależy od `typObiektu` (patrz tabela).","schema":{"type":"string"}},{"name":"kodAtrybutu","in":"query","description":"Kod definicji atrybutu (DeA_Kod).","schema":{"type":"string"}}],"responses":{"200":{"description":"Wartość atrybutu usunięta pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"400":{"description":"Obiekt lub atrybut nie istnieje, atrybut nie jest przypisany do obiektu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub błąd kolejki COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}}}}},"/atrybuty/wartosci/batch":{"post":{"tags":["Atrybuty"],"summary":"Dodaje wiele wartości atrybutów do obiektów w jednym żądaniu (best-effort).","description":"Każda pozycja jest przetwarzana niezależnie — błąd jednej nie przerywa pozostałych.\nOdpowiedź **zawsze ma status 200** i zawiera wynik per pozycja.\n\n### Typ obiektu (`typObiektu`)\n| Wartość | Obiekt | Tabela | Klucz (`kodObiektu`) |\n|---|---|---|---|\n| **1** | Towar | CDN.Towary | `Twr_Kod` — kod skrócony towaru |\n| **2** | Kontrahent | CDN.Kontrahenci | `Knt_Kod` — kod skrócony kontrahenta |\n| **3** | Środek trwały | CDN.SrodkiTrwale | `Srt_Kod` — kod środka trwałego |\n| **4** | Dokument handlowy | CDN.DokumentyHaMag | `TrN_TrNID` — numeryczny ID dokumentu |\n\n### Kod atrybutu (`kodAtrybutu`)\nMusi istnieć w `CDN.DefAtrybuty` (`DeA_Kod`) i mieć typ zgodny z obiektem docelowym\n(`DeA_Typ`: 1=towar, 2=kontrahent, 3=środek trwały, 4=dokument).\nAtrybut nie może być już przypisany do tego obiektu — użyj `PUT /atrybuty/wartosci` do aktualizacji.\n\n### Wartość atrybutu (`wartosc`)\n| Format (`DeA_Format`) | Oczekiwany format wartości |\n|---|---|\n| **1** tekst | dowolny string, max 255 znaków |\n| **2** liczba | string dziesiętny, np. `\"12.50\"` (separator `.`) |\n| **3** lista | jedna z wartości słownikowych zdefiniowanych dla atrybutu |\n| **4** data | ISO 8601: `\"2024-06-15\"` |\n| **5** binarna | wartość binarna (rzadko używany) |\n\n### Zwracany wynik\nPole `wyniki` zawiera elementy **w tej samej kolejności** co wejściowa tablica.\nKażdy element ma `success: true/false` oraz `message` z opisem wyniku lub błędu.\n\nWymagany scope tokenu: `atrybuty.write`, `atrybuty.read.write` lub `all.read.write`.","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuRequest"}}}}},"responses":{"200":{"description":"Wyniki per pozycja — zawsze zwracane, nawet jeśli wszystkie pozycje się nie powiodły.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/BatchWartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/BatchWartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/BatchWartoscAtrybutuResponse"}}}},"400":{"description":"Pusta lista lub błąd walidacji modelu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}}}}},"/api/jobs/dokumenty":{"post":{"tags":["Batch — zadania"],"summary":"Zleca batch tworzenia dokumentów handlowo-magazynowych (FS, FZ, WZ, PZ, RO, ZD...).","description":"Każda pozycja w `dokumenty` to jeden dokument. Typ podawany jest per pozycja,\nwięc w jednym żądaniu można wystawić dokumenty różnych typów.\n\nWorker przetwarza pozycje sekwencyjnie przez COM Optimy. Wynik każdej pozycji dostępny\nprzez `GET /api/jobs/{jobId}` — pole `items[n].result` zawiera `{ \"id\", \"numerPelny\" }`\nlub `items[n].error` z komunikatem błędu COM.\n\n---\n\n## Pole `firma`\n\nOpcjonalne. Gdy pominięte lub puste:\n- używana firma przypisana do tokena (`AllowedFirm`)\n- jeśli token nie ma przypisanej firmy — aktualny globalny kontekst (`POST /context/firma`)\n- jeśli brak override — domyślna firma z konfiguracji API\n\n---\n\n## Typy dokumentów (`typ`)\n\n| Kod    | Nazwa                                  | Kontrahent | Magazyn źródłowy | Magazyn docelowy |\n|--------|----------------------------------------|:----------:|:----------------:|:----------------:|\n| FS     | Faktura sprzedaży                      | wymagany   | opcjonalny       | —                |\n| FZ     | Faktura zakupu                         | wymagany   | opcjonalny       | —                |\n| PA     | Paragon                                | opcjonalny | opcjonalny       | —                |\n| WZ     | Wydanie zewnętrzne                     | opcjonalny | opcjonalny       | —                |\n| PZ     | Przyjęcie zewnętrzne                   | opcjonalny | opcjonalny       | —                |\n| RO     | Rezerwacja odbiorcy                    | opcjonalny | opcjonalny       | —                |\n| ZD     | Zamówienie dostawcy                    | opcjonalny | —                | —                |\n| MM     | Przesunięcie między magazynami         | —          | wymagany         | wymagany         |\n| PW     | Przychód wewnętrzny                    | —          | opcjonalny       | —                |\n| RW     | Rozchód wewnętrzny                     | —          | opcjonalny       | —                |\n| BO     | Bilans otwarcia                        | —          | opcjonalny       | —                |\n| PI     | Podkładka inwentaryzacyjna             | —          | opcjonalny       | —                |\n| PK     | Przyjęcie kaucji                       | wymagany   | opcjonalny       | —                |\n| WK     | Wydanie kaucji                         | wymagany   | opcjonalny       | —                |\n| PWP    | Przychód wewnętrzny produktów          | —          | opcjonalny       | —                |\n| RWS    | Rozchód wewnętrzny składników          | —          | opcjonalny       | —                |\n| PF     | Faktura pro forma                      | wymagany   | opcjonalny       | —                |\n| FWZ    | Faktura wewnętrzna zakupu              | wymagany   | opcjonalny       | —                |\n| FWS    | Faktura wewnętrzna sprzedaży           | wymagany   | opcjonalny       | —                |\n| TF     | Dokument Tax Free                      | wymagany   | opcjonalny       | —                |\n| FRR    | Faktura RR                             | wymagany   | opcjonalny       | —                |\n| FSK    | Korekta faktury sprzedaży              | wymagany   | opcjonalny       | —                |\n| FZK    | Korekta faktury zakupu                 | wymagany   | opcjonalny       | —                |\n| PAK    | Korekta paragonu                       | opcjonalny | opcjonalny       | —                |\n| WZK    | Korekta WZ                             | opcjonalny | opcjonalny       | —                |\n| PZK    | Korekta PZ                             | opcjonalny | opcjonalny       | —                |\n| ROK    | Korekta rezerwacji odbiorcy            | opcjonalny | opcjonalny       | —                |\n| ZDK    | Korekta zamówienia dostawcy            | opcjonalny | —                | —                |\n| FWZK   | Korekta faktury wewnętrznej zakupu     | wymagany   | opcjonalny       | —                |\n| FWSK   | Korekta faktury wewnętrznej sprzedaży  | wymagany   | opcjonalny       | —                |\n| TFK    | Korekta Tax Free                       | wymagany   | opcjonalny       | —                |\n| FRRK   | Korekta faktury RR                     | wymagany   | opcjonalny       | —                |\n\n---\n\n## Pola nagłówka dokumentu\n\n| Pole                  | Wymagane | Opis |\n|-----------------------|:--------:|------|\n| `typ`                 | **TAK**  | Kod typu dokumentu (tabela powyżej) |\n| `pozycje`             | **TAK**  | Lista pozycji — minimum jedna |\n| `kontrahentKod`       | zależy   | Knt_Kod; wymagany dla FS, FZ, PF i innych — patrz tabela |\n| `magazynSymbol`       | zależy   | Symbol magazynu źródłowego; wymagany dla MM |\n| `magazynDocelowySymbol` | zależy | Symbol magazynu docelowego; wymagany tylko dla MM |\n| `bufor`               | nie      | `true` = zapisz do bufora (niezatwierdzony), domyślnie `false` |\n| `typNB`               | nie      | `1` = ceny netto (domyślnie), `2` = ceny brutto |\n| `dataWys`             | nie      | Data wystawienia |\n| `dataSprzedazy`       | nie      | Data sprzedaży / wydania towaru |\n| `dataDok`             | nie      | Data dokumentu |\n| `termin`              | nie      | Termin zapłaty (FS/FZ/PA), ważności (RO/ZD/PF) lub realizacji |\n| `dataDokKorekta`      | nie      | Data dokumentu korekty — tylko dla FSK, FZK itp. |\n| `dataOpeKorekta`      | nie      | Data operacji korekty |\n| `dataWysKorekta`      | nie      | Data wystawienia korekty |\n| `formaPlatnosci`      | nie      | Nazwa formy płatności (Fpl_Nazwa), np. `PRZELEW`, `GOTÓWKA` |\n| `walutaSymbol`        | nie      | Symbol waluty obcej, np. `EUR`, `USD`. Puste = PLN |\n| `numerObcy`           | nie      | Numer obcy dokumentu (np. numer faktury dostawcy) |\n| `uwagi`               | nie      | Uwagi do dokumentu |\n| `podNazwa1/2/3`       | nie      | Nadpisuje nazwę podmiotu (sprzedawcy/nabywcy) z kartoteki |\n| `podAdres`            | nie      | Nadpisuje adres podmiotu (pola: `ulica`, `nrDomu`, `nrLokalu`, `kodPocztowy`, `poczta`, `miasto`, `gmina`, `powiat`, `wojewodztwo`, `kraj`, `dodatkowe`) |\n| `odbNazwa1/2/3`       | nie      | Nadpisuje nazwę odbiorcy |\n| `odbAdres`            | nie      | Nadpisuje adres odbiorcy (te same pola co `podAdres`) |\n| `odbEmail`            | nie      | E-mail odbiorcy |\n| `odbTelefon`          | nie      | Telefon odbiorcy |\n| `odebral`             | nie      | Osoba odbierająca dokument |\n| `nrKSeF`              | nie      | Numer KSeF — uzupełnij dla FZ/FZK z istniejącym numerem KSeF |\n| `kSeFDataPrzyjecia`   | nie      | Data przyjęcia przez KSeF |\n| `kSeFPodmioty3`       | nie      | Lista podmiotów trzecich KSeF (patrz opis poniżej) |\n| `atrybuty`            | nie      | Lista atrybutów dokumentu: `[{ \"kod\": \"KOD\", \"wartosc\": \"wartość\" }]` |\n| `generujWzPz`         | nie      | `true` = generuj WZ po FS lub PZ po FZ automatycznie |\n\n---\n\n## Pola pozycji dokumentu\n\n| Pole              | Wymagane | Opis |\n|-------------------|:--------:|------|\n| `towarKod`        | **TAK**  | Kod towaru (Twr_Kod) |\n| `ilosc`           | **TAK**  | Ilość |\n| `towarNazwa`      | nie      | Nadpisuje nazwę towaru na dokumencie |\n| `towarOpis`       | nie      | Opis pozycji |\n| `cenaJednostkowa` | nie      | Cena jednostkowa; gdy podano `walutaSymbol` — cena w tej walucie |\n| `rabat`           | nie      | Rabat procentowy, np. `10.5` = 10,5% |\n| `stawkaVat`       | nie      | Stawka VAT: liczba (`23`, `8`, `5`, `0`) lub `\"ZW\"` / `\"NP\"` (oba = 0). Gdy nie podana — pobierana z kartoteki towaru |\n\n---\n\n## Podmioty trzecie KSeF (`kSeFPodmioty3`)\n\n| Pole                    | Wymagane | Opis |\n|-------------------------|:--------:|------|\n| `rolaPodmiotu`          | **TAK**  | 1=Faktor, 2=Odbiorca, 3=Podmiot pierwotny, 4=Dodatkowy nabywca, 5=Wystawca faktury, 6=Dokonujący płatności, 7-11=JST/GV/Pracownik |\n| `nazwa`                 | nie      | Nazwa podmiotu |\n| `nip`                   | nie      | NIP / identyfikator podatkowy |\n| `nipKraj`               | nie      | Kod kraju ISO 3166-1 alpha-2, np. `PL` |\n| `rodzajIdentyfikatora`  | nie      | 1=NIP, 2=NIP-VAT-UE, 3=Inny identyfikator podatkowy, 4=Wewnętrzny |\n| `opisRoli`              | nie      | Opis słowny roli |\n| `eori`                  | nie      | Numer EORI |\n| `adres`                 | nie      | Adres podmiotu (tekst) |\n| `nrKlienta`             | nie      | Numer klienta |\n| `udzial`                | nie      | Udział procentowy (0–100) |\n| `kontrahentKod`         | nie      | Knt_Kod — gdy podany, podmiot jest powiązany z kartoteką Optimy |\n\n---\n\n## Przykład — faktura sprzedaży i WZ\n\n```json\n{\n  \"dokumenty\": [\n    {\n      \"typ\": \"FS\",\n      \"kontrahentKod\": \"ALOZA\",\n      \"formaPlatnosci\": \"PRZELEW\",\n      \"termin\": \"2026-07-15\",\n      \"pozycje\": [\n        { \"towarKod\": \"NOWY_C#\", \"ilosc\": 2, \"cenaJednostkowa\": 149.99, \"stawkaVat\": 23 },\n        { \"towarKod\": \"KOMPUTER\", \"ilosc\": 1, \"cenaJednostkowa\": 3200.00 }\n      ]\n    },\n    {\n      \"typ\": \"WZ\",\n      \"kontrahentKod\": \"ALOZA\",\n      \"magazynSymbol\": \"MAG\",\n      \"pozycje\": [\n        { \"towarKod\": \"NOWY_C#\", \"ilosc\": 2 },\n        { \"towarKod\": \"KOMPUTER\", \"ilosc\": 1 }\n      ]\n    }\n  ]\n}\n```\n\nZwraca **202 Accepted** z `jobId`. Odpytuj `GET /api/jobs/{jobId}` żeby sprawdzić postęp.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DokumentyBatchRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentyBatchRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/DokumentyBatchRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"text/plain":{"schema":{}},"application/json":{"schema":{}},"text/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/jobs/kontrahenci":{"post":{"tags":["Batch — zadania"],"summary":"Zleca batch dodawania kontrahentów przez COM Optimy.","description":"Każda pozycja w `kontrahenci` to jeden nowy kontrahent tworzony przez `CDN.Kontrahenci`.\nWorker przetwarza pozycje sekwencyjnie. Wynik każdej pozycji dostępny przez\n`GET /api/jobs/{jobId}` — pole `items[n].result` zawiera\n`{ \"id\", \"akronim\", \"nazwaPelna\" }` lub `items[n].error` z komunikatem błędu COM.\n\nBatch nie obsługuje trybu `DaneZGUS` — wszystkie dane należy podać jawnie.\nDla pobrania danych z GUS przed importem użyj synchronicznego `POST /kontrahenci`.\n\n---\n\n## Pole `firma`\n\nOpcjonalne. Gdy pominięte lub puste:\n- używana firma przypisana do tokena (`AllowedFirm`)\n- jeśli token nie ma przypisanej firmy — aktualny globalny kontekst (`POST /context/firma`)\n- jeśli brak override — domyślna firma z konfiguracji API\n\n---\n\n## Pola kontrahenta\n\n| Pole               | Wymagane | Maks. | Opis |\n|--------------------|:--------:|------:|------|\n| `akronim`          | **TAK**  | 20    | Unikalny kod skrócony (`Knt_Kod`) — automatycznie zamieniany na WIELKIE litery |\n| `nazwa1`           | **TAK**  | 50    | Pierwsza linia nazwy (`Knt_Nazwa1`) |\n| `nazwa2`           | nie      | 50    | Druga linia nazwy (`Knt_Nazwa2`) |\n| `nazwa3`           | nie      | 250   | Trzecia linia nazwy, np. forma prawna (`Knt_Nazwa3`) |\n| `nip`              | nie      | 15    | NIP bez kresek i prefiksu kraju (`Knt_Nip`), np. `5260001016` |\n| `nipKraj`          | nie      | 2     | Prefiks kraju ISO 3166-1 alpha-2 (`Knt_NipKraj`). Domyślnie `PL` |\n| `gln`              | nie      | 13    | Global Location Number — 13 cyfr (`Knt_GLN`) |\n| `ksefIdWewnetrzny` | nie      | 20    | Wewnętrzny identyfikator KSeF (`Knt_KsefIdWewnetrzny`) |\n| `email`            | nie      | 127   | Adres e-mail (`Knt_Email`) |\n| `telefon`          | nie      | 20    | Telefon główny (`Knt_Telefon1`) |\n| `telefon2`         | nie      | 20    | Telefon dodatkowy (`Knt_Telefon2`) |\n| `ulica`            | nie      | 40    | Ulica bez numeru (`Knt_Ulica`) |\n| `nrDomu`           | nie      | 10    | Numer domu/lokalu (`Knt_NrDomu`) |\n| `kodPocztowy`      | nie      | 10    | Kod pocztowy (`Knt_KodPocztowy`), np. `00-001` |\n| `poczta`           | nie      | 40    | Miejscowość poczty gdy inna niż miasto (`Knt_Poczta`) |\n| `miasto`           | nie      | 40    | Miasto (`Knt_Miasto`) |\n| `gmina`            | nie      | 40    | Gmina (`Knt_Gmina`) |\n| `powiat`           | nie      | 40    | Powiat (`Knt_Powiat`) |\n| `wojewodztwo`      | nie      | 40    | Województwo (`Knt_Wojewodztwo`), np. `mazowieckie` |\n| `kraj`             | nie      | 40    | Pełna nazwa kraju (`Knt_Kraj`). Domyślnie `Polska` |\n\n---\n\n## Przykład\n\n```json\n{\n  \"kontrahenci\": [\n    {\n      \"akronim\": \"KOWALSKI\",\n      \"nazwa1\": \"Kowalski Jan\",\n      \"nazwa2\": \"Usługi transportowe\",\n      \"nip\": \"5260001016\",\n      \"nipKraj\": \"PL\",\n      \"email\": \"jan@example.com\",\n      \"telefon\": \"+48 22 123 45 67\",\n      \"ulica\": \"Marszałkowska\",\n      \"nrDomu\": \"12A\",\n      \"kodPocztowy\": \"00-001\",\n      \"miasto\": \"Warszawa\",\n      \"kraj\": \"Polska\"\n    },\n    {\n      \"akronim\": \"MUELLER_DE\",\n      \"nazwa1\": \"Mueller GmbH\",\n      \"nip\": \"DE123456789\",\n      \"nipKraj\": \"DE\",\n      \"miasto\": \"Berlin\",\n      \"kraj\": \"Niemcy\"\n    }\n  ]\n}\n```\n\nZwraca **202 Accepted** z `jobId`. Odpytuj `GET /api/jobs/{jobId}` żeby sprawdzić postęp.\nKażda pozycja wyniku zawiera `{ \"id\", \"akronim\", \"nazwaPelna\" }`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KontrahenciBatchRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahenciBatchRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/KontrahenciBatchRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"text/plain":{"schema":{}},"application/json":{"schema":{}},"text/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{}},"application/json":{"schema":{}},"text/json":{"schema":{}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/jobs/rejestry-vat":{"post":{"tags":["Batch — zadania"],"summary":"Zleca batch dodawania wpisów do rejestrów VAT (zakup i sprzedaż).","description":"Każda pozycja w `wpisy` to jeden dokument rejestru VAT tworzony przez COM Optimy.\nWorker przetwarza pozycje sekwencyjnie. Wynik każdej pozycji dostępny przez\n`GET /api/jobs/{jobId}` — pole `items[n].result` zawiera `{ \"id\", \"numerPelny\", \"identKsieg\" }`\nlub `items[n].error` z komunikatem błędu COM.\n\n---\n\n## Pole `firma`\n\nOpcjonalne. Gdy pominięte lub puste:\n- używana firma przypisana do tokena (`AllowedFirm`)\n- jeśli token nie ma przypisanej firmy — aktualny globalny kontekst (`POST /context/firma`)\n- jeśli brak override — domyślna firma z konfiguracji API\n\n---\n\n## Nagłówek wpisu\n\n| Pole                | Wymagane | Opis |\n|---------------------|:--------:|------|\n| `typ`               | **TAK**  | `Z` = rejestr zakupów, `S` = rejestr sprzedaży |\n| `rejestr`           | **TAK**  | Nazwa rejestru VAT w Optimie (dokładna, z `GET /rejestry-vat`) |\n| `elementy`          | **TAK**  | Co najmniej jedna pozycja VAT |\n| `kontrahentKod`     | **TAK**  | Knt_Kod z kartoteki Optimy |\n| `formaPlatnosci`    | **TAK**  | Dokładna nazwa formy płatności (FPl_Nazwa), np. `PRZELEW` |\n| `dataZap`           | **TAK**  | Data zapisu (data księgowania) |\n| `dataOpe`           | **TAK**  | Data operacji (data sprzedaży lub zakupu) |\n| `dokument`          | nie      | Numer dokumentu, np. `FS/01/2025` |\n| `identKsieg`        | nie      | Identyfikator księgowy |\n| `walutaSymbol`      | nie      | Symbol waluty, np. `EUR`. Domyślnie `PLN` |\n| `kategoria`         | nie      | Kod kategorii nagłówka (Kat_kodszczegol), maks. 50 znaków |\n| `nrKSeF`            | nie      | Numer KSeF dokumentu źródłowego |\n| `kSeFDataPrzyjecia` | nie      | Data przyjęcia dokumentu w KSeF |\n| `dodatkowyOpis`     | nie      | Dowolny opis tekstowy nagłówka |\n| `termin`            | nie      | Termin płatności |\n| `kSeFPodmioty3Vat`  | nie      | Lista podmiotów trzecich KSeF (patrz sekcja poniżej) |\n\n---\n\n## Pozycje rejestru VAT (`elementy`)\n\nKażda pozycja odpowiada jednej stawce VAT. Kwota VAT jest obliczana automatycznie przez Optimę.\n\n| Pole           | Wymagane | Opis |\n|----------------|:--------:|------|\n| `netto`        | **TAK**  | Kwota netto |\n| `stawka`       | nie      | Stawka VAT: liczba (`23`, `8`, `5`, `0`) lub `\"ZW\"` / `\"NP\"`. Gdy podano `\"ZW\"` lub `\"NP\"`, flaga jest ustawiana automatycznie (odpowiednio 1 lub 4). Domyślnie `23` |\n| `flaga`        | nie      | Flaga stawki — opcjonalna, wyznaczana ze stawki. `1`=ZW, `2`=Opodatkowana, `3`=Zaniżona, `4`=NP |\n| `rodzajZakupu` | nie      | Tylko dla zakupów: `1`=Towary (domyśl.), `2`=Inne, `3`=Trwałe, `4`=Usługi, `5`=Nowe ŚrTran, `6`=Nieruchomości, `7`=Paliwo |\n| `odliczenia`   | nie      | Zakup: `0`=nie, `1`=tak, `2`=warunkowo. Sprzedaż: `0`=poza proporcją, `1`=w proporcji, `2`=tylko mianownik |\n| `kategoria`    | nie      | Kod kategorii podstawowej pozycji (Kat_kodszczegol) |\n| `katOpis`      | nie      | Opis słowny kategorii podstawowej |\n| `kategoria2`   | nie      | Kod kategorii dodatkowej (Kat_kodszczegol) |\n| `nettoOSS`     | nie      | Kwota netto OSS (One Stop Shop — transakcje zagraniczne) |\n| `vatOSS`       | nie      | Kwota VAT OSS |\n| `bruttoOSS`    | nie      | Kwota brutto OSS |\n| `kodKrajuOSS`  | nie      | Kod kraju OSS wg ISO 3166-1 alpha-2, np. `DE` |\n\n### Stawka VAT — tabela skrótów\n\n| `stawka`              | `flaga`     | Efekt |\n|-----------------------|-------------|-------|\n| `23` / `8` / `5` / `0` | (pominięta) | Standardowa stawka; flaga = 2 (Opodatkowana) |\n| `\"ZW\"`                | (pominięta) | Zwolniony — stawka=0, flaga=1 |\n| `\"NP\"`                | (pominięta) | Niepodlegający — stawka=0, flaga=4 |\n| dowolna               | `1`         | Nadpisuje na ZW (stawka=0, flaga=1) |\n| `0`                   | `4`         | Niepodlegający (NP) |\n| `0`                   | `3`         | Zaniżona |\n\n---\n\n## Podmioty trzecie KSeF (`kSeFPodmioty3Vat`)\n\n| Pole                   | Wymagane | Opis |\n|------------------------|:--------:|------|\n| `rolaPodmiotu`         | **TAK**  | 1=Faktor, 2=Odbiorca, 3=Podmiot pierwotny, 4=Dodatkowy nabywca, 5=Wystawca faktury, 6=Dokonujący płatności, 7=JST wystawca, 8=JST odbiorca, 9=Członek GV wystawca, 10=Członek GV odbiorca, 11=Pracownik |\n| `nazwa`                | nie      | Nazwa podmiotu (maks. 300 znaków) |\n| `nip`                  | nie      | NIP / identyfikator podatkowy (maks. 50 znaków) |\n| `nipKraj`              | nie      | Kod kraju ISO 3166-1 alpha-2, np. `PL` |\n| `rodzajIdentyfikatora` | nie      | `1`=NIP, `2`=NIP-VAT-UE, `3`=inny identyfikator podatkowy, `4`=wewnętrzny |\n| `opisRoli`             | nie      | Opis słowny roli (maks. 500 znaków) |\n| `eori`                 | nie      | Numer EORI (maks. 50 znaków) |\n| `adres`                | nie      | Adres podmiotu (maks. 500 znaków) |\n| `nrKlienta`            | nie      | Numer klienta (maks. 50 znaków) |\n| `udzial`               | nie      | Udział procentowy 0–100 |\n| `kontrahentKod`        | nie      | Knt_Kod — powiązuje podmiot z kartoteką Optimy |\n\n---\n\n## Przykład — faktura sprzedaży i faktura zakupu\n\n```json\n{\n  \"wpisy\": [\n    {\n      \"typ\": \"S\",\n      \"rejestr\": \"SPRZEDAŻ\",\n      \"dokument\": \"FS/15/2026\",\n      \"dataZap\": \"2026-06-15\",\n      \"dataOpe\": \"2026-06-15\",\n      \"termin\": \"2026-06-29\",\n      \"kontrahentKod\": \"ALOZA\",\n      \"formaPlatnosci\": \"PRZELEW\",\n      \"nrKSeF\": \"1234567890-20260615-ABCD\",\n      \"elementy\": [\n        { \"stawka\": 23, \"netto\": 1000.00, \"odliczenia\": 1 },\n        { \"stawka\": 8,  \"netto\": 500.00,  \"odliczenia\": 1 }\n      ]\n    },\n    {\n      \"typ\": \"Z\",\n      \"rejestr\": \"VAT ZAKUP\",\n      \"dokument\": \"FZ/08/2026\",\n      \"dataZap\": \"2026-06-15\",\n      \"dataOpe\": \"2026-06-10\",\n      \"kontrahentKod\": \"DOSTAWCA01\",\n      \"formaPlatnosci\": \"PRZELEW\",\n      \"elementy\": [\n        { \"stawka\": 23,   \"netto\": 2500.00, \"rodzajZakupu\": 4, \"odliczenia\": 1 },\n        { \"stawka\": \"ZW\", \"netto\": 100.00,  \"rodzajZakupu\": 2, \"odliczenia\": 0 }\n      ]\n    }\n  ]\n}\n```\n\nZwraca **202 Accepted** z `jobId`. Odpytuj `GET /api/jobs/{jobId}` żeby sprawdzić postęp.\nKażda pozycja wyniku zawiera `{ \"id\", \"numerPelny\", \"identKsieg\" }`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejestryVATBatchRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/RejestryVATBatchRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/RejestryVATBatchRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"text/plain":{"schema":{}},"application/json":{"schema":{}},"text/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{}},"application/json":{"schema":{}},"text/json":{"schema":{}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/jobs/pracownicy":{"post":{"tags":["Batch — zadania"],"summary":"Zleca batch dodawania pracowników przez COM Optimy.","description":"Każda pozycja w `pracownicy` to jeden nowy pracownik tworzony przez `CDN.Pracownicy`.\nWorker przetwarza pozycje sekwencyjnie. Wynik każdej pozycji dostępny przez\n`GET /api/jobs/{jobId}` — pole `items[n].result` zawiera\n`{ \"praId\", \"kod\", \"nazwiskoImie\", \"ostrzezenia\" }` lub `items[n].error`\nz komunikatem błędu COM.\n\n---\n\n## Pole `firma`\n\nOpcjonalne. Gdy pominięte lub puste:\n- używana firma przypisana do tokena (`AllowedFirm`)\n- jeśli token nie ma przypisanej firmy — aktualny globalny kontekst (`POST /context/firma`)\n- jeśli brak override — domyślna firma z konfiguracji API\n\n---\n\n## Pola pracownika\n\n| Pole                    | Wymagane | Maks. | Opis |\n|-------------------------|:--------:|------:|------|\n| `kod`                   | **TAK**  | 20    | Unikalny kod pracownika (`Pra_Kod`) — zamieniany na WIELKIE litery |\n| `nazwisko`              | **TAK**  | 50    | Nazwisko |\n| `imie1`                 | **TAK**  | 30    | Pierwsze imię |\n| `imie2`                 | nie      | 30    | Drugie imię |\n| `pesel`                 | nie      | 11    | PESEL bez spacji |\n| `dataUr`                | nie      | —     | Data urodzenia (`YYYY-MM-DD`) |\n| `miejsceUr`             | nie      | 100   | Miejscowość urodzenia |\n| `plec`                  | nie      | 1     | `M` = mężczyzna, `K` = kobieta |\n| `stanCywilny`           | nie      | 50    | Stan cywilny, np. `kawaler/panna` |\n| `dowOsobisty`           | nie      | 20    | Seria i numer dowodu osobistego |\n| `dowGdzie`              | nie      | 100   | Organ wydający dowód |\n| `dowKiedy`              | nie      | —     | Data wydania dowodu (`YYYY-MM-DD`) |\n| `dowWaznyDo`            | nie      | —     | Data ważności dowodu (`YYYY-MM-DD`) |\n| `telefonSms`            | nie      | 20    | Numer telefonu SMS do powiadomień kadrowych |\n| `nipE`                  | nie      | 15    | NIP pracownika (głównie właściciele/zleceniobiorcy) |\n| `typPracownika`         | nie      | —     | `0` = etatowy (domyślnie), `1` = zleceniobiorca, `2` = właściciel |\n| `centrumKod`            | nie      | 20    | Kod centrum kosztowego (CNT_Kod) — walidowany przed zapisem |\n| `dzialKod`              | nie      | 20    | Kod działu (DZL_Kod) — walidowany przed zapisem |\n| `opis`                  | nie      | 500   | Opis dowolny |\n| `daneKadrowe`           | nie      | —     | Dane kontaktowe i kadrowe (patrz tabela poniżej) |\n| `adresZamieszkania`     | nie      | —     | Adres faktycznego pobytu |\n| `adresKorespondencyjny` | nie      | —     | Adres korespondencyjny |\n| `adresZameldowania`     | nie      | —     | Adres stałego zameldowania |\n\n### Dane kadrowe (`daneKadrowe`)\n\n| Pole           | Maks. | Opis |\n|----------------|------:|------|\n| `email`        | 127   | Służbowy adres e-mail |\n| `telefon1`     | 20    | Telefon służbowy główny |\n| `telefon2`     | 20    | Telefon służbowy dodatkowy |\n| `fax`          | 20    | Faks |\n| `url`          | 200   | Strona WWW |\n| `uwagi`        | 500   | Uwagi kadrowe |\n| `prawoJazdy`   | —     | `true`/`false` |\n| `prawoJazdyKat`| 10    | Kategorie prawa jazdy, np. `B` lub `B+E` |\n| `wypOsoba`     | 100   | Imię i nazwisko osoby wypadkowej |\n| `wypAdres`     | 200   | Adres osoby wypadkowej |\n| `wypTelefon`   | 20    | Telefon osoby wypadkowej |\n\n### Pola adresu (`adresZamieszkania` / `adresKorespondencyjny` / `adresZameldowania`)\n\n| Pole                 | Maks. | Opis |\n|----------------------|------:|------|\n| `kodPocztowy`        | 10    | Kod pocztowy bez kreski, np. `00001` |\n| `kodPocztowyZKreska` | 10    | Kod pocztowy z kreską, np. `00-001` |\n| `kraj`               | 40    | Kraj, np. `Polska` |\n| `ulica`              | 40    | Ulica bez numeru |\n| `nrDomu`             | 10    | Numer domu |\n| `nrLokalu`           | 10    | Numer lokalu |\n| `miasto`             | 40    | Miasto |\n| `poczta`             | 40    | Miejscowość poczty gdy inna niż miasto |\n| `powiat`             | 40    | Powiat |\n| `gmina`              | 40    | Gmina |\n| `wojewodztwo`        | 40    | Województwo |\n| `dodatkowe`          | 200   | Dodatkowy opis adresu |\n\n---\n\n## Centrum i dział\n\nGdy podano `centrumKod` lub `dzialKod`, worker najpierw weryfikuje ich istnienie\nw Optimie. Jeśli centrum lub dział nie istnieje — cała pozycja kończy się błędem.\nGdy walidacja przejdzie — po zapisaniu pracownika centrum/dział są przypisywane\nw osobnych sesjach COM. Niepowodzenie przypisania (np. race condition) trafia\ndo listy `ostrzezenia` w wyniku pozycji, ale nie anuluje samego dodania pracownika.\n\n---\n\n## Przykład\n\n```json\n{\n  \"pracownicy\": [\n    {\n      \"kod\": \"ANNAK\",\n      \"nazwisko\": \"Kowalska\",\n      \"imie1\": \"Anna\",\n      \"pesel\": \"90010112345\",\n      \"plec\": \"K\",\n      \"typPracownika\": 0,\n      \"centrumKod\": \"HANDEL\",\n      \"dzialKod\": \"IT\",\n      \"daneKadrowe\": {\n        \"email\": \"anna.kowalska@firma.pl\",\n        \"telefon1\": \"+48 22 123 45 67\"\n      },\n      \"adresZamieszkania\": {\n        \"ulica\": \"Marszałkowska\",\n        \"nrDomu\": \"12\",\n        \"kodPocztowy\": \"00001\",\n        \"kodPocztowyZKreska\": \"00-001\",\n        \"miasto\": \"Warszawa\",\n        \"kraj\": \"Polska\"\n      }\n    }\n  ]\n}\n```\n\nZwraca **202 Accepted** z `jobId`. Odpytuj `GET /api/jobs/{jobId}` żeby sprawdzić postęp.\nKażda pozycja wyniku zawiera `{ \"praId\", \"kod\", \"nazwiskoImie\", \"ostrzezenia\" }`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PracownicyBatchRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownicyBatchRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/PracownicyBatchRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"text/plain":{"schema":{}},"application/json":{"schema":{}},"text/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{}},"application/json":{"schema":{}},"text/json":{"schema":{}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/jobs/{jobId}":{"get":{"tags":["Batch — zadania"],"summary":"Zwraca szczegółowy stan joba wraz z każdą pozycją.","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}}},"404":{"description":"Not Found","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/jobs/active":{"get":{"tags":["Batch — zadania"],"summary":"Lista aktywnych jobów (Pending + Running). Wymaga all.read.write.","responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/JobStatusResponse"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/JobStatusResponse"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/JobStatusResponse"}}}}}}}},"/api/jobs/workers":{"get":{"tags":["Batch — zadania"],"summary":"Lista zarejestrowanych workerów z aktualnym stanem. Wymaga all.read.write.","responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkerStatusResponse"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkerStatusResponse"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkerStatusResponse"}}}}}}}},"/bazy":{"get":{"tags":["Bazy"],"summary":"Zwraca listę aktywnych baz firmowych z CDN.Bazy (baza konfiguracyjna).\nZwraca tylko rekordy z Baz_Nieaktywna = 0.\nFiltry można łączyć (AND). Nazwa działa jako LIKE (fragment).","parameters":[{"name":"nip","in":"query","schema":{"type":"string"}},{"name":"nazwa","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BazaItem"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BazaItem"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BazaItem"}}}}}}}},"/cennik":{"get":{"tags":["Cennik"],"summary":"Zwraca cennik zbiorczy: towary z cenami jako kolumny Cena{Lp}.","description":"Odpowiedź zawiera sekcję `Definicje` — legendę mapującą Lp na nazwę cennika\n(np. Lp=2 oznacza klucz `Cena2` w każdym wierszu `Dane`).\n\nAktywne definicje cen pobierane są z `CDN.DefCeny`, wartości z `CDN.TwrCeny`.\nPole `null` w kolumnie Cena{Lp} oznacza brak wpisu cennikowego dla danego towaru.\n\n| Parametr  | Kolumna DB                | Porównanie | Uwagi               |\n|-----------|---------------------------|------------|---------------------|\n| id        | Twr_TwrId                 | =          |                     |\n| kod       | Twr_Kod                   | =          | zamieniane na UPPER |\n| idGrupy   | TwG_TwGID (CDN.TwrGrupy)  | =          | przez podkwerendę   |\n| kodGrupy  | TwG_Kod   (CDN.TwrGrupy)  | =          | zamieniane na UPPER |\n\nFiltry łączone są operatorem AND. Wyniki stronicowane — domyślnie 50 rekordów na stronę.","parameters":[{"name":"id","in":"query","description":"Filtr: `Twr_TwrId = ?`.","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Filtr: `Twr_Kod = ?` (zamieniane na wielkie litery).","schema":{"type":"string"}},{"name":"idGrupy","in":"query","description":"Filtr po grupie towarowej — wewnętrzne ID grupy (TwG_TwGID).","schema":{"type":"integer","format":"int32"}},{"name":"kodGrupy","in":"query","description":"Filtr po grupie towarowej — kod grupy (TwG_Kod).","schema":{"type":"string"}},{"name":"strona","in":"query","description":"Numer strony (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500, domyślnie 50).","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Cennik zbiorczy (lista może być pusta).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CennikZbiorczyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CennikZbiorczyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CennikZbiorczyResponse"}}}},"400":{"description":"Podana grupa nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/centra":{"get":{"tags":["Centra"],"summary":"Zwraca drzewo aktywnych centrów kosztów z CDN.Centra (CNT_Nieaktywny=0).\nOdpowiedź zawiera korzenie drzewa z rekurencyjnie zagnieżdżonymi podcentrami (pole Dzieci).\nFiltry dotyczą węzła startowego — zwracany jest pasujący węzeł wraz z całym podrzędnym poddrzewem.\nFiltry można łączyć (AND).","parameters":[{"name":"kod","in":"query","description":"Kod centrum (CNT_Kod) — dokładne dopasowanie, wielkość liter bez znaczenia.","schema":{"type":"string"}},{"name":"adresWezla","in":"query","description":"Adres węzła (CNT_AdresWezla) — dokładne dopasowanie.","schema":{"type":"string"}}],"responses":{"200":{"description":"Drzewo centrów kosztów.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CentraResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CentraResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CentraResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/defceny":{"get":{"tags":["Definicje cen"],"summary":"Zwraca listę definicji cen z CDN.DefCeny.","description":"Parametry filtrów łączone są operatorem AND.\n\n| Parametr   | Kolumna DB      | Porównanie | Uwagi                                              |\n|------------|-----------------|------------|----------------------------------------------------|\n| id         | DfC_DfCId       | =          |                                                    |\n| lp         | DfC_Lp          | =          |                                                    |\n| nieaktywne | DfC_Nieaktywna  | —          | false = tylko aktywne (DfC_Nieaktywna = 0 OR NULL) |","parameters":[{"name":"id","in":"query","description":"Filtr: `DfC_DfCId = ?` — dokładne dopasowanie po wewnętrznym ID definicji.","schema":{"type":"integer","format":"int32"}},{"name":"lp","in":"query","description":"Filtr: `DfC_Lp = ?` — dokładne dopasowanie po numerze kolejnym ceny (1 = zakup, >1 = sprzedaż).","schema":{"type":"integer","format":"int32"}},{"name":"nieaktywne","in":"query","description":"Gdy `true` — pomija filtr `DfC_Nieaktywna` i zwraca wszystkie definicje. Domyślnie `false`.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Lista definicji cen spełniających kryteria (może być pusta)."},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Definicje cen"],"summary":"Dodaje nową definicję ceny do CDN.DefCeny.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowaDefCena"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowaDefCena"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowaDefCena"}}}},"responses":{"200":{"description":"Definicja ceny dodana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}}}},"400":{"description":"Błąd walidacji lub DfC_Lp już istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/defceny/{lp}":{"put":{"tags":["Definicje cen"],"summary":"Aktualizuje definicję ceny w CDN.DefCeny.","parameters":[{"name":"lp","in":"path","description":"Numer kolejny ceny (DfC_Lp).","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaDefCeny"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaDefCeny"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaDefCeny"}}}},"responses":{"200":{"description":"Definicja ceny zaktualizowana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}}}},"400":{"description":"Błąd walidacji lub definicja nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Definicje cen"],"summary":"Usuwa definicję ceny z CDN.DefCeny.","parameters":[{"name":"lp","in":"path","description":"Numer kolejny ceny (DfC_Lp).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Definicja ceny usunięta pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}}}},"400":{"description":"Definicja ceny o podanym numerze nie istnieje lub błąd SQL.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DefCenaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/dekrety":{"get":{"tags":["Dekrety"],"summary":"Zwraca nagłówki dekretów księgowych z CDN.DekretyNag.","description":"Domyślnie zwracane są zapisy niezależnie od statusu bufora oraz typu (predekret/dekret) —\nzawęź parametrami `bufor`/`typ`, jeśli potrzebujesz tylko jednego rodzaju.\nZakres dat filtruje po `DeN_DataOpe` (data dokonania operacji gospodarczej).\n\nTen endpoint zwraca tylko nagłówki (kwoty zbiorcze, bez podziału na konta).\nRozbicie na konkretne konta Wn/Ma znajduje się w elementach — zobacz\n`GET /dekrety/{{id}}/elementy` i `GET /dekrety/elementy`.\n\n| Parametr    | Kolumna DB     | Porównanie | Uwagi                                    |\n|-------------|----------------|------------|-------------------------------------------|\n| okresId     | DeN_OObId      | =          | ma pierwszeństwo przed `data`        |\n| data        | —              | —          | znajduje okres obejmujący datę            |\n| dataOd      | DeN_DataOpe    | >=      |                                            |\n| dataDo      | DeN_DataOpe    | <=      |                                            |\n| dziennikId  | DeN_DziId      | =          |                                            |\n| bufor       | DeN_Bufor      | =          | brak = oba                                |\n| typ         | DeN_Typ        | =          | 1=Predekret, 2=Dekret; brak = oba         |\n| podmiotTyp  | DeN_PodmiotTyp | =          |                                            |\n| podmiotId   | DeN_PodmiotId  | =          |                                            |\n| zrodlo      | DeN_Zrodlo     | =          |                                            |\n| storno      | DeN_Storno     | =          |                                            |\n| identKsieg  | DeN_IdentKsieg | =          |                                            |\n| dokument    | DeN_Dokument   | zawiera    |                                            |\n| numerPelny  | DeN_NumerPelny | zawiera    |                                            |\n\nWyniki stronicowane — domyślnie 50 na stronę, sortowane po dacie operacji malejąco.","parameters":[{"name":"okresId","in":"query","description":"Identyfikator okresu obrachunkowego (DeN_OObId). Ma pierwszeństwo przed `data`.","schema":{"type":"integer","format":"int32"}},{"name":"data","in":"query","description":"Data, dla której szukany jest obowiązujący okres obrachunkowy.","schema":{"type":"string","format":"date-time"}},{"name":"dataOd","in":"query","description":"Data operacji gospodarczej — od.","schema":{"type":"string","format":"date-time"}},{"name":"dataDo","in":"query","description":"Data operacji gospodarczej — do.","schema":{"type":"string","format":"date-time"}},{"name":"dziennikId","in":"query","description":"Filtr po identyfikatorze dziennika cząstkowego.","schema":{"type":"integer","format":"int32"}},{"name":"bufor","in":"query","description":"Filtr: tylko w buforze (true) lub tylko zatwierdzone (false). Domyślnie — oba.","schema":{"type":"boolean"}},{"name":"typ","in":"query","description":"Rodzaj dekretu: 1=Predekret, 2=Dekret. Domyślnie — oba.","schema":{"type":"integer","format":"int32"}},{"name":"podmiotTyp","in":"query","description":"Typ podmiotu: 1=Kontrahent, 2=Bank, 3=Pracownik/Wspólnik, 5=Urząd.","schema":{"type":"integer","format":"int32"}},{"name":"podmiotId","in":"query","description":"Identyfikator podmiotu.","schema":{"type":"integer","format":"int32"}},{"name":"zrodlo","in":"query","description":"Źródło pochodzenia zapisu.","schema":{"type":"integer","format":"int32"}},{"name":"storno","in":"query","description":"Filtr: tylko storna (true) lub tylko niestorna (false).","schema":{"type":"boolean"}},{"name":"identKsieg","in":"query","description":"Identyfikator księgowy — dokładne dopasowanie.","schema":{"type":"string"}},{"name":"dokument","in":"query","description":"Fragment numeru dokumentu źródłowego.","schema":{"type":"string"}},{"name":"numerPelny","in":"query","description":"Fragment pełnego numeru dokumentu.","schema":{"type":"string"}},{"name":"kwotaMin","in":"query","description":"Minimalna kwota (KwotaWn lub KwotaMa).","schema":{"type":"number","format":"double"}},{"name":"kwotaMax","in":"query","description":"Maksymalna kwota (KwotaWn lub KwotaMa).","schema":{"type":"number","format":"double"}},{"name":"strona","in":"query","description":"Numer strony (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500, domyślnie 50).","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Nagłówki dekretów spełniające kryteria (lista może być pusta).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DekretyNagPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DekretyNagPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DekretyNagPagedResponse"}}}},"400":{"description":"Nieprawidłowe parametry filtrowania.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono okresu obrachunkowego dla podanej daty.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/dekrety/{id}/elementy":{"get":{"tags":["Dekrety"],"summary":"Zwraca elementy (pozycje Wn/Ma) jednego dekretu z CDN.DekretyElem, wraz z danymi podmiotu\nz CDN.PodmiotyView (dopasowanego po SlownikTyp/SlownikId), jeśli element ma podpięty słownik.","parameters":[{"name":"id","in":"path","description":"Identyfikator nagłówka dekretu (DeE_DeNId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Elementy dekretu, posortowane po Lp.","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DekretElementItem"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DekretElementItem"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DekretElementItem"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono dekretu o podanym identyfikatorze.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/dekrety/elementy":{"get":{"tags":["Dekrety"],"summary":"Przeszukuje elementy dekretów z CDN.DekretyElem — głównie do zestawień typu \"obroty/historia konta\".\nKażdy element zawiera też dane podmiotu z CDN.PodmiotyView (dopasowanego po SlownikTyp/SlownikId),\njeśli element ma podpięty słownik.","description":"| Parametr          | Kolumna DB              | Porównanie | Uwagi                                  |\n|-------------------|-------------------------|------------|------------------------------------------|\n| dekretId          | DeE_DeNId               | =          |                                          |\n| kontoId           | DeE_AccWnId/DeE_AccMaId | =          | dopasowuje stronę Wn lub Ma              |\n| kontoSymbol       | DeE_KontoWn/DeE_KontoMa | =          | dopasowuje stronę Wn lub Ma              |\n| stronaKonta       | —                       | —          | \"Wn\" lub \"Ma\" — zawęża stronę dopasowania|\n| dataOd            | DeE_DataOpe             | >=      |                                          |\n| dataDo            | DeE_DataOpe             | <=      |                                          |\n| slownikTyp        | DeE_SlownikTyp          | =          |                                          |\n| slownikId         | DeE_SlownikId           | =          |                                          |\n| waluta            | DeE_Waluta              | =          |                                          |\n| dokumentTyp       | DeE_DokumentTyp         | =          | 7,8,14,44,50                             |\n| statusRozrachunku | DeE_StatusRozrachunku   | =          | 0..3                                     |\n\nWyniki stronicowane — domyślnie 50 na stronę, sortowane chronologicznie (DataOpe rosnąco) —\nnaturalny porządek dla przeglądu zapisów na koncie.","parameters":[{"name":"dekretId","in":"query","description":"Identyfikator nagłówka dekretu.","schema":{"type":"integer","format":"int32"}},{"name":"kontoId","in":"query","description":"Identyfikator konta (Acc_AccId) — dopasowuje stronę Wn lub Ma.","schema":{"type":"integer","format":"int32"}},{"name":"kontoSymbol","in":"query","description":"Symbol konta — dopasowuje stronę Wn lub Ma.","schema":{"type":"string"}},{"name":"stronaKonta","in":"query","description":"Zawężenie dopasowania konta do strony: \"Wn\" lub \"Ma\". Domyślnie obie.","schema":{"type":"string"}},{"name":"dataOd","in":"query","description":"Data operacji gospodarczej — od.","schema":{"type":"string","format":"date-time"}},{"name":"dataDo","in":"query","description":"Data operacji gospodarczej — do.","schema":{"type":"string","format":"date-time"}},{"name":"slownikTyp","in":"query","description":"Typ słownika: 1=Kontrahent, 2=Bank, 3=Pracownik/Wspólnik, 5=Urząd, 6=Środek trwały, 7=Towar.","schema":{"type":"integer","format":"int32"}},{"name":"slownikId","in":"query","description":"Identyfikator pozycji słownika.","schema":{"type":"integer","format":"int32"}},{"name":"waluta","in":"query","description":"Symbol waluty zapisu.","schema":{"type":"string"}},{"name":"dokumentTyp","in":"query","description":"Typ dokumentu źródłowego: 7, 8, 14, 44 lub 50.","schema":{"type":"integer","format":"int32"}},{"name":"statusRozrachunku","in":"query","description":"Status rozrachunku: 0=Nie podlega, 1=Nierozliczony, 2=Częściowo, 3=Całkowicie.","schema":{"type":"integer","format":"int32"}},{"name":"kwotaMin","in":"query","description":"Minimalna kwota (DeE_Kwota).","schema":{"type":"number","format":"double"}},{"name":"kwotaMax","in":"query","description":"Maksymalna kwota (DeE_Kwota).","schema":{"type":"number","format":"double"}},{"name":"strona","in":"query","description":"Numer strony wyniku (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500, domyślnie 50).","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Elementy dekretów spełniające kryteria (lista może być pusta).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DekretyElementyPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DekretyElementyPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DekretyElementyPagedResponse"}}}},"400":{"description":"Nieprawidłowe parametry filtrowania.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/dokumenty":{"get":{"tags":["Dokumenty HaMag"],"summary":"Zwraca stronicowaną listę dokumentów handlowo-magazynowych.","description":"Dane pobierane z:\n- `CDN.TraNag` — nagłówki dokumentów\n- `CDN.Kontrahenci` — dane kontrahenta (gdy podmiot jest kontrahentem)\n- `CDN.FormyPlatnosci` — nazwa formy płatności\n\nWszystkie filtry są opcjonalne i łączone operatorem AND.\n\n| Parametr             | Kolumna DB              | Porównanie |\n|----------------------|-------------------------|------------|\n| kontrahentKod        | Knt_Kod                 | =          |\n| kontrahentNip        | Knt_NIP                 | =          |\n| kontrahentId         | TrN_PodmiotId           | =          |\n| dataWystawieniaOd    | TrN_DataWys             | >=      |\n| dataWystawieniaDo    | TrN_DataWys             | <=      |\n| formaPlatnosci       | FPl_Nazwa               | =          |\n| typ                  | TrN_Rodzaj              | =          |\n\nKody typów dokumentów (`typ`) są identyczne jak w `POST /dokumenty` i `GET /dokumenty/typy`\n— wielkość liter nie ma znaczenia (np. `FS`, `fz`, `RO`).\n\nSortowanie po dacie wystawienia: `sortowanie=asc` lub `sortowanie=desc` (domyślnie `desc`).","parameters":[{"name":"kontrahentKod","in":"query","description":"Filtr po kodzie kontrahenta (Knt_Kod).","schema":{"type":"string"}},{"name":"kontrahentNip","in":"query","description":"Filtr po NIP kontrahenta (Knt_NIP) — bez prefiksu kraju i kresek.","schema":{"type":"string"}},{"name":"kontrahentId","in":"query","description":"Filtr po ID kontrahenta (Knt_KntId).","schema":{"type":"integer","format":"int32"}},{"name":"dataWystawieniaOd","in":"query","description":"Zakres dat wystawienia — od (format RRRR-MM-DD).","schema":{"type":"string","format":"date-time"}},{"name":"dataWystawieniaDo","in":"query","description":"Zakres dat wystawienia — do (format RRRR-MM-DD).","schema":{"type":"string","format":"date-time"}},{"name":"formaPlatnosci","in":"query","description":"Filtr po nazwie formy płatności (FPl_Nazwa), np. PRZELEW.","schema":{"type":"string"}},{"name":"typ","in":"query","description":"Filtr po kodzie typu dokumentu, np. FS, FZ, RO. Pełna lista: GET /dokumenty/typy.","schema":{"type":"string"}},{"name":"sortowanie","in":"query","description":"Kierunek sortowania po dacie wystawienia: `asc` lub `desc`. Domyślnie `desc`.","schema":{"type":"string","default":"desc"}},{"name":"strona","in":"query","description":"Numer strony (od 1). Domyślnie 1.","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500). Domyślnie 50.","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Stronicowana lista dokumentów spełniających kryteria.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentyHaMagPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentyHaMagPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentyHaMagPagedResponse"}}}},"400":{"description":"Nieprawidłowy kod typu dokumentu lub kierunek sortowania.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Dokumenty HaMag"],"summary":"Dodaje nowy dokument handlowo-magazynowy w Comarch ERP Optima.","description":"## Typy dokumentów\n\nKod przekazywany w polu `Typ` (wielkość liter nie ma znaczenia). Pełna lista: `GET /dokumenty/typy`.\n\n| Kod    | Nazwa                              | Wymaga kontrahenta | Wymaga magazynu |\n|--------|------------------------------------|--------------------|-----------------|\n| FS     | Faktura sprzedaży                  | tak                | tak             |\n| FZ     | Faktura zakupu                     | tak                | tak             |\n| PA     | Paragon                            | nie                | tak             |\n| WZ     | Wydanie zewnętrzne                 | tak                | tak             |\n| PZ     | Przyjęcie zewnętrzne               | tak                | tak             |\n| RO     | Rezerwacja odbiorcy                | tak                | tak             |\n| ZD     | Zamówienie dostawcy                | tak                | nie             |\n| MM     | Przesunięcie MM                    | nie                | tak (źródłowy i docelowy) |\n| PW     | Przychód wewnętrzny                | nie                | tak             |\n| RW     | Rozchód wewnętrzny                 | nie                | tak             |\n| PF     | Faktura pro forma                  | tak                | tak             |\n| FWZ    | Faktura wewnętrzna zakupu          | tak                | tak             |\n| FWS    | Faktura wewnętrzna sprzedaży       | tak                | tak             |\n| BO     | Bilans otwarcia                    | nie                | tak             |\n| PI     | Podkładka inwentaryzacyjna         | nie                | tak             |\n| PK     | Przyjęcie kaucji                   | tak                | tak             |\n| WK     | Wydanie kaucji                     | tak                | tak             |\n| PWP    | Przychód wewnętrzny produktów      | nie                | tak             |\n| RWS    | Rozchód wewnętrzny składników      | nie                | tak             |\n| TF     | Dokument Tax Free                  | tak                | tak             |\n| FRR    | Faktura RR                         | tak                | tak             |\n| FSK    | Korekta faktury sprzedaży          | tak                | tak             |\n| FZK    | Korekta faktury zakupu             | tak                | tak             |\n| PAK    | Korekta paragonu                   | nie                | tak             |\n| WZK    | Korekta WZ                         | tak                | tak             |\n| PZK    | Korekta PZ                         | tak                | tak             |\n| ROK    | Korekta rezerwacji odbiorcy        | tak                | tak             |\n| ZDK    | Korekta zamówienia dostawcy        | tak                | nie             |\n| FWZK   | Korekta faktury wewnętrznej zakupu | tak                | tak             |\n| FWSK   | Korekta faktury wewnętrznej sprzedaży | tak             | tak             |\n| TFK    | Korekta Tax Free                   | tak                | tak             |\n| FRRK   | Korekta faktury RR                 | tak                | tak             |\n\n## Daty\n\n- `DataWys` — data wystawienia dokumentu (domyślnie bieżąca)\n- `DataSprzedazy` — data sprzedaży / wydania towaru (FS, WZ itp.)\n- `DataDok` — data dokumentu\n- `Termin` — termin zapłaty (FS, FZ, PA i ich korekty), termin ważności (RO, ZD, PF), data realizacji (pozostałe)\n- `DataDokKorekta`, `DataOpeKorekta`, `DataWysKorekta` — wyłącznie dla dokumentów korygujących (FSK, FZK itp.)\n\n## Ceny i waluta\n\n- `TypNB`: `1` = ceny netto, `2` = ceny brutto (domyślnie `1`)\n- `WalutaSymbol` — symbol waluty obcej (np. `EUR`, `USD`). Gdy podany, na każdej pozycji\n  cena musi być ustawiona przez `CenaJednostkowa` a zostanie wywołana metoda `UstawCeneWWalucie`.\n  Gdy brak — cena ustawiana przez pole `CenaW` w PLN.\n- `FormaPlatnosci` — dokładna nazwa formy płatności zdefiniowanej w Optimie (np. `PRZELEW`, `GOTÓWKA`)\n\n## Podmiot i odbiorca\n\nDokument posiada dwa odrębne zestawy danych adresowych:\n\n**Podmiot** (`PodNazwa1/2/3`, `PodAdres`) — sprzedawca lub nabywca główny.\nDomyślnie wypełniany z kartoteki kontrahenta (`KontrahentKod`).\nPola `PodNazwa1/2/3` i `PodAdres` nadpisują dane z kartoteki gdy są podane.\n\n**Odbiorca** (`OdbNazwa1/2/3`, `OdbAdres`) — miejsce dostawy / odbiorca faktury.\nMoże być inny niż podmiot (np. dostawa na inny adres).\nUzupełnij również `OdbEmail`, `OdbTelefon` jeśli potrzebne.\n\nObiekt `AdresRequest` zawiera pola: `Ulica`, `NrDomu`, `NrLokalu`, `KodPocztowy`,\n`Poczta`, `Miasto`, `Gmina`, `Powiat`, `Wojewodztwo`, `Kraj`, `Dodatkowe`.\n\n## Generowanie WZ / PZ\n\nGdy `GenerujWzPz = true`:\n- dla **FS** — automatycznie generuje dokument **WZ** na tym samym magazynie\n- dla **FZ** — automatycznie generuje dokument **PZ** na tym samym magazynie\n- dla pozostałych typów — pole ignorowane\n\nMagazyn pobierany jest z pola `MagazynZrodlowyID` zapisanego dokumentu.\nOdpowiedź zawiera pole `WzPzWygenerowany: true` w przypadku powodzenia.\n\n## Bufor\n\n`Bufor = true` zapisuje dokument w buforze (niezatwierdzony).\n`Bufor = false` (domyślnie) zatwierdza dokument. Dokumenty z bufora nie wpływają na stany magazynowe.\n\n## Atrybuty\n\nLista obiektów `{ \"Kod\": \"KOD_ATRYBUTU\", \"Wartosc\": \"wartość\" }`.\nKody atrybutów muszą być wcześniej zdefiniowane w Optimie (Definicje atrybutów).\n\n## Podmioty trzecie KSeF (`KSeFPodmioty3`)\n\nLista podmiotów trzecich KSeF. Każdy wpis odpowiada\njednemu rekordowi w `CDN.TraNagKSeFPodmioty3`.\n\n### Pole `RolaPodmiotu` (wymagane)\n\n| Wartość | Nazwa | Opis |\n|---------|-------|------|\n| 1 | Faktor | Na fakturze występują dane faktora |\n| 2 | Odbiorca | Dane jednostek wewnętrznych / oddziałów nabywcy niebędących nabywcą w rozumieniu ustawy |\n| 3 | Podmiot pierwotny | Podmiot przejęty lub przekształcony, który dokonywał dostawy lub świadczył usługę |\n| 4 | Dodatkowy nabywca | Kolejni nabywcy inni niż wymieniony w Podmiot2 |\n| 5 | Wystawca faktury | Podmiot wystawiający fakturę w imieniu podatnika |\n| 6 | Dokonujący płatności | Podmiot regulujący zobowiązanie w miejsce nabywcy |\n| 7 | JST – wystawca | Jednostka samorządu terytorialnego jako wystawca |\n| 8 | JST – odbiorca | Jednostka samorządu terytorialnego jako odbiorca |\n| 9 | Członek GV – wystawca | Członek grupy VAT jako wystawca |\n| 10 | Członek GV – odbiorca | Członek grupy VAT jako odbiorca |\n| 11 | Pracownik | Pracownik |\n\n### Pole `RodzajIdentyfikatora`\n\n| Wartość | Znaczenie |\n|---------|-----------|\n| 1 | NIP |\n| 2 | NIP-VAT-UE |\n| 3 | Identyfikator podatkowy inny |\n| 4 | Identyfikator wewnętrzny |\n\n### Powiązanie z kartoteką kontrahenta\n\nGdy podano `KontrahentKod` (Knt_Kod) — podmiot zostaje powiązany z kartoteką Optimy\n(`TKP_PodmiotTyp = 1`, `TKP_PodmiotId = Knt_KntId`). Kontrahent musi istnieć,\nw przeciwnym razie żądanie zostanie odrzucone z kodem 400.\nGdy `KontrahentKod` nie jest podany — podmiot jest czysto manualny\n(wypełnij `Nazwa`, `Nip`, `NipKraj` itd. ręcznie).\n\n### Pozostałe pola\n\n| Pole | Maks. długość | Opis |\n|------|--------------|------|\n| `OpisRoli` | 500 | Opis słowny roli podmiotu |\n| `Nazwa` | 300 | Nazwa podmiotu |\n| `Nip` | 50 | Numer identyfikatora podatkowego |\n| `NipKraj` | 2 | Kod kraju ISO 3166-1 alpha-2, np. `PL` |\n| `NrKlienta` | 50 | Numer klienta |\n| `EORI` | 50 | Numer EORI |\n| `Adres` | 500 | Adres podmiotu |\n| `Udzial` | — | Udział procentowy (0–100) |\n\n## Pozycje dokumentu\n\nKażda pozycja wymaga `TowarKod` (Twr_Kod z kartoteki towarów) i `Ilosc`.\nOpcjonalnie:\n- `TowarNazwa` — nadpisuje nazwę towaru na dokumencie (wywołuje `UstawNazweTowaru`)\n- `TowarOpis` — opis pozycji\n- `CenaJednostkowa` — cena jednostkowa; gdy podany `WalutaSymbol` — cena w tej walucie\n- `Rabat` — rabat procentowy (np. `10.5` = 10,5%)\n- `StawkaVat` — stawka VAT: `23`, `8`, `5`, `0` lub symbol `\"ZW\"` / `\"NP\"` (oba = 0); gdy pominięta — pobierana z kartoteki towaru","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyDokumentHaMagRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyDokumentHaMagRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyDokumentHaMagRequest"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Unauthorized","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/typy":{"get":{"tags":["Dokumenty HaMag"],"summary":"Zwraca listę dostępnych typów dokumentów handlowo-magazynowych.","responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TypDokumentuInfo"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TypDokumentuInfo"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TypDokumentuInfo"}}}}}}}},"/dokumenty/szczegoly":{"get":{"tags":["Dokumenty HaMag"],"summary":"Zwraca szczegóły dokumentu HaMag — nagłówek i pozycje z atrybutami.","description":"Wymagany jest jeden sposób identyfikacji dokumentu:\n- `id` — identyfikator TrN_TrNId\n- `typ` + `numerPelny` — kod typu (np. FS, WZ) i pełny numer dokumentu\n\nZwracane pozycje zawierają tylko aktywne elementy (`TrE_Aktywny = 1`).","parameters":[{"name":"id","in":"query","description":"ID dokumentu (TrN_TrNId).","schema":{"type":"integer","format":"int32"}},{"name":"typ","in":"query","description":"Kod typu dokumentu, np. FS, FZ, WZ.","schema":{"type":"string"}},{"name":"numerPelny","in":"query","description":"Pełny numer dokumentu, np. FS/12/2025.","schema":{"type":"string"}}],"responses":{"200":{"description":"Szczegóły dokumentu z pozycjami i atrybutami.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagSzczegolyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagSzczegolyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagSzczegolyResponse"}}}},"400":{"description":"Brak wymaganego parametru lub nieznany typ dokumentu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono dokumentu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/dokumenty/powiazane":{"get":{"tags":["Dokumenty HaMag"],"summary":"Zwraca listę dokumentów powiązanych z podanym dokumentem HaMag.","description":"Wyszukuje dokument po `numerPelny` i `typ` (np. FS, WZ) i zwraca powiązane dokumenty\n(np. WZ do FS, PZ do FZ) na podstawie relacji w tabeli CDN.TraNagRelacje.\n\nKody typów są identyczne jak w `POST /dokumenty` — wielkość liter nie ma znaczenia.","parameters":[{"name":"numerPelny","in":"query","description":"Pełny numer dokumentu, np. FS/12/2025.","schema":{"type":"string"}},{"name":"typ","in":"query","description":"Kod typu dokumentu, np. FS, FZ, WZ.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DokumentPowiazanyDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DokumentPowiazanyDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DokumentPowiazanyDto"}}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Unauthorized","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/{id}":{"put":{"tags":["Dokumenty HaMag"],"summary":"Aktualizuje istniejący dokument handlowo-magazynowy.","description":"Wszystkie pola żądania są opcjonalne — podaj tylko te, które chcesz zmienić.\n\n## Edycja pozycji (`Pozycje`)\n\nPole `Pozycje` ma specjalną semantykę:\n- **`null` (pominięte)** — pozycje dokumentu pozostają bez zmian\n- **Lista pozycji** — zastępuje **wszystkie** istniejące pozycje podanymi; dozwolone tylko dla dokumentów w buforze (`Bufor = true`)\n- **Pusta lista `[]`** — usuwa wszystkie pozycje; dozwolone tylko dla dokumentów w buforze\n\nDla dokumentów zatwierdzonych (`Bufor = false`) pole `Pozycje` musi być pominięte —\npróba edycji pozycji zatwierdzonego dokumentu zwróci **400**.\n\n## Pola nagłówka\n\nEdytowalne niezależnie od stanu bufora: `NumerObcy`, `Uwagi`, `Termin`,\n`OdbNazwa1/2/3`, `OdbAdres`, `OdbEmail`, `OdbTelefon`, `Odebral`,\n`NrKSeF`, `KSeFDataPrzyjecia`.\n\nPola dat (`DataWys`, `DataSprzedazy`, `DataDok`) mogą być zablokowane\nprzez Optimę na zatwierdzonych dokumentach — w takim przypadku COM zwróci błąd.","parameters":[{"name":"id","in":"path","description":"ID dokumentu (TrN_TrNId).","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaDokumentuHaMagRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaDokumentuHaMagRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaDokumentuHaMagRequest"}}}},"responses":{"200":{"description":"Dokument zaktualizowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument nie istnieje, próba edycji pozycji zatwierdzonego dokumentu lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}},"delete":{"tags":["Dokumenty HaMag"],"summary":"Usuwa dokument handlowo-magazynowy po ID przez COM Optimy.","description":"Usuwać można wyłącznie dokumenty znajdujące się w buforze (Bufor = 1).\nDokumenty zatwierdzone należy najpierw anulować (`POST /dokumenty/{id}/anuluj`).","parameters":[{"name":"id","in":"path","description":"ID dokumentu (TrN_TrNId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Dokument usunięty pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument nie istnieje lub błąd COM (np. dokument nie jest w buforze).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/generuj-fs":{"post":{"tags":["Dokumenty HaMag"],"summary":"Generuje fakturę sprzedaży (FS) z dokumentu WZ przez COM Optimy.","description":"Wymagany jest dokładnie jeden identyfikator dokumentu WZ: `id` lub `numerPelny`.\nOperacja jest odpowiednikiem ręcznego \"agregowania\" WZ do FS w Optimie.\nWygenerowana FS jest zwracana w polach `Id` i `NumerPelny` odpowiedzi.","parameters":[{"name":"id","in":"query","description":"ID dokumentu WZ (TrN_TrNId).","schema":{"type":"integer","format":"int32"}},{"name":"numerPelny","in":"query","description":"Pełny numer dokumentu WZ, np. WZ/12/2025.","schema":{"type":"string"}}],"responses":{"200":{"description":"FS wygenerowana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument WZ nie istnieje lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/generuj-fz":{"post":{"tags":["Dokumenty HaMag"],"summary":"Generuje fakturę zakupu (FZ) z dokumentu PZ przez COM Optimy.","description":"Wymagany jest dokładnie jeden identyfikator dokumentu PZ: `id` lub `numerPelny`.\nOperacja jest odpowiednikiem ręcznego \"agregowania\" PZ do FZ w Optimie.\nWygenerowana FZ jest zwracana w polach `Id` i `NumerPelny` odpowiedzi.","parameters":[{"name":"id","in":"query","description":"ID dokumentu PZ (TrN_TrNId).","schema":{"type":"integer","format":"int32"}},{"name":"numerPelny","in":"query","description":"Pełny numer dokumentu PZ, np. PZ/12/2025.","schema":{"type":"string"}}],"responses":{"200":{"description":"FZ wygenerowana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument PZ nie istnieje lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/generuj-wz":{"post":{"tags":["Dokumenty HaMag"],"summary":"Generuje dokument WZ z istniejącej faktury sprzedaży (FS) przez COM Optimy.","description":"Odpowiednik ręcznego \"generuj WZ\" z poziomu FS w Optimie (`AgregujDokumenty 302→306`).\nWymagany jest dokładnie jeden identyfikator dokumentu FS: `id` lub `numerPelny`.\n\nUwaga: jeśli FS zawiera wyłącznie pozycje usługowe (towary typu usługa), generowanie WZ\nzakończy się błędem COM — usługi nie mają ruchu magazynowego.\n\nWygenerowany WZ jest zwracany w polach `Id` i `NumerPelny` odpowiedzi.","parameters":[{"name":"id","in":"query","description":"ID dokumentu FS (TrN_TrNId).","schema":{"type":"integer","format":"int32"}},{"name":"numerPelny","in":"query","description":"Pełny numer dokumentu FS, np. FS/12/2025.","schema":{"type":"string"}}],"responses":{"200":{"description":"WZ wygenerowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument FS nie istnieje, błąd COM lub FS zawiera wyłącznie usługi.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/generuj-pz":{"post":{"tags":["Dokumenty HaMag"],"summary":"Generuje dokument PZ z istniejącej faktury zakupu (FZ) przez COM Optimy.","description":"Odpowiednik ręcznego \"generuj PZ\" z poziomu FZ w Optimie (`AgregujDokumenty 301→307`).\nWymagany jest dokładnie jeden identyfikator dokumentu FZ: `id` lub `numerPelny`.\n\nUwaga: jeśli FZ zawiera wyłącznie pozycje usługowe (towary typu usługa), generowanie PZ\nzakończy się błędem COM — usługi nie mają ruchu magazynowego.\n\nWygenerowany PZ jest zwracany w polach `Id` i `NumerPelny` odpowiedzi.","parameters":[{"name":"id","in":"query","description":"ID dokumentu FZ (TrN_TrNId).","schema":{"type":"integer","format":"int32"}},{"name":"numerPelny","in":"query","description":"Pełny numer dokumentu FZ, np. FZ/12/2025.","schema":{"type":"string"}}],"responses":{"200":{"description":"PZ wygenerowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument FZ nie istnieje, błąd COM lub FZ zawiera wyłącznie usługi.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/ro/przeksztalc":{"post":{"tags":["Dokumenty HaMag"],"summary":"Przekształca (agreguje) jedną lub kilka rezerwacji odbiorcy (RO) w dokument docelowy przez COM Optimy.","description":"Odpowiednik \"generuj dokument\" z poziomu RO w Optimie (`AgregujDokumenty 308→typ`).\nTyp docelowy podaje się tekstowo: `FS`, `PA`, `WZ`, `RW`, `ZD`, `FPF` (alias `PF`).\n\nMożna przekazać kilka RO (`ids` / `numeryPelne`) — zostaną zagregowane w jeden dokument.\nWszystkie RO muszą pochodzić z tego samego magazynu; pozostałe ograniczenia (ten sam kontrahent,\ndostępność towaru, pozycje usługowe) weryfikuje Optima i zwraca je jako błąd COM.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoRequest"}}}},"responses":{"200":{"description":"Dokument(y) wygenerowane.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}}}},"400":{"description":"Nieprawidłowe dane, RO nie istnieje lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PrzeksztalcRoResponse"}}}}}}},"/dokumenty/{id}/anuluj":{"post":{"tags":["Dokumenty HaMag"],"summary":"Anuluje dokument handlowo-magazynowy po ID przez COM Optimy.","parameters":[{"name":"id","in":"path","description":"ID dokumentu (TrN_TrNId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Dokument anulowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument nie istnieje lub błąd COM (np. dokument już anulowany).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/{id}/zatwierdz":{"post":{"tags":["Dokumenty HaMag"],"summary":"Zatwierdza dokument handlowo-magazynowy z bufora (Bufor = 0) przez COM Optimy.","parameters":[{"name":"id","in":"path","description":"ID dokumentu (TrN_TrNId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Dokument zatwierdzony pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"400":{"description":"Dokument nie istnieje, nie jest w buforze lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DokumentHaMagResponse"}}}}}}},"/dokumenty/{id}/platnosci":{"get":{"tags":["Dokumenty HaMag"],"summary":"Zwraca harmonogram płatności (zdarzenia kasowo-bankowe) dokumentu HaMag.","description":"Dane pobierane z `CDN.BnkZdarzenia` filtrowane po `BZd_DokumentTyp = 1` i `BZd_DokumentID`.\nZawiera podsumowanie salda: kwota razem, rozliczona i pozostała do zapłaty (w PLN).","parameters":[{"name":"id","in":"path","description":"ID dokumentu (TrN_TrNId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Harmonogram płatności dokumentu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlatnosciDokumentuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PlatnosciDokumentuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PlatnosciDokumentuResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono dokumentu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/dokumenty/{id}/rozliczenia":{"get":{"tags":["Dokumenty HaMag"],"summary":"Zwraca zestawienie rozliczeń dokumentu HaMag — zdarzenia K/B podlegające rozliczeniu.","description":"Pobiera zdarzenia kasowo-bankowe z `CDN.BnkZdarzenia` powiązane z dokumentem\n(`BZd_DokumentTyp = 1 AND BZd_DokumentID = {id}`) z wyłączeniem pozycji\noznaczonych jako \"nie podlega rozliczeniu\" (Rozliczono=0, Rozliczono2=0).\n\nAby zobaczyć pełny harmonogram płatności (wszystkie zdarzenia łącznie z niepodlegającymi\nrozliczeniu oraz szczegółami Split Payment) użyj\n`GET /dokumenty/{id}/platnosci`.","parameters":[{"name":"id","in":"path","description":"ID dokumentu (TrN_TrNId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Zestawienie rozliczeń dokumentu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RozliczeniaDokumentuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RozliczeniaDokumentuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozliczeniaDokumentuResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono dokumentu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/dzienniki":{"get":{"tags":["Dzienniki"],"summary":"Zwraca dzienniki cząstkowe z CDN.Dzienniki dla wybranego okresu obrachunkowego.","description":"Dzienniki cząstkowe są zdefiniowane per okres obrachunkowy (tak jak plan kont) — okres wskazuje\nsię przez `okresId` (Dzi_OObId) albo `data` (znajdowany jest okres obejmujący tę datę).\nBez żadnego z nich używany jest okres obowiązujący dzisiaj.\n\n## Przykłady\n\n**Dzienniki bieżącego okresu:**\n```\nGET /dzienniki\n```\n\n**Dzienniki konkretnego okresu:**\n```\nGET /dzienniki?okresId=3\n```\n\n**Dziennik o danym symbolu:**\n```\nGET /dzienniki?symbol=SP\n```","parameters":[{"name":"okresId","in":"query","description":"Identyfikator okresu obrachunkowego (Dzi_OObId). Ma pierwszeństwo przed `data`.","schema":{"type":"integer","format":"int32"}},{"name":"data","in":"query","description":"Data, dla której szukany jest obowiązujący okres obrachunkowy.","schema":{"type":"string","format":"date-time"}},{"name":"symbol","in":"query","description":"Symbol dziennika — dokładne dopasowanie, wielkość liter bez znaczenia.","schema":{"type":"string"}},{"name":"nazwa","in":"query","description":"Fragment nazwy dziennika.","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista dzienników cząstkowych spełniających kryteria.","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DziennikDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DziennikDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DziennikDto"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono okresu obrachunkowego dla podanej daty.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/grupy-towarowe":{"get":{"tags":["Grupy towarowe"],"summary":"Zwraca listę grup towarowych z CDN.TwrGrupy.\nFiltry kod i nazwa działają jako LIKE (fragment). Wyniki stronicowane — domyślnie 50 na stronę.","parameters":[{"name":"id","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","schema":{"type":"string"}},{"name":"nazwa","in":"query","schema":{"type":"string"}},{"name":"strona","in":"query","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupyTowarowePagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupyTowarowePagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupyTowarowePagedResponse"}}}}}},"post":{"tags":["Grupy towarowe"],"summary":"Dodaje nową grupę towarową przez COM Optimy (CDN.TwrGrupy).\nObsługuje wiele poziomów hierarchii — podaj KodGrupyNadrzednej, aby utworzyć podgrupę.\nBrak KodGrupyNadrzednej lub null tworzy grupę na poziomie głównym.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowaGrupaTowarowaRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowaGrupaTowarowaRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowaGrupaTowarowaRequest"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}}}},"503":{"description":"Service Unavailable"}}},"put":{"tags":["Grupy towarowe"],"summary":"Aktualizuje grupę towarową przez COM Optimy (CDN.TwrGrupy).\nPodaj dokładnie jeden identyfikator: id lub kod.\nPola body o wartości null nie są zmieniane.\nAby zmienić hierarchię, ustaw ZmienGrupeNadrzedna=true i podaj KodGrupyNadrzednej\n(null/pusty = przenieś do grupy głównej).","parameters":[{"name":"id","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaGrupyTowarowejRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaGrupyTowarowejRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaGrupyTowarowejRequest"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}}}},"503":{"description":"Service Unavailable"}}},"delete":{"tags":["Grupy towarowe"],"summary":"Usuwa grupę towarową przez COM Optimy (CDN.TwrGrupy).\nPodaj dokładnie jeden identyfikator: id lub kod.\nUsunięcie grupy zawierającej podgrupy lub towary może zostać odrzucone przez Optimę.","parameters":[{"name":"id","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}}}},"503":{"description":"Service Unavailable"}}}},"/grupy-towarowe/hierarchia":{"get":{"tags":["Grupy towarowe"],"summary":"Zwraca grupę towarową wraz z pełną hierarchią podgrup jako drzewo zagnieżdżone.\nGdy pominięto id i kod — zwraca całe drzewo od poziomu głównego.","parameters":[{"name":"id","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowarowaHierarchia"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowarowaHierarchia"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowarowaHierarchia"}}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowarowaResponse"}}}}}}},"/gus/klucz-api":{"put":{"tags":["GUS / MF"],"summary":"Ustawia klucz API GUS BIR1 w konfiguracji.","description":"Klucz można uzyskać rejestrując się w GUS: https://api.stat.gov.pl/Home/RegonApi\n\nKlucz testowy (środowisko dev): `abcde12345abcde12345`","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GusApiKeyRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/GusApiKeyRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/GusApiKeyRequest"}}}},"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/gus/regon":{"get":{"tags":["GUS / MF"],"summary":"Pobiera dane podmiotu z GUS REGON BIR1 na podstawie numeru NIP.","description":"Wymaga skonfigurowanego klucza API GUS (PUT /gus/klucz-api lub pole `GusApiKey` w appsettings.json).\n\nDane pobierane są z rejestru GUS przez usługę SOAP BIR1 (wyszukiwarkaregon.stat.gov.pl).\nDla osób prawnych (sp. z o.o., SA…) raport `PublDaneRaportPrawna`.\nDla osób fizycznych (CEIDG) raport `PublDaneRaportDzialalnoscFizycznejCeidg`.\n\n## Przykład\n```\nGET /gus/regon?nip=5261888582\nGET /gus/regon?nip=526-188-85-82\n```","parameters":[{"name":"nip","in":"query","description":"Numer NIP (10 cyfr, myślniki i spacje są ignorowane).","schema":{"type":"string"}}],"responses":{"200":{"description":"Dane podmiotu z GUS REGON.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GusRegonDto"}},"application/json":{"schema":{"$ref":"#/components/schemas/GusRegonDto"}},"text/json":{"schema":{"$ref":"#/components/schemas/GusRegonDto"}}}},"400":{"description":"Nieprawidłowy NIP.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Unauthorized","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Podmiot o podanym NIP nie istnieje w GUS REGON.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Klucz API GUS nie skonfigurowany lub usługa GUS niedostępna."}}}},"/gus/mf":{"get":{"tags":["GUS / MF"],"summary":"Pobiera status VAT i numery rachunków bankowych z Białej Listy MF.","description":"Darmowe REST API Ministerstwa Finansów — nie wymaga klucza API.\nZawsze odpytuje na bieżącą datę (jak oryginalny skrypt PHP).\n\n## Przykład\n```\nGET /gus/mf?nip=5261888582\nGET /gus/mf?nip=526-188-85-82\n```","parameters":[{"name":"nip","in":"query","description":"Numer NIP (10 cyfr, myślniki i spacje są ignorowane).","schema":{"type":"string"}}],"responses":{"200":{"description":"Status VAT i lista rachunków bankowych.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MfStatusVatDto"}},"application/json":{"schema":{"$ref":"#/components/schemas/MfStatusVatDto"}},"text/json":{"schema":{"$ref":"#/components/schemas/MfStatusVatDto"}}}},"400":{"description":"Nieprawidłowy NIP.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Unauthorized","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Podatnik nie znaleziony w Białej Liście MF.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"502":{"description":"Błąd połączenia z API MF."}}}},"/gus/vies":{"get":{"tags":["GUS / MF"],"summary":"Waliduje unijny numer VAT przez serwis VIES Komisji Europejskiej.","description":"Jako dane żądającego automatycznie pobierana jest aktualna pieczątka firmy\nz `CDN.Pieczatki` (PC_Aktualna = 1), co aktywuje operację `checkVatApprox`\ni zwraca więcej danych (nazwa, adres, identyfikator zapytania).\n\nGdy pieczątka nie jest skonfigurowana — używane jest podstawowe `checkVat`.\n\n## Przykłady\n```\nGET /gus/vies?nip=DE123456789\nGET /gus/vies?nip=FR12345678901\nGET /gus/vies?nip=CZ12345678\n```","parameters":[{"name":"nip","in":"query","description":"Numer VAT UE z prefiksem kraju (np. DE123456789).","schema":{"type":"string"}}],"responses":{"200":{"description":"Wynik walidacji VIES.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ViesDto"}},"application/json":{"schema":{"$ref":"#/components/schemas/ViesDto"}},"text/json":{"schema":{"$ref":"#/components/schemas/ViesDto"}}}},"400":{"description":"Brak prefiksu kraju lub nieprawidłowy format.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Unauthorized","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"502":{"description":"Serwis VIES niedostępny lub błąd komunikacji."}}}},"/kasa-bank/rejestry":{"get":{"tags":["Kasa i bank"],"summary":"Zwraca listę rejestrów kasowo-bankowych (kasy i rachunki bankowe).","parameters":[{"name":"tylkoAktywne","in":"query","description":"Gdy true (domyślnie) — zwraca tylko aktywne rejestry.","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Lista rejestrów.","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrKbDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrKbDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrKbDto"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/kasa-bank/raporty":{"get":{"tags":["Kasa i bank"],"summary":"Zwraca listę raportów kasowo-bankowych z opcjonalnym filtrem po rejestrze i statusie.","description":"Sortowanie: od najnowszych. Raporty zawierają sumy obrotów i saldo.","parameters":[{"name":"rejestr","in":"query","description":"Symbol rejestru (BRa_Symbol). Gdy pominięty — wszystkie rejestry.","schema":{"type":"string"}},{"name":"tylkoOtwarte","in":"query","description":"Gdy true — zwraca tylko otwarte raporty (BRp_Zamkniety = 0).","schema":{"type":"boolean","default":false}},{"name":"strona","in":"query","description":"Numer strony (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–200, domyślnie 50).","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Lista raportów.","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RaportKbDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RaportKbDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RaportKbDto"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/kasa-bank/zapisy":{"get":{"tags":["Kasa i bank"],"summary":"Zwraca stronicowaną listę zapisów kasowo-bankowych z filtrami.","description":"Wszystkie filtry są opcjonalne i łączone operatorem AND.\n\n| Parametr      | Kolumna DB       | Porównanie   |\n|---------------|------------------|--------------|\n| rejestr       | BRa_Symbol       | =            |\n| kontrahentKod | Knt_Kod          | =            |\n| dataOd        | BZp_DataDok      | >=        |\n| dataDo        | BZp_DataDok      | <=        |\n| kierunek      | BZp_Kierunek     | = (1 lub -1) |\n| kwotaOd       | BZp_Kwota        | >=        |\n| kwotaDo       | BZp_Kwota        | <=        |\n| rozliczono    | BZp_Rozliczono   | =            |\n\n## Status rozliczenia (`rozliczono`)\n\n| Wartość | Opis |\n|---------|------|\n| `0` | Nie podlega rozliczeniu |\n| `1` | Nierozliczone (w tym częściowo) |\n| `2` | W pełni rozliczone |\n\nSortowanie: od najnowszych.","parameters":[{"name":"rejestr","in":"query","description":"Filtr po symbolu rejestru (BRa_Symbol).","schema":{"type":"string"}},{"name":"kontrahentKod","in":"query","description":"Filtr po kodzie kontrahenta (Knt_Kod).","schema":{"type":"string"}},{"name":"dataOd","in":"query","description":"Zakres dat dokumentu — od.","schema":{"type":"string","format":"date-time"}},{"name":"dataDo","in":"query","description":"Zakres dat dokumentu — do.","schema":{"type":"string","format":"date-time"}},{"name":"kierunek","in":"query","description":"Filtr po kierunku: `KP` (przychód) lub `KW` (rozchód).","schema":{"type":"string"}},{"name":"kwotaOd","in":"query","description":"Minimalna kwota zapisu (BZp_Kwota >= kwotaOd).","schema":{"type":"number","format":"double"}},{"name":"kwotaDo","in":"query","description":"Maksymalna kwota zapisu (BZp_Kwota <= kwotaDo).","schema":{"type":"number","format":"double"}},{"name":"rozliczono","in":"query","description":"Status rozliczenia: 0 = nie podlega, 1 = nierozliczone, 2 = w pełni rozliczone.","schema":{"type":"integer","format":"int32"}},{"name":"strona","in":"query","description":"Numer strony (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500, domyślnie 50).","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Stronicowana lista zapisów KB.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisyKbPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisyKbPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisyKbPagedResponse"}}}},"400":{"description":"Nieprawidłowa wartość parametru kierunek lub rozliczono.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Kasa i bank"],"summary":"Dodaje nowy zapis kasowo-bankowy (KP lub KW) do otwartego raportu rejestru.","description":"Zapis zostaje dodany do aktualnie otwartego raportu rejestru wskazanego przez `RejestrSymbol`.\nJeśli rejestr nie posiada otwartego raportu, żądanie zostanie odrzucone z kodem 400.\n\nDokładnie jedno z pól musi być większe od zera:\n- `Przychod > 0` → zapis KP (kierunek 1)\n- `Rozchod > 0` → zapis KW (kierunek -1)","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyZapisKbRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyZapisKbRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyZapisKbRequest"}}}},"responses":{"200":{"description":"Zapis KB dodany pomyślnie — zwraca Id i NumerPelny.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}},"400":{"description":"Błąd walidacji lub COM (np. brak otwartego raportu, nieznany kontrahent).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}}}}},"/kasa-bank/zapisy/{id}":{"put":{"tags":["Kasa i bank"],"summary":"Aktualizuje istniejący zapis kasowo-bankowy.","description":"Tylko pola różne od null zostaną zaktualizowane.\nEdycja możliwa wyłącznie dla zapisów niezatwierdzonych (bufor).\n\nJeśli podano `Przychod > 0` — kierunek zmienia się na KP.\nJeśli podano `Rozchod > 0` — kierunek zmienia się na KW.","parameters":[{"name":"id","in":"path","description":"Identyfikator zapisu (BZp_BZpID).","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaZapisuKbRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaZapisuKbRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaZapisuKbRequest"}}}},"responses":{"200":{"description":"Zapis zaktualizowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}},"400":{"description":"Błąd walidacji lub COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono zapisu o podanym ID.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}}}},"delete":{"tags":["Kasa i bank"],"summary":"Usuwa zapis kasowo-bankowy.","description":"Usunąć można tylko zapisy niezatwierdzone (bufor).\nZatwierdzone zapisy muszą być cofnięte ręcznie w Optimie przed usunięciem.","parameters":[{"name":"id","in":"path","description":"Identyfikator zapisu (BZp_BZpID).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Zapis usunięty pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}},"400":{"description":"Błąd COM (np. zapis zatwierdzony).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono zapisu o podanym ID.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisKbResponse"}}}}}}},"/kategorie":{"get":{"tags":["Kategorie"],"summary":"Zwraca kategorie ogólne (Poziom=1) z CDN.Kategorie — tylko aktywne (Kat_Nieaktywny=0).\nKażda kategoria ogólna zawiera zagnieżdżoną listę swoich kategorii szczegółowych (Poziom=2).\nFiltry można łączyć (AND). Stronicowanie dotyczy kategorii ogólnych.","parameters":[{"name":"kodOgolny","in":"query","schema":{"type":"string"}},{"name":"kodSzczegol","in":"query","schema":{"type":"string"}},{"name":"typ","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"strona","in":"query","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","schema":{"type":"integer","format":"int32","default":100}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KategoriePagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KategoriePagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KategoriePagedResponse"}}}}}},"post":{"tags":["Kategorie"],"summary":"Dodaje nową kategorię (ogólną lub szczegółową) do CDN.Kategorie przez COM Optimy.","description":"## Poziom kategorii — bez osobnego pola, wynika z podanych kodów\n\n| Podano | Efekt |\n|--------|-------|\n| tylko `KodOgolny` | Tworzona kategoria **ogólna** (Kat_Poziom=1) |\n| `KodOgolny` + `KodSzczegol` | Tworzona kategoria **szczegółowa** (Kat_Poziom=2), podrzędna do kategorii ogólnej |\n\nDla kategorii szczegółowej kategoria ogólna wskazana w `KodOgolny` **musi już istnieć**\n(utwórz ją najpierw osobnym żądaniem — bez `KodSzczegol`). Optima wiąże kategorię szczegółową\nz nadrzędną automatycznie na podstawie dopasowania `KodOgolny` — pole `Kat_ParentID`\njest w COM tylko do odczytu i nie da się go ustawić wprost.\n\n## Typ (`Typ`)\n\n| Wartość | Znaczenie |\n|---------|-----------|\n| `1` | Kategoria kosztów |\n| `2` | Kategoria przychodów |\n\nDla kategorii szczegółowej musi być zgodny z `Typ` kategorii ogólnej nadrzędnej — inaczej żądanie jest odrzucane.\n\n## Kody (`KodOgolny` / `KodSzczegol`)\n\n- `KodOgolny` — wymagany zawsze. Dla kategorii ogólnej to jednocześnie kod całej kategorii\n  (Optima ustawia `Kat_KodSzczegol = Kat_KodOgolny`).\n- `KodSzczegol` — opcjonalny; jego obecność decyduje o poziomie (patrz wyżej).\n\nOba kody są normalizowane do wielkich liter, maks. 20 znaków (limit kolumny w Optimie).\n\n## Kolumna KPIR (`KolumnaKPIR`)\n\nNumer kolumny w księdze przychodów i rozchodów, do której trafi zapis powiązany z tą kategorią:\n\n| Wartość | Kolumna KPIR |\n|---------|--------------|\n| `0` | Nie księgować |\n| `1` | Sprzedaż (kolumna 7) |\n| `2` | Pozostałe przychody (kolumna 8) |\n| `3` | Zakupy towarów (kolumna 10) |\n| `4` | Koszty uboczne (kolumna 11) |\n| `5` | Reprezentacja i reklama (kolumna 12) |\n| `6` | Wynagrodzenia (kolumna 13) |\n| `7` | Pozostałe wydatki (kolumna 14) |\n\n## Stawka (`Stawka`) i flaga (`Flaga`)\n\nKategoria niesie własną domyślną stawkę VAT — dokładnie ta sama para pól co w elementach\nrejestru VAT (`POST /rejestry-vat`), tu jednak podawana wprost jako liczba i flaga (bez skrótów `\"ZW\"`/`\"NP\"`):\n\n| `Flaga` | Znaczenie | `Stawka` |\n|---------|-----------|----------|\n| `1` | Zwolniona (ZW) | zwykle `0` |\n| `2` | Opodatkowana | `23`, `8`, `5`, `0`... |\n| `3` | Zaniżona | wartość obniżonej stawki |\n| `4` | Nie podlega (NP) | zwykle `0` |\n\n## Odliczenia (`Odliczenia`)\n\nSposób odliczania VAT od zakupów przypisanych do kategorii:\n\n| Wartość | Znaczenie |\n|---------|-----------|\n| `0` | Nie odliczać VAT |\n| `1` | Odliczać VAT |\n| `2` | Odliczać warunkowo (zakupy opodatkowane związane ze sprzedażą mieszaną) |\n\n## Rodzaj zakupu (`RodzajZakupu`)\n\n| Wartość | Znaczenie |\n|---------|-----------|\n| `1` | Towary |\n| `2` | Inne (kosztowe) |\n| `3` | Środki trwałe |\n| `4` | Usługi |\n| `5` | Środki transportu |\n| `6` | Nieruchomości |\n| `7` | Paliwo |\n\n## Konta księgowe (`KontoSegmentWN` / `KontoSegmentMA`)\n\nSegmenty konta księgowego Winien/Ma podpowiadane przy księgowaniu dokumentów przypisanych\ndo tej kategorii. Opcjonalne, maks. 50 znaków; gdy pominięte — puste.\n\n## Podział odliczeń VAT (`PodzielOdliczenia` / `PodzielOdliczeniaProcent`)\n\nDotyczy sytuacji, gdy VAT od zakupu jest odliczany tylko częściowo (typowo razem\nz `Odliczenia=2` — warunkowo):\n\n| Pole | Znaczenie | Domyślnie |\n|------|-----------|-----------|\n| `PodzielOdliczenia` | `true` = dzielić odliczenie VAT proporcją, `false` = nie dzielić | `false` |\n| `PodzielOdliczeniaProcent` | Procent (0-100) odliczanej części VAT, ma znaczenie tylko gdy `PodzielOdliczenia=true` | `50.00` |\n\n## Księgowanie w koszty (`KsiegujWKoszty` / `KsiegujWKosztyProcent`)\n\nAnalogiczny mechanizm po stronie kosztów (np. rozliczanie samochodów osobowych 75%):\n\n| Pole | Znaczenie | Domyślnie |\n|------|-----------|-----------|\n| `KsiegujWKoszty` | `true` = księgować w koszty proporcją, `false` = w całości | `false` |\n| `KsiegujWKosztyProcent` | Procent (0-100) księgowany w koszty, ma znaczenie tylko gdy `KsiegujWKoszty=true` | `75.00` |","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowaKategoriaRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowaKategoriaRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowaKategoriaRequest"}}}},"responses":{"200":{"description":"Kategoria została dodana — zwraca Id, KodOgolny, KodSzczegol, Sciezka.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}}}},"400":{"description":"Błąd walidacji (np. zły zakres pola, brak kategorii nadrzędnej) lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy."}}},"put":{"tags":["Kategorie"],"summary":"Edytuje istniejącą kategorię (ogólną lub szczegółową) w CDN.Kategorie przez COM Optimy.","description":"Kategoria jest identyfikowana **po kodzie**, nie po ID. Oba kody są unikalne w CDN.Kategorie,\nwięc wystarczy podać jeden z nich:\n- `kodSzczegol` sam — wyszukuje kategorię po unikalnym Kat_KodSzczegol, niezależnie od poziomu\n  (działa też dla kategorii ogólnej, bo dla niej Kat_KodSzczegol = Kat_KodOgolny).\n- `kodOgolny` sam — wyszukuje kategorię ogólną (Poziom=1) o tym kodzie.\n- oba naraz — zawężają wyszukiwanie do kategorii szczegółowej o danym `kodSzczegol` **pod**\n  kategorią ogólną `kodOgolny` (przydatne, gdyby ta sama wartość kodu szczegółowego\n  powtarzała się pod różnymi kategoriami ogólnymi).\n\nPodaj co najmniej jeden z parametrów.\n\nPola w body o wartości `null` nie są zmieniane — wysyłaj tylko te, które chcesz zaktualizować.\n\nZmiana samych kodów (`KodOgolny`/`KodSzczegol`) nie jest obsługiwana przez ten endpoint —\nidentyfikują one rekord, nie da się ich edytować.\n\nZnaczenie poszczególnych pól (kolumny KPIR, stawka+flaga, odliczenia, rodzaj zakupu,\nkonta WN/MA, podział odliczeń, księgowanie w koszty) jest identyczne jak w `POST /kategorie`.","parameters":[{"name":"kodOgolny","in":"query","description":"Kod kategorii ogólnej (Kat_KodOgolny). Opcjonalny — patrz opis.","schema":{"type":"string"}},{"name":"kodSzczegol","in":"query","description":"Kod kategorii szczegółowej (Kat_KodSzczegol). Opcjonalny — patrz opis.","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaKategoriiRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaKategoriiRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaKategoriiRequest"}}}},"responses":{"200":{"description":"Kategoria zaktualizowana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}}}},"400":{"description":"Błąd walidacji, kategoria nie została znaleziona, lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KategoriaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy."}}}},"/konta":{"get":{"tags":["Konta"],"summary":"Zwraca plan kont z CDN.Konta dla wybranego okresu obrachunkowego.","description":"Plan kont jest wersjonowany per okres obrachunkowy — każdy okres ma własną kopię kont.\nOkres wskazuje się przez `okresId` (Acc_OObId) albo `data` (znajdowany jest okres\nobejmujący tę datę). Bez żadnego z nich używany jest okres obowiązujący dzisiaj.\n\nKonta rozrachunkowe/słownikowe (np. 201) materializują osobny wiersz na każdego kontrahenta,\npracownika, bank czy urząd, który wystąpił na koncie — dlatego domyślnie takie zmaterializowane\nwiersze (Acc_SlownikId IS NOT NULL) są pomijane. Włącz je parametrem `uwzglednijSlownikowe`\nalbo pobierz konkretny wiersz przez `slownikId`.\n\n| Parametr             | Kolumna DB        | Porównanie | Uwagi                                        |\n|-----------------------|-------------------|------------|-----------------------------------------------|\n| numer                 | Acc_NumerIdx      | prefiks    | myślniki w wejściu są ignorowane              |\n| nazwa                 | Acc_Nazwa         | zawiera    |                                                |\n| analityczne           | Acc_Analityka     | =          |                                                |\n| rozrachunkowe         | Acc_Rozrachunkowe | =          |                                                |\n| typKonta              | Acc_TypKonta      | =          | 1..7, patrz opis pola                         |\n| rodzajSlownika        | Acc_Slownik       | =          | 1,2,3,5,6,7 — patrz opis pola                 |\n| slownikId             | Acc_SlownikId     | =          | dociąga też konta słownikowe                  |\n| aktywne               | Acc_NieAktywne    | =          | domyślnie tylko aktywne                       |\n\nWyniki stronicowane — domyślnie 100 na stronę, sortowane po numerze konta (Acc_NumerIdx).\nOdpowiedź jest listą płaską (nie drzewem) — pole `ParentId` pozwala odtworzyć hierarchię\npo stronie klienta bez ryzyka zwrócenia bardzo dużego zagnieżdżonego JSON-a.","parameters":[{"name":"okresId","in":"query","description":"Identyfikator okresu obrachunkowego (Acc_OObId). Ma pierwszeństwo przed `data`.","schema":{"type":"integer","format":"int32"}},{"name":"data","in":"query","description":"Data, dla której szukany jest obowiązujący okres obrachunkowy.","schema":{"type":"string","format":"date-time"}},{"name":"numer","in":"query","description":"Prefiks numeru konta, np. \"201\". Myślniki są ignorowane.","schema":{"type":"string"}},{"name":"nazwa","in":"query","description":"Fragment nazwy konta.","schema":{"type":"string"}},{"name":"analityczne","in":"query","description":"Filtr: tylko konta analityczne (true) lub tylko syntetyczne (false).","schema":{"type":"boolean"}},{"name":"rozrachunkowe","in":"query","description":"Filtr: tylko konta rozrachunkowe (true) lub nierozrachunkowe (false).","schema":{"type":"boolean"}},{"name":"typKonta","in":"query","description":"Rodzaj konta: 1=Aktywa, 2=Pasywa, 3=Aktywa-Pasywa, 4=Przychody, 5=Koszty, 6=Pozabilansowe, 7=Przychody-koszty.","schema":{"type":"integer","format":"int32"}},{"name":"rodzajSlownika","in":"query","description":"Rodzaj słownika: 1=Kontrahent (Kontrahenci), 2=Bank (BnkNazwy), 3=Pracownik/Wspólnik (PracEtaty), 5=Urząd (Urzedy), 6=Środek trwały (Trwale), 7=Towar (Towary).","schema":{"type":"integer","format":"int32"}},{"name":"slownikId","in":"query","description":"Identyfikator wiersza w słowniku (np. Knt_KntId) — zwraca też zmaterializowane konto słownikowe.","schema":{"type":"integer","format":"int32"}},{"name":"uwzglednijSlownikowe","in":"query","description":"Gdy `true` — nie pomija zmaterializowanych kont słownikowych.","schema":{"type":"boolean","default":false}},{"name":"aktywne","in":"query","description":"Gdy `false` — zwraca też konta nieaktywne. Domyślnie `true` (tylko aktywne).","schema":{"type":"boolean","default":true}},{"name":"strona","in":"query","description":"Numer strony (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500, domyślnie 100).","schema":{"type":"integer","format":"int32","default":100}}],"responses":{"200":{"description":"Plan kont spełniający kryteria (lista może być pusta).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontaPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontaPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontaPagedResponse"}}}},"400":{"description":"Nieprawidłowe parametry filtrowania.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono okresu obrachunkowego dla podanej daty.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/konta/obroty-salda":{"get":{"tags":["Konta"],"summary":"Zwraca raport obrotów i sald (bilans otwarcia, obroty, saldo) dla planu kont lub jednego konta.","description":"Okres obrachunkowy wskazuje się przez `okresId`, `data` (znajdowany jest okres obejmujący\ntę datę) albo `kontoId` (jego własny okres ma pierwszeństwo). Bez żadnego z nich używany jest\nokres obowiązujący dzisiaj. Bez `kontoId` raport liczony jest dla całego planu kont okresu —\ndla dużych planów kont (konta rozrachunkowe materializują wiersz na kontrahenta/pracownika/bank/urząd)\nzawęź wynik parametrem `numer`.\n\nZakres dat domyślnie to cały okres obrachunkowy; `bilansOtwarcia=true` wymusza pełny okres\nniezależnie od podanych dat (odpowiednik przeliczenia samego BO). Zakres musi mieścić się w granicach\nokresu obrachunkowego konta/okresu.\n\n| Parametr          | Kolumna/param SP | Uwagi                                                   |\n|-------------------|------------------|------------------------------------------------------------|\n| okresId           | @OObId           | ma pierwszeństwo przed `data`                      |\n| data              | —                | znajduje okres obejmujący datę; brak obu = dziś         |\n| kontoId           | @AccId           | brak = cały plan kont okresu; nadpisuje okresId/data     |\n| dataOd/dataDo     | @DataOd/@DataDo  | domyślnie cały okres                                    |\n| bilansOtwarcia    | @BO              | wymusza pełny okres                                     |\n| bufor             | @Bufor           | domyślnie `true` — uwzględnia zapisy w buforze     |\n| numer             | @Maska           | prefiks numeru konta w naszym stylu (bez `*`/`?`)       |\n| negacjaNumeru     | @NegacjaMaski    | odwraca dopasowanie `numer`                        |\n| waluta            | @Waluta          | filtr po walucie konta                                  |\n| ukryjZeroweSalda  | @UkryjZeroweSalda| pomija konta z zerowym saldem                           |","parameters":[{"name":"okresId","in":"query","description":"Identyfikator okresu obrachunkowego. Ma pierwszeństwo przed `data`.","schema":{"type":"integer","format":"int32"}},{"name":"data","in":"query","description":"Data, dla której szukany jest obowiązujący okres obrachunkowy. Brak `okresId`/`data`/`kontoId` = okres bieżący.","schema":{"type":"string","format":"date-time"}},{"name":"kontoId","in":"query","description":"Identyfikator konta — ogranicza raport do jednego konta (i jego okresu).","schema":{"type":"integer","format":"int32"}},{"name":"dataOd","in":"query","description":"Początek zakresu dat. Domyślnie początek okresu.","schema":{"type":"string","format":"date-time"}},{"name":"dataDo","in":"query","description":"Koniec zakresu dat. Domyślnie koniec okresu.","schema":{"type":"string","format":"date-time"}},{"name":"bilansOtwarcia","in":"query","description":"Gdy `true` — liczy dla całego okresu niezależnie od dataOd/dataDo.","schema":{"type":"boolean","default":false}},{"name":"bufor","in":"query","description":"Gdy `true` (domyślnie) — uwzględnia zapisy w buforze obok zatwierdzonych.","schema":{"type":"boolean","default":true}},{"name":"numer","in":"query","description":"Prefiks numeru konta (np. \"201\") — dopasowuje konto i całe jego poddrzewo.","schema":{"type":"string"}},{"name":"negacjaNumeru","in":"query","description":"Gdy `true` — odwraca dopasowanie parametru `numer`.","schema":{"type":"boolean","default":false}},{"name":"waluta","in":"query","description":"Filtr po walucie konta.","schema":{"type":"string"}},{"name":"ukryjZeroweSalda","in":"query","description":"Gdy `true` — pomija konta z zerowym saldem.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Raport obrotów i sald.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ObrotySaldaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ObrotySaldaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ObrotySaldaResponse"}}}},"400":{"description":"Nieprawidłowe parametry lub zakres dat spoza okresu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono konta lub okresu obrachunkowego o podanym identyfikatorze.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/context/firma":{"get":{"tags":["Kontekst firmy"],"summary":"Zwraca aktualny kontekst firmy — nazwę firmy w Optimie i nazwę bazy SQL.","responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}}}}}},"post":{"tags":["Kontekst firmy"],"summary":"Przełącza kontekst firmy — wywołuje Login2Firm na sesji COM Optimy\ni zmienia bazę SQL dla wszystkich kolejnych zapytań.\nOperacja jest synchroniczna — czeka na zakończenie bieżących zadań COM.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchFirmRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/SwitchFirmRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/SwitchFirmRequest"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/StepResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/StepResult"}},"text/json":{"schema":{"$ref":"#/components/schemas/StepResult"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable"}}},"delete":{"tags":["Kontekst firmy"],"summary":"Resetuje kontekst firmy do domyślnej konfiguracji z appsettings.json.","responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/FirmContextResponse"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable"}}}},"/kontrahenci":{"get":{"tags":["Kontrahenci"],"summary":"Zwraca listę kontrahentów z CDN.Kontrahenci.","description":"Wszystkie parametry filtrów są opcjonalne i łączone operatorem AND.\nBrak parametrów zwraca całą listę (stronicowaną).\n\n| Parametr  | Kolumna DB       | Porównanie |\n|-----------|------------------|------------|\n| id        | Knt_KntId        | =          |\n| nip       | Knt_Nip          | =          |\n| akronim   | Knt_Kod          | =          |\n\nWymagany scope tokenu: `kontrahenci` lub `read.all`.","parameters":[{"name":"id","in":"query","description":"Filtr: `Knt_KntId = ?` — dokładne dopasowanie po ID kontrahenta.","schema":{"type":"integer","format":"int32"}},{"name":"nip","in":"query","description":"Filtr: `Knt_Nip = ?` — dokładne dopasowanie po numerze NIP (bez prefiksu kraju i kresek).","schema":{"type":"string"}},{"name":"akronim","in":"query","description":"Filtr: `Knt_Kod = ?` — dokładne dopasowanie po akronimie (kodzie skróconym).","schema":{"type":"string"}},{"name":"kodGrupy","in":"query","schema":{"type":"string"}},{"name":"strona","in":"query","description":"Numer strony (od 1). Domyślnie 1.","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Rozmiar strony (1–500). Domyślnie 50.","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Stronicowana lista kontrahentów spełniających kryteria.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahenciPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahenciPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahenciPagedResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Kontrahenci"],"summary":"Dodaje nowego kontrahenta przez COM Optimy (CDNHeal.Kontrahenci).","description":"## Tryby tworzenia\n\n### Tryb ręczny (`DaneZGUS = false`, domyślny)\n\nWymagane: `Akronim` + `Nazwa1`. Wszystkie pozostałe pola są opcjonalne.\n\n### Tryb GUS (`DaneZGUS = true`)\n\nWymagane: `Akronim` + `Nip` (10-cyfrowy, polski, bez kresek).\nDane firmy (nazwa, adres) są pobierane automatycznie z rejestru GUS REGON BIR1.\nJawnie podane pola (`Nazwa1`, `Ulica` itp.) nadpisują dane z GUS.\n\n## Pola identyfikacyjne\n\n| Pole | Wymagane | Max | Opis |\n|------|----------|-----|------|\n| `Akronim` | **Tak** | 20 | Unikalny kod skrócony w Optimie (`Knt_Kod`). Automatycznie zamieniony na WIELKIE litery. |\n| `Nip` | Nie* | 15 | NIP bez kresek i prefiksu kraju, np. `5260001016`. *Wymagany gdy `DaneZGUS = true`. |\n| `NipKraj` | Nie | 2 | Dwuliterowy prefiks kraju ISO-3166, np. `PL` (domyślnie), `DE`, `CZ`. |\n| `GLN` | Nie | 13 | Global Location Number — 13 cyfr. |\n| `KsefIdWewnetrzny` | Nie | 20 | Wewnętrzny identyfikator KSeF (`Knt_KsefIdWewnetrzny`). |\n\n## Pola nazwy\n\nOptima składa pełną nazwę z trzech linii: `Nazwa1 + \" \" + Nazwa2`. Przy danych z GUS podział\nnastępuje automatycznie na granicy słów (max 50 znaków na linię, nadmiar do `Nazwa3`).\n\n| Pole | Max | Opis |\n|------|-----|------|\n| `Nazwa1` | 50 | Pierwsza linia nazwy (`Knt_Nazwa1`). Wymagana gdy `DaneZGUS = false`. |\n| `Nazwa2` | 50 | Druga linia nazwy (`Knt_Nazwa2`). Opcjonalna. |\n| `Nazwa3` | 250 | Trzecia linia nazwy (`Knt_Nazwa3`). Opcjonalna, np. forma prawna. |\n\n## Pola adresowe\n\n| Pole | Max | Opis |\n|------|-----|------|\n| `Ulica` | 40 | Ulica bez numeru, np. `Marszałkowska`. |\n| `NrDomu` | 10 | Numer domu/lokalu, np. `12A` lub `3/5`. |\n| `KodPocztowy` | 10 | Format XX-XXX, np. `00-001`. |\n| `Miasto` | 40 | Miejscowość, np. `Warszawa`. |\n| `Poczta` | 40 | Miejscowość poczty (gdy inna niż miasto). |\n| `Gmina` | 40 | Gmina. |\n| `Powiat` | 40 | Powiat. |\n| `Wojewodztwo` | 40 | Województwo, np. `mazowieckie`. |\n| `Kraj` | 40 | Pełna nazwa kraju. Domyślnie `Polska`. |\n\n## Pola kontaktowe\n\n| Pole | Max | Opis |\n|------|-----|------|\n| `Email` | 127 | Adres e-mail (`Knt_Email`). |\n| `Telefon` | 20 | Telefon główny (`Knt_Telefon1`). |\n| `Telefon2` | 20 | Telefon dodatkowy (`Knt_Telefon2`). |\n\n## Odpowiedź\n\nPrzy sukcesie zwracane są: `Success = true`, `Akronim`, `NazwaPelna` (złożona przez Optimę) oraz `ID` (Knt_KntId).","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyKontrahentRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyKontrahentRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyKontrahentRequest"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}},"503":{"description":"Service Unavailable"}}}},"/kontrahenci/{id}":{"put":{"tags":["Kontrahenci"],"summary":"Aktualizuje dane istniejącego kontrahenta przez COM Optimy.","description":"Operacja wykonywana jest przez obiekty COM Comarch ERP Optima (CDNHeal).\nTylko pola o wartości innej niż `null` są aktualizowane — pola pominięte\npozostają bez zmian. Akronim (kod skrócony) jest tylko do odczytu.\n\nWymagany scope tokenu: `kontrahenci`.\n\n**Przykładowe żądanie (zmiana tylko e-maila i miasta):**\n```json\n{\n  \"email\": \"nowy@example.com\",\n  \"miasto\": \"Kraków\"\n}\n```","parameters":[{"name":"id","in":"path","description":"Identyfikator kontrahenta (Knt_KntId z GET /kontrahenci).","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaKontrahentaRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaKontrahentaRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaKontrahentaRequest"}}}},"responses":{"200":{"description":"Kontrahent zaktualizowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}},"400":{"description":"Błąd COM Optimy lub kontrahent o podanym ID nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}}}},"delete":{"tags":["Kontrahenci"],"summary":"Usuwa kontrahenta przez COM Optimy.","parameters":[{"name":"id","in":"path","description":"Identyfikator kontrahenta (Knt_KntId z GET /kontrahenci).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Kontrahent usunięty pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}},"400":{"description":"Błąd COM Optimy lub kontrahent o podanym ID nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/KontrahentResponse"}}}}}}},"/kontrahenci/grupy":{"get":{"tags":["Kontrahenci"],"summary":"Zwraca listę grup kontrahentów z CDN.Grupy (Gru_Typ=31).","responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaKontrahentow"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaKontrahentow"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaKontrahentow"}}}}}}},"post":{"tags":["Kontrahenci"],"summary":"Dodaje nową grupę kontrahentów do CDN.Grupy.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowaGrupaKontrahentow"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowaGrupaKontrahentow"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowaGrupaKontrahentow"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}}}}},"/kontrahenci/grupy/{id}":{"put":{"tags":["Kontrahenci"],"summary":"Aktualizuje grupę kontrahentów w CDN.Grupy. Pola null nie są zmieniane.","parameters":[{"name":"id","in":"path","description":"ID grupy (Gru_GruID).","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaGrupyKontrahentow"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaGrupyKontrahentow"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaGrupyKontrahentow"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}}}},"delete":{"tags":["Kontrahenci"],"summary":"Usuwa grupę kontrahentów z CDN.Grupy.\nKontrahenci przypisani do tej grupy zachowają wartość Knt_Grupa, ale nie będzie ona wskazywać na żaden rekord.","parameters":[{"name":"id","in":"path","description":"ID grupy (Gru_GruID).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}}}}},"/kontrahenci/{id}/grupa":{"put":{"tags":["Kontrahenci"],"summary":"Przypisuje kontrahenta do grupy przez COM Optimy.","parameters":[{"name":"id","in":"path","description":"ID kontrahenta (Knt_KntId).","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"nazwaGrupy","in":"query","description":"Nazwa grupy (Gru_Nazwa) z CDN.Grupy.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}},"503":{"description":"Service Unavailable"}}},"delete":{"tags":["Kontrahenci"],"summary":"Usuwa przypisanie kontrahenta do grupy przez COM Optimy (czyści pole Knt_Grupa).","parameters":[{"name":"id","in":"path","description":"ID kontrahenta (Knt_KntId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaKontrahentowResponse"}}}},"503":{"description":"Service Unavailable"}}}},"/kontrahenci/{id}/rozrachunki":{"get":{"tags":["Kontrahenci"],"summary":"Zwraca stronicowane rozrachunki kontrahenta z CDN.BnkZdarzenia.","description":"Zwraca zdarzenia kasowo-bankowe powiązane z kontrahentem (`BZd_PodmiotTyp = 1`).\nPomija zdarzenia nie podlegające rozliczeniu (`BZd_Rozliczono = 0 AND BZd_Rozliczono2 = 0`).\n\nPodsumowanie salda (`SaldoNaleznosci`, `SaldoZobowiazan`, `SaldoPrzeterminowane`)\njest zawsze obliczane po **wszystkich** pasujących rekordach, niezależnie od strony.\n\nPodsumowanie salda obliczane w PLN (waluta systemowa):\n- `SaldoNaleznosci` — suma otwartych należności (kierunek = 1)\n- `SaldoZobowiazan` — suma otwartych zobowiązań (kierunek = -1)\n- `SaldoPrzeterminowane` — suma nierozliczonych z terminem w przeszłości\n\nParametr `tylkoNierozliczone` ogranicza wyniki do zdarzeń z `BZd_Rozliczono = 1`.","parameters":[{"name":"id","in":"path","description":"ID kontrahenta (Knt_KntId).","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"tylkoNierozliczone","in":"query","description":"Czy zwracać tylko nierozliczone i częściowo rozliczone. Domyślnie false.","schema":{"type":"boolean","default":false}},{"name":"strona","in":"query","description":"Numer strony (od 1). Domyślnie 1.","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500). Domyślnie 50.","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Rozrachunki kontrahenta z podsumowaniem salda.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RozrachunkiKontrahentaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RozrachunkiKontrahentaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozrachunkiKontrahentaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono kontrahenta.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/kontrahenci/zapisy-kb":{"get":{"tags":["Kontrahenci"],"summary":"Zwraca stronicowaną listę dokumentów kasowo-bankowych (KP/KW) z CDN.BnkZapisy.","description":"Wymagany jest co najmniej jeden parametr identyfikujący kontrahenta: `kontrahentId` lub `kontrahentKod`.\n\nParametr `typ`: `KP` = wpłaty (BZp_Kierunek = 1), `KW` = wypłaty (BZp_Kierunek = -1). Brak = oba kierunki.\n\nPodsumowanie `SumaWplatSys` / `SumaWyplatSys` obliczane po wszystkich pasujących rekordach w PLN.","parameters":[{"name":"kontrahentId","in":"query","description":"ID kontrahenta (Knt_KntId).","schema":{"type":"integer","format":"int32"}},{"name":"kontrahentKod","in":"query","description":"Kod (akronim) kontrahenta (Knt_Kod).","schema":{"type":"string"}},{"name":"dataOd","in":"query","description":"Zakres dat operacji — od (BZp_DataDok >=).","schema":{"type":"string","format":"date-time"}},{"name":"dataDo","in":"query","description":"Zakres dat operacji — do (BZp_DataDok <=).","schema":{"type":"string","format":"date-time"}},{"name":"typ","in":"query","description":"Filtr kierunku: KP (wpłaty) lub KW (wypłaty). Brak = wszystkie.","schema":{"type":"string"}},{"name":"strona","in":"query","description":"Numer strony (od 1). Domyślnie 1.","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500). Domyślnie 50.","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Stronicowana lista dokumentów K/B z podsumowaniem.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisyKBResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisyKBResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisyKBResponse"}}}},"400":{"description":"Brak wymaganego parametru lub nieprawidłowy typ.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/kontrahenci/{id}/konta-bankowe":{"get":{"tags":["Kontrahenci"],"summary":"Zwraca rachunki bankowe kontrahenta (schematy płatności) z CDN.SchematPlatnosci.","description":"Dane pobierane z tabeli `CDN.SchematPlatnosci` gdzie `SPL_PodmiotTyp = 1`\n(kontrahent). Nazwa banku dołączana z `CDN.BnkNazwy`.","parameters":[{"name":"id","in":"path","description":"ID kontrahenta (Knt_KntId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Lista rachunków bankowych kontrahenta.","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KontoBankoweDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KontoBankoweDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KontoBankoweDto"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono kontrahenta.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/kontrahenci/{id}/rozliczenia":{"get":{"tags":["Kontrahenci"],"summary":"Zwraca rozliczenia (zapisy K/B) konkretnego kontrahenta z CDN.BnkZapisy.","description":"Endpoint zwraca rzeczywiste dokumenty kasowo-bankowe (KP/KW) powiązane z kontrahentem —\ntj. wpłaty i wypłaty zaksięgowane w rejestrach K/B.\n\nDla zdarzeń płatniczych (harmonogram płatności) użyj\n(`GET /kontrahenci/{id}/rozrachunki`).","parameters":[{"name":"id","in":"path","description":"ID kontrahenta (Knt_KntId).","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"dataOd","in":"query","description":"Zakres dat operacji — od (BZp_DataDok >=).","schema":{"type":"string","format":"date-time"}},{"name":"dataDo","in":"query","description":"Zakres dat operacji — do (BZp_DataDok <=).","schema":{"type":"string","format":"date-time"}},{"name":"kierunek","in":"query","description":"KP = wpłaty (Kierunek=1), KW = wypłaty (Kierunek=-1). Brak = oba.","schema":{"type":"string"}},{"name":"strona","in":"query","description":"Numer strony (od 1). Domyślnie 1.","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500). Domyślnie 50.","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Stronicowana lista zapisów K/B kontrahenta.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ZapisyKBResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ZapisyKBResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ZapisyKBResponse"}}}},"400":{"description":"Nieprawidłowa wartość parametru.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono kontrahenta.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/magazyny":{"get":{"tags":["Magazyny"],"summary":"Zwraca listę magazynów z CDN.Magazyny.","parameters":[{"name":"id","in":"query","description":"ID magazynu (Mag_MagId) — dokładne dopasowanie.","schema":{"type":"integer","format":"int32"}},{"name":"symbol","in":"query","description":"Symbol magazynu (Mag_Symbol) — dokładne dopasowanie (wielkość liter bez znaczenia).","schema":{"type":"string"}},{"name":"typ","in":"query","description":"Typ magazynu: 1=lokalny, 2=odległy, 3=serwisowy — dokładne dopasowanie.","schema":{"type":"integer","format":"int32"}},{"name":"nieaktywne","in":"query","description":"Gdy `true` — zwraca również nieaktywne magazyny. Domyślnie `false`.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Lista magazynów spełniających kryteria (może być pusta)."},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Magazyny"],"summary":"Dodaje nowy magazyn przez COM Optimy (CDN.Magazyny).","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyMagazyn"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyMagazyn"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyMagazyn"}}}},"responses":{"200":{"description":"Magazyn dodany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}},"400":{"description":"Błąd COM Optimy (np. duplikat symbolu).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM."}}},"put":{"tags":["Magazyny"],"summary":"Aktualizuje magazyn przez COM Optimy.","parameters":[{"name":"id","in":"query","description":"ID magazynu (Mag_MagId).","schema":{"type":"integer","format":"int32"}},{"name":"symbol","in":"query","description":"Symbol magazynu (Mag_Symbol).","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaMagazynu"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaMagazynu"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaMagazynu"}}}},"responses":{"200":{"description":"Magazyn zaktualizowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}},"400":{"description":"Błąd walidacji, błąd COM Optimy lub magazyn nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}}}}},"/magazyny/{id}":{"delete":{"tags":["Magazyny"],"summary":"Usuwa magazyn przez COM Optimy.","parameters":[{"name":"id","in":"path","description":"ID magazynu (Mag_MagId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Magazyn usunięty pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}},"400":{"description":"Błąd COM Optimy lub magazyn o podanym ID nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/MagazynResponse"}}}}}}},"/oauth/token":{"post":{"tags":["OAuth2 — autoryzacja"],"summary":"Pobierz token dostępu","description":"Generuje token Bearer metodą **OAuth2 Client Credentials** (RFC 6749).\n\n---\n\n### Jak używać\n\n**Krok 1 — utwórz klienta** w Panelu administracyjnym (`/Setup` → zakładka *Klienci*).\nPo utworzeniu otrzymasz jednorazowo `client_id` i `client_secret` — zapisz je.\n\n**Krok 2 — pobierz token:**\n```\nPOST /oauth/token\nContent-Type: application/json\n\n{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\":     \"abc123def456\",\n  \"client_secret\": \"twoj-tajny-secret\",\n  \"scope\":         \"towary kontrahenci\"\n}\n```\n\n**Krok 3 — używaj tokenu** w nagłówku każdego kolejnego żądania:\n```\nAuthorization: Bearer <access_token>\n```\n\n---\n\n### Parametry\n\n| Pole | Wymagane | Opis |\n|---|---|---|\n| `grant_type` | tak | Zawsze `client_credentials` |\n| `client_id` | tak | Identyfikator klienta z panelu |\n| `client_secret` | tak | Tajny klucz klienta (widoczny tylko przy tworzeniu) |\n| `scope` | nie | Zakresy oddzielone spacją. Pominięcie = wszystkie zakresy klienta |\n\n### Kody odpowiedzi\n\n| Kod | Znaczenie |\n|---|---|\n| `200` | Token wystawiony — zwraca `access_token`, `expires_in` (sekundy), `scope` |\n| `400` | Nieprawidłowy `grant_type` |\n| `401` | Błędny `client_id` lub `client_secret` |\n| `403` | Adres IP klienta nie jest na liście dozwolonych |","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TokenResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Unauthorized","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"security":[]}},"/okresy-obrachunkowe":{"get":{"tags":["Okresy obrachunkowe"],"summary":"Zwraca okresy obrachunkowe z CDN.OkresyObrach.","description":"Bez parametru `data` zwraca wszystkie zdefiniowane okresy.\nZ parametrem `data` zwraca okres obowiązujący w podanym dniu\n(`data BETWEEN OOb_DataOtw AND OOb_DataKoncowa`).\n\n## Przykłady\n\n**Wszystkie okresy:**\n```\nGET /okresy-obrachunkowe\n```\n\n**Okres obowiązujący w danym dniu:**\n```\nGET /okresy-obrachunkowe?data=2026-03-15\n```","parameters":[{"name":"data","in":"query","description":"Data, dla której szukany jest obowiązujący okres. Opcjonalna.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Lista okresów obrachunkowych spełniających kryteria.","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OkresObrachunkowyDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OkresObrachunkowyDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OkresObrachunkowyDto"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/pracownicy":{"post":{"tags":["Pracownicy"],"summary":"Rejestruje nowego pracownika.","description":"Tworzy kartotekę pracownika z pierwszym wpisem historii zatrudnienia.\nPola `Kod`, `Nazwisko` i `Imie1` są wymagane — pozostałe opcjonalne.\nSkrót pracownika jest zapisywany wielkimi literami i musi być unikalny.\n\n## Typ pracownika\n\n| Wartość | Opis |\n|---------|------|\n| `0` | Pracownik etatowy (domyślnie) |\n| `1` | Zleceniobiorca |\n| `2` | Właściciel |\n\n## Centrum i dział\n\nPodanie kodu centrum lub działu przypisze pracownika do wybranej jednostki organizacyjnej.\nJeśli podany kod nie istnieje, żądanie zostanie odrzucone — pracownik nie zostanie zapisany.\n\n## Adresy\n\nMożna podać trzy rodzaje adresów — zamieszkania, korespondencyjny i zameldowania.\nKażdy adres jest niezależny i w pełni opcjonalny.\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyPracownikRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyPracownikRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyPracownikRequest"}}}},"responses":{"200":{"description":"Pracownik zarejestrowany pomyślnie — odpowiedź zawiera identyfikator, skrót oraz nazwisko i imię.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"400":{"description":"Nieprawidłowe dane lub wskazane centrum albo dział nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do zapisu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}}}},"get":{"tags":["Pracownicy"],"summary":"Pobiera listę pracowników z możliwością filtrowania.","description":"Zwraca pracowników według stanu na dzień dzisiejszy.\nWszystkie parametry filtrowania są opcjonalne i można je łączyć dowolnie.\n\n## Typ pracownika\n\n| Wartość | Opis |\n|---------|------|\n| `0` | Pracownik etatowy |\n| `1` | Zleceniobiorca |\n| `2` | Właściciel |\n\nWymagany scope tokenu: `pracownicy.read` lub `pracownicy.read.write`.","parameters":[{"name":"centrumKod","in":"query","description":"Filtruj po kodzie centrum kosztów.","schema":{"type":"string"}},{"name":"dzialKod","in":"query","description":"Filtruj po kodzie działu.","schema":{"type":"string"}},{"name":"typ","in":"query","description":"Filtruj po typie pracownika (0 / 1 / 2).","schema":{"type":"integer","format":"int32"}},{"name":"czyAktywny","in":"query","description":"Filtruj po statusie zatrudnienia.","schema":{"type":"boolean"}},{"name":"kod","in":"query","description":"Filtruj po skrócie pracownika (dokładne dopasowanie, wielkość liter ignorowana).","schema":{"type":"string"}},{"name":"pesel","in":"query","description":"Filtruj po numerze PESEL.","schema":{"type":"string"}},{"name":"zAdresami","in":"query","description":"Gdy `true` — dołącz do odpowiedzi adres zamieszkania i adres korespondencyjny.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Lista pracowników spełniających kryteria — pole `Liczba` zawiera ich łączną liczbę.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikListaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikListaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikListaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do odczytu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikListaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikListaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikListaResponse"}}}}}}},"/pracownicy/{kod}":{"put":{"tags":["Pracownicy"],"summary":"Aktualizuje dane pracownika.","description":"Pracownik jest identyfikowany po skrócie podanym w adresie URL (wielkość liter ignorowana).\nPrzesyłane są wyłącznie pola, które mają zostać zmienione — pola pominięte pozostają bez zmian.\nSekcje danych (dane kadrowe, adresy) muszą być uwzględnione w żądaniu, aby ich pola były przetwarzane;\nprzesłanie pustego obiektu nie powoduje żadnych zmian w danej sekcji.\n\n## Zmiana w historii zatrudnienia\n\nKażda zmiana danych kadrowych jest powiązana z konkretnym okresem zatrudnienia.\n\n| `CzyNowyWpisHistoryczny` | Zachowanie |\n|---|---|\n| `false` (domyślnie) | Aktualizacja danych w okresie zatrudnienia obowiązującym w dniu `DataOd` |\n| `true`, okres istnieje od tej daty | Aktualizacja istniejącego okresu bez tworzenia duplikatu |\n| `true`, brak okresu od tej daty | Otwarcie nowego okresu zatrudnienia od daty `DataOd` z przeniesieniem schematu płatności |\n\nPole `DataOd` jest opcjonalne — gdy pominięte, przyjmowana jest data dzisiejsza.\n\n## Centrum i dział\n\nPodanie kodu centrum lub działu przepisze pracownika do wskazanej jednostki organizacyjnej.\nJeśli podany kod nie istnieje, żądanie zostanie odrzucone — zmiany nie zostaną zapisane.\n\n## Adresy\n\nMożna zaktualizować trzy rodzaje adresów — zamieszkania, korespondencyjny i zameldowania.\nKażdy adres jest niezależny; przesłanie obiektu adresu aktualizuje podane w nim pola.\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdycjaPracownikaRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/EdycjaPracownikaRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/EdycjaPracownikaRequest"}}}},"responses":{"200":{"description":"Dane pracownika zaktualizowane pomyślnie — odpowiedź zawiera identyfikator, skrót oraz nazwisko i imię.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"400":{"description":"Nieprawidłowe dane lub wskazane centrum albo dział nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do zapisu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik o podanym skrócie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}}}},"delete":{"tags":["Pracownicy"],"summary":"Usuwa kartotekę pracownika.","description":"Trwale usuwa pracownika z systemu. Operacja jest nieodwracalna.\nUsunięcie może zostać zablokowane przez system, jeśli do pracownika przypisane są\ndokumenty kadrowe lub płacowe (listy płac, umowy, deklaracje).\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Pracownik usunięty pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"400":{"description":"Nie można usunąć pracownika — szczegóły w polu `Message`.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do usuwania pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik o podanym skrócie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}}}}},"/pracownicy/{kod}/etat":{"put":{"tags":["Pracownicy"],"summary":"Aktualizuje etat pracownika.","description":"Pracownik jest identyfikowany po skrócie podanym w adresie URL (wielkość liter ignorowana).\nPrzesyłane są wyłącznie pola, które mają zostać zmienione — pola pominięte pozostają bez zmian.\n\n## Zmiana w historii zatrudnienia\n\nKażda zmiana danych etatu jest powiązana z konkretnym okresem zatrudnienia.\n\n| `CzyNowyWpisHistoryczny` | Zachowanie |\n|---|---|\n| `false` (domyślnie) | Aktualizacja danych etatu w okresie obowiązującym w dniu `DataOd` |\n| `true`, okres istnieje od tej daty | Aktualizacja istniejącego okresu bez tworzenia duplikatu |\n| `true`, brak okresu od tej daty | Otwarcie nowego okresu zatrudnienia od daty `DataOd` z przeniesieniem schematu płatności |\n\nPole `DataOd` jest opcjonalne — gdy pominięte, przyjmowana jest data dzisiejsza.\n\n## Rodzaj umowy\n\n| Wartość | Opis |\n|---------|------|\n| `1` | Na czas określony |\n| `2` | Na czas wykonywania określonej pracy |\n| `3` | Na okres próbny |\n| `4` | Na czas nieokreślony |\n| `5` | Na czas określony (zastępstwo) |\n\n## Wymiar etatu\n\nWymiar etatu podawany jest jako ułamek zwykły (licznik / mianownik).\n\n| `EtatL` | `EtatM` | Wymiar |\n|------|------|--------|\n| `1` | `1` | Pełny etat |\n| `1` | `2` | 1/2 etatu |\n| `3` | `4` | 3/4 etatu |\n\n## Daty zatrudnienia i zwolnienia\n\nPola `DataZatrudnienia` i `DataZwolnienia` odpowiadają odpowiednio\n`Zatrudnienie.Od` i `Zatrudnienie.Do` w historii zatrudnienia Optimy.\n\n## Składki wypadkowe\n\nDomyślnie stosowana jest ogólna składka wypadkowa z GUS. Aby użyć indywidualnego procentu:\nustaw `IndywProcWypad=1` oraz podaj wartość w `IndywProcWypadProcent`.\n\n## Ubezpieczenia\n\nSekcja `Ubezpieczenie` jest opcjonalna — gdy pominięta, ubezpieczenia nie są zmieniane.\nPodanie obiektu aktualizuje wyłącznie wskazane pola; pozostałe pozostają bez zmian.\n\nDaty `Od` określają datę objęcia danym ubezpieczeniem. Flagi (wartości `0`/`1`)\nwskazują, czy pracownik podlega danemu ubezpieczeniu. Ubezpieczenia dobrowolne\n(`JestDobrEmerytal`, `JestDobrRentowe`, `JestDobrChorobowe`, `JestDobrZdrow`)\ndotyczą typowo zleceniobiorców i osób prowadzących działalność.\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdycjaEtatuRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/EdycjaEtatuRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/EdycjaEtatuRequest"}}}},"responses":{"200":{"description":"Etat zaktualizowany pomyślnie — odpowiedź zawiera identyfikator, skrót oraz nazwisko i imię.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"400":{"description":"Nieprawidłowe dane wejściowe, np. nieznany rodzaj umowy.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do zapisu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik o podanym skrócie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PracownikResponse"}}}}}}},"/pracownicy/{kod}/dodatki":{"get":{"tags":["Pracownicy"],"summary":"Pobiera listę dodatków płacowych pracownika.","description":"Zwraca wszystkie dodatki przypisane do pracownika wraz z aktualnym wpisem historii\nobowiązującym na dzień dzisiejszy (Wartosc1, Opis, okres obowiązywania).\n\nWymagany scope tokenu: `pracownicy.read` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}},{"name":"nazwa","in":"query","description":"Filtruj po nazwie składnika — dopasowanie częściowe, wielkość liter ignorowana.","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista dodatków pracownika — pole `Liczba` zawiera ich łączną liczbę.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatkiListaResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatkiListaResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatkiListaResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do odczytu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik o podanym skrócie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}}}},"post":{"tags":["Pracownicy"],"summary":"Dodaje nowy dodatek płacowy do kartoteki pracownika.","description":"Tworzy nowy obiekt IDodatek z pierwszym wpisem historii od daty `DataOd`\n(domyślnie: data dzisiejsza). Pola `Nazwa` i `Wartosc1` są wymagane.\n\n## Historyczność\n\nKażda zmiana wartości dodatku jest zapisywana jako nowy wpis historii, co pozwala\nśledzić zmiany w czasie. Aby zmodyfikować istniejący dodatek, użyj\n`PUT /pracownicy/{kod}/dodatki/{id}` z flagą `CzyNowyWpisHistoryczny`.\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DodajDodatekRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodajDodatekRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/DodajDodatekRequest"}}}},"responses":{"200":{"description":"Dodatek dodany pomyślnie — odpowiedź zawiera `Id` (IDodatek) i `HistoriaId` (IDodatekHis).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"400":{"description":"Nieprawidłowe dane wejściowe.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do zapisu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik o podanym skrócie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}}}}},"/pracownicy/{kod}/dodatki/{id}":{"put":{"tags":["Pracownicy"],"summary":"Aktualizuje historię istniejącego dodatku płacowego.","description":"Edytuje wartość lub opis dodatku z zachowaniem historyczności — analogicznie\ndo edycji danych pracownika.\n\n## Zmiana w historii\n\n| `CzyNowyWpisHistoryczny` | Zachowanie |\n|---|---|\n| `false` (domyślnie) | Aktualizacja wpisu historii obowiązującego w dniu `DataOd` |\n| `true`, wpis istnieje od tej daty | Aktualizacja istniejącego wpisu bez tworzenia duplikatu |\n| `true`, brak wpisu od tej daty | Otwarcie nowego wpisu historii od daty `DataOd` przez `ZapisNaDzien` |\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","description":"ID dodatku (IDodatek.ID) zwrócone przez POST lub GET.","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdycjaDodatkuRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/EdycjaDodatkuRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/EdycjaDodatkuRequest"}}}},"responses":{"200":{"description":"Historia dodatku zaktualizowana pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"400":{"description":"Nieprawidłowe dane lub nie można zapisać zmian.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do zapisu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik lub dodatek o podanym ID nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}}}},"delete":{"tags":["Pracownicy"],"summary":"Usuwa dodatek płacowy z kartoteki pracownika.","description":"Trwale usuwa cały obiekt IDodatek wraz z historią. Operacja jest nieodwracalna.\nUsunięcie może zostać zablokowane przez Optimę, jeśli dodatek jest powiązany\nz wypłatami na zatwierdzonych listach płac.\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","description":"ID dodatku (IDodatek.ID) zwrócone przez POST lub GET.","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Dodatek usunięty pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"400":{"description":"Nie można usunąć dodatku — szczegóły w polu `Message`.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do zapisu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik lub dodatek o podanym ID nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}}}}},"/pracownicy/{kod}/dodatki/by-name/{nazwa}":{"delete":{"tags":["Pracownicy"],"summary":"Usuwa dodatek płacowy z kartoteki pracownika po nazwie.","description":"Trwale usuwa wszystkie obiekty IDodatek o podanej nazwie (wraz z historią).\nJeśli pracownik ma kilka dodatków o tej samej nazwie, zostaną usunięte wszystkie.\nOperacja jest nieodwracalna i może zostać zablokowana przez Optimę,\njeśli dodatek jest powiązany z wypłatami na zatwierdzonych listach płac.\n\nWymagany scope tokenu: `pracownicy.write` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}},{"name":"nazwa","in":"path","description":"Nazwa dodatku (DOD_Nazwa), wielkość liter ignorowana przy wyszukiwaniu.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Dodatek(i) usunięte pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"400":{"description":"Nie można usunąć dodatku — szczegóły w polu `Message`.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada uprawnień do zapisu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik nie istnieje lub brak dodatków o podanej nazwie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}},"503":{"description":"System kadrowo-płacowy jest niedostępny lub nie odpowiada w wymaganym czasie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodatekResponse"}}}}}}},"/pracownicy/{kod}/plan-pracy":{"get":{"tags":["Pracownicy"],"summary":"Pobiera plan pracy pracownika dla wskazanego miesiąca.","description":"Zwraca dane z funkcji `CDN.PracCzasPracyFN` z parametrem `Typ=2` (plan pracy).\nJeden dzień może zawierać kilka wierszy, gdy pracownik ma kilka przedziałów godzinowych\n(np. praca zmianowa). Wiersze są posortowane według daty i numeru porządkowego `Lp`.\n\nGodziny (`GodzOd`, `GodzDo`) są w formacie `HH:mm`.\nPola `Norma` i `Praca` wyrażone są w minutach.\n\n## Typ dnia\n\n| Wartość | Opis |\n|---------|------|\n| `1` | Roboczy |\n| `2` | Wolny |\n| `3` | Świąteczny |\n\nWymagany scope tokenu: `pracownicy.read` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}},{"name":"rok","in":"query","description":"Rok (np. 2025).","schema":{"type":"integer","format":"int32"}},{"name":"miesiac","in":"query","description":"Miesiąc (1–12).","schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Plan pracy pracownika — lista przedziałów godzinowych.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}},"400":{"description":"Nieprawidłowy miesiąc lub rok.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik o podanym skrócie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}},"503":{"description":"Błąd dostępu do bazy danych.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}}}}},"/pracownicy/{kod}/czas-pracy":{"get":{"tags":["Pracownicy"],"summary":"Pobiera czas pracy pracownika dla wskazanego miesiąca.","description":"Zwraca dane z funkcji `CDN.PracCzasPracyFN` z parametrem `Typ=3` (czas pracy).\nStruktura odpowiedzi jest identyczna jak dla planu pracy — różnica tkwi w danych źródłowych:\nplan pracy to norma planowana, czas pracy to faktycznie zarejestrowany czas.\n\nGodziny (`GodzOd`, `GodzDo`) są w formacie `HH:mm`.\nPola `Norma` i `Praca` wyrażone są w minutach.\n\n## Typ dnia\n\n| Wartość | Opis |\n|---------|------|\n| `1` | Roboczy |\n| `2` | Wolny |\n| `3` | Świąteczny |\n\nWymagany scope tokenu: `pracownicy.read` lub `pracownicy.read.write`.","parameters":[{"name":"kod","in":"path","description":"Skrót pracownika (wielkość liter ignorowana).","required":true,"schema":{"type":"string"}},{"name":"rok","in":"query","description":"Rok (np. 2025).","schema":{"type":"integer","format":"int32"}},{"name":"miesiac","in":"query","description":"Miesiąc (1–12).","schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Czas pracy pracownika — lista przedziałów godzinowych.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}},"400":{"description":"Nieprawidłowy miesiąc lub rok.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token dostępu.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Pracownik o podanym skrócie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}},"503":{"description":"Błąd dostępu do bazy danych.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CzasPracyResponse"}}}}}}},"/pracownicy/limity-urlopowe":{"get":{"tags":["Pracownicy"],"summary":"Zwraca limity urlopowe pracowników.","description":"Wszystkie parametry są opcjonalne. Brak parametrów zwraca limity wszystkich pracowników\naktualne na dzień dzisiejszy.\n\n| Parametr        | Opis                                                               |\n|-----------------|--------------------------------------------------------------------|\n| akronim         | Zwraca limit tylko dla pracownika o podanym skrócie               |\n| typUrlopu       | Filtruje po rodzaju urlopu, np. `Urlop wypoczynkowy`              |\n| dataAktualnosci | Sprawdza limity ważne w podanym dniu. Domyślnie: dzisiaj          |","parameters":[{"name":"akronim","in":"query","description":"Skrót pracownika w Optimie, np. `ANNAK`. Opcjonalny.","schema":{"type":"string"}},{"name":"typUrlopu","in":"query","description":"Rodzaj urlopu, np. `Urlop wypoczynkowy`. Opcjonalny.","schema":{"type":"string"}},{"name":"dataAktualnosci","in":"query","description":"Dzień, na który sprawdzana jest ważność limitów. Domyślnie: dzisiaj.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Lista limitów urlopowych spełniających kryteria.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/LimityUrlopoweResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/LimityUrlopoweResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/LimityUrlopoweResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie ma uprawnień do odczytu pracowników.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/projekty":{"get":{"tags":["Projekty"],"summary":"Zwraca drzewo aktywnych projektów z CDN.DefProjekty (PRJ_Nieaktywny=0).\nOdpowiedź zawiera korzenie drzewa z rekurencyjnie zagnieżdżonymi podprojektami (pole Dzieci).\nFiltry dotyczą węzła startowego — zwracany jest pasujący węzeł wraz z całym podrzędnym poddrzewem.\nFiltry można łączyć (AND).","parameters":[{"name":"kod","in":"query","description":"Kod projektu (PRJ_Kod) — dokładne dopasowanie, wielkość liter bez znaczenia.","schema":{"type":"string"}},{"name":"wezel","in":"query","description":"Węzeł w drzewie (PRJ_Wezel) — dokładne dopasowanie.","schema":{"type":"string"}}],"responses":{"200":{"description":"Drzewo projektów.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProjektyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProjektyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProjektyResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/raporty/sprzedaz":{"get":{"tags":["Raporty"],"summary":"Raport sprzedaży — agregat wartości dokumentów HaMag za podany okres.","description":"Dane z `CDN.TraNag`. Domyślnie tylko dokumenty zatwierdzone i niezanulowane (`TrN_Bufor = 0`, `TrN_Anulowany = 0`).\nWartości zawsze w PLN (waluta systemowa).\n\n## Grupowanie (`grupujPo`)\n\nParametr można podać wielokrotnie. Wymiary łączą się (GROUP BY po wszystkich jednocześnie).\n\n| Wartość      | Wymiar                           | Pola w wierszu wyniku                             |\n|--------------|----------------------------------|---------------------------------------------------|\n| kontrahent   | Kontrahent (Knt_KntId)           | KontrahentId, KontrahentKod, KontrahentNazwa      |\n| typ          | Typ dokumentu (TrN_TypDokumentu) | KodTypu, NazwaTypu                                |\n| miesiac      | Rok i miesiąc (TrN_DataWys)      | Rok, Miesiac, Okres (np. 2025-03)                 |\n| dzien        | Dzień (TrN_DataWys)              | Dzien                                             |\n\nBrak `grupujPo` — zwraca samo podsumowanie ogólne (puste `Wiersze`).\n\n## Sortowanie (`sortowanie`)\n\nGdy podano `sortowanie=desc` lub `asc` — wiersze sortowane po `SumaBrutto`.\nBez tego parametru — sortowanie po wymiarach grupowania (chronologicznie lub alfabetycznie).\n\n## Filtry\n\nWszystkie filtry są opcjonalne poza `dataOd` i `dataDo`.\nFiltr `typ` przyjmuje kody identyczne jak `POST /dokumenty` (np. FS, FZ, RO).\nFiltr `waluta` ogranicza do dokumentów w danej walucie (`TrN_Waluta`), np. EUR.\n\n## Przykłady użycia\n\n**Łączna sprzedaż FS za rok 2025 (samo podsumowanie):**\n```\nGET /raporty/sprzedaz?dataOd=2025-01-01&dataDo=2025-12-31&typ=FS\n```\n\n**Top 10 kontrahentów wg obrotu brutto (rok 2025):**\n```\nGET /raporty/sprzedaz?dataOd=2025-01-01&dataDo=2025-12-31&grupujPo=kontrahent&sortowanie=desc\n```\n\n**Miesięczny trend sprzedaży FS — chronologicznie:**\n```\nGET /raporty/sprzedaz?dataOd=2025-01-01&dataDo=2025-12-31&typ=FS&grupujPo=miesiac\n```\n\n**Breakdown sprzedaży vs korekt per miesiąc:**\n```\nGET /raporty/sprzedaz?dataOd=2025-01-01&dataDo=2025-12-31&grupujPo=miesiac&grupujPo=typ\n```\n\n**Dzienny obrót jednego kontrahenta w EUR:**\n```\nGET /raporty/sprzedaz?dataOd=2025-03-01&dataDo=2025-03-31&kontrahentKod=ALOZA&waluta=EUR&grupujPo=dzien\n```\n\n**Porównanie kontrahentów per typ dokumentu (malejąco):**\n```\nGET /raporty/sprzedaz?dataOd=2025-01-01&dataDo=2025-12-31&grupujPo=kontrahent&grupujPo=typ&sortowanie=desc\n```\n\n**Obrót z bufora (niezatwierdzone dokumenty robocze):**\n```\nGET /raporty/sprzedaz?dataOd=2025-01-01&dataDo=2025-12-31&tylkoZatwierdzone=false&grupujPo=kontrahent\n```","parameters":[{"name":"dataOd","in":"query","description":"Data wystawienia od (TrN_DataWys >=). Wymagana.","schema":{"type":"string","format":"date-time"}},{"name":"dataDo","in":"query","description":"Data wystawienia do (TrN_DataWys <=). Wymagana.","schema":{"type":"string","format":"date-time"}},{"name":"kontrahentId","in":"query","description":"Filtr po ID kontrahenta (TrN_PodID).","schema":{"type":"integer","format":"int32"}},{"name":"kontrahentKod","in":"query","description":"Filtr po kodzie kontrahenta (Knt_Kod).","schema":{"type":"string"}},{"name":"typ","in":"query","description":"Filtr po typie dokumentu (FS, FZ, WZ…). Pełna lista: GET /dokumenty/typy.","schema":{"type":"string"}},{"name":"waluta","in":"query","description":"Filtr po symbolu waluty dokumentu (TrN_Waluta), np. EUR.","schema":{"type":"string"}},{"name":"tylkoZatwierdzone","in":"query","description":"Tylko zatwierdzone i niezanulowane dokumenty. Domyślnie true.","schema":{"type":"boolean","default":true}},{"name":"grupujPo","in":"query","description":"Wymiary grupowania: kontrahent, typ, miesiac, dzien. Można podać wiele.","schema":{"type":"array","items":{"type":"string"}}},{"name":"sortowanie","in":"query","description":"Sortowanie wierszy po SumaBrutto: `asc` lub `desc`. Brak = sortowanie po wymiarach grupowania.","schema":{"type":"string"}}],"responses":{"200":{"description":"Raport sprzedaży z podsumowaniem i opcjonalnym podziałem na grupy.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RaportSprzedazyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RaportSprzedazyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RaportSprzedazyResponse"}}}},"400":{"description":"Brak wymaganych dat, nieznany typ lub nieprawidłowy wymiar grupowania.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/rejestry-vat/{id}":{"get":{"tags":["Rejestry VAT"],"summary":"Pobiera dokument rejestru VAT po ID.","parameters":[{"name":"id","in":"path","description":"Wewnętrzny identyfikator dokumentu (VaN_VaNID).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Dane dokumentu wraz z pozycjami.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RejestrVATDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/RejestrVATDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/RejestrVATDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono dokumentu o podanym ID.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"put":{"tags":["Rejestry VAT"],"summary":"Edytuje istniejący dokument w rejestrze VAT.","description":"Pola o wartości null nie są zmieniane.\nEdycja możliwa wyłącznie dla dokumentów niezatwierdzonych (bufor).\n\nGdy podano `Rejestr` lub `Typ` — nowy rejestr jest weryfikowany w `CDN.Grupy`.\nGdy podano `KontrahentKod` — kontrahent musi istnieć w kartotece Optimy.\nGdy podano `FormaPlatnosci` — forma płatności musi istnieć w Optimie.\nGdy podano `Kategoria` — kategoria jest wyszukiwana po `Kat_kodszczegol`; gdy nie znaleziona, pole pozostaje bez zmiany.","parameters":[{"name":"id","in":"path","description":"Wewnętrzny identyfikator dokumentu (RVA_RVAID) zwrócony przy dodaniu.","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdytujRejestrVATRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/EdytujRejestrVATRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/EdytujRejestrVATRequest"}}}},"responses":{"200":{"description":"Dokument zaktualizowany — zwraca ID, NumerPelny, IdentKsieg.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATResponse"}}}},"400":{"description":"Błąd walidacji lub błąd COM.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}},"text/json":{"schema":{"type":"string"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono dokumentu o podanym ID.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Rejestry VAT"],"summary":"Usuwa dokument z rejestru VAT.","description":"Usunąć można tylko dokumenty niezaksięgowane (bez dekretu).\nDokumenty zaksięgowane muszą być cofnięte ręcznie w Optimie przed usunięciem.","parameters":[{"name":"id","in":"path","description":"Wewnętrzny identyfikator dokumentu (VaN_VaNID) zwrócony przy dodaniu.","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Dokument usunięty pomyślnie."},"400":{"description":"Błąd COM (np. dokument zaksięgowany).","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}},"text/json":{"schema":{"type":"string"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono dokumentu o podanym ID.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/rejestry-vat":{"get":{"tags":["Rejestry VAT"],"summary":"Zwraca listę dostępnych rejestrów VAT.","responses":{"200":{"description":"Lista rejestrów z podziałem na zakup (Z) i sprzedaż (S).","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrVATInfo"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrVATInfo"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrVATInfo"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Rejestry VAT"],"summary":"Dodaje nowy dokument do rejestru VAT.","description":"Tworzy wpis w rejestrze VAT zakupu lub sprzedaży wraz z pozycjami VAT.\n\n## Typ rejestru (`Typ`)\n\n| Wartość | Znaczenie |\n|---------|-----------|\n| `Z` | Rejestr zakupów |\n| `S` | Rejestr sprzedaży |\n\nWielkość liter nie ma znaczenia. Wartość musi być zgodna z typem istniejącego rejestru —\nrejestr jest weryfikowany przed zapisem (`CDN.Grupy`, `Gru_Typ`).\n\n## Rejestr (`Rejestr`)\n\nNazwa rejestru musi dokładnie odpowiadać nazwie zdefiniowanej w Optimie.\nDostępne rejestry można pobrać przez `GET /rejestry-vat`.\n\n## Kontrahent i forma płatności\n\n- `KontrahentKod` — kod kontrahenta (`Knt_Kod`) z kartoteki Optimy. Wymagany.\n- `FormaPlatnosci` — dokładna nazwa formy płatności (`FPl_Nazwa`), np. `PRZELEW`, `GOTÓWKA`. Wymagana.\n\n## Daty\n\n- `DataZap` — data zapisu (data księgowania)\n- `DataOpe` — data operacji (data sprzedaży lub zakupu)\n- `Termin` — termin płatności. Opcjonalny.\n\n## Kategoria nagłówka\n\n`Kategoria` — kod szczegółowy kategorii (`Kat_kodszczegol`), maks. 50 znaków.\nGdy nie podana lub nie znaleziona, Optima ustawia kategorię automatycznie z kartoteki kontrahenta.\n\n## Waluta\n\n`WalutaSymbol` — symbol waluty obcej (np. `EUR`, `USD`). Domyślnie `PLN`.\nWaluta inna niż PLN wymaga wcześniejszej konfiguracji kursów w Optimie.\n\n## KSeF\n\n- `NrKSeF` — numer KSeF dokumentu źródłowego. Opcjonalny.\n- `KSeFDataPrzyjecia` — data przyjęcia dokumentu w KSeF. Opcjonalna.\n\n## Dodatkowy opis\n\n`DodatkowyOpis` — dowolny tekst opisowy na nagłówku dokumentu. Opcjonalny.\n\n## Pozycje rejestru (`Elementy`)\n\nWymagana co najmniej jedna pozycja. Każda pozycja określa kwotę netto dla danej stawki VAT.\n\n### Stawka VAT (`Stawka`) i flaga (`Flaga`)\n\nPole `Stawka` akceptuje liczbę (`23`, `8`, `5`, `0`) lub symbol `\"ZW\"` / `\"NP\"`.\nGdy podano `\"ZW\"` lub `\"NP\"`, flaga jest ustawiana automatycznie — pole `Flaga` można pominąć.\nPole `Flaga` gdy wynosi `0` (domyślnie), jest ustawiane automatycznie na `2` (opodatkowana).\n\n| `Stawka` | `Flaga` | Znaczenie |\n|----------|---------|-----------|\n| `23`, `8`, `5`, `0` | pominąć lub `2` | Standardowa stawka VAT (opodatkowana) |\n| `\"ZW\"` | pominąć | Zwolniony z VAT — automatycznie `Stawka=0, Flaga=1` |\n| `\"NP\"` | pominąć | Nie podlega VAT — automatycznie `Stawka=0, Flaga=4` |\n| `-1` | pominąć | Skrót dla ZW — odpowiednik `\"ZW\"` |\n| `0` | `1` | Zwolniony (ZW) — jawne podanie flagi |\n| `0` | `3` | Stawka zaniżona |\n| `0` | `4` | Niepodlegający (NP) — jawne podanie flagi |\n\n### Rodzaj zakupu (`RodzajZakupu`)\n\nDotyczy wyłącznie rejestrów zakupów (`Typ = Z`). Ignorowany przez Optimę dla sprzedaży.\n\n| Wartość | Znaczenie |\n|---------|-----------|\n| `1` | Towary |\n| `2` | Inne |\n| `3` | Środki trwałe |\n| `4` | Usługi |\n| `5` | Nowe środki transportu |\n| `6` | Nieruchomości |\n| `7` | Paliwo |\n\n### Odliczenia (`Odliczenia`)\n\nDla zakupów: `0` = nie odliczać, `1` = odliczać, `2` = warunkowo.\nDla sprzedaży: `0` = nie uwzględniaj w proporcji, `1` = uwzględniaj, `2` = tylko w mianowniku.\n\n### Kategorie pozycji\n\n- `Kategoria` — kod szczegółowy kategorii podstawowej (`Kat_kodszczegol`). Opcjonalna.\n- `KatOpis` — opis słowny kategorii podstawowej. Opcjonalny.\n- `Kategoria2` — kod szczegółowy kategorii dodatkowej. Opcjonalna.\n\n### OSS (One Stop Shop)\n\nPola `NettoOSS`, `VATOSS`, `BruttoOSS`, `KodKrajuOSS` — dla transakcji zagranicznych OSS.\nGdy nie dotyczą — pominąć.\n\n## Podmioty trzecie KSeF (`KSeFPodmioty3Vat`)\n\nLista podmiotów trzecich powiązanych z dokumentem w rejestrze VAT.\nGdy lista jest pusta — pole można pominąć.\n\n### Pole `RolaPodmiotu` (wymagane)\n\n| Wartość | Nazwa |\n|---------|-------|\n| `1` | Faktor |\n| `2` | Odbiorca |\n| `3` | Podmiot pierwotny |\n| `4` | Dodatkowy nabywca |\n| `5` | Wystawca faktury |\n| `6` | Dokonujący płatności |\n| `7` | JST – wystawca |\n| `8` | JST – odbiorca |\n| `9` | Członek GV – wystawca |\n| `10` | Członek GV – odbiorca |\n| `11` | Pracownik |\n\n### Pole `RodzajIdentyfikatora`\n\n| Wartość | Znaczenie |\n|---------|-----------|\n| `1` | NIP |\n| `2` | NIP-VAT-UE |\n| `3` | Identyfikator podatkowy inny |\n| `4` | Identyfikator wewnętrzny |\n\n### Powiązanie z kartoteką kontrahenta\n\nGdy podano `KontrahentKod` — podmiot zostaje powiązany z kartoteką Optimy\n(`PodmiotTyp = 1`, `PodmiotId = Knt_KntId`). Kontrahent musi istnieć,\nw przeciwnym razie żądanie zostanie odrzucone z kodem 400.\nGdy `KontrahentKod` nie jest podany — wypełnij ręcznie `Nazwa`, `Nip`, `NipKraj` itp.\n\n### Pozostałe pola podmiotów\n\n| Pole | Maks. długość | Opis |\n|------|--------------|------|\n| `OpisRoli` | 500 | Opis słowny roli podmiotu |\n| `Nazwa` | 300 | Nazwa podmiotu |\n| `Nip` | 50 | Numer identyfikatora podatkowego |\n| `NipKraj` | 2 | Kod kraju ISO 3166-1 alpha-2, np. `PL` |\n| `NrKlienta` | 50 | Numer klienta |\n| `EORI` | 50 | Numer EORI |\n| `Adres` | 500 | Adres podmiotu |\n| `Udzial` | — | Udział procentowy (0–100) |","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATRequest"}}}},"responses":{"200":{"description":"Dokument został dodany — zwraca NumerPelny.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodajRejestrVATResponse"}}}},"400":{"description":"Błąd walidacji lub błąd COM (np. nieznany kontrahent, brak rejestru).","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}},"text/json":{"schema":{"type":"string"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/rejestry-vat/dokumenty":{"get":{"tags":["Rejestry VAT"],"summary":"Wyszukuje dokumenty w rejestrze VAT.","description":"Przynajmniej jeden parametr musi być podany.\nGdy podano `rok` lub `miesiac` — wymagane są oba naraz.\nWyszukiwanie po `numerPelny` działa na polu `VaN_Dokument` (dokładne dopasowanie).","parameters":[{"name":"numerPelny","in":"query","description":"Numer dokumentu (VaN_Dokument). Opcjonalny.","schema":{"type":"string"}},{"name":"rok","in":"query","description":"Rok okresu (np. 2025). Wymagany razem z `miesiac`.","schema":{"type":"integer","format":"int32"}},{"name":"miesiac","in":"query","description":"Miesiąc okresu 1–12. Wymagany razem z `rok`.","schema":{"type":"integer","format":"int32"}},{"name":"typ","in":"query","description":"Typ rejestru: `Z` — zakup, `S` — sprzedaż. Opcjonalny.","schema":{"type":"string"}},{"name":"rejestr","in":"query","description":"Nazwa rejestru (VaN_Rejestr), np. `VAT ZAKUP`. Opcjonalny.","schema":{"type":"string"}},{"name":"kontrahentKod","in":"query","description":"Kod kontrahenta (Knt_Kod). Opcjonalny.","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista pasujących dokumentów (może być pusta).","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrVATListItem"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrVATListItem"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejestrVATListItem"}}}}},"400":{"description":"Błąd walidacji parametrów.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}},"text/json":{"schema":{"type":"string"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/rozliczenia":{"get":{"tags":["Rozliczenia"],"summary":"Zwraca listę zdarzeń płatniczych (rozliczeń) z CDN.BnkZdarzenia.","description":"Dane pobierane są z tabel:\n- `CDN.BnkZdarzenia` — zdarzenia płatnicze (główna tabela)\n- `CDN.BnkRachunki` — nazwy rachunków bankowych i kas\n- `CDN.Kontrahenci` — dane kontrahenta (gdy BZd_PodmiotTyp = 1)\n\n| Parametr           | Kolumna DB              | Porównanie | Uwagi                                              |\n|--------------------|-------------------------|------------|----------------------------------------------------|\n| rachunekId         | BZd_RachId              | =          | ID rachunku bankowego / kasy                       |\n| kontrahentKod      | Knt_Kod                 | =          | tylko zdarzenia powiązane z kontrahentem           |\n| terminOd           | BZd_Termin              | >=      | od tej daty terminu płatności (RRRR-MM-DD)         |\n| terminDo           | BZd_Termin              | <=      | do tej daty terminu płatności (RRRR-MM-DD)         |\n| rozliczono         | BZd_Rozliczono          | =          | 0=nie podlega, 1=nierozliczone, 2=w pełni          |\n| kierunek           | BZd_Kierunek            | =          | 1=przychód (należność), -1=rozchód (zobowiązanie)  |\n| tylkoPrzeterminowane | obliczone             | —          | tylko rekordy z DniOpoznienia > 0 i Rozliczono ≠ 2 |\n\nWyniki stronicowane — domyślnie 50 na stronę, sortowane po terminie płatności malejąco.\n\n**DniOpoznienia** — dla rozliczonych: dni między Terminem a DataRozliczenia (0 gdy w terminie);\ndla nierozliczonych: dni między Terminem a datą dzisiejszą (0 gdy jeszcze w terminie).","parameters":[{"name":"rachunekId","in":"query","description":"Filtr po ID rachunku (BZd_RachId).","schema":{"type":"integer","format":"int32"}},{"name":"kontrahentKod","in":"query","description":"Filtr po kodzie kontrahenta (Knt_Kod).","schema":{"type":"string"}},{"name":"terminOd","in":"query","description":"Termin płatności — od (format RRRR-MM-DD).","schema":{"type":"string","format":"date-time"}},{"name":"terminDo","in":"query","description":"Termin płatności — do (format RRRR-MM-DD).","schema":{"type":"string","format":"date-time"}},{"name":"rozliczono","in":"query","description":"Status rozliczenia: 0=nie podlega, 1=nierozliczone, 2=w pełni rozliczone. Gdy pominięty — wszystkie.","schema":{"type":"integer","format":"int32"}},{"name":"kierunek","in":"query","description":"Kierunek: 1=przychód, -1=rozchód. Gdy pominięty — oba.","schema":{"type":"integer","format":"int32"}},{"name":"tylkoPrzeterminowane","in":"query","description":"Gdy true — tylko przeterminowane i nierozliczone w pełni.","schema":{"type":"boolean","default":false}},{"name":"strona","in":"query","description":"Numer strony (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500, domyślnie 50).","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Rozliczenia spełniające kryteria (lista może być pusta).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RozliczeniaPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RozliczeniaPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozliczeniaPagedResponse"}}}},"400":{"description":"Nieprawidłowe parametry filtrowania.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/rozliczenia/kb":{"post":{"tags":["Rozliczenia"],"summary":"Rozlicza zapis kasowo-bankowy ze zdarzeniem kasowo-bankowym.","description":"Tworzy powiązanie między dokumentem kasowo-bankowym (KP / KW / wyciąg)\na zdarzeniem płatniczym wynikającym z dokumentu handlowego lub kadrowego.\n\n## Jak działa rozliczenie KB–KB\n\nW Optimie każdy dokument handlowy generuje **zdarzenie kasowo-bankowe** (CDN.BnkZdarzenia),\nktóre reprezentuje należność lub zobowiązanie do zapłaty.\nGdy wystawiasz dokument kasowy (np. KP) lub rejestrujesz przelew bankowy,\npowstaje **zapis kasowo-bankowy** (CDN.BnkZapisy).\nRozliczenie łączy te dwa obiekty — potwierdza, że konkretny wpływ / wydatek\npokrywa wskazane zdarzenie płatnicze.\n\n## Identyfikatory\n\n| Pole         | Źródło                              | Jak pobrać                                   |\n|--------------|-------------------------------------|----------------------------------------------|\n| `ZapisKbId`  | CDN.BnkZapisy — BZp_BZpId          | GET /kasa-bank/zapisy                        |\n| `ZdarzenieId`| CDN.BnkZdarzenia — BZd_BZdId       | GET /rozliczenia                             |\n\n## Ograniczenia\n\n- Zapis i zdarzenie muszą istnieć i być dostępne w aktywnej bazie firmowej.\n- Optima zablokuje rozliczenie, jeśli zapis jest już w pełni rozliczony\n  lub typy walut są niezgodne.\n- Operacja jest nieodwracalna przez API — cofnięcie wymaga ręcznej interwencji w Optimie.\n\nWymagany scope tokenu: `rozliczenia.write` lub `rozliczenia.read.write`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RozliczZapisKBRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozliczZapisKBRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/RozliczZapisKBRequest"}}}},"responses":{"200":{"description":"Rozliczenie zapisane pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}}}},"400":{"description":"Nie można rozliczyć — szczegóły w polu `Message` (np. niezgodność walut, brak środków).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Nie znaleziono zapisu KB lub zdarzenia o podanym ID.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}}}},"503":{"description":"System Optima jest niedostępny lub nie odpowiada.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/RozliczenieKBResponse"}}}}}}},"/formy-platnosci":{"get":{"tags":["Słowniki"],"summary":"Zwraca formy płatności z CDN.FormyPlatnosci.","parameters":[{"name":"id","in":"query","description":"ID formy płatności (FPl_FPlId) — dokładne dopasowanie.","schema":{"type":"integer","format":"int32"}},{"name":"nazwa","in":"query","description":"Nazwa formy płatności (FPl_Nazwa) — wyszukiwanie jako fragment (LIKE).","schema":{"type":"string"}},{"name":"typ","in":"query","description":"Typ formy płatności (FPl_Typ):\n- **1** — Gotówka\n- **2** — Przelew\n- **3** — Karta\n- **4** — Kompensata\n- **5** — Bon","schema":{"type":"integer","format":"int32"}},{"name":"nieaktywne","in":"query","description":"Gdy `true` — zwraca również nieaktywne formy. Domyślnie `false`.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Lista form płatności spełniających kryteria (może być pusta).","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FormaPlatnosciDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FormaPlatnosciDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FormaPlatnosciDto"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/waluty":{"get":{"tags":["Słowniki"],"summary":"Zwraca waluty z CDN.WalNazwy wraz z bieżącym kursem z CDN.WalNotowania.","description":"Dla każdej waluty pobierany jest ostatni dostępny kurs (`MAX(WNo_TStamp)`).\nGdy waluta nie ma żadnego kursu w bazie, pola `KursL`, `KursM`, `KursBiezacy`,\n`DataKursu` i `TypKursu` będą `null`.\n\n## Przykłady\n\n**Wszystkie waluty z kursami:**\n```\nGET /waluty\n```\n\n**Tylko waluta EUR:**\n```\nGET /waluty?symbol=EUR\n```\n\n**Tylko aktywne waluty:**\n```\nGET /waluty?tylkoAktywne=true\n```","parameters":[{"name":"symbol","in":"query","description":"Symbol waluty (WNa_Symbol), np. EUR. Wielkość liter bez znaczenia.","schema":{"type":"string"}},{"name":"tylkoAktywne","in":"query","description":"Gdy `true` — pomija waluty oznaczone jako nieaktualizowane. Domyślnie `false`.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Lista walut z bieżącymi kursami.","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalutaDto"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalutaDto"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalutaDto"}}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/stany-magazynowe":{"get":{"tags":["Stany magazynowe"],"summary":"Zwraca stany magazynowe aktywnych towarów z CDN.TwrZasoby.","description":"Dane pobierane są z tabel:\n- `CDN.TwrZasoby` — zasoby (ilość, wartość)\n- `CDN.TwrIlosci` — rezerwacje, zamówienia, braki\n- `CDN.Towary` — dane towaru (kod, nazwa, JM)\n- `CDN.Magazyny` — dane magazynu (symbol, nazwa)\n\nZwracane są tylko towary handlowe (`Twr_Typ = 1`), aktywne (`Twr_Nieaktywny = 0`)\ni posiadające niezerowy stan ilościowy.\n\n| Parametr  | Kolumna DB   | Porównanie | Uwagi                                |\n|-----------|--------------|------------|--------------------------------------|\n| magazyn   | Mag_Symbol   | =          | gdy pominięty — wszystkie magazyny   |\n\nWyniki stronicowane — domyślnie 50 na stronę, sortowane po symbolu magazynu i kodzie towaru.","parameters":[{"name":"magazyn","in":"query","description":"Symbol magazynu (Mag_Symbol). Gdy pominięty — zwraca stany ze wszystkich magazynów.","schema":{"type":"string"}},{"name":"strona","in":"query","description":"Numer strony (domyślnie 1).","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","description":"Liczba rekordów na stronę (1–500, domyślnie 50).","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Stany magazynowe spełniające kryteria (lista może być pusta).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/StanyMagazynowePagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/StanyMagazynowePagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/StanyMagazynowePagedResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/stany-magazynowe/towar":{"get":{"tags":["Stany magazynowe"],"summary":"Zwraca stan konkretnego towaru we wszystkich magazynach z niezerowym stanem.","description":"Filtruj po kodzie towaru (`kod`) lub jego identyfikatorze (`id`) — wymagany przynajmniej jeden parametr.\nZwracane są tylko magazyny z niezerowym stanem ilościowym.\n\n| Parametr | Kolumna DB   | Uwagi                             |\n|----------|--------------|-----------------------------------|\n| id       | Twr_TwrId    | identyfikator towaru              |\n| kod      | Twr_Kod      | kod skrócony towaru               |","parameters":[{"name":"id","in":"query","description":"Identyfikator towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod skrócony towaru (Twr_Kod).","schema":{"type":"string"}}],"responses":{"200":{"description":"Stan towaru w magazynach (lista magazynów może być pusta gdy stan = 0).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/StanTowaruResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/StanTowaruResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/StanTowaruResponse"}}}},"400":{"description":"Nie podano żadnego parametru filtrowania.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Towar o podanym identyfikatorze / kodzie nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/towary":{"get":{"tags":["Towary"],"summary":"Zwraca towary z CDN.Towary, opcjonalnie filtrowane po ID, kodzie, nazwie, EAN lub grupie towarowej.\nFiltry mozna laczyc (AND). Nazwa dziala jako LIKE (fragment).\nWyniki sa stronicowane — domyslnie 50 rekordow na strone.","parameters":[{"name":"id","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","schema":{"type":"string"}},{"name":"nazwa","in":"query","schema":{"type":"string"}},{"name":"ean","in":"query","schema":{"type":"string"}},{"name":"idGrupy","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"kodGrupy","in":"query","schema":{"type":"string"}},{"name":"strona","in":"query","schema":{"type":"integer","format":"int32","default":1}},{"name":"rozmiar","in":"query","schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowaryPagedResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowaryPagedResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowaryPagedResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}}}},"post":{"tags":["Towary"],"summary":"Dodaje nowy towar przez COM Optimy (CDN.Towary).","description":"## Pola identyfikacyjne\n\n| Pole | Wymagane | Max | Opis |\n|------|----------|-----|------|\n| `Nazwa` | **Tak** | 255 | Pełna nazwa towaru (`Twr_Nazwa`). |\n| `Kod` | **Tak** | 50 | Unikalny kod towaru w bazie Optimy (`Twr_Kod`). Zwykłe znaki ASCII; Optima może odrzucić znaki specjalne. |\n| `EAN` | Nie | 40 | Główny kod kreskowy EAN-13 / EAN-8 / GS1-128 (`Twr_EAN`). Dodatkowe kody — endpoint `POST /towary/ean`. |\n\n## Typ towaru (`Typ`)\n\n| Wartość | Znaczenie | Ruch magazynowy |\n|---------|-----------|-----------------|\n| `1` | Towar fizyczny (domyślny) | Tak — WZ/PZ są generowane |\n| `0` | Usługa | **Nie** — WZ/PZ nie są generowane; próba wywołania `GenerujWzPz = true` zakończy się błędem COM |\n\n## Stawka VAT (`Stawka`) i Flaga (`Flaga`)\n\nPole `Stawka` przyjmuje wartość liczbową lub symbol tekstowy:\n\n| `Stawka` | Wynikowa `Flaga` | Znaczenie |\n|----------|-----------------|-----------|\n| `23` | `2` | Opodatkowana 23% (domyślnie) |\n| `8` | `2` | Opodatkowana 8% |\n| `5` | `2` | Opodatkowana 5% |\n| `0` | `2` | Opodatkowana 0% |\n| `\"ZW\"` | `1` | Zwolniona z VAT — Stawka ustawiana na 0 |\n| `\"NP\"` | `4` | Nie podlega VAT — Stawka ustawiana na 0 |\n\nPole `Flaga` jest **opcjonalne** — gdy nie podane, wyznaczane automatycznie ze `Stawka`.\nGdy podane jawnie, nadpisuje wartość automatyczną.\nWartości `Flaga`: `1`=ZW, `2`=Opodatkowana, `3`=Zaniżona, `4`=NP.\n\n## Jednostka miary (`JM`)\n\nDowolny symbol max 20 znaków odpowiadający jednostce miary w Optimie (`Twr_JM`).\nTypowe wartości: `SZT`, `KG`, `M`, `L`, `M2`, `M3`, `KPL`, `OP`, `KRT`, `USL`, `RYZ`, `PAK`.\nDomyślnie `SZT`. Jednostka musi istnieć w słowniku Optimy lub być zaakceptowana przez COM.\n\n## Ceny (`CenaNetto1`, `CenaBrutto4`)\n\nSkrócona ścieżka ustawiania cen przy tworzeniu towaru. Pełna obsługa cenników — endpoint `PUT /towary/ceny`.\n\n| Pole | Cennik | Typ wartości |\n|------|--------|--------------|\n| `CenaNetto1` | Nr 1 (zazwyczaj cena zakupu/hurtowa) | Netto |\n| `CenaBrutto4` | Nr 4 (zazwyczaj cena detaliczna) | Brutto |\n\nJeśli definicja cennika o danym numerze nie istnieje w CDN.DefCeny, pole jest ignorowane bez błędu.\n\n## Grupa towarowa (`KodGrupy`)\n\nKod grupy z `CDN.TwrGrupy` (`Twg_Kod`). Grupa **musi istnieć** przed dodaniem towaru —\njeśli nie istnieje, COM zwróci błąd. Grupy można tworzyć przez `POST /grupy-towarowe`.\nPo dodaniu towaru kolejne grupy przypisuje się przez `POST /towary/grupy`.\n\n## Masa (`Masa`)\n\nMasa towaru w kilogramach (`Twr_Masa`). Opcjonalna, używana np. do obliczeń kosztów wysyłki.\n\n## Opis (`Opis`)\n\nOpis towaru (`Twr_Opis`), max 2000 znaków. Wyświetlany m.in. na dokumentach i w sklepach.\n\n## Atrybuty (`Atrybuty`)\n\nLista atrybutów do przypisania przy tworzeniu towaru. Każdy element:\n\n| Pole | Wymagane | Opis |\n|------|----------|------|\n| `KodAtrybutu` | **Tak** | Kod definicji atrybutu (`DeA_Kod`) z `CDN.DefAtrybuty`. Definicja musi istnieć i mieć typ `Towar`. |\n| `Wartosc` | Nie | Wartość atrybutu. Dla atrybutów słownikowych — musi być jedną z dopuszczalnych wartości. |\n\nDodatkowe atrybuty po tworzeniu — endpoint `POST /atrybuty`.\n\n## Odpowiedź\n\nPrzy sukcesie zwracane są: `Success = true`, `Kod` i `Nazwa` dodanego towaru.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyTowarRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyTowarRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyTowarRequest"}}}},"responses":{"200":{"description":"Towar dodany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}},"400":{"description":"Błąd walidacji lub COM (np. duplikat kodu, nieznana grupa, nieprawidłowy atrybut).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM."},"401":{"description":"Brak lub nieprawidłowy token Bearer."},"403":{"description":"Token nie posiada wymaganego scope."}}},"put":{"tags":["Towary"],"summary":"Aktualizuje istniejący towar przez COM Optimy (CDN.Towary).","description":"## Identyfikacja towaru (query params)\n\nWymagany dokładnie jeden z parametrów query:\n\n| Parametr | Typ | Opis |\n|----------|-----|------|\n| `id` | int | `Twr_TwrId` — wewnętrzny ID Optimy (zwracany przez `GET /towary`). |\n| `kod` | string | `Twr_Kod` — unikalny kod towaru. Wielkość liter bez znaczenia. |\n| `ean` | string | `Twr_EAN` — główny kod kreskowy przypisany do towaru. |\n\n## Zasada częściowej aktualizacji\n\nPola o wartości `null` są **ignorowane** — istniejące dane w Optimie pozostają bez zmian.\nPrzekaż tylko te pola, które chcesz zmienić.\n\nWyjątek: `Atrybuty` — pusta lista (`[]`) nie zmienia atrybutów; niepusta lista wykonuje **upsert**\n(istniejący atrybut jest aktualizowany, nowy jest dodawany).\n\n## Pola podstawowe\n\n| Pole | Max | Opis |\n|------|-----|------|\n| `Nazwa` | 255 | Nowa pełna nazwa towaru (`Twr_Nazwa`). |\n| `Kod` | 50 | Nowy kod towaru (`Twr_Kod`). Musi być unikalny — COM zwróci błąd przy duplikacie. |\n| `EAN` | 40 | Nowy główny kod kreskowy (`Twr_EAN`). Dodatkowe kody — `POST /towary/ean`. |\n| `JM` | 20 | Jednostka miary (`Twr_JM`), np. `SZT`, `KG`, `M2`, `USL`. |\n| `Masa` | — | Masa w kg (`Twr_Masa`). |\n| `Opis` | 2000 | Opis towaru (`Twr_Opis`). |\n\n## Typ towaru (`Typ`)\n\n| Wartość | Znaczenie | Uwaga |\n|---------|-----------|-------|\n| `1` | Towar fizyczny | Ma ruch magazynowy (WZ/PZ). |\n| `0` | Usługa | Brak ruchu magazynowego — `GenerujWzPz = true` zakończy się błędem COM. |\n\nZmiana typu na `0` (usługa) dla towaru z historią magazynową może być zablokowana przez Optimę.\n\n## Stawka VAT (`Stawka`) i Flaga (`Flaga`)\n\nPole `Stawka` przyjmuje wartość liczbową lub symbol tekstowy.\nGdy `Stawka` jest podana, `Flaga` wyznaczana jest automatycznie (chyba że podano ją jawnie):\n\n| `Stawka` | Wynikowa `Flaga` | Znaczenie |\n|----------|-----------------|-----------|\n| `23` | `2` | Opodatkowana 23% |\n| `8` | `2` | Opodatkowana 8% |\n| `5` | `2` | Opodatkowana 5% |\n| `0` | `2` | Opodatkowana 0% |\n| `\"ZW\"` | `1` | Zwolniona z VAT — Stawka ustawiana na 0 |\n| `\"NP\"` | `4` | Nie podlega VAT — Stawka ustawiana na 0 |\n\nGdy podano tylko `Flaga` (bez `Stawka`) — zmieniana jest wyłącznie Flaga.\nWartości `Flaga`: `1`=ZW, `2`=Opodatkowana, `3`=Zaniżona, `4`=NP.\n\n## Ceny (`CenaNetto1`, `CenaBrutto4`)\n\nSkrócona ścieżka aktualizacji dwóch najczęstszych cenników. Pełna obsługa wszystkich cenników — `PUT /towary/ceny`.\n\n| Pole | Cennik | Typ wartości |\n|------|--------|--------------|\n| `CenaNetto1` | Nr 1 (hurtowa / zakupu) | Netto |\n| `CenaBrutto4` | Nr 4 (detaliczna) | Brutto |\n\n## Grupa towarowa (`KodGrupy`)\n\nPrzypisuje towar do grupy z `CDN.TwrGrupy`. Grupa musi istnieć.\n`null` = bez zmian. Aby zarządzać wieloma grupami jednego towaru — `POST /towary/grupy`.\n\n## Atrybuty (`Atrybuty`)\n\nLista obiektów `{ KodAtrybutu, Wartosc }` do upsert:\n- Jeśli atrybut o danym `KodAtrybutu` już istnieje na towarze → wartość zostaje zaktualizowana.\n- Jeśli nie istnieje → atrybut zostaje dodany (definicja musi istnieć w `CDN.DefAtrybuty` jako typ `Towar`).\n- `null` lub `[]` → żadne atrybuty nie są zmieniane.\n\n## Odpowiedź\n\nPrzy sukcesie: `Success = true`, `Kod` i `Nazwa` towaru po aktualizacji.","parameters":[{"name":"id","in":"query","description":"ID towaru (`Twr_TwrId`). Alternatywnie: `kod` lub `ean`.","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (`Twr_Kod`). Alternatywnie: `id` lub `ean`.","schema":{"type":"string"}},{"name":"ean","in":"query","description":"Kod EAN towaru (`Twr_EAN`). Alternatywnie: `id` lub `kod`.","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaTowaruRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaTowaruRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaTowaruRequest"}}}},"responses":{"200":{"description":"Towar zaktualizowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}},"400":{"description":"Błąd walidacji lub COM (np. duplikat kodu, nieznana grupa, nieprawidłowy atrybut).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono czas operacji COM."},"401":{"description":"Brak lub nieprawidłowy token Bearer."},"403":{"description":"Token nie posiada wymaganego scope."}}},"delete":{"tags":["Towary"],"summary":"Usuwa towar przez COM Optimy (CDN.Towary).\nPodaj dokladnie jeden identyfikator: id, kod lub ean.","parameters":[{"name":"id","in":"query","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","schema":{"type":"string"}},{"name":"ean","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}},"503":{"description":"Service Unavailable"}}}},"/towary/atrybuty":{"get":{"tags":["Towary"],"summary":"Zwraca listę atrybutów przypisanych do towaru.","parameters":[{"name":"id","in":"query","description":"ID towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (Twr_Kod).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuItem"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuItem"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuItem"}}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/TowarResponse"}}}},"503":{"description":"Service Unavailable"}}},"delete":{"tags":["Towary"],"summary":"Usuwa atrybut przypisany do towaru przez COM Optimy.","parameters":[{"name":"id","in":"query","description":"ID towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (Twr_Kod).","schema":{"type":"string"}},{"name":"kodAtrybutu","in":"query","description":"Kod definicji atrybutu (DeA_Kod) do usunięcia.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"}}}},"503":{"description":"Service Unavailable"}}}},"/towary/grupy":{"get":{"tags":["Towary"],"summary":"Zwraca listę grup towarowych przypisanych do towaru.","parameters":[{"name":"id","in":"query","description":"ID towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (Twr_Kod).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowaru"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowaru"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowaru"}}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}}}}}},"post":{"tags":["Towary"],"summary":"Przypisuje towar do grupy towarowej przez COM Optimy.\nTowar może należeć do wielu grup jednocześnie.","parameters":[{"name":"id","in":"query","description":"ID towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (Twr_Kod).","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DodajGrupeTowaru"}},"text/json":{"schema":{"$ref":"#/components/schemas/DodajGrupeTowaru"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/DodajGrupeTowaru"}}}},"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}}}},"503":{"description":"Service Unavailable"}}},"delete":{"tags":["Towary"],"summary":"Usuwa przypisanie towaru do grupy towarowej przez COM Optimy.","parameters":[{"name":"id","in":"query","description":"ID towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (Twr_Kod).","schema":{"type":"string"}},{"name":"kodGrupy","in":"query","description":"Kod grupy towarowej (TwG_Kod) do odłączenia.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}}}},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/GrupaTowaryResponse"}}}},"503":{"description":"Service Unavailable"}}}},"/towary/ceny":{"get":{"tags":["Towary"],"summary":"Zwraca cennik towaru z CDN.TwrCeny.","description":"Wymagany jest dokładnie jeden identyfikator towaru: `id` lub `kod`.\n\n| Parametr | Kolumna DB  | Porównanie | Uwagi                                         |\n|----------|-------------|------------|-----------------------------------------------|\n| id       | Twr_TwrId   | =          | bezpośredni identyfikator towaru              |\n| kod      | Twr_Kod     | =          | kod skrócony; wyznacza Twr_TwrId wewnętrznie  |\n\nWyniki z `CDN.TwrCeny` filtrowane są po wyliczonym `TwC_TwrID`.","parameters":[{"name":"id","in":"query","description":"Identyfikator towaru: `Twr_TwrId = ?`.","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod skrócony towaru: `Twr_Kod = ?` (zamieniony na wielkie litery). Używany gdy brak `id`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista pozycji cennika towaru.","content":{"text/plain":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"text/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}}}},"400":{"description":"Brak identyfikatora lub towar nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"put":{"tags":["Towary"],"summary":"Aktualizuje cennik towaru przez COM Optimy.","description":"Wymagany jest dokładnie jeden identyfikator towaru: `id` lub `kod`.\nBody to tablica pozycji cennika — identyfikatorem każdej pozycji jest `Numer` (`TwC_TwCNumer`).\nPola o wartości `null` w pozycji nie są zmieniane.\n\n| Param query | Kolumna DB | Porównanie |\n|-------------|------------|------------|\n| id          | Twr_TwrId  | =          |\n| kod         | Twr_Kod    | =          |","parameters":[{"name":"id","in":"query","description":"Identyfikator towaru: `Twr_TwrId = ?`.","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod skrócony towaru: `Twr_Kod = ?`. Używany gdy brak `id`.","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AktualizacjaCeny"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AktualizacjaCeny"}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AktualizacjaCeny"}}}}},"responses":{"200":{"description":"Cennik zaktualizowany pomyślnie — zwraca zmienione pozycje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}}}},"400":{"description":"Błąd walidacji, towar nie istnieje lub błąd COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Brak aktywnej sesji Optimy lub przekroczono limit kolejki/czas operacji COM.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/CennikResponse"}}}}}}},"/towary/ean":{"get":{"tags":["Towary"],"summary":"Zwraca kody EAN towaru z CDN.TwrEan.","parameters":[{"name":"id","in":"query","description":"ID towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (Twr_Kod).","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista kodów EAN towaru (może być pusta)."},"400":{"description":"Brak identyfikatora lub towar nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Towary"],"summary":"Dodaje nowy kod EAN dla towaru do CDN.TwrEan.","parameters":[{"name":"id","in":"query","description":"ID towaru (Twr_TwrId).","schema":{"type":"integer","format":"int32"}},{"name":"kod","in":"query","description":"Kod towaru (Twr_Kod).","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowyEan"}},"text/json":{"schema":{"$ref":"#/components/schemas/NowyEan"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NowyEan"}}}},"responses":{"200":{"description":"Kod EAN dodany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}}}},"400":{"description":"Błąd walidacji, towar nie istnieje lub EAN już przypisany do tego towaru.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/towary/ean/{id}":{"put":{"tags":["Towary"],"summary":"Aktualizuje kod EAN w CDN.TwrEan.","parameters":[{"name":"id","in":"path","description":"ID rekordu EAN (TwE_TwEId).","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaEan"}},"text/json":{"schema":{"$ref":"#/components/schemas/AktualizacjaEan"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/AktualizacjaEan"}}}},"responses":{"200":{"description":"Kod EAN zaktualizowany pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}}}},"400":{"description":"Błąd walidacji, brak pól lub rekord nie istnieje.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Towary"],"summary":"Usuwa kod EAN z CDN.TwrEan.","parameters":[{"name":"id","in":"path","description":"ID rekordu EAN (TwE_TwEId).","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Kod EAN usunięty pomyślnie.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}}}},"400":{"description":"Rekord EAN o podanym ID nie istnieje lub błąd SQL.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/EanResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/wydzialy":{"get":{"tags":["Wydziały"],"summary":"Zwraca drzewo wydziałów z CDN.Dzialy.\nOdpowiedź zawiera korzenie drzewa z rekurencyjnie zagnieżdżonymi podwydziałami (pole Dzieci).\nDomyślnie zwracane są tylko aktywne wydziały (DZL_Nieaktywny=0); parametr `wszystkie` włącza też nieaktywne.\nFiltry dotyczą węzła startowego — zwracany jest pasujący węzeł wraz z całym podrzędnym poddrzewem.\nFiltry można łączyć (AND).","parameters":[{"name":"kod","in":"query","description":"Kod wydziału (DZL_Kod) — dokładne dopasowanie, wielkość liter bez znaczenia.","schema":{"type":"string"}},{"name":"symbol","in":"query","description":"Symbol wydziału (DZL_Symbol) — dokładne dopasowanie, wielkość liter bez znaczenia.","schema":{"type":"string"}},{"name":"wszystkie","in":"query","description":"Jeśli `true`, zwraca również nieaktywne wydziały (DZL_Nieaktywny=1).","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Drzewo wydziałów.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/WydzialyResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/WydzialyResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/WydzialyResponse"}}}},"401":{"description":"Brak lub nieprawidłowy token Bearer.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Token nie posiada wymaganego scope.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}},"text/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"components":{"schemas":{"AdresBatchDto":{"type":"object","properties":{"ulica":{"type":"string","nullable":true},"nrDomu":{"type":"string","nullable":true},"nrLokalu":{"type":"string","nullable":true},"kodPocztowy":{"type":"string","nullable":true},"poczta":{"type":"string","nullable":true},"miasto":{"type":"string","nullable":true},"gmina":{"type":"string","nullable":true},"powiat":{"type":"string","nullable":true},"wojewodztwo":{"type":"string","nullable":true},"kraj":{"type":"string","nullable":true},"dodatkowe":{"type":"string","nullable":true}},"additionalProperties":false,"description":"Dane adresowe na dokumencie batch (podmiot lub odbiorca)."},"AdresPracownikaBatchDto":{"type":"object","properties":{"kodPocztowy":{"maxLength":10,"type":"string","description":"Kod pocztowy bez kreski, np. `00001`.","nullable":true},"kodPocztowyZKreska":{"maxLength":10,"type":"string","description":"Kod pocztowy z kreską, np. `00-001`. Gdy podany — nadpisuje `KodPocztowy`.","nullable":true},"kraj":{"maxLength":40,"type":"string","description":"Kraj, np. `Polska`.","nullable":true},"ulica":{"maxLength":40,"type":"string","description":"Ulica bez numeru.","nullable":true},"nrDomu":{"maxLength":10,"type":"string","description":"Numer domu.","nullable":true},"nrLokalu":{"maxLength":10,"type":"string","description":"Numer lokalu.","nullable":true},"miasto":{"maxLength":40,"type":"string","description":"Miasto.","nullable":true},"poczta":{"maxLength":40,"type":"string","description":"Miejscowość poczty gdy inna niż miasto.","nullable":true},"powiat":{"maxLength":40,"type":"string","description":"Powiat.","nullable":true},"gmina":{"maxLength":40,"type":"string","description":"Gmina.","nullable":true},"wojewodztwo":{"maxLength":40,"type":"string","description":"Województwo.","nullable":true},"dodatkowe":{"maxLength":200,"type":"string","description":"Dodatkowy opis adresu.","nullable":true}},"additionalProperties":false,"description":"Adres pracownika (zamieszkania, korespondencyjny lub zameldowania)."},"AdresPracownikaDto":{"type":"object","properties":{"kodPocztowy":{"maxLength":10,"type":"string","description":"Kod pocztowy.","nullable":true},"kodPocztowyZKreska":{"maxLength":6,"type":"string","description":"Kod pocztowy w formacie z myślnikiem, np. `00-001`.\nAlternatywa dla `KodPocztowy` — gdy podane oba, zapisywane są oba warianty.","nullable":true},"kraj":{"maxLength":40,"type":"string","description":"Kraj — pełna nazwa, np. `Polska`.","nullable":true},"ulica":{"maxLength":40,"type":"string","description":"Nazwa ulicy bez numeru.","nullable":true},"nrDomu":{"maxLength":10,"type":"string","description":"Numer domu.","nullable":true},"nrLokalu":{"maxLength":10,"type":"string","description":"Numer lokalu.","nullable":true},"miasto":{"maxLength":40,"type":"string","description":"Miejscowość.","nullable":true},"poczta":{"maxLength":40,"type":"string","description":"Miejscowość poczty, gdy różna od miejscowości zamieszkania.","nullable":true},"powiat":{"maxLength":40,"type":"string","description":"Powiat.","nullable":true},"gmina":{"maxLength":40,"type":"string","description":"Gmina.","nullable":true},"wojewodztwo":{"maxLength":40,"type":"string","description":"Województwo.","nullable":true},"dodatkowe":{"maxLength":100,"type":"string","description":"Dodatkowe informacje adresowe.","nullable":true}},"additionalProperties":false,"description":"Dane adresowe pracownika. Wszystkie pola są opcjonalne."},"AdresRequest":{"type":"object","properties":{"ulica":{"type":"string","nullable":true},"nrDomu":{"type":"string","nullable":true},"nrLokalu":{"type":"string","nullable":true},"kodPocztowy":{"type":"string","nullable":true},"poczta":{"type":"string","nullable":true},"miasto":{"type":"string","nullable":true},"gmina":{"type":"string","nullable":true},"powiat":{"type":"string","nullable":true},"wojewodztwo":{"type":"string","nullable":true},"kraj":{"type":"string","nullable":true},"dodatkowe":{"type":"string","nullable":true}},"additionalProperties":false,"description":"Dane adresowe odpowiadające interfejsowi IAdres COM Optimy."},"AktualizacjaAtrybutu":{"type":"object","properties":{"kod":{"maxLength":20,"type":"string","description":"Kod definicji atrybutu — max 20 znaków.","nullable":true},"nazwa":{"maxLength":50,"type":"string","description":"Nazwa atrybutu.","nullable":true},"format":{"maximum":5,"minimum":1,"type":"integer","description":"Format danych: 1=tekst, 2=liczba, 3=lista, 4=data, 5=binarna.","format":"int32","nullable":true},"czyKopiowacFA":{"type":"boolean","description":"Czy dokleić wartość atrybutu do opisu elementu na fakturze.","nullable":true},"czyKod":{"type":"boolean","description":"Czy kod atrybutu ma być wyświetlany przed wartością.","nullable":true},"zalezny":{"type":"boolean","description":"Czy atrybut zależny od kontrahenta.","nullable":true},"czyPrzenosic":{"type":"boolean","description":"Czy przenosić atrybut na transakcje.","nullable":true},"czyDrukowac":{"type":"boolean","description":"Czy drukować atrybut na transakcjach.","nullable":true},"czyKopiowacDoVAT":{"type":"boolean","description":"Czy kopiować atrybut do rejestru VAT.","nullable":true},"eSklep":{"type":"boolean","description":"Czy udostępniać atrybut w e-Sklepie.","nullable":true},"czyPrzenosicNaDostawy":{"type":"boolean","description":"Czy przenosić atrybut na dostawy.","nullable":true},"czyObowiazkowyDostawy":{"type":"boolean","description":"Czy atrybut jest obowiązkowy na dostawach.","nullable":true},"analizyBI":{"type":"boolean","description":"Czy przenosić atrybut do Analiz BI.","nullable":true},"udostepniajWMobile":{"type":"boolean","description":"Czy udostępniać atrybut w aplikacji Mobile.","nullable":true},"pozwalajNaEdycje":{"type":"boolean","description":"Czy pozwalać na edycję wartości w aplikacji Mobile.","nullable":true},"pozwalajNaEdycjeESklep":{"type":"boolean","description":"Czy pozwalać na edycję wartości w e-Sklepie.","nullable":true},"jpkDostepnyFA":{"type":"boolean","description":"Czy atrybut widoczny na fakturach JPK_FA.","nullable":true},"jpkDostepnyVAT":{"type":"boolean","description":"Czy atrybut widoczny w rejestrach VAT (JPK_VAT).","nullable":true},"jpkDostepnyFAVAT":{"type":"boolean","description":"Czy atrybut widoczny w rejestrach VAT i na fakturach JPK_FA łącznie.","nullable":true},"nieaktywny":{"type":"boolean","description":"Czy atrybut jest nieaktywny (ukryty w interfejsie Optimy).","nullable":true}},"additionalProperties":false,"description":"Dane do aktualizacji definicji atrybutu. Pola o wartości `null` nie są zmieniane."},"AktualizacjaCeny":{"required":["numer"],"type":"object","properties":{"numer":{"type":"integer","description":"Numer cennika — identyfikuje który cennik zaktualizować. Pole bazy: `TwC_TwCNumer`.\nOdpowiada `DfC_Lp` z CDN.DefCeny (definicja ceny musi istnieć).","format":"int32","example":1},"wartosc":{"type":"number","description":"Nowa wartość ceny (netto lub brutto — zależy od `Typ`). Pole bazy: `TwC_Wartosc`.","format":"double","nullable":true,"example":12.5},"typ":{"maximum":2,"minimum":1,"type":"integer","description":"Typ ceny. Pole bazy: `TwC_Typ`.\n- **1** — netto\n- **2** — brutto","format":"int32","nullable":true,"example":1},"waluta":{"maxLength":3,"type":"string","description":"Symbol waluty — max 3 znaki. Pole bazy: `TwC_Waluta`.","nullable":true,"example":"PLN"},"marza":{"type":"number","description":"Zakładana marża %. Pole bazy: `TwC_Marza`.","format":"double","nullable":true},"punkty":{"type":"integer","description":"Punkty programu lojalnościowego. Pole bazy: `TwC_Punkty`.","format":"int32","nullable":true}},"additionalProperties":false,"description":"Pozycja cennika towaru do aktualizacji (CDN.TwrCeny)."},"AktualizacjaDefCeny":{"type":"object","properties":{"nazwa":{"maxLength":20,"type":"string","description":"Nazwa ceny — max 20 znaków. Pole bazy: `DfC_Nazwa`.","nullable":true},"typ":{"maximum":2,"minimum":1,"type":"integer","description":"Typ ceny. Pole bazy: `DfC_Typ`.\n- **1** — netto\n- **2** — brutto","format":"int32","nullable":true},"aktualizacja":{"type":"boolean","description":"Czy cena ma być automatycznie aktualizowana przy zakupie. Pole bazy: `DfC_Aktualizacja` (0/1).","nullable":true},"marza":{"type":"number","description":"Domyślna marża dla ceny w %. Pole bazy: `DfC_Marza`.","format":"double","nullable":true},"zaokraglenie":{"type":"number","description":"Zaokrąglenie ceny. Pole bazy: `DfC_Zaokraglenie`.","format":"double","nullable":true},"offset":{"type":"number","description":"Wartość dodawana do ceny po zaokrągleniu. Pole bazy: `DfC_Offset`.","format":"double","nullable":true},"waluta":{"maxLength":3,"type":"string","description":"Domyślna waluta — max 3 znaki. Pole bazy: `DfC_Waluta`.","nullable":true},"nieaktywna":{"type":"boolean","description":"Czy cena jest nieaktywna. Pole bazy: `DfC_Nieaktywna` (0/1).","nullable":true}},"additionalProperties":false,"description":"Dane do aktualizacji definicji ceny (CDN.DefCeny).\nPola o wartości `null` nie są zmieniane."},"AktualizacjaDokumentuHaMagRequest":{"type":"object","properties":{"numerObcy":{"type":"string","description":"Numer obcy dokumentu (np. numer faktury dostawcy).","nullable":true},"uwagi":{"type":"string","description":"Uwagi do dokumentu.","nullable":true},"termin":{"type":"string","description":"Termin zapłaty / realizacji / ważności.","format":"date-time","nullable":true},"dataWys":{"type":"string","description":"Data wystawienia dokumentu.","format":"date-time","nullable":true},"dataSprzedazy":{"type":"string","description":"Data sprzedaży / operacji.","format":"date-time","nullable":true},"dataDok":{"type":"string","description":"Data dokumentu.","format":"date-time","nullable":true},"odbNazwa1":{"type":"string","description":"Pierwszy wiersz nazwy odbiorcy.","nullable":true},"odbNazwa2":{"type":"string","description":"Drugi wiersz nazwy odbiorcy.","nullable":true},"odbNazwa3":{"type":"string","description":"Trzeci wiersz nazwy odbiorcy.","nullable":true},"odbAdres":{"$ref":"#/components/schemas/AdresRequest"},"odbEmail":{"type":"string","description":"E-mail odbiorcy.","nullable":true},"odbTelefon":{"type":"string","description":"Telefon odbiorcy.","nullable":true},"odebral":{"type":"string","description":"Osoba, która odebrała dokument.","nullable":true},"nrKSeF":{"type":"string","description":"Numer KSeF dokumentu (TrN_NrKSeF).","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia przez KSeF (TrN_KSeFDataPrzyjecia).","format":"date-time","nullable":true},"pozycje":{"type":"array","items":{"$ref":"#/components/schemas/PozycjaDokumentuRequest"},"description":"Pozycje dokumentu.\nnull = nie zmieniaj pozycji.\nLista (w tym pusta) = zastąp wszystkie pozycje podanymi — tylko dla dokumentów w buforze.","nullable":true}},"additionalProperties":false,"description":"Dane do aktualizacji istniejącego dokumentu handlowo-magazynowego.\nWszystkie pola są opcjonalne — null oznacza \"nie zmieniaj\"."},"AktualizacjaEan":{"type":"object","properties":{"ean":{"maxLength":40,"type":"string","description":"Kod EAN — max 40 znaków (TwE_EAN).","nullable":true},"opis":{"maxLength":100,"type":"string","description":"Opis kodu EAN — max 100 znaków (TwE_Opis).","nullable":true},"domyslny":{"type":"boolean","description":"Czy to domyślny kod EAN towaru (TwE_Domyslny).","nullable":true},"jm":{"maxLength":20,"type":"string","description":"Jednostka miary — max 20 znaków (TwE_JM).","nullable":true}},"additionalProperties":false,"description":"Dane do aktualizacji kodu EAN. Pola o wartości `null` nie są zmieniane."},"AktualizacjaGrupyKontrahentow":{"type":"object","properties":{"nazwa":{"maxLength":32,"type":"string","description":"Nowa nazwa grupy (Gru_Nazwa) — max 32 znaki.","nullable":true},"opis":{"maxLength":128,"type":"string","description":"Nowy opis grupy (Gru_Opis) — max 128 znaków.","nullable":true}},"additionalProperties":false,"description":"Dane do aktualizacji grupy kontrahentów. Pola null nie są zmieniane."},"AktualizacjaGrupyTowarowejRequest":{"type":"object","properties":{"kod":{"maxLength":50,"type":"string","description":"Nowy kod grupy (TwG_Kod). Null = nie zmieniaj.","nullable":true},"nazwa":{"maxLength":255,"type":"string","description":"Nowa nazwa grupy (TwG_Nazwa). Null = nie zmieniaj.","nullable":true},"zmienGrupeNadrzedna":{"type":"boolean","description":"Gdy true — zmienia grupę nadrzędną według pola KodGrupyNadrzednej.\nGdy false (domyślnie) — hierarchia pozostaje bez zmian."},"kodGrupyNadrzednej":{"maxLength":50,"type":"string","description":"Kod nowej grupy nadrzędnej. Używany tylko gdy ZmienGrupeNadrzedna = true.\nNull lub puste = przenieś na poziom główny (GRONumer=0).\nWartość = przenieś pod wskazaną grupę.","nullable":true}},"additionalProperties":false},"AktualizacjaKategoriiRequest":{"type":"object","properties":{"typ":{"type":"integer","description":"Typ kategorii (Kat_Typ): 1=koszty, 2=przychody. Null = nie zmieniaj.","format":"int32","nullable":true},"opis":{"type":"string","description":"Opis kategorii (Kat_Opis, maks. 50 znaków). Null = nie zmieniaj.","nullable":true},"kolumnaKPIR":{"type":"integer","description":"Numer kolumny KPIR (Kat_KolumnaKPIR), 0-7 — znaczenie jak w `kolumnaKPIR`.\nNull = nie zmieniaj.","format":"int32","nullable":true},"stawka":{"type":"number","description":"Domyślna stawka VAT % (Kat_Stawka). Null = nie zmieniaj.","format":"double","nullable":true},"flaga":{"type":"integer","description":"Typ stawki VAT (Kat_Flaga): 1=zwolniona, 2=opodatkowana, 3=zaniżona, 4=nie podlega. Null = nie zmieniaj.","format":"int32","nullable":true},"odliczenia":{"type":"integer","description":"Odliczenia VAT od zakupów (Kat_Odliczenia): 0=nie odliczać, 1=odliczać, 2=warunkowo. Null = nie zmieniaj.","format":"int32","nullable":true},"rodzajZakupu":{"type":"integer","description":"Rodzaj zakupu (Kat_RodzajZakupu), 1-7 — znaczenie jak w `rodzajZakupu`. Null = nie zmieniaj.","format":"int32","nullable":true},"kontoSegmentWN":{"type":"string","description":"Segment konta księgowego Winien (Kat_KontoSegmentWN, maks. 50 znaków). Null = nie zmieniaj.","nullable":true},"kontoSegmentMA":{"type":"string","description":"Segment konta księgowego Ma (Kat_KontoSegmentMA, maks. 50 znaków). Null = nie zmieniaj.","nullable":true},"podzielOdliczenia":{"type":"boolean","description":"Czy dzielić odliczenia VAT proporcją (Kat_PodzielOdliczenia). Null = nie zmieniaj.","nullable":true},"podzielOdliczeniaProcent":{"type":"number","description":"Procent podziału odliczeń VAT (Kat_PodzielOdliczeniaProcent), 0-100. Null = nie zmieniaj.","format":"double","nullable":true},"ksiegujWKoszty":{"type":"boolean","description":"Czy księgować w koszty proporcją (Kat_KsiegujWKoszty). Null = nie zmieniaj.","nullable":true},"ksiegujWKosztyProcent":{"type":"number","description":"Procent księgowania w koszty (Kat_KsiegujWKosztyProcent), 0-100. Null = nie zmieniaj.","format":"double","nullable":true}},"additionalProperties":false,"description":"Żądanie edycji istniejącej kategorii — identyfikowanej po kodzie (patrz parametry endpointu). Pola o wartości null nie są zmieniane."},"AktualizacjaKontrahentaRequest":{"type":"object","properties":{"nazwa1":{"maxLength":50,"type":"string","description":"Pierwsza linia nazwy kontrahenta. Pole bazy: `Knt_Nazwa1`.","nullable":true,"example":"Kowalski Jan Nowe Imię"},"nazwa2":{"maxLength":50,"type":"string","description":"Druga linia nazwy kontrahenta. Pole bazy: `Knt_Nazwa2`.","nullable":true,"example":"Usługi transportowe"},"nazwa3":{"maxLength":250,"type":"string","description":"Trzecia linia nazwy kontrahenta. Pole bazy: `Knt_Nazwa3`.","nullable":true},"nipKraj":{"maxLength":2,"type":"string","description":"Dwuliterowy prefiks kraju NIP (ISO 3166-1 alpha-2). Wymagany jeśli podano `Nip`.\nPole bazy: `Knt_NipKraj`.","nullable":true,"example":"PL"},"nip":{"maxLength":15,"type":"string","description":"Numer NIP bez kresek i prefiksu kraju. Pole bazy: `Knt_Nip`.","nullable":true,"example":"1234567890"},"ulica":{"maxLength":40,"type":"string","description":"Ulica (bez numeru domu). Pole bazy: `Knt_Ulica`.","nullable":true,"example":"Marszałkowska"},"nrDomu":{"maxLength":10,"type":"string","description":"Numer domu. Pole bazy: `Knt_NrDomu`.","nullable":true,"example":"12A"},"kodPocztowy":{"maxLength":10,"type":"string","description":"Kod pocztowy w formacie XX-XXX. Pole bazy: `Knt_KodPocztowy`.","nullable":true,"example":"00-001"},"poczta":{"maxLength":40,"type":"string","description":"Miejscowość poczty (może różnić się od miasta). Pole bazy: `Knt_Poczta`.","nullable":true,"example":"Warszawa"},"miasto":{"maxLength":40,"type":"string","description":"Miasto. Pole bazy: `Knt_Miasto`.","nullable":true,"example":"Warszawa"},"kraj":{"maxLength":40,"type":"string","description":"Kraj — pełna nazwa. Pole bazy: `Knt_Kraj`.","nullable":true,"example":"Polska"},"gmina":{"maxLength":40,"type":"string","description":"Gmina. Pole bazy: `Knt_Gmina`.","nullable":true,"example":"Warszawa"},"powiat":{"maxLength":40,"type":"string","description":"Powiat. Pole bazy: `Knt_Powiat`.","nullable":true,"example":"Warszawa"},"wojewodztwo":{"maxLength":40,"type":"string","description":"Województwo. Pole bazy: `Knt_Wojewodztwo`.","nullable":true,"example":"mazowieckie"},"email":{"maxLength":200,"type":"string","description":"Adres e-mail kontrahenta. Pole bazy: `Knt_Email`.","nullable":true,"example":"jan.kowalski@example.com"},"telefon":{"maxLength":20,"type":"string","description":"Numer telefonu. Pole bazy: `Knt_Telefon1`.","nullable":true,"example":"+48 22 123 45 67"},"telefon2":{"maxLength":20,"type":"string","description":"Drugi numer telefonu. Pole bazy: `Knt_Telefon2`.","nullable":true,"example":"+48 600 123 456"},"gln":{"maxLength":13,"type":"string","description":"Numer GLN (Global Location Number) — 13 cyfr. Pole bazy: `Knt_GLN`.","nullable":true},"ksefIdWewnetrzny":{"maxLength":20,"type":"string","description":"Wewnętrzny identyfikator KSeF. Pole bazy: `Knt_KsefIdWewnetrzny`.","nullable":true}},"additionalProperties":false,"description":"Dane do aktualizacji istniejącego kontrahenta w Comarch ERP Optima.\nPola o wartości `null` nie są zmieniane. Przekaż pusty string (`\"\"`) aby wyczyścić pole tekstowe."},"AktualizacjaMagazynu":{"type":"object","properties":{"nazwa":{"maxLength":50,"type":"string","description":"Nazwa magazynu — max 50 znaków.","nullable":true},"typ":{"maximum":3,"minimum":1,"type":"integer","description":"Typ magazynu:\n- **1** — lokalny\n- **2** — odległy\n- **3** — serwisowy","format":"int32","nullable":true},"opis":{"maxLength":254,"type":"string","description":"Dodatkowy opis magazynu — max 254 znaki.","nullable":true},"magSeria":{"maxLength":5,"type":"string","description":"Domyślna seria dokumentów dla magazynu (Mag_Rejestr) — max 5 znaków.","nullable":true},"nieaktywny":{"type":"boolean","description":"Czy magazyn jest nieaktywny.","nullable":true},"unijny":{"type":"boolean","description":"Czy magazyn unijny (poza granicami Polski).","nullable":true},"kraj":{"maxLength":2,"type":"string","description":"Kod kraju magazynu unijnego — max 2 znaki, np. \"DE\".","nullable":true},"kodTransakcji":{"maxLength":2,"type":"string","description":"Kod transakcji — max 2 znaki.","nullable":true},"twCNumer":{"type":"integer","description":"Numer TwC.","format":"int32","nullable":true},"konto":{"type":"string","description":"Konto księgowe.","nullable":true},"adres":{"type":"integer","description":"ID adresu magazynu.","format":"int32","nullable":true}},"additionalProperties":false,"description":"Dane do aktualizacji magazynu. Pola o wartości `null` nie są zmieniane."},"AktualizacjaTowaruRequest":{"type":"object","properties":{"nazwa":{"maxLength":255,"type":"string","description":"Nazwa towaru (Twr_Nazwa).","nullable":true},"kod":{"maxLength":50,"type":"string","description":"Nowy kod towaru (Twr_Kod).","nullable":true},"ean":{"maxLength":40,"type":"string","description":"Kod kreskowy EAN (Twr_EAN).","nullable":true},"jm":{"maxLength":20,"type":"string","description":"Jednostka miary (Twr_JM).","nullable":true},"stawka":{"type":"string","description":"Stawka VAT (Twr_Stawka). Przyjmuje liczbę (23, 8, 5, 0) lub symbol \"ZW\" / \"NP\".\nGdy podano \"ZW\" lub \"NP\", Flaga jest wyznaczana automatycznie (chyba że podano ją jawnie).","nullable":true},"flaga":{"type":"integer","description":"Flaga stawki VAT (Twr_Flaga). 1=ZW, 2=Opodatkowana, 3=Zaniżona, 4=NP. Opcjonalna.","format":"int32","nullable":true},"typ":{"type":"integer","description":"Typ towaru (Twr_Typ). 0 = usługa, 1 = towar fizyczny.","format":"int32","nullable":true},"masa":{"type":"number","description":"Masa towaru w kg (Twr_Masa).","format":"double","nullable":true},"opis":{"maxLength":2000,"type":"string","description":"Opis towaru (Twr_Opis).","nullable":true},"kodGrupy":{"maxLength":40,"type":"string","description":"Kod grupy towarowej z CDN.TwrGrupy (Twg_Kod).\nNiepuste = przypisz grupę. Null = nie zmieniaj.","nullable":true},"cenaNetto1":{"type":"number","description":"Wartość netto ceny nr 1 (Ceny[1].WartoscNetto).","format":"double","nullable":true},"cenaBrutto4":{"type":"number","description":"Wartość brutto ceny nr 4 (Ceny[4].WartoscBrutto).","format":"double","nullable":true},"atrybuty":{"type":"array","items":{"$ref":"#/components/schemas/NowyAtrybutTowaru"},"description":"Atrybuty towaru do upsert — jeśli atrybut już istnieje, zostanie zaktualizowany;\njeśli nie istnieje, zostanie dodany. Null lub pusta lista = atrybuty bez zmian.","nullable":true}},"additionalProperties":false},"AktualizacjaZapisuKbRequest":{"type":"object","properties":{"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod). Null = bez zmiany.","nullable":true},"dataDok":{"type":"string","description":"Data dokumentu. Null = bez zmiany.","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin płatności. Null = bez zmiany.","format":"date-time","nullable":true},"przychod":{"type":"number","description":"Nowa kwota przychodu (KP). Podaj > 0 aby zmienić kwotę i kierunek na KP. Wyklucza się z Rozchod.","format":"double","nullable":true},"rozchod":{"type":"number","description":"Nowa kwota rozchodu (KW). Podaj > 0 aby zmienić kwotę i kierunek na KW. Wyklucza się z Przychod.","format":"double","nullable":true},"numerObcy":{"type":"string","description":"Numer obcy. Null = bez zmiany.","nullable":true},"rachunekNr":{"type":"string","description":"Numer rachunku bankowego. Null = bez zmiany.","nullable":true},"iban":{"type":"boolean","description":"Czy numer rachunku w formacie IBAN. Null = bez zmiany.","nullable":true},"opis":{"type":"string","description":"Opis zapisu. Null = bez zmiany.","nullable":true}},"additionalProperties":false,"description":"Żądanie aktualizacji zapisu kasowo-bankowego. Tylko podane pola (różne od null) zostaną zmienione."},"AtrybutBatchDto":{"required":["kod","wartosc"],"type":"object","properties":{"kod":{"minLength":1,"type":"string","description":"Kod definicji atrybutu (dea_Kod)."},"wartosc":{"minLength":1,"type":"string","description":"Wartość atrybutu."}},"additionalProperties":false,"description":"Atrybut dokumentu w zadaniu batch."},"AtrybutDokumentuRequest":{"required":["kod","wartosc"],"type":"object","properties":{"kod":{"minLength":1,"type":"string","description":"Kod definicji atrybutu (dea_Kod).","example":"TEKST"},"wartosc":{"minLength":1,"type":"string","description":"Wartość atrybutu.","example":"Nr:XP123456"}},"additionalProperties":false,"description":"Pojedynczy atrybut dokumentu."},"AtrybutDto":{"type":"object","properties":{"kod":{"type":"string","nullable":true},"wartosc":{"type":"string","nullable":true}},"additionalProperties":false,"description":"Atrybut pozycji dokumentu."},"AtrybytResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"id":{"type":"integer","description":"ID definicji atrybutu (Atr_AtrId). Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"kod":{"type":"string","description":"Kod definicji atrybutu. Wypełniony tylko przy sukcesie.","nullable":true},"nazwa":{"type":"string","description":"Nazwa atrybutu. Wypełniona tylko przy sukcesie.","nullable":true},"typ":{"type":"integer","description":"Typ atrybutu: 1=towar, 2=kontrahent, 3=środek trwały, 4=dokument.\nWypełniony tylko przy sukcesie.","format":"int32","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na definicji atrybutu."},"BatchWartoscAtrybutuResponse":{"type":"object","properties":{"lacznie":{"type":"integer","description":"Łączna liczba pozycji w żądaniu.","format":"int32"},"sukces":{"type":"integer","description":"Liczba pozycji zakończonych sukcesem.","format":"int32"},"bledy":{"type":"integer","description":"Liczba pozycji zakończonych błędem.","format":"int32"},"wyniki":{"type":"array","items":{"$ref":"#/components/schemas/WartoscAtrybutuResponse"},"description":"Wyniki per pozycja — w tej samej kolejności co żądanie.","nullable":true}},"additionalProperties":false,"description":"Zbiorczy wynik operacji dodawania wielu wartości atrybutów."},"BazaItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator bazy (Baz_BazID).","format":"int32"},"nazwa":{"type":"string","description":"Nazwa firmy (Baz_Nazwa).","nullable":true},"nip":{"type":"string","description":"NIP firmy (Baz_NIP). Może być null.","nullable":true},"opis":{"type":"string","description":"Opis bazy (Baz_Opis).","nullable":true},"nazwaBazy":{"type":"string","description":"Nazwa bazy danych na serwerze SQL (Baz_NazwaBazy — pole wyliczane).","nullable":true},"nazwaSerwera":{"type":"string","description":"Nazwa serwera SQL (Baz_NazwaSerwera — pole wyliczane).","nullable":true}},"additionalProperties":false,"description":"Aktywna baza firmowa z CDN.Bazy (baza konfiguracyjna)."},"CenaItem":{"type":"object","properties":{"numer":{"type":"integer","description":"Numer cennika. Pole bazy: `TwC_TwCNumer`.","format":"int32"},"nazwaCeny":{"type":"string","description":"Nazwa cennika pobrana z CDN.DefCeny (`DfC_Nazwa`).","nullable":true},"typ":{"type":"integer","description":"Typ ceny: 1=netto, 2=brutto. Pole bazy: `TwC_Typ`.","format":"int32"},"wartosc":{"type":"number","description":"Wartość ceny (netto lub brutto — zależy od `Typ`). Pole bazy: `TwC_Wartosc`.","format":"double"},"wartoscNetto":{"type":"number","description":"Wartość netto przeliczona przez COM Optimy.","format":"double"},"wartoscBrutto":{"type":"number","description":"Wartość brutto przeliczona przez COM Optimy.","format":"double"},"waluta":{"type":"string","description":"Symbol waluty. Pole bazy: `TwC_Waluta`.","nullable":true},"marza":{"type":"number","description":"Marża %. Pole bazy: `TwC_Marza`.","format":"double"},"marzaWStu":{"type":"number","description":"Marża w stu. Pole bazy: `TwC_MarzaWStu`.","format":"double"},"punkty":{"type":"integer","description":"Punkty programu lojalnościowego. Pole bazy: `TwC_Punkty`.","format":"int32"},"aktualizacja":{"type":"integer","description":"Czy aktualizować cenę przy zakupie: 0=nie, 1=tak. Pole bazy: `TwC_Aktualizacja`.","format":"int32"}},"additionalProperties":false,"description":"Pojedyncza pozycja cennika towaru zwracana po aktualizacji (CDN.TwrCeny)."},"CennikResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"kodTowaru":{"type":"string","description":"Kod towaru.","nullable":true},"ceny":{"type":"array","items":{"$ref":"#/components/schemas/CenaItem"},"description":"Lista pozycji cennika.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na cenniku towaru."},"CennikZbiorczyResponse":{"type":"object","properties":{"definicje":{"type":"array","items":{"$ref":"#/components/schemas/DefCenyCennik"},"description":"Legenda kolumn cennikowych — mapowanie Lp → Nazwa.","nullable":true},"dane":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"Wiersze cennika. Każdy wiersz zawiera pola: Id, Kod, EAN, Nazwa\noraz dynamiczne kolumny Cena{Lp} (null gdy brak ceny dla towaru).","nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (1-based).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba towarów spełniających kryteria filtrów.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Wynik cennika zbiorczego. Pole `Dane` zawiera dynamiczne kolumny cennikowe\n— klucz `Cena{Lp}` odpowiada pozycji z listy `Definicje`."},"CentraResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/CentrumItem"},"description":"Korzenie drzewa (centra bez rodzica lub na poziomie głównym).","nullable":true},"lacznie":{"type":"integer","description":"Łączna liczba aktywnych centrów (wszystkich poziomów).","format":"int32"}},"additionalProperties":false,"description":"Odpowiedź endpointu GET /centra — drzewo aktywnych centrów kosztów."},"CentrumItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator centrum (CNT_CntId).","format":"int32"},"kod":{"type":"string","description":"Kod centrum (CNT_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa centrum (CNT_Nazwa).","nullable":true},"parentId":{"type":"integer","description":"ID centrum nadrzędnego (CNT_ParentId). Null dla korzenia i węzła \"brak\".","format":"int32","nullable":true},"adresWezla":{"type":"string","description":"Adres węzła w drzewie (CNT_AdresWezla).\nPrzykłady: \"0\" dla brak, \"1\" dla głównego, \"1.\" dla podcentrum pierwszego poziomu.","nullable":true},"poziom":{"type":"integer","description":"Poziom zagłębienia (CNT_Poziom): 0=brak, 1=główne, 2+=podcentra.","format":"int32"},"sciezka":{"type":"string","description":"Ścieżka nazw od korzenia, np. \"FIRMA > Produkcja > Spawalnia\".","nullable":true},"dzieci":{"type":"array","items":{"$ref":"#/components/schemas/CentrumItem"},"description":"Podrzędne centra tego węzła (rekurencyjnie).","nullable":true}},"additionalProperties":false,"description":"Węzeł drzewa centrów kosztów z CDN.Centra (CNT_Nieaktywny=0)."},"CzasPracyDzienItem":{"type":"object","properties":{"data":{"type":"string","description":"Data dnia.","format":"date-time"},"typDnia":{"type":"integer","description":"Typ dnia:\n- **1** — roboczy\n- **2** — wolny\n- **3** — świąteczny","format":"int32"},"typDniaOpis":{"type":"string","description":"Opis typu dnia (Roboczy / Wolny / Świąteczny).","nullable":true},"lp":{"type":"integer","description":"Numer porządkowy przedziału pracy w danym dniu — gdy dzień ma kilka przedziałów (np. praca zmianowa).","format":"int32"},"godzOd":{"type":"string","description":"Godzina rozpoczęcia pracy w formacie `HH:mm`. Null gdy brak.","nullable":true},"godzDo":{"type":"string","description":"Godzina zakończenia pracy w formacie `HH:mm`. Null gdy brak.","nullable":true},"strefa":{"type":"integer","description":"Identyfikator strefy czasu pracy.","format":"int32"},"dzial":{"type":"integer","description":"Identyfikator wydziału. Null gdy nie przypisano.","format":"int32","nullable":true},"projekt":{"type":"integer","description":"Identyfikator projektu. Null gdy nie przypisano.","format":"int32","nullable":true},"norma":{"type":"integer","description":"Norma czasu pracy w minutach.","format":"int32"},"praca":{"type":"integer","description":"Czas pracy w minutach.","format":"int32"},"symbol":{"type":"string","description":"Symbol (np. skrót nieobecności).","nullable":true},"nieobec":{"type":"string","description":"Opis nieobecności.","nullable":true},"typNieob":{"type":"integer","description":"Typ nieobecności.","format":"int32","nullable":true},"odbNadg":{"type":"integer","description":"Odbiór nadgodzin w minutach.","format":"int32"}},"additionalProperties":false,"description":"Pojedynczy wiersz planu lub czasu pracy pracownika (jeden przedział godzinowy w danym dniu)."},"CzasPracyResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string","nullable":true},"liczba":{"type":"integer","description":"Liczba wierszy (przedziałów godzinowych we wszystkich dniach).","format":"int32"},"dni":{"type":"array","items":{"$ref":"#/components/schemas/CzasPracyDzienItem"},"description":"Lista wierszy planu / czasu pracy.","nullable":true}},"additionalProperties":false,"description":"Wynik pobierania planu lub czasu pracy pracownika."},"DaneKadroweBatchDto":{"type":"object","properties":{"email":{"maxLength":127,"type":"string","description":"Służbowy adres e-mail. Pole bazy: `PRE_HDKEmail`.","nullable":true},"telefon1":{"maxLength":20,"type":"string","description":"Główny numer telefonu służbowego. Pole bazy: `PRE_HDKTelefon1`.","nullable":true},"telefon2":{"maxLength":20,"type":"string","description":"Dodatkowy numer telefonu służbowego. Pole bazy: `PRE_HDKTelefon2`.","nullable":true},"fax":{"maxLength":20,"type":"string","description":"Numer faksu.","nullable":true},"url":{"maxLength":200,"type":"string","description":"Strona WWW.","nullable":true},"uwagi":{"maxLength":500,"type":"string","description":"Dowolne uwagi kadrowe.","nullable":true},"prawoJazdy":{"type":"boolean","description":"Czy pracownik posiada prawo jazdy.\nAkceptuje `true`/`false` oraz `1`/`0`.","nullable":true},"prawoJazdyKat":{"maxLength":10,"type":"string","description":"Kategorie prawa jazdy, np. `B`, `B+E`.","nullable":true},"wypOsoba":{"maxLength":100,"type":"string","description":"Imię i nazwisko osoby wypadkowej.","nullable":true},"wypAdres":{"maxLength":200,"type":"string","description":"Adres osoby wypadkowej.","nullable":true},"wypTelefon":{"maxLength":20,"type":"string","description":"Telefon osoby wypadkowej.","nullable":true}},"additionalProperties":false,"description":"Dane kadrowe (kontaktowe i dodatkowe) pracownika."},"DaneKadroweDto":{"type":"object","properties":{"email":{"maxLength":200,"type":"string","description":"Adres e-mail.","nullable":true},"telefon1":{"maxLength":20,"type":"string","description":"Telefon główny.","nullable":true},"telefon2":{"maxLength":20,"type":"string","description":"Telefon dodatkowy.","nullable":true},"fax":{"maxLength":20,"type":"string","description":"Numer faksu.","nullable":true},"url":{"maxLength":200,"type":"string","description":"Adres strony WWW.","nullable":true},"uwagi":{"type":"string","description":"Uwagi dodatkowe.","nullable":true},"prawoJazdy":{"type":"boolean","description":"Czy pracownik posiada prawo jazdy.\nAkceptuje `true`/`false` oraz `1`/`0`.","nullable":true},"prawoJazdyKat":{"maxLength":20,"type":"string","description":"Kategoria prawa jazdy, np. `B`, `C`, `B+C`.","nullable":true},"wypOsoba":{"maxLength":100,"type":"string","description":"Imię i nazwisko osoby upoważnionej do odbioru wypłaty.","nullable":true},"wypAdres":{"maxLength":200,"type":"string","description":"Adres osoby upoważnionej do odbioru wypłaty.","nullable":true},"wypTelefon":{"maxLength":20,"type":"string","description":"Telefon osoby upoważnionej do odbioru wypłaty.","nullable":true}},"additionalProperties":false,"description":"Dane kontaktowe i kadrowe pracownika."},"DefCenaResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"id":{"type":"integer","description":"ID definicji ceny (DfC_DfCId). Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"lp":{"type":"integer","description":"Numer kolejny ceny (DfC_Lp). Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"nazwa":{"type":"string","description":"Nazwa ceny. Wypełniona tylko przy sukcesie.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na definicji ceny."},"DefCenyCennik":{"type":"object","properties":{"lp":{"type":"integer","description":"Numer kolejny ceny (DfC_Lp) — używany wewnętrznie do identyfikacji kolumny.","format":"int32"},"nazwa":{"type":"string","description":"Nazwa cennika (DfC_Nazwa) — stanowi część klucza kolumny w polu Dane (\"Cena {Nazwa}\").","nullable":true},"typ":{"type":"string","description":"Typ ceny: \"netto\" lub \"brutto\" (DfC_Typ: 1=netto, 2=brutto).","nullable":true},"waluta":{"type":"string","description":"Domyślna waluta cennika (DfC_Waluta), np. PLN.","nullable":true}},"additionalProperties":false,"description":"Definicja jednej kolumny cennikowej — legenda do pól \"Cena {Nazwa}\"."},"DekretElementItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator elementu (DeE_DeEId).","format":"int32"},"dekretId":{"type":"integer","description":"Identyfikator nagłówka dekretu (DeE_DeNId).","format":"int32"},"lp":{"type":"integer","description":"Lp elementu w księgowaniu zbiorczym.","format":"int32"},"dataWys":{"type":"string","description":"Data wystawienia dokumentu.","format":"date-time"},"dataOpe":{"type":"string","description":"Data dokonania operacji gospodarczej.","format":"date-time"},"dokument":{"type":"string","description":"Numer dokumentu.","nullable":true},"dataKur":{"type":"string","description":"Data kursu waluty.","format":"date-time"},"slownikTyp":{"type":"integer","description":"Typ słownika (DeE_SlownikTyp): 1=Kontrahent, 2=Bank, 3=Pracownik/Wspólnik, 5=Urząd, 6=Środek trwały, 7=Towar.","format":"int32","nullable":true},"slownikTypOpis":{"type":"string","description":"Czytelny opis typu słownika.","nullable":true},"slownikId":{"type":"integer","description":"Identyfikator pozycji słownika.","format":"int32","nullable":true},"katId":{"type":"integer","description":"Identyfikator kategorii.","format":"int32","nullable":true},"kategoria":{"type":"string","description":"Opis dokumentu księgowego.","nullable":true},"kwota":{"type":"number","description":"Kwota księgowania (w walucie systemowej).","format":"double"},"kwotaWal":{"type":"number","description":"Kwota zapisu w walucie oryginalnej.","format":"double"},"waluta":{"type":"string","description":"Waluta zapisu.","nullable":true},"kursL":{"type":"number","description":"Licznik kursu waluty.","format":"double"},"kursM":{"type":"number","description":"Mianownik kursu waluty.","format":"double"},"formaPlatnosciId":{"type":"integer","description":"Forma płatności (DeE_FPlID): 1=Gotówka, 2=Czek, 3=Przelew, 4=Kredyt, 5=Inne.","format":"int32","nullable":true},"formaPlatnosciOpis":{"type":"string","description":"Czytelny opis formy płatności.","nullable":true},"platnosci":{"type":"boolean","description":"Czy element generuje płatności do preliminarza."},"termin":{"type":"string","description":"Termin płatności dla generowanych zdarzeń w preliminarzu.","format":"date-time","nullable":true},"kontoWnId":{"type":"integer","description":"Identyfikator konta po stronie Winien.","format":"int32","nullable":true},"kontoMaId":{"type":"integer","description":"Identyfikator konta po stronie Ma.","format":"int32","nullable":true},"kontoWn":{"type":"string","description":"Symbol konta po stronie Winien.","nullable":true},"kontoMa":{"type":"string","description":"Symbol konta po stronie Ma.","nullable":true},"dokumentTyp":{"type":"integer","description":"Typ dokumentu źródłowego (DeE_DokumentTyp): 7=Środek trwały, 8=Wypłata, 14=Zapis kasowo-bankowy, 44=Rozrachunek różnicy kursowej, 50=Rozrachunek kompensaty.","format":"int32","nullable":true},"dokumentTypOpis":{"type":"string","description":"Czytelny opis typu dokumentu źródłowego.","nullable":true},"dokumentId":{"type":"integer","description":"Identyfikator dokumentu źródłowego (w tabeli wskazanej przez DokumentTyp).","format":"int32","nullable":true},"rozrachunki":{"type":"boolean","description":"Czy element podlega rozrachunkowi."},"bezRozliczenia":{"type":"boolean","description":"Czy rozrachunek jest bez rozliczania."},"terminRoz":{"type":"string","description":"Termin płatności rozrachunku.","format":"date-time","nullable":true},"statusRozrachunku":{"type":"integer","description":"Status rozrachunku (DeE_StatusRozrachunku): 0=Nie podlega, 1=Nierozliczony, 2=Rozliczony częściowo, 3=Rozliczony całkowicie.","format":"int32"},"statusRozrachunkuOpis":{"type":"string","description":"Czytelny opis statusu rozrachunku.","nullable":true},"korekta":{"type":"boolean","description":"Czy element jest sumą kosztów dokumentów korekcyjnych."},"podmiot":{"$ref":"#/components/schemas/PodmiotInfo"}},"additionalProperties":false,"description":"Element (pozycja Wn/Ma) dekretu księgowego z CDN.DekretyElem."},"DekretNagItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator dekretu (DeN_DeNId).","format":"int32"},"typ":{"type":"integer","description":"Rodzaj dekretu (DeN_Typ): 1=Predekret, 2=Dekret.","format":"int32"},"typOpis":{"type":"string","description":"Czytelny opis rodzaju dekretu.","nullable":true},"okresObrachunkowyId":{"type":"integer","description":"Identyfikator okresu obrachunkowego (DeN_OObId).","format":"int32"},"dziennikId":{"type":"integer","description":"Identyfikator dziennika cząstkowego (DeN_DziId).","format":"int32"},"dziennik":{"type":"string","description":"Nazwa dziennika cząstkowego.","nullable":true},"numerPelny":{"type":"string","description":"Pełny numer dokumentu (kolumna liczona DeN_NumerPelny).","nullable":true},"nrDziennika":{"type":"integer","description":"Numer zapisu w dzienniku cząstkowym.","format":"int32"},"nrKsiegi":{"type":"integer","description":"Numer zapisu w dzienniku głównym.","format":"int32"},"identKsieg":{"type":"string","description":"Identyfikator księgowy.","nullable":true},"bufor":{"type":"boolean","description":"Czy zapis jest w buforze (niezatwierdzony)."},"dataDok":{"type":"string","description":"Data dokumentu.","format":"date-time"},"dataWys":{"type":"string","description":"Data wystawienia dokumentu.","format":"date-time"},"dataOpe":{"type":"string","description":"Data dokonania operacji gospodarczej.","format":"date-time"},"dokument":{"type":"string","description":"Numer dokumentu źródłowego.","nullable":true},"podmiotTyp":{"type":"integer","description":"Typ podmiotu (DeN_PodmiotTyp): 1=Kontrahent, 2=Bank, 3=Pracownik/Wspólnik, 5=Urząd. Null gdy brak podmiotu.","format":"int32","nullable":true},"podmiotTypOpis":{"type":"string","description":"Czytelny opis typu podmiotu.","nullable":true},"podmiotId":{"type":"integer","description":"Identyfikator podmiotu (w tabeli wskazanej przez PodmiotTyp).","format":"int32","nullable":true},"katId":{"type":"integer","description":"Identyfikator kategorii.","format":"int32","nullable":true},"kategoria":{"type":"string","description":"Opis dokumentu księgowego.","nullable":true},"kwotaWn":{"type":"number","description":"Kwota zaksięgowana po stronie Winien.","format":"double"},"kwotaMa":{"type":"number","description":"Kwota zaksięgowana po stronie Ma.","format":"double"},"numerKSeF":{"type":"string","description":"Numer KSeF.","nullable":true},"storno":{"type":"boolean","description":"Czy księgowanie jest stornem."},"orgId":{"type":"integer","description":"Identyfikator oryginalnego dekretu (dla storna/stron powiązanych).","format":"int32","nullable":true},"zrodlo":{"type":"integer","description":"Źródło pochodzenia zapisu (DeN_Zrodlo).","format":"int32"},"zrodloOpis":{"type":"string","description":"Czytelny opis źródła pochodzenia zapisu.","nullable":true},"korekta":{"type":"integer","description":"Czy dokument jest korektą (DeN_Korekta): 0=nie, 1=miesięczna, 2=kwartalna.","format":"int32"},"korektaOpis":{"type":"string","description":"Czytelny opis rodzaju korekty.","nullable":true}},"additionalProperties":false,"description":"Nagłówek dekretu księgowego z CDN.DekretyNag."},"DekretyElementyPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/DekretElementItem"},"nullable":true},"strona":{"type":"integer","format":"int32"},"rozmiar":{"type":"integer","format":"int32"},"lacznie":{"type":"integer","format":"int32"},"stron":{"type":"integer","format":"int32"}},"additionalProperties":false,"description":"Stronicowany wynik zapytania o elementy dekretów."},"DekretyNagPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/DekretNagItem"},"nullable":true},"strona":{"type":"integer","format":"int32"},"rozmiar":{"type":"integer","format":"int32"},"lacznie":{"type":"integer","format":"int32"},"stron":{"type":"integer","format":"int32"}},"additionalProperties":false,"description":"Stronicowany wynik zapytania o nagłówki dekretów."},"DodajDodatekRequest":{"required":["nazwa","wartosc1"],"type":"object","properties":{"nazwa":{"maxLength":50,"minLength":1,"type":"string","description":"Nazwa składnika płacowego (widoczna na liście płac).","example":"Premia regulaminowa"},"wartosc1":{"type":"number","description":"Wartość dodatku brutto w złotych (Wartosc1 na IDodatekHis).","format":"double","example":500},"opis":{"type":"string","description":"Opis / komentarz do wpisu historii dodatku.","nullable":true,"example":"Premia za wyniki Q1 2026"},"dataOd":{"type":"string","description":"Data okresu dodatku — zapisywana jako `hist.Okres.Od`.\nGdy pominięta — przyjmowana jest data dzisiejsza.","format":"date-time","nullable":true,"example":"2026-01-01"},"wyplacajOd":{"type":"string","description":"Data początku wypłacania dodatku — zapisywana jako `hist.Wazny.Od`.\nGdy pominięta — przyjmowana jest data dzisiejsza.","format":"date-time","nullable":true,"example":"2026-01-01"},"wyplacajDo":{"type":"string","description":"Data końca wypłacania dodatku — zapisywana jako `hist.Okres.Do`.\nGdy pominięta — dodatek jest bezterminowy.","format":"date-time","nullable":true,"example":"2026-12-31"}},"additionalProperties":false,"description":"Dane nowego dodatku płacowego."},"DodajGrupeTowaru":{"required":["kodGrupy"],"type":"object","properties":{"kodGrupy":{"maxLength":50,"minLength":1,"type":"string","description":"Kod grupy towarowej (TwG_Kod) do której ma zostać przypisany towar."}},"additionalProperties":false,"description":"Żądanie przypisania towaru do grupy."},"DodajRejestrVATRequest":{"type":"object","properties":{"typ":{"type":"string","description":"Typ rejestru: \"Z\" = zakup, \"S\" = sprzedaż.","nullable":true},"rejestr":{"type":"string","description":"Nazwa rejestru VAT (np. \"SPRZEDAŻ\"). Musi istnieć w konfiguracji Optimy.","nullable":true},"dokument":{"type":"string","description":"Numer dokumentu (np. \"FS/01/2025\").","nullable":true},"identKsieg":{"type":"string","description":"Identyfikator księgowy.","nullable":true},"dataZap":{"type":"string","description":"Data zapisu (DataZap).","format":"date-time"},"dataOpe":{"type":"string","description":"Data operacji (DataOpe).","format":"date-time"},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod).","nullable":true},"formaPlatnosci":{"type":"string","description":"Nazwa formy płatności (FPl_Nazwa).","nullable":true},"walutaSymbol":{"type":"string","description":"Symbol waluty (np. \"PLN\", \"EUR\"). Domyślnie PLN — waluta nie jest ustawiana przez COM.","nullable":true},"kategoria":{"maxLength":50,"type":"string","description":"Kod szczegółowy kategorii nagłówka (Kat_kodszczegol). Opcjonalny — maks. 50 znaków.","nullable":true},"nrKSeF":{"type":"string","description":"Numer KSeF dokumentu. Opcjonalny.","nullable":true},"dodatkowyOpis":{"type":"string","description":"Dodatkowy opis dokumentu. Opcjonalny.","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia KSeF. Opcjonalna.","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin płatności. Opcjonalny.","format":"date-time","nullable":true},"kSeFPodmioty3Vat":{"type":"array","items":{"$ref":"#/components/schemas/KSeFPodmiot3Request"},"description":"Podmioty trzecie KSeF (KSeFPodmioty3Vat).\nKażdy wpis odpowiada jednemu podmiotowi trzeciemu powiązanemu z dokumentem w rejestrze VAT.","nullable":true},"elementy":{"type":"array","items":{"$ref":"#/components/schemas/ElementRejestru"},"description":"Elementy (pozycje) rejestru VAT. Wymagana co najmniej jedna pozycja.","nullable":true}},"additionalProperties":false,"description":"Żądanie dodania nowego wpisu do rejestru VAT."},"DodajRejestrVATResponse":{"type":"object","properties":{"id":{"type":"integer","description":"Wewnętrzny identyfikator dokumentu (VaN_VaNID).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer dokumentu nadany przez Optimę.","nullable":true},"identKsieg":{"type":"string","description":"Identyfikator księgowy dokumentu.","nullable":true}},"additionalProperties":false,"description":"Odpowiedź po pomyślnym dodaniu lub edycji wpisu w rejestrze VAT."},"DodatekHisItem":{"type":"object","properties":{"id":{"type":"integer","description":"ID wpisu historii (IDodatekHis.ID).","format":"int32"},"nazwa":{"type":"string","description":"Nazwa składnika w tym wpisie historii.","nullable":true},"wartosc1":{"type":"number","description":"Wartość dodatku brutto (Wartosc1).","format":"double"},"wartosc2":{"type":"number","description":"Wartość pomocnicza (Wartosc2) — zazwyczaj 0.","format":"double"},"opis":{"type":"string","description":"Opis / komentarz wpisu historii.","nullable":true},"okresOd":{"type":"string","description":"Początek okresu obowiązywania tego wpisu historii.","format":"date-time","nullable":true},"okresDo":{"type":"string","description":"Koniec okresu obowiązywania (null = bezterminowo).","format":"date-time","nullable":true}},"additionalProperties":false,"description":"Pojedynczy aktualny wpis historii dodatku płacowego."},"DodatekListItem":{"type":"object","properties":{"id":{"type":"integer","description":"ID obiektu IDodatek.","format":"int32"},"nazwa":{"type":"string","description":"Nazwa składnika płacowego.","nullable":true},"nieaktywny":{"type":"boolean","description":"Czy dodatek jest nieaktywny (1 = nieaktywny)."},"aktualnaHistoria":{"$ref":"#/components/schemas/DodatekHisItem"}},"additionalProperties":false,"description":"Pojedynczy dodatek płacowy pracownika z aktualnym wpisem historii."},"DodatekResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Opis wyniku lub treść błędu.","nullable":true},"id":{"type":"integer","description":"ID obiektu IDodatek (wypełniony tylko przy sukcesie).","format":"int32","nullable":true},"historiaId":{"type":"integer","description":"ID wpisu historii IDodatekHis (wypełniony tylko przy sukcesie).","format":"int32","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na dodatku płacowym."},"DodatkiListaResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Opis błędu. Wypełniony tylko przy niepowodzeniu.","nullable":true},"liczba":{"type":"integer","description":"Liczba znalezionych dodatków.","format":"int32"},"dodatki":{"type":"array","items":{"$ref":"#/components/schemas/DodatekListItem"},"description":"Lista dodatków płacowych pracownika.","nullable":true}},"additionalProperties":false,"description":"Wynik pobrania listy dodatków płacowych pracownika."},"DokumentBatchItem":{"required":["pozycje","typ"],"type":"object","properties":{"typ":{"minLength":1,"type":"string","description":"Kod typu dokumentu (FS, FZ, WZ, PZ, RO, ZD, PA, PW, RW, MM, BO, PI, PK, WK, PWP, RWS, PF, FWZ, FWS, TF, FRR oraz korekty: FSK, FZK...).","example":"FS"},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod). Wymagany dla dokumentów sprzedażowych i zakupowych.","nullable":true,"example":"ALOZA"},"magazynSymbol":{"type":"string","description":"Symbol magazynu źródłowego.","nullable":true,"example":"MAG"},"magazynDocelowySymbol":{"type":"string","description":"Symbol magazynu docelowego (tylko MM).","nullable":true},"bufor":{"type":"boolean","description":"Czy zapisać do bufora. Domyślnie false (od razu zatwierdzony).","example":false},"typNB":{"type":"integer","description":"Typ ceny: 1 = netto, 2 = brutto. Domyślnie 1.","format":"int32","example":1},"dataWys":{"type":"string","description":"Data wystawienia.","format":"date-time","nullable":true},"dataSprzedazy":{"type":"string","description":"Data sprzedaży / wydania towaru.","format":"date-time","nullable":true},"dataDok":{"type":"string","description":"Data dokumentu.","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin płatności (FS/FZ/PA i ich korekty), ważności (RO/ZD/PF) lub realizacji (pozostałe).","format":"date-time","nullable":true},"dataDokKorekta":{"type":"string","description":"Data dokumentu korekty — tylko dla dokumentów korygujących (FSK, FZK itp.).","format":"date-time","nullable":true},"dataOpeKorekta":{"type":"string","description":"Data operacji korekty — tylko dla dokumentów korygujących.","format":"date-time","nullable":true},"dataWysKorekta":{"type":"string","description":"Data wystawienia korekty — tylko dla dokumentów korygujących.","format":"date-time","nullable":true},"formaPlatnosci":{"type":"string","description":"Nazwa formy płatności (Fpl_Nazwa).","nullable":true,"example":"PRZELEW"},"walutaSymbol":{"type":"string","description":"Symbol waluty (np. EUR). Puste = PLN.","nullable":true},"numerObcy":{"type":"string","description":"Numer obcy (np. numer faktury dostawcy).","nullable":true},"uwagi":{"type":"string","description":"Uwagi do dokumentu.","nullable":true},"podNazwa1":{"type":"string","description":"Pierwszy wiersz nazwy podmiotu — nadpisuje dane z kartoteki kontrahenta.","nullable":true},"podNazwa2":{"type":"string","description":"Drugi wiersz nazwy podmiotu.","nullable":true},"podNazwa3":{"type":"string","description":"Trzeci wiersz nazwy podmiotu.","nullable":true},"podAdres":{"$ref":"#/components/schemas/AdresBatchDto"},"odbNazwa1":{"type":"string","description":"Pierwszy wiersz nazwy odbiorcy.","nullable":true},"odbNazwa2":{"type":"string","description":"Drugi wiersz nazwy odbiorcy.","nullable":true},"odbNazwa3":{"type":"string","description":"Trzeci wiersz nazwy odbiorcy.","nullable":true},"odbAdres":{"$ref":"#/components/schemas/AdresBatchDto"},"odbEmail":{"type":"string","description":"E-mail odbiorcy.","nullable":true},"odbTelefon":{"type":"string","description":"Telefon odbiorcy.","nullable":true},"odebral":{"type":"string","description":"Osoba, która odebrała dokument.","nullable":true},"nrKSeF":{"type":"string","description":"Numer KSeF dokumentu (TrN_NrKSeF). Uzupełnij dla FZ/FZK posiadających numer KSeF.","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia przez KSeF (TrN_KSeFDataPrzyjecia).","format":"date-time","nullable":true},"kSeFPodmioty3":{"type":"array","items":{"$ref":"#/components/schemas/KSeFPodmiot3BatchDto"},"description":"Podmioty trzecie KSeF (CDN.KSeFPodmioty3).","nullable":true},"atrybuty":{"type":"array","items":{"$ref":"#/components/schemas/AtrybutBatchDto"},"description":"Atrybuty dokumentu — lista par kod / wartość.","nullable":true},"generujWzPz":{"type":"boolean","description":"Czy automatycznie agregować WZ (dla FS) lub PZ (dla FZ) po zapisaniu dokumentu."},"pozycje":{"type":"array","items":{"$ref":"#/components/schemas/PozycjaBatchDto"},"description":"Pozycje dokumentu."}},"additionalProperties":false,"description":"Dane jednego dokumentu do wystawienia w ramach zadania batch."},"DokumentHaMagListItem":{"type":"object","properties":{"id":{"type":"integer","description":"ID dokumentu (TrN_TrNId).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer dokumentu, np. FS/12/2025.","nullable":true},"kodTypu":{"type":"string","description":"Kod API typu dokumentu (FS, FZ, WZ itp.). Null gdy typ nieznany w słowniku.","nullable":true},"nazwaTypu":{"type":"string","description":"Czytelna nazwa typu dokumentu, np. \"Faktura sprzedaży\".","nullable":true},"typDokumentu":{"type":"integer","description":"Wartość TrN_TypDokumentu w Optimie.","format":"int32"},"rodzaj":{"type":"integer","description":"Wartość TrN_Rodzaj w Optimie.","format":"int32"},"dataWystawienia":{"type":"string","description":"Data wystawienia dokumentu.","format":"date-time","nullable":true},"dataSprzedazy":{"type":"string","description":"Data sprzedaży / wydania towaru.","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin zapłaty lub realizacji.","format":"date-time","nullable":true},"wartoscNetto":{"type":"number","description":"Wartość netto dokumentu w walucie systemowej.","format":"double"},"wartoscBrutto":{"type":"number","description":"Wartość brutto dokumentu w walucie systemowej.","format":"double"},"waluta":{"type":"string","description":"Symbol waluty dokumentu.","nullable":true},"bufor":{"type":"boolean","description":"Czy dokument jest w buforze (niezatwierdzony)."},"anulowany":{"type":"boolean","description":"Czy dokument jest anulowany."},"numerObcy":{"type":"string","description":"Numer obcy dokumentu (np. numer faktury dostawcy).","nullable":true},"kontrahentId":{"type":"integer","description":"ID kontrahenta (Knt_KntId). Null gdy brak podmiotu.","format":"int32","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod).","nullable":true},"kontrahentNazwa":{"type":"string","description":"Pierwsza linia nazwy kontrahenta (Knt_Nazwa1).","nullable":true},"kontrahentNip":{"type":"string","description":"NIP kontrahenta (Knt_NIP).","nullable":true},"formaPlatnosciId":{"type":"integer","description":"ID formy płatności (FPl_FPlId). Null gdy nie przypisano.","format":"int32","nullable":true},"formaPlatnosciNazwa":{"type":"string","description":"Nazwa formy płatności (FPl_Nazwa).","nullable":true},"kSeFNumer":{"type":"string","description":"Numer KSeF dokumentu (TrN_KSeF_NumerKSeF). Null gdy brak.","nullable":true},"kSeFDataWyslania":{"type":"string","description":"Data wysłania do KSeF (TrN_KSeF_DataWyslania). Null gdy nie wysłano.","format":"date-time","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia przez KSeF (TrN_KSeF_DataPrzyjecia). Null gdy nie przyjęto.","format":"date-time","nullable":true}},"additionalProperties":false,"description":"Pojedynczy dokument HaMag na liście."},"DokumentHaMagResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"id":{"type":"integer","description":"ID dokumentu w bazie Optimy. Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"numerPelny":{"type":"string","description":"Pełny numer dokumentu (np. FS/12/2024). Wypełniony tylko przy sukcesie.","nullable":true},"wzPzWygenerowany":{"type":"boolean","description":"Czy dokument WZ (dla FS) lub PZ (dla FZ) został wygenerowany pomyślnie."},"wzPzBlad":{"type":"string","description":"Komunikat błędu generowania WZ/PZ gdy `WzPzWygenerowany = false`\na dokument główny (FS/FZ) został zapisany. Null gdy WZ/PZ nie było żądane lub powiodło się.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji dodania dokumentu handlowo-magazynowego."},"DokumentHaMagSzczegolyResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"numerPelny":{"type":"string","nullable":true},"kodTypu":{"type":"string","nullable":true},"nazwaTypu":{"type":"string","nullable":true},"typDokumentu":{"type":"integer","format":"int32"},"rodzaj":{"type":"integer","format":"int32"},"dataWystawienia":{"type":"string","format":"date-time","nullable":true},"dataSprzedazy":{"type":"string","format":"date-time","nullable":true},"dataDok":{"type":"string","format":"date-time","nullable":true},"termin":{"type":"string","format":"date-time","nullable":true},"wartoscNetto":{"type":"number","format":"double"},"wartoscVat":{"type":"number","format":"double"},"wartoscBrutto":{"type":"number","format":"double"},"waluta":{"type":"string","nullable":true},"bufor":{"type":"boolean"},"anulowany":{"type":"boolean"},"numerObcy":{"type":"string","nullable":true},"opis":{"type":"string","nullable":true},"podNazwa1":{"type":"string","nullable":true},"podNazwa2":{"type":"string","nullable":true},"podNazwa3":{"type":"string","nullable":true},"podUlica":{"type":"string","nullable":true},"podMiasto":{"type":"string","nullable":true},"podKodPocztowy":{"type":"string","nullable":true},"podNip":{"type":"string","nullable":true},"odbNazwa1":{"type":"string","nullable":true},"odbNazwa2":{"type":"string","nullable":true},"odbNazwa3":{"type":"string","nullable":true},"odbUlica":{"type":"string","nullable":true},"odbMiasto":{"type":"string","nullable":true},"odbKodPocztowy":{"type":"string","nullable":true},"kontrahentId":{"type":"integer","format":"int32","nullable":true},"kontrahentKod":{"type":"string","nullable":true},"kontrahentNazwa":{"type":"string","nullable":true},"kontrahentNip":{"type":"string","nullable":true},"formaPlatnosciId":{"type":"integer","format":"int32","nullable":true},"formaPlatnosciNazwa":{"type":"string","nullable":true},"magazynSymbol":{"type":"string","nullable":true},"kSeFNumer":{"type":"string","nullable":true},"kSeFDataWyslania":{"type":"string","format":"date-time","nullable":true},"kSeFDataPrzyjecia":{"type":"string","format":"date-time","nullable":true},"pozycje":{"type":"array","items":{"$ref":"#/components/schemas/PozycjaDokumentuDto"},"nullable":true}},"additionalProperties":false,"description":"Szczegóły dokumentu HaMag — nagłówek i pozycje z atrybutami."},"DokumentPowiazanyDto":{"type":"object","properties":{"id":{"type":"integer","description":"ID powiązanego dokumentu (TrN_TrNID).","format":"int32"},"numerDokumentu":{"type":"string","description":"Pełny numer powiązanego dokumentu, np. WZ/191/2026.","nullable":true},"typDokumentu":{"type":"string","description":"Czytelna nazwa typu powiązanego dokumentu, np. \"Wydanie zewnętrzne\".","nullable":true}},"additionalProperties":false,"description":"Dokument powiązany z dokumentem HaMag (relacja z CDN.TraNagRelacje)."},"DokumentyBatchRequest":{"required":["dokumenty"],"type":"object","properties":{"firma":{"type":"string","description":"Nazwa firmy w Optimie (przekazywana do Login2Firm), np. CDN_Demo.\nGdy pominięta lub pusta — używana firma przypisana do tokena, globalny override lub domyślna z konfiguracji.","nullable":true,"example":"CDN_Demo"},"dokumenty":{"type":"array","items":{"$ref":"#/components/schemas/DokumentBatchItem"},"description":"Lista dokumentów do wystawienia."}},"additionalProperties":false,"description":"Żądanie batch tworzenia dokumentów handlowo-magazynowych.\nKażda pozycja w Dokumenty to jeden dokument — typ (FS, FZ, WZ...) podawany per pozycja."},"DokumentyHaMagPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/DokumentHaMagListItem"},"nullable":true},"strona":{"type":"integer","format":"int32"},"rozmiar":{"type":"integer","format":"int32"},"lacznie":{"type":"integer","format":"int32"},"stron":{"type":"integer","format":"int32"}},"additionalProperties":false,"description":"Stronicowana lista dokumentów HaMag."},"DziennikDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator dziennika (Dzi_DziId).","format":"int32"},"symbol":{"type":"string","description":"Symbol dziennika księgowego.","nullable":true},"nazwa":{"type":"string","description":"Nazwa dziennika cząstkowego.","nullable":true},"okresObrachunkowyId":{"type":"integer","description":"Identyfikator okresu obrachunkowego, do którego należy dziennik (Dzi_OObId).","format":"int32"}},"additionalProperties":false,"description":"Dziennik cząstkowy z CDN.Dzienniki."},"EanResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"id":{"type":"integer","description":"ID rekordu EAN (TwE_TwEId). Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"ean":{"type":"string","description":"Kod EAN. Wypełniony tylko przy sukcesie.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na kodzie EAN."},"EdycjaDodatkuRequest":{"type":"object","properties":{"czyNowyWpisHistoryczny":{"type":"boolean","description":"Czy zmiana ma być zapisana jako nowy wpis historii dodatku."},"dataOd":{"type":"string","description":"Data obowiązywania zmian. Gdy pominięta, przyjmowana jest data dzisiejsza.","format":"date-time","nullable":true,"example":"2026-04-01"},"wartosc1":{"type":"number","description":"Nowa wartość dodatku brutto w złotych (Wartosc1). Pominięcie nie zmienia wartości.","format":"double","nullable":true,"example":600},"opis":{"type":"string","description":"Nowy opis wpisu historii. Pominięcie nie zmienia opisu.","nullable":true},"nazwa":{"maxLength":50,"type":"string","description":"Nowa nazwa składnika płacowego. Pominięcie nie zmienia nazwy.","nullable":true,"example":"Premia uznaniowa"},"wyplacajOd":{"type":"string","description":"Nowa data początku wypłacania — nadpisuje `hist.Okres.Od`.\nPominięcie nie zmienia daty. Przy nowym wpisie historycznym (`CzyNowyWpisHistoryczny=true`)\njest to jednocześnie data od której zaczyna obowiązywać nowy wpis.","format":"date-time","nullable":true,"example":"2026-04-01"},"wyplacajDo":{"type":"string","description":"Nowa data końca wypłacania — nadpisuje `hist.Okres.Do`.\nPominięcie nie zmienia daty. Podaj `null` aby pozostawić bez zmian,\na datę aby ustawić koniec okresu wypłacania.","format":"date-time","nullable":true,"example":"2026-12-31"}},"additionalProperties":false,"description":"Dane do aktualizacji historii dodatku płacowego."},"EdycjaEtatuRequest":{"type":"object","properties":{"czyNowyWpisHistoryczny":{"type":"boolean","description":"Czy zmiana ma być zapisana jako nowy okres zatrudnienia."},"dataOd":{"type":"string","description":"Data obowiązywania zmian. Gdy pominięta, przyjmowana jest data dzisiejsza.\nPrzy aktualizacji bieżącego okresu — zmieniany jest okres obowiązujący w tym dniu.\nPrzy nowym okresie zatrudnienia — od tego dnia zaczyna się nowy okres.","format":"date-time","nullable":true,"example":"2026-01-01"},"stosunekPracy":{"type":"integer","description":"Stosunek pracy — wartość słownikowa Optimy, np. `1` = umowa o pracę.","format":"int32","nullable":true},"rodzajUmowy":{"type":"integer","description":"Rodzaj umowy o pracę.\nDopuszczalne wartości: `1` = na czas określony,\n`2` = na czas wykonywania określonej pracy,\n`3` = na okres próbny,\n`4` = na czas nieokreślony,\n`5` = na czas określony (zastępstwo).","format":"int32","nullable":true,"example":4},"dataZawarcia":{"type":"string","description":"Data zawarcia umowy o pracę.","format":"date-time","nullable":true,"example":"2026-01-02"},"dataRozpocz":{"type":"string","description":"Data faktycznego rozpoczęcia pracy przez pracownika.","format":"date-time","nullable":true,"example":"2026-01-02"},"rozwiazUmowy":{"type":"integer","description":"Sposób rozwiązania umowy — wartość słownikowa Optimy\n(np. porozumienie stron, wypowiedzenie przez pracownika, wypowiedzenie przez pracodawcę).","format":"int32","nullable":true},"wypowPowod":{"maxLength":100,"type":"string","description":"Powód wypowiedzenia lub rozwiązania umowy — tekst wolny, max 100 znaków.","nullable":true,"example":"Rezygnacja pracownika"},"stanowisko":{"maxLength":50,"type":"string","description":"Nazwa stanowiska pracy, np. `Specjalista ds. sprzedaży`.","nullable":true,"example":"Specjalista ds. sprzedaży"},"funkcja":{"maxLength":50,"type":"string","description":"Funkcja pełniona przez pracownika, np. `Kierownik zespołu`.","nullable":true,"example":"Kierownik zespołu"},"miejsce":{"maxLength":50,"type":"string","description":"Miejsce wykonywania pracy, np. adres lub nazwa oddziału.","nullable":true,"example":"Warszawa, ul. Przykładowa 1"},"etatL":{"type":"integer","description":"Licznik wymiaru etatu. Razem z `EtatM` tworzy ułamek wymiaru pracy,\nnp. `EtatL=1, EtatM=1` — pełny etat; `EtatL=1, EtatM=2` — 1/2 etatu.","format":"int32","nullable":true,"example":1},"etatM":{"type":"integer","description":"Mianownik wymiaru etatu. Razem z `EtatL` tworzy ułamek wymiaru pracy,\nnp. `EtatL=1, EtatM=1` — pełny etat; `EtatL=3, EtatM=4` — 3/4 etatu.","format":"int32","nullable":true,"example":1},"stawka":{"type":"number","description":"Stawka zasadnicza wynagrodzenia — kwota brutto w złotych.","format":"double","nullable":true,"example":5000},"minimalna":{"type":"integer","description":"Flaga powiązania wynagrodzenia z płacą minimalną — wartość słownikowa Optimy.\n`0` = brak powiązania (stawka wpisana ręcznie),\n`1` = minimalne wynagrodzenie krajowe.","format":"int32","nullable":true},"gwarantProcMin":{"type":"number","description":"Gwarantowany procent płacy minimalnej, aktywny gdy `Minimalna` wskazuje\nna powiązanie z wynagrodzeniem minimalnym, np. `100` = 100% płacy minimalnej.","format":"double","nullable":true,"example":100},"rodzajZatrudnienia":{"type":"integer","description":"Rodzaj zatrudnienia — wartość słownikowa Optimy\n(np. pełny etat, część etatu, umowa zlecenie).","format":"int32","nullable":true},"indywProcWypad":{"type":"integer","description":"Czy stosować indywidualny procent składki wypadkowej.\n`1` = tak (użyj wartości z `IndywProcWypadProcent`),\n`0` = nie (stosowana ogólna składka branżowa z GUS).","format":"int32","nullable":true},"indywProcWypadProcent":{"type":"number","description":"Indywidualny procent składki wypadkowej w procentach (np. `1.67`).\nUwzględniany tylko gdy `IndywProcWypad = 1`.","format":"double","nullable":true,"example":1.67},"dataZatrudnienia":{"type":"string","description":"Data zatrudnienia pracownika — odpowiada polu `Zatrudnienie.Od` w historii.","format":"date-time","nullable":true,"example":"2026-01-02"},"dataZwolnienia":{"type":"string","description":"Data zwolnienia pracownika — odpowiada polu `Zatrudnienie.Do` w historii.","format":"date-time","nullable":true,"example":"2026-12-31"},"ubezpieczenie":{"$ref":"#/components/schemas/UbezpieczenieDto"}},"additionalProperties":false,"description":"Dane etatu pracownika do aktualizacji. Pola pominięte lub z wartością `null` nie są modyfikowane."},"EdycjaPracownikaRequest":{"type":"object","properties":{"nazwisko":{"maxLength":50,"type":"string","description":"Nazwisko pracownika.","nullable":true,"example":"Kowalski"},"imie1":{"maxLength":30,"type":"string","description":"Pierwsze imię.","nullable":true,"example":"Jan"},"imie2":{"maxLength":30,"type":"string","description":"Drugie imię.","nullable":true},"pesel":{"maxLength":11,"type":"string","description":"Numer PESEL — 11 cyfr.","nullable":true,"example":"85010112345"},"dataUr":{"type":"string","description":"Data urodzenia.","format":"date-time","nullable":true,"example":"1985-01-01"},"miejsceUr":{"maxLength":40,"type":"string","description":"Miejscowość urodzenia.","nullable":true},"plec":{"maxLength":1,"type":"string","description":"Płeć: `K` — kobieta, `M` — mężczyzna.","nullable":true},"stanCywilny":{"maxLength":20,"type":"string","description":"Stan cywilny. Typowe wartości: `K` kawaler/panna, `M` żonaty/mężatka,\n`R` rozwiedziony/a, `W` wdowiec/wdowa.","nullable":true},"dowOsobisty":{"maxLength":9,"type":"string","description":"Seria i numer dowodu osobistego, np. `ABC123456`.","nullable":true},"dowGdzie":{"maxLength":100,"type":"string","description":"Organ wydający dowód osobisty.","nullable":true},"dowKiedy":{"type":"string","description":"Data wydania dowodu osobistego.","format":"date-time","nullable":true},"dowWaznyDo":{"type":"string","description":"Data ważności dowodu osobistego.","format":"date-time","nullable":true},"telefonSms":{"maxLength":20,"type":"string","description":"Numer telefonu kontaktowego / do SMS.","nullable":true},"nipE":{"maxLength":13,"type":"string","description":"Numer NIP — dotyczy właścicieli i zleceniobiorców prowadzących działalność.","nullable":true},"typPracownika":{"type":"integer","description":"Typ pracownika: `0` = etatowy, `1` = zleceniobiorca, `2` = właściciel.\nPominięcie nie zmienia aktualnego typu.","format":"int32","nullable":true},"centrumKod":{"maxLength":20,"type":"string","description":"Kod centrum kosztów, do którego zostanie przypisany pracownik.\nJeśli centrum o podanym kodzie nie istnieje, żądanie zostanie odrzucone.","nullable":true},"dzialKod":{"maxLength":20,"type":"string","description":"Kod działu, do którego zostanie przypisany pracownik.\nJeśli dział o podanym kodzie nie istnieje, żądanie zostanie odrzucone.","nullable":true},"opis":{"type":"string","description":"Dodatkowe uwagi lub opis pracownika.","nullable":true},"czyNowyWpisHistoryczny":{"type":"boolean","description":"Czy zmiana ma być zapisana jako nowy okres zatrudnienia.\n<list type=\"bullet\"><item><description>`false` (domyślnie) — aktualizacja danych w bieżącym okresie zatrudnienia\n    obowiązującym w dniu `DataOd`.\n  </description></item><item><description>`true` — otwarcie nowego okresu zatrudnienia od daty `DataOd`.\n    Jeśli w podanej dacie istnieje już okres zatrudnienia, zostaje on zaktualizowany\n    zamiast tworzenia duplikatu.\n  </description></item></list>"},"dataOd":{"type":"string","description":"Data obowiązywania zmian. Gdy pominięta, przyjmowana jest data dzisiejsza.\nPrzy aktualizacji bieżącego okresu — zmieniany jest okres obowiązujący w tym dniu.\nPrzy nowym okresie zatrudnienia — od tego dnia zaczyna się nowy okres.","format":"date-time","nullable":true,"example":"2026-01-01"},"daneKadrowe":{"$ref":"#/components/schemas/DaneKadroweDto"},"adresZamieszkania":{"$ref":"#/components/schemas/AdresPracownikaDto"},"adresKorespondencyjny":{"$ref":"#/components/schemas/AdresPracownikaDto"},"adresZameldowania":{"$ref":"#/components/schemas/AdresPracownikaDto"}},"additionalProperties":false,"description":"Dane do aktualizacji pracownika. Pola pominięte lub z wartością null nie są modyfikowane."},"EdytujRejestrVATRequest":{"type":"object","properties":{"rejestr":{"type":"string","description":"Nowa nazwa rejestru VAT. Musi istnieć w konfiguracji Optimy. Null = bez zmiany.","nullable":true},"typ":{"type":"string","description":"Nowy typ rejestru: \"Z\" = zakup, \"S\" = sprzedaż. Null = bez zmiany.","nullable":true},"dokument":{"type":"string","description":"Numer dokumentu (np. \"FS/01/2025\"). Null = bez zmiany.","nullable":true},"identKsieg":{"type":"string","description":"Identyfikator księgowy. Null = bez zmiany.","nullable":true},"dataZap":{"type":"string","description":"Data zapisu (DataZap). Null = bez zmiany.","format":"date-time","nullable":true},"dataOpe":{"type":"string","description":"Data operacji (DataOpe). Null = bez zmiany.","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin płatności. Null = bez zmiany.","format":"date-time","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod). Null = bez zmiany.","nullable":true},"formaPlatnosci":{"type":"string","description":"Nazwa formy płatności (FPl_Nazwa). Null = bez zmiany.","nullable":true},"kategoria":{"maxLength":50,"type":"string","description":"Kod szczegółowy kategorii nagłówka (Kat_kodszczegol). Null = bez zmiany.","nullable":true},"nrKSeF":{"type":"string","description":"Numer KSeF dokumentu. Null = bez zmiany.","nullable":true},"dodatkowyOpis":{"type":"string","description":"Dodatkowy opis dokumentu. Null = bez zmiany.","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia KSeF. Null = bez zmiany.","format":"date-time","nullable":true}},"additionalProperties":false,"description":"Żądanie edycji istniejącego wpisu w rejestrze VAT. Pola null nie są zmieniane."},"ElementRejestru":{"type":"object","properties":{"stawka":{"type":"string","description":"Stawka VAT. Akceptuje liczbę (`23`, `8`, `5`, `0`)\nlub symbol `\"ZW\"` / `\"NP\"` — flaga jest wtedy ustawiana automatycznie.\nWartość `-1` lub `\"-1\"` = skrót dla ZW.","nullable":true,"example":"23"},"rodzajZakupu":{"type":"integer","description":"Rodzaj zakupu: 1=Towary, 2=Inne, 3=Trwałe, 4=Usługi, 5=NoweŚrTran, 6=Nieruchomości, 7=Paliwo.\nDla rejestru sprzedaży pole jest ignorowane przez Optimę.","format":"int32"},"netto":{"type":"number","description":"Kwota netto.","format":"double"},"odliczenia":{"type":"integer","description":"Odliczenia (zakup): 0=nie, 1=tak, 2=warunkowo.\nUwzględnienie w proporcji (sprzedaż): 0=nie uwzględniaj, 1=uwzględniaj, 2=tylko w mianowniku.","format":"int32"},"flaga":{"type":"integer","description":"Flaga stawki VAT. Gdy wynosi `0` (domyślnie), jest ustawiana automatycznie na `2` (opodatkowana).\n<list type=\"bullet\"><item><description>`1` — zwolniona (ZW)</description></item><item><description>`2` — opodatkowana (domyślna dla stawek > 0 oraz `Stawka=0` bez flagi)</description></item><item><description>`3` — zaniżona</description></item><item><description>`4` — nie podlega (NP)</description></item></list>","format":"int32"},"kategoria":{"type":"string","description":"Kod szczegółowy kategorii podstawowej (Kat_kodszczegol). Opcjonalny.","nullable":true},"katOpis":{"type":"string","description":"Opis kategorii podstawowej (KatOpis). Opcjonalny.","nullable":true},"kategoria2":{"type":"string","description":"Kod szczegółowy kategorii dodatkowej (Kat_kodszczegol). Opcjonalny.","nullable":true},"nettoOSS":{"type":"number","description":"Kwota netto OSS (sprzedaż zagraniczna One Stop Shop). Opcjonalna.","format":"double","nullable":true},"vatoss":{"type":"number","description":"Kwota VAT OSS. Opcjonalna.","format":"double","nullable":true},"bruttoOSS":{"type":"number","description":"Kwota brutto OSS. Opcjonalna.","format":"double","nullable":true},"kodKrajuOSS":{"type":"string","description":"Kod kraju OSS (np. \"DE\", \"FR\"). Opcjonalny.","nullable":true}},"additionalProperties":false,"description":"Pojedynczy element (pozycja) rejestru VAT."},"ElementRejestruDetails":{"type":"object","properties":{"stawka":{"type":"number","description":"Stawka VAT w procentach.","format":"double"},"flaga":{"type":"integer","description":"Flaga stawki: 1=Zwolniona(ZW), 2=Opodatkowana, 3=Zaniżona, 4=Nie podlega(NP).","format":"int32"},"stawkaSymbol":{"type":"string","description":"Symbol stawki VAT (np. \"23%\", \"ZW\").","nullable":true},"rodzajZakupu":{"type":"integer","description":"Rodzaj zakupu (dotyczy zakupów): 1=Towary, 2=Inne, 3=Trwałe, 4=Usługi, 5=ŚrTransportu, 6=Nieruchomości, 7=Paliwo.","format":"int32"},"odliczenia":{"type":"integer","description":"Odliczenia VAT: 0=Nie odliczać, 1=Odliczać, 2=Warunkowo.","format":"int32"},"netto":{"type":"number","description":"Kwota netto.","format":"double"},"vat":{"type":"number","description":"Kwota VAT.","format":"double"},"brutto":{"type":"number","description":"Kwota brutto (Netto + VAT).","format":"double"},"katOpis":{"type":"string","description":"Opis kategorii podstawowej (VaT_KatOpis).","nullable":true},"kat2Opis":{"type":"string","description":"Opis kategorii dodatkowej (VaT_Kat2Opis).","nullable":true},"nettoOSS":{"type":"number","description":"Kwota netto OSS.","format":"double","nullable":true},"vatoss":{"type":"number","description":"Kwota VAT OSS.","format":"double","nullable":true},"kodKrajuOSS":{"type":"string","description":"Kod kraju OSS.","nullable":true}},"additionalProperties":false,"description":"Pozycja rejestru VAT zagregowana do stawki VAT (CDN.VatTab)."},"ElementRejestruVATBatchDto":{"required":["netto"],"type":"object","properties":{"stawka":{"type":"string","description":"Stawka VAT w procentach: `23`, `8`, `5`, `0`.\nPrzyjmuje liczbę (23) lub symbol `\"ZW\"` / `\"NP\"`.\nGdy podano \"ZW\" lub \"NP\", pole Flaga jest ustawiane automatycznie (odpowiednio 1 lub 4).","nullable":true,"example":"23"},"flaga":{"type":"integer","description":"Flaga stawki VAT. Opcjonalna — gdy nie podana, wyznaczana ze Stawka.\n<list type=\"bullet\"><item><description>`1` — zwolniona (ZW)</description></item><item><description>`2` — opodatkowana (domyślna dla stawek > 0)</description></item><item><description>`3` — zaniżona</description></item><item><description>`4` — nie podlega (NP)</description></item></list>","format":"int32","nullable":true},"rodzajZakupu":{"type":"integer","description":"Rodzaj zakupu — dotyczy wyłącznie rejestrów zakupów (`Typ=Z`).\nDla sprzedaży pole jest ignorowane przez Optimę.\n<list type=\"table\"><listheader><term>Wartość</term><description>Znaczenie</description></listheader><item><term>1</term><description>Towary (domyślnie)</description></item><item><term>2</term><description>Inne</description></item><item><term>3</term><description>Środki trwałe</description></item><item><term>4</term><description>Usługi</description></item><item><term>5</term><description>Nowe środki transportu</description></item><item><term>6</term><description>Nieruchomości</description></item><item><term>7</term><description>Paliwo</description></item></list>","format":"int32","example":1},"netto":{"type":"number","description":"Kwota netto dla tej stawki VAT.","format":"double","example":1000},"odliczenia":{"type":"integer","description":"Odliczenia VAT (zakup): `0` = nie odliczać, `1` = odliczać, `2` = warunkowo.\nUwzględnienie w proporcji (sprzedaż): `0` = nie, `1` = uwzględniaj, `2` = tylko w mianowniku.","format":"int32"},"kategoria":{"type":"string","description":"Kod szczegółowy kategorii podstawowej pozycji (`Kat_kodszczegol`). Opcjonalny.","nullable":true},"katOpis":{"type":"string","description":"Opis słowny kategorii podstawowej (KatOpis). Opcjonalny.","nullable":true},"kategoria2":{"type":"string","description":"Kod szczegółowy kategorii dodatkowej pozycji (`Kat_kodszczegol`). Opcjonalny.","nullable":true},"nettoOSS":{"type":"number","description":"Kwota netto OSS (transakcje zagraniczne One Stop Shop). Pominąć gdy nie dotyczy.","format":"double","nullable":true},"vatoss":{"type":"number","description":"Kwota VAT OSS. Pominąć gdy nie dotyczy.","format":"double","nullable":true},"bruttoOSS":{"type":"number","description":"Kwota brutto OSS. Pominąć gdy nie dotyczy.","format":"double","nullable":true},"kodKrajuOSS":{"type":"string","description":"Kod kraju OSS wg ISO 3166-1 alpha-2, np. `DE`, `FR`. Pominąć gdy nie dotyczy.","nullable":true}},"additionalProperties":false,"description":"Pojedyncza pozycja (stawka VAT) wpisu w rejestrze VAT.\nKażda pozycja reprezentuje jedną stawkę — np. 23%, 8%, ZW."},"FirmContextResponse":{"type":"object","properties":{"firmName":{"type":"string","description":"Nazwa firmy w Optimie (używana w Login2Firm).","nullable":true},"sqlDatabase":{"type":"string","description":"Nazwa bazy danych SQL aktualnej firmy.","nullable":true},"isOverridden":{"type":"boolean","description":"Czy kontekst różni się od domyślnej firmy z konfiguracji."}},"additionalProperties":false},"FormaPlatnosciDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator formy płatności (FPl_FPlId).","format":"int32"},"nazwa":{"type":"string","description":"Nazwa formy płatności (FPl_Nazwa) — używana w filtrach i przy tworzeniu dokumentów.","nullable":true},"termin":{"type":"integer","description":"Termin płatności w dniach (FPl_Termin).","format":"int32"},"typ":{"type":"string","description":"Typ formy płatności: Gotówka / Przelew / Karta / Kompensata / Bon (FPl_Typ).","nullable":true},"nieaktywna":{"type":"boolean","description":"Czy forma płatności jest nieaktywna (FPl_NieAktywny)."}},"additionalProperties":false,"description":"Forma płatności z CDN.FormyPlatnosci."},"GrupaKontrahentow":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator grupy (Gru_GruID).","format":"int32"},"nazwa":{"type":"string","description":"Nazwa grupy (Gru_Nazwa) — max 32 znaki. Używana jako kod przypisania do kontrahenta (Knt_Grupa).","nullable":true},"opis":{"type":"string","description":"Opis grupy (Gru_Opis).","nullable":true}},"additionalProperties":false,"description":"Grupa kontrahentów z CDN.Grupy (Gru_Typ=31)."},"GrupaKontrahentowResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"id":{"type":"integer","description":"ID grupy (Gru_GruID). Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"nazwa":{"type":"string","description":"Nazwa grupy. Wypełniona tylko przy sukcesie.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na grupie kontrahentów."},"GrupaTowarowaHierarchia":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator grupy (TwG_TwGID).","format":"int32"},"kod":{"type":"string","description":"Kod grupy (TwG_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa grupy (TwG_Nazwa).","nullable":true},"gidNumer":{"type":"integer","description":"GIDNumer grupy (TwG_GIDNumer).","format":"int32"},"groNumer":{"type":"integer","description":"GIDNumer grupy nadrzędnej (TwG_GrONumer). 0 = poziom główny.","format":"int32"},"poziom":{"type":"integer","description":"Głębokość w drzewie względem punktu startowego (0 = korzeń zapytania).","format":"int32"},"podgrupy":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowarowaHierarchia"},"description":"Podgrupy (rekurencyjnie).","nullable":true}},"additionalProperties":false},"GrupaTowarowaListItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator grupy (TwG_TwGID).","format":"int32"},"kod":{"type":"string","description":"Kod grupy (TwG_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa grupy (TwG_Nazwa).","nullable":true},"gidNumer":{"type":"integer","description":"GIDNumer grupy (TwG_GIDNumer) — klucz relacji w hierarchii.","format":"int32"},"groNumer":{"type":"integer","description":"GIDNumer grupy nadrzędnej (TwG_GrONumer). 0 = poziom główny.","format":"int32"}},"additionalProperties":false},"GrupaTowarowaResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"id":{"type":"integer","description":"Identyfikator nowo utworzonej grupy (TwG_TwGID). Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"kod":{"type":"string","description":"Kod grupy. Wypełniony tylko przy sukcesie.","nullable":true},"nazwa":{"type":"string","description":"Nazwa grupy. Wypełniona tylko przy sukcesie.","nullable":true},"sciezka":{"type":"string","description":"Pełna ścieżka grupy w drzewie (np. Elektronika\\AGD). Wypełniona tylko przy sukcesie.","nullable":true}},"additionalProperties":false},"GrupaTowaru":{"type":"object","properties":{"id":{"type":"integer","description":"ID grupy (TwG_TwGID).","format":"int32"},"kod":{"type":"string","description":"Kod grupy (TwG_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa grupy (TwG_Nazwa).","nullable":true},"gidNumer":{"type":"integer","description":"GIDNumer grupy — używany jako klucz relacji.","format":"int32"},"groNumer":{"type":"integer","description":"GIDNumer grupy nadrzędnej (0 = poziom główny).","format":"int32"}},"additionalProperties":false,"description":"Grupa towarowa przypisana do towaru."},"GrupaTowaryResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"kodGrupy":{"type":"string","description":"Kod grupy. Wypełniony tylko przy sukcesie.","nullable":true},"nazwaGrupy":{"type":"string","description":"Nazwa grupy. Wypełniona tylko przy sukcesie.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na grupach towaru."},"GrupyTowarowePagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/GrupaTowarowaListItem"},"description":"Rekordy na bieżącej stronie.","nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (od 1).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba grup pasujących do filtrów.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false},"GusApiKeyRequest":{"type":"object","properties":{"apiKey":{"type":"string","description":"Klucz API GUS BIR1 (20 znaków alfanumerycznych).","nullable":true}},"additionalProperties":false,"description":"Żądanie ustawienia klucza API GUS."},"GusRegonDto":{"type":"object","properties":{"nip":{"type":"string","description":"Numer NIP (bez myślników).","nullable":true},"regon":{"type":"string","description":"Numer REGON (9 cyfr).","nullable":true},"nazwa":{"type":"string","description":"Pełna nazwa podmiotu.","nullable":true},"ulica":{"type":"string","description":"Ulica siedziby.","nullable":true},"nrDomu":{"type":"string","description":"Numer nieruchomości (domu).","nullable":true},"nrLokalu":{"type":"string","description":"Numer lokalu.","nullable":true},"miasto":{"type":"string","description":"Miejscowość siedziby.","nullable":true},"kodPocztowy":{"type":"string","description":"Kod pocztowy.","nullable":true},"email":{"type":"string","description":"Adres e-mail z rejestru GUS.","nullable":true},"telefon":{"type":"string","description":"Numer telefonu z rejestru GUS.","nullable":true},"www":{"type":"string","description":"Adres strony WWW z rejestru GUS.","nullable":true},"typPodmiotu":{"type":"string","description":"Typ podmiotu: \"Osoba prawna\" lub \"Osoba fizyczna (CEIDG)\".","nullable":true}},"additionalProperties":false,"description":"Dane podmiotu z GUS REGON BIR1."},"ItemStatusResponse":{"type":"object","properties":{"itemId":{"type":"string","format":"uuid"},"index":{"type":"integer","format":"int32"},"status":{"type":"string","nullable":true},"result":{"type":"string","nullable":true},"error":{"type":"string","nullable":true},"processedAt":{"type":"string","format":"date-time","nullable":true}},"additionalProperties":false},"JobStatusResponse":{"type":"object","properties":{"jobId":{"type":"string","format":"uuid"},"type":{"type":"string","nullable":true},"firmaId":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"current":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"},"error":{"type":"string","nullable":true},"workerId":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/ItemStatusResponse"},"nullable":true}},"additionalProperties":false},"KSeFPodmiot3BatchDto":{"required":["rolaPodmiotu"],"type":"object","properties":{"rolaPodmiotu":{"maximum":11,"minimum":1,"type":"integer","description":"Rola podmiotu trzeciego (TKP_RolaPodmiotu). 1=Faktor, 2=Odbiorca, 3=Podmiot pierwotny, 4=Dodatkowy nabywca, 5=Wystawca faktury, 6=Dokonujący płatności, 7-11=JST/GV/Pracownik.","format":"int32"},"opisRoli":{"type":"string","nullable":true},"nazwa":{"type":"string","nullable":true},"nip":{"type":"string","nullable":true},"nipKraj":{"type":"string","nullable":true},"rodzajIdentyfikatora":{"type":"integer","format":"int32","nullable":true},"nrKlienta":{"type":"string","nullable":true},"eori":{"type":"string","nullable":true},"adres":{"type":"string","nullable":true},"udzial":{"type":"number","format":"double","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta do powiązania z kartoteką (Knt_Kod). Opcjonalne.","nullable":true}},"additionalProperties":false,"description":"Podmiot trzeci KSeF na dokumencie batch."},"KSeFPodmiot3Request":{"required":["rolaPodmiotu"],"type":"object","properties":{"rolaPodmiotu":{"maximum":11,"minimum":1,"type":"integer","description":"Rola podmiotu trzeciego (TKP_RolaPodmiotu). Wymagane.\n1 = Faktor, 2 = Odbiorca, 3 = Podmiot pierwotny, 4 = Dodatkowy nabywca,\n5 = Wystawca faktury, 6 = Dokonujący płatności, 7 = JST wystawca,\n8 = JST odbiorca, 9 = Członek GV wystawca, 10 = Członek GV odbiorca, 11 = Pracownik.","format":"int32"},"opisRoli":{"maxLength":500,"type":"string","description":"Opis roli (TKP_OpisRoli) — max 500 znaków.","nullable":true},"nazwa":{"maxLength":300,"type":"string","description":"Nazwa podmiotu (TKP_Nazwa) — max 300 znaków.","nullable":true},"nip":{"maxLength":50,"type":"string","description":"NIP podmiotu (TKP_Nip) — max 50 znaków.","nullable":true},"nipKraj":{"maxLength":2,"type":"string","description":"Kraj NIP — kod 2-literowy ISO (TKP_NipKraj), np. PL.","nullable":true},"rodzajIdentyfikatora":{"maximum":4,"minimum":1,"type":"integer","description":"Rodzaj identyfikatora (TKP_RodzajIdentyfikatora).\n1 = NIP, 2 = NIP-VAT-UE, 3 = Identyfikator podatkowy inny, 4 = Identyfikator wewnętrzny.","format":"int32","nullable":true},"nrKlienta":{"maxLength":50,"type":"string","description":"Nr klienta (TKP_NrKlienta) — max 50 znaków.","nullable":true},"eori":{"maxLength":50,"type":"string","description":"Numer EORI (TKP_EORI) — max 50 znaków.","nullable":true},"adres":{"maxLength":500,"type":"string","description":"Adres (TKP_Adres) — max 500 znaków.","nullable":true},"udzial":{"maximum":100,"minimum":0,"type":"number","description":"Udział procentowy (TKP_Udzial).","format":"double","nullable":true},"kontrahentKod":{"maxLength":50,"type":"string","description":"Kod kontrahenta (Knt_Kod) — gdy podany, podmiot zostanie powiązany z kartoteką\n(TKP_PodmiotTyp = 1, TKP_PodmiotId = Knt_KntId). Opcjonalne.","nullable":true}},"additionalProperties":false,"description":"Podmiot trzeci KSeF na dokumencie (CDN.KSeFPodmioty3 / TKP_*)."},"KSeFPodmiot3VATBatchDto":{"required":["rolaPodmiotu"],"type":"object","properties":{"rolaPodmiotu":{"maximum":11,"minimum":1,"type":"integer","description":"Rola podmiotu trzeciego. Wymagane.\n<list type=\"table\"><listheader><term>Wartość</term><description>Rola</description></listheader><item><term>1</term><description>Faktor</description></item><item><term>2</term><description>Odbiorca</description></item><item><term>3</term><description>Podmiot pierwotny</description></item><item><term>4</term><description>Dodatkowy nabywca</description></item><item><term>5</term><description>Wystawca faktury</description></item><item><term>6</term><description>Dokonujący płatności</description></item><item><term>7</term><description>JST – wystawca</description></item><item><term>8</term><description>JST – odbiorca</description></item><item><term>9</term><description>Członek GV – wystawca</description></item><item><term>10</term><description>Członek GV – odbiorca</description></item><item><term>11</term><description>Pracownik</description></item></list>","format":"int32"},"opisRoli":{"maxLength":500,"type":"string","description":"Opis słowny roli podmiotu. Maks. 500 znaków.","nullable":true},"nazwa":{"maxLength":300,"type":"string","description":"Nazwa podmiotu. Maks. 300 znaków.","nullable":true},"nip":{"maxLength":50,"type":"string","description":"Numer identyfikatora podatkowego (NIP lub odpowiednik). Maks. 50 znaków.","nullable":true},"nipKraj":{"maxLength":2,"type":"string","description":"Kod kraju ISO 3166-1 alpha-2, np. `PL`. Maks. 2 znaki.","nullable":true},"rodzajIdentyfikatora":{"maximum":4,"minimum":1,"type":"integer","description":"Rodzaj identyfikatora:\n`1`=NIP, `2`=NIP-VAT-UE, `3`=identyfikator podatkowy inny, `4`=identyfikator wewnętrzny.","format":"int32","nullable":true},"nrKlienta":{"maxLength":50,"type":"string","description":"Numer klienta. Maks. 50 znaków.","nullable":true},"eori":{"maxLength":50,"type":"string","description":"Numer EORI. Maks. 50 znaków.","nullable":true},"adres":{"maxLength":500,"type":"string","description":"Adres podmiotu (tekst). Maks. 500 znaków.","nullable":true},"udzial":{"maximum":100,"minimum":0,"type":"number","description":"Udział procentowy podmiotu (0–100).","format":"double","nullable":true},"kontrahentKod":{"maxLength":50,"type":"string","description":"Kod kontrahenta (`Knt_Kod`) z kartoteki Optimy.\nGdy podany — podmiot zostaje powiązany z kartoteką (`PodmiotTyp=1`, `PodmiotId=Knt_KntId`).\nMaks. 50 znaków.","nullable":true}},"additionalProperties":false,"description":"Podmiot trzeci KSeF powiązany z wpisem w rejestrze VAT."},"KategoriaItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator rekordu (Kat_KatID).","format":"int32"},"typ":{"type":"integer","description":"Typ kategorii: 1=koszty, 2=przychody (Kat_Typ).","format":"int32"},"kodOgolny":{"type":"string","description":"Kod kategorii ogólnej (Kat_KodOgolny).","nullable":true},"opis":{"type":"string","description":"Opis kategorii (Kat_Opis).","nullable":true},"kolumnaKPIR":{"type":"integer","description":"Numer kolumny KPIR (Kat_KolumnaKPIR):\n0=nie księgować, 1=sprzedaż(7), 2=pozostałe przychody(8), 3=zakupy towarów(10),\n4=koszty uboczne(11), 5=reklama(12), 6=wynagrodzenia(13), 7=pozostałe wydatki(14).","format":"int32"},"stawka":{"type":"number","description":"Stawka VAT % (Kat_Stawka).","format":"double"},"flaga":{"type":"integer","description":"Typ stawki VAT (Kat_Flaga): 1=zwolniona, 2=opodatkowana, 3=zaniżona, 4=nie podlega.","format":"int32"},"odliczenia":{"type":"integer","description":"Odliczenia VAT (Kat_Odliczenia): 0=nie odliczać, 1=odliczać, 2=warunkowo.","format":"int32"},"rodzajZakupu":{"type":"integer","description":"Rodzaj zakupu (Kat_RodzajZakupu):\n1=towary, 2=inne(kosztowe), 3=środki trwałe, 4=usługi,\n5=środki transportu, 6=nieruchomości, 7=paliwo.","format":"int32"},"sciezka":{"type":"string","description":"Ścieżka kategorii — dla ogólnej to sam KodOgolny.","nullable":true},"szczegolowe":{"type":"array","items":{"$ref":"#/components/schemas/KategoriaSzczegolowaItem"},"description":"Lista aktywnych kategorii szczegółowych podrzędnych do tej kategorii.","nullable":true}},"additionalProperties":false,"description":"Kategoria ogólna (Kat_Poziom=1) z CDN.Kategorie wraz z listą podrzędnych kategorii szczegółowych."},"KategoriaResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja się powiodła."},"message":{"type":"string","description":"Komunikat opisowy — sukcesu lub błędu.","nullable":true},"id":{"type":"integer","description":"Identyfikator utworzonego rekordu (Kat_KatID).","format":"int32","nullable":true},"typ":{"type":"integer","description":"Typ kategorii: 1=koszty, 2=przychody.","format":"int32","nullable":true},"poziom":{"type":"integer","description":"Poziom kategorii: 1=ogólna, 2=szczegółowa.","format":"int32","nullable":true},"kodOgolny":{"type":"string","description":"Kod kategorii ogólnej.","nullable":true},"kodSzczegol":{"type":"string","description":"Kod kategorii szczegółowej — dla Poziom=1 równy KodOgolny.","nullable":true},"opis":{"type":"string","description":"Opis kategorii.","nullable":true},"sciezka":{"type":"string","description":"Ścieżka kategorii — \"KodOgolny\" dla ogólnej, \"KodOgolny\\KodSzczegol\" dla szczegółowej.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji dodania lub edycji kategorii."},"KategoriaSzczegolowaItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator rekordu (Kat_KatID).","format":"int32"},"kodSzczegol":{"type":"string","description":"Kod kategorii szczegółowej (Kat_KodSzczegol).","nullable":true},"opis":{"type":"string","description":"Opis kategorii (Kat_Opis).","nullable":true},"kolumnaKPIR":{"type":"integer","description":"Numer kolumny KPIR (Kat_KolumnaKPIR):\n0=nie księgować, 1=sprzedaż(7), 2=pozostałe przychody(8), 3=zakupy towarów(10),\n4=koszty uboczne(11), 5=reklama(12), 6=wynagrodzenia(13), 7=pozostałe wydatki(14).","format":"int32"},"stawka":{"type":"number","description":"Stawka VAT % (Kat_Stawka).","format":"double"},"flaga":{"type":"integer","description":"Typ stawki VAT (Kat_Flaga): 1=zwolniona, 2=opodatkowana, 3=zaniżona, 4=nie podlega.","format":"int32"},"odliczenia":{"type":"integer","description":"Odliczenia VAT (Kat_Odliczenia): 0=nie odliczać, 1=odliczać, 2=warunkowo.","format":"int32"},"rodzajZakupu":{"type":"integer","description":"Rodzaj zakupu (Kat_RodzajZakupu):\n1=towary, 2=inne(kosztowe), 3=środki trwałe, 4=usługi,\n5=środki transportu, 6=nieruchomości, 7=paliwo.","format":"int32"},"sciezka":{"type":"string","description":"Ścieżka kategorii w formacie \"KodOgolny\\KodSzczegol\".","nullable":true}},"additionalProperties":false,"description":"Kategoria szczegółowa (Kat_Poziom=2) — podrzędna do kategorii ogólnej."},"KategoriePagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/KategoriaItem"},"description":"Rekordy na bieżącej stronie.","nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (od 1).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony (liczba kategorii ogólnych).","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba kategorii ogólnych pasujących do filtrów.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Stronicowana lista kategorii ogólnych (każda z zagnieżdżonymi szczegółowymi)."},"KontaPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/KontoItem"},"nullable":true},"okresObrachunkowyId":{"type":"integer","description":"Identyfikator okresu obrachunkowego, dla którego pobrano plan kont.","format":"int32"},"strona":{"type":"integer","description":"Numer bieżącej strony (1-based).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba rekordów spełniających kryteria.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Stronicowany wynik zapytania o plan kont."},"KontoBankoweDto":{"type":"object","properties":{"rachunekNr":{"type":"string","description":"Numer rachunku bankowego (SPL_RachunekNr).","nullable":true},"iban":{"type":"boolean","description":"Czy numer jest w formacie IBAN (SPL_IBAN)."},"waluta":{"type":"string","description":"Waluta rachunku (SPL_Waluta).","nullable":true},"bankNazwa":{"type":"string","description":"Nazwa banku (BNa_Nazwa z CDN.BnkNazwy). Null gdy brak powiązania z bankiem.","nullable":true},"opis":{"type":"string","description":"Opis rachunku (SPL_Opis).","nullable":true},"domyslny":{"type":"boolean","description":"Czy rachunek jest domyślny / obsługuje resztę (SPL_Reszta)."}},"additionalProperties":false,"description":"Konto bankowe / schemat płatności kontrahenta (CDN.SchematPlatnosci)."},"KontoItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator konta (Acc_AccId).","format":"int32"},"parentId":{"type":"integer","description":"Identyfikator konta nadrzędnego (Acc_ParId). Null dla konta najwyższego poziomu.","format":"int32","nullable":true},"numer":{"type":"string","description":"Pełny numer konta, np. \"201-1-01\" (Acc_Numer).","nullable":true},"numerIdx":{"type":"string","description":"Numer konta bez myślników, do sortowania/wyszukiwania (Acc_NumerIdx).","nullable":true},"nazwa":{"type":"string","description":"Nazwa konta.","nullable":true},"nazwa2":{"type":"string","description":"Druga (dodatkowa) nazwa konta.","nullable":true},"poziom":{"type":"integer","description":"Poziom zagłębienia w planie kont (0 = konto syntetyczne najwyższego poziomu).","format":"int32"},"analityczne":{"type":"boolean","description":"Czy konto jest analityczne (księgowalne — liść w hierarchii)."},"rozrachunkowe":{"type":"boolean","description":"Czy konto podlega rozrachunkom (rozliczeniom Wn/Ma)."},"bezRozliczenia":{"type":"boolean","description":"Czy konto rozrachunkowe jest bez rozliczania."},"waluta":{"type":"string","description":"Waluta konta (PLN dla kont złotówkowych).","nullable":true},"aktywne":{"type":"boolean","description":"Czy konto jest aktywne."},"okresObrachunkowyId":{"type":"integer","description":"Identyfikator okresu obrachunkowego, do którego należy ta wersja konta (Acc_OObId).","format":"int32"},"typKonta":{"type":"integer","description":"Rodzaj konta (Acc_TypKonta): 1=Aktywa, 2=Pasywa, 3=Aktywa-Pasywa, 4=Przychody, 5=Koszty, 6=Pozabilansowe, 7=Przychody-koszty.","format":"int32"},"typKontaOpis":{"type":"string","description":"Czytelny opis rodzaju konta.","nullable":true},"slownik":{"type":"integer","description":"Rodzaj słownika podpiętego do konta (Acc_Slownik): 0=brak, 1=Kontrahent (Kontrahenci), 2=Bank (BnkNazwy),\n3=Pracownik/Wspólnik (PracEtaty), 5=Urząd (Urzedy), 6=Środek trwały (Trwale), 7=Towar (Towary).","format":"int32"},"slownikOpis":{"type":"string","description":"Czytelny opis rodzaju słownika. Null, gdy konto nie jest słownikowe.","nullable":true},"slownikTyp":{"type":"integer","description":"Typ słownika dla materializowanego konta słownikowego (Acc_SlownikTyp), z tego samego zbioru kodów co Acc_Slownik. Null dla konta-wzorca.","format":"int32","nullable":true},"slownikTypOpis":{"type":"string","description":"Czytelny opis typu słownika materializowanego konta. Null dla konta-wzorca.","nullable":true},"slownikId":{"type":"integer","description":"Identyfikator wiersza w słowniku (np. Knt_KntId) dla materializowanego konta słownikowego. Null dla konta-wzorca.","format":"int32","nullable":true}},"additionalProperties":false,"description":"Konto księgowe z CDN.Konta."},"KontrahenciBatchRequest":{"required":["kontrahenci"],"type":"object","properties":{"firma":{"type":"string","description":"Nazwa firmy w Optimie (Login2Firm), np. `CDN_Demo`.\nGdy pominięta — używana firma przypisana do tokena lub domyślna z konfiguracji.","nullable":true,"example":"CDN_Demo"},"kontrahenci":{"type":"array","items":{"$ref":"#/components/schemas/KontrahentBatchItem"},"description":"Lista kontrahentów do dodania. Wymagana co najmniej jedna pozycja."}},"additionalProperties":false,"description":"Żądanie batch dodawania kontrahentów.\nKażda pozycja w `Kontrahenci` to jeden nowy kontrahent tworzony przez COM Optimy."},"KontrahenciPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"Rekordy na bieżącej stronie.","nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (od 1).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba rekordów pasujących do filtrów.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Stronicowana lista kontrahentów z metadanymi paginacji."},"KontrahentBatchItem":{"required":["akronim","nazwa1"],"type":"object","properties":{"akronim":{"maxLength":20,"minLength":1,"type":"string","description":"Unikalny akronim (kod skrócony) kontrahenta — maks. 20 znaków.\nZostanie zamieniony na WIELKIE litery. Musi być unikalny w bazie Optimy (`Knt_Kod`).","example":"KOWALSKI"},"nip":{"maxLength":15,"type":"string","description":"Numer NIP bez kresek i prefiksu kraju, np. `1234567890`.\nOpcjonalny — gdy pominięty, NIP nie zostanie ustawiony. Pole bazy: `Knt_Nip`.","nullable":true,"example":"1234567890"},"nipKraj":{"maxLength":2,"type":"string","description":"Dwuliterowy prefiks kraju NIP (ISO 3166-1 alpha-2). Domyślnie `PL`.\nPole bazy: `Knt_NipKraj`.","nullable":true,"example":"PL"},"gln":{"maxLength":13,"type":"string","description":"Global Location Number — 13 cyfr. Pole bazy: `Knt_GLN`.","nullable":true},"ksefIdWewnetrzny":{"maxLength":20,"type":"string","description":"Wewnętrzny identyfikator KSeF. Pole bazy: `Knt_KsefIdWewnetrzny`.","nullable":true},"nazwa1":{"maxLength":50,"minLength":1,"type":"string","description":"Pierwsza linia nazwy kontrahenta — wymagana. Pole bazy: `Knt_Nazwa1`.\nOptima składa pełną nazwę z linii: `Nazwa1 + \" \" + Nazwa2`.","example":"Kowalski Jan"},"nazwa2":{"maxLength":50,"type":"string","description":"Druga linia nazwy. Pole bazy: `Knt_Nazwa2`.","nullable":true,"example":"Usługi transportowe"},"nazwa3":{"maxLength":250,"type":"string","description":"Trzecia linia nazwy, np. forma prawna. Pole bazy: `Knt_Nazwa3`.","nullable":true},"ulica":{"maxLength":40,"type":"string","description":"Ulica bez numeru, np. `Marszałkowska`. Pole bazy: `Knt_Ulica`.","nullable":true},"nrDomu":{"maxLength":10,"type":"string","description":"Numer domu/lokalu, np. `12A`. Pole bazy: `Knt_NrDomu`.","nullable":true},"kodPocztowy":{"maxLength":10,"type":"string","description":"Kod pocztowy w formacie XX-XXX, np. `00-001`. Pole bazy: `Knt_KodPocztowy`.","nullable":true},"poczta":{"maxLength":40,"type":"string","description":"Miejscowość poczty (gdy inna niż miasto). Pole bazy: `Knt_Poczta`.","nullable":true},"miasto":{"maxLength":40,"type":"string","description":"Miasto. Pole bazy: `Knt_Miasto`.","nullable":true},"gmina":{"maxLength":40,"type":"string","description":"Gmina. Pole bazy: `Knt_Gmina`.","nullable":true},"powiat":{"maxLength":40,"type":"string","description":"Powiat. Pole bazy: `Knt_Powiat`.","nullable":true},"wojewodztwo":{"maxLength":40,"type":"string","description":"Województwo. Pole bazy: `Knt_Wojewodztwo`.","nullable":true},"kraj":{"maxLength":40,"type":"string","description":"Pełna nazwa kraju. Domyślnie `Polska`. Pole bazy: `Knt_Kraj`.","nullable":true},"email":{"maxLength":127,"type":"string","description":"Adres e-mail. Pole bazy: `Knt_Email`.","nullable":true},"telefon":{"maxLength":20,"type":"string","description":"Telefon główny. Pole bazy: `Knt_Telefon1`.","nullable":true},"telefon2":{"maxLength":20,"type":"string","description":"Telefon dodatkowy. Pole bazy: `Knt_Telefon2`.","nullable":true}},"additionalProperties":false,"description":"Dane jednego kontrahenta do dodania w ramach zadania batch."},"KontrahentResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"akronim":{"type":"string","description":"Akronim (kod skrócony) dodanego kontrahenta. Wypełniony tylko przy sukcesie.","nullable":true},"nazwaPelna":{"type":"string","description":"Pełna nazwa kontrahenta wygenerowana przez Optimę po zapisie. Wypełniona tylko przy sukcesie.","nullable":true},"id":{"type":"integer","description":"ID kontrahenta. Wypełniony tylko przy sukcesie.","format":"int32","nullable":true}},"additionalProperties":false,"description":"Wynik operacji dodania lub weryfikacji kontrahenta."},"LimitUrlopowyDto":{"type":"object","properties":{"akronim":{"type":"string","description":"Akronim (skrót) pracownika (PRE_Kod).","nullable":true},"pracownik":{"type":"string","description":"Imię i nazwisko pracownika.","nullable":true},"naleznyWRoku":{"type":"number","description":"Należny urlop w bieżącym roku w dniach (PLN_NalezneF).","format":"double"},"zPrzeniesienia":{"type":"number","description":"Urlop przeniesiony z poprzedniego okresu w dniach (PLN_PrzeniesienieF).","format":"double"},"naleznyLacznie":{"type":"number","description":"Łączny urlop należny w dniach (PLN_NalezneLacznieF).","format":"double"},"naleznyLacznieGodziny":{"type":"string","description":"Łączny urlop należny w godzinach i minutach (format HH:mm).","nullable":true},"wykorzystaneDni":{"type":"number","description":"Urlop wykorzystany w dniach (PLN_WykorzystaneF).","format":"double"},"wykorzystaneGodziny":{"type":"string","description":"Urlop wykorzystany w godzinach i minutach (format HH:mm).","nullable":true},"pozostaloDni":{"type":"number","description":"Pozostały urlop w dniach (PLN_PozostaloF).","format":"double"},"pozostaloGodziny":{"type":"string","description":"Pozostały urlop w godzinach i minutach (format HH:mm).","nullable":true},"rodzajUrlopu":{"type":"string","description":"Rodzaj urlopu (LNB_Nazwa).","nullable":true}},"additionalProperties":false,"description":"Limit urlopowy pracownika."},"LimityUrlopoweResponse":{"type":"object","properties":{"liczba":{"type":"integer","description":"Łączna liczba rekordów pasujących do filtrów.","format":"int32"},"dane":{"type":"array","items":{"$ref":"#/components/schemas/LimitUrlopowyDto"},"description":"Lista limitów urlopowych.","nullable":true}},"additionalProperties":false,"description":"Odpowiedź z limitami urlopowymi pracowników."},"MagazynResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"id":{"type":"integer","description":"ID magazynu (Mag_MagId). Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"symbol":{"type":"string","description":"Symbol magazynu. Wypełniony tylko przy sukcesie.","nullable":true},"nazwa":{"type":"string","description":"Nazwa magazynu. Wypełniona tylko przy sukcesie.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na magazynie."},"MfStatusVatDto":{"type":"object","properties":{"requestId":{"type":"string","description":"Identyfikator zapytania zwrócony przez API MF.","nullable":true},"statusVat":{"type":"string","description":"Status VAT podatnika: Czynny / Zwolniony / Niezarejestrowany.","nullable":true},"numeryKont":{"type":"array","items":{"type":"string"},"description":"Lista numerów rachunków bankowych zgłoszonych do VAT.","nullable":true}},"additionalProperties":false,"description":"Status VAT i rachunki bankowe z Białej Listy Ministerstwa Finansów."},"NowaDefCena":{"required":["lp","nazwa"],"type":"object","properties":{"lp":{"type":"integer","description":"Numer kolejny ceny. Wartość 1 = cena zakupu, wartości >1 = ceny sprzedaży.\nPole bazy: `DfC_Lp`. Musi być unikatowy — używany jako klucz w PUT/DELETE.","format":"int32","example":2},"nazwa":{"maxLength":20,"minLength":1,"type":"string","description":"Nazwa ceny — max 20 znaków. Pole bazy: `DfC_Nazwa`.","example":"Cena detaliczna"},"typ":{"maximum":2,"minimum":1,"type":"integer","description":"Typ ceny. Pole bazy: `DfC_Typ`.\n- **1** — netto (domyślnie)\n- **2** — brutto","format":"int32","example":1},"aktualizacja":{"type":"boolean","description":"Czy cena ma być automatycznie aktualizowana przy zakupie. Pole bazy: `DfC_Aktualizacja` (0/1).\nDomyślnie false."},"marza":{"type":"number","description":"Domyślna marża dla ceny w %. Pole bazy: `DfC_Marza`. Domyślnie 0.","format":"double"},"zaokraglenie":{"type":"number","description":"Zaokrąglenie ceny. Pole bazy: `DfC_Zaokraglenie`. Domyślnie 0.","format":"double"},"offset":{"type":"number","description":"Wartość dodawana do ceny po zaokrągleniu (np. -0.01 daje ceny 9.99). Pole bazy: `DfC_Offset`. Domyślnie 0.","format":"double"},"waluta":{"maxLength":3,"type":"string","description":"Domyślna waluta dla ceny — max 3 znaki. Pole bazy: `DfC_Waluta`. Domyślnie PLN.","nullable":true,"example":"PLN"},"nieaktywna":{"type":"boolean","description":"Czy cena jest nieaktywna. Pole bazy: `DfC_Nieaktywna` (0/1). Domyślnie false."}},"additionalProperties":false,"description":"Dane nowej definicji ceny (CDN.DefCeny)."},"NowaGrupaKontrahentow":{"required":["nazwa"],"type":"object","properties":{"nazwa":{"maxLength":32,"minLength":1,"type":"string","description":"Nazwa grupy (Gru_Nazwa) — unikalna wśród grup kontrahentów, max 32 znaki."},"opis":{"maxLength":128,"type":"string","description":"Opis grupy (Gru_Opis) — max 128 znaków.","nullable":true}},"additionalProperties":false,"description":"Dane nowej grupy kontrahentów."},"NowaGrupaTowarowaRequest":{"required":["kod","nazwa"],"type":"object","properties":{"kod":{"maxLength":50,"minLength":1,"type":"string","description":"Kod grupy towarowej (TwG_Kod) — unikalny w bazie, max 50 znaków."},"nazwa":{"maxLength":255,"minLength":1,"type":"string","description":"Nazwa grupy towarowej (TwG_Nazwa), max 255 znaków."},"kodGrupyNadrzednej":{"maxLength":50,"type":"string","description":"Kod grupy nadrzędnej (TwG_Kod rodzica). Null lub puste = grupa główna (GRONumer=0).\nDla podgrupy musi wskazywać na istniejącą grupę towarową.","nullable":true}},"additionalProperties":false},"NowaKategoriaRequest":{"type":"object","properties":{"typ":{"type":"integer","description":"Typ kategorii (Kat_Typ): 1=koszty, 2=przychody.","format":"int32"},"kodOgolny":{"type":"string","description":"Kod kategorii ogólnej (Kat_KodOgolny). Wymagany zawsze.\nGdy `kodSzczegol` jest pominięty — tworzona jest kategoria ogólna (Poziom=1).\nGdy podano `kodSzczegol` — musi wskazywać na istniejącą kategorię ogólną,\npod którą zostanie utworzona kategoria szczegółowa (Poziom=2); to przez to pole\nOptima wiąże kategorię szczegółową z nadrzędną (Kat_ParentID jest wyliczane automatycznie).","nullable":true},"kodSzczegol":{"type":"string","description":"Kod kategorii szczegółowej (Kat_KodSzczegol). Opcjonalny — jego obecność decyduje o poziomie\ntworzonej kategorii: pominięty → kategoria ogólna (Poziom=1), podany → kategoria szczegółowa\n(Poziom=2) pod kategorią ogólną wskazaną w `kodOgolny`.","nullable":true},"opis":{"type":"string","description":"Opis kategorii (Kat_Opis, maks. 50 znaków).","nullable":true},"kolumnaKPIR":{"type":"integer","description":"Numer kolumny KPIR (Kat_KolumnaKPIR):\n0=nie księgować, 1=sprzedaż(kol.7), 2=pozostałe przychody(kol.8), 3=zakupy towarów(kol.10),\n4=koszty uboczne(kol.11), 5=reprezentacja i reklama(kol.12), 6=wynagrodzenia(kol.13), 7=pozostałe wydatki(kol.14).","format":"int32"},"stawka":{"type":"number","description":"Domyślna stawka VAT % przypisana do kategorii (Kat_Stawka), np. 23, 8, 5, 0.\nDziała razem z `flaga` — patrz opis endpointu.","format":"double"},"flaga":{"type":"integer","description":"Typ stawki VAT (Kat_Flaga): 1=zwolniona (ZW), 2=opodatkowana, 3=zaniżona, 4=nie podlega (NP).\nDziała razem z `stawka` — patrz opis endpointu.","format":"int32"},"odliczenia":{"type":"integer","description":"Odliczenia VAT od zakupów (Kat_Odliczenia): 0=nie odliczać, 1=odliczać, 2=odliczać warunkowo.","format":"int32"},"rodzajZakupu":{"type":"integer","description":"Rodzaj zakupu (Kat_RodzajZakupu):\n1=towary, 2=inne(kosztowe), 3=środki trwałe, 4=usługi,\n5=środki transportu, 6=nieruchomości, 7=paliwo.","format":"int32"},"kontoSegmentWN":{"type":"string","description":"Segment konta księgowego Winien (Kat_KontoSegmentWN, maks. 50 znaków). Opcjonalny.","nullable":true},"kontoSegmentMA":{"type":"string","description":"Segment konta księgowego Ma (Kat_KontoSegmentMA, maks. 50 znaków). Opcjonalny.","nullable":true},"podzielOdliczenia":{"type":"boolean","description":"Czy dzielić odliczenia VAT proporcją (Kat_PodzielOdliczenia). Domyślnie `false` (0).\nMa znaczenie tylko przy `odliczenia`=2 (warunkowo) — patrz opis endpointu.","nullable":true},"podzielOdliczeniaProcent":{"type":"number","description":"Procent podziału odliczeń VAT (Kat_PodzielOdliczeniaProcent), 0-100. Domyślnie `50.00`.\nMa znaczenie tylko gdy `podzielOdliczenia`=true.","format":"double","nullable":true},"ksiegujWKoszty":{"type":"boolean","description":"Czy księgować w koszty proporcją (Kat_KsiegujWKoszty). Domyślnie `false` (0).","nullable":true},"ksiegujWKosztyProcent":{"type":"number","description":"Procent księgowania w koszty (Kat_KsiegujWKosztyProcent), 0-100. Domyślnie `75.00`.\nMa znaczenie tylko gdy `ksiegujWKoszty`=true.","format":"double","nullable":true}},"additionalProperties":false,"description":"Żądanie dodania nowej kategorii (ogólnej lub szczegółowej) do CDN.Kategorie."},"NowyAtrybut":{"required":["kod","nazwa","typ"],"type":"object","properties":{"kod":{"maxLength":20,"minLength":1,"type":"string","description":"Kod definicji atrybutu — unikalny, max 20 znaków.","example":"KOLOR"},"nazwa":{"maxLength":50,"minLength":1,"type":"string","description":"Nazwa atrybutu.","example":"Kolor towaru"},"typ":{"maximum":4,"minimum":1,"type":"integer","description":"Typ atrybutu:\n- **1** — towar\n- **2** — kontrahent\n- **3** — środek trwały\n- **4** — dokument","format":"int32","example":1},"format":{"maximum":5,"minimum":1,"type":"integer","description":"Format danych atrybutu:\n- **1** — tekst (domyślnie)\n- **2** — liczba\n- **3** — lista (wartości z kolekcji Wartosci)\n- **4** — data\n- **5** — binarna","format":"int32","example":1},"czyKopiowacFA":{"type":"boolean","description":"Czy dokleić wartość atrybutu do opisu elementu na fakturze."},"czyKod":{"type":"boolean","description":"Czy kod atrybutu ma być wyświetlany przed wartością."},"zalezny":{"type":"boolean","description":"Czy atrybut zależny od kontrahenta."},"czyPrzenosic":{"type":"boolean","description":"Czy przenosić atrybut na transakcje."},"czyDrukowac":{"type":"boolean","description":"Czy drukować atrybut na transakcjach."},"czyKopiowacDoVAT":{"type":"boolean","description":"Czy kopiować atrybut do rejestru VAT."},"eSklep":{"type":"boolean","description":"Czy udostępniać atrybut w e-Sklepie."},"czyPrzenosicNaDostawy":{"type":"boolean","description":"Czy przenosić atrybut na dostawy."},"czyObowiazkowyDostawy":{"type":"boolean","description":"Czy atrybut jest obowiązkowy na dostawach."},"analizyBI":{"type":"boolean","description":"Czy przenosić atrybut do Analiz BI."},"udostepniajWMobile":{"type":"boolean","description":"Czy udostępniać atrybut w aplikacji Mobile."},"pozwalajNaEdycje":{"type":"boolean","description":"Czy pozwalać na edycję wartości w aplikacji Mobile."},"pozwalajNaEdycjeESklep":{"type":"boolean","description":"Czy pozwalać na edycję wartości w e-Sklepie."},"jpkDostepnyFA":{"type":"boolean","description":"Czy atrybut widoczny na fakturach JPK_FA."},"jpkDostepnyVAT":{"type":"boolean","description":"Czy atrybut widoczny w rejestrach VAT (JPK_VAT)."},"jpkDostepnyFAVAT":{"type":"boolean","description":"Czy atrybut widoczny w rejestrach VAT i na fakturach JPK_FA łącznie."},"nieaktywny":{"type":"boolean","description":"Czy atrybut jest nieaktywny (ukryty w interfejsie Optimy)."}},"additionalProperties":false,"description":"Dane nowej definicji atrybutu do dodania w Comarch ERP Optima (CDN.DefAtrybuty)."},"NowyAtrybutTowaru":{"required":["kodAtrybutu"],"type":"object","properties":{"kodAtrybutu":{"maxLength":40,"minLength":1,"type":"string","description":"Kod definicji atrybutu (DeA_Kod) — musi istnieć w CDN.DefAtrybuty jako atrybut towaru."},"wartosc":{"type":"string","description":"Wartość atrybutu.","nullable":true}},"additionalProperties":false},"NowyDokumentHaMagRequest":{"required":["pozycje","typ"],"type":"object","properties":{"typ":{"minLength":1,"type":"string","description":"Kod typu dokumentu. Dostępne typy: GET /dokumenty/typy.","example":"FS"},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod). Wymagany dla dokumentów sprzedażowych i zakupowych.","nullable":true,"example":"ALOZA"},"magazynSymbol":{"type":"string","description":"Symbol magazynu źródłowego. Wymagany dla dokumentów magazynowych.","nullable":true,"example":"MAG"},"magazynDocelowySymbol":{"type":"string","description":"Symbol magazynu docelowego. Wymagany dla MM (przesunięcia między magazynami).","nullable":true,"example":"MAG2"},"bufor":{"type":"boolean","description":"Czy zapisać do bufora (true = bufor, false = zatwierdzone). Domyślnie false.","example":false},"dataWys":{"type":"string","description":"Data wystawienia dokumentu.","format":"date-time","nullable":true},"dataSprzedazy":{"type":"string","description":"Data sprzedaży.","format":"date-time","nullable":true},"dataDok":{"type":"string","description":"Data dokumentu.","format":"date-time","nullable":true},"dataDokKorekta":{"type":"string","description":"Data dokumentu korekty (dla dokumentów korygujących).","format":"date-time","nullable":true},"dataOpeKorekta":{"type":"string","description":"Data operacji korekty (dla dokumentów korygujących).","format":"date-time","nullable":true},"dataWysKorekta":{"type":"string","description":"Data wystawienia korekty (dla dokumentów korygujących).","format":"date-time","nullable":true},"typNB":{"type":"integer","description":"Typ ceny na dokumencie: 1 = netto, 2 = brutto. Domyślnie 1.","format":"int32","example":1},"formaPlatnosci":{"type":"string","description":"Nazwa formy płatności (Fpl_Nazwa).","nullable":true,"example":"PRZELEW"},"walutaSymbol":{"type":"string","description":"Symbol waluty (np. EUR, USD). Puste = waluta domyślna (PLN).","nullable":true,"example":"EUR"},"numerObcy":{"type":"string","description":"Numer obcy dokumentu (np. numer faktury dostawcy).","nullable":true,"example":"FV/2024/001"},"podNazwa1":{"type":"string","description":"Pierwszy wiersz nazwy podmiotu — nadpisuje dane pobrane z kartoteki kontrahenta.","nullable":true},"podNazwa2":{"type":"string","description":"Drugi wiersz nazwy podmiotu.","nullable":true},"podNazwa3":{"type":"string","description":"Trzeci wiersz nazwy podmiotu.","nullable":true},"podAdres":{"$ref":"#/components/schemas/AdresRequest"},"odbNazwa1":{"type":"string","description":"Pierwszy wiersz nazwy odbiorcy — nadpisuje dane pobrane z kartoteki.","nullable":true},"odbNazwa2":{"type":"string","description":"Drugi wiersz nazwy odbiorcy.","nullable":true},"odbNazwa3":{"type":"string","description":"Trzeci wiersz nazwy odbiorcy.","nullable":true},"odbAdres":{"$ref":"#/components/schemas/AdresRequest"},"generujWzPz":{"type":"boolean","description":"Czy automatycznie wygenerować dokument WZ (dla FS) lub PZ (dla FZ) po zapisie faktury."},"odbEmail":{"type":"string","description":"E-mail odbiorcy (pole OdbEmail).","nullable":true},"odbTelefon":{"type":"string","description":"Telefon odbiorcy (pole OdbTelefon).","nullable":true},"odebral":{"type":"string","description":"Osoba, która odebrała dokument (pole Odebral).","nullable":true},"uwagi":{"type":"string","description":"Uwagi do dokumentu (pole Uwagi).","nullable":true},"termin":{"type":"string","description":"Termin dokumentu. Znaczenie zależy od typu:\nFS/FZ/FSK/FZK/PA/PAK — termin zapłaty;\nRO/ZD/PF — termin ważności oferty/rezerwacji/zamówienia;\npozostałe typy — data realizacji.","format":"date-time","nullable":true},"nrKSeF":{"type":"string","description":"Numer KSeF dokumentu (TrN_NrKSeF). Uzupełnij dla dokumentów zakupowych (FZ/FZK)\nposiadających już numer nadany przez KSeF.","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia przez KSeF (TrN_KSeFDataPrzyjecia).","format":"date-time","nullable":true},"atrybuty":{"type":"array","items":{"$ref":"#/components/schemas/AtrybutDokumentuRequest"},"description":"Atrybuty dokumentu — lista par kod atrybutu / wartość.","nullable":true},"kSeFPodmioty3":{"type":"array","items":{"$ref":"#/components/schemas/KSeFPodmiot3Request"},"description":"Podmioty trzecie KSeF (CDN.KSeFPodmioty3).","nullable":true},"pozycje":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/PozycjaDokumentuRequest"},"description":"Pozycje dokumentu."}},"additionalProperties":false,"description":"Dane nowego dokumentu handlowo-magazynowego."},"NowyEan":{"required":["ean"],"type":"object","properties":{"ean":{"maxLength":40,"minLength":1,"type":"string","description":"Kod EAN — max 40 znaków (TwE_EAN)."},"opis":{"maxLength":100,"type":"string","description":"Opis kodu EAN — max 100 znaków (TwE_Opis).","nullable":true},"domyslny":{"type":"boolean","description":"Czy to domyślny kod EAN towaru (TwE_Domyslny). Domyślnie false."},"jm":{"maxLength":20,"type":"string","description":"Jednostka miary powiązana z kodem EAN — max 20 znaków (TwE_JM). Domyślnie SZT.","nullable":true}},"additionalProperties":false,"description":"Dane nowego kodu EAN towaru (CDN.TwrEan)."},"NowyKontrahentRequest":{"required":["akronim"],"type":"object","properties":{"akronim":{"maxLength":20,"minLength":1,"type":"string","description":"Unikalny akronim (kod skrócony) kontrahenta — max 20 znaków, zostanie zamieniony na wielkie litery.\nMusi być unikatowy w bazie Optimy. Pole bazy: `Knt_Kod`.","example":"KOWALSKI"},"daneZGUS":{"type":"boolean","description":"Gdy `true` — wymagany jest tylko `Akronim` i `Nip` (10-cyfrowy, polski).\nPozostałe dane adresowe i nazwa zostaną pobrane z GUS REGON BIR1.\nJawnie podane pola nadpisują dane z GUS."},"nazwa1":{"maxLength":50,"type":"string","description":"Pierwsza linia nazwy kontrahenta. Pole bazy: `Knt_Nazwa1`.\nWymagane gdy `DaneZGUS = false`.","nullable":true,"example":"Kowalski Jan"},"nazwa2":{"maxLength":50,"type":"string","description":"Druga linia nazwy kontrahenta (opcjonalna). Pole bazy: `Knt_Nazwa2`.","nullable":true,"example":"Usługi transportowe"},"nazwa3":{"maxLength":250,"type":"string","description":"Trzecia linia nazwy kontrahenta (opcjonalna). Pole bazy: `Knt_Nazwa3`.","nullable":true},"nipKraj":{"maxLength":2,"type":"string","description":"Dwuliterowy prefiks kraju NIP (ISO 3166-1 alpha-2). Domyślnie \"PL\". Pole bazy: `Knt_NipKraj`.","nullable":true,"example":"PL"},"nip":{"maxLength":15,"type":"string","description":"Numer NIP bez kresek i prefiksu kraju. Opcjonalny — jeśli pominięty, NIP nie zostanie ustawiony.\nPole bazy: `Knt_Nip`.","nullable":true,"example":"1234567890"},"ulica":{"maxLength":40,"type":"string","description":"Ulica (bez numeru domu). Pole bazy: `Knt_Ulica`.","nullable":true,"example":"Marszałkowska"},"nrDomu":{"maxLength":10,"type":"string","description":"Numer domu. Pole bazy: `Knt_NrDomu`.","nullable":true,"example":"12A"},"kodPocztowy":{"maxLength":10,"type":"string","description":"Kod pocztowy w formacie XX-XXX. Pole bazy: `Knt_KodPocztowy`.","nullable":true,"example":"00-001"},"poczta":{"maxLength":40,"type":"string","description":"Miejscowość poczty (może różnić się od miasta). Pole bazy: `Knt_Poczta`.","nullable":true,"example":"Warszawa"},"miasto":{"maxLength":40,"type":"string","description":"Miasto. Pole bazy: `Knt_Miasto`.","nullable":true,"example":"Warszawa"},"kraj":{"maxLength":40,"type":"string","description":"Kraj — pełna nazwa. Domyślnie \"Polska\". Pole bazy: `Knt_Kraj`.","nullable":true,"example":"Polska"},"gmina":{"maxLength":40,"type":"string","description":"Gmina. Pole bazy: `Knt_Gmina`.","nullable":true,"example":"Warszawa"},"powiat":{"maxLength":40,"type":"string","description":"Powiat. Pole bazy: `Knt_Powiat`.","nullable":true,"example":"Warszawa"},"wojewodztwo":{"maxLength":40,"type":"string","description":"Województwo. Pole bazy: `Knt_Wojewodztwo`.","nullable":true,"example":"mazowieckie"},"email":{"maxLength":127,"type":"string","description":"Adres e-mail kontrahenta. Pole bazy: `Knt_Email`.","nullable":true,"example":"jan.kowalski@example.com"},"telefon":{"maxLength":20,"type":"string","description":"Numer telefonu. Pole bazy: `Knt_Telefon1`.","nullable":true,"example":"+48 22 123 45 67"},"telefon2":{"maxLength":20,"type":"string","description":"Drugi numer telefonu. Pole bazy: `Knt_Telefon2`.","nullable":true,"example":"+48 600 123 456"},"gln":{"maxLength":13,"type":"string","description":"Numer GLN (Global Location Number) — 13 cyfr. Pole bazy: `Knt_GLN`.","nullable":true},"ksefIdWewnetrzny":{"maxLength":20,"type":"string","description":"Wewnętrzny identyfikator KSeF. Pole bazy: `Knt_KsefIdWewnetrzny`.","nullable":true}},"additionalProperties":false,"description":"Dane nowego kontrahenta do dodania w Comarch ERP Optima."},"NowyMagazyn":{"required":["nazwa","symbol"],"type":"object","properties":{"symbol":{"maxLength":20,"minLength":1,"type":"string","description":"Symbol magazynu — unikalny, max 20 znaków.","example":"MAG01"},"nazwa":{"maxLength":50,"minLength":1,"type":"string","description":"Nazwa magazynu — max 50 znaków.","example":"Magazyn główny"},"typ":{"maximum":3,"minimum":1,"type":"integer","description":"Typ magazynu:\n- **1** — lokalny (domyślnie)\n- **2** — odległy\n- **3** — serwisowy","format":"int32","example":1},"opis":{"maxLength":254,"type":"string","description":"Dodatkowy opis magazynu — max 254 znaki.","nullable":true},"magSeria":{"maxLength":5,"type":"string","description":"Domyślna seria dokumentów dla magazynu (Mag_Rejestr) — max 5 znaków.","nullable":true},"nieaktywny":{"type":"boolean","description":"Czy magazyn jest nieaktywny."},"unijny":{"type":"boolean","description":"Czy magazyn unijny (poza granicami Polski)."},"kraj":{"maxLength":2,"type":"string","description":"Kod kraju magazynu unijnego — max 2 znaki, np. \"DE\".","nullable":true},"kodTransakcji":{"maxLength":2,"type":"string","description":"Kod transakcji — domyślny dla magazynu, max 2 znaki.","nullable":true},"twCNumer":{"type":"integer","description":"Numer TwC.","format":"int32"},"konto":{"type":"string","description":"Konto księgowe.","nullable":true},"adres":{"type":"integer","description":"ID adresu magazynu.","format":"int32"}},"additionalProperties":false,"description":"Dane nowego magazynu do dodania w Comarch ERP Optima (CDN.Magazyny)."},"NowyPracownikRequest":{"required":["imie1","kod","nazwisko"],"type":"object","properties":{"kod":{"maxLength":20,"minLength":1,"type":"string","description":"Unikalny skrót identyfikujący pracownika — max 20 znaków, zapisywany wielkimi literami.","example":"KOWALSKI"},"nazwisko":{"maxLength":50,"minLength":1,"type":"string","description":"Nazwisko pracownika.","example":"Kowalski"},"imie1":{"maxLength":30,"minLength":1,"type":"string","description":"Pierwsze imię.","example":"Jan"},"imie2":{"maxLength":30,"type":"string","description":"Drugie imię.","nullable":true},"pesel":{"maxLength":11,"type":"string","description":"Numer PESEL — 11 cyfr.","nullable":true,"example":"85010112345"},"dataUr":{"type":"string","description":"Data urodzenia.","format":"date-time","nullable":true,"example":"1985-01-01"},"miejsceUr":{"maxLength":40,"type":"string","description":"Miejscowość urodzenia.","nullable":true},"plec":{"maxLength":1,"type":"string","description":"Płeć: `K` — kobieta, `M` — mężczyzna.","nullable":true},"stanCywilny":{"maxLength":20,"type":"string","description":"Stan cywilny. Typowe wartości: `K` kawaler/panna, `M` żonaty/mężatka,\n`R` rozwiedziony/a, `W` wdowiec/wdowa.","nullable":true},"dowOsobisty":{"maxLength":9,"type":"string","description":"Seria i numer dowodu osobistego, np. `ABC123456`.","nullable":true},"dowGdzie":{"maxLength":100,"type":"string","description":"Organ wydający dowód osobisty.","nullable":true},"dowKiedy":{"type":"string","description":"Data wydania dowodu osobistego.","format":"date-time","nullable":true},"dowWaznyDo":{"type":"string","description":"Data ważności dowodu osobistego.","format":"date-time","nullable":true},"telefonSms":{"maxLength":20,"type":"string","description":"Numer telefonu kontaktowego / do SMS.","nullable":true},"nipE":{"maxLength":13,"type":"string","description":"Numer NIP — dotyczy właścicieli i zleceniobiorców prowadzących działalność.","nullable":true},"typPracownika":{"type":"integer","description":"Typ pracownika: `0` = etatowy (domyślnie), `1` = zleceniobiorca, `2` = właściciel.","format":"int32"},"centrumKod":{"maxLength":20,"type":"string","description":"Kod centrum kosztów, do którego zostanie przypisany pracownik.\nJeśli centrum o podanym kodzie nie istnieje, żądanie zostanie odrzucone.","nullable":true},"dzialKod":{"maxLength":20,"type":"string","description":"Kod działu, do którego zostanie przypisany pracownik.\nJeśli dział o podanym kodzie nie istnieje, żądanie zostanie odrzucone.","nullable":true},"opis":{"type":"string","description":"Dodatkowe uwagi lub opis pracownika.","nullable":true},"daneKadrowe":{"$ref":"#/components/schemas/DaneKadroweDto"},"adresZamieszkania":{"$ref":"#/components/schemas/AdresPracownikaDto"},"adresKorespondencyjny":{"$ref":"#/components/schemas/AdresPracownikaDto"},"adresZameldowania":{"$ref":"#/components/schemas/AdresPracownikaDto"}},"additionalProperties":false,"description":"Dane nowego pracownika."},"NowyTowarRequest":{"required":["kod","nazwa"],"type":"object","properties":{"nazwa":{"maxLength":255,"minLength":1,"type":"string","description":"Nazwa towaru (Twr_Nazwa)."},"kod":{"maxLength":50,"minLength":1,"type":"string","description":"Kod towaru (Twr_Kod) — unikalny w bazie."},"ean":{"maxLength":40,"type":"string","description":"Kod kreskowy EAN (Twr_EAN).","nullable":true},"jm":{"maxLength":20,"type":"string","description":"Jednostka miary (Twr_JM). Domyślnie SZT.","nullable":true},"stawka":{"type":"string","description":"Stawka VAT (Twr_Stawka). Przyjmuje liczbę (23, 8, 5, 0) lub symbol \"ZW\" / \"NP\".\nGdy podano \"ZW\" lub \"NP\", pole Flaga jest ustawiane automatycznie (odpowiednio 1 lub 4).\nDomyślnie 23.","nullable":true},"flaga":{"type":"integer","description":"Flaga stawki VAT (Twr_Flaga). Opcjonalna — gdy nie podana, wyznaczana ze Stawka.\n1 = Zwolniona (ZW), 2 = Opodatkowana (domyślna), 3 = Zaniżona, 4 = Nie podlega (NP).","format":"int32","nullable":true},"typ":{"type":"integer","description":"Typ towaru (Twr_Typ). 0 = usługa, 1 = towar fizyczny.","format":"int32","nullable":true},"masa":{"type":"number","description":"Masa towaru w kg (Twr_Masa).","format":"double","nullable":true},"opis":{"maxLength":2000,"type":"string","description":"Opis towaru (Twr_Opis).","nullable":true},"kodGrupy":{"maxLength":40,"type":"string","description":"Kod grupy towarowej z CDN.TwrGrupy (Twg_Kod). Opcjonalne.","nullable":true},"cenaNetto1":{"type":"number","description":"Wartość netto ceny nr 1 (Ceny[1].WartoscNetto).","format":"double","nullable":true},"cenaBrutto4":{"type":"number","description":"Wartość brutto ceny nr 4 (Ceny[4].WartoscBrutto).","format":"double","nullable":true},"atrybuty":{"type":"array","items":{"$ref":"#/components/schemas/NowyAtrybutTowaru"},"description":"Atrybuty towaru do przypisania przy tworzeniu.","nullable":true}},"additionalProperties":false},"NowyZapisKbRequest":{"type":"object","properties":{"rejestrSymbol":{"type":"string","description":"Symbol rejestru kasowo-bankowego (BRa_Symbol). Zapis zostanie dodany do otwartego raportu tego rejestru.","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod). Opcjonalny — gdy brak, zapis bez podmiotu.","nullable":true},"dataDok":{"type":"string","description":"Data dokumentu. Domyślnie bieżąca data.","format":"date-time"},"termin":{"type":"string","description":"Termin płatności. Opcjonalny.","format":"date-time","nullable":true},"przychod":{"type":"number","description":"Kwota przychodu — KP (kierunek 1). Podaj wartość > 0. Wyklucza się z Rozchod.","format":"double"},"rozchod":{"type":"number","description":"Kwota rozchodu — KW (kierunek -1). Podaj wartość > 0. Wyklucza się z Przychod.","format":"double"},"numerObcy":{"type":"string","description":"Numer obcy / numer dokumentu zewnętrznego.","nullable":true},"rachunekNr":{"type":"string","description":"Numer rachunku bankowego kontrahenta.","nullable":true},"iban":{"type":"boolean","description":"Czy numer rachunku jest w formacie IBAN (true) czy krajowym (false)."},"walutaSymbol":{"type":"string","description":"Symbol waluty (np. EUR, USD). Domyślnie PLN.","nullable":true},"opis":{"type":"string","description":"Opis zapisu.","nullable":true}},"additionalProperties":false,"description":"Żądanie dodania nowego zapisu kasowo-bankowego (KP lub KW)."},"ObrotySaldaItem":{"type":"object","properties":{"kontoId":{"type":"integer","description":"Identyfikator konta (Acc_AccId).","format":"int32"},"numerIdx":{"type":"string","description":"Numer konta dla indeksu/sortowania.","nullable":true},"numer":{"type":"string","description":"Pełny numer konta.","nullable":true},"nazwa":{"type":"string","description":"Nazwa konta.","nullable":true},"nazwa2":{"type":"string","description":"Druga (dodatkowa) nazwa konta.","nullable":true},"poziom":{"type":"integer","description":"Poziom zagłębienia w planie kont.","format":"int32"},"parentId":{"type":"integer","description":"Identyfikator konta nadrzędnego. Null dla konta najwyższego poziomu.","format":"int32","nullable":true},"analityczne":{"type":"boolean","description":"Czy konto jest analityczne (księgowalne)."},"boWn":{"type":"number","description":"Bilans otwarcia — strona Winien.","format":"double"},"boMa":{"type":"number","description":"Bilans otwarcia — strona Ma.","format":"double"},"obrotyWn":{"type":"number","description":"Obroty w wybranym zakresie dat — strona Winien.","format":"double"},"obrotyMa":{"type":"number","description":"Obroty w wybranym zakresie dat — strona Ma.","format":"double"},"obrotyNarastajacoWn":{"type":"number","description":"Obroty narastająco od początku okresu do DataDo — strona Winien.","format":"double"},"obrotyNarastajacoMa":{"type":"number","description":"Obroty narastająco od początku okresu do DataDo — strona Ma.","format":"double"},"saldoWn":{"type":"number","description":"Saldo na DataDo — strona Winien.","format":"double"},"saldoMa":{"type":"number","description":"Saldo na DataDo — strona Ma.","format":"double"},"zmianaSaldaWn":{"type":"number","description":"Zmiana salda w wybranym zakresie dat — strona Winien.","format":"double"},"zmianaSaldaMa":{"type":"number","description":"Zmiana salda w wybranym zakresie dat — strona Ma.","format":"double"},"jpkTyp1":{"type":"string","description":"Typ konta 1 dla JPK_KR_PD.","nullable":true},"jpkTyp2":{"type":"string","description":"Typ konta 2 dla JPK_KR_PD.","nullable":true},"jpkTyp3":{"type":"string","description":"Typ konta 3 dla JPK_KR_PD.","nullable":true}},"additionalProperties":false,"description":"Wiersz raportu obrotów i sald dla jednego konta (wynik CDN.ObrotySalda)."},"ObrotySaldaResponse":{"type":"object","properties":{"okresObrachunkowyId":{"type":"integer","description":"Identyfikator okresu obrachunkowego, dla którego liczono raport.","format":"int32"},"dataOd":{"type":"string","description":"Efektywny początek zakresu dat (po zastosowaniu domyślnych wartości/bilansu otwarcia).","format":"date-time"},"dataDo":{"type":"string","description":"Efektywny koniec zakresu dat (po zastosowaniu domyślnych wartości/bilansu otwarcia).","format":"date-time"},"dane":{"type":"array","items":{"$ref":"#/components/schemas/ObrotySaldaItem"},"nullable":true}},"additionalProperties":false,"description":"Wynik raportu obrotów i sald (CDN.ObrotySalda) dla okresu/zakresu dat."},"OkresObrachunkowyDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator okresu (OOb_OObID).","format":"int32"},"symbol":{"type":"string","description":"Symbol okresu obrachunkowego, używany też w numeracji dokumentów.","nullable":true},"dataOtwarcia":{"type":"string","description":"Data otwarcia okresu.","format":"date-time"},"dlugoscMiesiecy":{"type":"integer","description":"Długość okresu w miesiącach.","format":"int32"},"dataKoncowa":{"type":"string","description":"Data zakończenia okresu.","format":"date-time"},"dataZamkniecia":{"type":"string","description":"Data, do której okres jest zamknięty. Null, jeśli okres nie został jeszcze zamknięty w żadnym zakresie.","format":"date-time","nullable":true},"stan":{"type":"integer","description":"Surowy kod stanu okresu (OOb_Stan): 0 = otwarty, 1 = zamknięty.","format":"int32"},"stanOpis":{"type":"string","description":"Czytelny opis stanu: \"Otwarty\" lub \"Zamknięty\".","nullable":true},"opis":{"type":"string","description":"Opis okresu obrachunkowego.","nullable":true}},"additionalProperties":false,"description":"Okres obrachunkowy zdefiniowany w CDN.OkresyObrach."},"PlatnoscDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator zdarzenia (BZd_BZdID).","format":"int32"},"termin":{"type":"string","description":"Termin płatności (BZd_Termin).","format":"date-time"},"dataDok":{"type":"string","description":"Data dokumentu źródłowego (BZd_DataDok).","format":"date-time"},"dataWystawienia":{"type":"string","description":"Data wystawienia dokumentu (BZd_DataWys).","format":"date-time","nullable":true},"dataRozliczenia":{"type":"string","description":"Data rozliczenia — null gdy nierozliczone (BZd_DataRoz).","format":"date-time","nullable":true},"kwota":{"type":"number","description":"Kwota w walucie dokumentu (BZd_Kwota).","format":"double"},"kwotaRozliczona":{"type":"number","description":"Kwota rozliczona w walucie dokumentu (BZd_KwotaRoz).","format":"double"},"kwotaSys":{"type":"number","description":"Kwota w walucie systemowej (BZd_KwotaSys).","format":"double"},"kwotaRozliczonaSys":{"type":"number","description":"Kwota rozliczona w walucie systemowej (BZd_KwotaRozSys).","format":"double"},"waluta":{"type":"string","description":"Waluta zdarzenia (BZd_Waluta).","nullable":true},"kierunek":{"type":"integer","description":"Kierunek: 1 = przychód (należność), -1 = rozchód (zobowiązanie).","format":"int32"},"statusRozliczenia":{"type":"string","description":"Status rozliczenia: Nierozliczone / Częściowo rozliczone / Rozliczone / Nie podlega rozliczeniu.","nullable":true},"stan":{"type":"string","description":"Stan zdarzenia: Bufor / Do realizacji / Wysłane / Zrealizowane.","nullable":true},"formaPlatnosci":{"type":"string","description":"Nazwa formy płatności (FPl_Nazwa).","nullable":true},"opis":{"type":"string","description":"Opis zdarzenia (BZd_Opis).","nullable":true},"splitPay":{"type":"boolean","description":"Czy zdarzenie objęte split payment (BZd_SplitPay)."},"splitPayKwotaVAT":{"type":"number","description":"Kwota VAT dla split payment (BZd_SplitPayKwotaVAT).","format":"double","nullable":true}},"additionalProperties":false,"description":"Pojedyncze zdarzenie kasowo-bankowe (płatność) powiązane z dokumentem."},"PlatnosciDokumentuResponse":{"type":"object","properties":{"dokumentId":{"type":"integer","description":"ID dokumentu (TrN_TrNId).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer dokumentu.","nullable":true},"kwotaRazemSys":{"type":"number","description":"Łączna kwota do zapłaty w walucie systemowej.","format":"double"},"kwotaRozliczonaSys":{"type":"number","description":"Łączna kwota rozliczona w walucie systemowej.","format":"double"},"kwotaDoZaplatySys":{"type":"number","description":"Kwota pozostała do zapłaty w walucie systemowej (KwotaRazem - KwotaRozliczona).","format":"double"},"platnosci":{"type":"array","items":{"$ref":"#/components/schemas/PlatnoscDto"},"description":"Lista zdarzeń kasowo-bankowych.","nullable":true}},"additionalProperties":false,"description":"Płatności (harmonogram kasowo-bankowy) dokumentu HaMag."},"PodmiotInfo":{"type":"object","properties":{"kod":{"type":"string","description":"Kod podmiotu (Pod_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa podmiotu (Pod_Nazwa1 + Pod_Nazwa2, połączone).","nullable":true},"nazwa3":{"type":"string","description":"Trzecia linia nazwy podmiotu.","nullable":true},"miasto":{"type":"string","description":"Miasto (adres podmiotu).","nullable":true},"ulica":{"type":"string","description":"Ulica (adres podmiotu).","nullable":true},"nrDomu":{"type":"string","description":"Numer domu.","nullable":true},"nrLokalu":{"type":"string","description":"Numer lokalu.","nullable":true},"kodPocztowy":{"type":"string","description":"Kod pocztowy.","nullable":true},"nip":{"type":"string","description":"Numer NIP.","nullable":true},"regon":{"type":"string","description":"Numer REGON.","nullable":true},"pesel":{"type":"string","description":"Numer PESEL.","nullable":true},"email":{"type":"string","description":"Adres e-mail.","nullable":true},"telefon":{"type":"string","description":"Numer telefonu.","nullable":true},"rodzaj":{"type":"integer","description":"Rodzaj podmiotu (Pod_Rodzaj): 1=odbiorca, 2=dostawca, 3=konkurencja, 4=partner, -2=bank, -3=pracownik, -4=wspólnik, -5=urząd.","format":"int32"},"rodzajOpis":{"type":"string","description":"Opisowa wartość rodzaju podmiotu (Pod_RodzajOpis).","nullable":true},"nieaktywny":{"type":"boolean","description":"Czy podmiot jest nieaktywny."}},"additionalProperties":false,"description":"Skrócone dane podmiotu (kontrahenta, banku, pracownika/wspólnika lub urzędu) z CDN.PodmiotyView."},"PozycjaBatchDto":{"required":["ilosc","towarKod"],"type":"object","properties":{"towarKod":{"minLength":1,"type":"string","description":"Kod towaru (Twr_Kod).","example":"NOWY_C#"},"ilosc":{"type":"number","description":"Ilość.","format":"double","example":2},"towarNazwa":{"type":"string","description":"Nadpisuje nazwę towaru na dokumencie.","nullable":true},"towarOpis":{"type":"string","description":"Opis pozycji.","nullable":true},"cenaJednostkowa":{"type":"number","description":"Cena jednostkowa.","format":"double","nullable":true,"example":149.99},"rabat":{"type":"number","description":"Rabat procentowy (np. 10.5 = 10,5%).","format":"double","nullable":true},"stawkaVat":{"type":"string","description":"Stawka VAT pozycji. Przyjmuje liczbę (23, 8, 5, 0) lub symbol `\"ZW\"` / `\"NP\"` (oba traktowane jako 0).\nGdy nie podana — stawka pobierana z kartoteki towaru.","nullable":true,"example":"23"}},"additionalProperties":false,"description":"Pozycja dokumentu w zadaniu batch."},"PozycjaDokumentuDto":{"type":"object","properties":{"lp":{"type":"integer","format":"int32"},"towarId":{"type":"integer","format":"int32","nullable":true},"towarKod":{"type":"string","nullable":true},"towarNazwa":{"type":"string","nullable":true},"towarEAN":{"type":"string","nullable":true},"towarNumerKat":{"type":"string","nullable":true},"jm":{"type":"string","nullable":true},"ilosc":{"type":"number","format":"double"},"cenaPoRabacie":{"type":"number","format":"double"},"rabat":{"type":"number","format":"double"},"wartoscNetto":{"type":"number","format":"double"},"wartoscBrutto":{"type":"number","format":"double"},"stawkaVat":{"type":"number","format":"double"},"magazynSymbol":{"type":"string","nullable":true},"atrybuty":{"type":"array","items":{"$ref":"#/components/schemas/AtrybutDto"},"nullable":true}},"additionalProperties":false,"description":"Pozycja dokumentu HaMag z atrybutami."},"PozycjaDokumentuRequest":{"required":["ilosc","towarKod"],"type":"object","properties":{"towarKod":{"minLength":1,"type":"string","description":"Kod towaru (Twr_Kod).","example":"NOWY_C#"},"towarNazwa":{"type":"string","description":"Nazwa towaru — nadpisuje domyślną nazwę z kartoteki.","nullable":true},"towarOpis":{"type":"string","description":"Opis towaru — nadpisuje domyślny opis z kartoteki.","nullable":true},"ilosc":{"type":"number","description":"Ilość.","format":"double","example":2},"cenaJednostkowa":{"type":"number","description":"Cena jednostkowa towaru.","format":"double","nullable":true,"example":61.57},"rabat":{"type":"number","description":"Rabat procentowy.","format":"double","nullable":true,"example":10.5},"stawkaVat":{"type":"string","description":"Stawka VAT pozycji. Przyjmuje liczbę (`23`, `8`, `5`, `0`)\nlub symbol `\"ZW\"` / `\"NP\"` (oba traktowane jako 0).\nGdy nie podana — stawka pobierana z kartoteki towaru.","nullable":true,"example":"23"}},"additionalProperties":false,"description":"Pozycja dokumentu handlowo-magazynowego."},"PracownicyBatchRequest":{"required":["pracownicy"],"type":"object","properties":{"firma":{"type":"string","description":"Nazwa firmy w Optimie (Login2Firm), np. `CDN_Demo`.\nGdy pominięta — używana firma przypisana do tokena lub domyślna z konfiguracji.","nullable":true,"example":"CDN_Demo"},"pracownicy":{"type":"array","items":{"$ref":"#/components/schemas/PracownikBatchItem"},"description":"Lista pracowników do dodania. Wymagana co najmniej jedna pozycja."}},"additionalProperties":false,"description":"Żądanie batch dodawania pracowników.\nKażda pozycja w `Pracownicy` to jeden nowy pracownik tworzony przez COM Optimy."},"PracownikBatchItem":{"required":["imie1","kod","nazwisko"],"type":"object","properties":{"kod":{"maxLength":20,"minLength":1,"type":"string","description":"Unikalny kod (akronim) pracownika — maks. 20 znaków, zamieniany na WIELKIE litery.\nPole bazy: `Pra_Kod`.","example":"ANNAK"},"nazwisko":{"maxLength":50,"minLength":1,"type":"string","description":"Nazwisko pracownika — wymagane, maks. 50 znaków.","example":"Kowalska"},"imie1":{"maxLength":30,"minLength":1,"type":"string","description":"Pierwsze imię — wymagane, maks. 30 znaków.","example":"Anna"},"imie2":{"maxLength":30,"type":"string","description":"Drugie imię (opcjonalne), maks. 30 znaków.","nullable":true},"pesel":{"maxLength":11,"type":"string","description":"Numer PESEL — 11 cyfr bez spacji.","nullable":true,"example":"90010112345"},"dataUr":{"type":"string","description":"Data urodzenia.","format":"date-time","nullable":true},"miejsceUr":{"maxLength":100,"type":"string","description":"Miejscowość urodzenia.","nullable":true},"plec":{"maxLength":1,"type":"string","description":"Płeć: `M` = mężczyzna, `K` = kobieta.","nullable":true,"example":"K"},"stanCywilny":{"maxLength":50,"type":"string","description":"Stan cywilny, np. `kawaler/panna`, `żonaty/zamężna`.","nullable":true},"dowOsobisty":{"maxLength":20,"type":"string","description":"Seria i numer dowodu osobistego, np. `ABC123456`.","nullable":true},"dowGdzie":{"maxLength":100,"type":"string","description":"Organ wydający dowód osobisty.","nullable":true},"dowKiedy":{"type":"string","description":"Data wydania dowodu osobistego.","format":"date-time","nullable":true},"dowWaznyDo":{"type":"string","description":"Data ważności dowodu osobistego.","format":"date-time","nullable":true},"telefonSms":{"maxLength":20,"type":"string","description":"Numer telefonu SMS do powiadomień kadrowych.","nullable":true},"nipE":{"maxLength":15,"type":"string","description":"NIP pracownika (dla właścicieli/zleceniobiorców). Pole bazy: `PRE_NipE`.","nullable":true},"typPracownika":{"type":"integer","description":"Typ pracownika: `0` = pracownik etatowy (domyślnie),\n`1` = zleceniobiorca, `2` = właściciel.","format":"int32"},"centrumKod":{"maxLength":20,"type":"string","description":"Kod centrum kosztowego (CNT_Kod). Gdy podany — centrum jest walidowane\ni przypisywane po dodaniu pracownika. Błąd walidacji anuluje cały wpis.","nullable":true},"dzialKod":{"maxLength":20,"type":"string","description":"Kod działu (DZL_Kod). Gdy podany — dział jest walidowany\ni przypisywany po dodaniu pracownika. Błąd walidacji anuluje cały wpis.","nullable":true},"opis":{"maxLength":500,"type":"string","description":"Dowolny opis tekstowy dołączany do kartoteki pracownika.","nullable":true},"daneKadrowe":{"$ref":"#/components/schemas/DaneKadroweBatchDto"},"adresZamieszkania":{"$ref":"#/components/schemas/AdresPracownikaBatchDto"},"adresKorespondencyjny":{"$ref":"#/components/schemas/AdresPracownikaBatchDto"},"adresZameldowania":{"$ref":"#/components/schemas/AdresPracownikaBatchDto"}},"additionalProperties":false,"description":"Dane jednego pracownika do dodania w ramach zadania batch."},"PracownikListItem":{"type":"object","properties":{"praId":{"type":"integer","description":"Wewnętrzny identyfikator pracownika.","format":"int32"},"kod":{"type":"string","description":"Skrót pracownika.","nullable":true},"nazwisko":{"type":"string","description":"Nazwisko pracownika.","nullable":true},"imie1":{"type":"string","description":"Pierwsze imię.","nullable":true},"imie2":{"type":"string","description":"Drugie imię.","nullable":true},"typPracownika":{"type":"integer","description":"Typ pracownika: `0` = etatowy, `1` = zleceniobiorca, `2` = właściciel.","format":"int32"},"typPracownikaOpis":{"type":"string","description":"Słowny opis typu pracownika.","nullable":true},"czyAktywny":{"type":"boolean","description":"Czy pracownik jest aktywny (zatrudniony)."},"centrumKod":{"type":"string","description":"Kod centrum kosztów, do którego przypisany jest pracownik.","nullable":true},"centrumNazwa":{"type":"string","description":"Nazwa centrum kosztów.","nullable":true},"dzialKod":{"type":"string","description":"Kod działu, do którego przypisany jest pracownik.","nullable":true},"dzialNazwa":{"type":"string","description":"Nazwa działu.","nullable":true},"pesel":{"type":"string","description":"Numer PESEL.","nullable":true},"nipE":{"type":"string","description":"Numer NIP.","nullable":true},"email":{"type":"string","description":"Adres e-mail.","nullable":true},"telefon1":{"type":"string","description":"Telefon główny.","nullable":true},"telefon2":{"type":"string","description":"Telefon dodatkowy.","nullable":true},"telefonSms":{"type":"string","description":"Numer telefonu do SMS.","nullable":true},"adresZameldowania":{"$ref":"#/components/schemas/AdresPracownikaDto"},"adresZamieszkania":{"$ref":"#/components/schemas/AdresPracownikaDto"},"adresKorespondencyjny":{"$ref":"#/components/schemas/AdresPracownikaDto"}},"additionalProperties":false,"description":"Pojedyncza pozycja na liście pracowników."},"PracownikListaResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Opis błędu. Wypełniony tylko przy niepowodzeniu.","nullable":true},"liczba":{"type":"integer","description":"Liczba pracowników spełniających kryteria filtrowania.","format":"int32"},"pracownicy":{"type":"array","items":{"$ref":"#/components/schemas/PracownikListItem"},"description":"Lista pracowników.","nullable":true}},"additionalProperties":false,"description":"Wynik pobrania listy pracowników."},"PracownikResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Opis wyniku lub treść błędu.","nullable":true},"praId":{"type":"integer","description":"Wewnętrzny identyfikator pracownika. Wypełniony tylko przy sukcesie.","format":"int32","nullable":true},"kod":{"type":"string","description":"Skrót pracownika. Wypełniony tylko przy sukcesie.","nullable":true},"nazwiskoImie":{"type":"string","description":"Nazwisko i imię pracownika. Wypełnione tylko przy sukcesie.","nullable":true},"ostrzezenia":{"type":"array","items":{"type":"string"},"description":"Lista ostrzeżeń — operacja główna zakończyła się sukcesem,\nale część danych opcjonalnych nie mogła zostać zapisana.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na pracowniku."},"ProblemDetails":{"type":"object","properties":{"type":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"status":{"type":"integer","format":"int32","nullable":true},"detail":{"type":"string","nullable":true},"instance":{"type":"string","nullable":true}},"additionalProperties":{}},"ProjektItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator projektu (PRJ_PrjId).","format":"int32"},"kod":{"type":"string","description":"Unikalny kod projektu (PRJ_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa projektu (PRJ_Nazwa).","nullable":true},"symbol":{"type":"string","description":"Symbol projektu (PRJ_Symbol).","nullable":true},"url":{"type":"string","description":"Adres URL projektu (PRJ_Url).","nullable":true},"parentId":{"type":"integer","description":"ID projektu nadrzędnego (PRJ_ParentId). Null dla korzeni.","format":"int32","nullable":true},"poziom":{"type":"integer","description":"Poziom zagłębienia (PRJ_Poziom).","format":"int32"},"wezel":{"type":"string","description":"Węzeł w drzewie (PRJ_Wezel).","nullable":true},"lp":{"type":"integer","description":"Liczba porządkowa pozycji w węźle (PRJ_Lp).","format":"int32"},"dataOtwarcia":{"type":"string","description":"Data otwarcia projektu (PRJ_DataOtw). Null gdy nie ustawiona.","format":"date-time","nullable":true},"dataZamkniecia":{"type":"string","description":"Data zamknięcia projektu (PRJ_DataZam). Null gdy nie ustawiona.","format":"date-time","nullable":true},"sciezka":{"type":"string","description":"Ścieżka nazw od korzenia, np. \"Projekt A > Podprojekt B\".","nullable":true},"dzieci":{"type":"array","items":{"$ref":"#/components/schemas/ProjektItem"},"description":"Podrzędne projekty tego węzła (rekurencyjnie).","nullable":true}},"additionalProperties":false,"description":"Węzeł drzewa projektów z CDN.DefProjekty (PRJ_Nieaktywny=0)."},"ProjektyResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/ProjektItem"},"description":"Korzenie drzewa (projekty bez rodzica).","nullable":true},"lacznie":{"type":"integer","description":"Łączna liczba aktywnych projektów (wszystkich poziomów).","format":"int32"}},"additionalProperties":false,"description":"Odpowiedź endpointu GET /projekty — drzewo aktywnych projektów."},"PrzeksztalcRoRequest":{"type":"object","properties":{"typDocelowy":{"type":"string","description":"Typ dokumentu docelowego podany tekstowo: `FS`, `PA`, `WZ`, `RW`,\n`ZD`, `FPF` (alias: `PF`). Wielkość liter bez znaczenia.","nullable":true,"example":"WZ"},"ids":{"type":"array","items":{"type":"integer","format":"int32"},"description":"ID rezerwacji RO (TrN_TrNId). Można podać kilka — zostaną zagregowane w jeden dokument.","nullable":true},"numeryPelne":{"type":"array","items":{"type":"string"},"description":"Pełne numery rezerwacji RO, np. RO/12/2025. Łączone z `ids`.","nullable":true}},"additionalProperties":false,"description":"Żądanie przekształcenia (agregacji) rezerwacji odbiorcy (RO) w inny dokument."},"PrzeksztalcRoResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik lub błąd.","nullable":true},"typDocelowy":{"type":"string","description":"Kod typu dokumentu docelowego (np. WZ).","nullable":true},"dokumenty":{"type":"array","items":{"$ref":"#/components/schemas/DokumentPowiazanyDto"},"description":"Wygenerowane dokumenty docelowe (Optima może rozbić agregację na kilka dokumentów).","nullable":true}},"additionalProperties":false,"description":"Wynik przekształcenia RO w dokument docelowy."},"RaportKbDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator raportu (BRp_BRpID).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer raportu (BRp_NumerPelny).","nullable":true},"rejestrSymbol":{"type":"string","description":"Symbol rejestru (BRa_Symbol).","nullable":true},"dataOtwarcia":{"type":"string","description":"Data otwarcia raportu (BRp_DataDok).","format":"date-time"},"dataZamkniecia":{"type":"string","description":"Data zamknięcia raportu (BRp_DataZam). Null jeśli otwarty.","format":"date-time","nullable":true},"zamkniety":{"type":"boolean","description":"Czy raport jest zamknięty (BRp_Zamkniety)."},"saldoBO":{"type":"number","description":"Bilans otwarcia (BRp_SaldoBO).","format":"double"},"przychody":{"type":"number","description":"Suma przychodów (BRp_Przychody).","format":"double"},"rozchody":{"type":"number","description":"Suma rozchodów (BRp_Rozchody).","format":"double"},"saldo":{"type":"number","description":"Saldo = SaldoBO + Przychody − Rozchody.","format":"double","readOnly":true}},"additionalProperties":false,"description":"Raport kasowo-bankowy — nagłówek okresu rozliczeniowego."},"RaportSprzedazyResponse":{"type":"object","properties":{"sumaNettaOgolem":{"type":"number","description":"Łączna suma netto w PLN dla wszystkich pasujących dokumentów.","format":"double"},"sumaVatOgolem":{"type":"number","description":"Łączna suma VAT w PLN.","format":"double"},"sumaBruttoOgolem":{"type":"number","description":"Łączna suma brutto w PLN.","format":"double"},"liczbaDokumentowOgolem":{"type":"integer","description":"Łączna liczba dokumentów.","format":"int32"},"wiersze":{"type":"array","items":{"$ref":"#/components/schemas/RaportSprzedazyWiersz"},"description":"Wiersze pogrupowane według wybranego wymiaru (grupujPo).\nPusta lista gdy nie podano żadnego grupowania.","nullable":true}},"additionalProperties":false,"description":"Wynik raportu sprzedaży z podsumowaniem i opcjonalnym podziałem na grupy."},"RaportSprzedazyWiersz":{"type":"object","properties":{"kontrahentId":{"type":"integer","description":"ID kontrahenta (Knt_KntId). Null gdy brak grupowania po kontrahencie.","format":"int32","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod).","nullable":true},"kontrahentNazwa":{"type":"string","description":"Pierwsza linia nazwy kontrahenta (Knt_Nazwa1).","nullable":true},"kodTypu":{"type":"string","description":"Kod API typu dokumentu (FS, FZ, WZ…). Null gdy brak grupowania po typie.","nullable":true},"nazwaTypu":{"type":"string","description":"Czytelna nazwa typu dokumentu.","nullable":true},"rok":{"type":"integer","description":"Rok okresu. Null gdy brak grupowania po miesiącu.","format":"int32","nullable":true},"miesiac":{"type":"integer","description":"Numer miesiąca (1–12). Null gdy brak grupowania po miesiącu.","format":"int32","nullable":true},"okres":{"type":"string","description":"Okres w formacie RRRR-MM, np. 2025-03. Null gdy brak grupowania po miesiącu.","nullable":true},"dzien":{"type":"string","description":"Data dzienna. Null gdy brak grupowania po dniu.","format":"date-time","nullable":true},"sumaNetto":{"type":"number","description":"Suma wartości netto w PLN dla grupy.","format":"double"},"sumaVat":{"type":"number","description":"Suma VAT w PLN dla grupy.","format":"double"},"sumaBrutto":{"type":"number","description":"Suma wartości brutto w PLN dla grupy.","format":"double"},"liczbaDokumentow":{"type":"integer","description":"Liczba dokumentów w grupie.","format":"int32"}},"additionalProperties":false,"description":"Pojedynczy wiersz raportu sprzedaży (agregat dla grupy).\nPola grupowania wypełnione tylko gdy wybrano dany wymiar."},"RejestrKbDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator rejestru (BRa_BRaID).","format":"int32"},"symbol":{"type":"string","description":"Symbol rejestru (BRa_Symbol).","nullable":true},"nazwa":{"type":"string","description":"Nazwa rejestru (BRa_Nazwa).","nullable":true},"typ":{"type":"string","description":"Typ rejestru: Gotówka lub Bank.","nullable":true},"aktywny":{"type":"boolean","description":"Czy rejestr jest aktywny (BRa_NieAktywny = 0)."}},"additionalProperties":false,"description":"Rejestr kasowo-bankowy (rachunek bankowy lub kasa)."},"RejestrVATBatchItem":{"required":["dataOpe","dataZap","elementy","formaPlatnosci","kontrahentKod","rejestr","typ"],"type":"object","properties":{"typ":{"minLength":1,"type":"string","description":"Typ rejestru: `Z` = zakup, `S` = sprzedaż. Wielkość liter nie ma znaczenia.","example":"S"},"rejestr":{"minLength":1,"type":"string","description":"Nazwa rejestru VAT — musi dokładnie odpowiadać nazwie zdefiniowanej w Optimie (`CDN.Grupy`).\nDostępne rejestry: `GET /rejestry-vat`.","example":"SPRZEDAŻ"},"dokument":{"type":"string","description":"Numer dokumentu (VaN_Dokument), np. `FS/01/2025`.","nullable":true,"example":"FS/01/2025"},"identKsieg":{"type":"string","description":"Identyfikator księgowy dokumentu (VaN_IdentKsieg).","nullable":true},"dataZap":{"type":"string","description":"Data zapisu — data księgowania dokumentu (VaN_DataZap).","format":"date-time"},"dataOpe":{"type":"string","description":"Data operacji — data sprzedaży lub zakupu (VaN_DataOpe).","format":"date-time"},"kontrahentKod":{"minLength":1,"type":"string","description":"Kod kontrahenta (Knt_Kod) z kartoteki Optimy. Wymagany.","example":"ALOZA"},"formaPlatnosci":{"minLength":1,"type":"string","description":"Dokładna nazwa formy płatności (`FPl_Nazwa`), np. `PRZELEW`, `GOTÓWKA`. Wymagana.","example":"PRZELEW"},"walutaSymbol":{"type":"string","description":"Symbol waluty, np. `EUR`, `USD`. Domyślnie `PLN`.\nWaluta inna niż PLN wymaga wcześniejszej konfiguracji kursów w Optimie.","nullable":true,"example":"PLN"},"kategoria":{"maxLength":50,"type":"string","description":"Kod szczegółowy kategorii nagłówka (`Kat_kodszczegol`). Opcjonalny, maks. 50 znaków.\nGdy nie podana lub nie znaleziona — Optima ustawia kategorię z kartoteki kontrahenta.","nullable":true},"nrKSeF":{"type":"string","description":"Numer KSeF dokumentu źródłowego. Opcjonalny.","nullable":true},"dodatkowyOpis":{"type":"string","description":"Dodatkowy opis tekstowy nagłówka dokumentu. Opcjonalny.","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia dokumentu w KSeF. Opcjonalna.","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin płatności. Opcjonalny.","format":"date-time","nullable":true},"kSeFPodmioty3Vat":{"type":"array","items":{"$ref":"#/components/schemas/KSeFPodmiot3VATBatchDto"},"description":"Podmioty trzecie KSeF powiązane z dokumentem.\nGdy lista jest pusta — pole można pominąć.","nullable":true},"elementy":{"type":"array","items":{"$ref":"#/components/schemas/ElementRejestruVATBatchDto"},"description":"Pozycje (stawki VAT) dokumentu. Wymagana co najmniej jedna pozycja."}},"additionalProperties":false,"description":"Dane jednego wpisu do rejestru VAT w zadaniu batch."},"RejestrVATDetails":{"type":"object","properties":{"id":{"type":"integer","description":"Wewnętrzny identyfikator dokumentu (VaN_VaNID).","format":"int32"},"typ":{"type":"string","description":"Typ rejestru: \"Z\" = zakup, \"S\" = sprzedaż.","nullable":true},"rejestr":{"type":"string","description":"Nazwa rejestru VAT.","nullable":true},"dokument":{"type":"string","description":"Numer dokumentu.","nullable":true},"numerPelny":{"type":"string","description":"Numer pełny dokumentu (VaN_IdentKsieg).","nullable":true},"dataZap":{"type":"string","description":"Data zapisu w rejestrze.","format":"date-time"},"dataOpe":{"type":"string","description":"Data operacji (zakupu lub sprzedaży).","format":"date-time"},"dataWys":{"type":"string","description":"Data wystawienia dokumentu.","format":"date-time"},"termin":{"type":"string","description":"Termin płatności.","format":"date-time","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod). Null gdy podmiot wpisany ręcznie.","nullable":true},"kontrahentNazwa":{"type":"string","description":"Nazwa kontrahenta (pierwsza linia).","nullable":true},"kontrahentNip":{"type":"string","description":"NIP kontrahenta.","nullable":true},"kategoria":{"type":"string","description":"Opis/kod kategorii nagłówka.","nullable":true},"nrKSeF":{"type":"string","description":"Numer KSeF dokumentu.","nullable":true},"dodatkowyOpis":{"type":"string","description":"Dodatkowy opis (VaN_Opis).","nullable":true},"kSeFDataPrzyjecia":{"type":"string","description":"Data przyjęcia w KSeF.","format":"date-time","nullable":true},"waluta":{"type":"string","description":"Symbol waluty dokumentu (VaN_Waluta).","nullable":true},"razemNetto":{"type":"number","description":"Łączna kwota netto w walucie systemowej (PLN) — VaN_RazemNetto.","format":"double"},"razemVAT":{"type":"number","description":"Łączna kwota VAT w walucie systemowej (PLN) — VaN_RazemVAT.","format":"double"},"razemBrutto":{"type":"number","description":"Łączna kwota brutto w walucie systemowej (PLN) — VaN_RazemBrutto.","format":"double"},"razemNettoWal":{"type":"number","description":"Łączna kwota netto w walucie dokumentu (VaN_NettoWal). Dla dokumentów w PLN równa `razemNetto`.","format":"double"},"razemVATWal":{"type":"number","description":"Łączna kwota VAT w walucie dokumentu (VaN_VatWal). Dla dokumentów w PLN równa `razemVAT`.","format":"double"},"razemBruttoWal":{"type":"number","description":"Łączna kwota brutto w walucie dokumentu (VaN_RazemBruttoWal). Dla dokumentów w PLN równa `razemBrutto`.","format":"double"},"elementy":{"type":"array","items":{"$ref":"#/components/schemas/ElementRejestruDetails"},"description":"Pozycje rejestru VAT (stawki).","nullable":true}},"additionalProperties":false,"description":"Szczegóły dokumentu w rejestrze VAT."},"RejestrVATInfo":{"type":"object","properties":{"nazwa":{"type":"string","description":"Nazwa rejestru (Gru_Nazwa).","nullable":true},"typ":{"type":"string","description":"Typ: \"Z\" = zakup, \"S\" = sprzedaż.","nullable":true}},"additionalProperties":false,"description":"Informacja o jednym rejestrze VAT."},"RejestrVATListItem":{"type":"object","properties":{"id":{"type":"integer","description":"Wewnętrzny identyfikator dokumentu (VaN_VaNID).","format":"int32"},"typ":{"type":"string","description":"Typ rejestru: \"Z\" = zakup, \"S\" = sprzedaż.","nullable":true},"rejestr":{"type":"string","description":"Nazwa rejestru VAT.","nullable":true},"dokument":{"type":"string","description":"Numer dokumentu (VaN_Dokument).","nullable":true},"numerPelny":{"type":"string","description":"Numer pełny dokumentu (VaN_IdentKsieg).","nullable":true},"dataZap":{"type":"string","description":"Data zapisu w rejestrze.","format":"date-time"},"dataOpe":{"type":"string","description":"Data operacji.","format":"date-time"},"kontrahentKod":{"type":"string","description":"Kod kontrahenta. Null gdy podmiot wpisany ręcznie.","nullable":true},"kontrahentNazwa":{"type":"string","description":"Nazwa kontrahenta.","nullable":true},"kontrahentNip":{"type":"string","description":"NIP kontrahenta.","nullable":true},"waluta":{"type":"string","description":"Symbol waluty dokumentu (VaN_Waluta).","nullable":true},"razemNetto":{"type":"number","description":"Łączna kwota netto w walucie systemowej (PLN) — VaN_RazemNetto.","format":"double"},"razemVAT":{"type":"number","description":"Łączna kwota VAT w walucie systemowej (PLN) — VaN_RazemVAT.","format":"double"},"razemBrutto":{"type":"number","description":"Łączna kwota brutto w walucie systemowej (PLN) — VaN_RazemBrutto.","format":"double"},"razemNettoWal":{"type":"number","description":"Łączna kwota netto w walucie dokumentu (VaN_NettoWal). Dla dokumentów w PLN równa `razemNetto`.","format":"double"},"razemVATWal":{"type":"number","description":"Łączna kwota VAT w walucie dokumentu (VaN_VatWal). Dla dokumentów w PLN równa `razemVAT`.","format":"double"},"razemBruttoWal":{"type":"number","description":"Łączna kwota brutto w walucie dokumentu (VaN_RazemBruttoWal). Dla dokumentów w PLN równa `razemBrutto`.","format":"double"}},"additionalProperties":false,"description":"Pozycja listy dokumentów w rejestrze VAT."},"RejestryVATBatchRequest":{"required":["wpisy"],"type":"object","properties":{"firma":{"type":"string","description":"Nazwa firmy w Optimie (Login2Firm), np. `CDN_Demo`.\nGdy pominięta — używana firma przypisana do tokena lub domyślna z konfiguracji.","nullable":true,"example":"CDN_Demo"},"wpisy":{"type":"array","items":{"$ref":"#/components/schemas/RejestrVATBatchItem"},"description":"Lista wpisów do dodania do rejestrów VAT. Wymagana co najmniej jedna pozycja."}},"additionalProperties":false,"description":"Żądanie batch dodawania wpisów do rejestrów VAT.\nKażda pozycja w `Wpisy` to jeden dokument rejestru VAT."},"RozliczZapisKBRequest":{"type":"object","properties":{"zapisKbId":{"type":"integer","description":"ID zapisu kasowo-bankowego (CDN.BnkZapisy — BZp_BZpId).","format":"int32"},"zdarzenieId":{"type":"integer","description":"ID zdarzenia kasowo-bankowego (CDN.BnkZdarzenia — BZd_BZdId).","format":"int32"}},"additionalProperties":false,"description":"Żądanie rozliczenia zapisu kasowo-bankowego ze zdarzeniem kasowo-bankowym."},"RozliczeniaDokumentuResponse":{"type":"object","properties":{"dokumentId":{"type":"integer","description":"ID dokumentu (TrN_TrNId).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer dokumentu.","nullable":true},"kwotaRazemSys":{"type":"number","description":"Łączna kwota zdarzeń w walucie systemowej.","format":"double"},"kwotaRozliczonaSys":{"type":"number","description":"Łączna kwota rozliczona w walucie systemowej.","format":"double"},"kwotaDoRozliczeniaSys":{"type":"number","description":"Kwota pozostała do rozliczenia (KwotaRazem − KwotaRozliczona).","format":"double"},"rozliczenia":{"type":"array","items":{"$ref":"#/components/schemas/PlatnoscDto"},"description":"Zdarzenia kasowo-bankowe podlegające rozliczeniu (z wyłączeniem \"nie podlega rozliczeniu\").","nullable":true}},"additionalProperties":false,"description":"Zestawienie rozliczeń dokumentu HaMag — zdarzenia podlegające rozliczeniu z ich statusem."},"RozliczeniaPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/RozliczenieItem"},"nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (1-based).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba rekordów spełniających kryteria.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Stronicowany wynik zapytania o rozliczenia."},"RozliczenieItem":{"type":"object","properties":{"id":{"type":"integer","description":"ID zdarzenia (BZd_BZdId).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer dokumentu (BZd_NumerPelny).","nullable":true},"numerObcy":{"type":"string","description":"Numer obcy dokumentu (BZd_NumerObcy), np. numer faktury od kontrahenta.","nullable":true},"dataDok":{"type":"string","description":"Data dokumentu (BZd_DataDok).","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin płatności (BZd_Termin).","format":"date-time","nullable":true},"dataRozliczenia":{"type":"string","description":"Data rozliczenia (BZd_DataRoz). Null jeśli nierozliczone.","format":"date-time","nullable":true},"rachunek":{"type":"string","description":"Nazwa rachunku bankowego / kasy (BnkRachunki.BRa_Nazwa).","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod). Null jeśli zdarzenie nie jest powiązane z kontrahentem.","nullable":true},"kontrahentNazwa":{"type":"string","description":"Nazwa kontrahenta (Knt_Nazwa1). Null jeśli zdarzenie nie jest powiązane z kontrahentem.","nullable":true},"kwota":{"type":"number","description":"Kwota w walucie systemowej PLN (BZd_Kwota).","format":"double"},"kwotaRozliczona":{"type":"number","description":"Kwota już rozliczona w PLN (BZd_KwotaRozliczona).","format":"double"},"kwotaPozostala":{"type":"number","description":"Kwota pozostała do rozliczenia w PLN (Kwota − KwotaRozliczona).","format":"double"},"kwotaWalucie":{"type":"number","description":"Kwota w walucie oryginalnej (BZd_KwotaWalucie).","format":"double"},"kwotaRozliczonaWalucie":{"type":"number","description":"Kwota rozliczona w walucie oryginalnej (BZd_KwotaRozliczonaWalucie).","format":"double"},"waluta":{"type":"string","description":"Waluta zdarzenia (BZd_Waluta), np. \"PLN\", \"EUR\".","nullable":true},"kierunek":{"type":"integer","description":"Kierunek przepływu:\n- **1** — przychód (należność)\n- **-1** — rozchód (zobowiązanie)","format":"int32"},"rozliczono":{"type":"integer","description":"Status rozliczenia (BZd_Rozliczono):\n- **0** — nie podlega rozliczeniu\n- **1** — nierozliczone (może być częściowo: KwotaRozliczona > 0)\n- **2** — w pełni rozliczone","format":"int32"},"stan":{"type":"integer","description":"Stan zdarzenia (BZd_Stan).","format":"int32"},"typDokumentu":{"type":"integer","description":"Typ dokumentu (BZd_TypDokumentu).","format":"int32"},"dniOpoznienia":{"type":"integer","description":"Liczba dni opóźnienia płatności.\nDla rozliczonych: dni między Terminem a DataRozliczenia (0 jeśli zapłacono w terminie).\nDla nierozliczonych: dni między Terminem a dniem dzisiejszym (0 jeśli jeszcze w terminie).","format":"int32"},"czyPrzeterminowane":{"type":"boolean","description":"Czy płatność jest przeterminowana (Termin w przeszłości i nie w pełni rozliczona)."}},"additionalProperties":false,"description":"Pojedyncze zdarzenie płatnicze (rozliczenie) z CDN.BnkZdarzenia."},"RozliczenieKBResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string","nullable":true}},"additionalProperties":false,"description":"Odpowiedź operacji rozliczenia zapisu KB."},"RozrachunekDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator zdarzenia (BZd_BZdID).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer dokumentu źródłowego (BZd_NumerPelny).","nullable":true},"dokumentTyp":{"type":"integer","description":"Typ dokumentu źródłowego (BZd_DokumentTyp): 1=TraNag, 2=VatNag itd.","format":"int32"},"dokumentId":{"type":"integer","description":"ID dokumentu źródłowego (BZd_DokumentID).","format":"int32"},"dataDok":{"type":"string","description":"Data dokumentu (BZd_DataDok).","format":"date-time"},"dataWystawienia":{"type":"string","description":"Data wystawienia (BZd_DataWys).","format":"date-time","nullable":true},"termin":{"type":"string","description":"Termin płatności (BZd_Termin).","format":"date-time"},"dataRozliczenia":{"type":"string","description":"Data rozliczenia — null gdy nierozliczone (BZd_DataRoz).","format":"date-time","nullable":true},"kwota":{"type":"number","description":"Kwota w walucie dokumentu (BZd_Kwota).","format":"double"},"kwotaRozliczona":{"type":"number","description":"Kwota rozliczona w walucie dokumentu (BZd_KwotaRoz).","format":"double"},"kwotaSys":{"type":"number","description":"Kwota w walucie systemowej (BZd_KwotaSys).","format":"double"},"kwotaRozliczonaSys":{"type":"number","description":"Kwota rozliczona w walucie systemowej (BZd_KwotaRozSys).","format":"double"},"waluta":{"type":"string","description":"Waluta zdarzenia (BZd_Waluta).","nullable":true},"kierunek":{"type":"integer","description":"Kierunek: 1 = przychód (należność), -1 = rozchód (zobowiązanie).","format":"int32"},"statusRozliczenia":{"type":"string","description":"Status rozliczenia: Nierozliczone / Częściowo rozliczone / Rozliczone / Nie podlega rozliczeniu.","nullable":true},"stan":{"type":"string","description":"Stan zdarzenia: Bufor / Do realizacji / Wysłane / Zrealizowane.","nullable":true},"formaPlatnosci":{"type":"string","description":"Nazwa formy płatności (FPl_Nazwa).","nullable":true},"opis":{"type":"string","description":"Opis zdarzenia (BZd_Opis).","nullable":true},"przeterminowane":{"type":"boolean","description":"Czy zdarzenie jest przeterminowane (Termin < dziś i nierozliczone)."}},"additionalProperties":false,"description":"Pojedynczy rozrachunek kontrahenta z CDN.BnkZdarzenia."},"RozrachunkiKontrahentaResponse":{"type":"object","properties":{"kontrahentId":{"type":"integer","description":"ID kontrahenta (Knt_KntId).","format":"int32"},"saldoNaleznosci":{"type":"number","description":"Suma otwartych należności w PLN (kierunek=1, nierozliczone/częściowo).","format":"double"},"saldoZobowiazan":{"type":"number","description":"Suma otwartych zobowiązań w PLN (kierunek=-1, nierozliczone/częściowo).","format":"double"},"saldoPrzeterminowane":{"type":"number","description":"Kwota przeterminowanych nierozliczonych zdarzeń w PLN.","format":"double"},"lacznie":{"type":"integer","description":"Łączna liczba rekordów pasujących do filtrów (wszystkie strony).","format":"int32"},"strona":{"type":"integer","description":"Numer bieżącej strony (od 1).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"},"pozycje":{"type":"array","items":{"$ref":"#/components/schemas/RozrachunekDto"},"description":"Lista zdarzeń kasowo-bankowych na bieżącej stronie.","nullable":true}},"additionalProperties":false,"description":"Rozrachunki kontrahenta z podsumowaniem salda."},"StanMagazynowyItem":{"type":"object","properties":{"kod":{"type":"string","description":"Kod skrócony towaru (Twr_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa towaru (Twr_Nazwa).","nullable":true},"jm":{"type":"string","description":"Jednostka miary (Twr_JM).","nullable":true},"magazynSymbol":{"type":"string","description":"Symbol magazynu (Mag_Symbol).","nullable":true},"magazynNazwa":{"type":"string","description":"Nazwa magazynu (Mag_Nazwa).","nullable":true},"stanIlosc":{"type":"number","description":"Ilość w magazynie — suma TwZ_Ilosc z CDN.TwrZasoby.","format":"double"},"wartosc":{"type":"number","description":"Łączna wartość zasobu — suma TwZ_Wartosc z CDN.TwrZasoby.","format":"double"},"cenaJednostkowa":{"type":"number","description":"Średnia cena jednostkowa (Wartosc / StanIlosc).","format":"double"},"zarezerwowane":{"type":"number","description":"Ilość zarezerwowana (TwI_Rezerwacje).","format":"double"},"zarezerwowaneZlecenia":{"type":"number","description":"Ilość zarezerwowana przez zlecenia (TwI_RezerwacjeZlecenia).","format":"double"},"wZamowieniach":{"type":"number","description":"Ilość w zamówieniach dostawcy (TwI_Zamowienia).","format":"double"},"braki":{"type":"number","description":"Braki magazynowe (TwI_Braki).","format":"double"},"stanDostepny":{"type":"number","description":"Stan dostępny = StanIlosc − Zarezerwowane.","format":"double"}},"additionalProperties":false,"description":"Pojedynczy wiersz stanu magazynowego — towar w magazynie."},"StanTowaruMagazyn":{"type":"object","properties":{"magazynSymbol":{"type":"string","description":"Symbol magazynu (Mag_Symbol).","nullable":true},"magazynNazwa":{"type":"string","description":"Nazwa magazynu (Mag_Nazwa).","nullable":true},"stanIlosc":{"type":"number","description":"Ilość w magazynie — suma TwZ_Ilosc.","format":"double"},"wartosc":{"type":"number","description":"Łączna wartość zasobu — suma TwZ_Wartosc.","format":"double"},"cenaJednostkowa":{"type":"number","description":"Średnia cena jednostkowa (Wartosc / StanIlosc).","format":"double"},"zarezerwowane":{"type":"number","description":"Ilość zarezerwowana (TwI_Rezerwacje).","format":"double"},"zarezerwowaneZlecenia":{"type":"number","description":"Ilość zarezerwowana przez zlecenia (TwI_RezerwacjeZlecenia).","format":"double"},"wZamowieniach":{"type":"number","description":"Ilość w zamówieniach dostawcy (TwI_Zamowienia).","format":"double"},"braki":{"type":"number","description":"Braki magazynowe (TwI_Braki).","format":"double"},"stanDostepny":{"type":"number","description":"Stan dostępny = StanIlosc − Zarezerwowane.","format":"double"}},"additionalProperties":false,"description":"Stan towaru w konkretnym magazynie."},"StanTowaruResponse":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator towaru (Twr_TwrId).","format":"int32"},"kod":{"type":"string","description":"Kod skrócony towaru (Twr_Kod).","nullable":true},"nazwa":{"type":"string","description":"Nazwa towaru (Twr_Nazwa).","nullable":true},"jm":{"type":"string","description":"Jednostka miary (Twr_JM).","nullable":true},"stanLacznie":{"type":"number","description":"Łączny stan ilościowy we wszystkich magazynach.","format":"double"},"wartoscLacznie":{"type":"number","description":"Łączna wartość we wszystkich magazynach.","format":"double"},"dostepneLacznie":{"type":"number","description":"Łączny stan dostępny we wszystkich magazynach.","format":"double"},"magazyny":{"type":"array","items":{"$ref":"#/components/schemas/StanTowaruMagazyn"},"description":"Zestawienie per magazyn (tylko magazyny z niezerowym stanem).","nullable":true}},"additionalProperties":false,"description":"Stan towaru we wszystkich magazynach z niezerowym stanem."},"StanyMagazynowePagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/StanMagazynowyItem"},"nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (1-based).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba wierszy spełniających kryteria.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Stronicowany wynik zapytania o stany magazynowe."},"StepResult":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string","nullable":true}},"additionalProperties":false},"SwitchFirmRequest":{"required":["nazwaBazy"],"type":"object","properties":{"nazwaBazy":{"minLength":1,"type":"string","description":"Nazwa firmy w Optimie (Baz_Nazwa z CDN.Bazy)."}},"additionalProperties":false},"TokenRequest":{"required":["client_id","client_secret","grant_type"],"type":"object","properties":{"grant_type":{"minLength":1,"type":"string","description":"Musi być \"client_credentials\""},"client_id":{"minLength":1,"type":"string"},"client_secret":{"minLength":1,"type":"string"},"scope":{"type":"string","description":"Opcjonalnie — podzbiór zakresów klienta, oddzielone spacją","nullable":true}},"additionalProperties":false},"TokenResponse":{"type":"object","properties":{"access_token":{"type":"string","description":"Token dostępu Bearer","nullable":true},"token_type":{"type":"string","description":"Typ tokenu — zawsze \"Bearer\"","nullable":true},"expires_in":{"type":"integer","description":"Czas ważności w sekundach","format":"int32"},"scope":{"type":"string","description":"Przyznane zakresy","nullable":true}},"additionalProperties":false},"TowarResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string","nullable":true},"kod":{"type":"string","nullable":true},"nazwa":{"type":"string","nullable":true}},"additionalProperties":false},"TowaryPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"Rekordy na bieżącej stronie.","nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (od 1).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba rekordów pasujących do filtrów.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Stronicowana lista towarów z metadanymi paginacji."},"TypDokumentuInfo":{"type":"object","properties":{"kod":{"type":"string","description":"Kod używany w API (pole Typ w żądaniu).","nullable":true},"nazwa":{"type":"string","description":"Czytelna nazwa typu dokumentu.","nullable":true},"typDokumentu":{"type":"integer","description":"Wartość TypDokumentu w Optimie.","format":"int32"},"rodzaj":{"type":"integer","description":"Wartość Rodzaj w Optimie.","format":"int32"},"isKorekta":{"type":"boolean","description":"Czy typ jest korektą."}},"additionalProperties":false,"description":"Informacja o dostępnym typie dokumentu HaMag."},"UbezpieczenieDto":{"type":"object","properties":{"zusOd":{"type":"string","description":"Data zgłoszenia pracownika do ZUS — wyznacza moment objęcia ubezpieczeniem ogółem.\nZazwyczaj pokrywa się z datą rozpoczęcia pracy.","format":"date-time","nullable":true,"example":"2026-01-02"},"emerOd":{"type":"string","description":"Data objęcia ubezpieczeniem emerytalnym.\nZazwyczaj taka sama jak `ZusOd`.","format":"date-time","nullable":true,"example":"2026-01-02"},"rentOd":{"type":"string","description":"Data objęcia ubezpieczeniem rentowym.\nZazwyczaj taka sama jak `ZusOd`.","format":"date-time","nullable":true,"example":"2026-01-02"},"chorOd":{"type":"string","description":"Data objęcia ubezpieczeniem chorobowym.\nZazwyczaj taka sama jak `ZusOd`; może być późniejsza przy dobrowolnym przystąpieniu.","format":"date-time","nullable":true,"example":"2026-01-02"},"zdrowOd":{"type":"string","description":"Data objęcia ubezpieczeniem zdrowotnym (NFZ).\nZazwyczaj taka sama jak `ZusOd`.","format":"date-time","nullable":true,"example":"2026-01-02"},"zdrowDobrOd":{"type":"string","description":"Data objęcia dobrowolnym ubezpieczeniem zdrowotnym.\nDotyczy osób, które nie podlegają obowiązkowemu ubezpieczeniu zdrowotnemu\n(np. zleceniobiorcy wykonujący umowę za granicą).","format":"date-time","nullable":true,"example":"2026-01-02"},"jestEmerytal":{"type":"integer","description":"Ubezpieczenie emerytalne (ZUS): `1` = podlega, `0` = nie podlega.\nObowiązkowe dla pracowników etatowych.","format":"int32","nullable":true},"jestRentowe":{"type":"integer","description":"Ubezpieczenie rentowe (ZUS): `1` = podlega, `0` = nie podlega.\nObowiązkowe dla pracowników etatowych.","format":"int32","nullable":true},"jestChorobowe":{"type":"integer","description":"Ubezpieczenie chorobowe (ZUS): `1` = podlega, `0` = nie podlega.\nObowiązkowe dla pracowników etatowych; dobrowolne dla zleceniobiorców.","format":"int32","nullable":true},"jestWypad":{"type":"integer","description":"Ubezpieczenie wypadkowe (ZUS): `1` = podlega, `0` = nie podlega.\nObowiązkowe dla pracowników etatowych oraz zleceniobiorców wykonujących pracę\nw siedzibie lub miejscu prowadzenia działalności zleceniodawcy.","format":"int32","nullable":true},"jestDobrEmerytal":{"type":"integer","description":"Dobrowolne ubezpieczenie emerytalne: `1` = tak, `0` = nie.\nStosowane gdy pracownik nie podlega obowiązkowemu ubezpieczeniu emerytalnemu.","format":"int32","nullable":true},"jestDobrRentowe":{"type":"integer","description":"Dobrowolne ubezpieczenie rentowe: `1` = tak, `0` = nie.\nStosowane analogicznie do `JestDobrEmerytal`.","format":"int32","nullable":true},"jestDobrChorobowe":{"type":"integer","description":"Dobrowolne ubezpieczenie chorobowe: `1` = tak, `0` = nie.\nTypowe dla zleceniobiorców — chorobowe jest dla nich dobrowolne\ni wymaga osobnego wniosku do ZUS.","format":"int32","nullable":true},"jestDobrZdrow":{"type":"integer","description":"Dobrowolne ubezpieczenie zdrowotne: `1` = tak, `0` = nie.\nDotyczy osób, które nie podlegają obowiązkowemu ubezpieczeniu zdrowotnemu,\nnp. zleceniobiorców niespełniających warunków obowiązku.","format":"int32","nullable":true},"kodUbezpieczenia":{"type":"integer","description":"Identyfikator tytułu ubezpieczenia (kod ZUS) — wartość z słownika `CDN.TyUb4Coll`.\nPrzykład: `110` = pracownik etatowy.","format":"int32","nullable":true,"example":110}},"additionalProperties":false,"description":"Dane ubezpieczeń społecznych i zdrowotnego pracownika.\nWszystkie pola są opcjonalne — podanie wartości powoduje jej aktualizację,\npominięcie pozostawia dotychczasową wartość bez zmian."},"ViesDto":{"type":"object","properties":{"kodKraju":{"type":"string","description":"Dwuliterowy kod kraju UE (np. DE, FR, CZ).","nullable":true},"numerVat":{"type":"string","description":"Numer VAT bez prefiksu kraju.","nullable":true},"aktywny":{"type":"boolean","description":"Czy numer VAT jest aktywny w systemie VIES."},"nazwaFirmy":{"type":"string","description":"Nazwa firmy z rejestru VAT UE. Null jeśli kraj nie udostępnia.","nullable":true},"adres":{"type":"string","description":"Adres firmy z rejestru VAT UE. Null jeśli kraj nie udostępnia.","nullable":true},"dataZapytania":{"type":"string","description":"Data wykonania zapytania do VIES.","format":"date-time","nullable":true},"idZapytania":{"type":"string","description":"Identyfikator zapytania VIES (dostępny przy checkVatApprox z danymi żądającego).","nullable":true}},"additionalProperties":false,"description":"Wynik walidacji numeru VAT UE z serwisu VIES."},"WalutaDto":{"type":"object","properties":{"symbol":{"type":"string","description":"Symbol waluty (WNa_Symbol), np. EUR, USD.","nullable":true},"nazwa":{"type":"string","description":"Pełna nazwa waluty (WNa_Nazwa).","nullable":true},"kursL":{"type":"number","description":"Licznik kursu (WNo_KursL) — ile PLN za KursM jednostek waluty.","format":"double","nullable":true},"kursM":{"type":"number","description":"Mianownik kursu (WNo_KursM) — za ile jednostek waluty podany jest kurs.","format":"double","nullable":true},"kursBiezacy":{"type":"number","description":"Kurs bieżący PLN za 1 jednostkę waluty (KursL / KursM). Null gdy brak kursu.","format":"double","nullable":true},"dataKursu":{"type":"string","description":"Data obowiązywania kursu (WNo_TStamp). Null gdy brak kursu w bazie.","format":"date-time","nullable":true},"typKursu":{"type":"string","description":"Nazwa typu kursu z CDN.WalKursy (WKu_Nazwa), np. \"Średni NBP\". Null gdy brak kursu.","nullable":true}},"additionalProperties":false,"description":"Waluta z bieżącym kursem z CDN.WalNazwy + CDN.WalNotowania."},"WartoscAtrybutuItem":{"type":"object","properties":{"kodAtrybutu":{"type":"string","description":"Kod definicji atrybutu.","nullable":true},"nazwaAtrybutu":{"type":"string","description":"Nazwa atrybutu.","nullable":true},"format":{"type":"integer","description":"Format danych: 1=tekst, 2=liczba, 3=lista, 4=data, 5=binarna.","format":"int32"},"wartosc":{"type":"string","description":"Wartość atrybutu.","nullable":true}},"additionalProperties":false,"description":"Pojedyncza wartość atrybutu przypisana do obiektu (element odpowiedzi GET)."},"WartoscAtrybutuRequest":{"required":["kodAtrybutu","kodObiektu","typObiektu"],"type":"object","properties":{"typObiektu":{"maximum":4,"minimum":1,"type":"integer","description":"Typ obiektu docelowego. Określa zarówno kolekcję COM jak i format pola `KodObiektu`.\n- **1** — Towar (CDN.Towary) — `KodObiektu` = Twr_Kod\n- **2** — Kontrahent (CDN.Kontrahenci) — `KodObiektu` = Knt_Kod\n- **3** — Środek trwały (CDN.SrodkiTrwale) — `KodObiektu` = Srt_Kod\n- **4** — Dokument HaMag (CDN.DokumentyHaMag) — `KodObiektu` = numeryczny TrN_TrNID (np. \"1234\")","format":"int32","example":1},"kodObiektu":{"maxLength":50,"minLength":1,"type":"string","description":"Identyfikator obiektu. Format zależy od `TypObiektu`:\n- typ 1 (towar) — kod skrócony towaru: `Twr_Kod`\n- typ 2 (kontrahent) — kod skrócony kontrahenta: `Knt_Kod`\n- typ 3 (środek trwały) — kod środka trwałego: `Srt_Kod`\n- typ 4 (dokument) — numeryczny ID dokumentu: `TrN_TrNID` jako string, np. `\"1234\"`","example":"TOWAR-001"},"kodAtrybutu":{"maxLength":20,"minLength":1,"type":"string","description":"Kod definicji atrybutu (DeA_Kod).","example":"KOLOR"},"wartosc":{"maxLength":255,"type":"string","description":"Wartość atrybutu.\n- Format **liczbowy** — string dziesiętny, np. `\"12.50\"`.\n- Format **data** — ISO 8601, np. `\"2024-06-15\"`.\n- Format **lista** — jedna z wartości słownikowych zdefiniowanych dla atrybutu.","nullable":true,"example":"Czerwony"}},"additionalProperties":false,"description":"Żądanie operacji na wartości atrybutu przypisanego do obiektu."},"WartoscAtrybutuResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat opisujący wynik operacji lub błąd.","nullable":true},"kodObiektu":{"type":"string","description":"Kod obiektu, na którym wykonano operację.","nullable":true},"kodAtrybutu":{"type":"string","description":"Kod atrybutu, którego dotyczyła operacja.","nullable":true},"nazwaAtrybutu":{"type":"string","description":"Nazwa atrybutu.","nullable":true},"wartosc":{"type":"string","description":"Wartość atrybutu po operacji.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na wartości atrybutu obiektu."},"WorkerStatusResponse":{"type":"object","properties":{"workerId":{"type":"string","nullable":true},"hostname":{"type":"string","nullable":true},"version":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"currentJobId":{"type":"string","format":"uuid","nullable":true},"startedAt":{"type":"string","format":"date-time"},"heartbeat":{"type":"string","format":"date-time"},"isOnline":{"type":"boolean"}},"additionalProperties":false},"WydzialItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator wydziału (DZL_DzlId).","format":"int32"},"kod":{"type":"string","description":"Kod wydziału (DZL_Kod).","nullable":true},"symbol":{"type":"string","description":"Symbol wydziału — numeracja list płac (DZL_Symbol).","nullable":true},"nazwa":{"type":"string","description":"Nazwa wydziału (DZL_Nazwa).","nullable":true},"parentId":{"type":"integer","description":"ID wydziału nadrzędnego (DZL_ParentId). Null dla korzenia i węzła „brak\".","format":"int32","nullable":true},"adresWezla":{"type":"string","description":"Adres węzła w drzewie (DZL_AdresWezla).\nPrzykłady: \"0\" dla brak, \"1\" dla Firma.","nullable":true},"poziom":{"type":"integer","description":"Poziom zagłębienia (DZL_Poziom): 0=brak, 1=Firma, 2+=podwydziały.","format":"int32"},"nieaktywny":{"type":"boolean","description":"Czy wydział jest nieaktywny (DZL_Nieaktywny): 0=aktywny, 1=nieaktywny."},"sciezka":{"type":"string","description":"Ścieżka nazw od korzenia, np. \"FIRMA > Produkcja > Montaż\".","nullable":true},"dzieci":{"type":"array","items":{"$ref":"#/components/schemas/WydzialItem"},"description":"Podrzędne wydziały tego węzła (rekurencyjnie).","nullable":true}},"additionalProperties":false,"description":"Węzeł drzewa wydziałów z CDN.Dzialy."},"WydzialyResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/WydzialItem"},"description":"Korzenie drzewa (wydziały bez rodzica lub na poziomie głównym).","nullable":true},"lacznie":{"type":"integer","description":"Łączna liczba zwróconych wydziałów (wszystkich poziomów).","format":"int32"}},"additionalProperties":false,"description":"Odpowiedź endpointu GET /wydzialy — drzewo wydziałów."},"ZapisKBDto":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator zapisu (BZp_BZpID).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer dokumentu (BZp_NumerPelny).","nullable":true},"numerObcy":{"type":"string","description":"Numer obcy dokumentu (BZp_NumerObcy).","nullable":true},"dataDok":{"type":"string","description":"Data operacji (BZp_DataDok).","format":"date-time"},"kwota":{"type":"number","description":"Kwota w walucie dokumentu (BZp_Kwota).","format":"double"},"kwotaRozliczona":{"type":"number","description":"Kwota rozliczona w walucie dokumentu (BZp_KwotaRoz).","format":"double"},"kwotaSys":{"type":"number","description":"Kwota w walucie systemowej PLN (BZp_KwotaSys).","format":"double"},"kwotaRozliczonaSys":{"type":"number","description":"Kwota rozliczona w PLN (BZp_KwotaRozSys).","format":"double"},"waluta":{"type":"string","description":"Symbol waluty dokumentu (BZp_Waluta).","nullable":true},"kierunek":{"type":"integer","description":"Kierunek: 1 = wpłata (KP), -1 = wypłata (KW).","format":"int32"},"typZapisu":{"type":"string","description":"Typ zapisu: KP (wpłata) lub KW (wypłata).","nullable":true},"typOperacji":{"type":"string","description":"Rodzaj operacji: Gotówka / Przelew / Karta (BZp_Typ).","nullable":true},"statusRozliczenia":{"type":"string","description":"Status rozliczenia: Nierozliczone / Częściowo rozliczone / Rozliczone / Nie podlega rozliczeniu.","nullable":true},"dataRozliczenia":{"type":"string","description":"Data rozliczenia — null gdy nierozliczone (BZp_DataRoz).","format":"date-time","nullable":true},"opis":{"type":"string","description":"Opis dokumentu (BZp_Opis).","nullable":true},"kontrahentId":{"type":"integer","description":"ID kontrahenta (Knt_KntId). Null gdy podmiot innego typu.","format":"int32","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod).","nullable":true},"podmiotNazwa":{"type":"string","description":"Pierwsza linia nazwy podmiotu (BZp_Nazwa1).","nullable":true}},"additionalProperties":false,"description":"Pojedynczy dokument kasowo-bankowy (KP/KW/wyciąg) z CDN.BnkZapisy."},"ZapisKbListItem":{"type":"object","properties":{"id":{"type":"integer","description":"Identyfikator zapisu (BZp_BZpID).","format":"int32"},"numerPelny":{"type":"string","description":"Pełny numer zapisu (BZp_NumerPelny).","nullable":true},"numerObcy":{"type":"string","description":"Numer obcy dokumentu zewnętrznego (BZp_NumerObcy).","nullable":true},"rejestrSymbol":{"type":"string","description":"Symbol rejestru (BRa_Symbol).","nullable":true},"raportNumer":{"type":"string","description":"Numer raportu, do którego należy zapis (BRp_NumerPelny).","nullable":true},"dataDok":{"type":"string","description":"Data dokumentu (BZp_DataDok).","format":"date-time"},"kwota":{"type":"number","description":"Kwota zapisu (BZp_Kwota).","format":"double"},"kierunek":{"type":"string","description":"Kierunek: KP (przychód) lub KW (rozchód).","nullable":true},"kontrahentId":{"type":"integer","description":"Identyfikator kontrahenta (Knt_KntId). Null jeśli brak podmiotu.","format":"int32","nullable":true},"kontrahentKod":{"type":"string","description":"Kod kontrahenta (Knt_Kod).","nullable":true},"kontrahentNazwa":{"type":"string","description":"Nazwa kontrahenta (Knt_Nazwa1).","nullable":true},"opis":{"type":"string","description":"Opis zapisu (BZp_Opis).","nullable":true},"statusRozliczenia":{"type":"string","description":"Status rozliczenia: Nierozliczone / Częściowo rozliczone / Rozliczone / Nie podlega rozliczeniu.","nullable":true},"raportZamkniety":{"type":"boolean","description":"Czy raport zawierający zapis jest zamknięty (BRp_Zamkniety = 1)."}},"additionalProperties":false,"description":"Pojedynczy wiersz listy zapisów kasowo-bankowych."},"ZapisKbResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Czy operacja zakończyła się sukcesem."},"message":{"type":"string","description":"Komunikat wyniku operacji.","nullable":true},"id":{"type":"integer","description":"Identyfikator zapisu (BZp_BZpID). Zwracany po pomyślnym dodaniu lub edycji.","format":"int32","nullable":true},"numerPelny":{"type":"string","description":"Pełny numer zapisu kasowo-bankowego. Zwracany po pomyślnym dodaniu.","nullable":true}},"additionalProperties":false,"description":"Wynik operacji na zapisie kasowo-bankowym."},"ZapisyKBResponse":{"type":"object","properties":{"sumaWplatSys":{"type":"number","description":"Suma wpłat (KP) w PLN na wszystkich stronach pasujących do filtrów.","format":"double"},"sumaWyplatSys":{"type":"number","description":"Suma wypłat (KW) w PLN na wszystkich stronach pasujących do filtrów.","format":"double"},"lacznie":{"type":"integer","description":"Łączna liczba rekordów pasujących do filtrów.","format":"int32"},"strona":{"type":"integer","description":"Numer bieżącej strony (od 1).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"},"pozycje":{"type":"array","items":{"$ref":"#/components/schemas/ZapisKBDto"},"description":"Lista dokumentów na bieżącej stronie.","nullable":true}},"additionalProperties":false,"description":"Stronicowana lista dokumentów kasowo-bankowych z podsumowaniem."},"ZapisyKbPagedResponse":{"type":"object","properties":{"dane":{"type":"array","items":{"$ref":"#/components/schemas/ZapisKbListItem"},"nullable":true},"strona":{"type":"integer","description":"Numer bieżącej strony (1-based).","format":"int32"},"rozmiar":{"type":"integer","description":"Rozmiar strony.","format":"int32"},"lacznie":{"type":"integer","description":"Łączna liczba wierszy spełniających kryteria.","format":"int32"},"stron":{"type":"integer","description":"Łączna liczba stron.","format":"int32"}},"additionalProperties":false,"description":"Stronicowana lista zapisów kasowo-bankowych."}},"securitySchemes":{"Bearer":{"type":"http","description":"Wpisz token uzyskany z POST /oauth/token.","scheme":"bearer","bearerFormat":"Opaque"}}},"security":[{"Bearer":[]}]}