Przejdź do głównej zawartości

Historia zmian API

Dla: Programista

Tu trafia każda zmiana publicznego kontraktu, od najnowszego wydania Prynt: nowe operacje, pola, argumenty i wartości enumów, zmiany zachowania, wycofania (z najwcześniejszą datą usunięcia) i usunięcia. Zasady zmian opisuje Wersjonowanie. Zmiany w aplikacji dla użytkowników drukarni znajdziesz w Co nowego.

Prynt 0.34.0

3 listopada 2026

  • Zmieniono Query.stockMovements — Stan wpisany przy zakładaniu karty papieru, farby albo folii jest ruchem `CORRECTION` od 0 do tego stanu (`notes`: „Stan początkowy karty”), zapisanym razem z kartą — łańcuch ruchów nowej karty zaczyna się od zera. Karty założone przed 0.34.0 takiego ruchu nie mają.
  • Zmieniono Paint.minimumStock — Minimalny stan podany przy zakładaniu farby w Prynt zapisuje się (wcześniej przepadał i pole zostawało puste do pierwszej edycji karty).
  • Zmieniono Paper.updatedAt — Zapis karty w Prynt bez zmiany żadnego pola (także ponowna archiwizacja narzędzia) nie przesuwa już zegara — synchronizacja nie dostaje karty, która się nie zmieniła.
  • Zmieniono Paint.updatedAt — Zapis karty w Prynt bez zmiany żadnego pola (także ponowna archiwizacja narzędzia) nie przesuwa już zegara — synchronizacja nie dostaje karty, która się nie zmieniła.
  • Zmieniono Foil.updatedAt — Zapis karty w Prynt bez zmiany żadnego pola (także ponowna archiwizacja narzędzia) nie przesuwa już zegara — synchronizacja nie dostaje karty, która się nie zmieniła.
  • Zmieniono DieCut.updatedAt — Zapis karty w Prynt bez zmiany żadnego pola (także ponowna archiwizacja narzędzia) nie przesuwa już zegara — synchronizacja nie dostaje karty, która się nie zmieniła.
  • Zmieniono Matrix.updatedAt — Zapis karty w Prynt bez zmiany żadnego pola (także ponowna archiwizacja narzędzia) nie przesuwa już zegara — synchronizacja nie dostaje karty, która się nie zmieniła.

Prynt 0.33.0

2 listopada 2026

  • Dodano Paper.isStock — Czy drukarnia prowadzi stan papieru; `false` to papier tylko do wyceny — drukarnia nie śledzi jego stanu, a klucz go nie przyjmie i nie wyda, także dostawą z zamówienia zakupu (`PAPER_PRICING_ONLY`). Przestawienie flagi niczego nie zeruje: stan i ruchy zapisane wcześniej zostają, a w aplikacji można go dalej przyjąć i wydać.
  • Zmieniono PaperFilterInput.isStock — Nowy filtr po `Paper.isStock`; bez niego lista zawiera oba rodzaje papieru, jak dotąd.
  • Zmieniono PaperFilterInput.grammageMin — Nowy filtr: gramatura od (włącznie); ta sama wartość w `grammageMin` i `grammageMax` daje jedną gramaturę.
  • Zmieniono PaperFilterInput.grammageMax — Nowy filtr: gramatura do (włącznie).
  • Zmieniono PaperFilterInput.quantitySheetsMin — Nowy filtr: stan w arkuszach od (włącznie); `1` daje papiery naprawdę na stanie.
  • Zmieniono PaperFilterInput.quantitySheetsMax — Nowy filtr: stan w arkuszach do (włącznie).
  • Zmieniono PaperFilterInput.lowStock — `false` zwraca teraz papiery, których stan nie jest poniżej stanu minimalnego (także papiery bez stanu minimalnego); dotąd `false` działało jak brak filtra.
  • Zmieniono PaperFilterInput.supplierId — Nowy filtr: papiery preferowanego dostawcy (`Paper.supplierId`). Starsze papiery z dostawcą wpisanym tylko tekstem (`supplierName`) go nie mają.
  • Zmieniono PaperFilterInput.isFsc — Nowy filtr: papiery FSC (`true`) albo bez certyfikatu (`false`).
  • Zmieniono PaintFilterInput.supplierId — Nowy filtr: farby preferowanego dostawcy (`Paint.supplierId`).
  • Zmieniono PaintFilterInput.quantityGramsMin — Nowy filtr: stan w gramach od (włącznie, z dokładnością do 0,001 g).
  • Zmieniono PaintFilterInput.quantityGramsMax — Nowy filtr: stan w gramach do (włącznie).
  • Zmieniono FoilFilterInput.supplierId — Nowy filtr: folie preferowanego dostawcy (`Foil.supplierId`).
  • Zmieniono FoilFilterInput.numberOfRollsMin — Nowy filtr: stan w rolkach od (włącznie); część rolki się liczy.
  • Zmieniono FoilFilterInput.numberOfRollsMax — Nowy filtr: stan w rolkach do (włącznie).
  • Zmieniono Mutation.receivePaper — Przyjęcie papieru tylko do wyceny (`Paper.isStock` = `false`) jest odrzucane błędem `PAPER_PRICING_ONLY` z `paperId`, `code` i `name` w `params`: drukarnia nie prowadzi jego stanu.
  • Zmieniono Mutation.withdrawPaper — Wydanie papieru tylko do wyceny (`Paper.isStock` = `false`) jest odrzucane błędem `PAPER_PRICING_ONLY`.
  • Zmieniono Mutation.receivePurchaseOrder — Dostawa pozycji z papierem tylko do wyceny (`Paper.isStock` = `false`) jest odrzucana błędem `PAPER_PRICING_ONLY` (papier w `params`: `paperId`, `code`, `name`), a cała dostawa nie jest przyjmowana.
  • Zmieniono OrderFilterInput.productPackingDateFrom — Nowy filtr: zamówienia z produktem pakowanym nie wcześniej niż podana chwila (włącznie). Daty pakowania są zapisane jako początek dnia w strefie drukarni (Europe/Warsaw) — podawaj granice z offsetem, np. `2026-11-03T00:00:00+01:00`.
  • Zmieniono OrderFilterInput.productPackingDateTo — Nowy filtr: zamówienia z produktem pakowanym nie później niż podana chwila (włącznie), np. `2026-11-03T23:59:59+01:00` — do końca 3 listopada.
  • Zmieniono OrderFilterInput.productHasPackingDate — Nowy filtr: `true` — produkt z datą pakowania, `false` — bez niej (ten sam produkt, co pozostałe warunki `product*`, więc `false` razem z zakresem dat nie zwraca nic).
  • Dodano Element.spec — Technologia elementu skopiowana z kalkulacji: formaty arkusza drukowego i zakupowego (identyfikatory słownika `SHEET_FORMAT` i wymiary w milimetrach — także wtedy, gdy kalkulacja podała sam format; wtedy, podobnie jak automatyczny dzielnik arkusza zakupowego, wynikają z bieżącego słownika formatów), użytki, kolorystyka i schemat druku, formy, płyty, arkusze netto i brutto, maszyna drukująca z wyceny (`pressMachineId`). Bez cen papieru. Null dla elementów bez technologii z kalkulacji — wpisanych ręcznie, utworzonych przez API albo przejętych z poprzedniego systemu drukarni (tam format i papier są w `Operation.comments`). Zakres `orders:read`.
  • Zmieniono ReferenceDataType.SHEET_FORMAT — Nowy słownik: formaty arkuszy kalkulatora, na które wskazują `ElementSpec.printFormatId` i `ElementSpec.purchaseFormatId`. Z `includeInactive: true` także formaty wycofane, na które mogą wskazywać starsze zamówienia. Zakres `reference:read`.
  • Dodano ReferenceDataItem.widthMm — Szerokość arkusza w milimetrach — tylko w słowniku `SHEET_FORMAT`, w pozostałych null.
  • Dodano ReferenceDataItem.heightMm — Wysokość arkusza w milimetrach — tylko w słowniku `SHEET_FORMAT`, w pozostałych null.
  • Dodano ReferenceDataItem.kind — Rodzaj formatu arkusza (`SheetFormatKind`): zakupowy, drukowy albo oba — tylko w słowniku `SHEET_FORMAT`.
  • Dodano ReferenceDataItem.parentId — Format, z którego arkusz jest cięty (inny wpis `SHEET_FORMAT`); null dla arkusza, który nie jest cięty z innego, i w pozostałych słownikach.
  • Dodano ReferenceDataItem.divisor — Ile takich arkuszy powstaje z jednego arkusza formatu `parentId` — tylko w słowniku `SHEET_FORMAT`.
  • Dodano Operation.updatedAt — Zegar zmian operacji: jej pola i każda zmiana statusu jej zadania (utworzenie, start, pauza, wznowienie, zakończenie, anulowanie). Zmiana zamówienia lub produktu go nie przesuwa; zapis tych samych wartości też nie. Operacje sprzed 0.33.0 mają chwilę wdrożenia.
  • Dodano Query.operations — Lista operacji zamówień ze stronami: filtry po maszynie, elemencie, produkcie, zamówieniu, archiwum i statusie zamówienia (`orderStatus`, `orderStatusIn`) oraz — z `production:read` — po stanie produkcji (`productionStatus`, `productionStatusIn`, ta sama reguła co pole `Operation.productionStatus`). `updatedFrom` z sortowaniem `UPDATED_AT` pobiera tylko operacje zmienione od poprzedniej synchronizacji, także przez zadania na hali. Bez `sort` — po terminie zamówienia (`ORDER_COMPLETION_DATE`, zamówienia bez terminu na końcu), potem po identyfikatorze. Zakres `orders:read`; cena z `prices:read`.
  • Dodano Query.operation — Jedna operacja zamówienia po identyfikatorze. Zakres `orders:read`.
  • Dodano Operation.productId — Identyfikator produktu operacji (przez jej element).
  • Dodano Operation.orderId — Identyfikator zamówienia operacji (przez element i produkt).
  • Dodano Operation.element — Element, który operacja wykonuje; dla klucza z `orders:read` zawsze ustawiony.
  • Dodano Operation.product — Produkt operacji; dla klucza z `orders:read` zawsze ustawiony.
  • Dodano Operation.order — Zamówienie operacji; dla klucza z `orders:read` zawsze ustawione.
  • Dodano Operation.previousOperationId — Identyfikator poprzedniej operacji elementu — tej o najbliższej niższej pozycji (`sequenceOrder`); null dla pierwszej operacji i dla operacji bez pozycji.
  • Dodano Operation.previousOperation — Poprzednia operacja elementu. Czy operację można zacząć, zależy od wszystkich wcześniejszych operacji elementu, nie tylko od niej — podaje to `readyToStart`.
  • Dodano Operation.readyToStart — Czy hala może teraz zacząć operację — ta sama reguła, której używa kolejka maszyn w Prynt: wszystkie wcześniejsze operacje elementu są skończone (`endedAt` i cała ilość), z pominięciem pozycji materiałowych (papier, karton, narzędzie z magazynu, każda operacja na maszynie magazynu). Może być `false`, choć poprzednia operacja ma `productionStatus` = `COMPLETED` (zakończona bez całej ilości). Zmienia się po zakończeniu innej operacji elementu bez ruchu `updatedAt` tej operacji — przesuwa się wtedy `Order.updatedAt`, więc synchronizuj też `orders(updatedFrom)`. Zakres `production:read`.
  • Dodano Element.product — Produkt elementu; dla klucza z `orders:read` zawsze ustawiony.
  • Dodano Product.order — Zamówienie produktu; dla klucza z `orders:read` zawsze ustawione.
  • Dodano Mutation.updateOperation — Zmiana jednej operacji zamówienia jako łatka: maszyna, opis, ilość, jednostka, czas na jednostkę, cena, typ operacji, uszlachetnienie i profil kolorów. `null` czyści tylko opis i trzy identyfikatory słowników. Odmowy: zamówienie zarchiwizowane, nowa maszyna operacji, której zadanie produkcyjne czeka na start, jest przydzielone, w toku albo wstrzymane (`OPERATION_IN_PRODUCTION` — ta sama reguła obowiązuje w aplikacji), maszyna wycofana (`MACHINE_INACTIVE`) albo bez domyślnego typu zadania (`MACHINE_NO_DEFAULT_TASK_TYPE`). Inny czas na jednostkę albo ilość zastępuje szacunek czasu z kalkulacji; ilość nie większa niż wykonana kończy operację. Nowa maszyna zdejmuje operację z przypiętych w kolejce starej maszyny. Cenę zaokrąglamy do 2, a ilość do 3 miejsc po przecinku; zapis tych samych wartości po zaokrągleniu niczego nie zmienia (ani `Operation.updatedAt`, ani `Order.updatedAt`), więc ponowienie jest bezpieczne także bez `Idempotency-Key`. Zakres `orders:write`.
  • Zmieniono OrderProductOperationInput.operationTypeId — Nowe opcjonalne pole: typ operacji (`referenceData(type: OPERATION_TYPE)`) przy tworzeniu zamówienia (`createOrder`).
  • Zmieniono OrderProductOperationInput.finishingTypeId — Nowe opcjonalne pole: uszlachetnienie (`referenceData(type: FINISHING_TYPE)`) przy tworzeniu zamówienia.
  • Zmieniono OrderProductOperationInput.colorProfileId — Nowe opcjonalne pole: profil kolorów (`referenceData(type: COLOR_PROFILE)`) przy tworzeniu zamówienia.
  • Zmieniono OrderProductElementInput.elementTypeId — Nowe opcjonalne pole: typ elementu (`referenceData(type: ELEMENT_TYPE)`) przy tworzeniu zamówienia.
  • Dodano StockMovement.unitPrice — Cena netto jednej `priceUnit` przyjętego towaru: podana przy przyjęciu ręcznym albo cena pozycji zamówienia zakupu z chwili dostawy (późniejsza zmiana pozycji jej nie zmienia). Null dla wydań, korekt, inwentaryzacji, przyjęć bez ceny i wszystkich przyjęć sprzed 0.33.0. Zakres `prices:read`.
  • Dodano StockMovement.priceUnit — Jednostka ceny tak, jak zapisuje ją aplikacja (`ark.`, `g`, `kg`, `rolki`, `m`) — niekoniecznie jednostka stanu: farba wyceniona za kilogram jest na stanie w gramach.
  • Dodano StockMovement.currency — Waluta ceny i wartości przyjęcia.
  • Dodano StockMovement.netValue — Wartość netto przyjęcia policzona przy księgowaniu: ilość w `priceUnit` razy cena, dla dostawy z zamówienia zakupu — ilość z dokumentu, niezależnie od zaokrąglenia stanu. Zakres `prices:read`.
  • Dodano StockMovement.supplierId — Dostawca przyjęcia: podany przy przyjęciu ręcznym albo dostawca zamówienia zakupu; null, gdy nie podano albo dostawcę usunięto.
  • Dodano StockMovement.deliveredAt — Data dostawy z dokumentu; `occurredAt` to chwila zaksięgowania.
  • Dodano StockMovement.documentNumber — Numer WZ albo faktury dostawcy podany przy przyjęciu.
  • Zmieniono ReceivePaperInput.unitPrice — Nowe opcjonalne pole: cena netto za `priceUnit` z dokumentu dostawy, zapisana w ruchu razem z wartością (`StockMovement.unitPrice`, `StockMovement.netValue`). Karta materiału — jej cena, waluta i dostawca — się nie zmienia.
  • Zmieniono ReceivePaperInput.priceUnit — Nowe opcjonalne pole: jednostka ceny — `ark.` (arkusz; domyślnie); synonimy zapisują się w ruchu tak, jak pisze je aplikacja. Tylko z `unitPrice`; innej jednostki API nie przyjmuje (`STOCK_UNIT_NOT_CONVERTIBLE`).
  • Zmieniono ReceivePaperInput.currency — Nowe opcjonalne pole: waluta ceny (3 wielkie litery), domyślnie waluta karty materiału. Tylko z `unitPrice`.
  • Zmieniono ReceivePaperInput.supplierId — Nowe opcjonalne pole: dostawca przyjęcia (`StockMovement.supplierId`); musi istnieć i być aktywny. Bez niego ruch nie ma dostawcy — API nie bierze go z karty.
  • Zmieniono ReceivePaperInput.deliveredAt — Nowe opcjonalne pole: data dostawy z dokumentu (`StockMovement.deliveredAt`); `occurredAt` zostaje chwilą zaksięgowania.
  • Zmieniono ReceivePaperInput.documentNumber — Nowe opcjonalne pole: numer WZ albo faktury dostawcy, do 100 znaków (`StockMovement.documentNumber`, filtr `documentNumber`).
  • Zmieniono ReceivePaintInput.unitPrice — Nowe opcjonalne pole: cena netto za `priceUnit` z dokumentu dostawy, zapisana w ruchu razem z wartością (`StockMovement.unitPrice`, `StockMovement.netValue`). Karta materiału — jej cena, waluta i dostawca — się nie zmienia.
  • Zmieniono ReceivePaintInput.priceUnit — Nowe opcjonalne pole: jednostka ceny — `g` (domyślnie) albo `kg` = 1000 g; np. 5000 g po 52,30 za `kg` daje wartość 261,50; synonimy zapisują się w ruchu tak, jak pisze je aplikacja. Tylko z `unitPrice`; innej jednostki API nie przyjmuje (`STOCK_UNIT_NOT_CONVERTIBLE`).
  • Zmieniono ReceivePaintInput.currency — Nowe opcjonalne pole: waluta ceny (3 wielkie litery), domyślnie waluta karty materiału. Tylko z `unitPrice`.
  • Zmieniono ReceivePaintInput.supplierId — Nowe opcjonalne pole: dostawca przyjęcia (`StockMovement.supplierId`); musi istnieć i być aktywny. Bez niego ruch nie ma dostawcy — API nie bierze go z karty.
  • Zmieniono ReceivePaintInput.deliveredAt — Nowe opcjonalne pole: data dostawy z dokumentu (`StockMovement.deliveredAt`); `occurredAt` zostaje chwilą zaksięgowania.
  • Zmieniono ReceivePaintInput.documentNumber — Nowe opcjonalne pole: numer WZ albo faktury dostawcy, do 100 znaków (`StockMovement.documentNumber`, filtr `documentNumber`).
  • Zmieniono ReceiveFoilInput.unitPrice — Nowe opcjonalne pole: cena netto za `priceUnit` z dokumentu dostawy, zapisana w ruchu razem z wartością (`StockMovement.unitPrice`, `StockMovement.netValue`). Karta materiału — jej cena, waluta i dostawca — się nie zmienia.
  • Zmieniono ReceiveFoilInput.priceUnit — Nowe opcjonalne pole: jednostka ceny — `rolki` (domyślnie) albo `m`, liczone przez `Foil.metersPerRoll` (folii bez metrów na rolce API nie wycenia w metrach); synonimy zapisują się w ruchu tak, jak pisze je aplikacja. Tylko z `unitPrice`; innej jednostki API nie przyjmuje (`STOCK_UNIT_NOT_CONVERTIBLE`).
  • Zmieniono ReceiveFoilInput.currency — Nowe opcjonalne pole: waluta ceny (3 wielkie litery), domyślnie waluta karty materiału. Tylko z `unitPrice`.
  • Zmieniono ReceiveFoilInput.supplierId — Nowe opcjonalne pole: dostawca przyjęcia (`StockMovement.supplierId`); musi istnieć i być aktywny. Bez niego ruch nie ma dostawcy — API nie bierze go z karty.
  • Zmieniono ReceiveFoilInput.deliveredAt — Nowe opcjonalne pole: data dostawy z dokumentu (`StockMovement.deliveredAt`); `occurredAt` zostaje chwilą zaksięgowania.
  • Zmieniono ReceiveFoilInput.documentNumber — Nowe opcjonalne pole: numer WZ albo faktury dostawcy, do 100 znaków (`StockMovement.documentNumber`, filtr `documentNumber`).
  • Zmieniono ReceivePurchaseOrderInput.deliveredAt — Nowe opcjonalne pole: data dostawy kopiowana na każdy ruch dostawy.
  • Zmieniono ReceivePurchaseOrderInput.documentNumber — Nowe opcjonalne pole: numer WZ kopiowany na każdy ruch dostawy — `stockMovements(filter: { purchaseOrderId, documentNumber })` rozpoznaje dostawę już przyjętą jednym zapytaniem (zamiast numeru WZ w `notes`).
  • Zmieniono Mutation.receivePurchaseOrder — Każdy ruch dostawy zapisuje cenę i jednostkę pozycji, walutę i dostawcę zamówienia oraz datę i numer dokumentu dostawy. Karta materiału się nie zmienia.
  • Zmieniono StockMovementFilterInput.supplierId — Nowy filtr: przyjęcia towaru od dostawcy — ręczne i dostawy jego zamówień zakupu.
  • Zmieniono StockMovementFilterInput.documentNumber — Nowy filtr: dokładnie ten numer dokumentu dostawy, bez rozróżniania wielkości liter — jak `PaperFilterInput.barcode`, inaczej niż `PurchaseInvoiceFilterInput.invoiceNumber` (fragment).

Prynt 0.32.0

2 listopada 2026

  • Zmieniono Mutation.withdrawPaper — Wydanie zapisuje w ruchu cały łańcuch zamówienia: podana sama operacja uzupełnia `elementId`, `productId` i `orderId` ruchu (element — produkt i zamówienie, produkt — zamówienie), więc filtry `stockMovements` znajdują go po każdym z nich. Ruchy sprzed 0.32.0 mają tylko podane identyfikatory.
  • Zmieniono Mutation.withdrawPaint — Wydanie zapisuje w ruchu cały łańcuch zamówienia: podana sama operacja uzupełnia `elementId`, `productId` i `orderId` ruchu (element — produkt i zamówienie, produkt — zamówienie), więc filtry `stockMovements` znajdują go po każdym z nich. Ruchy sprzed 0.32.0 mają tylko podane identyfikatory.
  • Zmieniono Mutation.withdrawFoil — Wydanie zapisuje w ruchu cały łańcuch zamówienia: podana sama operacja uzupełnia `elementId`, `productId` i `orderId` ruchu (element — produkt i zamówienie, produkt — zamówienie), więc filtry `stockMovements` znajdują go po każdym z nich. Ruchy sprzed 0.32.0 mają tylko podane identyfikatory.
  • Zmieniono StockMovementFilterInput.productId — Nowy filtr: ruchy zaksięgowane na produkt zamówienia.
  • Zmieniono StockMovementFilterInput.elementId — Nowy filtr: ruchy zaksięgowane na element.
  • Zmieniono StockMovementFilterInput.operationId — Nowy filtr: ruchy zaksięgowane na operację.
  • Zmieniono StockMovementFilterInput.type — Nowy filtr po typie ruchu, tą samą regułą co `StockMovement.type`: RECEIPT to przyjęcie ręczne albo dostawa z zamówienia zakupu, które podniosły stan, RETURN — zwrot do dostawcy (starsze ruchy folii zapisane bez rolek też liczą się jako RETURN). Korekta i różnica z inwentaryzacji mają własne typy, nawet gdy podniosły stan. Ignorowany, gdy `typeIn` zawiera jakikolwiek typ.
  • Zmieniono StockMovementFilterInput.typeIn — Nowy filtr: ruchy dowolnego z podanych typów, np. `[PRODUCTION, WASTE, OTHER]` — zużycie. Pusta lista niczego nie zawęża.

Prynt 0.30.0

18 października 2026

  • Zmieniono Unit.PASSES — Nowa jednostka ilości: przeloty arkusza przez maszynę drukującą. Pojawia się w operacjach zamówień utworzonych z kalkulatora (`Operation.unit`) i w ich danych wejściowych.
  • Zmieniono Unit.PLATES — Nowa jednostka ilości: płyty drukowe (CTP), np. w operacji naświetlania płyt.
  • Zmieniono Unit.SIGNATURES — Nowa jednostka ilości: składki (legi) książki, np. przy falcowaniu i zbieraniu.
  • Zmieniono Unit.IMPRESSIONS — Nowa jednostka ilości: uderzenia sztancy albo prasy do złocenia.
  • Zmieniono Unit.PALLETS — Nowa jednostka ilości: palety (pakowanie).

Prynt 0.28.0

6 października 2026

  • Dodano Query.currentApiKey — Pierwsza operacja publicznego API: klucz, którym wysłano żądanie — integracja, zakresy, ważność klucza i akceptacji oraz limit żądań. Nie wymaga zakresu, więc wywoła ją każdy ważny klucz; najprostszy sposób, żeby sprawdzić, czy klucz działa.
  • Dodano Query.orders — Lista zamówień ze stronami (do 100 na stronę), filtrami i sortowaniem — z produktami, elementami, operacjami, kontaktem, adresami dostaw, danymi do faktury, płatnościami i kosztami dodatkowymi. Filtr `updatedFrom` z sortowaniem `UPDATED_AT` pobiera tylko zamówienia zmienione od poprzedniej synchronizacji (`Order.updatedAt` zmienia się przy każdej zmianie zamówienia i tego, co w nim jest). Zakres `orders:read`; ceny i koszty z `prices:read`, pliki z `files:read`.
  • Dodano Query.order — Jedno zamówienie po identyfikatorze, z tymi samymi polami co na liście. Zakres `orders:read`.
  • Dodano Query.product — Jeden produkt zamówienia po identyfikatorze, z elementami, operacjami, kosztami i plikami. Zakres `orders:read`.
  • Dodano Mutation.createOrder — Tworzenie zamówienia z produktami (także z elementami i operacjami), kontaktem, adresami dostaw, danymi do faktury i kosztami dodatkowymi. Zamówienie dostaje numer, status `CREATED`, a integrację jako autora; jego produkty zaczynają w statusie `NO_FILES`. Klient zablokowany przez drukarnię albo przez nią usunięty (`isActive: false`) nie przyjmuje zamówień z API. Zakres `orders:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.updateOrder — Zmiana zamówienia: pól, statusu (zgodnie z dozwolonymi przejściami, bez cofania), statusu płatności, kontaktu, adresów dostaw i danych do faktury. `Order.updatedAt` przesuwa się tylko przy prawdziwej zmianie. Zakres `orders:write`.
  • Dodano Mutation.createProduct — Dodanie produktu do istniejącego, niezarchiwizowanego zamówienia; produkt zaczyna w statusie `NO_FILES`. Zakres `orders:write`.
  • Dodano Mutation.updateProduct — Zmiana pól produktu (bez statusu, który wynika z plików i produkcji). Ponowienie z tymi samymi danymi niczego nie zmienia, także `Order.updatedAt`. Zakres `orders:write`.
  • Dodano Mutation.createOrderPayment — Zapisanie wpłaty do niezarchiwizowanego zamówienia, w walucie zamówienia. Nie zmienia statusu płatności zamówienia. Zakres `orders:write`.
  • Dodano Mutation.addAdditionalCost — Dodanie kosztu dodatkowego do niezarchiwizowanego zamówienia albo do jego produktu. Zakres `orders:write`.
  • Dodano Mutation.updateAdditionalCost — Zmiana kosztu dodatkowego niezarchiwizowanego zamówienia. Ponowienie z tymi samymi danymi niczego nie zmienia, także `Order.updatedAt`. Zakres `orders:write`.
  • Dodano Query.clients — Lista klientów ze stronami (do 100 na stronę), wyszukiwaniem, filtrami i sortowaniem — z kontaktami, adresami, tagami i najnowszymi notatkami CRM (`clientNotes(first:)`, do 50 na klienta; autor notatki widoczny, gdy napisała ją integracja). Filtr `updatedFrom` z sortowaniem `UPDATED_AT` pobiera tylko klientów zmienionych od poprzedniej synchronizacji (`Client.updatedAt` zmienia się także przy zmianie kontaktu, adresu, notatki i tagów), a `externalRef` odnajduje klienta po Twoim identyfikatorze. Zakres `clients:read`; limit kredytowy i rabat z `prices:read`.
  • Dodano Query.client — Jeden klient po identyfikatorze, z tymi samymi polami co na liście. Zakres `clients:read`.
  • Dodano Query.clientTags — Tagi, którymi drukarnia oznacza klientów (listę prowadzi drukarnia w Prynt). Zakres `clients:read`.
  • Dodano Order.client — Klient zamówienia jako pełny rekord, dla klucza z zakresem `clients:read` obok zakresu zamówień.
  • Dodano Mutation.createClient — Dodanie klienta (firmy, jednoosobowej działalności albo osoby prywatnej) z adresem siedziby i Twoim identyfikatorem `externalRef`, unikalnym w obrębie integracji. Warunki handlowe — limit kredytowy, rabat, termin i formę płatności, podmiot wystawiający faktury, walutę — oraz blokadę i opiekunów ustala drukarnia w Prynt; integracja ich nie podaje. Zakres `clients:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.updateClient — Zmiana klienta: pole pominięte zostaje bez zmian, `null` czyści pole, które może być puste. Integracja nie zdejmuje blokady, nie zmienia warunków handlowych (limitu kredytowego, rabatu, terminu i formy płatności, podmiotu wystawiającego faktury, waluty), aktywności ani opiekunów, a klienta usuniętego w Prynt (`isActive: false`) nie zmienia wcale — tak samo jego kontaktów, adresów, notatek i tagów. `Client.updatedAt` przesuwa się tylko przy prawdziwej zmianie. Zakres `clients:write`.
  • Dodano Mutation.createClientContact — Dodanie osoby kontaktowej klienta (wymaga imienia, nazwiska, e-maila albo telefonu). Zakres `clients:write`.
  • Dodano Mutation.updateClientContact — Zmiana osoby kontaktowej: pole pominięte zostaje, `null` czyści pole tekstowe. Ponowienie z tymi samymi danymi niczego nie zmienia, także `Client.updatedAt`. Zakres `clients:write`.
  • Dodano Mutation.createClientAddress — Dodanie adresu klienta (siedziba, dostawa, magazyn, faktura…) po kodzie typu adresu. Zakres `clients:write`.
  • Dodano Mutation.updateClientAddress — Zmiana adresu klienta (`UpdateClientAddressInput`): pole pominięte zostaje bez zmian, `null` czyści pole opcjonalne. Kod pocztowy jest sprawdzany z krajem adresu po zmianie. Zakres `clients:write`.
  • Dodano Mutation.createClientNote — Notatka CRM o kliencie (rozmowa, spotkanie, e-mail) z integracją jako autorem — zawsze widoczna dla zespołu drukarni. Zakres `clients:write`.
  • Dodano Mutation.updateClientNote — Zmiana notatki napisanej przez Twoją integrację. Zakres `clients:write`.
  • Dodano Mutation.assignClientTag — Nadanie klientowi tagu z listy `clientTags`; ponowne nadanie niczego nie zmienia. Zakres `clients:write`.
  • Dodano Mutation.removeClientTag — Zdjęcie tagu z klienta (tag zostaje na liście drukarni); zdjęcie tagu, którego klient nie ma, niczego nie zmienia. Zakres `clients:write`.
  • Dodano Query.papers — Papier w magazynie ze stanem w arkuszach, rodzajem (`PaperType`) i jednostką zakupu (`PaperUnit`), ze stronami (do 100 na stronę), filtrami i sortowaniem. Filtr `updatedFrom` z sortowaniem `UPDATED_AT` pobiera tylko papier, którego karta albo stan zmieniły się od poprzedniej synchronizacji (`Paper.updatedAt` przesuwa każde przyjęcie, wydanie, dostawa z zamówienia zakupu, korekta stanu na karcie i korekta z inwentaryzacji). Zakres `warehouse:read`; ceny zakupu z `prices:read`.
  • Dodano Query.paper — Jeden papier po identyfikatorze. Zakres `warehouse:read`.
  • Dodano Query.paints — Farby w magazynie ze stanem w gramach (do 0,001 g), ze stronami, filtrami, sortowaniem i synchronizacją przyrostową (`updatedFrom`, `UPDATED_AT`). Zakres `warehouse:read`; cena za kilogram z `prices:read`.
  • Dodano Query.paint — Jedna farba po identyfikatorze. Zakres `warehouse:read`.
  • Dodano Query.foils — Folie w magazynie ze stanem w rolkach (do 0,01 rolki) i metrami na rolce, ze stronami, filtrami, sortowaniem i synchronizacją przyrostową (`updatedFrom`, `UPDATED_AT`). Zakres `warehouse:read`; cena za m² z `prices:read`.
  • Dodano Query.foil — Jedna folia po identyfikatorze. Zakres `warehouse:read`.
  • Dodano Query.dieCuts — Wykrojniki (narzędzia liczone użyciami, bez stanu) ze stronami, filtrami i sortowaniem; zarchiwizowane na żądanie (`isArchived`) albo przy synchronizacji (`updatedFrom`), żeby było widać archiwizację. Zakres `warehouse:read`.
  • Dodano Query.dieCut — Jeden wykrojnik po identyfikatorze, także zarchiwizowany. Zakres `warehouse:read`.
  • Dodano Query.matrices — Matryce (narzędzia liczone użyciami, bez stanu) ze stronami, filtrami i sortowaniem; zarchiwizowane na żądanie (`isArchived`) albo przy synchronizacji (`updatedFrom`). Zakres `warehouse:read`.
  • Dodano Query.matrix — Jedna matryca po identyfikatorze, także zarchiwizowana. Zakres `warehouse:read`.
  • Dodano Query.stockMovements — Ruchy magazynowe papieru, farb i folii — przyjęcia (także dostawy z zamówień zakupu), wydania, korekty stanu na karcie materiału i korekty z inwentaryzacji — ze stanem przed i po ruchu (odczytanym pod blokadą materiału, więc ruchy jednego materiału łączą się w łańcuch) oraz zmianą ze znakiem (dodatnia: przyjęcie, ujemna: wydanie). Ilości i czas ruchu się nie zmieniają: synchronizuj ruchy filtrem `occurredFrom` z sortowaniem `OCCURRED_AT`; powiązania ruchu z zamówieniem albo zamówieniem zakupu znikają, gdy ktoś je usunie w Prynt. Stan początkowy karty i zmiany sprzed 0.28.0 nie mają ruchów — uzgadniaj z migawką stanów. Zakres `warehouse:read`.
  • Dodano Mutation.withdrawPaper — Wydanie papieru z magazynu: podajesz, ile arkuszy wydajesz (`quantity`, zawsze), a stan maleje o tyle — nigdy poniżej zera (`STOCK_INSUFFICIENT`); bez rodzaju wydanie to PRODUCTION. Wydanie na zamówienie realizuje rezerwacje papieru tego zamówienia; zamówienie zarchiwizowane jest odrzucane. FSC zmniejsza też stan FSC i tylko na papierze z certyfikatem FSC. Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.receivePaper — Przyjęcie papieru na magazyn poza zamówieniem zakupu (arkusze, liczba całkowita); arkusze FSC tylko na papier z certyfikatem FSC. Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.withdrawPaint — Wydanie farby: gramy wydane (`quantity`, zawsze), nigdy ponad stan (`STOCK_INSUFFICIENT`); zamówienie zarchiwizowane jest odrzucane. Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.receivePaint — Przyjęcie farby na magazyn poza zamówieniem zakupu, w gramach. Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.withdrawFoil — Wydanie folii: arkusze i ich długość, przeliczane na rolki przez metry na rolce. Wydanie ponad stan, folii bez metrów na rolce albo tak małe, że nie zmienia stanu (poniżej 0,01 rolki), jest odrzucane (`STOCK_INSUFFICIENT`, `STOCK_UNIT_NOT_CONVERTIBLE`), tak jak wydanie na zamówienie zarchiwizowane. Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.receiveFoil — Przyjęcie folii na magazyn poza zamówieniem zakupu, w rolkach (co najmniej 0,01 rolki). Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Query.suppliers — Dostawcy materiałów z osobami kontaktowymi i cennikiem (`materials(first:)`, do 100 pozycji), ze stronami, filtrami, sortowaniem i synchronizacją przyrostową (`updatedFrom`, `UPDATED_AT`; `Supplier.updatedAt` przesuwa też zmiana cennika). Zakres `warehouse:read` (z danymi osobowymi); ceny cennika z `prices:read`.
  • Dodano Query.supplier — Jeden dostawca po identyfikatorze. Zakres `warehouse:read`.
  • Dodano Mutation.createSupplier — Dodanie dostawcy z jego danymi; aktywność dostawcy i uwagi zespołu ustawia drukarnia w Prynt. Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.updateSupplier — Zmiana danych dostawcy: pole pominięte zostaje, `null` czyści pole opcjonalne; aktywności i uwag zespołu klucz nie zmienia. Ponowienie z tymi samymi danymi niczego nie zmienia, także `Supplier.updatedAt`. Zakres `warehouse:write`.
  • Dodano Query.purchaseOrders — Zamówienia zakupu z pozycjami, ze stronami, filtrami, sortowaniem i synchronizacją przyrostową (`updatedFrom`, `UPDATED_AT`), a `externalRef` odnajduje zamówienie po Twoim identyfikatorze. Zakres `warehouse:read`; ceny i wartość netto z `prices:read`.
  • Dodano Query.purchaseOrder — Jedno zamówienie zakupu po identyfikatorze. Zakres `warehouse:read`.
  • Dodano Mutation.createPurchaseOrder — Dodanie zamówienia zakupu (status DRAFT) u aktywnego dostawcy, z pozycjami i Twoim identyfikatorem `externalRef`, unikalnym w obrębie integracji. Pozycja z materiałem musi wskazywać istniejący papier, farbę albo folię i jednostkę, w której da się liczyć ich stan (np. kg farby to gramy × 1000). Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Mutation.updatePurchaseOrder — Zmiana zamówienia zakupu, które nie jest przyjęte ani anulowane: pole pominięte zostaje, `items` zastępuje całą listę pozycji (przyjęte ilości zostają; pozycji z przyjęciem nie zmienisz materiału ani jednostki). `PurchaseOrder.updatedAt` przesuwa się tylko przy prawdziwej zmianie. Zmiana nagłówka i pozycji z `id` jest bezpieczna do powtórzenia, ale pozycja bez `id` dochodzi przy każdym wywołaniu — ponawiaj z nagłówkiem `Idempotency-Key`. Zakres `warehouse:write`.
  • Dodano Mutation.updatePurchaseOrderStatus — Zmiana statusu zamówienia zakupu: DRAFT → SENT, SENT ↔ CONFIRMED, anulowanie przed pełnym przyjęciem (także częściowo przyjętego). Ten sam status ponownie niczego nie zmienia. Zakres `warehouse:write`.
  • Dodano Mutation.receivePurchaseOrder — Przyjęcie dostawy do zamówienia zakupu: rośnie przyjęta ilość pozycji (nie ponad zamówioną — `PURCHASE_ORDER_OVER_RECEIVED`) i stan materiału, przeliczony na jednostkę stanu, a dostawa pojawia się w `stockMovements` jako przyjęcie powiązane z zamówieniem; status przechodzi na PARTIALLY_RECEIVED albo RECEIVED. Zamówienie w innym statusie niż SENT, CONFIRMED i PARTIALLY_RECEIVED odrzuca dostawę (`PURCHASE_ORDER_NOT_RECEIVABLE`). Zakres `warehouse:write`; ponawiaj z nagłówkiem `Idempotency-Key`.
  • Dodano Query.stockTakes — Inwentaryzacje (nagłówki), ze stronami, filtrami, sortowaniem i synchronizacją przyrostową; korekty zatwierdzonej inwentaryzacji są w `stockMovements` (`stockTakeId`). Zakres `warehouse:read`.
  • Dodano Query.stockTake — Jedna inwentaryzacja po identyfikatorze; `null`, gdy jej nie ma. Zakres `warehouse:read`.
  • Dodano Mutation.initiateFileUpload — Początek wgrywania pliku do niezarchiwizowanego zamówienia albo jego produktu: podpisany adres, na który wysyłasz treść pliku jednym żądaniem. Zakres `files:write`; zamówienie musi być widoczne dla klucza (`orders:read` albo `orders:write`).
  • Dodano Mutation.completeFileUpload — Zakończenie wgrywania: Prynt sprawdza rozmiar zapisanego pliku i dołącza go do zamówienia albo produktu. Plik produktu, który nie jest jeszcze w produkcji, przestawia go na `FILES_TO_CHECK` (nowy plik do zaakceptowanych cofa akceptację). Zakres `files:write`.
  • Dodano Query.tasks — Zadania produkcyjne operacji zamówień — co hala robi teraz i co zrobiła: status (zaplanowane, w toku, wstrzymane, zakończone, anulowane), termin, początek i koniec pracy oraz maszyna — bez danych pracowników. Filtry po operacji, maszynie i statusie, synchronizacja przyrostowa (`updatedFrom`, `UPDATED_AT`). Zakres `production:read`; to, co wskazuje zamówienie — nazwa zadania (`Task.title`, z numerem zamówienia), operacja (`Task.operation`) i filtr `orderId` — z `orders:read`.
  • Dodano Query.task — Jedno zadanie produkcyjne po identyfikatorze; `null`, gdy go nie ma. Zakres `production:read`.
  • Dodano Operation.productionStatus — Stan produkcji operacji: NOT_STARTED, IN_PROGRESS (zadanie trwa), PAUSED (zadanie wstrzymane albo część ilości zrobiona) albo COMPLETED. Razem z `Operation.tasks` i podsumowaniami `Order.production`, `Product.production` i `Element.production` (stan — IN_PROGRESS także między operacjami, gdy część jest zakończona, a reszta czeka; liczba operacji i zakończonych; procent pracy ważony planowanym czasem maszyn, 100 tylko po zakończeniu) — każda zmiana statusu zadania przesuwa `Order.updatedAt`, więc stan produkcji synchronizujesz listą zamówień z `updatedFrom`. Wymaga `production:read` obok `orders:read`.
  • Dodano Query.productInvoices — Faktury sprzedaży produktów zamówień (z identyfikatorem produktu i zamówienia) ze stronami, filtrami (zamówienie, produkt, podmiot rozliczeniowy, typ, numer, data wystawienia `issuedFrom`/`issuedTo`) i synchronizacją przyrostową (`updatedFrom`, `UPDATED_AT`; `ProductInvoice.updatedAt` przesuwa też dołączenie i usunięcie dokumentu). Zakres `invoices:read`; kwoty i kursy z `prices:read`, dokument (PDF) z `files:read`.
  • Dodano Query.productInvoice — Jedna faktura sprzedaży produktu po identyfikatorze; `null`, gdy jej nie ma. Zakres `invoices:read`.
  • Dodano Query.purchaseInvoices — Faktury zakupu od dostawców ze stronami, filtrami (dostawca, numer, data faktury `issuedFrom`/`issuedTo`) i synchronizacją przyrostową (`updatedFrom`, `UPDATED_AT`; `PurchaseInvoice.updatedAt` przesuwa też dołączenie i usunięcie dokumentu). Zakres `invoices:read`; kwoty z `prices:read`, dokument z `files:read`, dane dostawcy (`supplier`) z `warehouse:read`.
  • Dodano Query.purchaseInvoice — Jedna faktura zakupu po identyfikatorze; `null`, gdy jej nie ma. Zakres `invoices:read`.
  • Dodano Query.machines — Maszyny drukarni (nazwa, model, producent, czy w użyciu) — to, na co wskazują `Operation.machineId` i `Task.machineId`, także maszyny wycofane. Zakres `reference:read`.
  • Dodano Query.machine — Jedna maszyna po identyfikatorze. Zakres `reference:read`.
  • Dodano Query.vatRates — Stawki VAT drukarni (ułamek, np. 0.23); kopia do interpretacji starszych danych czyta też stawki już niestosowane (`includeInactive: true`). Zakres `reference:read`.
  • Dodano Query.currencies — Waluty sprzedaży drukarni (kod ISO, symbol, waluta domowa) — to, na co wskazują `Order.currencyId`, `Client.defaultCurrencyId` i `ProductInvoice.currencyId`; kopia do rozwiązywania identyfikatorów czyta też waluty wycofane (`includeInactive: true`). Kurs zapasowy waluty z `prices:read`. Zakres `reference:read`.
  • Dodano Query.billingEntities — Podmioty rozliczeniowe drukarni — jej firmy wystawiające faktury (nazwa, NIP, REGON, KRS, adres, numer konta, certyfikat FSC; przy jednoosobowej działalności to dane właściciela) — na które wskazują `Order.billingEntityId`, `Client.defaultInvoiceBillingEntityId` i `ProductInvoice.billingEntityId`. Zakres `reference:read`.
  • Dodano Query.billingEntity — Jeden podmiot rozliczeniowy po identyfikatorze. Zakres `reference:read`.
  • Dodano Query.referenceData — Słowniki drukarni, jeden na wywołanie: kategorie produktów, typy elementów, typy operacji, uszlachetnienia i profile kolorystyczne — na nie wskazują `Product.categoryId`, `Element.elementTypeId`, pola `…TypeId` i `colorProfileId` operacji; kopia do rozwiązywania identyfikatorów czyta też pozycje wycofane (`includeInactive: true`). Zakres `reference:read`.