Send invoice data to Excel webhook
This commit is contained in:
@@ -110,6 +110,76 @@ function build_n8n_webhook_headers(array $localEnv): array
|
|||||||
return $headers;
|
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
|
function trigger_shipping_label_flow(array $order, array $localEnv): array
|
||||||
{
|
{
|
||||||
$url = derive_label_webhook_url($localEnv);
|
$url = derive_label_webhook_url($localEnv);
|
||||||
@@ -171,7 +241,7 @@ function dispatch_order_import_webhooks(PDO $pdo, array $localEnv, int $limit =
|
|||||||
$pdo->beginTransaction();
|
$pdo->beginTransaction();
|
||||||
|
|
||||||
$stmt = $pdo->query(
|
$stmt = $pdo->query(
|
||||||
"SELECT id, payload, attempt_count
|
"SELECT id, aggregate_id, payload, attempt_count
|
||||||
FROM outbound_webhook_event
|
FROM outbound_webhook_event
|
||||||
WHERE event_type = 'order.imported'
|
WHERE event_type = 'order.imported'
|
||||||
AND status IN ('pending', 'failed')
|
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);
|
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['processed']++;
|
||||||
$summary['status'] = $result['status'];
|
$summary['status'] = $result['status'];
|
||||||
|
|||||||
Reference in New Issue
Block a user