Files
orderPRO/.claude/commands/wygeneruj-projekty.md
2026-04-12 21:43:39 +02:00

7.3 KiB

Generowanie projektów graficznych z zamówień

Jesteś silnikiem generowania projektów graficznych dla zamówień w orderPRO. Twoje zadanie to znaleźć zamówienia wymagające generacji, zinterpretować dane klienta i uruchomić odpowiedni skrypt.

Przepływ

1. Połącz się z bazą danych

Wczytaj dane z pliku .env w katalogu projektu:

  • DB_HOST_REMOTE — host bazy (użyj remote, nie localhost)
  • DB_DATABASE, DB_USERNAME, DB_PASSWORD, DB_PORT

Użyj "C:/xampp/mysql/bin/mysql.exe" do zapytań (z flagą --default-character-set=utf8mb4).

2. Pobierz aktywne mapowania

SELECT id, product_name_pattern, script_name, output_dir, requires_photo
FROM project_mappings
WHERE is_active = 1;

Jeśli brak mapowań — poinformuj użytkownika i zakończ.

3. Znajdź zamówienia do generacji (z dopasowaniem do mapowań)

Schemat bazy danych — kluczowe kolumny:

  • orders.status_code — aktualny kod statusu wewnętrznego orderPRO
  • order_statuses.code — kody statusów, wiązanie: orders.status_code = order_statuses.code
  • order_statuses.group_idorder_status_groups.id — grupy statusów
  • order_items.original_name — nazwa produktu
  • order_items.personalization — dane personalizacji (plain text, linie oddzielone \n)
  • order_items.project_generated — 0 = nie wygenerowano, 1 = wygenerowano
  • order_addresses.address_type — typ adresu ('customer', 'delivery', 'invoice')
  • order_addresses.name — pełne imię i nazwisko kupującego

Jedno zapytanie łączy zamówienia z mapowaniami (JOIN eliminuje produkty bez mapowania):

SELECT 
    oi.id AS item_id,
    oi.original_name AS product_name,
    oi.personalization,
    oi.quantity,
    o.id AS order_id,
    o.internal_order_number,
    o.status_code AS status_code,
    oa.name AS buyer_name,
    oa.email AS buyer_email,
    pm.script_name,
    pm.output_dir,
    pm.requires_photo
FROM order_items oi
JOIN orders o ON oi.order_id = o.id
JOIN order_statuses os ON o.status_code = os.code
JOIN order_status_groups osg ON os.group_id = osg.id
JOIN project_mappings pm ON pm.is_active = 1
  AND oi.original_name = pm.product_name_pattern
LEFT JOIN order_addresses oa ON o.id = oa.order_id AND oa.address_type = 'customer'
WHERE osg.id = 2
  AND oi.project_generated = 0
  AND oi.personalization IS NOT NULL
  AND oi.personalization <> ''
ORDER BY o.id;

Jeśli brak wyników — poinformuj użytkownika że nie ma zamówień do generacji pasujących do aktywnych mapowań.

5. Zinterpretuj dane klienta (AI normalizacja)

Dla każdego pasującego produktu:

  • Przeczytaj pole personalization z order_items
  • Zinterpretuj dane kontekstowo. Typowe dane to:
    • Imię żeńskie i męskie — mogą być w formacie "Kasia i Tomek", "Imiona: Kasia, Tomek", "Imię żeńskie: Kasia\nImię męskie: Tomek", "Imiona młodej pary: Kasia i Tomek", itp.
    • Data uroczystości — format DD.MM.YYYY, może być opisana jako "Data: 30.04.2026" lub "Data uroczystości: 30.04.2026" lub po prostu "30.04.2026"
    • Życzenia — opcjonalny tekst (np. "Na zdrowie!", "Dziękujemy!"). Jeśli brak — zostaw domyślne z szablonu
    • Ignoruj pola takie jak "Kolor tekstu", "Zakrętka" — te dotyczą produkcji, nie projektu
  • Nazwa klienta (do nazwy pliku wyjściowego) — z order_addresses.name (pole buyer_name w zapytaniu)

6. Przedstaw plan i czekaj na potwierdzenie

Wyświetl tabelę:

Zamówienie | Produkt | Imię żeńskie | Imię męskie | Data | Życzenia | Klient (nazwa pliku)
OP000123   | Buteleczka... | Kinga | Łukasz | 30.04.2026 | (domyślne) | Kinga Klimczak

Zapytaj: "Wygenerować projekty? (tak/nie)"

7. Uruchom generowanie

Przed generowaniem sprawdź czy Photoshop jest uruchomiony:

tasklist //FI "IMAGENAME eq Photoshop.exe" 2>/dev/null | grep -i photoshop

Jeśli Photoshop nie jest uruchomiony — poinformuj użytkownika i poczekaj aż go uruchomi.

Pobranie zdjęcia od klienta (jeśli requires_photo = 1):

Dla mapowań z requires_photo = 1 przed wywołaniem generatora pobierz zdjęcie z poczty klienta:

python tools/generowanie/email_photo_fetcher.py --email "{buyer_email}" --out "C:/tmp/orderpro_photos" --days 365
  • Skrypt zwraca ścieżkę pobranego pliku albo komunikat BRAK (exit code 1).
  • Jeśli zdjęcie się pobrało — przekaż ścieżkę do generatora przez --zdjecie.
  • Jeśli zdjęcia nie znaleziono — generator i tak ma być wywołany bez --zdjecie (wstawi zielony placeholder jako sygnał "klient nie przysłał foto"). NIE blokuj generacji.
  • Zaraportuj w tabeli planu (kolumna "Zdjęcie") status: ścieżka / BRAK (zielony placeholder).

WAŻNE — rozpoznawanie płci dziecka (dla skryptów z parametrem --plec): Niektóre skrypty (np. akrylowe_podziekowanie_matka_chrzestna_wzor2.py) mają dwa warianty szablonu (chłopiec/dziewczynka) i wymagają parametru --plec m lub --plec k. Rozpoznaj płeć na podstawie personalizacji:

  • Imię proste (Fabian, Wojciech, Kacper → m; Blanka, Zosia, Wiktoria → k) — standardowa wiedza o polskich imionach.
  • Imię odmienione (np. "Wojtusia", "Kacpra" → m; "Blanki", "Zosi", "Wiktorii" → k) — rozpoznaj mianownik i z niego określ płeć.
  • Kontekst — jeśli w personalizacji pojawia się "mój Chrześniak", "Drogi Synku", "malutki" → m; "moja Chrześniaczka", "Droga Córeczko", "malutka" → k.
  • W razie wątpliwości — wyświetl surowe dane klientowi i zapytaj.

WAŻNE — łamanie linii w tekstach wielolinijkowych (życzenia, podziękowanie, itp.): Photoshop jako znak łamania linii w warstwach tekstowych rozpoznaje \r (CR), NIE \n (LF). Jeśli przekażesz \n, Photoshop wyświetli go jako śmieciowy kwadrat z literą "n". W bashu użyj ANSI-C quoting: $'linia1\rlinia2\rlinia3' do budowy wartości --zyczenia / --podziekowanie i przekaż ją w cudzysłowach do skryptu.

Dla każdego potwierdzonego produktu:

  1. Sprawdź kolizję nazwy pliku w katalogu wyjściowym. Jeśli plik {klient}.psd (lub inne rozszerzenie używane przez skrypt) już istnieje — dodaj do nazwy klienta sufiks z indeksem 01, 02, ... (np. Anna RakAnna Rak 01, a jeśli i to zajęte → Anna Rak 02). Inkrementuj aż znajdziesz wolną nazwę. Dopiero wtedy przekaż wynik jako --klient.
  2. Uruchom skrypt: python tools/generowanie/{script_name} --klient "Imię Nazwisko" ... (parametry zależne od skryptu — dla buteleczek/pudełek zwykle --imie/--imiona, --data, opcjonalnie --zyczenia/--podziekowanie; dla produktów ze zdjęciem dorzuć --zdjecie /sciezka/do/foto.jpg)
  3. Jeśli mapowanie ma output_dir — skrypt powinien zapisać tam (jeśli obsługuje)

8. Oznacz w bazie

Po udanym generowaniu:

UPDATE order_items 
SET project_generated = 1, project_generated_at = NOW() 
WHERE id = {item_id};

9. Raport końcowy

Wyświetl podsumowanie:

  • Ile projektów wygenerowano
  • Ile pominięto (brak mapowania, brak personalizacji)
  • Ewentualne błędy

Ważne zasady

  • Zawsze pytaj o potwierdzenie przed generowaniem
  • Photoshop musi być uruchomiony — sprawdź przed generowaniem
  • Nie oznaczaj jako wygenerowane jeśli skrypt zwrócił błąd
  • Jeśli nie potrafisz zinterpretować personalizacji — wyświetl surowe dane i zapytaj użytkownika
  • Skrypty generujące znajdują się w tools/generowanie/ w katalogu projektu orderPRO