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
| Champ | Signification |
|---|---|
invoiceBundle.version | Toujours 1 |
invoiceBundle.steps | Liste 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
| Champ | Signification |
|---|---|
productId | Un produit existant de votre organisation. Obligatoire |
quantity | Nombre supérieur à 0, 1 par défaut. La quantité de la ligne sans formule, ou lorsque la formule renvoie true |
quantityScale | Facultatif. "anchor_line_quantity" multiplie chaque quantité calculée par la quantité de la ligne principale |
description | Facultatif. Texte de la ligne de facture à la place du nom du produit ; une formule peut fournir un description propre à chaque ligne |
style | Facultatif. DEFAULT ou INFO |
billOncePerInvoice | Facultatif. true rattache l'étape à la première ligne principale lorsqu'une facture en compte plusieurs |
extendAccessMethod | Facultatif. { "daysAfterPeriodEnd": <nombre entier, 0 à 3660> }, voir Prolongation NFC |
formula | Facultatif. 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.