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:
co-authored by
Claude Opus 5
parent
05cc261900
commit
23087a12fb
@@ -30,8 +30,11 @@ const DELETE_AFTER_DAYS = 90;
|
||||
* prueft das Backend beim Speichern eines Eintrags nur die Laenge und nicht die
|
||||
* Zugehoerigkeit zur Liste: wer einen Wert aus der Liste entfernt, soll damit
|
||||
* nicht jeden alten Eintrag unaenderbar machen.
|
||||
*
|
||||
* "provider" (Anbieter) fehlt hier absichtlich: das Feld ist Freitext mit
|
||||
* Vorschlaegen aus den bisherigen Eintraegen.
|
||||
*/
|
||||
const OPTION_FIELDS = ['sender', 'provider', 'channel', 'consultant'];
|
||||
const OPTION_FIELDS = ['sender', 'channel', 'consultant'];
|
||||
|
||||
// `link` fehlt hier absichtlich: der Wert wird eigens geprueft (normalizeLink).
|
||||
const TEXT_FIELDS = [
|
||||
@@ -185,16 +188,32 @@ async function purgeOldEntries() {
|
||||
}
|
||||
}
|
||||
|
||||
/** Alle Auswahllisten als { sender: [...], provider: [...], ... }. */
|
||||
/** Alle Auswahllisten als { sender: [...], channel: [...], consultant: [...] }. */
|
||||
async function loadOptions() {
|
||||
const [rows] = await pool.query(
|
||||
'SELECT id, field, value FROM crm_acquisition_options ORDER BY field, value'
|
||||
);
|
||||
const options = { sender: [], provider: [], channel: [], consultant: [] };
|
||||
const options = { sender: [], channel: [], consultant: [] };
|
||||
for (const row of rows) options[row.field].push({ id: row.id, value: row.value });
|
||||
return options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bisher benutzte Anbieter, der zuletzt verwendete zuerst. Das Feld ist Freitext -
|
||||
* die Vorschlaege ersparen das Ausschreiben, ohne einen neuen Vermittler zu
|
||||
* verbieten. Bewusst aus dem gesamten Bestand, nicht nur aus der gezeigten Liste.
|
||||
*/
|
||||
async function loadProviderSuggestions() {
|
||||
const [rows] = await pool.query(
|
||||
`SELECT provider FROM crm_acquisitions
|
||||
WHERE provider IS NOT NULL AND provider <> ''
|
||||
GROUP BY provider
|
||||
ORDER BY MAX(found_at) DESC, provider ASC
|
||||
LIMIT 100`
|
||||
);
|
||||
return rows.map((row) => row.provider);
|
||||
}
|
||||
|
||||
/** Aendern und loeschen darf der Ersteller und jeder Admin. */
|
||||
function mayModify(user, row) {
|
||||
return user.role === 'admin' || row.created_by === user.id;
|
||||
@@ -421,12 +440,14 @@ router.get('/', async (req, res, next) => {
|
||||
[ARCHIVE_AFTER_DAYS, ARCHIVE_AFTER_DAYS, DELETE_AFTER_DAYS]
|
||||
);
|
||||
|
||||
// Die Auswahllisten kommen mit: die Eingabe braucht sie sofort, und ein
|
||||
// zweiter Aufruf nur fuer vier kurze Listen waere verschenkt.
|
||||
// Auswahllisten und Anbieter-Vorschlaege kommen mit: die Eingabe braucht sie
|
||||
// sofort, und ein zweiter Aufruf nur fuer ein paar kurze Listen waere
|
||||
// verschenkt.
|
||||
res.json({
|
||||
archive_after_days: ARCHIVE_AFTER_DAYS,
|
||||
delete_after_days: DELETE_AFTER_DAYS,
|
||||
options: await loadOptions(),
|
||||
provider_suggestions: await loadProviderSuggestions(),
|
||||
counts: {
|
||||
eingang: Number(counts.eingang ?? 0),
|
||||
archiv: Number(counts.archiv ?? 0),
|
||||
|
||||
Reference in New Issue
Block a user