mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-25 07:54:46 +00:00
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
This commit is contained in:
committed by
Nabin Hait
parent
d0c6184e24
commit
7aabef2026
@@ -147,8 +147,9 @@ class SalesInvoice(SellingController):
|
|||||||
|
|
||||||
self.update_time_sheet(self.name)
|
self.update_time_sheet(self.name)
|
||||||
|
|
||||||
update_company_current_month_sales(self.company)
|
if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction":
|
||||||
self.update_project()
|
update_company_current_month_sales(self.company)
|
||||||
|
self.update_project()
|
||||||
update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
||||||
|
|
||||||
def validate_pos_paid_amount(self):
|
def validate_pos_paid_amount(self):
|
||||||
@@ -187,8 +188,9 @@ class SalesInvoice(SellingController):
|
|||||||
self.make_gl_entries_on_cancel()
|
self.make_gl_entries_on_cancel()
|
||||||
frappe.db.set(self, 'status', 'Cancelled')
|
frappe.db.set(self, 'status', 'Cancelled')
|
||||||
|
|
||||||
update_company_current_month_sales(self.company)
|
if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') == "Each Transaction":
|
||||||
self.update_project()
|
update_company_current_month_sales(self.company)
|
||||||
|
self.update_project()
|
||||||
|
|
||||||
unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
|
||||||
|
|
||||||
|
|||||||
@@ -235,7 +235,8 @@ scheduler_events = {
|
|||||||
"erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms",
|
"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.update_maintenance_status",
|
||||||
"erpnext.assets.doctype.asset.asset.make_post_gl_entry",
|
"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": [
|
"monthly": [
|
||||||
"erpnext.accounts.doctype.sales_invoice.sales_invoice.booked_deferred_revenue",
|
"erpnext.accounts.doctype.sales_invoice.sales_invoice.booked_deferred_revenue",
|
||||||
|
|||||||
@@ -412,6 +412,35 @@ def create_project_update(project):
|
|||||||
)
|
)
|
||||||
return data
|
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()
|
@frappe.whitelist()
|
||||||
def create_kanban_board_if_not_exists(project):
|
def create_kanban_board_if_not_exists(project):
|
||||||
from frappe.desk.doctype.kanban_board.kanban_board import quick_kanban_board
|
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):
|
if not frappe.db.exists('Kanban Board', project):
|
||||||
quick_kanban_board('Task', project, 'status')
|
quick_kanban_board('Task', project, 'status')
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -193,13 +193,14 @@ class SalesOrder(SellingController):
|
|||||||
self.update_blanket_order()
|
self.update_blanket_order()
|
||||||
|
|
||||||
def update_project(self):
|
def update_project(self):
|
||||||
project_list = []
|
if frappe.db.get_single_value('Selling Settings', 'sales_update_frequency') != "Each Transaction":
|
||||||
|
return
|
||||||
|
|
||||||
if self.project:
|
if self.project:
|
||||||
project = frappe.get_doc("Project", self.project)
|
project = frappe.get_doc("Project", self.project)
|
||||||
project.flags.dont_sync_tasks = True
|
project.flags.dont_sync_tasks = True
|
||||||
project.update_sales_amount()
|
project.update_sales_amount()
|
||||||
project.save()
|
project.save()
|
||||||
project_list.append(self.project)
|
|
||||||
|
|
||||||
def check_credit_limit(self):
|
def check_credit_limit(self):
|
||||||
# if bypass credit limit check is set to true (1) at sales order level,
|
# if bypass credit limit check is set to true (1) at sales order level,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -47,6 +48,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -78,6 +80,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -110,6 +113,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -142,6 +146,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -173,6 +178,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -206,6 +212,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -237,6 +244,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -266,6 +274,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -297,6 +306,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -328,6 +338,42 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"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,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -358,6 +404,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -388,6 +435,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -419,6 +467,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -450,6 +499,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -481,6 +531,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -522,7 +573,7 @@
|
|||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-02-23 16:23:27.768602",
|
"modified": "2018-06-25 12:56:16.332039",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Selling Settings",
|
"name": "Selling Settings",
|
||||||
@@ -530,7 +581,6 @@
|
|||||||
"permissions": [
|
"permissions": [
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"apply_user_permissions": 0,
|
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
@@ -556,5 +606,6 @@
|
|||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 0,
|
"track_changes": 0,
|
||||||
"track_seen": 0
|
"track_seen": 0,
|
||||||
}
|
"track_views": 0
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ def set_default_settings(args):
|
|||||||
selling_settings.so_required = "No"
|
selling_settings.so_required = "No"
|
||||||
selling_settings.dn_required = "No"
|
selling_settings.dn_required = "No"
|
||||||
selling_settings.allow_multiple_items = 1
|
selling_settings.allow_multiple_items = 1
|
||||||
|
selling_settings.sales_update_frequency = "Each Transaction"
|
||||||
selling_settings.save()
|
selling_settings.save()
|
||||||
|
|
||||||
buying_settings = frappe.get_doc("Buying Settings")
|
buying_settings = frappe.get_doc("Buying Settings")
|
||||||
|
|||||||
Reference in New Issue
Block a user