Workflow: Comision Agenți Vânzări
Module implicate: Invoices · Payments · Commission (Policy · Applicable Staff · Hierarchy · Receipt) · Sales Agent · Goals · DataPulse
Cine îl folosește: Manager Vânzări · Agenți de Vânzări · Administrator Financiar
Durata tipică: Instantaneu după plata facturii (trigger automat) + ciclu lunar pentru plata comisioanelor
Overview
Modulul Commission calculează automat comisionul datorat unui agent de vânzări în momentul în care o factură este plătită. Nu necesită nicio acțiune manuală pentru calculul propriu-zis — totul se declanșează prin hook-ul after_payment_added. Fluxul complet acoperă: configurarea politicii de comision, asignarea agenților la politici, calculul automat la plată, vizualizarea comisioanelor acumulate și plata efectivă prin emiterea unui Commission Receipt.
Atenție: Comisionul se calculează doar pe facturi standard din CRM (
tblinvoices). Facturile din modulul Sales Agent (sa_sale_invoices) nu declanșează comisionul.
Diagrama fluxului
[CONFIGURARE — o singură dată]
│
├── Commission Policy (tip 1–5, interval date, procent/scară)
├── Applicable Staff → asignare agent la politică
├── Hierarchy (opțional) → coordinator primește % din comisionul agentului
└── Opțiuni generale → calculate_after_days · payment_trigger_mode
│
↓
[FACTURARE]
│
├── Factură creată → sale_agent setat pe factură (sau pe client/grup)
└── Status factură: Draft → Sent
│
↓
[PLATĂ FACTURĂ — trigger automat]
│
├── Payment înregistrat → hook after_payment_added se declanșează
├── Sistem verifică: vârstă factură ≥ calculate_after_days?
├── Sistem verifică: payment_trigger_mode?
│ 'partial_allowed' (implicit) → orice plată > 0 generează comision
│ 'full_only' → comision doar dacă suma plăților = totalul facturii
├── Sistem verifică: factură eligibilă? (nu e stornată, status valid)
└── Sistem rezolvă agentul: sale_agent pe factură → customer_admin al clientului
→ commission_salesadmin_group (grup client → agent)
│
↓
[COMISION GENERAT]
│
├── Rând creat în tblcommission: staffid, invoice_id, amount, paid=0
├── Tip 1–4: calculat imediat per factură
└── Tip 5 (lunar/marjă): calculat de cron în ziua commission_month_close_day
│
↓
[APROBARE / VIZUALIZARE]
│
├── Manager → /admin/commission → vede comisioanele cu paid=0
├── Agent → vede propriile comisioane (permisiune commission_manage → view)
└── Rapoarte: commission_chart · staff_monthly_dashboard
│
↓
[PLATĂ COMISION]
│
├── Manager creează Commission Receipt: selectează comisioane neachitate
├── Receipt poate fi convertit în Expense (pentru evidență contabilă)
└── Comisioanele selectate → paid=1 în tblcommission
│
↓
[COMISION PLĂTIT ✓]
Pas cu pas
1. Configurare inițială (admin)
1a. Politica de comision
Unde: /admin/commission → Commission Policy → New Policy
Există 5 tipuri de politici (commission_policy_type):
| Tip | Denumire | Cum funcționează |
|---|---|---|
1 |
Ladder — total factură | Procente diferite pe tranșe de valoare totală a facturii |
2 |
Flat percentage | Procent fix aplicat la totalul facturii (sau profit, dacă amount_to_calculate=1) |
3 |
Per-produs cu tranșe cantitate | Procente diferite per produs în funcție de cantitate |
4 |
Ladder per produs | Scară pe valoarea produselor individuale |
5 |
Marjă lunară (staff monthly) | Calculat la finele lunii pe baza marjei nete; necesită staff_margin_settings JSON |
Câmpuri esențiale la creare:
| Câmp | Obligatoriu | Note |
|---|---|---|
name |
Da | Denumire descriptivă a politicii |
policy_scope |
Da | vendor (pentru furnizori/clienți) sau staff (pentru angajați) |
from_date / to_date |
Da | Intervalul de valabilitate al politicii |
commission_type |
Da | percentage sau sumă fixă |
payment_trigger_mode |
Da | partial_allowed (implicit) sau full_only |
calculate_after_days |
Nu | Zile de așteptare după plată înainte de calculul comisionului (0 = imediat) |
amount_to_calculate |
Nu | 0 = totalul facturii, 1 = profit (diferența față de costul produselor) |
commission_tax_mode |
Nu | without_tax (implicit) sau with_tax |
Important: Dacă
calculate_after_dayseste negativ, sistemul folosește automat 14 zile.
1b. Asignare agent la politică
Unde: /admin/commission → Applicable Staff → Add
Leagă un angajat (staffid) de o politică (commission_policy_id) prin tabelul tblcommission applicable_staff. Un agent poate fi asignat la mai multe politici cu date diferite.
Pentru comisioane de tip vendor/client: Applicable Client (se setează is_client=1 și commission_receiver_vendor_id pe fișa clientului).
1c. Ierarhie comisioane (opțional)
Unde: /admin/commission → Settings → Hierarchy
Permite unui coordinator să primească un procent din comisionul agentului din subordine:
| Câmp | Descriere |
|---|---|
salesman |
staffid agent de vânzări |
coordinator |
staffid coordinator/manager |
percent |
% din comisionul agentului pe care îl primește coordinatorul |
1d. Opțiuni generale
Unde: /admin/commission → Settings → Commission General
| Opțiune | Valoare implicită | Descriere |
|---|---|---|
commission_payment_trigger_mode |
partial_allowed |
Global (poate fi suprascris per politică) |
commission_calculate_after_days |
0 |
Zile de așteptare globale |
commission_cron_interval_minutes |
1440 (24h) |
Cron backup pentru comisioane ratate de hook |
commission_month_close_day |
1 |
Ziua lunii în care se calculează tip-5 (luna anterioară) |
2. Rezolvarea agentului pe factură
Când o factură este plătită, sistemul determină agentul în această ordine:
invoices.sale_agent— agentul setat direct pe facturătblcustomer_admins.staff_id— adminul de cont al clientului (dacăsale_agente gol)tblcommission_salesadmin_group— mapare grup client → agent (dacă primele două sunt goale)
Gotcha: Dacă niciunul din cele trei nu e configurat, nu se generează comision și nu apare nicio alertă. Verificați întotdeauna că facturile au
sale_agentsetat sau că clienții au customer admin.
3. Calculul automat la plată
Când se înregistrează o plată (/admin/invoices/:id → Add Payment sau via API), hook-ul after_payment_added apelează Commission_model::add_commission($payment_id).
Verificări efectuate de sistem (dacă oricare eșuează, comisionul NU se generează):
| Verificare | Detaliu |
|---|---|
| Vârsta facturii | Data facturii + calculate_after_days ≤ azi |
| Status factură | Statusul NU trebuie să fie în [5=cancelat, 6=draft, 7=credit note, 8=intern] |
| Stornare | Factura nu are credit note asociat |
| Trigger mode | Dacă full_only: suma tuturor plăților = totalul facturii |
Fallback cron: La fiecare commission_cron_interval_minutes minute, un job verifică facturile cu plăți care au ratat hook-ul și generează comisioanele lipsă.
Regenerare manuală (admin):
- Pe factură: butonul Regenerate Commission
- Bulk:
/admin/commission→ Recalculate (necesită permisiuneacommission → create)
4. Comisioane de tip 5 — Marjă lunară
Diferit față de tipurile 1–4: calculul nu se face per plată, ci lunar în cron.
În ziua commission_month_close_day a lunii (implicit ziua 1), run_staff_monthly_commissions() calculează pentru luna anterioară:
- Agregă toate facturile plătite din luna respectivă per agent
- Calculează marjă netă (
sales_net,avg_margin,avg_discount) - Aplică tier-urile din
staff_margin_settingsJSON - Scrie în
tblcommission_staff_monthly(status:draft) - Scrie detalii per factură în
tblcommission_staff_monthly_detail
5. Vizualizare și aprobare comisioane
Unde: /admin/commission
| Secțiune | Cine vede | Ce afișează |
|---|---|---|
| Commission List | Admin + commission_manage → view |
Toate comisioanele cu paid=0 |
| Staff Monthly Dashboard | Admin + commission_manage → view |
Sumar lunar per agent, status draft |
| Commission Chart | Admin + commission_manage → view |
Grafice evoluție comisioane |
| Agent propriu | Staff cu commission_manage → view |
Doar propriile comisioane |
6. Plata comisionului
Unde: /admin/commission → Commission Receipts → New Receipt
Pași:
- Selectați comisioanele neachitate (
paid=0) de inclus în plată - Completați:
amount,paymentmode,date,note,transactionid - Salvați → sistemul marchează toate
tblcommissionselectate cupaid=1 - Opțional: bifați Convert to Expense pentru a genera automat o cheltuială în modulul Expenses (pentru evidență contabilă)
Permisiuni necesare: commission_receipt → create + commission_receipt → view
Permisiuni necesare
| Rol / Permisiune | Acces |
|---|---|
| Admin | Acces complet la toate funcțiile |
commission_manage → view |
Vizualizare comisioane, grafice, rapoarte lunare |
commission → create |
Recalculare bulk |
commission → view_setting |
Acces la Settings |
commission_receipt → view/create/edit/delete |
Gestionare chitanțe plată |
commission_applicable_client → view/create/delete |
Gestionare applicable clients |
Gotchas
| Problemă | Cauză | Soluție |
|---|---|---|
| Comision negenererat după plată | sale_agent lipsă pe factură, politică expirată sau calculate_after_days neîndeplinit |
Verificați câmpul sale_agent pe factură + datele politicii + setarea after_days |
full_only nu generează la plată parțială |
Comportament corect — comisionul apare doar la plata integrală | Schimbați în partial_allowed dacă doriți comision la fiecare tranșă |
| Comision generat de două ori | Cron + hook au rulat amândouă | Sistemul verifică existența unui rând în tblcommission per invoice_id+staffid înainte de insert — duplicatul este blocat |
| Agentul nu apare în dropdown Applicable Staff | Userul nu are rolul Staff activ | Verificați că userul este Staff activ în sistem |
| Tip-5 nu s-a calculat | commission_month_close_day nu a trecut sau cron nu a rulat |
Verificați setarea zilei și că cron-ul CRM este activ (/admin/misc/cron_jobs) |
Referințe module
- Commission — rapoarte
- Invoices — câmpul
sale_agent - Payments — trigger-ul plății
- Sales Agent — programele de discount (separate de comision)
- Goals — target-uri per agent
- DataPulse — dashboard performanță echipă
Rulați calculele de comisioane și generați chitanțele de plată la date fixe, pre-anunțate în fiecare lună — incertitudinea privind momentul plății comisioanelor demotivează echipa de vânzări mai mult decât rata de comision în sine.
Editarea ratei unei politici de comisioane se aplică doar comisioanelor viitoare — înregistrările de comisioane deja calculate nu sunt actualizate retroactiv. Creați o nouă versiune a politicii dacă trebuie să aplicați o rată diferită de la o dată specifică înainte.