Commit Graph

42 Commits (00961be6755d2d1e42277312874df1c3851b45f5)

Author SHA1 Message Date
boban 00961be675 feat: 3 neue E-Mail Templates + Logo im Layout
Neue Templates im einheitlichen Stil:
- auth/welcome      → nach erster E-Mail-Verifizierung, Feature-Übersicht + CTA
- subscription/confirmed → Abo-Bestätigung mit Plan/Betrag/Verlängerungsdatum
- subscription/cancelled → Kündigung mit Zugang-bis-Datum + Reaktivierungs-CTA

Layout: Textwordmark durch logo-text.png ersetzt (height:32px)
Preview: alle 3 Templates in /admin/mail-preview ergänzt (11 Templates gesamt)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 20:32:14 +02:00
boban cd2e466f09 feat: E-Mail Templates neu gestaltet + Mail-Preview unter /admin/mail-preview
Einheitliches Design für alle Templates:
- Neues Layout: weißes Card, 3px Indigo-Gradient-Akzentbalken, aziros-Wordmark
- Icon-Badge pro Template (52px, border-radius:14px, thematische Farbe)
- Konsistente Typografie, Info-Boxen, Button-Stil
- reset-password, smtp-test, aria-composed auf @extends migriert

Preview-Route: /admin/mail-preview (Index) + /admin/mail-preview/{template}
→ Alle 8 Templates mit Fake-Daten in einer skalierten Vorschau-Grid-Ansicht.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 20:20:29 +02:00
boban b8afe0cb70 fix: Checkout-Button sofort via Alpine $wire freischalten, Features-Sort stabilisieren
- wire:model.live + :disabled="!$wire.rightAcknowledged || !$wire.waiverConfirmed"
  → Button reagiert clientseitig ohne Server-Roundtrip
- orderBy('sort')->orderBy('id') → stabile Feature-Reihenfolge beim Billing-Wechsel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:51:46 +02:00
boban f76ea32076 fix: SMTP-Auth via info@nimu.li, FROM-Adresse je Template auf aziros.com setzen
Die aziros.com-Postfächer (hello/noreply) können sich nicht direkt am SMTP
authentifizieren. Lösung: smtp-Mailer (info@nimu.li) für Auth verwenden,
FROM-Header per ->from() auf die korrekte aziros.com-Adresse setzen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:40:49 +02:00
boban a023ed19f6 fix: Verifizierungs-Mail via hello@aziros.com statt Fallback-Mailer senden
ProcessMailQueue verwendete Mail::html() ohne Mailer-Angabe, was den Default-
Mailer (smtp = info@nimu.li) nutzte. Jetzt: auth.* → hello-Mailer, Rest → system.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:34:11 +02:00
boban d880ee4d7d fix: Pro-Mailer (system/reminder/aria/hello) verwenden eigene SMTP-Credentials
Registrierungs-E-Mails wurden bisher über info@nimu.li gesendet, weil alle
benannten Mailer auf MAIL_USERNAME/MAIL_PASSWORD zurückfielen. Jetzt nutzt
jeder Mailer seine eigenen MAIL_*_USERNAME und MAIL_*_PASSWORD aus .env.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:25:04 +02:00
boban b863b67979 feat: Widerrufsrecht-Bestätigung beim Upgrade (Free → Pro)
- Migration: withdrawal_waivers (user, plan, billing, amount, IP,
  user_agent, confirmed_at, pdf_path für spätere PDF-Generierung)
- Model: WithdrawalWaiver mit User/Plan-Relation
- Checkout/Index: rightAcknowledged + waiverConfirmed Properties;
  Validierung vor Checkout; Waiver-Record wird vor Zahlung gespeichert
- View: Amber-Box mit Hinweistext + 2 Checkboxen; CTA-Button disabled
  solange nicht beide bestätigt; nur bei paid Plänen sichtbar
- Übersetzungen: waiver_info, waiver_right_acknowledged,
  waiver_confirmed, waiver_required (DE + EN)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:05:41 +02:00
boban 2c81e2533d fix: Überfällig-Badge bei offenen Aufgaben im Dashboard mit Text
Statt nur Ausrufezeichen-Icon nun ein rotes Badge mit Label
"überfällig / overdue" + Datum — bestehender Übersetzungsschlüssel
dashboard.overdue (de/en) wird verwendet.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 18:40:01 +02:00
boban 8c69d3b4e6 feat: Aria-Prompt um Jarvis-Persönlichkeit, Humor und Konversation erweitert
Neue Blöcke: HUMOR & EMOTIONEN, KONVERSATION. PERSÖNLICHKEIT um
Jarvis-Charakter (trockener Humor, Selbstironie, eigene Meinung) ergänzt.
Bestehende Regeln unverändert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 18:17:33 +02:00
boban 552998f06a feat: Übersetzungsschlüssel tasks.reminder_custom hinzugefügt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 01:09:01 +02:00
boban 3a9534f699 fix: Push-Body zeigt Uhrzeit des Events statt abstrakten Countdown
Statt "In 15 Stunde(n)" steht nun "Heute um 16:00 Uhr" — eindeutiger
Bezug zum Event. Bei < 60 min bleibt der Countdown plus die Uhrzeit.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 01:02:40 +02:00
boban 772f11b517 fix: Push-Notifications und Reminder-Zeitberechnung
- PushService: Http::asJson() statt withHeaders; EXPO_TOKEN als Bearer-Auth
- services.php: expo.token aus ENV eingetragen
- ScheduleEventReminders: UTC-Reminder-Zeit erst in Lokalzeit umrechnen,
  dann mit lokalem Event-Datum kombinieren → verhindert +24h-Versatz bei
  Mitternacht-Übergängen (z.B. 22:20 UTC = 00:20 Wien)
- Event-Abfrage auf starts_at > now - 1 Tag erweitert, damit auch bereits
  gestartete Events noch Reminder erhalten

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 00:56:38 +02:00
boban 57b55503fd fix: time_of_day/day_before reminder times parsed as UTC in calculateSendTime
Also add 'specific' datetime reminder type support.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 23:40:25 +02:00
boban 2acc49ea66 fix: reminder validation + remove dead code 2026-04-19 23:22:01 +02:00
boban 439754b9ba fix: time_of_day reminder time stored as UTC, displayed as local
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 22:52:12 +02:00
boban ee795237db fix: reminder validation + remove dead reminder_at in EventPlannerService
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 22:39:52 +02:00
boban b88093ed46 Fix: 0 credits for farewell chat messages
Abschlussnachrichten (danke, ok, tschüss, passt, ...) kosten 0 statt 5
Credits — keine Leistung erbracht, keine Verrechnung.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:30:10 +02:00
boban 89cb058e83 Fix: parseJson chat responses, force override for conflicts
- parseJson: plain text (kein { oder [) → type=chat statt type=unknown
  Behebt WARNING für normale Chat-Antworten wie "Alles klar! [END]"
- AgentAIService Prompt: Regel 12 — Konflikt-Handling mit force:true erklärt
  AI fragt nach Überschneidung und sendet force:true wenn User bestätigt
- AgentActionService: Duplikat-Check bei force=true überspringen
  damit erzwungene Events auch bei gleichem Titel+Datum gespeichert werden

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:22:52 +02:00
boban 7d50647f39 Fix: strip markdown backticks from OpenAI JSON response
Vorher: preg_match mit Capture-Group schlug fehl wenn ``` am Ende fehlt.
Nachher: zwei preg_replace entfernen öffnendes ```json und schließendes ```
unabhängig voneinander — robuster gegen unvollständige Codeblöcke.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:09:44 +02:00
boban 9beb8c15a3 Fix: unknown type logging, event_update fallback to create, multi-event example
- AgentAIService: Raw response + type=unknown immer loggen (Debug)
- AgentActionService: event_update ohne Kandidaten + Zeitangabe → neu erstellen
  statt mit 'failed' abbrechen
- AgentAIService Prompt: Pflicht-Beispiel Reifenwechsel+Volleyball als
  Multi-Event mit reminder_at, explizit FALSCH: task anlegen markiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:04:02 +02:00
boban bcc1c0aac2 Fix: event vs task distinction, event reminder support, correct credit calculation
- AgentChatController: _multi hatte kein type-Key → wurde als 'chat' gewertet
  → nur 5 Credits statt Action-Credits. Fix: isset(_multi) erkennt Multi-Actions
- AgentAIService: EVENT vs TASK Entscheidungsregel + reminder_at für Events
  Event mit Erinnerung → immer event+reminder_at, niemals als Task anlegen
- EventPlannerService: reminder_at beim Event-Erstellen speichern (UTC)
- Event Model + Migration: reminder_at + reminder_sent Felder ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 07:49:39 +02:00
boban e205186465 Fix: ignore all-day conflicts, verify chat credits
- Ganztägige Konflikt-Prüfung: EventPlannerService hatte bereits
  ->where('is_all_day', false) in hasConflict() + hasMultiDayConflict()
  AgentActionService delegiert dorthin — kein zusätzlicher Fix nötig
- Chat-Credits: immer 5 Credits pauschal (vorher: nur 1. Nachricht einer
  Session, Follow-ups = 0 + kein Log)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 07:36:01 +02:00
boban 68aa62db6f Fix: korrekte Credit-Verrechnung + Duplikat-Schutz
- Credits nur bei status='success': Konflikt/Fehler/Failed → 0 Credits
- Multi-Action: Credits proportional zu erfolgreichen Aktionen
- AgentActionService: Duplikat-Check vor Event/Task/Notiz-Anlage
- Multi-Action-Status: 'success'/'partial'/'failed' statt immer 'success'
- Gilt für Web (Livewire/Agent/Index) und API (AgentChatController)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 07:31:36 +02:00
boban ee63529289 Fix: ignore all-day events in conflict detection 2026-04-19 06:45:30 +02:00
boban 7bab29b5eb Fix: system prompt — multi-action, Austrian time expressions, dynamic UTC offset 2026-04-19 06:43:24 +02:00
boban d7a70a0e9b Fix: favicon light/dark mode separate SVG files 2026-04-19 04:30:10 +02:00
boban fac177da70 Fix: favicon dark mode clean 2026-04-19 04:25:29 +02:00
boban 6fb3f16f16 Fix: favicon dark mode correct 2026-04-19 04:23:52 +02:00
boban 4a10c71c89 Fix: separate favicons for dark/light mode 2026-04-19 04:20:02 +02:00
boban 53f3e60044 Fix: favicon dark mode support 2026-04-19 04:05:03 +02:00
boban ed098ba59b Feature: logos, favicon, layout fixes 2026-04-19 01:45:44 +02:00
boban 79397797b1 Fix: staging build with relative font URLs 2026-04-19 01:44:05 +02:00
boban 601c0ecb77 Build: staging assets 2026-04-19 01:24:12 +02:00
boban 707517bc39 Add: CORS config for all environments 2026-04-19 01:04:46 +02:00
boban 2ca74dd80e Fix: APP_API_URL for version check 2026-04-19 00:58:15 +02:00
boban fb7dcf2629 Fix: build per server, remove build from git
- src/public/build/ removed from git tracking
- .gitignore + src/.gitignore: /public/build added
- deploy.sh: npm ci + npm run build:staging/prod added back

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 00:04:34 +02:00
boban a693cecb61 Fix: include build assets in git, remove npm from deploy
- Production build committed (socket.aziros.com:443, forceTLS=true)
- deploy.sh: removed npm install + npm run build steps
- Build strategy: build locally before deploy, commit to git
- Staging build: run npm run build:staging before staging deploy

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 00:02:04 +02:00
boban ca61f6f65a Fix: staging build URLs, healthcheck, docker-compose env_file
- Staging build created: socket.staging.aziros.com:443, forceTLS=true
- Root .env recreated for Docker Compose YAML interpolation (${DB_*})
- Old build assets removed from git tracking (src/public/build/ gitignored)
- Healthchecks use $$DB_ROOT_PASSWORD in all compose files (verified)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 23:57:45 +02:00
boban fcc3bf2529 Build: add staging assets to git 2026-04-18 22:55:26 +02:00
boban daafa9c042 Remove public/build from gitignore 2026-04-18 22:53:41 +02:00
boban 82c9c13aaf Refactor: unified env structure, staging config added
- All docker-compose services now use src/.env (prod), src/.env.development (local)
- docker-compose.staging.yml added with staging.conf nginx config
- Root .env removed; all vars consolidated in src/.env
- MARIADB_* vars added to all env files for db service
- .gitignore cleaned up (removed duplicate src/.env entry)
- src/.env.example updated with DB_ROOT_PASSWORD and MARIADB_* vars

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 21:48:46 +02:00
boban db8a012f73 Initial commit — Aziros v1.0.0 2026-04-18 20:53:15 +02:00