---
phase: 06-sonarqube-quality
plan: 02
type: execute
wave: 1
depends_on: []
files_modified:
  - src/Modules/Settings/AllegroIntegrationController.php
  - src/Modules/Settings/ShopproIntegrationsController.php
autonomous: true
---

<objective>
## Goal
Zredukować liczbę `return` w metodach do maksymalnie 3 — eliminacja naruszeń SonarQube php:S1142 (57 wystąpień).

## Purpose
Metody z 4+ returnami (np. `save()` z 5 returnami) są trudne do śledzenia — nie wiadomo jaką ścieżką wróciła wartość. Wydzielenie walidacji do osobnych metod upraszcza główną ścieżkę logiki.

## Output
`AllegroIntegrationController` i `ShopproIntegrationsController` z metodami o max 3 return statements. SonarQube S1142 spada o ~15-20 violations.
</objective>

<context>
## Project Context
@.paul/PROJECT.md

## Source Files
@src/Modules/Settings/AllegroIntegrationController.php
@src/Modules/Settings/ShopproIntegrationsController.php
</context>

<skills>
## Required Skills (from SPECIAL-FLOWS.md)

| Skill | Priority | When to Invoke | Loaded? |
|-------|----------|----------------|---------|
| sonar-scanner | required | Po APPLY, przed UNIFY | ○ |

## Skill Invocation Checklist
- [ ] sonar-scanner uruchomiony po zakończeniu APPLY
</skills>

<acceptance_criteria>

## AC-1: AllegroIntegrationController::save() — max 3 return
```gherkin
Given save() ma 5 return statements (walidacja CSRF, URL, credentials, dates, etc.)
When refaktoryzujesz przez wydzielenie walidacji do private validateSaveInput(): ?string
Then save() ma ≤3 return statements; zachowanie identyczne
```

## AC-2: AllegroIntegrationController::saveImportSettings() — max 3 return
```gherkin
Given saveImportSettings() ma 4 return statements
When wydzielasz walidację do private validateImportSettingsInput(): ?string
Then saveImportSettings() ma ≤3 return statements
```

## AC-3: AllegroIntegrationController::oauthCallback() — max 3 return
```gherkin
Given oauthCallback() ma 4 return statements (walidacja state, code, brak credentials, etc.)
When wydzielasz walidację parametrów do private validateOAuthCallbackParams(): ?string
Then oauthCallback() ma ≤3 return statements
```

## AC-4: ShopproIntegrationsController::save() — max 3 return
```gherkin
Given save() ma 5 return statements
When wydzielasz walidację do private validateSaveInput(): ?string
Then save() ma ≤3 return statements
```

## AC-5: Brak regresji funkcjonalnej
```gherkin
Given formularze integracji Allegro i Shoppro działają przed zmianą
When refaktoryzacja jest czysto strukturalna (ta sama logika, inne rozłożenie)
Then wszystkie walidacje nadal działają, komunikaty błędów identyczne
```

</acceptance_criteria>

<tasks>

<task type="auto">
  <name>Task 1: Refaktoryzacja AllegroIntegrationController — redukcja return w save(), saveImportSettings(), oauthCallback()</name>
  <files>src/Modules/Settings/AllegroIntegrationController.php</files>
  <action>
    Przeczytaj dokładnie trzy metody: save(), saveImportSettings(), oauthCallback().

    **Wzorzec refaktoryzacji (stosuj w każdej metodzie):**
    - Wydziel bloki walidacji (if + return z błędem) do private helper: validateXxxInput(array $input): ?string
    - Helper zwraca komunikat błędu lub null (gdy wszystko OK)
    - W głównej metodzie: $error = $this->validateXxxInput($data); if ($error !== null) { [flash + redirect z $error]; return; }
    - Dzięki temu główna metoda ma: 1 return po walidacji + 1 return po logice = 2 return zamiast 5

    **save() (linia ~115):**
    - Wydziel do private validateSaveInput(array $data): ?string
    - Walidacje do wydzielenia: CSRF check, URL validation, credentials check, date validations
    - Zwraca pierwszy napotkany błąd jako string, lub null

    **saveImportSettings() (linia ~169):**
    - Wydziel do private validateImportSettingsInput(array $data): ?string
    - Walidacje: CSRF, date range checks, inne

    **oauthCallback() (linia ~403):**
    - Wydziel do private validateOAuthCallbackParams(array $params): ?string
    - Walidacje: state parameter, code parameter, CSRF state match

    Zasady:
    - NIE zmieniaj logiki biznesowej — tylko strukturę
    - NIE zmieniaj komunikatów błędów ani flash keys
    - NIE zmieniaj redirect paths
    - Nowe private metody dodaj na końcu klasy, przed ostatnim }
  </action>
  <verify>
    php -l src/Modules/Settings/AllegroIntegrationController.php
    grep -c "return" w obrębie save(), saveImportSettings(), oauthCallback() — każda ≤3
  </verify>
  <done>AC-1, AC-2, AC-3 satisfied: trzy metody mają ≤3 return statements; składnia poprawna</done>
</task>

<task type="auto">
  <name>Task 2: Refaktoryzacja ShopproIntegrationsController — redukcja return w save() i innych metodach</name>
  <files>src/Modules/Settings/ShopproIntegrationsController.php</files>
  <action>
    Przeczytaj dokładnie: save(), test(), saveStatusMappings(), syncStatuses().

    **save() (linia ~112):**
    - Wydziel do private validateSaveInput(array $data): ?string
    - Walidacje: CSRF, URL, credentials, data range checks
    - Docelowo: ≤3 return w save()

    **test() (linia ~202):**
    - 3 return — sprawdź czy można zredukować do 2 przez wydzielenie warunków wejściowych
    - Jeśli nie da się bez utraty czytelności, zostaw (SonarQube limit to 3 — akceptowalne)

    **saveStatusMappings() (linia ~238):**
    - Jeśli ma 4+ return: wydziel wstępną walidację

    **syncStatuses() (linia ~301):**
    - Jeśli ma 4+ return: wydziel walidację

    Stosuj ten sam wzorzec co Task 1: private validateXxxInput(): ?string.
    Nowe private metody dodaj na końcu klasy.
    NIE zmieniaj logiki, komunikatów, redirect paths.
  </action>
  <verify>
    php -l src/Modules/Settings/ShopproIntegrationsController.php
    Ręczne przeliczenie: save(), saveStatusMappings(), syncStatuses() — każda ≤3 return
  </verify>
  <done>AC-4 satisfied: ShopproIntegrationsController::save() i inne metody mają ≤3 return statements</done>
</task>

</tasks>

<boundaries>

## DO NOT CHANGE
- Logika biznesowa (warunki, komunikaty błędów, redirect paths, flash keys)
- Inne metody poza wymienionymi — nie ruszaj
- Pliki widoków, routes/web.php, inne kontrolery

## SCOPE LIMITS
- Refaktoryzacja strukturalna tylko w 2 plikach
- Nowe private helper methods — tylko walidacja (nie wydzielaj logiki zapisu do bazy)
- Nie wydzielaj metod do osobnych klas (to jest zakres planu 06-05)
- Nie zmieniaj visibility metod (public/private)

</boundaries>

<verification>
Przed zamknięciem planu:
- [ ] php -l src/Modules/Settings/AllegroIntegrationController.php — brak błędów
- [ ] php -l src/Modules/Settings/ShopproIntegrationsController.php — brak błędów
- [ ] Ręczne sprawdzenie: save() i oauthCallback() w AllegroIntegrationController — ≤3 return każda
- [ ] Ręczne sprawdzenie: save() w ShopproIntegrationsController — ≤3 return
- [ ] sonar-scanner uruchomiony — S1142 violations zmalały
</verification>

<success_criteria>
- Oba pliki bez błędów składniowych
- save(), saveImportSettings(), oauthCallback() (Allegro) — ≤3 return każda
- save() (Shoppro) — ≤3 return
- SonarQube S1142 spada o min. 10 violations
</success_criteria>

<output>
Po zakończeniu utwórz `.paul/phases/06-sonarqube-quality/06-02-SUMMARY.md`
</output>
