Tok rada: Program lojalnosti — Lojalnost kupaca
Uključeni moduli: Lojalnost (Pravila · Transakcije · Iskupljenje · Članstvo · Programi) · Fakture · OmniSales · Klijenti
Ko ga koristi: Marketing · Prodaja · Customer Success
Tipično trajanje: Kontinuirano — poeni se akumuliraju sa svakom uplatom
Pregled
Modul Lojalnost implementira kompletan sistem lojalnosti: automatska akumulacija poena pri uplati fakture, tri tipa nagradnih bonusa (novi nalog, rođendan, ručno), iskupljenje u 4 različita konteksta (admin faktura, portal klijenta, OmniSales, vaučer) i sistem nivoa sa diferenciranim beneficijama po nivou.
Obavezan uslov: Globalni prekidač
loyalty_settingmora biti postavljen na1u Podešavanja → Marketing → Lojalnost. Bez ovoga, hookafter_payment_addedne izvršava nikakvu logiku poena bez obzira na konfigurisana pravila.
Ne postoji automatski istek poena. Poeni se smanjuju samo kroz eksplicitno iskupljenje.
Dijagram toka
[PODEŠAVANJE — admin, jednom]
│
├── Globalna aktivacija: loyalty_setting = 1
├── Pravila lojalnosti: tip zarade (card_total / product_category / product)
│ + nivoi iskupljenja (point_weight po opsegu poena)
├── Pravila članstva (Nivoi): Bronza / Srebro / Zlato po opsegu poena
├── Programi članstva: popusti po nivou (kartica/kategorija/proizvod)
└── Kartice lojalnosti: vizuelni šablon (opciono)
│
↓
[AKUMULACIJA POENA — automatski pri uplati]
│
├── Okidač: after_payment_added → status fakture = PLAĆENO (2)
├── Sistem traži aktivna pravila za klijenta (po client_id ili grupi klijenata)
│
├── rule_base = 'card_total':
│ poeni = poin_awarded × floor(ukupno_fakture / vrednost_kupovine)
│ (npr.: 10 poena na 100 RON potrošenih)
│
├── rule_base = 'product_category':
│ po stavci fakture: ako je grupa proizvoda = rel_id u rule_detail
│ → poeni = loyalty_point × količina
│
└── rule_base = 'product':
po stavci fakture: ako je proizvod = rel_id u rule_detail
→ poeni = loyalty_point × količina
│
├── Insert u loy_transation: type='debit', reference='order_debit'
└── clients.loy_point += zarađeni poeni
│
↓
[NAGRADNI BONUSI]
│
├── Novi nalog (hook after_client_added):
│ → pravilo sa MAX(create_account_point) aktivnim danas
│ → type='credit', reference='manual_credit'
│
├── Rođendan (cron hook before_cron_run):
│ → pronalazi klijente sa prilagođenim poljem 'Birthday' = danas (mesec+dan)
│ → jednom godišnje (proverava loy_transation.note='bonus_points_for_customers_birthday')
│ → šalje email šablon 'loyalty-birthday-bonus-point'
│
└── Ručno (admin): loyalty/transation_form → type='credit'
│
↓
[NIVO — izračunava se dinamički]
│
├── client_rank() → pronalazi loy_mbs_rule gde loy_point ∈ [loyalty_point_from, loyalty_point_to]
├── Dodelje se najviši odgovarajući nivo
└── client_next_rank() → prikazuje koliko poena je potrebno za sledeći nivo
│
↓
[ISKUPLJENJE — 4 konteksta]
│
├── [A] Admin na fakturi: polje iskupljenja u obrascu fakture
├── [B] Klijent u portalu: stranica fakture → iskoristi poene
├── [C] OmniSales/POS: polje iskupljenja u korpi narudžbine
└── [D] Vaučer/Program članstva: kod vaučera ili automatski popust po nivou
│
↓
[POPUST PRIMENJEN]
│
├── Poeni konvertovani u valutu putem point_weight (npr.: 1 poen = 0,05 RON)
├── redeemp_type='full': svi poeni, vrednost se izračunava automatski
├── redeemp_type='partial': klijent bira koliko poena želi iskoristiti
├── Insert u loy_redeem_log: old_point, new_point, redeep_from, redeep_to
└── clients.loy_point -= iskorišćeni poeni
[LOJALNI KLIJENT ✓ · POENI AKUMULIRANI ✓]
Korak po korak
1. Aktivacija i globalna konfiguracija (admin)
Gde: /admin/loyalty → Podešavanja → Opšta podešavanja
Obavezna aktivacija: loyalty_setting = 1
Bez ovoga, hook after_payment_added se registruje, ali se odmah vraća bez ikakvih izračunavanja.
2. Pravila lojalnosti — pravila zarade i iskupljenja
Gde: /admin/loyalty → Pravila lojalnosti → Novo pravilo
Jedno pravilo definiše i zaradu i iskupljenje.
2a. Polja pravila
| Polje | Obavezno | Opis |
|---|---|---|
subject |
Da | Naziv pravila |
enable |
Da | 1 = aktivno |
start_date / end_date |
Da | Period važenja |
rule_base |
Da | card_total / product_category / product |
client_group |
Ne | Ciljna grupa klijenata (0 = svi) |
client |
Ne | Specifični ID-ovi klijenata (CSV) |
minium_purchase |
Ne | Minimalna vrednost narudžbine za zaradu poena |
max_amount_received |
Ne | Maksimalni limit poena zarađenih po transakciji |
Za card_total:
| Polje | Opis |
|---|---|
poin_awarded |
Poeni dodeljeni po razredu |
purchase_value |
Vrednost jednog razreda (npr.: 100 RON = 10 poena) |
Za product_category i product: dodajte stavke u Detalje pravila — svaka stavka specificira rel_type, rel_id (ID grupe ili proizvoda) i loyalty_point po jedinici.
Posebni bonusi po pravilu:
| Polje | Opis |
|---|---|
create_account_point |
Bonus poeni pri kreiranju novog naloga klijenta |
birthday_point |
Bonus poeni za rođendan (zahteva prilagođeno polje 'Birthday' na klijentu) |
2b. Nivoi iskupljenja
Dodajte barem jedan nivo u odeljku Detalji iskupljenja pravila:
| Polje | Opis |
|---|---|
point_from / point_to |
Opseg poena za ovaj nivo |
point_weight |
Kurs konverzije: poeni → valuta (npr.: 0,05 = 1 poen = 0,05 RON) |
status |
'enable' = aktivan nivo |
redeem_portal |
1 = može se koristiti u portalu klijenta |
redeem_pos |
1 = može se koristiti u OmniSalesu/POS-u |
min_poin_to_redeem |
Minimalni poeni potrebni za aktiviranje iskupljenja |
redeemp_type |
'full' = puno iskupljenje · 'partial' = delimično iskupljenje |
3. Pravila članstva — nivoi
Gde: /admin/loyalty → Članstvo → Novo pravilo članstva
Definiše nivoe (npr.: Bronza, Srebro, Zlato) na osnovu akumuliranih poena:
| Polje | Opis |
|---|---|
name |
Naziv nivoa (npr.: "Zlato") |
loyalty_point_from / loyalty_point_to |
Opseg poena za ovaj nivo |
client_group |
Prihvatljiva grupa klijenata (0 = svi) |
card |
FK → loy_card (opcioni vizuelni šablon kartice) |
4. Programi članstva — beneficije nivoa
Gde: /admin/loyalty → Programi članstva → Novi program
Program povezuje jedan ili više nivoa sa popustnom beneficijom:
| Polje | Opis |
|---|---|
program_name |
Naziv programa |
membership |
Ciljani ID-ovi nivoa (CSV iz loy_mbs_rule) |
discount |
Tip popusta: card_total / product_category / product |
discount_percent |
Procenat popusta |
voucher_code |
Opcioni kod vaučera (za ručno iskupljenje) |
voucher_value |
Fiksna vrednost vaučera |
minium_purchase |
Minimalna narudžbina za aktivaciju popusta |
start_date / end_date |
Važenje programa |
Napomena: Kada se program članstva sa popustom primeni na fakturu, sistem automatski generiše kreditnu notu (
add_credit_mbs_program()) i primenjuje je na fakturu. Ova kreditna nota se pojavljuje u modulu Kreditne note.
5. Prilagođeno polje "Birthday" (za bonus za rođendan)
Gde: /admin/clients → zapis klijenta → prilagođeno polje Birthday (date_picker)
Polje se kreira automatski od strane modula sa slug-om customers_birthday. Bonus za rođendan se aktivira kroz cron (before_cron_run) jednom godišnje po klijentu.
6. Iskupljenje poena
6a. Na fakturi (admin)
Pri kreiranju/izmeni fakture, odeljak Iskoristi poene se pojavljuje ako:
- Klijent ima dovoljno poena (
≥ min_poin_to_redeem) - Postoji aktivno pravilo sa važećim nivoom iskupljenja
Zaposleni bira poene za iskorišćavanje → popust se izračunava automatski → upisuje se u loy_redeem_log.
6b. Portal klijenta
Prijavljeni klijent vidi dugme Iskoristi poene na stranici fakture (ako je redeem_portal=1 na pravilu i faktura još nije u potpunosti plaćena).
Klijent bira poene → sistem direktno menja invoices.total (smanjuje ukupan iznos) i beleži u loy_voucher_inv_log.
6c. OmniSales / POS
Polje iskupljenja se pojavljuje u OmniSales korpi (ako je redeem_pos=1). Primenjuje se pri kreiranju narudžbine.
6d. Vaučer za članstvo
Pri unosu koda vaučera (filter apply_other_voucher), sistem proverava da li klijent pripada nivou sa aktivnim programom koji ima taj kod. Vraća voucher_value i minium_purchase.
7. Pregled stanja poena klijenta
Gde: /admin/clients/{id} → kolona loy_point u zapisu klijenta
Trenutno stanje se čuva direktno u tblclients.loy_point (DECIMAL). Kompletna istorija transakcija je vidljiva u Lojalnost → Transakcije filtrirano po klijentu.
Potrebne dozvole
| Akcija | Dozvola |
|---|---|
| Pregled modula Lojalnost | loyalty → view |
| Konfiguracija pravila, kartica, programa | Isključivo is_admin() (require_loyalty_admin) |
| Portal klijenta (iskupljenje) | is_client_logged_in() |
Česte greške
| Problem | Uzrok | Rešenje |
|---|---|---|
| Poeni nisu dodati nakon uplate | loyalty_setting ≠ 1 ili pravilo isteklo |
Aktivirajte globalni prekidač + proverite start_date/end_date pravila |
| Klijent nije pokriven pravilom akumulacije | Nepodudaranje client ili client_group |
Proverite da pravilo uključuje tog klijenta ili njegovu grupu |
| Bonus za rođendan nije dodeljen | Polje 'Birthday' nije popunjeno na klijentu ili cron neaktivan | Popunite polje + proverite cron posao |
| Iskupljenje se ne pojavljuje na fakturi | min_poin_to_redeem nije dostignut ili pravilo neaktivno |
Proverite stanje poena u odnosu na min_poin_to_redeem |
| Popust za članstvo generiše neočekivanu kreditnu notu | Ispravno ponašanje — add_credit_mbs_program() |
Kreditna nota je normalna; pogledajte je u Kreditnim notama |
| Poeni ne ističu | Ne postoji mehanizam isteka | Ispravno ponašanje — poeni su trajni; ograničite putem end_date na pravilu |
Reference modula
- Klijenti — stanje loy_point u zapisu klijenta
- Fakture — iskupljenje na fakturi
- OmniSales — iskupljenje na POS-u
- Kreditne note — kreditne note generisane od strane programa članstva