diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js index 4053405971163fee432db73f7b84dc7d7acf60bf..57d0c59329c2c912f26e2ce46377348ba9e00451 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js +++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js @@ -54,6 +54,9 @@ frappe.ui.form.on("Process Statement Of Accounts", { }; }); frm.set_query("account", function () { + if (!frm.doc.company) { + frappe.throw(__("Please set Company")); + } return { filters: { company: frm.doc.company, @@ -61,6 +64,9 @@ frappe.ui.form.on("Process Statement Of Accounts", { }; }); frm.set_query("cost_center", function () { + if (!frm.doc.company) { + frappe.throw(__("Please set Company")); + } return { filters: { company: frm.doc.company, @@ -68,6 +74,9 @@ frappe.ui.form.on("Process Statement Of Accounts", { }; }); frm.set_query("project", function () { + if (!frm.doc.company) { + frappe.throw(__("Please set Company")); + } return { filters: { company: frm.doc.company, @@ -79,6 +88,11 @@ frappe.ui.form.on("Process Statement Of Accounts", { frm.set_value("to_date", frappe.datetime.get_today()); } }, + company: function (frm) { + frm.set_value("account", ""); + frm.set_value("cost_center", ""); + frm.set_value("project", ""); + }, report: function (frm) { let filters = { company: frm.doc.company, diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py index 714ed62379661d9ece3871375eb12eb61f34d0fb..bbf59aa7f02290a0f2be035bf52971af1a9af7b3 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py @@ -82,6 +82,10 @@ class ProcessStatementOfAccounts(Document): # end: auto-generated types def validate(self): + self.validate_account() + self.validate_company_for_table("Cost Center") + self.validate_company_for_table("Project") + if not self.subject: self.subject = "Statement Of Accounts for {{ customer.customer_name }}" if not self.body: @@ -104,6 +108,43 @@ class ProcessStatementOfAccounts(Document): self.to_date = self.start_date self.from_date = add_months(self.to_date, -1 * self.filter_duration) + def validate_account(self): + if not self.account: + return + + if self.company != frappe.get_cached_value("Account", self.account, "company"): + frappe.throw( + _("Account {0} doesn't belong to Company {1}").format( + frappe.bold(self.account), + frappe.bold(self.company), + ) + ) + + def validate_company_for_table(self, doctype): + field = frappe.scrub(doctype) + if not self.get(field): + return + + fieldname = field + "_name" + + values = set(d.get(fieldname) for d in self.get(field)) + invalid_values = frappe.db.get_all( + doctype, filters={"name": ["in", values], "company": ["!=", self.company]}, pluck="name" + ) + + if invalid_values: + msg = _("

Following {0}s doesn't belong to Company {1} :

").format( + doctype, frappe.bold(self.company) + ) + + msg += ( + "" + ) + + frappe.throw(_(msg)) + def get_report_pdf(doc, consolidated=True): statement_dict = get_statement_dict(doc)