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