From d0ff6cad68b49eec65d028437b2eb0da93cab9ea Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 7 May 2026 11:25:48 +0200 Subject: [PATCH] Add branch and region details to DirectorWorker: Enhanced resignation candidate structure by including branch_id, region_id, and region_label. Updated resignation risk and resignation payloads to incorporate these new fields. Modified SQL query to retrieve branch and region information, ensuring accurate data handling for director resignations. --- src/worker/director.rs | 30 ++++++++++++++++++++++++++++-- src/worker/sql.rs | 12 +++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/worker/director.rs b/src/worker/director.rs index 9cc3d88..7fd779e 100644 --- a/src/worker/director.rs +++ b/src/worker/director.rs @@ -57,6 +57,10 @@ struct DirectorResignationCandidate { employer_user_id: i32, director_character_id: i32, satisfaction: i32, + branch_id: i32, + region_id: i32, + region_label: String, + resignation_allowed: bool, } #[derive(Debug, Clone)] @@ -191,12 +195,18 @@ impl DirectorWorker { for candidate in candidates { let sat = candidate.satisfaction.clamp(0, 100) as f64; let resignation_probability = 1.0 - (sat / 100.0); + if !candidate.resignation_allowed { + continue; + } if resignation_probability > 0.5 { let risk_percent = (resignation_probability * 100.0 * 100.0).round() / 100.0; let payload = format!( - r#"{{"tr":"director.resignation_risk_high","event":"director_resignation_risk_high","director_id":{},"director_character_id":{},"risk_percent":{},"satisfaction":{},"threshold_percent":50}}"#, + r#"{{"tr":"director.resignation_risk_high","event":"director_resignation_risk_high","director_id":{},"director_character_id":{},"branch_id":{},"region_id":{},"region_label":"{}","risk_percent":{},"satisfaction":{},"threshold_percent":50}}"#, candidate.id, candidate.director_character_id, + candidate.branch_id, + candidate.region_id, + json_escape(&candidate.region_label), risk_percent, candidate.satisfaction.clamp(0, 100) ); @@ -214,9 +224,12 @@ impl DirectorWorker { let resignation_percent = (resignation_probability * 100.0 * 100.0).round() / 100.0; let resignation_payload = format!( - r#"{{"tr":"director.resigned","event":"director_resigned","director_id":{},"director_character_id":{},"satisfaction":{},"resignation_percent":{}}}"#, + r#"{{"tr":"director.resigned","event":"director_resigned","director_id":{},"director_character_id":{},"branch_id":{},"region_id":{},"region_label":"{}","satisfaction":{},"resignation_percent":{}}}"#, candidate.id, candidate.director_character_id, + candidate.branch_id, + candidate.region_id, + json_escape(&candidate.region_label), candidate.satisfaction.clamp(0, 100), resignation_percent ); @@ -310,6 +323,13 @@ impl DirectorWorker { employer_user_id: row.get("employer_user_id")?.parse().ok()?, director_character_id: row.get("director_character_id")?.parse().ok()?, satisfaction: row.get("satisfaction")?.parse().ok()?, + branch_id: row.get("branch_id")?.parse().ok()?, + region_id: row.get("region_id")?.parse().ok()?, + region_label: row.get("region_label").cloned().unwrap_or_default(), + resignation_allowed: row + .get("resignation_allowed") + .map(|v| v == "t" || v == "true" || v == "1") + .unwrap_or(true), }) } @@ -1504,6 +1524,12 @@ impl DirectorWorker { } } +fn json_escape(input: &str) -> String { + input + .replace('\\', "\\\\") + .replace('"', "\\\"") +} + impl Worker for DirectorWorker { fn start_worker_thread(&mut self) { let pool = self.base.pool.clone(); diff --git a/src/worker/sql.rs b/src/worker/sql.rs index e728b12..9198ef6 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -642,8 +642,18 @@ pub const QUERY_GET_DIRECTORS_FOR_RESIGNATION_CHECK: &str = r#" SELECT d.id, d.employer_user_id, d.director_character_id, - COALESCE(d.satisfaction, 0)::int AS satisfaction + COALESCE(d.satisfaction, 0)::int AS satisfaction, + COALESCE(d.branch_id, -1)::int AS branch_id, + COALESCE(b.region_id, -1)::int AS region_id, + COALESCE(NULLIF(TRIM(r.name::text), ''), COALESCE(b.region_id, -1)::text) AS region_label, + ( + NOW() >= ( + GREATEST(COALESCE(d.updated_at, d.created_at), d.created_at) + INTERVAL '3 days' + ) + ) AS resignation_allowed FROM falukant_data.director d + LEFT JOIN falukant_data.branch b ON b.id = d.branch_id + LEFT JOIN falukant_data.region r ON r.id = b.region_id WHERE d.employer_user_id IS NOT NULL; "#;