Füge Altersprüfungen für Ehen und Schwangerschaften hinzu
All checks were successful
Deploy yourpart (blue-green) / deploy (push) Successful in 6m13s

This commit is contained in:
Torsten Schulz (local)
2026-08-24 09:04:42 +02:00
parent 8f8fb8418a
commit 1f18fe135e
2 changed files with 65 additions and 1 deletions

View File

@@ -1607,7 +1607,14 @@ pub const QUERY_SET_MARRIAGES_BY_PARTY: &str = r#"
JOIN falukant_type.relationship AS rt2 JOIN falukant_type.relationship AS rt2
ON rt2.id = rel2.relationship_type_id ON rt2.id = rel2.relationship_type_id
AND rt2.tr = 'engaged' AND rt2.tr = 'engaged'
JOIN falukant_data.character AS partner
ON partner.id = CASE
WHEN rel2.character1_id = c.id THEN rel2.character2_id
ELSE rel2.character1_id
END
WHERE p.created_at <= NOW() - INTERVAL '1 day' WHERE p.created_at <= NOW() - INTERVAL '1 day'
AND c.birthdate <= CURRENT_DATE - INTERVAL '14 days'
AND partner.birthdate <= CURRENT_DATE - INTERVAL '14 days'
) )
RETURNING character1_id, character2_id RETURNING character1_id, character2_id
) )
@@ -1946,4 +1953,3 @@ pub const QUERY_CHECK_EXISTING_CHURCH_OFFICE: &str = r#"
WHERE co.character_id = $1 WHERE co.character_id = $1
) AS has_office; ) AS has_office;
"#; "#;

View File

@@ -2133,6 +2133,10 @@ pub const QUERY_GET_MARRIAGE_BIRTH_DELIVERIES: &str = r#"
LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id
WHERE r.marriage_pregnancy_due_at IS NOT NULL WHERE r.marriage_pregnancy_due_at IS NOT NULL
AND r.marriage_pregnancy_due_at <= NOW() AND r.marriage_pregnancy_due_at <= NOW()
-- Eine fällige automatische Ehe-Geburt bleibt vorgemerkt, bis beide
-- Eltern mindestens 16 Spieljahre (Kalendertage) alt sind.
AND c1.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c2.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND ((c1.gender = 'male' AND c2.gender = 'female') AND ((c1.gender = 'male' AND c2.gender = 'female')
OR (c1.gender = 'female' AND c2.gender = 'male')) OR (c1.gender = 'female' AND c2.gender = 'male'))
AND c_female.pregnancy_due_at IS NULL AND c_female.pregnancy_due_at IS NULL
@@ -2182,6 +2186,8 @@ pub const QUERY_TRY_MARRIAGE_CONCEPTION_UPDATE: &str = r#"
LEFT JOIN falukant_data.falukant_user fu1 ON fu1.id = c1.user_id LEFT JOIN falukant_data.falukant_user fu1 ON fu1.id = c1.user_id
LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id
WHERE r.marriage_pregnancy_due_at IS NULL WHERE r.marriage_pregnancy_due_at IS NULL
AND c1.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c2.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND ((c1.gender = 'male' AND c2.gender = 'female') AND ((c1.gender = 'male' AND c2.gender = 'female')
OR (c1.gender = 'female' AND c2.gender = 'male')) OR (c1.gender = 'female' AND c2.gender = 'male'))
AND c_female.pregnancy_due_at IS NULL AND c_female.pregnancy_due_at IS NULL
@@ -2246,6 +2252,8 @@ pub const QUERY_GET_LEGACY_MARRIAGE_INSTANT_PREGNANCY_CANDIDATES: &str = r#"
LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id
WHERE ((c1.gender = 'male' AND c2.gender = 'female') WHERE ((c1.gender = 'male' AND c2.gender = 'female')
OR (c1.gender = 'female' AND c2.gender = 'male')) OR (c1.gender = 'female' AND c2.gender = 'male'))
AND c1.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c2.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c_female.pregnancy_due_at IS NULL AND c_female.pregnancy_due_at IS NULL
AND NOT EXISTS ( AND NOT EXISTS (
SELECT 1 SELECT 1
@@ -2323,6 +2331,10 @@ pub const QUERY_GET_PLANNED_CHARACTER_BIRTH_DELIVERIES: &str = r#"
AND c_m.pregnancy_due_at <= NOW() AND c_m.pregnancy_due_at <= NOW()
AND c_m.pregnancy_father_character_id IS NOT NULL AND c_m.pregnancy_father_character_id IS NOT NULL
AND c_m.pregnancy_father_character_id <> c_m.id AND c_m.pregnancy_father_character_id <> c_m.id
-- Geplante Schwangerschaften werden nicht verworfen, sondern erst
-- nach Erreichen des gemeinsamen Mindestalters ausgeliefert.
AND c_m.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c_f.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c_m.health > 0 AND c_m.health > 0
AND NOT EXISTS ( AND NOT EXISTS (
SELECT 1 SELECT 1
@@ -2824,7 +2836,14 @@ pub const QUERY_SET_MARRIAGES_BY_PARTY: &str = r#"
JOIN falukant_type.relationship AS rt2 JOIN falukant_type.relationship AS rt2
ON rt2.id = rel2.relationship_type_id ON rt2.id = rel2.relationship_type_id
AND rt2.tr = 'engaged' AND rt2.tr = 'engaged'
JOIN falukant_data.character AS partner
ON partner.id = CASE
WHEN rel2.character1_id = c.id THEN rel2.character2_id
ELSE rel2.character1_id
END
WHERE p.created_at <= NOW() - INTERVAL '1 day' WHERE p.created_at <= NOW() - INTERVAL '1 day'
AND c.birthdate <= CURRENT_DATE - INTERVAL '14 days'
AND partner.birthdate <= CURRENT_DATE - INTERVAL '14 days'
) )
RETURNING character1_id, character2_id RETURNING character1_id, character2_id
) )
@@ -3816,6 +3835,8 @@ pub const QUERY_GET_LOVER_PREGNANCY_CANDIDATES: &str = r#"
-- `last_monthly_processed_at` wird im Familien-Tageslauf mitgeführt (1 Spieljahr = 1 Kalendertag). -- `last_monthly_processed_at` wird im Familien-Tageslauf mitgeführt (1 Spieljahr = 1 Kalendertag).
AND rs.last_monthly_processed_at IS NOT NULL AND rs.last_monthly_processed_at IS NOT NULL
AND rs.last_monthly_processed_at >= NOW() - INTERVAL '50 days' AND rs.last_monthly_processed_at >= NOW() - INTERVAL '50 days'
AND c1.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c2.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND c_female.pregnancy_due_at IS NULL AND c_female.pregnancy_due_at IS NULL
AND NOT EXISTS ( AND NOT EXISTS (
SELECT 1 SELECT 1
@@ -3859,6 +3880,13 @@ pub const QUERY_SET_CHARACTER_PREGNANCY_FROM_LOVER: &str = r#"
WHERE c_m.id = $1::int WHERE c_m.id = $1::int
AND c_m.health > 0 AND c_m.health > 0
AND c_m.pregnancy_due_at IS NULL AND c_m.pregnancy_due_at IS NULL
AND c_m.birthdate <= CURRENT_DATE - INTERVAL '16 days'
AND EXISTS (
SELECT 1
FROM falukant_data.character c_f
WHERE c_f.id = $2::int
AND c_f.birthdate <= CURRENT_DATE - INTERVAL '16 days'
)
AND NOT EXISTS ( AND NOT EXISTS (
SELECT 1 SELECT 1
FROM falukant_data.relationship rm FROM falukant_data.relationship rm
@@ -4031,3 +4059,33 @@ pub const QUERY_GET_FALUKANT_USER_CERT_AND_EVENT: &str = r#"
FROM falukant_data.falukant_user FROM falukant_data.falukant_user
WHERE id = $1::int; WHERE id = $1::int;
"#; "#;
#[cfg(test)]
mod tests {
use super::*;
const AGE_14_GUARD: &str = "birthdate <= CURRENT_DATE - INTERVAL '14 days'";
const AGE_16_GUARD: &str = "birthdate <= CURRENT_DATE - INTERVAL '16 days'";
#[test]
fn weddings_require_both_fiances_to_be_fourteen() {
assert_eq!(QUERY_SET_MARRIAGES_BY_PARTY.matches(AGE_14_GUARD).count(), 2);
assert!(QUERY_SET_MARRIAGES_BY_PARTY.contains("p.created_at <= NOW() - INTERVAL '1 day'"));
}
#[test]
fn automatic_pregnancy_and_birth_paths_require_both_parents_to_be_sixteen() {
for query in [
QUERY_GET_MARRIAGE_BIRTH_DELIVERIES,
QUERY_TRY_MARRIAGE_CONCEPTION_UPDATE,
QUERY_GET_LEGACY_MARRIAGE_INSTANT_PREGNANCY_CANDIDATES,
QUERY_GET_PLANNED_CHARACTER_BIRTH_DELIVERIES,
QUERY_GET_LOVER_PREGNANCY_CANDIDATES,
] {
assert_eq!(query.matches(AGE_16_GUARD).count(), 2, "{query}");
}
assert!(QUERY_SET_CHARACTER_PREGNANCY_FROM_LOVER.contains(AGE_16_GUARD));
assert!(QUERY_GET_PLANNED_CHARACTER_BIRTH_DELIVERIES.contains("pregnancy_due_at <= NOW()"));
}
}