Files
perinco-CRM/docs
Sascha WolfandClaude Opus 5 6a81258ca0 fix(dashboard): Tagesachse lag einen Tag daneben, Bewerbungszahl erklaert
Zwei Sachen, die zusammen wie ein Rechenfehler aussahen:

- Bei der Einteilung "Tag" baute die Achse ihre Schluessel mit toISOString().
  Das rechnet nach UTC und liefert fuer den lokalen Tagesanfang in Zeitzonen
  oestlich von Greenwich den Vortag - jede Saeule fiel neben die Achse und das
  Diagramm blieb leer, obwohl die Kennzahlen Werte zeigten. Die Schluessel kommen
  jetzt aus den Ortsdatumsteilen. Monat, Quartal und Jahr waren nie betroffen,
  die haben ihre Schluessel schon so gebaut.

- Die Kennzahl "Bewerbungen" zaehlt alle Akquise-Eintraege des Zeitraums, auch
  die, aus denen eine Opportunity geworden ist. Die stehen nicht mehr in der
  Akquise-Liste, also ist die Zahl regelmaessig hoeher als die Liste lang ist.
  Das stand nirgends: jetzt sagt die Fussnote der Kachel, wie viele uebernommen
  wurden, und unter den Kacheln steht ein Satz dazu.

Dazu passen bei 30 Tagen jetzt alle Abschnitte nebeneinander (schmalere
Spalten), und passt es doch nicht, zeigt das Diagramm das Ende des Zeitraums -
die aktuellen Tage stehen rechts und interessieren.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 15:32:03 +02:00
..

Dokumentation perinco CRM

Technische Dokumentation mit Funktionszeichnungen. Die Diagramme sind Mermaid und werden von Gitea direkt gerendert.

Neu hier? Wer die Anwendung benutzen will, fängt bei 07 Anleitung für Benutzer an. Wer daran entwickeln will, bei 08 Anleitung für Entwickler. Beide setzen keine Vorkenntnisse voraus.

Kapitel Inhalt
01 Architektur Topologie, Prozesse, Ports, Anfrageweg, Rollen
02 Datenmodell Tabellen beider Datenbanken als ER-Diagramme
03 Projekt Scanner Suchlauf von der Börse bis zum Treffer, Parallelbetrieb
04 Diktat Spracherkennung im Browser, Modell-Lebenszyklus
05 Frontend Ansichten, Menü, Komponentenkarte, Zustand
06 Betrieb Deployment, Umgebungsvariablen, Dienste, Störungssuche
07 Anleitung für Benutzer Bedienung aller Bereiche, Schritt für Schritt
08 Anleitung für Entwickler Einrichten, erweitern, bekannte Fallen
09 Quellcode-Referenz jede Datei, ihre Exporte und Zusagen
10 Glossar Agent, Match, Lead, Opportunity, Status- und Portalwerte
11 Postfachanbindung crm@perinco.de über Microsoft Graph, Kontakte aus Mails

Die Designentscheidungen und die Messwerte zur Spracherkennung stehen im README des Projekts.

Das Ganze in einem Bild

flowchart TB
    subgraph Browser
        SPA["React-SPA<br/>Vite-Build"]
        WSP["Whisper im Web Worker<br/>WebGPU / WASM"]
    end

    subgraph Server["Server 212.227.135.41"]
        AP["Apache<br/>:443"]
        API["Express-Backend<br/>127.0.0.1:5006"]
        SCH["Scanner-Scheduler<br/>node-cron"]
        MSCH["Mail-Scheduler<br/>node-cron"]
        PW["Playwright<br/>Chromium"]
        DB1[("MariaDB<br/>perinco_CRM")]
        DB2[("MariaDB<br/>perinco_scanner")]
        ALT["alte Scanner-App<br/>:5005"]
        DB3[("MariaDB<br/>project_scanner")]
    end

    OAI["OpenAI<br/>gpt-4o-mini"]
    BOERSE["Projektbörsen<br/>freelancermap, hays, ..."]
    GRAPH["Microsoft Graph<br/>crm@perinco.de"]

    SPA -->|"HTTPS /api"| AP
    AP --> API
    API --> DB1
    API --> DB2
    SCH --> PW
    PW --> BOERSE
    SCH --> OAI
    SCH --> DB2
    API -.-> SCH
    API -.-> MSCH
    MSCH -->|"Delta Query, nur lesend"| GRAPH
    MSCH --> DB1
    ALT --> DB3
    ALT --> BOERSE
    SPA -.->|"Audio bleibt im Browser"| WSP

    classDef alt fill:#f7f7f7,stroke:#9a9a9a,stroke-dasharray: 4 3
    class ALT,DB3 alt

Gestrichelt: die ursprüngliche Scanner-App, die bis zur Ablosung parallel weiterläuft. Sie hat ihre eigene Datenbank und wird vom CRM nicht angefasst.