--- phase: 73-search-by-product plan: 01 type: execute wave: 1 depends_on: [] files_modified: [src/Modules/Orders/OrdersRepository.php, resources/views/orders/list.php] autonomous: true --- ## Goal Rozszerzenie wyszukiwarki na liscie zamowien o wyszukiwanie po nazwie produktu z zamowienia. ## Purpose Uzytkownik nie moze znalezc zamowienia po nazwie produktu — musi znac numer zamowienia, login lub email klienta. Wyszukiwanie po produkcie jest naturalnym sposobem szukania zamowien. ## Output Zmodyfikowane zapytanie SQL w `buildPaginateFilters()` — istniejace pole szukaj obsluguje rowniez nazwy produktow. Zaktualizowany placeholder inputa. ## Source Files @src/Modules/Orders/OrdersRepository.php (linie 91-105 buildPaginateFilters, 48-54 countSql) @resources/views/orders/list.php ## AC-1: Wyszukiwanie po nazwie produktu ```gherkin Given zamowienie zawiera produkt "Tabliczki z miesiacami do zdjec - Serduszko" When uzytkownik wpisze "Tabliczki" w pole szukaj Then zamowienie pojawi sie w wynikach ``` ## AC-2: Istniejace wyszukiwanie dziala bez zmian ```gherkin Given zamowienie ma source_order_id = "11776" When uzytkownik wpisze "11776" w pole szukaj Then zamowienie pojawi sie w wynikach (brak regresji) ``` ## AC-3: Brak duplikatow wynikow ```gherkin Given zamowienie zawiera 3 produkty pasujace do frazy When uzytkownik wyszuka te fraze Then zamowienie pojawi sie dokladnie raz w wynikach ``` ## AC-4: Placeholder inputa zaktualizowany ```gherkin Given uzytkownik widzi pole szukaj na liscie zamowien Then placeholder zawiera informacje o wyszukiwaniu po produkcie ``` Task 1: Dodanie wyszukiwania po nazwie produktu src/Modules/Orders/OrdersRepository.php W metodzie `buildPaginateFilters()` (linia 97-104): 1. Dodac do warunku search EXISTS subquery na order_items: ``` OR EXISTS (SELECT 1 FROM order_items oi WHERE oi.order_id = o.id AND oi.original_name LIKE :s6) ``` 2. Dodac parametr `$params['s6'] = $searchVal;` Uzyc EXISTS zamiast JOIN — zapobiega duplikatom i nie wymaga zmian w countSql ani buildListSql. 3. W countSql (linia 49-52) — NIE dodawac JOINa. EXISTS w WHERE jest samowystarczalny. Zapytanie SQL wykonuje sie poprawnie. Test: wyszukanie "Tabliczki" zwraca zamowienia z takim produktem. AC-1, AC-2, AC-3 satisfied Task 2: Aktualizacja placeholder inputa resources/views/orders/list.php Znalezc input szukaj na liscie zamowien i zaktualizowac placeholder: - Z: "numer, ID, login, email, klient" (lub podobny) - Na: "numer, klient, email, produkt" Sprawdzic czy placeholder jest w list.php czy w komponencie table-list.php — prawdopodobnie jest przekazywany z kontrolera lub widoku. Placeholder inputa zawiera slowo "produkt" AC-4 satisfied ## DO NOT CHANGE - buildListSql() — struktura SELECT i JOINy - Inne filtry w buildPaginateFilters (source, status, payment_status, date) - Komponent table-list.php (poza ewentualnym placeholder jesli tam jest) ## SCOPE LIMITS - Tylko rozszerzenie istniejacego pola szukaj — bez osobnego pola produktowego - Bez indeksu FULLTEXT (LIKE wystarczy przy obecnej skali) Before declaring plan complete: - [ ] PHP syntax OK - [ ] Wyszukanie "Tabliczki" zwraca zamowienia z produktem Tabliczki - [ ] Wyszukanie "11776" nadal zwraca zamowienie po numerze - [ ] Brak duplikatow przy wyszukiwaniu po produkcie - [ ] Placeholder inputa zawiera "produkt" - Pole szukaj obsluguje nazwy produktow - Brak regresji w istniejacym wyszukiwaniu - Brak duplikatow wynikow After completion, create `.paul/phases/73-search-by-product/73-01-SUMMARY.md`