Bundle-JSON
Die JSON-Struktur eines Bundles (Version 1), für Importe und für alle, die ein Bundle außerhalb der Oberfläche aufbauen.
Zuletzt aktualisiert am
Die Karte Zusätzliche Rechnungspositionen speichert ein Bundle als JSON am Produkt, unter dem Schlüssel invoiceBundle. Für Importe verwenden Sie dieselbe Struktur. Für den normalen Gebrauch brauchen Sie diese Seite nicht: Die Felder und ihre Erklärung finden Sie unter Bundle-Schritte.
Struktur
| Feld | Bedeutung |
|---|---|
invoiceBundle.version | Fest 1 |
invoiceBundle.steps | Liste mit Schritten, höchstens 40. Die Reihenfolge ist die Reihenfolge der Unterpositionen auf der Rechnung |
Jeder Schritt ist ein Produktschritt oder ein Infozeilenschritt.
Produktschritt
| Feld | Bedeutung |
|---|---|
productId | Ein bestehendes Produkt in Ihrer Organisation. Pflichtfeld |
quantity | Zahl größer als 0, Standard 1. Die Menge der Position ohne Formel oder wenn die Formel true zurückgibt |
quantityScale | Optional. "anchor_line_quantity" multipliziert jede berechnete Menge mit der Menge der Hauptposition |
description | Optional. Text für die Rechnungsposition anstelle des Produktnamens; eine Formel kann pro Position eine eigene description mitgeben |
style | Optional. DEFAULT oder INFO |
billOncePerInvoice | Optional. true ordnet den Schritt bei mehreren Hauptpositionen auf einer Rechnung nur der ersten Hauptposition zu |
extendAccessMethod | Optional. { "daysAfterPeriodEnd": <ganze Zahl, 0 bis 3660> }, siehe NFC-Verlängerung |
formula | Optional. TypeScript, das bestimmt, welche Positionen der Schritt liefert, siehe Formel |
Infozeilenschritt
{
"stepKind": "info",
"description": "Inclusief toeristen-, gemeente- en provincietaksen"
}description ist Pflicht, und ein Infozeilenschritt hat keine productId. Mit style (DEFAULT oder INFO) wählen Sie den Zeilenstil, standardmäßig ist das INFO. Eine formula, die false zurückgibt, lässt die Infozeile weg.
Formel
formula ist TypeScript, das beim Speichern einer Rechnung true (eine Position mit quantity), false (keine Position), eine Zahl (die Menge) oder eine Liste von Positionen { "quantity", "description", "unitPrice", "accessMethodValue" } zurückgibt. Welche Felder und Listen Sie lesen können und was jede Form bewirkt, steht unter Formel pro Schritt. Eine Formel, die nicht kompiliert, wird beim Speichern des Produkts abgelehnt. In JSON steht die Formel als ein String mit \n für Zeilenumbrüche.
"formula": "return {customer.customFields.exemptFromSurcharges} !== true;"NFC-Verlängerung
Nur sinnvoll, wenn das Hauptprodukt Belegung verlängern als Aktion hat.
"extendAccessMethod": { "daysAfterPeriodEnd": 20 }Wird eine Position eines solchen Schritts bezahlt, setzt Tillor die Gültigkeit der Zugangsmethoden des Kunden auf das Enddatum der Hauptposition plus daysAfterPeriodEnd Kalendertage. Standardmäßig läuft sie bis 23:59 Uhr in der Zeitzone der Organisation, oder bis zum Wochentag und zur Uhrzeit von Zugangsmethode verlängern am Hauptprodukt. Welche Typen und Status berücksichtigt werden, stellen Sie dort ebenfalls ein. Ohne Enddatum an der Hauptposition passiert nichts. Ist Bei Verlängerung nicht verkürzen eingeschaltet, überspringt Tillor Methoden, deren Gültigkeit bereits am oder nach dem neuen Datum liegt. Ein accessMethodValue an der Position benennt die Methode dieser Position; die Verlängerung selbst folgt den Einstellungen des Hauptprodukts.
Nach einer erfolgreichen Verlängerung steht in der Zeitleiste der Rechnung eine Zeile, die auf die Zahlung verweist.
Beispiel: Hinweis, NFC-Zuschlag, Zählermiete und Hunde
{
"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})` }];"
}
]
}
}Achtung
Prüfen Sie, dass alle productId-Werte der Produktschritte in Ihrem Katalog existieren. Schritte mit einem unbekannten Produkt überspringt Tillor.