Add architecture module map

This commit is contained in:
2026-06-15 09:58:33 +02:00
parent 39d936cfba
commit c6b5a0572c
19 changed files with 1134 additions and 2372 deletions
+41 -54
View File
@@ -1,6 +1,8 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/webhook_throttle.php';
header('Content-Type: application/json; charset=utf-8');
function json_response(int $status, array $payload): void
@@ -252,6 +254,31 @@ function derive_label_webhook_url(array $localEnv): string
return $root . '/webhook/naurua_erp_adressetikette';
}
function derive_excel_webhook_url(array $localEnv): string
{
$explicit = env_value('N8N_EXCEL_WEBHOOK_URL', $localEnv);
if ($explicit !== '') {
return $explicit;
}
$legacy = env_value('N8N_OUTBOUND_URL_ADRESSE', $localEnv);
if ($legacy !== '' && str_contains(strtolower($legacy), 'excel_befuellen')) {
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/excel_befuellen';
}
function post_json(string $url, array $payload, array $headers = [], int $timeoutSeconds = 15): array
{
$body = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
@@ -348,62 +375,21 @@ function trigger_shipping_label_flow(array $order, array $localEnv): array
];
}
function trigger_excel_webhook(PDO $pdo, int $orderId, array $localEnv): array
function trigger_excel_webhook(string $externalRef, array $localEnv): array
{
$url = env_value('N8N_OUTBOUND_URL_ADRESSE', $localEnv);
if ($url === '' || strpos($url, 'excel_befuellen') === false) {
$url = derive_excel_webhook_url($localEnv);
if ($url === '') {
return [
'enabled' => false,
'ok' => false,
'message' => 'Excel webhook URL not configured or incorrect (must contain "excel_befuellen")',
'message' => 'Excel webhook URL not configured',
];
}
// SQL Query for all Excel data (without comments for n8n compatibility)
$sql = "
SELECT
so.external_ref AS \"Bestellnummer\",
TO_CHAR(so.order_date, 'YYYY-MM-DD\"T\"HH24:MI:SS') AS \"Bestelldatum\",
TO_CHAR(so.shipping_date, 'YYYY-MM-DD') AS \"Versanddatum\",
COALESCE(ad.first_name, '') AS \"Vorname\",
COALESCE(ad.last_name, '') AS \"Nachname\",
COALESCE(ad.street, '') AS \"Strasse\",
COALESCE(ad.house_number, '') AS \"Hausnummer\",
COALESCE(ad.zip, '') AS \"PLZ\",
COALESCE(ad.city, '') AS \"Stadt\",
COALESCE(ad.country_name, '') AS \"Land\",
COALESCE(pm.code, '') AS \"Zahlungsart\",
COALESCE(so.amount_net, 0) AS \"Gesamtbetrag_netto\",
COALESCE(so.amount_shipping, 0) AS \"Versandkosten\",
COALESCE(so.total_amount, 0) AS \"Gesamtbetrag_brutto\",
COALESCE(so.amount_discount, 0) AS \"Rabatt\",
COALESCE(SUM(CASE WHEN p.id = 8 THEN a.qty ELSE 0 END), 0) AS \"#_ChagaFlaschen\",
COALESCE(SUM(CASE WHEN p.id = 5 THEN a.qty ELSE 0 END), 0) AS \"#_ReishiFlaschen\",
COALESCE(SUM(CASE WHEN p.id = 9 THEN a.qty ELSE 0 END), 0) AS \"#_ShiitakeFlaschen\",
COALESCE(SUM(CASE WHEN p.id = 6 THEN a.qty ELSE 0 END), 0) AS \"#_LionsManeFlaschen\"
FROM sales_order so
LEFT JOIN address ad ON so.party_id = ad.party_id AND ad.type = 'shipping'
LEFT JOIN payment_method pm ON so.payment_method_id = pm.id
LEFT JOIN sales_order_line sol ON so.id = sol.sales_order_id
LEFT JOIN sales_order_line_lot_allocation a ON sol.id = a.sales_order_line_id
LEFT JOIN product p ON a.product_id = p.id AND p.status = 'active'
WHERE so.id = :order_id
GROUP BY so.id, ad.id, pm.id
";
$stmt = $pdo->prepare($sql);
$stmt->execute([':order_id' => $orderId]);
$data = $stmt->fetch();
if (!$data) {
return [
'enabled' => true,
'ok' => false,
'message' => 'Order data not found or no product allocations',
];
}
// Authentication headers (same mechanism as shipping_label_flow)
$payload = [
'Bestellnummer' => $externalRef,
];
$headers = [];
$secret = env_value('N8N_WEBHOOK_SECRET', $localEnv);
if ($secret !== '') {
@@ -412,9 +398,10 @@ function trigger_excel_webhook(PDO $pdo, int $orderId, array $localEnv): array
$headers['X-API-Key'] = $secret;
$headers['Authorization'] = 'Bearer ' . $secret;
}
$result = post_json($url, $data, $headers, 20);
throttle_webhook_channel('excel', 10);
$result = post_json($url, $payload, $headers, 20);
return [
'enabled' => true,
'ok' => $result['ok'],
@@ -1597,7 +1584,7 @@ try {
$pdo->commit();
$labelTrigger = trigger_shipping_label_flow($data, $env);
$excelTrigger = trigger_excel_webhook($pdo, $orderId, $env);
$excelTrigger = trigger_excel_webhook($externalRef, $env);
json_response(200, [
'ok' => true,