292 lines
12 KiB
Markdown
292 lines
12 KiB
Markdown
---
|
|
phase: 97-project-generation
|
|
plan: 01
|
|
type: execute
|
|
wave: 1
|
|
depends_on: []
|
|
files_modified:
|
|
- database/migrations/20260412_000097_add_project_generation.sql
|
|
- 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
|
|
- .claude/commands/wygeneruj-projekty.md
|
|
autonomous: false
|
|
delegation: off
|
|
---
|
|
|
|
<objective>
|
|
## Goal
|
|
Półautomat do generowania projektów graficznych (PSD) na podstawie danych klientów z zamówień. Claude Code jest silnikiem generowania — analizuje personalizację produktów, normalizuje dane klienta (rozumiejąc niuanse, literówki, różne formaty zapisu) i uruchamia odpowiedni skrypt Photoshop API.
|
|
|
|
## 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_generated` w `order_items` — flaga statusu generacji
|
|
- Strona w panelu: Ustawienia → Mapowanie projektów (CRUD)
|
|
- Komenda Claude Code `/wygeneruj-projekty` — skill uruchamiający cały przepływ
|
|
</objective>
|
|
|
|
<context>
|
|
## Project Context
|
|
@.paul/PROJECT.md
|
|
@.paul/ROADMAP.md
|
|
@.paul/STATE.md
|
|
|
|
## 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.personalization` jako 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
|
|
```
|
|
</context>
|
|
|
|
<acceptance_criteria>
|
|
|
|
## AC-1: Tabela mapowań w bazie danych
|
|
```gherkin
|
|
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ń
|
|
```gherkin
|
|
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
|
|
```gherkin
|
|
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>
|
|
|
|
<tasks>
|
|
|
|
<task type="auto">
|
|
<name>Task 1: Migracja DB — tabela project_mappings + kolumna project_generated</name>
|
|
<files>database/migrations/20260412_000097_add_project_generation.sql</files>
|
|
<action>
|
|
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
|
|
</action>
|
|
<verify>Migracja wykonuje się bez błędów na stronie /settings/database</verify>
|
|
<done>AC-1 satisfied: tabela project_mappings istnieje, kolumna project_generated dodana do order_items</done>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 2: CRUD Mapowań projektów (backend + widok)</name>
|
|
<files>
|
|
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
|
|
</files>
|
|
<action>
|
|
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.
|
|
</action>
|
|
<verify>Strona /settings/project-mappings wyświetla się, CRUD działa</verify>
|
|
<done>AC-2 satisfied: CRUD mapowań działa w panelu ustawień</done>
|
|
</task>
|
|
|
|
<task type="checkpoint:human-verify" gate="blocking">
|
|
<what-built>Migracja DB + CRUD mapowań w panelu ustawień</what-built>
|
|
<how-to-verify>
|
|
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
|
|
</how-to-verify>
|
|
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 3: Komenda Claude Code /wygeneruj-projekty</name>
|
|
<files>.claude/commands/wygeneruj-projekty.md</files>
|
|
<action>
|
|
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
|
|
</action>
|
|
<verify>Komenda /wygeneruj-projekty pojawia się w dostępnych komendach Claude Code</verify>
|
|
<done>AC-3 satisfied: komenda działa, Claude jest silnikiem generowania</done>
|
|
</task>
|
|
|
|
<task type="checkpoint:human-verify" gate="blocking">
|
|
<what-built>Pełny przepływ generowania projektów z komendą /wygeneruj-projekty</what-built>
|
|
<how-to-verify>
|
|
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
|
|
</how-to-verify>
|
|
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal>
|
|
</task>
|
|
|
|
</tasks>
|
|
|
|
<boundaries>
|
|
|
|
## 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)
|
|
|
|
</boundaries>
|
|
|
|
<verification>
|
|
Before declaring plan complete:
|
|
- [ ] Migracja wykonuje się bez błędów
|
|
- [ ] CRUD mapowań działa (dodaj, edytuj, usuń, toggle)
|
|
- [ ] Komenda /wygeneruj-projekty poprawnie odpytuje DB
|
|
- [ ] Claude interpretuje personalizację i prezentuje dane do potwierdzenia
|
|
- [ ] Po potwierdzeniu — skrypt generuje PSD z poprawnymi danymi
|
|
- [ ] project_generated = 1 po udanej generacji
|
|
- [ ] Brak natywnych alert()/confirm() — OrderProAlerts
|
|
- [ ] Style w SCSS, nie inline
|
|
- [ ] CSRF w formularzach (_token)
|
|
</verification>
|
|
|
|
<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>
|
|
|
|
<output>
|
|
After completion, create `.paul/phases/97-project-generation/97-01-SUMMARY.md`
|
|
</output>
|