use super::funejson::Value; use super::dates_add_days::{add_days, days_between, parse_iso_date}; /// 18 weeks: a wait of exactly 126 days is still within the standard. const EIGHTEEN_WEEKS_DAYS: i64 = 126; /// The length of a referral-to-treatment pathway, counted from the clock start /// to the clock stop, or to `on_date` while the patient is still waiting. /// There are no pauses: NHS England removed them in 2015. /// /// # Panics /// Panics on a malformed date, `on_date` or `clock_stop` before `clock_start`, /// or `clock_stop` after `on_date`. pub fn rtt_waiting_time(clock_start: &str, clock_stop: Option<&str>, on_date: &str) -> RttWait { parse_iso_date(clock_start); parse_iso_date(on_date); if on_date < clock_start { panic!("onDate {} is before clockStart {}", on_date, clock_start); } if let Some(stop) = clock_stop { parse_iso_date(stop); if stop < clock_start { panic!("clockStop {} is before clockStart {}", stop, clock_start); } if stop > on_date { panic!("clockStop {} is after onDate {}", stop, on_date); } } let days = days_between(clock_start, clock_stop.unwrap_or(on_date)); RttWait { days, completed_weeks: days / 7, // The 0-1 week band holds eight days (0 to 7), every later band seven. week_band: if days <= 7 { 1 } else { (days + 6) / 7 }, breached18_weeks: days > EIGHTEEN_WEEKS_DAYS, eighteen_week_date: add_days(clock_start, EIGHTEEN_WEEKS_DAYS), clock_stopped: clock_stop.is_some(), } } pub fn rtt_wait_to_value(wait: &RttWait) -> Value { Value::obj(vec![ ("days", Value::Int(wait.days)), ("completedWeeks", Value::Int(wait.completed_weeks)), ("weekBand", Value::Int(wait.week_band)), ("breached18Weeks", Value::Bool(wait.breached18_weeks)), ("eighteenWeekDate", Value::str(&wait.eighteen_week_date)), ("clockStopped", Value::Bool(wait.clock_stopped)), ]) } fn date_arg(value: &Value) -> &str { match value { Value::Str(s) => s.as_str(), _ => panic!("{:?} is not an ISO date (YYYY-MM-DD)", value), } } pub fn fune_vector(args: &[Value]) -> Value { let stop = if args[1].is_null() { None } else { Some(date_arg(&args[1])) }; rtt_wait_to_value(&rtt_waiting_time(date_arg(&args[0]), stop, date_arg(&args[2]))) }