Verträge / TicketTimerState
Ticket-Zeiterfassung State
TicketTimerState · com.nexoware.connect.events
- Aggregat
- TicketTimer · Patch TicketTimerPatch
- Topic
- tickettimer.state je Mandant mit Präfix, z. B.
<mandant>.tickettimer.state - Key
- TicketTimerUuid
- 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
- 103
Vertragsentwurf: vollstaendiger veroeffentlichter Zustand fuer Ticket-Zeiterfassung. Feldumfang aus dem archivierten TicketTimerChanged; kein fachlicher Vergleich beider Produkte. Einziger State-Writer ist merge; Produkte veroeffentlichen typisierte Patches. Grenzen, Migration und offene Fachregeln: docs/contracts/tickettimer.md.
Fassungen
Felder
-
TicketTimerUuid Key uuidStabile, global eindeutige Identitaet der Zeitbuchung (Matching-Schluessel; zugleich Message-Key).
-
Pflicht-Referenz auf das Ticket (Parent, Quelle RequestI3D non-null) ueber dessen UUID. Kann der Producer sie nicht aufloesen, scheitert die Avro-Projektion laut (Failed-Outbox-Zeile) statt still null zu senden. Consumer: Defer-and-Retry, wenn das Ticket noch nicht angekommen ist.
-
Default:
nullReferenz auf den erfassenden Mitarbeiter (Quelle PersonalI3D) ueber dessen UUID. Fachlich traegt jede Zeitbuchung einen Mitarbeiter (der Save setzt den angemeldeten Benutzer als Default); optional, weil die Quell-Referenz mit NotFound.Ignore gemappt ist (fehlendes Stammdatum -> null). Aufloesbar erst mit employee.state (selbst DSGVO-blockiert) - bis dahin als opake Uuid speichern. -
Default:
nullReferenz auf den Abrechnungs-Artikel der Zeitbuchung (Quelle ArtikelI3D) ueber dessen UUID; DB nullable. -
TypeName optional stringDefault:
nullZeiterfassungs-Art als Wert-Kopie (HelpdeskTimerTypes.Name, z. B. Remote/Vor Ort; installationsspezifischer Katalog ohne eigenes Topic); DB nullable. -
Timing TicketTimerTimingAtomare Zeitangaben: Start, Stop, DurationSeconds und LunchTimeSeconds werden gemeinsam ersetzt. DurationSeconds ist aus Stop - Start abgeleitet; keine einzelnen Patch-Pfade unter Timing. Der Producer liefert den vollstaendigen, konsistent berechneten Wert.
4 Felder von
TicketTimerTiming-
Start timestampDefault:
0Beginn der Zeitbuchung als UTC-Instant (Quelle Start, non-null; Host-lokale Zeit, beim Publish nach UTC konvertiert). -
Stop timestampDefault:
0Ende der Zeitbuchung als UTC-Instant (Quelle Stop, non-null). -
DurationSeconds intDefault:
0Dauer in Sekunden (Quelle Timer; wird beim Save aus Stop - Start neu berechnet, Pausen nicht abgezogen). -
LunchTimeSeconds optional intDefault:
nullPausenzeit in Sekunden (Quelle LunchTime); DB nullable, der Save setzt 0 als Default.
-
-
Calculable booleanAbrechenbar-Kennzeichen (Quelle Berechenbar, non-null).
-
IsPlanned booleanPlan-Kennzeichen (Quelle Geplant, non-null): true = geplante Zeit (noch keine Ist-Zeit), false = erfasste Ist-Zeit.
-
ExternalNote optional stringDefault:
nullExterne Taetigkeitsbeschreibung / Servicebericht-Text (Quelle Bemerkung); DB nullable, der Save setzt Leerstring als Default. Die interne Notiz (InterneNotiz) ist bewusst NICHT Teil des Vertrags. -
IsDeleted booleanLWW-Statusfeld: false bei jedem Save, true im letzten Voll-Snapshot vor dem quellseitigen Hard-Delete (HelpdeskTimerBL.DeleteHelpdeskTimer). Kein Tombstone - der bleibt der DSGVO-Erasure vorbehalten.
-
CreatedAt timestampAnlagezeitpunkt der Zeitbuchung als UTC-Instant (Quelle CreatedDate, vom Save immer gesetzt; Host-lokale Zeit, beim Publish nach UTC konvertiert).
-
Revision longAnzahl der zustandsaendernden Patches seit Anlage; vom Zusammenfuehrungsdienst gesetzt.
-
LastEventId ↗ extern: LastEventId uuidEventId des zuletzt angewandten Patches; vom Zusammenfuehrungsdienst gesetzt.
-
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": "TicketTimerState",
"namespace": "com.nexoware.connect.events",
"doc": "Vertragsentwurf: vollstaendiger veroeffentlichter Zustand fuer Ticket-Zeiterfassung. Feldumfang aus dem archivierten TicketTimerChanged; kein fachlicher Vergleich beider Produkte. Einziger State-Writer ist merge; Produkte veroeffentlichen typisierte Patches. Grenzen, Migration und offene Fachregeln: docs/contracts/tickettimer.md.",
"fields": [
{
"name": "TicketTimerUuid",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Stabile, global eindeutige Identitaet der Zeitbuchung (Matching-Schluessel; zugleich Message-Key)."
},
{
"name": "TicketUuid",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "Pflicht-Referenz auf das Ticket (Parent, Quelle RequestI3D non-null) ueber dessen UUID. Kann der Producer sie nicht aufloesen, scheitert die Avro-Projektion laut (Failed-Outbox-Zeile) statt still null zu senden. Consumer: Defer-and-Retry, wenn das Ticket noch nicht angekommen ist."
},
{
"name": "EmployeeUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf den erfassenden Mitarbeiter (Quelle PersonalI3D) ueber dessen UUID. Fachlich traegt jede Zeitbuchung einen Mitarbeiter (der Save setzt den angemeldeten Benutzer als Default); optional, weil die Quell-Referenz mit NotFound.Ignore gemappt ist (fehlendes Stammdatum -> null). Aufloesbar erst mit employee.state (selbst DSGVO-blockiert) - bis dahin als opake Uuid speichern.",
"default": null
},
{
"name": "ArticleUuid",
"type": [
"null",
{
"type": "string",
"logicalType": "uuid"
}
],
"doc": "Referenz auf den Abrechnungs-Artikel der Zeitbuchung (Quelle ArtikelI3D) ueber dessen UUID; DB nullable.",
"default": null
},
{
"name": "TypeName",
"type": [
"null",
"string"
],
"doc": "Zeiterfassungs-Art als Wert-Kopie (HelpdeskTimerTypes.Name, z. B. Remote/Vor Ort; installationsspezifischer Katalog ohne eigenes Topic); DB nullable.",
"default": null
},
{
"name": "Timing",
"type": {
"type": "record",
"name": "TicketTimerTiming",
"fields": [
{
"name": "Start",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
},
"doc": "Beginn der Zeitbuchung als UTC-Instant (Quelle Start, non-null; Host-lokale Zeit, beim Publish nach UTC konvertiert).",
"default": 0
},
{
"name": "Stop",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
},
"doc": "Ende der Zeitbuchung als UTC-Instant (Quelle Stop, non-null).",
"default": 0
},
{
"name": "DurationSeconds",
"type": "int",
"doc": "Dauer in Sekunden (Quelle Timer; wird beim Save aus Stop - Start neu berechnet, Pausen nicht abgezogen).",
"default": 0
},
{
"name": "LunchTimeSeconds",
"type": [
"null",
"int"
],
"doc": "Pausenzeit in Sekunden (Quelle LunchTime); DB nullable, der Save setzt 0 als Default.",
"default": null
}
]
},
"doc": "Atomare Zeitangaben: Start, Stop, DurationSeconds und LunchTimeSeconds werden gemeinsam ersetzt. DurationSeconds ist aus Stop - Start abgeleitet; keine einzelnen Patch-Pfade unter Timing. Der Producer liefert den vollstaendigen, konsistent berechneten Wert."
},
{
"name": "Calculable",
"type": "boolean",
"doc": "Abrechenbar-Kennzeichen (Quelle Berechenbar, non-null)."
},
{
"name": "IsPlanned",
"type": "boolean",
"doc": "Plan-Kennzeichen (Quelle Geplant, non-null): true = geplante Zeit (noch keine Ist-Zeit), false = erfasste Ist-Zeit."
},
{
"name": "ExternalNote",
"type": [
"null",
"string"
],
"doc": "Externe Taetigkeitsbeschreibung / Servicebericht-Text (Quelle Bemerkung); DB nullable, der Save setzt Leerstring als Default. Die interne Notiz (InterneNotiz) ist bewusst NICHT Teil des Vertrags.",
"default": null
},
{
"name": "IsDeleted",
"type": "boolean",
"doc": "LWW-Statusfeld: false bei jedem Save, true im letzten Voll-Snapshot vor dem quellseitigen Hard-Delete (HelpdeskTimerBL.DeleteHelpdeskTimer). Kein Tombstone - der bleibt der DSGVO-Erasure vorbehalten."
},
{
"name": "CreatedAt",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
},
"doc": "Anlagezeitpunkt der Zeitbuchung als UTC-Instant (Quelle CreatedDate, vom Save immer gesetzt; Host-lokale Zeit, beim Publish nach UTC konvertiert)."
},
{
"name": "Revision",
"type": "long",
"doc": "Anzahl der zustandsaendernden Patches seit Anlage; vom Zusammenfuehrungsdienst gesetzt."
},
{
"name": "LastEventId",
"type": {
"type": "string",
"logicalType": "uuid"
},
"doc": "EventId des zuletzt angewandten Patches; vom Zusammenfuehrungsdienst gesetzt."
},
{
"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": "TicketTimer",
"label": "Ticket-Zeiterfassung",
"topic": "tickettimer.state",
"key": "TicketTimerUuid",
"cleanupPolicy": "compact",
"partitions": 1,
"writers": [
"merge"
],
"readers": [
"centron",
"nexoware-erp"
]
}