diff --git a/html/js/office-scene.js b/html/js/office-scene.js
index cd7ab35..8c99b12 100644
--- a/html/js/office-scene.js
+++ b/html/js/office-scene.js
@@ -624,9 +624,17 @@ export const PO_DISPLAY_NAME = "PO";
// und damit Sache des PO.
const PO_UNASSIGNED_EXCLUDED_COLUMNS = new Set(["fertig", "done"]);
+// Issue #32: Wechsel von/zu "in_arbeit" (Label "wip") setzt bzw. entfernt der Agent selbst, der
+// das Ticket nimmt bzw. abgibt - er meldet diese Bewegung ueber seinen eigenen state (POST
+// /api/v1/agents/{id}/activity, siehe resolveAgentVisualState()), nicht der PO. Ohne diesen
+// Ausschluss lief bislang faelschlich zusaetzlich der PO zum Board, sobald ein Agent ein Ticket
+// nahm oder abgab.
+const AGENT_OWNED_COLUMN = "in_arbeit";
+
/**
* Erkennt Ticket-Statuswechsel, die keiner Rolle zugeordnet sind (Gegenstueck zu
- * detectDoorVisits() fuer die bereits zugeordneten Faelle). Neu angelegte Tickets zaehlen hier
+ * detectDoorVisits() fuer die bereits zugeordneten Faelle, sowie zu den vom Agenten selbst
+ * gemeldeten "in_arbeit"-Wechseln, siehe AGENT_OWNED_COLUMN). Neu angelegte Tickets zaehlen hier
* nicht mit - die sind bereits Sache von detectDoorVisits()/NEW_BACKLOG_TICKET.
*
* @param {Array<{id: number, column_name: string}>} previousTickets
@@ -645,6 +653,9 @@ export function detectUnassignedTicketChanges(previousTickets = [], currentTicke
if (PO_UNASSIGNED_EXCLUDED_COLUMNS.has(ticket.column_name)) {
continue;
}
+ if (before.column_name === AGENT_OWNED_COLUMN || ticket.column_name === AGENT_OWNED_COLUMN) {
+ continue;
+ }
changes.push({ ticketId: ticket.id, column: ticket.column_name });
}
diff --git a/tests/frontend/office-scene.test.js b/tests/frontend/office-scene.test.js
index 977e2fd..44afce0 100644
--- a/tests/frontend/office-scene.test.js
+++ b/tests/frontend/office-scene.test.js
@@ -551,6 +551,20 @@ test("detectUnassignedTicketChanges ignoriert Tickets ohne Spaltenwechsel", () =
assert.deepEqual(detectUnassignedTicketChanges(before, after), []);
});
+test("detectUnassignedTicketChanges ignoriert Wechsel von/zu in_arbeit (Label wip - Sache des Agenten, Issue #32)", () => {
+ const before = [
+ { id: 1, column_name: "bereit" },
+ { id: 2, column_name: "in_arbeit" },
+ { id: 3, column_name: "in_arbeit" },
+ ];
+ const after = [
+ { id: 1, column_name: "in_arbeit" },
+ { id: 2, column_name: "testing" },
+ { id: 3, column_name: "backlog" },
+ ];
+ assert.deepEqual(detectUnassignedTicketChanges(before, after), []);
+});
+
test("detectUnassignedTicketChanges verarbeitet mehrere gleichzeitige Wechsel", () => {
const before = [
{ id: 1, column_name: "backlog" },
@@ -562,10 +576,7 @@ test("detectUnassignedTicketChanges verarbeitet mehrere gleichzeitige Wechsel",
{ id: 2, column_name: "in_arbeit" },
{ id: 3, column_name: "fertig" },
];
- assert.deepEqual(detectUnassignedTicketChanges(before, after), [
- { ticketId: 1, column: "bereit" },
- { ticketId: 2, column: "in_arbeit" },
- ]);
+ assert.deepEqual(detectUnassignedTicketChanges(before, after), [{ ticketId: 1, column: "bereit" }]);
});
test("advancePoVisitStage durchlaeuft alle Stages und liefert am Ende null", () => {