99
1010
1111async def async_get_bank_holidays (country : str , year : int ) -> list :
12- """Hent banklukkedage fra Nager.Date API for et givent land og aar."""
1312 url = API_HOLIDAYS .format (year = year , country = country )
1413 _LOGGER .debug ("Henter banklukkedage fra: %s" , url )
1514
@@ -27,16 +26,25 @@ async def async_get_bank_holidays(country: str, year: int) -> list:
2726
2827
2928async def async_calculate_next_payday (country : str , pay_frequency : str , pay_day = None , last_pay_date = None , weekday = None , bank_offset = 0 ):
30- """Udregn naeste loenningsdag baseret paa konfiguration."""
3129 _LOGGER .info ("Starter beregning af naeste loenningsdag for %s med frekvens: %s" , country , pay_frequency )
3230
3331 today = date .today ()
3432 year = today .year
35-
3633 bank_holidays = await async_get_bank_holidays (country , year )
3734
38- if pay_frequency == PAY_FREQ_MONTHLY :
39- payday = await async_calculate_monthly (pay_day , bank_holidays , today , bank_offset )
35+ if pay_frequency in (
36+ PAY_FREQ_MONTHLY , PAY_FREQ_BIMONTHLY ,
37+ PAY_FREQ_QUARTERLY , PAY_FREQ_SEMIANNUAL ,
38+ PAY_FREQ_ANNUAL
39+ ):
40+ months = {
41+ PAY_FREQ_MONTHLY : 1 ,
42+ PAY_FREQ_BIMONTHLY : 2 ,
43+ PAY_FREQ_QUARTERLY : 3 ,
44+ PAY_FREQ_SEMIANNUAL : 6 ,
45+ PAY_FREQ_ANNUAL : 12 ,
46+ }[pay_frequency ]
47+ payday = await async_calculate_month_based (today , months , pay_day , bank_offset , bank_holidays )
4048
4149 elif pay_frequency in (PAY_FREQ_28_DAYS , PAY_FREQ_14_DAYS ):
4250 interval = 28 if pay_frequency == PAY_FREQ_28_DAYS else 14
@@ -52,37 +60,33 @@ async def async_calculate_next_payday(country: str, pay_frequency: str, pay_day=
5260 return None
5361
5462 payday = await async_adjust_for_bank_holidays_and_weekends (payday , bank_holidays )
55-
5663 _LOGGER .info ("Naeste loenningsdag efter justering: %s" , payday )
5764 return payday
5865
5966
60- async def async_calculate_monthly (pay_day , bank_holidays , today , bank_offset ):
61- """Beregner naeste maanedlige loenningsdag baseret paa pay_day type."""
67+ async def async_calculate_month_based (today , month_interval , pay_day , bank_offset , bank_holidays ):
6268 year , month = today .year , today .month
6369
64- if pay_day == PAY_DAY_LAST_BANK_DAY :
65- payday = await async_find_last_bank_day (year , month , bank_holidays , bank_offset )
66- elif pay_day == PAY_DAY_FIRST_BANK_DAY :
67- payday = await async_find_first_bank_day (year , month , bank_holidays )
68- elif isinstance (pay_day , int ):
69- payday = await async_find_specific_day (year , month , pay_day , bank_holidays )
70- else :
71- _LOGGER .error ("Ugyldig pay_day vaerdi: %s" , pay_day )
72- return None
73-
74- if payday < today : # Rettet fra <= til <
75- month += 1
76- if month > 12 :
77- month = 1
78- year += 1
79- return await async_calculate_monthly (pay_day , bank_holidays , date (year , month , 1 ), bank_offset )
70+ while True :
71+ if pay_day == PAY_DAY_LAST_BANK_DAY :
72+ payday = await async_find_last_bank_day (year , month , bank_holidays , bank_offset )
73+ elif pay_day == PAY_DAY_FIRST_BANK_DAY :
74+ payday = await async_find_first_bank_day (year , month , bank_holidays )
75+ elif isinstance (pay_day , int ):
76+ payday = await async_find_specific_day (year , month , pay_day , bank_holidays )
77+ else :
78+ _LOGGER .error ("Ugyldig pay_day vaerdi: %s" , pay_day )
79+ return None
80+
81+ if payday >= today :
82+ return payday
8083
81- return payday
84+ month += month_interval
85+ year += (month - 1 ) // 12
86+ month = (month - 1 ) % 12 + 1
8287
8388
8489async def async_calculate_recurring (last_pay_date , interval , bank_holidays ):
85- """Beregner naeste loenningsdag for 14- eller 28-dages interval."""
8690 if not last_pay_date :
8791 _LOGGER .error ("Mangler sidste loenningsdato for tilbagevendende betaling." )
8892 return None
@@ -91,51 +95,45 @@ async def async_calculate_recurring(last_pay_date, interval, bank_holidays):
9195 payday = last_date + timedelta (days = interval )
9296
9397 today = date .today ()
94- while payday < today : # Rettet fra <= til <
98+ while payday < today :
9599 payday += timedelta (days = interval )
96100
97101 _LOGGER .info ("Naeste tilbagevendende loenningsdag beregnet til: %s" , payday )
98102 return payday
99103
100104
101105async def async_calculate_weekly (today , weekday , bank_holidays ):
102- """Beregner naeste ugentlige loenningsdag."""
103106 days_ahead = (weekday - today .weekday ()) % 7
104107 payday = today + timedelta (days = days_ahead )
105-
106- payday = await async_adjust_for_bank_holidays_and_weekends (payday , bank_holidays )
107-
108- _LOGGER .info ("Naeste ugentlige loenningsdag beregnet til: %s" , payday )
109108 return payday
110109
111110
112111async def async_find_last_bank_day (year , month , bank_holidays , bank_offset ):
113- """Finder sidste bankdag i maaneden."""
114112 day = 31
115- while True :
113+ while day > 0 :
116114 try :
117115 payday = date (year , month , day )
118116 if payday .weekday () < 5 and payday not in bank_holidays :
119- payday -= timedelta (days = bank_offset )
120- return payday
117+ return payday - timedelta (days = bank_offset )
121118 day -= 1
122119 except ValueError :
123120 day -= 1
124121
125122
126123async def async_find_first_bank_day (year , month , bank_holidays ):
127- """Finder foerste bankdag i maaneden."""
128124 day = 1
129- while True :
130- payday = date (year , month , day )
131- if payday .weekday () < 5 and payday not in bank_holidays :
132- return payday
133- day += 1
125+ while day <= 31 :
126+ try :
127+ payday = date (year , month , day )
128+ if payday .weekday () < 5 and payday not in bank_holidays :
129+ return payday
130+ day += 1
131+ except ValueError :
132+ day += 1
134133
135134
136135async def async_find_specific_day (year , month , day , bank_holidays ):
137- """Finder specifik dag i maaneden og flytter bagud ved helligdag/weekend."""
138- while True :
136+ while day > 0 :
139137 try :
140138 payday = date (year , month , day )
141139 if payday .weekday () < 5 and payday not in bank_holidays :
@@ -146,8 +144,6 @@ async def async_find_specific_day(year, month, day, bank_holidays):
146144
147145
148146async def async_adjust_for_bank_holidays_and_weekends (payday , bank_holidays ):
149- """Flytter dato bagud hvis den falder paa weekend eller banklukket dag."""
150147 while payday .weekday () >= 5 or payday in bank_holidays :
151148 payday -= timedelta (days = 1 )
152-
153149 return payday
0 commit comments