fix(programmer): buildMonitorEntries accepts pre-computed leave/passSlip maps

Changed buildMonitorEntries signature to accept Map<String, LeaveOfAbsence> and Map<String, PassSlip> instead of List types, matching the spec requirement that callers pass pre-computed maps from activeLeaveByUser() and activePassSlipByUser().

- Updated function signature for both parameters
- Removed internal calls to activeLeaveByUser/activePassSlipByUser
- Updated state-determination to use direct map lookups
- Updated all test cases to pass computed maps
- All 19 tests passing
- No new analyzer issues

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-09-27 22:27:11 +08:00
parent 935ee670e7
commit 791653f45c
2 changed files with 36 additions and 29 deletions
@@ -5,7 +5,6 @@ import 'package:tasq/models/programmer_task.model.dart';
import 'package:tasq/models/programmer_task_work_log.model.dart'; import 'package:tasq/models/programmer_task_work_log.model.dart';
import 'package:tasq/providers/programmer_day_data_provider.dart'; import 'package:tasq/providers/programmer_day_data_provider.dart';
import 'package:tasq/utils/programmer_day_rows.dart'; import 'package:tasq/utils/programmer_day_rows.dart';
import 'package:tasq/utils/staff_presence.dart';
enum MonitorState { working, paused, idle, onLeave, passSlip } enum MonitorState { working, paused, idle, onLeave, passSlip }
@@ -99,20 +98,21 @@ class ProgrammerMonitorEntry {
/// ///
/// Sort order: working -> paused -> idle -> passSlip -> onLeave, /// Sort order: working -> paused -> idle -> passSlip -> onLeave,
/// then alphabetical by programmer.fullName within each state group. /// then alphabetical by programmer.fullName within each state group.
///
/// Parameters [leaves] and [passSlips] should be pre-computed maps from
/// activeLeaveByUser() and activePassSlipByUser() respectively.
List<ProgrammerMonitorEntry> buildMonitorEntries({ List<ProgrammerMonitorEntry> buildMonitorEntries({
required List<Profile> programmers, required List<Profile> programmers,
required DayActivityData today, required DayActivityData today,
required Map<String, ProgrammerRunInfo> runStates, required Map<String, ProgrammerRunInfo> runStates,
required List<LeaveOfAbsence> leaves, required Map<String, LeaveOfAbsence> leaves,
required List<PassSlip> passSlips, required Map<String, PassSlip> passSlips,
required Map<String, String> sheetStatusByUser, required Map<String, String> sheetStatusByUser,
required Map<String, String> projectNames, required Map<String, String> projectNames,
required Map<String, String> profileNames, required Map<String, String> profileNames,
required DateTime now, required DateTime now,
}) { }) {
final taskById = {for (final t in today.tasks) t.id: t}; final taskById = {for (final t in today.tasks) t.id: t};
final activeLeaves = activeLeaveByUser(leaves, now);
final activePassSlips = activePassSlipByUser(passSlips);
final entries = <ProgrammerMonitorEntry>[]; final entries = <ProgrammerMonitorEntry>[];
@@ -122,9 +122,9 @@ List<ProgrammerMonitorEntry> buildMonitorEntries({
// Step 1: Determine state // Step 1: Determine state
// Priority: onLeave > passSlip > working/paused/idle // Priority: onLeave > passSlip > working/paused/idle
MonitorState state; MonitorState state;
if (activeLeaves.containsKey(programmerId)) { if (leaves.containsKey(programmerId)) {
state = MonitorState.onLeave; state = MonitorState.onLeave;
} else if (activePassSlips.containsKey(programmerId)) { } else if (passSlips.containsKey(programmerId)) {
state = MonitorState.passSlip; state = MonitorState.passSlip;
} else { } else {
// Determine from task states // Determine from task states
+29 -22
View File
@@ -8,6 +8,7 @@ import 'package:tasq/models/programmer_task_work_log.model.dart';
import 'package:tasq/providers/programmer_day_data_provider.dart'; import 'package:tasq/providers/programmer_day_data_provider.dart';
import 'package:tasq/screens/programmer_tasks/monitor/monitor_model.dart'; import 'package:tasq/screens/programmer_tasks/monitor/monitor_model.dart';
import 'package:tasq/utils/app_time.dart'; import 'package:tasq/utils/app_time.dart';
import 'package:tasq/utils/staff_presence.dart';
void main() { void main() {
setUpAll(AppTime.initialize); setUpAll(AppTime.initialize);
@@ -247,12 +248,13 @@ void main() {
logsByTask: {}, logsByTask: {},
workLogs: [], workLogs: [],
); );
final activeLeaves = activeLeaveByUser([leave], now);
final entries = buildMonitorEntries( final entries = buildMonitorEntries(
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: {}, runStates: {},
leaves: [leave], leaves: activeLeaves,
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -286,12 +288,13 @@ void main() {
logsByTask: {}, logsByTask: {},
workLogs: [], workLogs: [],
); );
final activePassSlips = activePassSlipByUser([slip]);
final entries = buildMonitorEntries( final entries = buildMonitorEntries(
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: {}, runStates: {},
leaves: [], leaves: {},
passSlips: [slip], passSlips: activePassSlips,
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -329,8 +332,8 @@ void main() {
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: runStates, runStates: runStates,
leaves: [], leaves: {},
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -369,8 +372,8 @@ void main() {
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: runStates, runStates: runStates,
leaves: [], leaves: {},
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -396,8 +399,8 @@ void main() {
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: {}, runStates: {},
leaves: [], leaves: {},
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -443,12 +446,13 @@ void main() {
final runStates = { final runStates = {
't1': (state: ProgrammerRunState.running, since: DateTime.utc(2026, 9, 27, 10, 0)), 't1': (state: ProgrammerRunState.running, since: DateTime.utc(2026, 9, 27, 10, 0)),
}; };
final activeLeaves = activeLeaveByUser([leave], now);
final entries = buildMonitorEntries( final entries = buildMonitorEntries(
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: runStates, runStates: runStates,
leaves: [leave], leaves: activeLeaves,
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -546,12 +550,15 @@ void main() {
't2': (state: ProgrammerRunState.paused, since: DateTime.utc(2026, 9, 27, 11, 0)), 't2': (state: ProgrammerRunState.paused, since: DateTime.utc(2026, 9, 27, 11, 0)),
}; };
final activeLeaves = activeLeaveByUser([leave], now);
final activePassSlips = activePassSlipByUser([slip]);
final entries = buildMonitorEntries( final entries = buildMonitorEntries(
programmers: [p1, p2, p3, p4, p5], programmers: [p1, p2, p3, p4, p5],
today: data, today: data,
runStates: runStates, runStates: runStates,
leaves: [leave], leaves: activeLeaves,
passSlips: [slip], passSlips: activePassSlips,
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -595,8 +602,8 @@ void main() {
programmers: [p1, p2, p3], programmers: [p1, p2, p3],
today: data, today: data,
runStates: {}, runStates: {},
leaves: [], leaves: {},
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -672,8 +679,8 @@ void main() {
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: runStates, runStates: runStates,
leaves: [], leaves: {},
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -733,8 +740,8 @@ void main() {
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: runStates, runStates: runStates,
leaves: [], leaves: {},
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},
@@ -764,8 +771,8 @@ void main() {
programmers: [programmer], programmers: [programmer],
today: data, today: data,
runStates: {}, runStates: {},
leaves: [], leaves: {},
passSlips: [], passSlips: {},
sheetStatusByUser: {}, sheetStatusByUser: {},
projectNames: {}, projectNames: {},
profileNames: {}, profileNames: {},