feat(opportunities): letzten Phasenwechsel mit Benutzer und Zeit anzeigen
Neue Spalten stage_changed_at/stage_changed_by, gesetzt nur bei echtem Phasenwechsel per PATCH. Der Dialog zeigt unter "Angelegt von" die Zeile "Verschoben von ... am ... um ... in ...". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5ba1ee1e0b
commit
b9d6544b30
@@ -91,11 +91,13 @@ const SELECT_OPPORTUNITIES = `
|
||||
owner.color AS owner_color,
|
||||
owner.avatar AS owner_avatar,
|
||||
deleter.name AS deleted_by_name,
|
||||
mover.name AS stage_changed_by_name,
|
||||
(src.id IS NOT NULL AND src.deleted_at IS NULL) AS acquisition_available
|
||||
FROM crm_opportunities o
|
||||
LEFT JOIN crm_users creator ON creator.id = o.created_by
|
||||
LEFT JOIN crm_users owner ON owner.id = o.owner_id
|
||||
LEFT JOIN crm_users deleter ON deleter.id = o.deleted_by
|
||||
LEFT JOIN crm_users mover ON mover.id = o.stage_changed_by
|
||||
LEFT JOIN crm_acquisitions src ON src.id = o.acquisition_id
|
||||
`;
|
||||
|
||||
@@ -434,6 +436,13 @@ router.patch('/:id', async (req, res, next) => {
|
||||
fields.push('stage = ?');
|
||||
values.push(req.body.stage);
|
||||
|
||||
// Wer hat wann verschoben - nur bei echtem Wechsel, sonst wuerde jedes
|
||||
// Speichern im Dialog den Zeitpunkt nach vorn schieben.
|
||||
if (req.body.stage !== existing.stage) {
|
||||
fields.push('stage_changed_at = UTC_TIMESTAMP()', 'stage_changed_by = ?');
|
||||
values.push(req.user.id);
|
||||
}
|
||||
|
||||
/*
|
||||
* Zeitpunkt des Gewinns mitschreiben. Der erste Wechsel nach 'Beauftragt'
|
||||
* zaehlt; ein zweites Speichern derselben Phase darf das Datum nicht nach
|
||||
|
||||
@@ -512,6 +512,16 @@ UPDATE crm_opportunities o
|
||||
SET o.link = a.link
|
||||
WHERE o.link IS NULL AND a.link IS NOT NULL;
|
||||
|
||||
/*
|
||||
* Letzter Phasenwechsel: wann und von wem. Der Dialog zeigt es unter "Angelegt
|
||||
* von". Gesetzt nur, wenn PATCH die Phase wirklich aendert - Anlegen und
|
||||
* Kopieren sind kein Verschieben. Alte Opportunities bleiben leer, eine
|
||||
* Rueckschreibung gibt es nicht, weil niemand weiss, wer es war.
|
||||
* Ohne Fremdschluessel wie `deleted_by`.
|
||||
*/
|
||||
ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS stage_changed_at DATETIME NULL AFTER won_at;
|
||||
ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS stage_changed_by INT UNSIGNED NULL AFTER stage_changed_at;
|
||||
|
||||
/*
|
||||
* Auswahllisten der Akquise. "Von", "Kanal" und "Berater" sind Dropdowns, deren
|
||||
* Inhalte in den Einstellungen gepflegt werden.
|
||||
|
||||
Reference in New Issue
Block a user