CRMconnect Azuvio · Docs

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_days este 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:

  1. invoices.sale_agent — agentul setat direct pe factură
  2. tblcustomer_admins.staff_id — adminul de cont al clientului (dacă sale_agent e gol)
  3. 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_agent setat 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ă permisiunea commission → 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_settings JSON
  • 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:

  1. Selectați comisioanele neachitate (paid=0) de inclus în plată
  2. Completați: amount, paymentmode, date, note, transactionid
  3. Salvați → sistemul marchează toate tblcommission selectate cu paid=1
  4. 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

Tip

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.

Warning

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.