Files
krow-worker-app/lib/models/timecard.dart
2026-09-17 22:26:11 +05:30

71 lines
1.9 KiB
Dart

enum TimecardStatus { needsReview, approved, disputed }
extension TimecardStatusX on TimecardStatus {
String get label => switch (this) {
TimecardStatus.needsReview => 'Needs review',
TimecardStatus.approved => 'Approved',
TimecardStatus.disputed => 'Disputed',
};
}
class Timecard {
Timecard({
required this.id,
required this.shiftId,
required this.role,
required this.business,
required this.scheduledStart,
required this.scheduledEnd,
required this.clockIn,
required this.clockOut,
required this.breakMinutes,
required this.rate,
required this.status,
required this.submittedAt,
this.disputeNote,
});
final String id;
final String shiftId;
final String role;
final String business;
final DateTime scheduledStart;
final DateTime scheduledEnd;
final DateTime clockIn;
final DateTime clockOut;
final int breakMinutes;
final double rate;
final TimecardStatus status;
final DateTime submittedAt;
final String? disputeNote;
DateTime get date =>
DateTime(scheduledStart.year, scheduledStart.month, scheduledStart.day);
Duration get worked {
final d = clockOut.difference(clockIn) - Duration(minutes: breakMinutes);
return d.isNegative ? Duration.zero : d;
}
double get amount => rate * worked.inMinutes / 60;
/// Minutes late (positive) or early (negative) against the schedule.
int get varianceMinutes => clockIn.difference(scheduledStart).inMinutes;
Timecard copyWith({TimecardStatus? status, String? disputeNote}) => Timecard(
id: id,
shiftId: shiftId,
role: role,
business: business,
scheduledStart: scheduledStart,
scheduledEnd: scheduledEnd,
clockIn: clockIn,
clockOut: clockOut,
breakMinutes: breakMinutes,
rate: rate,
status: status ?? this.status,
submittedAt: submittedAt,
disputeNote: disputeNote ?? this.disputeNote,
);
}