diff --git a/lib/utils/programmer_daily_time.dart b/lib/utils/programmer_daily_time.dart index 83cc2b49..afd4e367 100644 --- a/lib/utils/programmer_daily_time.dart +++ b/lib/utils/programmer_daily_time.dart @@ -88,6 +88,7 @@ List workedIntervals({ break; case 'reassigned': + final wasRunning = segmentStart != null; if (segmentStart != null) { // Close segment for old assignee intervals.add(( @@ -95,11 +96,14 @@ List workedIntervals({ start: segmentStart, end: log.createdAt, )); + segmentStart = null; } - // Update assignee and reopen segment + // Update assignee and reopen segment only if it was running if (log.meta?['assignee_id'] != null) { currentAssignee = log.meta!['assignee_id'] as String; - segmentStart = log.createdAt; + if (wasRunning) { + segmentStart = log.createdAt; + } } break; } diff --git a/test/programmer_daily_time_test.dart b/test/programmer_daily_time_test.dart index db4925f7..dd74bd80 100644 --- a/test/programmer_daily_time_test.dart +++ b/test/programmer_daily_time_test.dart @@ -235,4 +235,33 @@ void main() { final result = dailySecondsByAssignee(task: task, logs: logs, now: now); expect(result['a']![DateTime.utc(2026, 9, 27)], 3600); // not 6 hours }); + + test('reassignment while paused does not open a new segment for the new assignee', () { + // task: started 09:00, paused 10:00, reassigned {assignee_id:'b'} 11:00, completed 12:00 (all Sep 27) + // expected: a -> 3600s (09-10), b -> 0 (no interval opened after paused reassignment) + final task = _task( + status: ProgrammerTaskStatus.completed, + creatorId: 'a', + assigneeId: 'b', + startedAt: AppTime.fromComponents(year: 2026, month: 9, day: 27, hour: 9), + completedAt: + AppTime.fromComponents(year: 2026, month: 9, day: 27, hour: 12), + ); + final logs = [ + _ev('started', 27, 9), + _ev('paused', 27, 10), + _ev('reassigned', 27, 11, 0, {'assignee_id': 'b'}), + _ev('completed', 27, 12), + ]; + final now = + AppTime.fromComponents(year: 2026, month: 9, day: 27, hour: 20); + + final result = dailySecondsByAssignee(task: task, logs: logs, now: now); + expect(result['a']![DateTime.utc(2026, 9, 27)], 3600); // a worked 09-10 + // b should have no time, or null entry + expect( + result['b']?[DateTime.utc(2026, 9, 27)] ?? 0, + 0, + ); + }); }