From 7aabef2026e474d2ff38482950f2c33f545666f1 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Thu, 28 Jun 2018 23:43:23 +0530 Subject: [PATCH] =?UTF-8?q?Add=20configurable=20frequency=20in=20Selling?= =?UTF-8?q?=20Settings=20for=20update=20of=20project=20=E2=80=A6=20(#14670?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add configurable frequency in Selling Settings for update of project and company * remove redundant code * remove redundant code, only trigger calculation if order/invoice is present * removed dangling commas as per common convention in hooks * fix:handling multiple documents * Update selling_settings.json --- .../doctype/sales_invoice/sales_invoice.py | 10 ++-- erpnext/hooks.py | 3 +- erpnext/projects/doctype/project/project.py | 31 +++++++++- .../doctype/sales_order/sales_order.py | 5 +- .../selling_settings/selling_settings.json | 59 +++++++++++++++++-- .../setup_wizard/operations/defaults_setup.py | 1 + 6 files changed, 97 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 10ae574406..4c617b457a 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -147,8 +147,9 @@ class SalesInvoice(SellingController): self.update_time_sheet(self.name) - update_company_current_month_sales(self.company) - self.update_project() + if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction": + update_company_current_month_sales(self.company) + self.update_project() update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference) def validate_pos_paid_amount(self): @@ -187,8 +188,9 @@ class SalesInvoice(SellingController): self.make_gl_entries_on_cancel() frappe.db.set(self, 'status', 'Cancelled') - update_company_current_month_sales(self.company) - self.update_project() + if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction": + update_company_current_month_sales(self.company) + self.update_project() unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 5b88af32fd..b461e166f9 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -235,7 +235,8 @@ scheduler_events = { "erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms", "erpnext.assets.doctype.asset.asset.update_maintenance_status", "erpnext.assets.doctype.asset.asset.make_post_gl_entry", - "erpnext.crm.doctype.contract.contract.update_status_for_contracts" + "erpnext.crm.doctype.contract.contract.update_status_for_contracts", + "erpnext.projects.doctype.project.project.update_project_sales_billing" ], "monthly": [ "erpnext.accounts.doctype.sales_invoice.sales_invoice.booked_deferred_revenue", diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index 14817ae291..c074d7a6f8 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -412,6 +412,35 @@ def create_project_update(project): ) return data +def update_project_sales_billing(): + sales_update_frequency = frappe.db.get_single_value("Selling Settings", "sales_update_frequency") + if sales_update_frequency == "Each Transaction": + return + elif (sales_update_frequency == "Monthly" and frappe.utils.now_datetime().day != 1): + return + + #Else simply fallback to Daily + exists_query = '(SELECT 1 from `tab{doctype}` where docstatus = 1 and project = `tabProject`.name)' + project_map = {} + for project_details in frappe.db.sql(''' + SELECT name, 1 as order_exists, null as invoice_exists from `tabProject` where + exists {order_exists} + union + SELECT name, null as order_exists, 1 as invoice_exists from `tabProject` where + exists {invoice_exists} + '''.format( + order_exists=exists_query.format(doctype="Sales Order"), + invoice_exists=exists_query.format(doctype="Sales Invoice"), + ), as_dict=True): + project = project_map.setdefault(project_details.name, frappe.get_doc('Project', project_details.name)) + if project_details.order_exists: + project.update_sales_amount() + if project_details.invoice_exists: + project.update_billed_amount() + + for project in project_map.values(): + project.save() + @frappe.whitelist() def create_kanban_board_if_not_exists(project): from frappe.desk.doctype.kanban_board.kanban_board import quick_kanban_board @@ -419,4 +448,4 @@ def create_kanban_board_if_not_exists(project): if not frappe.db.exists('Kanban Board', project): quick_kanban_board('Task', project, 'status') - return True \ No newline at end of file + return True diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index c03bda6845..6fbe587593 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -193,13 +193,14 @@ class SalesOrder(SellingController): self.update_blanket_order() def update_project(self): - project_list = [] + if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') != "Each Transaction": + return + if self.project: project = frappe.get_doc("Project", self.project) project.flags.dont_sync_tasks = True project.update_sales_amount() project.save() - project_list.append(self.project) def check_credit_limit(self): # if bypass credit limit check is set to true (1) at sales order level, diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index b56b2ac3db..dc2c4ce4a9 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -15,6 +15,7 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -47,6 +48,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -78,6 +80,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -110,6 +113,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -142,6 +146,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -173,6 +178,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -206,6 +212,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -237,6 +244,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -266,6 +274,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -297,6 +306,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -328,6 +338,42 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Each Transaction", + "description": "How often should project and company be updated based on Sales Transactions.", + "fieldname": "sales_update_frequency", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Sales Update Frequency", + "length": 0, + "no_copy": 0, + "options": "Each Transaction\nDaily\nMonthly", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -358,6 +404,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -388,6 +435,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -419,6 +467,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -450,6 +499,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -481,6 +531,7 @@ }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -522,7 +573,7 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2018-02-23 16:23:27.768602", + "modified": "2018-06-25 12:56:16.332039", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", @@ -530,7 +581,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -556,5 +606,6 @@ "sort_field": "modified", "sort_order": "DESC", "track_changes": 0, - "track_seen": 0 -} \ No newline at end of file + "track_seen": 0, + "track_views": 0 +} diff --git a/erpnext/setup/setup_wizard/operations/defaults_setup.py b/erpnext/setup/setup_wizard/operations/defaults_setup.py index 086b60e306..3f69252715 100644 --- a/erpnext/setup/setup_wizard/operations/defaults_setup.py +++ b/erpnext/setup/setup_wizard/operations/defaults_setup.py @@ -44,6 +44,7 @@ def set_default_settings(args): selling_settings.so_required = "No" selling_settings.dn_required = "No" selling_settings.allow_multiple_items = 1 + selling_settings.sales_update_frequency = "Each Transaction" selling_settings.save() buying_settings = frappe.get_doc("Buying Settings")