From 0505c5a2c545ce55d9d6cba35ccf7b6a2c636328 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 12 Aug 2026 12:04:04 +0200 Subject: [PATCH] Hochzeitsfehler behoben --- ...00000-repair-marriages-without-wedding.cjs | 68 +++++++++++++++++++ backend/services/falukantService.js | 5 ++ src/valuerecalculationworker.h | 2 + 3 files changed, 75 insertions(+) create mode 100644 backend/migrations-active/20260812000000-repair-marriages-without-wedding.cjs diff --git a/backend/migrations-active/20260812000000-repair-marriages-without-wedding.cjs b/backend/migrations-active/20260812000000-repair-marriages-without-wedding.cjs new file mode 100644 index 0000000..b86d080 --- /dev/null +++ b/backend/migrations-active/20260812000000-repair-marriages-without-wedding.cjs @@ -0,0 +1,68 @@ +'use strict'; + +/** + * A relationship may only become married after a wedding party. Older data + * contains a few relationships that skipped that transition; besides showing + * the wrong status this also prevents ordering the required wedding party. + */ +module.exports = { + async up(queryInterface) { + await queryInterface.sequelize.query(` + WITH invalid_marriages AS ( + SELECT r.id, r.character1_id, r.character2_id + FROM falukant_data.relationship r + INNER JOIN falukant_type.relationship relationship_type + ON relationship_type.id = r.relationship_type_id + AND relationship_type.tr = 'married' + WHERE NOT EXISTS ( + SELECT 1 + FROM falukant_data.party p + INNER JOIN falukant_type.party party_type + ON party_type.id = p.party_type_id + AND party_type.for_marriage = TRUE + INNER JOIN falukant_data."character" party_host + ON party_host.user_id = p.falukant_user_id + WHERE party_host.id IN (r.character1_id, r.character2_id) + AND p.created_at >= r.created_at + ) + ), + reset_relationships AS ( + UPDATE falukant_data.relationship r + SET relationship_type_id = ( + SELECT id FROM falukant_type.relationship WHERE tr = 'engaged' + ) + FROM invalid_marriages invalid_marriage + WHERE r.id = invalid_marriage.id + RETURNING r.id + ), + reset_honeymoon_flags AS ( + UPDATE falukant_data.relationship_state relationship_state + SET flags_json = COALESCE(relationship_state.flags_json, '{}'::jsonb) + - 'honeymoonPregnancyScheduled' + FROM invalid_marriages invalid_marriage + WHERE relationship_state.relationship_id = invalid_marriage.id + RETURNING invalid_marriage.character1_id, invalid_marriage.character2_id + ) + UPDATE falukant_data."character" mother + SET pregnancy_due_at = NULL, + pregnancy_father_character_id = NULL + FROM reset_honeymoon_flags invalid_marriage + INNER JOIN falukant_data."character" character1 + ON character1.id = invalid_marriage.character1_id + INNER JOIN falukant_data."character" character2 + ON character2.id = invalid_marriage.character2_id + WHERE mother.id = CASE + WHEN LOWER(character1.gender) IN ('female', 'f') THEN character1.id + WHEN LOWER(character2.gender) IN ('female', 'f') THEN character2.id + END + AND mother.pregnancy_father_character_id = CASE + WHEN LOWER(character1.gender) IN ('female', 'f') THEN character2.id + WHEN LOWER(character2.gender) IN ('female', 'f') THEN character1.id + END; + `); + }, + + async down() { + // The original state cannot be reconstructed safely without inventing a wedding. + }, +}; diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index b78ebfa..f1244f5 100755 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -5646,6 +5646,11 @@ class FalukantService extends BaseService { const partner = partnerId ? await FalukantCharacter.findByPk(partnerId, { attributes: ['birthdate'] }) : null; + if (!engagement) { + const error = new Error('Für eine Hochzeitsfeier musst du mit deinem Partner verlobt sein'); + error.status = 422; + throw error; + } if (!partner || calcAge(partner.birthdate) < FAMILY_AGE.MIN_MARRIAGE) { const error = new Error('Beide Verlobten müssen mindestens 14 Spieljahre alt sein'); error.status = 422; diff --git a/src/valuerecalculationworker.h b/src/valuerecalculationworker.h index e8c55b9..acb2136 100755 --- a/src/valuerecalculationworker.h +++ b/src/valuerecalculationworker.h @@ -118,6 +118,8 @@ private: ON rt2.id = rel2.relationship_type_id AND rt2.tr = 'engaged' WHERE p.created_at <= NOW() - INTERVAL '1 day' + -- Die Feier muss für diese bereits bestehende Verlobung bestellt worden sein. + AND p.created_at >= rel2.created_at -- Ein realer Tag entspricht einem Spieljahr: Hochzeit ab 14. AND c.birthdate <= CURRENT_DATE - INTERVAL '14 days' AND (