diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 9c1c0b2..d6c3eb9 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -73,10 +73,12 @@ JOIN falukant_data.branch b ON b.region_id = c.region_id AND b.falukant_user_id WHERE current_time BETWEEN '08:00:00' AND '17:00:00'; "#; -/// Bester Produktstart: **Legacy/UI-Formel** (vormals C++ `QUERY_GET_BEST_PRODUCTION`), damit Reihenfolge zur -/// Produkt-Ertrags-Tabelle passt: Wissen geht **additiv** in den Markt-Prozentsatz -/// `(worth + (2×Char + Dir)/3) / 100`, Kosten **`6 × category`**, Skalierung **`/ (300 × production_time)`**. -/// Verkauf/Steuer im laufenden Spiel nutzt weiter `DirectorWorker::compute_piece_sell_price` — nur **Ranking** hier. +/// Bester Produktstart für den Direktor: +/// Wissen geht additiv in den Markt-Prozentsatz `(worth + (2×Char + Dir)/3) / 100`. +/// Für das Ranking werden dieselben Stückkosten wie im DirectorWorker angesetzt: +/// `raw = 6 + category`, mit Headroom-Rabatt über Zertifikat (`min((cert-cat)*0.035, 0.14)`). +/// Skalierung: `/ (300 × production_time)`. +/// Verkauf/Steuer im laufenden Spiel nutzt weiterhin `DirectorWorker::compute_piece_sell_price` — hier nur Ranking. /// /// `worth_percent`: mit Fahrzeug `MAX` über Filialregionen; ohne Fahrzeug nur Direktor-Region. /// **Ein** Spielercharakter je User (`ORDER BY id DESC LIMIT 1`, `health > 0`). @@ -106,7 +108,20 @@ COALESCE((SELECT SUM(COALESCE(fdi.quantity, 0)) FROM falukant_data.stock fds JOI / 3.0 ) / 100.0 - - 6.0 * COALESCE(ftp.category, 0)::float8 + - ( + ( + 6.0 + GREATEST(COALESCE(ftp.category, 1)::float8, 1.0) + ) * ( + 1.0 - LEAST( + GREATEST( + COALESCE(fdu.certificate, 1)::float8 + - GREATEST(COALESCE(ftp.category, 1)::float8, 1.0), + 0.0 + ) * 0.035, + 0.14 + ) + ) + ) ) / (300.0 * NULLIF(ftp.production_time::float8, 0.0)) ) AS worth, fdb.id AS branch_id, (SELECT COUNT(id) FROM falukant_data.production WHERE branch_id = fdb.id) AS running_productions,