diff --git a/YpDaemon/src/worker/sql.rs b/YpDaemon/src/worker/sql.rs index 28de7b3..c0d7a29 100755 --- a/YpDaemon/src/worker/sql.rs +++ b/YpDaemon/src/worker/sql.rs @@ -1607,7 +1607,14 @@ pub const QUERY_SET_MARRIAGES_BY_PARTY: &str = r#" JOIN falukant_type.relationship AS rt2 ON rt2.id = rel2.relationship_type_id 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' + AND c.birthdate <= CURRENT_DATE - INTERVAL '14 days' + AND partner.birthdate <= CURRENT_DATE - INTERVAL '14 days' ) RETURNING character1_id, character2_id ) @@ -1946,4 +1953,3 @@ pub const QUERY_CHECK_EXISTING_CHURCH_OFFICE: &str = r#" WHERE co.character_id = $1 ) AS has_office; "#; - diff --git a/src/worker/sql.rs b/src/worker/sql.rs index b07a21b..d29dc1e 100755 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -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 WHERE r.marriage_pregnancy_due_at IS NOT NULL 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') OR (c1.gender = 'female' AND c2.gender = 'male')) 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 fu2 ON fu2.id = c2.user_id 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') OR (c1.gender = 'female' AND c2.gender = 'male')) 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 WHERE ((c1.gender = 'male' AND c2.gender = 'female') 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 NOT EXISTS ( 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_father_character_id IS NOT NULL 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 NOT EXISTS ( SELECT 1 @@ -2824,7 +2836,14 @@ pub const QUERY_SET_MARRIAGES_BY_PARTY: &str = r#" JOIN falukant_type.relationship AS rt2 ON rt2.id = rel2.relationship_type_id 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' + AND c.birthdate <= CURRENT_DATE - INTERVAL '14 days' + AND partner.birthdate <= CURRENT_DATE - INTERVAL '14 days' ) 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). AND rs.last_monthly_processed_at IS NOT NULL 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 NOT EXISTS ( SELECT 1 @@ -3859,6 +3880,13 @@ pub const QUERY_SET_CHARACTER_PREGNANCY_FROM_LOVER: &str = r#" WHERE c_m.id = $1::int AND c_m.health > 0 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 ( SELECT 1 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 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()")); + } +}