You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.2 KiB
Dart
40 lines
1.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../models/work_interval.dart';
|
|
|
|
int _toMinutes(TimeOfDay t) => t.hour * 60 + t.minute;
|
|
|
|
/// Effektive Arbeitsminuten eines Tages nach Pausenregel:
|
|
/// - <= 6h Arbeit: keine Pflichtpause
|
|
/// - > 6h Arbeit: 30 Min Pflichtpause, reduziert um die Summe der Lücken
|
|
/// zwischen Intervallen (maximal bis 0 reduzierbar).
|
|
int effectiveWorkedMinutes(
|
|
List<WorkInterval> intervals, {
|
|
int requiredBreakOver6h = 30,
|
|
}) {
|
|
if (intervals.isEmpty) return 0;
|
|
|
|
// sortieren
|
|
final sorted = [...intervals]
|
|
..sort((a, b) => _toMinutes(a.start).compareTo(_toMinutes(b.start)));
|
|
|
|
// Arbeitszeit summieren
|
|
int worked = 0;
|
|
for (final iv in sorted) {
|
|
final w = _toMinutes(iv.end) - _toMinutes(iv.start);
|
|
if (w > 0) worked += w;
|
|
}
|
|
|
|
if (worked <= 6 * 60) return worked;
|
|
|
|
// Lücken summieren
|
|
int gaps = 0;
|
|
for (var i = 0; i < sorted.length - 1; i++) {
|
|
final gap = _toMinutes(sorted[i + 1].start) - _toMinutes(sorted[i].end);
|
|
if (gap > 0) gaps += gap;
|
|
}
|
|
|
|
final extraBreak = (requiredBreakOver6h - gaps).clamp(0, requiredBreakOver6h);
|
|
final effective = worked - extraBreak;
|
|
return effective < 0 ? 0 : effective;
|
|
}
|