From a50808a077b8d6475ff360b611cd5f0a8cb37d65 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 18 Jan 2024 18:03:16 +0530 Subject: [PATCH] refactor: delete transactions in background --- erpnext/setup/doctype/company/company.js | 66 ++++++++++++++---------- erpnext/setup/doctype/company/company.py | 34 +++++++++++- 2 files changed, 70 insertions(+), 30 deletions(-) diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 1bd469b956..340a917ffa 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -140,38 +140,48 @@ frappe.ui.form.on("Company", { }, delete_company_transactions: function(frm) { - frappe.verify_password(function() { - var d = frappe.prompt({ - fieldtype:"Data", - fieldname: "company_name", - label: __("Please enter the company name to confirm"), - reqd: 1, - description: __("Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.") + frappe.call({ + method: "erpnext.setup.doctype.company.company.is_deletion_job_running", + args: { + company: frm.doc.name }, - function(data) { - if(data.company_name !== frm.doc.name) { - frappe.msgprint(__("Company name not same")); - return; + freeze: true, + callback: function(r) { + if(!r.exc) { + frappe.verify_password(function() { + var d = frappe.prompt({ + fieldtype:"Data", + fieldname: "company_name", + label: __("Please enter the company name to confirm"), + reqd: 1, + description: __("Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.") + }, + function(data) { + if(data.company_name !== frm.doc.name) { + frappe.msgprint(__("Company name not same")); + return; + } + frappe.call({ + method: "erpnext.setup.doctype.company.company.create_transaction_deletion_request", + args: { + company: data.company_name + }, + freeze: true, + callback: function(r, rt) { }, + onerror: function() { + frappe.msgprint(__("Wrong Password")); + } + }); + }, + __("Delete all the Transactions for this Company"), __("Delete") + ); + d.get_primary_btn().addClass("btn-danger"); + }); } - frappe.call({ - method: "erpnext.setup.doctype.company.company.create_transaction_deletion_request", - args: { - company: data.company_name - }, - freeze: true, - callback: function(r, rt) { - if(!r.exc) - frappe.msgprint(__("Successfully deleted all transactions related to this company!")); - }, - onerror: function() { - frappe.msgprint(__("Wrong Password")); - } - }); + }, - __("Delete all the Transactions for this Company"), __("Delete") - ); - d.get_primary_btn().addClass("btn-danger"); }); + } }); diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index ec953b885e..68a3854b0d 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -11,7 +11,8 @@ from frappe.cache_manager import clear_defaults_cache from frappe.contacts.address_and_contact import load_address_and_contact from frappe.custom.doctype.property_setter.property_setter import make_property_setter from frappe.desk.page.setup_wizard.setup_wizard import make_records -from frappe.utils import cint, formatdate, get_timestamp, today +from frappe.utils import cint, formatdate, get_link_to_form, get_timestamp, today +from frappe.utils.background_jobs import get_job, is_job_enqueued from frappe.utils.nestedset import NestedSet, rebuild_tree from erpnext.accounts.doctype.account.account import get_account_currency @@ -900,8 +901,37 @@ def get_default_company_address(name, sort_key="is_primary_address", existing_ad return None +def generate_id_for_deletion_job(company): + return "delete_company_transactions_" + company + + +@frappe.whitelist() +def is_deletion_job_running(company): + job_id = generate_id_for_deletion_job(company) + job_name = get_job(job_id).get_id() # job name will have site prefix + if is_job_enqueued(job_id): + frappe.throw( + _("A Transaction Deletion Job: {0} is already running for {1}").format( + frappe.bold(get_link_to_form("RQ Job", job_name)), frappe.bold(company) + ) + ) + + @frappe.whitelist() def create_transaction_deletion_request(company): + is_deletion_job_running(company) + job_id = generate_id_for_deletion_job(company) + tdr = frappe.get_doc({"doctype": "Transaction Deletion Record", "company": company}) tdr.insert() - tdr.submit() + + frappe.enqueue( + "frappe.utils.background_jobs.run_doc_method", + doctype=tdr.doctype, + name=tdr.name, + doc_method="submit", + job_id=job_id, + queue="long", + enqueue_after_commit=True, + ) + frappe.msgprint(_("A Transaction Deletion Job is triggered for {0}").format(frappe.bold(company)))