def test_ssvrFlatFieldMatchingRevocationTypeChanges(self) -> None: db_person = generate_person(state_code=_US_MO) db_supervision_violation_response = generate_supervision_violation_response( person=db_person, state_code=_US_MO, response_type=StateSupervisionViolationResponseType. PERMANENT_DECISION.value, response_type_raw_text=StateSupervisionViolationResponseType. PERMANENT_DECISION.value, deciding_body_type=StateSupervisionViolationResponseDecidingBodyType .PAROLE_BOARD.value, deciding_body_type_raw_text= StateSupervisionViolationResponseDecidingBodyType.PAROLE_BOARD. value, revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION.value, revocation_type_raw_text="S", ) db_incarceration_period = generate_incarceration_period( person=db_person, state_code=_US_MO, external_id=_EXTERNAL_ID, admission_reason=StateIncarcerationPeriodAdmissionReason. PAROLE_REVOCATION.value, source_supervision_violation_response= db_supervision_violation_response, ) db_incarceration_sentence = generate_incarceration_sentence( person=db_person, status=StateSentenceStatus.PRESENT_WITHOUT_INFO.value, state_code=_US_MO, external_id=_EXTERNAL_ID, incarceration_periods=[db_incarceration_period], ) db_sentence_group = generate_sentence_group( person=db_person, state_code=_US_MO, external_id=_EXTERNAL_ID_WITH_SUFFIX, status=StateSentenceStatus.PRESENT_WITHOUT_INFO.value, incarceration_sentences=[db_incarceration_sentence], supervision_sentences=[], ) db_external_id = generate_external_id( person=db_person, state_code=_US_MO, id_type=_ID_TYPE, external_id=_EXTERNAL_ID, ) db_person.external_ids = [db_external_id] db_person.sentence_groups = [db_sentence_group] self._commit_to_db(db_person) # Even though the revocation type has changed, we still allow a match supervision_violation_response = StateSupervisionViolationResponse.new_with_defaults( state_code=_US_MO, response_type=StateSupervisionViolationResponseType. PERMANENT_DECISION, response_type_raw_text=StateSupervisionViolationResponseType. PERMANENT_DECISION.value, deciding_body_type=StateSupervisionViolationResponseDecidingBodyType .PAROLE_BOARD, deciding_body_type_raw_text= StateSupervisionViolationResponseDecidingBodyType.PAROLE_BOARD. value, revocation_type=StateSupervisionViolationResponseRevocationType. TREATMENT_IN_PRISON, revocation_type_raw_text="L", ) incarceration_period = StateIncarcerationPeriod.new_with_defaults( state_code=_US_MO, external_id=_EXTERNAL_ID, admission_reason=StateIncarcerationPeriodAdmissionReason. PAROLE_REVOCATION, source_supervision_violation_response= supervision_violation_response, status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, ) incarceration_sentence = StateIncarcerationSentence.new_with_defaults( status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code=_US_MO, external_id=_EXTERNAL_ID, incarceration_periods=[incarceration_period], ) sentence_group = StateSentenceGroup.new_with_defaults( state_code=_US_MO, external_id=_EXTERNAL_ID_WITH_SUFFIX, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_sentences=[incarceration_sentence], supervision_sentences=[], ) external_id = StatePersonExternalId.new_with_defaults( state_code=_US_MO, id_type=_ID_TYPE, external_id=_EXTERNAL_ID) person = StatePerson.new_with_defaults( sentence_groups=[sentence_group], external_ids=[external_id], state_code=_US_MO, ) expected_person = self.to_entity(db_person) expected_ip = (expected_person.sentence_groups[0]. incarceration_sentences[0].incarceration_periods[0]) expected_ssvr = expected_ip.source_supervision_violation_response expected_ssvr.revocation_type = ( StateSupervisionViolationResponseRevocationType.TREATMENT_IN_PRISON ) expected_ssvr.revocation_type_raw_text = "L" # Act 1 - Match session = self._session() matched_entities = entity_matching.match(session, _US_MO, ingested_people=[person]) self.assert_people_match_pre_and_post_commit([expected_person], matched_entities.people, session) self.assertEqual(0, matched_entities.error_count) self.assertEqual(1, matched_entities.total_root_entities)
def test_supervisionViolationsWithDifferentParents_mergesViolations(self): db_person = generate_person(person_id=_ID, full_name=_FULL_NAME) db_supervision_violation = generate_supervision_violation( person=db_person, state_code=_US_MO, supervision_violation_id=_ID, external_id=_EXTERNAL_ID) db_placeholder_supervision_period = generate_supervision_period( person=db_person, state_code=_US_MO, supervision_period_id=_ID, supervision_violation_entries=[db_supervision_violation]) db_incarceration_sentence = generate_incarceration_sentence( person=db_person, state_code=_US_MO, incarceration_sentence_id=_ID, external_id=_EXTERNAL_ID, supervision_periods=[db_placeholder_supervision_period]) db_sentence_group = generate_sentence_group( person=db_person, state_code=_US_MO, sentence_group_id=_ID, external_id=_EXTERNAL_ID, incarceration_sentences=[db_incarceration_sentence]) db_external_id = generate_external_id(person=db_person, person_external_id_id=_ID, state_code=_US_MO, external_id=_EXTERNAL_ID) db_person.sentence_groups = [db_sentence_group] db_person.external_ids = [db_external_id] self._commit_to_db(db_person) supervision_violation = attr.evolve( self.to_entity(db_supervision_violation), supervision_violation_id=None, external_id=_EXTERNAL_ID_WITH_SUFFIX) placeholder_supervision_period = attr.evolve( self.to_entity(db_placeholder_supervision_period), supervision_period_id=None, supervision_violation_entries=[supervision_violation]) supervision_sentence = StateSupervisionSentence.new_with_defaults( status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code=_US_MO, external_id=_EXTERNAL_ID, supervision_periods=[placeholder_supervision_period]) sentence_group = attr.evolve( self.to_entity(db_sentence_group), sentence_group_id=None, incarceration_sentences=[], supervision_sentences=[supervision_sentence]) external_id = attr.evolve(self.to_entity(db_external_id), person_external_id_id=None) person = attr.evolve(self.to_entity(db_person), person_id=None, sentence_groups=[sentence_group], external_ids=[external_id]) expected_supervision_violation = attr.evolve( self.to_entity(db_supervision_violation)) expected_placeholder_supervision_period_is = attr.evolve( placeholder_supervision_period, supervision_violation_entries=[expected_supervision_violation]) expected_placeholder_supervision_period_ss = attr.evolve( self.to_entity(db_placeholder_supervision_period), supervision_violation_entries=[expected_supervision_violation]) expected_supervision_sentence = attr.evolve( supervision_sentence, supervision_periods=[expected_placeholder_supervision_period_ss]) expected_incarceration_sentence = attr.evolve( self.to_entity(db_incarceration_sentence), supervision_periods=[expected_placeholder_supervision_period_is]) expected_sentence_group = attr.evolve( self.to_entity(db_sentence_group), incarceration_sentences=[expected_incarceration_sentence], supervision_sentences=[expected_supervision_sentence]) expected_external_id = attr.evolve(self.to_entity(db_external_id)) expected_person = attr.evolve( self.to_entity(db_person), external_ids=[expected_external_id], sentence_groups=[expected_sentence_group]) # Act 1 - Match session = self._session() matched_entities = entity_matching.match(session, _US_MO, ingested_people=[person]) self.assert_people_match_pre_and_post_commit([expected_person], matched_entities.people, session) self.assertEqual(0, matched_entities.error_count) self.assertEqual(1, matched_entities.total_root_entities)
def test_ssvrFlatFieldMatchingWithSomeNullValues(self) -> None: db_person = generate_person(state_code=_US_MO) db_supervision_violation_response = generate_supervision_violation_response( person=db_person, state_code=_US_MO, response_type=StateSupervisionViolationResponseType. PERMANENT_DECISION.value, response_type_raw_text=StateSupervisionViolationResponseType. PERMANENT_DECISION.value, deciding_body_type=StateSupervisionViolationResponseDecidingBodyType .PAROLE_BOARD.value, deciding_body_type_raw_text= StateSupervisionViolationResponseDecidingBodyType.PAROLE_BOARD. value, ) db_incarceration_period = generate_incarceration_period( person=db_person, state_code=_US_MO, external_id=_EXTERNAL_ID, admission_reason=StateIncarcerationPeriodAdmissionReason. PAROLE_REVOCATION.value, source_supervision_violation_response= db_supervision_violation_response, ) db_incarceration_sentence = generate_incarceration_sentence( person=db_person, status=StateSentenceStatus.PRESENT_WITHOUT_INFO.value, state_code=_US_MO, external_id=_EXTERNAL_ID, incarceration_periods=[db_incarceration_period], ) db_sentence_group = generate_sentence_group( person=db_person, state_code=_US_MO, external_id=_EXTERNAL_ID_WITH_SUFFIX, status=StateSentenceStatus.PRESENT_WITHOUT_INFO.value, incarceration_sentences=[db_incarceration_sentence], supervision_sentences=[], ) db_external_id = generate_external_id( person=db_person, state_code=_US_MO, id_type=_ID_TYPE, external_id=_EXTERNAL_ID, ) db_person.external_ids = [db_external_id] db_person.sentence_groups = [db_sentence_group] self._commit_to_db(db_person) # Even though this violation response doesn't have a deciding_body_type set, it will not clear the values in # db_supervision_violation_response. supervision_violation_response = StateSupervisionViolationResponse.new_with_defaults( state_code=_US_MO, response_type=StateSupervisionViolationResponseType. PERMANENT_DECISION, response_type_raw_text=StateSupervisionViolationResponseType. PERMANENT_DECISION.value, ) incarceration_period = StateIncarcerationPeriod.new_with_defaults( state_code=_US_MO, external_id=_EXTERNAL_ID, admission_reason=StateIncarcerationPeriodAdmissionReason. PAROLE_REVOCATION, source_supervision_violation_response= supervision_violation_response, status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, ) incarceration_sentence = StateIncarcerationSentence.new_with_defaults( status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code=_US_MO, external_id=_EXTERNAL_ID, incarceration_periods=[incarceration_period], ) sentence_group = StateSentenceGroup.new_with_defaults( state_code=_US_MO, external_id=_EXTERNAL_ID_WITH_SUFFIX, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_sentences=[incarceration_sentence], supervision_sentences=[], ) external_id = StatePersonExternalId.new_with_defaults( state_code=_US_MO, id_type=_ID_TYPE, external_id=_EXTERNAL_ID) person = StatePerson.new_with_defaults( sentence_groups=[sentence_group], external_ids=[external_id], state_code=_US_MO, ) expected_person = self.to_entity(db_person) # Act 1 - Match session = self._session() matched_entities = entity_matching.match(session, _US_MO, ingested_people=[person]) self.assert_people_match_pre_and_post_commit([expected_person], matched_entities.people, session) self.assertEqual(0, matched_entities.error_count) self.assertEqual(1, matched_entities.total_root_entities)