# Dockplanner — Drop-in backend patch voor blokkeringslogica

Doel: tijdsloten **blokkeren** (als bezet tonen) tijdens:
- **Trailer afkoppelen** (van `start_at` t/m `stop_at` in `dock_trailer_hold`)
- **Doorloop** tot **Lossen afgerond** (laatste status != `lossen_afgerond` → blokkeer vanaf boekingstart tot dag-einde of eigen eindtijd)

Deze patch wijzigt alleen de **server**. Je hoeft je front-end niet aan te passen.

---

## Optie A — Minimale integratie in `list_bookings.php`

1) **Kopieer** deze twee bestanden:
```
/api/booking/_blocks_lib.php
/api/booking/list_blocks.php   (optioneel: handige debug/controle endpoint)
```

2) **Open** je bestaande `/api/booking/list_bookings.php` en voeg **onder** je `$pdo` & gekozen `$date` toe:

```php
require_once __DIR__ . '/_blocks_lib.php';
$__dp_blocks = dp_get_blocks_for_day($pdo, $date);
```

3) **Toepassen op je slot-grid** net **nadat** je je slots-array hebt opgebouwd, maar **vóór** je `json_encode`:

Stel je slotgrid heet `$grid` in de vorm `$grid[$dockId][] = ['start'=>..., 'stop'=>..., 'type'=>'free'|'booked', 'label'=>...];`
Voeg dan toe:

```php
$grid = dp_apply_blocks_to_grid($grid, $__dp_blocks);
```

4) **Kleur in de front-end** (optioneel):
- Als je `'type' => 'blocked'` gebruikt, geef die grijs weer:
```css
.slot-card.blocked { background: #334155 !important; border-color:#475569 !important; opacity:.85; }
```
- Of laat `'blocked'` dezelfde stijl krijgen als `'booked'` als je dat liever hebt.

> Let op: als jouw velden niet `type`/`status` heten of je slotstructuur afwijkt, pas dat heel kort aan in `dp_apply_blocks_to_grid()`. Het is één if/else.

---

## Optie B — Los endpoint gebruiken (zonder je huidige endpoint te wijzigen)

Laat `/api/booking/list_blocks.php?date=YYYY-MM-DD` naast je huidige `list_bookings.php` draaien.  
Dit geeft `[{dock_id,start,stop,reason}]` terug. Je kunt (nu of later) een dun front-end laagje maken dat na het tekenen van de vrije slots alle overlappende slots visueel **blocked** zet.

---

## Waarom dit werkt

- **Trailer afkoppelen**: we lezen `dock_trailer_hold` uit en blokkeren precies de ingevulde interval(len).  
- **Doorloop tot Lossen afgerond**: voor elke boeking nemen we de **laatste status** uit `dock_booking_status`. Zolang die niet `'lossen_afgerond'` is, markeren we vanaf de **boekingstart** tot **einde dag** (of eindtijd wanneer je die gebruikt) als bezet.

Beide bronnen worden samengevoegd tot één lijst *blocks*, en daarna simpel op elke slot vergeleken via een **overlap**-check.

---

## Veiligheid / performance

- SQL is index-vriendelijk (`start_at`, `stop_at`, `dock_id`, datumfilter op `dock_bookings.start_time`).  
- De overlap-check is O(N*M) per dock; met 30-min slots is dit licht. Eventueel kun je blocks per dock pre-groeperen.

Heb je je specifieke grid-array? Dan pas ik `dp_apply_blocks_to_grid()` graag exact op jouw velden aan.
