Files
orderPRO/.paul/phases/97-project-generation/97-01-PLAN.md
2026-04-12 01:35:19 +02:00

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
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
false off
## 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
## 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

<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)
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)

<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>
After completion, create `.paul/phases/97-project-generation/97-01-SUMMARY.md`