From eee2b87a48ee39aece85e7fd6670de5a0a2b1c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Tue, 16 Jun 2026 18:38:33 +0200 Subject: [PATCH] Send invoice data to Excel webhook --- modules/erp/import-integration/service.php | 100 ++++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/modules/erp/import-integration/service.php b/modules/erp/import-integration/service.php index 49d13fe..6e00d14 100644 --- a/modules/erp/import-integration/service.php +++ b/modules/erp/import-integration/service.php @@ -110,6 +110,76 @@ function build_n8n_webhook_headers(array $localEnv): array return $headers; } +function load_excel_order_payload(PDO $pdo, int $orderId): array +{ + $stmt = $pdo->prepare( + "SELECT + so.external_ref, + so.order_date, + so.order_source, + so.order_status, + so.payment_status, + p.name AS party_name, + p.email AS party_email, + a.first_name, + a.last_name, + a.company_name, + a.street, + a.house_number, + a.zip, + a.city, + a.country_name, + a.country_iso2 + FROM sales_order so + LEFT JOIN party p ON p.id = so.party_id + LEFT JOIN LATERAL ( + SELECT * + FROM address + WHERE party_id = so.party_id + AND type = 'billing' + ORDER BY id DESC + LIMIT 1 + ) a ON TRUE + WHERE so.id = :order_id + LIMIT 1" + ); + $stmt->execute([':order_id' => $orderId]); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + if (!is_array($row)) { + return []; + } + + $firstName = trim((string) ($row['first_name'] ?? '')); + $lastName = trim((string) ($row['last_name'] ?? '')); + $companyName = trim((string) ($row['company_name'] ?? '')); + $partyName = trim((string) ($row['party_name'] ?? '')); + $fullName = trim($firstName . ' ' . $lastName); + if ($fullName === '') { + $fullName = $partyName !== '' ? $partyName : $companyName; + } + + return [ + 'Bestellnummer' => (string) ($row['external_ref'] ?? ''), + 'Name' => $fullName, + 'Vorname' => $firstName, + 'Nachname' => $lastName, + 'Firmenname' => $companyName !== '' ? $companyName : $partyName, + 'Email' => trim((string) ($row['party_email'] ?? '')), + 'Rechnungsadresse' => [ + 'Vorname' => $firstName, + 'Nachname' => $lastName, + 'Firmenname' => $companyName !== '' ? $companyName : $partyName, + 'Strasse' => trim((string) ($row['street'] ?? '')), + 'Hausnummer' => trim((string) ($row['house_number'] ?? '')), + 'PLZ' => trim((string) ($row['zip'] ?? '')), + 'Ort' => trim((string) ($row['city'] ?? '')), + 'Land' => trim((string) ($row['country_name'] ?? '')), + 'LandIso2' => trim((string) ($row['country_iso2'] ?? '')), + 'Email' => trim((string) ($row['party_email'] ?? '')), + ], + ]; +} + function trigger_shipping_label_flow(array $order, array $localEnv): array { $url = derive_label_webhook_url($localEnv); @@ -171,7 +241,7 @@ function dispatch_order_import_webhooks(PDO $pdo, array $localEnv, int $limit = $pdo->beginTransaction(); $stmt = $pdo->query( - "SELECT id, payload, attempt_count + "SELECT id, aggregate_id, payload, attempt_count FROM outbound_webhook_event WHERE event_type = 'order.imported' AND status IN ('pending', 'failed') @@ -227,7 +297,33 @@ function dispatch_order_import_webhooks(PDO $pdo, array $localEnv, int $limit = } throttle_webhook_channel('excel', 5); - $result = post_json($url, ['Bestellnummer' => $externalRef], $headers, 20); + $payload = load_excel_order_payload($pdo, (int) $event['aggregate_id']); + if ($payload === []) { + $update = $pdo->prepare( + "UPDATE outbound_webhook_event + SET status = 'dead_letter', + last_attempt_at = NOW(), + last_error = :last_error, + next_attempt_at = NOW(), + attempt_count = :attempt_count + WHERE id = :id" + ); + $update->execute([ + ':last_error' => 'Could not build Excel payload from order data', + ':attempt_count' => $attemptCount, + ':id' => $eventId, + ]); + + $pdo->commit(); + $summary['processed']++; + $summary['failed']++; + $summary['deadLetter']++; + $summary['ok'] = false; + $summary['message'] = 'Could not build Excel payload from order data'; + continue; + } + + $result = post_json($url, $payload, $headers, 20); $summary['processed']++; $summary['status'] = $result['status'];