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

@@ -41,6 +41,16 @@ return [
'accounting_section' => 'Ksiegowosc',
'project_mapping' => 'Mapowanie projektow',
],
'notifications' => [
'title' => 'Powiadomienia',
'description' => 'Historia zdarzen wymagajacych uwagi operatora.',
'empty' => 'Brak powiadomien.',
'actions' => [
'open' => 'Otworz',
'mark_read' => 'Oznacz jako przeczytane',
'mark_all_read' => 'Oznacz wszystkie jako przeczytane',
],
],
'marketplace' => [
'title' => 'Marketplace',
'description' => 'Aktywne integracje i powiazane oferty marketplace.',
@@ -155,6 +165,17 @@ return [
'shipments' => 'Przesylki',
'payments' => 'Platnosci',
'documents' => 'Dokumenty powiazane',
'sms' => 'SMS',
],
'sms' => [
'title' => 'Rozmowa SMS',
'empty' => 'Brak wiadomosci SMS dla tego zamowienia.',
'inbound' => 'Klient',
'outbound' => 'Operator',
'phone' => 'Numer klienta',
'message' => 'Tresc SMS',
'footer_note' => 'Skonfigurowana stopka SMSPLANET zostanie dodana automatycznie.',
'send' => 'Wyslij SMS',
],
'items_title' => 'Pozycje',
'item_name' => 'Nazwa',
@@ -783,6 +804,9 @@ return [
'api_key' => 'Klucz API',
'api_password' => 'Haslo API',
'sender' => 'Pole nadawcy / from',
'sender_mode' => 'Tryb nadawcy',
'sender_phone' => 'Numer 2WAY',
'default_footer' => 'Domyslna stopka SMS',
'options' => 'Opcje wysylki',
'clear_polish' => 'Zamien polskie znaki na odpowiedniki GSM',
'transactional' => 'Wysylka kanalem transakcyjnym',
@@ -802,9 +826,17 @@ return [
'saved' => 'Haslo API jest zapisane. Pozostaw pole puste, aby nie zmieniac.',
'missing' => 'Brak zapisanego hasla API.',
],
'sender_modes' => [
'text' => 'Nadpis',
'phone' => 'Numer 2WAY',
],
'hints' => [
'auth_method' => 'SMSPLANET zaleca token Bearer, ale API obsluguje tez klucz i haslo.',
'sender' => 'Pole nadawcy musi byc dostepne na koncie SMSPLANET albo miec wartosc testowa dopuszczona przez provider.',
'sender_mode' => 'Tryb decyduje, ktora wartosc trafi do pola from w SMSPLANET.',
'sender_phone' => 'Numer 2WAY uzywany do dwukierunkowej rozmowy SMS.',
'default_footer' => 'Opcjonalna stopka dopisywana do testowych SMS i SMS z rozmowy w zamowieniu. Limit: 300 znakow.',
'test_footer' => 'Do testowego SMS zostanie dodana zapisana stopka.',
],
'status' => [
'secret' => 'Sekret API',