Skip to content

Instantly share code, notes, and snippets.

@deniskrumko
Created October 21, 2022 10:14
Show Gist options
  • Save deniskrumko/237ce00dc865b26074e1a8f32956b456 to your computer and use it in GitHub Desktop.
Save deniskrumko/237ce00dc865b26074e1a8f32956b456 to your computer and use it in GitHub Desktop.
Calculate if you are resident or not
from datetime import datetime, timedelta
from functools import lru_cache
CALC_START = '01.01.2021'
CALC_END = '01.01.2024'
TRIPS = [
('08.03.2022', '03.04.2022'),
('01.10.2022', '15.10.2022'),
('15.10.2022', None),
]
DATE_FORMAT = '%d.%m.%Y'
RESIDENT_DAYS = 183
@lru_cache(maxsize=1000)
def is_trip(day):
for trip_start, trip_end in TRIPS:
if (trip_start <= day) and ((day < trip_end) if trip_end else True):
return True
return False
def calc_days_at_home(start, end):
days_at_home = 0
while start <= end:
days_at_home += not is_trip(start)
start += timedelta(days=1)
return days_at_home
def main():
print(f'Calc boundaries: {CALC_START} - {CALC_END}')
calc_start = datetime.strptime(CALC_START, DATE_FORMAT)
calc_end = datetime.strptime(CALC_END, DATE_FORMAT)
for i, trip in enumerate(TRIPS):
trip_start, trip_end = trip
print(f' - trip {i + 1}: {trip_start} - {trip_end or "current"}')
trip_start = datetime.strptime(trip_start, DATE_FORMAT)
trip_end = datetime.strptime(trip_end, DATE_FORMAT) if trip_end else None
TRIPS[i] = (trip_start, trip_end)
start = calc_start
while True:
end = start.replace(year=start.year + 1)
days_at_home = calc_days_at_home(
start=start,
end=end,
)
if days_at_home < RESIDENT_DAYS:
print(f'\nResidence expire at {end.strftime(DATE_FORMAT)}')
break
elif start == calc_end:
print('\nResidence would not expire in these boundaries!')
break
else:
start += timedelta(days=1)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment