diff --git a/audit_management/audit_management/doctype/my_audits/my_audits.js b/audit_management/audit_management/doctype/my_audits/my_audits.js index d283019..4812ff7 100755 --- a/audit_management/audit_management/doctype/my_audits/my_audits.js +++ b/audit_management/audit_management/doctype/my_audits/my_audits.js @@ -1257,12 +1257,17 @@ frappe.ui.form.on("My Audits", { // Rollback Logic d.$wrapper.find('.rollback-btn').on('click', function() { let stagename = $(this).data('stage'); - frappe.confirm(`Are you sure you want to rollback ${stagename} stage? This will revoke the user's access and reset the stage status.`, () => { + // Find the row object corresponding to the stage to get its unique name + let row = audit_table.find(r => (r.stage_name || r.stagename) === stagename); + let row_name = row ? row.name : null; + + frappe.confirm(`Are you sure you want to rollback ${stagename} stage?`, () => { frappe.call({ method: "audit_management.audit_management.doctype.my_audits.my_audits.rollback_stage", args: { docname: frm.doc.name, - stagename: stagename + stagename: stagename, + row_name: row_name }, callback: function(r) { if (r.message) { @@ -1273,7 +1278,7 @@ frappe.ui.form.on("My Audits", { }, error: function(err) { console.error("Rollback Stage Error:", err); - frappe.msgprint(__("An error occurred while rolling back the stage. Please check your network connection or contact IT support.")); + frappe.msgprint(__("An error occurred while rolling back the stage.")); } }); }); diff --git a/audit_management/audit_management/doctype/my_audits/my_audits.py b/audit_management/audit_management/doctype/my_audits/my_audits.py index 032fece..805b9fa 100644 --- a/audit_management/audit_management/doctype/my_audits/my_audits.py +++ b/audit_management/audit_management/doctype/my_audits/my_audits.py @@ -1066,17 +1066,21 @@ def get_full_name(user_id): @frappe.whitelist() -def rollback_stage(docname, stagename): - """Resets a stage status to empty and removes document share for that user. Only allowed for Pending stages.""" +def rollback_stage(docname, stagename, row_name=None): + """Resets a stage status to empty and removes document share for that user. Matches by row_name or stagename.""" doc = frappe.get_doc("My Audits", docname) found = False for row in doc.audit_stages: - frappe.log_error(f"Checking row: {row.stage_name} against {stagename}", "Rollback Debug") - if row.stage_name == stagename: + # Match by row_name if provided, otherwise fallback to stage_name + is_match = (row.name == row_name) if row_name else (row.stage_name == stagename) + + if is_match: + frappe.log_error(title="Rollback Debug", message=f"Rollback Stage: {stagename}\nRow Name: {row.name}\nRow Stage Name: '{row.stage_name}'\nRow Status Before: '{row.status}'") + if row.status not in ["Pending", "No Response"]: - frappe.log_error(f"Status check failed for {stagename}: {row.status}", "Rollback Debug") - frappe.throw(_("Only Pending or No Response stages can be rolled back. {0} is currently {1}.").format(stagename, row.status)) + frappe.log_error(title="Rollback Debug", message=f"Status check failed for {row.name}: {row.status}") + frappe.throw(_("Only Pending or No Response stages can be rolled back. {0} is currently {1}.").format(row.stage_name, row.status)) # 1. Revoke access first if row.user_id: @@ -1092,7 +1096,8 @@ def rollback_stage(docname, stagename): row.response = None row.attachment = None row.response_time = None - frappe.log_error(f"Row updated: {stagename}", "Rollback Debug") + + frappe.log_error(title="Rollback Debug After", message=f"Row Name: {row.name}\nRow Status After: '{row.status}'") found = True break @@ -1101,7 +1106,10 @@ def rollback_stage(docname, stagename): doc.query_status = f"Rollback: {stagename}" doc.save(ignore_permissions=True) doc.reload() - frappe.log_error(f"Document saved and reloaded after rollback: {stagename}", "Rollback Debug") + + for row in doc.audit_stages: + if row.name == row_name or row.stage_name == stagename: + frappe.log_error(title="Rollback Final DB Check", message=f"Final DB Status: '{row.status}'") return True return False