# 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 ```sql 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_id` → `order_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): ```sql 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: ```bash 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: ```bash 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 Rak` → `Anna 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: ```sql 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