Commit Graph

20 Commits

Author SHA1 Message Date
Claude
87aa7a7821 Portal-Login: Mitarbeiter kommen ins Admin-Panel, Admin-Label bleibt WOMS-Rolle
Bisher liess /api/auth/login nur Appwrite-User mit dem Label "admin" in die
Admin-Ansicht; alle anderen fielen in den Kunden-Login und bekamen "Kein
Kundenkonto fuer diesen Login gefunden". Mitarbeiter ohne Admin-Haken (z.B.
nico@webklar.com) kamen damit nicht auf /admin.html.

Jetzt gilt: Wer in der employees-Collection steht, ist Backoffice-Nutzer. Das
Label "admin" ist nur noch die WOMS-Adminrolle (Mitarbeiterverwaltung) und wird
als isAdmin-Flag in der Portal-Session bzw. in den Preview-Token-Labels
mitgefuehrt - inklusive "Als Kunde ansehen" und zurueck.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 18:26:59 +00:00
Claude
ac264dc9ba Rechnungsanalyse: Termin landet im Akquise-Ticket und damit im Planboard
Der im Gespraech vereinbarte Termin wird mit einem Klick am Akquise-Ticket
eingetragen (startDate/startTime/endTime/assignedTo/assignedName) - genau die
Felder, die das WOMS-Planboard liest. Kein zweiter Datensatz, damit Termin und
Ticket nicht auseinanderlaufen koennen.

- server/services/appointments.js: Ticket des Kunden finden, Termin schreiben,
  belegte Zeiten lesen; Umrechnung ISO <-> "dd.mm.yyyy" und "hh:mm" <-> "hhmm"
- Routen GET /api/portal-admin/appointments und
  POST /api/portal-admin/customers/:id/appointment
- Bereits vergebene Zeiten sind in der Terminauswahl gesperrt ("belegt"), der
  eigene Termin bleibt waehlbar; steht am Ticket schon einer, ist er beim
  Oeffnen vorausgewaehlt
- Zeiten, die jemand von Hand in WOMS gesetzt hat, tauchen mit auf

Sicherung gegen Datenverlust: bevorzugt wird das Akquise-Ticket. Gibt es keins,
kommt nur ein anderes offenes Ticket OHNE Datum in Frage - bei Webpage- und
Projekttickets bedeutet startDate den Projektstart, den wuerden wir sonst still
ueberschreiben. Die Rueckmeldung nennt immer Nummer und Art des Tickets.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 22:09:51 +00:00
Claude
9108c90a53 Rechnungsanalyse: Kalkulationsseite fuer Leads im Admin-Panel
Bei Leads (customerStatus=lead) steht in der Kundenliste jetzt der Button
"Rechnungsanalyse". Er oeffnet /kalkulation.html?customer=<id> - die Seite,
die im Gespraech vor Ort oder am Telefon ausgefuellt wird.

- Positionen nach Bereich (Website, Onlineshop, Softwareprojekt,
  Automatisierung/KI, laufende Kosten) mit Stundenwerten und Mengen
- Preis ueber die Stundenstaffel (150/130/115/100), Brutto mit 19 % MwSt.,
  Zahlungsmodalitaeten ab 1.000 / 3.000 EUR
- Hinweis, ob selbst zusagbar (<= 5 Std), Termin abzustimmen oder ob Kenso
  freigeben muss (Shop, Software, Automatisierung)
- Termin mit Justin/Kenso aus den hinterlegten Zeitfenstern, Notizen,
  Kundenportal-Zugang mit QR-Code
- Zusammenfassung als Text zum Kopieren -> gehoert ins Akquise-Ticket

Bewusst ohne eigenen Datensatz: dokumentiert wird im Ticket. Der Stand liegt
pro Kunde nur im localStorage, damit ein angefangenes Gespraech nicht
verloren geht.

Fonts (Caprasimo, Figtree) liegen lokal unter public/fonts, kein Abruf beim
Google-CDN. Neue Route GET /api/portal-admin/customers/:customerId liefert
die Stammdaten zum Vorbefuellen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 21:42:13 +00:00
Claude
a4b4974431 Selbstheilung: /api/auth/me stellt abgelaufenes/fehlendes preview_session-Cookie neu aus
Portal-Session (webklar_portal_session) lebt unabhaengig vom preview_session-JWT.
Fehlte das Preview-Cookie (WebView-Datenverlust, Ablauf), liefen alle
*.project.webklar.com-Hosts in eine 302-Login-Schleife (schwarze Seite im
Kundenportal), obwohl der Nutzer eingeloggt war - Re-Login war der einzige
Ausweg. Jetzt heilt jeder Aufruf der Projektuebersicht das Cookie automatisch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 20:13:44 +00:00
Claude
b6f5ea11ec Portal-Admin: archivierte Projekte/Kunden ausblenden, Kundentabelle ohne Horizontal-Scroll
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 19:30:16 +00:00
Claude
1b4262b09f fix: 403-Schutz + Selbstheilung fuer geloeschte Preview-Config
- runDeploy schreibt Platzhalter-index.html, wenn das Deploy-Verzeichnis
  keine index.html enthaelt (leergeraeumtes Repo/Fehlbuild) -> nie mehr
  nginx 403 Forbidden, Subdomain bleibt erreichbar.
- deployStatic: Fallback auf Repo-Wurzel bei fehlendem index-Unterordner,
  .git wird nicht mehr mit ausgeliefert.
- Webhook: fehlt .webklar-preview.json im Repo, wird die Hosting-Config aus
  dem Appwrite-Projektstand rekonstruiert, ins Repo zurueckgeschrieben und
  normal deployt (ensureRepoPreviewConfig).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 18:05:00 +00:00
Claude
b474c4aa48 feat: Website-Projekte bearbeiten (Name/Subdomain/Typ) + Archivierung
- updateWebsiteProject: synct Name/Subdomain/Typ nach Gitea (.webklar-preview.json,
  Repo-Beschreibung), Preview-Deploy (Redeploy+Teardown+TLS) und Appwrite
- Projekt-Typen: preview (Login), website (oeffentlich ohne Login), project (kein Hosting)
- syncPreviewTls erzeugt fuer isPublic-Projekte Router ohne preview-auth
- archiveRepo: Gitea archived + Appwrite-Flag + Preview-Teardown; Reaktivieren redeployt
- syncReposToAppwrite uebernimmt repo.archived
- Routen: PATCH /:id, POST /:id/archive, POST /:id/unarchive

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 00:21:50 +00:00
1c1826d25d fix: Repo-only-Projekte bekommen keine Subdomain vom Webhook; WOID numerisch
- Webhook: Subdomain-Fallback auf Repo-Name nur noch bei aktivierter Preview,
  Projekte ohne Website behalten leere Subdomain/previewUrl
- generateNextWoid: numerisches Maximum statt String-Sortierung (gemischt
  5-/6-stellige WOIDs im Bestand)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 18:14:41 +00:00
d4bd510dcd feat: Kundenportal-Ausbau - Tabs, Projekt-Einblicke, Git-Zeiterfassung, Rechnungen, Chat
Kunden-Dashboard:
- Tab-Navigation: Projekte | Was wurde gemacht | Rechnungen | Chat
- Projekt-Details pro Projekt: letzte Git-Commits (Titel+Beschreibung),
  Projektgroesse, Datei-Uebersicht (Top-Level aggregiert), Ticket-Arbeiten
- Rechnungen: gestylte Liste mit Status-Pillen, Ansehen/Zahlen-Link,
  PDF-Download ueber Server-Proxy (IDOR-geschuetzt)
- Chat mit dem Webklar-Team (Polling, Ungelesen-Badge, viewAs blockiert)

Admin-Dashboard:
- Chat-Tab: Konversationsliste + Thread + Antwortfeld, Ungelesen-Badge

Backend:
- giteaAdmin: getRepoInfo, listRepoCommits, getRepoTreeSummary
- projectInsights: 5-min-Cache, Invalidierung per Gitea-Webhook
- /api/projects/:id/git|files|work mit Ownership-Check (404)
- /api/chat/* (Kunde) + /api/portal-admin/chats/* (Admin), portalMessages-Collection
- mailer: E-Mail-Benachrichtigung an Admins bei Kundennachricht (15-min-Throttle)
- gitWorksheet: dd.mm.yyyy, voller Commit-Body, startTime leer (Zeit-Nachtrag),
  Auto-Webpage-Ticket bei Push auf Projekt ohne Ticket (ensureProjectTicket)
- customerActivity: Git-Push-Eintraege fuer Kunden sichtbar

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 18:01:24 +00:00
177ee6a13d feat: Admin-Bereich im Kundenportal (Ticketsystem-Login, Projektsuche, Kundenverwaltung)
- Login: Appwrite-User mit Label 'admin' (Ticketsystem-Mitarbeiter) bekommen
  eine Admin-Session und landen auf /admin.html
- Admin-Dashboard: Statistik-Uebersicht, Projektsuche ueber alle Projekte
  (inkl. Preview-/Gitea-Links, Vorschau ohne Kunden-Login), Kundenliste mit
  Portal-Status, letztem Login und Projektanzahl
- Kundennummer (code) direkt im Admin-Bereich pflegbar
- 'Als Kunde ansehen': Admin sieht das Portal exakt wie der Kunde (Banner
  mit Rueckweg zur Admin-Uebersicht)
- Kunden-Dashboard: neue Bereiche 'Meine Rechnungen' (InvoiceNinja inkl.
  Link ins Rechnungsportal) und 'Was wurde gemacht' (Tickets + Worksheets
  aus dem Ticketsystem, ohne interne Akquise-Tickets); Kundennummer im Header
- Admin-API /api/portal-admin/* (Session-basiert), Kunden-API /api/invoices
  und /api/activity
- appwriteClient: uebrig gebliebene Debug-Instrumentierung entfernt

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:09:39 +00:00
0320042045 fix: Gitea-Webhook akzeptiert HMAC-Signatur (X-Gitea-Signature)
Gitea sendet das Webhook-Secret als HMAC-SHA256-Signatur des Bodys, nicht als
Klartext-Header. Bisher liefen alle per Secret konfigurierten Repo-Hooks auf
401 - Push-Deploys funktionierten nur ueber ?token= in der URL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:49:49 +00:00
cc57cf887a feat: HTTPS-TLS-Sync nach Deploy, Projekte ohne Subdomain, portalPassword-Feld
- previewDeploy.syncPreviewTls(): schreibt Traefik-Router (Host-Regeln) fuer alle
  Preview-Subdomains nach preview-hosts.yml, damit Let's Encrypt Zertifikate
  ausstellt. Laeuft nach jedem Deploy und beim Serverstart (ersetzt das nie
  aufgerufene bash-Script sync-preview-tls.sh).
- createProjectFromTemplate: Subdomain optional. Ohne Subdomain wird nur das
  Gitea-Repo angelegt (projectType 'repo', Status 'created'), kein Deploy.
- customerAdmin: Portal-Passwort liegt jetzt im Feld customers.portalPassword
  statt als __portalPassword__-Prefix in den Notizen; Legacy-Notizen werden
  beim naechsten Update bereinigt. CRM-Stufe (lead/customer) wird beim Setzen
  des Portal-Passworts nicht mehr auf 'active' ueberschrieben.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:34:23 +00:00
cf4b3ce4d1 chore: aktuellen Live-Stand sichern (Admin-API, Services, Auth-Erweiterungen)
Sichert den bisher uncommitteten Produktionsstand des Kundenbereich-Servers,
damit kuenftige Deploys (git reset --hard) nichts mehr verwerfen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:24:53 +00:00
901ab1adae fix 2026-05-25 16:49:13 +02:00
3840ecf494 fix 4 2026-05-23 01:18:44 +02:00
3f2572ca59 fix 3 2026-05-23 00:36:45 +02:00
29918f2a8a fix2 2026-05-23 00:21:31 +02:00
root
bd59243e2c Fix Login: Appwrite-Session ohne secret auf dem Server
session.secret wird ohne API-Key nicht zurückgegeben. Login nutzt
daher session.userId und die Admin Users API statt account.get().

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 22:16:31 +00:00
f313410770 fix1 2026-05-23 00:03:10 +02:00
f31727aeb4 Implementiere Kundenportal mit zentraler Appwrite-Anbindung.
Express-Server für Appwrite-Auth, Session, Projekt-Dashboard und Gitea-Webhook; statisches Frontend und Schema-Dokumentation für woms-database.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 23:38:38 +02:00