def perform_match_postprocessing( self, matched_persons: List[schema.StatePerson]): """Performs the following ND specific postprocessing on the provided |matched_persons| directly after they have been entity matched: - Move IncarcerationIncidents onto IncarcerationPeriods based on date. - Transform IncarcerationPeriods periods of temporary custody (holds), when appropriate. - Associates SupervisionViolationResponses with IncarcerationPeriods based on date. - Moves supervising_officer from StatePerson onto open SupervisionPeriods. """ logging.info("[Entity matching] Move incidents into periods") move_incidents_onto_periods(matched_persons) logging.info("[Entity matching] Transform incarceration periods into " "holds") update_temporary_holds(matched_persons, self.region) logging.info("[Entity matching] Associate revocation SVRs with IPs") associate_revocation_svrs_with_ips(matched_persons) logging.info('[Entity matching] Moving supervising officer onto open ' 'supervision periods') add_supervising_officer_to_open_supervision_periods(matched_persons)
def test_associateSvrsWithIps_dontAssociateTheSameSvr(self): # Arrange svr_1 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_1, revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION) placeholder_sv = StateSupervisionViolation.new_with_defaults( supervision_violation_responses=[svr_1]) placeholder_sp = StateSupervisionPeriod.new_with_defaults( supervision_violation_entries=[placeholder_sv]) placeholder_ss = StateSupervisionSentence.new_with_defaults( supervision_periods=[placeholder_sp]) ip_1 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_2, admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION) ip_2 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_4, admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION) placeholder_is = StateIncarcerationSentence.new_with_defaults( incarceration_periods=[ip_1, ip_2]) placeholder_sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[placeholder_is], supervision_sentences=[placeholder_ss]) placeholder_person = StatePerson.new_with_defaults( sentence_groups=[placeholder_sg]) expected_svr_1 = attr.evolve(svr_1) expected_placeholder_sv = attr.evolve( placeholder_sv, supervision_violation_responses=[expected_svr_1]) expected_placeholder_sp = attr.evolve( placeholder_sp, supervision_violation_entries=[expected_placeholder_sv]) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[expected_placeholder_sp]) expected_ip_1 = attr.evolve( ip_1, source_supervision_violation_response=expected_svr_1) expected_ip_2 = attr.evolve(ip_2) expected_placeholder_is = attr.evolve( placeholder_is, incarceration_periods=[expected_ip_1, expected_ip_2]) expected_placeholder_sg = attr.evolve( placeholder_sg, supervision_sentences=[expected_placeholder_ss], incarceration_sentences=[expected_placeholder_is]) expected_placeholder_person = attr.evolve( placeholder_person, sentence_groups=[expected_placeholder_sg]) # Act input_people = \ converter.convert_entity_people_to_schema_people( [placeholder_person]) associate_revocation_svrs_with_ips(input_people) # Assert self.assert_people_match([expected_placeholder_person], input_people)
def test_associateSvrsWithIps(self): # Arrange ip_1 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_1, admission_reason= StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION) ip_2 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_2, admission_reason= StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION) placeholder_is = StateIncarcerationSentence.new_with_defaults( incarceration_periods=[ip_1, ip_2]) svr_1 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_1 - datetime.timedelta(days=1), revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION) svr_2 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_2 + datetime.timedelta(days=1), revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION) svr_3 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_2 + datetime.timedelta(days=30), revocation_type=StateSupervisionViolationResponseRevocationType. RETURN_TO_SUPERVISION) placeholder_sv = StateSupervisionViolation.new_with_defaults( supervision_violation_responses=[svr_1, svr_2, svr_3]) placeholder_sp = StateSupervisionPeriod.new_with_defaults( supervision_violation_entries=[placeholder_sv]) placeholder_ss = StateSupervisionSentence.new_with_defaults( supervision_periods=[placeholder_sp]) placeholder_sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[placeholder_is], supervision_sentences=[placeholder_ss]) placeholder_person = StatePerson.new_with_defaults( sentence_groups=[placeholder_sg]) external_id = StatePersonExternalId.new_with_defaults( external_id=_EXTERNAL_ID) person_without_revocation = StatePerson.new_with_defaults( external_ids=[external_id]) expected_svr_1 = attr.evolve(svr_1) expected_svr_2 = attr.evolve(svr_2) expected_svr_3 = attr.evolve(svr_3) expected_placeholder_sv = attr.evolve( placeholder_sv, supervision_violation_responses=[expected_svr_1, expected_svr_2, expected_svr_3]) expected_placeholder_sp = attr.evolve( placeholder_sp, supervision_violation_entries=[expected_placeholder_sv]) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[expected_placeholder_sp]) expected_ip_1 = attr.evolve( ip_1, source_supervision_violation_response=expected_svr_1) expected_ip_2 = attr.evolve( ip_2, source_supervision_violation_response=expected_svr_2) expected_placeholder_is = attr.evolve( placeholder_is, incarceration_periods=[expected_ip_1, expected_ip_2]) expected_placeholder_sg = attr.evolve( placeholder_sg, supervision_sentences=[expected_placeholder_ss], incarceration_sentences=[expected_placeholder_is]) expected_placeholder_person = attr.evolve( placeholder_person, sentence_groups=[expected_placeholder_sg]) expected_person_without_revocation = attr.evolve( person_without_revocation) # Act input_people = \ converter.convert_entity_people_to_schema_people( [person_without_revocation, placeholder_person]) associate_revocation_svrs_with_ips(input_people) # Assert self.assert_people_match( [expected_person_without_revocation, expected_placeholder_person], input_people)
def test_associateSvrsWithIps_within90Days(self) -> None: # Arrange svr_1 = StateSupervisionViolationResponse.new_with_defaults( state_code=_STATE_CODE, response_date=_DATE_2 + datetime.timedelta(days=1), revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION, ) svr_2 = StateSupervisionViolationResponse.new_with_defaults( state_code=_STATE_CODE, response_date=_DATE_4 + datetime.timedelta(days=100), revocation_type=StateSupervisionViolationResponseRevocationType. RETURN_TO_SUPERVISION, ) placeholder_sv = StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_responses=[svr_1, svr_2]) placeholder_sp = StateSupervisionPeriod.new_with_defaults( state_code=_STATE_CODE, supervision_violation_entries=[placeholder_sv], status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) placeholder_ss = StateSupervisionSentence.new_with_defaults( state_code=_STATE_CODE, supervision_periods=[placeholder_sp], status=StateSentenceStatus.PRESENT_WITHOUT_INFO, ) ip_1 = StateIncarcerationPeriod.new_with_defaults( state_code=_STATE_CODE, admission_date=_DATE_2, admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, ) ip_2 = StateIncarcerationPeriod.new_with_defaults( state_code=_STATE_CODE, admission_date=_DATE_4, admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, ) placeholder_is = StateIncarcerationSentence.new_with_defaults( state_code=_STATE_CODE, incarceration_periods=[ip_1, ip_2], status=StateSentenceStatus.PRESENT_WITHOUT_INFO, ) placeholder_sg = StateSentenceGroup.new_with_defaults( state_code=_STATE_CODE, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_sentences=[placeholder_is], supervision_sentences=[placeholder_ss], ) placeholder_person = StatePerson.new_with_defaults( state_code=_STATE_CODE, sentence_groups=[placeholder_sg]) expected_svr_1 = attr.evolve(svr_1) expected_svr_2 = attr.evolve(svr_2) expected_placeholder_sv = attr.evolve( placeholder_sv, supervision_violation_responses=[expected_svr_1, expected_svr_2], ) expected_placeholder_sp = attr.evolve( placeholder_sp, supervision_violation_entries=[expected_placeholder_sv]) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[expected_placeholder_sp]) expected_ip_1 = attr.evolve( ip_1, source_supervision_violation_response=expected_svr_1) expected_ip_2 = attr.evolve(ip_2) expected_placeholder_is = attr.evolve( placeholder_is, incarceration_periods=[expected_ip_1, expected_ip_2]) expected_placeholder_sg = attr.evolve( placeholder_sg, supervision_sentences=[expected_placeholder_ss], incarceration_sentences=[expected_placeholder_is], ) expected_placeholder_person = attr.evolve( placeholder_person, sentence_groups=[expected_placeholder_sg]) # Act input_people = converter.convert_entity_people_to_schema_people( [placeholder_person]) associate_revocation_svrs_with_ips(input_people) # Assert self.assert_people_match([expected_placeholder_person], input_people)