From 03a38ed0257cdee5ae1ec645877691ed1292ba9c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 11:05:30 +0530 Subject: [PATCH] refactor: support for BFS and DFS --- .../bisect_accounting_statements.json | 27 ++++------ .../bisect_accounting_statements.py | 50 +++++++++++++++---- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index de7eba7c63..b2f3c4bb90 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -10,10 +10,8 @@ "from_date", "column_break_qxbi", "to_date", - "section_break_3x70", - "period_from", - "column_break_5ett", - "period_to" + "column_break_iwny", + "algorithm" ], "fields": [ { @@ -31,29 +29,22 @@ "label": "To Date" }, { - "fieldname": "section_break_3x70", - "fieldtype": "Section Break" + "default": "BFS", + "fieldname": "algorithm", + "fieldtype": "Select", + "label": "Algorithm", + "options": "BFS\nDFS" }, { - "fieldname": "period_from", - "fieldtype": "Date", - "label": "Period From" - }, - { - "fieldname": "column_break_5ett", + "fieldname": "column_break_iwny", "fieldtype": "Column Break" - }, - { - "fieldname": "period_to", - "fieldtype": "Date", - "label": "Period To" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-16 08:02:33.472406", + "modified": "2023-09-25 10:50:53.887235", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 73a9e71960..bdd1809535 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -1,6 +1,7 @@ # Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt +from collections import deque from math import floor import frappe @@ -10,18 +11,49 @@ from frappe.utils import getdate class BisectAccountingStatements(Document): - @frappe.whitelist() - def bisect(self): - period_list = [(getdate(self.from_date), getdate(self.to_date))] + def bfs(self): + period_list = deque([(getdate(self.from_date), getdate(self.to_date))]) + periods = [] dates = [] + while period_list: + cur_frm_date, cur_to_date = period_list.popleft() + delta = cur_to_date - cur_frm_date + periods.append((cur_frm_date, cur_to_date, delta)) + if delta.days == 0: + continue + else: + cur_floor = floor(delta.days / 2) + left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) + right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) + period_list.append(left) + period_list.append(right) + return periods + + def dfs(self): + period_list = [(getdate(self.from_date), getdate(self.to_date))] + periods = [] while period_list: cur_frm_date, cur_to_date = period_list.pop() delta = cur_to_date - cur_frm_date - if not delta.days > 0: + periods.append((cur_frm_date, cur_to_date, delta)) + if delta.days == 0: continue + else: + cur_floor = floor(delta.days / 2) + left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) + right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) + period_list.append(left) + period_list.append(right) + return periods - cur_floor = floor(delta.days / 2) - left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) - right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) - period_list.append(left) - period_list.append(right) + @frappe.whitelist() + def bisect(self): + if self.algorithm == "BFS": + periods = self.bfs() + + if self.algorithm == "DFS": + periods = self.dfs() + + print("Periods: ", len(periods)) + for x in periods: + print(x)