Pista di controllo
Slonge Billing registra ogni operazione di scrittura — provenga dal cruscotto, dalla CLI o da un client MCP — in modo inalterabile in due tabelle:
ApiTokenUsage: involucro della richiesta (endpoint, metodo HTTP, codice di stato, tempo di risposta, indirizzo IP, user agent) per ogni chiamata effettuata con un token API.AuditLog: Chi (userIde/otokenId), Cosa (azione + entità + ID dell’entità), diff prima/dopo per gli aggiornamenti, oltre ai metadati di contesto.
Per ogni entità aziendale modificata con successo viene creata esattamente una riga in AuditLog. Le chiamate PATCH che non modificano alcun campo tracciato non generano alcuna voce — in questo modo il registro rimane privo di voci no-op prive di significato.
Modello a due livelli
Ogni chiamata CLI/MCP
│
├─► ApiTokenUsage (sempre: metadati dell’involucro, indipendentemente dall’esito)
│
└─► AuditLog (solo in caso di successo + modifica effettiva)
Le azioni del cruscotto non scrivono una riga ApiTokenUsage (nessun token API coinvolto), ma scrivono una voce AuditLog con lo userId della persona connessa.
Ciclo di vita finanziario: registro di conformità
Per le azioni del ciclo di vita su tutte le entità rilevanti dal punto di vista finanziario (fatture · registrazioni · note di credito · fatture fornitore · spese · offerte), viene inoltre aggiunto un evento concatenato tramite hash al registro ComplianceEvent. Ciò vale allo stesso modo per le azioni avviate dal cruscotto e da CLI/MCP. I documenti PDF inviati vengono inoltre registrati come DocumentArtifact con una checksum SHA-256. Tutti i dati di conformità sono inclusi nell’esportazione di backup del tenant — vedere Impostazioni → Dati ed esportazione → Dossier di conformità.
Cosa viene registrato?
| Azione | Entità | Codice azione | Esempio di metadati |
|---|---|---|---|
| Creare un cliente | Client | create | { name, email } |
| Aggiornare un cliente | Client | update | Diff dei campi modificati |
| Eliminare un cliente | Client | delete | { name } |
| Creare un progetto | Project | create | { name, clientId } |
| Creare una fattura | Invoice | create | { invoiceNumber, clientId, totalAmount } |
| Inviare una fattura | Invoice | send | { invoiceNumber, recipientEmail } |
| Contrassegnare una fattura come pagata | Invoice | status_change | { invoiceNumber, status: "paid" } |
| Creare un’offerta | Quote | create | { quoteNumber, amount } |
| Inviare un’offerta | Quote | send | { quoteNumber, recipientEmail } |
| Convertire un’offerta → fattura | Invoice + Quote | create + status_change | { quoteNumber, invoiceNumber } |
| Creare una registrazione di tempo | TimeEntry | create | { projectId, hours, date } |
| Creare una spesa | Expense | create | { amount, vendor, date } |
| Caricare un giustificativo (OCR) | Expense | view | { fileSize, mimeType, parsedAmount, parsedVendor, parsedDate } |
| Aggiornare le impostazioni | Settings | update | Diff dei campi modificati |
| Creare un token API | ApiToken | create | { tokenName, tokenPrefix, expiresAt } |
| Revocare un token API | ApiToken | revoke | { tokenName, tokenPrefix } |
| Sollecito inviato (cron o CLI) | Invoice | status_change | { invoiceNumber, source: "cron"/"cli" } |
| Creare una registrazione | JournalEntry | journal.created | Snapshot completo incl. posizioni |
| Modificare una registrazione | JournalEntry | journal.updated | Prima + dopo |
| Eliminare una registrazione | JournalEntry | journal.deleted | Snapshot completo |
| Creare una nota di credito | CreditNote | creditNote.created | Snapshot completo |
| Nota di credito da fattura | CreditNote | creditNote.created_from_invoice | sourceInvoiceId + snapshot |
| Modificare una nota di credito | CreditNote | creditNote.updated | Prima + dopo |
| Eliminare una nota di credito | CreditNote | creditNote.deleted | Snapshot completo |
| Creare una fattura fornitore | VendorBill | vendorBill.created | Snapshot completo |
| Modificare una fattura fornitore | VendorBill | vendorBill.updated | Prima + dopo |
| Eliminare una fattura fornitore | VendorBill | vendorBill.deleted | Snapshot completo |
| Fattura fornitore pagata | VendorBill | vendorBill.paid | paidAt + paymentReference |
| Creare una spesa | Expense | expense.created | Snapshot completo |
| Modificare una spesa | Expense | expense.updated | Prima + dopo |
| Eliminare una spesa | Expense | expense.deleted | Snapshot completo |
| Caricare un giustificativo (OCR) | Expense | expense.uploaded | fileSize, mimeType, parsedAmount, parsedVendor, parsedDate |
| Creare un’offerta | Quote | quote.created | Snapshot completo |
| Modificare un’offerta | Quote | quote.updated | Prima + dopo |
| Eliminare un’offerta | Quote | quote.deleted | Snapshot completo |
| Inviare un’offerta | Quote | quote.sent | recipientEmail + snapshot |
| Accettare un’offerta | Quote | quote.accepted | Snapshot completo |
| Convertire un’offerta | Quote | quote.converted | createdInvoiceId + snapshot |
Nota di sicurezza: il valore completo del token non viene mai registrato — solo il nome e il prefisso (ad es.
slk_live_abc…).
Attribuzione dell’origine
Ogni voce AuditLog porta con sé uno userId oppure un tokenId (o entrambi):
| Interfaccia | userId | tokenId |
|---|---|---|
| Cruscotto | ✓ (persona connessa) | — |
| CLI / MCP / Streamable HTTP | — | ✓ (token API utilizzato) |
Il nome del token che lei ha assegnato al momento della creazione (ad es. «Claude Desktop — Laptop Ben») compare nella pista di controllo e facilita l’attribuzione. Per questo motivo si consiglia di creare un token distinto per ogni dispositivo e applicazione.
Consultare la pista di controllo
La pista di controllo attualmente non è consultabile direttamente nel cruscotto. I dati grezzi sono tuttavia inclusi nell’esportazione del dossier di conformità:
- Impostazioni → Dati ed esportazione → Esportare il dossier di conformità
- Il file ZIP contiene
compliance/events.json(registro del ciclo di vita concatenato tramite hash) ecompliance/document-artifacts.json(checksum dei PDF).
Se necessita di un’interfaccia utente dedicata alla pista di controllo, ci contatti all’indirizzo [email protected].
Relazione con le altre funzioni di sicurezza
| Funzione | Scopo |
|---|---|
| Pista di controllo (questa pagina) | Chi ha modificato cosa — per il controllo interno e il debugging |
| Registro di conformità | Eventi di fatture concatenati tramite hash — per i revisori esterni |
| ApiTokenUsage | Statistiche delle richieste per token — per il rate limiting e il rilevamento di anomalie |
| Artefatti di documenti SHA-256 | Prova di integrità dei PDF inviati |
I quattro livelli si completano a vicenda: la pista di controllo spiega cosa è stato modificato, il registro di conformità attesta che una fattura è esistita ed è stata inviata, e gli artefatti di documenti dimostrano che la versione PDF archiviata è quella effettivamente inviata.