def admission_event_for_period( incarceration_sentences: List[StateIncarcerationSentence], supervision_sentences: List[StateSupervisionSentence], incarceration_period: StateIncarcerationPeriod, county_of_residence: Optional[str] ) -> Optional[IncarcerationAdmissionEvent]: """Returns an IncarcerationAdmissionEvent if this incarceration period represents an admission to incarceration.""" admission_date = incarceration_period.admission_date admission_reason = incarceration_period.admission_reason supervision_type_at_admission = get_pre_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) specialized_purpose_for_incarceration = incarceration_period.specialized_purpose_for_incarceration if admission_date and admission_reason: admission_reason = state_specific_admission_reason_override( incarceration_period.state_code, admission_reason, supervision_type_at_admission) return IncarcerationAdmissionEvent( state_code=incarceration_period.state_code, event_date=admission_date, facility=incarceration_period.facility, admission_reason=admission_reason, admission_reason_raw_text=incarceration_period. admission_reason_raw_text, supervision_type_at_admission=supervision_type_at_admission, specialized_purpose_for_incarceration= specialized_purpose_for_incarceration, county_of_residence=county_of_residence, ) return None
def release_event_for_period( incarceration_sentences: List[StateIncarcerationSentence], supervision_sentences: List[StateSupervisionSentence], incarceration_period: StateIncarcerationPeriod, county_of_residence: Optional[str], ) -> Optional[IncarcerationReleaseEvent]: """Returns an IncarcerationReleaseEvent if this incarceration period represents an release from incarceration.""" release_date = incarceration_period.release_date release_reason = incarceration_period.release_reason purpose_for_incarceration = ( incarceration_period.specialized_purpose_for_incarceration) supervision_type_at_admission = get_pre_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) admission_reason = None if incarceration_period.admission_reason: admission_reason = state_specific_incarceration_admission_reason_override( incarceration_period.state_code, incarceration_period.admission_reason, supervision_type_at_admission, ) if release_date and release_reason: supervision_type_at_release = get_post_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) total_days_incarcerated = None if incarceration_period.admission_date: total_days_incarcerated = ( release_date - incarceration_period.admission_date).days if total_days_incarcerated < 0: logging.warning( "release_date before admission_date on incarceration period: %s", incarceration_period, ) total_days_incarcerated = 0 return IncarcerationReleaseEvent( state_code=incarceration_period.state_code, event_date=release_date, facility=incarceration_period.facility, release_reason=release_reason, release_reason_raw_text=incarceration_period. release_reason_raw_text, purpose_for_incarceration=purpose_for_incarceration, county_of_residence=county_of_residence, supervision_type_at_release=supervision_type_at_release, admission_reason=admission_reason, total_days_incarcerated=total_days_incarcerated, ) return None
def find_incarceration_stays( incarceration_sentences: List[StateIncarcerationSentence], supervision_sentences: List[StateSupervisionSentence], incarceration_period: StateIncarcerationPeriod, county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]: """Finds all days for which this person was incarcerated.""" incarceration_stay_events: List[IncarcerationStayEvent] = [] admission_date = incarceration_period.admission_date release_date = incarceration_period.release_date if release_date is None: if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY: # This should not happen after validation. raise ValueError( "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly" " setting missing dates.") # This person is in custody for this period. Set the release date for tomorrow. release_date = date.today() + relativedelta(days=1) if admission_date is None: return incarceration_stay_events supervision_type_at_admission = get_pre_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) sentence_group = _get_sentence_group_for_incarceration_period( incarceration_period) stay_date = admission_date while stay_date < release_date: most_serious_charge = find_most_serious_prior_charge_in_sentence_group( sentence_group, stay_date) most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None incarceration_stay_events.append( IncarcerationStayEvent( state_code=incarceration_period.state_code, event_date=stay_date, facility=incarceration_period.facility, county_of_residence=county_of_residence, most_serious_offense_ncic_code=most_serious_offense_ncic_code, most_serious_offense_statute=most_serious_offense_statute, admission_reason=incarceration_period.admission_reason, admission_reason_raw_text=incarceration_period. admission_reason_raw_text, supervision_type_at_admission=supervision_type_at_admission, )) stay_date = stay_date + relativedelta(days=1) return incarceration_stay_events
def find_incarceration_stays( incarceration_sentences: List[StateIncarcerationSentence], supervision_sentences: List[StateSupervisionSentence], incarceration_period: StateIncarcerationPeriod, original_admission_reasons_by_period_id: Dict[int, Tuple[ StateIncarcerationPeriodAdmissionReason, Optional[str]]], incarceration_period_to_judicial_district: Dict[int, Dict[Any, Any]], county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]: """Finds all days for which this person was incarcerated.""" incarceration_stay_events: List[IncarcerationStayEvent] = [] admission_date = incarceration_period.admission_date release_date = incarceration_period.release_date if release_date is None: if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY: # This should not happen after validation. raise ValueError( "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly" " setting missing dates.") # This person is in custody for this period. Set the release date for tomorrow. release_date = date.today() + relativedelta(days=1) if admission_date is None: return incarceration_stay_events supervision_type_at_admission = get_pre_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) sentence_group = _get_sentence_group_for_incarceration_period( incarceration_period) judicial_district_code = _get_judicial_district_code( incarceration_period, incarceration_period_to_judicial_district) stay_date = admission_date incarceration_period_id = incarceration_period.incarceration_period_id if not incarceration_period_id: raise ValueError( "Unexpected incarceration period without an incarceration_period_id." ) original_admission_reason, original_admission_reason_raw_text = \ original_admission_reasons_by_period_id[incarceration_period_id] original_admission_reason = state_specific_admission_reason_override( incarceration_period.state_code, original_admission_reason, supervision_type_at_admission) while stay_date < release_date: most_serious_charge = find_most_serious_prior_charge_in_sentence_group( sentence_group, stay_date) most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None incarceration_stay_events.append( IncarcerationStayEvent( state_code=incarceration_period.state_code, event_date=stay_date, facility=incarceration_period.facility, county_of_residence=county_of_residence, most_serious_offense_ncic_code=most_serious_offense_ncic_code, most_serious_offense_statute=most_serious_offense_statute, admission_reason=original_admission_reason, admission_reason_raw_text=original_admission_reason_raw_text, supervision_type_at_admission=supervision_type_at_admission, judicial_district_code=judicial_district_code, specialized_purpose_for_incarceration=incarceration_period. specialized_purpose_for_incarceration)) stay_date = stay_date + relativedelta(days=1) return incarceration_stay_events