footer
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user