From b332e803362e9bf3ad13ebb157d84fba58d84814 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Wed, 17 Jan 2024 21:35:24 +0100 Subject: [PATCH 1/2] fix: Move fee account configuration to accounts table --- .../mode_of_payment/mode_of_payment.json | 34 +--- .../mode_of_payment/mode_of_payment.py | 3 - ...e_fees_and_cost_center_to_account_table.py | 20 +++ ...de_of_payment_data_from_payment_gateway.py | 20 ++- .../mode_of_payment_account.json | 155 +++++++----------- .../mode_of_payment_account.py | 20 ++- .../doctype/payment_entry/payment_entry.js | 1 + .../payment_request/payment_request.py | 4 +- ...to_payment_gateways_in_mode_of_payments.py | 12 +- erpnext/patches.txt | 1 + erpnext/public/js/payment_gateway.js | 18 +- .../event_registration/event_registration.py | 27 +-- 12 files changed, 141 insertions(+), 174 deletions(-) create mode 100644 erpnext/accounts/doctype/mode_of_payment/patches/migrate_fees_and_cost_center_to_account_table.py diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json index be424daa27b..019c3ce2514 100644 --- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json +++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json @@ -14,11 +14,6 @@ "accounts", "payment_gateway_tab", "payment_gateway", - "fees_section", - "fee_account", - "tax_account", - "column_break_cujl", - "cost_center", "portal_tab", "icon", "portal_title", @@ -66,33 +61,6 @@ "label": "Payment Gateway", "options": "Payment Gateway" }, - { - "fieldname": "fees_section", - "fieldtype": "Section Break", - "label": "Fees" - }, - { - "fieldname": "fee_account", - "fieldtype": "Link", - "label": "Fee Account", - "options": "Account" - }, - { - "fieldname": "tax_account", - "fieldtype": "Link", - "label": "Tax Account", - "options": "Account" - }, - { - "fieldname": "column_break_cujl", - "fieldtype": "Column Break" - }, - { - "fieldname": "cost_center", - "fieldtype": "Link", - "label": "Cost Center", - "options": "Cost Center" - }, { "fieldname": "portal_tab", "fieldtype": "Tab Break", @@ -125,7 +93,7 @@ "icon": "fa fa-credit-card", "idx": 1, "links": [], - "modified": "2023-12-08 16:03:01.935070", + "modified": "2024-01-17 21:34:55.627796", "modified_by": "Administrator", "module": "Accounts", "name": "Mode of Payment", diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py index 36584541f77..6641cafc515 100644 --- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py +++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py @@ -21,9 +21,7 @@ class ModeofPayment(Document): ) accounts: DF.Table[ModeofPaymentAccount] - cost_center: DF.Link | None enabled: DF.Check - fee_account: DF.Link | None icon: DF.Literal[ "Credit Card", "Wire Transfer", "Bank Draft", "Cash", "Cheque", "Phone", "Other" ] @@ -31,7 +29,6 @@ class ModeofPayment(Document): payment_gateway: DF.Link | None portal_description: DF.MarkdownEditor | None portal_title: DF.Data | None - tax_account: DF.Link | None type: DF.Literal["Cash", "Bank", "Phone"] # end: auto-generated types diff --git a/erpnext/accounts/doctype/mode_of_payment/patches/migrate_fees_and_cost_center_to_account_table.py b/erpnext/accounts/doctype/mode_of_payment/patches/migrate_fees_and_cost_center_to_account_table.py new file mode 100644 index 00000000000..dbc894494ff --- /dev/null +++ b/erpnext/accounts/doctype/mode_of_payment/patches/migrate_fees_and_cost_center_to_account_table.py @@ -0,0 +1,20 @@ +import frappe + + +def execute(): + for mop in frappe.get_all("Mode of Payment"): + mop_doc = frappe.get_doc("Mode of Payment", mop.name) + for field in ["fee_account", "tax_account"]: + if mop_doc.get(field): + company = frappe.db.get_value("Account", mop_doc.get(field), "company") + for account_row in mop_doc.accounts: + if account_row.company == company: + account_row.set(field, mop_doc.get(field)) + + if mop_doc.get("cost_center"): + company = frappe.db.get_value("Cost Center", mop_doc.get("cost_center"), "company") + for account_row in mop_doc.accounts: + if account_row.company == company: + account_row.set(field, mop_doc.get(field)) + + mop_doc.save() diff --git a/erpnext/accounts/doctype/mode_of_payment/patches/update_mode_of_payment_data_from_payment_gateway.py b/erpnext/accounts/doctype/mode_of_payment/patches/update_mode_of_payment_data_from_payment_gateway.py index 7a9b91b4fb8..ef24326a7c7 100644 --- a/erpnext/accounts/doctype/mode_of_payment/patches/update_mode_of_payment_data_from_payment_gateway.py +++ b/erpnext/accounts/doctype/mode_of_payment/patches/update_mode_of_payment_data_from_payment_gateway.py @@ -10,10 +10,22 @@ def execute(): "Payment Gateway", filters={"mode_of_payment": ("is", "set")}, fields=["*"] ): pg_map[payment_gateway.name] = payment_gateway.mode_of_payment - for field in ["fee_account", "tax_account", "cost_center", "icon"]: - frappe.db.set_value( - "Mode of Payment", payment_gateway.mode_of_payment, field, payment_gateway.get(field) - ) + mop_doc = frappe.get_doc("Mode of Payment", payment_gateway.mode_of_payment) + mop_doc.icon = payment_gateway.get("icon") + for field in ["fee_account", "tax_account"]: + if mop_doc.get(field): + company = frappe.db.get_value("Account", mop_doc.get(field), "company") + for account_row in mop_doc.accounts: + if account_row.company == company: + account_row.set(field, mop_doc.get(field)) + + if mop_doc.get("cost_center"): + company = frappe.db.get_value("Cost Center", mop_doc.get("cost_center"), "company") + for account_row in mop_doc.accounts: + if account_row.company == company: + account_row.set(field, mop_doc.get(field)) + + mop_doc.save() for subscription in frappe.get_all( "Subscription", filters={"payment_gateway": ("is", "set")}, fields=["payment_gateway", "name"] diff --git a/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.json b/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.json index 6cda7425a79..a6bc60bebe7 100644 --- a/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.json +++ b/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.json @@ -1,105 +1,60 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2015-01-05 14:17:53.101432", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, + "actions": [], + "creation": "2015-01-05 14:17:53.101432", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "company", + "default_account", + "fee_account", + "tax_account", + "cost_center" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Company", - "length": 0, - "no_copy": 0, - "options": "Company", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "company", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Company", + "options": "Company" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Default account will be automatically updated in POS Invoice when this mode is selected.", - "fieldname": "default_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Default Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "description": "Default account will be automatically updated in POS Invoice when this mode is selected.", + "fieldname": "default_account", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Default Account", + "options": "Account" + }, + { + "fieldname": "fee_account", + "fieldtype": "Link", + "label": "Fee Account", + "options": "Account" + }, + { + "fieldname": "tax_account", + "fieldtype": "Link", + "label": "Tax Account", + "options": "Account" + }, + { + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Cost Center", + "options": "Account" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-02-21 16:05:56.284652", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Mode of Payment Account", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0 -} \ No newline at end of file + ], + "istable": 1, + "links": [], + "modified": "2024-01-17 21:12:45.010633", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Mode of Payment Account", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} diff --git a/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.py b/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.py index 52cb6ca1765..861350b99b4 100644 --- a/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.py +++ b/erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.py @@ -1,10 +1,26 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and contributors # For license information, please see license.txt - -import frappe from frappe.model.document import Document class ModeofPaymentAccount(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + company: DF.Link | None + cost_center: DF.Link | None + default_account: DF.Link | None + fee_account: DF.Link | None + parent: DF.Data + parentfield: DF.Data + parenttype: DF.Data + tax_account: DF.Link | None + # end: auto-generated types + pass diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 5068faddf33..7cc8eb7e0e9 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -378,6 +378,7 @@ frappe.ui.form.on('Payment Entry', { }, callback: function(r, rt) { if(r.message) { + console.log(r.message) frappe.run_serially([ () => { if(frm.doc.payment_type == "Receive") { diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index f0e1bc066a8..b6c56f62fd5 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -351,8 +351,8 @@ class PaymentRequest(Document): mode_of_payment_defaults = ( frappe.db.get_value( - "Mode of Payment", - self.mode_of_payment, + "Mode of Payment Account", + dict(parent=self.mode_of_payment, company=self.company), ["fee_account", "tax_account", "cost_center", "mode_of_payment"], as_dict=1, ) diff --git a/erpnext/accounts/doctype/subscription/patches/add_link_to_payment_gateways_in_mode_of_payments.py b/erpnext/accounts/doctype/subscription/patches/add_link_to_payment_gateways_in_mode_of_payments.py index b04d01f78f6..6443b23d905 100644 --- a/erpnext/accounts/doctype/subscription/patches/add_link_to_payment_gateways_in_mode_of_payments.py +++ b/erpnext/accounts/doctype/subscription/patches/add_link_to_payment_gateways_in_mode_of_payments.py @@ -10,11 +10,17 @@ def execute(): "Payment Gateway", filters={"mode_of_payment": ("is", "set")}, fields=fields ): frappe.db.set_value("Mode of Payment", pg.mode_of_payment, "payment_gateway", pg.name) - frappe.db.set_value("Mode of Payment", pg.mode_of_payment, "fee_account", pg.fee_account) - frappe.db.set_value("Mode of Payment", pg.mode_of_payment, "tax_account", pg.tax_account) - frappe.db.set_value("Mode of Payment", pg.mode_of_payment, "cost_center", pg.cost_center) frappe.db.set_value("Mode of Payment", pg.mode_of_payment, "icon", pg.icon) + company = frappe.db.get_value("Account", pg.fee_account, "company") + mop_account = frappe.db.get_value( + "Mode of Payment Account", dict(parent=pg.mode_of_payment, company=company) + ) + + frappe.db.set_value("Mode of Payment Account", mop_account, "fee_account", pg.fee_account) + frappe.db.set_value("Mode of Payment Account", mop_account, "tax_account", pg.tax_account) + frappe.db.set_value("Mode of Payment Account", mop_account, "cost_center", pg.cost_center) + for cf in frappe.get_all( "Custom Field", filters={"is_system_generated": 1, "dt": "Payment Gateway", "fieldname": ("in", fields)}, diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 0d09c79924c..30af205bce9 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -377,6 +377,7 @@ execute:frappe.delete_doc_if_exists("DocType", "Portal Payment Gateways") execute:frappe.delete_doc_if_exists("DocType", "Subscription Event") erpnext.patches.dokos.v4_0.set_mode_of_payment_in_payment_requests erpnext.patches.dokos.v4_0.add_customer_to_payment_request +erpnext.accounts.doctype.mode_of_payment.patches.migrate_fees_and_cost_center_to_account_table # @dokos diff --git a/erpnext/public/js/payment_gateway.js b/erpnext/public/js/payment_gateway.js index f206bd3a1ff..daa52685302 100644 --- a/erpnext/public/js/payment_gateway.js +++ b/erpnext/public/js/payment_gateway.js @@ -3,22 +3,6 @@ frappe.ui.form.on('Payment Gateway', { setup(frm) { - frm.set_query('fee_account', (doc) => { - return { - filters: { - "is_group": 0, - "account_type": "Expense Account" - } - }; - }); - - frm.set_query('tax_account', (doc) => { - return { - filters: { - "is_group": 0, - "account_type": "Tax" - } - }; - }); + // } }); \ No newline at end of file diff --git a/erpnext/venue/doctype/event_registration/event_registration.py b/erpnext/venue/doctype/event_registration/event_registration.py index 7e4f9e4cf1f..0acb83bf7df 100644 --- a/erpnext/venue/doctype/event_registration/event_registration.py +++ b/erpnext/venue/doctype/event_registration/event_registration.py @@ -449,8 +449,14 @@ class EventRegistration(Document): write_off_account, default_cost_center = frappe.get_cached_value( "Company", details.company, ["write_off_account", "cost_center"] ) - fee_account = payment_gateway.fee_account or write_off_account - fee_cost_center = payment_gateway.cost_center or default_cost_center + mop_details = frappe.db.get_value( + "Mode of Payment Account", + dict(parent=mode_of_payment, company=details.company), + ["fee_account", "cost_center"], + as_dict=True, + ) + fee_account = mop_details.fee_account or write_off_account + fee_cost_center = mop_details.cost_center or default_cost_center if fee_account and fee_cost_center: pe.append( "deductions", @@ -467,14 +473,15 @@ class EventRegistration(Document): self.add_comment_about_document(pe) if fee_amount > 0.0 and not (payment_gateway.fee_account and payment_gateway.cost_center): - # Add warning about fees not going into the right account/cost center. - pe.add_comment( - "Comment", - _( - "Payment Gateway '{0}' must have a Fee Account and Cost Center for the fees ({1}) to be correctly assigned." - ).format(payment_gateway.name, fee_amount), - comment_email="Administrator", - ) + if not mop_details.fee_account and mop_details.cost_center: + # Add warning about fees not going into the right account/cost center. + pe.add_comment( + "Comment", + _( + "Mode of Payment '{0}' must have a Fee Account and Cost Center for the fees ({1}) to be correctly assigned." + ).format(mode_of_payment, fee_amount), + comment_email="Administrator", + ) return pe -- GitLab From 00f70028e8ea69e5c57ca004752005c962c7c79c Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Wed, 17 Jan 2024 21:37:04 +0100 Subject: [PATCH 2/2] fix: cleanup console log --- erpnext/accounts/doctype/payment_entry/payment_entry.js | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 7cc8eb7e0e9..5068faddf33 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -378,7 +378,6 @@ frappe.ui.form.on('Payment Entry', { }, callback: function(r, rt) { if(r.message) { - console.log(r.message) frappe.run_serially([ () => { if(frm.doc.payment_type == "Receive") { -- GitLab