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.

73 lines
2.4 KiB
Dart

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// lib/utils/holidays_at.dart
import 'helpers.dart'; // ymd(DateTime)
DateTime _easterSunday(int year) {
final a = year % 19;
final b = year ~/ 100;
final c = year % 100;
final d = b ~/ 4;
final e = b % 4;
final f = ((b + 8) ~/ 25);
final g = ((b - f + 1) ~/ 3);
final h = (19 * a + b - d - g + 15) % 30;
final i = c ~/ 4;
final k = c % 4;
final l = (32 + 2 * e + 2 * i - h - k) % 7;
final m = ((a + 11 * h + 22 * l) ~/ 451);
final month = ((h + l - 7 * m + 114) ~/ 31);
final day = ((h + l - 7 * m + 114) % 31) + 1;
return DateTime(year, month, day);
}
DateTime _addDays(DateTime d, int days) => DateTime(d.year, d.month, d.day + days);
Map<String, String> buildHolidayMapAT(
int year, {
bool includeWeekends = false,
}) {
final Map<String, String> map = {};
// setzt nur, wenn noch nichts gesetzt wurde (echte Feiertage sollen Vorrang haben)
void putIfEmpty(DateTime date, String name) {
final key = ymd(date);
map.putIfAbsent(key, () => name);
}
// Bewegliche Feiertage
final easter = _easterSunday(year);
// (Karfreitag ist in AT nicht generell arbeitsfrei ggf. entfernen)
putIfEmpty(_addDays(easter, -2), 'Karfreitag');
putIfEmpty(_addDays(easter, 1), 'Ostermontag');
putIfEmpty(_addDays(easter, 39), 'Christi Himmelfahrt');
putIfEmpty(_addDays(easter, 50), 'Pfingstmontag');
putIfEmpty(_addDays(easter, 60), 'Fronleichnam');
// Feste Feiertage
putIfEmpty(DateTime(year, 1, 1), 'Neujahr');
putIfEmpty(DateTime(year, 1, 6), 'Heilige Drei Könige');
putIfEmpty(DateTime(year, 5, 1), 'Staatsfeiertag');
putIfEmpty(DateTime(year, 8, 15), 'Mariä Himmelfahrt');
putIfEmpty(DateTime(year, 10, 26), 'Nationalfeiertag');
putIfEmpty(DateTime(year, 11, 1), 'Allerheiligen');
putIfEmpty(DateTime(year, 12, 8), 'Mariä Empfängnis');
putIfEmpty(DateTime(year, 12, 25), 'Christtag');
putIfEmpty(DateTime(year, 12, 26), 'Stefanitag');
// Optional: Wochenenden **nur ergänzen**, aber niemals Feiertage überschreiben
if (includeWeekends) {
DateTime d = DateTime(year, 1, 1);
while (d.year == year) {
final wd = d.weekday;
if (wd == DateTime.saturday || wd == DateTime.sunday) {
final key = ymd(d);
if (!map.containsKey(key)) {
putIfEmpty(d, wd == DateTime.saturday ? 'Samstag' : 'Sonntag');
}
}
d = d.add(const Duration(days: 1));
}
}
return map;
}