Refactor ProductionPlan to use f64 for money: Updated the money field in ProductionPlan from i32 to f64 to accommodate decimal values from the database. Adjusted related calculations in DirectorWorker to handle floating-point arithmetic for production costs and money management, ensuring accurate financial computations.

This commit is contained in:
Torsten Schulz (local)
2025-12-01 09:35:23 +01:00
parent 1adff4e716
commit 8a08a74b80

View File

@@ -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<ProductionPlan> {
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::<f64>().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!(