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, most_recent_assessment=None, supervision_contacts=[] ) self.assertEqual( SupervisionCaseCompliance( date_of_evaluation=compliance_evaluation_date, assessment_up_to_date=False, face_to_face_frequency_sufficient=False ), compliance)
def us_id_case_compliance_on_date(supervision_period: StateSupervisionPeriod, case_type: StateSupervisionCaseType, start_of_supervision: date, compliance_evaluation_date: date, assessments: List[StateAssessment], supervision_contacts: List[StateSupervisionContact]) -> \ Optional[SupervisionCaseCompliance]: """ Calculates several different compliance values for the supervision case represented by the supervision period, based on US_ID compliance standards. Measures compliance values for the following types of supervision events: - Assessments - Face-to-Face Contacts For each event, we calculate two types of metrics when possible. - The total number of events that have occurred for this person this month (until the |compliance_evaluation_date|). - Whether or not the compliance standards have been met for this event type (this is set to None if we do not have clear, documented guidelines applicable to this case). Args: supervision_period: The supervision_period representing the supervision case case_type: The "most severe" case type for the given supervision period start_of_supervision: The date the person started serving this supervision compliance_evaluation_date: The date that the compliance of the given case is being evaluated assessments: The risk assessments completed on this person supervision_contacts: The instances of contact between supervision officers and the person on supervision Returns: A SupervisionCaseCompliance object containing information regarding the ways the case is or isn't in compliance with state standards on the given compliance_evaluation_date. """ assessment_count = _assessments_in_compliance_month(compliance_evaluation_date, assessments) face_to_face_count = _face_to_face_contacts_in_compliance_month(compliance_evaluation_date, supervision_contacts) assessment_is_up_to_date = None face_to_face_frequency_sufficient = None if _guidelines_applicable_for_case(supervision_period, case_type): most_recent_assessment = find_most_recent_assessment(compliance_evaluation_date, assessments) assessment_is_up_to_date = _assessment_is_up_to_date(supervision_period, start_of_supervision, compliance_evaluation_date, most_recent_assessment) face_to_face_frequency_sufficient = _face_to_face_contact_frequency_is_sufficient(supervision_period, start_of_supervision, compliance_evaluation_date, supervision_contacts) return SupervisionCaseCompliance( date_of_evaluation=compliance_evaluation_date, assessment_count=assessment_count, assessment_up_to_date=assessment_is_up_to_date, face_to_face_count=face_to_face_count, face_to_face_frequency_sufficient=face_to_face_frequency_sufficient )
def test_us_id_case_compliance_on_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) case_type = StateSupervisionCaseType.GENERAL assessments = [ 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)) ] supervision_contacts = [ StateSupervisionContact.new_with_defaults( state_code='US_ID', contact_date=date(2018, 3, 6), contact_type=StateSupervisionContactType.FACE_TO_FACE, status=StateSupervisionContactStatus.COMPLETED), StateSupervisionContact.new_with_defaults( state_code='US_ID', contact_date=date(2018, 4, 6), contact_type=StateSupervisionContactType.FACE_TO_FACE, status=StateSupervisionContactStatus.COMPLETED), ] start_of_supervision = supervision_period.start_date 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=True, face_to_face_count=1, face_to_face_frequency_sufficient=True), compliance)
def us_id_case_compliance_on_date(supervision_period: StateSupervisionPeriod, case_type: StateSupervisionCaseType, start_of_supervision: date, compliance_evaluation_date: date, most_recent_assessment: Optional[StateAssessment], supervision_contacts: List[StateSupervisionContact]) -> \ Optional[SupervisionCaseCompliance]: """Determines whether the supervision case represented by the given supervision_period is in compliance with US_ID state standards. Measures compliance with the following standards: - Up-to-date Assessments - Face-to-Face Contact Frequency These compliance standards are only applicable to a certain subset of cases that have clear, documented guidelines. If the compliance guidelines are not applicable for the given supervision case, then case compliance is not calculated. Args: supervision_period: The supervision_period representing the supervision case case_type: The "most severe" case type for the given supervision period start_of_supervision: The date the person started serving this supervision compliance_evaluation_date: The date that the compliance of the given case is being evaluated most_recent_assessment: The most recent assessment taken before the compliance_evaluation_date supervision_contacts: The instances of contact between supervision officers and the person on supervision Returns: A SupervisionCaseCompliance object containing information regarding the ways the case is or isn't in compliance with state standards on the given compliance_evaluation_date. """ if not _guidelines_applicable_for_case(supervision_period, case_type): return None assessment_is_up_to_date = _assessment_is_up_to_date( supervision_period, start_of_supervision, compliance_evaluation_date, most_recent_assessment) face_to_face_frequency_sufficient = _face_to_face_contact_frequency_is_sufficient( supervision_period, start_of_supervision, compliance_evaluation_date, supervision_contacts) return SupervisionCaseCompliance( date_of_evaluation=compliance_evaluation_date, assessment_up_to_date=assessment_is_up_to_date, face_to_face_frequency_sufficient=face_to_face_frequency_sufficient)
def get_case_compliance_on_date( self, compliance_evaluation_date: date ) -> Optional[SupervisionCaseCompliance]: """ Calculates several different compliance values for the supervision case represented by the supervision period, based on state specific compliance standards. Measures compliance values for the following types of supervision events: - Assessments - Face-to-Face Contacts For each event, we calculate two types of metrics when possible. - The total number of events that have occurred for this person this month (until the |compliance_evaluation_date|). - Whether or not the compliance standards have been met for this event type (this is set to None if we do not have clear, documented guidelines applicable to this case). Returns: A SupervisionCaseCompliance object containing information regarding the ways the case is or isn't in compliance with state standards on the given compliance_evaluation_date. """ assessment_count = self._completed_assessments_in_compliance_month( compliance_evaluation_date ) face_to_face_count = self._face_to_face_contacts_in_compliance_month( compliance_evaluation_date ) most_recent_assessment_date = None num_days_assessment_overdue = None face_to_face_frequency_sufficient = None if self.guidelines_applicable_for_case: most_recent_assessment = ( find_most_recent_applicable_assessment_of_class_for_state( compliance_evaluation_date, self.assessments, assessment_class=StateAssessmentClass.RISK, state_code=self.supervision_period.state_code, ) ) if most_recent_assessment is not None: most_recent_assessment_date = most_recent_assessment.assessment_date num_days_assessment_overdue = self._num_days_assessment_overdue( compliance_evaluation_date, most_recent_assessment ) face_to_face_frequency_sufficient = ( self._face_to_face_contact_frequency_is_sufficient( compliance_evaluation_date ) ) return SupervisionCaseCompliance( date_of_evaluation=compliance_evaluation_date, assessment_count=assessment_count, most_recent_assessment_date=most_recent_assessment_date, num_days_assessment_overdue=num_days_assessment_overdue, face_to_face_count=face_to_face_count, most_recent_face_to_face_date=self._most_recent_face_to_face_contact( compliance_evaluation_date ), face_to_face_frequency_sufficient=face_to_face_frequency_sufficient, )
def us_id_case_compliance_on_date(supervision_period: StateSupervisionPeriod, case_type: StateSupervisionCaseType, start_of_supervision: date, compliance_evaluation_date: date, assessments: List[StateAssessment], supervision_contacts: List[StateSupervisionContact]) -> \ Optional[SupervisionCaseCompliance]: """ Calculates several different compliance values for the supervision case represented by the supervision period, based on US_ID compliance standards. Measures compliance values for the following types of supervision events: - Assessments - Face-to-Face Contacts We currently measure compliance for `GENERAL` and `SEX_OFFENSE` case types. Below are the expected requirements: - For `GENERAL` cases, there are two level systems: 1. Deprecated system mapping (`StateSupervisionLevel`: raw string) and expected frequencies: - Initial compliance standards (same for all levels): - LSI-R Assessment: within 45 days (if no assessment exists, or if one is past due) - Face to face: within 3 days of start of supervision - `MINIMUM`:`LEVEL 1` - Face to face contacts: none necessary - LSI-R Assessment: none - `MEDIUM`:`LEVEL 2` - Face to face contacts: 1x every 180 days - LSI-R Assessment: 1x every 365 days - `MEDIUM`:`LEVEL 2` - Face to face contacts: 1x every 180 days - LSI-R Assessment: 1x every 365 days - `HIGH`: `LEVEL 3` - Face to face contacts: 1x every 30 days - LSI-R Assessment: 1x every 365 days - `MAXIMUM`: `LEVEL 4` - Face to face contacts: 2x every 30 days - LSI-R Assessment: 1x every 365 days 2. New system mapping (`StateSupervisionLevel`: raw string) and expected frequencies: - Initial compliance standards (same for all levels): - LSI-R Assessment: within 45 days (if no assessment exists, or if one is past due) - Face to face: within 3 days of start of supervision - `MINIMUM`:`MINIMUM` - Face to face contacts: 1x every 180 days - LSI-R Assessment: none - `MEDIUM`:`MODERATE` - Face to face contacts: 2x every 90 days - LSI-R Assessment: 1x every 365 days - `HIGH`: `HIGH` - Face to face contacts: 2x every 30 days - LSI-R Assessment: 1x every 365 days - For `SEX_OFFENSE` cases, there is one level system with the following mapping and expected frequencies: - Initial compliance standards (same for all levels): - LSI-R Assessment: within 45 days if on probation, or within 90 days if on parole - Face to face: within 3 days of start of supervision - `MINIMUM`:`SO LEVEL 1`/`SO LOW` - Face to face contacts: 1x every 90 days - LSI-R Assessment: every 365 days if LSI-R > 16 - `MEDIUM`:`SO LEVEL 2`/`SO MODERATE` - Face to face contacts: 1x every 30 days - LSI-R Assessment: every 365 days if LSI-R > 16 - `HIGH`: `SO LEVEL 3`/`SO HIGH` - Face to face contacts: 2x every 30 days - LSI-R Assessment: every 365 days if LSI-R > 16 For each event, we calculate two types of metrics when possible. - The total number of events that have occurred for this person this month (until the |compliance_evaluation_date|). - Whether or not the compliance standards have been met for this event type (this is set to None if we do not have clear, documented guidelines applicable to this case). Args: supervision_period: The supervision_period representing the supervision case case_type: The "most severe" case type for the given supervision period start_of_supervision: The date the person started serving this supervision compliance_evaluation_date: The date that the compliance of the given case is being evaluated assessments: The risk assessments completed on this person supervision_contacts: The instances of contact between supervision officers and the person on supervision Returns: A SupervisionCaseCompliance object containing information regarding the ways the case is or isn't in compliance with state standards on the given compliance_evaluation_date. """ assessment_count = _assessments_in_compliance_month(compliance_evaluation_date, assessments) face_to_face_count = _face_to_face_contacts_in_compliance_month(compliance_evaluation_date, supervision_contacts) assessment_is_up_to_date = None face_to_face_frequency_sufficient = None if _guidelines_applicable_for_case(supervision_period, case_type): most_recent_assessment = find_most_recent_applicable_assessment_of_class_for_state( compliance_evaluation_date, assessments, assessment_class=StateAssessmentClass.RISK, state_code=supervision_period.state_code ) assessment_is_up_to_date = _assessment_is_up_to_date(case_type, supervision_period, start_of_supervision, compliance_evaluation_date, most_recent_assessment) face_to_face_frequency_sufficient = _face_to_face_contact_frequency_is_sufficient(case_type, supervision_period, start_of_supervision, compliance_evaluation_date, supervision_contacts) return SupervisionCaseCompliance( date_of_evaluation=compliance_evaluation_date, assessment_count=assessment_count, assessment_up_to_date=assessment_is_up_to_date, face_to_face_count=face_to_face_count, face_to_face_frequency_sufficient=face_to_face_frequency_sufficient )