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:
@@ -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
|
||||||
|
|||||||
@@ -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: {},
|
||||||
|
|||||||
Reference in New Issue
Block a user