Lifecycle · Article 2.13
Événements de chronologie : chaque type d'événement expliqué
Le composant Chronologie sur chaque page de détail de devis enregistre 21+ types d'événements. Voici la liste canonique avec descriptions et déclencheurs, utile pour auditer ce qui s'est passé sur un devis.
La Chronologie est votre piste d'audit. Chaque webhook, chaque clic, chaque envoi d'e-mail produit un événement. Nous les conservons pendant la durée de vie du devis (10 ans pour la conservation légale). Quand vous essayez de comprendre « attendez, quand le client a-t-il réellement signé ? » ou « la facture d'acompte est-elle jamais partie ? », la Chronologie est la source de vérité — même quand le badge de l'interface ou la confirmation par e-mail vous donnent une impression différente.
Why this works this way
Les événements de chronologie sont stockés dans le modèle ProposalTimelineEvent avec les champs : event_type (enum), created_by (Utilisateur ou null pour les initiés par le client), data (JSON : IPs, montants, preuves de signature, etc.), created_at (horodatage UTC). Ils sont en ajout uniquement — nous ne modifions ni ne supprimons jamais un événement. Si un processus est annulé (ex. statut rétabli), nous enregistrons un nouvel événement expliquant l'annulation, en laissant l'original intact.
### Référence : tous les types d'événements
| Événement | Déclencheur | Métadonnées clés |
|---|---|---|
created | Devis enregistré pour la première fois | created_by user |
sent | Le freelancer clique sur Envoyer | to_email, sent_from_ip |
viewed | Le client ouvre le lien pour la première fois avec un PIN valide | viewer_ip, user_agent |
signed | Le client clique sur Signer sur la page publique | signer_name, signer_ip, ua, signed_at, consent |
pdf_generated | Le rendu PDF asynchrone est terminé | doc_type (PRO/AGR/CON/DEP/INV/STR/DCR/CRN/REC), r2_key |
deposit_paid | Webhook Stripe ou marquage manuel | method, amount, payment_intent_id |
final_invoice_issued | Le freelancer émet la facture de solde | invoice_number, total |
payment_received (solde) | Webhook Stripe ou marquage manuel | method, amount |
completed | Le freelancer marque comme terminé | notes |
declined | Le client refuse sur la page publique | decline_reason |
expired | Tâche cron de 90 jours | days_since_sent |
archived | Le freelancer archive | reason |
amendment_proposed | Avenant créé | amendment_id, delta_total |
amendment_viewed | Le client ouvre le lien d'avenant | viewer_ip |
amendment_signed | Le client signe l'avenant | signer_name, ip, evidence_stack |
amendment_declined | Le client refuse l'avenant | decline_reason |
amendment_cancelled | Le freelancer annule l'avenant avant la signature | cancelled_by |
amendment_expired | Expiration d'avenant à 90 jours | — |
refund_initiated | Flux de remboursement déclenché | credit_note_number, amount |
refund_completed | Webhook Stripe ou marquage manuel | method, completed_at |
Troubleshooting
Keep reading
Lifecycle
The proposal lifecycle, end to end
Every proposal goes through up to nine status transitions, with two actors (you and your client) handing off control along the way. This is the canonical map.
Lifecycle
Status: Signed — legally binding, audit trail captured
The client clicked Sign. Clozo collects an eIDAS-compliant evidence stack, generates the signed Service Agreement PDF, fires confirmation emails to both parties, and queues the deposit invoice. The proposal is now a contract.