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)
예제 #2
0
    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))
예제 #3
0
    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))
예제 #4
0
    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)
예제 #10
0
    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)
예제 #12
0
    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)
예제 #15
0
    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)
예제 #17
0
    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,
        )
예제 #18
0
    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)
예제 #19
0
    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,
        )
예제 #20
0
    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)
예제 #24
0
    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)
예제 #25
0
    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)
예제 #26
0
    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)
예제 #29
0
    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)
예제 #30
0
    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)