NEXOWARE ConnectSchema-Explorer · Kafka-Backbone

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

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"
  ]
}