Skip to Content
Produits

JSON de bundle

La structure JSON d'un bundle (version 1), pour les imports et pour celles et ceux qui construisent un bundle en dehors de l'écran.

Dernière mise à jour le

La carte Lignes de facture supplémentaires enregistre un bundle sous forme de JSON sur le produit, sous la clé invoiceBundle. Pour les imports, vous utilisez la même structure. Pour un usage normal, vous n'avez pas besoin de cette page : les champs et leur explication se trouvent sous Étapes du bundle.

Structure

ChampSignification
invoiceBundle.versionToujours 1
invoiceBundle.stepsListe d'étapes, 40 au maximum. L'ordre est celui des lignes enfants sur la facture

Chaque étape est une étape de produit ou une étape d'information.

Étape de produit

ChampSignification
productIdUn produit existant de votre organisation. Obligatoire
quantityNombre supérieur à 0, 1 par défaut. La quantité de la ligne sans formule, ou lorsque la formule renvoie true
quantityScaleFacultatif. "anchor_line_quantity" multiplie chaque quantité calculée par la quantité de la ligne principale
descriptionFacultatif. Texte de la ligne de facture à la place du nom du produit ; une formule peut fournir un description propre à chaque ligne
styleFacultatif. DEFAULT ou INFO
billOncePerInvoiceFacultatif. true rattache l'étape à la première ligne principale lorsqu'une facture en compte plusieurs
extendAccessMethodFacultatif. { "daysAfterPeriodEnd": <nombre entier, 0 à 3660> }, voir Prolongation NFC
formulaFacultatif. TypeScript qui détermine les lignes que l'étape produit, voir Formule

Étape d'information

{
  "stepKind": "info",
  "description": "Inclusief toeristen-, gemeente- en provincietaksen"
}

description est obligatoire et une étape d'information n'a pas de productId. Avec style (DEFAULT ou INFO), vous choisissez le style de ligne, INFO par défaut. Une formula qui renvoie false supprime la ligne d'information.

Formule

formula est du TypeScript qui, lors de l'enregistrement d'une facture, renvoie true (une ligne avec quantity), false (aucune ligne), un nombre (la quantité) ou une liste de lignes { "quantity", "description", "unitPrice", "accessMethodValue" }. Les champs et listes que vous pouvez lire et ce que fait chaque forme sont décrits sous Formule par étape. Une formule qui ne compile pas est refusée lors de l'enregistrement du produit. En JSON, la formule est une seule chaîne avec \n pour les sauts de ligne.

"formula": "return {customer.customFields.exemptFromSurcharges} !== true;"

Prolongation NFC

N'a de sens que si le produit principal a Prolonger l'occupation comme action.

"extendAccessMethod": { "daysAfterPeriodEnd": 20 }

Lorsqu'une ligne d'une telle étape est payée, Tillor fixe la validité des méthodes d'accès du client à la date de fin de la ligne principale plus daysAfterPeriodEnd jours calendaires. Par défaut, cette validité court jusqu'à 23:59 dans le fuseau horaire de l'organisation, ou jusqu'au jour de la semaine et à l'heure de Prolonger le mode d'accès sur le produit principal. Vous y réglez aussi les types et les statuts pris en compte. Sans date de fin sur la ligne principale, il ne se passe rien. Avec Ne pas raccourcir lors de la prolongation activé, Tillor ignore les méthodes dont la validité est déjà égale ou postérieure à la nouvelle date. Un accessMethodValue sur la ligne désigne la méthode de cette ligne ; la prolongation elle-même suit les réglages du produit principal.

Après une prolongation réussie, la chronologie de la facture affiche une ligne qui renvoie au paiement.

Exemple : explication, supplément NFC, location de compteur et chiens

{
  "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})` }];"
      }
    ]
  }
}

Attention

Vérifiez que toutes les valeurs productId des étapes de produit existent dans votre catalogue. Tillor ignore les étapes dont le produit est inconnu.

Voir aussi

Cette page t'a-t-elle été utile ?

Sur cette page