- Nowa tabela sms_templates (name + body + is_active) + minimalny CRUD.
- /settings/sms-templates: lista + formularz z paleta zmiennych (pill chips).
- Wydzielono Sms\SmsVariableResolver ze wspolna logika placeholderow;
Email\VariableResolver staje sie cienka fasada — EmailSendingService bez zmian.
- Dropdown "Wybierz szablon" w zakladce SMS na /orders/{id} z fetch
GET /orders/{id}/sms/template + OrderProAlerts.confirm przy nadpisaniu.
- Stopka SMSPLANET dalej doklejana wylacznie przez SmsConversationService
(Phase 122 contract preserved).
- Sidebar Ustawien: nowy link "Szablony SMS".
Migration: 20260512_000112_create_sms_templates.sql (CREATE TABLE).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 KiB
12 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, duration, started, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | duration | started | completed | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 124-sms-templates | 01 | sms |
|
|
|
|
|
|
|
|
~90min | 2026-05-12T23:30:00Z | 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 <select data-sms-template-picker> nad textarea; textarea ma id js-sms-message |
resources/views/layouts/app.php |
sidebar sublink "Szablony SMS"; <script> tag dla sms-template-picker.js |
resources/lang/pl.php |
klucze orders.details.sms.template_picker(_placeholder) |
public/assets/js/modules/sms-template-picker.js |
NEW — vanilla JS, idempotent guard, fetch endpoint + OrderProAlerts.confirm przy nadpisaniu |
resources/scss/modules/_sms-templates.scss |
NEW — .sms-template-*, .sms-var-* klasy |
resources/scss/app.scss |
import nowego partiala |
.paul/codebase/db_schema.md |
sekcja sms_templates + Total tables 60 -> 61 |
.paul/codebase/architecture.md |
sekcja "Phase 124 — SMS Templates" |
.paul/codebase/tech_changelog.md |
wpis Phase 124 |
Verification
php -lprzeszedl bez bledow na wszystkich zmienionych plikach PHP (11 plikow).php bin/migrate.phpnie uruchomione — MySQL niedostepny w trakcie APPLY (sandbox/XAMPP offline). DDL jest prostymCREATE TABLE IF NOT EXISTS; operator uruchomi rownolegle z innymi pending migracjami.- Browser smoke (CRUD
/settings/sms-templates, dropdown na/orders/{id}?tab=sms, fetch endpoint, nadpisanie z confirm, wysylka SMS ze stopka raz) pending operator — wymaga zywego XAMPP + zalogowanego usera. - SCSS
app.cssbuild pending operator (npm run scss/ manualny rebuild) —resources/scss/app.scssma nowy@use modules/sms-templates; bez rebuildu klasy.sms-template-*i.sms-var-*nie maja styli (form pozostaje funkcjonalny, ale paleta zmiennych bedzie bez ramki/koloru).
Acceptance Criteria
| AC | Status |
|---|---|
AC-1: CRUD szablonow SMS w /settings/sms-templates |
DONE (kod) — manual UAT pending |
| AC-2: Walidacja zapisu (puste name/body) | DONE — SmsTemplateRepository::save() rzuca RuntimeException; controller Flash danger + redirect |
| AC-3: Wspolny VariableResolver — bez regresji w Email | DONE — Email\VariableResolver deleguje, EmailSendingService niezmieniony |
| AC-4: Wstawianie szablonu w zakladce SMS z rozwinietymi zmiennymi | DONE — endpoint JSON + JS module z OrderProAlerts.confirm przy nadpisaniu |
| AC-5: Stopka doklejana raz, walidacja 918 znakow na finalnej tresci | DONE — szablon nie zawiera stopki; SmsConversationService niezmieniony (Phase 122 contract preserved) |
| AC-6: Sidebar link "Szablony SMS" z active state | DONE |
Deviations from PLAN
| Type | Count | Impact |
|---|---|---|
| Scope additions (UI fixes po UAT) | 2 | Visual polish — bez zmiany kontraktu |
| Deferred | 0 | Brak |
| Plan items pominiete (low value) | 2 | Zero ryzyka |
Deviations w trakcie APPLY
SmsConversationService::renderTemplate()NIE zostala dodana. Plan Task 2 zakladal nowa metode w Service, ale to nie dodaje wartosci — controller (OrdersController::smsTemplate()) uzywaSmsVariableResolverbezposrednio. Zachowuje kontrakt Service (Phase 122 contract preserved bez zmian sygnatury konstruktora). Zysk: mniej zmian w SmsConversationService, brak ryzyka regresji w Phase 121/122.OrdersControllerdostal?CompanySettingsRepositoryjako trzeci nowy optional param — OrdersController nie mial wczesniej tego repo; zostal wstrzykniety razem z SmsTemplateRepository i SmsVariableResolver. Wiring wroutes/web.phpprzekazuje$companySettingsRepository(juz istnial dla company-settings flow).- Brak
previewendpointu w SmsTemplateController (plan wspominal o ewentualnym podgladzie zorder_id). Pominiete — paleta zmiennych pod textarea + licznik znakow wystarcza.
UI fixes po UAT (scope additions)
- Layout palety zmiennych — pierwsza wersja (grid 50/50 z form-grid-2: textarea | paleta side-by-side) operator ocenil jako "kiepsko". Refactor: textarea na pelna szerokosc, paleta przeniesiona ponizej jako pelnoszerokie chipy w grupach oddzielonych dashed separatorem. Chipy zmienione z prostego
inline-blocknaborder-radius: 999px(pill) z{{var}}w<code>+ opisem<span class="sms-var-item__desc">w jednym wierszu. Hover indigo (#eef2ff/#6366f1). Plik:resources/scss/modules/_sms-templates.scss,resources/views/settings/sms-templates-form.php. - Akcje w liscie szablonow zawijaja sie —
td.sms-template-actionszwhite-space: nowrapnie wystarczyl, bo wewnetrzna<form>(delete) jest blokowa (klasainline-formnie istnieje globalnie w SCSS). Fix:.sms-template-actions { display: flex; flex-wrap: nowrap; gap: 6px; }+.sms-template-actions > form { display: inline-flex; margin: 0; }. Plik:resources/scss/modules/_sms-templates.scss.
SCSS przebudowany npx sass --style=compressed po obu fixach. Operator zaakceptowal final UI ("jest ok").
Pending Actions (operator)
php bin/migrate.php(XAMPP MySQL online) — utworzysms_templates.- SCSS rebuild (
npm run scsslub workflow operatora) dla_sms-templates.scss. - UAT manualny:
/settings/sms-templates/create— utworz "Numer sledzenia": body"Czesc {{kupujacy.imie_nazwisko}}, Twoja przesylka {{przesylka.numer}} jest w drodze. Sledzenie: {{przesylka.link_sledzenia}}". Zapisz.- Toggle status (AJAX) — dezaktywuj, ponownie aktywuj.
- Edycja — zmien body, zapisz.
- Duplikuj? — brak akcji (zgodnie z planem; minimalne pola).
- Usun (potwierdzenie OrderProAlerts).
/orders/{id}?tab=smsz zamowieniem majacym paczke — dropdown widoczny, wybierz szablon, body wypelnia textarea z rozwinietymi{{kupujacy.imie_nazwisko}}i{{przesylka.numer}}.- Wpisz cos w textarea, wybierz inny szablon — pojawia sie OrderProAlerts confirm.
- Wyslij SMS — sprawdz w
sms_messages.bodyze stopka SMSPLANET doklejona raz (jezeli skonfigurowana). - Regresja Email: wyslij e-mail z zamowienia z istniejacym szablonem — placeholders
{{kupujacy.imie_nazwisko}}i{{zamowienie.numer}}rozwiazane normalnie.
SonarQube
- CLI niedostepne (per Phase 116/117/121/122 history). Skipped, log w STATE Pending Actions.
Next Phase Readiness
Ready:
SmsTemplateRepository::listActive()+SmsVariableResolvergotowe do reuse w przyszlej automatyzacji SMS (akcjasend_smsanalogiczna dosend_emailz Phase 16).- Wzorzec dropdown + JSON endpoint + OrderProAlerts.confirm = template do innych quick-insert mechanizmow (np. szablony notatek do zamowienia).
- Sidebar Settings ma teraz blok email-templates + sms-templates obok — naturalne miejsce na kolejne typy szablonow.
Concerns:
- Brak preview z realnymi danymi w formularzu (paleta tylko inline). Jezeli operator bedzie chcial weryfikowac wynik przed zapisaniem, dodac endpoint
POST /settings/sms-templates/previewzorder_id(mirror EmailTemplateController::preview). SmsTemplateRepository::save()rzucaRuntimeExceptionzamiast zwracac strukturalne bledy — controller wlapuje przezThrowablei przekazuje message do Flash. Dla wiekszej UX precyzji rozwazycIntegrationConfigExceptionw przyszlosci.
Blockers: None.