fix(akquise): Anbieter wieder als Freitext mit Vorschlaegen

Das Dropdown fiel dem Feld zur Last: neue Vermittler tauchen zu oft auf, als
dass das Eintragen an einer gepflegten Liste haengen sollte. Anbieter ist wieder
ein Textfeld, jetzt mit Vorschlagsliste aus den bisherigen Eintraegen - der
zuletzt benutzte zuerst.

In den Einstellungen bleiben die drei Listen "Von", "Kanal" und "Berater".
dropProviderOptions() nimmt 'provider' aus dem ENUM der Optionstabelle und
loescht die dort gepflegten Werte; die Anbieter der Akquise-Eintraege bleiben
unberuehrt, sie stehen als Text in crm_acquisitions.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-08-18 12:21:33 +02:00
co-authored by Claude Opus 5
parent 05cc261900
commit 23087a12fb
11 changed files with 135 additions and 50 deletions
+9 -7
View File
@@ -25,7 +25,7 @@ erDiagram
crm_opportunities ||--o{ crm_opportunity_contacts : hat
crm_users ||--o{ crm_acquisitions : created_by
crm_acquisitions |o--o| crm_opportunities : "wird zu"
crm_acquisition_options ||--o{ crm_acquisitions : "fuellt Von, Anbieter, Kanal, Berater"
crm_acquisition_options ||--o{ crm_acquisitions : "fuellt Von, Kanal, Berater"
crm_users {
int id PK
@@ -91,7 +91,7 @@ erDiagram
}
crm_acquisition_options {
int id PK
enum field "sender | provider | channel | consultant"
enum field "sender | channel | consultant"
varchar value "Inhalt des Dropdowns"
}
crm_events {
@@ -126,14 +126,16 @@ Sechs 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.
- **Die Dropdowns der Akquise stehen in einer Tabelle, nicht in vier.**
- **Die Dropdowns der Akquise stehen in einer Tabelle, nicht in drei.**
`crm_acquisition_options` unterscheidet die Listen über die Spalte `field`. Die
vier Felder verhalten sich gleich, also ist jede weitere Liste ein Wert im
ENUM statt einer neuen Tabelle samt Route und Oberfläche. Der Unique-Schlüssel
auf `(field, value)` greift über die Kollation `utf8mb4_unicode_ci` auch bei
abweichender Groß-/Kleinschreibung - „hays" ist neben „Hays" kein neuer Wert.
Felder verhalten sich gleich, also ist jede weitere Liste ein Wert im ENUM
statt einer neuen Tabelle samt Route und Oberfläche. Der Unique-Schlüssel auf
`(field, value)` greift über die Kollation `utf8mb4_unicode_ci` auch bei
abweichender Groß-/Kleinschreibung - „mail" ist neben „Mail" kein neuer Wert.
Die Akquise-Einträge halten den **Text**, keinen Fremdschlüssel: wird ein Wert
aus der Liste entfernt, bleiben die Einträge lesbar und änderbar.
`crm_acquisitions.provider` (Anbieter) gehört nicht dazu - das Feld ist
Freitext, seine Vorschläge kommen aus den vorhandenen Einträgen.
- **`crm_acquisitions` hat keine Zustandsspalte.** Eingang, Archiv und Löschung
ergeben sich aus `found_at` (14 bzw. 90 Tage) und `converted_at`. Eine Spalte,
die ein Job umsetzen müsste, kann von der Wirklichkeit abweichen - eine