Verträge / RmaPatch
Retoure Patch
RmaPatch · com.nexoware.connect.events
- Aggregat
- Rma · State RmaState
- Topic
- rma.patch je Mandant mit Präfix, z. B.
<mandant>.rma.patch - Key
- RmaUuid
- Nachrichtenart
- Patch — ausdrückliche Teiländerungen, zusammengeführt vom Zusammenführungsdienst
- Schreiber
- c-entron Webservice (centron) , NEXOWARE.ERP (nexoware-erp)
- Retention
- 30 Tage
- Fassung
- Version 1 (neueste)
- Schema-ID
- 78
Patch-Pfad
- Pflicht bei Anlage
- RmaNumber, Kind, State, AccountUuid, CreatedAt
- Fix nach Anlage
- RmaNumber, CreatedAt
Vertragsentwurf: typisierte Teilaenderung fuer Retoure. Nur ChangedFields werden angewandt; null leert nur nullable State-Einheiten. Listen und Unterobjekte sind atomare Ersetzungen mit vollstaendigem Inhalt. Fachliche Freigabe und Regeln gekoppelter Werte sind offen; siehe docs/contracts/rma.md.
Fassungen
Felder
-
EventId ↗ extern: EventId uuidBeim ersten Enqueue in die Outbox erzeugt; bei Wiederholung identisch.
-
RmaUuid Key uuidStabile, global eindeutige Identitaet des RMA-Vorgangs (Matching-Schluessel; zugleich Message-Key).
-
Mode enum(CHANGE|INITIAL_LOAD)
-
ChangedFields Liste string[]Explizite Maske der geaenderten Top-Level-Einheiten; keine Wildcards, Identitaets- oder Auditfelder. Listen und Records werden als Ganzes ersetzt.
-
Data RmaPatchData
8 Felder von
RmaPatchData-
RmaNumber optional intDefault:
nullFachliche RMA-Nummer (Business-Key; eigener Nummernraum, Nummerngruppe RMANumber; quellseitig non-null). Nur bei Anlage; fixedAfterCreate. -
Kind optional intDefault:
nullArt des Vorgangs (RmaKind: 0 = unbestimmt, 1 = eigene/Lieferanten-RMA - eigener Bestand zurueck zum Lieferanten, 2 = Kunden-RMA, 3 = Fremdware-RMA - Kundengeraet ohne eigenen Verkaufsbeleg). Kunden- und Lieferanten-RMA reisen im selben Topic; Konsumenten filtern ueber dieses Feld, kein Typ-Split. -
State optional intDefault:
nullLWW-Statusfeld (RmaClosedState: 0 = offen, 1 = geschlossen, 2 = geloescht). Das Loeschen ist quellseitig ein Soft-Delete und reist als Voll-Snapshot mit State = 2, kein Tombstone. -
Default:
nullPflicht-Referenz auf den Account, unter dem der Vorgang gefuehrt wird (beim Kunden-/Fremdware-RMA der Kunde), ueber dessen UUID (Quelle AccountI3D, non-null). Kann der Producer sie nicht aufloesen, scheitert die Avro-Projektion laut (Failed-Outbox-Zeile) statt still null zu senden. -
Default:
nullReferenz auf den Lieferanten des Vorgangs (Account mit Supplier-Facette, QS-1) ueber dessen UUID (Quelle SupplierAccountI3D - direkte Account-Referenz); DB nullable, nur bei Lieferanten-Bezug gesetzt. -
Description optional stringDefault:
nullBeschreibung des Vorgangs; DB nullable. -
CreatedAt optional timestampDefault:
nullAnlagezeitpunkt des Vorgangs als UTC-Instant (Quelle CreatedDate, non-null; Host-lokale Zeit, beim Publish nach UTC konvertiert) - das fachliche Datum der Retoure (der Vorgang traegt kein separates Belegdatum). Nur bei Anlage; fixedAfterCreate. -
Articles Liste optional RmaArticle[]Default:
nullEingebettete RMA-Artikel (RmaArticle, Cascade am Vorgang), aufsteigend nach Anlage (die Quelle fuehrt keine Positionsnummer). Auch entfernte Artikel reisen mit (State = 2, Soft-Delete). Voll-Snapshot: der Consumer ersetzt die Collection je Event vollstaendig (kein positionsweises Mergen). Default [] nur fuer Schema-Evolution.18 Felder von
RmaArticle[]-
Default:
nullReferenz auf das Artikel-Stammdatum ueber dessen UUID. Fachlich traegt jeder RMA-Artikel einen Artikel; optional, weil die Quell-Referenz mit NotFound.Ignore gemappt ist (fehlendes Stammdatum -> null). -
Default:
nullReferenz auf den Tausch-Artikel (Fremd-Austausch) ueber dessen UUID; DB nullable. -
SerialNumber optional stringDefault:
nullSeriennummer des reklamierten Artikels als Wert-Kopie (Quelle Barcode-Referenz SerialNumberI3D); null bei Artikeln ohne Seriennummer. Die Barcode-Datensaetze selbst sind Artikel-Domaene (kein Sub-Topic). -
SwapSerialNumber optional stringDefault:
nullSeriennummer des Tausch-Artikels als Wert-Kopie (Quelle NewSerialNumberI3D); DB nullable. -
Quantity intDefault:
0Menge des RMA-Artikels (quellseitig int; bei Seriennummern-Artikeln 1). -
Warranty booleanDefault:
falseGarantie-Kennzeichen (quellseitig non-null). -
ErrorDescription optional stringDefault:
nullFehlerbeschreibung der Reklamation; DB nullable. -
Description optional stringDefault:
nullBeschreibung des RMA-Artikels (Quelle Description, auf 200 Zeichen gekuerzt); DB nullable. -
State intDefault:
0Status des Artikels im Vorgang (RmaClosedState: 0 = offen, 1 = geschlossen, 2 = entfernt/geloescht). Entfernte Artikel bleiben Teil des Snapshots (Soft-Delete); DB-Spalte nullable, Altbestand reist als 0 = offen. -
ProcessState intDefault:
0Prozess-Zustand des Artikels (RmaArticleState, Quellspalte RmaState): 0 = keiner, 1 = angelegt, 2 = E-Mail an Lieferant, 3 = Ruecksendung (SendBack), 4 = Ruecksendungs-Eingang (SendForth), 5 = verschrottet, 6 = Ruecklieferschein, 7 = Vorabtausch-Lieferschein, 8 = Leih-Vorabtausch-Lieferschein, 9 = Ruecklieferschein aus Buchung, 10 = Auftrag, 11 = Rechnung, 12 = Lieferantengutschrift, 13 = Kundengutschrift, 14 = Umbuchung, 15 = Abholliste, 16 = Wareneingang, 17 = angenommen, 18 = Bestellung, 19 = entfernt. Traegt den SendBack-/SendForth-Zustand des Klaerungspunkts - die Versand-Dokumente reisen nicht als eigene Records. -
ForthAction intDefault:
0Entschiedene Weiterbehandlung (RmaForthAction: 0 = keine, 1 = 1-zu-1-Austausch, 2 = Fremd-Austausch, 3 = Reparatur, 5 = verschrottet, 6 = unrepariert, 7 = entfernt, 8 = Reparatur vor Ort, 9 = unrepariert vor Ort); DB-Spalte nullable, Altbestand reist als 0 = keine. -
Default:
nullLieferant, der diesen Artikel bearbeitet (Account mit Supplier-Facette, QS-1) ueber dessen UUID. Quellseitig ist SupplierNumber die Kreditor-Nummer (AccountSupplier.Number); der Producer loest sie ueber AccountSupplier -> AccountTypeToAccount -> Account auf. Null ohne Lieferanten-Bezug oder bei Aufloesungsluecke. -
SupplierRmaNumber optional stringDefault:
nullRMA-Nummer des Lieferanten (externer Business-Key der Ruecksendung); DB nullable. -
SupplierReceiptNumber optional stringDefault:
nullBelegnummer des Lieferanten-Einkaufsbelegs (Herkunftsnachweis, Kopie aus der Einkaufs-Kette); DB nullable. -
SupplierReceiptDate optional timestampDefault:
nullDatum des Lieferanten-Einkaufsbelegs; DB nullable. -
Default:
nullVorbeleg-Referenz auf den Ursprungs-Auftrag ueber dessen UUID (producer-seitig aus ReceiptKind 2 + ReceiptNumber aufgeloest); null, wenn der Artikel keinen Auftrags-Ursprung hat. -
Default:
nullVorbeleg-Referenz auf den Ursprungs-Lieferschein ueber dessen UUID (producer-seitig aus ReceiptKind 3 + ReceiptNumber aufgeloest). ACHTUNG: die von Lieferanten-RMA selbst ERZEUGTEN Lieferscheine (Ruecklieferschein/Vorabtausch) sind Folgebelege und reisen als normale DeliveryListState-Events, nicht hier. -
Default:
nullVorbeleg-Referenz auf die Ursprungs-Rechnung ueber dessen UUID (producer-seitig aus ReceiptKind 4 + ReceiptNumber aufgeloest); null ohne Rechnungs-Ursprung.
-
-
-
Default:
nullUUID des aendernden Mitarbeiters (Employee); null, wenn unbekannt. -
ChangedAt timestampZeitpunkt der Aenderung als UTC-Instant.
Referenziert von
Kein Vertrag verweist auf diesen.
Rohfassung
Schema dieser Fassung (Avro)
{
"type": "record",
"name": "RmaPatch",
"namespace": "com.nexoware.connect.events",
"doc": "Vertragsentwurf: typisierte Teilaenderung fuer Retoure. Nur ChangedFields werden angewandt; null leert nur nullable State-Einheiten. Listen und Unterobjekte sind atomare Ersetzungen mit vollstaendigem Inhalt. Fachliche Freigabe und Regeln gekoppelter Werte sind offen; siehe docs/contracts/rma.md.",
"fields": [
{
"name": "EventId",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Beim ersten Enqueue in die Outbox erzeugt; bei Wiederholung identisch."
},
{
"name": "RmaUuid",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Stabile, global eindeutige Identitaet des RMA-Vorgangs (Matching-Schluessel; zugleich Message-Key)."
},
{
"name": "Mode",
"type": {
"type": "enum",
"name": "PatchMode",
"doc": "CHANGE: lokal autorisierte Aenderung, LWW je Einheit nach Kafka-Reihenfolge. INITIAL_LOAD: Erstbefuellung beim Anschluss eines Produkts - setzt eine Einheit nur, wenn sie noch nie geschrieben wurde; ueberschreibt nie einen vorhandenen oder ausdruecklich geleerten Wert. Bewusst ohne Enum-Default: ein unbekannter kuenftiger Modus darf nicht still als CHANGE gelesen werden.",
"symbols": [
"CHANGE",
"INITIAL_LOAD"
]
}
},
{
"name": "ChangedFields",
"type": {
"type": "array",
"items": "string"
},
"doc": "Explizite Maske der geaenderten Top-Level-Einheiten; keine Wildcards, Identitaets- oder Auditfelder. Listen und Records werden als Ganzes ersetzt."
},
{
"name": "Data",
"type": {
"type": "record",
"name": "RmaPatchData",
"doc": "Werte der maskierten Einheiten. null ausserhalb der Maske wird ignoriert; innerhalb der Maske entscheidet die Nullability im State.",
"fields": [
{
"name": "RmaNumber",
"type": [
"null",
"int"
],
"doc": "Fachliche RMA-Nummer (Business-Key; eigener Nummernraum, Nummerngruppe RMANumber; quellseitig non-null). Nur bei Anlage; fixedAfterCreate.",
"default": null
},
{
"name": "Kind",
"type": [
"null",
"int"
],
"doc": "Art des Vorgangs (RmaKind: 0 = unbestimmt, 1 = eigene/Lieferanten-RMA - eigener Bestand zurueck zum Lieferanten, 2 = Kunden-RMA, 3 = Fremdware-RMA - Kundengeraet ohne eigenen Verkaufsbeleg). Kunden- und Lieferanten-RMA reisen im selben Topic; Konsumenten filtern ueber dieses Feld, kein Typ-Split.",
"default": null
},
{
"name": "State",
"type": [
"null",
"int"
],
"doc": "LWW-Statusfeld (RmaClosedState: 0 = offen, 1 = geschlossen, 2 = geloescht). Das Loeschen ist quellseitig ein Soft-Delete und reist als Voll-Snapshot mit State = 2, kein Tombstone.",
"default": null
},
{
"name": "AccountUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Pflicht-Referenz auf den Account, unter dem der Vorgang gefuehrt wird (beim Kunden-/Fremdware-RMA der Kunde), ueber dessen UUID (Quelle AccountI3D, non-null). Kann der Producer sie nicht aufloesen, scheitert die Avro-Projektion laut (Failed-Outbox-Zeile) statt still null zu senden.",
"default": null
},
{
"name": "SupplierAccountUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf den Lieferanten des Vorgangs (Account mit Supplier-Facette, QS-1) ueber dessen UUID (Quelle SupplierAccountI3D - direkte Account-Referenz); DB nullable, nur bei Lieferanten-Bezug gesetzt.",
"default": null,
"references": "Account"
},
{
"name": "Description",
"type": [
"null",
"string"
],
"doc": "Beschreibung des Vorgangs; DB nullable.",
"default": null
},
{
"name": "CreatedAt",
"type": [
"null",
{
"type": "long",
"logicalType": "timestamp-millis"
}
],
"doc": "Anlagezeitpunkt des Vorgangs als UTC-Instant (Quelle CreatedDate, non-null; Host-lokale Zeit, beim Publish nach UTC konvertiert) - das fachliche Datum der Retoure (der Vorgang traegt kein separates Belegdatum). Nur bei Anlage; fixedAfterCreate.",
"default": null
},
{
"name": "Articles",
"type": [
"null",
{
"type": "array",
"items": {
"type": "record",
"name": "RmaArticle",
"fields": [
{
"name": "ArticleUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf das Artikel-Stammdatum ueber dessen UUID. Fachlich traegt jeder RMA-Artikel einen Artikel; optional, weil die Quell-Referenz mit NotFound.Ignore gemappt ist (fehlendes Stammdatum -> null).",
"default": null
},
{
"name": "SwapArticleUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf den Tausch-Artikel (Fremd-Austausch) ueber dessen UUID; DB nullable.",
"default": null,
"references": "Article"
},
{
"name": "SerialNumber",
"type": [
"null",
"string"
],
"doc": "Seriennummer des reklamierten Artikels als Wert-Kopie (Quelle Barcode-Referenz SerialNumberI3D); null bei Artikeln ohne Seriennummer. Die Barcode-Datensaetze selbst sind Artikel-Domaene (kein Sub-Topic).",
"default": null
},
{
"name": "SwapSerialNumber",
"type": [
"null",
"string"
],
"doc": "Seriennummer des Tausch-Artikels als Wert-Kopie (Quelle NewSerialNumberI3D); DB nullable.",
"default": null
},
{
"name": "Quantity",
"type": "int",
"doc": "Menge des RMA-Artikels (quellseitig int; bei Seriennummern-Artikeln 1).",
"default": 0
},
{
"name": "Warranty",
"type": "boolean",
"doc": "Garantie-Kennzeichen (quellseitig non-null).",
"default": false
},
{
"name": "ErrorDescription",
"type": [
"null",
"string"
],
"doc": "Fehlerbeschreibung der Reklamation; DB nullable.",
"default": null
},
{
"name": "Description",
"type": [
"null",
"string"
],
"doc": "Beschreibung des RMA-Artikels (Quelle Description, auf 200 Zeichen gekuerzt); DB nullable.",
"default": null
},
{
"name": "State",
"type": "int",
"doc": "Status des Artikels im Vorgang (RmaClosedState: 0 = offen, 1 = geschlossen, 2 = entfernt/geloescht). Entfernte Artikel bleiben Teil des Snapshots (Soft-Delete); DB-Spalte nullable, Altbestand reist als 0 = offen.",
"default": 0
},
{
"name": "ProcessState",
"type": "int",
"doc": "Prozess-Zustand des Artikels (RmaArticleState, Quellspalte RmaState): 0 = keiner, 1 = angelegt, 2 = E-Mail an Lieferant, 3 = Ruecksendung (SendBack), 4 = Ruecksendungs-Eingang (SendForth), 5 = verschrottet, 6 = Ruecklieferschein, 7 = Vorabtausch-Lieferschein, 8 = Leih-Vorabtausch-Lieferschein, 9 = Ruecklieferschein aus Buchung, 10 = Auftrag, 11 = Rechnung, 12 = Lieferantengutschrift, 13 = Kundengutschrift, 14 = Umbuchung, 15 = Abholliste, 16 = Wareneingang, 17 = angenommen, 18 = Bestellung, 19 = entfernt. Traegt den SendBack-/SendForth-Zustand des Klaerungspunkts - die Versand-Dokumente reisen nicht als eigene Records.",
"default": 0
},
{
"name": "ForthAction",
"type": "int",
"doc": "Entschiedene Weiterbehandlung (RmaForthAction: 0 = keine, 1 = 1-zu-1-Austausch, 2 = Fremd-Austausch, 3 = Reparatur, 5 = verschrottet, 6 = unrepariert, 7 = entfernt, 8 = Reparatur vor Ort, 9 = unrepariert vor Ort); DB-Spalte nullable, Altbestand reist als 0 = keine.",
"default": 0
},
{
"name": "SupplierAccountUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Lieferant, der diesen Artikel bearbeitet (Account mit Supplier-Facette, QS-1) ueber dessen UUID. Quellseitig ist SupplierNumber die Kreditor-Nummer (AccountSupplier.Number); der Producer loest sie ueber AccountSupplier -> AccountTypeToAccount -> Account auf. Null ohne Lieferanten-Bezug oder bei Aufloesungsluecke.",
"default": null,
"references": "Account"
},
{
"name": "SupplierRmaNumber",
"type": [
"null",
"string"
],
"doc": "RMA-Nummer des Lieferanten (externer Business-Key der Ruecksendung); DB nullable.",
"default": null
},
{
"name": "SupplierReceiptNumber",
"type": [
"null",
"string"
],
"doc": "Belegnummer des Lieferanten-Einkaufsbelegs (Herkunftsnachweis, Kopie aus der Einkaufs-Kette); DB nullable.",
"default": null
},
{
"name": "SupplierReceiptDate",
"type": [
"null",
{
"type": "long",
"logicalType": "timestamp-millis"
}
],
"doc": "Datum des Lieferanten-Einkaufsbelegs; DB nullable.",
"default": null
},
{
"name": "OrderUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Vorbeleg-Referenz auf den Ursprungs-Auftrag ueber dessen UUID (producer-seitig aus ReceiptKind 2 + ReceiptNumber aufgeloest); null, wenn der Artikel keinen Auftrags-Ursprung hat.",
"default": null
},
{
"name": "DeliveryListUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Vorbeleg-Referenz auf den Ursprungs-Lieferschein ueber dessen UUID (producer-seitig aus ReceiptKind 3 + ReceiptNumber aufgeloest). ACHTUNG: die von Lieferanten-RMA selbst ERZEUGTEN Lieferscheine (Ruecklieferschein/Vorabtausch) sind Folgebelege und reisen als normale DeliveryListState-Events, nicht hier.",
"default": null
},
{
"name": "InvoiceUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Vorbeleg-Referenz auf die Ursprungs-Rechnung ueber dessen UUID (producer-seitig aus ReceiptKind 4 + ReceiptNumber aufgeloest); null ohne Rechnungs-Ursprung.",
"default": null
}
]
}
}
],
"doc": "Eingebettete RMA-Artikel (RmaArticle, Cascade am Vorgang), aufsteigend nach Anlage (die Quelle fuehrt keine Positionsnummer). Auch entfernte Artikel reisen mit (State = 2, Soft-Delete). Voll-Snapshot: der Consumer ersetzt die Collection je Event vollstaendig (kein positionsweises Mergen). Default [] nur fuer Schema-Evolution.",
"default": null
}
]
}
},
{
"name": "ChangedByUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "UUID des aendernden Mitarbeiters (Employee); null, wenn unbekannt.",
"default": null,
"references": "Employee"
},
{
"name": "ChangedAt",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
},
"doc": "Zeitpunkt der Aenderung als UTC-Instant."
}
],
"aggregate": "Rma",
"label": "Retoure",
"topic": "rma.patch",
"key": "RmaUuid",
"cleanupPolicy": "delete",
"retentionMs": 2592000000,
"partitions": 1,
"writers": [
"centron",
"nexoware-erp"
],
"requiredOnCreate": [
"RmaNumber",
"Kind",
"State",
"AccountUuid",
"CreatedAt"
],
"fixedAfterCreate": [
"RmaNumber",
"CreatedAt"
]
}