def get_month_supervision_type( any_date_in_month: datetime.date, supervision_sentences: List[StateSupervisionSentence], incarceration_sentences: List[StateIncarcerationSentence], supervision_period: StateSupervisionPeriod ) -> StateSupervisionPeriodSupervisionType: """Supervision type can change over time even if the period does not change. This function calculates the supervision type that a given supervision period represents during the month that |any_date_in_month| falls in. The objects / info we use to determine supervision type may be state-specific. Args: any_date_in_month: (date) Any day in the month to consider supervision_period: (StateSupervisionPeriod) The supervision period we want to associate a supervision type with supervision_sentences: (List[StateSupervisionSentence]) All supervision sentences for a given person. """ if supervision_period.state_code == 'US_MO': return us_mo_get_month_supervision_type(any_date_in_month, supervision_sentences, incarceration_sentences, supervision_period) return get_month_supervision_type_default(any_date_in_month, supervision_sentences, incarceration_sentences, supervision_period)
def terminating_supervision_period_supervision_type( supervision_period: StateSupervisionPeriod, supervision_sentences: List[StateSupervisionSentence], incarceration_sentences: List[StateIncarcerationSentence], ) -> StateSupervisionPeriodSupervisionType: """Calculates the supervision type that should be associated with a terminated supervision period. In some cases, the supervision period will be terminated long after the person has been incarcerated (e.g. in the case of a board hold, someone might remain assigned to a PO until their parole is revoked), so we do a lookback to see the most recent supervision period supervision type we can associate with this termination. """ if not supervision_period.termination_date: raise ValueError( f'Expected a terminated supervision period for period ' f'[{supervision_period.supervision_period_id}]') if supervision_period.state_code == 'US_MO': supervision_type = us_mo_get_most_recent_supervision_period_supervision_type_before_upper_bound_day( upper_bound_exclusive_date=supervision_period.termination_date, lower_bound_inclusive_date=supervision_period.start_date, incarceration_sentences=incarceration_sentences, supervision_sentences=supervision_sentences) return supervision_type if supervision_type else StateSupervisionPeriodSupervisionType.INTERNAL_UNKNOWN return get_month_supervision_type_default( supervision_period.termination_date, supervision_sentences, incarceration_sentences, supervision_period)