--- phase: 07-pre-expansion-fixes plan: 03 subsystem: ui, security tags: [ux, status-colors, ssl-hotfix, delivery-mapping-bug] requires: - phase: 07-pre-expansion-fixes provides: Plan 07-02 SSL verification (hotfixed here) provides: - orderpro_to_allegro sync disabled (ok:false + UI disabled) - Orders list: source before ID, "ID:" prefix, sourceLabel() - Status badges colored by group color_hex from config - Darker form borders (#e2e8f0 → #b0bec5) - SSL getCaBundlePath() hotfix — nullable, CAINFO only when file exists affects: [07-04, 07-05] tech-stack: added: [] patterns: [statusColorMap, sourceLabel, conditional-curlopt-cainfo] key-files: modified: - src/Modules/Settings/AllegroStatusSyncService.php - resources/views/settings/allegro.php - src/Modules/Orders/OrdersController.php - resources/scss/shared/_ui-components.scss - public/assets/css/app.css - src/Modules/Settings/AllegroApiClient.php - src/Modules/Settings/AllegroOAuthClient.php - src/Modules/Settings/ShopproApiClient.php - src/Modules/Settings/ApaczkaApiClient.php key-decisions: - "sourceLabel() z match expression — mapuje shoppro→shopPRO, allegro→Allegro, erli→Erli" - "statusColorMap() z group color_hex — status badge inline style gdy kolor dostępny, fallback na CSS klasy" - "SSL CURLOPT_CAINFO warunkowy — null gdy żaden CA bundle nie znaleziony, cURL używa systemowego" patterns-established: - "Status coloring: statusColorMap() + inline style background-color + color:#fff" - "SSL: getCaBundlePath() nullable + withSslOptions() helper (AllegroApiClient)" duration: ~20min started: 2026-03-14 completed: 2026-03-14 --- # Phase 7 Plan 03: UX Fixes Summary **Disable orderpro_to_allegro sync, source/ID swap w liście zamówień, kolorowanie statusów, ciemniejsze bordery + hotfix SSL CA bundle** ## Performance | Metric | Value | |--------|-------| | Duration | ~20min | | Started | 2026-03-14 | | Completed | 2026-03-14 | | Tasks | 3 completed (+ checkpoint) | | Files modified | 10 | ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: orderpro_to_allegro nie daje false-positive | Pass | `ok: false` w early return | | AC-2: Opcja UI disabled | Pass | `disabled` + "(wkrótce)" na option | | AC-3: Source przed ID + prefix "ID:" | Pass | sourceLabel() + swap kolejności spanów | | AC-4: Statusy kolorowane | Pass | statusColorMap() → inline style background-color | | AC-5: Ciemniejsze obramowanie | Pass | --c-border: #e2e8f0 → #b0bec5, CSS rebuilt | ## Accomplishments - orderpro_to_allegro sync zwraca ok:false (nie ok:true), opcja UI disabled z "(wkrótce)" - Lista zamówień: source (Allegro/shopPRO/Erli) przed ID z prefixem "ID:" - Statusy kolorowane kolorem grupy z konfiguracji, fallback na CSS klasy dla niezamapowanych - Ciemniejsze obramowanie formularzy w całej aplikacji - **Hotfix SSL:** getCaBundlePath() zwraca null gdy żaden CA bundle nie znaleziony — cURL używa systemowego domyślnego, eliminuje błąd na serwerze ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `src/Modules/Settings/AllegroStatusSyncService.php` | Modified | ok:true → ok:false dla orderpro_to_allegro | | `resources/views/settings/allegro.php` | Modified | disabled + "(wkrótce)" na opcji sync direction | | `src/Modules/Orders/OrdersController.php` | Modified | sourceLabel(), statusColorMap(), statusBadge() z kolorem, swap source/ID | | `resources/scss/shared/_ui-components.scss` | Modified | --c-border: #b0bec5 | | `public/assets/css/app.css` | Rebuilt | CSS z nowym border color | | `src/Modules/Settings/AllegroApiClient.php` | Modified | getCaBundlePath() nullable + withSslOptions() | | `src/Modules/Settings/AllegroOAuthClient.php` | Modified | getCaBundlePath() nullable, warunkowy CAINFO | | `src/Modules/Settings/ShopproApiClient.php` | Modified | getCaBundlePath() nullable, warunkowy CAINFO | | `src/Modules/Settings/ApaczkaApiClient.php` | Modified | getCaBundlePath() nullable, warunkowy CAINFO | ## Decisions Made | Decision | Rationale | Impact | |----------|-----------|--------| | sourceLabel() match expression | Czytelne mapowanie 3 znanych źródeł + ucfirst fallback | Łatwe do rozszerzenia o nowe źródła | | Status color inline style | group color_hex z konfiguracji; brak kolumny color w wierszu zamówienia | Nie wymaga migracji, kolor pochodzi z istniejącej tabeli order_status_groups | | SSL CAINFO warunkowy | Serwer produkcyjny nie ma lokalnych CA bundle paths, cURL ma wbudowany systemowy | Eliminuje błąd "error setting certificate verify locations" | ## Deviations from Plan ### Summary | Type | Count | Impact | |------|-------|--------| | Auto-fixed | 1 | Critical — SSL hotfix z planu 07-02 | | Scope additions | 0 | - | | Deferred | 1 | Pre-existing bug | ### Auto-fixed Issues **1. SSL CA bundle path error na serwerze** - **Found during:** Checkpoint verification (user report) - **Issue:** getCaBundlePath() zwracał hardcoded path który nie istnieje na serwerze → cURL error - **Fix:** getCaBundlePath() zwraca null gdy brak pliku; CURLOPT_CAINFO ustawiany warunkowo - **Files:** 4 ApiClient klasy - **Verification:** User potwierdzi po deploy ### Deferred Items - **Pre-existing:** Pole "Szukaj..." w mapowaniu form dostawy Allegro — JS `attachSelectFilter()` tworzy input search dla InPost/Apaczka selectów, layout myląco wygląda jakby należał do wiersza powyżej ## Issues Encountered | Issue | Resolution | |-------|------------| | SSL error na serwerze produkcyjnym | getCaBundlePath() → nullable, CAINFO warunkowy | ## Next Phase Readiness **Ready:** - UX fixes wdrożone, lista zamówień czytelniejsza - Plan 07-04 (testy) niezależny **Concerns:** - Delivery mapping "Szukaj..." layout — pre-existing, do naprawy osobno **Blockers:** - None --- *Phase: 07-pre-expansion-fixes, Plan: 03* *Completed: 2026-03-14*