TaskMonkey Handbuch

Rezept: Eingangsrechnungen automatisch verbuchen

Rechnungs-PDFs per Mail rein → Daten extrahieren, in Dropbox archivieren, Buchungssatz vorbereiten.

Eingangsrechnungen sind ein perfekter Email-Task: kommen per Mail rein, haben PDF-Anhang, müssen klassifiziert, archiviert und verbucht werden. Komplette Automation in 4 Tools + 1 Email-Prompt.

Ziel

  • Lieferant schickt Rechnung an mein-workspace@taskmonkey-mails.de
  • Plattform extrahiert Lieferant, Datum, Betrag, USt
  • PDF wandert in Dropbox unter /Eingangsrechnungen/<JJJJ-MM>/
  • Buchungssatz mit Vorschlag landet im Buchhaltungs-Tool
  • Bestätigung per Mail an die Buchhaltung

Voraussetzungen

  • Eine eigene Workspace-Email-Adresse (Betreiber einrichten lassen)
  • Dropbox-OAuth-Verbindung (/manage/o-auth-connections)
  • Optional: Tool/API zur Buchhaltungs-Software (DATEV, lexoffice, sevDesk)

1. Tool: PDF-Daten extrahieren

tools/buchhaltung/extractInvoice.php:

<?php
return [
    'tools' => [
        'extractInvoice' => [
            'description' => 'Extrahiert Rechnungs-Stammdaten aus dem Text einer PDF-Rechnung.',
            'parameters' => [
                'type' => 'object',
                'properties' => [
                    'pdfText' => [
                        'type' => 'string',
                        'description' => 'Volltext der Rechnung. Kann <PDF:key> sein.',
                    ],
                ],
                'required' => ['pdfText'],
            ],
            'handler' => function (array $results, array $args, array $ctx): array {
                $logger = $ctx['logger'];
                $text = $args['pdfText'];

                $supplier = preg_match('/(?:Lieferant|Absender|Von):?\s*(.+)/i', $text, $m) ? trim($m[1]) : null;
                $date = preg_match('/(?:Rechnungsdatum|Datum):?\s*(\d{2}\.\d{2}\.\d{4})/i', $text, $m) ? $m[1] : null;
                $invoiceNo = preg_match('/Rechnung(?:s\s*-?\s*nummer|s\s*-?\s*nr\.?)?:?\s*([A-Z0-9\-\/]+)/i', $text, $m) ? $m[1] : null;
                $gross = preg_match('/(?:Gesamtbetrag|Brutto|Summe):?\s*([\d.,]+)\s*€?/i', $text, $m) ? $m[1] : null;

                $logger->info("Extrahiert: {$supplier}, {$date}, {$gross} €");

                return [
                    'supplier' => $supplier,
                    'invoice_date' => $date,
                    'invoice_number' => $invoiceNo,
                    'gross_amount' => $gross,
                ];
            },
        ],
    ],
];

(Pragmatische Regex-Variante. Für robustere Extraktion: das Modell die PDF direkt lesen lassen oder eine spezialisierte API einbinden.)

2. Tool: in Dropbox archivieren

tools/buchhaltung/archiveInvoice.php:

<?php
return [
    'tools' => [
        'archiveInvoice' => [
            'description' => 'Speichert die Original-Rechnungs-PDF in Dropbox unter /Eingangsrechnungen/<JJJJ-MM>/.',
            'parameters' => [
                'type' => 'object',
                'properties' => [
                    'fileName' => ['type' => 'string'],
                    'pdfBase64' => ['type' => 'string', 'description' => 'PDF als Base64'],
                    'invoiceDate' => ['type' => 'string', 'description' => 'YYYY-MM-DD oder DD.MM.YYYY'],
                    'supplier' => ['type' => 'string'],
                ],
                'required' => ['fileName', 'pdfBase64', 'invoiceDate', 'supplier'],
            ],
            'handler' => function (array $results, array $args, array $ctx): array {
                $date = strtotime(str_replace('.', '-', $args['invoiceDate'])) ?: time();
                $month = date('Y-m', $date);
                $supplier = preg_replace('/[^a-z0-9_-]/i', '_', $args['supplier']);
                $path = "/Eingangsrechnungen/{$month}/{$supplier}_{$args['fileName']}";

                return $ctx['runTool']('uploadToDropbox', [
                    'path' => $path,
                    'content' => base64_decode($args['pdfBase64']),
                ]);
            },
        ],
    ],
];

3. Tool: Buchungssatz anlegen

tools/buchhaltung/createBookingEntry.php:

<?php
return [
    'tools' => [
        'createBookingEntry' => [
            'description' => 'Legt einen Buchungssatz im Buchhaltungssystem an.',
            'parameters' => [
                'type' => 'object',
                'properties' => [
                    'supplier' => ['type' => 'string'],
                    'invoiceNumber' => ['type' => 'string'],
                    'invoiceDate' => ['type' => 'string'],
                    'grossAmount' => ['type' => 'number'],
                    'category' => ['type' => 'string', 'description' => 'Kostenstelle/Konto, z. B. "Bürobedarf"'],
                    'archiveUrl' => ['type' => 'string'],
                ],
                'required' => ['supplier', 'invoiceDate', 'grossAmount'],
            ],
            'api' => 'buchhaltung',
            'method' => 'POST',
            'path' => 'entries',
            'body' => [
                'supplier' => '{supplier}',
                'document_no' => '{invoiceNumber}',
                'date' => '{invoiceDate}',
                'amount' => '{grossAmount}',
                'category' => '{category}',
                'archive_link' => '{archiveUrl}',
            ],
        ],
    ],
];

4. Email-Prompt

email.php:

<?php
return [
    'email.prompt' => <<<PROMPT
    Du bist der Eingangsrechnungs-Assistent.

    Bei jeder eingehenden Mail prüfst du, ob ein PDF-Anhang vorhanden
    ist, der eine Rechnung sein könnte (Stichworte: "Rechnung",
    "Invoice", "Bill" im Body oder Anhang-Namen).

    Ablauf bei Rechnungs-Mails:
    1. extractInvoice mit dem PDF-Text aufrufen
    2. archiveInvoice — PDF in Dropbox ablegen
    3. createBookingEntry mit den extrahierten Daten und einer
       sinnvollen Kategorie anlegen (basierend auf Lieferant und
       Rechnungstext: Bürobedarf, IT-Dienstleistungen, Telekom,
       Reisekosten, etc.)

    Bei nicht-Rechnungs-Mails: kurze Zusammenfassung — kein Tool-Aufruf.

    Antworte am Ende mit einer kurzen Notiz, was du gemacht hast.
    Keine Bestätigungsmail an den Absender — das passiert nicht.
    PROMPT,
];

5. Tool-Allowlist

Ergänze in derselben email.php:

<?php
return [
    'email.tools' => [
        'extractInvoice',
        'archiveInvoice',
        'createBookingEntry',
        'uploadToDropbox',
    ],
];

6. Testen

  • Mit einer Test-Rechnung an die Workspace-Adresse senden
  • tm monitor zeigt: MAIL extractInvoice → archiveInvoice → createBookingEntry
  • Dropbox prüfen: PDF liegt unter /Eingangsrechnungen/2026-04/
  • Buchhaltungs-System: neuer Eintrag mit Vorschlag

Erweiterungen

  • Doppelt-Erkennung: vor createBookingEntry ein Tool findExistingEntry, das nach invoice_number sucht
  • Eskalation bei Unsicherheit: wenn extractInvoice keinen Betrag findet → Mail an Buchhaltung statt automatisch verbuchen
  • OCR für Bild-Rechnungen: PDF mit eingescanntem Text — das Modell direkt sehen lassen, ohne Regex
  • Genehmigungs-Workflow: bei Beträgen > X: erst Slack-Nachricht an GL, Verbuchung erst nach Bestätigung
Zuletzt aktualisiert: 2026-04-20