Auto-trigger shipping label flow after successful order import
This commit is contained in:
121
order-import.php
121
order-import.php
@@ -227,6 +227,124 @@ function ensure_required_tables_exist(PDO $pdo): void
|
||||
}
|
||||
}
|
||||
|
||||
function derive_label_webhook_url(array $localEnv): string
|
||||
{
|
||||
$explicit = env_value('N8N_LABEL_WEBHOOK_URL', $localEnv);
|
||||
if ($explicit !== '') {
|
||||
return $explicit;
|
||||
}
|
||||
|
||||
$legacy = env_value('N8N_OUTBOUND_URL_ADRESSE', $localEnv);
|
||||
if ($legacy !== '' && str_contains(strtolower($legacy), 'adressetikette')) {
|
||||
return $legacy;
|
||||
}
|
||||
|
||||
$base = env_value('N8N_BASE_URL', $localEnv);
|
||||
if ($base === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$root = preg_replace('#/api/v1/?$#', '', rtrim($base, '/'));
|
||||
if (!is_string($root) || $root === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $root . '/webhook/naurua_erp_adressetikette';
|
||||
}
|
||||
|
||||
function post_json(string $url, array $payload, array $headers = [], int $timeoutSeconds = 15): array
|
||||
{
|
||||
$body = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
if ($body === false) {
|
||||
return ['ok' => false, 'status' => 0, 'body' => '', 'error' => 'Could not encode payload'];
|
||||
}
|
||||
|
||||
$headerLines = ['Content-Type: application/json'];
|
||||
foreach ($headers as $name => $value) {
|
||||
if ($name === '' || $value === '') {
|
||||
continue;
|
||||
}
|
||||
$headerLines[] = $name . ': ' . $value;
|
||||
}
|
||||
|
||||
$context = stream_context_create([
|
||||
'http' => [
|
||||
'method' => 'POST',
|
||||
'header' => implode("\r\n", $headerLines),
|
||||
'content' => $body,
|
||||
'timeout' => $timeoutSeconds,
|
||||
'ignore_errors' => true,
|
||||
],
|
||||
]);
|
||||
|
||||
$responseBody = @file_get_contents($url, false, $context);
|
||||
$responseHeaders = $http_response_header ?? [];
|
||||
|
||||
$status = 0;
|
||||
if (isset($responseHeaders[0]) && preg_match('#HTTP/\S+\s+(\d{3})#', $responseHeaders[0], $m) === 1) {
|
||||
$status = (int) $m[1];
|
||||
}
|
||||
|
||||
if ($responseBody === false) {
|
||||
$responseBody = '';
|
||||
}
|
||||
|
||||
return [
|
||||
'ok' => $status >= 200 && $status < 300,
|
||||
'status' => $status,
|
||||
'body' => substr($responseBody, 0, 500),
|
||||
'error' => ($status === 0) ? 'Request failed or timed out' : '',
|
||||
];
|
||||
}
|
||||
|
||||
function trigger_shipping_label_flow(array $order, array $localEnv): array
|
||||
{
|
||||
$url = derive_label_webhook_url($localEnv);
|
||||
if ($url === '') {
|
||||
return [
|
||||
'enabled' => false,
|
||||
'ok' => false,
|
||||
'message' => 'Label webhook URL not configured',
|
||||
];
|
||||
}
|
||||
|
||||
$payload = [
|
||||
'BestellungNr' => (string) ($order['BestellungNr'] ?? ''),
|
||||
'Vorname_LfAdr' => (string) ($order['Vorname_LfAdr'] ?? $order['Vorname'] ?? ''),
|
||||
'Nachname_LfAdr' => (string) ($order['Nachname_LfAdr'] ?? $order['Nachname'] ?? ''),
|
||||
'Strasse_LfAdr' => (string) ($order['Strasse_LfAdr'] ?? $order['Strasse'] ?? ''),
|
||||
'Hausnummer_LfAdr' => (string) ($order['Hausnummer_LfAdr'] ?? $order['Hausnummer'] ?? ''),
|
||||
'PLZ_LfAdr' => (string) ($order['PLZ_LfAdr'] ?? $order['PLZ'] ?? ''),
|
||||
'Stadt_LfAdr' => (string) ($order['Stadt_LfAdr'] ?? $order['Stadt'] ?? ''),
|
||||
'Land_LfAdr' => (string) ($order['Land_LfAdr'] ?? $order['Land'] ?? ''),
|
||||
// Also include flat keys to be compatible with both mapping and direct template usage.
|
||||
'Vorname' => (string) ($order['Vorname_LfAdr'] ?? $order['Vorname'] ?? ''),
|
||||
'Nachname' => (string) ($order['Nachname_LfAdr'] ?? $order['Nachname'] ?? ''),
|
||||
'Strasse' => (string) ($order['Strasse_LfAdr'] ?? $order['Strasse'] ?? ''),
|
||||
'Hausnummer' => (string) ($order['Hausnummer_LfAdr'] ?? $order['Hausnummer'] ?? ''),
|
||||
'PLZ' => (string) ($order['PLZ_LfAdr'] ?? $order['PLZ'] ?? ''),
|
||||
'Stadt' => (string) ($order['Stadt_LfAdr'] ?? $order['Stadt'] ?? ''),
|
||||
'Land' => (string) ($order['Land_LfAdr'] ?? $order['Land'] ?? ''),
|
||||
];
|
||||
|
||||
$headers = [];
|
||||
$secret = env_value('N8N_WEBHOOK_SECRET', $localEnv);
|
||||
if ($secret !== '') {
|
||||
$headers['X-Webhook-Secret'] = $secret;
|
||||
}
|
||||
|
||||
$result = post_json($url, $payload, $headers, 20);
|
||||
|
||||
return [
|
||||
'enabled' => true,
|
||||
'ok' => $result['ok'],
|
||||
'status' => $result['status'],
|
||||
'url' => $url,
|
||||
'message' => $result['ok'] ? 'Label flow triggered' : ($result['error'] !== '' ? $result['error'] : 'Label flow returned non-2xx'),
|
||||
'responseBody' => $result['body'],
|
||||
];
|
||||
}
|
||||
|
||||
function find_or_create_party(PDO $pdo, array $data): int
|
||||
{
|
||||
$email = trim((string) ($data['EmailKunde'] ?? ''));
|
||||
@@ -459,11 +577,14 @@ try {
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
$labelTrigger = trigger_shipping_label_flow($data, $env);
|
||||
|
||||
json_response(200, [
|
||||
'ok' => true,
|
||||
'orderId' => $orderId,
|
||||
'externalRef' => $externalRef,
|
||||
'lineItemsImported' => $insertedLines,
|
||||
'labelTrigger' => $labelTrigger,
|
||||
]);
|
||||
} catch (Throwable $e) {
|
||||
if (isset($pdo) && $pdo instanceof PDO && $pdo->inTransaction()) {
|
||||
|
||||
Reference in New Issue
Block a user