Workflow: Purchase to Pay
Modules involved: Purchase (RFQ · Quotations · Purchase Orders · Vendor Invoices) · Warehouse (Goods Receipt) · Payments
Who uses it: Responsabil achiziții, Manager depozit, Financiar, Furnizori
Durata tipică: 1 zi – 4 săptămâni (depinde de termenele furnizorului)
Overview
Fluxul complet de aprovizionare: de la nevoia identificată intern (cerere de ofertă) până la plata facturii furnizorului și intrarea mărfii în stoc. Gestionat în principal de echipa de achiziții și depozit.
Diagrama fluxului
[CERERE DE OFERTĂ (RFQ)]
│ status: Draft (1) → Approved (2) → Rejected (3) / Canceled (4)
│ ↓ Aprobare internă → trimitere la furnizori
│
[OFERTE PRIMITE (Quotations)]
│ furnizorul răspunde prin portal sau manual
│ status: Draft (1) → Accepted (2)
│ ↓ Selectezi oferta câștigătoare → crezi Comandă Achiziție
│
[COMANDĂ ACHIZIȚIE (Purchase Order)]
│ status: Draft (1) → Approved (2) → Rejected (3) / Canceled (4)
│ order_status: Not Started (1) → In Progress (2) → Completed (3)
│ delivery_status: 0 = nelivrat / 1 = livrat
│ ↓ Marfă sosește în depozit → Aviz de Recepție
│
[AVIZ DE RECEPȚIE (Goods Receipt Note)]
│ creat automat sau manual din PO
│ stocul se actualizează în depozit
│ ↓ Factură primită de la furnizor
│
[FACTURĂ FURNIZOR (Vendor Invoice)]
│ payment_status: unpaid → partially_paid → paid
│ ↓ Înregistrezi plata
│
[PLATĂ FURNIZOR]
│
[CICLU ÎNCHIS ✓]
Pas cu pas
1. Cerere de Ofertă (RFQ) — Identificarea nevoii
Unde: /admin/purchase/purchase_request
Cum se creează:
- Manual: buton Adaugă RFQ — completezi ce produse sunt necesare, cantități, termen
- Automat: din Ordinul de Producție când materialele lipsesc din stoc (
purchase_request_idsetat pe MO)
Câmpuri cheie:
| Câmp | Note |
|---|---|
| Denumire RFQ | Titlu intern descriptiv |
| Departament | Departamentul solicitant |
| Responsabil | Staff-ul care face cererea |
| Data solicitată | Termenul de nevoie |
| Articole | Produse + cantități necesare |
Statusurile RFQ:
| Cod | Status | Descriere |
|---|---|---|
| 1 | Draft | Creat, nesupus aprobării |
| 2 | Approved | Aprobat intern — se trimite la furnizori |
| 3 | Rejected | Respins |
| 4 | Canceled | Anulat |
La trecerea în status Approved, sistemul apelează
update_item_pur_request()pentru a sincroniza articolele cu catalogul de achiziții și loghează tranziția automat.
2. Ofertă Primită (Quotation) — Răspunsul furnizorului
Unde: /admin/purchase/myquotations
Cum intră oferta:
- Portal furnizor: furnizorul primește link și completează oferta online
- Manual: operatorul introduce oferta primit pe email/telefon
- Upload: document PDF atașat cu prețuri completate manual
Câmpuri cheie pe ofertă:
| Câmp | Note |
|---|---|
| Furnizor | Legătura cu fișa furnizorului |
| RFQ asociat | Cererea de origine |
| Data expirare | Valabilitatea ofertei |
| Articole + prețuri | Ce oferă furnizorul și la ce preț |
| Termeni plată | Zile credit comercial |
Statusuri ofertă:
| Cod | Status | Descriere |
|---|---|---|
| 1 | Draft / Pending | Ofertă primită, neacceptată |
| 2 | Accepted | Oferta selectată câștigătoare |
Comparare oferte:
Poți primi multiple oferte pentru același RFQ și le poți compara pe coloane înainte de a selecta furnizorul.
3. Comandă Achiziție (Purchase Order) — Angajamentul legal
Unde: /admin/purchase/purchase_order
Creare:
- Din oferta acceptată: buton Crează Comandă — preia furnizorul și articolele automat
- Direct:
/admin/purchase/pur_order→ completezi manual
Statusurile PO:
| Câmp | Cod | Descriere |
|---|---|---|
status |
1 | Draft — neconfirmat |
status |
2 | Approved — confirmat și trimis furnizorului |
status |
3 | Rejected |
status |
4 | Canceled |
order_status |
1 | Not Started — livrarea nu a început |
order_status |
2 | In Progress — livrare parțială sau în curs |
order_status |
3 | Completed — toate articolele recepționate |
delivery_status |
0 | Nelivrat |
delivery_status |
1 | Livrat complet |
Câmpuri importante:
| Câmp | Note |
|---|---|
Termen de plată (days_owed) |
Zile de credit comercial de la livrare |
| Data livrare estimată | Termenul promis de furnizor |
| Contract asociat | Dacă există contract cadru cu furnizorul |
| Depozit destinație | Unde vor intra mărfurile |
Trimitere la furnizor:
Buton Trimite → email automat cu PDF-ul comenzii și link portal. Furnizorul confirmă recepția și poate actualiza statusul de livrare.
4. Aviz de Recepție (Goods Receipt Note) — Intrarea mărfii
Unde: /admin/warehouse/manage_purchase
Creare:
- Automată: la aprobarea PO sau la schimbarea
order_status→ sistemul creează avizul via hookcreate_goods_receipt - Manuală: din PO confirmat → buton Crează Aviz Recepție
La recepție:
- Operatorul de depozit verifică fizic marfa față de aviz
- Completează cantitățile efectiv recepționate (pot fi parțiale)
- Notează discrepanțele (lipsuri, deteriorări)
- Salvează — stocul se actualizează automat în depozitul configurat
Câmpuri cheie:
| Câmp | Note |
|---|---|
| Cod aviz recepție | Generat automat cu prefix configurabil |
| PO asociat | Legătura cu comanda de origine |
| Articole + cantități | Ce s-a primit efectiv |
| Depozit | Locația în care intră marfa |
| Data recepției | Data fizică a intrării |
Dacă recepția este parțială,
delivery_statusrămâne 0 și se poate crea un al doilea aviz la livrarea restului.
5. Factură Furnizor (Vendor Invoice) — Cererea de plată
Unde: /admin/purchase/myinvoices
Creare:
- Automată din PO sau Contract: dacă opțiunea
create_invoice_byeste configurată - Manual: buton Adaugă Factură Furnizor — introduci datele de pe factura primită
- Upload vendor: furnizorul încarcă factura prin portal
Statusurile facturii furnizor:
payment_status |
Descriere |
|---|---|
unpaid |
Neachitată — nicio plată înregistrată |
partially_paid |
Parțial achitată — suma plătită < total |
paid |
Achitată integral |
Statusul se calculează automat: dacă suma tuturor plăților înregistrate în
pur_invoice_payment= totalul facturii →paid. Dacă 0 < plătit < total →partially_paid.
Câmpuri cheie:
| Câmp | Note |
|---|---|
| Număr factură furnizor | Numărul de pe factura primită |
| Furnizor | Fișa furnizorului |
| PO asociat | Comanda de origine |
| Data scadență | Calculată din invoice_date + days_owed |
| Total | Suma din factură |
6. Plată Furnizor — Stingerea datoriei
Unde: Din factura furnizorului → buton Înregistrează Plată
Câmpuri plată:
- Suma
- Data plății
- Mod de plată (virament, cash, etc.)
- Referință tranzacție (număr OP / extras bancă)
- Status aprobare plată (dacă e activ fluxul de aprobare)
Plăți multiple:
Se pot înregistra plăți parțiale succesive — fiecare e logată în pur_invoice_payment. Factura trece în partially_paid și ulterior în paid când totalul e acoperit.
Ce se creează automat
| Eveniment | Se creează automat |
|---|---|
| RFQ aprobat | Email notificare furnizori; sync articole în catalog |
| Ofertă acceptată | Link pur_orders.estimate → oferta câștigătoare |
| PO aprobat | Hook create_goods_receipt → aviz de recepție inițiat |
| Aviz recepție salvat | Stoc actualizat în depozit; delivery_status actualizat pe PO |
PO order_status → 2 |
delivery_status setat la 1 cu data curentă |
| Plăți cumulate = total factură | payment_status → paid automat |
Puncte unde fluxul poate bloca
| Problemă | Cauză probabilă | Soluție |
|---|---|---|
| Furnizorul nu vede portalul | Contul de furnizor nu e creat sau nu are acces | Verifică /admin/purchase/vendors → email acces portal |
| Avizul de recepție nu se generează | Hook dezactivat sau PO neaprobat | Aprobă PO mai întâi; verifică setări modul |
| Stocul nu se actualizează | Depozit neasociat pe aviz | Completează câmpul depozit pe avizul de recepție |
Factura furnizorului rămâne unpaid |
Plata nu a fost înregistrată în CRM | Adaugă înregistrarea plății manual din factură |
| Două avize pentru același PO | Livrare parțială neîncadrată corect | Normal — avizele parțiale se sumează; verifică delivery_status |
Rapoarte relevante
- Rapoarte Achiziții —
/admin/purchase/myreports— cheltuieli pe furnizor, perioadă, categorie - Lista Comenzi Achiziție — filtre pe
delivery_statuspentru comenzile nelivrate - Istoric Inventar —
/admin/warehouse/warehouse_history— intrări de stoc per furnizor