M15 Catering — kompletny moduł rezerwacji cateringu dla WordPress
Dla restauracji M15 Sopot zbudowaliśmy dedykowany moduł cateringowy do WordPress, który obsługuje pełny cykl rezerwacji — od pierwszego klika klienta, przez wybór menu w 12-16 panelach kreatora, kalkulator cen w czasie rzeczywistym z VAT, integrację z Paynow, automatyczne emaile, po zarezerwowanie terminu w kalendarzu dostępności. Trzy oddzielne kreatory: wesela, imprezy okolicznościowe, eventy firmowe. Działa na produkcji pod /rezerwacja-cateringu/.
Klient i kontekst biznesowy
M15 Sopot to kompleks gastronomiczno-rekreacyjny na sopockiej plaży, który oprócz restauracji i saun świadczy usługi cateringowe na duże eventy: wesela, urodziny, komunie, eventy firmowe, stypy. Klient potrzebował systemu do rezerwacji cateringu online, który zastąpiłby ręczne wyceny przez telefon i email.
Do tej pory każda rezerwacja wyglądała tak: klient dzwonił, opisywał wymagania, pracownik M15 ręcznie liczył wycenę w arkuszu Excela, wysyłał ją mailem, klient odsyłał korekty, pracownik znów liczył. Cykl trwał 2-5 dni, klient po drodze tracił zainteresowanie lub szedł do konkurencji. M15 chciał systemu, który pozwala klientowi samodzielnie skonfigurować catering w 15-30 minut online, z natychmiastową wyceną i opcją płatności.
Dodatkowo system musiał integrować się z istniejącą stroną M15 (WordPress + WooCommerce), obsługiwać zgodność z RODO, generować zamówienia w WooCommerce dla późniejszej księgowości, oraz blokować dni z opłaconymi rezerwacjami w kalendarzu dostępności.
Wyzwanie
Catering nie jest produktem klasycznym — nie da się go skonfigurować w 3 kliknięciach jak w sklepie. Wesele wymaga decyzji o typie menu (serwowane / półmiski / bufet), 3 tierach przystawek, 3 tierach zup, bufetach zimnych i ciepłych, 8 rodzajach sałatek, deserach i fontannie czekoladowej, 6 pakietach Open Bar × 3 czasy trwania, menu dziecięcym z 2 grupami wiekowymi, DJ-u i wyposażeniu. Łącznie ~50 paneli decyzyjnych z 100+ polami.
Najpoważniejszym wyzwaniem był kalkulator cen w czasie rzeczywistym — każda zmiana w którymkolwiek z 50 paneli musi natychmiast przeliczyć całą wycenę z uwzględnieniem: liczby dorosłych, dzieci 0-3 (gratis), dzieci 3-10 (kids menu lub menu dorosłe 50%), serwisu kelnerskiego 10%, VAT 8%/23% dla eventów firmowych, alkoholu na butelki vs Open Bar, minimum zamówienia 10 000 zł dla wesel.
Trzeci poważny wymóg — zgodność z RODO i prawem podatkowym: 3 wymagane checkboxy zgody, audit trail w meta zamówienia (IP, User-Agent, timestamp), walidacja NIP algorytmem sumy kontrolnej dla faktur VAT, integracja z polską bramką płatności Paynow (tylko PBL — bez BLIK i kart przez limity kwotowe), generowanie zamówień jako WooCommerce orders dla księgowości.
Konkretne wymagania
- 3 oddzielne kreatory: wesela (12 paneli), imprezy okolicznościowe (12 paneli z mutual exclusion typów menu), eventy firmowe (16 paneli z VAT + faktura)
- Kalkulator cen w czasie rzeczywistym ze sticky sidebar — każda zmiana przelicza wszystko
- Logika dzieci: 0-3 gratis lub 170 zł kids menu, 3-10 z opcją menu dorosłe 50% (z wyłączeniem dań o północy)
- Serwis kelnerski 10% — różny zakres dla wesel vs eventów firmowych
- VAT 8%/23% z proporcjonalnym rozkładem serwisu dla eventów firmowych
- Walidacja NIP algorytmem sumy kontrolnej + auto-formatowanie kodu pocztowego
- Kalendarz dostępności w panelu admina: ręczna blokada + auto-blokada po opłaconym zamówieniu
- Integracja Paynow API z filtrem force_all_paynow_gateways (tylko dla zamówień cateringowych — nie psuje sklepu)
- Manual approval dla lunch serwowany corporate (status on-hold)
- Idempotencja emaili — meta _m15_emails_sent_* zapobiega dublom przy retry
- 3 wymagane checkboxy RODO z audit trail (IP, User-Agent, timestamp, slug regulaminu)
- Klikalna nawigacja kroków (forward + backward) z podświetleniem odwiedzonych
- State manager w localStorage — zachowanie wyboru między odświeżeniami
- WooCommerce HPOS (High Performance Order Storage) — zgodność z najnowszą architekturą
Proces realizacji w 5 miesięcy
Rozmiar projektu (~50 paneli, 100+ pól meta, 3 typy zamówień, kalendarz, emaile, integracja Paynow, RODO) wymagał systematycznego podejścia w 5 fazach. Klient miał konkretne PDF-y z cennikami i pakietami menu, więc zaczęliśmy od dokładnej analizy biznesowej.
Discovery i analiza dokumentów cennikowych
3 tygodnieWarsztaty z M15: mapowanie wszystkich typów eventów (wesela, chrzciny, komunia, urodziny, stypa, eventy firmowe), analiza ~30 stron PDF z cennikami pakietów, ekstrakcja reguł cenowych. Definicja kreatorów i flow per typ. Identyfikacja wszystkich edge cases (minimum 10 000 zł, dzieci 50%, VAT proporcjonalny, mutual exclusion typów menu).
UX/UI design + prototyp interaktywny
4 tygodnieProjekt 3 kreatorów z paskiem nawigacji kroków (klikalny w obu kierunkach), sticky sidebar z kalkulatorem cen, kafelków wyboru typu eventu, formularzy z walidacją. Prototyp w Figmie z klikalnym flow dla każdego z 3 typów. Iteracje z M15 do akceptacji UX.
Development core: 3 kreatory + kalkulator
8 tygodniImplementacja w PHP 8 + JavaScript ES6+ na bazie WordPress + WooCommerce. State manager w localStorage. Kalkulator cen z reactive updates per zmiana w którymkolwiek z 50 paneli. Logika dzieci, serwisu, VAT. Walidacja NIP + kod pocztowy. 3 typy kreatorów z różnymi flow.
Integracje: Paynow, WooCommerce, kalendarz, emaile
4 tygodnieIntegracja Paynow API (tylko PBL przez filtr force_all_paynow_gateways, żeby nie psuć sklepu z innymi gateway). Tworzenie WooCommerce orders z meta _m15_*. FullCalendar.js w panelu admina z modal blokady ręcznej + auto-blokada po opłaconym zamówieniu. System 2 emaili (klient + restauracja) z hero gradient, idempotencja, manual approval banner.
RODO, panel admin, testy, deployment
3 tygodnieImplementacja audit trail RODO (IP + User-Agent + timestamp). Custom meta box w panelu zamówień WC z hero, key info grid, alergiami czerwonymi, finansami z VAT. Strona regulaminu z 16 paragrafami. WP Mail SMTP integration. LiteSpeed Cache excludes. Pełne testy E2E. Deployment produkcyjny.
Rozwiązanie techniczne
Stack: WordPress + WooCommerce HPOS + custom plugin (PHP 8) + JavaScript ES6+ + FullCalendar.js + flatpickr + Paynow API. Plugin hooks do WooCommerce w sposób, który nie zakłóca działania sklepu — filtry są aktywne tylko dla zamówień z meta `_m15_catering_type`.
Architektura kalkulatora cen oparta o reactive state manager w localStorage — każda zmiana w polu kreatora aktualizuje state, który propaguje się do sticky sidebara z aktualną ceną. To pozwala na natychmiastową wycenę bez czekania na backend, oraz zachowanie wyboru między odświeżeniami strony — ważne przy 50 panelach, gdzie klient nie chce zaczynać od nowa.
Najtrudniejszy element: proporcjonalny rozkład serwisu kelnerskiego 10% dla VAT 8%/23% w eventach firmowych. Jedzenie ma VAT 8%, alkohol 23%. Serwis 10% naliczany od jedzenia + baru. Trzeba rozdzielić serwis proporcjonalnie do udziału jedzenia (8% VAT) i baru (23% VAT) w sumie. Bez tego księgowa M15 nie mogłaby zaakceptować faktur. Implementacja wymagała precyzyjnego algorytmu z testami E2E na realnych przypadkach.
Dlaczego WordPress plugin, a nie osobna aplikacja?
M15 ma już stronę na WordPress + WooCommerce. Osobna aplikacja wymagałaby dodatkowego hostingu, oddzielnego logowania, synchronizacji zamówień. Plugin wpina się natywnie w istniejący stack — zamówienia trafiają do WC, panel admina jest tam gdzie inne zamówienia, M15 ma jedno miejsce do obsługi.
Dlaczego tylko Paynow PBL, a nie BLIK i karty?
BLIK i karty mają limity kwotowe (zwykle 5 000-10 000 zł), które nie wystarczają dla cateringu wesel (zamówienia 10 000-50 000 zł). PBL (przelew bankowy) nie ma takich ograniczeń. Filtr `force_all_paynow_gateways` aktywny tylko dla cateringu — sklep z voucherami M15 dalej obsługuje BLIK i karty normalnie.
Dlaczego state w localStorage, nie w sesji serwera?
Klient wypełnia 50 paneli przez 15-30 minut. Trzymanie tego w sesji PHP wymagałoby utrzymania połączenia + obciążenia serwera. localStorage działa po stronie klienta — zerowy koszt serwerowy, działa też offline (klient może zacząć w pociągu, kontynuować w domu po połączeniu).
Dlaczego automat-blokada terminu, ale ręczna ma priorytet?
Auto-blokada po opłaceniu zapobiega zdublowanym rezerwacjom (dwóch klientów płaci za ten sam termin). Ale czasem M15 musi zablokować dzień z innych powodów (remont, prywatna impreza właścicieli) — wtedy ręczna blokada nie może być nadpisana przez auto-blokadę. Logika: ręczna blokada zawsze wygrywa.
Kluczowe funkcjonalności
Plugin pokrywa pełny cykl życia zamówienia cateringowego — od pierwszego klika do zarezerwowanego terminu i wystawionej faktury. ~30 głównych kategorii funkcji, ~150 podkategorii.
3 dedykowane kreatory (wesela, okolicznościowe, eventy firmowe)
Wesela: 12 paneli z menu serwowanym/półmiskami/bufetem, dzieci 0-3 i 3-10, Open Bar 6 pakietów × 3 czasy. Imprezy okolicznościowe: 12 paneli z 4 typami uroczystości i mutual exclusion menu (stypa/chrzciny tylko półmiskowe). Eventy firmowe: 16 paneli z fakturą VAT, multi-select grilla, miejscem eventu, VAT 8/23%.
Kalkulator cen real-time w sticky sidebar
Każda zmiana w którymkolwiek z 50 paneli natychmiast przelicza całą wycenę. Cena na osobę: dorosły, dziecko, plus per-osoba dla sałatek/bufetu/zup/ciast. Średnia "Na dziecko" w podsumowaniu. Serwis 10% pokazany tylko w podsumowaniu (nie w sidebarze).
Logika cenowa dzieci
Wesele: 0-3 gratis lub 170 zł kids menu; 3-10 z opcją menu dorosłe 50% (bez dań o północy, z deserem i bufetem słodkim). Eventy firmowe: 2 propozycje menu dziecięcego × 170 zł.
VAT 8%/23% z proporcjonalnym serwisem
Eventy firmowe z fakturą VAT: jedzenie 8%, alkohol 23%, serwis 10% rozdzielany proporcjonalnie. Walidacja NIP algorytmem sumy kontrolnej (wagi 6,5,7,2,3,4,5,6,7). Auto-formatowanie kodu pocztowego.
Kalendarz dostępności (admin + klient)
FullCalendar.js w panelu admina: hero gradient, klik dzień → modal notatki, klik zablokowany → modal odblokowania. Auto-blokada po opłaconym zamówieniu z meta `_m15_catering_type`. Priorytet ręcznej blokady. Front: flatpickr z disabled dates.
Integracja Paynow API (tylko PBL)
Filtr `force_all_paynow_gateways` aktywny tylko dla zamówień cateringowych — sklep z voucherami nie jest dotknięty. BLIK i karty wyłączone (limity kwot). Zaliczka 10% lub pełna płatność — wybór klienta.
Manual approval dla lunch serwowany corporate
Status on-hold dla zamówień wymagających potwierdzenia. Banner "[WSTĘPNA — wymaga potwierdzenia]" w temacie emaila do klienta. Pracownik M15 weryfikuje dostępność i potwierdza ręcznie.
System emaili (klient + restauracja)
Email do klienta natychmiast + drugi po opłaceniu. Email do `marketing@m15.sopot.pl` z pełnym rozpisem operacyjnym. Idempotencja przez meta `_m15_emails_sent_*`. HTML z hero navy gradient + sekcjami menu + alergie + finanse z VAT. Pełny rozpis pakietów Open Bar (nie skróty). Configurable BCC.
WooCommerce HPOS (High Performance Order Storage)
Zgodność z najnowszą architekturą WooCommerce — zamówienia w dedykowanej tabeli zamiast wp_posts. Custom meta box w panelu admina z hero gradient, key info grid, alergiami czerwonymi, finansami z VAT.
RODO + audit trail
3 wymagane checkboxy: zgoda RODO + regulamin (link do /regulamin-cateringu/). Audit trail w meta: `_m15_gdpr_consent`, `_m15_terms_consent`, `_m15_consent_at`, `_m15_consent_ip`, `_m15_consent_ua`. Strona regulaminu z 16 paragrafami.
Klikalna nawigacja kroków + state localStorage
Pasek nawigacji kroków klikalny w obu kierunkach. Odwiedzone kroki podświetlone (klasa `done`). Kliknięcie "Podsumowanie" → natychmiastowe przeliczenie. State manager w localStorage zachowuje wybór między odświeżeniami.
Usługi dodatkowe (DJ, namiot, transport, meble)
DJ: bez / standardowy 2500 zł / +nagłośnienie 4000 zł. Namiot: 4 rozmiary 3×3 / 3×6 / 150 m² / 300 m². Transport (corporate): do 20 km / 50 km / 100 km. Obsługa: zastawa, ochrona, ogrzewacze gazowe. Meble: 10 pozycji. Logika ukrywania per typ eventu (stypa bez DJ, wesele bez transportu).
Stack technologiczny
Plugin oparty o sprawdzony stack WordPress + WooCommerce z dedykowanymi rozszerzeniami i integracjami.
Wyniki
Plugin został wdrożony na produkcję pod adresem m15.sopot.pl/rezerwacja-cateringu/ i obsługuje cały flow rezerwacji — od pierwszego klika klienta po zaksięgowaną płatność i zarezerwowany termin w kalendarzu. Klient M15 nie potrzebuje już ręcznych wycen w Excelu — system robi wszystko automatycznie.
Z perspektywy M15 najważniejsze są trzy efekty: (1) redukcja czasu cyklu rezerwacji z 2-5 dni do 15-30 minut, (2) automatyzacja księgowości przez WooCommerce orders z pełną meta (alergie, dzieci, menu, dodatki, VAT), (3) eliminacja błędów wyceny — kalkulator nie zapomina o serwisie, VAT, minimum zamówienia jak człowiek z arkuszem.
Plugin obsługuje też nietypowe scenariusze: stypa (bez DJ-a, bez transportu, tylko półmiski), event firmowy z fakturą VAT i adresem realizacji innym niż restauracja, wesele z 50 dziećmi w 2 grupach wiekowych. Wszystkie scenariusze zostały przetestowane E2E przed deploymentem.
Co dalej
Plugin jest aktywnie rozwijany — wersja v5.53.3 to obecny stan produkcji. Plan obejmuje: (1) automatyczne sugerowanie pakietów na podstawie wybranego typu eventu i liczby gości, (2) integracja z systemem POS restauracji M15 dla śledzenia zużycia produktów, (3) eksport rezerwacji do kalendarza Google/Outlook personelu obsługującego event.
Architektura pluginu jest na tyle uniwersalna, że może zostać dostosowana do innych restauracji organizujących catering. ByteWave rozważa wydanie generalizowanej wersji jako produkt komercyjny dla branży HoReCa.