0d8353fb9c
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.
161 lines
4.3 KiB
Markdown
161 lines
4.3 KiB
Markdown
# 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
|
|
```sql
|
|
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
|
|
```json
|
|
{
|
|
"values": {
|
|
"value": "={{ $json.Bestellnummer }}",
|
|
"string": "={{ $json.Bestellnummer }}"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Options
|
|
```json
|
|
{
|
|
"maxRows": 1
|
|
}
|
|
```
|
|
|
|
## Workflow Integration
|
|
|
|
### Flow
|
|
```
|
|
Webhook → Postgres Node → Excel Node
|
|
```
|
|
|
|
### Webhook Input
|
|
```json
|
|
{
|
|
"Bestellnummer": "10477"
|
|
}
|
|
```
|
|
|
|
### Expected Output
|
|
```json
|
|
{
|
|
"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
|
|
```bash
|
|
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) |