Fluxul pentru abonamente (pjAPI.ro) și pentru orice vânzare care se plătește înainte: proforma întâi, factura fiscală după plata integrală, emisă de eZif singur.
| # | Pas | Ce face eZif |
|---|---|---|
| 1 | Aplicația creează proforma | POST /proformas cu external_id unic (ex. PJAPI-SUB-1842-2026-10). Seria = seria de proforme a cheii. Proforma nu merge în e-Factura (nu e document fiscal). Răspunsul conține pay_url și pdf_url. Clientul primește proforma pe e-mail, cu linkul de plată (dacă e bifat în setările aplicației). |
| 2 | Clientul plătește | cu cardul, din linkul de plată (procesatorul firmei: Revolut Merchant sau NETOPIA); prin ordin de plată, cu numărul proformei în detalii — se potrivește la importul extrasului; sau aplicația raportează plata (POST /proformas/{id}/payments), când încasează cu procesatorul ei |
| 3 | Plata integrală | factura fiscală se creează din proformă (aceleași linii, același client, aceleași prețuri), din seria de facturi a cheii; se emite (numărul se alocă la emitere, fără goluri); încasările se mută de pe proformă pe factură; factura e achitată; proforma devine facturată |
| 4 | e-Factura | factura intră în coada SPV după setările firmei (trimitere automată, întârziere, „doar noaptea”) |
| 5 | Clientul și aplicația | clientul primește factura achitată pe e-mail; aplicația primește proforma.paid și invoice.issued, apoi invoice.spv_accepted (sau invoice.spv_rejected) |
Data facturii = ziua în care plata integrală ajunge în eZif: la card și la plata raportată de aplicație, aceeași zi cu plata; la ordinul de plată, ziua importului extrasului. Data plății rămâne pe încasare. (Seria nu acceptă o dată anterioară ultimei facturi emise.)
Stările proformei
| Stare | Când |
|---|---|
neplătită (unpaid) |
după creare |
plătită parțial (partial) |
o încasare mai mică decât totalul; factura nu se emite; webhook proforma.partially_paid |
facturată (invoiced) |
plata integrală → factura emisă; definitivă |
expirată (expired) |
neplătită la valid_until (verificare zilnică după 00:10); linkul de plată se închide; webhook proforma.expired |
anulată (cancelled) |
POST /proformas/{id}/cancel, doar neplătită; webhook proforma.cancelled |
Reguli
- O proformă produce cel mult o factură, chiar dacă două plăți sosesc în același timp (blocare pe proformă). O plată pe o proformă facturată e refuzată (409
PROFORMA_INVOICED). - Aceeași plată de două ori (același
external_id) → o singură încasare. - Plata după expirare (raportată de aplicație sau găsită în extras): se acceptă și emite factura — banii au intrat —, cu o excepție în inbox („Proforma plătită după expirare”) ca să decizi dacă serviciul se livrează sau suma se restituie (storno).
- Ordinul de plată se potrivește automat doar dacă detaliile conțin numărul proformei (prefix + număr, ex.
PJPF42sauPJPF00042) și suma este egală cu restul de plată; altfel tranzacția rămâne pentru potrivirea manuală din Trezorerie → Reconciliere. - Dacă emiterea facturii se întrerupe după încasare, planificatorul o reia la 5 minute; răspunsul plății are atunci
invoice_pending: true. - Reminderul pleacă o singură dată, la N zile după emitere (setarea cheii), doar pentru proformele neplătite.
În interfața eZif
- Vânzări → Facturi, pe rândurile de tip Proformă: coloana Încasare arată neplătită / plătită parțial / facturată / expirată / anulată.
- Fișa proformei: caseta Proformă cu plată — starea, totalul, încasat, valabilitatea, linkul de plată (copiere), încasările și factura emisă. Butonul „Convertește în factură” nu apare pe aceste proforme: factura se emite singură.