Agency Flow · Prezentare de flux

F3 · % of cost — markup procentual peste un cost variabil

Hibridul dintre E și D: costul variază lunar (ca la E), dar poartă un adaos — de data asta procentual, fixat la setup. Profitul crește și scade odată cu costul. Ultimul pas înainte de Platform, de care îl desparte o singură idee: aici tot fee-ul e marjă curată.

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

O singură dată · la vânzarea serviciului

Setup: un singur procent

Account manager
Drawer · New service
Aurora Cosmetics — Website · auroracosmetics.ro
Adina
grup derivat: PMK
Supplier — % of cost (F3)
Outreach Media
15 % peste costul lunar
Varies se introduce lunar
nume compus → Aurora Cosmetics — PMK — Adina — Outreach Media
În baza de date · la Save
INSERT service + service_pricing_supplier_percentage
billing_type: 'supplier_percentage' supplier_id: → Outreach Media fee_pct: 15.000
procentul e decimal(6,3), nu float — banii și procentele nu ating niciodată virgula mobilă.
2

Lunar · când sosește cifra furnizorului

Specialistul introduce costul, procentul face restul

Specialist

Mecanic identic cu E — perioadă născută cost_entry, „Enter cost", salt direct la ready. Diferența e în strategie: clientul plătește costul plus 15%, iar cei 390 sunt profit.

Formular · Enter cost — August 2024
2.600 RON
2.990 RON = 2.600 × 1,15
În baza de date · la salvare
UPDATE service_billing_period
input_supplier_cost: 2600.00 snapshot_supplier_cost: 2600.00 snapshot_fee_profit: 390.00 snapshot_client_amount: 2990.00 state: 'cost_entry' → 'ready'
INSERT service_cost_line · materializată
line_type: 'supplier_percentage' unit_cost: 2600.00 fee_amount: 390.00 client_amount: 2990.00
GENERATED calculate de DB
snapshot_gross_profit: 390.00 snapshot_net_profit: 390.00
3

1 septembrie + factura Outreach Media

Facturile și istoricul

Finance modulul Billing — urmează

AR (Accounts Receivable): 2.990, o singură sumă. AP (Accounts Payable): 2.600, legată de linia de cost. Lunile diferă exact cât diferă costul — iar profitul urmează procentual.

Istoricul perioadelor
periodsupplier_costmarkup 15%clientstate
2024-07-013.1004653.565invoiced
2024-08-012.6003902.990ready
client_invoice · aug
2.990
cost × 1,15
supplier_cost
2.600
AP → linia de cost
fee_profit
390
15% × cost — marjă curată
margin
13,0%
= 15/115, prin construcție
Pragul spre Platform: la F3, cei 15% sunt marjă curată — nimeni nu trebuie plătit din ei. La Platform, procentul clientului (3%) e etichetat labour-recovery: din el se plătesc orele echipei care administrează platforma, iar raportul urmărește dacă ajunge (recovery_net). Aceeași formulă, altă semantică a profitului — ultima piesă a puzzle-ului, pe pagina următoare.
DB

service_billing_period — ce se scrie și ce se actualizează

F3 se naște cost_entry; la introducerea costului furnizorului aplică procentul de setup și 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țin F3 input_amount_spend: NULL — nu aparțin F3 snapshot_*: NULL ready_at: NULL invoiced_at: NULL
rândul se naște gol: doar procentul de setup e cunoscut, costul lunar încă nu.
UPDATE service_billing_period · specialistul introduce costul (input + recompute), fee_pct = 15%
input_supplier_cost: 2.600 — scris de specialist snapshot_client_amount: 2.990 · cost × (1 + pct) snapshot_supplier_cost: 2.600 · = cost snapshot_fee_profit: 390 · pct × cost snapshot_labour_cost: 0 snapshot_labour_hours: 0 snapshot_direct_profit: 0 snapshot_labour_recovery: 0 state: 'cost_entry' → 'ready' ready_at: setat
engine-ul materializează linia supplier_percentage (unit_cost = costul, fee_amount = 390).
UPDATE service_billing_period · reeditare cost înainte de facturare (reset)
input_supplier_cost: valoare nouă state: 'ready' → 'cost_entry' ready_at: NULL
orice modificare a costului anulează confirmarea — perioada revine la cost_entry și trebuie reconfirmată.
UPDATE service_billing_period · la emitere
state: 'ready' → 'invoiced' invoiced_at: setat
DB

service_cost_line — linia materializată de engine

La F3, engine-ul materializează linia la introducerea costului. Particularitatea: fee-ul vine din procent, nu dintr-un fee per-unitate — deci unit_fee rămâne NULL, iar fee_amount e calculat = fee_pct × cost.

service_cost_line · linia lunii (materializată la input)
INSERT service_cost_line · la introducerea costului (input_supplier_cost 2.600 → materializare)
billing_period_id: → perioada supplier_id: → service.supplier_id line_type: 'supplier_percentage' description: auto quantity: 1 unit_cost: = input_supplier_cost (2.600) unit_fee: NULL — fee-ul vine din procent, nu per-unitate supplier_cost_amount: 2.600 · = qty × unit_cost fee_amount: 390 · = 15% × 2.600 client_amount: 2.990 · = cost + fee state: 'ready' — oglindește perioada position: 1
o singură linie: costul e ancora, iar fee_amount se derivă din procentul de setup aplicat costului.
UPDATE service_cost_line · reeditare cost (sau pct) înainte de facturare (reset)
unit_cost: recalculat supplier_cost_amount: recalculat fee_amount: recalculat client_amount: recalculat state: 'ready' → 'cost_entry'
orice modificare a costului sau a procentului recalculează linia și readuce perioada în cost_entry.
UPDATE service_cost_line · la emitere
state: 'ready' → 'invoiced'
linia se blochează (Locked) odată cu emiterea facturii.
La F3, fee_amount e derivat din procentul de setup (nu din unit_fee, care rămâne NULL) — tot fee-ul e marjă curată. Linia rămâne ancora AP pe cost (2.600), iar clientul plătește costul plus procentul.

Simulare · costul lunar × procentul fix

interactiv · doar vizual

Exact cum funcționează F3: procentul e fixat o dată la setup, iar specialistul introduce doar costul lunar. Motorul derivă fee-ul (cost × %) și factura clientului (cost × (1 + %)). „Confirmă cost" sare direct la ready — F3 nu are awaiting_fee. Nimic nu se salvează — e o schiță.

Specialist — costul lunar Finance — emite factura
Setup fix + cost lunar rol: Account (%) · Specialist (cost)
procentul e fix la setup — nu există awaiting_fee: „Confirmă cost" duce perioada direct din cost_entry în ready.
Linie de cost materializată starea perioadei: cost_entry
line_typeqtyunit_cost fee_amountclientstate
supplier_percentage 1 2.600 390 2.990 cost_entry
client_invoice
2.990
cost × (1 + %)
supplier_cost
2.600
costul introdus · AP
fee_profit
390
% × cost — marjă curată
net_profit
390
= fee (labour 0)
Ce ilustrează: tot fee-ul e marjă curată (fee_profit) — spre deosebire de Platform, unde o parte e menită să acopere munca. Procentul e fix la setup, deci nu există awaiting_fee: „Confirmă cost" duce perioada direct din cost_entry în ready.