DocumentPosition
DocumentPosition (segment/pozycja dokumentu) to typ opisujący jedną pozycję lub segment w ramach Document (tablica position[]). Ma pokrywać wszystkie przestrzenie: CRM, FK, WHS, HR, EOD – przy wspólnej warstwie abstrakcji (code, positionNo, opcjonalne wartości wspólne) oraz attribute i profilach dla właściwości specyficznych dla domeny. Wzorowany na FHIR Observation.component (code + value[x] + rozszerzenia).
DocumentPosition nie jest osobnym zasobem (DomainResource) – jest typem zagnieżdżonym w Document.
1. Cel: jedna struktura dla wielu przestrzeni
Wspólny zestaw pól pozwala bez mnożenia typów obsłużyć m.in.:
- CRM – wiersz zamówienia (produkt, ilość, cena), segment oferty, kontakt.
- FK – wiersz faktury (kwota, VAT, konto, wariant), dekret (konto Wn/Ma, kwota), linia podsumowania VAT (stawka, netto, VAT).
- WHS – wiersz PZ/WZ (towar, ilość, magazyn, lokalizacja), przesunięcie.
- HR – segment dokumentu kadrowego (szkolenie, umowa, uprawnienie itd.).
- EOD – segment obiegu (powiązanie z dokumentem źródłowym, krok workflow).
Różnice między domenami są wyrażane przez code (rodzaj segmentu) oraz użycie pól value i attribute w profilu.
2. Zawartość (struktura)
| Nazwa | Kard. | Typ | Opis |
|---|---|---|---|
| code | 1..1 | CodeableConcept | Rodzaj segmentu/pozycji (invoice-line, order-line, decree-line, vat-summary-line, goods-receipt-line, hr-segment itd. – system https://api-erp.kamsoft.pl/ns/document-position-type) |
| positionNo | 1..1 | integer | Numer pozycji w dokumencie; unikalny w ramach dokumentu, numerowany od 1. Służy do referencji z zewnątrz (np. w danych księgowych). |
| valueQuantity | 0..1 | Quantity | Jedna wartość niepieniężna (ilość szt., waga, czas – UCUM); dla kwot pieniężnych używać valueMoney |
| valueMoney | 0..1 | Money | Jedna kwota pieniężna (value + currency); cena, kwota netto, suma itd. |
| valueItem | 0..* | ValueItem (jak Attribute: type + jedna z value*) | Wiele wartości z typem: type (CodeableConcept, np. quantity, unit-price, net-amount, vat-amount) plus dokładnie jedno z: valueQuantity, valueMoney, valueString, valueInteger, valueBoolean, valueCodeableConcept, valueReference – spójne z AttributeValueItem w Attribute |
| valueAllocation | 0..* | AllocationItem | Reguły alokacji kosztów: dla pozycji typu allocation-item – type (allocation-type: KR, KO, SB…) plus dokładnie jedno z: weights (składniki z kodem i wagą) lub costCarriers (nośniki kosztów). Kwoty do rozdzielenia w valueItem (allocation-item-type). Zob. Document-Examples §2b oraz plik Document-Accounting-Example.json. |
| valueCodeableConcept | 0..* | CodeableConcept | Wartość kodowana: konto, stawka VAT, wariant dekretacji, status, typ (FK, CRM, WHS, HR) |
| valueReference | 0..* | Reference | Odniesienia: definicja produktu (ProductDefinition), instancja produktu (Product), konto księgowe, rachunek bankowy (BankAccount), kontrahent (Party), magazyn, dokument, zasób (wspólne dla CRM, FK, WHS, HR) |
| valueString | 0..1 | string | Tekst: opis, uwagi |
| status | 0..1 | CodeableConcept | Status pozycji/wiersza (np. otwarta, zrealizowana, anulowana) |
| attachment | 0..* | Attachment | Załączniki do pozycji (skan, plik) |
| attribute | 0..* | Attribute | Właściwości specyficzne dla profilu (np. drugi numer konta, data dostawy, lokalizacja) |
Uwaga: Ilości (szt., kg) – valueQuantity; kwoty pieniężne (cena, netto, VAT) – valueMoney. Dla wielu wartości z typem (ilość + cena jedn. + netto + VAT) – valueItem (każdy element: type CodeableConcept + valueQuantity | valueMoney | valueString itd. – jak AttributeValueItem w Attribute). Gdy pozycja wymaga wielu wartości innego typu (np. dwa konta w dekrecie), używa się valueCodeableConcept lub valueReference z konwencją/type, albo attribute. Szczegóły dla danego code i przestrzeni definiuje profil.
Referencja do produktu: Pozycja dokumentu odnosi się do pozycji katalogu lub do konkretnej instancji przez valueReference:
- ProductDefinition – gdy wystarczy pozycja katalogu (np. zamówienie, faktura bez partii/serii): reference (np.
ProductDefinition/123) lub identifier; opcjonalnie type =ProductDefinition, display = nazwa. - Product – gdy wymagana jest konkretna instancja (partia, numer seryjny, data ważności, np. PZ/WZ z partią, reklamacja z serią): reference (np.
Product/456) lub identifier; opcjonalnie type =Product, display = nazwa lub identyfikator partii/serii.
W jednej pozycji (position) może być kilka valueReference (produkt/definicja, kontrahent, magazyn itd.); konwencja lub profil ustala, który element odnosi się do produktu (np. pierwsza referencja przy order-line, invoice-line, goods-receipt-line, lub referencja z type=ProductDefinition / type=Product).
3. Mapowanie: przestrzeń → code → pola
Poniższa tabela pokazuje, jak ten sam DocumentPosition jest używany w różnych przestrzeniach i dla różnych code. Dla każdego wiersza: które pola value*/attribute są typowo używane.
| Przestrzeń | code (przykład) | valueQuantity | valueItem | valueCodeableConcept | valueReference | valueString | attribute / profil |
|---|---|---|---|---|---|---|---|
| CRM | order-line | ilość lub cena (jedna) | ilość + cena (gdy obie) | status linii | produkt, kontrahent | opis | data dostawy, jednostka |
| CRM | offer-line | ilość lub cena (jedna) | ilość + cena (gdy obie) | typ pozycji | produkt | opis | ważność oferty |
| FK | invoice-line | – | ilość, cena jedn., netto, VAT | stawka VAT, wariant | produkt, kontrahent | opis | odliczenie VAT |
| FK | decree-line | kwota | – | konto Wn, konto Ma | – | opis | – |
| FK | vat-summary-line | – | netto, VAT (po stawce) | stawka VAT, odliczenie | – | – | – |
| WHS | goods-receipt-line | ilość | – | jednostka, typ | produkt, magazyn, lokalizacja | uwagi | data ważności, partia |
| WHS | issue-line | ilość | – | jednostka | produkt, magazyn | uwagi | zlecenie, koszt |
| WHS | transfer-line | ilość | – | – | produkt, magazyn z/do, lokalizacja | – | – |
| HR | hr-segment | – | – | typ segmentu, status | pracownik, szkolenie, umowa | treść | daty, uprawnienia (profil) |
| EOD | workflow-segment | – | – | status kroku | dokument źródłowy | komentarz | data, użytkownik (profil) |
Dzięki temu jeden typ DocumentPosition z opcjonalnymi valueQuantity, valueItem, pozostałymi value i attribute pokrywa CRM, FK, WHS, HR i EOD; profile ustalają, które pola są wymagane i jakie code są dozwolone.
4. Zgodność z systemami wzorcowymi
| System | Odpowiednik pozycji/segmentu | Uwagi |
|---|---|---|
| UBL 2.3 | InvoiceLine, OrderLine, DespatchLine… | ID, Quantity, LineExtensionAmount, Item (Reference), Price; mapowanie na code + valueQuantity + valueReference |
| OAGIS | Line w BOD (np. PurchaseOrderLine) | Quantity, Amount, ItemID, Party; odpowiednik code + value* |
| SAP | Pozycja dokumentu (FI line, MM/SD item) | Kwota, konto, materiał, magazyn; odpowiednik valueQuantity, valueCodeableConcept, valueReference |
| FHIR | Observation.component | code + value[x] (jedna wartość na component); u nas valueQuantity (jedna) lub valueItem (wiele typowanych) + valueCodeableConcept, valueReference, valueString + attribute |
5. Odniesienia
- Document (position[])
- Quantity, Money, CodeableConcept, Reference, Attachment, Attribute
- FHIR R5 – Observation.component