from .dates_add_days import add_days, days_between from .dates_add_months import add_months from .hr_length_of_service_types import ServiceLength def length_of_service(start_date: str, end_date: str) -> ServiceLength: """Completed years, months and days of service, both end dates included. The end is moved to the following day so that a service period ending on the eve of an anniversary counts as a whole year; forgetting that is the off-by-one that denies someone a statutory right by a day. """ total_days = days_between(start_date, end_date) + 1 if total_days < 1: raise ValueError("endDate %s is before startDate %s" % (end_date, start_date)) end_exclusive = add_days(end_date, 1) months = (int(end_exclusive[0:4]) - int(start_date[0:4])) * 12 + (int(end_exclusive[5:7]) - int(start_date[5:7])) while months > 0 and add_months(start_date, months) > end_exclusive: months -= 1 anniversary = add_months(start_date, months) return ServiceLength( years=months // 12, months=months % 12, days=days_between(anniversary, end_exclusive), total_days=total_days, )