def test_get_most_recent_previous_supervision_period_valid(self): supervision_period_1 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=111, start_date=date(2000, 1, 1), termination_date=date(2000, 10, 1), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=111, start_date=date(2000, 10, 1), termination_date=date(2000, 11, 1), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_periods = [supervision_period_1, supervision_period_2] supervision_period_index = SupervisionPeriodIndex( supervision_periods=supervision_periods) self.assertEqual( supervision_period_1, supervision_period_index. get_most_recent_previous_supervision_period(supervision_period_2), )
def test_supervision_periods_converter_sort_by_admission_reason_court( self): supervision_period_1 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=111, start_date=date(2000, 1, 1), termination_date=date(2000, 1, 1), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=222, start_date=date(2000, 1, 1), termination_date=date(2000, 1, 1), admission_reason=StateSupervisionPeriodAdmissionReason. TRANSFER_WITHIN_STATE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_periods = [supervision_period_2, supervision_period_1] supervision_period_index = SupervisionPeriodIndex( supervision_periods=supervision_periods) sorted_supervision_periods = [ supervision_period_1, supervision_period_2 ] self.assertEqual(sorted_supervision_periods, supervision_period_index.supervision_periods)
def test_find_most_recently_terminated_supervision_period_ends_before_cutoff( self): supervision_period_older = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2000, 1, 1), termination_date=date(2005, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_recent = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2006, 3, 1), termination_date=date(2010, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) # Set the admission date to be 1 day after the cut-off for how close a supervision period termination has to be # to a revocation admission to be counted as a proximal supervision period admission_date = ( supervision_period_recent.termination_date + relativedelta(months=SUPERVISION_PERIOD_PROXIMITY_MONTH_LIMIT) + relativedelta(days=1)) most_recently_terminated_period = ( find_last_supervision_period_terminated_before_date( upper_bound_date=admission_date, supervision_periods=[ supervision_period_older, supervision_period_recent, ], )) self.assertIsNone(most_recently_terminated_period)
def test_supervision_periods_converter_empty_termination_date(self): supervision_period_1 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=111, start_date=date(2000, 1, 1), termination_date=date(2000, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=222, start_date=date(2000, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_periods = [supervision_period_2, supervision_period_1] supervision_period_index = SupervisionPeriodIndex( supervision_periods=supervision_periods) sorted_supervision_periods = [ supervision_period_1, supervision_period_2 ] self.assertEqual(sorted_supervision_periods, supervision_period_index.supervision_periods)
def test_prepare_supervision_periods_for_calculations_unset_future_release_dates( self, ): supervision_period = StateSupervisionPeriod.new_with_defaults( status=StateSupervisionPeriodStatus.UNDER_SUPERVISION, state_code="US_ND", start_date=date(1990, 1, 1), termination_date=date(2007, 12, 31), termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, ) updated_periods = prepare_supervision_periods_for_calculations( [supervision_period], drop_federal_and_other_country_supervision_periods=False, ) updated_period = StateSupervisionPeriod.new_with_defaults( status=StateSupervisionPeriodStatus.UNDER_SUPERVISION, state_code="US_ND", start_date=date(1990, 1, 1), admission_reason=StateSupervisionPeriodAdmissionReason. INTERNAL_UNKNOWN, termination_date=None, termination_reason=None, ) self.assertEqual([updated_period], updated_periods)
def test_find_most_recently_terminated_supervision_period_none(self): supervision_period_older = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2000, 1, 1), termination_date=date(2005, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_recent = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2006, 3, 1), termination_date=date(2010, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) most_recently_terminated_period = ( find_last_supervision_period_terminated_before_date( upper_bound_date=date(1990, 10, 1), supervision_periods=[ supervision_period_older, supervision_period_recent, ], )) self.assertIsNone(most_recently_terminated_period)
def test_find_most_recently_terminated_supervision_period_overlapping( self): supervision_period_older = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2000, 1, 1), termination_date=date(2007, 9, 20), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) # Overlapping supervision period should not be returned supervision_period_recent = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2006, 3, 1), termination_date=date(2010, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) most_recently_terminated_period = ( find_last_supervision_period_terminated_before_date( upper_bound_date=date(2007, 10, 1), supervision_periods=[ supervision_period_older, supervision_period_recent, ], )) self.assertEqual(supervision_period_older, most_recently_terminated_period)
def test_us_id_pre_commitment_supervision_period(self) -> None: supervision_period_set = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ID", start_date=date(2017, 3, 5), termination_date=date(2017, 5, 9), supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, ) supervision_period_unset = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ID", start_date=date(2017, 3, 5), termination_date=date(2017, 5, 9), supervision_period_supervision_type=None, ) supervision_periods = [ supervision_period_set, supervision_period_unset ] self.assertEqual( supervision_period_set, self._test_us_id_pre_commitment_supervision_period( admission_date=date(2017, 5, 11), admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, supervision_periods=supervision_periods, ), )
def test_supervision_start_dates_by_period_id_no_official_admission(self): # The first supervision period always counts as the official start of supervision supervision_period_1 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, start_date=date(2000, 1, 1), termination_date=date(2000, 10, 3), admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=222, start_date=date(2000, 10, 3), termination_date=date(2000, 10, 11), admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE ) supervision_periods = [supervision_period_2, supervision_period_1] supervision_period_index = SupervisionPeriodIndex(supervision_periods=supervision_periods) expected_output = { supervision_period_1.supervision_period_id: supervision_period_1.start_date, supervision_period_2.supervision_period_id: supervision_period_1.start_date } self.assertEqual(expected_output, supervision_period_index.supervision_start_dates_by_period_id)
def test_supervision_periods_by_termination_month_multiple_years(self): supervision_period_1 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, start_date=date(2000, 1, 1), termination_date=date(2000, 5, 3), admission_reason=StateSupervisionPeriodAdmissionReason.CONDITIONAL_RELEASE ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=222, start_date=date(2020, 10, 3), termination_date=date(2020, 10, 11), admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE ) supervision_periods = [supervision_period_2, supervision_period_1] supervision_period_index = SupervisionPeriodIndex(supervision_periods=supervision_periods) expected_output = { 2000: { 5: [supervision_period_1] }, 2020: { 10: [supervision_period_2] } } self.assertEqual(expected_output, supervision_period_index.supervision_periods_by_termination_month)
def test_supervision_start_dates_by_period_id(self): supervision_period_1 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, start_date=date(2000, 1, 1), termination_date=date(2000, 10, 3), admission_reason=StateSupervisionPeriodAdmissionReason.CONDITIONAL_RELEASE ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=222, start_date=date(2000, 10, 3), termination_date=date(2000, 10, 11), admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE ) supervision_periods = [supervision_period_2, supervision_period_1] supervision_period_index = SupervisionPeriodIndex(supervision_periods=supervision_periods) expected_output = { supervision_period_1.supervision_period_id: supervision_period_1.start_date, supervision_period_2.supervision_period_id: supervision_period_1.start_date } self.assertEqual(expected_output, supervision_period_index.supervision_start_dates_by_period_id)
def test_prepare_supervision_periods_for_calculations_unset_future_release_dates( self, ) -> None: supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=1, status=StateSupervisionPeriodStatus.UNDER_SUPERVISION, state_code="US_XX", start_date=datetime.date(1990, 1, 1), termination_date=datetime.date(2007, 12, 31), termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, ) updated_periods = self._pre_processed_supervision_periods_for_calculations( [supervision_period], ) updated_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=1, status=StateSupervisionPeriodStatus.UNDER_SUPERVISION, state_code="US_XX", start_date=datetime.date(1990, 1, 1), admission_reason=StateSupervisionPeriodAdmissionReason. INTERNAL_UNKNOWN, termination_date=None, termination_reason=None, ) self.assertEqual([updated_period], updated_periods)
def test_prepare_supervision_periods_for_calculations_sort_empty_termination_date( self, ): supervision_period_1 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=111, start_date=datetime.date(2000, 1, 1), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, termination_date=datetime.date(2000, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, termination_reason=StateSupervisionPeriodTerminationReason. TRANSFER_WITHIN_STATE, ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=222, start_date=datetime.date(2000, 1, 1), status=StateSupervisionPeriodStatus.UNDER_SUPERVISION, admission_reason=StateSupervisionPeriodAdmissionReason. TRANSFER_WITHIN_STATE, ) supervision_periods = [supervision_period_2, supervision_period_1] updated_periods = self._pre_processed_supervision_periods_for_calculations( supervision_periods, ) sorted_supervision_periods = [ supervision_period_1, supervision_period_2 ] self.assertEqual(sorted_supervision_periods, updated_periods)
def test_associateSupervisionPeriodsWithSentenceDoNotMoveOntoPlaceholder( self): # Arrange placeholder_inc_s = StateIncarcerationSentence.new_with_defaults() placeholder_sp = StateSupervisionPeriod.new_with_defaults() sp = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID_3, start_date=_DATE_2, termination_date=_DATE_3) inc_s = StateIncarcerationSentence.new_with_defaults( external_id=_EXTERNAL_ID, start_date=_DATE, completion_date=_DATE_8, supervision_periods=[sp, placeholder_sp]) sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[inc_s, placeholder_inc_s]) state_person = StatePerson.new_with_defaults(sentence_groups=[sg]) # Should remain unchanged - periods should not get attached to other # placeholder sentence. expected_person = attr.evolve(state_person) # Act input_people = \ converter.convert_entity_people_to_schema_people( [state_person]) move_supervision_periods_onto_sentences_by_date(input_people) # Assert self.assert_people_match([expected_person], input_people)
def test_find_most_recently_terminated_supervision_period_overlapping_no_termination( self, ): supervision_period_older = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2000, 1, 1), termination_date=date(2007, 9, 20), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) # Overlapping supervision period that should have been found in the other identifier code supervision_period_recent = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2006, 3, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) most_recently_terminated_period = ( find_last_supervision_period_terminated_before_date( upper_bound_date=date(2007, 10, 1), supervision_periods=[ supervision_period_older, supervision_period_recent, ], )) self.assertEqual(supervision_period_older, most_recently_terminated_period)
def test_us_id_filter_supervision_periods_for_revocation_identification( self): supervision_period_set = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', status=StateSupervisionPeriodStatus.TERMINATED, state_code='US_ID', start_date=date(2017, 3, 5), termination_date=date(2017, 5, 9), supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION) supervision_period_unset = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', status=StateSupervisionPeriodStatus.TERMINATED, state_code='US_ID', start_date=date(2017, 3, 5), termination_date=date(2017, 5, 9), supervision_period_supervision_type=None) supervision_periods = [ supervision_period_set, supervision_period_unset ] self.assertEqual( [supervision_period_set], us_id_filter_supervision_periods_for_revocation_identification( supervision_periods))
def test_associatePeriodsWithSentence_doNotMatchSentenceWithNoStart(self): # Arrange placeholder_sp = StateSupervisionPeriod.new_with_defaults() sp = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID_3, start_date=_DATE_2, termination_date=_DATE_3) ip = StateIncarcerationPeriod.new_with_defaults( external_id=_EXTERNAL_ID_3, admission_date=_DATE_2, release_date=_DATE_3) inc_s_no_dates = StateIncarcerationSentence.new_with_defaults( external_id=_EXTERNAL_ID, supervision_periods=[placeholder_sp]) placeholder_inc_s = StateIncarcerationSentence.new_with_defaults( incarceration_periods=[ip], supervision_periods=[sp]) sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[inc_s_no_dates, placeholder_inc_s]) state_person = StatePerson.new_with_defaults(sentence_groups=[sg]) # Should remain unchanged - the non-placeholder period should not get moved onto sentence with an id # but no start date expected_person = attr.evolve(state_person) # Act input_people = converter.convert_entity_people_to_schema_people( [state_person]) move_periods_onto_sentences_by_date(input_people) # Assert self.assert_people_match([expected_person], input_people)
def test_get_most_recent_previous_supervision_period_first_in_list(self): supervision_period_1 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=111, start_date=date(2000, 1, 1), termination_date=date(2000, 10, 1), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", supervision_period_id=111, start_date=date(2010, 10, 1), termination_date=date(2010, 11, 1), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_periods = [supervision_period_1, supervision_period_2] supervision_period_index = PreProcessedSupervisionPeriodIndex( supervision_periods=standard_date_sort_for_supervision_periods( supervision_periods)) self.assertIsNone( supervision_period_index. get_most_recent_previous_supervision_period(supervision_period_1))
def test_us_id_filter_supervision_periods_for_revocation_identification_internal_unknown( self, ): supervision_period_set = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ID", start_date=date(2017, 3, 5), termination_date=date(2017, 5, 9), supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, ) supervision_period_unset = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ID", start_date=date(2017, 3, 5), termination_date=date(2017, 5, 9), supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.INTERNAL_UNKNOWN, ) supervision_periods = [ supervision_period_set, supervision_period_unset ] self.assertEqual( [supervision_period_set], us_id_filter_supervision_periods_for_revocation_identification( supervision_periods), )
def testUsIdGetSupervisionPeriodAdmissionOverride_investigationTooFarBack( self, ) -> None: previous_termination_date = self.upper_bound_date - relativedelta(days=10) supervision_period_previous = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=1, start_date=self.upper_bound_date - relativedelta(days=100), termination_date=previous_termination_date, termination_reason=StateSupervisionPeriodTerminationReason.TRANSFER_WITHIN_STATE, supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.INVESTIGATION, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=2, admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE, start_date=previous_termination_date + relativedelta(days=SUPERVISION_TYPE_LOOKBACK_DAYS_LIMIT + 1), supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.PAROLE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) idx = PreProcessedSupervisionPeriodIndex( supervision_periods=[supervision_period, supervision_period_previous] ) found_admission_reason = us_id_get_supervision_period_admission_override( supervision_period=supervision_period, supervision_period_index=idx ) self.assertEqual(supervision_period.admission_reason, found_admission_reason)
def testUsIdGetSupervisionPeriodAdmissionOverride_notPrecededByInvestigation( self, ) -> None: supervision_period_previous = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=1, start_date=self.upper_bound_date - relativedelta(days=100), termination_date=self.upper_bound_date - relativedelta(days=10), termination_reason=StateSupervisionPeriodTerminationReason.TRANSFER_WITHIN_STATE, supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.PAROLE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=2, admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE, start_date=supervision_period_previous.termination_date, supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.PAROLE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) idx = PreProcessedSupervisionPeriodIndex( supervision_periods=[supervision_period, supervision_period_previous] ) found_admission_reason = us_id_get_supervision_period_admission_override( supervision_period=supervision_period, supervision_period_index=idx ) self.assertEqual(supervision_period.admission_reason, found_admission_reason)
def test_find_last_terminated_period_before_date_none(self): supervision_period_older = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2000, 1, 1), termination_date=date(2005, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_recent = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2006, 3, 1), termination_date=date(2010, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) most_recently_terminated_period = find_last_terminated_period_before_date( upper_bound_date=date(1990, 10, 1), periods=[ supervision_period_older, supervision_period_recent, ], maximum_months_proximity=SUPERVISION_PERIOD_PROXIMITY_MONTH_LIMIT, ) self.assertIsNone(most_recently_terminated_period)
def test_find_last_terminated_period_before_date_same_termination_date( self, ): supervision_period_a = StateSupervisionPeriod.new_with_defaults( external_id="a", state_code="US_XX", start_date=date(2006, 1, 1), termination_date=date(2007, 12, 31), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_b = StateSupervisionPeriod.new_with_defaults( external_id="b", state_code="US_XX", start_date=date(2006, 1, 1), termination_date=date(2007, 12, 31), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) most_recently_terminated_period = find_last_terminated_period_before_date( upper_bound_date=date(2008, 1, 10), periods=[supervision_period_a, supervision_period_b], maximum_months_proximity=SUPERVISION_PERIOD_PROXIMITY_MONTH_LIMIT, ) self.assertEqual(supervision_period_a, most_recently_terminated_period)
def test_find_last_terminated_period_before_date_overlapping_no_termination( self, ): supervision_period_older = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2000, 1, 1), termination_date=date(2007, 9, 20), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) # Overlapping supervision period that should have been found in the other identifier code supervision_period_recent = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2006, 3, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) most_recently_terminated_period = find_last_terminated_period_before_date( upper_bound_date=date(2007, 10, 1), periods=[ supervision_period_older, supervision_period_recent, ], maximum_months_proximity=SUPERVISION_PERIOD_PROXIMITY_MONTH_LIMIT, ) self.assertEqual(supervision_period_older, most_recently_terminated_period)
def test_find_last_terminated_period_before_date_ends_on_cutoff_date(self): supervision_period_older = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2000, 1, 1), termination_date=date(2005, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_recent = StateSupervisionPeriod.new_with_defaults( state_code="US_XX", start_date=date(2006, 3, 1), termination_date=date(2010, 1, 1), status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) # Set the admission date to be on the last day of the cut-off for how close a supervision period termination # has to be to a revocation admission to be counted as a proximal supervision period admission_date = supervision_period_recent.termination_date + relativedelta( days=SUPERVISION_PERIOD_PROXIMITY_MONTH_LIMIT) most_recently_terminated_period = find_last_terminated_period_before_date( upper_bound_date=admission_date, periods=[ supervision_period_older, supervision_period_recent, ], maximum_months_proximity=SUPERVISION_PERIOD_PROXIMITY_MONTH_LIMIT, ) self.assertEqual(supervision_period_recent, most_recently_terminated_period)
def test_get_commitment_from_supervision_details_transfer_on_admission( self): """Tests that the period *prior to the incarceration admission* is chosen when a person is transferred to a new supervision period on the date of an admission to incarceration.""" incarceration_period = StateIncarcerationPeriod.new_with_defaults( state_code="US_XX", incarceration_period_id=111, admission_reason=StateIncarcerationPeriodAdmissionReason. SANCTION_ADMISSION, admission_date=date(2020, 1, 1), status=StateIncarcerationPeriodStatus.IN_CUSTODY, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.SHOCK_INCARCERATION, ) pre_commitment_sp = StateSupervisionPeriod.new_with_defaults( supervision_period_id=_DEFAULT_SUPERVISION_PERIOD_ID, state_code="US_XX", supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PAROLE, start_date=date(2010, 12, 1), termination_date=incarceration_period.admission_date, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_while_in_prison = StateSupervisionPeriod.new_with_defaults( supervision_period_id=222, state_code="US_XX", supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PAROLE, start_date=incarceration_period.admission_date, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) commitment_details = self._test_get_commitment_from_supervision_details( incarceration_period, [pre_commitment_sp, supervision_period_while_in_prison], ) self.assertEqual( CommitmentDetails( purpose_for_incarceration= StateSpecializedPurposeForIncarceration.SHOCK_INCARCERATION, purpose_for_incarceration_subtype=None, level_1_supervision_location_external_id=pre_commitment_sp. supervision_site, level_2_supervision_location_external_id=None, supervising_officer_external_id= DEFAULT_SUPERVISION_PERIOD_AGENT_ASSOCIATIONS.get( pre_commitment_sp.supervision_period_id).get( "agent_external_id"), case_type=StateSupervisionCaseType.GENERAL, supervision_level=pre_commitment_sp.supervision_level, supervision_level_raw_text=pre_commitment_sp. supervision_level_raw_text, supervision_type=StateSupervisionPeriodSupervisionType.PAROLE, ), commitment_details, )
def test_associatedSupervisionPeriodsWithSentences(self): # Arrange sp_no_match = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID, start_date=_DATE, termination_date=_DATE_2) sp_1 = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID, start_date=_DATE_4, termination_date=_DATE_6) sp_2 = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID_2, start_date=_DATE_6, termination_date=None) placeholder_ss = StateSupervisionSentence.new_with_defaults( supervision_periods=[sp_no_match, sp_1, sp_2]) ss = StateSupervisionSentence.new_with_defaults( external_id=_EXTERNAL_ID, start_date=_DATE_4, completion_date=None) inc_s = StateIncarcerationSentence.new_with_defaults( external_id=_EXTERNAL_ID, start_date=_DATE_3, completion_date=_DATE_5) sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[inc_s], supervision_sentences=[ss, placeholder_ss]) state_person = StatePerson.new_with_defaults(sentence_groups=[sg]) expected_sp_1 = attr.evolve(sp_1) expected_sp_2 = attr.evolve(sp_2) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[sp_no_match]) expected_inc_s = attr.evolve(inc_s, supervision_periods=[expected_sp_1]) expected_ss = attr.evolve( ss, supervision_periods=[expected_sp_1, expected_sp_2]) expected_sg = attr.evolve( sg, supervision_sentences=[expected_ss, expected_placeholder_ss], incarceration_sentences=[expected_inc_s]) expected_person = attr.evolve(state_person, sentence_groups=[expected_sg]) # Act input_people = \ converter.convert_entity_people_to_schema_people( [state_person]) move_supervision_periods_onto_sentences_by_date(input_people) # Assert self.assert_people_match([expected_person], input_people)
def testUsIdGetSupervisionPeriodAdmissionReasonOverride_multiplePeriodsStartOnInvestigationEnd( self, ): supervision_period_previous = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=1, start_date=self.upper_bound_date - relativedelta(days=100), termination_date=self.upper_bound_date - relativedelta(days=10), termination_reason=StateSupervisionPeriodTerminationReason. TRANSFER_WITHIN_STATE, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.INVESTIGATION, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_one_day = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=2, admission_reason=StateSupervisionPeriodAdmissionReason. TRANSFER_WITHIN_STATE, start_date=supervision_period_previous.termination_date, termination_date=supervision_period_previous.termination_date, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.INFORMAL_PROBATION, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) supervision_period_ongoing = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=3, admission_reason=StateSupervisionPeriodAdmissionReason. TRANSFER_WITHIN_STATE, start_date=supervision_period_one_day.termination_date, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PAROLE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) idx = SupervisionPeriodIndex(supervision_periods=[ supervision_period_previous, supervision_period_ongoing, supervision_period_one_day, ]) found_admission_reason_for_one_day = ( us_id_get_supervision_period_admission_override( supervision_period=supervision_period_one_day, supervision_period_index=idx, )) self.assertEqual( StateSupervisionPeriodAdmissionReason.COURT_SENTENCE, found_admission_reason_for_one_day, ) found_admission_reason_for_ongoing = ( us_id_get_supervision_period_admission_override( supervision_period=supervision_period_ongoing, supervision_period_index=idx, )) self.assertEqual( supervision_period_ongoing.admission_reason, found_admission_reason_for_ongoing, )
def test_referrals_for_supervision_periods_different_types(self): supervision_period_1 = \ StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, status=StateSupervisionPeriodStatus.TERMINATED, state_code='UT', start_date=date(2008, 3, 5), termination_date=date(2010, 5, 19), termination_reason=StateSupervisionPeriodTerminationReason.DISCHARGE, supervision_type=StateSupervisionType.PAROLE ) supervision_period_2 = \ StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, status=StateSupervisionPeriodStatus.TERMINATED, state_code='UT', start_date=date(2008, 3, 5), termination_date=date(2010, 5, 19), termination_reason=StateSupervisionPeriodTerminationReason.DISCHARGE, supervision_type=StateSupervisionType.PROBATION ) supervision_periods = [supervision_period_1, supervision_period_2] program_referrals = identifier.referrals_for_supervision_periods( state_code='UT', program_id='XXX', referral_date=date(2009, 3, 19), participation_status=StateProgramAssignmentParticipationStatus. DENIED, assessment_score=39, assessment_type=StateAssessmentType.LSIR, supervision_periods=supervision_periods, supervision_period_to_agent_associations= DEFAULT_SUPERVISION_PERIOD_AGENT_ASSOCIATIONS) self.assertListEqual([ ProgramReferralEvent( state_code='UT', program_id='XXX', event_date=date(2009, 3, 19), participation_status=StateProgramAssignmentParticipationStatus. DENIED, assessment_score=39, assessment_type=StateAssessmentType.LSIR, supervision_type=supervision_period_1.supervision_type), ProgramReferralEvent( state_code='UT', program_id='XXX', event_date=date(2009, 3, 19), participation_status=StateProgramAssignmentParticipationStatus. DENIED, assessment_score=39, assessment_type=StateAssessmentType.LSIR, supervision_type=supervision_period_2.supervision_type) ], program_referrals)
def test_pre_processed_incarceration_periods_for_calculations_NewAdmissionNotDirectlyAfterProbationRevocation( self, ) -> None: """Tests that when a NEW_ADMISSION incarceration follows a PROBATION+REVOCATION supervision period, but not directly, as there is a PRE_CONFINEMENT+REVOCATION supervision period in between them, then the incarceration period is not updated.""" earlier_probation_supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ND", start_date=date(2019, 3, 5), termination_date=date(2019, 5, 4), termination_reason=StateSupervisionPeriodTerminationReason. REVOCATION, supervision_type=StateSupervisionType.PROBATION, ) later_parole_supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ND", start_date=date(2019, 3, 5), termination_date=date(2019, 6, 9), termination_reason=StateSupervisionPeriodTerminationReason. REVOCATION, supervision_type=StateSupervisionType.PRE_CONFINEMENT, ) incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=222, external_id="ip2", state_code="US_ND", incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.IN_CUSTODY, admission_date=date(2019, 6, 17), admission_reason=StateIncarcerationPeriodAdmissionReason. NEW_ADMISSION, ) updated_period = attr.evolve( incarceration_period, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.GENERAL, ) validated_incarceration_periods = ( self._pre_processed_incarceration_periods_for_calculations( incarceration_periods=[incarceration_period], supervision_periods=[ earlier_probation_supervision_period, later_parole_supervision_period, ], )) self.assertEqual([updated_period], validated_incarceration_periods)