From b2d3c0f040f5f5ce2110d2f02d209fc4599cd0e9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 14 Jun 2018 15:54:34 +0530 Subject: [PATCH] Update ordered qty in blanket order --- .../doctype/purchase_order/purchase_order.py | 3 ++- erpnext/controllers/stock_controller.py | 15 ++++---------- erpnext/hr/doctype/employee/employee.py | 6 ++++-- .../doctype/blanket_order/blanket_order.py | 20 +++++++++++++++---- .../blanket_order/test_blanket_order.py | 13 ++++++++---- .../blanket_order_item.json | 4 ++-- .../doctype/sales_order/sales_order.py | 3 ++- 7 files changed, 39 insertions(+), 25 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index c6a5dae629..58f1499db6 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -244,7 +244,7 @@ class PurchaseOrder(BuyingController): self.update_requested_qty() self.update_ordered_qty() - self.update_blanket_order(cancel=True) + self.update_blanket_order() def on_update(self): @@ -323,6 +323,7 @@ def close_or_unclose_purchase_orders(names, status): else: if po.status == "Closed": po.update_status("Draft") + po.update_blanket_order() frappe.local.message_log = [] diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 9d58ce3de1..428217820b 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -342,17 +342,10 @@ class StockController(AccountsController): if self.docstatus==1: raise frappe.ValidationError - def update_blanket_order(self, cancel=False): - for item in self.items: - if item.blanket_order: - ordered_quantity, doc_name = frappe.db.get_value("Blanket Order Item", {"parent": item.blanket_order}, ["ordered_quantity", "name"]) - if not cancel: - ordered_quantity = ordered_quantity + item.qty - else: - ordered_quantity = ordered_quantity - item.qty - ordered_quantity = flt(ordered_quantity, item.precision("qty")) - frappe.db.set_value("Blanket Order Item", doc_name, "ordered_quantity", ordered_quantity) - + def update_blanket_order(self): + blanket_orders = list(set([d.blanket_order for d in self.items])) + for blanket_order in blanket_orders: + frappe.get_doc("Blanket Order", blanket_order).update_ordered_qty() def update_gl_entries_after(posting_date, posting_time, for_warehouses=None, for_items=None, warehouse_account=None): diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py index 58fb8eea9e..d71ffcbbec 100755 --- a/erpnext/hr/doctype/employee/employee.py +++ b/erpnext/hr/doctype/employee/employee.py @@ -66,6 +66,10 @@ class Employee(NestedSet): def update_user_permissions(self): if not self.create_user_permission: return + if has_user_permission_for_employee(self.user_id, self.name) \ + or not has_permission('User Permission', ptype='write'): + return + add_user_permission("Employee", self.name, self.user_id) set_user_permission_if_allowed("Company", self.company, self.user_id) @@ -207,8 +211,6 @@ def validate_employee_role(doc, method): def update_user_permissions(doc, method): # called via User hook if "Employee" in [d.role for d in doc.get("roles")]: - employee_name = frappe.get_value('Employee', {'user_id': doc.name}, 'name') - if has_user_permission_for_employee(doc.name, employee_name): return if not has_permission('User Permission', ptype='write'): return employee = frappe.get_doc("Employee", {"user_id": doc.name}) employee.update_user_permissions() diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py index f6ef4de81c..5381abfe0a 100644 --- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py @@ -10,13 +10,25 @@ from erpnext.stock.doctype.item.item import get_item_defaults class BlanketOrder(Document): - pass + def update_ordered_qty(self): + ref_doctype = "Sales Order" if self.blanket_order_type == "Selling" else "Purchase Order" + item_ordered_qty = frappe._dict(frappe.db.sql(""" + select trans_item.item_code, sum(trans_item.stock_qty) as qty + from `tab{0} Item` trans_item, `tab{0}` trans + where trans.name = trans_item.parent + and trans_item.blanket_order=%s + and trans.docstatus=1 + and trans.status not in ('Closed', 'Stopped') + group by trans_item.item_code + """.format(ref_doctype), self.name)) + for d in self.items: + d.db_set("ordered_qty", item_ordered_qty.get(d.item_code, 0)) @frappe.whitelist() def make_sales_order(source_name): def update_item(source, target, source_parent): - target.qty = source.get("qty") - source.get("ordered_quantity") + target.qty = source.get("qty") - source.get("ordered_qty") item = get_item_defaults(target.item_code, source_parent.company) if item: target.item_name = item.get("item_name") @@ -41,7 +53,7 @@ def make_sales_order(source_name): @frappe.whitelist() def make_purchase_order(source_name): def update_item(source, target, source_parent): - target.qty = source.get("qty") - source.get("ordered_quantity") + target.qty = source.get("qty") - source.get("ordered_qty") item = get_item_defaults(target.item_code, source_parent.company) if item: target.item_name = item.get("item_name") @@ -62,4 +74,4 @@ def make_purchase_order(source_name): "postprocess": update_item } }) - return target_doc + return target_doc \ No newline at end of file diff --git a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py index a51c5f44b7..455ea06137 100644 --- a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import frappe import unittest from frappe.utils import add_months, today +from erpnext import get_company_currency from .blanket_order import make_sales_order, make_purchase_order class TestBlanketOrder(unittest.TestCase): @@ -13,6 +14,7 @@ class TestBlanketOrder(unittest.TestCase): bo = make_blanket_order(blanket_order_type="Selling") so = make_sales_order(bo.name) + so.currency = get_company_currency(so.company) so.delivery_date = today() so.items[0].qty = 10 so.submit() @@ -24,17 +26,19 @@ class TestBlanketOrder(unittest.TestCase): self.assertEqual(so.items[0].rate, bo.items[0].rate) bo = frappe.get_doc("Blanket Order", bo.name) - self.assertEqual(so.items[0].qty, bo.items[0].ordered_quantity) + self.assertEqual(so.items[0].qty, bo.items[0].ordered_qty) # test the quantity so1 = make_sales_order(bo.name) - self.assertEqual(so1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_quantity)) + so1.currency = get_company_currency(so1.company) + self.assertEqual(so1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_qty)) def test_purchase_order_creation(self): bo = make_blanket_order(blanket_order_type="Purchasing") po = make_purchase_order(bo.name) + po.currency = get_company_currency(po.company) po.schedule_date = today() po.items[0].qty = 10 po.submit() @@ -46,11 +50,12 @@ class TestBlanketOrder(unittest.TestCase): self.assertEqual(po.items[0].rate, po.items[0].rate) bo = frappe.get_doc("Blanket Order", bo.name) - self.assertEqual(po.items[0].qty, bo.items[0].ordered_quantity) + self.assertEqual(po.items[0].qty, bo.items[0].ordered_qty) # test the quantity po1 = make_sales_order(bo.name) - self.assertEqual(po1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_quantity)) + po1.currency = get_company_currency(po1.company) + self.assertEqual(po1.items[0].qty, (bo.items[0].qty-bo.items[0].ordered_qty)) diff --git a/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json b/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json index 195f57fbb2..099eed4aec 100644 --- a/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json +++ b/erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json @@ -181,7 +181,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "ordered_quantity", + "fieldname": "ordered_qty", "fieldtype": "Float", "hidden": 0, "ignore_user_permissions": 0, @@ -280,7 +280,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2018-06-04 07:04:14.050836", + "modified": "2018-06-14 07:04:14.050836", "modified_by": "Administrator", "module": "Manufacturing", "name": "Blanket Order Item", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 95c7c9286d..1252c1df31 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -190,7 +190,7 @@ class SalesOrder(SellingController): frappe.db.set(self, 'status', 'Cancelled') - self.update_blanket_order(cancel=True) + self.update_blanket_order() def update_project(self): project_list = [] @@ -414,6 +414,7 @@ def close_or_unclose_sales_orders(names, status): else: if so.status == "Closed": so.update_status('Draft') + so.update_blanket_order() frappe.local.message_log = []