| use std::sync::OnceLock; |
|
|
| use chrono::NaiveDate; |
| use rand::rngs::StdRng; |
| use rand::SeedableRng; |
|
|
| use crate::domain::Plan; |
|
|
| use super::availability::add_extra_unavailability; |
| use super::cohorts::assign_primary_off_days; |
| use super::employees::{build_employee_blueprints, instantiate_employees}; |
| use super::preferences::add_preferences; |
| use super::shifts::{build_public_shifts, prepare_shifts}; |
| use super::time_utils::find_next_monday; |
| use super::validation::validate_public_dataset; |
| use super::witness::build_hidden_witness; |
|
|
| |
| |
| |
| |
| |
| pub fn generate_large() -> Plan { |
| static SCHEDULE: OnceLock<Plan> = OnceLock::new(); |
| SCHEDULE.get_or_init(build_large_schedule).clone() |
| } |
|
|
| |
| fn build_large_schedule() -> Plan { |
| let mut rng = StdRng::seed_from_u64(0); |
| let start_date = find_next_monday(NaiveDate::from_ymd_opt(2024, 1, 1).unwrap()); |
|
|
| |
| |
| |
| let mut blueprints = build_employee_blueprints(&mut rng); |
| assign_primary_off_days(&mut blueprints); |
|
|
| |
| |
| |
| let mut employees = instantiate_employees(&blueprints, start_date); |
| let mut shifts = build_public_shifts(start_date); |
| prepare_shifts(&mut shifts); |
|
|
| |
| |
| |
| |
| let witness = build_hidden_witness(&employees, &shifts); |
| add_extra_unavailability(&mut employees, &shifts, &witness.employee_touched_dates); |
| add_preferences(&mut employees, start_date, &blueprints, &shifts, &witness); |
|
|
| |
| |
| validate_public_dataset(&employees, &shifts); |
|
|
| Plan::new(employees, shifts) |
| } |
|
|