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.
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 viitoare / reopen.
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. 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ă un singur parametru —
supplier_cost/lună — și vezi cum se propagă identic în factura clientului și în
linia de cost a lunii. 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.
| 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
invoiced rămâne neatinsă.