Passaggi del bundle
Tutti i campi di un passaggio prodotto e di un passaggio info, e la formula con cui un passaggio stabilisce le proprie righe di fattura.
Ultimo aggiornamento il
Questa pagina descrive i campi della scheda Righe fattura extra nella pagina del prodotto. Come costruire un bundle è spiegato in Impostare righe di fattura extra.
Passaggio prodotto
Tillor trasforma un passaggio prodotto in zero, una o più righe di fattura con quel prodotto. Senza formula è una riga con la quantità impostata; con una formula stabilisci tu se, quante e quali righe compaiono.
| Campo | Cosa fa |
|---|---|
| Prodotto | Il prodotto che finisce sulla riga figlia, per esempio un supplemento NFC o il noleggio di un contatore. Obbligatorio |
| Quantità | La quantità della riga se il passaggio non ha formula, o se la formula restituisce true. Maggiore di 0 |
| Moltiplica per quantità riga ancora | Moltiplica ogni quantità calcolata per la quantità della riga principale, per esempio 0,5 per mezzo anno di Posto fisso. Il risultato viene arrotondato a due decimali. Tillor omette le righe che così arrivano a 0; una riga che la formula stessa restituisce con quantità 0 resta |
| Descrizione (facoltativo) | Sostituisce il nome del prodotto sulla riga di fattura. Una formula che restituisce righe può dare a ogni riga una descrizione propria |
| Stile riga | Predefinito (prodotto), DEFAULT o INFO. Con INFO la riga figlia diventa una nota grigia nel PDF e nell'editor |
| Una volta per fattura | Rilevante solo se sulla stessa fattura ci sono due o più righe principali con un bundle. Il passaggio appartiene allora solo alla prima riga principale nell'ordine della fattura |
| Giorni extra dopo la fine della riga principale (metodi di accesso) | Ha senso solo se il prodotto principale ha Estendi periodo occupazione come azione. Quando viene pagata una riga di questo passaggio, Tillor estende i metodi di accesso del cliente fino alla data di fine della riga principale più questo numero di giorni; tipi e stati vengono da Estendi metodo di accesso sul prodotto principale, vedi Estendere l'NFC tramite il bundle |
| Formula | Facoltativa. TypeScript che stabilisce se il passaggio compare sulla fattura, con quale quantità o quali righe esattamente, vedi Formula per passaggio |
Passaggio info
Un passaggio info è solo testo, senza prodotto e importo. Tillor lo mostra come riga di nota.
| Campo | Cosa fa |
|---|---|
| Testo riga info | Il testo visibile, per esempio "Inclusief toeristen-, gemeente- en provincietaksen". Obbligatorio |
| Stile riga | Per impostazione predefinita INFO. Puoi scegliere DEFAULT se vuoi mostrare la riga come una riga normale |
| Formula | Facoltativa. Se la formula restituisce false, la riga info viene omessa |
Se un passaggio info sta sotto una riga principale, il PDF mette automaticamente ↳ davanti al testo.
Formula per passaggio
Ogni passaggio può avere una Formula: TypeScript, come la formula tariffaria, che Tillor esegue al salvataggio di una fattura con questo bundle. Così un passaggio può dipendere dal cliente, dall'occupazione, dalla piazzola, dai contatori o dai metodi di accesso, per esempio tramite un campo personalizzato in cui registri un'eccezione.
Cosa restituisce la formula
| Valore restituito | Effetto |
|---|---|
true | Una riga con la Quantità impostata |
false o null | Nessuna riga |
| Un numero maggiore di 0 | Una riga con quel numero come quantità |
| Un elenco di righe | Esattamente quelle righe, in quell'ordine. Un elenco vuoto significa nessuna riga |
Una riga in un elenco simile è un oggetto con questi campi:
| Campo | Significato |
|---|---|
quantity | Obbligatorio. La quantità, 0 o più. Una riga con 0 resta, anche con Moltiplica per quantità riga ancora |
description | Facoltativo. La descrizione di questa riga; altrimenti la Descrizione del passaggio, altrimenti il nome del prodotto |
unitPrice | Facoltativo. Prezzo unitario IVA inclusa, come la tariffa del prodotto; altrimenti la tariffa del prodotto. 0 crea una riga gratuita |
accessMethodValue | Facoltativo. Il valore del metodo di accesso a cui si riferisce questa riga (l'UID del tag NFC), per l'estensione al pagamento |
Cosa può leggere la formula
I campi si leggono con le parentesi graffe, come nelle automazioni. Il menu Variabile accanto al campo mostra tutto ciò che è disponibile, compresi i tuoi campi personalizzati.
| Variabile | Cos'è |
|---|---|
{customer.…} | Il cliente sulla fattura, per esempio {customer.createdAt} o {customer.customFields.meterhuurVrijgesteld} |
{occupation.…} | L'occupazione della riga principale. Se il prodotto principale non ha Estendi periodo occupazione, è l'unica occupazione del cliente; vuota (null) se il cliente occupa più piazzole |
{terrain.…} | La piazzola di quell'occupazione |
{anchor.…} | La riga principale: {anchor.quantity} (per esempio 0,5 per mezzo anno), {anchor.terrainId}, {anchor.occupationId} e {anchor.endDate} |
{meters} | L'elenco dei contatori nell'ambito: sulla piazzola della riga principale con Estendi periodo occupazione, altrimenti su tutte le piazzole occupate dal cliente. Ogni contatore ha name, provider (per esempio ICY), type (per esempio ELECTRICITY, GAS), i metadati del suo provider (per esempio icyMetadata.switchState per l'alimentazione attiva), la sua terrain e customFields |
{accessMethods} | L'elenco dei metodi di accesso del cliente, dal più vecchio, di ogni tipo e stato. Ogni metodo ha type (per esempio NFC), status (per esempio ACTIVE), value, un label leggibile (il nome noto del tag NFC, altrimenti il valore) e customFields |
Tillor carica gli elenchi {meters} e {accessMethods} solo se la formula li usa.
Esempi
Saltare un passaggio per i clienti esenti:
if ({customer.customFields.exemptFromSurcharges} === true) return false;
return true;Una riga per ogni contatore elettrico ICY con alimentazione attiva, e per i clienti dal 2026 anche con alimentazione spenta:
const newCustomer = new Date({customer.createdAt} ?? 0) >= new Date("2026-01-01T00:00:00+01:00");
return {meters}
.filter((m) => m.provider === "ICY" && m.type === "ELECTRICITY")
.filter((m) => m.icyMetadata?.switchState === true || newCustomer)
.map((m) => ({ quantity: 1, description: `Huur digitale elektriciteitsmeter ${m.name}` }));Il primo tag NFC gratis come nota, ogni successivo alla tariffa del prodotto (due passaggi con lo stesso prodotto, oppure un solo passaggio che restituisce entrambi i tipi di riga):
const nfc = {accessMethods}.filter((a) => a.type === "NFC" && a.status === "ACTIVE");
return nfc.map((a, i) => ({
quantity: i === 0 ? 0 : 1,
unitPrice: i === 0 ? 0 : undefined,
accessMethodValue: a.value,
description: i === 0 ? `Toegangsmethode inclusief: ${a.label}` : `Toeslag extra toegangsmethode: ${a.label}`,
}));Una riga con il numero di cani da un campo personalizzato del cliente, nessuna riga senza cani:
const dogs = Math.max(0, Math.floor(Number({customer.customFields.animals.dogs}) || 0));
return dogs === 0 ? false : [{ quantity: dogs, description: `Honden (${dogs})` }];Con Inserisci esempio sotto il campo ottieni un punto di partenza con queste forme in commento.
Errori
Una formula che non compila non si può salvare; il messaggio sotto il campo dice cosa non va. Se una formula si blocca al salvataggio di una fattura, o restituisce qualcosa di diverso da true, false, un numero o righe valide, il salvataggio fallisce con il nome del passaggio nel messaggio d'errore, così una formula rotta non aggiunge né omette mai una riga in silenzio.