--- phase: 124-sms-templates plan: 01 subsystem: sms tags: [sms, templates, smsplanet, orders, settings] requires: - phase: 117-smsplanet-integration provides: SmsplanetIntegrationRepository, SmsplanetApiClient - phase: 121-smsplanet-conversation-notifications provides: SmsConversationService::sendFromOrder, SMS tab w /orders/{id} - phase: 122-smsplanet-default-footer provides: default_footer + MAX_SMS_LENGTH = 918 validation on final body - phase: 14-email-templates provides: email_templates CRUD pattern, VARIABLE_GROUPS structure provides: - sms_templates DB table + CRUD repository - /settings/sms-templates panel (lista + formularz) - shared SmsVariableResolver (extracted from Email\VariableResolver) - GET /orders/{id}/sms/template endpoint (JSON, variables resolved per-order) - Dropdown "Wybierz szablon" w zakladce SMS na /orders/{id} - sms-template-picker.js (vanilla JS, OrderProAlerts.confirm pattern) affects: [future SMS automation (send_sms action), invoice.created event] tech-stack: added: [] patterns: - "Shared VariableResolver pattern: Email\\VariableResolver as thin facade delegating to Sms\\SmsVariableResolver" - "Idempotent JS module guard: window.__smsTemplatePickerBound + dataset.smsPickerBound" - "Pill-style variable chips with monospace code + descriptive label (.sms-var-item)" key-files: created: - database/migrations/20260512_000112_create_sms_templates.sql - src/Modules/Sms/SmsTemplateRepository.php - src/Modules/Sms/SmsVariableResolver.php - src/Modules/Settings/SmsTemplateController.php - resources/views/settings/sms-templates.php - resources/views/settings/sms-templates-form.php - resources/scss/modules/_sms-templates.scss - public/assets/js/modules/sms-template-picker.js modified: - src/Modules/Email/VariableResolver.php - src/Modules/Orders/OrdersController.php - routes/web.php - resources/views/orders/show.php - resources/views/layouts/app.php - resources/lang/pl.php - resources/scss/app.scss key-decisions: - "SMS template fields minimal: name + body + is_active (no subject/mailbox/attachment)" - "Footer NOT in template — appended by SmsConversationService (Phase 122 contract preserved)" - "Email\\VariableResolver becomes facade — preserves EmailSendingService contract, zero regression risk" - "Variable picker = pill chips with {{var}} + description on same row (not dropdown like email)" - "Action column uses flex+gap not inline-flex on td — robust against block-display
children" patterns-established: - "Shared resolver: keep facade in original namespace for BC, move logic to new namespace" - "Idempotent JS modules: window.__moduleBound + dataset.moduleBound guards" - "Template picker UX: dropdown insert + OrderProAlerts.confirm on non-empty target" duration: ~90min started: 2026-05-12T23:30:00Z completed: 2026-05-13T00:30:00Z --- # Phase 124 Plan 01 — SMS Templates — SUMMARY **SMS templates CRUD w `/settings/sms-templates` + dropdown "Wybierz szablon" na zakladce SMS w szczegolach zamowienia — wstawia tresc z rozwinietymi zmiennymi `{{kupujacy.imie_nazwisko}}`, `{{przesylka.numer}}` itp. Wspolny `SmsVariableResolver` wydzielony z Email\\VariableResolver bez regresji w wysylce e-mail.** ## Performance | Metric | Value | |--------|-------| | Duration | ~90 min (PLAN + APPLY + UI fixes + UNIFY) | | Started | 2026-05-12T23:30:00Z | | Completed | 2026-05-13T00:30:00Z | | Tasks | 5/5 ukonczone | | Files modified | 17 (8 created + 9 modified) | **Status:** UNIFY complete. Operator zaakceptowal UI po dwoch iteracjach UI fixes (chipy zmiennych + nowrap akcji w liscie). ## Files modified | File | Change | |------|--------| | `database/migrations/20260512_000112_create_sms_templates.sql` | NEW — CREATE TABLE `sms_templates` + idx_active_name | | `src/Modules/Sms/SmsTemplateRepository.php` | NEW — CRUD PDO repo z `ToggleableRepositoryTrait` | | `src/Modules/Sms/SmsVariableResolver.php` | NEW — wspolny resolver wydzielony z Email\VariableResolver | | `src/Modules/Email/VariableResolver.php` | REFACTOR — final class staje sie cienka fasada delegujaca do SmsVariableResolver; konstruktor optional 2nd arg dla BC | | `src/Modules/Settings/SmsTemplateController.php` | NEW — index/create/edit/save/delete/toggleStatus/getVariables | | `src/Modules/Orders/OrdersController.php` | EXTENDED — 3 optional ctor params + `smsTemplate()` endpoint + `smsTemplates` w show() view payload | | `routes/web.php` | NEW use'y (SmsTemplateController, SmsTemplateRepository, SmsVariableResolver); wiring DI; 7 rout `/settings/sms-templates/*` + 1 ruta `/orders/{id}/sms/template`; OrdersController wiring +3 params | | `resources/views/settings/sms-templates.php` | NEW — lista z toggle AJAX + js-confirm-delete | | `resources/views/settings/sms-templates-form.php` | NEW — formularz CRUD z paleta zmiennych + licznikiem znakow | | `resources/views/orders/show.php` | EXTENDED — dropdown `