Skip to Content
Productos

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

CampoSignificado
invoiceBundle.versionSiempre 1
invoiceBundle.stepsLista 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

CampoSignificado
productIdUn producto existente en tu organización. Obligatorio
quantityNúmero mayor que 0, por defecto 1. La cantidad de la línea sin fórmula, o cuando la fórmula devuelve true
quantityScaleOpcional. "anchor_line_quantity" multiplica cada cantidad calculada por la cantidad de la línea principal
descriptionOpcional. Texto de la línea de factura en lugar del nombre del producto; una fórmula puede dar un description propio por línea
styleOpcional. DEFAULT o INFO
billOncePerInvoiceOpcional. true mantiene el paso, cuando hay varias líneas principales en una factura, en la primera línea principal
extendAccessMethodOpcional. { "daysAfterPeriodEnd": <número entero, 0 a 3660> }, consulta Prolongación de NFC
formulaOpcional. 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.

Véase también

¿Te ha resultado útil esta página?

En esta página