Add configurable frequency in Selling Settings for update of project … (#14670)
* 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
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 10ae574..4c617b4 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -147,8 +147,9 @@
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 @@
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 5b88af3..b461e16 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -235,7 +235,8 @@
"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 14817ae..c074d7a 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -412,6 +412,35 @@
)
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 @@
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 c03bda6..6fbe587 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -193,13 +193,14 @@
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 b56b2ac..dc2c4ce 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 086b60e..3f69252 100644
--- a/erpnext/setup/setup_wizard/operations/defaults_setup.py
+++ b/erpnext/setup/setup_wizard/operations/defaults_setup.py
@@ -44,6 +44,7 @@
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")