Skip to Content
Produkte

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

FeldBedeutung
invoiceBundle.versionFest 1
invoiceBundle.stepsListe mit Schritten, höchstens 40. Die Reihenfolge ist die Reihenfolge der Unterpositionen auf der Rechnung

Jeder Schritt ist ein Produktschritt oder ein Infozeilenschritt.

Produktschritt

FeldBedeutung
productIdEin bestehendes Produkt in Ihrer Organisation. Pflichtfeld
quantityZahl größer als 0, Standard 1. Die Menge der Position ohne Formel oder wenn die Formel true zurückgibt
quantityScaleOptional. "anchor_line_quantity" multipliziert jede berechnete Menge mit der Menge der Hauptposition
descriptionOptional. Text für die Rechnungsposition anstelle des Produktnamens; eine Formel kann pro Position eine eigene description mitgeben
styleOptional. DEFAULT oder INFO
billOncePerInvoiceOptional. true ordnet den Schritt bei mehreren Hauptpositionen auf einer Rechnung nur der ersten Hauptposition zu
extendAccessMethodOptional. { "daysAfterPeriodEnd": <ganze Zahl, 0 bis 3660> }, siehe NFC-Verlängerung
formulaOptional. 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.

Siehe auch

War diese Seite hilfreich?

Auf dieser Seite