feat(121+122): smsplanet conversation, notifications, default footer

Phase 121 — SMSPLANET Conversation + Notifications:
- migration 20260512_000110 adds smsplanet conversation + notifications tables
- src/Modules/Sms (SmsConversationService, SmsMessageRepository, SmsplanetWebhookController)
- src/Modules/Notifications (Repository, Controller, ApiController)
- order SMS tab, notification center, sender mode, inbound webhook
- public notifications.js + layouts/app.php integration

Phase 122 — SMSPLANET Default SMS Footer:
- migration 20260512_000111 adds smsplanet_integration_settings.default_footer
- footer appended to test SMS and order SMS, validated against 918 char limit
- settings textarea + compact order SMS note when footer configured

Bundled (could not split per-phase without hunk staging):
- routes/web.php (also carries Phase 118 fakturownia redirects)
- DOCS/{ARCHITECTURE,DB_SCHEMA,TECH_CHANGELOG}.md (118 + 121 + 122 entries)
- .paul/codebase/{architecture,db_schema,tech_changelog}.md (118 + 121 + 122)
- .paul/STATE.md, ROADMAP.md, changelog/2026-05-12.md (UNIFY closure)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-05-12 20:37:41 +02:00
parent 8f14851d85
commit 360eef128d
34 changed files with 2538 additions and 128 deletions

View File

@@ -2,99 +2,49 @@
## Co zrobiono
- [Phase 116, Plan 01] Dodano integracje HostedSMS: ustawienia konta, szyfrowane haslo, karta w hubie integracji i realna wysylka testowego SMS.
- Dodano klienta HostedSMS SimpleAPI (`POST https://api.hostedsms.pl/SimpleApi`) z obsluga `MessageId` i `ErrorMessage`.
- Poprawiono prezentacje ostatniego testu HostedSMS: status, HTTP i osobny identyfikator wiadomosci.
- Potwierdzono test na zywo: `2026-05-12 12:03:22 OK HTTP 200`, MessageId `d935d71a-d9a0-4cfb-be06-03fe36c71150`.
- Odnotowano przyszly zakres: odbior odpowiedzi SMS wymaga aktywacji interfejsu po stronie DCS/HostedSMS.
- [Phase 117, Plan 01] Dodano integracje SMSPLANET: globalne ustawienia konta, dwie metody autoryzacji, szyfrowane sekrety, karta w hubie integracji i realna wysylka testowego SMS.
- Dodano klienta SMSPLANET (`POST https://api2.smsplanet.pl/sms`) z obsluga Bearer token oraz `key` + `password`, bez parametru `test=1` dla testow realnych.
- Poprawiono uklad checkboxow i radio buttonow na ekranie integracji SMSPLANET przez wspolny komponent SCSS.
- Odnotowano blokery weryfikacji: lokalny MySQL odmawial polaczenia, `vendor\bin\phpunit` i `sonar-scanner` nie byly dostepne.
- [Phase 119, Plan 01] Re-import zamowien chroni `total_paid` przed nadpisaniem gdy `payment_status` sie nie zmienia (incydent #976: operator zwrocil 28,00 PLN klientowi).
- `OrderImportRepository::updateOrderDelta()` przepisane na dynamic SET builder z warunkowymi `total_paid` i `is_canceled_by_buyer`; cancel propagation ze zrodla nadal wymusza wpis flagi.
- Test PHPUnit `tests/Unit/OrderImportRepositoryTest.php` z 3 scenariuszami (preserve / transition / cancel) - syntax-checked, run odroczony do `composer install`.
- Operacyjnie: zamowienie #976 poprawione recznie w bazie (delete pozycji Girlanda, total_with_tax/total_paid 119->91, wpis do `order_activity_log`).
- [Phase 120, Plan 01] Ujednolicony moduł alertów: reusable komponent PHP `components/alert.php` z ikoną SVG i dismiss, brakujący wariant `.alert--info` (#eff6ff/#bfdbfe/#1e3a8a) - naprawa czarnego tekstu po teście Fakturowni.
- `Flash::push(type, message)` + `Flash::all()` z BC dla `set/get`; heurystyka klucza legacy (error/.save/warning/success).
- Centralny renderer flash w layoutach `app.php`, `auth.php`, `public.php` (foreach Flash::all() → component) - przyszłe `Flash::push()` zadziała bez ifów w widokach.
- Vanilla JS `alert-dismiss.js` z idempotent guardem + delegated click handlerem.
- 36 widoków zmigrowanych z inline `<div class="alert alert--TYPE">` / `.flash--*` na komponent (34 z planu + odkryte `orders/show.php` i `shipments/prepare.php`).
- CSS przebudowane via `npx sass --style=compressed`: `public/assets/css/app.css` (63 560 B), `login.css` (7 409 B).
- [Phase 121, Plan 01] Wdrożono dwukierunkową komunikację SMSPLANET: sender mode, webhook inbound, zakładkę SMS w zamówieniu oraz centrum powiadomień.
- [Phase 121, Plan 01] Poprawiono migrację po realnym błędzie FK: `orders.id` na bazie ma typ `BIGINT UNSIGNED`, więc referencje SMS/notifications używają tego samego typu.
- [Phase 121, Plan 01] Zamknięto UNIFY; manualne smoke testy SMSPLANET/browser notifications i SonarQube pozostają zależne od środowiska.
## Zmienione pliki
- `.paul/PROJECT.md`
- `.paul/ROADMAP.md`
- `.paul/STATE.md`
- `.paul/codebase/architecture.md`
- `.paul/codebase/db_schema.md`
- `.paul/codebase/tech_changelog.md`
- `.paul/phases/116-hostedsms-integration/116-01-PLAN.md`
- `.paul/phases/116-hostedsms-integration/116-01-SUMMARY.md`
- `.paul/phases/117-smsplanet-integration/117-01-PLAN.md`
- `.paul/phases/117-smsplanet-integration/117-01-SUMMARY.md`
- `DOCS/ARCHITECTURE.md`
- `DOCS/DB_SCHEMA.md`
- `DOCS/TECH_CHANGELOG.md`
- `database/migrations/20260512_000107_create_hostedsms_integration_settings.sql`
- `database/migrations/20260512_000108_create_smsplanet_integration_settings.sql`
- `database/migrations/20260512_000110_smsplanet_conversation_notifications.sql`
- `src/Modules/Sms/SmsMessageRepository.php`
- `src/Modules/Sms/SmsConversationService.php`
- `src/Modules/Sms/SmsplanetWebhookController.php`
- `src/Modules/Notifications/NotificationRepository.php`
- `src/Modules/Notifications/NotificationController.php`
- `src/Modules/Notifications/NotificationApiController.php`
- `src/Modules/Settings/SmsplanetIntegrationRepository.php`
- `src/Modules/Settings/SmsplanetIntegrationController.php`
- `src/Modules/Orders/OrdersController.php`
- `routes/web.php`
- `resources/views/settings/smsplanet.php`
- `resources/views/orders/show.php`
- `resources/views/notifications/index.php`
- `resources/views/layouts/app.php`
- `resources/lang/pl.php`
- `resources/scss/app.scss`
- `resources/views/settings/hostedsms.php`
- `resources/views/settings/smsplanet.php`
- `routes/web.php`
- `src/Modules/Settings/HostedSmsApiClient.php`
- `src/Modules/Settings/HostedSmsIntegrationController.php`
- `src/Modules/Settings/HostedSmsIntegrationRepository.php`
- `src/Modules/Settings/IntegrationSecretCipher.php`
- `src/Modules/Settings/IntegrationsHubController.php`
- `src/Modules/Settings/SmsplanetApiClient.php`
- `src/Modules/Settings/SmsplanetIntegrationController.php`
- `src/Modules/Settings/SmsplanetIntegrationRepository.php`
- `.paul/phases/119-reimport-total-paid-protection/119-01-PLAN.md`
- `.paul/phases/119-reimport-total-paid-protection/119-01-SUMMARY.md`
- `src/Modules/Orders/OrderImportRepository.php`
- `tests/Unit/OrderImportRepositoryTest.php`
- `.paul/phases/120-alert-component-unification/120-01-PLAN.md`
- `.paul/phases/120-alert-component-unification/120-01-SUMMARY.md`
- `resources/views/components/alert.php`
- `public/assets/js/modules/alert-dismiss.js`
- `resources/scss/shared/_ui-components.scss`
- `public/assets/css/app.css`
- `public/assets/css/login.css`
- `src/Core/Support/Flash.php`
- `resources/views/layouts/app.php`
- `resources/views/layouts/auth.php`
- `resources/views/layouts/public.php`
- `resources/views/settings/fakturownia.php`
- `resources/views/settings/accounting-invoice-edit.php`
- `resources/views/settings/accounting-receipt-edit.php`
- `resources/views/settings/accounting-receipts.php`
- `resources/views/settings/accounting-invoices.php`
- `resources/views/settings/accounting.php`
- `resources/views/settings/allegro.php`
- `resources/views/settings/apaczka.php`
- `resources/views/settings/company.php`
- `resources/views/settings/cron.php`
- `resources/views/settings/database.php`
- `resources/views/settings/delivery-status-form.php`
- `resources/views/settings/delivery-statuses.php`
- `resources/views/settings/email-mailboxes.php`
- `resources/views/settings/email-templates.php`
- `resources/views/settings/email-templates-form.php`
- `resources/views/settings/integrations.php`
- `resources/views/settings/printing.php`
- `resources/views/settings/project-mappings.php`
- `resources/views/settings/shoppro.php`
- `resources/views/settings/statuses.php`
- `resources/views/orders/list.php`
- `public/assets/js/modules/notifications.js`
- `DOCS/DB_SCHEMA.md`
- `DOCS/ARCHITECTURE.md`
- `DOCS/TECH_CHANGELOG.md`
- [Phase 122, Plan 01] Dodano konfigurowalny domyślny stopkę SMS w SMSPLANET — kolumna `default_footer` w `smsplanet_integration_settings`, doklejanie do test SMS i wiadomości z zamówienia, walidacja 918 znaków, UI textarea i podgląd w zamówieniu.
- [Phase 122, Plan 01] Zamknięto UNIFY; manualne smoke testy (test SMS i SMS z zamówienia z/bez stopki, over-limit) oraz SonarQube zależne od środowiska.
## Zmienione pliki (Phase 122)
- `database/migrations/20260512_000111_smsplanet_default_footer.sql`
- `src/Modules/Settings/SmsplanetIntegrationRepository.php`
- `src/Modules/Settings/SmsplanetIntegrationController.php`
- `src/Modules/Sms/SmsConversationService.php`
- `src/Modules/Orders/OrdersController.php`
- `resources/views/settings/smsplanet.php`
- `resources/views/orders/show.php`
- `resources/views/orders/receipt-create.php`
- `resources/views/shipments/prepare.php`
- `resources/views/accounting/invoice_form.php`
- `resources/views/automation/index.php`
- `resources/views/automation/form.php`
- `resources/views/users/index.php`
- `resources/views/statistics/orders.php`
- `resources/views/auth/login.php`
- `resources/lang/pl.php`
- `resources/scss/app.scss`
- `public/assets/css/app.css`
- `DOCS/DB_SCHEMA.md`
- `DOCS/ARCHITECTURE.md`
- `DOCS/TECH_CHANGELOG.md`