def test_face_to_face_frequency_sufficient_contacts_new_case_opened_on_friday( self): supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', state_code='US_ID', custodial_authority='US_ID_DOC', start_date=date(1999, 8, 13), # This was a Friday admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, supervision_level=StateSupervisionLevel.MEDIUM) supervision_contacts = [] start_of_supervision = supervision_period.start_date compliance_evaluation_date = start_of_supervision \ + relativedelta(days=NEW_SUPERVISION_CONTACT_DEADLINE_BUSINESS_DAYS + 1) face_to_face_frequency_sufficient = _face_to_face_contact_frequency_is_sufficient( supervision_period, start_of_supervision, compliance_evaluation_date, supervision_contacts) self.assertTrue(face_to_face_frequency_sufficient)
def test_usId_getPreIncarcerationSupervisionType_ignoreOutOfDatePeriods_After( self): incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1, admission_reason=StateIncarcerationPeriodAdmissionReason. RETURN_FROM_SUPERVISION, external_id='ip1', state_code='US_ID', admission_date=date(2019, 9, 13)) preceding_supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=1, start_date=date(2020, 3, 3), termination_date=date(2020, 10, 13), supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PAROLE) supervision_sentence = StateSupervisionSentence.new_with_defaults( supervision_sentence_id=1, external_id='XXX', supervision_periods=[preceding_supervision_period]) self.assertIsNone( us_id_get_pre_incarceration_supervision_type( incarceration_sentences=[], supervision_sentences=[supervision_sentence], incarceration_period=incarceration_period))
def test_usId_getPreIncarcerationSupervisionType_ignoreOutOfDatePeriods_Before( self): incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1, admission_reason=StateIncarcerationPeriodAdmissionReason. RETURN_FROM_SUPERVISION, external_id='ip1', state_code='US_ID', admission_date=date(2019, 9, 13)) preceding_supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=1, start_date=incarceration_period.admission_date - relativedelta( days=PRE_INCARCERATION_SUPERVISION_TYPE_LOOKBACK_DAYS + 100), termination_date=incarceration_period.admission_date - relativedelta( days=PRE_INCARCERATION_SUPERVISION_TYPE_LOOKBACK_DAYS + 10), supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PAROLE) supervision_sentence = StateSupervisionSentence.new_with_defaults( supervision_sentence_id=1, external_id='XXX', supervision_periods=[preceding_supervision_period]) self.assertIsNone( us_id_get_pre_incarceration_supervision_type( incarceration_sentences=[], supervision_sentences=[supervision_sentence], incarceration_period=incarceration_period))
def test_month_supervision_type_no_supervision_all_month(self): # Arrange supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=1234, external_id='sp1', state_code='US_MO', start_date=(self.end_of_month_date - datetime.timedelta(days=60))) supervision_sentence = FakeUsMoSupervisionSentence.fake_sentence_from_sentence( StateSupervisionSentence.new_with_defaults( external_id='ss1', state_code='US_MO', start_date=supervision_period.start_date), supervision_type_spans=[ SupervisionTypeSpan( start_date=supervision_period.start_date, end_date=self.start_of_month_date, supervision_type=StateSupervisionType.PROBATION), # Incarcerated / suspended since start of month SupervisionTypeSpan(start_date=self.start_of_month_date, end_date=None, supervision_type=None) ]) # Act supervision_period_supervision_type = \ us_mo_get_month_supervision_type(self.end_of_month_date, supervision_sentences=[supervision_sentence], incarceration_sentences=[], supervision_period=supervision_period) # Assert self.assertEqual( supervision_period_supervision_type, StateSupervisionPeriodSupervisionType.INTERNAL_UNKNOWN)
def test_face_to_face_frequency_sufficient_contacts_invalid_type(self): supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', state_code='US_ID', custodial_authority='US_ID_DOC', start_date=date(2018, 3, 5), termination_date=date(2018, 5, 19), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, ) supervision_contacts = [ StateSupervisionContact.new_with_defaults( state_code='US_ID', contact_date=supervision_period.start_date, # Only contact is invalid type contact_type=StateSupervisionContactType.WRITTEN_MESSAGE, status=StateSupervisionContactStatus.COMPLETED) ] start_of_supervision = supervision_period.start_date compliance_evaluation_date = start_of_supervision\ + relativedelta(days=(NEW_SUPERVISION_CONTACT_DEADLINE_BUSINESS_DAYS + 1)) face_to_face_frequency_sufficient = _face_to_face_contact_frequency_is_sufficient( supervision_period, start_of_supervision, compliance_evaluation_date, supervision_contacts) self.assertFalse(face_to_face_frequency_sufficient)
def test_face_to_face_frequency_sufficient_contacts_medium_level_not_up_to_date( self): supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', state_code='US_ID', custodial_authority='US_ID_DOC', start_date=date(2018, 3, 5), termination_date=date(2018, 5, 19), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, supervision_level=StateSupervisionLevel.MEDIUM) supervision_contacts = [ StateSupervisionContact.new_with_defaults( state_code='US_ID', contact_date=supervision_period.start_date, contact_type=StateSupervisionContactType.FACE_TO_FACE, status=StateSupervisionContactStatus.COMPLETED) ] start_of_supervision = supervision_period.start_date compliance_evaluation_date = start_of_supervision \ + relativedelta(days=(MEDIUM_SUPERVISION_CONTACT_FREQUENCY_DAYS + 10)) face_to_face_frequency_sufficient = _face_to_face_contact_frequency_is_sufficient( supervision_period, start_of_supervision, compliance_evaluation_date, supervision_contacts) self.assertFalse(face_to_face_frequency_sufficient)
def test_assessment_is_up_to_date_old_assessment_not_minimum_level(self): supervision_period = \ StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', state_code='US_ID', custodial_authority='US_ID_DOC', start_date=date(2018, 3, 5), admission_reason=StateSupervisionPeriodAdmissionReason.COURT_SENTENCE, supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.PROBATION, supervision_level=StateSupervisionLevel.MAXIMUM ) assessment = StateAssessment.new_with_defaults( state_code='US_ID', assessment_type=StateAssessmentType.LSIR, assessment_score=33, assessment_level=StateAssessmentLevel.HIGH, assessment_date=date(2017, 1, 3)) # This person started on probation more than NEW_SUPERVISION_ASSESSMENT_DEADLINE_DAYS ago, and they do not have # a recent assessment, so their assessment is not in compliance start_of_supervision = supervision_period.start_date - \ relativedelta(days=NEW_SUPERVISION_ASSESSMENT_DEADLINE_DAYS) compliance_evaluation_date = supervision_period.start_date + \ relativedelta(days=1) assessment_up_to_date = _assessment_is_up_to_date( supervision_period, start_of_supervision, compliance_evaluation_date, most_recent_assessment=assessment) self.assertFalse(assessment_up_to_date)
def test_assessment_is_up_to_date_no_assessment_old_period(self): supervision_period = \ StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', state_code='US_ID', custodial_authority='US_ID_DOC', start_date=date(2018, 3, 5), admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE, supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.PROBATION ) # This person started on probation more than NEW_SUPERVISION_ASSESSMENT_DEADLINE_DAYS ago, and they do not have # a recent assessment, so their assessment is not in compliance start_of_supervision = supervision_period.start_date - \ relativedelta(days=NEW_SUPERVISION_ASSESSMENT_DEADLINE_DAYS) compliance_evaluation_date = supervision_period.start_date + \ relativedelta(days=1) assessment_up_to_date = _assessment_is_up_to_date( supervision_period, start_of_supervision, compliance_evaluation_date, most_recent_assessment=None) self.assertFalse(assessment_up_to_date)
def test_assessment_is_up_to_date(self): supervision_period = \ StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', state_code='US_ID', custodial_authority='US_ID_DOC', start_date=date(2018, 3, 5), termination_date=date(2018, 5, 19), admission_reason=StateSupervisionPeriodAdmissionReason.COURT_SENTENCE, termination_reason=StateSupervisionPeriodTerminationReason.DISCHARGE, supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.PROBATION ) assessment = StateAssessment.new_with_defaults( state_code='US_ID', assessment_type=StateAssessmentType.LSIR, assessment_score=33, assessment_level=StateAssessmentLevel.HIGH, assessment_date=date(2018, 3, 10)) start_of_supervision = supervision_period.start_date compliance_evaluation_date = date(2018, 4, 30) assessment_up_to_date = _assessment_is_up_to_date( supervision_period, start_of_supervision, compliance_evaluation_date, assessment) self.assertTrue(assessment_up_to_date)
def test_referrals_for_supervision_periods(self): supervision_period = \ 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 ) program_referrals = identifier.referrals_for_supervision_periods( state_code='UT', program_id='XXX', referral_date=date(2009, 3, 12), assessment_score=39, assessment_type=StateAssessmentType.LSIR, supervision_periods=[supervision_period], supervision_period_to_agent_associations= DEFAULT_SUPERVISION_PERIOD_AGENT_ASSOCIATIONS) self.assertEqual(1, len(program_referrals)) self.assertEqual([ ProgramReferralEvent( state_code='UT', program_id='XXX', event_date=date(2009, 3, 12), assessment_score=39, assessment_type=StateAssessmentType.LSIR, supervision_type=supervision_period.supervision_type) ], program_referrals)
def test_us_id_case_compliance_on_date_no_assessment_no_contacts(self): supervision_period = \ StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id='sp1', state_code='US_ID', custodial_authority='US_ID_DOC', start_date=date(2018, 3, 5), termination_date=date(2018, 5, 19), admission_reason=StateSupervisionPeriodAdmissionReason.COURT_SENTENCE, termination_reason=StateSupervisionPeriodTerminationReason.DISCHARGE, supervision_period_supervision_type=StateSupervisionPeriodSupervisionType.PROBATION, supervision_level=StateSupervisionLevel.MEDIUM ) case_type = StateSupervisionCaseType.GENERAL start_of_supervision = date(2018, 1, 5) compliance_evaluation_date = date(2018, 4, 30) compliance = us_id_case_compliance_on_date(supervision_period, case_type, start_of_supervision, compliance_evaluation_date, assessments=[], supervision_contacts=[]) self.assertEqual( SupervisionCaseCompliance( date_of_evaluation=compliance_evaluation_date, assessment_count=0, assessment_up_to_date=False, face_to_face_count=0, face_to_face_frequency_sufficient=False), compliance)
def test_face_to_face_contacts_in_compliance_month(self): # TODO(#5199): Update once face to face logic has been implemented. evaluation_date = date(2018, 4, 30) supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", state_code=StateCode.US_ND.value, start_date=date(2018, 3, 5), # This was a Monday termination_date=date(2018, 5, 19), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) contacts = [] us_nd_supervision_compliance = UsNdSupervisionCaseCompliance( supervision_period=supervision_period, case_type=StateSupervisionCaseType.GENERAL, start_of_supervision=evaluation_date, assessments=[], supervision_contacts=contacts, ) self.assertEqual( 0, us_nd_supervision_compliance. _face_to_face_contacts_in_compliance_month(evaluation_date), )
def test_us_id_not_revoked_supervision_period_if_shock_incarceration(self): supervision_period = StateSupervisionPeriod.new_with_defaults( start_date=date(2017, 1, 1), termination_date=date(2017, 5, 17), supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, ) incarceration_revocation_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=222, external_id='ip2', state_code='US_ID', incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, admission_date=date(2017, 5, 17), admission_reason=StateIncarcerationPeriodAdmissionReason. RETURN_FROM_SUPERVISION, release_date=date(2019, 3, 3), release_reason=StateIncarcerationPeriodReleaseReason. SENTENCE_SERVED, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.SHOCK_INCARCERATION) supervision_periods = [supervision_period] admission_is_revocation, revoked_period = us_id_revoked_supervision_period_if_revocation_occurred( incarceration_revocation_period, supervision_periods, None) self.assertFalse(admission_is_revocation) self.assertIsNone(revoked_period)
def test_associatePeriodsWithSentence_doNotMovePlaceholderPeriods(self): # Arrange placeholder_sp = StateSupervisionPeriod.new_with_defaults() placeholder_ip = StateIncarcerationPeriod.new_with_defaults() inc_s_2 = StateIncarcerationSentence.new_with_defaults( external_id=_EXTERNAL_ID, start_date=_DATE_1, completion_date=_DATE_8) inc_s = StateIncarcerationSentence.new_with_defaults( external_id=_EXTERNAL_ID_2, start_date=_DATE_1, completion_date=_DATE_8, incarceration_periods=[placeholder_ip], supervision_periods=[placeholder_sp]) sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[inc_s, inc_s_2]) state_person = StatePerson.new_with_defaults(sentence_groups=[sg]) # Should remain unchanged - placeholder period should not get attached to any other sentences 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_guidelines_applicable_for_case(self): """The guidelines should be applicable to people who are not in interstate compact or not classified.""" supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", state_code=StateCode.US_ND.value, start_date=date(2018, 3, 5), termination_date=date(2018, 5, 19), admission_reason=StateSupervisionPeriodAdmissionReason. COURT_SENTENCE, termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, supervision_period_supervision_type= StateSupervisionPeriodSupervisionType.PROBATION, supervision_level=StateSupervisionLevel.MEDIUM, supervision_level_raw_text="2", status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) us_nd_supervision_compliance = UsNdSupervisionCaseCompliance( supervision_period=supervision_period, case_type=StateSupervisionCaseType.GENERAL, start_of_supervision=supervision_period.start_date, assessments=[], supervision_contacts=[], ) applicable = us_nd_supervision_compliance._guidelines_applicable_for_case( ) self.assertTrue(applicable)
def test_get_month_supervision_type_no_sentences_internal_unknown(self): any_date_in_month = date(2018, 4, 13) supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, external_id="sp1", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_XX", start_date=date(2018, 3, 5), termination_date=date(2018, 5, 19), termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, supervision_type=None, ) supervision_sentences = [] incarceration_sentences = [] supervision_type = get_month_supervision_type( any_date_in_month, supervision_sentences, incarceration_sentences, supervision_period, ) self.assertEqual( StateSupervisionPeriodSupervisionType.INTERNAL_UNKNOWN, supervision_type)
def testUsIdGetSupervisionPeriodAdmissionReasonOverride_ignoreNullSupervisionType( 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_one_day = StateSupervisionPeriod.new_with_defaults( state_code="US_ID", supervision_period_id=2, admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE, start_date=previous_termination_date, termination_date=previous_termination_date + relativedelta(days=10), 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 = PreProcessedSupervisionPeriodIndex( supervision_periods=[ supervision_period_previous, supervision_period_ongoing, supervision_period_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( StateSupervisionPeriodAdmissionReason.COURT_SENTENCE, found_admission_reason_for_ongoing, )
def test_find_program_referrals_officer_info(self): program_assignment = StateProgramAssignment.new_with_defaults( state_code='US_CA', program_id='PG3', referral_date=date(2009, 10, 3), participation_status=StateProgramAssignmentParticipationStatus. DISCHARGED, ) assessment = StateAssessment.new_with_defaults( state_code='US_CA', assessment_type=StateAssessmentType.ORAS, assessment_score=33, assessment_date=date(2009, 7, 10)) supervision_period = \ 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 ) program_assignments = [program_assignment] assessments = [assessment] supervision_periods = [supervision_period] supervision_period_agent_associations = { supervision_period.supervision_period_id: { 'agent_id': 000, 'agent_external_id': 'OFFICER10', 'district_external_id': 'DISTRICT8', 'supervision_period_id': supervision_period.supervision_period_id } } program_referrals = identifier.find_program_referrals( program_assignments, assessments, supervision_periods, supervision_period_agent_associations) self.assertEqual(1, len(program_referrals)) self.assertEqual([ ProgramReferralEvent( state_code=program_assignment.state_code, program_id=program_assignment.program_id, event_date=program_assignment.referral_date, participation_status=program_assignment.participation_status, assessment_score=33, assessment_type=StateAssessmentType.ORAS, supervision_type=supervision_period.supervision_type, supervising_officer_external_id='OFFICER10', supervising_district_external_id='DISTRICT8') ], program_referrals)
def test_find_program_referrals_multiple_assessments(self): program_assignment = StateProgramAssignment.new_with_defaults( state_code="US_XX", program_id="PG3", referral_date=date(2009, 10, 3), participation_status=StateProgramAssignmentParticipationStatus. IN_PROGRESS, ) assessment_1 = StateAssessment.new_with_defaults( state_code="US_XX", assessment_type=StateAssessmentType.ORAS, assessment_score=33, assessment_date=date(2009, 3, 10), ) assessment_2 = StateAssessment.new_with_defaults( state_code="US_XX", assessment_type=StateAssessmentType.ORAS, assessment_score=29, assessment_date=date(2009, 9, 14), ) supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_XX", start_date=date(2008, 3, 5), termination_date=date(2010, 5, 19), termination_reason=StateSupervisionPeriodTerminationReason. DISCHARGE, supervision_type=StateSupervisionType.PAROLE, ) assessments = [assessment_1, assessment_2] supervision_periods = [supervision_period] program_referrals = identifier.find_program_referrals( program_assignment, assessments, supervision_periods, DEFAULT_SUPERVISION_PERIOD_AGENT_ASSOCIATIONS, ) self.assertListEqual( [ ProgramReferralEvent( state_code=program_assignment.state_code, program_id=program_assignment.program_id, event_date=program_assignment.referral_date, participation_status=program_assignment. participation_status, assessment_score=29, assessment_type=StateAssessmentType.ORAS, supervision_type=supervision_period.supervision_type, ) ], program_referrals, )
def test_usMo_getPreIncarcerationSupervisionType_ignoreOutOfDateSentences( self): incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1, admission_reason=StateIncarcerationPeriodAdmissionReason. PAROLE_REVOCATION, external_id='ip1', state_code='US_MO', admission_date=date(2018, 3, 5)) supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=1, external_id='sp1', start_date=date(2016, 3, 1), termination_date=date(2018, 3, 1), state_code='US_MO') supervision_period_2 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=2, external_id='sp2', start_date=date(2016, 3, 1), termination_date=date(2018, 3, 1), state_code='US_MO') supervision_sentence_prob = StateSupervisionSentence.new_with_defaults( supervision_sentence_id=1, external_id='US_MO', start_date=date(2018, 2, 1), completion_date=date(2018, 3, 4), status=StateSentenceStatus.COMPLETED, projected_completion_date=date(2018, 5, 19), supervision_type=StateSupervisionType.PROBATION, supervision_periods=[supervision_period]) old_incarceration_sentence = StateIncarcerationSentence.new_with_defaults( incarceration_sentence_id=1, external_id='US_MO', start_date=date(2017, 2, 1), completion_date=date(2017, 3, 4), status=StateSentenceStatus.COMPLETED, supervision_periods=[supervision_period_2]) self.assertEqual( StateSupervisionPeriodSupervisionType.PROBATION, get_pre_incarceration_supervision_type( [old_incarceration_sentence], [supervision_sentence_prob], incarceration_period, [supervision_period, supervision_period_2]))
def test_find_most_recently_terminated_supervision_period_overlapping_no_termination( self): supervision_period_older = StateSupervisionPeriod.new_with_defaults( start_date=date(2000, 1, 1), termination_date=date(2007, 9, 20)) # Overlapping supervision period that should have been found in the other identifier code supervision_period_recent = StateSupervisionPeriod.new_with_defaults( start_date=date(2006, 3, 1), ) 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_find_most_recently_terminated_supervision_period_overlapping( self): supervision_period_older = StateSupervisionPeriod.new_with_defaults( start_date=date(2000, 1, 1), termination_date=date(2007, 9, 20)) # Overlapping supervision period should not be returned supervision_period_recent = StateSupervisionPeriod.new_with_defaults( start_date=date(2006, 3, 1), termination_date=date(2010, 1, 1)) 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_associatePeriodsWithSentence_periodNoLongerMatches(self): # Arrange sp_which_no_longer_overlaps = StateSupervisionPeriod.new_with_defaults( supervision_period_id=_ID, external_id=_EXTERNAL_ID, state_code=_STATE_CODE, start_date=_DATE_6) ip_which_no_longer_overlaps = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=_ID, external_id=_EXTERNAL_ID, state_code=_STATE_CODE, admission_date=_DATE_6) # This sentence, which has already been written to the DB, has presumably been updated so that the date range no # longer overlaps with the attached periods. inc_s_updated_dates = StateIncarcerationSentence.new_with_defaults( incarceration_sentence_id=_ID_2, external_id=_EXTERNAL_ID, state_code=_STATE_CODE, start_date=_DATE_3, completion_date=_DATE_5, incarceration_periods=[ip_which_no_longer_overlaps], supervision_periods=[sp_which_no_longer_overlaps]) sg = StateSentenceGroup.new_with_defaults( sentence_group_id=_ID_3, state_code=_STATE_CODE, incarceration_sentences=[inc_s_updated_dates]) state_person = StatePerson.new_with_defaults(person_id=_ID, sentence_groups=[sg]) expected_sp = attr.evolve(sp_which_no_longer_overlaps) expected_ip = attr.evolve(ip_which_no_longer_overlaps) expected_is = attr.evolve(inc_s_updated_dates, incarceration_periods=[], supervision_periods=[]) # We expect that a new placeholder supervision sentence has been created to hold on to the orphaned periods expected_placeholder_ss = StateSupervisionSentence.new_with_defaults( state_code=_STATE_CODE, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_periods=[expected_ip], supervision_periods=[expected_sp]) expected_sg = attr.evolve( sg, incarceration_sentences=[expected_is], supervision_sentences=[expected_placeholder_ss]) expected_person = attr.evolve(state_person, sentence_groups=[expected_sg]) # 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_us_nd_pre_commitment_supervision_period_probation_revocation_closer( self, ) -> None: """Tests that we prioritize the overlapping probation period with a termination date that is closer to the admission_date.""" admission_date = date(2019, 5, 25) admission_reason = StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION # Overlapping revoked probation period, 5 days after admission revoked_probation_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.PROBATION, ) # Overlapping revoked probation period, 1 day after admission closer_revoked_probation_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=222, external_id="sp2", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ND", start_date=date(2019, 3, 5), termination_date=date(2019, 5, 26), termination_reason=StateSupervisionPeriodTerminationReason. REVOCATION, supervision_type=StateSupervisionType.PROBATION, ) pre_commitment_supervision_period = ( self._test_us_nd_pre_commitment_supervision_period( admission_date=admission_date, admission_reason=admission_reason, supervision_periods=[ closer_revoked_probation_period, revoked_probation_period, ], )) self.assertEqual(closer_revoked_probation_period, pre_commitment_supervision_period)
def test_us_nd_pre_commitment_supervision_period_probation_revocation_rev_term( self, ) -> None: """Tests that we prioritize the probation period with a termination reason of REVOCATION.""" admission_date = date(2019, 5, 25) admission_reason = StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION # Terminated revoked probation period revoked_probation_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, 9), termination_reason=StateSupervisionPeriodTerminationReason. REVOCATION, supervision_type=StateSupervisionType.PROBATION, ) # Expired terminated probation period expired_probation_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=222, external_id="sp2", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ND", start_date=date(2019, 3, 5), termination_date=date(2019, 5, 9), termination_reason=StateSupervisionPeriodTerminationReason. EXPIRATION, supervision_type=StateSupervisionType.PROBATION, ) pre_commitment_supervision_period = ( self._test_us_nd_pre_commitment_supervision_period( admission_date=admission_date, admission_reason=admission_reason, supervision_periods=[ expired_probation_period, revoked_probation_period, ], )) self.assertEqual(revoked_probation_period, pre_commitment_supervision_period)
def test_us_nd_pre_commitment_supervision_period_probation_revocation_overlap( self, ) -> None: """Tests that we prioritize the recently terminated probation period over the one that is overlapping because the admission is a PROBATION_REVOCATION.""" admission_date = date(2019, 5, 25) admission_reason = StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION # Overlapping probation period overlapping_probation_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.PROBATION, ) # Terminated probation period terminated_probation_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=222, external_id="sp2", status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ND", start_date=date(2019, 3, 5), termination_date=date(2019, 5, 1), termination_reason=StateSupervisionPeriodTerminationReason. REVOCATION, supervision_type=StateSupervisionType.PROBATION, ) pre_commitment_supervision_period = ( self._test_us_nd_pre_commitment_supervision_period( admission_date=admission_date, admission_reason=admission_reason, supervision_periods=[ terminated_probation_period, overlapping_probation_period, ], )) self.assertEqual(terminated_probation_period, pre_commitment_supervision_period)
def test_supervision_start_dates_by_period_id_multiple_official_admissions(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, termination_reason=StateSupervisionPeriodTerminationReason.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, termination_reason=StateSupervisionPeriodTerminationReason.DISCHARGE ) supervision_period_3 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=333, start_date=date(2020, 5, 1), termination_date=date(2020, 10, 3), admission_reason=StateSupervisionPeriodAdmissionReason.COURT_SENTENCE, termination_reason=StateSupervisionPeriodTerminationReason.TRANSFER_WITHIN_STATE ) supervision_period_4 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=444, start_date=date(2020, 10, 3), termination_date=date(2020, 10, 11), admission_reason=StateSupervisionPeriodAdmissionReason.TRANSFER_WITHIN_STATE, termination_reason=StateSupervisionPeriodTerminationReason.DISCHARGE ) supervision_periods = [supervision_period_2, supervision_period_4, supervision_period_3, 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, supervision_period_3.supervision_period_id: supervision_period_3.start_date, supervision_period_4.supervision_period_id: supervision_period_3.start_date } self.assertEqual(expected_output, supervision_period_index.supervision_start_dates_by_period_id)
def test_supervision_start_dates_by_period_id_multiple_absconsion_periods(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, termination_reason=StateSupervisionPeriodTerminationReason.ABSCONSION ) 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.ABSCONSION, termination_reason=StateSupervisionPeriodTerminationReason.RETURN_FROM_ABSCONSION ) supervision_period_3 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=333, start_date=date(2000, 10, 12), termination_date=date(2001, 1, 3), admission_reason=StateSupervisionPeriodAdmissionReason.RETURN_FROM_ABSCONSION, termination_reason=StateSupervisionPeriodTerminationReason.ABSCONSION ) supervision_period_4 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=444, start_date=date(2001, 1, 4), termination_date=date(2001, 10, 11), admission_reason=StateSupervisionPeriodAdmissionReason.ABSCONSION, termination_reason=StateSupervisionPeriodTerminationReason.RETURN_FROM_ABSCONSION ) supervision_periods = [supervision_period_2, supervision_period_4, supervision_period_3, 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, supervision_period_3.supervision_period_id: supervision_period_1.start_date, supervision_period_4.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_drop_open_sp_after_death( self, ) -> None: """Tests if the open supervision periods after a period ending in death are dropped""" supervision_period_1 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=1, state_code="US_XX", start_date=datetime.date(2000, 12, 29), termination_date=datetime.date(2001, 1, 1), termination_reason=StateSupervisionPeriodTerminationReason.DEATH, status=StateSupervisionPeriodStatus.TERMINATED, ) supervision_period_2 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=2, state_code="US_XX", start_date=datetime.date(2001, 1, 5), admission_reason=StateSupervisionPeriodAdmissionReason. RETURN_FROM_SUSPENSION, termination_date=datetime.date(2001, 1, 6), termination_reason=StateSupervisionPeriodTerminationReason. TRANSFER_OUT_OF_STATE, status=StateSupervisionPeriodStatus.TERMINATED, ) supervision_period_3 = StateSupervisionPeriod.new_with_defaults( supervision_period_id=3, state_code="US_XX", start_date=datetime.date(2001, 1, 6), status=StateSupervisionPeriodStatus.UNDER_SUPERVISION, ) expected_period = attr.evolve( supervision_period_1, admission_reason=StateSupervisionPeriodAdmissionReason. INTERNAL_UNKNOWN, termination_reason=StateSupervisionPeriodTerminationReason.DEATH, ) updated_periods = self._pre_processed_supervision_periods_for_calculations( [supervision_period_1, supervision_period_2, supervision_period_3], earliest_death_date=supervision_period_1.termination_date, ) self.assertEqual([expected_period], updated_periods)
def test_find_program_events(self): program_assignment = StateProgramAssignment.new_with_defaults( state_code='US_CA', program_id='PG3', referral_date=date(2020, 1, 3), participation_status=StateProgramAssignmentParticipationStatus. IN_PROGRESS, program_location_id='LOCATION X', start_date=date(2020, 1, 1)) assessment = StateAssessment.new_with_defaults( state_code='US_CA', assessment_type=StateAssessmentType.ORAS, assessment_score=33, assessment_date=date(2019, 7, 10)) supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=111, status=StateSupervisionPeriodStatus.TERMINATED, state_code='UT', start_date=date(2019, 3, 5), supervision_type=StateSupervisionType.PAROLE) program_assignments = [program_assignment] assessments = [assessment] supervision_periods = [supervision_period] program_events = identifier.find_program_events( program_assignments, assessments, supervision_periods, DEFAULT_SUPERVISION_PERIOD_AGENT_ASSOCIATIONS) expected_events = [ ProgramReferralEvent( state_code=program_assignment.state_code, event_date=program_assignment.referral_date, program_id=program_assignment.program_id, supervision_type=supervision_period.supervision_type, participation_status=program_assignment.participation_status, assessment_score=assessment.assessment_score, assessment_type=assessment.assessment_type), ProgramParticipationEvent( state_code=program_assignment.state_code, event_date=program_assignment.start_date, program_id=program_assignment.program_id, program_location_id=program_assignment.program_location_id, supervision_type=supervision_period.supervision_type), ProgramParticipationEvent( state_code=program_assignment.state_code, event_date=program_assignment.start_date + relativedelta(days=1), program_id=program_assignment.program_id, program_location_id=program_assignment.program_location_id, supervision_type=supervision_period.supervision_type) ] self.assertListEqual(program_events, expected_events)