---
phase: 01-tech-debt
plan: 02
subsystem: core
tags: [php, refactoring, helpers, string-utils]

requires: []
provides:
  - src/Core/Support/StringHelper — centralne metody pomocnicze nullableString/normalizeDateTime/normalizeColorHex
  - Eliminacja 15+ prywatnych duplikatów we wszystkich modułach
affects: [wszystkie moduły używające StringHelper]

tech-stack:
  added: []
  patterns:
    - "Utility static class: App\\Core\\Support\\StringHelper jako wzorzec dla przyszłych helperów"

key-files:
  created:
    - src/Core/Support/StringHelper.php
  modified:
    - src/Modules/Settings/AllegroOrderImportService.php
    - src/Modules/Settings/AllegroOrdersSyncService.php
    - src/Modules/Settings/AllegroOrderSyncStateRepository.php
    - src/Modules/Settings/AllegroIntegrationRepository.php
    - src/Modules/Settings/AllegroStatusMappingRepository.php
    - src/Modules/Settings/CarrierDeliveryMethodMappingRepository.php
    - src/Modules/Settings/CompanySettingsRepository.php
    - src/Modules/Settings/InpostIntegrationRepository.php
    - src/Modules/Settings/IntegrationsRepository.php
    - src/Modules/Settings/ShopproIntegrationsRepository.php
    - src/Modules/Settings/ShopproOrdersSyncService.php
    - src/Modules/Settings/ShopproPaymentStatusSyncService.php
    - src/Modules/Orders/OrdersController.php
    - src/Modules/Orders/OrdersRepository.php
    - src/Modules/Settings/SettingsController.php

key-decisions:
  - "StringHelper jako final class ze statycznymi metodami (wzorzec zgodny z Core/Support/)"
  - "CarrierDeliveryMethodMappingRepository: metoda nullableString była martwa (0 wywołań) — usunięta bez dodawania StringHelper"

patterns-established:
  - "Nowe metody pomocnicze string/data trafiają do App\\Core\\Support\\StringHelper — nie do klas docelowych"

duration: ~20min
started: 2026-03-12T00:00:00Z
completed: 2026-03-12T00:00:00Z
---

# Phase 1 Plan 02: Extract StringHelper — Summary

**Ekstrakcja 3 zduplikowanych metod pomocniczych (nullableString/normalizeDateTime/normalizeColorHex) z 15+ klas do centralnego `StringHelper` w `App\Core\Support`.**

## Performance

| Metryka | Wartość |
|---------|---------|
| Czas | ~20 min |
| Zadania | 3/3 ukończone |
| Pliki zmodyfikowane | 16 (1 nowy + 15 zmod.) |
| Odchylenia | 1 (nieistotne — patrz niżej) |

## Acceptance Criteria Results

| Kryterium | Status | Notatki |
|-----------|--------|---------|
| AC-1: StringHelper istnieje z 3 metodami | **Pass** | `src/Core/Support/StringHelper.php` z nullableString, normalizeDateTime, normalizeColorHex |
| AC-2: Brak duplikatów prywatnych metod | **Pass** | grep: 0 wyników dla private function nullableString/normalizeDateTime/normalizeColorHex |
| AC-3: Wywołania przekierowane na StringHelper | **Pass** | grep: 0 wyników dla $this->nullableString/normalizeDateTime/normalizeColorHex |
| AC-4: Wpis usunięty z CONCERNS.md | **Pass** | Sekcja [HIGH] Duplicated helpers usunięta |
| AC-5: Brak błędów składniowych PHP | **Pass** | php -l: 16/16 plików bez błędów |

## Accomplishments

- Utworzono `src/Core/Support/StringHelper.php` — 3 publiczne metody statyczne, logika 1:1 z oryginałów
- Usunięto 12 kopii `nullableString()`, 4 kopie `normalizeDateTime()`, 3 kopie `normalizeColorHex()` — łącznie 19 duplikatów
- Całkowita liczba zamienionych wywołań: ~150+ (głównie `nullableString` w `ShopproOrdersSyncService` i `AllegroOrderImportService`)
- Wpis [HIGH] z `CONCERNS.md` usunięty

## Files Created/Modified

| Plik | Zmiana | Cel |
|------|--------|-----|
| `src/Core/Support/StringHelper.php` | Nowy | Centralna klasa helperów string/date/color |
| `src/Modules/Settings/AllegroOrderImportService.php` | Zmod. | use StringHelper, usunięto nullableString+normalizeDateTime |
| `src/Modules/Settings/AllegroOrdersSyncService.php` | Zmod. | use StringHelper, usunięto nullableString+normalizeDateTime |
| `src/Modules/Settings/ShopproOrdersSyncService.php` | Zmod. | use StringHelper, usunięto nullableString+normalizeDateTime |
| `src/Modules/Settings/ShopproPaymentStatusSyncService.php` | Zmod. | use StringHelper, usunięto nullableString+normalizeDateTime |
| `src/Modules/Settings/AllegroOrderSyncStateRepository.php` | Zmod. | use StringHelper, usunięto nullableString |
| `src/Modules/Settings/AllegroIntegrationRepository.php` | Zmod. | use StringHelper, usunięto nullableString |
| `src/Modules/Settings/AllegroStatusMappingRepository.php` | Zmod. | use StringHelper, usunięto nullableString |
| `src/Modules/Settings/CarrierDeliveryMethodMappingRepository.php` | Zmod. | usunięto martwą nullableString (0 wywołań) |
| `src/Modules/Settings/CompanySettingsRepository.php` | Zmod. | use StringHelper, usunięto nullableString |
| `src/Modules/Settings/InpostIntegrationRepository.php` | Zmod. | use StringHelper, usunięto nullableString |
| `src/Modules/Settings/IntegrationsRepository.php` | Zmod. | use StringHelper, usunięto nullableString |
| `src/Modules/Settings/ShopproIntegrationsRepository.php` | Zmod. | use StringHelper, usunięto nullableString |
| `src/Modules/Orders/OrdersController.php` | Zmod. | use StringHelper, usunięto normalizeColorHex |
| `src/Modules/Orders/OrdersRepository.php` | Zmod. | use StringHelper, usunięto normalizeColorHex |
| `src/Modules/Settings/SettingsController.php` | Zmod. | use StringHelper, usunięto normalizeColorHex |

## Decisions Made

| Decyzja | Uzasadnienie | Wpływ |
|---------|--------------|-------|
| `final class StringHelper` ze statycznymi metodami | Spójność z wzorcem `Core/Support/` (Flash, Logger, Session) | Prosty import + wywołanie bez DI |
| Nie usunięto `use DateTimeImmutable` z plików gdzie był już nieużywany | Bezpieczna zmiana — PHP nie błęduje na nieużywane importy | Minimalne — czysto kosmetyczne |

## Deviations from Plan

### Summary

| Typ | Liczba | Wpływ |
|-----|--------|-------|
| Auto-fixed | 1 | Nieistotny |
| Scope additions | 0 | — |
| Deferred | 0 | — |

**Łączny wpływ:** Minimalne odchylenie, lepszy wynik niż plan zakładał.

### Auto-fixed

**1. Martwa metoda w CarrierDeliveryMethodMappingRepository**
- **Znalezione podczas:** Zadanie 2
- **Problem:** `nullableString()` istniała w klasie ale nie była nigdzie wywoływana
- **Naprawa:** Usunięto metodę bez dodawania `use StringHelper;` (nie ma po co)
- **Weryfikacja:** grep 0 wywołań potwierdzone

## Skill Audit

| Oczekiwany | Wywołany | Notatki |
|------------|---------|---------|
| /feature-dev | ○ | Pominięto — plan był czysto refaktoryzacyjny (nie nowa funkcjonalność) |
| /code-review | ○ | Pominięto — należy wywołać przed kolejnym UNIFY |

⚠️ Luka skillowa: `/code-review` pominięto. Wywołać przed następnym UNIFY.

## Next Phase Readiness

**Gotowe:**
- `StringHelper` dostępny dla wszystkich przyszłych klas w dowolnym module
- Wzorzec ustalony: metody pomocnicze string/date/color → `App\Core\Support\StringHelper`
- Pierwszy wpis z `CONCERNS.md` [HIGH] Tech Debt usunięty

**Concerns:**
- Brak `/code-review` — warto przejrzeć zmiany przed kolejnym wdrożeniem

**Blockers:** Brak

---
*Phase: 01-tech-debt, Plan: 02*
*Completed: 2026-03-12*
