Skip to content

zPoche/volt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,419 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Volt

Modulares ERP für Elektrohandwerksbetriebe (Bootlabs)

Volt führt Rechnungen & operative Belege · Lexware optional (Sync) · Operativer Tagesbetrieb in Volt


Version Node pnpm PostgreSQL License

Was ist Volt? · Module · Installation · Kernfunktionen · Wo finde ich was? · Backups · Skripte · Troubleshooting · API


Inhaltsverzeichnis

  1. Was ist Volt?
  2. Module (M01–M12)
  3. Architektur
  4. Installation & Ersteinrichtung
  5. Kernfunktionen einrichten
  6. Wo finde ich was?
  7. Datenbank, Redis & Umgebung
  8. Skripte & Befehle
  9. Entwicklung & Qualität
  10. Production, Updates & Backups
  11. Troubleshooting
  12. Integrationen (Kurzüberblick)
  13. Subunternehmer (Plantafel)
  14. Dokumentation (Wiki)
  15. DSGVO & Security
  16. REST-API

Was ist Volt?

Volt ist ein modulares ERP für deutsche Elektrohandwerksbetriebe. Es bündelt den operativen Tagesbetrieb in einer Oberfläche — von Kunden und Projekten über Einsatzplanung und Zeiterfassung bis zu Material, Service und Schnittstellen.

Prinzip Bedeutung
Lexware = Buchhaltung Rechnungswesen, offizielle Buchführung und Steuerexport bleiben in Lexware Office. Volt liest/schreibt dort über die API und cached Dokumente lokal.
Volt = Tagesgeschäft CRM, Projekte, Plantafel, Monteur-App, Lager, Angebote, Kundenportal, Integrationen.
Modular Funktionen sind in M01–M12 gegliedert; Feature-Flags und RBAC schalten Bereiche pro Rolle frei.
DSGVO Hosting in Deutschland; Audit-Logs auf kritischen Entitäten; verschlüsselte Integrations-Tokens.

Kernfähigkeiten (Auswahl)

Bereich Funktionen
Stammdaten Kunden, Leads, Kontakte, Kundenaktivitäten-Timeline, Mitarbeiter, Lieferanten, Subunternehmer, Stundensätze
Projekte Aufträge PRJ-YYYY-NNN, LV/GAEB, Aufmaß, Material, Lohn, Rechnungen, Dokumente
Vertrieb Angebote, Vorlagen, PDF-Import, Punch-Out (OCI/IDS), Kundenportal
Planung Plantafel, Terminplanung, Abwesenheiten, Outlook-Kalender-Sync
Feld Monteur-UI, Zeiterfassung, Checklisten, Fotos, Offline-Sync
Lager Materialkatalog, Bewegungen, Bestellungen, Meldebestände
Service Serviceaufträge, Wartungsverträge, E-Check, PV-Protokolle
Controlling KPI-Dashboard, DB I/II, Wochenstandup, Exporte (CSV, DATEV, Lexware)
Admin Benutzer, RBAC-Matrix, Integrationen, System-Doctor, Updates

Roadmap & Reifegrad: docs/ROADMAP-READINESS-M01-M12.md · M01–M06 im Tagesbetrieb · M07–M12 in aktiver Ausbauphase.


Module (M01–M12)

Modul-Übersicht

Modul Name UI (typisch) Kurzbeschreibung
M01 Admin & System /admin/*, /system Benutzer, Firmeneinstellungen, Feature-Flags, Integrationen, Backup, Updates
M02 KPI-Dashboard /dashboard Projekt-Ampeln, Rolling-Overview, Wochenbericht / Standup
M03 CRM & Stammdaten /customers, /leads, /communications Kunden, Kontakte, Leads, Kommunikation, Bewertungen, Kundenportal, Aktivitäten-Timeline
M04 Aufträge & Projekte /projects Projekte, LV, Angebote im Projekt, Material, Lohn, Rechnungen, GAEB
M05 Import & Export /imports, Export-Menü CSV, Lexware, DATANORM, GAEB; DATEV/SP-Data-Export
M06 Einsatzplanung /deployment-planner Plantafel, Einsätze, Ressourcen, Abwesenheiten
M07 Field App /monteur/*, OpenAPI /docs/field-app Monteur-Zeiten, Einsätze, Checklisten, QR, Offline
M08 Material & Lager /materials, /purchase-orders Katalog, Bewegungen, Bestellungen, Reservierungen
M09 Service & Wartung /service/*, /e-check, /pv Serviceaufträge, Wartung, EMA, E-Check, PV
M10 Automatisierung Admin → Automatisierung Workflows, n8n-Trigger, Ollama (LV-Analyse, optional CRM-Zusammenfassung)
M11 Schnittstellen Admin → Integrationen Lexware, Outlook, GAEB, IDS, DATEV, Lieferanten
M12 Telefonie /telephony Anrufe, Rückruf-Aufgaben, Webhooks, Aufzeichnungen

Zusätzliche Vertragsmodule (Messprotokolle, EMA-Wartung, Solo-Zeiterfassung): siehe Roadmap-Dokument.

CRM & Kundenaktivitäten (M03)

Volt bündelt CRM-Funktionen ohne separates Vertriebs-CRM: Stammdaten, Kommunikationslog und eine gemeinsame Aktivitäten-Timeline aus bestehenden Quellen (kein zusätzliches Activity-Datenmodell).

Quelle Inhalt in der Timeline
Kommunikation (communication_entry) E-Mail, SMS, Telefon, Notizen — manuell oder auto bei Angebot/Mahnung
Telefonie (telephony_call_log, M12) Anrufe inkl. Transkript-Hinweis, wenn Modul aktiv
Leads Anlage und Aktualisierung (Status, Quelle)
Bewertungen (customer_review) Veröffentlichte Kundenbewertungen

Navigation (Sidebar): aufklappbare Gruppe Kunden mit Unterpunkten Kunden, Leads, Kommunikation, Kundenportal, Bewertungen (je nach Feature-Flag).

UI Pfad / Tab Timeline-Kontext
Kundendetail /customers/:id → Tab Aktivitäten customerId
Lead-Detail /leads/:id (unter dem Formular) leadId (+ Anrufe des verknüpften Kunden)
Projekt-Detail /projects/:id/activities projectId
Globale Liste /communications manuelles Logging, Filter in der Timeline pro Kontext

API (aggregiert, chronologisch):

Methode Pfad Parameter
GET /api/v1/crm/activities genau einer: customerId, leadId oder projectId; optional channel, limit, offset
POST /api/v1/crm/activities/summarize gleicher Kontext; optional activityLimit (max. 50)

Notizen direkt aus der Timeline: legt einen communication_entry mit channel=note an (MODULE_KOMMUNIKATION).

Feature-Flags (Admin → Module):

Flag Bündel Default Wirkung
MODULE_CRM CRM & Kunden an Kunden, Kundendetail, Timeline pro Kunde
MODULE_LEADS CRM & Kunden aus Leads, Lead-Timeline
MODULE_KOMMUNIKATION CRM & Kunden an /communications, Notiz-Quick-Action, Projekt-Tab Aktivitäten
MODULE_REVIEWS CRM & Kunden an Bewertungen in Timeline und Navigation
MODULE_KUNDENPORTAL CRM & Kunden aus Kundenportal-Admin in Sidebar-Gruppe
MODULE_TELEFONIE Telefonie aus Anrufe in Kunden-Timeline (M12)
MODULE_AUTOMATISIERUNGEN Automatisierung & KI an Basis für Ollama-Features
OLLAMA_CRM_ASSISTANT Automatisierung & KI aus Button „KI-Zusammenfassung“ in der Timeline
OLLAMA_LV_ANALYSIS Automatisierung & KI aus LV-KI in Projektdokumenten (unabhängig vom CRM)

KI-Zusammenfassung aktivieren: Admin → Module → Bündel Automatisierung & KIOLLAMA_CRM_ASSISTANT einschalten; Ollama unter Einstellungen → Schnittstellen → Ollama konfigurieren (siehe Ollama & n8n). Die Zusammenfassung ist ein Vorschlag — es werden weder Status noch E-Mails automatisch geändert.


Architektur

Systemarchitektur

Tech-Stack

Bereich Technologie
Runtime Node.js 24 LTS, TypeScript 5.9 (strict)
Monorepo pnpm 11 Workspaces (packageManager in package.json)
Backend Fastify 5, Prisma 6, Zod 4, JWT + Argon2id, BullMQ + Redis 8
Frontend React 19, Vite 7, TanStack Query 5, Tailwind 4, shadcn/ui
Datenbank PostgreSQL 18
API /api/v1 · Fehler als RFC 7807 · Geld in Cent (bigint) · IDs als UUID v7

Repository-Struktur

apps/backend/          API, Prisma, Services, Lexware-Sync, BullMQ-Worker
apps/frontend/         React-SPA (Vite), Feature-Module unter src/features/
packages/cli/          volt install | onboard | update | doctor
packages/shared/       Zod-Schemas, Enums, gemeinsame Typen (dist-Build)
docs/                  Architektur, Installation, Module, Operations
infra/                 Caddy, Update-Daemon, PostgreSQL-Backup
scripts/               Bootstrap, Prod-Deploy, Test-DB, CI-Gates

Schichten im Backend: routes → services → repositories (Prisma). Lexware-Code nur unter apps/backend/src/lib/lexware/. Details: docs/ARCHITECTURE.md.


Installation & Ersteinrichtung

Ersteinrichtung

Voraussetzungen

Komponente Version / Hinweis
Node.js 24+ (.nvmrc)
pnpm 11+ (Pin in Root-package.json)
Docker empfohlen: Postgres 18 + Redis 8 (docker-compose.yml)
Linux-Install sudo bash scripts/install-system-deps.sh installiert Node, pnpm, Docker, Build-Tools

Schnellstart (Entwicklung)

Ein Befehl (ohne vorinstalliertes pnpm) — interaktiv Dev oder Production:

git clone https://github.com/zPoche/volt.git
cd volt
./install                  # System-Deps, .env, Docker, Migrationen, CLI global

Ohne ./install: sudo bash scripts/install-system-deps.sh, dann pnpm install && pnpm volt install.

Terminal neu öffnen (pnpm schreibt PNPM_HOME ins PATH). Bis dahin: pnpm volt <befehl> oder ./bin/volt.

pnpm dev
pnpm volt onboard          # Setup-URL + Token in der Konsole
Schritt URL / Hinweis
Frontend http://localhost:5173
Setup-Wizard http://localhost:5173/setup
Backend / Health http://localhost:4000/health
Field-App OpenAPI (Dev) http://localhost:4000/docs/field-app

Vite proxyt /api → Backend (vite.config.ts). VITE_API_BASE_URL nur setzen, wenn kein Proxy genutzt wird.

Dev-Seed (optional, nur lokal): admin@volt.local / ChangeMe!2026 — nach prisma db seed.

Alternative: Bash-Bootstrap

git clone https://github.com/zPoche/volt.git
cd volt
bash scripts/bootstrap-volt.sh
pnpm dev

Production-Secrets: VOLT_BOOTSTRAP_MODE=production bash scripts/bootstrap-volt.sh · danach node scripts/validate-install-env.mjs.

Nur Docker-Dienste + manuell

pnpm docker:up
pnpm --filter @volt/backend exec prisma migrate deploy
pnpm --filter @volt/backend exec prisma db seed   # optional
pnpm dev

Tests ohne Docker: pnpm test:db:ensure.

Container stoppen und entfernen

docker compose down stoppt Container und entfernt sie samt Compose-Netzwerk. Ohne -v bleiben Volumes (z. B. Postgres-Daten) erhalten; mit -v werden Volumes mitgelöscht.

Dev-Stack (postgres, redis aus docker-compose.yml):

pnpm docker:down                              # stoppen + Container entfernen
docker compose down -v                        # zusätzlich Volumes löschen (Dev-DB weg)

Prod-Stack (volt-prod-* aus docker-compose.prod.yml):

docker compose -f docker-compose.prod.yml --env-file .env.production down
docker compose -f docker-compose.prod.yml --env-file .env.production down -v   # inkl. Volumes

Beide Stacks (Dev + Prod):

docker compose down -v
docker compose -f docker-compose.prod.yml --env-file .env.production down -v

Hinweis: docker compose down ohne -f docker-compose.prod.yml betrifft nur den Dev-Stack, nicht volt-prod-*. Hängende Einzelcontainer: docker ps -a --filter "name=volt" · docker rm -f <id>.

Production (Kurz)

./install --production         # Domain, Secrets, .env.production, Prod-Compose
pnpm volt onboard

Alternativ mit pnpm: pnpm volt install --production

Ausführlich: docs/INSTALL.md · docs/DEPLOYMENT.md · Cloud-Agent: AGENTS.md.

Production: Reverse-Proxy (Caddy intern oder nginx/Apache auf dem Host)

Beim Install (./install --production) wählen Sie den Edge-Proxy:

Modus VOLT_EDGE_PROXY Was läuft
Integrierter Caddy (Default) caddy Container caddy:2-alpine auf Host 80/443 — routet API, SPA, Webhook
Externer Proxy external Kein Edge-Caddy-Container — TLS auf nginx/Apache/eigenem Caddy am Host

Wichtig — zwei verschiedene „Caddy“:

  • volt-prod-caddy-1 (nur bei VOLT_EDGE_PROXY=caddy): öffentlicher Reverse-Proxy, Ports 80/443.
  • volt-prod-frontend-1 zeigt immer caddy run --config … — das ist nur der Static-Server für die SPA im Container auf Port 8080 (nicht öffentlich). Das bleibt in beiden Modi so; ersetzt keinen Edge-Proxy.

Bei externem Proxy fragt der Installer nicht nach HTTP/HTTPS-Ports 80/443 für Volt — die liegen auf Ihrem Host-Proxy. Volt bindet nur localhost:

Dienst Default-Port Zweck
Frontend (SPA) 127.0.0.1:8080 Browser-UI
Backend (API) 127.0.0.1:4000 /api/*, /health
Update-Daemon 127.0.0.1:9090 /_internal/update (Deploy-Webhook)

.env.production (extern):

VOLT_EDGE_PROXY=external
VOLT_EXTERNAL_PROXY_KIND=nginx
CORS_ORIGIN=https://volt.example.de
TRUST_PROXY_HOPS=1
# Nginx im Docker-Container (nicht auf dem Host):
# VOLT_EXTERNAL_PROXY_NGINX_CONTAINER=nginx-proxy
# VOLT_EDGE_PROXY_RELOAD_CMD=docker exec nginx-proxy nginx -t && docker exec nginx-proxy nginx -s reload

Nach dem Install liegt eine angepasste Vorlage unter infra/proxy/ (z. B. nginx-volt.generated.conf).

nginx im Container (z. B. nginx-proxy): Auf dem Host gibt es kein nginx-Binary — Reload mit docker exec nginx-proxy nginx -s reload. volt update / prod-deploy versucht das automatisch, wenn der Container läuft.

Edge-Caddy startet bei externem Modus nicht — weder beim ersten up -d noch bei volt update / prod-update.sh (der Deploy recycelt dann nur migrator, backend, frontend).

Beispiel nginx (Host, TLS auf 443)

FQDN volt.example.dePfad-Routing, kein blindes 443 → Container:443:

upstream volt_frontend {
    server 127.0.0.1:8080;
}
upstream volt_backend {
    server 127.0.0.1:4000;
}
upstream volt_update_daemon {
    server 127.0.0.1:9090;
}

server {
    listen 443 ssl http2;
    server_name volt.example.de;

    # ssl_certificate /etc/ssl/certs/volt.example.de-fullchain.pem;
    # ssl_certificate_key /etc/ssl/private/volt.example.de.key;

    client_max_body_size 64m;

    location /_internal/update {
        proxy_pass http://volt_update_daemon;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Assistent-Chat und Ollama-Verbindungstest (Admin) — Default 60s reicht nicht
    location /api/v1/assistant/ {
        proxy_pass http://volt_backend;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }

    location /api/ {
        proxy_pass http://volt_backend;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Assistent-Chat und Ollama-Verbindungstest (Admin) — Default 60s reicht nicht
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }

    location = /health {
        proxy_pass http://volt_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ ^/suppliers/[0-9a-fA-F-]{36}/oci-return$ {
        rewrite ^/suppliers/([0-9a-fA-F-]{36})/oci-return$ /api/v1/suppliers/$1/oci/return break;
        proxy_pass http://volt_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        proxy_pass http://volt_frontend;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Ohne proxy_read_timeout / proxy_send_timeout (mind. 300s) bricht nginx nach 60s ab — typisch HTTP 504 beim Ollama-Verbindungstest (Intent-Chat, Modell lädt) oder langem Assistenten-Chat. Gleiche Werte wie in infra/proxy/nginx-volt.generated.conf nach volt install.

Beispiel Apache httpd (Host)

Module: a2enmod proxy proxy_http rewrite ssl headers

<VirtualHost *:443>
    ServerName volt.example.de

    # SSLEngine on
    # SSLCertificateFile /etc/ssl/certs/volt.example.de-fullchain.pem
    # SSLCertificateKeyFile /etc/ssl/private/volt.example.de.key

    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto "https"

    ProxyPass /_internal/update http://127.0.0.1:9090/_internal/update
    ProxyPassReverse /_internal/update http://127.0.0.1:9090/_internal/update

    ProxyPass /api/ http://127.0.0.1:4000/api/
    ProxyPassReverse /api/ http://127.0.0.1:4000/api/

    ProxyPass /health http://127.0.0.1:4000/health
    ProxyPassReverse /health http://127.0.0.1:4000/health

    RewriteEngine On
    RewriteRule ^/suppliers/([0-9a-fA-F-]{36})/oci-return$ /api/v1/suppliers/$1/oci/return [PT]

    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>

CORS_ORIGIN muss exakt der öffentlichen URL entsprechen (z. B. https://volt.example.de). Setup, Login und API laufen dann wie mit integriertem Caddy — nur TLS und Routing liegen auf dem Host.

Integrierter Caddy (weiterhin Default): docker compose --profile caddy -f docker-compose.prod.yml --env-file .env.production up -d


Kernfunktionen einrichten

Nach Installation und /setup werden die folgenden Bereiche typischerweise in dieser Reihenfolge konfiguriert.

1. Setup-Wizard (/setup)

Schritt Inhalt
Token pnpm volt onboard oder VOLT_SETUP_TOKEN in apps/backend/.env
API GET/POST /api/v1/setup/* mit Setup-Token
Abschluss Firmendaten, Admin-User, optionale Backup-Prüfung

2. Benutzer & RBAC

Aufgabe Wo
Benutzer anlegen Admin → Benutzer (/admin/users)
Fachrollen & Rechte Admin → Berechtigungen (/admin/permissions)
Display / Wallboard Fachrolle Display / Fernseher, Start /display
Buchhaltung Fachrolle Buchhaltung (nicht im Seed)

API: /api/v1/rbac/* · Doku: RBAC-Matrix in der UI, Feature-Flags unter Admin → Module.

3. Lexware Office

Schritt Aktion
OAuth Admin → Integrationen → Lexware verbinden, oder GET /api/v1/oauth/lexware/authorize
Sync Admin → Lexware sync / POST /api/v1/admin/integrations/lexware/sync
Projektzuordnung Projektnummer PRJ-YYYY-NNN als erstes Token im Lexware-Beschreibungsfeld

Beispiel: PRJ-2026-015 Materialeinkauf Baustelle Müller · Regex: /PRJ-\d{4}-\d{3,5}/

docs/LEXWARE-INTEGRATION.md

4. Microsoft 365 / Outlook

Volt nutzt eine Azure-App-Registration im Kunden-Tenant für Kalender-Sync, System-E-Mail-Versand und Assistent-M365-Tools (Mail, OneDrive, SharePoint, Teams). Tenant und App liegen beim Kunden; Volt liefert Redirect-URIs und die Scope-Liste.

Ausführlich: docs/operations/MICROSOFT-365-OUTLOOK-INTEGRATION.md

Schritt-für-Schritt: Azure App anlegen
  1. Azure Portal → Microsoft Entra ID → App registrationsNew registration
    • Name: z. B. Volt ERP
    • Supported account types: Single tenant (nur euer Tenant)
    • Redirect URI: vorerst leer lassen → Register
  2. Notieren: Application (client) ID und Directory (tenant) ID
  3. Certificates & secretsNew client secret → Wert sicher speichern (nur einmal sichtbar)
  4. AuthenticationAdd a platformWeb → Redirect URIs eintragen (exakt, inkl. https://):
    • Kalender / Mitarbeiter-OAuth: https://<volt-host>/api/v1/outlook/oauth/callback
    • System-E-Mail: https://<volt-host>/api/v1/admin/system/mail-delivery/oauth/callback
      Die exakten URLs stehen in Volt unter Einstellungen → Schnittstellen → Microsoft 365 / Outlook (kopierbar).
  5. API permissionsAdd a permissionMicrosoft GraphDelegated permissions — alle hinzufügen:
Berechtigung Zweck
User.Read Anmeldung / Profil
offline_access Refresh-Token
Calendars.ReadWrite Kalender lesen/schreiben, Plantafel-Push, Assistent-Termine
Mail.Read Posteingang + einzelne Mails (Assistent)
Mail.ReadWrite E-Mail-Entwürfe (Assistent)
Mail.Send E-Mail senden/antworten (Assistent + System-Versand)
Files.Read.All OneDrive listen/lesen (Assistent)
Sites.Read.All SharePoint (Assistent)
Team.ReadBasic.All Teams auflisten (Assistent)
Chat.Read Teams-Chats lesen (Assistent)
ChannelMessage.Read.All Teams-Kanalnachrichten lesen (Assistent)
Tasks.ReadWrite To-Do-Sync + Assistent
Notes.Read / Notes.ReadWrite OneNote lesen / Seiten anlegen (Assistent)
  1. Grant admin consent for [Tenant] — ohne Admin-Einwilligung schlagen OAuth und Assistent-Tools mit 403 fehl.
  2. (Optional, Krankmeldungs-Import) Application permission Mail.Read + Exchange Application Access Policy auf das Krankmeldungs-Postfach — siehe Operations-Doku.

Nach neuen Assistent-Scopes: Berechtigungen in Azure ergänzen, Admin Consent erneut, dann jeder Mitarbeiter M365 erneut verbinden.

Schritt-für-Schritt: In Volt einrichten (Admin)
Schritt Wo Aktion
1 Admin → Module MODULE_SCHNITTSTELLEN aktivieren
2 Admin → Einstellungen → Schnittstellen → Karte Microsoft 365 / Outlook Tenant-ID, Client-ID, Client-Secret eintragen
3 Dieselbe Karte Beide Redirect-URIs in Azure übernehmen (Felder sind schreibgeschützt, zum Kopieren)
4 Dieselbe Karte Kalender-Push aktivieren, wenn Einsätze/Abwesenheiten nach Outlook sollen
5 Dieselbe Karte SpeichernTesten (OAuth-App erreichbar)
6 Server REDIS_URL setzen, damit Push/Pull alle 15 Min. läuft (Worker volt-outlook-calendar-sync)
7 .env / Prod OUTLOOK_PROVIDER=graph (nicht stub)

System-E-Mail (Angebote, Wochenberichte): danach Admin → System → E-Mail-Versand → Modus Microsoft 365 (OAuth) → mit demselben Azure-Tenant verbinden (Mail.Send muss in der App consented sein).

Krankmeldungs-Postfach: in der M365-Karte Postfach-Adresse eintragen, Postfach testen, optional automatischen Import aktivieren.

Schritt-für-Schritt: Mitarbeiter verbinden

Voraussetzung: Azure-App in Volt konfiguriert, Mitarbeiter hat verknüpftes Benutzerkonto.

Schritt Wo Aktion
1 Profil (/profile) → Abschnitt Microsoft 365 Kalender Mit Microsoft 365 verbinden
2 Microsoft-Anmeldung Mit dem eigenen Firmenkonto anmelden und zustimmen
3 Zurück in Volt Status Verbunden; optional Sync-Optionen (Einsätze push/pull, Abwesenheiten)
4 Bei Fehlern / neuen Scopes Erneut verbinden (alte Tokens haben nicht alle Berechtigungen)

Ohne persönliche Verbindung kann der Assistent keine M365-Daten dieses Nutzers lesen oder schreiben (Kalender, Mail, OneDrive, Teams).

Assistent: Ollama + M365-Tools

Der Volt-Assistent nutzt lokales Ollama mit Tool-Calling; M365-Zugriff läuft über das verbundene Konto des angemeldeten Mitarbeiters.

Schritt Wo Aktion
1 Admin → Module MODULE_AUTOMATISIERUNGEN aktiv
2 Admin → Einstellungen → SchnittstellenOllama / KI Basis-URL (z. B. http://ollama:11434), Standard-Modell
3 Dieselbe Karte Aufgabe Assistent (Tool-Calling) — Modell mit Tool-Support (z. B. qwen3:14b)
4 Profil → Microsoft 365 Kalender Persönliche M365-Verbindung (siehe oben)
5 Assistent (Panel oder /assistant) Freie Fragen; bei M365-Schreibaktionen (Mail senden/antworten, Termin) Bestätigung im UI

Volt-interne Tools (Projekte, Kunden, Material, Plantafel) brauchen kein M365 — nur die üblichen Volt-Rechte des Nutzers.

To-Do: Persönliche Dashboard-Todos syncen bidirektional mit Microsoft To-Do-Liste „Volt - Aufgaben" (pro Benutzer eine Liste). Standup-Todos sind ausgenommen.

Prod-Hinweis Docker-Netz: Ollama & n8n.

Kurz Aktion
Azure App-Registration, delegated Graph-Scopes, Admin Consent, zwei Redirect-URIs
Admin Einstellungen → Schnittstellen → Microsoft 365 / Outlook
MA Profil → Microsoft 365 Kalender → Verbinden
Sync REDIS_URL + Kalender-Push; Worker alle 15 Min.
Assistent Ollama Tool-Calling-Modell + MA-M365-Verbindung

5. Lieferant Würth (OCI / IDS / ComNorm)

Stammdaten unter Lieferanten (/suppliers): Kundennummer, Partnernummer, Shop-Passwort, Einstiegs-URLs aus dem Würth-Portal.

Abschnitt Würth unten · ENCRYPTION_KEY (64 Hex) für verschlüsseltes Shop-Passwort.

6. Stundensätze & Kalkulation

Einstellungen → Stundensätze (/settings/hourly-rates) · Margen-Schwellen und Projektstatus unter /settings/*.

7. Module aktivieren

Admin → Module (/admin/modules) — Feature-Flags nach Bündeln (CRM & Kunden, Automatisierung & KI, Telefonie, …).

Bündel Typische Flags
CRM & Kunden MODULE_CRM, MODULE_LEADS, MODULE_KOMMUNIKATION, MODULE_REVIEWS, MODULE_KUNDENPORTAL
Automatisierung & KI MODULE_AUTOMATISIERUNGEN, OLLAMA_LV_ANALYSIS, OLLAMA_CRM_ASSISTANT
Sonstiges MODULE_SUBCONTRACTORS, MODULE_FIELD_APP, MODULE_TELEFONIE, …

Details und Timeline: CRM & Kundenaktivitäten (M03).

8. Kundenportal & öffentliche Angebote

Einladungen: Sidebar-Gruppe Kunden → Kundenportal · öffentliche Angebotslinks und Terminbuchung über jeweilige Admin-Bereiche.

docs/operations/customer-portal-dsgvo.md

9. Volt Android-App (Field App)

Native Android-App für Monteure (Zeiten, Einsätze, Krankmeldung mit AU-Foto, Push). Web-Monteur-UI unter /monteur/* ist unabhängig davon.

Voraussetzungen

Schritt Aktion
Modul Admin → ModuleMODULE_FIELD_APP aktivieren (siehe §7)
Benutzer Mitarbeiter mit verknüpftem Benutzerkonto und Recht Field-App nutzen
App Volt-App installieren (Play Store / APK)

Gerätekopplung

Schritt Wo
Code erzeugen Mitarbeiter → Detail → Benutzerkonto (Login) oder Admin → Benutzer → Bearbeiten — Kopplungscode + QR
App QR scannen oder 6-stelligen Code eingeben (volt://pair?code=123456)
API POST /api/v1/auth/field-app/pair

Code ist 10 Minuten gültig und einmalig verwendbar.

Push-Benachrichtigungen (Firebase / FCM)

Für Android-Push braucht das Volt-Backend einen Firebase Service Account derselben Firebase-App wie die Android-App. Ohne FCM funktionieren Kopplung und API; nur Push auf dem Gerät fehlt dann.

1. Firebase Console (Projekt der Volt-App) → Einstellungen → Dienstkonten → Neuen privaten Schlüssel generieren → JSON herunterladen.

2. JSON niemals ins Git — nur lokal oder als Secret auf dem Server.

Entwicklung (apps/backend/.env):

# Datei liegt gitignored unter apps/backend/.fcm-service-account.json
FCM_SERVICE_ACCOUNT_PATH=apps/backend/.fcm-service-account.json

Production (.env.production / Docker): Dateipfad im Container ist umständlich — praktischer ist einzeiliges JSON:

FCM_SERVICE_ACCOUNT_JSON={"type":"service_account","project_id":"…",…}

(Tip: jq -c . fcm-service-account.json erzeugt eine Zeile.)

Alternativ Secret-Datei mounten und FCM_SERVICE_ACCOUNT_PATH=/pfad/im/container/fcm.json setzen.

Mehrere Volt-Installationen — brauche ich jedes Mal ein neues Firebase?

Nein. Firebase hängt an der Android-App (Package Name + Signatur), nicht an der Volt-Server-Instanz.

Situation Firebase
Zweiter Kunde, dritter Server, dieselbe Volt-App aus dem Store Gleiches Firebase-Projekt + gleiche Service-Account-JSON auf jedem Server
Dev / Staging / Production Empfohlen: je Umgebung ein eigenes Firebase-Projekt (und passende App-Builds)
Eigener App-Build (anderes Package, andere Signatur) Neues Firebase-Projekt für diese App-Identität
Bewusste Mandantenisolation (Push getrennt) Optional separates Firebase pro Mandant — selten nötig

Kurz: Pro App-Identität ein Firebase; pro Volt-Server nur die Credentials hinterlegen, nicht neu anlegen.

→ OpenAPI (Dev): /docs/field-app


Wo finde ich was?

Anwendung (Frontend-Routen)

Bereich Pfad Rolle (typisch)
Login /login alle
Dashboard /dashboard, /dashboard/standup Büro, Admin
Kunden (Gruppe) Sidebar Kunden (aufklappbar) Büro, Admin
Kunden /customers, Tab Aktivitäten Büro, Admin
Leads /leads Büro, Admin (MODULE_LEADS)
Kommunikation /communications Büro, Admin (MODULE_KOMMUNIKATION)
Bewertungen /reviews Büro, Admin (MODULE_REVIEWS)
Kundenportal (Admin) /customer-portal Büro, Admin (MODULE_KUNDENPORTAL)
Projekte /projects, /projects/:id/* (Tab Aktivitäten) Büro, Polier, Admin
Plantafel /deployment-planner Büro, Polier
Monteur /monteur/* Monteur (fitter)
Material /materials, /purchase-orders Büro, Lager
Angebote /offers Büro
Service /service/orders Büro
Importe /imports Admin, Büro
Admin /admin/users, /admin/integrations, /system Admin
Display /display Display-User
Kundenportal /portal/* Kunde (eigenes JWT)
Setup /setup Setup-Token

Vollständige Routen: apps/frontend/src/app/router.tsx.

Backend & Daten

Was Pfad
API-Routen apps/backend/src/routes/
Domänen-Module apps/backend/src/modules/
Prisma-Schema (Source of Truth) apps/backend/prisma/schema.prisma
Migrationen apps/backend/prisma/migrations/
Lexware apps/backend/src/lib/lexware/
ENV Dev apps/backend/.env (von .env.example)
ENV Production .env.production (von .env.production.example)

Dokumentation

Thema Datei
Installation docs/INSTALL.md
Deployment / Updates docs/DEPLOYMENT.md
API (generiert) docs/API-REFERENCE.md
Datenbank docs/DATABASE-SCHEMA.md
Architektur docs/ARCHITECTURE.md

Datenbank, Redis & Umgebung

Entwicklung (Docker Compose)

Dienst Port Container (Dev) Zweck
PostgreSQL 18 5432 volt-postgres Haupt-DB volt
Redis 8 6379 volt-redis Cache, BullMQ (Outlook-Sync, Jobs)

DATABASE_URL in apps/backend/.env · Test-DB: volt_test via scripts/ensure-backend-test-db.sh.

Production

Dienst Compose-Projekt Typischer Container
Stack volt-prod docker-compose.prod.yml
Postgres volt-prod-postgres-1 Migrationen via migrator-Service
Env-Datei .env.production Secrets, Domain, VOLT_PUBLIC_BASE_URL
# Tabellen anzeigen (Production)
docker exec -it volt-prod-postgres-1 psql -U volt -d volt -c "\dt"

Vorsicht: prisma migrate reset löscht alle Daten.

Wichtige ENV-Variablen (Auswahl)

Variable Zweck
DATABASE_URL PostgreSQL-Verbindung
REDIS_URL BullMQ / Cache (optional in Dev)
JWT_SECRET / JWT_REFRESH_SECRET Auth-Tokens
ENCRYPTION_KEY 32 Byte hex — OAuth-Tokens, Shop-Passwörter
VOLT_SETUP_TOKEN Setup-Wizard
VOLT_PUBLIC_BASE_URL Öffentliche URLs (OCI-Rückkehr, Portal)
FCM_SERVICE_ACCOUNT_JSON / FCM_SERVICE_ACCOUNT_PATH Android-Push (Field App) — siehe §9
LEXWARE_* Lexware OAuth & Webhook

Vorlagen: .env.example · .env.production.example · Prüfung: pnpm validate:install-env.


Skripte & Befehle

Volt CLI (packages/cli)

Befehl Wirkung
./install Erstinstallation ohne vorinstalliertes pnpm (empfohlen)
./install --production Production-Install (Domain, Secrets, Prod-Compose)
pnpm volt install Wie ./install, wenn pnpm bereits vorhanden
pnpm volt install --production Prod-Install über CLI
pnpm volt onboard Setup-URL + Token ausgeben
pnpm volt update Dev: git + deps + Migrationen · Prod: prod-update.sh
pnpm volt update --force Prod: Deploy auch ohne VERSION-Bump bei neuem Git-Stand (siehe Updates)
pnpm volt doctor Toolchain, ENV, /health, Setup-Status

CLI-ENV: VOLT_SKIP_DOCKER, VOLT_NONINTERACTIVE, VOLT_AUTO_START_STACK — siehe Troubleshooting.

pnpm (Monorepo)

Befehl Wirkung
pnpm dev Backend :4000 + Frontend :5173
pnpm build Production-Builds aller Packages
pnpm test Vitest in allen Workspaces
pnpm typecheck TypeScript (Shared zuerst bauen)
pnpm lint ESLint
pnpm db:migrate Prisma migrate dev (interaktiv)
pnpm db:migrate:deploy Migrationen (CI / non-interactive)
pnpm db:studio Prisma Studio
pnpm docker:up / down Dev-Compose Postgres + Redis (Stoppen/Löschen: Container)
pnpm test:db:ensure Test-DB volt_test vorbereiten
pnpm generate:api-reference docs/API-REFERENCE.md + README-API-Abschnitt
pnpm validate:install-env Production-Secrets prüfen
pnpm validate:readiness-gate Roadmap-Gate (CI)
pnpm validate:release-gate Release-Gate

Wichtig: Vor typecheck/test: pnpm --filter @volt/shared run build · nach Schema-Änderung: prisma generate.

Repository-Skripte (scripts/)

Skript Wirkung
bootstrap-volt.sh Alternative Erstinstallation (ENV, Docker, migrate, seed)
install-system-deps.sh Node 24, pnpm, Docker, Build-Pakete (Linux)
prod-update.sh Production-Update: git pull, VERSION, compose build/up, Health (volt update / --force)
lib/prod-deploy.sh Deploy-Logik (von prod-update / CLI genutzt)
ensure-backend-test-db.sh Lokale/ephemere Postgres-Test-DB für Vitest
validate-install-env.mjs Fail-fast bei Platzhalter-Secrets (Production)
validate-readiness-gate.mjs Roadmap-Struktur validieren
validate-release-gate.mjs Release-Kriterien
bump-deploy-version.sh VERSION / Deploy-Tags für Prod
prod-diagnose-backend.sh Backend-Container Diagnose
prod-enable-core-modules.sh Kern-Module in DB aktivieren
verify-boo-457-backend.sh BOO-457 Backend-Verifikation
verify-backend-audit-gate.mjs Audit-Gate für kritische Entitäten
run-e2e-scheduling-smoke.sh E2E Plantafel-Smoke
run-e2e-m07-field-app.sh E2E Field-App
run-e2e-m08-integration.sh E2E Material-Integration
smoke-qol-wave1.sh QoL-Welle-1 Smoke
smoke-qol-wave2bc.sh QoL-Welle-2bc Smoke

Infra (infra/)

Datei Wirkung
update-daemon.sh Webhook-gesteuertes Prod-Deploy (127.0.0.1:9090)
pg-backup.sh PostgreSQL-Dump (Cron)
verify-volt-update-stack.sh Update-Stack prüfen

Entwicklung & Qualität

pnpm --filter @volt/shared run build
pnpm --filter @volt/backend exec prisma generate
pnpm dev

Backend-Tests mit DB:

eval "$(scripts/ensure-backend-test-db.sh export)"
pnpm --filter @volt/backend exec prisma migrate deploy
pnpm --filter @volt/backend test
Check Befehl
TypeScript pnpm typecheck
Lint pnpm lint
Unit/Integration pnpm test
E2E (Frontend) pnpm --filter @volt/frontend exec playwright test

Production, Updates & Backups

Compose-Projekt volt-prod · Env: .env.production.

Empfohlenes Update

cd ~/coding/volt    # oder /home/volt/volt
volt update
# oder: bash scripts/prod-update.sh

Ablauf: git pull → VOLT_VERSION/VOLT_GIT_SHA → Docker build/pull → up -d → Health-Check.

VERSION-Regel (Prod): Liegt nach git pull ein neuer Git-Stand vor (VOLT_GIT_SHAHEAD), muss VERSION im Repo höher sein — sonst bricht das Update ab. Im Repo: ./scripts/bump-deploy-version.sh, CHANGELOG.md, commit + push. Details: docs/versioning.md.

Deploy ohne VERSION-Bump (z. B. nur Code-Änderungen auf gleicher Versionsnummer, interner Rollout):

volt update --force
# Äquivalent: VOLT_ALLOW_SAME_VERSION_DEPLOY=1 bash scripts/prod-update.sh

--force gilt nur für Production (prod-update.sh). In der Entwicklung hat der Schalter keine zusätzliche Wirkung.

Nur GHCR-Images: VOLT_DEPLOY_STRATEGY=pull bash scripts/prod-update.sh

Stack steuern

# Integrierter Caddy (Default):
docker compose --profile caddy -f docker-compose.prod.yml --env-file .env.production up -d

# Externer Proxy (VOLT_EDGE_PROXY=external) — ohne --profile caddy:
docker compose -f docker-compose.prod.yml -f docker-compose.prod.external-proxy.yml --env-file .env.production up -d

docker compose -f docker-compose.prod.yml --env-file .env.production logs -f backend
docker compose -f docker-compose.prod.yml --env-file .env.production down       # stoppen, ohne Volumes
docker compose -f docker-compose.prod.yml --env-file .env.production down -v    # inkl. Volumes löschen

Stoppen/Löschen Dev + Prod: Abschnitt Container stoppen und entfernen.

Ollama & n8n (gleicher Host)

Ollama und n8n laufen oft in eigenen Compose-Stacks neben volt-prod. Container erreichen sich nur per Hostname, wenn sie im selben user-defined Docker-Netz hängen — localhost im Volt-Backend zeigt auf den eigenen Container, nicht auf Ollama auf dem Host.

Schritt Aktion
1 Gemeinsames Netz (z. B. proxy-net): docker network create proxy-net
2 Ollama-Compose und Volt hängen beide an diesem Netz
3 In .env.production: VOLT_INTEGRATIONS_DOCKER_NETWORK=proxy-net
4 Deploy: bash scripts/prod-update.sh (bindet docker-compose.prod.integrations-network.yml ein)
5 Admin → Einstellungen → Schnittstellen → Ollama: Basis-URL http://ollama:11434, Modell = installiertes Modell (z. B. gemma4), API-Key leer
6 Admin → Module → Automatisierung & KI: optional OLLAMA_LV_ANALYSIS (Projekt-LV) und OLLAMA_CRM_ASSISTANT (Timeline-Zusammenfassung)

Host: ollama existiert nicht als Shell-Befehl — nur im Container: docker exec ollama ollama list.

Prüfen: docker exec volt-prod-backend-1 wget -qO- http://ollama:11434/api/tags

Compose immer mit Env-Datei: docker compose -f docker-compose.prod.yml --env-file .env.production … — ohne --env-file fehlen Secrets und DATABASE_URL/REDIS_URL mit localhost brechen Migrator/Backend.

Ausführlich: docs/DEPLOYMENT.md — Nebenservices.

Admin-Passwort zurücksetzen (Notfall)

Passwörter sind Argon2id in user.password_hash — nicht per PostgreSQL-crypt().

Empfohlen: Admin → Benutzer → Passwort setzen.

Shell: Hash im Backend-Container erzeugen, dann UPDATE in Postgres — siehe docs/DEPLOYMENT.md oder frühere README-Version (Abschnitt Datenbank & Admin).

Updates & Versionierung

Thema Doku
Semver / VERSION-Datei docs/versioning.md
Release-Gate docs/operations/RELEASE-GATE.md
Auto-Deploy Webhook /_internal/update — integrierter Caddy oder Host-Proxy (nginx/Apache) → 127.0.0.1:9090

PostgreSQL-Backups (Cron)

Roher SQL-Dump der Datenbank — ergänzt das Anwendungsbackup (ZIP über Admin-UI), ersetzt es nicht.

chmod +x /home/volt/volt/infra/pg-backup.sh

Crontab (Beispiel täglich 02:15):

15 2 * * * /home/volt/volt/infra/pg-backup.sh >> /home/volt/volt/backups/postgres/backup.log 2>&1

Container-Name typisch: volt-prod-postgres-1 (Projekt volt-prod).

Anwendungsbackup & Wiederherstellung

Volt bietet zwei komplementäre Sicherungsebenen:

Ebene Zweck Wo konfigurieren
Anwendungsbackup (ZIP) Portabler Snapshot aller Volt-Betriebsdaten; Restore über Admin-UI oder API Admin → System → Daten-Backup
PostgreSQL-Dump Vollständiger DB-Rohdump auf Server-Ebene (Disaster Recovery, DBA) infra/pg-backup.sh + Cron (siehe oben)

Für den operativen Betrieb (Serverwechsel, Testsystem, Notfall-Restore der Volt-Daten) reicht in der Regel das Anwendungsbackup. Für Bare-Metal oder inkonsistente DB-Zustände zusätzlich pg_dump nutzen.

Oberfläche (Admin)

Pfad: Admin → System → Daten-Backup

Aktion Beschreibung
Backup jetzt ausführen Erzeugt ein ZIP, speichert es auf dem Server und kopiert es auf alle aktiven Ziele
Nur herunterladen Einzel-Export als ZIP in den Browser (ohne Eintrag in der Backup-Liste)
Backup wiederherstellen ZIP hochladen, Metadaten prüfen, Import starten
Zeitplan Automatische Backups (stündlich / 6h / 12h / täglich / wöchentlich)
Ziele Lokaler Pfad, FTP, SharePoint-Sync-Ordner
Gespeicherte Backups Liste mit Speicherort, Download, Wiederherstellen

Rolle: Admin mit Systemmodul (MODULE_ADMIN).

Was im ZIP enthalten ist (Format v2)

  • Export aller Prisma-Modelle in FK-Reihenfolge (Stammdaten, Projekte, Material, Service, Lexware-Cache, RBAC, Einstellungen, …)
  • Metadaten: meta.json (exportedAt, voltVersion, backupFormatVersion, schemaHash)
  • Daten: data.json (pro Tabelle ein Array, Schlüssel = Prisma-Delegate, z. B. employee, project)

Ausgeschlossen (bewusst, nicht portabel):

Modell Grund
RefreshSession Aktive Login-Sessions
SetupToken Einmal-Setup
OfflineSyncQueue Transiente Field-App-Sync-Warteschlange

Sicherheit: User.passwordHash wird weder exportiert noch beim Import geschrieben.

Einschränkungen:

  • Große Binärfelder (ImportedDocument.contentBytes, Buffer) werden als null gesichert — Metadaten und SharePoint-Verknüpfungen bleiben erhalten; Datei-Inhalte liegen weiter in SharePoint bzw. am Originalspeicherort.
  • SharePoint-Ziel in Volt = lokaler Sync-Ordner (OneDrive/SharePoint-Client), kein direkter Microsoft-Graph-Upload.
  • FTP: klassisches FTP (Port 21); FTPS (secure: true) wird aktuell nicht unterstützt.
  • Ältere Backups (v1): Import weiter möglich (14 Kern-Tabellen); neue Exporte sind immer v2.

Konfiguration (Server)

Variable Bedeutung Standard
BACKUP_STORAGE_PATH Verzeichnis für ZIP-Artefakte + manifest.json ./data/backups (relativ zum Backend-CWD)
REDIS_URL BullMQ-Worker für geplante Backups ohne Redis: nur manueller Lauf / UI

Einstellungen (Zeitplan, Ziele, FTP-Passwort) liegen verschlüsselt in der DB (setting, Key backup:automation). Beim ersten Start wird ein Standard-Ziel Lokaler Server (BACKUP_STORAGE_PATH) angelegt.

Beispiel apps/backend/.env:

BACKUP_STORAGE_PATH=/var/lib/volt/backups
REDIS_URL=redis://localhost:6379

Speicherziele

Typ (kind) Beschreibung
local Beliebiger Pfad auf dem Volt-Server (z. B. /mnt/backup/volt)
ftp Upload per FTP (host, user, password, remotePath) — Passwort verschlüsselt in der DB
sharepoint_path Lokaler Pfad zu einem synchronisierten SharePoint-/OneDrive-Ordner + Unterordner (z. B. Volt-Backups)

Nach jedem Lauf zeigt die Tabelle Gespeicherte Backups pro Artefakt, auf welchen Zielen die Datei liegt (uploaded / failed inkl. Pfad oder Fehlermeldung).

REST-API (Admin)

Methode Pfad Beschreibung
GET /api/v1/admin/backup/export ZIP-Stream (Download, ohne Speicherung)
POST /api/v1/admin/backup/import ZIP importieren; Query: conflictPolicy=skip|overwrite, validateOnly=true
POST /api/v1/admin/backup/run Backup erzeugen + auf Ziele verteilen
GET /api/v1/admin/backup/artifacts Liste gespeicherter Backups
GET /api/v1/admin/backup/artifacts/:id/download Gespeichertes ZIP herunterladen
GET /api/v1/admin/backup/automation Zeitplan + Ziele lesen
PATCH /api/v1/admin/backup/automation Zeitplan + Ziele speichern

Import-Query conflictPolicy:

  • skip — bestehende Datensätze (gleiche ID/Schlüssel) überspringen
  • overwrite — per Upsert überschreiben

Validierung ohne Schreiben: POST .../backup/import?validateOnly=true mit Multipart-Feld file.

Restore-Ablauf (empfohlen)

  1. Backup in der Liste wählen → Wiederherstellen (oder ZIP manuell hochladen).
  2. meta.json und Datensatz-Anzahlen prüfen (schemaHash muss zur Installation passieren, außer Legacy-v1).
  3. Konflikt-Strategie wählen (skip für Teilsystem, overwrite für Voll-Restore auf leerer DB).
  4. Nach erfolgreichem Import ggf. Lexware-/Outlook-Sync und externe Integrationen neu anstoßen.

Troubleshooting

Symptom Ursache Lösung
Backend startet nicht (Prod) Platzhalter-Secrets pnpm validate:install-env · .env.production prüfen
typecheck fehlgeschlagen Shared nicht gebaut pnpm --filter @volt/shared run build
Prisma Client fehlt Nach install/schema pnpm --filter @volt/backend exec prisma generate
Tests ohne DB Kein Postgres eval "$(scripts/ensure-backend-test-db.sh export)"
pnpm db:migrate hängt Interaktiv pnpm db:migrate:deploy (CI/Cloud)
API 401 Token abgelaufen POST /api/v1/auth/refresh oder neu einloggen
Outlook-Sync nur bei Aktion Kein Redis REDIS_URL setzen, Worker volt-outlook-calendar-sync
Assistent: M365-Tools schlagen fehl MA nicht verbunden oder alte OAuth-Scopes Profil → Microsoft 365 erneut verbinden; Azure-Scopes + Admin Consent prüfen (§4)
Assistent: Tool-Calling ohne Antwort Falsches/fehlendes Ollama-Modell Schnittstellen → Ollama → Aufgabe Assistent (Tool-Calling)
Android-Push kommt nicht an FCM_* fehlt oder falsches Firebase-Projekt Service Account setzen (§9) · App und Backend müssen dieselbe Firebase-App nutzen
OCI-Rückkehr leer (Würth) Falsche Hook-URL VOLT_PUBLIC_BASE_URL in Prod · Shop erneut öffnen
docker compose down löscht Prod nicht Falsches Compose-File -f docker-compose.prod.yml verwenden
Prod: Migrator localhost:5432 / Redis ECONNREFUSED DATABASE_URL/REDIS_URL mit localhost oder Compose ohne --env-file .env.production Hostnamen postgres/redis · bash scripts/prod-update.sh
Ollama in Volt nicht erreichbar Getrennte Docker-Netze (volt-prod_default vs. proxy-net) VOLT_INTEGRATIONS_DOCKER_NETWORK=proxy-net · Ollama & n8n
Host: ollama: command not found Ollama nur im Container docker exec ollama ollama list
Merge-Konflikt-Marker Git pnpm verify:no-merge-conflicts

Diagnose:

pnpm volt doctor
bash scripts/prod-diagnose-backend.sh   # Production
curl -s http://localhost:4000/health | jq .

Cloud-Agent-Setup: AGENTS.md.


Integrationen (Kurzüberblick)

Integration Einrichtung Doku
Lexware Office Admin → Integrationen, OAuth, Webhook docs/LEXWARE-INTEGRATION.md
Outlook / M365 Azure App, Admin Schnittstellen, MA-Profil verbinden, Redis für Sync §4 Microsoft 365 · docs/operations/MICROSOFT-365-OUTLOOK-INTEGRATION.md
DATEV / Export Export-Routen, Admin DATEV docs/INTEGRATION-BILLING-LEXWARE-DATEV.md
eSign / QES Webhook + Admin docs/operations/esign-qes.md
GAEB Projekt-Import/Export docs/integrations/GAEB-X81-X83-CONTRACT-PREP.md
Telefonie (Agfeo) Webhook, Admin Config docs/integrations/TELEPHONY-AGFEO.md
Ollama (Assistent / KI) Schnittstellen → Ollama; Aufgabe Tool-Calling; Modul Automatisierung & KI §4 Assistent · Ollama & n8n · CRM-Timeline
n8n (Workflows) Admin → Automatisierung; Webhook-URLs in Systemeinstellungen docs/DEPLOYMENT.md
Würth Shop Lieferanten-Stammdaten unten
Volt Android-App Modul MODULE_FIELD_APP, Kopplung in Mitarbeiterverwaltung, FCM in ENV §9 Volt Android-App

Subunternehmer — Modul & API

Nachunternehmer-Firmen und planbare NU-Mitarbeiter (NU-… Personalnummern) für die Plantafel.

Feature-Flag MODULE_SUBCONTRACTORS
Rechte subcontractor.read / subcontractor.write
UI /subcontractors · Projekt-Tab „Nachunternehmer“
API /api/v1/subcontractors/* · Worker: /workers

NU-Kräfte erscheinen in der Plantafel wie interne Monteure (POST /api/v1/deployment-planner/assignments mit employeeId). GET /api/v1/employees listet nur interne MA-… Kräfte.

Vollständige Doku: docs/modules/SUBCONTRACTORS.md.


Lieferant Würth (IDS/OCI/ComNorm)

Anbindung an den Würth E-Shop (Intershop). Werte aus Mein Konto → ComNorm / OCI / IDS im Würth-Portal.

Voraussetzungen & Parameter
Voraussetzung Hinweis
Migration 20260527200000_supplier_shop_integration_fields Shop-Felder am Lieferanten
ENCRYPTION_KEY 64 Hex-Zeichen — Shop-Passwort verschlüsselt
Rolle admin oder office
Würth (Portal) Feld in Volt
CN / ORGANIZATION / kndnr Kundennummer
UI / NAME / name_kunde Partnernummer
PASSWORD / pw_kunde Shop-Passwort
URL Zeile 10 OCI-/IDS-/ComNorm-Einstiegs-URL
Schritt für Schritt & Beispiel
  1. Lieferanten → Neuer Lieferant (Code z. B. wuerth).
  2. Schnittstellen OCI / IDS / ComNorm aktivieren.
  3. Portal-Werte eintragen, speichern.
  4. OCI-Shop öffnen auf der Detailseite — Warenkorb-Rückkehr importiert Positionen.

Typische URLs (Platzhalter — echte Werte nur aus dem Portal):

  • OCI: …/OCICatalogService-Inbound
  • IDS: …/ViewIDSCatalogService-IDSInBound
  • ComNorm: …/ViewComNormCatalogService-Dispatch
Häufige Fehler
Symptom Lösung
Validierung Pflichtfelder Kundennummer, Partnernummer, Passwort, Einstiegs-URL aus Portal
ComNorm-Sync schlägt fehl VOLT_COMNORM_* nur für JSON-Gateway — nicht Intershop-Shop-URL
OCI-Rückkehr leer VOLT_PUBLIC_BASE_URL in Prod; Hook /api/v1/suppliers/{id}/oci/return

Dokumentation (Wiki)

Kategorie Dateien
Produkt & Planung GOALS.md, ROADMAP-READINESS-M01-M12.md, SPRINT-PLAN.md
Installation & Betrieb INSTALL.md, DEPLOYMENT.md, RELEASE-GATE.md, AGENTS.md
Architektur & API ARCHITECTURE.md, API-REFERENCE.md, DATABASE-SCHEMA.md
Module SUBCONTRACTORS.md
Agenten / Handoffs ROUTING-RUNBOOK.md, handoffs/README.md

DSGVO & Security

  • Hosting in Deutschland (Hetzner Falkenstein/Nürnberg)
  • Audit-Log für schreibende Operationen auf kritischen Entitäten (project, time_entry, material_consumption, …)
  • Lexware- und Integrations-Tokens AES-256-GCM (ENCRYPTION_KEY)
  • JWT nur im Authorization-Header · Passwörter Argon2id
  • Rate-Limits auf Auth · CORS strikt · Helmet/CSP
  • AVV mit Hetzner und Lexware

Lizenz

Privat / proprietär — siehe LICENSE.


Volt · Bootlabs


REST-API (/api/v1)

Vollständige, aus dem Code generierte Endpoint-Liste. Regenerieren: pnpm generate:api-reference.

Allgemein — Basis-URL, Auth, Fehlerformat
Basis-URL (Dev) http://localhost:4000 (Vite proxyt /api → Backend)
Präfix /api/v1
Login POST /api/v1/auth/login → Access- + Refresh-Token
Requests Header Authorization: Bearer <access_token>
Refresh POST /api/v1/auth/refresh mit Refresh-Token (Body/Cookie je Implementierung)
Fehler RFC 7807 application/problem+json (type, title, status, detail, optional errors[])
Validierung Zod; HTTP 422 bei ungültigen Query-/Body-Feldern
Paginierung limit + offset (effektives Limit max. 200)
Geld Beträge in Cent (bigint, JSON oft als String)

Öffentliche oder spezielle Auth: Webhooks (x-webhook-token / Signatur), Setup (VOLT_SETUP_TOKEN), Kundenportal, öffentliche Buchung, ICS-Feed — siehe Spalte Auth in den Modul-Tabellen.

Field App (Monteur): OpenAPI UI unter /docs/field-app (Dev). Vollreferenz auch in docs/API-REFERENCE.md.

778 Endpunkte — nach Modul aufklappbar.

absencesabsences (13)
Methode Pfad Auth
GET /api/v1/absences JWT Bearer
POST /api/v1/absences JWT Bearer
DELETE /api/v1/absences/:id JWT Bearer
PATCH /api/v1/absences/:id JWT Bearer
POST /api/v1/absences/:id/approve JWT Bearer
POST /api/v1/absences/:id/cancel JWT Bearer
GET /api/v1/absences/:id/certificate JWT Bearer
POST /api/v1/absences/:id/certificate JWT Bearer
POST /api/v1/absences/:id/reject JWT Bearer
POST /api/v1/absences/check-calendar-overlaps JWT Bearer
POST /api/v1/absences/confirm-calendar JWT Bearer
POST /api/v1/absences/parse-calendar JWT Bearer
POST /api/v1/absences/parse-calendar-pdf JWT Bearer
Administrationadmin (123)
Methode Pfad Auth
GET /api/v1/admin/assistant-actions JWT Bearer
POST /api/v1/admin/assistant-actions/:id/undo JWT Bearer
GET /api/v1/admin/assistant-chats JWT Bearer
GET /api/v1/admin/assistant-chats/retention JWT Bearer
PATCH /api/v1/admin/assistant-chats/retention JWT Bearer
GET /api/v1/admin/assistant-chats/threads JWT Bearer
GET /api/v1/admin/assistant-chats/threads/:threadId JWT Bearer
GET /api/v1/admin/backup/artifacts JWT Bearer
GET /api/v1/admin/backup/artifacts/:id/download JWT Bearer
GET /api/v1/admin/backup/automation JWT Bearer
PATCH /api/v1/admin/backup/automation JWT Bearer
GET /api/v1/admin/backup/export JWT Bearer
POST /api/v1/admin/backup/import JWT Bearer
GET /api/v1/admin/backup/progress/:operationId JWT Bearer
GET /api/v1/admin/backup/readiness JWT Bearer
POST /api/v1/admin/backup/run JWT Bearer
GET /api/v1/admin/company-settings JWT Bearer
PATCH /api/v1/admin/company-settings JWT Bearer
DELETE /api/v1/admin/company-settings/logo JWT Bearer
GET /api/v1/admin/company-settings/logo JWT Bearer
POST /api/v1/admin/company-settings/logo JWT Bearer
GET /api/v1/admin/feature-flags JWT Bearer
PATCH /api/v1/admin/feature-flags JWT Bearer
PATCH /api/v1/admin/feature-flags/:key JWT Bearer
POST /api/v1/admin/field-app/pairing-codes JWT Bearer
GET /api/v1/admin/integrations/:provider/field-mappings JWT Bearer
PATCH /api/v1/admin/integrations/:provider/field-mappings JWT Bearer
POST /api/v1/admin/integrations/:provider/sync JWT Bearer
GET /api/v1/admin/integrations/cloud-storage JWT Bearer
PATCH /api/v1/admin/integrations/cloud-storage JWT Bearer
POST /api/v1/admin/integrations/cloud-storage/migrate-legacy JWT Bearer
POST /api/v1/admin/integrations/cloud-storage/sync JWT Bearer
POST /api/v1/admin/integrations/cloud-storage/test JWT Bearer
GET /api/v1/admin/integrations/datev/export JWT Bearer
POST /api/v1/admin/integrations/datev/export JWT Bearer
GET /api/v1/admin/integrations/datev/export-jobs JWT Bearer
GET /api/v1/admin/integrations/datev/export-jobs/latest/:profile JWT Bearer
GET /api/v1/admin/integrations/datev/preview JWT Bearer
POST /api/v1/admin/integrations/datev/trip-log/export JWT Bearer
POST /api/v1/admin/integrations/ids/order JWT Bearer
POST /api/v1/admin/integrations/ids/price-update JWT Bearer
GET /api/v1/admin/integrations/lexware/articles JWT Bearer
GET /api/v1/admin/integrations/lexware/billing-status JWT Bearer
GET /api/v1/admin/integrations/lexware/contacts JWT Bearer
POST /api/v1/admin/integrations/lexware/export JWT Bearer
GET /api/v1/admin/integrations/lexware/invoices JWT Bearer
GET /api/v1/admin/integrations/lexware/oauth JWT Bearer
PATCH /api/v1/admin/integrations/lexware/oauth JWT Bearer
POST /api/v1/admin/integrations/lexware/webhook JWT Bearer
GET /api/v1/admin/integrations/lexware/webhook-status JWT Bearer
POST /api/v1/admin/integrations/outlook/import-sick-leave-mails JWT Bearer
GET /api/v1/admin/integrations/outlook/oauth JWT Bearer
PATCH /api/v1/admin/integrations/outlook/oauth JWT Bearer
POST /api/v1/admin/integrations/outlook/smoke-push JWT Bearer
GET /api/v1/admin/integrations/outlook/status JWT Bearer
POST /api/v1/admin/integrations/outlook/sync JWT Bearer
POST /api/v1/admin/integrations/outlook/test JWT Bearer
POST /api/v1/admin/integrations/outlook/test-sick-leave-mailbox JWT Bearer
GET /api/v1/admin/integrations/remote-support/config JWT Bearer
PATCH /api/v1/admin/integrations/remote-support/config JWT Bearer
POST /api/v1/admin/integrations/remote-support/test JWT Bearer
GET /api/v1/admin/integrations/settings JWT Bearer
PATCH /api/v1/admin/integrations/settings/:provider JWT Bearer
GET /api/v1/admin/integrations/spdata/export JWT Bearer
GET /api/v1/admin/integrations/sync-state JWT Bearer
GET /api/v1/admin/integrations/telematics/config JWT Bearer
PATCH /api/v1/admin/integrations/telematics/config JWT Bearer
POST /api/v1/admin/integrations/telematics/sync JWT Bearer
POST /api/v1/admin/integrations/telematics/test JWT Bearer
GET /api/v1/admin/integrations/whatsapp JWT Bearer
PATCH /api/v1/admin/integrations/whatsapp JWT Bearer
GET /api/v1/admin/integrations/whatsapp/templates JWT Bearer
POST /api/v1/admin/integrations/whatsapp/test JWT Bearer
POST /api/v1/admin/jobs/project-kpi-snapshot JWT Bearer
GET /api/v1/admin/personal-data-exports/audit JWT Bearer
POST /api/v1/admin/sync/spdata JWT Bearer
GET /api/v1/admin/system/auth-session JWT Bearer
PATCH /api/v1/admin/system/auth-session JWT Bearer
GET /api/v1/admin/system/automation JWT Bearer
PATCH /api/v1/admin/system/automation JWT Bearer
POST /api/v1/admin/system/automation/ollama/models JWT Bearer
POST /api/v1/admin/system/automation/test/:target JWT Bearer
GET /api/v1/admin/system/doctor JWT Bearer
POST /api/v1/admin/system/doctor/repair/:checkId JWT Bearer
GET /api/v1/admin/system/gaeb-unit-map JWT Bearer
PUT /api/v1/admin/system/gaeb-unit-map JWT Bearer
DELETE /api/v1/admin/system/gaeb-unit-map/:id JWT Bearer
GET /api/v1/admin/system/mail-delivery JWT Bearer
PATCH /api/v1/admin/system/mail-delivery JWT Bearer
GET /api/v1/admin/system/mail-delivery/oauth/authorize JWT Bearer
GET /api/v1/admin/system/mail-delivery/oauth/callback Ohne JWT (Allowlist)
POST /api/v1/admin/system/mail-delivery/test JWT Bearer
POST /api/v1/admin/system/mail-delivery/test-email JWT Bearer
GET /api/v1/admin/telephony/config JWT Bearer
PATCH /api/v1/admin/telephony/config JWT Bearer
POST /api/v1/admin/telephony/test/cti-gateway JWT Bearer
GET /api/v1/admin/tickets JWT Bearer
DELETE /api/v1/admin/tickets/:id JWT Bearer
GET /api/v1/admin/tickets/:id JWT Bearer
PATCH /api/v1/admin/tickets/:id JWT Bearer
POST /api/v1/admin/tickets/:id/archive JWT Bearer
GET /api/v1/admin/tickets/:id/audit JWT Bearer
POST /api/v1/admin/tickets/:id/unarchive JWT Bearer
GET /api/v1/admin/ui-appearance JWT Bearer
PATCH /api/v1/admin/ui-appearance JWT Bearer
POST /api/v1/admin/update JWT Bearer
GET /api/v1/admin/update/check JWT Bearer
GET /api/v1/admin/update/history JWT Bearer
GET /api/v1/admin/update/status JWT Bearer
GET /api/v1/admin/user-feedback JWT Bearer
GET /api/v1/admin/users JWT Bearer
POST /api/v1/admin/users JWT Bearer
DELETE /api/v1/admin/users/:id JWT Bearer
PATCH /api/v1/admin/users/:id JWT Bearer
POST /api/v1/admin/users/:id/request-password-reset JWT Bearer
GET /api/v1/admin/users/check-email JWT Bearer
POST /api/v1/admin/users/from-employee/:employeeId JWT Bearer
GET /api/v1/admin/wiki/articles JWT Bearer
POST /api/v1/admin/wiki/articles JWT Bearer
DELETE /api/v1/admin/wiki/articles/:id JWT Bearer
GET /api/v1/admin/wiki/articles/:id JWT Bearer
PATCH /api/v1/admin/wiki/articles/:id JWT Bearer
POST /api/v1/admin/wiki/reindex JWT Bearer
Angeboteoffers (39)
Methode Pfad Auth
GET /api/v1/offers JWT Bearer
POST /api/v1/offers JWT Bearer
DELETE /api/v1/offers/:id JWT Bearer
GET /api/v1/offers/:id JWT Bearer
PATCH /api/v1/offers/:id JWT Bearer
POST /api/v1/offers/:id/accept JWT Bearer
POST /api/v1/offers/:id/apply-template JWT Bearer
POST /api/v1/offers/:id/customer-invoice JWT Bearer
GET /api/v1/offers/:id/customer-pdf JWT Bearer
POST /api/v1/offers/:id/duplicate JWT Bearer
DELETE /api/v1/offers/:id/edit-lock JWT Bearer
POST /api/v1/offers/:id/edit-lock JWT Bearer
POST /api/v1/offers/:id/esign-request JWT Bearer
GET /api/v1/offers/:id/items JWT Bearer
POST /api/v1/offers/:id/items JWT Bearer
DELETE /api/v1/offers/:id/items/:itemId JWT Bearer
PATCH /api/v1/offers/:id/items/:itemId JWT Bearer
DELETE /api/v1/offers/:id/items/:itemId/logo JWT Bearer
POST /api/v1/offers/:id/items/:itemId/logo JWT Bearer
POST /api/v1/offers/:id/items/reorder JWT Bearer
POST /api/v1/offers/:id/order-confirmation JWT Bearer
GET /api/v1/offers/:id/order-confirmation-pdf JWT Bearer
DELETE /api/v1/offers/:id/release-portal JWT Bearer
POST /api/v1/offers/:id/release-portal JWT Bearer
GET /api/v1/offers/:id/rfq-pdf JWT Bearer
POST /api/v1/offers/:id/save-as-template JWT Bearer
POST /api/v1/offers/:id/send-email JWT Bearer
GET /api/v1/offers/:id/supplier-comparison JWT Bearer
POST /api/v1/offers/:id/supplier-quote-import JWT Bearer
POST /api/v1/offers/:id/supplier-quote-import/confirm JWT Bearer
POST /api/v1/offers/:id/suppliers/:supplierId/ids/import-cart JWT Bearer
POST /api/v1/offers/:id/suppliers/:supplierId/ids/place-order JWT Bearer
POST /api/v1/offers/:id/suppliers/:supplierId/ids/session JWT Bearer
POST /api/v1/offers/:id/suppliers/:supplierId/oci/import-cart JWT Bearer
POST /api/v1/offers/:id/suppliers/:supplierId/oci/place-order JWT Bearer
POST /api/v1/offers/:id/suppliers/:supplierId/oci/session JWT Bearer
POST /api/v1/offers/pdf-import/confirm JWT Bearer
POST /api/v1/offers/pdf-import/preview JWT Bearer
GET /api/v1/offers/pdf-import/progress/:operationId JWT Bearer
assistantassistant (7)
Methode Pfad Auth
GET /api/v1/assistant/actions JWT Bearer
POST /api/v1/assistant/actions/:id/confirm JWT Bearer
POST /api/v1/assistant/actions/:id/undo JWT Bearer
POST /api/v1/assistant/attachments JWT Bearer
POST /api/v1/assistant/chat JWT Bearer
POST /api/v1/assistant/chat/stream JWT Bearer
GET /api/v1/assistant/status JWT Bearer
Authentifizierungauth (8)
Methode Pfad Auth
POST /api/v1/auth/field-app/pair Öffentlich / Refresh-Token
POST /api/v1/auth/login Öffentlich / Refresh-Token
POST /api/v1/auth/logout Öffentlich / Refresh-Token
GET /api/v1/auth/me JWT Bearer
POST /api/v1/auth/password-setup/confirm Öffentlich / Refresh-Token
GET /api/v1/auth/password-setup/validate Öffentlich / Refresh-Token
POST /api/v1/auth/refresh Öffentlich / Refresh-Token
GET /api/v1/auth/session-policy JWT Bearer
Automatisierung / KIautomations (7)
Methode Pfad Auth
POST /api/v1/automations/ai-analyze JWT Bearer
POST /api/v1/automations/document-parsing/callback Ohne JWT (Allowlist)
GET /api/v1/automations/ollama/status JWT Bearer
GET /api/v1/automations/workflows JWT Bearer
PATCH /api/v1/automations/workflows/:id JWT Bearer
GET /api/v1/automations/workflows/:id/executions JWT Bearer
POST /api/v1/automations/workflows/:id/trigger JWT Bearer
Bestellungenpurchase-orders (8)
Methode Pfad Auth
GET /api/v1/purchase-orders JWT Bearer
POST /api/v1/purchase-orders JWT Bearer
GET /api/v1/purchase-orders/:id JWT Bearer
PATCH /api/v1/purchase-orders/:id JWT Bearer
GET /api/v1/purchase-orders/:id/labels.pdf JWT Bearer
POST /api/v1/purchase-orders/:id/receive JWT Bearer
POST /api/v1/purchase-orders/scan-receive JWT Bearer
POST /api/v1/purchase-orders/scan-resolve JWT Bearer
Bewertungenreviews (6)
Methode Pfad Auth
GET /api/v1/reviews JWT Bearer
POST /api/v1/reviews JWT Bearer
DELETE /api/v1/reviews/:id JWT Bearer
GET /api/v1/reviews/:id JWT Bearer
PATCH /api/v1/reviews/:id JWT Bearer
POST /api/v1/reviews/:id/send-request JWT Bearer
billingbilling (6)
Methode Pfad Auth
GET /api/v1/billing/accounts JWT Bearer
GET /api/v1/billing/invoices JWT Bearer
POST /api/v1/billing/invoices/:invoiceId/dunning JWT Bearer
POST /api/v1/billing/invoices/:invoiceId/dunning/send-email JWT Bearer
PATCH /api/v1/billing/invoices/:invoiceId/payment JWT Bearer
GET /api/v1/billing/summary JWT Bearer
company-vehiclescompany-vehicles (5)
Methode Pfad Auth
GET /api/v1/company-vehicles JWT Bearer
POST /api/v1/company-vehicles JWT Bearer
DELETE /api/v1/company-vehicles/:id JWT Bearer
GET /api/v1/company-vehicles/:id JWT Bearer
PATCH /api/v1/company-vehicles/:id JWT Bearer
crmcrm (2)
Methode Pfad Auth
GET /api/v1/crm/activities JWT Bearer
POST /api/v1/crm/activities/summarize JWT Bearer
E-Checke-check (6)
Methode Pfad Auth
GET /api/v1/e-check JWT Bearer
POST /api/v1/e-check JWT Bearer
DELETE /api/v1/e-check/:id JWT Bearer
GET /api/v1/e-check/:id JWT Bearer
PATCH /api/v1/e-check/:id JWT Bearer
POST /api/v1/e-check/:id/generate-pdf JWT Bearer
Einsatzplanung (Plantafel)deployment-planner (12)
Methode Pfad Auth
GET /api/v1/deployment-planner JWT Bearer
GET /api/v1/deployment-planner/absences JWT Bearer
POST /api/v1/deployment-planner/assignments JWT Bearer
DELETE /api/v1/deployment-planner/assignments/:id JWT Bearer
PATCH /api/v1/deployment-planner/assignments/:id JWT Bearer
POST /api/v1/deployment-planner/assignments/:id/split JWT Bearer
GET /api/v1/deployment-planner/employee-visibility JWT Bearer
PATCH /api/v1/deployment-planner/employee-visibility JWT Bearer
POST /api/v1/deployment-planner/resource-reservations JWT Bearer
DELETE /api/v1/deployment-planner/resource-reservations/:id JWT Bearer
PATCH /api/v1/deployment-planner/resource-reservations/:id JWT Bearer
GET /api/v1/deployment-planner/staffing-needs JWT Bearer
Einstellungen (Stundensätze)settings (23)
Methode Pfad Auth
GET /api/v1/settings/break-rules JWT Bearer
PATCH /api/v1/settings/break-rules JWT Bearer
GET /api/v1/settings/calculation-settings JWT Bearer
PATCH /api/v1/settings/calculation-settings JWT Bearer
GET /api/v1/settings/hourly-rate-defaults JWT Bearer
PATCH /api/v1/settings/hourly-rate-defaults JWT Bearer
GET /api/v1/settings/invoice-number-format JWT Bearer
PATCH /api/v1/settings/invoice-number-format JWT Bearer
GET /api/v1/settings/kpi-definitions JWT Bearer
PATCH /api/v1/settings/kpi-definitions/:code JWT Bearer
GET /api/v1/settings/margin-thresholds JWT Bearer
PATCH /api/v1/settings/margin-thresholds JWT Bearer
GET /api/v1/settings/project-number-format JWT Bearer
PATCH /api/v1/settings/project-number-format JWT Bearer
GET /api/v1/settings/project-statuses JWT Bearer
POST /api/v1/settings/project-statuses JWT Bearer
DELETE /api/v1/settings/project-statuses/:code JWT Bearer
PATCH /api/v1/settings/project-statuses/:code JWT Bearer
GET /api/v1/settings/ui-appearance Ohne JWT (Allowlist)
GET /api/v1/settings/weekly-standup JWT Bearer
PATCH /api/v1/settings/weekly-standup JWT Bearer
GET /api/v1/settings/work-week JWT Bearer
PATCH /api/v1/settings/work-week JWT Bearer
esign-requestsesign-requests (4)
Methode Pfad Auth
POST /api/v1/esign-requests JWT Bearer
GET /api/v1/esign-requests/:requestId/audit JWT Bearer
POST /api/v1/esign-requests/:requestId/complete-stub JWT Bearer
POST /api/v1/esign-requests/:requestId/retry JWT Bearer
Exportexports (15)
Methode Pfad Auth
GET /api/v1/exports/csv JWT Bearer
GET /api/v1/exports/datev JWT Bearer
GET /api/v1/exports/datev/customer-invoices.csv JWT Bearer
GET /api/v1/exports/datev/customers.csv JWT Bearer
GET /api/v1/exports/datev/incoming-invoices.csv JWT Bearer
GET /api/v1/exports/datev/payroll.csv JWT Bearer
GET /api/v1/exports/datev/subcontractors.csv JWT Bearer
GET /api/v1/exports/datev/suppliers.csv JWT Bearer
GET /api/v1/exports/datev/trip-log.csv JWT Bearer
GET /api/v1/exports/json JWT Bearer
GET /api/v1/exports/lexware-office/customer-invoices.csv JWT Bearer
GET /api/v1/exports/spdata JWT Bearer
GET /api/v1/exports/subcontractors.xlsx JWT Bearer
GET /api/v1/exports/timesheet JWT Bearer
GET /api/v1/exports/trip-log.xlsx JWT Bearer
Fahrtenbuchtrip-log (7)
Methode Pfad Auth
GET /api/v1/trip-log JWT Bearer
POST /api/v1/trip-log JWT Bearer
DELETE /api/v1/trip-log/:id JWT Bearer
GET /api/v1/trip-log/:id JWT Bearer
PATCH /api/v1/trip-log/:id JWT Bearer
POST /api/v1/trip-log/:id/confirm JWT Bearer
POST /api/v1/trip-log/:id/reject JWT Bearer
Field App (Monteur)field-app (23)
Methode Pfad Auth
POST /api/v1/service/field-app/absences JWT Bearer
GET /api/v1/service/field-app/articles/search JWT Bearer
GET /api/v1/service/field-app/assignments/:id JWT Bearer
GET /api/v1/service/field-app/assignments/:id/checklist JWT Bearer
PATCH /api/v1/service/field-app/assignments/:id/checklist JWT Bearer
GET /api/v1/service/field-app/assignments/:id/material-requests JWT Bearer
POST /api/v1/service/field-app/assignments/:id/material-requests JWT Bearer
POST /api/v1/service/field-app/assignments/:id/materials JWT Bearer
POST /api/v1/service/field-app/assignments/:id/photos JWT Bearer
GET /api/v1/service/field-app/assignments/:id/pick-list JWT Bearer
GET /api/v1/service/field-app/assignments/:id/planned-material JWT Bearer
POST /api/v1/service/field-app/assignments/:id/report JWT Bearer
POST /api/v1/service/field-app/assignments/:id/signature-link JWT Bearer
PATCH /api/v1/service/field-app/assignments/:id/status JWT Bearer
GET /api/v1/service/field-app/assignments/today JWT Bearer
GET /api/v1/service/field-app/materials JWT Bearer
PATCH /api/v1/service/field-app/pick-list-items/:itemId JWT Bearer
DELETE /api/v1/service/field-app/push/register JWT Bearer
POST /api/v1/service/field-app/push/register JWT Bearer
POST /api/v1/service/field-app/qr-scan JWT Bearer
POST /api/v1/service/field-app/sync JWT Bearer
POST /api/v1/service/field-app/time-entries JWT Bearer
GET /api/v1/service/field-app/time-entries/today JWT Bearer
GAEB (LV Import/Export)gaeb (1)
Methode Pfad Auth
GET /api/v1/gaeb/documents/:documentId JWT Bearer
Globale Suchesearch (1)
Methode Pfad Auth
GET /api/v1/search JWT Bearer
hourly-rateshourly-rates (3)
Methode Pfad Auth
GET /api/v1/hourly-rates JWT Bearer
POST /api/v1/hourly-rates JWT Bearer
PATCH /api/v1/hourly-rates/:id JWT Bearer
Importimports (8)
Methode Pfad Auth
GET /api/v1/imports JWT Bearer
GET /api/v1/imports/:id JWT Bearer
POST /api/v1/imports/csv JWT Bearer
POST /api/v1/imports/csv/confirm JWT Bearer
POST /api/v1/imports/customers-csv JWT Bearer
POST /api/v1/imports/datanorm JWT Bearer
POST /api/v1/imports/lexware-csv JWT Bearer
POST /api/v1/imports/preview JWT Bearer
Kalkulation & Steuercalculation (1)
Methode Pfad Auth
POST /api/v1/calculation/preview JWT Bearer
Kommunikationcommunications (6)
Methode Pfad Auth
GET /api/v1/communications JWT Bearer
POST /api/v1/communications JWT Bearer
GET /api/v1/communications/:id JWT Bearer
PATCH /api/v1/communications/:id JWT Bearer
POST /api/v1/communications/:id/queue JWT Bearer
GET /api/v1/communications/whatsapp/templates JWT Bearer
KPI-Dashboarddashboard (17)
Methode Pfad Auth
GET /api/v1/dashboard/department-utilization JWT Bearer
GET /api/v1/dashboard/executive-export JWT Bearer
GET /api/v1/dashboard/pipeline-book JWT Bearer
GET /api/v1/dashboard/projects JWT Bearer
GET /api/v1/dashboard/resource-overview JWT Bearer
GET /api/v1/dashboard/rolling-overview JWT Bearer
GET /api/v1/dashboard/summary JWT Bearer
GET /api/v1/dashboard/weekly-standup JWT Bearer
GET /api/v1/dashboard/weekly-standup/config JWT Bearer
PATCH /api/v1/dashboard/weekly-standup/config JWT Bearer
GET /api/v1/dashboard/weekly-standup/report-recipients JWT Bearer
PATCH /api/v1/dashboard/weekly-standup/report-recipients JWT Bearer
GET /api/v1/dashboard/weekly-standup/snapshots JWT Bearer
POST /api/v1/dashboard/weekly-standup/snapshots JWT Bearer
DELETE /api/v1/dashboard/weekly-standup/snapshots/:id JWT Bearer
GET /api/v1/dashboard/weekly-standup/snapshots/:id JWT Bearer
GET /api/v1/dashboard/weekly-standup/snapshots/:id/pdf JWT Bearer
Kunden (CRM)customers (13)
Methode Pfad Auth
GET /api/v1/customers JWT Bearer
POST /api/v1/customers JWT Bearer
DELETE /api/v1/customers/:id JWT Bearer
GET /api/v1/customers/:id JWT Bearer
PATCH /api/v1/customers/:id JWT Bearer
GET /api/v1/customers/:id/contacts JWT Bearer
POST /api/v1/customers/:id/contacts JWT Bearer
DELETE /api/v1/customers/:id/contacts/:contactId JWT Bearer
PATCH /api/v1/customers/:id/contacts/:contactId JWT Bearer
GET /api/v1/customers/address-search JWT Bearer
GET /api/v1/customers/check-number JWT Bearer
GET /api/v1/customers/export.xlsx JWT Bearer
GET /api/v1/customers/next-number JWT Bearer
Kundenportalcustomer-portal (19)
Methode Pfad Auth
GET /api/v1/customer-portal/bautagebuch Kundenportal-JWT
GET /api/v1/customer-portal/cockpit Kundenportal-JWT
GET /api/v1/customer-portal/invites JWT Bearer
POST /api/v1/customer-portal/invites JWT Bearer
DELETE /api/v1/customer-portal/invites/:id JWT Bearer
GET /api/v1/customer-portal/invites/:id JWT Bearer
PATCH /api/v1/customer-portal/invites/:id JWT Bearer
POST /api/v1/customer-portal/invites/:id/link JWT Bearer
POST /api/v1/customer-portal/invites/:id/send JWT Bearer
GET /api/v1/customer-portal/invoices Kundenportal-JWT
GET /api/v1/customer-portal/offers Kundenportal-JWT
GET /api/v1/customer-portal/offers/:offerId Kundenportal-JWT
POST /api/v1/customer-portal/offers/:offerId/accept Kundenportal-JWT
GET /api/v1/customer-portal/offers/:offerId/pdf Kundenportal-JWT
GET /api/v1/customer-portal/remote-support Kundenportal-JWT
DELETE /api/v1/customer-portal/remote-support/grant Kundenportal-JWT
POST /api/v1/customer-portal/remote-support/grant Kundenportal-JWT
DELETE /api/v1/customer-portal/session Kundenportal-Session
POST /api/v1/customer-portal/session Kundenportal-Session
Leadsleads (5)
Methode Pfad Auth
GET /api/v1/leads JWT Bearer
POST /api/v1/leads JWT Bearer
DELETE /api/v1/leads/:id JWT Bearer
GET /api/v1/leads/:id JWT Bearer
PATCH /api/v1/leads/:id JWT Bearer
Material & Lagermaterials (17)
Methode Pfad Auth
GET /api/v1/materials JWT Bearer
POST /api/v1/materials JWT Bearer
PATCH /api/v1/materials/:id JWT Bearer
GET /api/v1/materials/:id/supplier-prices JWT Bearer
GET /api/v1/materials/movements JWT Bearer
POST /api/v1/materials/movements JWT Bearer
GET /api/v1/materials/purchase-orders JWT Bearer
POST /api/v1/materials/purchase-orders JWT Bearer
GET /api/v1/materials/purchase-orders/:id JWT Bearer
PATCH /api/v1/materials/purchase-orders/:id JWT Bearer
GET /api/v1/materials/purchase-orders/:id/labels.pdf JWT Bearer
POST /api/v1/materials/purchase-orders/:id/receive JWT Bearer
POST /api/v1/materials/purchase-orders/scan-receive JWT Bearer
POST /api/v1/materials/purchase-orders/scan-resolve JWT Bearer
GET /api/v1/materials/reorder-alerts JWT Bearer
GET /api/v1/materials/supplier-invoices JWT Bearer
POST /api/v1/materials/supplier-invoices/import JWT Bearer
meme (27)
Methode Pfad Auth
GET /api/v1/me/absences JWT Bearer
POST /api/v1/me/absences JWT Bearer
POST /api/v1/me/absences/:id/cancel JWT Bearer
GET /api/v1/me/absences/:id/certificate JWT Bearer
POST /api/v1/me/absences/:id/certificate JWT Bearer
GET /api/v1/me/dashboard-overview JWT Bearer
GET /api/v1/me/deployments-today JWT Bearer
GET /api/v1/me/employee JWT Bearer
POST /api/v1/me/ics-token JWT Bearer
GET /api/v1/me/outlook JWT Bearer
DELETE /api/v1/me/outlook/connection JWT Bearer
GET /api/v1/me/outlook/oauth/authorize JWT Bearer
PATCH /api/v1/me/outlook/sync-preferences JWT Bearer
GET /api/v1/me/personal-todos JWT Bearer
POST /api/v1/me/personal-todos JWT Bearer
DELETE /api/v1/me/personal-todos/:id JWT Bearer
PATCH /api/v1/me/personal-todos/:id JWT Bearer
GET /api/v1/me/preferences JWT Bearer
PATCH /api/v1/me/preferences JWT Bearer
GET /api/v1/me/projects JWT Bearer
GET /api/v1/me/standup-todos JWT Bearer
PATCH /api/v1/me/standup-todos/:id JWT Bearer
GET /api/v1/me/time-correction-requests JWT Bearer
POST /api/v1/me/time-correction-requests JWT Bearer
POST /api/v1/me/time-entries JWT Bearer
GET /api/v1/me/time-summary JWT Bearer
GET /api/v1/me/time-summary/export.csv JWT Bearer
Mitarbeiteremployees (33)
Methode Pfad Auth
GET /api/v1/employees JWT Bearer
POST /api/v1/employees JWT Bearer
DELETE /api/v1/employees/:id JWT Bearer
GET /api/v1/employees/:id JWT Bearer
PATCH /api/v1/employees/:id JWT Bearer
POST /api/v1/employees/:id/ics-token JWT Bearer
GET /api/v1/employees/:id/labor-entries JWT Bearer
GET /api/v1/employees/calendar/:token.ics ICS-Token (URL)
GET /api/v1/employees/check-name JWT Bearer
GET /api/v1/employees/check-personnel-number JWT Bearer
GET /api/v1/employees/export.xlsx JWT Bearer
GET /api/v1/employees/hours-overview JWT Bearer
POST /api/v1/employees/import JWT Bearer
POST /api/v1/employees/import/commit JWT Bearer
GET /api/v1/employees/me/absences JWT Bearer
POST /api/v1/employees/me/absences JWT Bearer
POST /api/v1/employees/me/absences/:id/cancel JWT Bearer
GET /api/v1/employees/me/absences/:id/certificate JWT Bearer
POST /api/v1/employees/me/absences/:id/certificate JWT Bearer
GET /api/v1/employees/me/assignments JWT Bearer
GET /api/v1/employees/me/assignments/:assignmentId/checklist JWT Bearer
PATCH /api/v1/employees/me/assignments/:assignmentId/checklist JWT Bearer
GET /api/v1/employees/me/labor-entries JWT Bearer
POST /api/v1/employees/me/labor-entries JWT Bearer
GET /api/v1/employees/me/notifications JWT Bearer
POST /api/v1/employees/me/notifications/mark-read JWT Bearer
POST /api/v1/employees/me/offline-sync JWT Bearer
PUT /api/v1/employees/me/push-subscription JWT Bearer
GET /api/v1/employees/me/push-subscription/vapid-public-key JWT Bearer
POST /api/v1/employees/me/site-photos JWT Bearer
POST /api/v1/employees/me/time-entries JWT Bearer
GET /api/v1/employees/me/time-entries/today JWT Bearer
GET /api/v1/employees/role-definitions JWT Bearer
oauthoauth (2)
Methode Pfad Auth
GET /api/v1/oauth/lexware/authorize JWT Bearer
GET /api/v1/oauth/lexware/callback Ohne JWT (Allowlist)
Öffentliche Terminbuchungpublic-booking (11)
Methode Pfad Auth
GET /api/v1/public-booking/:slug Öffentlich (Turnstile)
POST /api/v1/public-booking/:slug/book Öffentlich (Turnstile)
GET /api/v1/public-booking/:slug/slots Öffentlich (Turnstile)
POST /api/v1/public-booking/cancel Öffentlich (Turnstile)
GET /api/v1/public-booking/links JWT Bearer
POST /api/v1/public-booking/links JWT Bearer
PATCH /api/v1/public-booking/links/:linkId JWT Bearer
GET /api/v1/public-booking/links/:linkId/audit JWT Bearer
GET /api/v1/public-booking/links/:linkId/slots JWT Bearer
POST /api/v1/public-booking/links/:linkId/slots JWT Bearer
PATCH /api/v1/public-booking/links/:linkId/slots/:slotId/release JWT Bearer
offer-templatesoffer-templates (5)
Methode Pfad Auth
GET /api/v1/offer-templates JWT Bearer
POST /api/v1/offer-templates JWT Bearer
DELETE /api/v1/offer-templates/:id JWT Bearer
GET /api/v1/offer-templates/:id JWT Bearer
PATCH /api/v1/offer-templates/:id JWT Bearer
Outlook / Kalenderoutlook (5)
Methode Pfad Auth
DELETE /api/v1/outlook/connections/:employeeId JWT Bearer
GET /api/v1/outlook/connections/:employeeId JWT Bearer
PATCH /api/v1/outlook/connections/:employeeId/sync-preferences JWT Bearer
GET /api/v1/outlook/oauth/authorize JWT Bearer
GET /api/v1/outlook/oauth/callback OAuth-Redirect
Projekte & Aufträgeprojects (147)
Methode Pfad Auth
GET /api/v1/projects JWT Bearer
POST /api/v1/projects JWT Bearer
DELETE /api/v1/projects/:id JWT Bearer
GET /api/v1/projects/:id JWT Bearer
PATCH /api/v1/projects/:id JWT Bearer
GET /api/v1/projects/:id/amendments JWT Bearer
POST /api/v1/projects/:id/amendments JWT Bearer
DELETE /api/v1/projects/:id/amendments/:amendmentId JWT Bearer
PATCH /api/v1/projects/:id/amendments/:amendmentId JWT Bearer
GET /api/v1/projects/:id/budget-status JWT Bearer
GET /api/v1/projects/:id/checklist-items JWT Bearer
POST /api/v1/projects/:id/checklist-items JWT Bearer
DELETE /api/v1/projects/:id/checklist-items/:itemId JWT Bearer
PATCH /api/v1/projects/:id/checklist-items/:itemId JWT Bearer
GET /api/v1/projects/:id/cloud-folder/files JWT Bearer
GET /api/v1/projects/:id/cloud-folder/files/content JWT Bearer
POST /api/v1/projects/:id/cloud-folder/sync JWT Bearer
POST /api/v1/projects/:id/cloud-folder/test JWT Bearer
GET /api/v1/projects/:id/construction-phases JWT Bearer
PATCH /api/v1/projects/:id/construction-phases JWT Bearer
GET /api/v1/projects/:id/cost-summary JWT Bearer
GET /api/v1/projects/:id/customer-invoices JWT Bearer
POST /api/v1/projects/:id/customer-invoices JWT Bearer
DELETE /api/v1/projects/:id/customer-invoices/:invoiceId JWT Bearer
PATCH /api/v1/projects/:id/customer-invoices/:invoiceId JWT Bearer
POST /api/v1/projects/:id/customer-invoices/:invoiceId/follow-up JWT Bearer
POST /api/v1/projects/:id/customer-invoices/:invoiceId/lexware/pull-payment JWT Bearer
POST /api/v1/projects/:id/customer-invoices/:invoiceId/lexware/push JWT Bearer
GET /api/v1/projects/:id/customer-invoices/:invoiceId/pdf JWT Bearer
GET /api/v1/projects/:id/customer-invoices/:invoiceId/zugferd JWT Bearer
GET /api/v1/projects/:id/customer-invoices/:invoiceId/zugferd.pdf JWT Bearer
POST /api/v1/projects/:id/customer-invoices/from-measurements JWT Bearer
GET /api/v1/projects/:id/documents JWT Bearer
POST /api/v1/projects/:id/documents JWT Bearer
DELETE /api/v1/projects/:id/documents/:documentId JWT Bearer
GET /api/v1/projects/:id/documents/:documentId/cloud-link JWT Bearer
GET /api/v1/projects/:id/documents/:documentId/content JWT Bearer
GET /api/v1/projects/:id/ema-maintenance-records JWT Bearer
POST /api/v1/projects/:id/ema-maintenance-records JWT Bearer
GET /api/v1/projects/:id/ema-maintenance-records/:recordId JWT Bearer
PATCH /api/v1/projects/:id/ema-maintenance-records/:recordId JWT Bearer
GET /api/v1/projects/:id/ema-maintenance-records/:recordId/pdf JWT Bearer
GET /api/v1/projects/:id/events JWT Bearer
GET /api/v1/projects/:id/export/gaeb JWT Bearer
POST /api/v1/projects/:id/field-photos JWT Bearer
GET /api/v1/projects/:id/gaeb/documents JWT Bearer
DELETE /api/v1/projects/:id/gaeb/documents/:documentId JWT Bearer
POST /api/v1/projects/:id/gaeb/documents/:documentId/commit-lv JWT Bearer
GET /api/v1/projects/:id/gaeb/documents/:documentId/commit-preview JWT Bearer
GET /api/v1/projects/:id/gaeb/import-jobs/:jobId JWT Bearer
POST /api/v1/projects/:id/import/gaeb JWT Bearer
POST /api/v1/projects/:id/import/lv JWT Bearer
POST /api/v1/projects/:id/import/lv/commit JWT Bearer
POST /api/v1/projects/:id/import/lv/ollama-preview JWT Bearer
GET /api/v1/projects/:id/inspection-records JWT Bearer
POST /api/v1/projects/:id/inspection-records JWT Bearer
PATCH /api/v1/projects/:id/inspection-records/:recordId JWT Bearer
GET /api/v1/projects/:id/inspection-records/:recordId/protocol JWT Bearer
GET /api/v1/projects/:id/kpi-history JWT Bearer
GET /api/v1/projects/:id/labor-billings JWT Bearer
POST /api/v1/projects/:id/labor-billings JWT Bearer
GET /api/v1/projects/:id/labor-entries JWT Bearer
POST /api/v1/projects/:id/labor-entries JWT Bearer
GET /api/v1/projects/:id/labor-plans JWT Bearer
PATCH /api/v1/projects/:id/labor-plans JWT Bearer
DELETE /api/v1/projects/:id/lv-positions JWT Bearer
GET /api/v1/projects/:id/lv-positions JWT Bearer
POST /api/v1/projects/:id/lv-positions JWT Bearer
PATCH /api/v1/projects/:id/lv-positions/:lvId JWT Bearer
GET /api/v1/projects/:id/maintenance-contracts JWT Bearer
POST /api/v1/projects/:id/maintenance-contracts JWT Bearer
GET /api/v1/projects/:id/maintenance-contracts/:contractId JWT Bearer
PATCH /api/v1/projects/:id/maintenance-contracts/:contractId JWT Bearer
POST /api/v1/projects/:id/maintenance-contracts/:contractId/billing-draft JWT Bearer
GET /api/v1/projects/:id/maintenance-contracts/:contractId/contract.pdf JWT Bearer
POST /api/v1/projects/:id/maintenance-contracts/:contractId/esign-request JWT Bearer
GET /api/v1/projects/:id/material-entries JWT Bearer
POST /api/v1/projects/:id/material-entries JWT Bearer
PATCH /api/v1/projects/:id/material-entries/:materialId JWT Bearer
GET /api/v1/projects/:id/material-plan JWT Bearer
POST /api/v1/projects/:id/material-plan JWT Bearer
DELETE /api/v1/projects/:id/material-plan/:planLineId JWT Bearer
PATCH /api/v1/projects/:id/material-plan/:planLineId JWT Bearer
POST /api/v1/projects/:id/material-plan/create-purchase-order JWT Bearer
POST /api/v1/projects/:id/material-plan/import-offer JWT Bearer
POST /api/v1/projects/:id/material-plan/reserve JWT Bearer
POST /api/v1/projects/:id/material-plan/supplier-quote-import JWT Bearer
POST /api/v1/projects/:id/material-plan/supplier-quote-import/confirm JWT Bearer
GET /api/v1/projects/:id/material-requests JWT Bearer
PATCH /api/v1/projects/:id/material-requests/:requestId JWT Bearer
POST /api/v1/projects/:id/material-requests/:requestId/fulfill-all JWT Bearer
PATCH /api/v1/projects/:id/material-requests/:requestId/lines/:lineId JWT Bearer
GET /api/v1/projects/:id/material-requests/:requestId/pdf JWT Bearer
GET /api/v1/projects/:id/material-reservations JWT Bearer
POST /api/v1/projects/:id/material-reservations JWT Bearer
GET /api/v1/projects/:id/measurement-reports JWT Bearer
POST /api/v1/projects/:id/measurement-reports JWT Bearer
DELETE /api/v1/projects/:id/measurement-reports/:reportId JWT Bearer
GET /api/v1/projects/:id/measurement-reports/:reportId JWT Bearer
PATCH /api/v1/projects/:id/measurement-reports/:reportId JWT Bearer
GET /api/v1/projects/:id/measurement-reports/:reportId/pdf JWT Bearer
GET /api/v1/projects/:id/measurement-reports/summary JWT Bearer
GET /api/v1/projects/:id/measurements JWT Bearer
POST /api/v1/projects/:id/measurements JWT Bearer
DELETE /api/v1/projects/:id/measurements/:measurementId JWT Bearer
PATCH /api/v1/projects/:id/measurements/:measurementId JWT Bearer
GET /api/v1/projects/:id/messages JWT Bearer
POST /api/v1/projects/:id/messages JWT Bearer
PATCH /api/v1/projects/:id/next-action JWT Bearer
POST /api/v1/projects/:id/offers/from-lv JWT Bearer
GET /api/v1/projects/:id/participants JWT Bearer
GET /api/v1/projects/:id/performance-status JWT Bearer
PATCH /api/v1/projects/:id/pick-list-items/:itemId JWT Bearer
GET /api/v1/projects/:id/pick-lists JWT Bearer
POST /api/v1/projects/:id/pick-lists JWT Bearer
GET /api/v1/projects/:id/schedule-deviation JWT Bearer
GET /api/v1/projects/:id/service-reminders JWT Bearer
GET /api/v1/projects/:id/service-tickets JWT Bearer
POST /api/v1/projects/:id/service-tickets JWT Bearer
PATCH /api/v1/projects/:id/service-tickets/:ticketId JWT Bearer
GET /api/v1/projects/:id/service-tickets/:ticketId/audit JWT Bearer
PATCH /api/v1/projects/:id/standup JWT Bearer
POST /api/v1/projects/:id/standup/appointments JWT Bearer
DELETE /api/v1/projects/:id/standup/appointments/:itemId JWT Bearer
PATCH /api/v1/projects/:id/standup/appointments/:itemId JWT Bearer
POST /api/v1/projects/:id/standup/copy-week-assignments JWT Bearer
POST /api/v1/projects/:id/standup/planned-assignments JWT Bearer
POST /api/v1/projects/:id/standup/todos JWT Bearer
DELETE /api/v1/projects/:id/standup/todos/:itemId JWT Bearer
PATCH /api/v1/projects/:id/standup/todos/:itemId JWT Bearer
PATCH /api/v1/projects/:id/traffic-override JWT Bearer
GET /api/v1/projects/:id/work-orders JWT Bearer
POST /api/v1/projects/:id/work-orders JWT Bearer
PATCH /api/v1/projects/:id/work-orders/:ticketId JWT Bearer
GET /api/v1/projects/:id/work-orders/:ticketId/audit JWT Bearer
PATCH /api/v1/projects/:projectId/customer-invoices/:invoiceId/portal-release JWT Bearer
PATCH /api/v1/projects/:projectId/documents/:documentId/portal-release JWT Bearer
GET /api/v1/projects/:projectId/esign-requests JWT Bearer
PATCH /api/v1/projects/:projectId/portal/cockpit JWT Bearer
PATCH /api/v1/projects/bulk/status JWT Bearer
PATCH /api/v1/projects/bulk/traffic JWT Bearer
GET /api/v1/projects/export.xlsx JWT Bearer
POST /api/v1/projects/import JWT Bearer
POST /api/v1/projects/import/commit JWT Bearer
GET /api/v1/projects/next-number JWT Bearer
GET /api/v1/projects/number-format JWT Bearer
GET /api/v1/projects/status-definitions JWT Bearer
public-offerpublic-offer (3)
Methode Pfad Auth
GET /api/v1/public-offer/:token Ohne JWT (Allowlist)
POST /api/v1/public-offer/:token/accept Ohne JWT (Allowlist)
GET /api/v1/public-offer/:token/pdf Ohne JWT (Allowlist)
PV-Anlagenpv-installations (6)
Methode Pfad Auth
GET /api/v1/pv-installations JWT Bearer
POST /api/v1/pv-installations JWT Bearer
DELETE /api/v1/pv-installations/:id JWT Bearer
GET /api/v1/pv-installations/:id JWT Bearer
PATCH /api/v1/pv-installations/:id JWT Bearer
POST /api/v1/pv-installations/:id/generate-pdf JWT Bearer
RBAC / Berechtigungenrbac (22)
Methode Pfad Auth
GET /api/v1/rbac/delegations JWT Bearer
POST /api/v1/rbac/delegations JWT Bearer
DELETE /api/v1/rbac/delegations/:id JWT Bearer
GET /api/v1/rbac/departments JWT Bearer
POST /api/v1/rbac/departments JWT Bearer
DELETE /api/v1/rbac/departments/:departmentId JWT Bearer
PATCH /api/v1/rbac/departments/:departmentId JWT Bearer
DELETE /api/v1/rbac/departments/:departmentId/logo JWT Bearer
GET /api/v1/rbac/departments/:departmentId/logo JWT Bearer
POST /api/v1/rbac/departments/:departmentId/logo JWT Bearer
GET /api/v1/rbac/employee-roles JWT Bearer
POST /api/v1/rbac/employee-roles JWT Bearer
DELETE /api/v1/rbac/employee-roles/:code JWT Bearer
PATCH /api/v1/rbac/employee-roles/:code JWT Bearer
GET /api/v1/rbac/me JWT Bearer
GET /api/v1/rbac/permissions JWT Bearer
GET /api/v1/rbac/roles JWT Bearer
PUT /api/v1/rbac/roles/:fachRolle JWT Bearer
PATCH /api/v1/rbac/roles/matrix JWT Bearer
POST /api/v1/rbac/roles/reset JWT Bearer
GET /api/v1/rbac/users/:userId JWT Bearer
PATCH /api/v1/rbac/users/:userId JWT Bearer
remote-supportremote-support (3)
Methode Pfad Auth
POST /api/v1/remote-support/remote-support/sessions/:sessionId/sync JWT Bearer
GET /api/v1/remote-support/service-orders/:serviceOrderId/remote-support/sessions JWT Bearer
POST /api/v1/remote-support/service-orders/:serviceOrderId/remote-support/sessions JWT Bearer
Service & Wartungservice (22)
Methode Pfad Auth
GET /api/v1/service/maintenance-contracts JWT Bearer
POST /api/v1/service/maintenance-contracts JWT Bearer
DELETE /api/v1/service/maintenance-contracts/:id JWT Bearer
GET /api/v1/service/maintenance-contracts/:id JWT Bearer
PATCH /api/v1/service/maintenance-contracts/:id JWT Bearer
POST /api/v1/service/maintenance-contracts/:id/billing-draft JWT Bearer
POST /api/v1/service/maintenance-contracts/:id/esign-request JWT Bearer
POST /api/v1/service/maintenance-contracts/:id/generate-pdf JWT Bearer
POST /api/v1/service/maintenance-contracts/:id/signature JWT Bearer
GET /api/v1/service/orders JWT Bearer
POST /api/v1/service/orders JWT Bearer
DELETE /api/v1/service/orders/:id JWT Bearer
GET /api/v1/service/orders/:id JWT Bearer
PATCH /api/v1/service/orders/:id JWT Bearer
POST /api/v1/service/orders/:id/checklist-items JWT Bearer
DELETE /api/v1/service/orders/:id/checklist-items/:itemId JWT Bearer
PATCH /api/v1/service/orders/:id/checklist-items/:itemId JWT Bearer
GET /api/v1/service/orders/:id/protocol.pdf JWT Bearer
POST /api/v1/service/orders/:id/reminders JWT Bearer
DELETE /api/v1/service/orders/:id/reminders/:reminderId JWT Bearer
PATCH /api/v1/service/orders/:id/status JWT Bearer
GET /api/v1/service/project-service-tickets JWT Bearer
Setup-Wizardsetup (5)
Methode Pfad Auth
POST /api/v1/setup/audit-step Setup-Token (VOLT_SETUP_TOKEN)
POST /api/v1/setup/complete Setup-Token (VOLT_SETUP_TOKEN)
GET /api/v1/setup/status Setup-Token (VOLT_SETUP_TOKEN)
POST /api/v1/setup/test-backup Setup-Token (VOLT_SETUP_TOKEN)
POST /api/v1/setup/validate-token Setup-Token (VOLT_SETUP_TOKEN)
Subunternehmersubcontractors (22)
Methode Pfad Auth
GET /api/v1/subcontractors JWT Bearer
POST /api/v1/subcontractors JWT Bearer
DELETE /api/v1/subcontractors/:id JWT Bearer
GET /api/v1/subcontractors/:id JWT Bearer
PATCH /api/v1/subcontractors/:id JWT Bearer
GET /api/v1/subcontractors/:id/contacts JWT Bearer
POST /api/v1/subcontractors/:id/contacts JWT Bearer
DELETE /api/v1/subcontractors/:id/contacts/:contactId JWT Bearer
PATCH /api/v1/subcontractors/:id/contacts/:contactId JWT Bearer
GET /api/v1/subcontractors/:id/framework-contracts JWT Bearer
POST /api/v1/subcontractors/:id/framework-contracts JWT Bearer
DELETE /api/v1/subcontractors/:id/framework-contracts/:contractId JWT Bearer
PATCH /api/v1/subcontractors/:id/framework-contracts/:contractId JWT Bearer
GET /api/v1/subcontractors/:id/workers JWT Bearer
POST /api/v1/subcontractors/:id/workers JWT Bearer
DELETE /api/v1/subcontractors/:id/workers/:workerId JWT Bearer
PATCH /api/v1/subcontractors/:id/workers/:workerId JWT Bearer
GET /api/v1/subcontractors/next-number JWT Bearer
GET /api/v1/subcontractors/project-assignments JWT Bearer
POST /api/v1/subcontractors/project-assignments JWT Bearer
DELETE /api/v1/subcontractors/project-assignments/:id JWT Bearer
PATCH /api/v1/subcontractors/project-assignments/:id JWT Bearer
supplierssuppliers (20)
Methode Pfad Auth
GET /api/v1/suppliers JWT Bearer
POST /api/v1/suppliers JWT Bearer
GET /api/v1/suppliers/:id JWT Bearer
PATCH /api/v1/suppliers/:id JWT Bearer
GET /api/v1/suppliers/:id/contacts JWT Bearer
POST /api/v1/suppliers/:id/contacts JWT Bearer
DELETE /api/v1/suppliers/:id/contacts/:contactId JWT Bearer
PATCH /api/v1/suppliers/:id/contacts/:contactId JWT Bearer
POST /api/v1/suppliers/:id/ids/import-cart JWT Bearer
POST /api/v1/suppliers/:id/ids/session JWT Bearer
POST /api/v1/suppliers/:id/oci/import-cart JWT Bearer
GET /api/v1/suppliers/:id/oci/return Ohne JWT (Allowlist)
POST /api/v1/suppliers/:id/oci/return Ohne JWT (Allowlist)
POST /api/v1/suppliers/:id/oci/session JWT Bearer
POST /api/v1/suppliers/:id/sync/comnorm JWT Bearer
POST /api/v1/suppliers/:id/sync/ids JWT Bearer
POST /api/v1/suppliers/:id/test/:target JWT Bearer
POST /api/v1/suppliers/from-preset JWT Bearer
GET /api/v1/suppliers/meta/catalog-gateway-status JWT Bearer
GET /api/v1/suppliers/presets JWT Bearer
Telefonietelephony (16)
Methode Pfad Auth
GET /api/v1/telephony/callback-tasks JWT Bearer
PATCH /api/v1/telephony/callback-tasks/:id JWT Bearer
POST /api/v1/telephony/callback-tasks/schedule JWT Bearer
GET /api/v1/telephony/calls JWT Bearer
POST /api/v1/telephony/calls JWT Bearer
DELETE /api/v1/telephony/calls/:id JWT Bearer
GET /api/v1/telephony/calls/:id JWT Bearer
PATCH /api/v1/telephony/calls/:id JWT Bearer
POST /api/v1/telephony/calls/:id/callback-tasks JWT Bearer
GET /api/v1/telephony/calls/:id/transcript JWT Bearer
PATCH /api/v1/telephony/calls/:id/transcript JWT Bearer
GET /api/v1/telephony/cti/monitor-targets Ohne JWT (Allowlist)
POST /api/v1/telephony/dial JWT Bearer
GET /api/v1/telephony/live JWT Bearer
GET /api/v1/telephony/lookup JWT Bearer
POST /api/v1/telephony/webhook Ohne JWT (Allowlist)
Terminplanungscheduling (5)
Methode Pfad Auth
POST /api/v1/scheduling/assignments JWT Bearer
DELETE /api/v1/scheduling/assignments/:id JWT Bearer
PATCH /api/v1/scheduling/assignments/:id JWT Bearer
POST /api/v1/scheduling/assignments/:id/split JWT Bearer
GET /api/v1/scheduling/slots JWT Bearer
Vertragsverlängerungenrenewals (6)
Methode Pfad Auth
GET /api/v1/renewals JWT Bearer
POST /api/v1/renewals JWT Bearer
DELETE /api/v1/renewals/:id JWT Bearer
GET /api/v1/renewals/:id JWT Bearer
PATCH /api/v1/renewals/:id JWT Bearer
POST /api/v1/renewals/:id/schedule-reminder JWT Bearer
Webhooks (extern)webhooks (5)
Methode Pfad Auth
POST /api/v1/webhooks/esign Webhook-Secret (Header)
POST /api/v1/webhooks/lexware Webhook-Secret (Header)
POST /api/v1/webhooks/telephony Webhook-Secret (Header)
GET /api/v1/webhooks/whatsapp Webhook-Secret (Header)
POST /api/v1/webhooks/whatsapp Webhook-Secret (Header)
Werkzeugetools (6)
Methode Pfad Auth
GET /api/v1/tools JWT Bearer
POST /api/v1/tools JWT Bearer
DELETE /api/v1/tools/:id JWT Bearer
GET /api/v1/tools/:id JWT Bearer
PATCH /api/v1/tools/:id JWT Bearer
POST /api/v1/tools/:id/maintenance-queue JWT Bearer
wikiwiki (2)
Methode Pfad Auth
GET /api/v1/wiki/articles JWT Bearer
GET /api/v1/wiki/articles/:slug JWT Bearer

About

Modulares ERP für Elektrohandwerk (reichhard) — Fastify, React, PostgreSQL, Lexware Office-Anbindung, DSGVO-Hosting DE

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors