# Lobster: Mapping-Anpassungen nach den EDI-Fixes (Branch `edi-iwofurn-fixes`)

Stand: 2026-07-04 · Referenz: ExportTrees vom 2026-07-02 ("ExportTree.csv" = INVOIC,
"ExportTree (1).csv" = ORDRSP) · Rückfragen: Alex (Qwellcode)

Unser JSON sendet nach den Änderungen zusätzliche Felder. Felder, die nicht im
Lobster-Eingangsbaum definiert sind, werden von Lobster kommentarlos verworfen —
deshalb müssen Baum UND Mapping erweitert werden.

---

## 1. ORDRSP (`orderresponses`) — NEUE Felder je `ITEMS` aufnehmen

| JSON-Quelle | Typ | XML-Ziel (XML Einrichten V-1.3) | Bemerkung |
|---|---|---|---|
| `ITEMS/Position` | Integer | `LINE/LineItemNumber` | unsere eindeutige Belegposition (fortlaufend 1..n je AB) |
| `ITEMS/ParentPosition` | Integer, optional | `LINE/ParentLineItemNumber` | nur bei Set-Komponenten gefüllt; zeigt auf die Position des Set-Kopfs |
| `ITEMS/OrderLineRef/DocRefNumber` | String | `LINE/OrderLineRef/DocRefNumber` | Bestellnummer des Kunden |
| `ITEMS/OrderLineRef/DocDate` | Datum (Y-m-d) | `LINE/OrderLineRef/DocDate` | Bestelldatum |
| `ITEMS/OrderLineRef/DocRefLineNumber` | Integer | `LINE/OrderLineRef/DocRefLineNumber` | **Positionsnummer aus der Bestellung des Kunden.** Set-Komponenten tragen bewusst ALLE dieselbe Nummer wie ihr Kopf — laut iwofurn (Antwort 2026-07-03) konsolidieren sie die Komponenten genau über diese Referenz zur Hauptposition |
| `ITEMS/GrossUnitPrice/{Currency, Value, PriceQuantity}` | wie `NetUnitPrice` | `LINE/GrossUnitPrice` | NEU (2026-07-09): Listenpreis VOR Konditionen, ohne Steuer — Preisfeld-Semantik jetzt konsistent zur Rechnung (`NetUnitPrice`/`NetLineAmount` = NACH Konditionen); Struktur identisch zum bestehenden `NetUnitPrice`-Knoten |

**Übergangsregel:** `OrderPosition` wird parallel weiter gesendet (gleicher Wert wie
`Position`). Solange `Position` in einem Dokument fehlt (ältere, noch nicht abgeholte
Queue-Einträge), bitte weiterhin `OrderPosition` auf `LineItemNumber` mappen.

## 2. ORDRSP — Felder, die wir SCHON IMMER senden, die der Baum aber verwirft

| JSON-Quelle | XML-Ziel | Bemerkung |
|---|---|---|
| `ITEMS/LineCharge[]` mit `ConditionIndicator`, `ConditionLevel`, `Percent`, `Amount`, `VatPercentage`, `Description`, `TypeOfCondition` | `LINE/CNDL` | **Wichtigster Punkt: der Teuerungszuschlag** fehlt deshalb heute auf ALLEN ABs. Die identische Struktur existiert bereits im INVOIC-Baum (`ITEMS/LineCharge`) und kann übernommen werden. Laut iwofurn ist ein CNDL Pflicht, sobald Brutto- und Nettoeinzelpreis differieren |
| `ITEMS/LineTexts[]` (Array von Strings) | `LINE/LTXT` | Positionstexte |
| `HEAD/HeadTexts[]` (Array von Strings) | `HTXT` | Kopftexte/Notizen aus D365 |

## 3. INVOIC (`invoices`) — eine Änderung

`ITEMS/AdditionalLineReferences/AdditionalLineRef` kommt jetzt als **Liste** (bisher
einzelnes Objekt), mit bis zu zwei Einträgen:

```json
"AdditionalLineReferences": {
  "AdditionalLineRef": [
    { "Qualifier": "OrderPosition", "Value": 2 },
    { "Qualifier": "Free", "Value": "<FSC-Zertifikatsnummer>" }
  ]
}
```

- Der Baum erlaubt bereits 0..99999 Einträge — bitte verifizieren, dass das Mapping
  MEHRERE `AdditionalLineRef`-Elemente ins XML durchreicht (bisher kam nur eines).
- `Qualifier = "OrderPosition"` = Referenz auf die Bestellposition des Kunden
  (`DocumentLineReferenceQualified`, EDIFACT LI). Der bisherige `Free`-Eintrag
  (FSC-Zertifikat) bleibt unverändert.

## 3b. INVOIC — NEU (2026-07-06): `ITEMS/OrderLineRef` aufnehmen

Die Rechnung sendet jetzt zusätzlich zur `AdditionalLineRef`-Referenz (Abschnitt 3) die
strukturierte Bestellpositions-Referenz — identischer Kontrakt wie die AB (Abschnitt 1):

| JSON-Quelle | Typ | XML-Ziel | Bemerkung |
|---|---|---|---|
| `ITEMS/Position` | Integer | `LINE/LineItemNumber` | identisch zu `OrderPosition` (Übergang) |
| `ITEMS/ParentPosition` | Integer, optional | `LINE/ParentLineItemNumber` | in der Rechnung immer `null` (Set-Köpfe werden in D365 nicht fakturiert) |
| `ITEMS/OrderLineRef/DocRefNumber` | String | `LINE/OrderLineRef/DocRefNumber` | Bestellnummer des Kunden (Otto: original_document_number) |
| `ITEMS/OrderLineRef/DocDate` | Datum | `LINE/OrderLineRef/DocDate` | |
| `ITEMS/OrderLineRef/DocRefLineNumber` | Integer | `LINE/OrderLineRef/DocRefLineNumber` | Kundenposition; Set-Komponenten tragen ALLE die Nummer ihres Set-Kopfs (iwofurn konsolidiert darüber) |

## 3c. DESADV (`desadvs`) — NEU (2026-07-06): Positions- und Referenzfelder

Die DESADV sendet jetzt dieselben Felder wie AB/Rechnung. **ACHTUNG Verhaltensänderung:**
`ITEMS/OrderPosition` war bisher das rohe D365-`LINENUM` — bei Set-Komponenten DEZIMAL
(z.B. `1.001`) — und ist jetzt die fortlaufende Belegposition 1..n (Integer).

| JSON-Quelle | Typ | XML-Ziel | Bemerkung |
|---|---|---|---|
| `ITEMS/OrderPosition` | Integer | `LINE/LineItemNumber` | jetzt fortlaufend 1..n (vorher LINENUM, teils dezimal) |
| `ITEMS/Position` | Integer | `LINE/LineItemNumber` | identisch zu `OrderPosition` (Übergang) |
| `ITEMS/ParentPosition` | Integer, optional | `LINE/ParentLineItemNumber` | in der DESADV immer `null` (Set-Köpfe sind keine physischen Artikel und stehen nie auf dem Lieferschein) |
| `ITEMS/OrderLineRef/{DocRefNumber, DocDate, DocRefLineNumber}` | wie AB | `LINE/OrderLineRef/...` | Kundenposition; Set-Komponenten tragen die Nummer ihres Set-Kopfs |
| `HEAD/PACILINE/OrderPosition` | Integer | — | synchron zur neuen Item-Position |

## 4. Bitte prüfen: Datentypen im ORDRSP-Baum

Im Baum sind `OrderResponseQuantity/Value`, `LineVAT/VatValue` und `LineVAT/VatPercentage`
als **BigInteger** definiert. Wir senden dort Dezimalwerte (Mengen mit 2 Nachkommastellen,
Steuerbeträge wie `123.45`). Falls Lobster BigInteger strikt parst (Rundung/Trunkierung),
bitte auf Dezimal/String umstellen.

## 5. Kein Handlungsbedarf (nur zur Kenntnis)

- Buyer-NAD kann künftig ohne Klarschrift-Anschrift kommen (nur `FlagOfParty` + `GLN` +
  `BusinessCustomerNumber` + ggf. `VATId`) — alle NAD-Felder sind im Baum optional.
- Carrier-NAD wird nur noch gesendet, wenn eine GLN vorliegt.
- `FOOT/AdditionalAmounts` wird von uns aktuell nicht mehr aus Positions-Zuschlägen
  befüllt (war laut iwofurn falsch platziert); der Knoten bleibt für echte
  Beleg-Konditionen bestehen.

## 6. Abnahmetests nach der Umstellung (im iwofurn-Portal gegenprüfen)

1. **Set-Auftrag**: Komponenten haben eigene `LineItemNumber` + `ParentLineItemNumber`,
   und alle Set-Zeilen dieselbe `OrderLineRef/DocRefLineNumber` → iwofurn konsolidiert
   die Komponenten unter der Bestellposition des Kunden.
2. **Auftrag mit Teuerungszuschlag** (3%-Beispiele: AWDESO000399, AWDESO000401):
   `CNDL` mit Percent=3 und Description "Teuerungszuschlag" erscheint im XML.
3. **Rechnung**: beide `AdditionalLineRef`-Einträge (OrderPosition + FSC) kommen im XML an.
