diff --git a/src/worker/sql.rs b/src/worker/sql.rs index cb887b8..1165c83 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -73,15 +73,24 @@ 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: Mit **mindestens einem** `falukant_data.vehicle` pro User — bester `worth_percent` +/// je Produkt über alle Filialregionen; **ohne** Fahrzeug nur noch **lokaler** Markt (Region der Direktor-Filiale), +/// sonst wäre der beste Fern-Preis nicht erreichbar. pub const QUERY_GET_BEST_PRODUCTION: &str = r#" SELECT fdu.id falukant_user_id, CAST(fdu.money AS text) AS money, fdu.certificate, ftp.id product_id, ftp.label_tr, COALESCE(ftp.category, 1)::int AS product_category, fdb.region_id, (SELECT SUM(quantity) FROM falukant_data.stock fds WHERE fds.branch_id = fdb.id) AS stock_size, COALESCE((SELECT SUM(COALESCE(fdi.quantity, 0)) FROM falukant_data.stock fds JOIN falukant_data.inventory fdi ON fdi.stock_id = fds.id WHERE fds.branch_id = fdb.id), 0) AS used_in_stock, --- Ranking = regionaler Erlös pro Zeiteinheit (wie „Erlös/Minute“ in der Oberfläche): --- Listenpreis * regionaler Marktanteil / Produktionsdauer — ohne Wissens-Additiv und ohne alte Kostenstrafe --- im Zähler (die echte Stückkosten berechnet der Director in Rust). -( (ftp.sell_cost * (fdtpw.worth_percent / 100.0)) / NULLIF(ftp.production_time::float8, 0.0) ) AS worth, +( (ftp.sell_cost * ( + CASE + WHEN EXISTS ( + SELECT 1 FROM falukant_data.vehicle v + WHERE v.falukant_user_id = fdu.id + ) + THEN bw.max_worth_pct + ELSE COALESCE(fdtpw_local.worth_percent::float8, 0.0) + END / 100.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, COALESCE((SELECT SUM(COALESCE(fdp.quantity, 0)) quantity FROM falukant_data.production fdp WHERE fdp.branch_id = fdb.id), 0) AS running_productions_quantity FROM falukant_data.director fdd @@ -89,10 +98,23 @@ JOIN falukant_data.character fdc ON fdc.id = fdd.director_character_id JOIN falukant_data.falukant_user fdu ON fdd.employer_user_id = fdu.id JOIN falukant_data.character user_character ON user_character.user_id = fdu.id JOIN falukant_data.branch fdb ON fdb.falukant_user_id = fdu.id AND fdb.region_id = fdc.region_id -JOIN falukant_data.town_product_worth fdtpw ON fdtpw.region_id = fdb.region_id -JOIN falukant_data.knowledge fdk_character ON fdk_character.product_id = fdtpw.product_id AND fdk_character.character_id = user_character.id -JOIN falukant_data.knowledge fdk_director ON fdk_director.product_id = fdtpw.product_id AND fdk_director.character_id = fdd.director_character_id -JOIN falukant_type.product ftp ON ftp.id = fdtpw.product_id AND ftp.category <= fdu.certificate +JOIN ( + SELECT tpw.product_id, + MAX(tpw.worth_percent)::float8 AS max_worth_pct + FROM falukant_data.town_product_worth tpw + WHERE tpw.region_id IN ( + SELECT DISTINCT br.region_id + FROM falukant_data.branch br + WHERE br.falukant_user_id = (SELECT d0.employer_user_id FROM falukant_data.director d0 WHERE d0.id = $1::int) + ) + GROUP BY tpw.product_id +) bw ON TRUE +JOIN falukant_type.product ftp ON ftp.id = bw.product_id AND ftp.category <= fdu.certificate +LEFT JOIN falukant_data.town_product_worth fdtpw_local + ON fdtpw_local.region_id = fdb.region_id + AND fdtpw_local.product_id = ftp.id +JOIN falukant_data.knowledge fdk_character ON fdk_character.product_id = ftp.id AND fdk_character.character_id = user_character.id +JOIN falukant_data.knowledge fdk_director ON fdk_director.product_id = ftp.id AND fdk_director.character_id = fdd.director_character_id WHERE fdd.id = $1 AND fdb.id = $2 ORDER BY worth DESC LIMIT 1; "#;