diff --git a/.paul/governance/governance_2026-04-12.jsonl b/.paul/governance/governance_2026-04-12.jsonl index 7ce8529..3cbdf79 100644 --- a/.paul/governance/governance_2026-04-12.jsonl +++ b/.paul/governance/governance_2026-04-12.jsonl @@ -154,3 +154,35 @@ {"ts":"2026-04-11T23:34:24Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -i photoshop\",\"description\":\"Check if Photoshop is running\"},\"tool_response\":{\"stdout\":\"Binary file (standard input) matches\"","cwd":"/c/visual studio code/projekty/orderPRO"} {"ts":"2026-04-11T23:34:35Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_wzor6.py --imie_zenskie \"Agnieszka\" --imie_meskie \"Kamil\" --data \"05.07.2026\" --klient \"Oliwia Kiełb\"\",\","cwd":"/c/visual studio code/projekty/orderPRO"} {"ts":"2026-04-11T23:34:42Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" --default-character-set=utf8mb4 -h host700513.hostido.net.pl -P 3306 -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' host700513_orderpro -e \"UPDATE order_items SET pr","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:02:36Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -i photoshop; ls \"d:/pomysloweprezenty.pl/projekty/ślub - buteleczki/Podziękowanie dla gości weselnych buteleczka z nadrukiem UV - W","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:02:43Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -ic photoshop\",\"description\":\"Count Photoshop processes\"},\"tool_response\":{\"stdout\":\"0\",\"stderr\":\"\",\"interrupted\":false","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:03:02Z","tool":"Bash","cmd":"powershell -Command \"Start-Process 'C:\\\\Program Files\\\\Adobe\\\\Adobe Photoshop 2026\\\\Photoshop.exe'\"\",\"description\":\"Start Photoshop 2026\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:03:16Z","tool":"Bash","cmd":"powershell -Command \"Start-Sleep -Seconds 8; (Get-Process Photoshop -ErrorAction SilentlyContinue).Count\"\",\"description\":\"Wait for Photoshop\"},\"tool_response\":{\"stdout\":\"1\",\"stderr\":\"\","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:03:33Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_explore_tmp.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:03:49Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/_explore_tmp.py 2>&1\",\"description\":\"Explore PSD structure\"},\"tool_response\":{\"stdout\":\"=== TOP LEVEL ===\\r\\nart:","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:05:11Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_rename_tmp.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:05:20Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/_rename_tmp.py 2>&1\",\"description\":\"Rename layers in PSD\"},\"tool_response\":{\"stdout\":\"OK: Dzi�kujemy! -> naglowek","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:05:57Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor4.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:06:09Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Ania\" --imie_meskie \"Piotr\" --data \"15.08.2026\" --klient \"TEST Ania Piotr\" 2","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:06:15Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_explore_tmp.py\" \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_rename_tmp.py\"\",\"description\":\"Remove temp files\"},\","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:07:03Z","tool":"Bash","cmd":"mysql -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' host700513_orderpro -e \"SELECT id, product_name_pattern, script_name, output_dir, is_active FROM project_mappings;\"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:07:11Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro','","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:07:20Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro','","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:07:55Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ProjectMappingController.php","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:07:59Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ProjectMappingController.php","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:08:03Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ProjectMappingController.php","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:09:07Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\n\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:11:28Z","tool":"Bash","cmd":"powershell -Command \"(Get-Process Photoshop -ErrorAction SilentlyContinue).Count\"\",\"description\":\"Check Photoshop\"},\"tool_response\":{\"stdout\":\"1\",\"stderr\":\"\",\"interrupted\":false,\"i","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:11:39Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Weronika\" --imie_meskie \"Martin\" --data \"04.06.2026\" --klient \"Martin Chiniew","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:11:47Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Marta\" --imie_meskie \"Bartosz\" --data \"18.09.2026\" --klient \"Marta Jankowska\","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:12:00Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Adrianna\" --imie_meskie \"Adam\" --data \"18.07.2026\" --klient \"Adrianna Bujnows","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:14:04Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor4.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:14:14Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Weronika\" --imie_meskie \"Martin\" --data \"04.06.2026\" --klient \"Martin Chiniew","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:14:24Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Marta\" --imie_meskie \"Bartosz\" --data \"18.09.2026\" --klient \"Marta Jankowska\","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:14:35Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Adrianna\" --imie_meskie \"Adam\" --data \"18.07.2026\" --klient \"Adrianna Bujnows","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:15:37Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_debug_tmp.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:15:43Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/_debug_tmp.py 2>&1\",\"description\":\"Debug text layers\"},\"tool_response\":{\"stdout\":\"naglowek: just=2 (type=Justificat","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:16:15Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor4.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:16:40Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_debug_tmp.py\" && cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"W","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:16:55Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Adrianna\" --imie_meskie \"Adam\" --data \"18.07.2026\" --klient \"Adrianna Bujnows","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-04-12T08:17:37Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro','","cwd":"/c/visual studio code/projekty/orderPRO"} diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index 70b90d7..2d17420 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -46,8 +46,8 @@ }, "deploy_and_seed_orders.php": { "type": "-", - "size": 34248, - "lmtime": 1772497088256, + "size": 34227, + "lmtime": 1775948066807, "modified": false }, "fill_order_item_images.php": { @@ -76,8 +76,8 @@ }, "randomize_order_statuses.php": { "type": "-", - "size": 3646, - "lmtime": 1772497235553, + "size": 3625, + "lmtime": 1775948065835, "modified": false }, "reissue_receipt.php": { @@ -657,8 +657,8 @@ }, "20260314_000048_add_orders_performance_indexes.sql": { "type": "-", - "size": 488, - "lmtime": 0, + "size": 453, + "lmtime": 1775948067454, "modified": false }, "20260314_000049_add_cron_last_run_at_setting.sql": { @@ -834,6 +834,18 @@ "size": 83, "lmtime": 1775815203659, "modified": false + }, + "20260412_000097_add_project_generation.sql": { + "type": "-", + "size": 822, + "lmtime": 1775946976581, + "modified": false + }, + "20260412_000098_rename_external_status_id_to_status_code.sql": { + "type": "-", + "size": 244, + "lmtime": 1775948020015, + "modified": false } }, "seeders": {}, @@ -846,8 +858,8 @@ }, "20260302_orders_schema_v1.sql": { "type": "-", - "size": 10866, - "lmtime": 1772494371620, + "size": 10852, + "lmtime": 1775948101062, "modified": false } } @@ -855,15 +867,15 @@ "DOCS": { "ARCHITECTURE.md": { "type": "-", - "size": 43763, - "lmtime": 1775559230614, + "size": 43749, + "lmtime": 1775948079266, "modified": false }, "DB_SCHEMA.md": { "type": "-", - "size": 34569, - "lmtime": 1775316434590, - "modified": true + "size": 34555, + "lmtime": 1775948078122, + "modified": false }, "ORDERS_SCHEMA_APILO_DRAFT.md": { "type": "-", @@ -885,8 +897,8 @@ }, "TECH_CHANGELOG.md": { "type": "-", - "size": 82529, - "lmtime": 1775559241970, + "size": 82480, + "lmtime": 1775948079928, "modified": false } }, @@ -2177,8 +2189,8 @@ "css": { "app.css": { "type": "-", - "size": 65359, - "lmtime": 1775819628149, + "size": 66847, + "lmtime": 1775950421440, "modified": false }, "app.css.map": { @@ -2213,8 +2225,8 @@ "modules": { "automation-form.js": { "type": "-", - "size": 10533, - "lmtime": 1774909546633, + "size": 11257, + "lmtime": 1775944356011, "modified": false }, "global-search.js": { @@ -2256,8 +2268,8 @@ "lang": { "pl.php": { "type": "-", - "size": 64489, - "lmtime": 1775817352765, + "size": 66282, + "lmtime": 1775947168859, "modified": false } }, @@ -2304,8 +2316,8 @@ }, "app.scss": { "type": "-", - "size": 47641, - "lmtime": 1775816862771, + "size": 47675, + "lmtime": 1775947092385, "modified": false }, "components": { @@ -2377,6 +2389,12 @@ "lmtime": 1774474924746, "modified": false }, + "_project-mappings.scss": { + "type": "-", + "size": 1499, + "lmtime": 1775950390953, + "modified": false + }, "_shipment-presets.scss": { "type": "-", "size": 2649, @@ -2406,8 +2424,8 @@ "automation": { "form.php": { "type": "-", - "size": 17578, - "lmtime": 1775590767323, + "size": 18591, + "lmtime": 1775944371795, "modified": false }, "index.php": { @@ -2442,8 +2460,8 @@ "layouts": { "app.php": { "type": "-", - "size": 12097, - "lmtime": 1775561821328, + "size": 12344, + "lmtime": 1775947105507, "modified": false }, "auth.php": { @@ -2514,8 +2532,8 @@ }, "show.php": { "type": "-", - "size": 54539, - "lmtime": 1775729335385, + "size": 54991, + "lmtime": 1775948492570, "modified": false } }, @@ -2662,6 +2680,12 @@ "lmtime": 1772395769190, "modified": true }, + "project-mappings.php": { + "type": "-", + "size": 8237, + "lmtime": 1775950413842, + "modified": false + }, "shoppro.php": { "type": "-", "size": 47160, @@ -2704,8 +2728,8 @@ "routes": { "web.php": { "type": "-", - "size": 29359, - "lmtime": 1775816738226, + "size": 30318, + "lmtime": 1775947124874, "modified": false } }, @@ -2942,8 +2966,8 @@ "Automation": { "AutomationController.php": { "type": "-", - "size": 23909, - "lmtime": 1775590757613, + "size": 25030, + "lmtime": 1775944243152, "modified": false }, "AutomationExecutionLogRepository.php": { @@ -2960,14 +2984,14 @@ }, "AutomationService.php": { "type": "-", - "size": 24938, - "lmtime": 1775245766985, + "size": 27091, + "lmtime": 1775948050415, "modified": false }, "OrderStatusAgedService.php": { "type": "-", - "size": 5040, - "lmtime": 1774909434600, + "size": 5005, + "lmtime": 1775948049470, "modified": false } }, @@ -3138,8 +3162,8 @@ "Orders": { "OrderImportRepository.php": { "type": "-", - "size": 19963, - "lmtime": 1775675692146, + "size": 19907, + "lmtime": 1775948047071, "modified": false }, "OrderImportService.php": { @@ -3150,14 +3174,14 @@ }, "OrdersController.php": { "type": "-", - "size": 44151, - "lmtime": 1775819210756, + "size": 45567, + "lmtime": 1775948470375, "modified": false }, "OrdersRepository.php": { "type": "-", - "size": 41609, - "lmtime": 1775593939687, + "size": 41935, + "lmtime": 1775948577940, "modified": false }, "OrderStatusSyncService.php": { @@ -3308,8 +3332,8 @@ }, "AllegroOrderImportService.php": { "type": "-", - "size": 32746, - "lmtime": 1775684128009, + "size": 32739, + "lmtime": 1775948051353, "modified": false }, "AllegroOrdersSyncService.php": { @@ -3350,9 +3374,9 @@ }, "AllegroStatusSyncService.php": { "type": "-", - "size": 10850, - "lmtime": 1774474635936, - "modified": true + "size": 10822, + "lmtime": 1775948052282, + "modified": false }, "AllegroTokenManager.php": { "type": "-", @@ -3492,6 +3516,18 @@ "lmtime": 1774474891200, "modified": false }, + "ProjectMappingController.php": { + "type": "-", + "size": 5761, + "lmtime": 1775947286124, + "modified": false + }, + "ProjectMappingRepository.php": { + "type": "-", + "size": 2452, + "lmtime": 1775947027939, + "modified": false + }, "ReceiptConfigController.php": { "type": "-", "size": 5259, @@ -3542,8 +3578,8 @@ }, "ShopproOrderMapper.php": { "type": "-", - "size": 40088, - "lmtime": 1775675670687, + "size": 40081, + "lmtime": 1775948055355, "modified": false }, "ShopproOrdersSyncService.php": { @@ -3560,8 +3596,8 @@ }, "ShopproPaymentStatusSyncService.php": { "type": "-", - "size": 14390, - "lmtime": 1774905506000, + "size": 14376, + "lmtime": 1775948054635, "modified": false }, "ShopproProductImageResolver.php": { @@ -3584,8 +3620,8 @@ }, "ShopproStatusSyncService.php": { "type": "-", - "size": 9585, - "lmtime": 1774611928171, + "size": 9557, + "lmtime": 1775948053805, "modified": false } }, @@ -5597,9 +5633,9 @@ "tools": { "apaczka_probe_order.php": { "type": "-", - "size": 16169, + "size": 16643, "lmtime": 1773006858881, - "modified": false + "modified": true }, "debug_inspect_shoppro_payload.php": { "type": "-", @@ -5643,6 +5679,60 @@ "lmtime": 1772995312041, "modified": false }, + "komunia_blanki_CMYK.tiff": { + "type": "-", + "size": 4117074, + "lmtime": 0, + "modified": false + }, + "krita_komunia_template.py": { + "type": "-", + "size": 7065, + "lmtime": 0, + "modified": false + }, + "ps3A5F.tmp": { + "type": "-", + "size": 12738987, + "lmtime": 0, + "modified": false + }, + "ps41B1.tmp": { + "type": "-", + "size": 12415665, + "lmtime": 0, + "modified": false + }, + "ps46F3.tmp": { + "type": "-", + "size": 0, + "lmtime": 0, + "modified": false + }, + "ps6925.tmp": { + "type": "-", + "size": 12415621, + "lmtime": 0, + "modified": false + }, + "ps7EB2.tmp": { + "type": "-", + "size": 0, + "lmtime": 0, + "modified": false + }, + "ps84AA.tmp": { + "type": "-", + "size": 12415613, + "lmtime": 0, + "modified": false + }, + "ps91CA.tmp": { + "type": "-", + "size": 0, + "lmtime": 0, + "modified": false + }, "psd_personalize.py": { "type": "-", "size": 42084, @@ -5756,6 +5846,32 @@ "size": 2590, "lmtime": 1773006737809, "modified": false + }, + "generowanie": { + "buteleczki_wzor1.py": { + "type": "-", + "size": 4723, + "lmtime": 1775946288094, + "modified": false + }, + "buteleczki_wzor6.py": { + "type": "-", + "size": 4841, + "lmtime": 1775950147593, + "modified": false + }, + "buteleczki_wzor8.py": { + "type": "-", + "size": 5265, + "lmtime": 1775949133934, + "modified": false + }, + "tmp_mapping.sql": { + "type": "-", + "size": 225, + "lmtime": 1775950247575, + "modified": false + } } }, "vendor": { diff --git a/src/Modules/Settings/ProjectMappingController.php b/src/Modules/Settings/ProjectMappingController.php index 74aec6b..0aebea1 100644 --- a/src/Modules/Settings/ProjectMappingController.php +++ b/src/Modules/Settings/ProjectMappingController.php @@ -84,7 +84,7 @@ final class ProjectMappingController return Response::redirect('/settings/project-mappings'); } - $id = (int) $request->param('id', '0'); + $id = (int) $request->input('id', '0'); $pattern = trim((string) $request->input('product_name_pattern', '')); $scriptName = trim((string) $request->input('script_name', '')); $outputDir = trim((string) $request->input('output_dir', '')); @@ -111,7 +111,7 @@ final class ProjectMappingController return Response::redirect('/settings/project-mappings'); } - $id = (int) $request->param('id', '0'); + $id = (int) $request->input('id', '0'); if ($id > 0) { $this->repository->delete($id); Flash::set('settings_success', $this->translator->get('settings.project_mapping.flash.deleted')); @@ -127,7 +127,7 @@ final class ProjectMappingController return Response::redirect('/settings/project-mappings'); } - $id = (int) $request->param('id', '0'); + $id = (int) $request->input('id', '0'); if ($id > 0) { $this->repository->toggleActive($id); Flash::set('settings_success', $this->translator->get('settings.project_mapping.flash.toggled')); diff --git a/tools/generowanie/buteleczki_wzor1.py b/tools/generowanie/buteleczki_slub_wzor1.py similarity index 100% rename from tools/generowanie/buteleczki_wzor1.py rename to tools/generowanie/buteleczki_slub_wzor1.py diff --git a/tools/generowanie/buteleczki_slub_wzor4.py b/tools/generowanie/buteleczki_slub_wzor4.py new file mode 100644 index 0000000..eb0d1b0 --- /dev/null +++ b/tools/generowanie/buteleczki_slub_wzor4.py @@ -0,0 +1,159 @@ +""" +Generator PSD - Podziekowanie dla gosci weselnych (buteleczka, Wzor 4). + +Otwiera szablon PSD, podmienia teksty w Smart Object (linkowane 8 kopii) +z zachowaniem pozycji warstw, zapisuje jako nowy PSD w folderze _gotowe. + +Wymaga: uruchomiony Adobe Photoshop, pakiet photoshop-python-api. + +Uzycie: + python buteleczki_slub_wzor4.py --imie_zenskie "Kasia" --imie_meskie "Mateusz" \ + --data "04.07.2026" --klient "Kasia Nowak" + + python buteleczki_slub_wzor4.py --imie_zenskie "Kasia" --imie_meskie "Mateusz" \ + --data "04.07.2026" --naglowek "Dziekujemy!" --klient "Kasia Nowak" +""" + +import argparse +import os +import photoshop.api as ps + + +# --- Sciezki --- +PROJEKT_DIR = os.path.join( + r"d:\pomysloweprezenty.pl\projekty\ślub - buteleczki", + "Podziękowanie dla gości weselnych buteleczka z nadrukiem UV - Wzór 4", +) +SZABLON_PATH = os.path.join(PROJEKT_DIR, "szablon 370x300.psd") +GOTOWE_DIR = os.path.join(PROJEKT_DIR, "_gotowe") + +# Szablon ma 8 linkowanych kopii Smart Object (Warstwa 2 + Warstwa 2 kopia..kopia 7). +# Wystarczy edytowac jeden - zmiany propaguja sie na wszystkie. +SMART_OBJECT_LAYER = "Warstwa 2 kopia" + + +def open_smart_object(app): + """Otwiera zawartosc aktywnej warstwy Smart Object do edycji.""" + desc = ps.ActionDescriptor() + ref = ps.ActionReference() + ref.putEnumerated( + app.stringIDToTypeID("layer"), + app.stringIDToTypeID("ordinal"), + app.stringIDToTypeID("targetEnum"), + ) + desc.putReference(app.stringIDToTypeID("null"), ref) + app.executeAction(app.stringIDToTypeID("placedLayerEditContents"), desc) + + +def change_text_preserve_position(layer, new_text): + """Zmienia tekst warstwy z zachowaniem jej oryginalnej pozycji. + + Uwzglednia justowanie: + - center: zachowuje srodek poziomy + - right: zachowuje prawa krawedz + - left (lub inne): zachowuje lewa krawedz + W pionie zawsze zachowuje gora (pierwsza linia bazowa). + """ + bounds_before = [float(b) for b in layer.bounds] + + try: + just_int = int(layer.textItem.justification) + except Exception: + just_int = 1 # Left + + layer.textItem.contents = new_text + bounds_after = [float(b) for b in layer.bounds] + + # Photoshop Justification enum: 1=Left, 2=Center, 3=Right + if just_int == 2: + cx_before = (bounds_before[0] + bounds_before[2]) / 2 + cx_after = (bounds_after[0] + bounds_after[2]) / 2 + dx = cx_before - cx_after + elif just_int == 3: + dx = bounds_before[2] - bounds_after[2] + else: + dx = bounds_before[0] - bounds_after[0] + + dy = bounds_before[1] - bounds_after[1] + + if dx != 0 or dy != 0: + layer.translate(dx, dy) + + +def generate(imie_zenskie, imie_meskie, data, klient, naglowek=None): + """Generuje PSD z podmienionymi danymi.""" + os.makedirs(GOTOWE_DIR, exist_ok=True) + output_path = os.path.join(GOTOWE_DIR, f"{klient}.psd") + + app = ps.Application() + doc = app.open(SZABLON_PATH) + print(f"Otwarto szablon: {doc.name}") + + # Znajdz Smart Object (dowolna kopia - sa linkowane) + for layer in doc.layers: + if layer.name == SMART_OBJECT_LAYER: + app.activeDocument.activeLayer = layer + break + else: + doc.close(ps.SaveOptions.DoNotSaveChanges) + raise RuntimeError(f"Nie znaleziono warstwy '{SMART_OBJECT_LAYER}'") + + open_smart_object(app) + so_doc = app.activeDocument + + # Nawiguj do grupy Tekst (zawiera wszystkie warstwy tekstowe) + tekst_group = so_doc.layerSets["Tekst"] + + # Podmiana tekstow + replacements = { + "imie_zenskie": imie_zenskie, + "imie_meskie": imie_meskie, + "data": data, + } + if naglowek is not None: + replacements["naglowek"] = naglowek + + for layer_name, new_text in replacements.items(): + layer = tekst_group.artLayers[layer_name] + old_text = layer.textItem.contents + change_text_preserve_position(layer, new_text) + print(f' {layer_name}: "{old_text}" -> "{new_text}"') + + # Zapisz Smart Object (propaguje sie na wszystkie 8 kopii) + so_doc.save() + so_doc.close() + print("Smart Object zapisany") + + # Zapisz jako nowy PSD + psd_opts = ps.PhotoshopSaveOptions() + app.activeDocument.saveAs(output_path, psd_opts, True) + print(f"Zapisano: {output_path}") + + # Zamknij oryginal bez zapisu + app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges) + print("Gotowe!") + return output_path + + +def main(): + parser = argparse.ArgumentParser( + description="Generator PSD - buteleczki weselne Wzor 4" + ) + parser.add_argument("--imie_zenskie", required=True, help="Imie zenskie (np. Kasia)") + parser.add_argument("--imie_meskie", required=True, help="Imie meskie (np. Mateusz)") + parser.add_argument("--data", required=True, help="Data uroczystosci (np. 04.07.2026)") + parser.add_argument("--klient", required=True, help="Imie i nazwisko klienta (nazwa pliku wyjsciowego)") + parser.add_argument("--naglowek", default=None, help="Tekst naglowka (domyslnie: oryginalny z szablonu)") + + args = parser.parse_args() + generate( + imie_zenskie=args.imie_zenskie, + imie_meskie=args.imie_meskie, + data=args.data, + klient=args.klient, + naglowek=args.naglowek, + ) + + +if __name__ == "__main__": + main() diff --git a/tools/generowanie/buteleczki_wzor6.py b/tools/generowanie/buteleczki_slub_wzor6.py similarity index 100% rename from tools/generowanie/buteleczki_wzor6.py rename to tools/generowanie/buteleczki_slub_wzor6.py diff --git a/tools/generowanie/buteleczki_wzor8.py b/tools/generowanie/buteleczki_slub_wzor8.py similarity index 100% rename from tools/generowanie/buteleczki_wzor8.py rename to tools/generowanie/buteleczki_slub_wzor8.py