- Feiertage: isWerktag berücksichtigt jetzt die 9 bundesweiten gesetzlichen
Feiertage (Oster-Computus + feste Tage) → ein Feiertag bricht die Streak
nicht mehr (zählt wie ein Wochenende neutral). Landesspezifische Feiertage
bewusst (noch) nicht enthalten.
- Wochenend-Edge: Reflexion an Sa/So setzte die angezeigte Streak auf 0
(Schleife brach am Nicht-Werktag ab). Jetzt wird übersprungen statt gebrochen.
- Lookback von 120 auf 400 Tage erhöht, damit lange Streaks nicht
abgeschnitten werden.
- Streak-Zähllogik in reine, getestete countStreakDays() ausgelagert
(8 Streak- + 5 Feiertags-Tests).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
"Zeit im Team heute" (und "Zeit heute") summierten alle Task-Dauern —
wer 5 Tasks parallel trackt, hatte 10h statt 2h Anwesenheit. Gesamt wird
jetzt als Vereinigung überlappender Intervalle berechnet (unionSeconds).
Pro-Aufgabe/Kategorie bleibt separat als Summe erhalten und wird als
"getrackt X" angezeigt; der Verteilungsbalken nutzt diese Summe als Nenner.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Zwei Ursachen behoben:
- Frontend: areaId/Default wurden nur beim Mount aus dem (noch ladenden)
areas-Prop berechnet → kein Default, keine Platzhalter-Option. Jetzt via
useEffect Default setzen sobald Areas geladen sind + Platzhalter-Option.
- Prod: Deploy seedet nicht → frische DB hatte keine Areas. Neue
ensureBaseAreas() legt die Basis-Bereiche idempotent beim API-Start an
(nach den Migrationen), analog zu runMigrations.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- .gitea/workflows/deploy.yml: deployt bei Push auf main via Host-Runner
(git reset --hard origin/main in /opt/build/cockpit, docker compose up
-d --build in /opt/stacks/cockpit, Healthcheck auf cockpit-api).
- Auto-Migrate: runMigrations() (drizzle-orm Migrator) wird beim API-Start
aufgerufen; Schema wird vor dem Listen idempotent aktualisiert.
- API-Dockerfile: Workspace-Libs (@cockpit/db, @cockpit/shared) werden jetzt
mit Emit kompiliert und main/exports im Image auf dist gebogen. Vorher war
das Prod-Image nicht reproduzierbar baubar (Node konnte die TS-Quelle der
Libs nicht laden → ERR_MODULE_NOT_FOUND). Dev-Modus und Web-/Vite-Build
bleiben unberührt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
"CSV importieren"-Dialog auf /leads. Serverseitiger lead.importCsv:
eigener CSV-Parser (Quotes/Kommata/Zeilenumbrüche, mit Tests),
header-basiertes Mapping (umlaut-tolerant). Pro Zeile entsteht ein Lead
(Adresse → standorte) + primärer Kontakt; Notizen werden als erster
Austausch-Log-Eintrag gespeichert. Dedup über Firmenname.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Neues Lead-Modul im Vertriebsbereich: qualitative Dossiers (Stammdaten,
Pain & Bedarf, Soft Factors, Strategie), Kontaktpersonen, Austausch-Log
mit Follow-up-Daten und Lead→Deal-Promotion. Routen /leads (Liste, nach
Status gruppiert) und /lead/:id (Dossier), Teaser im Bereich Vertrieb.
Migration 0008_lead_crm (lead, lead_contact, lead_touchpoint).
Datenmodell-Tabellen liegen in der gemeinsamen schema.ts (Folge-Commit).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ToDos in der Reflexion lassen sich per Klick auf den Titel korrigieren
(z. B. Tippfehler), Enter speichert / Escape bricht ab. Neuer Endpoint
dayEntry.editTodoTitle — nur eigene ToDos vom heutigen Berlin-Tag,
ändert den Titel in-place (Status/Reihenfolge/IDs bleiben).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Zeiterfassung
- Neue Tabelle time_entry mit started_at/ended_at/duration_seconds,
optional todo_id/bezug, category-Enum (focus/meeting/break/admin/learning/other),
description, day_entry_id-Verknüpfung. Partial-Unique-Index erzwingt
max. einen aktiven Timer pro User.
- tRPC time-Router: now, start (stoppt aktiven automatisch), stop,
listToday (Liste + Tagessumme), update, upsertManual (retroaktiv),
delete, teamToday (personenübergreifend mit byCategory + aktivem
Timer pro User).
- TopNav: persistente TimerPill links neben Streak. Quick-Picker mit
heutigen ToDos, Kategorie-Auswahl und Freitext-Start. Live-Sekundenzähler.
- /heute: TimelineSection mit Edit/Delete pro Eintrag, ToDo-Bindung
nachträglich änderbar, Block-nachtragen-Dialog. Pro ToDo-Zeile
▶-Start- und 🕐-Nachtrag-Button.
- /puls: TeamTimeSection mit aktiver Timer-Anzeige + Tagessumme +
Kategorie-Breakdown pro User (refresh alle 30s, Live-Tick jede Sekunde).
Visual
- Space Grotesk als Hausschrift (selbst-gehostet, latin + latin-ext)
- Keycap-Button-Stil (Gradient + Druckeffekt) für primary/secondary/destructive
- Neue Helper-Module: format-duration, time-categories
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>