Verträge / WebAccountState
Web-Konto State
WebAccountState · com.nexoware.connect.events
- Aggregat
- WebAccount
- Topic
- webaccount.state je Mandant mit Präfix, z. B.
<mandant>.webaccount.state - Key
- WebAccountUuid
- Nachrichtenart
- State — der aktuelle Zustand, ein Writer
- Schreiber
- c-entron Webservice (centron)
- Leser
- Shop (shop) , NEXOWARE.ERP (nexoware-erp)
- Fassung
- Version 1 (neueste)
- Schema-ID
- 106
Vertragsentwurf: vollstaendiger veroeffentlichter Zustand fuer Web-Konto. Feldumfang aus dem archivierten WebAccountChanged; kein fachlicher Vergleich beider Produkte. Direkte Veroeffentlichung durch centron; kein Patch-Pfad. Grenzen, Migration und offene Fachregeln: docs/contracts/webaccount.md.
Fassungen
Felder
-
WebAccountUuid Key uuidStabile, global eindeutige Identitaet des Web-Kontos (Matching-Schluessel; zugleich Message-Key).
-
Default:
"00000000-0000-0000-0000-000000000000"Referenz auf den Geschaeftspartner, zu dem das Web-Konto gehoert, ueber dessen UUID (Quelle AccountI3D). Parent-Referenz und damit Pflicht: kann der Producer sie nicht aufloesen, scheitert er laut, statt still null zu senden (event-envelope.md). Die Legacy fuehrt denselben Bezug als customer_id am ES-User und ueberspringt ein Web-Konto, dessen Eltern-Kunde nicht gemappt ist. -
Default:
nullReferenz auf die Anschrift des Geschaeftspartners, an der das Web-Konto haengt, ueber deren UUID (Quelle AccountAddressI3D). Es reist die Referenz, nicht die Anschrift: Rechnungs- und Lieferanschrift, die der Legacy-UserSync an den ES-User schreibt, liest der Konsument aus AddressState. Der Feldname ist derselbe wie am ContactPersonState - beide meinen die Anschrift eines Accounts, und der Identitaets-Index kennt nur AddressUuid (deshalb references am Feld). Vorsorglich optional geschnitten: ob AccountAddressI3D quellseitig garantiert ist, ist am c-entron-Quellcode nicht verifiziert (c-entron-schema-cut.md, Abschnitt 9). Ist die Referenz garantiert, gehoert das Feld auf Pflicht hochgezogen. -
Default:
nullReferenz auf den Ansprechpartner, der dieses Web-Konto benutzt, ueber dessen UUID (Quelle AccountAddressContactI3D) - bereits akzeptierter Uebergangsfall fuer Personenbezug, wie am TicketState; die Identitaet des Ansprechpartners heisst ContactUuid (deshalb references am Feld). Es reist die Referenz, nicht die Person: Name, Mail, Telefon, Abteilung und Funktion stehen im ContactPersonState. Der Konsument braucht sie - ohne Mail-Adresse gibt es keine Registrierungs-Mail und damit kein Startpasswort (ADR-0017, Punkt 2). Vorsorglich optional geschnitten; null, solange kein Kontakt gepflegt ist. Ob AccountAddressContactI3D quellseitig garantiert ist, ist am c-entron-Quellcode nicht verifiziert (c-entron-schema-cut.md, Abschnitt 9) - ist die Referenz garantiert, gehoert das Feld auf Pflicht hochgezogen. -
Username stringDefault:
""Anmeldename des Web-Kontos, wie ihn c-entron fuehrt - meist eine Mail-Adresse und damit personenbeziehbar. Als Pflicht geschnitten: ein Web-Konto ohne Anmeldenamen ist keines, und die Legacy findet ein bestehendes Shop-Konto genau ueber Username und Kunde. Das zugehoerige Passwort ist nicht Teil dieses Vertrags und wird es nicht (ADR-0017, Punkt 1; siehe doc des Records). Die quellseitige Nullability ist noch nicht verifiziert (c-entron-schema-cut.md, Abschnitt 9). -
Default:
nullZuweisung des Web-Kontos zu einer ElectronicSales-Benutzerrolle, ueber die UUID des Rollen-Stammdatums (EsRoleState, Quelle EsRoleI3D). Die Rolle entsteht im Shop, die Zuweisung ist eine Eigenschaft des Web-Kontos und damit c-entron-Wahrheit - dasselbe Muster wie AccountState.EsGroupUuid beim Kunden (ADR-0016, Punkt 2). Erster Referent, den EsRoleState im Korpus hat. Null, wenn dem Konto keine Rolle zugewiesen ist. Was daraus folgt, entscheidet der Konsument: die Legacy sperrt ein Konto ohne Rolle im Shop (locked=1, approved=0). Das ist eine Shop-Regel und kein Quell-Zustand - sie faellt deshalb NICHT in State. Sonst liesse sich nicht mehr unterscheiden, ob c-entron das Konto deaktiviert hat oder ob nur die Rolle fehlt, und der Producer muesste eine Konsumenten-Auswertung mitrechnen (event-envelope.md, Leitprinzip). -
State intDefault:
0LWW-Statusfeld: 1 = aktiv, 0 = deaktiviert (Quelle WebAccountDTO.Status). Es traegt ausschliesslich den Zustand, den c-entron am Web-Konto selbst fuehrt; die Shop-Sperre, die der Legacy-UserSync aus einer fehlenden Rolle ableitet, gehoert nicht hierher (siehe EsRoleUuid). Deaktivierung reist als Voll-Snapshot mit geaendertem State, kein Tombstone; ein terminaler Tombstone bleibt der DSGVO-Erasure vorbehalten und ist eigener Track (ADR-0009, Punkt 9). Die Wertemenge der Quelle ist noch nicht verifiziert. -
Revision longStreng monotone Revision je Objekt, vom publizierenden Produkt bei einer Zustandsaenderung erhoeht und zusammen mit der Outbox persistiert. Wiederholungen behalten die Revision.
-
LastEventId ↗ extern: LastEventId uuidStabile EventId des zuletzt publizierten Zustands; bei Wiederholung derselben Outbox-Nachricht identisch.
-
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": "WebAccountState",
"namespace": "com.nexoware.connect.events",
"doc": "Vertragsentwurf: vollstaendiger veroeffentlichter Zustand fuer Web-Konto. Feldumfang aus dem archivierten WebAccountChanged; kein fachlicher Vergleich beider Produkte. Direkte Veroeffentlichung durch centron; kein Patch-Pfad. Grenzen, Migration und offene Fachregeln: docs/contracts/webaccount.md.",
"fields": [
{
"name": "WebAccountUuid",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Stabile, global eindeutige Identitaet des Web-Kontos (Matching-Schluessel; zugleich Message-Key)."
},
{
"name": "AccountUuid",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Referenz auf den Geschaeftspartner, zu dem das Web-Konto gehoert, ueber dessen UUID (Quelle AccountI3D). Parent-Referenz und damit Pflicht: kann der Producer sie nicht aufloesen, scheitert er laut, statt still null zu senden (event-envelope.md). Die Legacy fuehrt denselben Bezug als customer_id am ES-User und ueberspringt ein Web-Konto, dessen Eltern-Kunde nicht gemappt ist.",
"default": "00000000-0000-0000-0000-000000000000"
},
{
"name": "AccountAddressUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf die Anschrift des Geschaeftspartners, an der das Web-Konto haengt, ueber deren UUID (Quelle AccountAddressI3D). Es reist die Referenz, nicht die Anschrift: Rechnungs- und Lieferanschrift, die der Legacy-UserSync an den ES-User schreibt, liest der Konsument aus AddressState. Der Feldname ist derselbe wie am ContactPersonState - beide meinen die Anschrift eines Accounts, und der Identitaets-Index kennt nur AddressUuid (deshalb references am Feld). Vorsorglich optional geschnitten: ob AccountAddressI3D quellseitig garantiert ist, ist am c-entron-Quellcode nicht verifiziert (c-entron-schema-cut.md, Abschnitt 9). Ist die Referenz garantiert, gehoert das Feld auf Pflicht hochgezogen.",
"default": null,
"references": "Address"
},
{
"name": "ContactPersonUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf den Ansprechpartner, der dieses Web-Konto benutzt, ueber dessen UUID (Quelle AccountAddressContactI3D) - bereits akzeptierter Uebergangsfall fuer Personenbezug, wie am TicketState; die Identitaet des Ansprechpartners heisst ContactUuid (deshalb references am Feld). Es reist die Referenz, nicht die Person: Name, Mail, Telefon, Abteilung und Funktion stehen im ContactPersonState. Der Konsument braucht sie - ohne Mail-Adresse gibt es keine Registrierungs-Mail und damit kein Startpasswort (ADR-0017, Punkt 2). Vorsorglich optional geschnitten; null, solange kein Kontakt gepflegt ist. Ob AccountAddressContactI3D quellseitig garantiert ist, ist am c-entron-Quellcode nicht verifiziert (c-entron-schema-cut.md, Abschnitt 9) - ist die Referenz garantiert, gehoert das Feld auf Pflicht hochgezogen.",
"default": null,
"references": "ContactPerson"
},
{
"name": "Username",
"type": "string",
"doc": "Anmeldename des Web-Kontos, wie ihn c-entron fuehrt - meist eine Mail-Adresse und damit personenbeziehbar. Als Pflicht geschnitten: ein Web-Konto ohne Anmeldenamen ist keines, und die Legacy findet ein bestehendes Shop-Konto genau ueber Username und Kunde. Das zugehoerige Passwort ist nicht Teil dieses Vertrags und wird es nicht (ADR-0017, Punkt 1; siehe doc des Records). Die quellseitige Nullability ist noch nicht verifiziert (c-entron-schema-cut.md, Abschnitt 9).",
"default": ""
},
{
"name": "EsRoleUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Zuweisung des Web-Kontos zu einer ElectronicSales-Benutzerrolle, ueber die UUID des Rollen-Stammdatums (EsRoleState, Quelle EsRoleI3D). Die Rolle entsteht im Shop, die Zuweisung ist eine Eigenschaft des Web-Kontos und damit c-entron-Wahrheit - dasselbe Muster wie AccountState.EsGroupUuid beim Kunden (ADR-0016, Punkt 2). Erster Referent, den EsRoleState im Korpus hat. Null, wenn dem Konto keine Rolle zugewiesen ist. Was daraus folgt, entscheidet der Konsument: die Legacy sperrt ein Konto ohne Rolle im Shop (locked=1, approved=0). Das ist eine Shop-Regel und kein Quell-Zustand - sie faellt deshalb NICHT in State. Sonst liesse sich nicht mehr unterscheiden, ob c-entron das Konto deaktiviert hat oder ob nur die Rolle fehlt, und der Producer muesste eine Konsumenten-Auswertung mitrechnen (event-envelope.md, Leitprinzip).",
"default": null
},
{
"name": "State",
"type": "int",
"doc": "LWW-Statusfeld: 1 = aktiv, 0 = deaktiviert (Quelle WebAccountDTO.Status). Es traegt ausschliesslich den Zustand, den c-entron am Web-Konto selbst fuehrt; die Shop-Sperre, die der Legacy-UserSync aus einer fehlenden Rolle ableitet, gehoert nicht hierher (siehe EsRoleUuid). Deaktivierung reist als Voll-Snapshot mit geaendertem State, kein Tombstone; ein terminaler Tombstone bleibt der DSGVO-Erasure vorbehalten und ist eigener Track (ADR-0009, Punkt 9). Die Wertemenge der Quelle ist noch nicht verifiziert.",
"default": 0
},
{
"name": "Revision",
"type": "long",
"doc": "Streng monotone Revision je Objekt, vom publizierenden Produkt bei einer Zustandsaenderung erhoeht und zusammen mit der Outbox persistiert. Wiederholungen behalten die Revision."
},
{
"name": "LastEventId",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Stabile EventId des zuletzt publizierten Zustands; bei Wiederholung derselben Outbox-Nachricht identisch."
},
{
"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": "WebAccount",
"label": "Web-Konto",
"topic": "webaccount.state",
"key": "WebAccountUuid",
"cleanupPolicy": "compact",
"partitions": 1,
"writers": [
"centron"
],
"readers": [
"shop",
"nexoware-erp"
]
}