JSON del paquete
La estructura JSON de un paquete (versión 1), para importaciones y para quien construye un paquete fuera de la pantalla.
Última actualización el
La tarjeta Líneas de factura adicionales guarda un paquete como JSON en el producto, bajo la clave invoiceBundle. Para las importaciones se usa la misma estructura. Para el uso normal no necesitas esta página: los campos y su explicación están en Pasos del paquete.
Estructura
| Campo | Significado |
|---|---|
invoiceBundle.version | Siempre 1 |
invoiceBundle.steps | Lista de pasos, máximo 40. El orden es el orden de las líneas hijas en la factura |
Cada paso es un paso de producto o un paso de información.
Paso de producto
| Campo | Significado |
|---|---|
productId | Un producto existente en tu organización. Obligatorio |
quantity | Número mayor que 0, por defecto 1. La cantidad de la línea sin fórmula, o cuando la fórmula devuelve true |
quantityScale | Opcional. "anchor_line_quantity" multiplica cada cantidad calculada por la cantidad de la línea principal |
description | Opcional. Texto de la línea de factura en lugar del nombre del producto; una fórmula puede dar un description propio por línea |
style | Opcional. DEFAULT o INFO |
billOncePerInvoice | Opcional. true mantiene el paso, cuando hay varias líneas principales en una factura, en la primera línea principal |
extendAccessMethod | Opcional. { "daysAfterPeriodEnd": <número entero, 0 a 3660> }, consulta Prolongación de NFC |
formula | Opcional. TypeScript que determina qué líneas genera el paso, consulta Fórmula |
Paso de información
{
"stepKind": "info",
"description": "Inclusief toeristen-, gemeente- en provincietaksen"
}description es obligatorio y un paso de información no tiene productId. Con style (DEFAULT o INFO) eliges el estilo de la línea; por defecto es INFO. Una formula que devuelve false omite la línea de información.
Fórmula
formula es TypeScript que, al guardar una factura, devuelve true (una línea con quantity), false (ninguna línea), un número (la cantidad) o una lista de líneas { "quantity", "description", "unitPrice", "accessMethodValue" }. Qué campos y listas puedes leer y qué hace cada forma está en Fórmula por paso. Una fórmula que no compila se rechaza al guardar el producto. En JSON, la fórmula aparece como una sola cadena con \n para los saltos de línea.
"formula": "return {customer.customFields.exemptFromSurcharges} !== true;"Prolongación de NFC
Solo tiene sentido si el producto principal tiene Prolongar periodo de ocupación como acción.
"extendAccessMethod": { "daysAfterPeriodEnd": 20 }Cuando se paga una línea de un paso así, Tillor fija la validez de los métodos de acceso del cliente en la fecha de fin de la línea principal más daysAfterPeriodEnd días naturales. Por defecto llega hasta las 23:59 en la zona horaria de la organización, o hasta el día de la semana y la hora de Prolongar método de acceso en el producto principal. Qué tipos y estados cuentan también se configura allí. Sin fecha de fin en la línea principal no ocurre nada. Con No acortar al prolongar activado, Tillor omite los métodos cuya validez ya está en la nueva fecha o después. Un accessMethodValue en la línea nombra el método de esa línea; la prolongación en sí sigue los ajustes del producto principal.
Tras una prolongación correcta, la cronología de la factura muestra una línea que remite al pago.
Ejemplo: explicación, recargo NFC, alquiler de contador y perros
{
"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})` }];"
}
]
}
}Atención
Comprueba que todos los valores productId de los pasos de producto existen en tu catálogo. Tillor omite los pasos con un producto desconocido.