# ARCHITECTURE > Struktura klas, modulow, przeplywow i zaleznosci w projekcie. ## Phase 108 — Delivery Status Management ### DeliveryStatusRepository (`src/Modules/Shipments/DeliveryStatusRepository.php`) - CRUD dla tabeli `delivery_statuses` - Per-request static cache (`private static ?array $cache`) - Blokuje edycję/usunięcie statusów systemowych (`is_system=1`) - Blokuje usunięcie statusów używanych w `delivery_status_mappings` lub `shipment_packages` ### DeliveryStatusesController (`src/Modules/Settings/DeliveryStatusesController.php`) - Panel `/settings/delivery-statuses` - Dwie zakładki via `?tab=` param: `statuses` (CRUD) i `mapping` (embed mapowania) - Wstrzykuje `DeliveryStatusRepository` i `DeliveryStatusMappingRepository` ### DeliveryStatus::setRepository() (dynamic loading) - Wywoływane raz w `routes/web.php` po bootstrap - `label()`, `getAllOptions()`, `getAllStatuses()`, `getColor()` ladują z DB gdy repo ustawione - Fallback na hardcoded stałe gdy repo niedostępne ### AutomationController + AutomationService (Phase 108 Plan 02) - `AutomationController::buildShipmentStatusOptions()` — buduje listę opcji `[key => ['label' => ...]]` z `DeliveryStatus::getAllOptions()` (DB-driven) - Walidacja `shipment_status` warunku i `update_shipment_status` akcji w `parseConditionValue()`/`parseActionConfig()` używa `DeliveryStatus::getAllStatuses()` - `AutomationService::evaluateShipmentStatusCondition()` — bezpośrednie porównanie kluczy DB (usunięto mapping grupowy `SHIPMENT_STATUS_OPTION_MAP`) - `AutomationService::resolveStatusFromActionKey()` — bezpośredni klucz statusu z DB jako target - BREAKING: stare reguły z grupowymi kluczami (`registered`, `courier_pickup`, `dropped_at_point`, `unclaimed`, `picked_up_return`) nie matchują się — operator musi je odtworzyć przy użyciu nowych kluczy DB