Tok rada: Ketering — Od upita do fakture
Uključeni moduli: Ketering (Događaji · Meniji · Stavke · Paketi · Osoblje · Sastojci) · Predračuni · Fakture · Projekti
Ko ga koristi: Menadžer keteringa · Kuvar · Koordinator događaja · Finansije
Tipično trajanje: Upit → Potvrda = 1–7 dana · Događaj = 1 dan · Fakturisanje = odmah nakon događaja
Pregled
Modul Upravljanje keteringom pokriva kompletan ciklus ketering događaja: od inicijalnog upita, kroz konfiguraciju menija i paketa, potvrdu, realizaciju događaja sa dodeljivanjem osoblja, sve do generisanja predračuna i fakturisanja.
Interno izračunavanje troška i marže (trošak sastojaka vs. prodajna cena) je dostupno, ali vidljivo isključivo korisnicima sa posebnom dozvolom catering_view_costs.
Magacin: Modul ima sopstveni interni sistem sastojaka (
catering_ingredients) sa referentnim stanjem zaliha. Ne integriše se sa osnovnim modulom Magacin — smanjenje zaliha se ne dešava automatski kada se izvede događaj.
Ne postoji automatski tok odobravanja. Bilo koji zaposleni sa dozvolom
catering_events → editmože promeniti status događaja na bilo koju vrednost, bez logike prolaza.
Dijagram toka
[PODEŠAVANJE — admin, jednom]
│
├── Tipovi događaja (kategorije: Venčanje, Korporativno, Konferencija, itd.)
├── Dijetetski tipovi + Alergeni (nutritivne reference po proizvodu)
├── Kategorije menija (hijerarhijske) + Sekcije menija (grupe unutar menija)
├── Sastojci (sa avg_cost_per_unit, stock_on_hand, reorder_level)
├── Stavke menija (sa unit_cost, unit_price, dijetetskim tipovima, alergenima, sastojcima)
├── Šabloni menija (kolekcije stavki grupisane po sekcijama)
├── Paketi (fiksni paket sa qty_per_guest po stavci, min/max gostiju)
└── Uloge osoblja (Šef kuhinje, Kuvar, Konobar, Barmen, Menadžer, Vozač — 6 unapred sačuvanih)
│
↓
[1. UPIT]
│
├── Ketering → Događaji → Novi događaj
├── Obavezna polja: event_name, event_type_id, event_start, event_end
├── Klijent: client_id (postojeći klijent) ILI lead_id (potencijalni klijent)
│ ⚠ Predračun/Faktura se mogu generisati samo ako postoji client_id, ne lead_id
├── guest_count_expected: procenjeni broj gostiju
├── Mesto: venue_name, venue_address
├── Opciono: create_project=1 → automatski kreira projekat vezan za događaj
└── Početni status: upit
│
↓
[2. KONFIGURACIJA MENIJA]
│
├── Događaji → {događaj} → kartica Meni → Dodeli meni / Paket
├── Odabir šablona menija ILI paketa
├── Mod cena:
│ ├── per_person: cena × guest_count_expected po stavci
│ ├── fixed: fiksna ukupna cena
│ └── package: cena iz paketa (price_per_person × gosti)
├── Dodatna polja: množilac (marža), vikend doplata, napomene
├── Stavke iz šablona se kopiraju u catering_event_menu_items
│ (snimak sa trenutnom verzijom stavke + snimak dijetetskih/alergenskih podataka JSON)
└── Sve izmene stavki → evidentirane u catering_event_menu_history
│
↓
[3. GENERISANJE PREDRAČUNA]
│
├── Događaji → {događaj} → dugme Generiši predračun
├── Automatski kreira standardni Predračun u CRM-u sa stavkama:
│ ├── Zaglavlja sekcija (qty=0, rate=0)
│ ├── Stavke artikala: qty = guest_count_expected, rate = unit_price
│ └── Stavke rada osoblja: qty = sati, rate = hourly_rate
├── estimate_id sačuvan na događaju
├── Status događaja: upit → ponuđen
└── Predračun se može izmeniti, poslati klijentu, potpisati
│
↓
[4. POTVRDA]
│
├── Klijent prihvata predračun
├── Status događaja: ponuđen → potvrđen (menja ručno zaposleni)
└── Opciono: dodeljivanje osoblja za događaj (smena, uloga, procenjeni sati)
│
↓
[5. REALIZACIJA DOGAĐAJA]
│
├── Status događaja: potvrđen → u toku
├── Dodeljeno osoblje vidi svoju ulogu i smenu
├── Status dodeljivanja osoblja: na čekanju → potvrđen/odbijen → završen
└── Interne napomene: catering_event_notes (visible_to_client opciono)
│
↓
[6. ZAVRŠETAK + FAKTURISANJE]
│
├── Status događaja: u toku → završen
├── guest_count_final popunjen (stvaran broj gostiju)
├── Događaji → {događaj} → dugme Pretvori u fakturu
│ → poziva Estimates_model::convert_to_invoice(estimate_id)
│ → invoice_id sačuvan na događaju
└── Faktura se prati i plaća kao standardna u Fakturama
│
↓
[INTERNE FINANSIJE — opciono, vidljivo sa catering_view_costs]
│
├── calculate_event_financials(): izračunava interno P&L:
│ ├── menu.total_cost = qty × unit_cost po stavci
│ ├── menu.total_revenue = qty × unit_price po stavci
│ ├── labor.total_cost = sati × hourly_rate po zaposlenom
│ └── rezime: net_profit, profit_margin
└── Vidljivo SAMO sa dozvolom catering_view_costs
[DOGAĐAJ FAKTURISAN ✓ · P&L IZRAČUNAT ✓]
Korak po korak
1. Početna konfiguracija (admin)
Redosled konfiguracije:
1a. Tipovi događaja
Gde: Ketering → Podešavanja → Tipovi događaja → Dodaj
Svaki tip ima boju pozadine i teksta (za kalendar). Barem jedan tip je obavezan pri kreiranju događaja.
1b. Dijetetski tipovi i alergeni
Gde: Ketering → Podešavanja → Dijetetski tipovi / Alergeni
Nutritivne reference (bez glutena, veganski, halal, itd.) i alergeni (orašasti plodovi, mlečni proizvodi, itd. — sa severity: blago/umereno/teško). Dodaju se stavkama menija.
1c. Kategorije menija (hijerarhijske) i sekcije
Gde: Ketering → Podešavanja → Kategorije / Sekcije
Kategorije su hijerarhijske (parent_id). Sekcije grupišu stavke unutar menija (npr.: "Predjela", "Glavno jelo", "Desert").
1d. Sastojci
Gde: Ketering → Sastojci → Dodaj
| Polje | Opis |
|---|---|
name |
Naziv sastojka |
unit |
Jedinica mere |
avg_cost_per_unit |
Prosečna cena po jedinici |
stock_on_hand |
Raspoložive zalihe (referentne — ne smanjuju se automatski) |
reorder_level |
Nivo ponovne narudžbine (vizuelno upozorenje) |
supplier_id |
Dobavljač (iz catering_suppliers) |
1e. Stavke menija
Gde: Ketering → Stavke menija → Dodaj
| Polje | Opis |
|---|---|
item_name |
Naziv proizvoda |
category_id |
Kategorija |
unit_cost |
Trošak po porciji (trošak sastojaka) |
unit_price |
Prodajna cena po porciji |
default_portion_size |
Veličina porcije |
prep_time_minutes |
Vreme pripreme |
Kontrola verzija: Ako se
unit_costiliunit_pricepromene,versionse automatski povećava. Snimak u trenutku dodeljivanja događaju se čuva uitem_versionucatering_event_menu_items.
Dodajte dijetetske tipove, alergene i sastojke (sa qty_per_portion) svakoj stavci.
1f. Šabloni menija i paketi
Meniji (Ketering → Meniji → Dodaj): kolekcija stavki organizovanih po sekcijama. Kada se dodeli događaju, stavke se kopiraju sa snimkom.
Paketi (Ketering → Paketi → Dodaj):
| Polje | Opis |
|---|---|
package_name |
Naziv paketa |
price_per_person |
Cena po osobi |
min_guests / max_guests |
Minimalni/maksimalni broj gostiju |
| Stavke | Dodaju se sa qty_per_guest po stavci |
1g. Uloge osoblja
Gde: Ketering → Podešavanja → Uloge osoblja
6 unapred sačuvanih uloga: Šef kuhinje (45$/h), Kuvar (35$/h), Konobar (25$/h), Barmen (30$/h), Menadžer (40$/h), Vozač (20$/h). Dodajte prilagođene uloge sa default_hourly_rate.
2. Kreiranje događaja
Gde: /admin/catering_management_module/events → Novi događaj
Ključna polja:
| Polje | Obavezno | Opis |
|---|---|---|
event_name |
Da | Naziv događaja |
event_type_id |
Da | Tip događaja |
event_start / event_end |
Da | Datum i vreme početka/kraja |
client_id |
Preporučeno | Postojeći klijent (obavezan za generisanje predračuna/fakture) |
lead_id |
Alternativa | Lid (bez mogućnosti generisanja finansijskih dokumenata) |
guest_count_expected |
Da | Procenjeni broj gostiju (koristi se u izračunavanju cene po osobi) |
venue_name / venue_address |
Da | Lokacija događaja |
dietary_notes / allergen_summary |
Ne | Opšte dijetetske napomene za događaj |
create_project |
Ne | 1 = automatski kreira povezani CRM projekat |
3. Statusi događaja
| Status | Značenje | Prelaz |
|---|---|---|
enquiry |
Inicijalni upit | → ponuđen pri generisanju predračuna |
quoted |
Predračun generisan i poslat | → potvrđen pri prihvatanju |
confirmed |
Rezervacija potvrđena | → u toku na datum događaja |
in_progress |
Događaj u toku | → završen po završetku |
completed |
Događaj završen | → generisanje fakture |
cancelled |
Otkazano (terminalno) | — |
lost |
Izgubljeno (terminalno) | — |
Svi prelazi su ručni — bilo koji zaposleni sa
catering_events → editmože postaviti bilo koji status.
4. Dodeljivanje osoblja za događaj
Gde: Događaji → {događaj} → kartica Osoblje → Dodaj osoblje
| Polje | Opis |
|---|---|
staff_id |
Dodeljeni zaposleni |
role |
Uloga na događaju |
shift_start / shift_end |
Radna smena |
hours |
Ukupni sati (automatski izračunati iz shift_start/end) |
hourly_rate |
Satnica (prethodno popunjena iz uloge osoblja) |
Statusi dodeljivanja: na čekanju → potvrđen / odbijen → završen
Detekcija konflikata: Sistem automatski proverava da li zaposleni ima preklapajuće dodeljivanje (check_scheduling_conflicts()) pre čuvanja.
Obaveštavanje osoblja:
notify_all_staff()postoji u kodu, ali ne šalje email — samo beleži u log aktivnosti. Obavestite osoblje ručno.
5. Generisanje predračuna i fakture
Generiši predračun: Događaji → {događaj} → dugme Generiši predračun
Kreiran predračun uključuje:
- Zaglavlja sekcija (za vizuelnu organizaciju)
- Stavke proizvoda: qty =
guest_count_expected, rate =unit_pricepo stavci - Stavke rada: qty =
sati, rate =hourly_ratepo dodeljenom zaposlenom
Predračun se pojavljuje u /admin/estimates i može se izmeniti, poslati i potpisati kao svaki standardni predračun.
Pretvori u fakturu: Događaji → {događaj} → dugme Pretvori u fakturu (dostupno nakon Generiši predračun)
Poziva Estimates_model::convert_to_invoice($estimate_id) → standardna faktura u /admin/invoices.
6. Interno P&L izračunavanje
Dostupno isključivo sa dozvolom catering_view_costs:
| Metrika | Izračunavanje |
|---|---|
menu.total_cost |
unit_cost × portion_per_guest × guest_count_expected po stavci |
menu.total_revenue |
unit_price × portion_per_guest × guest_count_expected po stavci |
labor.total_cost |
sati × hourly_rate po dodeljenom zaposlenom |
net_profit |
total_revenue - total_cost - labor_cost |
profit_margin |
net_profit / total_revenue × 100 |
Eksterni troškovi (
expenses.total_cost) su rezervisano mesto u kodu — nisu implementirani. Spoljni troškovi se ne mogu direktno dodati u P&L izračunavanje.
Potrebne dozvole
| Dozvola | Pristup |
|---|---|
catering_events → view/create/edit/delete |
Upravljanje događajima |
catering_menus → view/create/edit/delete |
Šabloni menija |
catering_menu_items → view/create/edit/delete |
Ketering proizvodi |
catering_packages → view/create/edit/delete |
Paketi |
catering_categories → view/create/edit/delete |
Kategorije |
catering_allergens / catering_dietary_types |
Nutritivni podaci |
catering_view_costs |
Pregled troškova i P&L marži |
estimates → create |
Generisanje predračuna iz događaja |
invoices → create |
Pretvaranje u fakturu |
Česte greške
| Problem | Uzrok | Rešenje |
|---|---|---|
| Dugme Generiši predračun se ne pojavljuje | client_id nedostaje (događaj ima samo lead_id) |
Konvertujte lid u klijenta i ažurirajte događaj sa client_id |
| Cena na predračunu je pogrešna | unit_price na stavci promenjen nakon dodeljivanja |
Modul uzima snimak pri dodeljivanju — koristite Regeneriši predračun da biste uzeli trenutne cene |
| Osoblje se ne pojavljuje u padajućem meniju | Nisu konfigurisane uloge osoblja | Dodajte barem jednu ulogu osoblja |
| Zalihe sastojaka se ne smanjuju | Ispravno ponašanje — zalihe su referentne, ne transakcione | Ručno oduzimajte iz stock_on_hand nakon događaja |
| P&L nije vidljiv | Nedostaje dozvola catering_view_costs |
Dodelite specifičnu dozvolu ulozi |
| Obaveštavanje osoblja ne radi | notify_all_staff() zapravo ne šalje email |
Obavestite osoblje ručno ili koristite standardna CRM obaveštenja |
Reference modula
- Predračuni — predračuni generisani iz događaja
- Fakture — fakture generisane iz događaja
- Projekti — projekat opciono vezan za događaj
- Ketering — dokumentacija modula