material request should update bin, even if it is of type Material Transfer
This commit is contained in:
parent
0f45e2b552
commit
9a17051c8d
@ -205,7 +205,7 @@ class DocType(BuyingController):
|
||||
|
||||
self.doc.per_ordered = flt((per_ordered / flt(len(item_doclist))) * 100.0, 2)
|
||||
webnotes.conn.set_value(self.doc.doctype, self.doc.name, "per_ordered", self.doc.per_ordered)
|
||||
|
||||
|
||||
def update_completed_qty(controller, caller_method):
|
||||
if controller.doc.doctype == "Stock Entry":
|
||||
material_request_map = {}
|
||||
@ -215,18 +215,43 @@ def update_completed_qty(controller, caller_method):
|
||||
if d.material_request not in material_request_map:
|
||||
material_request_map[d.material_request] = []
|
||||
material_request_map[d.material_request].append(d.material_request_item)
|
||||
webnotes.get_obj("Warehouse", d.t_warehouse).update_bin({
|
||||
"item_code": d.item_code,
|
||||
"indented_qty": (d.docstatus==2 and 1 or -1) * d.transfer_qty,
|
||||
"posting_date": controller.doc.posting_date,
|
||||
})
|
||||
|
||||
for mr_name, mr_items in material_request_map.items():
|
||||
mr_obj = webnotes.get_obj("Material Request", mr_name, with_children=1)
|
||||
mr_doctype = webnotes.get_doctype("Material Request")
|
||||
|
||||
if mr_obj.doc.status in ["Stopped", "Cancelled"]:
|
||||
msgprint(_("Material Request") + ": %s, " % mr_obj.doc.name
|
||||
+ _(mr_doctype.get_label("status")) + " = %s. " % _(mr_obj.doc.status)
|
||||
+ _("Cannot continue."), raise_exception=True)
|
||||
+ _("Cannot continue."), raise_exception=webnotes.InvalidStatusError)
|
||||
|
||||
mr_obj.update_completed_qty(mr_items)
|
||||
_update_requested_qty(controller, mr_obj, mr_items)
|
||||
|
||||
# update ordered percentage and qty
|
||||
mr_obj.update_completed_qty(mr_items)
|
||||
|
||||
def _update_requested_qty(controller, mr_obj, mr_items):
|
||||
"""update requested qty (before ordered_qty is updated)"""
|
||||
for mr_item_name in mr_items:
|
||||
mr_item = mr_obj.doclist.getone({"parentfield": "indent_details", "name": mr_item_name})
|
||||
se_detail = controller.doclist.getone({"parentfield": "mtn_details",
|
||||
"material_request": mr_obj.doc.name, "material_request_item": mr_item_name})
|
||||
|
||||
mr_item.ordered_qty = flt(mr_item.ordered_qty)
|
||||
mr_item.qty = flt(mr_item.qty)
|
||||
se_detail.transfer_qty = flt(se_detail.transfer_qty)
|
||||
|
||||
if se_detail.docstatus == 2 and mr_item.ordered_qty > mr_item.qty \
|
||||
and se_detail.transfer_qty == mr_item.ordered_qty:
|
||||
add_indented_qty = mr_item.qty
|
||||
elif se_detail.docstatus == 1 and \
|
||||
mr_item.ordered_qty + se_detail.transfer_qty > mr_item.qty:
|
||||
add_indented_qty = mr_item.qty - mr_item.ordered_qty
|
||||
else:
|
||||
add_indented_qty = se_detail.transfer_qty
|
||||
|
||||
webnotes.get_obj("Warehouse", se_detail.t_warehouse).update_bin({
|
||||
"item_code": se_detail.item_code,
|
||||
"indented_qty": (se_detail.docstatus==2 and 1 or -1) * add_indented_qty,
|
||||
"posting_date": controller.doc.posting_date,
|
||||
})
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes, unittest
|
||||
from webnotes.utils import flt
|
||||
|
||||
class TestMaterialRequest(unittest.TestCase):
|
||||
def _test_expected(self, doclist, expected_values):
|
||||
@ -11,10 +12,10 @@ class TestMaterialRequest(unittest.TestCase):
|
||||
self.assertEquals(val, doclist[i].fields.get(fieldname))
|
||||
|
||||
def _test_requested_qty(self, qty1, qty2):
|
||||
self.assertEqual(webnotes.conn.get_value("Bin", {"item_code": "_Test Item Home Desktop 100",
|
||||
"warehouse": "_Test Warehouse"}, "indented_qty"), qty1)
|
||||
self.assertEqual(webnotes.conn.get_value("Bin", {"item_code": "_Test Item Home Desktop 200",
|
||||
"warehouse": "_Test Warehouse"}, "indented_qty"), qty2)
|
||||
self.assertEqual(flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item Home Desktop 100",
|
||||
"warehouse": "_Test Warehouse"}, "indented_qty")), qty1)
|
||||
self.assertEqual(flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item Home Desktop 200",
|
||||
"warehouse": "_Test Warehouse"}, "indented_qty")), qty2)
|
||||
|
||||
def test_completed_qty_for_purchase(self):
|
||||
webnotes.conn.sql("""delete from `tabBin`""")
|
||||
@ -124,6 +125,95 @@ class TestMaterialRequest(unittest.TestCase):
|
||||
self._test_expected(mr.doclist, [{"per_ordered": 0}, {"ordered_qty": 0}, {"ordered_qty": 0}])
|
||||
self._test_requested_qty(54.0, 3.0)
|
||||
|
||||
def test_completed_qty_for_over_transfer(self):
|
||||
webnotes.conn.sql("""delete from `tabBin`""")
|
||||
|
||||
# submit material request of type Purchase
|
||||
mr = webnotes.bean(copy=test_records[0])
|
||||
mr.doc.material_request_type = "Transfer"
|
||||
mr.insert()
|
||||
mr.submit()
|
||||
|
||||
# check if per complete is None
|
||||
self._test_expected(mr.doclist, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}])
|
||||
|
||||
self._test_requested_qty(54.0, 3.0)
|
||||
|
||||
# map a stock entry
|
||||
se_doclist = webnotes.map_doclist([["Material Request", "Stock Entry"],
|
||||
["Material Request Item", "Stock Entry Detail"]], mr.doc.name)
|
||||
se_doclist[0].fields.update({
|
||||
"posting_date": "2013-03-01",
|
||||
"posting_time": "00:00"
|
||||
})
|
||||
se_doclist[1].fields.update({
|
||||
"qty": 60.0,
|
||||
"transfer_qty": 60.0,
|
||||
"s_warehouse": "_Test Warehouse 1",
|
||||
"incoming_rate": 1.0
|
||||
})
|
||||
se_doclist[2].fields.update({
|
||||
"qty": 3.0,
|
||||
"transfer_qty": 3.0,
|
||||
"s_warehouse": "_Test Warehouse 1",
|
||||
"incoming_rate": 1.0
|
||||
})
|
||||
|
||||
# check for stopped status of Material Request
|
||||
se = webnotes.bean(copy=se_doclist)
|
||||
se.insert()
|
||||
mr.obj.update_status('Stopped')
|
||||
self.assertRaises(webnotes.ValidationError, se.submit)
|
||||
self.assertRaises(webnotes.ValidationError, se.cancel)
|
||||
|
||||
mr.obj.update_status('Submitted')
|
||||
se = webnotes.bean(copy=se_doclist)
|
||||
se.insert()
|
||||
se.submit()
|
||||
|
||||
# check if per complete is as expected
|
||||
mr.load_from_db()
|
||||
self._test_expected(mr.doclist, [{"per_ordered": 100}, {"ordered_qty": 60.0}, {"ordered_qty": 3.0}])
|
||||
self._test_requested_qty(0.0, 0.0)
|
||||
|
||||
# check if per complete is as expected for Stock Entry cancelled
|
||||
se.cancel()
|
||||
mr.load_from_db()
|
||||
self._test_expected(mr.doclist, [{"per_ordered": 0}, {"ordered_qty": 0}, {"ordered_qty": 0}])
|
||||
self._test_requested_qty(54.0, 3.0)
|
||||
|
||||
def test_incorrect_mapping_of_stock_entry(self):
|
||||
# submit material request of type Purchase
|
||||
mr = webnotes.bean(copy=test_records[0])
|
||||
mr.doc.material_request_type = "Transfer"
|
||||
mr.insert()
|
||||
mr.submit()
|
||||
|
||||
# map a stock entry
|
||||
se_doclist = webnotes.map_doclist([["Material Request", "Stock Entry"],
|
||||
["Material Request Item", "Stock Entry Detail"]], mr.doc.name)
|
||||
se_doclist[0].fields.update({
|
||||
"posting_date": "2013-03-01",
|
||||
"posting_time": "00:00"
|
||||
})
|
||||
se_doclist[1].fields.update({
|
||||
"qty": 60.0,
|
||||
"transfer_qty": 60.0,
|
||||
"s_warehouse": "_Test Warehouse",
|
||||
"t_warehouse": "_Test Warehouse 1",
|
||||
"incoming_rate": 1.0
|
||||
})
|
||||
se_doclist[2].fields.update({
|
||||
"qty": 3.0,
|
||||
"transfer_qty": 3.0,
|
||||
"s_warehouse": "_Test Warehouse 1",
|
||||
"incoming_rate": 1.0
|
||||
})
|
||||
|
||||
# check for stopped status of Material Request
|
||||
se = webnotes.bean(copy=se_doclist)
|
||||
self.assertRaises(webnotes.MappingMismatchError, se.insert)
|
||||
|
||||
test_records = [
|
||||
[
|
||||
{
|
||||
|
@ -52,6 +52,8 @@ class DocType(TransactionBase):
|
||||
self.validate_finished_goods()
|
||||
self.validate_return_reference_doc()
|
||||
|
||||
self.validate_with_material_request()
|
||||
|
||||
def on_submit(self):
|
||||
self.update_serial_no(1)
|
||||
self.update_stock_ledger(0)
|
||||
@ -580,6 +582,18 @@ class DocType(TransactionBase):
|
||||
'supplier_name' : res and res[0][0] or '',
|
||||
'supplier_address' : addr and addr[0] or ''}
|
||||
return ret
|
||||
|
||||
def validate_with_material_request(self):
|
||||
for item in self.doclist.get({"parentfield": "mtn_details"}):
|
||||
if item.material_request:
|
||||
mreq_item = webnotes.conn.get_value("Material Request Item",
|
||||
{"name": item.material_request_item, "parent": item.material_request},
|
||||
["item_code", "warehouse", "idx"], as_dict=True)
|
||||
if mreq_item.item_code != item.item_code or mreq_item.warehouse != item.t_warehouse:
|
||||
msgprint(_("Row #") + (" %d: " % item.idx) + _("does not match")
|
||||
+ " " + _("Row #") + (" %d %s " % (mreq_item.idx, _("of")))
|
||||
+ _("Material Request") + (" - %s" % item.material_request),
|
||||
raise_exception=webnotes.MappingMismatchError)
|
||||
|
||||
@webnotes.whitelist()
|
||||
def get_production_order_details(production_order):
|
||||
|
Loading…
x
Reference in New Issue
Block a user