Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 84 additions & 46 deletions audit_management/audit_management/doctype/audit_level/audit_level.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,58 +12,96 @@ def on_change(self):
def validate(self):
print("🔥 ON UPDATE RUNNING FOR:", self.name)
frappe.msgprint("ON UPDATE RUNNING")
self.sync_audit_stages()

def sync_audit_stages(self):

STAGE_MAP = [
("stage_1_bm_emp_id", "stage_1_bm_mail", "Stage 1 - BM"),
("stage_2_dh_emp_id", "stage_2_dh_mail", "Stage 2 - DH"),
("stage_2_com_emp_id", "stage_2_com_mail", "Stage 2 - COM"),
("stage_3_rm_emp_id", "stage_3_rm_mail", "Stage 3 - RM"),
("stage_3_rom_emp_id", "stage_3_rom_mail", "Stage 3 - ROM"),
("stage_4_zm_emp_id", "stage_4_zm_mail", "Stage 4 - ZM"),
("stage_4_zom_emp_id", "stage_4_zom_mail", "Stage 4 - ZOM"),
("stage_5_gm_emp_id", "stage_5_gm_mail", "Stage 5 - GM"),
("stage_6_hr_emp_id", "stage_6_hr_mail", "Stage 6 - HR"),
("stage_7_coo_emp_id", "stage_7_coo_mail", "Stage 7 - COO"),
("stage_8_ceo_emp_id", "stage_8_ceo_mail", "Stage 8 - CEO"),
]

existing_employees = [d.employee for d in self.audit_stages]

for emp_field, mail_field, stage_name in STAGE_MAP:
self.sync_parent_to_child()
self.sync_child_to_parent()
self.remove_blank_rows()

# -----------------------------------------
# 1️⃣ Parent → Child Sync
# -----------------------------------------
def sync_parent_to_child(self):

parent_fields = [df.fieldname for df in self.meta.fields]

for field in parent_fields:

if field.endswith("_emp_id") and field.startswith("stage_"):

parts = field.split("_")

if len(parts) < 4:
continue

stage_number = parts[1]
role = parts[2]

employee = getattr(self, field)
mail_field = f"stage_{stage_number}_{role}_mail"
email = getattr(self, mail_field, None)

# Find existing child row
existing_row = next(
(row for row in self.audit_stages
if str(row.stage) == stage_number
and row.stage_name.lower() == role),
None
)

if employee:
if existing_row:
existing_row.employee = employee
existing_row.email = email
else:
self.append("audit_stages", {
"stage": stage_number,
"stage_name": role.upper(),
"employee": employee,
"email": email
})
else:
# If parent cleared → remove child row
if existing_row:
self.audit_stages.remove(existing_row)

# -----------------------------------------
# 2️⃣ Child → Parent Sync
# -----------------------------------------
def sync_child_to_parent(self):

parent_fields = [df.fieldname for df in self.meta.fields]

# First clear all stage fields
for field in parent_fields:
if field.startswith("stage_") and (
field.endswith("_emp_id") or field.endswith("_mail")
):
setattr(self, field, None)

# Then re-fill from child
for row in self.audit_stages:

if not row.stage or not row.stage_name:
continue

employee = self.get(emp_field)
email = self.get(mail_field)
stage_number = row.stage
role = row.stage_name.lower()

if not employee:
continue
emp_field = f"stage_{stage_number}_{role}_emp_id"
mail_field = f"stage_{stage_number}_{role}_mail"

# Add if not exists
if employee not in existing_employees:
self.append("audit_stages", {
"stage_name": stage_name,
"employee": employee,
"email": email
})

# Update email if exists
else:
for row in self.audit_stages:
if row.employee == employee:
row.email = email

# Remove rows not present in static fields
valid_employees = [
self.get(emp[0]) for emp in STAGE_MAP if self.get(emp[0])
]
if emp_field in parent_fields:
setattr(self, emp_field, row.employee)

if mail_field in parent_fields:
setattr(self, mail_field, row.email)

def remove_blank_rows(self):
self.audit_stages = [
row for row in self.audit_stages
if row.employee in valid_employees
]

if row.stage
]


def update_my_audit(self): # Moved method into the class
try:
# Fetch related records in "My Audits" based on a relevant filter (like branch)
Expand Down
21 changes: 15 additions & 6 deletions audit_management/patches/migrate_audit_level_to_child.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,23 +34,32 @@ def execute():
for emp_field, mail_field, stage_number, stage_name in STAGE_MAP:

employee = doc.get(emp_field)
email = doc.get(mail_field)
old_email = doc.get(mail_field)

if not employee:
continue

# 🔥 Step 1: Try old email
final_email = old_email

# 🔥 Step 2: If old email empty → fetch company_email
if not final_email:
final_email = frappe.db.get_value(
"Employee",
employee,
"company_email"
)

doc.append("audit_stages", {
"stage": stage_number,
"stage": str(stage_number),
"stage_name": stage_name,
"employee": employee,
"email": email
"email": final_email
})

# ----------------------------------
# SORT PROPERLY
# ----------------------------------
doc.audit_stages = sorted(
doc.audit_stages,
doc.audit_stages.sort(
key=lambda x: (int(x.stage), x.stage_name)
)

Expand Down
Loading