Update ordered qty in blanket order
This commit is contained in:
@@ -244,7 +244,7 @@ class PurchaseOrder(BuyingController):
|
|||||||
self.update_requested_qty()
|
self.update_requested_qty()
|
||||||
self.update_ordered_qty()
|
self.update_ordered_qty()
|
||||||
|
|
||||||
self.update_blanket_order(cancel=True)
|
self.update_blanket_order()
|
||||||
|
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
@@ -323,6 +323,7 @@ def close_or_unclose_purchase_orders(names, status):
|
|||||||
else:
|
else:
|
||||||
if po.status == "Closed":
|
if po.status == "Closed":
|
||||||
po.update_status("Draft")
|
po.update_status("Draft")
|
||||||
|
po.update_blanket_order()
|
||||||
|
|
||||||
frappe.local.message_log = []
|
frappe.local.message_log = []
|
||||||
|
|
||||||
|
|||||||
@@ -342,17 +342,10 @@ class StockController(AccountsController):
|
|||||||
if self.docstatus==1:
|
if self.docstatus==1:
|
||||||
raise frappe.ValidationError
|
raise frappe.ValidationError
|
||||||
|
|
||||||
def update_blanket_order(self, cancel=False):
|
def update_blanket_order(self):
|
||||||
for item in self.items:
|
blanket_orders = list(set([d.blanket_order for d in self.items]))
|
||||||
if item.blanket_order:
|
for blanket_order in blanket_orders:
|
||||||
ordered_quantity, doc_name = frappe.db.get_value("Blanket Order Item", {"parent": item.blanket_order}, ["ordered_quantity", "name"])
|
frappe.get_doc("Blanket Order", blanket_order).update_ordered_qty()
|
||||||
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_gl_entries_after(posting_date, posting_time, for_warehouses=None, for_items=None,
|
def update_gl_entries_after(posting_date, posting_time, for_warehouses=None, for_items=None,
|
||||||
warehouse_account=None):
|
warehouse_account=None):
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ class Employee(NestedSet):
|
|||||||
|
|
||||||
def update_user_permissions(self):
|
def update_user_permissions(self):
|
||||||
if not self.create_user_permission: return
|
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)
|
add_user_permission("Employee", self.name, self.user_id)
|
||||||
set_user_permission_if_allowed("Company", self.company, 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):
|
def update_user_permissions(doc, method):
|
||||||
# called via User hook
|
# called via User hook
|
||||||
if "Employee" in [d.role for d in doc.get("roles")]:
|
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
|
if not has_permission('User Permission', ptype='write'): return
|
||||||
employee = frappe.get_doc("Employee", {"user_id": doc.name})
|
employee = frappe.get_doc("Employee", {"user_id": doc.name})
|
||||||
employee.update_user_permissions()
|
employee.update_user_permissions()
|
||||||
|
|||||||
@@ -10,13 +10,25 @@ from erpnext.stock.doctype.item.item import get_item_defaults
|
|||||||
|
|
||||||
|
|
||||||
class BlanketOrder(Document):
|
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()
|
@frappe.whitelist()
|
||||||
def make_sales_order(source_name):
|
def make_sales_order(source_name):
|
||||||
def update_item(source, target, source_parent):
|
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)
|
item = get_item_defaults(target.item_code, source_parent.company)
|
||||||
if item:
|
if item:
|
||||||
target.item_name = item.get("item_name")
|
target.item_name = item.get("item_name")
|
||||||
@@ -41,7 +53,7 @@ def make_sales_order(source_name):
|
|||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_purchase_order(source_name):
|
def make_purchase_order(source_name):
|
||||||
def update_item(source, target, source_parent):
|
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)
|
item = get_item_defaults(target.item_code, source_parent.company)
|
||||||
if item:
|
if item:
|
||||||
target.item_name = item.get("item_name")
|
target.item_name = item.get("item_name")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
import unittest
|
import unittest
|
||||||
from frappe.utils import add_months, today
|
from frappe.utils import add_months, today
|
||||||
|
from erpnext import get_company_currency
|
||||||
from .blanket_order import make_sales_order, make_purchase_order
|
from .blanket_order import make_sales_order, make_purchase_order
|
||||||
|
|
||||||
class TestBlanketOrder(unittest.TestCase):
|
class TestBlanketOrder(unittest.TestCase):
|
||||||
@@ -13,6 +14,7 @@ class TestBlanketOrder(unittest.TestCase):
|
|||||||
bo = make_blanket_order(blanket_order_type="Selling")
|
bo = make_blanket_order(blanket_order_type="Selling")
|
||||||
|
|
||||||
so = make_sales_order(bo.name)
|
so = make_sales_order(bo.name)
|
||||||
|
so.currency = get_company_currency(so.company)
|
||||||
so.delivery_date = today()
|
so.delivery_date = today()
|
||||||
so.items[0].qty = 10
|
so.items[0].qty = 10
|
||||||
so.submit()
|
so.submit()
|
||||||
@@ -24,17 +26,19 @@ class TestBlanketOrder(unittest.TestCase):
|
|||||||
self.assertEqual(so.items[0].rate, bo.items[0].rate)
|
self.assertEqual(so.items[0].rate, bo.items[0].rate)
|
||||||
|
|
||||||
bo = frappe.get_doc("Blanket Order", bo.name)
|
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
|
# test the quantity
|
||||||
so1 = make_sales_order(bo.name)
|
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):
|
def test_purchase_order_creation(self):
|
||||||
bo = make_blanket_order(blanket_order_type="Purchasing")
|
bo = make_blanket_order(blanket_order_type="Purchasing")
|
||||||
|
|
||||||
po = make_purchase_order(bo.name)
|
po = make_purchase_order(bo.name)
|
||||||
|
po.currency = get_company_currency(po.company)
|
||||||
po.schedule_date = today()
|
po.schedule_date = today()
|
||||||
po.items[0].qty = 10
|
po.items[0].qty = 10
|
||||||
po.submit()
|
po.submit()
|
||||||
@@ -46,11 +50,12 @@ class TestBlanketOrder(unittest.TestCase):
|
|||||||
self.assertEqual(po.items[0].rate, po.items[0].rate)
|
self.assertEqual(po.items[0].rate, po.items[0].rate)
|
||||||
|
|
||||||
bo = frappe.get_doc("Blanket Order", bo.name)
|
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
|
# test the quantity
|
||||||
po1 = make_sales_order(bo.name)
|
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))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "ordered_quantity",
|
"fieldname": "ordered_qty",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
@@ -280,7 +280,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-06-04 07:04:14.050836",
|
"modified": "2018-06-14 07:04:14.050836",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Manufacturing",
|
"module": "Manufacturing",
|
||||||
"name": "Blanket Order Item",
|
"name": "Blanket Order Item",
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ class SalesOrder(SellingController):
|
|||||||
|
|
||||||
frappe.db.set(self, 'status', 'Cancelled')
|
frappe.db.set(self, 'status', 'Cancelled')
|
||||||
|
|
||||||
self.update_blanket_order(cancel=True)
|
self.update_blanket_order()
|
||||||
|
|
||||||
def update_project(self):
|
def update_project(self):
|
||||||
project_list = []
|
project_list = []
|
||||||
@@ -414,6 +414,7 @@ def close_or_unclose_sales_orders(names, status):
|
|||||||
else:
|
else:
|
||||||
if so.status == "Closed":
|
if so.status == "Closed":
|
||||||
so.update_status('Draft')
|
so.update_status('Draft')
|
||||||
|
so.update_blanket_order()
|
||||||
|
|
||||||
frappe.local.message_log = []
|
frappe.local.message_log = []
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user