---
phase: 21-order-source-display
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
  - src/Modules/Orders/OrdersRepository.php
  - src/Modules/Orders/OrdersController.php
  - resources/views/orders/show.php
autonomous: true
---

<objective>
## Goal
Poprawic wyswietlanie zrodla zamowienia na liscie zamowien i stronie szczegulow:
1. (todo #15) Upewnic sie, ze w `orders-ref__meta` kolejnosc to: zrodlo, potem ID (weryfikacja — kod juz moze byc poprawny)
2. (todo #17) Zamiast generycznego "shopPRO" wyswietlac nazwe konkretnej integracji z tabeli `integrations` (np. "Moj Sklep 1"). Dotyczy listy zamowien i strony szczegulow. Dodac prefiks "ID:" przed identyfikatorem zamowienia.

## Purpose
Sprzedawca z wieloma sklepami shopPRO musi wiedziec, z ktorego konkretnie sklepu pochodzi zamowienie.

## Output
Zmodyfikowane pliki: OrdersRepository.php, OrdersController.php, show.php
</objective>

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

## Source Files
@src/Modules/Orders/OrdersRepository.php
@src/Modules/Orders/OrdersController.php
@resources/views/orders/show.php
@DOCS/todo.md
</context>

<skills>
No specialized flows required for this plan.
</skills>

<acceptance_criteria>

## AC-1: Integration name displayed on orders list
```gherkin
Given zamowienie pochodzi z integracji shopPRO o nazwie "Moj Sklep"
When uzytkownik otwiera liste zamowien
Then w kolumnie "Numer" w sekcji orders-ref__meta widzi "Moj Sklep" zamiast "shopPRO"
  And widzi "ID: <source_order_id>" jako drugi element
```

## AC-2: Integration name displayed on order detail page
```gherkin
Given zamowienie pochodzi z integracji shopPRO o nazwie "Moj Sklep"
When uzytkownik otwiera szczegoly zamowienia
Then w naglowku pod numerem zamowienia widzi "Moj Sklep" i identyfikator zamowienia
```

## AC-3: Allegro/Erli orders unaffected
```gherkin
Given zamowienie pochodzi z Allegro
When uzytkownik otwiera liste zamowien
Then w sekcji orders-ref__meta widzi "Allegro" jako zrodlo (bez zmian)
  And widzi "ID: <source_order_id>" jako identyfikator
```

## AC-4: Source first, ID second in meta
```gherkin
Given dowolne zamowienie na liscie
When uzytkownik patrzy na kolumne "Numer"
Then pierwszy span w orders-ref__meta to nazwa zrodla/integracji
  And drugi span to "ID: <identyfikator>"
```

</acceptance_criteria>

<tasks>

<task type="auto">
  <name>Task 1: Dodac integration name do query listy i szczegulow</name>
  <files>src/Modules/Orders/OrdersRepository.php</files>
  <action>
    1. W `buildListSql()`: dodac LEFT JOIN do tabeli `integrations`:
       ```
       LEFT JOIN integrations ig ON ig.id = o.integration_id
       ```
       Dodac kolumne `ig.name AS integration_name` do SELECT.

    2. W `transformOrderRow()`: dodac pole `'integration_name' => (string) ($row['integration_name'] ?? '')` do zwracanej tablicy.

    3. W `findDetails()`: dodac LEFT JOIN do `integrations` i dodac `ig.name AS integration_name` do SELECT query.

    Avoid: Nie zmieniac countSql (nie potrzebuje JOIN do integrations). Nie zmieniac istniejacych kolumn — tylko dodac nowe.
  </action>
  <verify>Sprawdzic ze query nie rzuca bledu — otworzyc liste zamowien w przegladarce.</verify>
  <done>AC-1, AC-2 — dane integration_name dostepne w wynikach query</done>
</task>

<task type="auto">
  <name>Task 2: Wyswietlic integration name w UI (lista + show)</name>
  <files>src/Modules/Orders/OrdersController.php, resources/views/orders/show.php</files>
  <action>
    1. W `OrdersController::toTableRow()`:
       - Odczytac `$integrationName = trim((string) ($row['integration_name'] ?? ''));`
       - Zmienic logike wyswietlania zrodla w `orders-ref__meta`:
         - Jesli `$integrationName !== ''` → uzyc `$integrationName` jako label
         - W przeciwnym razie → uzyc `$this->sourceLabel($source)` (fallback dla Allegro/Erli/starych danych)
       - Upewnic sie ze kolejnosc spanow to: [1] zrodlo/integracja, [2] ID: identyfikator
       - Obecny kod JUZ ma poprawna kolejnosc (source first), wiec tylko dodac logike integration_name

    2. W `resources/views/orders/show.php` linia 48:
       - Zmienic wyswietlanie z `ucfirst(source) external_order_id` na:
         - Uzyc `$orderRow['integration_name']` jesli niepuste, inaczej `ucfirst(source)`
         - Dodac prefiks "ID:" przed identyfikatorem
         - Rozdzielic na dwa oddzielne spany (jak na liscie) dla spojnosci

    3. Metoda `sourceLabel()` — pozostawic bez zmian (fallback).

    Avoid: Nie zmieniac CSS. Nie zmieniac filtrow zrodla (dropdown). Nie zmieniac logiki statusow.
  </action>
  <verify>Otworzyc liste zamowien — zamowienia shopPRO pokazuja nazwe integracji. Allegro pokazuje "Allegro". Otworzyc szczegoly zamowienia — naglowek pokazuje nazwe integracji.</verify>
  <done>AC-1, AC-2, AC-3, AC-4 satisfied</done>
</task>

</tasks>

<boundaries>

## DO NOT CHANGE
- resources/scss/* (zadnych zmian CSS)
- Filtry zrodla w dropdownie (sourceOptions) — poza zakresem
- Logika statusow, platnosci, przesylek
- Inne widoki niz show.php

## SCOPE LIMITS
- Tylko wyswietlanie — bez zmian w logice importu zamowien
- Bez zmian w bazie danych (kolumna integration_id juz istnieje w orders)
- Bez nowych zaleznosci

</boundaries>

<verification>
Before declaring plan complete:
- [ ] Lista zamowien laduje sie bez bledow
- [ ] Zamowienia shopPRO pokazuja nazwe integracji (nie "shopPRO")
- [ ] Zamowienia Allegro pokazuja "Allegro" (bez regresji)
- [ ] Strona szczegulow zamowienia pokazuje nazwe integracji
- [ ] Kolejnosc w orders-ref__meta: zrodlo first, ID second
- [ ] All acceptance criteria met
</verification>

<success_criteria>
- Todo #15 i #17 zrealizowane
- Brak regresji na liscie zamowien i stronie szczegulow
- Kod uzywa prepared statements (medoo/PDO) — brak SQL injection
</success_criteria>

<output>
After completion, create `.paul/phases/21-order-source-display/21-01-SUMMARY.md`
</output>
