feat(opportunities): letzten Phasenwechsel mit Benutzer und Zeit anzeigen

Neue Spalten stage_changed_at/stage_changed_by, gesetzt nur bei echtem
Phasenwechsel per PATCH. Der Dialog zeigt unter "Angelegt von" die Zeile
"Verschoben von ... am ... um ... in ...".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-10-01 11:29:00 +02:00
co-authored by Claude Opus 5.5
parent 5ba1ee1e0b
commit b9d6544b30
7 changed files with 62 additions and 9 deletions
+8
View File
@@ -78,6 +78,8 @@ erDiagram
varchar next_step
int owner_id FK
datetime won_at "Wechsel nach Beauftragt"
datetime stage_changed_at "letzter Phasenwechsel"
int stage_changed_by "wer verschoben hat, ohne FK"
datetime deleted_at "Papierkorb; nach 90 Tagen weg"
}
crm_opportunity_contacts {
@@ -170,6 +172,12 @@ Acht Eigenheiten, die man kennen muss:
das gesichert wird, was verschwindet. `crm_opportunities.won_at` hält den
Zeitpunkt des Wechsels nach *Beauftragt* - die Phase allein sagt nur, wie es
jetzt steht, nicht wann es passiert ist.
- **Letzter Phasenwechsel.** `crm_opportunities.stage_changed_at` (UTC) und
`stage_changed_by` setzt `PATCH /api/opportunities/:id` nur, wenn sich die
Phase wirklich ändert - Anlegen und Kopieren zählen nicht. Der Dialog zeigt
daraus unter „Angelegt von" die Zeile „Verschoben von … am … um … in …".
Es ist nur der letzte Wechsel, kein Verlauf; Opportunities von vor dem
01.10.2026 haben keinen Eintrag, bis sie das nächste Mal verschoben werden.
- **Gelöschte Opportunities bleiben stehen.** `crm_opportunities.deleted_at`
setzt sie in den Papierkorb; alle Abfragen blenden sie aus. An einer
Opportunity hängen Ansprechpartner, Verlauf und Mailzuordnungen - ein Fehlklick