feat(akquise): Papierkorb fuer geloeschte Eintraege
Loeschen in der Akquise war ein echtes DELETE: der Eintrag stand danach in keiner Liste, auch nicht im Archiv, und war nicht zurueckholbar. Jetzt setzt es `deleted_at`/`deleted_by`, die Zeile bleibt 90 Tage stehen. Der Papierkorb ist die eine Ausnahme von der Regel, dass diese Tabelle keinen Zustand fuehrt: Loeschen von Hand ist eine Entscheidung, kein Ablauf. Was dort liegt, blenden alle anderen Abfragen ueber NOT_DELETED aus - Eingang, Archiv, Menuezahlen und Dashboard. Der Aufraeumlauf ueber `found_at` laesst geloeschte Zeilen ausdruecklich liegen, sonst waere ein alter Fund im Papierkorb sofort weg; der Papierkorb raeumt ab `deleted_at`. Zwei Rueckwege, deshalb zwei Routen. `/reopen` (bisher `/restore`) holt aus dem Archiv in den Eingang und setzt das Funddatum auf heute. `/restore` holt aus dem Papierkorb zurueck und laesst das Funddatum in Ruhe - der Eintrag soll dort auftauchen, wo er hingehoert, also im Archiv, wenn er alt ist. Die Meldung nennt das Ziel. Dazu `DELETE /:id/permanent` und `POST /trash/empty`. Im Papierkorb wird nicht gepflegt: Bearbeiten und Uebernehmen antworten 409. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f319b8207b
commit
6e66bd39d7
@@ -6,7 +6,9 @@ import {
|
||||
ARCHIVE_AFTER_DAYS,
|
||||
DELETE_AFTER_DAYS,
|
||||
IN_ARCHIVE,
|
||||
IN_TRASH,
|
||||
IS_OPEN,
|
||||
NOT_DELETED,
|
||||
NOT_DUE,
|
||||
} from '../acquisitionRules.js';
|
||||
|
||||
@@ -14,8 +16,8 @@ const router = express.Router();
|
||||
router.use(requireAuth);
|
||||
|
||||
/*
|
||||
* Zaehler fuer die Seitenleiste: Akquise-Archiv, Papierkorb der Opportunities,
|
||||
* Papierkorb der Mails und die unpassenden Scanner-Treffer.
|
||||
* Zaehler fuer die Seitenleiste: Akquise-Archiv und deren Papierkorb, Papierkorb
|
||||
* der Opportunities, Papierkorb der Mails und die unpassenden Scanner-Treffer.
|
||||
*
|
||||
* Ein Endpunkt statt vier: die Zahlen stehen alle im Menue und sollen zusammen
|
||||
* kommen. Die Ansichten selbst laden weiter ihre eigenen Daten - hier gibt es
|
||||
@@ -35,7 +37,9 @@ router.get('/', async (req, res, next) => {
|
||||
damit Zahl und Liste nicht auseinanderlaufen. */
|
||||
(SELECT COUNT(*) FROM crm_acquisitions a
|
||||
LEFT JOIN crm_opportunities opp ON opp.id = a.opportunity_id
|
||||
WHERE ${IS_OPEN} AND ${IN_ARCHIVE} AND ${NOT_DUE}) AS acquisition_archive,
|
||||
WHERE ${IS_OPEN} AND ${NOT_DELETED} AND ${IN_ARCHIVE}
|
||||
AND ${NOT_DUE}) AS acquisition_archive,
|
||||
(SELECT COUNT(*) FROM crm_acquisitions a WHERE ${IN_TRASH}) AS acquisition_trash,
|
||||
(SELECT COUNT(*) FROM crm_opportunities
|
||||
WHERE deleted_at IS NOT NULL) AS opportunity_trash,
|
||||
(SELECT COUNT(*) FROM crm_mail_messages
|
||||
@@ -52,6 +56,7 @@ router.get('/', async (req, res, next) => {
|
||||
|
||||
res.json({
|
||||
acquisition_archive: Number(counts.acquisition_archive),
|
||||
acquisition_trash: Number(counts.acquisition_trash),
|
||||
opportunity_trash: Number(counts.opportunity_trash),
|
||||
mail_trash: Number(counts.mail_trash),
|
||||
scanner_rejected: scannerRejected,
|
||||
|
||||
Reference in New Issue
Block a user