Agency Flow · Prezentare de flux
F1 · Per deliverable — două roluri, o linie pe livrabil
Cel mai bogat flux din sistem: serviciul nu are supplier — fiecare linie de livrabil
și-l alege pe al ei. Specialistul introduce costurile, Finance/Ops pune fee-ul,
iar fiecare linie își parcurge propriul lifecycle. Singurul tip care folosește starea
awaiting_fee.
O singură dată · la vânzarea serviciului
Setup: nici parametri, nici supplier
Account managerCa la E, nu există tabel de pricing. În plus, câmpul Supplier din drawer dispare: F1 e singurul tip supplier fără furnizor la nivel de serviciu — furnizorii trăiesc pe linii, și un singur serviciu F1 poate traversa oricâți. Numele compus rămâne fără supplier, ca la tipurile labor.
1 august + pe parcursul lunii
Specialistul construiește liniile
SpecialistPerioada se naște cost_entry, goală. Pe măsură ce livrabilele se conturează, specialistul adaugă linii: descriere, supplier (per linie!), cantitate, cost/unitate. Coloana de fee nici nu-i apare în UI — e teritoriul finance. Cu „Submit cost", linia pleacă spre finance.
Pe măsură ce liniile sosesc · rol: Finance/Ops
Finance pune fee-ul — sau trimite înapoi
Finance / Ops
Finance vede liniile în awaiting_fee și completează fee/unit —
„Enter fee" → linia devine ready. Dacă ceva nu e în regulă, „Send back" o întoarce
la specialist. Iar dacă specialistul reeditează costul unei linii deja ready,
linia se resetează automat la cost_entry — fee-ul trebuie reconfirmat.
| deliverable | supplier | qty | cost/u | fee/u | client | state | acțiune |
|---|---|---|---|---|---|---|---|
| Article — Outreach | Outreach Media | 4 | 350 | 90 | 1.760 | invoiced | Locked |
| Article — Native | Contentbox | 2 | 280 | 70 | 700 | ready | Send back |
| Static design | Contentbox | 6 | 120 | — | — | awaiting_fee | Enter fee |
| Video | Webify | 1 | — | — | — | cost_entry | Awaiting specialist |
| Invoiceable (ready + invoiced) | 2.460 | ||||||
1 septembrie + la sosirea facturilor furnizorilor
O factură client, mai multe facturi furnizor
Finance modulul Billing — urmeazăAR (Accounts Receivable): liniile invoiceable intră în factura clientului cu suma combinată (2.460 + TVA). AP (Accounts Payable): fiecare linie se leagă de factura propriului supplier — Outreach Media își revendică linia de 1.400, Contentbox pe a lui de 560. Un serviciu, doi (sau zece) furnizori, reconciliere rând cu rând.
service_billing_period — ce se scrie și ce se actualizează
La F1 rândul lunar NU primește inputuri și NU se editează direct — snapshot-urile se AGREGĂ din linii (service_cost_line), iar starea perioadei e DERIVATĂ din stările liniilor.
service_cost_line — introdusă de oameni, una per livrabil
La F1 liniile NU sunt materializate de engine — le introduce specialistul (cost) și le completează Finance (fee). Sunt N linii/lună, fiecare cu supplierul ei, fiecare cu propriul lifecycle. Aici e singura intrare umană în service_cost_line.
ready + invoiced intră în agregatele perioadei (cele cu
unit_fee NULL sunt excluse), iar starea perioadei se derivă din stările liniilor.
Simulare · construiește liniile tu
interactiv · doar vizual
Exact cum funcționează F1 în realitate: specialistul adaugă linii de livrabil (cost, fără fee)
și le trimite spre finance; Finance/Ops pune fee-ul → linia devine ready și intră
în factură. Fiecare linie își are propriul lifecycle, starea perioadei se derivă din linii, iar
totalurile numără doar liniile ready + invoiced. Nimic nu se salvează — e o schiță.
| deliverable | supplier | qty | cost/u | fee/u | client | state | acțiune |
|---|---|---|---|---|---|---|---|
| Invoiceable (ready + invoiced) | 0 | ||||||
cost_entry sau awaiting_fee nu intră în totaluri până nu
ajunge ready.
De ce F1 justifică singur designul
Trei decizii de schemă există în primul rând pentru fluxul ăsta:
Supplier per linie
service.supplier_idNULL la F1 — impus de CHECK- fiecare
service_cost_line.supplier_idobligatoriu - un serviciu → oricâți furnizori, AP atribuit corect
Stare per linie
- singurul tip care folosește
awaiting_fee - editarea costului resetează linia la
cost_entry - starea perioadei = rezumat derivat, recalculat de engine
Fee nullable
unit_feeNULL = „finance n-a decis încă" — NULL de lifecycle- devine obligatoriu la
ready— regulă de engine - fee-ul intră cu 0 în agregate cât e NULL