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)
示例#2
0
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,
        )
示例#6
0
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
    )