Workflow: Full Commercial Cycle
Modules involved: Leads · Opportunities · Proposals · Sales Orders (Sales Orders) · Warehouse · Purchase · Invoices · Payments · Innoship
Who uses it: Vânzări · Depozit · Achiziții · Financiar
Durata tipică: Zile – săptămâni (de la lead la livrare și plată)
Overview
Fluxul comercial complet — de la primul contact cu prospectul până la rotația stocului după livrare. Acoperă vânzarea, verificarea stocului, aprovizionarea pentru lipsuri (backorder manual), recepția de la furnizori, livrarea la client cu aviz și factură, și gestionarea stocului rezidual.
Important — limitări de automatizare cunoscute:
CRMConnect automatizează parțial acest ciclu. Trei puncte necesită intervenție manuală: (1) crearea RFQ-ului la stoc insuficient, (2) legătura directă comandă vânzare ↔ comandă achiziție nu există în tabele, (3) reaprovizionarea automată la stoc minim nu este implementată — minimul configurat este informativ.
Diagrama completă a fluxului
[LEAD]
│ captare: formular / email pipe / Facebook / manual
│ ↓
[OPORTUNITATE]
│ calificare, valoare estimată, probabilitate
│ ↓
[PROPUNERE (Proposal)]
│ Ciornă → Trimisă → Acceptată
│ ↓ Convert
[COMANDĂ DE VÂNZARE (Sales Order/Sales Order)]
│ status: Draft(1) → Sent(2) → Accepted(4) → Invoiced
│ ↓ Convert to Invoice
[FACTURĂ CLIENT — Draft]
│
├──────────────────────────────────────────────────────────────
│ VERIFICARE STOC (la crearea avizului de livrare)
│
│ inventory_manage.inventory_number ≥ cantitate comandată?
│
├─── DA → stoc suficient ─────────────────────────────────────┐
│ │
└─── NU → stoc insuficient ───────────────────────────────────┤
│ │
│ [BACKORDER — intervenție manuală] │
│ Agent identifică lipsa → │
│ │
│ [CERERE DE OFERTĂ (RFQ)] │
│ status: Draft(1) → Approved(2) │
│ ↓ │
│ [OFERTĂ FURNIZOR (Quotation)] │
│ status: Pending(1) → Accepted(2) │
│ ↓ │
│ [COMANDĂ ACHIZIȚIE (Purchase Order)] │
│ trimisă furnizorului │
│ ↓ │
│ [AVIZ RECEPȚIE (Goods Receipt)] │
│ marfă sosită → stoc actualizat │
│ ↓ │
│ [FACTURĂ FURNIZOR (Vendor Invoice)] │
│ payment_status: unpaid → paid │
│ ↓ │
└──────────→ STOC DISPONIBIL ────────────────────┘
│
↓
[AVIZ DE LIVRARE (Delivery Note)]
creat din factură client
approval: 0=Draft → 1=Approved
stoc −= cantitate livrată
↓
[PACKING LIST]
dimensiuni colet + greutate
↓
[AWB INNOSHIP]
generat prin API curier
↓
[AVIZ ÎNSOȚIRE trimis clientului]
document PDF cu produsele livrate
↓
[FACTURĂ CLIENT — Trimisă]
status: Trimisă → Parțial plătită → Plătită
↓
[PLATĂ CLIENT ÎNCASATĂ ✓]
↓
[ROTAȚIE STOC]
sold actualizat în warehouse_history
verificare stoc minim (inventory_commodity_min)
dacă sub minim → agent creează RFQ nou
Pas cu pas detaliat
Faza 1 — Vânzare: Lead → Comandă de vânzare
1.1 Lead
Unde: /admin/leads
Prospectul intră prin orice canal (formular, Facebook Lead Ads, email pipe, import, manual). Agentul SDR îl qualifică și actualizează statusul prin pipeline.
Câmpuri esențiale pentru continuarea fluxului:
- Companie + persoană de contact
- Email (pentru trimiterea propunerii)
- Sursă (pentru raportare ROI)
1.2 Oportunitate
Unde: /admin/leads (filtru Oportunități) sau /admin/opportunities
Din lead → Convertește în Oportunitate. Completezi:
- Valoarea estimată a tranzacției
- Data estimată de închidere
- Probabilitatea de conversie
Oportunitatea alimentează forecast-ul de vânzări și poate fi inclusă în Goals ca target de monitorizat.
1.3 Propunere
Unde: /admin/proposals
Din oportunitate → Crează Propunere. Ciclul:
| Status | Cod | Trigger |
|---|---|---|
| Ciornă | 6 | La creare |
| Trimisă | 4 | Buton Trimite → email cu link portal |
| Analizată | 1 | Clientul deschide link-ul |
| Acceptată | 3 | Client apasă Accept sau agent schimbă manual |
| Respinsă | 2 | Client sau agent |
La acceptare → disponibil butonul Convertește în Comandă de Vânzare (Sales Order).
1.4 Comandă de Vânzare — Sales Order (Sales Order)
Unde: /admin/estimates
Creată din propunere acceptată — toate liniile de produse/servicii se copiază automat.
Statusuri sales order (tblestimates.status):
| Cod | Status | Descriere |
|---|---|---|
| 1 | Draft | Ciornă neconfirmată |
| 2 | Sent | Trimisă clientului |
| 3 | Declined | Refuzată |
| 4 | Accepted / Invoiced | Acceptată și convertită în factură |
| 5 | Expired | Data expirare depășită |
Câmpuri cheie:
invoiceid— completat automat după conversie în facturăinvoiced_date— timestamp-ul conversiei
La acceptarea clientului:
Dacă estimate_auto_convert_to_invoice_on_client_accept = 1 → factura se generează automat.
Altfel → buton manual Convertește în Factură.
Faza 2 — Verificarea stocului
Când: La crearea Avizului de Livrare din factură
Cum funcționează:
Sistemul apelează get_inventory_by_commodity_and_warehouse(commodity_code, warehouse_id) și verifică:
dacă inventory_manage.inventory_number < cantitate_comandată:
flag_export_warehouse = 0 → avizul de livrare NU se poate aproba
Important — fără rezervare automată:
Stocul NU este rezervat la crearea comenzii de vânzare. Este verificat și scăzut abia la aprobarea avizului de livrare. Între comanda de vânzare și livrare, stocul poate fi consumat de alte ordine.
Stoc minim configurat — referință informativă:
Tabelul inventory_commodity_min stochează:
inventory_number_min— pragul de alertăinventory_number_max— nivelul țintă la reaprovizionare
Aceste valori nu declanșează automat nicio acțiune. Agentul trebuie să verifice manual și să creeze RFQ când constată că stocul a coborât sub minim.
Unde verifici stocul: /admin/warehouse/warehouse_history sau din fișa produsului (Commodities) → sold curent per depozit.
Faza 3 — Backorder: Aprovizionare pentru lipsuri (Manual)
Această fază se parcurge doar dacă stocul este insuficient. Dacă stocul există, treci direct la Faza 4.
CRMConnect nu are un mecanism automat de backorder. Fluxul de aprovizionare se inițiază manual de agentul de achiziții.
3.1 Cerere de Ofertă (RFQ)
Unde: /admin/purchase/purchase_request
Agentul creează RFQ specificând produsele și cantitățile lipsă față de comanda de vânzare. Documentul de referință (comanda de vânzare) se notează în câmpul de descriere sau note interne.
Statusuri RFQ:
| Cod | Status |
|---|---|
| 1 | Draft |
| 2 | Approved — trimis la furnizori |
| 3 | Rejected |
| 4 | Canceled |
Legătura cu comanda de vânzare: Nu există câmp FK direct în tabele. Convenție recomandată: menționează numărul comenzii de vânzare în titlul sau descrierea RFQ-ului pentru trasabilitate manuală.
3.2 Oferte de la furnizori (Quotations)
Unde: /admin/purchase/myquotations
Furnizorii răspund prin portal sau agentul introduce ofertele primite. Poți compara mai multe oferte pentru același RFQ înainte de selecție.
| Cod | Status |
|---|---|
| 1 | Pending — primit, neevaluat |
| 2 | Accepted — oferta câștigătoare |
3.3 Comandă Achiziție (Purchase Order)
Unde: /admin/purchase/purchase_order
Creată din oferta acceptată. Trimisă furnizorului cu PDF + link portal.
Statusuri PO:
| Câmp | Cod | Descriere |
|---|---|---|
status |
1 | Draft |
status |
2 | Approved — confirmat furnizorului |
status |
3 | Rejected |
status |
4 | Canceled |
order_status |
1 | Not Started |
order_status |
2 | In Progress |
order_status |
3 | Completed |
delivery_status |
0 | Nelivrat |
delivery_status |
1 | Livrat |
3.4 Aviz Recepție de la furnizor (Goods Receipt Note)
Unde: /admin/warehouse/manage_purchase
Creat automat la aprobarea PO (dacă auto_create_goods_received = 1) sau manual.
La aprobare (approval = 1):
- Stocul crește:
inventory_manage.inventory_number += cantitate_recepționată - Tranzacție înregistrată:
goods_transaction_detail.status = 1(Receipt) - Tracking lot:
lot_number,date_manufacture,expiry_date
Câmpuri critice pentru rotația stocului:
| Câmp | Note |
|---|---|
lot_number |
Identificator lot — baza FIFO |
date_manufacture |
Data fabricației |
expiry_date |
Data expirare — avertizare stoc perisabil |
warehouse_id |
Depozitul destinație |
3.5 Factură Furnizor (Vendor Invoice)
Unde: /admin/purchase/myinvoices
Primită de la furnizor după recepție. payment_status: unpaid → partially_paid → paid.
Plata furnizorului se înregistrează în pur_invoice_payment.
Faza 4 — Livrare la client
4.1 Factură Client (dinaintea livrării)
Unde: /admin/invoices
Convertită din Comanda de Vânzare (Sales Order). La creare:
tblestimates.invoiceid = invoice_idtblestimates.status = 4(Invoiced)- Dacă
auto_create_goods_delivery = 1→ Avizul de Livrare se creează automat
Statusuri factură:
| Cod | Status |
|---|---|
| 6 | Draft |
| 1 | Netrimisă |
| 3 | Parțial plătită |
| 2 | Plătită |
| 4 | Întârziată |
| 5 | Anulată |
4.2 Aviz de Livrare (Delivery Note — Aviz Însoțire)
Unde: /admin/warehouse/manage_delivery
Creare automată din factură (dacă opțiunea e activă) prin metoda:auto_create_goods_delivery_with_invoice(invoice_id)
Câmpuri setate automat:
invoice_id= ID factura client- Liniile de produse copiate din itemele facturii
warehouse_id= depozitul configurabil
Verificare stoc la creare:
- Dacă stoc insuficient →
flag_export_warehouse = 0→ avizul blocat - Agentul vede avertizarea și inițiază Faza 3 (backorder)
- Odată stocul aprovizionat → revenire la aviz → aprobare
Tipuri de livrare:
type_of_delivery = 'total'— livrare completătype_of_delivery = 'partial'— livrare parțială (un al doilea aviz ulterior)
La aprobare (approval = 1):
- Stocul scade:
inventory_manage.inventory_number -= cantitate - Tranzacție:
goods_transaction_detail.status = 2(Delivery) - FIFO: loturile selectate în ordinea intrării (
ORDER BY id ASC)
4.3 Packing List + AWB Innoship
Unde: /admin/warehouse/manage_packing_list + /admin/innoship/awb
Din avizul de livrare aprobat:
- Packing List — selectezi cantitățile, completezi dimensiuni (lungime, lățime, înălțime, greutate)
- AWB generat prin API Innoship — returnează număr tracking
- Status packing list:
wh_ready_to_deliver→wh_in_transit→wh_delivered
Avizul Însoțire — documentul PDF care însoțește marfa fizic, trimis și clientului cu:
- Lista produselor livrate + cantități
- Numărul AWB pentru tracking
- Datele expeditorului și destinatarului
4.4 Factură Client — Trimitere și Plată
Factura trimisă clientului (email + PDF + link portal). Clientul poate plăti online (dacă gateway configurat) sau prin virament.
La plată completă:
status = 2(Plătită)- Activitate logată în istoricul clientului
- Dacă
cancelled_invoice_reverse_inventory = 1și factura anulată ulterior → stocul se reface
Faza 5 — Rotația stocului
5.1 Principiul FIFO
CRMConnect aplică FIFO prin tracking de lot:
- La recepție: fiecare lot primit are
lot_number,date_manufacture,expiry_date - La livrare: loturile sunt selectate în ordinea înregistrării (
ORDER BY id ASCpegoods_receipt_detail) - Rezultat: marfa cea mai veche / primul lot intrat → primul livrat
Vizualizare: Fișa produsului → tab Inventory → solduri per lot per depozit.
5.2 Stocul minim — monitorizare manuală
Unde: /admin/warehouse/warehouse_history + Commodities → edit → câmpuri min/max
Tabelul inventory_commodity_min stochează:
| Câmp | Descriere |
|---|---|
inventory_number_min |
Prag minim alertă |
inventory_number_max |
Nivel target la reaprovizionare |
Workflow recomandat pentru reaprovizionare periodică:
- Setează
inventory_number_minpe fiecare produs activ - Rulează periodic raportul Stoc curent filtrat sub minim
- Agentul de achiziții creează RFQ pentru produsele sub prag
- Cantitatea comandată =
inventory_number_max - inventory_number_curent
Nu există trigger automat. Verificarea se face manual sau poate fi automatizată extern via webhook + Zapier (dacă stocul e sub minim, Zapier creează task de reaprovizionare).
5.3 Produse perisabile — alerte de expirare
Produsele cu expiry_date completat pe avizul de recepție pot fi monitorizate:
- Filtru în lista de produse după
expiry_date < data curentă + N zile - Livrarea le selectează în FIFO — cele mai apropiate de expirare, primele ieșite
- Loturile expirate → Pierderi & Ajustări (
/admin/warehouse/loss_adjustment) cutype = 'loss'
5.4 Ajustări de stoc
Discrepanțe constatate la inventarul fizic periodic:
- Inventar fizic (
/admin/warehouse/physical_inventory) — numărare și reconciliere - Pierderi & Ajustări (
/admin/warehouse/loss_adjustment) — corecții punctuale - Retur de la client (
/admin/warehouse/manage_order_return_receipt) — marfă returnată reintrată în stoc
Harta documentelor și statusurilor
VÂNZARE:
tblestimates.status: 1=Draft 2=Sent 3=Declined 4=Invoiced 5=Expired
tblinvoices.status: 6=Draft 1=Unpaid 3=Partial 2=Paid 4=Overdue 5=Cancelled
tblproposals.status: 6=Draft 4=Sent 1=Open 3=Accepted 2=Declined 5=Revised
DEPOZIT (ieșiri):
goods_delivery.approval: 0=Draft → 1=Approved
goods_delivery.type_of_delivery: 'total' / 'partial'
goods_transaction_detail.status: 2=Delivery, 3=Issue
ACHIZIȚIE:
pur_request.status: 1=Draft 2=Approved 3=Rejected 4=Canceled
pur_estimates.status: 1=Pending 2=Accepted
pur_orders.status: 1=Draft 2=Approved 3=Rejected 4=Canceled
pur_orders.order_status: 1=NotStarted 2=InProgress 3=Completed
pur_invoices.payment_status: unpaid / partially_paid / paid
DEPOZIT (intrări):
goods_receipt.approval: 0=Draft → 1=Approved
goods_transaction_detail.status: 1=Receipt
CURIER:
wh_packing_lists.delivery_status: wh_ready_to_deliver → wh_in_transit → wh_delivered
Ce se creează automat vs. manual
| Pas | Automat? | Condiție |
|---|---|---|
| Lead din formular web | ✅ Automat | Formular embed activ |
| Propunere → Factură | ✅ Automat (opțional) | estimate_auto_convert_to_invoice_on_client_accept = 1 |
| Factură → Aviz Livrare | ✅ Automat (opțional) | auto_create_goods_delivery = 1 |
| PO → Aviz Recepție | ✅ Automat (opțional) | auto_create_goods_received = 1 |
| Backorder la stoc insuficient | ❌ Manual | Agent creează RFQ |
| Comandă achiziție din comandă vânzare | ❌ Manual | Nu există FK direct |
| Reaprovizionare la stoc minim | ❌ Manual | Trigger automat inexistent |
| Aviz Livrare → AWB Innoship | ✅ Automat | Packing list aprobat + API key configurat |
| Stoc decrementat | ✅ Automat | La aprobarea avizului de livrare |
| Stoc incrementat | ✅ Automat | La aprobarea avizului de recepție |
Puncte critice de atenție
| Risc | Impact | Mitigare |
|---|---|---|
| Stocul nerezerват la comanda de vânzare | Stoc consumat de alt ordin înainte de livrare | Procesează livrările în ordinea priorității; verifică disponibil zilnic |
| Backorder fără legătură FK cu comanda de vânzare | Pierdere trasabilitate furnizor ↔ client | Notează manual numărul comenzii de vânzare în titlul RFQ |
| FIFO corect doar cu lot_number completat la recepție | Produse expirate livrate dacă loturile nu sunt înregistrate | Impune completarea lot_number și expiry_date la toate recepțiile |
| Stoc minim nemonitorizat | Rupturi de stoc nedetectate | Verificare săptămânală raport stoc vs minim |
| Aviz livrare blocat (stock = 0) | Livrare întârziată | Alert vizibil în UI; procedura de escaladare la achiziții definită |
| Factură anulată după livrare | Stocul nu se reface dacă cancelled_invoice_reverse_inventory = 0 |
Activează opțiunea SAU crează ajustare manuală de stoc |
Trasabilitatea completă a unui ordin
Pornind de la numărul comenzii de vânzare, poți urmări:
Sales Order #EST-001
└── Invoice #INV-010 (tblestimates.invoiceid = 10)
└── Delivery Note #XK-005 (goods_delivery.invoice_id = 10)
└── Packing List #PL-003
└── AWB #FAN-123456 (wh_omni_shipments)
└── Payment #PAY-007 (tblinvoices → tblinvoicepayments)
RFQ #RFQ-002 [creat manual pentru lipsuri din EST-001]
└── Quotation #Q-004 (pur_estimates)
└── Purchase Order #PO-006 (pur_orders)
└── Goods Receipt #NK-008 (goods_receipt, pr_order_id = PO-006)
└── Vendor Invoice #VI-009 (pur_invoices)
Rapoarte cheie pentru monitorizare
| Raport | URL | Ce monitorizezi |
|---|---|---|
| Comenzi vânzare pending | /admin/estimates/list_estimates?status=2 |
Comenzi trimise, neconfirmate |
| Facturi neîncasate | /admin/invoices/list_invoices?status=1 |
Cash flow client |
| Facturi întârziate | /admin/invoices/list_invoices?status=4 |
Colectare creanțe |
| Comenzi achiziție nelivrate | /admin/purchase/purchase_order?delivery_status=0 |
Furnizori în întârziere |
| Stoc curent vs minim | Commodities + inventory_commodity_min |
Rupturi iminente |
| Istoric tranzacții stoc | /admin/warehouse/warehouse_history |
Audit mișcări |
| Avize livrare pending | /admin/warehouse/manage_delivery |
Livrări blocate |
| AWB-uri în tranzit | /admin/innoship/awb |
Status curierat |
Module implicate — documentație detaliată
Vânzare: Leads · Opportunities · Proposals · Sales Orders / Sales Orders · Invoices · Payments
Depozit: Delivery Notes · Goods Receipt Note · Packing Lists · Inventory History · Loss & Adjustments · Physical Inventory
Achiziție: RFQ · Received Quotations · Purchase Orders · Vendor Invoices
Curier & Integrări: Innoship Couriers · WooCommerce · Webhooks
Workflow-uri înrudite: Lead → Cash · Purchase to Pay · OmniSales Fulfillment · Warehouse Inbound → Outbound
Fiecare etapă din ciclul comercial complet se completează automat din cea anterioară când se convertește corect — folosiți acțiunile de Conversie în loc să creați documente noi manual pentru a păstra lanțul complet trasabil de la lead la plată.
Ciclul complet funcționează numai când fiecare etapă este completată în ordine. Emiterea unei facturi fără o Comandă de Vânzare confirmată sau crearea unui contract după facturare rupe lanțul de trasabilitate pe care auditorii și reglementatorii se așteaptă să-l vadă.