|
|
|
|
@ -1,50 +1,72 @@
|
|
|
|
|
import '../utils/helpers.dart';
|
|
|
|
|
|
|
|
|
|
/// Sehr vereinfachte österreichische Feiertage (bundesweit).
|
|
|
|
|
/// Key = 'YYYY-MM-DD', Value = Name.
|
|
|
|
|
Map<String, String> buildHolidayMapAT(int year) {
|
|
|
|
|
final Map<String, String> m = {};
|
|
|
|
|
|
|
|
|
|
DateTime easter = _easterSunday(year);
|
|
|
|
|
DateTime easterMon = easter.add(const Duration(days: 1));
|
|
|
|
|
DateTime ascension = easter.add(const Duration(days: 39));
|
|
|
|
|
DateTime whitMon = easter.add(const Duration(days: 50));
|
|
|
|
|
DateTime corpusChristi = easter.add(const Duration(days: 60));
|
|
|
|
|
|
|
|
|
|
void add(DateTime d, String name) => m[ymd(d)] = name;
|
|
|
|
|
|
|
|
|
|
add(DateTime(year, 1, 1), 'Neujahr');
|
|
|
|
|
add(DateTime(year, 1, 6), 'Heilige Drei Könige');
|
|
|
|
|
add(easterMon, 'Ostermontag');
|
|
|
|
|
add(DateTime(year, 5, 1), 'Staatsfeiertag');
|
|
|
|
|
add(ascension, 'Christi Himmelfahrt');
|
|
|
|
|
add(whitMon, 'Pfingstmontag');
|
|
|
|
|
add(corpusChristi, 'Fronleichnam');
|
|
|
|
|
add(DateTime(year, 8, 15), 'Mariä Himmelfahrt');
|
|
|
|
|
add(DateTime(year, 10, 26), 'Nationalfeiertag');
|
|
|
|
|
add(DateTime(year, 11, 1), 'Allerheiligen');
|
|
|
|
|
add(DateTime(year, 12, 8), 'Mariä Empfängnis');
|
|
|
|
|
add(DateTime(year, 12, 25), 'Christtag');
|
|
|
|
|
add(DateTime(year, 12, 26), 'Stefanitag');
|
|
|
|
|
|
|
|
|
|
return m;
|
|
|
|
|
}
|
|
|
|
|
// lib/utils/holidays_at.dart
|
|
|
|
|
import 'helpers.dart'; // ymd(DateTime)
|
|
|
|
|
|
|
|
|
|
/// Gaußsche Osterformel (Gregorianisch)
|
|
|
|
|
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 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; // 3=March, 4=April
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|