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

@@ -2126,6 +2126,137 @@ details[open] > .order-statuses-side__title .order-statuses-side__arrow {
display: block;
}
.order-sms-head,
.notifications-page__head {
align-items: center;
display: flex;
gap: 12px;
justify-content: space-between;
}
.order-sms-thread {
display: flex;
flex-direction: column;
gap: 8px;
}
.order-sms-bubble {
background: #f8fafc;
border: 1px solid #e2e8f0;
border-radius: 8px;
max-width: 76%;
padding: 8px 10px;
}
.order-sms-bubble--outbound {
align-self: flex-end;
background: #ecfdf5;
border-color: #bbf7d0;
}
.order-sms-bubble--inbound {
align-self: flex-start;
}
.order-sms-bubble__meta {
color: #64748b;
display: flex;
flex-wrap: wrap;
font-size: 12px;
gap: 8px;
}
.order-sms-bubble__body {
color: #0f172a;
font-size: 14px;
line-height: 1.35;
margin: 4px 0;
overflow-wrap: anywhere;
}
.order-sms-form {
display: grid;
gap: 10px;
}
.topbar-notifications {
align-items: center;
border: 1px solid #dbe4ef;
border-radius: 8px;
color: #334155;
display: inline-flex;
height: 34px;
justify-content: center;
position: relative;
width: 38px;
}
.topbar-notifications:hover {
background: #f8fafc;
color: #0f172a;
}
.topbar-notifications__badge {
align-items: center;
background: #dc2626;
border-radius: 999px;
color: #fff;
display: inline-flex;
font-size: 11px;
font-weight: 700;
height: 18px;
justify-content: center;
min-width: 18px;
padding: 0 5px;
position: absolute;
right: -6px;
top: -6px;
}
.notifications-list {
display: grid;
gap: 8px;
}
.notification-row {
align-items: center;
border: 1px solid #e2e8f0;
border-radius: 8px;
display: flex;
gap: 12px;
justify-content: space-between;
padding: 10px 12px;
}
.notification-row--unread {
background: #f8fafc;
border-color: #93c5fd;
}
.notification-row__title {
color: #0f172a;
font-weight: 700;
}
.notification-row__body {
color: #334155;
margin-top: 3px;
overflow-wrap: anywhere;
}
.notification-row__meta {
color: #64748b;
font-size: 12px;
margin-top: 4px;
}
.notification-row__actions {
align-items: center;
display: flex;
flex-shrink: 0;
gap: 8px;
}
.manual-tracking-form {
display: flex;
gap: 8px;
@@ -2753,6 +2884,26 @@ details[open] > .order-statuses-side__title .order-statuses-side__arrow {
accent-color: var(--c-action-primary);
}
.smsplanet-sender-phone-field {
grid-column: 2;
}
.smsplanet-default-footer-field {
grid-column: 1 / -1;
}
.smsplanet-default-footer-field textarea {
min-height: 78px;
resize: vertical;
}
.order-sms-footer-note {
color: #64748b;
display: block;
font-size: 12px;
margin-top: 4px;
}
// Hamburger button (hidden on desktop)
.topbar__hamburger {
display: none;
@@ -2934,6 +3085,14 @@ body.no-scroll {
grid-template-columns: 1fr;
}
.smsplanet-sender-phone-field {
grid-column: 1;
}
.smsplanet-default-footer-field {
grid-column: 1;
}
.card {
padding: 12px;
}