Implement planned pregnancy management in UserCharacterWorker and SQL: Added new queries for handling planned births and clearing character pregnancy records after birth. Refactored pregnancy processing logic to incorporate checks for planned pregnancy readiness and streamlined the insertion of child relations based on birth context. Enhanced documentation for clarity on the new planned pregnancy features and their integration into the existing system.
This commit is contained in:
@@ -1675,6 +1675,7 @@ pub const QUERY_AUTOBATISM: &str = r#"
|
||||
// Migration: `008_falukant_marriage_pregnancy_due.sql`.
|
||||
|
||||
/// Fällige Geburten (Ehe): `marriage_pregnancy_due_at <= NOW()`.
|
||||
/// B2: keine Ehe-Geburt, solange die Mutter eine **geplante** Schwangerschaft (`character.pregnancy_due_at`) hat.
|
||||
pub const QUERY_GET_MARRIAGE_BIRTH_DELIVERIES: &str = r#"
|
||||
SELECT
|
||||
r.id AS relationship_id,
|
||||
@@ -1699,7 +1700,8 @@ pub const QUERY_GET_MARRIAGE_BIRTH_DELIVERIES: &str = r#"
|
||||
WHERE r.marriage_pregnancy_due_at IS NOT NULL
|
||||
AND r.marriage_pregnancy_due_at <= NOW()
|
||||
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;
|
||||
"#;
|
||||
|
||||
pub const QUERY_CLEAR_MARRIAGE_PREGNANCY_DUE: &str = r#"
|
||||
@@ -1748,6 +1750,7 @@ pub const QUERY_TRY_MARRIAGE_CONCEPTION_UPDATE: &str = r#"
|
||||
WHERE r.marriage_pregnancy_due_at IS NULL
|
||||
AND ((c1.gender = 'male' AND c2.gender = 'female')
|
||||
OR (c1.gender = 'female' AND c2.gender = 'male'))
|
||||
AND c_female.pregnancy_due_at IS NULL
|
||||
),
|
||||
mother_age AS (
|
||||
SELECT
|
||||
@@ -1858,8 +1861,9 @@ pub const QUERY_GET_LEGACY_MARRIAGE_INSTANT_PREGNANCY_CANDIDATES: &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 (c1.gender = 'male' AND c2.gender = 'female')
|
||||
OR (c1.gender = 'female' AND c2.gender = 'male')
|
||||
WHERE ((c1.gender = 'male' AND c2.gender = 'female')
|
||||
OR (c1.gender = 'female' AND c2.gender = 'male'))
|
||||
AND c_female.pregnancy_due_at IS NULL
|
||||
),
|
||||
mother_age AS (
|
||||
SELECT
|
||||
@@ -1934,6 +1938,83 @@ pub const QUERY_GET_LEGACY_MARRIAGE_INSTANT_PREGNANCY_CANDIDATES: &str = r#"
|
||||
AND random() < prob_year;
|
||||
"#;
|
||||
|
||||
/// Spalten `pregnancy_due_at` / `pregnancy_father_character_id` auf `character` (Migration `011_…`).
|
||||
pub const QUERY_CHARACTER_PLANNED_PREGNANCY_COLUMNS_READY: &str = r#"
|
||||
SELECT EXISTS (
|
||||
SELECT 1
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = 'falukant_data'
|
||||
AND table_name = 'character'
|
||||
AND column_name = 'pregnancy_due_at'
|
||||
) AS ready;
|
||||
"#;
|
||||
|
||||
/// Fällige **geplante** Geburten (Weg A): Mutter trägt Termin + Vater; kein Ehe-`relationship`-Bezug.
|
||||
/// Vater NULL oder = Mutter: keine Zeile (Daemon überspringt; optional im Log).
|
||||
pub const QUERY_GET_PLANNED_CHARACTER_BIRTH_DELIVERIES: &str = r#"
|
||||
SELECT
|
||||
c_m.id AS mother_cid,
|
||||
c_f.id AS father_cid,
|
||||
CASE WHEN c_f.gender = 'male' THEN c_f.title_of_nobility ELSE c_m.title_of_nobility END AS title_of_nobility,
|
||||
CASE WHEN c_f.gender = 'male' THEN c_f.last_name ELSE c_m.last_name END AS last_name,
|
||||
CASE WHEN c_f.gender = 'male' THEN c_f.region_id ELSE c_m.region_id END AS region_id,
|
||||
fu_f.id AS father_uid,
|
||||
fu_m.id AS mother_uid,
|
||||
CASE
|
||||
WHEN EXISTS (
|
||||
SELECT 1
|
||||
FROM falukant_data.relationship r
|
||||
JOIN falukant_type.relationship rt ON rt.id = r.relationship_type_id AND rt.tr = 'lover'
|
||||
WHERE (r.character1_id = c_f.id AND r.character2_id = c_m.id)
|
||||
OR (r.character1_id = c_m.id AND r.character2_id = c_f.id)
|
||||
) THEN 'lover'
|
||||
ELSE 'marriage'
|
||||
END AS birth_context
|
||||
FROM falukant_data.character c_m
|
||||
JOIN falukant_data.character c_f ON c_f.id = c_m.pregnancy_father_character_id
|
||||
LEFT JOIN falukant_data.falukant_user fu_m ON fu_m.id = c_m.user_id
|
||||
LEFT JOIN falukant_data.falukant_user fu_f ON fu_f.id = c_f.user_id
|
||||
WHERE c_m.pregnancy_due_at IS NOT NULL
|
||||
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
|
||||
AND c_m.health > 0;
|
||||
"#;
|
||||
|
||||
pub const QUERY_CLEAR_CHARACTER_PREGNANCY_AFTER_BIRTH: &str = r#"
|
||||
UPDATE falukant_data.character
|
||||
SET pregnancy_due_at = NULL,
|
||||
pregnancy_father_character_id = NULL,
|
||||
updated_at = NOW()
|
||||
WHERE id = $1::int;
|
||||
"#;
|
||||
|
||||
/// Wie Node-Admin: `birth_context` / `legitimacy` / `public_known` je nach Liebschaft vs. Ehe.
|
||||
pub const QUERY_INSERT_CHILD_RELATION_PLANNED_BIRTH: &str = r#"
|
||||
INSERT INTO falukant_data.child_relation (
|
||||
father_character_id,
|
||||
mother_character_id,
|
||||
child_character_id,
|
||||
name_set,
|
||||
legitimacy,
|
||||
birth_context,
|
||||
public_known,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
VALUES (
|
||||
$1::int,
|
||||
$2::int,
|
||||
$3::int,
|
||||
FALSE,
|
||||
CASE WHEN $4::text = 'lover' THEN 'hidden_bastard'::varchar ELSE 'legitimate'::varchar END,
|
||||
CASE WHEN $4::text = 'lover' THEN 'lover'::varchar ELSE 'marriage'::varchar END,
|
||||
CASE WHEN $4::text = 'lover' THEN FALSE ELSE TRUE END,
|
||||
NOW(),
|
||||
NOW()
|
||||
);
|
||||
"#;
|
||||
|
||||
pub const QUERY_INSERT_CHILD: &str = r#"
|
||||
INSERT INTO falukant_data.character (
|
||||
user_id,
|
||||
|
||||
Reference in New Issue
Block a user