12 KiB
12 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, delegation
| phase | plan | type | wave | depends_on | files_modified | autonomous | delegation | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 97-project-generation | 01 | execute | 1 |
|
false | off |
Purpose
Eliminacja ręcznej pracy przy tworzeniu projektów graficznych. Claude rozumie kontekst lepiej niż sztywny parser — potrafi zinterpretować "Kasia i Tomek 30 kwietnia", "Imiona: Kasia, Tomek\nData: 30.04.2026" i inne warianty jako te same dane wejściowe.
Output
- Tabela DB
project_mappings— mapowanie nazwy produktu → skrypt generujący - Kolumna
project_generatedworder_items— flaga statusu generacji - Strona w panelu: Ustawienia → Mapowanie projektów (CRUD)
- Komenda Claude Code
/wygeneruj-projekty— skill uruchamiający cały przepływ
Source Files
@routes/web.php @src/Modules/Settings/CompanySettingsController.php (wzorzec CRUD settings) @src/Modules/Orders/OrdersRepository.php @resources/views/settings/statuses.php (wzorzec widoku settings) @tools/generowanie/buteleczki_wzor1.py (istniejący skrypt generujący)
Technical Context
- Personalizacja produktów w
order_items.personalizationjako plain text (linie \n) - Klienci piszą dane różnie — Claude interpretuje je kontekstowo
- Skrypty w
tools/generowanie/przyjmują parametry CLI (--imie_zenskie, --imie_meskie, --data, --klient itd.) - Skrypty wymagają uruchomionego Photoshopa (COM API)
- DB dostępne przez Medoo (PHP panel) i przez mysql CLI (Claude)
- Dane środowiskowe DB w .env (DB_HOST, DB_NAME, DB_USER, DB_PASS)
Architektura przepływu
Użytkownik: /wygeneruj-projekty
↓
Claude: SELECT z DB → zamówienia "w realizacji", project_generated=0
↓
Claude: Sprawdź project_mappings → czy jest skrypt dla tego produktu
↓
Claude: Przeczytaj personalizację + dane kupującego
↓
Claude: Zinterpretuj dane (AI) → imie_zenskie, imie_meskie, data, zyczenia, klient
↓
Claude: python tools/generowanie/{skrypt}.py --parametry
↓
Claude: UPDATE order_items SET project_generated=1
↓
Claude: Raport — co wygenerowano, co się nie udało
<acceptance_criteria>
AC-1: Tabela mapowań w bazie danych
Given baza danych orderPRO
When uruchomiona migracja 20260412_000097
Then istnieje tabela `project_mappings` z kolumnami: id, product_name_pattern, script_name, output_dir, is_active, created_at, updated_at
And istnieje kolumna `project_generated` (TINYINT DEFAULT 0) w tabeli `order_items`
And istnieje kolumna `project_generated_at` (DATETIME NULL) w tabeli `order_items`
AC-2: CRUD mapowań w panelu ustawień
Given zalogowany użytkownik w panelu
When przechodzi do Ustawienia → Mapowanie projektów
Then widzi listę istniejących mapowań (wzorzec nazwy produktu → skrypt)
And może dodać nowe mapowanie (formularz: wzorzec nazwy, skrypt z dropdown, katalog wyjściowy)
And może edytować i usuwać istniejące mapowania
And może włączyć/wyłączyć mapowanie (is_active)
AC-3: Komenda Claude Code /wygeneruj-projekty
Given komenda /wygeneruj-projekty zdefiniowana jako Claude Code skill
When użytkownik uruchamia /wygeneruj-projekty
Then Claude odpytuje bazę: zamówienia "w realizacji" z produktami gdzie project_generated=0
And dla każdego produktu sprawdza czy istnieje aktywne mapowanie (LIKE match)
And jeśli mapowanie istnieje — pobiera personalizację i dane kupującego
And Claude interpretuje dane kontekstowo (AI normalizacja)
And prezentuje użytkownikowi co zamierza wygenerować (imiona, data, klient) i czeka na potwierdzenie
And po potwierdzeniu uruchamia odpowiedni skrypt Python
And po sukcesie aktualizuje project_generated=1, project_generated_at=NOW()
And na końcu wyświetla raport: ile wygenerowano, ile pominięto, błędy
</acceptance_criteria>
Task 1: Migracja DB — tabela project_mappings + kolumna project_generated database/migrations/20260412_000097_add_project_generation.sql Utwórz migrację SQL:1. Tabela `project_mappings`:
- `id` INT AUTO_INCREMENT PRIMARY KEY
- `product_name_pattern` VARCHAR(255) NOT NULL — wzorzec nazwy produktu (do LIKE match, np. "%buteleczk%")
- `script_name` VARCHAR(255) NOT NULL — nazwa pliku skryptu w tools/generowanie/ (np. "buteleczki_wzor1.py")
- `output_dir` VARCHAR(500) NULL — ścieżka do katalogu wyjściowego
- `is_active` TINYINT(1) DEFAULT 1
- `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
- `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
2. ALTER TABLE `order_items`:
- ADD `project_generated` TINYINT(1) DEFAULT 0 AFTER `payload_json`
- ADD `project_generated_at` DATETIME NULL AFTER `project_generated`
Wzorzec: CREATE TABLE IF NOT EXISTS, ALTER TABLE z IF NOT EXISTS check
Migracja wykonuje się bez błędów na stronie /settings/database
AC-1 satisfied: tabela project_mappings istnieje, kolumna project_generated dodana do order_items
Task 2: CRUD Mapowań projektów (backend + widok)
src/Modules/Settings/ProjectMappingController.php,
src/Modules/Settings/ProjectMappingRepository.php,
resources/views/settings/project-mappings.php,
resources/scss/modules/_project-mappings.scss,
routes/web.php,
resources/lang/pl.php
1. ProjectMappingRepository — klasa final z Medoo:
- getAll(): array — lista wszystkich mapowań
- getById(int $id): ?array
- create(array $data): int
- update(int $id, array $data): bool
- delete(int $id): bool
- toggleActive(int $id): bool
2. ProjectMappingController — wzorzec jak CompanySettingsController:
- index() — lista mapowań + formularz dodawania
- store() — zapis nowego mapowania (walidacja: product_name_pattern i script_name wymagane)
- update() — edycja
- delete() — usuwanie z potwierdzeniem OrderProAlerts
- toggleActive() — włącz/wyłącz
- Skanuj katalog tools/generowanie/*.py i wyświetl jako dropdown w formularzu
3. Widok resources/views/settings/project-mappings.php:
- Tabela: wzorzec nazwy produktu | skrypt | katalog wyjściowy | aktywny | akcje
- Formularz dodawania/edycji inline
- Dropdown ze skryptami z tools/generowanie/
- Wzorzec UI jak inne strony ustawień (kompaktowy)
4. Routing w web.php:
- GET /settings/project-mappings → index
- POST /settings/project-mappings → store
- POST /settings/project-mappings/{id}/update → update
- POST /settings/project-mappings/{id}/delete → delete
- POST /settings/project-mappings/{id}/toggle → toggleActive
5. Dodaj pozycję w menu ustawień
Nie dodawaj natywnych alert()/confirm() — użyj OrderProAlerts.
Style w SCSS, nie w widoku. CSRF: pole _token.
Strona /settings/project-mappings wyświetla się, CRUD działa
AC-2 satisfied: CRUD mapowań działa w panelu ustawień
Migracja DB + CRUD mapowań w panelu ustawień
1. Uruchom migrację na /settings/database
2. Przejdź do Ustawienia → Mapowanie projektów
3. Dodaj mapowanie: wzorzec "%buteleczk%" → skrypt "buteleczki_wzor1.py"
4. Sprawdź edycję, toggle aktywności, usuwanie
5. Potwierdź że UI jest spójne z resztą panelu
Type "approved" to continue, or describe issues to fix
Task 3: Komenda Claude Code /wygeneruj-projekty
.claude/commands/wygeneruj-projekty.md
Utwórz plik `.claude/commands/wygeneruj-projekty.md` — skill Claude Code.
Treść komendy powinna instruować Claude aby:
1. Wczytał dane połączenia DB z .env (DB_HOST, DB_NAME, DB_USER, DB_PASS)
2. Odpytał bazę (mysql CLI):
- Pobierz aktywne mapowania z project_mappings
- Pobierz zamówienia "w realizacji": JOIN orders + order_items + order_addresses
WHERE orders.status IN (kody statusów z grupy "w realizacji")
AND order_items.project_generated = 0
- Dla każdego produktu sprawdź LIKE match z product_name_pattern
3. Dla znalezionych produktów:
- Wyświetl listę: zamówienie, produkt, personalizacja, dane kupującego
- Zinterpretuj personalizację AI-em (wyciągnij imiona, datę, życzenia)
- Pokaż co zamierza wygenerować i zapytaj o potwierdzenie
4. Po potwierdzeniu:
- Uruchom skrypt: python tools/generowanie/{script_name} --parametry
- Po sukcesie: UPDATE order_items SET project_generated=1, project_generated_at=NOW() WHERE id={item_id}
5. Wyświetl raport końcowy
Ważne w instrukcji:
- Photoshop musi być uruchomiony — sprawdź przed generowaniem
- Dane klienta (--klient) to imię i nazwisko z order_addresses (type=customer)
- Zawsze pytaj o potwierdzenie przed generowaniem
- Przy błędzie skryptu — nie oznaczaj jako wygenerowane, pokaż błąd
Komenda /wygeneruj-projekty pojawia się w dostępnych komendach Claude Code
AC-3 satisfied: komenda działa, Claude jest silnikiem generowania
Pełny przepływ generowania projektów z komendą /wygeneruj-projekty
1. Upewnij się że Photoshop jest uruchomiony
2. W panelu dodaj mapowanie: "%buteleczk%" → "buteleczki_wzor1.py"
3. Upewnij się że jest zamówienie "w realizacji" z produktem "buteleczka" i personalizacją
4. Uruchom /wygeneruj-projekty w Claude Code
5. Sprawdź: Claude znalazł zamówienie, poprawnie zinterpretował dane, zapytał o potwierdzenie
6. Po potwierdzeniu: PSD wygenerowany, project_generated=1 w bazie
Type "approved" to continue, or describe issues to fix
DO NOT CHANGE
- tools/generowanie/buteleczki_wzor1.py (istniejący skrypt — nie modyfikuj)
- src/Modules/Orders/OrdersController.php (nie zmieniaj istniejącej logiki)
- Istniejące tabele DB (nie modyfikuj struktury orders, order_addresses)
- Szablony PSD (nie modyfikuj plików projektowych)
SCOPE LIMITS
- Tylko CRUD mapowań + komenda Claude Code — brak serwisu PHP do generowania
- Generowanie uruchamiane ręcznie komendą — brak crona/automatyzacji
- Brak podglądu wygenerowanych projektów w panelu
- Brak zmian w widoku listy zamówień (project_generated nie wyświetlane)
<success_criteria>
- Wszystkie zadania ukończone
- Wszystkie weryfikacje przechodzą
- Wygenerowany PSD ma poprawne dane i zachowane pozycje warstw
- System gotowy do rozszerzenia o nowe skrypty generujące </success_criteria>