PATCH INSTRUCTIES — INTEGRATIE dock_carrier_preference IN ASSIGNMENT ==================================================================== Hiermee gaan exclusieve dock-reserveringen ook daadwerkelijk werken bij het boeken en bij automatische dock-toewijzing. Bestand: api/booking/_dock_assignment_lib.php WIJZIGING 1: require_once toevoegen bovenaan =============================================== Zoek de regel: require_once __DIR__ . '/_outbound_occupancy_lib.php'; Voeg eronder toe: require_once __DIR__ . '/_dock_carrier_pref_lib.php'; WIJZIGING 2: uitbreiden dp_booking_validate_dock_assignment() =============================================== Zoek de functie `function dp_booking_validate_dock_assignment(...)` (rond regel 215). Pas de signature aan om carrier_id mee te geven: // VOORHEEN: function dp_booking_validate_dock_assignment(PDO $pdo, int $dockId, string $mode, string $date, string $startAt, string $stopAt, int $ignoreBookingId = 0, ?array $ctx = null): array // NA PATCH: function dp_booking_validate_dock_assignment(PDO $pdo, int $dockId, string $mode, string $date, string $startAt, string $stopAt, int $ignoreBookingId = 0, ?array $ctx = null, int $carrierId = 0): array Voeg vlak na de bestaande mode-check (regel 222) deze nieuwe check toe: // PATCH-5: dock_carrier_preference check // Als dit dock exclusief is gereserveerd voor bepaalde vervoerders, // mag alleen die carrier_id boeken. $carrierId=0 betekent anonymous/ // onbekende carrier → dan weigeren op exclusief dock. if (function_exists('dp_dock_has_exclusive_prefs') && dp_dock_has_exclusive_prefs($pdo, $dockId)) { if ($carrierId <= 0 || !dp_dock_is_allowed_for_carrier_id($pdo, $dockId, $carrierId)) { return [ 'ok' => false, 'error' => 'dock_reserved_for_other_carrier', 'detail' => 'Dit dock is exclusief gereserveerd voor andere vervoerder(s).', 'dock' => $dock, ]; } } WIJZIGING 3: callers moeten carrier_id doorgeven =============================================== Alle callers van dp_booking_validate_dock_assignment() moeten nu ook carrier_id meegeven. Meest voorkomende callers: - api/booking/create_booking.php (carrier via $_POST) - api/booking/create_booking_planner.php - api/booking/carrier_update_booking.php - api/booking/reassign_dock.php Zoek in elk van die bestanden naar `dp_booking_validate_dock_assignment(` en voeg als laatste argument de carrier_id toe. Voorbeeld: // VOORHEEN: $val = dp_booking_validate_dock_assignment($pdo, $dockId, $mode, $date, $startAt, $stopAt, $ignoreBookingId, $DP); // NA PATCH: // Bepaal carrier_id uit de booking (carrier-naam → lookup) $carrierId = 0; if (!empty($carrierName)) { $stC = $pdo->prepare("SELECT id FROM carriers WHERE naam = :n LIMIT 1"); $stC->execute([':n' => $carrierName]); $carrierId = (int)($stC->fetchColumn() ?: 0); } $val = dp_booking_validate_dock_assignment($pdo, $dockId, $mode, $date, $startAt, $stopAt, $ignoreBookingId, $DP, $carrierId); WIJZIGING 4 (optioneel, AUTO-assignment): voorkeur voor eigen docks =============================================== Voor automatische dock-toewijzing in `dp_eta_find_earliest` / vergelijkbare functies: als een carrier eigen preferred docks heeft, zet die vooraan in de `$dockOrder` lijst. Dit gebeurt al voor `carrier_preferences` (oude tabel), maar niet voor de nieuwe `dock_carrier_preference`. In update_status.php rond regel 124-148 (pull-forward dock-prioritering): // Na de bestaande carrier_preferences lookup: // ... // $pref = ($carrier !== '' && isset($prefMap[$carrier])) ? $prefMap[$carrier] : null; // ... // Voeg HIER toe (voor de dockOrder-opbouw): // PATCH-5: dock_carrier_preference heeft prioriteit over carrier_preferences if ($carrier !== '' && function_exists('dp_dock_prefs_for_carrier_id')) { try { $stC = $pdo->prepare("SELECT id FROM carriers WHERE naam = :n LIMIT 1"); $stC->execute([':n' => $carrier]); $carrierId = (int)($stC->fetchColumn() ?: 0); if ($carrierId > 0) { $explicitPrefDocks = dp_dock_prefs_for_carrier_id($pdo, $carrierId); if ($explicitPrefDocks) { // Gebruik dock_carrier_preference als PRIMARY prefs; oude carrier_preferences // komt daarachter. $pref = array_merge($explicitPrefDocks, $pref ?: []); } } } catch (Throwable $e) { /* ignore */ } } KLAAR =============================================== Na deze integratie: * Boekingen op exclusief-gereserveerde docks worden afgewezen voor niet- gemachtigde vervoerders (ook bij handmatige planner-toewijzing) * Auto-dock-toewijzing en pull-forward geven voorrang aan eigen docks * list_slots / capacity_view filteren automatisch gereserveerde docks uit voor carriers die er niet bij mogen (via het nieuwe path)