diff --git a/src/worker/director.rs b/src/worker/director.rs index bf7a7dc..bbf5d16 100644 --- a/src/worker/director.rs +++ b/src/worker/director.rs @@ -19,7 +19,7 @@ struct Director { #[derive(Debug, Clone)] struct ProductionPlan { falukant_user_id: i32, - money: i32, + money: f64, certificate: i32, branch_id: i32, product_id: i32, @@ -369,7 +369,9 @@ impl DirectorWorker { fn map_row_to_production_plan(row: &Row) -> Option { Some(ProductionPlan { falukant_user_id: row.get("falukant_user_id")?.parse().ok()?, - money: row.get("money")?.parse().ok()?, + // money kommt in der DB typischerweise als Dezimalzahl (z.B. "96284894.40"). + // Daher als f64 parsen; bei Parsefehlern den Plan verwerfen. + money: row.get("money")?.parse::().ok()?, certificate: row.get("certificate")?.parse().ok()?, branch_id: row.get("branch_id")?.parse().ok()?, product_id: row.get("product_id")?.parse().ok()?, @@ -389,30 +391,29 @@ impl DirectorWorker { return Ok(()); } - let free_capacity = - plan.stock_size - plan.used_in_stock - plan.running_productions; + let free_capacity = plan.stock_size - plan.used_in_stock - plan.running_productions; - let one_piece_cost = plan.certificate * 6; - let max_money_production = if one_piece_cost > 0 { - plan.money / one_piece_cost + // Stückkosten monetär berechnen. Da money ein f64 ist, arbeiten wir hier ebenfalls + // mit Gleitkomma und runden erst am Ende auf eine ganze Stückzahl ab. + let one_piece_cost = (plan.certificate * 6) as f64; + let max_money_production: i32 = if one_piece_cost > 0.0 { + // Anzahl Stück, die sich mit dem verfügbaren Geld finanzieren lassen + (plan.money / one_piece_cost).floor() as i32 } else { 0 }; - let to_produce = free_capacity - .min(max_money_production) - .min(300) - .max(0); + let to_produce = free_capacity.min(max_money_production).min(300).max(0); if to_produce < 1 { return Ok(()); } - let production_cost = to_produce * one_piece_cost; + let production_cost = to_produce as f64 * one_piece_cost; if let Err(err) = self.base.change_falukant_user_money( plan.falukant_user_id, - -(production_cost as f64), + -production_cost, "director starts production", ) { eprintln!(