fix(opportunities): Berater als eigenes Feld statt nur in den Notizen

Bei der Uebernahme aus der Akquise verschwand die wichtigste Angabe nach
dem Titel: fuer wen das Projekt laeuft. Die Opportunity hatte kein Feld
dafuer, also schrieb die Uebernahme den Namen in den Herkunftsvermerk der
Notizen - in Pipeline, Liste und Kacheln war er damit nicht zu sehen, und
suchen liess sich nur im Notiztext.

crm_opportunities.consultant traegt ihn jetzt selbst. Genau ein Name je
Opportunity: passt ein Fund zu drei Beratern, entstehen bei der
Uebernahme drei Opportunities. Sichtbar in Pipeline-Karte, Kachel,
Papierkorb und als sortierbare Spalte direkt hinter dem Titel; die Suche
fasst ihn mit ein, und im Dialog kommt die Auswahl aus derselben Liste
wie in der Akquise (Einstellungen -> Akquise), damit nicht "Nico" und
"Nico N." nebeneinander entstehen.

Bestehende Opportunities holt migrateOpportunityConsultant() beim Start
aus ihren Notizen nach - nur dort, wo die Spalte leer ist. Damit ist der
Lauf wiederholbar und ueberschreibt nichts, was seither von Hand gesetzt
wurde; ein Merker in crm_settings ist dafuer nicht noetig. Der Text in
den Notizen bleibt stehen: er ist der Herkunftsnachweis samt Anbieter,
Kanal und Link.

Der Namenszusatz im Titel entfaellt wieder. Er war gestern dazugekommen,
damit sich mehrere Opportunities aus einem Fund unterscheiden liessen -
mit einer eigenen Spalte ist er nur noch Rauschen.

Nebenbei: der Block, der won_at nachzieht, stand zweimal in schema.sql.
Idempotent und damit harmlos, aber eine Kopie - jetzt einmal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-09 14:07:23 +02:00
co-authored by Claude Opus 5
parent 8403f1c39d
commit 93fe8cfd73
13 changed files with 236 additions and 40 deletions
+10
View File
@@ -65,6 +65,7 @@ erDiagram
crm_opportunities {
int id PK
varchar title
varchar consultant "fuer welchen Berater"
enum stage "Neu .. Beauftragt | Absage"
tinyint probability "0-100"
decimal daily_rate
@@ -135,6 +136,15 @@ Acht Eigenheiten, die man kennen muss:
- **`avatar` ist eine Data-URL in der Datenbank.** Der Browser verkleinert jedes
Bild vor dem Upload auf 256 px (`src/lib/imageCompress.ts`), aus 2,9 MB werden
wenige Kilobyte.
- **Der Berater steht an der Opportunity, nicht nur in ihren Notizen.** Bis zum
09.09.2026 schrieb die Übernahme ihn in den Herkunftsvermerk, weil
`crm_opportunities` kein Feld dafür hatte - in Pipeline, Liste und Kacheln war
damit nicht zu sehen, für wen ein Projekt läuft. Jetzt trägt
`crm_opportunities.consultant` genau einen Namen; bei mehreren Beratern in der
Akquise entstehen mehrere Opportunities. Bestehende Zeilen füllt
`migrateOpportunityConsultant()` in `db.js` aus den Notizen nach - nur dort, wo
die Spalte leer ist, damit der Lauf wiederholbar bleibt und nichts
überschreibt.
- **Mehrere Berater stehen in einem Feld.** `crm_acquisitions.consultant`
nimmt eine kommagetrennte Liste auf (`VARCHAR(500)`), keine eigene
Zuordnungstabelle: die Namen sind reiner Text, die Auswahlliste in