feat(opportunities): Uebernahme zurueck in die Akquise schieben

Im Dialog einer Opportunity aus der Akquise nimmt "Zurueck in die Akquise"
eine versehentliche Uebernahme zurueck: alle Opportunities aus dem Eintrag
wandern in den Papierkorb, der Eintrag steht mit seinem Funddatum wieder in
Eingang bzw. Archiv. Neue Spalte crm_opportunities.acquisition_id, damit bei
mehreren Beratern alle gefunden werden. Wiederherstellen haengt den Eintrag
wieder an die Opportunity.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-17 13:12:03 +02:00
co-authored by Claude Opus 5
parent 0ad7b32dbf
commit 33dedaedfb
9 changed files with 270 additions and 19 deletions
+11
View File
@@ -66,6 +66,7 @@ erDiagram
int id PK
varchar title
varchar consultant "fuer welchen Berater"
int acquisition_id "Herkunft in der Akquise, ohne FK"
enum stage "Neu .. Beauftragt | Absage"
tinyint probability "0-100"
decimal daily_rate
@@ -199,6 +200,16 @@ Acht Eigenheiten, die man kennen muss:
stehen, gleich welches Datum er trägt. Ein Kennzeichen
„wiederhergestellt" gibt es nicht; es wäre der Zustand, den diese Tabelle
gerade nicht führt.
- **Der Rückweg von der Opportunity** (`POST /api/opportunities/:id/acquisition`)
braucht die Gegenrichtung: `crm_acquisitions.opportunity_id` kennt nur die
*erste* Opportunity einer Übernahme, bei mehreren Beratern entstehen aber
mehrere. Deshalb trägt jede Opportunity `acquisition_id` (seit 17.09.2026,
ohne Fremdschlüssel - die Akquise löscht nach 90 Tagen). `schema.sql` trägt
den Verweis für ältere Übernahmen nach, kann das aber nur für die erste.
Der Rückweg legt alle lebenden Opportunities mit dieser `acquisition_id` in
den Papierkorb und leert beim Eintrag `converted_at` und `opportunity_id`;
`found_at` bleibt. Wird eine davon wiederhergestellt, setzt `/restore` den
Verweis wieder, sofern der Eintrag frei ist.
- **Der Papierkorb ist die Ausnahme davon.** Löschen von Hand ist eine
Entscheidung und kein Ablauf, deshalb steht sie in `deleted_at` (plus
`deleted_by`, ohne Fremdschlüssel - siehe `schema.sql`). Vorher war das