Add office gap management: Introduced new queries and logic in PoliticsWorker to identify and create elections for office type/region combinations with insufficient seats. Implemented trimming of excess offices to ensure compliance with configured seat limits. Updated UserCharacterWorker to delete political offices and maintain seat integrity post-deletion.
This commit is contained in:
@@ -378,9 +378,56 @@ const QUERY_DELETE_DEBTORS_PRISM: &str = r#"
|
||||
WHERE character_id = $1;
|
||||
"#;
|
||||
|
||||
/// Löscht alle Ämter eines Charakters und stellt anschließend sicher, dass
|
||||
/// für die betroffenen Amtstyp/Region-Kombinationen nicht mehr Ämter
|
||||
/// besetzt sind als durch `seats_per_region` vorgesehen.
|
||||
///
|
||||
/// Die überzähligen Ämter werden deterministisch nach `created_at DESC`
|
||||
/// gekappt, d. h. neuere Amtsinhaber bleiben bevorzugt im Amt.
|
||||
const QUERY_DELETE_POLITICAL_OFFICE: &str = r#"
|
||||
WITH removed AS (
|
||||
DELETE FROM falukant_data.political_office
|
||||
WHERE character_id = $1
|
||||
RETURNING office_type_id, region_id
|
||||
),
|
||||
affected AS (
|
||||
SELECT DISTINCT office_type_id, region_id
|
||||
FROM removed
|
||||
),
|
||||
seats AS (
|
||||
SELECT
|
||||
pot.id AS office_type_id,
|
||||
rt.id AS region_id,
|
||||
pot.seats_per_region AS seats_total
|
||||
FROM falukant_type.political_office_type AS pot
|
||||
JOIN falukant_type.region AS rt
|
||||
ON pot.region_type = rt.label_tr
|
||||
JOIN affected AS a
|
||||
ON a.office_type_id = pot.id
|
||||
AND a.region_id = rt.id
|
||||
),
|
||||
ranked AS (
|
||||
SELECT
|
||||
po.id,
|
||||
po.office_type_id,
|
||||
po.region_id,
|
||||
s.seats_total,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY po.office_type_id, po.region_id
|
||||
ORDER BY po.created_at DESC
|
||||
) AS rn
|
||||
FROM falukant_data.political_office AS po
|
||||
JOIN seats AS s
|
||||
ON s.office_type_id = po.office_type_id
|
||||
AND s.region_id = po.region_id
|
||||
),
|
||||
to_delete AS (
|
||||
SELECT id
|
||||
FROM ranked
|
||||
WHERE rn > seats_total
|
||||
)
|
||||
DELETE FROM falukant_data.political_office
|
||||
WHERE character_id = $1;
|
||||
WHERE id IN (SELECT id FROM to_delete);
|
||||
"#;
|
||||
|
||||
const QUERY_DELETE_ELECTION_CANDIDATE: &str = r#"
|
||||
|
||||
Reference in New Issue
Block a user