Dezvoltatori

Fluxul proformă → plată → factură fiscală

Cum devine o proformă plătită factură fiscală, automat — pașii, stările proformei, căile de plată, regulile (plată parțială, după expirare, plăți simultane).

Specificația API (JSON)

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. PJPF42 sau PJPF00042) ș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ă.

Documentația aplicației eZif 0.42.6.