Skip to Content
Produkty

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

PoleZnaczenie
invoiceBundle.versionZawsze 1
invoiceBundle.stepsLista 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

PoleZnaczenie
productIdIstniejący produkt w Twojej organizacji. Wymagane
quantityLiczba większa od 0, domyślnie 1. Ilość linii bez formuły albo gdy formuła zwraca true
quantityScaleOpcjonalne. "anchor_line_quantity" mnoży każdą obliczoną ilość przez ilość linii głównej
descriptionOpcjonalne. Tekst linii faktury zamiast nazwy produktu; formuła może dla każdej linii podać własny description
styleOpcjonalne. DEFAULT lub INFO
billOncePerInvoiceOpcjonalne. true przy kilku liniach głównych na fakturze przypisuje krok tylko do pierwszej linii głównej
extendAccessMethodOpcjonalne. { "daysAfterPeriodEnd": <liczba całkowita, 0 do 3660> }, zobacz Przedłużenie NFC
formulaOpcjonalne. 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.

Zobacz też

Czy ta strona była pomocna?

Na tej stronie