diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 1994406..7f1876d 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -138,10 +138,13 @@ impl UserConfig { supply } - pub fn flexibility_map(&self) -> HashMap { + pub fn flexibility_map(&self, from: Day) -> HashMap { let mut map = HashMap::new(); for r in &self.residents { - map.insert(r.id, r.allowed_types.len() as u8); + let count = (from.0..=self.total_days) + .map(|d| r.available_slots_on(Day(d))) + .sum(); + map.insert(r.id, count); } map } diff --git a/src-tauri/src/resident.rs b/src-tauri/src/resident.rs index 0258c94..9896b21 100644 --- a/src-tauri/src/resident.rs +++ b/src-tauri/src/resident.rs @@ -64,6 +64,16 @@ impl Resident { self } + pub fn available_slots_on(&self, day: Day) -> u16 { + if self.negative_shifts.contains(&day) { + return 0; + } + day.shift_types() + .iter() + .filter(|t| self.allowed_types.contains(t)) + .count() as u16 + } + pub fn with_negative_shifts(mut self, negative_shifts: Vec) -> Self { self.negative_shifts = negative_shifts; self diff --git a/src-tauri/src/scheduler.rs b/src-tauri/src/scheduler.rs index d1ce3f2..8e4db58 100644 --- a/src-tauri/src/scheduler.rs +++ b/src-tauri/src/scheduler.rs @@ -200,7 +200,7 @@ impl Scheduler { tracker: &WorkloadTracker, slot: Slot, ) { - let flex_map = self.config.flexibility_map(); + let flex_map = self.config.flexibility_map(slot.day); let mut rng = SmallRng::from_rng(&mut rand::rng()); resident_ids.shuffle(&mut rng); resident_ids.sort_by_key(|r_id| { diff --git a/src-tauri/src/slot.rs b/src-tauri/src/slot.rs index b4b3a32..c347aee 100644 --- a/src-tauri/src/slot.rs +++ b/src-tauri/src/slot.rs @@ -136,6 +136,14 @@ impl Day { !self.0.is_multiple_of(2) } + pub fn shift_types(&self) -> &[ShiftType] { + if self.is_open_shift() { + &[ShiftType::OpenFirst, ShiftType::OpenSecond] + } else { + &[ShiftType::Closed] + } + } + pub fn next(&self) -> Self { Self(self.0 + 1) }