Example #1
0
def _get_sequence_no(period: StateIncarcerationPeriod) -> int:
    """Extracts the ND specific Movement Sequence Number from the external id
    of the provided |period|.
    """
    try:
        external_id = cast(str, period.external_id)
        sequence_no = int(external_id.split('-')[-1])
    except Exception:
        raise EntityMatchingError(
            f"Could not parse sequence number from external_id "
            f"{period.external_id}", period.get_entity_name())
    return sequence_no
Example #2
0
def admitted_for_revocation(ip: StateIncarcerationPeriod) -> bool:
    """Determines if the provided |ip| began because of a revocation."""
    if not ip.admission_reason:
        return False
    revocation_types = [
        StateIncarcerationPeriodAdmissionReason.PAROLE_REVOCATION,
        StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION
    ]
    non_revocation_types = [
        StateIncarcerationPeriodAdmissionReason.ADMITTED_IN_ERROR,
        StateIncarcerationPeriodAdmissionReason.EXTERNAL_UNKNOWN,
        StateIncarcerationPeriodAdmissionReason.NEW_ADMISSION,
        StateIncarcerationPeriodAdmissionReason.RETURN_FROM_ERRONEOUS_RELEASE,
        StateIncarcerationPeriodAdmissionReason.RETURN_FROM_ESCAPE,
        StateIncarcerationPeriodAdmissionReason.TRANSFER
    ]
    if ip.admission_reason in revocation_types:
        return True
    if ip.admission_reason in non_revocation_types:
        return False
    raise EntityMatchingError(
        f"Unexpected StateIncarcerationPeriodAdmissionReason "
        f"{ip.admission_reason}.", ip.get_entity_name())
Example #3
0
def _merge_incomplete_periods(
        a: StateIncarcerationPeriod, b: StateIncarcerationPeriod) \
        -> StateIncarcerationPeriod:
    if bool(a.admission_date) and bool(b.release_date):
        admission_period, release_period = a, b
    elif bool(a.release_date) and bool(b.admission_date):
        admission_period, release_period = b, a
    else:
        raise EntityMatchingError(
            f"Expected one admission period and one release period when "
            f"merging, instead found periods: {a}, {b}", a.get_entity_name())

    merged_period = attr.evolve(admission_period)
    admission_external_id = admission_period.external_id or ''
    release_external_id = release_period.external_id or ''
    new_external_id = admission_external_id \
                      + _INCARCERATION_PERIOD_ID_DELIMITER \
                      + release_external_id
    _default_merge_flat_fields(new_entity=release_period,
                               old_entity=merged_period)

    merged_period.external_id = new_external_id
    return merged_period