Digitaler Rechnungseingang (Invoice-Intake)
Zweck
Der digitale Rechnungseingang ist ein öffentliches Portal (/rechnungseingang, ohne Login), über das Lieferanten — oder Sie selbst — E-Rechnungen einreichen. SpeamCore prüft die Datei normkonform nach EN 16931 (XRechnung/ZUGFeRD) und legt bei Annahme automatisch eine Eingangsrechnung (documentType = 'incomingInvoice') samt Lieferant und Positionen an. Diese erscheint anschließend zur Freigabe im Cockpit und wird nach dem Verbuchen zum offenen Posten in den Verbindlichkeiten.
Das Feature hat drei Bausteine:
| Baustein | Route / Endpoint | Zugang |
|---|---|---|
| Einreich-Portal | /rechnungseingang | öffentlich (kein Login) |
| Konfiguration | /settings/rechnungseingang | Admin (Settings) |
| Eingereichte Rechnungen | GET /invoice-intake-submissions | InvoiceIntakeSubmission:view |
Das öffentliche Portal
So sieht das Einreich-Portal aus (Beispiel-Mandant „Speam"):

Aufbau der Seite:
- Kopf: Titel „Digitaler Rechnungseingang" mit kurzer Anleitung (Datei hochladen, in Sekunden prüfen, dann einreichen).
- Karte „Akzeptierte Formate": XRechnung (UBL / CII) und ZUGFeRD / Factur-X (PDF).
- Karte „Pflichtangaben": zeigt die vom Mandanten geforderten Pflichtfelder, z. B. Käuferreferenz / Bestellreferenz (BT-10) — konfigurierbar (siehe Konfiguration).
- Karte „Rechnung prüfen & einreichen": Drag-&-Drop-Feld („Datei hierher ziehen oder klicken (XML / PDF)") plus zwei Buttons:
- Prüfen — validiert die Datei (Vorabprüfung), ohne sie zu speichern.
- Einreichen — erst nach erfolgreicher Prüfung freigeschaltet („Bitte zuerst ‚Prüfen'. Das Einreichen wird nach erfolgreicher Prüfung freigegeben.").
- FAQ „Gut zu wissen": Aufklapp-Fragen rund um die E-Rechnung (Was ist eine E-Rechnung? · Warum? · Welche Angaben sind nötig? · Wie läuft die Prüfung? · Was passiert nach dem Einreichen?).
- Fuß: Impressum / Datenschutzerklärung / AGB; Hinweis „Prüfung nach EN 16931 und XRechnung (KoSIT). Das Ergebnis ist eine Vorabprüfung." sowie „powered by SpeamCore".
Voraussetzungen
Berechtigungen (CASL)
| Action | Subject | Wirkung |
|---|---|---|
| — | — | Einreichen (/rechnungseingang, check/submit) ist öffentlich, ohne Anmeldung |
view | FE_Settings, Settings | Konfigurationsseite aufrufbar |
update | Settings | Portal-Konfiguration speichern (Formate, Regeln, aktiv/inaktiv) |
view | InvoiceIntakeSubmission | Liste/Detail der eingereichten Rechnungen einsehen |
Schritt-für-Schritt — eine E-Rechnung einreichen
-
Portal öffnen (
/rechnungseingang) — ohne Login erreichbar. -
Datei wählen (XRechnung-XML, ZUGFeRD-PDF). Über Prüfen (
POST /public-invoice-intake/check) wird die Datei nur validiert (noch nicht gespeichert) — das Ergebnis zeigt Format und etwaige Fehler. -
Ist die Rechnung angenommen, über Einreichen (
POST /public-invoice-intake/submit) absenden. -
SpeamCore speichert die Einreichung (
InvoiceIntakeSubmission) und legt bei Annahme automatisch an:- den Lieferanten (anhand USt-IdNr./Name; bestehender wird wiederverwendet),
- eine Eingangsrechnung (
PurchaseDocument,incomingInvoice) mit Positionen, hergeleitetem Zahlungsziel und vorbelegtem Aufwandskonto, - die Verknüpfung zur Bestellung, falls eine Bestellreferenz (
purchaseOrderReference) angegeben ist.
Zwei Feinheiten der Auto-Anlage (seit Juni 2026): Das Zahlungsziel wird, wenn es nicht strukturiert in der E-Rechnung steht, aus dem Freitext-Zahlungshinweis abgeleitet (z. B. „Innerhalb 14 Tagen" → 14 Tage; ohne Skonto). Beim Übernehmen der Positionen wird als Verkaufspreis automatisch der Einkaufspreis + 10 % angesetzt (
VK = EK × 1,10) — als Vorbelegung, jederzeit überschreibbar. -
Die neue Eingangsrechnung erscheint im Cockpit (Tab Eingangsrechnungen) zur Prüfung und Freigabe.
Validierung (EN 16931 / XRechnung)
Die Prüfung läuft in drei Stufen; jede liefert eine Liste von Befunden (issues):
| Stufe | Feld | Prüft |
|---|---|---|
| Schema | schema | Ist die Datei wohlgeformt und schema-valide (UBL/CII)? |
| Geschäftsregeln | businessRules | EN-16931-/XRechnung-Geschäftsregeln (Schematron). |
| Annahme | acceptance | Mandanten-Annahmeregeln aus der Konfiguration. |
Erkannte Formate: xrechnung-ubl, xrechnung-cii, zugferd — nicht erkennbare Dateien werden als unknown abgewiesen. Das Gesamtergebnis ist accepted (true/false); der Datensatz erhält status = 'accepted' bzw. 'rejected'.
Felder — InvoiceIntakeSubmission
Jede Einreichung wird protokolliert (read-only):
| Feldname | Datentyp | Bedeutung |
|---|---|---|
format | String | Erkanntes Format (xrechnung-ubl / xrechnung-cii / zugferd / unknown). |
status | String | accepted oder rejected. |
invoiceNumber | String | Rechnungsnummer aus der E-Rechnung. |
issueDate | String | Rechnungsdatum. |
currency | String | Währung. |
sellerName / sellerTaxId / sellerEmail | String | Lieferanten-Stammdaten aus der Rechnung. |
sellerEndpointId / buyerEndpointId | String | Leitweg-/Endpoint-IDs (Peppol/Leitweg). |
buyerReference | String | Käufer-Referenz (z. B. Leitweg-ID). |
purchaseOrderReference | String | Bestellreferenz — verknüpft die Rechnung mit der Bestellung. |
submitterEmail | String | E-Mail des Einreichenden. |
purchaseDocumentId | UUID | Verweis auf die erzeugte Eingangsrechnung. |
issues | JSON | Validierungsreport (schema / businessRules / acceptance). |
Konfiguration (/settings/rechnungseingang)
Admins konfigurieren das Portal unter Einstellungen → Rechnungseingang (eigener Tab neben Allgemeine Daten, Firmeneinstellungen, Öffentliche Seiten u. a.). Gespeichert wird über PUT /public-invoice-intake/config (update:Settings).
Folgende Optionen gibt es (verifiziert an SettingsInvoiceIntakePage.tsx):
| Einstellung | Feld | Wirkung |
|---|---|---|
| Seite aktivieren | enabled | Schaltet das öffentliche Portal an/aus (erreichbar unter /rechnungseingang). Ist es aus, ist die Seite nicht aufrufbar. |
| Einleitungstext | introText | Freitext, der oben auf dem Portal angezeigt wird (z. B. eigene Hinweise an Lieferanten). |
| Alle Postfächer scannen | scanAllMailboxesForInvoices | Wenn aktiv, durchsucht der Rechnungseingang alle konfigurierten Postfächer nach E-Rechnungen (statt nur eines designierten). |
Akzeptierte Formate — welche E-Rechnungs-Formate angenommen werden:
| Format | Hinweis |
|---|---|
| XRechnung (UBL / CII) | Standard-XML-Formate. |
| ZUGFeRD / Factur-X (PDF) | Hybrid-PDF mit eingebettetem XML. |
| PEPPOL | nur Infomaterial (kein direkter Upload-Kanal). |
Akzeptanzregeln (Pflichtfelder) — welche Angaben eine eingereichte Rechnung zwingend enthalten muss; fehlt eine aktivierte Pflichtangabe, wird die Rechnung in der acceptance-Stufe abgewiesen:
| Regel | Feld | Pflichtangabe |
|---|---|---|
| Käuferreferenz (BT-10) | requireBuyerReference | Leitweg-/Käufer-Referenz. |
| Leitweg-ID / EndpointID (BT-49) | requireLeitwegId | Empfänger-Endpoint (Peppol/Leitweg). |
| Bestellnummer (BT-13) | requirePurchaseOrder | Bestellreferenz (verknüpft die Rechnung mit der Bestellung). |
| IBAN (BT-84) und USt-IdNr. (BT-31) | requireIbanAndTaxId | Bank- und Steuerangaben. |
Über Seite öffnen ↗ (nur bei aktiver Seite) gelangt man direkt zum Portal; Speichern schreibt die Konfiguration.
Workflow — vom Upload zum offenen Posten
Verknüpfungen zu anderen Modulen
- Einkaufsbelege — erzeugte Eingangsrechnung (
incomingInvoice). - Transaktions-Cockpit — Prüfung + Freigabe der Eingangsrechnung.
- Verbindlichkeiten — offener Posten nach dem Verbuchen.
- Lieferanten — werden bei Annahme automatisch angelegt/zugeordnet.
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/public-invoice-intake | Portal-Konfiguration (öffentlich) | — |
POST | /api/public-invoice-intake/check | Datei nur validieren (kein Speichern) | — |
POST | /api/public-invoice-intake/submit | Einreichen: validieren, speichern, Eingangsrechnung anlegen | — |
PUT | /api/public-invoice-intake/config | Portal konfigurieren | update Settings |
GET | /api/invoice-intake-submissions | Liste der Einreichungen | view InvoiceIntakeSubmission |
GET | /api/invoice-intake-submissions/:id | Einzelne Einreichung | view InvoiceIntakeSubmission |
Häufige Fehler und Lösungen
| Fehler | Lösung |
|---|---|
| „Format unknown / abgewiesen" | Datei ist keine valide XRechnung/ZUGFeRD — beim Lieferanten ein normkonformes Format (UBL/CII) anfordern. |
| Rechnung angenommen, aber keine Eingangsrechnung sichtbar | Im Cockpit Tab Eingangsrechnungen prüfen; ggf. view:PurchaseDocument fehlt. |
Geschäftsregel-Fehler (businessRules) | Pflichtangaben der E-Rechnung fehlen (z. B. Leitweg-ID, USt-IdNr.) — der issues-Report nennt die konkrete Regel. |
| Portal nicht erreichbar | Unter /settings/rechnungseingang aktivieren (update:Settings). |
Versionshinweise
- 2026-06-22: Aktivierungszeitpunkt (
scanToInvoiceActivatedAt) dokumentiert — Postfach-Scan zieht nur Mails ab dem Aktivierungszeitpunkt ein, ältere werden übersprungen (before-activation). Verifiziert anmailbox.model.ts,mailToInvoiceIntake.service.ts. - 2026-06-12: Konfig-Option „Alle Postfächer scannen" (
scanAllMailboxesForInvoices) und Hinweis zur asynchronen Verarbeitung über deninvoice-intake-Hintergrund-Worker ergänzt. Verifiziert aninvoice-intake-worker.ts. - 2026-06-03 (nachmittags): Konfigurations-Optionen vollständig dokumentiert (Seite aktivieren, Einleitungstext, Akzeptierte Formate inkl. PEPPOL-Infomaterial, Akzeptanzregeln BT-10/BT-49/BT-13/BT-84+BT-31) — verifiziert an
SettingsInvoiceIntakePage.tsx. Echter Screenshot des öffentlichen Portals (Mandant „Speam") + Abschnitt „Das öffentliche Portal" mit den realen UI-Elementen. Klarstellung Doku-Seite ↔ App-Portal. - 2026-06-03 (Nacht-Drop): Initiale Veröffentlichung. Öffentliches Einreich-Portal (
/rechnungseingang), EN-16931-/XRechnung-Validierung (3-stufig: schema/businessRules/acceptance), Auto-Anlage Lieferant + Eingangsrechnung, Admin-Konfiguration + Submissions-Liste. Verifiziert aninvoiceIntake.router.ts,invoiceIntake.controller.ts,incomingInvoice.service.ts,invoiceIntakeSubmission.model.ts.