Agency Flow · Prezentare de flux

D · Fixed cost + fee — primul profit din familia supplier

Fluxul C, plus un singur parametru: un fee lunar fix peste costul furnizorului. Factura clientului e derivată (cost + fee, o singură sumă), profitul e exact fee-ul, iar clientul nu vede niciodată split-ul.

Account manager — setup Engine — automat Finance — facturi (AR + AP)
1

O singură dată · la vânzarea serviciului

Setup: cost + fee, ambele fixe

Account manager
Drawer · New service
Northwind Retail — Magento · northwind.ro
Analytics
grup derivat: Data
Supplier — fixed cost + fee (D)
Webify
2.000 RON
400 RON — profitul agenției
nume compus → Northwind Retail — Data — Analytics — Webify
În baza de date · la Save
INSERT service + service_pricing_supplier_fixed_plus_fee
billing_type: 'supplier_fixed_plus_fee' supplier_id: → Webify supplier_cost: 2000.00 fee: 400.00
nu există câmp „preț către client" — factura se derivă mereu din cost + fee, nu se introduce.
2

1 august · automat

Perioadă ready + linia cu fee

Engine

Totul e fix din setup → perioada se naște ready, ca la C. Linia de cost materializată poartă de data asta și unit_fee — iar client_amount-ul ei e suma combinată.

În baza de date
INSERT service_billing_period
state: 'ready' snapshot_client_amount: 2400.00 snapshot_supplier_cost: 2000.00 snapshot_fee_profit: 400.00
INSERT service_cost_line · materializată
line_type: 'fixed_supplier' quantity: 1 unit_cost: 2000.00 unit_fee: 400.00 client_amount: 2400.00
GENERATED calculate de DB
snapshot_gross_profit: 400.00 snapshot_net_profit: 400.00
gross = 2.400 − 2.000; net = gross (labour 0 la tipurile supplier pure).
3

1 septembrie + la sosirea facturii Webify

Cele două facturi — și ce vede fiecare parte

Finance modulul Billing — urmează

Factura clientului (AR — Accounts Receivable) arată o singură linie de 2.400 — niciodată 2.000 + 400. Factura furnizorului (AP — Accounts Payable) sosește pe 2.000 și se leagă de linia de cost. Diferența dintre ele — fee-ul — e profitul, vizibil doar intern.

Client invoice (AR) · o singură sumă
linieamountTVA 21%total
Northwind Retail — Data — Analytics — Webify · aug2.400,00504,002.904,00
Supplier invoice (AP) · legată de linia de cost
INSERT supplier_invoice_line
amount: 2000.00 service_cost_line_id: → linia lunii august
client_invoice
2.400
AR · sumă combinată
supplier_cost
2.000
AP · factura Webify
fee_profit
400
bucket-ul fee — marjă curată
margin
16,7%
doar ratio de afișare
Confidențialitatea split-ului nu e un detaliu de UI, e o regulă de domeniu (spec §1.11a): clientul vede o sumă, agenția vede cost + fee. De-asta linia de cost ține ambele (unit_cost, unit_fee), iar factura client primește doar totalul.
DB

service_billing_period — ce se scrie și ce se actualizează

D se naște ready — cost + fee, ambele fixe din setup. Clientul vede doar suma combinată; split-ul trăiește în snapshot-uri.

service_billing_period · ciclul de scriere al rândului lunar
INSERT service_billing_period · la generare (naștere)
state: 'ready' ready_at: setat acum input_supplier_cost: NULL input_supplier_hours: NULL input_amount_spend: NULL snapshot_client_amount: 2400.00 = cost + fee snapshot_supplier_cost: 2000.00 = supplier_cost snapshot_fee_profit: 400.00 = fee snapshot_labour_cost: 0.00 snapshot_labour_hours: 0.00 snapshot_direct_profit: 0.00 snapshot_labour_recovery: 0.00 snapshot_gross_profit: 400.00 generat de DB snapshot_net_profit: 400.00 generat de DB snapshot_recovery_net: 0.00 generat de DB
input_* rămân NULL — nu aparțin lui D (cost + fee sunt fixe din setup). Engine-ul materializează 1 linie în service_cost_line (fixed_supplier, qty 1, unit_cost = supplier_cost, unit_fee = fee).
UPDATE service_billing_period · la emitere
state: 'ready' → 'invoiced' invoiced_at: setat
fără UPDATE-uri pe parcursul lunii. Editarea lui supplier_cost/fee în setup NU atinge lunile cu ready_at setat — doar lunile viitoare / reopen.
DB

service_cost_line — linia materializată de engine

La D, engine-ul materializează o singură linie/lună care poartă atât costul cât și fee-ul; clientul vede doar suma combinată, dar split-ul unit_cost vs unit_fee trăiește pe linie. Ancoră AP.

service_cost_line · linia lunii (materializată)
INSERT service_cost_line · la nașterea perioadei (materializare de engine)
billing_period_id: → perioada lunii supplier_id: → service.supplier_id line_type: 'fixed_supplier' description: auto quantity: 1 unit_cost: 2000.00 = supplier_cost unit_fee: 400.00 = fee supplier_cost_amount: 2000.00 = qty × unit_cost fee_amount: 400.00 = qty × unit_fee client_amount: 2400.00 = cost + fee state: 'ready' oglindește perioada position: 1
o singură linie fixed_supplier poartă tot: cost + fee. supplier_cost_amount și fee_amount sunt derivate din cantitate × preț unitar, iar client_amount e suma lor.
UPDATE service_cost_line · la emitere
state: 'ready' → 'invoiced' Locked
linia se blochează odată cu perioada — reopen explicit / storno pentru a o reedita.
Clientul vede DOAR 2.400 (client_amount) — split-ul cost/fee de pe linie e invizibil pentru el (invariantul 5); linia rămâne ancora AP a facturii furnizorului pe partea de cost (2.000). Editarea setup-ului pe o lună neînghețată → UPDATE unit_cost/unit_fee + amounts.

Simulare · cost + fee → factura derivată

interactiv · doar vizual

Totul se decide la setup: muți costul furnizorului și fee-ul, iar restul cascadează automat. Factura clientului nu se introduce niciodată — e mereu cost + fee, o singură sumă. Profitul e exact fee-ul (labour 0), iar linia de cost se naște direct ready. Nimic nu se salvează — e o schiță.

Account manager — setup cost + fee Finance — emite factura (AR + AP)
Setup · New service rol: Account manager
Nu există câmp „preț către client" — factura se derivă mereu din cost + fee. Fee-ul e singura intrare de profit a lui D.
Linia de cost materializată perioada: ready
line_typeqtyunit_cost unit_feeclient_amountstate
fixed_supplier 1 2.000 400 2.400 ready
client_invoice
2.400
AR · sumă combinată (cost + fee)
supplier_cost
2.000
AP · factura furnizorului
fee_profit
400
bucket-ul fee — marjă curată
net_profit
400
= gross = fee (labour 0)
Ce ilustrează: clientul vede DOAR suma combinată (2.400) — NICIODATĂ split-ul cost/fee (invariantul 5). fee e derivata reală de profit a lui D și e singurul tip supplier „fix" cu marjă: mută fee-ul la 0 și profitul dispare, deși costul rămâne acoperit integral.