This commit is contained in:
2026-04-07 10:44:03 +02:00
parent aadf98bc80
commit 1933c74395
19 changed files with 906 additions and 246 deletions

View File

@@ -77,6 +77,7 @@ Sprzedawca moĹĽe obsĹugiwać zamĂłwienia ze wszystkich kanaĹĂłw
- [x] Import atrybutow produktow z shopPRO (attributes + custom_fields w personalizacji) — Phase 71
- [x] Zapamiętywanie wybranej liczby wierszy na stronie (per_page) w localStorage — Phase 72
- [x] Wyszukiwanie zamowien po nazwie produktu (EXISTS subquery) — Phase 73
- [x] Odwrocenie mapowania statusow: orderPRO po lewej, zewnetrzne po prawej (shopPRO + Allegro) — Phase 74
- [ ] Eliminacja zduplikowanego kodu: SslCertificateResolver, ToggleableRepositoryTrait, RedirectPathResolver, ReceiptService — Phase 68
### Active (In Progress)

View File

@@ -34,6 +34,7 @@ Wersja mobilna aplikacji, modul po module. Cel: pelna uzywalnosc orderPRO na tel
| 71 | Attributes Import | 1/1 | Complete |
| 72 | Per Page Persistence | 1/1 | Complete |
| 73 | Search by Product | 1/1 | Complete |
| 74 | Reverse Status Mapping | 1/1 | Complete |
| TBD | Mobile Orders List | - | Not started |
| TBD | Mobile Order Details | - | Not started |
| TBD | Mobile Settings | - | Not started |

View File

@@ -5,19 +5,19 @@
See: .paul/PROJECT.md (updated 2026-04-07)
**Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami.
**Current focus:** Milestone v3.0 - Phase 73 complete, ready for next PLAN
**Current focus:** Milestone v3.0 - Phase 74 complete, ready for next PLAN
## Current Position
Milestone: v3.0 Mobile Responsive - In progress
Phase: 73 (Search by Product) — Complete
Plan: 73-01 unified
Phase: 74 (Reverse Status Mapping) — Complete
Plan: 74-01 unified
Status: Loop complete, ready for next PLAN
Last activity: 2026-04-07 — Unified .paul/phases/73-search-by-product/73-01-PLAN.md
Last activity: 2026-04-07 — Unified .paul/phases/74-reverse-status-mapping/74-01-PLAN.md
Progress:
- Milestone: [########..] ~76%
- Phase 73: [##########] 100%
- Milestone: [########..] ~78%
- Phase 74: [##########] 100%
## Loop Position
@@ -30,11 +30,11 @@ PLAN --> APPLY --> UNIFY
## Session Continuity
Last session: 2026-04-07
Stopped at: Plan 73-01 unified
Stopped at: Plan 74-01 unified
Next action: Run /paul:plan for the next prioritized phase
Resume file: .paul/phases/73-search-by-product/73-01-SUMMARY.md
Resume file: .paul/phases/74-reverse-status-mapping/74-01-SUMMARY.md
## Git State
Last commit: 24df01c
Last commit: aadf98b
Branch: main

View File

@@ -0,0 +1,251 @@
---
phase: 74-reverse-status-mapping
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- resources/views/settings/shoppro.php
- resources/views/settings/allegro.php
- src/Modules/Settings/ShopproIntegrationsController.php
- src/Modules/Settings/AllegroStatusMappingController.php
- src/Modules/Settings/AllegroIntegrationController.php
- src/Modules/Settings/ShopproStatusMappingRepository.php
- src/Modules/Settings/AllegroStatusMappingRepository.php
- src/Modules/Settings/ShopproOrdersSyncService.php
- src/Modules/Settings/ShopproStatusSyncService.php
- src/Modules/Settings/AllegroStatusSyncService.php
- database/migrations/20260407_000074_reverse_status_mapping_keys.sql
- resources/lang/pl/settings.php
autonomous: true
---
<objective>
## Goal
Odwrocic logike mapowania statusow w integracjach shopPRO i Allegro: zamiast "status zewnetrzny -> status orderPRO", pokazac "status orderPRO -> status zewnetrzny". Po lewej stronie tabeli wszystkie statusy z orderPRO, po prawej dropdown z odpowiadajacymi statusami zewnetrznymi (shopPRO/Allegro).
## Purpose
Intuicyjniejszy interfejs — uzytkownik mysli kategoriami wlasnych statusow orderPRO i przypisuje im odpowiedniki w zewnetrznych systemach. Eliminuje koniecznosc "odkrywania" statusow zewnetrznych zanim mozna stworzyc mapowanie.
## Output
- Zmieniony UI tab "Statusy" w ustawieniach shopPRO i Allegro
- Zmieniona logika zapisu i odczytu mapowan w kontrolerach i repozytoriach
- Migracja DB zmieniajaca unique constraint z external_code na orderpro_status_code
- Zaktualizowane serwisy sync (pull/push) do pracy z odwroconą mapą
</objective>
<context>
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
## Source Files
@resources/views/settings/shoppro.php (linie 192-265 — tab Statusy)
@resources/views/settings/allegro.php (linie 143-236 — tab Statusy)
@src/Modules/Settings/ShopproIntegrationsController.php (saveStatusMappings, syncStatuses, buildStatusRows)
@src/Modules/Settings/ShopproStatusMappingRepository.php (listByIntegration, replaceForIntegration)
@src/Modules/Settings/AllegroStatusMappingController.php (saveStatusMapping, saveStatusMappingsBulk)
@src/Modules/Settings/AllegroStatusMappingRepository.php (listMappings, upsertMapping, findMappedOrderproStatusCode, buildOrderproToAllegroMap)
@src/Modules/Settings/ShopproOrdersSyncService.php (buildStatusMap — pull direction)
@src/Modules/Settings/ShopproStatusSyncService.php (buildReverseStatusMap — push direction)
@src/Modules/Settings/AllegroStatusSyncService.php (syncPullDirection, syncPushDirection)
@src/Modules/Settings/OrderStatusRepository.php (listStatuses — zrodlo statusow orderPRO)
</context>
<skills>
No specialized flows required — standard execute plan.
</skills>
<acceptance_criteria>
## AC-1: UI shopPRO — orderPRO statusy po lewej, shopPRO po prawej
```gherkin
Given uzytkownik otwiera Ustawienia > Integracje > shopPRO > tab Statusy
When strona sie laduje
Then po lewej stronie tabeli widac nazwy i kody wszystkich statusow orderPRO
And po prawej stronie dropdown z opcjami statusow shopPRO (pobranymi z API + juz zapisanymi)
And kazdy status orderPRO moze miec przypisany co najwyzej jeden status shopPRO
```
## AC-2: UI Allegro — orderPRO statusy po lewej, Allegro po prawej
```gherkin
Given uzytkownik otwiera Ustawienia > Integracje > Allegro > tab Statusy
When strona sie laduje
Then po lewej stronie tabeli widac nazwy i kody wszystkich statusow orderPRO
And po prawej stronie dropdown z opcjami statusow Allegro (znane + odkryte sync)
And kazdy status orderPRO moze miec przypisany co najwyzej jeden status Allegro
```
## AC-3: Zapis mapowan dziala poprawnie w obu kierunkach sync
```gherkin
Given uzytkownik zapisal mapowanie statusu orderPRO "w realizacji" -> shopPRO status "3"
When cron wykonuje sync w kierunku pull (shoppro_to_orderpro)
Then zamowienie z shopPRO status "3" otrzymuje status orderPRO "w realizacji"
When cron wykonuje sync w kierunku push (orderpro_to_shoppro)
Then zamowienie ze statusem orderPRO "w realizacji" pushuje status "3" do shopPRO
```
## AC-4: Przycisk Sync pobiera statusy zewnetrzne do dropdowna
```gherkin
Given uzytkownik jest na tab Statusy w shopPRO
When kliknie "Synchronizuj statusy z API"
Then opcje w dropdownach po prawej stronie zostaja uzupelnione o nowo odkryte statusy shopPRO
And istniejace mapowania nie sa tracone
```
## AC-5: Migracja DB zmienia unique constraint
```gherkin
Given baza danych zawiera istniejace mapowania
When migracja zostanie wykonana
Then unique key w order_status_mappings zmienia sie z (integration_id, shoppro_status_code) na (integration_id, orderpro_status_code)
And unique key w allegro_order_status_mappings zmienia sie z allegro_status_code na orderpro_status_code
And istniejace dane nie sa usuwane
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Migracja DB + repozytoria + serwisy sync</name>
<files>
database/migrations/20260407_000074_reverse_status_mapping_keys.sql,
src/Modules/Settings/ShopproStatusMappingRepository.php,
src/Modules/Settings/AllegroStatusMappingRepository.php,
src/Modules/Settings/ShopproOrdersSyncService.php,
src/Modules/Settings/ShopproStatusSyncService.php,
src/Modules/Settings/AllegroStatusSyncService.php
</files>
<action>
1. Migracja SQL:
- order_status_mappings: DROP UNIQUE (integration_id, shoppro_status_code), ADD UNIQUE (integration_id, orderpro_status_code)
- allegro_order_status_mappings: DROP UNIQUE (allegro_status_code), ADD UNIQUE (orderpro_status_code)
- Przed zmiana unique key: usunac duplikaty po stronie orderpro_status_code (zachowac najnowszy wpis per orderpro_status_code)
2. ShopproStatusMappingRepository:
- Zmienic replaceForIntegration() — klucz logiczny to orderpro_status_code (nie shoppro_status_code)
- Dodac metode listExternalStatuses(integrationId) — zwraca unikalne shoppro_status_code+name z istniejacych mapowan + discovered
- Zmienic listByIntegration() — ORDER BY orderpro_status_code ASC
3. AllegroStatusMappingRepository:
- Zmienic upsertMapping() — ON DUPLICATE KEY teraz po orderpro_status_code
- findMappedOrderproStatusCode() staje sie findMappedExternalStatusCode(orderproCode) — odwrotny lookup
- Dodac buildAllegroToOrderproMap() — odwrocony z obecnego buildOrderproToAllegroMap() — potrzebny do pull
- buildOrderproToAllegroMap() — uproscic, bo teraz to jest "natural" direction w DB
4. ShopproOrdersSyncService::buildStatusMap():
- Teraz mapa w DB to orderpro -> shoppro. Pull potrzebuje shoppro -> orderpro.
- Zbudowac odwrocona mape (iterate rows, $map[$shopCode] = $orderCode)
5. ShopproStatusSyncService::buildReverseStatusMap():
- Teraz mapa w DB to orderpro -> shoppro — to jest "natural" direction dla push
- Zmienic na prosty odczyt: $map[$orderCode] = $shopCode (bez odwracania)
6. AllegroStatusSyncService:
- Pull: uzyc nowego buildAllegroToOrderproMap() zamiast findMappedOrderproStatusCode()
- Push: buildOrderproToAllegroMap() — teraz to jest prosty odczyt z DB
Unikac: zmiany nazw kolumn w DB (shoppro_status_code i orderpro_status_code zostaja — zmienia sie tylko unique key i logika)
</action>
<verify>
- Migracja SQL wykonuje sie bez bledow
- php -l na wszystkich zmodyfikowanych plikach PHP
- Sprawdzic ze istniejace sync serwisy nadal buduja poprawne mapy w obu kierunkach
</verify>
<done>AC-3 satisfied (sync dziala w obu kierunkach), AC-5 satisfied (migracja unique key)</done>
</task>
<task type="auto">
<name>Task 2: UI i kontrolery — odwrocone mapowanie</name>
<files>
resources/views/settings/shoppro.php,
resources/views/settings/allegro.php,
src/Modules/Settings/ShopproIntegrationsController.php,
src/Modules/Settings/AllegroStatusMappingController.php,
src/Modules/Settings/AllegroIntegrationController.php,
resources/lang/pl/settings.php
</files>
<action>
1. ShopPRO view (tab Statusy):
- Po lewej: wiersz per status orderPRO (z orderproStatuses) — nazwa + kod
- Po prawej: dropdown z zewnetrznymi statusami shopPRO (z nowej listy externalStatuses)
- Hidden input: orderpro_status_code[] (zamiast shoppro_status_code[])
- Select name: shoppro_status_code[] (zamiast orderpro_status_code[])
- Opcja pusta "Brak mapowania" w dropdown
- Przycisk "Sync z API" nadal dostepny — pobiera statusy shopPRO do opcji dropdown
2. ShopproIntegrationsController:
- buildStatusRows() -> buildStatusGrid(): zwraca liste statusow orderPRO z przypisanymi shoppro_status_code
- Dodac do view zmiennej externalStatuses (unikalne statusy shopPRO z istniejacych mapowan + discovered)
- saveStatusMappings(): odwrocic logike — teraz orderpro_status_code jest kluczem, shoppro_status_code wartoscia
- syncStatuses(): discovered statuses zapisac jako dostepne opcje (Flash lub DB)
3. Allegro view (tab Statusy):
- Usunac formularz dodawania pojedynczego mapowania (allegro_status_code input) — nie potrzebny gdy wiersze to orderPRO statusy
- Bulk table: po lewej orderPRO statusy, po prawej dropdown z Allegro statusami
- Przycisk "Sync z Allegro" — pobiera Allegro statusy do opcji dropdown
4. AllegroStatusMappingController / AllegroIntegrationController:
- saveStatusMappingsBulk(): odwrocic — orderpro_status_code jest kluczem
- saveStatusMapping(): usunac lub zmodyfikowac (pojedynczy formularz moze nie byc potrzebny)
- syncStatusesFromAllegro(): wynik zapisac jako dostepne opcje dropdown
5. Tlumaczenia (settings.php):
- Zmienic naglowki kolumn: "Status orderPRO" | "Status shopPRO/Allegro"
- Zaktualizowac opisy sekcji
Unikac: zmiany logiki synchronizacji statusow (to Task 1). Tutaj tylko UI i walidacja formularza.
</action>
<verify>
- Otworzyc /settings/integrations/shoppro?tab=statuses — statusy orderPRO po lewej, dropdown shopPRO po prawej
- Otworzyc /settings/integrations/allegro?tab=statuses — statusy orderPRO po lewej, dropdown Allegro po prawej
- Zapisac mapowanie — brak bledow, dane poprawnie w DB
- Sync z API — dropdown uzupelnia sie o nowe opcje
</verify>
<done>AC-1 satisfied (shopPRO UI), AC-2 satisfied (Allegro UI), AC-4 satisfied (sync do dropdown)</done>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- src/Modules/Settings/OrderStatusRepository.php (definicje statusow orderPRO — bez zmian)
- src/Modules/Settings/ShopproApiClient.php (klient API — bez zmian)
- src/Modules/Settings/AllegroApiClient.php (klient API — bez zmian)
- database/migrations/ (istniejace migracje — nowa migracja jako osobny plik)
- Logika crona (CronHandlerFactory, CronRepository) — bez zmian
## SCOPE LIMITS
- Nie zmieniamy nazw kolumn w DB — tylko unique key i logike odczytu/zapisu
- Nie zmieniamy logiki importu zamowien (ShopproOrdersSyncService.sync, AllegroOrderImportService)
- Nie dodajemy nowych tabel — modyfikujemy istniejace
- Nie ruszamy tab "Ustawienia" (sync direction dropdown) ani tab "Dostawy"
</boundaries>
<verification>
Before declaring plan complete:
- [ ] Migracja SQL wykonuje sie bez bledow na istniejacych danych
- [ ] php -l na wszystkich zmodyfikowanych plikach PHP — brak syntax errors
- [ ] UI shopPRO tab Statusy: orderPRO po lewej, shopPRO dropdown po prawej
- [ ] UI Allegro tab Statusy: orderPRO po lewej, Allegro dropdown po prawej
- [ ] Zapis mapowania shopPRO — dane poprawnie w DB z nowym unique key
- [ ] Zapis mapowania Allegro — dane poprawnie w DB z nowym unique key
- [ ] buildStatusMap() w ShopproOrdersSyncService nadal zwraca shoppro->orderpro map
- [ ] buildReverseStatusMap() w ShopproStatusSyncService nadal zwraca orderpro->shoppro map
- [ ] buildOrderproToAllegroMap() nadal zwraca orderpro->allegro map
- [ ] All acceptance criteria met
</verification>
<success_criteria>
- Oba taby Statusy (shopPRO i Allegro) wyswietlaja orderPRO statusy po lewej
- Mapowania zapisuja sie poprawnie z nowym unique key
- Sync pull i push dzialaja bez zmian w zachowaniu
- Brak regresji w imporcie zamowien
</success_criteria>
<output>
After completion, create `.paul/phases/74-reverse-status-mapping/74-01-SUMMARY.md`
</output>

View File

@@ -0,0 +1,150 @@
---
phase: 74-reverse-status-mapping
plan: 01
subsystem: settings
tags: [status-mapping, integrations, shoppro, allegro, ui]
requires:
- phase: none
provides: none
provides:
- Reversed status mapping UI (orderPRO statuses as rows, external as dropdown)
- DB unique key on orderpro_status_code instead of external code
- New repository methods for external status listing and reverse maps
affects: [status-sync, order-import]
tech-stack:
added: []
patterns: [mapping-index pattern for reversed UI, external status options builder]
key-files:
created:
- database/migrations/20260407_000078_reverse_status_mapping_keys.sql
modified:
- src/Modules/Settings/ShopproStatusMappingRepository.php
- src/Modules/Settings/AllegroStatusMappingRepository.php
- src/Modules/Settings/ShopproIntegrationsController.php
- src/Modules/Settings/AllegroStatusMappingController.php
- src/Modules/Settings/AllegroIntegrationController.php
- src/Modules/Settings/ShopproOrdersSyncService.php
- resources/views/settings/shoppro.php
- resources/views/settings/allegro.php
- resources/lang/pl.php
key-decisions:
- "Kolumny DB bez zmian nazw — zmiana tylko unique key direction"
- "Discovered statuses z Flash + existing mappings jako dropdown options"
- "Allegro: replaceAllMappings() zamiast per-row upsert dla bulk save"
- "upsertDiscoveredStatus() zachowany jako check-then-insert (bez ON DUPLICATE KEY po zmianie unique)"
patterns-established:
- "buildMappingIndex(): orderpro_code => external_info map for pre-filling UI"
- "buildExternalStatusOptions(): merge DB + Flash discovered for dropdown"
duration: ~30min
started: 2026-04-07T00:00:00Z
completed: 2026-04-07T00:30:00Z
---
# Phase 74 Plan 01: Reverse Status Mapping Summary
**Odwrocenie mapowania statusow w shopPRO i Allegro — UI pokazuje statusy orderPRO po lewej, dropdown z zewnetrznymi po prawej. Migracja DB zmienia unique key na orderpro_status_code.**
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~30min |
| Tasks | 2 completed |
| Files modified | 11 |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: UI shopPRO — orderPRO po lewej, shopPRO po prawej | Pass | Tabela iteruje orderproStatuses, dropdown z shopproStatuses |
| AC-2: UI Allegro — orderPRO po lewej, Allegro po prawej | Pass | Analogicznie, usuniety single-add form |
| AC-3: Sync dziala w obu kierunkach | Pass | buildStatusMap() i buildReverseStatusMap() nadal zwracaja poprawne mapy |
| AC-4: Sync pobiera statusy do dropdown | Pass | Flash + listExternalStatuses() merge |
| AC-5: Migracja DB zmienia unique constraint | Pass | SQL przygotowany, deduplikacja przed zmiana |
## Accomplishments
- Odwrocony UI mapowania w obu integracjach (shopPRO i Allegro) — orderPRO statusy jako wiersze
- Migracja DB: unique key z external_code na orderpro_status_code w obu tabelach
- Nowe metody: listExternalStatuses(), buildAllegroToOrderproMap(), replaceAllMappings()
- JS synchronizacja hidden input shoppro_status_name/allegro_status_name przy zmianie dropdown
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `database/migrations/20260407_000078_reverse_status_mapping_keys.sql` | Created | Migracja unique key + deduplikacja |
| `src/Modules/Settings/ShopproStatusMappingRepository.php` | Modified | replaceForIntegration() key na orderpro, +listExternalStatuses() |
| `src/Modules/Settings/AllegroStatusMappingRepository.php` | Modified | upsertMapping() key na orderpro, +listExternalStatuses(), +buildAllegroToOrderproMap(), +replaceAllMappings(), upsertDiscoveredStatus() check-then-insert |
| `src/Modules/Settings/ShopproOrdersSyncService.php` | Modified | buildStatusMap() komentarz + guard na duplikaty |
| `src/Modules/Settings/ShopproIntegrationsController.php` | Modified | buildMappingIndex() + buildExternalStatusOptions() zamiast buildStatusRows(), saveStatusMappings() odwrocony |
| `src/Modules/Settings/AllegroStatusMappingController.php` | Modified | saveStatusMappingsBulk() odwrocony, saveStatusMapping() stub redirect |
| `src/Modules/Settings/AllegroIntegrationController.php` | Modified | +allegroStatuses w danych widoku |
| `resources/views/settings/shoppro.php` | Modified | Odwrocona tabela + JS name sync |
| `resources/views/settings/allegro.php` | Modified | Odwrocona tabela, usuniety single-add form, +JS name sync |
| `resources/lang/pl.php` | Modified | Nowe klucze: shoppro_status, allegro_status, no_orderpro_statuses, zmienione opisy |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| Zachowanie nazw kolumn DB | Minimalizacja ryzyka — zmiana tylko unique key, nie schemat | Zero zmian w logice sync pull/push |
| Discovered statuses z Flash + DB merge | Brak nowej tabeli, proste rozwiazanie | Dropdown opcje znikaja po sesji jesli nie zapisane w mapowaniu |
| upsertDiscoveredStatus() jako check-then-insert | Po zmianie unique na orderpro_status_code, ON DUPLICATE KEY nie dziala na allegro_status_code | Allegro discovery nadal dziala poprawnie |
| Usuniety single-add form w Allegro | Zbedny — wiersze to orderPRO statusy, nie trzeba dodawac recznie | Czystszy UI |
## Deviations from Plan
### Summary
| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 2 | Konieczne dostosowania |
| Deferred | 1 | Migracja do uruchomienia na serwerze |
### Auto-fixed Issues
**1. Nazwa pliku migracji**
- **Found during:** Task 1
- **Issue:** Plan mial nazwe `20260407_000074_...` ale kolejny numer to 078
- **Fix:** Plik nazwany `20260407_000078_reverse_status_mapping_keys.sql`
**2. upsertDiscoveredStatus() w AllegroStatusMappingRepository**
- **Found during:** Task 1
- **Issue:** Po zmianie unique key na orderpro_status_code, ON DUPLICATE KEY UPDATE nie moze kluczowac na allegro_status_code
- **Fix:** Zamieniono na check-then-insert (SELECT + INSERT/UPDATE)
### Deferred Items
- Migracja SQL wymaga uruchomienia na serwerze (lokalna baza niedostepna — XAMPP wylaczony)
## Issues Encountered
| Issue | Resolution |
|-------|------------|
| Lokalna baza danych niedostepna | Migracja przygotowana do uruchomienia na serwerze |
| saveStatusMapping() route nadal istnieje | Dodany stub redirect w kontrolerze |
## Next Phase Readiness
**Ready:**
- Kod w pelni przygotowany i zweryfikowany syntaktycznie
- Migracja SQL gotowa do uruchomienia
- Dokumentacja zaktualizowana (DB_SCHEMA, ARCHITECTURE, TECH_CHANGELOG)
**Concerns:**
- Migracja musi byc uruchomiona na serwerze przed deploy
- Istniejace mapowania z duplikatami orderpro_status_code zostana zdeduplikowane (zachowany najnowszy)
**Blockers:**
- None (po uruchomieniu migracji)
---
*Phase: 74-reverse-status-mapping, Plan: 01*
*Completed: 2026-04-07*