JSON pakietu
Struktura JSON pakietu (wersja 1), dla importów i dla tych, którzy budują pakiet poza ekranem.
Ostatnio zaktualizowano
Karta Dodatkowe linie faktury zapisuje pakiet jako JSON w produkcie, pod kluczem invoiceBundle. Przy importach używasz tej samej struktury. Do zwykłego użytku ta strona nie jest potrzebna: pola i ich opis znajdziesz w Krokach pakietu.
Struktura
| Pole | Znaczenie |
|---|---|
invoiceBundle.version | Zawsze 1 |
invoiceBundle.steps | Lista kroków, maksymalnie 40. Kolejność kroków to kolejność linii podrzędnych na fakturze |
Każdy krok jest krokiem produktu albo krokiem informacyjnym.
Krok produktu
| Pole | Znaczenie |
|---|---|
productId | Istniejący produkt w Twojej organizacji. Wymagane |
quantity | Liczba większa od 0, domyślnie 1. Ilość linii bez formuły albo gdy formuła zwraca true |
quantityScale | Opcjonalne. "anchor_line_quantity" mnoży każdą obliczoną ilość przez ilość linii głównej |
description | Opcjonalne. Tekst linii faktury zamiast nazwy produktu; formuła może dla każdej linii podać własny description |
style | Opcjonalne. DEFAULT lub INFO |
billOncePerInvoice | Opcjonalne. true przy kilku liniach głównych na fakturze przypisuje krok tylko do pierwszej linii głównej |
extendAccessMethod | Opcjonalne. { "daysAfterPeriodEnd": <liczba całkowita, 0 do 3660> }, zobacz Przedłużenie NFC |
formula | Opcjonalne. TypeScript, który określa, jakie linie daje krok, zobacz Formuła |
Krok informacyjny
{
"stepKind": "info",
"description": "Inclusief toeristen-, gemeente- en provincietaksen"
}description jest wymagane, a krok informacyjny nie ma productId. Za pomocą style (DEFAULT lub INFO) wybierasz styl linii, domyślnie jest to INFO. Formuła, która zwraca false, pomija linię informacyjną.
Formuła
formula to TypeScript, który przy zapisie faktury zwraca true (jedna linia z quantity), false (brak linii), liczbę (ilość) albo listę linii { "quantity", "description", "unitPrice", "accessMethodValue" }. Jakie pola i listy możesz czytać i co robi każda postać, opisano w Formule dla kroku. Formuła, która się nie kompiluje, jest odrzucana przy zapisie produktu. W JSON formuła jest jednym ciągiem znaków, w którym \n oznacza koniec wiersza.
"formula": "return {customer.customFields.exemptFromSurcharges} !== true;"Przedłużenie NFC
Ma sens tylko wtedy, gdy produkt główny ma jako akcję Przedłuż okres zajęcia miejsca.
"extendAccessMethod": { "daysAfterPeriodEnd": 20 }Gdy linia takiego kroku zostanie opłacona, Tillor ustawia ważność metod dostępu klienta na datę końcową linii głównej plus daysAfterPeriodEnd dni kalendarzowych. Domyślnie ważność trwa do 23:59 w strefie czasowej organizacji albo do dnia tygodnia i godziny ustawionych w Przedłuż metodę dostępu w produkcie głównym. Tam ustawiasz też, jakie typy i statusy się liczą. Bez daty końcowej w linii głównej nic się nie dzieje. Gdy włączone jest Nie skracaj przy przedłużeniu, Tillor pomija metody, których ważność przypada już na nową datę lub później. accessMethodValue w linii wskazuje metodę tej linii; samo przedłużenie podąża za ustawieniami produktu głównego.
Po udanym przedłużeniu na osi czasu faktury pojawia się wpis odsyłający do płatności.
Przykład: objaśnienie, dopłata za NFC, wynajem licznika i psy
{
"invoiceBundle": {
"version": 1,
"steps": [
{
"stepKind": "info",
"description": "Inclusief toeristen-, gemeente- en provincietaksen"
},
{
"productId": "prd_nfc_toeslag",
"quantity": 1,
"quantityScale": "anchor_line_quantity",
"extendAccessMethod": { "daysAfterPeriodEnd": 20 },
"style": "INFO",
"billOncePerInvoice": true,
"formula": "const nfc = {accessMethods}.filter((a) => a.type === \"NFC\" && a.status === \"ACTIVE\");\nreturn nfc.slice(0, 1).map((a) => ({ quantity: 0, unitPrice: 0, accessMethodValue: a.value, description: `Toegangsmethode inclusief: ${a.label}` }));"
},
{
"productId": "prd_nfc_toeslag",
"quantity": 1,
"quantityScale": "anchor_line_quantity",
"extendAccessMethod": { "daysAfterPeriodEnd": 20 },
"billOncePerInvoice": true,
"formula": "const nfc = {accessMethods}.filter((a) => a.type === \"NFC\" && a.status === \"ACTIVE\");\nreturn nfc.slice(1).map((a) => ({ quantity: 1, accessMethodValue: a.value, description: `Toeslag extra toegangsmethode: ${a.label}` }));"
},
{
"productId": "prd_meterhuur",
"quantity": 1,
"quantityScale": "anchor_line_quantity",
"formula": "return {meters}.filter((m) => m.provider === \"ICY\" && m.type === \"ELECTRICITY\" && m.icyMetadata?.switchState === true).map((m) => ({ quantity: 1, description: `Huur digitale elektriciteitsmeter ${m.name}` }));"
},
{
"productId": "prd_hond",
"quantity": 1,
"quantityScale": "anchor_line_quantity",
"billOncePerInvoice": true,
"formula": "const dogs = Math.max(0, Math.floor(Number({customer.customFields.animals.dogs}) || 0));\nreturn dogs === 0 ? false : [{ quantity: dogs, description: `Honden (${dogs})` }];"
}
]
}
}Uwaga
Upewnij się, że wszystkie wartości productId w krokach produktu istnieją w Twoim katalogu. Kroki z nieznanym produktem Tillor pomija.