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

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;
}