# Genkai Laravel 2026

Volledige single-restaurant Laravel-app voor Genkai Grill & Sushi met website, reservaties, tabletbediening, tafelmenu, AYCE/AYCD-formules, bestellingen, sessiebeheer, keuken/bar POS, zaaloproepen, activiteitenlog en realtime updates via Laravel Reverb.

## Eén restaurant

- Het enige restaurant is **Genkai Grill & Sushi**.
- De interne `restaurants`-tabel blijft bestaan voor relaties met tafels, menu, personeel, formules, sessies en orders.
- Er is geen UI om extra restaurants aan te maken of te selecteren.
- Medewerkers gebruiken alleen hun persoonlijke PIN.
- Alleen de eigenaar gebruikt de eigenaarslogin met e-mail en wachtwoord.

## Belangrijkste onderdelen

### Publieke website en reservaties
- Websitepagina's voor Genkai
- Reservatieformulier
- Beveiligde wijzigingslink
- Same-day instellingen en minimum voorlooptijd
- SMTP-mails voor klant en eigenaar

### Restaurantwerking
- Tafels en QR-codes
- Menucategorieën en menu-items
- Verplichte verkoop-/afhaalprijs per menu-item
- AYCE / AYCD / hybride formules
- Weekdagen en leeftijdsprijzen
- PIN-only personeel
- Tabletbediening
- Actieve tafelsessies
- Formuletotaal + à-la-cartebedrag + totaal afrekenbedrag
- Sessie beëindigen door medewerker of eigenaar
- Activiteitenlog

### Tafelmenu
- Sessietimer telt af
- Ronde-timer bepaalt wanneer een volgende bestelling mogelijk is
- AYCE/AYCD-inbegrepen items tonen geen nutteloze prijs
- Niet-inbegrepen items tonen hun à-la-carteprijs
- Winkelmand en bestellen per ronde
- Live besteloverzicht: onderweg / verzonden
- Hulpdropdown voor Bancontact, cash, bestek en wasabi & gember

### Live POS
- Keuken en bar hebben een live ticket-scherm
- Eén kaart per tafel + bestelronde
- Items staan als checklist binnen de ronde
- Eén itemregel kan direct worden afgevinkt/verzonden
- Wasabi & gember gaat naar de keuken
- Bancontact, cash en bestek gaan naar de bar
- Nieuwe tickets verschijnen via WebSockets zonder refresh
- De klant ziet statuswijzigingen vrijwel onmiddellijk in zijn tafeloverzicht
- Openstaande items uit een vorige ronde blokkeren geen nieuwe ronde; de ingestelde ronde-timer blijft de enige bestelbeperking

## Realtime architectuur

Deze build gebruikt **Laravel Reverb** voor de WebSocket-server en **Laravel Echo** in de browser.

Broadcasts worden via de Laravel queue verwerkt zodat het plaatsen of afvinken van een bestelling niet op de WebSocket-delivery hoeft te wachten.

Kan de browser tijdelijk geen WebSocketverbinding maken, dan schakelt de UI automatisch terug naar een beperkte polling-fallback. Bij een werkende Reverb-verbinding zijn updates event-driven.

Gebruikte kanalen:

```text
genkai.pos.kitchen        private
genkai.pos.bar            private
genkai.owner.operations   private
genkai.table.{QR_TOKEN}   publiek tafelchannel
```

## Installatie in Laragon

Pak de map bijvoorbeeld uit naar:

```text
C:\laragon\www\genkai-laravel-2026
```

Voer daarna uit:

```bash
composer install
php artisan migrate
php artisan storage:link
php artisan optimize:clear
```

Of gebruik:

```text
SETUP-WINDOWS.bat
```

`composer install` is in deze release noodzakelijk omdat Laravel Reverb als nieuwe Composer dependency is toegevoegd.

## Realtime starten op Windows

Na de installatie kun je dubbelklikken op:

```text
START-REALTIME-WINDOWS.bat
```

Dit opent twee vensters:

```bash
php artisan reverb:start --host=0.0.0.0 --port=8080
php artisan queue:work --queue=realtime,default --sleep=1 --tries=3 --timeout=30
```

Laat beide vensters open zolang je lokaal realtime wilt gebruiken.

Als je liever zelf commando's uitvoert, open dan twee terminals in de projectmap en start bovenstaande commando's afzonderlijk.

## Lokale `.env` voor Reverb

De meegeleverde `.env` en `.env.example` bevatten een lokale configuratie:

```env
BROADCAST_CONNECTION=reverb
QUEUE_CONNECTION=database

REVERB_APP_ID=248344
REVERB_APP_KEY=CpvpJGC8DSoBOdoUATBmXNg
REVERB_APP_SECRET=0rWTQJN8uA33aN9Ca2DBZtOcZFnwxdU
REVERB_HOST=127.0.0.1
REVERB_PORT=8080
REVERB_SCHEME=http
REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080
REVERB_ALLOWED_ORIGINS=*
```

Test je alleen op dezelfde pc, dan kan `REVERB_HOST=127.0.0.1` blijven staan.

Open je het tafelmenu/POS vanaf een andere tablet of telefoon op hetzelfde netwerk, zet `REVERB_HOST` op het LAN-IP-adres van de Windows-pc waarop Reverb draait, bijvoorbeeld:

```env
REVERB_HOST=192.168.1.50
REVERB_PORT=8080
REVERB_SCHEME=http
```

Daarna:

```bash
php artisan optimize:clear
```

Herstart vervolgens Reverb en de queue worker. Zorg er ook voor dat Windows Firewall inkomende verbindingen op TCP-poort 8080 toelaat als andere apparaten op het lokale netwerk moeten verbinden.

## Bestaande database behouden

Wil je deze source over een bestaande installatie zetten, behoud dan je huidige:

```text
database/database.sqlite
```

Voer daarna uit:

```bash
composer install
php artisan migrate
php artisan optimize:clear
```

De nieuwe migration maakt de database-queue tabellen aan als die nog niet bestaan.

Als je je bestaande `.env` behoudt, voeg dan de Reverb-variabelen uit het blok hierboven toe.

## Eigenaarslogin

```text
/eigenaar/login
```

Standaard lokale gegevens:

```text
E-mail: owner@genkai.be
Wachtwoord: change-me-now
```

Wijzig deze voor echt gebruik.

## Belangrijke beheerpagina's

```text
/eigenaar                    dashboard
/eigenaar/tablepage          medewerker tablet
/eigenaar/sessies            sessiebeheer
/eigenaar/keuken             keuken POS
/eigenaar/bar                bar POS
/eigenaar/logs               activiteitenlog
/eigenaar/reservaties        reservaties
```

## Productie

Gebruik in productie altijd HTTPS/WSS, een beperkt `REVERB_ALLOWED_ORIGINS` en unieke Reverb credentials.

Een typische publieke configuratie ziet er bijvoorbeeld zo uit:

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://genkai.be

BROADCAST_CONNECTION=reverb
QUEUE_CONNECTION=database

REVERB_APP_ID=UNIEK_ID
REVERB_APP_KEY=UNIEKE_KEY
REVERB_APP_SECRET=UNIEK_SECRET
REVERB_HOST=genkai.be
REVERB_PORT=443
REVERB_SCHEME=https
REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080
REVERB_ALLOWED_ORIGINS=https://genkai.be,https://www.genkai.be
```

Laat Reverb en `queue:work` in productie permanent draaien via een process manager zoals Supervisor/systemd of de process manager van je hostingplatform. Laat Nginx/Apache de publieke HTTPS/WSS-verbinding doorsturen naar Reverb op de interne poort.

Na productie-updates:

```bash
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan optimize
php artisan queue:restart
php artisan reverb:restart
```

Genereer de `APP_KEY` niet opnieuw als er al versleutelde SMTP-instellingen bestaan.

## Realtime dependencies

Realtime gebruikt Laravel Reverb. Installeer na het uitpakken altijd de Composer dependencies voordat je Artisan-commando's uitvoert:

```bash
composer install
```

De PHP broadcasting client `pusher/pusher-php-server` staat expliciet in `composer.json`, omdat Laravel's Reverb broadcaster het Pusher-protocol gebruikt.

