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
+14 -6
View File
@@ -27,7 +27,7 @@ ALTER TABLE crm_users ADD COLUMN IF NOT EXISTS avatar LONGTEXT NULL AFTER color;
-- Persoenliche Darstellung. Sie haengt am Benutzer und nicht am Browser: wer
-- sich an einem anderen Rechner anmeldet, findet sein Design wieder, und zwei
-- Benutzer am selben Rechner kommen sich nicht in die Quere.
-- theme = Farbwelt ('perinco', 'pixel', 'outdoor'); NULL = 'perinco'
-- theme = Farbwelt ('perinco', 'pixel', 'outdoor', 'cyberpunk'); NULL = 'perinco'
-- theme_mode = 'light' oder 'dark'; NULL = der Systemeinstellung folgen
-- Bewusst VARCHAR und kein ENUM: ein weiteres Theme soll eine Zeile im
-- Frontend sein und keine Datenbankmigration. Geprueft wird in userFields.js.
@@ -177,12 +177,20 @@ ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS won_at DATETIME NULL AFTE
ALTER TABLE crm_opportunities ADD INDEX IF NOT EXISTS idx_crm_opp_won (won_at);
/*
* Zeitpunkt des Gewinns. Ohne ihn liesse sich "wie viele Projekte haben wir im
* Mai gewonnen" nicht beantworten - die Phase allein sagt nur, wie es jetzt
* steht. Gesetzt beim Wechsel nach 'Beauftragt', geleert beim Wechsel heraus.
* Fuer welchen Berater das Projekt laeuft.
*
* Bis zum 09.09.2026 stand der Berater nur in den Notizen: die Uebernahme aus
* der Akquise schrieb ihn dorthin, weil die Opportunity kein Feld dafuer hatte.
* In Pipeline, Liste und Kacheln war damit nicht zu sehen, fuer wen ein Projekt
* laeuft - neben dem Titel die wichtigste Angabe. Bestehende Opportunities aus
* der Akquise holt migrateOpportunityConsultant() in db.js aus ihren Notizen
* nach.
*
* Genau ein Name je Opportunity: passt ein Fund zu drei Beratern, entstehen bei
* der Uebernahme drei Opportunities. Deshalb 190 Zeichen wie die uebrigen
* Namensfelder und nicht 500 wie in der Akquise, wo eine Liste darin steht.
*/
ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS won_at DATETIME NULL AFTER stage;
ALTER TABLE crm_opportunities ADD INDEX IF NOT EXISTS idx_crm_opp_won (won_at);
ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS consultant VARCHAR(190) NULL AFTER company;
ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS deleted_at DATETIME NULL AFTER created_by;
ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS deleted_by INT UNSIGNED NULL AFTER deleted_at;