Update ordered qty in blanket order
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index c6a5dae..58f1499 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -244,7 +244,7 @@
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 @@
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 9d58ce3..4282178 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -342,17 +342,10 @@
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 58fb8ee..d71ffcb 100755
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -66,6 +66,10 @@
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 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 f6ef4de..5381abf 100644
--- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
+++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
@@ -10,13 +10,25 @@
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 @@
@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 @@
"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 a51c5f4..455ea06 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 @@
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 @@
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 @@
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 @@
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 195f57f..099eed4 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 95c7c92..1252c1d 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -190,7 +190,7 @@
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 @@
else:
if so.status == "Closed":
so.update_status('Draft')
+ so.update_blanket_order()
frappe.local.message_log = []