Agency Flow · Prezentare de flux
C · Supplier fixed — pass-through cu profit zero
Prima întâlnire cu familia supplier: fără muncă internă, fără pontaje. Agenția
plătește un furnizor o sumă fixă și facturează clientului exact aceeași sumă.
Profit 0 — și e corect așa. Noutatea: fiecare lună lasă o
linie de cost, ancora viitoarei facturi de furnizor. Într-o lună parțială,
costul și factura se înmulțesc cu același billable_days / calendar_days,
deci invariantul de profit zero se păstrează în calculul normal. Un override manual al
perioadei devine suma finală către client fără să schimbe costul contractual, deci poate
produce intenționat un profit diferit de zero.
O singură dată · la vânzarea serviciului
Setup: supplier obligatoriu, cost fix
Account managerLa tipurile supplier, drawerul cere un furnizor din lista fixă — devine parte din numele compus. CHECK-ul din DB întoarce regula față de A1: aici supplier-ul nu are voie să lipsească.
CHK_SERVICE_SUPPLIER_BY_TYPE ✓ — C e single-supplier, supplier_id e obligatoriu.
Alt serviciu Webmastering pe același asset dar cu alt supplier ar fi un serviciu distinct
(supplierul e în cheia unică).
1 august · automat
Luna se deschide: perioadă + linia de cost
Engine
Ca la A1, totul e cunoscut din setup, deci perioada se naște ready. Noutatea:
engine-ul materializează și linia de cost a lunii — rândul din
service_cost_line pe care îl va revendica factura furnizorului.
Nimeni nu editează linia direct; e oglinda perioadei.
snapshot_supplier_cost al perioadei =
Σ supplier_cost_amount al liniilor ei. Aici: 2.000 = 2.000, o singură linie.
1 septembrie · batch lunar
Factura către client (AR — Accounts Receivable)
Finance modulul Billing — urmeazăLinia de factură = exact snapshot-ul: 2.000, fără niciun adaos. Perioada și linia de cost trec împreună pe invoiced.
| linie | amount | TVA 21% | total |
|---|---|---|---|
| Northwind Retail — SEO — Webmastering — Genezio · aug | 2.000,00 | 420,00 | 2.420,00 |
Când sosește factura Genezio
Factura de la furnizor (AP — Accounts Payable) — bucla se închide
Finance modulul Billing — urmează
Aici muncește service_cost_line: când finance înregistrează factura primită
de la Genezio, linia ei se leagă de linia de cost a lunii printr-un singur FK —
același mecanism pentru orice billing type cu furnizor. De acum, AR și AP ale
serviciului sunt reconciliabile rând cu rând.
service_billing_period — ce se scrie și ce se actualizează
C se naște ready — totul e cunoscut din setup; rândul lunar aproape nu se mai atinge după naștere.
service_cost_line
(line_type='fixed_supplier', qty 1).
supplier_cost în setup NU atinge lunile cu ready_at setat —
doar lunile încă writable. Aplicarea default-ului curent unei luni ready, nefacturate,
cere reopen + recompute explicit și autorizat.
service_cost_line — linia materializată de engine
La C, engine-ul materializează o singură linie de cost pe lună (nu omul), o îngheață odată cu perioada și o folosește ca ancoră AP. Într-o lună parțială, unit_cost și amounts țin valoarea prorată a perioadei, la qty 1. Override-ul manual înlocuiește doar client_amount; costul proratat rămâne contractual, iar gross-ul poate deveni nenul. Descrierea comună C/D este tăiată UTF-8-safe la maximum 255 de caractere și păstrează obligatoriu sufixul — YYYY-MM. Un refresh obișnuit pe o perioadă deja ready nu rescrie suma; doar un reopen explicit regenerează același rând. Nu se editează direct — starea ei oglindește perioada.
supplier_invoice_line.service_cost_line_id pointează aici. Invariant:
snapshot_supplier_cost = Σ supplier_cost_amount al liniilor perioadei.
Editarea lui supplier_cost în setup pe o lună neînghețată → UPDATE unit_cost + amounts.
Simulare · pass-through-ul cu profit zero
interactiv · doar vizual
C n-are input lunar: totul cade din setup. Mișcă default-ul
supplier_cost/lună: perioada ready își păstrează snapshot-ul; abia acțiunea explicită
de reopen îl aplică identic facturii clientului și liniei de cost. Profitul rămâne 0,
deliberat: agenția facturează exact cât plătește.
Nimic nu se salvează — e o schiță.
client_invoice = supplier_cost, fără adaos.
Editarea recalculează doar lunile cu ready_at IS NULL; luna ready de mai jos
își păstrează snapshot-ul până la reopen explicit.
| line_type | qty | unit_cost | unit_fee | client | state |
|---|
0 ≠ NULL: 0 = calculat și e zero, nu „necalculat".
Editarea setup-ului recalculează doar lunile cu ready_at IS NULL — o lună deja
ready cere reopen/recompute explicit, iar una invoiced rămâne neatinsă.