Files
erp_naurua/docs/N8N_POSTGRES_NODE.md
T
gitea_admin 0d8353fb9c Implement Excel webhook integration
Features:
- Migration 0007: shipping_date column with automatic next-business-day calculation
- New function trigger_excel_webhook() in order-import.php
- SQL query for extracting Excel data from ERP database
- Integration after successful order import
- Documentation for n8n Postgres node configuration

Changes:
1. db/migrations/0007_phase1_excel_webhook.sql - adds shipping_date column, trigger, next-business-day function
2. order-import.php - adds trigger_excel_webhook() function and integration point
3. docs/EXAKTE_POSTGRES_QUERY.sql - exact SQL query for n8n Postgres node
4. docs/N8N_POSTGRES_QUERY.md - comprehensive documentation
5. docs/N8N_POSTGRES_NODE.* - n8n node configurations
6. docs/N8N_EXCEL_WORKFLOW.json - complete workflow JSON
7. docs/N8N_NODE_COPY_PASTE.md - copy-paste ready instructions

The implementation triggers an Excel webhook after every successful order import, sending all necessary data for Excel bookkeeping to n8n.
2026-04-06 21:23:50 +02:00

4.3 KiB

n8n Postgres Node Konfiguration

Database Connection

Name: ERP Naurua Database
Host: 192.168.1.199
Port: 55432
Database: naurua_erp
User: codex_db_user
Password: Ze90re0KAry8gyJ6eAx0Gf4IelEGI
SSL: Disabled

Node Parameter

Operation

Execute Query

Query

SELECT 
    -- Bestellinformationen
    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",
    
    -- Kundenadresse (Lieferadresse)
    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",
    
    -- Zahlungs- und Betragsinformationen
    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",
    
    -- Produktzählungen (nur aktive Produkte)
    COALESCE(SUM(CASE WHEN p.id = 8 THEN a.qty ELSE 0 END), 0) AS "#_ChagaFlaschen",      -- CHAGA (ID 8)
    COALESCE(SUM(CASE WHEN p.id = 5 THEN a.qty ELSE 0 END), 0) AS "#_ReishiFlaschen",     -- 003.01 (ID 5)
    COALESCE(SUM(CASE WHEN p.id = 9 THEN a.qty ELSE 0 END), 0) AS "#_ShiitakeFlaschen",   -- SHIITAKE (ID 9)
    COALESCE(SUM(CASE WHEN p.id = 6 THEN a.qty ELSE 0 END), 0) AS "#_LionsManeFlaschen"   -- 005.02 (ID 6)
    
FROM sales_order so
-- Lieferadresse
LEFT JOIN address ad ON so.party_id = ad.party_id AND ad.type = 'shipping'
-- Zahlungsart
LEFT JOIN payment_method pm ON so.payment_method_id = pm.id
-- Bestellpositionen und Allokationen
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
-- Produkte (nur aktive)
LEFT JOIN product p ON a.product_id = p.id AND p.status = 'active'

WHERE so.external_ref = $1
GROUP BY so.id, ad.id, pm.id

Query Values

{
  "values": {
    "value": "={{ $json.Bestellnummer }}",
    "string": "={{ $json.Bestellnummer }}"
  }
}

Options

{
  "maxRows": 1
}

Workflow Integration

Flow

Webhook → Postgres Node → Excel Node

Webhook Input

{
  "Bestellnummer": "10477"
}

Expected Output

{
  "Bestellnummer": "10477",
  "Bestelldatum": "2026-04-05T23:12:07",
  "Versanddatum": "2026-04-06",
  "Vorname": "Irendy",
  "Nachname": "Bucio",
  "Strasse": "Weingartenstrasse",
  "Hausnummer": "5",
  "PLZ": "4600",
  "Stadt": "Olten",
  "Land": "CH",
  "Zahlungsart": "",
  "Gesamtbetrag_netto": 49.95,
  "Versandkosten": 4.95,
  "Gesamtbetrag_brutto": 44.91,
  "Rabatt": 9.99,
  "#_ChagaFlaschen": 0,
  "#_ReishiFlaschen": 0,
  "#_ShiitakeFlaschen": 0,
  "#_LionsManeFlaschen": 1.0000
}

Produkt-Mapping

Excel-Feld Produkt-ID SKU Status
#_ChagaFlaschen 8 CHAGA aktiv
#_ReishiFlaschen 5 003.01 aktiv
#_ShiitakeFlaschen 9 SHIITAKE aktiv
#_LionsManeFlaschen 6 005.02 aktiv

Ignoriert: ID 7 (LIONSMANE) - inaktiv

Fehlerbehandlung

Keine Bestellung gefunden

  • Alle Felder werden als leere Strings oder 0 zurückgegeben
  • Excel-Node kann trotzdem ausgeführt werden

Keine Produkt-Allokationen

  • Produktzählungen sind 0
  • Andere Felder sind normal gefüllt

Testing

Test Query direkt in DB

psql "postgresql://codex_db_user:Ze90re0KAry8gyJ6eAx0Gf4IelEGI@192.168.1.199:55432/naurua_erp" -c "
-- Test mit existierender Bestellung
SELECT external_ref FROM sales_order WHERE external_ref LIKE '10%' LIMIT 1;"

Test Response

Erwartet eine Zeile mit allen Feldern gefüllt oder als leere Strings/0.

Wichtige Hinweise

  1. shipping_date wird automatisch via Trigger berechnet (nächster Arbeitstag)
  2. Wochenend-Logik: Freitag → Montag, Samstag → Montag, Sonntag → Montag
  3. Feldnamen müssen exakt wie oben angegeben sein (Groß-/Kleinschreibung beachten)
  4. Produkt-IDs sind fest in der Query hinterlegt
  5. Max Rows = 1 (eine Bestellung pro Aufruf)