Agency Flow · Prezentare de flux

E · Variable cost — prima intrare lunară manuală

Pass-through ca la C, dar costul variază — și cineva trebuie să-l introducă în fiecare lună. Aici debutează specialistul ca actor lunar și coloana input_supplier_cost. Și tot aici se vede cel mai limpede lifecycle-ul: perioada așteaptă un om.

Account manager — setup Engine — automat Specialist — costul lunar Finance — facturi
1

O singură dată · la vânzarea serviciului

Setup: zero parametri de preț

Account manager

E e singurul tip single-supplier fără tabel de pricing: nu există nimic de fixat la setup în afară de furnizor. Drawerul arată doar un text explicativ — „costul se introduce lunar; factura = costul (pass-through, profit 0)".

În baza de date · la Save
INSERT service · doar părintele — fără tabel-copil!
billing_type: 'supplier_variable' supplier_id: → Genezio digital_asset_id: → madebysociety.pl
un singur rând: billing_type de pe părinte e suficient ca discriminator; strategia E nu are parametri de citit.
2

1 august · automat

Perioada se naște și așteaptă

Engine

Spre deosebire de C (totul cunoscut) și de A2 (se acumulează singur), perioada E așteaptă o acțiune umană: rămâne în cost_entry, cu toate sumele NULL, până când specialistul introduce costul lunii.

În baza de date
INSERT service_billing_period
period: 2024-08-01 state: 'cost_entry' input_supplier_cost: NULL — se așteaptă specialistul snapshot_*: NULL — necalculat
În UI, rândul apare cu butonul „Enter cost" și badge-ul cost_entry — exact tabelul „Supplier cost · monthly" din prototipul service-e.html.
3

Când sosește cifra de la furnizor · lunar

Specialistul introduce costul

Specialist

Un singur câmp: costul lunii (1.740). La salvare, strategia rulează, linia de cost se materializează și perioada sare direct în ready — E nu trece prin awaiting_fee, pentru că nu există fee de așteptat.

Formular · Enter cost — August 2024
1.740 RON — factura Genezio pe august
1.740 RON — identic, pass-through
În baza de date · la salvare
UPDATE service_billing_period
input_supplier_cost: 1740.00 snapshot_client_amount: 1740.00 snapshot_supplier_cost: 1740.00 state: 'cost_entry' → 'ready' ready_at: 2024-08-29 17:40
whitelist per tip: la E doar input_supplier_cost e scriibil — orice altă coloană input_* = eroare.
INSERT service_cost_line · materializată
line_type: 'variable_supplier' supplier_id: → Genezio unit_cost: 1740.00 client_amount: 1740.00
GENERATED calculate de DB
snapshot_gross_profit: 0.00 snapshot_net_profit: 0.00
Corecție înainte de facturare? Specialistul reeditează costul → perioada se resetează la cost_entry (ready_at se golește), strategia rerulează, linia se rescrie. După invoiced însă, nimic nu se mai atinge — doar storno.
4

1 septembrie + la sosirea facturii Genezio

AR (Accounts Receivable) = AP (Accounts Payable), lună de lună

Finance modulul Billing — urmează

Factura clientului preia 1.740 din snapshot; factura Genezio se leagă de linia de cost. Istoricul lunilor arată exact variația: 1.520 → 1.890 → 1.740 — fiecare rând înghețat la valoarea lui.

Istoricul perioadelor
periodinput_supplier_costclient_amountstate
2024-06-011.5201.520invoiced
2024-07-011.8901.890invoiced
2024-08-011.7401.740ready
client_invoice · aug
1.740
= costul introdus
supplier_cost · aug
1.740
AP → linia de cost
net_profit
0
pass-through legitim
DB

service_billing_period — ce se scrie și ce se actualizează

E se naște cost_entry gol și AȘTEAPTĂ specialistul; la introducerea costului sare DIRECT în ready (fără awaiting_fee).

service_billing_period · ciclul de scriere al rândului lunar
INSERT service_billing_period · la generare
state: 'cost_entry' input_supplier_cost: NULL — se așteaptă input_supplier_hours: NULL — nu aparține E input_amount_spend: NULL — nu aparține E snapshot_*: NULL — încă necalculat ready_at: NULL invoiced_at: NULL
rândul lunar se naște gol, în cost_entry — nicio sumă până nu intervine specialistul.
UPDATE service_billing_period · specialistul introduce costul (input + recompute)
input_supplier_cost: 1.740 — scris de specialist snapshot_client_amount: = input (1.740) snapshot_supplier_cost: = input (1.740) snapshot_labour_cost: 0 snapshot_labour_hours: 0 snapshot_direct_profit: 0 snapshot_fee_profit: 0 snapshot_labour_recovery: 0 state: 'cost_entry' → 'ready' ready_at: setat
engine-ul materializează linia variable_supplier; net = 0 (pass-through), calculat de DB.
UPDATE service_billing_period · reeditare cost înainte de facturare (reset)
input_supplier_cost: valoare nouă state: 'ready' → 'cost_entry' ready_at: NULL
orice editare a costului readuce perioada în cost_entry și golește ready_at; se reconfirmă.
UPDATE service_billing_period · la emitere
state: 'ready' → 'invoiced' invoiced_at: setat
DB

service_cost_line — linia materializată de engine

La E, linia NU apare la nașterea perioadei — abia când specialistul introduce costul lunar, engine-ul o materializează și perioada sare în ready. Pass-through: fără fee.

service_cost_line · linia lunii (materializată la input)
INSERT service_cost_line · la introducerea costului (input_supplier_cost 1.740 → materializare de engine)
billing_period_id: → perioada supplier_id: → service.supplier_id line_type: 'variable_supplier' description: auto quantity: 1 unit_cost: = input_supplier_cost (1.740) unit_fee: 0 supplier_cost_amount: 1.740 · = qty × unit_cost fee_amount: 0 client_amount: 1.740 · = cost + fee state: 'ready' — oglindește perioada position: 1
linia se naște DIRECT în ready, împreună cu perioada, la momentul input-ului — nu la generarea lunii.
UPDATE service_cost_line · reeditare cost înainte de facturare (reset)
unit_cost: recalculat la noul cost supplier_cost_amount: recalculat la noul cost client_amount: recalculat la noul cost state: 'ready' → 'cost_entry' — oglindește perioada resetată
editarea costului rescrie linia și o readuce în cost_entry, în pas cu perioada; se reconfirmă.
UPDATE service_cost_line · la emitere
state: 'ready' → 'invoiced' (Locked)
Înainte de introducerea costului, perioada e cost_entry FĂRĂ linie — spre deosebire de C/D, care se nasc cu linia gata. Profit 0 (pass-through), iar linia rămâne ancora AP pentru factura furnizorului.

Simulare · introdu costul lunii

interactiv · doar vizual

Exact cum funcționează E în realitate: specialistul introduce costul furnizorului pe luna curentă, iar client_invoice = supplier_cost — pass-through, profit 0. Perioada așteaptă omul în cost_entry, sare direct în ready la confirmare (fără awaiting_fee, n-are fee de decis) și abia apoi se poate emite factura. Nimic nu se salvează — e o schiță.

Specialist — introduce costul lunar Finance — facturare
Enter cost — luna curentă rol: Specialist
nu există fee — factura = costul, profit 0
Linie de cost materializată starea perioadei: cost_entry
line_typeqtyunit_cost clientstate
client_invoice
1.740
= costul introdus
supplier_cost
1.740
AP → linia de cost
net_profit
0
pass-through legitim
Istoric luni fiecare lună înghețată la valoarea ei
periodinput_supplier_costclient_amountstate
2024-06-011.5201.520invoiced
2024-07-011.8901.890invoiced
Ce ilustrează: E n-are tabel de pricing — costul se introduce lunar și fiecare lună îngheață la valoarea ei, independent de celelalte. Profitul 0 e legitim (pass-through: factura = costul). Perioada sare peste awaiting_fee — nu există fee de decis — și trece direct în ready. Dacă editezi costul după confirmare, perioada revine în cost_entry și se reconfirmă.