Verträge / OrderState
Auftrag State
OrderState · com.nexoware.connect.events
- Aggregat
- Order · Patch OrderPatch
- Topic
- order.state je Mandant mit Präfix, z. B.
<mandant>.order.state - Key
- OrderUuid
- Nachrichtenart
- State — der aktuelle Zustand, ein Writer
- Schreiber
- Zusammenführungsdienst (merge)
- Leser
- c-entron Webservice (centron) , NEXOWARE.ERP (nexoware-erp)
- Fassung
- Version 1 (neueste)
- Schema-ID
- 67
Kanonischer Vertrag, Version 1: der vollstaendige zusammengefuehrte Zustand eines Auftrags (Verkaufsbeleg, Quelle c-entron AufKopf/AufPos): Kopf mit eingebetteter Positionsliste und eingebetteten Beleg-Empfaengern. Positions und Receivers sind je eine Liste und damit je eine Einheit, die ein Patch als Ganzes ersetzt. Einziger Writer ist der Zusammenfuehrungsdienst (ADR-0023 Punkt 2 und 4); die Produkte schreiben Patches auf order.patch und lesen diesen State mit isolation.level=read_committed. Identitaet und alle Referenzen ausschliesslich ueber UUID; quell-lokale IDs sind nicht Teil des Vertrags. Anzahlungen sind normale (Anzahlungs-)Rechnungen und reisen ueber den Rechnungsvertrag; Provisionen sind nicht eingebettet; EsOrderUuid ist die Rueckreferenz auf die Shop-Bestellung (ADR-0015). Storno ist State = 3, kein Tombstone. Geldfelder als decimal, kaufmaennisch gerundet (ADR-0006). Feldumfang 1:1 aus dem Bestandsvertrag OrderChanged (archiviert), ergaenzt um Revision und LastEventId. Fachliche Anforderungen: docs/contracts/order.md.
Fassungen
Felder
-
OrderUuid Key uuidStabile, global eindeutige Identitaet des Auftrags; zugleich Message-Key auf State und Patch. Bleibt ueber Belegversionen hinweg identisch.
-
OrderNumber intFachliche Auftragsnummer (Business-Key; quellseitig non-null). Vorlagen (negative Nummer) werden nicht publiziert. Pflicht bei Anlage und danach unveraenderlich: Ein Patch vergibt keine Nummer neu.
-
Version intBelegversion (quellseitig non-null). Pflicht bei Anlage - kein Default; eine neue Belegversion ist ein Patch auf diese Einheit.
-
State intLWW-Statusfeld (ReceiptState: 1 = aktiv, 2 = abgeschlossen, 3 = storniert). Storno ist ein Patch mit State = 3, kein Tombstone. Pflicht bei Anlage - kein Default, damit 0 keinen Status vortaeuscht.
-
Pflicht-Referenz auf den Kunden (AccountState) ueber dessen UUID; Pflicht bei Anlage, danach aenderbar (docs/contracts/order.md, OFFEN-6). Kann der Producer sie nicht aufloesen, scheitert er laut, statt still null zu senden.
-
OrderDate timestampBelegdatum als UTC-Instant (Quell-Property non-null; Host-lokale Zeit, beim Publish nach UTC konvertiert). Pflicht bei Anlage.
-
DeliveryDate optional timestampDefault:
nullLiefertermin des Auftrags; DB nullable. -
Default:
nullReferenz auf die Belegkondition (Zahlungskondition des Auftrags, Quelle ZahlkondID -> Zahkond) ueber deren UUID; quellseitig nullable. -
DeliveryConditionUuid optional ↗ extern: DeliveryCondition uuidDefault:
nullReferenz auf die Lieferbedingung (Quelle LieferbedID -> Zahkond, dasselbe Konditions-Stammdatum wie AssetConditionUuid) ueber deren UUID; quellseitig nullable. Die Rechnungskondition (ZahlKondRechI3D) ist bewusst kein Vertragsfeld - sie gehoert zum Rechnungs-Topic. -
Default:
nullReferenz auf die Kostenstelle des Kopfes ueber deren UUID; quellseitig nullable. -
Default:
nullReferenz auf den Kostentraeger des Kopfes ueber dessen UUID; quellseitig nullable. -
Default:
nullReferenz auf die Filiale des Belegs (Quelle FilialI3D -> Filiale) ueber deren UUID; quellseitig nullable. 0/NULL im Quell-FK bedeutet 'Hauptsitz (keine Filiale)' (BranchBL.GetHeadquarter) - der Hauptsitz ist KEIN Filiale-Datensatz, die Referenz reist dann als null. Der zweite Quell-FK FilialgeberI3D ist bewusst kein Vertragsfeld - kein konzernweiter Konsument benannt. -
CurrencyIso optional stringDefault:
nullISO-Waehrungskennzeichen des Belegs (Quelle CurrencyString); DB nullable. -
CurrencyFactor decimal(18,6)Umrechnungsfaktor der Belegwaehrung zur Hauswaehrung; quellseitig non-null, beim Publish kaufmaennisch auf 6 Nachkommastellen gerundet. Pflicht bei Anlage.
-
NetTotal optional decimal(18,2)Default:
nullNetto-Gesamtsumme des Auftrags (Quelle AufKopf.Netto, von der Quelle nach dem Save berechnet); DB nullable, beim Publish kaufmaennisch auf 2 Nachkommastellen gerundet. -
GrossTotal optional decimal(18,2)Default:
nullBrutto-Gesamtsumme des Auftrags (Quelle AufKopf.Brutto); DB nullable. -
ProjectNumber optional stringDefault:
nullProjektnummer des Auftrags; DB nullable. -
PurchaseOrderNumber optional stringDefault:
nullBestellnummer des Kunden (Quelle BestNr); DB nullable. -
Default:
nullReferenz auf die Shop-Bestellung, aus der dieser Beleg entstanden ist, ueber deren UUID (EsOrder; der Bestand ist archiviert, der Shop-Vertrag folgt mit dem Umzug seines Fachbereichs). Die Rueckreferenz aus ADR-0015, Punkt 1: Bestellung und Beleg sind zwei Aggregate mit zwei Urspruengen und verweisen aufeinander - der Beleg traegt die Referenz, weil er der spaetere der beiden ist. Sie ist zugleich der fachliche Idempotenzschluessel des Imports: Der Consumer fuehrt die Verknuepfung eindeutig (find-or-create ueber die EsOrderUuid) und legt den Beleg in derselben Transaktion an, in der er den Apply vermerkt - eine erneute Zustellung erzeugt damit keinen zweiten Beleg mehr (ADR-0004; consumer-guidelines Regel 1). Das externe Order-Mapping der Alt-Implementierung entfaellt damit ersatzlos. Null bei jedem Beleg, der nicht aus einer Shop-Bestellung stammt - also bei der weit ueberwiegenden Mehrheit. -
Comment optional stringDefault:
nullBemerkung am Belegkopf; DB nullable. Nachgezogen mit dem vierten Schnitt des Shop-Pakets: Die Alt-Implementierung schrieb beim Auftragsimport eine Kopf-Bemerkung in den Beleg, der Vertrag kannte dafuer kein Feld (Abdeckungspruefung, Schritt 6). Ohne das Feld schriebe der Consumer die Bemerkung der Bestellung (EsOrder.Comment) in einen Beleg, dessen State sie danach nicht zuruecktruege - fuer jeden Leser des Beleg-Topics unsichtbar. Die Quellspalte an AufKopf ist nicht verifiziert (c-entron-schema-cut.md, Abschnitt 10). -
Positions Liste OrderPosition[]Default:
[]Eingebettete Positionsliste (AufPos), aufsteigend nach PositionNumber; alle Zeilenarten (Artikel-, Text-, Gruppen-, Summenpositionen - siehe Kind). Eine Liste ist eine Einheit: Ein Patch ersetzt sie als Ganzes (kein positionsweises Mergen), die leere Liste ist ein Wert, null nicht. Default [] fuer die Anlage ohne Positionen.14 Felder von
OrderPosition[]-
PositionNumber intDefault:
0Interne Positionsnummer (Sortierung; quellseitig non-null). -
DisplayPositionNumber optional stringDefault:
nullAngezeigte Positionsnummer (z. B. 1.2); DB nullable. -
Kind intDefault:
0Positionsart (ReceiptItemKind: 0 = Gruppenkopf, 1 = Artikel, 2 = Freitext, 3 = Kundenrabatt, 4 = Gesamtsumme, 5 = Zwischensumme, 6 = Titelposition, 7 = Stammdatenliste, 11/12 = Fracht/Versicherung). -
Default:
nullReferenz auf das Artikel-Stammdatum ueber dessen UUID. Null fuer Zeilen ohne Artikel (Text-/Gruppen-/Summenpositionen) - deshalb optional, obwohl Artikelpositionen sie fachlich immer tragen. -
ArticleCode optional stringDefault:
nullFachlicher Artikelcode der Position (Kopie zum Save-Zeitpunkt); DB nullable. -
Text optional stringDefault:
nullPositionstext (Artikel-/Freitext je nach Kind); DB nullable. -
Quantity optional doubleDefault:
nullBestellte Menge (Quelle Stk); quellseitig nullable. -
QuantityProcessed optional doubleDefault:
nullGelieferte Menge (Quelle Liefermenge); wird auch durch Folgebelege (Lieferschein-Buchung) fortgeschrieben - jede Fortschreibung ersetzt die Positionsliste als Ganzes. -
BasePrice optional decimal(18,4)Default:
nullNetto-Einzelpreis der Position (Quelle VKBasisWert, vor Rabatt); quellseitig nullable float, beim Publish kaufmaennisch auf 4 Nachkommastellen gerundet. -
Discount decimal(6,2)Default:
"\u0000"Positionsrabatt in Prozent; quellseitig non-null Property, beim Publish kaufmaennisch auf 2 Nachkommastellen gerundet. -
Default:
nullReferenz auf das Mehrwertsteuersatz-Stammdatum der Position ueber dessen UUID; quellseitig nullable. -
VatRate optional decimal(6,2)Default:
nullMehrwertsteuersatz der Position in Prozent (Kopie zum Save-Zeitpunkt); quellseitig nullable. -
Default:
nullReferenz auf die Kostenstelle der Position ueber deren UUID; quellseitig nullable. Nicht zu verwechseln mit der Kostenstelle des Kopfes (CostCenterUuid am Belegkopf) - eine Position kann eine eigene tragen. Nachgezogen mit dem vierten Schnitt des Shop-Pakets: Die Alt-Implementierung fuellte die Positions-Kostenstelle beim Auftragsimport, der Vertrag kannte dafuer kein Feld (Abdeckungspruefung, Schritt 6). Die Quellspalte an AufPos ist nicht verifiziert (c-entron-schema-cut.md, Abschnitt 10). -
PurchasePrice optional decimal(18,4)Default:
nullEinkaufspreis der Position (Quelle EK); quellseitig nullable.
-
-
Receivers Liste OrderReceiver[]Default:
[]Eingebettete Beleg-Empfaenger (ReceiptReceivers, Cascade am Kopf): nur belegte Slots reisen mit, unterschieden per Kind. Eine Liste ist eine Einheit: Ein Patch ersetzt sie als Ganzes, die leere Liste ist ein Wert, null nicht. Default [] fuer die Anlage ohne Empfaenger.11 Felder von
OrderReceiver[]-
Kind intDefault:
0Empfaenger-Slot am Belegkopf: 0 = Standard, 1 = Rechnung, 2 = Lieferung, 3 = Lizenznehmer. -
CompanyName optional stringDefault:
nullFirmenname des Empfaengers; DB nullable. -
ContactName optional stringDefault:
nullAnsprechpartner-Name; DB nullable. -
Department optional stringDefault:
nullAbteilung; DB nullable. -
Street optional stringDefault:
nullStrasse; DB nullable. -
HouseNumber optional stringDefault:
nullHausnummer; DB nullable. -
PostOfficeBox optional stringDefault:
nullPostfach; DB nullable. -
Zip optional stringDefault:
nullPostleitzahl; DB nullable. -
City optional stringDefault:
nullOrt; DB nullable. -
Default:
nullReferenz auf das Laender-Stammdatum ueber dessen UUID; quellseitig nullable. -
Default:
nullReferenz auf den Account, aus dem der Empfaenger stammt, ueber dessen UUID; quellseitig nullable.
-
-
Revision longAnzahl der zustandsaendernden Patches seit Erstanlage. Streng monoton je Objekt - Consumer ueberspringen Revisionen <= der zuletzt uebernommenen.
-
LastEventId ↗ extern: LastEventId uuidEventId des zuletzt angewandten Patches (Diagnose).
-
ChangedByUuid optional ↗ extern: ChangedBy uuidDefault:
nullUUID des aendernden Mitarbeiters (Employee) aus dem zuletzt angewandten Patch; null, wenn unbekannt (z. B. Fortschreibung durch Folgebeleg-Buchung). -
ChangedAt timestampAudit aus dem zuletzt angewandten Patch als UTC-Instant - kein Konfliktentscheider, es entscheidet die Kafka-Reihenfolge der Patches.
Referenziert von
Kein Vertrag verweist auf diesen.
Rohfassung
Schema dieser Fassung (Avro)
{
"type": "record",
"name": "OrderState",
"namespace": "com.nexoware.connect.events",
"doc": "Kanonischer Vertrag, Version 1: der vollstaendige zusammengefuehrte Zustand eines Auftrags (Verkaufsbeleg, Quelle c-entron AufKopf/AufPos): Kopf mit eingebetteter Positionsliste und eingebetteten Beleg-Empfaengern. Positions und Receivers sind je eine Liste und damit je eine Einheit, die ein Patch als Ganzes ersetzt. Einziger Writer ist der Zusammenfuehrungsdienst (ADR-0023 Punkt 2 und 4); die Produkte schreiben Patches auf order.patch und lesen diesen State mit isolation.level=read_committed. Identitaet und alle Referenzen ausschliesslich ueber UUID; quell-lokale IDs sind nicht Teil des Vertrags. Anzahlungen sind normale (Anzahlungs-)Rechnungen und reisen ueber den Rechnungsvertrag; Provisionen sind nicht eingebettet; EsOrderUuid ist die Rueckreferenz auf die Shop-Bestellung (ADR-0015). Storno ist State = 3, kein Tombstone. Geldfelder als decimal, kaufmaennisch gerundet (ADR-0006). Feldumfang 1:1 aus dem Bestandsvertrag OrderChanged (archiviert), ergaenzt um Revision und LastEventId. Fachliche Anforderungen: docs/contracts/order.md.",
"fields": [
{
"name": "OrderUuid",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Stabile, global eindeutige Identitaet des Auftrags; zugleich Message-Key auf State und Patch. Bleibt ueber Belegversionen hinweg identisch."
},
{
"name": "OrderNumber",
"type": "int",
"doc": "Fachliche Auftragsnummer (Business-Key; quellseitig non-null). Vorlagen (negative Nummer) werden nicht publiziert. Pflicht bei Anlage und danach unveraenderlich: Ein Patch vergibt keine Nummer neu."
},
{
"name": "Version",
"type": "int",
"doc": "Belegversion (quellseitig non-null). Pflicht bei Anlage - kein Default; eine neue Belegversion ist ein Patch auf diese Einheit."
},
{
"name": "State",
"type": "int",
"doc": "LWW-Statusfeld (ReceiptState: 1 = aktiv, 2 = abgeschlossen, 3 = storniert). Storno ist ein Patch mit State = 3, kein Tombstone. Pflicht bei Anlage - kein Default, damit 0 keinen Status vortaeuscht."
},
{
"name": "AccountUuid",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Pflicht-Referenz auf den Kunden (AccountState) ueber dessen UUID; Pflicht bei Anlage, danach aenderbar (docs/contracts/order.md, OFFEN-6). Kann der Producer sie nicht aufloesen, scheitert er laut, statt still null zu senden."
},
{
"name": "OrderDate",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
},
"doc": "Belegdatum als UTC-Instant (Quell-Property non-null; Host-lokale Zeit, beim Publish nach UTC konvertiert). Pflicht bei Anlage."
},
{
"name": "DeliveryDate",
"type": [
"null",
{
"type": "long",
"logicalType": "timestamp-millis"
}
],
"doc": "Liefertermin des Auftrags; DB nullable.",
"default": null
},
{
"name": "AssetConditionUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf die Belegkondition (Zahlungskondition des Auftrags, Quelle ZahlkondID -> Zahkond) ueber deren UUID; quellseitig nullable.",
"default": null
},
{
"name": "DeliveryConditionUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf die Lieferbedingung (Quelle LieferbedID -> Zahkond, dasselbe Konditions-Stammdatum wie AssetConditionUuid) ueber deren UUID; quellseitig nullable. Die Rechnungskondition (ZahlKondRechI3D) ist bewusst kein Vertragsfeld - sie gehoert zum Rechnungs-Topic.",
"default": null
},
{
"name": "CostCenterUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf die Kostenstelle des Kopfes ueber deren UUID; quellseitig nullable.",
"default": null
},
{
"name": "CostObjectUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf den Kostentraeger des Kopfes ueber dessen UUID; quellseitig nullable.",
"default": null
},
{
"name": "BranchUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf die Filiale des Belegs (Quelle FilialI3D -> Filiale) ueber deren UUID; quellseitig nullable. 0/NULL im Quell-FK bedeutet 'Hauptsitz (keine Filiale)' (BranchBL.GetHeadquarter) - der Hauptsitz ist KEIN Filiale-Datensatz, die Referenz reist dann als null. Der zweite Quell-FK FilialgeberI3D ist bewusst kein Vertragsfeld - kein konzernweiter Konsument benannt.",
"default": null
},
{
"name": "CurrencyIso",
"type": [
"null",
"string"
],
"doc": "ISO-Waehrungskennzeichen des Belegs (Quelle CurrencyString); DB nullable.",
"default": null
},
{
"name": "CurrencyFactor",
"type": {
"type": "bytes",
"logicalType": "decimal",
"precision": 18,
"scale": 6
},
"doc": "Umrechnungsfaktor der Belegwaehrung zur Hauswaehrung; quellseitig non-null, beim Publish kaufmaennisch auf 6 Nachkommastellen gerundet. Pflicht bei Anlage."
},
{
"name": "NetTotal",
"type": [
"null",
{
"type": "bytes",
"logicalType": "decimal",
"precision": 18,
"scale": 2
}
],
"doc": "Netto-Gesamtsumme des Auftrags (Quelle AufKopf.Netto, von der Quelle nach dem Save berechnet); DB nullable, beim Publish kaufmaennisch auf 2 Nachkommastellen gerundet.",
"default": null
},
{
"name": "GrossTotal",
"type": [
"null",
{
"type": "bytes",
"logicalType": "decimal",
"precision": 18,
"scale": 2
}
],
"doc": "Brutto-Gesamtsumme des Auftrags (Quelle AufKopf.Brutto); DB nullable.",
"default": null
},
{
"name": "ProjectNumber",
"type": [
"null",
"string"
],
"doc": "Projektnummer des Auftrags; DB nullable.",
"default": null
},
{
"name": "PurchaseOrderNumber",
"type": [
"null",
"string"
],
"doc": "Bestellnummer des Kunden (Quelle BestNr); DB nullable.",
"default": null
},
{
"name": "EsOrderUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf die Shop-Bestellung, aus der dieser Beleg entstanden ist, ueber deren UUID (EsOrder; der Bestand ist archiviert, der Shop-Vertrag folgt mit dem Umzug seines Fachbereichs). Die Rueckreferenz aus ADR-0015, Punkt 1: Bestellung und Beleg sind zwei Aggregate mit zwei Urspruengen und verweisen aufeinander - der Beleg traegt die Referenz, weil er der spaetere der beiden ist. Sie ist zugleich der fachliche Idempotenzschluessel des Imports: Der Consumer fuehrt die Verknuepfung eindeutig (find-or-create ueber die EsOrderUuid) und legt den Beleg in derselben Transaktion an, in der er den Apply vermerkt - eine erneute Zustellung erzeugt damit keinen zweiten Beleg mehr (ADR-0004; consumer-guidelines Regel 1). Das externe Order-Mapping der Alt-Implementierung entfaellt damit ersatzlos. Null bei jedem Beleg, der nicht aus einer Shop-Bestellung stammt - also bei der weit ueberwiegenden Mehrheit.",
"default": null
},
{
"name": "Comment",
"type": [
"null",
"string"
],
"doc": "Bemerkung am Belegkopf; DB nullable. Nachgezogen mit dem vierten Schnitt des Shop-Pakets: Die Alt-Implementierung schrieb beim Auftragsimport eine Kopf-Bemerkung in den Beleg, der Vertrag kannte dafuer kein Feld (Abdeckungspruefung, Schritt 6). Ohne das Feld schriebe der Consumer die Bemerkung der Bestellung (EsOrder.Comment) in einen Beleg, dessen State sie danach nicht zuruecktruege - fuer jeden Leser des Beleg-Topics unsichtbar. Die Quellspalte an AufKopf ist nicht verifiziert (c-entron-schema-cut.md, Abschnitt 10).",
"default": null
},
{
"name": "Positions",
"type": {
"type": "array",
"items": {
"type": "record",
"name": "OrderPosition",
"fields": [
{
"name": "PositionNumber",
"type": "int",
"doc": "Interne Positionsnummer (Sortierung; quellseitig non-null).",
"default": 0
},
{
"name": "DisplayPositionNumber",
"type": [
"null",
"string"
],
"doc": "Angezeigte Positionsnummer (z. B. 1.2); DB nullable.",
"default": null
},
{
"name": "Kind",
"type": "int",
"doc": "Positionsart (ReceiptItemKind: 0 = Gruppenkopf, 1 = Artikel, 2 = Freitext, 3 = Kundenrabatt, 4 = Gesamtsumme, 5 = Zwischensumme, 6 = Titelposition, 7 = Stammdatenliste, 11/12 = Fracht/Versicherung).",
"default": 0
},
{
"name": "ArticleUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf das Artikel-Stammdatum ueber dessen UUID. Null fuer Zeilen ohne Artikel (Text-/Gruppen-/Summenpositionen) - deshalb optional, obwohl Artikelpositionen sie fachlich immer tragen.",
"default": null
},
{
"name": "ArticleCode",
"type": [
"null",
"string"
],
"doc": "Fachlicher Artikelcode der Position (Kopie zum Save-Zeitpunkt); DB nullable.",
"default": null
},
{
"name": "Text",
"type": [
"null",
"string"
],
"doc": "Positionstext (Artikel-/Freitext je nach Kind); DB nullable.",
"default": null
},
{
"name": "Quantity",
"type": [
"null",
"double"
],
"doc": "Bestellte Menge (Quelle Stk); quellseitig nullable.",
"default": null
},
{
"name": "QuantityProcessed",
"type": [
"null",
"double"
],
"doc": "Gelieferte Menge (Quelle Liefermenge); wird auch durch Folgebelege (Lieferschein-Buchung) fortgeschrieben - jede Fortschreibung ersetzt die Positionsliste als Ganzes.",
"default": null
},
{
"name": "BasePrice",
"type": [
"null",
{
"type": "bytes",
"logicalType": "decimal",
"precision": 18,
"scale": 4
}
],
"doc": "Netto-Einzelpreis der Position (Quelle VKBasisWert, vor Rabatt); quellseitig nullable float, beim Publish kaufmaennisch auf 4 Nachkommastellen gerundet.",
"default": null
},
{
"name": "Discount",
"type": {
"type": "bytes",
"logicalType": "decimal",
"precision": 6,
"scale": 2
},
"doc": "Positionsrabatt in Prozent; quellseitig non-null Property, beim Publish kaufmaennisch auf 2 Nachkommastellen gerundet.",
"default": "\u0000"
},
{
"name": "VatUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf das Mehrwertsteuersatz-Stammdatum der Position ueber dessen UUID; quellseitig nullable.",
"default": null
},
{
"name": "VatRate",
"type": [
"null",
{
"type": "bytes",
"logicalType": "decimal",
"precision": 6,
"scale": 2
}
],
"doc": "Mehrwertsteuersatz der Position in Prozent (Kopie zum Save-Zeitpunkt); quellseitig nullable.",
"default": null
},
{
"name": "CostCenterUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf die Kostenstelle der Position ueber deren UUID; quellseitig nullable. Nicht zu verwechseln mit der Kostenstelle des Kopfes (CostCenterUuid am Belegkopf) - eine Position kann eine eigene tragen. Nachgezogen mit dem vierten Schnitt des Shop-Pakets: Die Alt-Implementierung fuellte die Positions-Kostenstelle beim Auftragsimport, der Vertrag kannte dafuer kein Feld (Abdeckungspruefung, Schritt 6). Die Quellspalte an AufPos ist nicht verifiziert (c-entron-schema-cut.md, Abschnitt 10).",
"default": null
},
{
"name": "PurchasePrice",
"type": [
"null",
{
"type": "bytes",
"logicalType": "decimal",
"precision": 18,
"scale": 4
}
],
"doc": "Einkaufspreis der Position (Quelle EK); quellseitig nullable.",
"default": null
}
]
}
},
"doc": "Eingebettete Positionsliste (AufPos), aufsteigend nach PositionNumber; alle Zeilenarten (Artikel-, Text-, Gruppen-, Summenpositionen - siehe Kind). Eine Liste ist eine Einheit: Ein Patch ersetzt sie als Ganzes (kein positionsweises Mergen), die leere Liste ist ein Wert, null nicht. Default [] fuer die Anlage ohne Positionen.",
"default": []
},
{
"name": "Receivers",
"type": {
"type": "array",
"items": {
"type": "record",
"name": "OrderReceiver",
"fields": [
{
"name": "Kind",
"type": "int",
"doc": "Empfaenger-Slot am Belegkopf: 0 = Standard, 1 = Rechnung, 2 = Lieferung, 3 = Lizenznehmer.",
"default": 0
},
{
"name": "CompanyName",
"type": [
"null",
"string"
],
"doc": "Firmenname des Empfaengers; DB nullable.",
"default": null
},
{
"name": "ContactName",
"type": [
"null",
"string"
],
"doc": "Ansprechpartner-Name; DB nullable.",
"default": null
},
{
"name": "Department",
"type": [
"null",
"string"
],
"doc": "Abteilung; DB nullable.",
"default": null
},
{
"name": "Street",
"type": [
"null",
"string"
],
"doc": "Strasse; DB nullable.",
"default": null
},
{
"name": "HouseNumber",
"type": [
"null",
"string"
],
"doc": "Hausnummer; DB nullable.",
"default": null
},
{
"name": "PostOfficeBox",
"type": [
"null",
"string"
],
"doc": "Postfach; DB nullable.",
"default": null
},
{
"name": "Zip",
"type": [
"null",
"string"
],
"doc": "Postleitzahl; DB nullable.",
"default": null
},
{
"name": "City",
"type": [
"null",
"string"
],
"doc": "Ort; DB nullable.",
"default": null
},
{
"name": "CountryUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf das Laender-Stammdatum ueber dessen UUID; quellseitig nullable.",
"default": null
},
{
"name": "AccountUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf den Account, aus dem der Empfaenger stammt, ueber dessen UUID; quellseitig nullable.",
"default": null
}
]
}
},
"doc": "Eingebettete Beleg-Empfaenger (ReceiptReceivers, Cascade am Kopf): nur belegte Slots reisen mit, unterschieden per Kind. Eine Liste ist eine Einheit: Ein Patch ersetzt sie als Ganzes, die leere Liste ist ein Wert, null nicht. Default [] fuer die Anlage ohne Empfaenger.",
"default": []
},
{
"name": "Revision",
"type": "long",
"doc": "Anzahl der zustandsaendernden Patches seit Erstanlage. Streng monoton je Objekt - Consumer ueberspringen Revisionen <= der zuletzt uebernommenen."
},
{
"name": "LastEventId",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "EventId des zuletzt angewandten Patches (Diagnose)."
},
{
"name": "ChangedByUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "UUID des aendernden Mitarbeiters (Employee) aus dem zuletzt angewandten Patch; null, wenn unbekannt (z. B. Fortschreibung durch Folgebeleg-Buchung).",
"default": null
},
{
"name": "ChangedAt",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
},
"doc": "Audit aus dem zuletzt angewandten Patch als UTC-Instant - kein Konfliktentscheider, es entscheidet die Kafka-Reihenfolge der Patches."
}
],
"aggregate": "Order",
"label": "Auftrag",
"topic": "order.state",
"key": "OrderUuid",
"cleanupPolicy": "compact",
"partitions": 1,
"writers": [
"merge"
],
"readers": [
"centron",
"nexoware-erp"
]
}