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:
Sascha Wolf
2026-09-03 10:17:21 +02:00
co-authored by Claude Opus 5
parent f319b8207b
commit 6e66bd39d7
17 changed files with 732 additions and 87 deletions
+42 -8
View File
@@ -37,6 +37,7 @@ die Scanner-Einstellungen. Alles andere ist für beide Rollen gleich.
│ Akquise ▾ │ │
│ Eingang │ │
│ Archiv 3│ │
│ Papierkorb2│ │
│ Opportuni…▾ │───────────────────────────────────────────┤
│ Alle │ │
│ Papierkorb2│ │
@@ -70,7 +71,7 @@ die Scanner-Einstellungen. Alles andere ist für beide Rollen gleich.
* Die Menüpunkte **Akquise**, **Opportunities**, **Kontakte**, **Mails** und
**Scanner** klappen beim Anklicken ihre Unterpunkte auf. Hinter einigen steht
eine Zahl: *Aus Mails* (Funde, die auf eine Entscheidung warten), *Archiv*
(Akquise-Einträge älter als 14 Tage), beide *Papierkörbe* und *Unpassend*
(Akquise-Einträge älter als 14 Tage), alle drei *Papierkörbe* und *Unpassend*
(verworfene Scanner-Treffer). Bei 0 steht dort nichts - eine Null wäre nur
Rauschen.
* Jedes Fenster, das sich in den Vordergrund legt, schließt auf drei Wege: das
@@ -129,8 +130,9 @@ Volumen und Zuständigem - also alles, wo gerade der Kunde am Zug ist.
## Akquise
Der Eingang für gefundene Projekte - alles, was per Mail, Telefon oder über ein
Portal hereinkommt, bevor daraus ein Geschäft wird. Zwei Unterpunkte: **Eingang**
mit den Funden der letzten 14 Tage und **Archiv** mit allem Älteren.
Portal hereinkommt, bevor daraus ein Geschäft wird. Drei Unterpunkte: **Eingang**
mit den Funden der letzten 14 Tage, **Archiv** mit allem Älteren und der
**Papierkorb** mit dem, was jemand von Hand gelöscht hat.
### Eintragen
@@ -183,7 +185,7 @@ wird geleert - für das nächste Projekt aus derselben Quelle.
| **Projekttitel** | mit Link anklickbar (neuer Tab); darunter klein Endkunde, Tagessatz bzw. Festpreis und Personentage |
| **Berater** | für wen |
| **Opportunity** | ein Klick macht daraus eine Opportunity in der Phase *Erstgespräch Berater* |
| Pfeil / Stift / Papierkorb | zurück in die Akquise (nur im Archiv), bearbeiten (füllt das Formular oben) und löschen |
| Pfeil / Stift / Papierkorb | zurück in die Akquise (nur im Archiv), bearbeiten (füllt das Formular oben) und löschen (legt den Eintrag in den **Papierkorb**) |
Die Spaltenköpfe sortieren, die Suche geht über Titel, Anbieter, Berater,
Endkunde, Beschreibung und Notizen.
@@ -193,8 +195,11 @@ Endkunde, Beschreibung und Notizen.
* Nach **14 Tagen** rutscht ein Eintrag ins **Archiv**. Dort lässt er sich weiter
bearbeiten und jederzeit übernehmen - der Stift klappt das Formular auch im
Archiv auf.
* Nach **90 Tagen** wird er **gelöscht**. Wer ein Projekt behalten will,
übernimmt es als Opportunity.
* Nach **90 Tagen** wird er **gelöscht** - endgültig, und nicht über den
Papierkorb: das ist der Ablauf der Frist, keine Entscheidung. Gesichert wird
vorher nur die Zahl für das Dashboard (Tag, Berater, Anzahl), die
Projektdaten sind dann weg. Wer ein Projekt behalten will, übernimmt es als
Opportunity.
* Wird ein Eintrag **übernommen**, verschwindet er aus Eingang und Archiv - er
lebt als Opportunity weiter.
* Wird diese **Opportunity gelöscht**, taucht die Bewerbung wieder im **Archiv**
@@ -226,8 +231,37 @@ weg. Der Eintrag ist danach wieder ein gewöhnlicher Fund - liegt die Opportunit
noch im Papierkorb und wird sie zurückgeholt, steht sie ab dann *neben* dem
Eintrag statt an seiner Stelle.
Ein Eintrag, dessen Opportunity noch lebt, lässt sich nicht wiederherstellen -
er steht ohnehin in keiner der beiden Listen.
Ein Eintrag, dessen Opportunity noch lebt, lässt sich nicht zurückholen - er
steht ohnehin in keiner der beiden Listen.
### Papierkorb
Der **Papierkorb** unter *Akquise* fängt auf, was jemand von Hand löscht. Vorher
war ein Fehlklick endgültig: der Eintrag stand danach in keiner Liste, auch nicht
im Archiv.
| Spalte | Bedeutung |
| --- | --- |
| **Projekttitel** | darunter klein Endkunde, Tagessatz bzw. Festpreis und Personentage |
| **Anbieter**, **Berater** | wie in der Akquise |
| **Gefunden** | das Funddatum - es entscheidet, wo der Eintrag nach dem Zurückholen landet |
| **Gelöscht** | wann, und wie lange er noch liegt |
| **Von** | wer gelöscht hat |
| **Wiederherstellen** / Papierkorb-Symbol | zurückholen oder endgültig löschen |
* Ein gelöschter Eintrag liegt **90 Tage** im Papierkorb, danach räumt das CRM
selbst auf. Die Frist zählt ab dem Löschen, nicht ab dem Funddatum - ein alter
Fund, den jemand heute wegwirft, verschwindet also nicht sofort.
* **Wiederherstellen** ändert das Funddatum **nicht**. Der Eintrag geht dorthin,
wo er nach seinem Alter hingehört: in den *Eingang*, wenn er jünger als 14 Tage
ist, sonst ins *Archiv*. Wer ihn im Eingang haben will, holt ihn dort mit dem
Pfeil weiter (siehe oben).
* **Endgültig löschen** und **Papierkorb leeren** sind unumkehrbar.
* In der **Auswertung** zählt ein Eintrag im Papierkorb nicht mit - ein
Fehleintrag soll die Zahl der Bewerbungen nicht verfälschen. Wird er
zurückgeholt, zählt er wieder.
* Im Papierkorb wird nicht gepflegt: Bearbeiten und die Übernahme in eine
Opportunity gehen erst nach dem Zurückholen.
### Aus dem Eintrag wird eine Opportunity