Files
tasq/lib/utils/staff_presence.dart
T
redz1029 0c99ef270d refactor: extract staff presence helpers
- Extract activeLeaveByUser, activePassSlipByUser, and approvedLeaveDays to staff_presence.dart utility module
- Replace inline indexing loops in dashboard_screen.dart with helper function calls
- Behavior unchanged, tests added covering all functions

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-09-27 22:04:17 +08:00

64 lines
1.8 KiB
Dart

import 'package:tasq/models/leave_of_absence.model.dart';
import 'package:tasq/models/pass_slip.model.dart';
import 'programmer_daily_time.dart';
/// Index approved leaves covering the given moment by user ID.
///
/// Filters to leaves where:
/// - status == 'approved'
/// - startTime <= now < endTime
///
/// Returns a map from userId to the leave record.
Map<String, LeaveOfAbsence> activeLeaveByUser(
List<LeaveOfAbsence> leaves,
DateTime now,
) {
final result = <String, LeaveOfAbsence>{};
for (final leave in leaves) {
if (leave.status == 'approved' &&
!leave.startTime.isAfter(now) &&
leave.endTime.isAfter(now)) {
result[leave.userId] = leave;
}
}
return result;
}
/// Index active pass slips by user ID.
///
/// Filters to slips where slip.isActive is true.
///
/// Returns a map from userId to the pass slip record.
Map<String, PassSlip> activePassSlipByUser(List<PassSlip> slips) {
final result = <String, PassSlip>{};
for (final slip in slips) {
if (slip.isActive) {
result[slip.userId] = slip;
}
}
return result;
}
/// Get the set of Manila calendar days covered by approved leaves for a user.
///
/// Iterates through all approved leaves for the given user and collects the
/// set of Manila day keys (as DateTime.utc(year, month, day)) from each
/// leave's start date through end date, inclusive.
Set<DateTime> approvedLeaveDays(
List<LeaveOfAbsence> leaves,
String userId,
) {
final result = <DateTime>{};
for (final leave in leaves) {
if (leave.userId == userId && leave.status == 'approved') {
var current = manilaDay(leave.startTime);
final endDay = manilaDay(leave.endTime);
while (!current.isAfter(endDay)) {
result.add(current);
current = current.add(Duration(days: 1));
}
}
}
return result;
}