Workflow: E-commerce Fulfillment — De la Comandă Online la Livrare
Modules involved: OmniSales · WooCommerce / Shopify · Warehouse · Innoship · Couriers · Invoices · eFactura · Returns · Clients · Price Lists
Who uses it: Operator comenzi, Depozit, Logistică, Financiar, E-commerce Manager
Durata tipică: Ore – 1-2 zile lucratoare (de la plasarea comenzii online la predarea curierului)
Overview
Fluxul e-commerce fulfillment acoperă întregul ciclu de viață al unei comenzi plasate pe un magazin online integrat cu CRMConnect. Comenzile sosesc automat din WooCommerce sau Shopify prin webhook sau sincronizare cron, sunt procesate în OmniSales, depozitul execută picking și packing, curierul primește coletul prin AWB generat automat (via Innoship sau direct Cargus/FanCourier), iar clientul primește factura și notificarea de expediere. Retururile sunt tratate printr-un sub-flux dedicat.
Diferența față de OmniSales Fulfillment — workflow-ul generic de comenzi — este integrarea bidirecțională cu platforma e-commerce: statusurile se actualizează înapoi în WooCommerce/Shopify, clienții sunt sincronizați automat, iar prețurile pe canal sunt controlate prin Price Lists.
Diagrama fluxului (ASCII)
[COMANDĂ ONLINE (WooCommerce / Shopify)]
│ webhook → OmniSales → Comandă Nouă
│ sau cron sync (la interval configurat)
│ sincronizare: client, produse, adresă, metodă plată
│ status OmniSales: 0 - Draft → 1 - New
│
↓
[VALIDARE COMANDĂ]
│ status: 2 - Processing
│ verificare stoc: qty_available vs qty_ordered
│ verificare client: creat/asociat în Clients
│ ├── Stoc OK → continuă
│ └── Stoc insuficient → alertă operator → hold (9) sau comandă parțială
│
↓
[PICKING & PACKING]
│ Aviz de Livrare (Goods Delivery Note) generat automat
│ Packing List creat din aviz
│ operator depozit: confirmă fiecare articol (scanat sau bifat manual)
│ status depozit: wh_ready_to_deliver
│
↓
[EXPEDIERE — AWB]
│ AWB generat prin Innoship (recomandat) sau Couriers direct
│ etichetă printată → lipită pe colet
│ status OmniSales: 4 - Shipping · status depozit: wh_in_transit
│ tracking number trimis înapoi la WooCommerce/Shopify (sync automat)
│
↓
[FACTURARE]
│ factură generată automat la Shipping (dacă create_invoice = on)
│ email cu factură PDF + număr AWB → client
│ eFactura → ANAF dacă client B2B cu CIF valid (automat)
│
↓
[LIVRARE CONFIRMATĂ]
│ tracking Innoship/Curier → status packing list: wh_delivered
│ status OmniSales: 5 - Delivered/Completed
│ status actualizat în WooCommerce/Shopify: Completed
│
├── [RETUR (dacă e cazul)]
│ │ client solicită retur în fereastra permisă
│ │ operator creează Goods Return Receipt
│ │ stocul returnat intrat înapoi în depozit (sau carantină)
│ │ credit note emis sau voucher / rambursare
│
[COMANDĂ FINALIZATĂ ✓]
Pas cu pas
1. Sincronizarea comenzii din platforma e-commerce
Unde: /admin/omni_sales/order_list · /admin/woocommerce · /admin/myshopify
Comenzile din magazinul online ajung în CRM pe două căi:
| Metodă | WooCommerce | Shopify | Frecvență |
|---|---|---|---|
| Webhook (recomandat) | La plasarea comenzii — push automat | La plasarea comenzii — push automat | Real-time |
| Cron sync (fallback) | Rulează periodic; preia comenzile noi | Rulează periodic; preia comenzile noi | Configurat (ex. 15 min) |
| Sync manual | Buton din /admin/woocommerce/stores |
Buton din /admin/myshopify |
La cerere |
Ce se sincronizează automat:
- Date comandă: produse, cantități, prețuri, discount-uri, metoda de plată, adresa de livrare
- Client: dacă există în CRM după email → asociat; dacă nu → creat automat în Clients
- Statusul comenzii din platforma online mapeze la statusul OmniSales (mapare configurabilă pe canal)
Configurare canal: /admin/omni_sales/omni_sales_channel → Editează canalul → setezi:
create_invoice: on/off (factură automată la expediere)- Mapare statusuri e-commerce ↔ OmniSales
- Price List asociată canalului e-commerce
- Depozitul sursă implicit
Câmpuri cheie pe comanda OmniSales:
| Câmp | Descriere |
|---|---|
id_contact |
Legătura cu fișa clientului din Clients |
channel_id |
Canalul de vânzare (WooCommerce/Shopify/manual) |
external_order_id |
ID-ul comenzii în platforma externă (pentru sync bidirectional) |
| Produse + cantități + prețuri | Copiate din comanda online |
| Adresă livrare | Stocată pe comandă |
| Metodă plată | Card online, ramburs, transfer, etc. |
2. Validarea comenzii și verificarea stocului
Unde: /admin/omni_sales/order_list → deschide comanda
Statusurile comenzii OmniSales:
| Cod | Status | Descriere | Acțiune necesară |
|---|---|---|---|
| 0 | Draft | Comandă nouă, neconfirmată | Review operator |
| 1 | New | Intrată în sistem, în așteptare procesare | — |
| 2 | Processing | În verificare stoc și confirmare | Operator validează |
| 3 | Confirmed | Confirmată, gata pentru depozit | Aviz generat automat |
| 4 | Shipping | Colet preluat de curier | AWB emis |
| 5 | Delivered | Livrată și finalizată | — |
| 8 | Cancelled | Anulată | Stoc eliberat |
| 9 | On Hold | Suspendată temporar | Intervenție manuală |
| 14 | Paid | Plătită (util pentru plată în avans) | — |
| 15 | Ready | Pregătită pentru livrare | Depozit confirmă |
Verificare stoc:
Sistemul verifică disponibilul pentru fiecare linie de produs înainte de a crea avizul de livrare:
dacă inventory_manage.inventory_number < cantitate_comandată:
flag_export_warehouse = 0 → aviz blocat, alertă operator
Dacă stocul e insuficient:
- Comanda trece pe status On Hold (9)
- Operatorul vede avertizarea în UI
- Opțiuni: livrare parțială (
type_of_delivery = 'partial'), aprovizionare urgentă, sau anulare
Aprobare comandă (opțional):
Dacă activat pe canal: approve_status → 0 (pending) → 1 (aprobat) → -1 (respins). Util pentru comenzi de valoare mare sau clienți noi fără istoric.
3. Picking și Packing — pregătirea coletului
Unde: /admin/warehouse/manage_delivery · /admin/warehouse/manage_packing_list
3.1 Aviz de Livrare (Goods Delivery Note)
Creare:
- Automată — când comanda atinge statusul Confirmed (3) sau Shipping (4) (dacă opțiunea e activă pe canal)
- Manuală — din comanda confirmată → buton Generează Aviz Livrare
Statusuri aviz de livrare:
| Status | Descriere |
|---|---|
ready_for_packing |
Creat, await picking în depozit |
packed |
Produsele împachetate, packing list creat |
Tipuri de livrare:
total— livrare completă dintr-o datăpartial— dacă nu ai toate produsele; se generează al doilea aviz/packing list ulterior
3.2 Packing List
Creare: Din avizul de livrare → buton Crează Packing List
Operatorul de depozit:
- Preia lista produselor de ridicat
- Confirmă fizic fiecare articol (scanare cod de bare sau bifat manual)
- Ambalează coletul și completează dimensiunile
Câmpuri obligatorii pentru generarea AWB:
| Câmp | Unde se completează | Note |
|---|---|---|
| Greutate (kg) | Packing List → edit | Obligatoriu pentru orice curier |
| Lungime (cm) | Packing List → edit | Obligatoriu Innoship/Cargus/FanCourier |
| Lățime (cm) | Packing List → edit | Obligatoriu |
| Înălțime (cm) | Packing List → edit | Obligatoriu |
| Serviciu curier | Packing List → selectie | Standard, Express, Sameday, etc. |
| Adresă livrare | Copiată din comandă | Editabilă dacă clientul a comunicat altă adresă |
Statusuri packing list:
| Status | Descriere |
|---|---|
wh_ready_to_deliver |
Creat, în așteptare AWB |
wh_in_transit |
AWB generat, colet preluat de curier |
wh_delivered |
Confirmat livrat de curier |
Packing parțial: type_of_packing_list = 'partial' — livrezi ce ai disponibil acum, restul urmează. Clientul primește notificare separată pentru fiecare colet.
4. Generarea AWB-ului de transport
Unde: Buton Generează AWB din packing list aprobat
Opțiunea A — Innoship (agregator)
URL configurare: /admin/innoship/settings
Curierii suportați prin Innoship: Fan Courier, DPD, Cargus, Sameday, GLS, DHL și alții (conform contracte active Innoship).
Condiții prealabile:
innoship_api_keyșiinnoship_external_idconfigurate- Curier și serviciu selectate în packing list
- Dimensiuni și greutate completate
- Adresă livrare validă în baza de date Innoship (localitate recunoscută)
Ce se întâmplă la generare AWB:
- CRM trimite request la API Innoship cu datele coletului
- Innoship returnează: număr AWB + cod tracking
- CRM creează înregistrare în
wh_omni_shipments - Status packing list →
wh_in_transit - Status comandă OmniSales →
Shipping (4) - Status actualizat în WooCommerce/Shopify automat (sync bidirectional)
- AWB disponibil pentru printare PDF A4 sau termic 100×150mm
- Log creat în
innoship_audit_log
Opțiunea B — Couriers direct (fără agregator)
URL: /admin/couriers
| Curier | Condiție |
|---|---|
| Cargus | Contract direct + API key Cargus configurat |
| Fan Courier | Contract direct + credențiale FanCourier API |
Avantaj: fără comision agregator. Dezavantaj: mai puțini curierii disponibili, fiecare configurate separat.
| Soluție | Curierii disponibili | Când o folosești |
|---|---|---|
| Innoship | Fan Courier, DPD, Cargus, Sameday, GLS, DHL + alții | Ai contract Innoship, vrei flexibilitate multi-curier |
| Couriers direct | Cargus, Fan Courier | Ai contracte directe, nu dorești intermediar |
Tracking: Din lista AWB (/admin/innoship/awb sau /admin/couriers/awb) statusul se actualizează automat prin polling periodic.
5. Facturarea — emiterea documentului fiscal
Unde: /admin/invoices
Moduri de generare factură:
| Mod | Când | Configurare |
|---|---|---|
| Automată la Shipping | Când comanda OmniSales atinge status 4 | create_invoice = on pe canal |
| Automată la confirmare plată | La status Paid (14) | Util pentru plată card online în avans |
| Manuală | Operator generează din comandă | Buton Crează Factură |
Conținut factură:
- Liniile de produse cu cantități și prețuri din comandă
- Reduceri aplicabile (din Price List sau manual)
- TVA conform configurarii produsului
- Date client (adresa de facturare din profilul clientului)
Notificare client: La emiterea facturii: email automat cu PDF factură atașat + numărul AWB pentru tracking.
eFactura (B2B cu CIF)
Dacă clientul este persoană juridică cu CIF valid:
- eFactura generată automat în format XML conform ANAF
- Transmisă automat la ANAF prin modulul eFactura
- Numărul de înregistrare ANAF returnat și stocat pe factură
Unde verifici: /admin/invoices → factură → tab eFactura → status transmitere
6. Confirmarea livrării
Tracking automat: Innoship sau curierul direct confirmă livrarea prin API → statusuri actualizate automat:
| Document | Status anterior | Status final |
|---|---|---|
| Packing List | wh_in_transit |
wh_delivered |
| Comandă OmniSales | Shipping (4) |
Delivered (5) |
| Comandă WooCommerce/Shopify | Processing/Shipped | Completed |
Stocul se scade definitiv din depozit la aprobarea avizului de livrare (nu la livrarea fizică). La confirmarea curier → actualizare doar statusuri, nu stoc.
7. Retururile — sub-fluxul de Goods Return
Unde: /admin/warehouse/manage_order_return_receipt
Fereastra de retur: configurabilă per canal (implicit 30 zile de la livrare).
Pașii fluxului de retur:
| Pas | Acțiune | Cine |
|---|---|---|
| 1 | Client solicită retur (email, telefon, portal) | Client |
| 2 | Operator verifică eligibilitatea (în termen, produs nefolosit) | Operator comenzi |
| 3 | Goods Return Receipt creat în CRM (legat la comanda originală) | Operator |
| 4 | Client trimite coletul înapoi (AWB retur dacă e cazul) | Client |
| 5 | Depozit recepționează marfa returnată | Depozit |
| 6 | Stocul returnat intrat în depozit (sau carantină) | Automat la aprobare |
| 7 | Credit Note emis SAU voucher/rambursare procesată | Financiar |
Tipuri de retur:
| Tip | Descriere |
|---|---|
fully |
Comanda returnată integral |
partially |
Parte din produse returnate |
manual |
Ajustare manuală (ex. produs defect fără retur fizic) |
Tabel relevant: wh_order_returns → original_order_id (legătura la comanda OmniSales)
Credit Note: Emis automat sau manual din Goods Return Receipt → apare în istoricul financiar al clientului.
Ce se creează automat
| Eveniment trigger | Document creat automat | Condiție |
|---|---|---|
| Comandă plasată în WooCommerce/Shopify | Comandă OmniSales + Client (dacă nou) | Webhook activ sau cron sync |
| Comandă → status Confirmed (3) | Aviz de Livrare cu liniile comenzii | Opțiune auto-create activă pe canal |
| Packing List aprobat + Generează AWB | wh_omni_shipments, log Innoship, etichetă AWB |
API Innoship/Curier configurat |
| AWB generat | Status comandă → Shipping (4), sync în WooCommerce/Shopify | — |
Comandă → status Shipping (4) cu create_invoice = on |
Factură cu liniile comenzii | create_invoice = on pe canal |
| Factură emisă + client B2B cu CIF | eFactura XML trimisă la ANAF | Modulul eFactura activ |
| Curier confirmă livrare | Status → Delivered (5); sync în platforma online | Tracking Innoship polling |
| Goods Return Receipt aprobat | Stoc recreditat în depozit | Aprobare manuală |
Puncte unde fluxul poate bloca
| Problemă | Cauză probabilă | Soluție |
|---|---|---|
| Comanda nu apare din WooCommerce | Webhook neconfigurat sau cron oprit | Verifică /admin/woocommerce/stores → webhook URL; restart cron |
| Comanda nu apare din Shopify | API credentials expirate sau Shopify webhook inactiv | Reconectează store din /admin/myshopify |
| Clientul nu e creat automat | Email duplicat sau câmp obligatoriu lipsă | Verifică maparea câmpurilor în setările canalului |
| Avizul de livrare nu se generează | Opțiunea auto-create dezactivată pe canal | Activează din /admin/omni_sales/omni_sales_channel → Edit |
| Aviz de livrare blocat (stoc 0) | Stoc insuficient în depozit | Verifică avize de recepție pending; fă ajustare stoc sau livrare parțială |
| Eroare AWB Innoship — localitate necunoscută | Adresă client cu ortografie greșită | Editează adresa; verifică dacă localitatea e în baza Innoship |
| Eroare AWB — dimensiuni lipsesc | Câmpurile greutate/lungime/lățime/înălțime necompletate | Completează obligatoriu toate 4 câmpuri în packing list |
| Factura nu se generează automat | create_invoice = off pe canal |
Activează din /admin/omni_sales/omni_sales_channel → Edit canal |
| eFactura respinsă de ANAF | CIF invalid, XML malformat, duplicate | Verifică CIF-ul clientului; retrimitere manuală din tab eFactura |
| Status nu se sincronizează înapoi în WooCommerce | Credențiale API WooCommerce expirate sau WordPress actualizat | Reconectează store; verifică permisiunile API key-ului WooCommerce |
| Packing list parțial — al doilea colet uitat | Lipsă proces intern pentru livrări în două tranșe | Filtrează comenzile cu type_of_packing_list = 'partial' și status wh_ready_to_deliver |
Rapoarte relevante
| Raport | URL | Ce monitorizezi |
|---|---|---|
| Comenzi OmniSales per canal | /admin/omni_sales/report |
Volumul per WooCommerce/Shopify, statusuri, perioadă |
| Audit sincronizări | /admin/omni_sales/diary_sync |
Log complet sync WooCommerce/Shopify, erori |
| AWB-uri în tranzit | /admin/innoship/awb |
Status curierat live; AWB-uri nelivrate |
| Innoship Audit Log | /admin/innoship/audit |
Toate operațiunile AWB, erori API |
| Facturi generate din comenzi online | /admin/invoices filtrat pe canal |
Reconciliere financiară e-commerce |
| Istoric mișcări stoc | /admin/warehouse/warehouse_history |
Mișcări generate de comenzile online |
| Avize livrare blocate | /admin/warehouse/manage_delivery filtru flag_export_warehouse = 0 |
Comenzi cu stoc insuficient |
| Retururi | /admin/warehouse/manage_order_return_receipt |
Rate retur pe perioadă, per canal |
Module implicate — documentație detaliată
E-commerce & Comenzi: Omni Sales Orders · Sales Channels · WooCommerce · Shopify
Depozit: Delivery Notes · Packing Lists · Delivery Returns · Inventory History
Curierat: Innoship Couriers
Financiar: Invoices · Price Lists
Clienți: Clients
Workflow-uri înrudite: OmniSales Fulfillment · Purchase to Pay · Warehouse Inbound → Outbound