Send invoice data to Excel webhook

This commit is contained in:
2026-06-16 18:38:33 +02:00
parent a814fbafcc
commit eee2b87a48
+98 -2
View File
@@ -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'];