feat: Interviews, Mail-Papierkorb, Kontaktart

Drei Aenderungen aus dem Alltagsgebrauch:

- Der Kalender heisst jetzt "Interviews" - dafuer wird er benutzt. Der Wert in
  ViewState wandert mit, damit Menue und Kopfzeile nicht auseinanderlaufen.
  Sichtbare Reste ("Kalenderfarbe") heissen jetzt Terminfarbe.

- Mails haben einen Papierkorb, der unter dem Menuepunkt aufklappt. Loeschen
  heisst dabei ausschliesslich: im CRM. Im Postfach crm@perinco.de bleibt die
  Mail unberuehrt - Schreibrechte darauf hat die Anwendung nicht. Damit der
  Delta-Abgleich geloeschte Mails nicht wieder einliest, bleibt nach dem Leeren
  eine leere Zeile als Merker stehen (crm_purged); runMailSync() ueberspringt
  alles, was im CRM geloescht ist. Zurueckholen und Leeren darf jeder
  Angemeldete, Leeren nach einer Warnung.

- Der Kontaktstatus (Neu .. Verloren) wird zur Kontaktart: Recruiter, Partner,
  Endkunde. Die Spalte heisst jetzt kind, weil "Status" das Feld falsch
  benannte. migrateLeadKind() stellt bestehende Datenbanken um und setzt alle
  vorhandenen Kontakte auf Recruiter - welche Art jemand ist, sagt der alte
  Status nicht (so mit dem Nutzer entschieden).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-08-18 11:12:49 +02:00
co-authored by Claude Opus 5
parent 025390e18a
commit 8741a9ae0c
39 changed files with 719 additions and 199 deletions
+62 -21
View File
@@ -10,7 +10,7 @@ Ein CRM für die Projektvermittlung. Es beantwortet vier Fragen:
| Frage | Bereich |
| --- | --- |
| Welche Geschäfte sind in Arbeit und was sind sie wert? | **Opportunities** |
| Wer ist wann wo, und wer ist beteiligt? | **Kalender** |
| Wer ist wann wo, und wer ist beteiligt? | **Interviews** |
| Wen kennen wir, und wer kennt wen? | **Kontakte** |
| Welche Projekte auf den Börsen passen zu unseren Beratern? | **Scanner** |
@@ -32,11 +32,13 @@ die Scanner-Einstellungen. Alles andere ist für beide Rollen gleich.
┌──────────────┬───────────────────────────────────────────┐
│ Kategorien │ Titel der Ansicht [Hell/Dunkel] │
│ Opportunities├──────────────────────────────────────────┤
│ Kalender │ │
│ Interviews │ │
│ Kontakte ▾ │ Inhalt │
│ Alle Kont. │ │
│ Aus Mails 5│ │
│ Mails │ │
│ Mails ▾ │ │
│ Postfach │ │
│ Papierkorb │ │
│ Scanner ▾ │ │
│ Dashboard │ │
│ Unpassend │ │
@@ -112,12 +114,13 @@ der Server, nicht nur die Oberfläche.
Auf dem Tablet oder ohne Lust auf Ziehen: die Phase lässt sich auch über das
Auswahlfeld direkt auf der Karte ändern.
## Kalender
## Interviews
Ein **gemeinsamer** Teamkalender - alle sehen dieselben Termine, jeder darf
eintragen.
Der gemeinsame Terminkalender des Teams - alle sehen dieselben Termine, jeder
darf eintragen. Genutzt wird er vor allem für Gesprächstermine, deshalb heißt
der Menüpunkt **Interviews** und nicht „Kalender".
![Monatsansicht des Kalenders](bilder/kalender-monat.png)
![Monatsansicht der Termine](bilder/kalender-monat.png)
* **Monat, Woche, Tag** oben umschalten, `Heute` und die Pfeile blättern.
* Klick auf einen Monatstag oder eine Stundenzelle legt sofort einen Termin an.
@@ -129,20 +132,20 @@ eintragen.
gleich, und der Punkt, an dem man den Termin angefasst hat, wandert mit. Ziehen
darf nur, wer den Termin auch ändern darf.
* **Farben** gehören zum Ersteller. Die eigene Farbe ändert man unter
*Einstellungen → Mein Konto*; die Legende unter dem Kalender zeigt, welche
Farbe zu wem gehört.
*Einstellungen → Mein Konto* („Meine Terminfarbe"); die Legende unter dem
Raster zeigt, welche Farbe zu wem gehört.
* **Teilnehmer** erscheinen mit Foto oder Initiale und sind anklickbar.
* **@-Erwähnungen**: In der Beschreibung `@` tippen, dann Kontakte *und*
Benutzer aus der Vorschlagsliste wählen (Pfeiltasten, Enter). In der
Leseansicht sind sie klickbar - Kontakte öffnen die Kontaktkarte, Benutzer ein
Detailfenster mit nächsten Terminen.
* Rechts stehen die **nächsten Termine**, nach Tagen gruppiert. Vergangenes
fliegt aus der Liste, bleibt im Kalender aber erhalten.
fliegt aus der Liste, bleibt im Raster aber erhalten.
![Wochenansicht des Kalenders mit Terminen dreier Benutzer](bilder/kalender-woche.png)
![Wochenansicht mit Terminen dreier Benutzer](bilder/kalender-woche.png)
Die Farbe eines Termins gehört zu seinem Ersteller - die Legende unter dem
Kalender löst auf, welche Farbe zu wem gehört. Rechts stehen die nächsten
Raster löst auf, welche Farbe zu wem gehört. Rechts stehen die nächsten
Termine mit Beschreibung, Teilnehmern und den markierten Personen.
Ändern und löschen darf nur der **Ersteller** oder ein **Administrator**.
@@ -154,18 +157,25 @@ Drei Ansichten, davon eine besondere:
| Ansicht | wofür |
| --- | --- |
| **Kachel** | Überblick mit Foto, Firma, Status |
| **Kachel** | Überblick mit Foto, Firma, Art |
| **Liste** | sortierbar, viele Einträge |
| **Netzwerk** | wer steht mit wem in Kontakt |
![Kontakte in der Kachelansicht](bilder/kontakte-kacheln.png)
Ein Klick auf eine Karte öffnet den Kontakt zum Bearbeiten - mit Foto, Anschrift,
Status, Zuständigkeit, Tags, Notizen und den Verbindungen zu anderen Kontakten.
Art, Zuständigkeit, Tags, Notizen und den Verbindungen zu anderen Kontakten.
Die **Art** sagt, mit wem man es zu tun hat: **Recruiter**, **Partner** oder
**Endkunde**. Früher stand an dieser Stelle ein Vertriebsstatus (Neu,
Kontaktiert, …); der sagte über den Kontakt selbst nichts. Bei der Umstellung am
18.08.2026 wurden alle vorhandenen Kontakte auf *Recruiter* gesetzt - welche Art
jemand wirklich ist, war aus dem alten Status nicht ableitbar. Wer die Angabe
braucht, pflegt sie im Kontakt nach.
![Dialog "Neuer Kontakt" mit allen Feldern](bilder/kontakt-dialog.png)
Im **Netzwerk** sind Kreise Kontakte (Farbe = Status, Größe = Anzahl
Im **Netzwerk** sind Kreise Kontakte (Farbe = Art, Größe = Anzahl
Verbindungen) und Quadrate Benutzer, die Kontakte angelegt haben. Grüne Linien
verbinden Kontakte untereinander, graue gestrichelte den Ersteller mit seinem
Kontakt.
@@ -175,10 +185,10 @@ Kontakt.
Bedienung: Hintergrund ziehen verschiebt, Mausrad zoomt, einen Knoten ziehen
setzt ihn fest (grüner Punkt), Doppelklick löst ihn wieder. Über *Verbindung
erstellen* zwei Kontakte anklicken, um eine Verbindung anzulegen; `Esc` bricht ab.
Suche und Statusfilter wirken auch hier.
Suche und Artfilter wirken auch hier.
Sobald Kontakte aus dem Postfach übernommen wurden, erscheint neben dem
Statusfilter ein **Herkunftsfilter**: *Aus Mails übernommen* zeigt nur die aus
Artfilter ein **Herkunftsfilter**: *Aus Mails übernommen* zeigt nur die aus
dem Postfach stammenden, *Selbst angelegt* nur die von Hand erfassten.
### Einverständnis für Mails
@@ -240,7 +250,7 @@ Der Menüpunkt *Kontakte* klappt zwei Unterpunkte auf: *Alle Kontakte* und
In *Aus Mails* stehen die Personen, die der Postfachabgleich in Mails gefunden
hat. **Sie sind noch keine Kontakte**: sie erscheinen nicht in der Kontaktliste,
nicht in Opportunities und nicht im Kalender. Jede Karte zeigt alle gefundenen
nicht in Opportunities und nicht unter Interviews. Jede Karte zeigt alle gefundenen
Angaben und darunter, aus welcher Mail sie stammen.
![Vorbereich "Aus Mails" mit zwei neuen Personen und einer gold markierten Dublette](bilder/aus-mails.png)
@@ -278,7 +288,8 @@ Das gemeinsame Postfach `crm@perinco.de` liegt hier im CRM. Der Zugriff ist
markiert, nichts gelöscht. Antworten geht weiter in Outlook; der Link *In Outlook
öffnen* springt direkt zur Mail.
Zwei Reiter oben:
Der Menüpunkt **Mails** klappt zwei Unterpunkte auf: *Postfach* und
*Papierkorb*. Im Postfach selbst gibt es oben zwei Reiter:
### Postfach
@@ -310,6 +321,36 @@ zeigt die Rohfassung ohne Formatierung.
Steht an einer Mail **Im Postfach gelöscht**, wurde sie in Outlook entfernt. Im
CRM bleibt sie erhalten, damit Zuordnungen nicht verloren gehen.
**Löschen** legt die Mail in den Papierkorb des CRM. Im Postfach
`crm@perinco.de` bleibt sie unangetastet - Schreibzugriff darauf hat das CRM
nicht.
### Papierkorb
Der Unterpunkt **Papierkorb** unter *Mails* zeigt alles, was im CRM gelöscht
wurde. Aufbau und Suche sind dieselben wie im Postfach, nur die Knöpfe wechseln:
* **Wiederherstellen** holt die Mail zurück in das Postfach des CRM - samt ihrer
Zuordnungen und Kontakt-Vorschlägen.
* **Papierkorb leeren** entfernt alle Mails darin **endgültig**, zusammen mit
ihren Zuordnungen zu Kontakten und Opportunities und ihren noch offenen
Kontakt-Vorschlägen. Bereits übernommene Vorschläge bleiben als Nachweis
erhalten, woher ein Kontakt stammt. Vorher fragt eine Warnung nach; danach ist
nichts mehr zurückzuholen. Das darf jeder angemeldete Benutzer.
Zwei Dinge sind wichtig zu wissen:
1. Gelöscht heißt **nur im CRM gelöscht**. In `crm@perinco.de` liegt die Mail
weiter, dort ändert das CRM nichts.
2. Der Abgleich holt gelöschte Mails **nicht wieder herein** - weder die im
Papierkorb noch die endgültig gelöschten. Dafür bleibt zu jeder endgültig
gelöschten Mail ein leerer Merker in der Datenbank stehen: ohne ihn würde der
nächste Abgleich sie im Postfach wiederfinden und erneut einlesen.
Offene Kontakt-Vorschläge einer Mail im Papierkorb verlangen keine Entscheidung
mehr - sie verschwinden aus dem Reiter *Kontakt-Vorschläge* und sind nach dem
Wiederherstellen wieder da.
### Kontakt-Vorschläge
Aus Absender, Empfängerliste und Signatur jeder Mail liest die Anwendung
@@ -442,7 +483,7 @@ Datenbank.
| Reiter | Wer | Inhalt |
| --- | --- | --- |
| **Nutzerverwaltung** | Admin | Benutzer anlegen, bearbeiten, deaktivieren, löschen |
| **Mein Konto** | alle | Foto, Kalenderfarbe, Passwort ändern |
| **Mein Konto** | alle | Foto, Terminfarbe, Passwort ändern |
| **Postfach** | Admin | Verbindung zu Microsoft 365, Abgleich, Kontaktübernahme |
| **Scanner** | Admin | Suchintervall, Schwellenwerte, KI-Schlüssel, Ton, E-Mail |
| **Whisper** | alle | Spracherkennung für das Diktat einrichten |
@@ -467,7 +508,7 @@ Die Zugangsdaten selbst stehen **nicht** in der Oberfläche, sondern in der
Serverkonfiguration - sie werden beim Start gelesen. Fehlt einer, sagt die Seite
welcher.
Foto und Kalenderfarbe werden **sofort** gespeichert, ohne Speichern-Knopf. Der
Foto und Terminfarbe werden **sofort** gespeichert, ohne Speichern-Knopf. Der
letzte aktive Administrator kann sich nicht selbst degradieren oder löschen -
das verhindert der Server.