From ad5d7897a8b032c3152e344450b785d60cf8ab17 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Thu, 9 Dec 2021 13:31:54 +0000 Subject: [PATCH 01/10] feat: ledger merger doctype --- .../accounts/doctype/ledger_merge/__init__.py | 0 .../doctype/ledger_merge/ledger_merge.js | 88 ++++++++++++++ .../doctype/ledger_merge/ledger_merge.json | 109 ++++++++++++++++++ .../doctype/ledger_merge/ledger_merge.py | 8 ++ .../doctype/ledger_merge/test_ledger_merge.py | 8 ++ .../doctype/ledger_merge_accounts/__init__.py | 0 .../ledger_merge_accounts.json | 43 +++++++ .../ledger_merge_accounts.py | 8 ++ 8 files changed, 264 insertions(+) create mode 100644 erpnext/accounts/doctype/ledger_merge/__init__.py create mode 100644 erpnext/accounts/doctype/ledger_merge/ledger_merge.js create mode 100644 erpnext/accounts/doctype/ledger_merge/ledger_merge.json create mode 100644 erpnext/accounts/doctype/ledger_merge/ledger_merge.py create mode 100644 erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py create mode 100644 erpnext/accounts/doctype/ledger_merge_accounts/__init__.py create mode 100644 erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json create mode 100644 erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py diff --git a/erpnext/accounts/doctype/ledger_merge/__init__.py b/erpnext/accounts/doctype/ledger_merge/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js new file mode 100644 index 0000000000..ff69ddce97 --- /dev/null +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js @@ -0,0 +1,88 @@ +// Copyright (c) 2021, Wahni Green Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Ledger Merge', { + setup: function(frm) { + frm.set_query("account", function(doc) { + if (!doc.company) frappe.throw(__('Please set Company')); + if (!doc.root_type) frappe.throw(__('Please set Root Type')); + return { + filters: { + is_group: 0, + root_type: doc.root_type, + company: doc.company + } + } + }); + + frm.set_query('account', 'merge_accounts', function(doc, cdt, cdn) { + if (!doc.company) frappe.throw(__('Please set Company')); + if (!doc.root_type) frappe.throw(__('Please set Root Type')); + if (!doc.account) frappe.throw(__('Please set Account')); + return { + filters: { + is_group: 0, + root_type: doc.root_type, + name: ["!=", doc.account], + company: doc.company + } + } + }); + }, + + refresh: function(frm) { + frm.page.hide_icon_group(); + }, + + onload_post_render: function(frm) { + frm.trigger('update_primary_action'); + }, + + after_save: function(frm) { + frm.trigger('update_primary_action'); + }, + + update_primary_action: function(frm) { + if (frm.is_dirty()) { + frm.enable_save(); + return; + } + frm.disable_save(); + if (frm.doc.status !== 'Success') { + if (!frm.is_new()) { + let label = + frm.doc.status === 'Pending' ? __('Start Merge') : __('Retry'); + frm.page.set_primary_action(label, () => frm.events.start_merge(frm)); + } else { + frm.page.set_primary_action(__('Save'), () => frm.save()); + } + } + }, + + start_merge: function(frm) { + console.log('Hi'); + frm.trigger('set_merge_status'); + }, + + set_merge_status: function(frm) { + if (frm.doc.status == "Pending") return; + let successful_records = 0; + frm.doc.merge_accounts.forEach((row) => { + if(row.merged) successful_records += 1; + }); + let message_args = [successful_records, frm.doc.merge_accounts.length]; + frm.dashboard.set_headline(__('Successfully merged {0} out of {1}.', message_args)); + } +}); + +frappe.ui.form.on('Ledger Merge Accounts', { + merge_accounts_add: function(frm, cdt, cdn) { + frm.trigger('update_primary_action'); + }, + merge_accounts_remove: function(frm, cdt, cdn) { + frm.trigger('update_primary_action'); + }, + account: function(frm, cdt, cdn) { + frm.trigger('update_primary_action'); + } +}) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.json b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json new file mode 100644 index 0000000000..b3652bbabd --- /dev/null +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json @@ -0,0 +1,109 @@ +{ + "actions": [], + "autoname": "format:{account} merger on {creation}", + "creation": "2021-12-09 15:38:04.556584", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "section_break_1", + "root_type", + "account", + "column_break_3", + "company", + "status", + "section_break_5", + "merge_accounts" + ], + "fields": [ + { + "depends_on": "root_type", + "fieldname": "account", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Account", + "options": "Account", + "reqd": 1, + "set_only_once": 1 + }, + { + "fieldname": "section_break_1", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, + { + "fieldname": "merge_accounts", + "fieldtype": "Table", + "label": "Accounts to Merge", + "options": "Ledger Merge Accounts", + "reqd": 1 + }, + { + "depends_on": "account", + "fieldname": "section_break_5", + "fieldtype": "Section Break" + }, + { + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company", + "reqd": 1, + "set_only_once": 1 + }, + { + "fieldname": "status", + "fieldtype": "Select", + "label": "Status", + "options": "Pending\nSuccess\nPartial Success\nError", + "read_only": 1 + }, + { + "fieldname": "root_type", + "fieldtype": "Select", + "label": "Root Type", + "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", + "reqd": 1, + "set_only_once": 1 + } + ], + "hide_toolbar": 1, + "links": [], + "modified": "2021-12-09 18:35:30.720538", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Ledger Merge", + "naming_rule": "Expression", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py new file mode 100644 index 0000000000..bf12ff5b2a --- /dev/null +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, Wahni Green Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +import frappe +from frappe.model.document import Document + +class LedgerMerge(Document): + pass diff --git a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py new file mode 100644 index 0000000000..c24caedda8 --- /dev/null +++ b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, Wahni Green Technologies Pvt. Ltd. and Contributors +# See license.txt + +# import frappe +import unittest + +class TestLedgerMerge(unittest.TestCase): + pass diff --git a/erpnext/accounts/doctype/ledger_merge_accounts/__init__.py b/erpnext/accounts/doctype/ledger_merge_accounts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json new file mode 100644 index 0000000000..f5dab369a7 --- /dev/null +++ b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json @@ -0,0 +1,43 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2021-12-09 15:44:58.033398", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "account", + "merged" + ], + "fields": [ + { + "columns": 8, + "fieldname": "account", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Account", + "options": "Account", + "reqd": 1 + }, + { + "columns": 2, + "default": "0", + "fieldname": "merged", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Merged", + "read_only": 1 + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2021-12-09 15:50:09.047183", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Ledger Merge Accounts", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py new file mode 100644 index 0000000000..1b37095735 --- /dev/null +++ b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, Wahni Green Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + +class LedgerMergeAccounts(Document): + pass From 57a7633f9b0d7c5409d92ea2e33e7cd9c5529808 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Thu, 9 Dec 2021 15:22:46 +0000 Subject: [PATCH 02/10] feat: form updates and progressbar --- .../doctype/ledger_merge/ledger_merge.js | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js index ff69ddce97..6a768ca972 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js @@ -3,6 +3,27 @@ frappe.ui.form.on('Ledger Merge', { setup: function(frm) { + frappe.realtime.on('data_import_refresh', ({ ledger_merge }) => { + if (ledger_merge !== frm.doc.name) return; + frm.refresh(); + }); + + frappe.realtime.on('data_import_progress', data => { + if (data.data_import !== frm.doc.name) return; + let message = __('Merging {0} of {1}', [data.current, data.total]); + let percent = Math.floor((data.current * 100) / data.total); + frm.dashboard.show_progress(__('Merge Progress'), percent, message); + frm.page.set_indicator(__('In Progress'), 'orange'); + + // hide progress when complete + if (data.current === data.total) { + setTimeout(() => { + frm.dashboard.hide(); + frm.refresh(); + }, 2000); + } + }); + frm.set_query("account", function(doc) { if (!doc.company) frappe.throw(__('Please set Company')); if (!doc.root_type) frappe.throw(__('Please set Root Type')); @@ -32,6 +53,7 @@ frappe.ui.form.on('Ledger Merge', { refresh: function(frm) { frm.page.hide_icon_group(); + frm.trigger('set_merge_status'); }, onload_post_render: function(frm) { @@ -60,8 +82,15 @@ frappe.ui.form.on('Ledger Merge', { }, start_merge: function(frm) { - console.log('Hi'); - frm.trigger('set_merge_status'); + frm.call({ + method: 'form_start_merge', + args: { docname: frm.doc.name }, + btn: frm.page.btn_primary + }).then(r => { + if (r.message === true) { + frm.disable_save(); + } + }); }, set_merge_status: function(frm) { @@ -72,6 +101,16 @@ frappe.ui.form.on('Ledger Merge', { }); let message_args = [successful_records, frm.doc.merge_accounts.length]; frm.dashboard.set_headline(__('Successfully merged {0} out of {1}.', message_args)); + }, + + root_type: function(frm) { + frm.set_value('account', ''); + frm.set_value('merge_accounts', []); + }, + + company: function(frm) { + frm.set_value('account', ''); + frm.set_value('merge_accounts', []); } }); From 75f8117daf4257d6ae275a195cc285e9f276ad4f Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Thu, 9 Dec 2021 15:23:10 +0000 Subject: [PATCH 03/10] feat: merge functionality --- .../doctype/ledger_merge/ledger_merge.py | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py index bf12ff5b2a..48ac1e7622 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py @@ -4,5 +4,66 @@ import frappe from frappe.model.document import Document +from erpnext.accounts.doctype.account.account import merge_account + + class LedgerMerge(Document): - pass + def start_merge(self): + from frappe.core.page.background_jobs.background_jobs import get_info + from frappe.utils.background_jobs import enqueue + from frappe.utils.scheduler import is_scheduler_inactive + + if is_scheduler_inactive() and not frappe.flags.in_test: + frappe.throw( + _("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive") + ) + + enqueued_jobs = [d.get("job_name") for d in get_info()] + + if self.name not in enqueued_jobs: + enqueue( + start_merge, + queue="default", + timeout=6000, + event="ledger_merge", + job_name=self.name, + docname=self.name, + now=frappe.conf.developer_mode or frappe.flags.in_test, + ) + return True + + return False + +@frappe.whitelist() +def form_start_merge(docname): + return frappe.get_doc("Ledger Merge", docname).start_merge() + +def start_merge(docname): + ledger_merge = frappe.get_doc("Ledger Merge", docname) + successful_merges = 0 + total = len(ledger_merge.merge_accounts) + for row in ledger_merge.merge_accounts: + try: + merge_account(row.account, ledger_merge.account, 0, ledger_merge.root_type, ledger_merge.company) + row.db_set('merged', 1) + frappe.db.commit() + successful_merges += 1 + frappe.publish_realtime("ledger_merge_progress", { + "ledger_merge": ledger_merge.name, + "current": successful_merges, + "total": total + } + ) + except Exception: + frappe.db.rollback() + ledger_merge.db_set("status", "Error") + frappe.log_error(title=ledger_merge.name) + finally: + if successful_merges == total: + ledger_merge.db_set('status', 'Success') + elif successful_merges > 0: + ledger_merge.db_set('status', 'Partial Success') + else: + ledger_merge.db_set('status', 'Error') + + frappe.publish_realtime("ledger_merge_refresh", {"ledger_merge": ledger_merge.name}) From 7554f112600c1e35aff4523d038827f306be4881 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 10 Dec 2021 08:45:47 +0000 Subject: [PATCH 04/10] feat: progress bar, account name field --- .../doctype/ledger_merge/ledger_merge.js | 21 ++++----- .../doctype/ledger_merge/ledger_merge.json | 15 ++++++- .../doctype/ledger_merge/ledger_merge.py | 45 ++++++++++--------- .../ledger_merge_accounts.json | 14 +++++- 4 files changed, 57 insertions(+), 38 deletions(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js index 6a768ca972..ffc4ac43d3 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js @@ -3,25 +3,17 @@ frappe.ui.form.on('Ledger Merge', { setup: function(frm) { - frappe.realtime.on('data_import_refresh', ({ ledger_merge }) => { + frappe.realtime.on('ledger_merge_refresh', ({ ledger_merge }) => { if (ledger_merge !== frm.doc.name) return; frm.refresh(); }); - frappe.realtime.on('data_import_progress', data => { - if (data.data_import !== frm.doc.name) return; + frappe.realtime.on('ledger_merge_progress', data => { + if (data.ledger_merge !== frm.doc.name) return; let message = __('Merging {0} of {1}', [data.current, data.total]); let percent = Math.floor((data.current * 100) / data.total); frm.dashboard.show_progress(__('Merge Progress'), percent, message); frm.page.set_indicator(__('In Progress'), 'orange'); - - // hide progress when complete - if (data.current === data.total) { - setTimeout(() => { - frm.dashboard.hide(); - frm.refresh(); - }, 2000); - } }); frm.set_query("account", function(doc) { @@ -61,10 +53,15 @@ frappe.ui.form.on('Ledger Merge', { }, after_save: function(frm) { - frm.trigger('update_primary_action'); + setTimeout(() => { + frm.trigger('update_primary_action'); + }, 750); }, update_primary_action: function(frm) { + console.log(!frm.is_new()); + console.log(frm.is_dirty()); + console.log("-"); if (frm.is_dirty()) { frm.enable_save(); return; diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.json b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json index b3652bbabd..641b462a29 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.json +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json @@ -1,6 +1,6 @@ { "actions": [], - "autoname": "format:{account} merger on {creation}", + "autoname": "format:{account_name} merger on {creation}", "creation": "2021-12-09 15:38:04.556584", "doctype": "DocType", "editable_grid": 1, @@ -9,6 +9,7 @@ "section_break_1", "root_type", "account", + "account_name", "column_break_3", "company", "status", @@ -68,11 +69,21 @@ "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", "reqd": 1, "set_only_once": 1 + }, + { + "depends_on": "account", + "fetch_from": "account.account_name", + "fetch_if_empty": 1, + "fieldname": "account_name", + "fieldtype": "Data", + "label": "Account Name", + "read_only": 1, + "reqd": 1 } ], "hide_toolbar": 1, "links": [], - "modified": "2021-12-09 18:35:30.720538", + "modified": "2021-12-09 23:41:11.097097", "modified_by": "Administrator", "module": "Accounts", "name": "Ledger Merge", diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py index 48ac1e7622..a23f565841 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py @@ -43,27 +43,28 @@ def start_merge(docname): successful_merges = 0 total = len(ledger_merge.merge_accounts) for row in ledger_merge.merge_accounts: - try: - merge_account(row.account, ledger_merge.account, 0, ledger_merge.root_type, ledger_merge.company) - row.db_set('merged', 1) - frappe.db.commit() - successful_merges += 1 - frappe.publish_realtime("ledger_merge_progress", { - "ledger_merge": ledger_merge.name, - "current": successful_merges, - "total": total - } - ) - except Exception: - frappe.db.rollback() - ledger_merge.db_set("status", "Error") - frappe.log_error(title=ledger_merge.name) - finally: - if successful_merges == total: - ledger_merge.db_set('status', 'Success') - elif successful_merges > 0: - ledger_merge.db_set('status', 'Partial Success') - else: - ledger_merge.db_set('status', 'Error') + if not row.merged: + try: + merge_account(row.account, ledger_merge.account, 0, ledger_merge.root_type, ledger_merge.company) + row.db_set('merged', 1) + frappe.db.commit() + successful_merges += 1 + frappe.publish_realtime("ledger_merge_progress", { + "ledger_merge": ledger_merge.name, + "current": successful_merges, + "total": total + } + ) + except Exception: + frappe.db.rollback() + ledger_merge.db_set("status", "Error") + frappe.log_error(title=ledger_merge.name) + finally: + if successful_merges == total: + ledger_merge.db_set('status', 'Success') + elif successful_merges > 0: + ledger_merge.db_set('status', 'Partial Success') + else: + ledger_merge.db_set('status', 'Error') frappe.publish_realtime("ledger_merge_refresh", {"ledger_merge": ledger_merge.name}) diff --git a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json index f5dab369a7..524e480892 100644 --- a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json +++ b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json @@ -7,11 +7,12 @@ "engine": "InnoDB", "field_order": [ "account", + "account_name", "merged" ], "fields": [ { - "columns": 8, + "columns": 4, "fieldname": "account", "fieldtype": "Link", "in_list_view": 1, @@ -27,12 +28,21 @@ "in_list_view": 1, "label": "Merged", "read_only": 1 + }, + { + "columns": 4, + "fetch_from": "account.account_name", + "fieldname": "account_name", + "fieldtype": "Data", + "label": "Account Name", + "read_only": 1, + "reqd": 1 } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-12-09 15:50:09.047183", + "modified": "2021-12-09 23:19:15.193921", "modified_by": "Administrator", "module": "Accounts", "name": "Ledger Merge Accounts", From 614b9270e7562e31293b9898e79b6c0269ed56c8 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 10 Dec 2021 09:45:00 +0000 Subject: [PATCH 05/10] fix: convert whitespace to tabs --- .../doctype/ledger_merge/ledger_merge.js | 134 +++++++++--------- .../ledger_merge_accounts.py | 1 + 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js index ffc4ac43d3..871edc71fd 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js @@ -2,8 +2,8 @@ // For license information, please see license.txt frappe.ui.form.on('Ledger Merge', { - setup: function(frm) { - frappe.realtime.on('ledger_merge_refresh', ({ ledger_merge }) => { + setup: function(frm) { + frappe.realtime.on('ledger_merge_refresh', ({ ledger_merge }) => { if (ledger_merge !== frm.doc.name) return; frm.refresh(); }); @@ -11,57 +11,54 @@ frappe.ui.form.on('Ledger Merge', { frappe.realtime.on('ledger_merge_progress', data => { if (data.ledger_merge !== frm.doc.name) return; let message = __('Merging {0} of {1}', [data.current, data.total]); - let percent = Math.floor((data.current * 100) / data.total); + let percent = Math.floor((data.current * 100) / data.total); frm.dashboard.show_progress(__('Merge Progress'), percent, message); frm.page.set_indicator(__('In Progress'), 'orange'); }); - frm.set_query("account", function(doc) { - if (!doc.company) frappe.throw(__('Please set Company')); - if (!doc.root_type) frappe.throw(__('Please set Root Type')); - return { - filters: { - is_group: 0, - root_type: doc.root_type, - company: doc.company - } - } - }); - - frm.set_query('account', 'merge_accounts', function(doc, cdt, cdn) { - if (!doc.company) frappe.throw(__('Please set Company')); - if (!doc.root_type) frappe.throw(__('Please set Root Type')); - if (!doc.account) frappe.throw(__('Please set Account')); + frm.set_query("account", function(doc) { + if (!doc.company) frappe.throw(__('Please set Company')); + if (!doc.root_type) frappe.throw(__('Please set Root Type')); return { - filters: { - is_group: 0, - root_type: doc.root_type, - name: ["!=", doc.account], - company: doc.company - } - } + filters: { + is_group: 0, + root_type: doc.root_type, + company: doc.company + } + } }); - }, - refresh: function(frm) { - frm.page.hide_icon_group(); - frm.trigger('set_merge_status'); + frm.set_query('account', 'merge_accounts', function(doc, cdt, cdn) { + if (!doc.company) frappe.throw(__('Please set Company')); + if (!doc.root_type) frappe.throw(__('Please set Root Type')); + if (!doc.account) frappe.throw(__('Please set Account')); + return { + filters: { + is_group: 0, + root_type: doc.root_type, + name: ["!=", doc.account], + company: doc.company + } + } + }); }, - onload_post_render: function(frm) { + refresh: function(frm) { + frm.page.hide_icon_group(); + frm.trigger('set_merge_status'); + }, + + onload_post_render: function(frm) { frm.trigger('update_primary_action'); }, - after_save: function(frm) { - setTimeout(() => { - frm.trigger('update_primary_action'); - }, 750); + after_save: function(frm) { + setTimeout(() => { + frm.trigger('update_primary_action'); + }, 500); }, update_primary_action: function(frm) { - console.log(!frm.is_new()); - console.log(frm.is_dirty()); - console.log("-"); if (frm.is_dirty()) { frm.enable_save(); return; @@ -69,8 +66,7 @@ frappe.ui.form.on('Ledger Merge', { frm.disable_save(); if (frm.doc.status !== 'Success') { if (!frm.is_new()) { - let label = - frm.doc.status === 'Pending' ? __('Start Merge') : __('Retry'); + let label = frm.doc.status === 'Pending' ? __('Start Merge') : __('Retry'); frm.page.set_primary_action(label, () => frm.events.start_merge(frm)); } else { frm.page.set_primary_action(__('Save'), () => frm.save()); @@ -78,8 +74,8 @@ frappe.ui.form.on('Ledger Merge', { } }, - start_merge: function(frm) { - frm.call({ + start_merge: function(frm) { + frm.call({ method: 'form_start_merge', args: { docname: frm.doc.name }, btn: frm.page.btn_primary @@ -88,37 +84,39 @@ frappe.ui.form.on('Ledger Merge', { frm.disable_save(); } }); - }, + }, - set_merge_status: function(frm) { - if (frm.doc.status == "Pending") return; - let successful_records = 0; - frm.doc.merge_accounts.forEach((row) => { + set_merge_status: function(frm) { + if (frm.doc.status == "Pending") return; + let successful_records = 0; + frm.doc.merge_accounts.forEach((row) => { if(row.merged) successful_records += 1; }); - let message_args = [successful_records, frm.doc.merge_accounts.length]; - frm.dashboard.set_headline(__('Successfully merged {0} out of {1}.', message_args)); - }, + let message_args = [successful_records, frm.doc.merge_accounts.length]; + frm.dashboard.set_headline(__('Successfully merged {0} out of {1}.', message_args)); + }, - root_type: function(frm) { - frm.set_value('account', ''); - frm.set_value('merge_accounts', []); - }, + root_type: function(frm) { + frm.set_value('account', ''); + frm.set_value('merge_accounts', []); + }, - company: function(frm) { - frm.set_value('account', ''); - frm.set_value('merge_accounts', []); - } + company: function(frm) { + frm.set_value('account', ''); + frm.set_value('merge_accounts', []); + } }); frappe.ui.form.on('Ledger Merge Accounts', { - merge_accounts_add: function(frm, cdt, cdn) { - frm.trigger('update_primary_action'); - }, - merge_accounts_remove: function(frm, cdt, cdn) { - frm.trigger('update_primary_action'); - }, - account: function(frm, cdt, cdn) { - frm.trigger('update_primary_action'); - } -}) + merge_accounts_add: function(frm, cdt, cdn) { + frm.trigger('update_primary_action'); + }, + + merge_accounts_remove: function(frm, cdt, cdn) { + frm.trigger('update_primary_action'); + }, + + account: function(frm, cdt, cdn) { + frm.trigger('update_primary_action'); + } +}); diff --git a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py index 1b37095735..30dfd65782 100644 --- a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py +++ b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.py @@ -4,5 +4,6 @@ # import frappe from frappe.model.document import Document + class LedgerMergeAccounts(Document): pass From 75de5be53e7b218a3ff89d98cdfbefb41e2eebc8 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 10 Dec 2021 10:27:15 +0000 Subject: [PATCH 06/10] fix: import issue and minor fixes --- .../doctype/ledger_merge/ledger_merge.js | 29 ++++++++++++------- .../doctype/ledger_merge/ledger_merge.json | 4 +-- .../doctype/ledger_merge/ledger_merge.py | 1 + .../doctype/ledger_merge/test_ledger_merge.py | 1 + .../ledger_merge_accounts.json | 3 +- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js index 871edc71fd..849c5fb9b5 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js @@ -5,7 +5,10 @@ frappe.ui.form.on('Ledger Merge', { setup: function(frm) { frappe.realtime.on('ledger_merge_refresh', ({ ledger_merge }) => { if (ledger_merge !== frm.doc.name) return; - frm.refresh(); + frappe.model.clear_doc(frm.doc.doctype, frm.doc.name); + frappe.model.with_doc(frm.doc.doctype, frm.doc.name).then(() => { + frm.refresh(); + }); }); frappe.realtime.on('ledger_merge_progress', data => { @@ -25,30 +28,31 @@ frappe.ui.form.on('Ledger Merge', { root_type: doc.root_type, company: doc.company } - } + }; }); - frm.set_query('account', 'merge_accounts', function(doc, cdt, cdn) { + frm.set_query('account', 'merge_accounts', function(doc) { if (!doc.company) frappe.throw(__('Please set Company')); if (!doc.root_type) frappe.throw(__('Please set Root Type')); if (!doc.account) frappe.throw(__('Please set Account')); + let acc = [doc.account]; + frm.doc.merge_accounts.forEach((row) => { + acc.push(row.account); + }); return { filters: { is_group: 0, root_type: doc.root_type, - name: ["!=", doc.account], + name: ["not in", acc], company: doc.company } - } + }; }); }, refresh: function(frm) { frm.page.hide_icon_group(); frm.trigger('set_merge_status'); - }, - - onload_post_render: function(frm) { frm.trigger('update_primary_action'); }, @@ -90,7 +94,7 @@ frappe.ui.form.on('Ledger Merge', { if (frm.doc.status == "Pending") return; let successful_records = 0; frm.doc.merge_accounts.forEach((row) => { - if(row.merged) successful_records += 1; + if (row.merged) successful_records += 1; }); let message_args = [successful_records, frm.doc.merge_accounts.length]; frm.dashboard.set_headline(__('Successfully merged {0} out of {1}.', message_args)); @@ -108,15 +112,18 @@ frappe.ui.form.on('Ledger Merge', { }); frappe.ui.form.on('Ledger Merge Accounts', { - merge_accounts_add: function(frm, cdt, cdn) { + merge_accounts_add: function(frm) { frm.trigger('update_primary_action'); }, - merge_accounts_remove: function(frm, cdt, cdn) { + merge_accounts_remove: function(frm) { frm.trigger('update_primary_action'); }, account: function(frm, cdt, cdn) { + let row = frappe.get_doc(cdt, cdn); + row.account_name = row.account; + frm.refresh_field('merge_accounts'); frm.trigger('update_primary_action'); } }); diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.json b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json index 641b462a29..ee39e08c29 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.json +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json @@ -21,7 +21,6 @@ "depends_on": "root_type", "fieldname": "account", "fieldtype": "Link", - "in_list_view": 1, "label": "Account", "options": "Account", "reqd": 1, @@ -58,6 +57,7 @@ { "fieldname": "status", "fieldtype": "Select", + "in_list_view": 1, "label": "Status", "options": "Pending\nSuccess\nPartial Success\nError", "read_only": 1 @@ -83,7 +83,7 @@ ], "hide_toolbar": 1, "links": [], - "modified": "2021-12-09 23:41:11.097097", + "modified": "2021-12-10 15:28:34.520588", "modified_by": "Administrator", "module": "Accounts", "name": "Ledger Merge", diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py index a23f565841..63130ca659 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py @@ -2,6 +2,7 @@ # For license information, please see license.txt import frappe +from frappe import _ from frappe.model.document import Document from erpnext.accounts.doctype.account.account import merge_account diff --git a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py index c24caedda8..8c7276e3e6 100644 --- a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py @@ -4,5 +4,6 @@ # import frappe import unittest + class TestLedgerMerge(unittest.TestCase): pass diff --git a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json index 524e480892..4ce55ada7f 100644 --- a/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json +++ b/erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json @@ -31,7 +31,6 @@ }, { "columns": 4, - "fetch_from": "account.account_name", "fieldname": "account_name", "fieldtype": "Data", "label": "Account Name", @@ -42,7 +41,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-12-09 23:19:15.193921", + "modified": "2021-12-10 15:27:24.477139", "modified_by": "Administrator", "module": "Accounts", "name": "Ledger Merge Accounts", From b3a3367d1d2b4ec8a92ef3cb70ee4e9eaf6918ae Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 17 Dec 2021 13:06:30 +0000 Subject: [PATCH 07/10] feat: allow group accounts --- .../accounts/doctype/ledger_merge/ledger_merge.js | 3 +-- .../accounts/doctype/ledger_merge/ledger_merge.json | 12 +++++++++++- .../accounts/doctype/ledger_merge/ledger_merge.py | 9 +++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js index 849c5fb9b5..b2db98dbd0 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.js +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.js @@ -24,7 +24,6 @@ frappe.ui.form.on('Ledger Merge', { if (!doc.root_type) frappe.throw(__('Please set Root Type')); return { filters: { - is_group: 0, root_type: doc.root_type, company: doc.company } @@ -41,7 +40,7 @@ frappe.ui.form.on('Ledger Merge', { }); return { filters: { - is_group: 0, + is_group: doc.is_group, root_type: doc.root_type, name: ["not in", acc], company: doc.company diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.json b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json index ee39e08c29..dd816df627 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.json +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.json @@ -13,6 +13,7 @@ "column_break_3", "company", "status", + "is_group", "section_break_5", "merge_accounts" ], @@ -79,11 +80,20 @@ "label": "Account Name", "read_only": 1, "reqd": 1 + }, + { + "default": "0", + "depends_on": "account", + "fetch_from": "account.is_group", + "fieldname": "is_group", + "fieldtype": "Check", + "label": "Is Group", + "read_only": 1 } ], "hide_toolbar": 1, "links": [], - "modified": "2021-12-10 15:28:34.520588", + "modified": "2021-12-12 21:34:55.155146", "modified_by": "Administrator", "module": "Accounts", "name": "Ledger Merge", diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py index 63130ca659..830ad370d7 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py @@ -46,7 +46,13 @@ def start_merge(docname): for row in ledger_merge.merge_accounts: if not row.merged: try: - merge_account(row.account, ledger_merge.account, 0, ledger_merge.root_type, ledger_merge.company) + merge_account( + row.account, + ledger_merge.account, + ledger_merge.is_group, + ledger_merge.root_type, + ledger_merge.company + ) row.db_set('merged', 1) frappe.db.commit() successful_merges += 1 @@ -58,7 +64,6 @@ def start_merge(docname): ) except Exception: frappe.db.rollback() - ledger_merge.db_set("status", "Error") frappe.log_error(title=ledger_merge.name) finally: if successful_merges == total: From 399446460ae6580ff689db67f3b196f65475b1b4 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 17 Dec 2021 16:18:42 +0000 Subject: [PATCH 08/10] feat: tests --- .../doctype/ledger_merge/ledger_merge.py | 1 + .../doctype/ledger_merge/test_ledger_merge.py | 111 +++++++++++++++++- 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py index 830ad370d7..d45ae22c2f 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py @@ -72,5 +72,6 @@ def start_merge(docname): ledger_merge.db_set('status', 'Partial Success') else: ledger_merge.db_set('status', 'Error') + frappe.db.commit() frappe.publish_realtime("ledger_merge_refresh", {"ledger_merge": ledger_merge.name}) diff --git a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py index 8c7276e3e6..67606dd03c 100644 --- a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py @@ -1,9 +1,116 @@ # Copyright (c) 2021, Wahni Green Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe +import frappe import unittest +from erpnext.accounts.doctype.ledger_merge.ledger_merge import start_merge class TestLedgerMerge(unittest.TestCase): - pass + def test_merge_success(self): + if not frappe.db.exists("Account", "Indirect Expenses - _TC"): + acc = frappe.new_doc("Account") + acc.account_name = "Indirect Expenses" + acc.is_group = 1 + acc.parent_account = "Expenses - _TC" + acc.company = "_Test Company" + acc.insert() + if not frappe.db.exists("Account", "Indirect Test Expenses - _TC"): + acc = frappe.new_doc("Account") + acc.account_name = "Indirect Test Expenses" + acc.is_group = 1 + acc.parent_account = "Expenses - _TC" + acc.company = "_Test Company" + acc.insert() + if not frappe.db.exists("Account", "Administrative Test Expenses - _TC"): + acc = frappe.new_doc("Account") + acc.account_name = "Administrative Test Expenses" + acc.parent_account = "Indirect Test Expenses - _TC" + acc.company = "_Test Company" + acc.insert() + + doc = frappe.get_doc({ + "doctype": "Ledger Merge", + "company": "_Test Company", + "root_type": frappe.db.get_value("Account", "Indirect Test Expenses - _TC", "root_type"), + "account": "Indirect Expenses - _TC", + "merge_accounts": [ + { + "account": "Indirect Test Expenses - _TC", + "account_name": "Indirect Expenses" + } + ] + }).insert(ignore_permissions=True) + + parent = frappe.db.get_value("Account", "Administrative Test Expenses - _TC", "parent_account") + self.assertEqual(parent, "Indirect Test Expenses - _TC") + + start_merge(doc.name) + + parent = frappe.db.get_value("Account", "Administrative Test Expenses - _TC", "parent_account") + self.assertEqual(parent, "Indirect Expenses - _TC") + + self.assertFalse(frappe.db.exists("Account", "Indirect Test Expenses - _TC")) + + def test_partial_merge_success(self): + if not frappe.db.exists("Account", "Indirect Income - _TC"): + acc = frappe.new_doc("Account") + acc.account_name = "Indirect Income" + acc.is_group = 1 + acc.parent_account = "Income - _TC" + acc.company = "_Test Company" + acc.insert() + if not frappe.db.exists("Account", "Indirect Test Income - _TC"): + acc = frappe.new_doc("Account") + acc.account_name = "Indirect Test Income" + acc.is_group = 1 + acc.parent_account = "Income - _TC" + acc.company = "_Test Company" + acc.insert() + if not frappe.db.exists("Account", "Administrative Test Income - _TC"): + acc = frappe.new_doc("Account") + acc.account_name = "Administrative Test Income" + acc.parent_account = "Indirect Test Income - _TC" + acc.company = "_Test Company" + acc.insert() + + doc = frappe.get_doc({ + "doctype": "Ledger Merge", + "company": "_Test Company", + "root_type": frappe.db.get_value("Account", "Indirect Income - _TC", "root_type"), + "account": "Indirect Income - _TC", + "merge_accounts": [ + { + "account": "Indirect Test Income - _TC", + "account_name": "Indirect Test Income" + }, + { + "account": "Administrative Test Income - _TC", + "account_name": "Administrative Test Income" + } + ] + }).insert(ignore_permissions=True) + + parent = frappe.db.get_value("Account", "Administrative Test Income - _TC", "parent_account") + self.assertEqual(parent, "Indirect Test Income - _TC") + + start_merge(doc.name) + + parent = frappe.db.get_value("Account", "Administrative Test Income - _TC", "parent_account") + self.assertEqual(parent, "Indirect Income - _TC") + + self.assertFalse(frappe.db.exists("Account", "Indirect Test Income - _TC")) + self.assertTrue(frappe.db.exists("Account", "Administrative Test Income - _TC")) + + def tearDown(self): + for entry in frappe.db.get_all("Ledger Merge"): + frappe.delete_doc("Ledger Merge", entry.name) + + test_accounts = [ + "Indirect Test Expenses - _TC", + "Administrative Test Expenses - _TC", + "Indirect Test Income - _TC", + "Administrative Test Income - _TC" + ] + for account in test_accounts: + frappe.delete_doc_if_exists("Account", account) From 32e5db7cb8e23e653896cb1f8efe0c21a58367de Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 17 Dec 2021 16:38:16 +0000 Subject: [PATCH 09/10] chore: styling according to linter --- erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py index 67606dd03c..f7315362b7 100644 --- a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py @@ -1,8 +1,10 @@ # Copyright (c) 2021, Wahni Green Technologies Pvt. Ltd. and Contributors # See license.txt -import frappe import unittest + +import frappe + from erpnext.accounts.doctype.ledger_merge.ledger_merge import start_merge From ab7f38224f9eba579fa9cf2444463451e173bbe6 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 17 Dec 2021 16:42:24 +0000 Subject: [PATCH 10/10] fix: remove db commit --- erpnext/accounts/doctype/ledger_merge/ledger_merge.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py index d45ae22c2f..830ad370d7 100644 --- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py @@ -72,6 +72,5 @@ def start_merge(docname): ledger_merge.db_set('status', 'Partial Success') else: ledger_merge.db_set('status', 'Error') - frappe.db.commit() frappe.publish_realtime("ledger_merge_refresh", {"ledger_merge": ledger_merge.name})