ByteWave
Oprogramowanie dedykowane · WordPress · WooCommerce

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

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.

01

Discovery i analiza dokumentów cennikowych

3 tygodnie

Warsztaty 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).

02

UX/UI design + prototyp interaktywny

4 tygodnie

Projekt 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.

03

Development core: 3 kreatory + kalkulator

8 tygodni

Implementacja 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.

04

Integracje: Paynow, WooCommerce, kalendarz, emaile

4 tygodnie

Integracja 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.

05

RODO, panel admin, testy, deployment

3 tygodnie

Implementacja 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

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.

01

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%.

02

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).

03

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ł.

04

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.

05

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.

06

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.

07

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.

08

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.

09

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.

10

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.

11

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.

12

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.

WordPress 6.x
Baza CMS z istniejącą stroną M15
WooCommerce HPOS
High Performance Order Storage — najnowsza architektura zamówień
PHP 8.x
Backend pluginu, walidacja, logika cenowa, integracja Paynow
JavaScript ES6+
Frontend kreatora, kalkulator real-time, state manager
FullCalendar.js 6.1.11
Kalendarz dostępności w panelu admina
flatpickr
Wybór daty po stronie klienta z disabled dates
Paynow API
Bramka płatności PBL (zaliczka 10% lub pełna płatność)
WP Mail SMTP
Niezawodne wysyłanie emaili z noreply@m15.sopot.pl
LiteSpeed Cache
Excludes dla strony cateringu (wyłączenie JS/CSS combine/UCSS)
localStorage API
Persystencja wyboru klienta między odświeżeniami
Custom WooCommerce hooks/filters
Integracja bez zakłócania działania sklepu

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.

Masz pomysł na projekt?

Porozmawiajmy o tym, jak możemy go zrealizować.

Skontaktuj się z nami