Lifecycle · Article 2.13
Zdarzenia Osi Czasu: każdy typ zdarzenia wyjaśniony
Komponent Osi Czasu na każdej stronie szczegółowej oferty rejestruje 21+ typów zdarzeń. To jest kanoniczna lista z opisami i wyzwalaczami, przydatna podczas audytowania tego, co się działo z ofertą.
Oś Czasu to Twoja ścieżka audytu. Każdy webhook, każde kliknięcie, każde wysłanie e-maila produkuje zdarzenie. Zachowujemy je przez cały czas życia oferty (10 lat dla retencji prawnej). Gdy próbujesz ustalić „poczekaj, kiedy klient faktycznie podpisał?" lub „czy faktura zaliczkowa kiedykolwiek wyszła?", Oś Czasu jest źródłem prawdy — nawet gdy odznaka UI lub potwierdzenie e-mail daje Ci inne wrażenie.
Why this works this way
Zdarzenia Osi Czasu są przechowywane w modelu ProposalTimelineEvent z polami: event_type (enum), created_by (Użytkownik lub null dla działań inicjowanych przez klienta), data (JSON: IP, kwoty, dowody podpisu itp.), created_at (znacznik czasu UTC). Są tylko do dołączania — nigdy nie edytujemy ani nie usuwamy zdarzenia. Jeśli proces jest cofnięty (np. status przywrócony), rejestrujemy nowe zdarzenie wyjaśniające cofnięcie, pozostawiając oryginał nienaruszonym.
### Odniesienie: wszystkie typy zdarzeń
| Zdarzenie | Wyzwalacz | Kluczowe metadane |
|---|---|---|
created | Oferta pierwszy raz zapisana | created_by user |
sent | Freelancer klika Wyślij | to_email, sent_from_ip |
viewed | Klient po raz pierwszy otwiera link z prawidłowym PIN-em | viewer_ip, user_agent |
signed | Klient klika Podpisz na stronie publicznej | signer_name, signer_ip, ua, signed_at, consent |
pdf_generated | Asynchroniczne renderowanie PDF zakończone | doc_type (PRO/AGR/CON/DEP/INV/STR/DCR/CRN/REC), r2_key |
deposit_paid | Webhook Stripe lub ręczne oznaczenie | method, amount, payment_intent_id |
final_invoice_issued | Freelancer wystawia fakturę końcową | invoice_number, total |
payment_received (końcowe) | Webhook Stripe lub ręczne oznaczenie | method, amount |
completed | Freelancer oznacza jako ukończone | notes |
declined | Klient odrzuca na stronie publicznej | decline_reason |
expired | Zadanie cron 90-dniowe | days_since_sent |
archived | Freelancer archiwizuje | reason |
amendment_proposed | Aneks utworzony | amendment_id, delta_total |
amendment_viewed | Klient otwiera link do aneksu | viewer_ip |
amendment_signed | Klient podpisuje aneks | signer_name, ip, evidence_stack |
amendment_declined | Klient odrzuca aneks | decline_reason |
amendment_cancelled | Freelancer anuluje aneks przed podpisaniem | cancelled_by |
amendment_expired | Wygaśnięcie aneksu po 90 dniach | — |
refund_initiated | Uruchomiony przepływ zwrotu | credit_note_number, amount |
refund_completed | Webhook Stripe lub ręczne oznaczenie | 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.