From 245b28617c643464ffdbe64890a1e74c0b8dd9c8 Mon Sep 17 00:00:00 2001 From: meichthys Date: Wed, 10 Sep 2025 04:47:11 +0000 Subject: [PATCH] link spouses --- .../doctype/church_person/church_person.js | 7 +- .../doctype/church_person/church_person.py | 82 ++++++++----------- 2 files changed, 34 insertions(+), 55 deletions(-) diff --git a/church/church/doctype/church_person/church_person.js b/church/church/doctype/church_person/church_person.js index d73401f..b59daa5 100644 --- a/church/church/doctype/church_person/church_person.js +++ b/church/church/doctype/church_person/church_person.js @@ -12,12 +12,7 @@ frappe.ui.form.on("Church Person", { frm.tour.init("Church Person").then(() => frm.tour.start()); }); }, - before_save(frm) { - // Call ensure_single_head_of_household - frm.call("ensure_single_head_of_household"); - // Call add_spouse_to_relationships - frm.call("add_spouse_to_relationships"); - }, + after_save(frm) { frm.call("update_is_current_role") }, diff --git a/church/church/doctype/church_person/church_person.py b/church/church/doctype/church_person/church_person.py index d8edbf5..a0256d3 100644 --- a/church/church/doctype/church_person/church_person.py +++ b/church/church/doctype/church_person/church_person.py @@ -11,48 +11,11 @@ class ChurchPerson(Document): def before_save(self): # We set this here since virtual fields do not work with # View Settings -> Title Field as of 2025-08-26 - self.full_name = f"{self.first_name} {self.last_name}" + self.full_name = f"{self.first_name}" + ( + (" " + self.last_name) if self.last_name else "" + ) - @frappe.whitelist() - def add_spouse_to_relationships(self): - if not self.spouse: - return - self.spouse_doc = frappe.get_doc("Church Person", self.spouse, for_update=True) - # Determine relationship type based on gender - if self.spouse_doc.gender == "Male": - spouse_relationship_type = "Wife" - relationship_type = "Husband" - elif self.spouse_doc.gender == "Female": - spouse_relationship_type = "Husband" - relationship_type = "Wife" - else: - frappe.throw(__(f"Invalid spouse gender: {self.spouse_doc.gender}")) - - spouse_doc = frappe.get_doc("Church Person", self.spouse) - spouse_doc.db_set("is_married", True) - spouse_doc.db_set("spouse", self.name) - already_exists = False - if spouse_doc.relationships: - for spouse_relationship in spouse_doc.relationships: - if spouse_relationship.relation_type == spouse_relationship_type and spouse_relationship.church_person == self.name: - already_exists = True - if not already_exists: - spouse_doc.append("relationships", {"church_person": self.name, "relation_type": spouse_relationship_type}) - spouse_doc.save() - - already_exists = False - if self.relationships: - for self_relationship in self.relationships: - if self_relationship.relation_type == relationship_type and self_relationship.church_person == spouse_doc.name: - already_exists = True - if not already_exists: - self.append("relationships", {"church_person": spouse_doc.name, "relation_type": relationship_type}) - self.save() - frappe.msgprint("✅ Spousal relationships have been synced between spouses.") - - - @frappe.whitelist() - def ensure_single_head_of_household(self): + def validate(self): if self.is_head_of_household: old_heads_of_household = frappe.db.get_all( doctype="Church Person", @@ -65,16 +28,34 @@ class ChurchPerson(Document): if old_heads_of_household: for head in old_heads_of_household: head_doc = frappe.get_doc("Church Person", head["name"]) - # ToDo: It may be good to display a message that we are - # changing these documents. For some reason frappe.msgprint - # seems to only return an empty message here: - # frappe.msgprint( - # f"A Head of Household for '{self.family}' was already set.\n" - # f"{head_doc.name} was removed from being Head of Household for '{self.family}'" - # ) + frappe.msgprint( + f"â„šī¸ {head_doc.full_name} was removed from being the head of this household." + ) head_doc.is_head_of_household = False head_doc.save() + # Sync spouses + if self.spouse: + # Sync spouses + spouse = frappe.get_doc("Church Person", self.spouse) + if spouse.spouse != self.name: + frappe.db.set_value("Church Person", spouse.name, "spouse", self.name) + frappe.db.set_value("Church Person", spouse.name, "is_married", True) + frappe.msgprint( + f"Spouses have been linked:
" + f"{self.full_name} đŸ‘Šâ€â¤ī¸â€đŸ‘¨ {spouse.full_name}" + ) + else: + if self._doc_before_save.spouse: + spouse = frappe.get_doc("Church Person", self._doc_before_save.spouse) + frappe.db.set_value("Church Person", spouse.name, "is_married", False) + frappe.db.set_value("Church Person", spouse.name, "spouse", None) + self.is_married = False + frappe.msgprint( + f"Spouses have been unlinked:
" + f"{self.full_name} 💔 {spouse.full_name}" + ) + @frappe.whitelist() def new_family_from_person(self): doc = frappe.new_doc("Church Family") @@ -92,7 +73,10 @@ class ChurchPerson(Document): frappe.utils.get_datetime(role.start_date) < datetime.now() < frappe.utils.get_datetime(role.end_date) - ) or (not role.end_date and frappe.utils.get_datetime(role.start_date) < datetime.now()): + ) or ( + not role.end_date + and frappe.utils.get_datetime(role.start_date) < datetime.now() + ): role.is_current_role = 1 else: role.is_current_role = 0