Files
EKDOS/docs/N8N.md
T
Kyle Müller 7d82e807fc
EK-DOS-WEB bauen und ausrollen / frontend (push) Failing after 22s
EK-DOS-WEB bauen und ausrollen / backend (push) Failing after 27s
EK-DOS-WEB bauen und ausrollen / deploy (push) Skipped
Initial
2026-09-06 13:25:44 +02:00

110 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# n8n-Schnittstelle
Alle Fachdaten von EK-DOS-WEB liegen in n8n. Das Backend hält davon nichts vor
ausser einem kurzlebigen Cache.
## Adressen
Der n8n-Hauptdienst auf **Port 5678** ist ausschliesslich über
`https://n8n.elektro-krueger.eu` erreichbar. Jeder weitere n8n-Dienst auf einem
anderen Port ist nicht veröffentlicht und wird über **10.0.11.131** angesprochen.
In `backend/src/N8n/Endpoints.php`:
```php
$url->webhook('/offene-tickets'); // https://n8n.elektro-krueger.eu/webhook/ek-dos-web/offene-tickets
$url->internal(5679, '/webhook/irgendwas'); // http://10.0.11.131:5679/webhook/irgendwas
```
Neue Adressen gehören in diese Klasse, nicht verstreut in die Controller.
## Endpunkte
Alle unter `/webhook/ek-dos-web`. Die Spalte *Cache* nennt Gruppe sowie frische
und Rückfall-Haltbarkeit in Sekunden.
| Pfad | Verwendung | Cache |
| ----------------------------------- | -------------------------------- | ------------------------ |
| `/offene-tickets` | Ticketliste | `tickets` 15 / 600 |
| `/offene-tickets/kundenruecksprache`| Ergebnis speichern | schreibend |
| `/tickets/digitale-akte` | PDF | – |
| `/tickets/servicebericht` | PDF | – |
| `/angebote` | Angebotsliste | `offers` 30 / 600 |
| `/angebote/versendet` `/beauftragt` `/zuruecksetzen` `/loeschen` | Aktionen | schreibend |
| `/kundenstamm` | Kundenliste, Anlage, Änderung | `customers` 120 / 1800 |
| `/kundenstamm/digitale-akte` | PDF | – |
| `/rechnungen` | Rechnungen eines Kunden | `invoices` 30 / 600 |
| `/rechnungen/alle` | Gesamtübersicht (geschützt) | `invoices` 30 / 600 |
| `/rechnungen/zuordnen` `/sync` | Zuordnung, Abgleich (geschützt) | schreibend |
| `/rechnungen/pdf` | PDF | – |
| `/rechnungen-anfertigen` | Aufgabenliste | `invoices-create` 30/600 |
| `/rechnungen-anfertigen/erledigt` | Aufgabe abschließen | schreibend |
| `/rechnungen-pruefen` | Prüfliste | `invoices-review` 30/600 |
| `/rechnungen-versenden` | Versandliste und -bestätigung | `invoices-send` 30/600 |
| `/digitale-akte` | PDF als base64 im JSON | |
| `/interne-aufgaben` (+ `/erledigt` `/bearbeiten` `/loeschen`) | Aufgaben | `tasks` 20 / 600 |
| `/online-kaeufe` (+ `/erledigt` `/loeschen`) | Online-Käufe | `purchases` 30 / 600 |
| `/stundennachweise` | Monatsreport | `hours` 300 / 3600 |
## Geteilte Geheimnisse
| Kopfzeile | aus | wofür |
| -------------------------- | ------------------------- | ------------------------------------------------------------ |
| `x-ekdos-invoice-sync` | `N8N_INVOICE_SYNC_SECRET` | Rechnungsübersicht, Zuordnung, Abgleich, Kundenanlage, Angebot zurücksetzen |
| `X-EK-DOS-Customer-Key` | `N8N_CUSTOMER_KEY` | Lesen und Ändern im Kundenstamm |
| `x-ekdos-webhook-secret` | `N8N_REFRESH_SECRET` | n8n meldet EK-DOS eine Ticketänderung |
Fehlt eines davon, antworten die betroffenen Routen mit **503** und einer
Meldung, die genau das sagt -- sie schlagen nicht stumm fehl.
> Der Kundenschlüssel stand in der Next.js-Fassung als Literal im Quelltext
> (`app/api/customers/route.ts`). Er liegt jetzt in `.env`. **Er sollte in n8n
> gewechselt werden**, weil der alte Wert in der Versionsgeschichte steht.
## n8n meldet eine Ticketänderung
Der Workflow *Datenübergabe an EK-DOS-WEB* darf weiter auf seinen Endpunkt
zeigen, nur ohne Port:
```
POST https://schulung.elektro-krueger.local/api/tickets/refresh
x-ekdos-webhook-secret: <N8N_REFRESH_SECRET>
```
Anders als früher ist das kein Platzhalter mehr. In der Next.js-Fassung
antwortete die Route nur `{ok:true}` und tat sonst nichts; die Oberfläche sah
neue Tickets rein zufällig beim nächsten 20-Sekunden-Takt. Jetzt **verwirft der
Aufruf den Ticket-Cache**, sodass die nächste Abfrage die neuen Daten garantiert
sieht.
Ohne gesetztes `N8N_REFRESH_SECRET` verlangt die Route eine angemeldete Sitzung
und weist den Aufruf aus n8n mit 401 ab.
## Feldabbildung Tickets
Die einzige Stelle, an der das Backend n8n-Felder umbenennt
(`backend/src/Relay/TicketsController.php`):
| n8n | Oberfläche |
| -------------------------------- | ------------------------------ |
| `ticketnummer` / `id` | `id` |
| `kunde` / `customer` | `customer` |
| `liegenschaft` / `property` | `property` |
| `letzter_servicebericht_status` | `reportStatus` |
| `fortsetzung` | `continuation` |
| `entscheidung_code` | `decisionCode` |
| `kundenruecksprache_ergebnis` | `consultationResult` |
| `kundenruecksprache_am` / `_von` | `consultationUpdatedAt` / `By` |
`requiresCustomerConsultation` wird abgeleitet: entweder
`entscheidung_code === "TEILERLEDIGUNG_RUECKSPRACHE_KUNDE"`, oder der
Fortsetzungstext enthält „nimmt mit Kunden für das weitere Vorgehen Kontakt auf".
Zeilen ohne Ticketnummer werden verworfen.
## Bekannte Kopplung
Interne Aufgaben kennen in n8n genau zwei Empfänger: `sascha` und `svenja`. Ein
drittes EK-DOS-Konto kann sich anmelden und alle Ansichten nutzen, aber noch
keine Aufgaben zugewiesen bekommen. Dafür müsste der n8n-Workflow *Interne
Aufgaben* einen freien Empfängerschlüssel annehmen.