diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 80c61ab842..ec77cf3720 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -294,9 +294,12 @@ def make_supplier_quotation(source_name, target_doc=None): @frappe.whitelist() def make_stock_entry(source_name, target_doc=None): def update_item(obj, target, source_parent): + qty = flt(obj.qty) - flt(obj.ordered_qty) \ + if flt(obj.qty) > flt(obj.ordered_qty) else 0 + target.qty = qty + target.transfer_qty = qty target.conversion_factor = 1 - target.qty = flt(obj.qty) - flt(obj.ordered_qty) - target.transfer_qty = flt(obj.qty) - flt(obj.ordered_qty) + if source_parent.material_request_type == "Material Transfer": target.t_warehouse = obj.warehouse else: diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index 753c5b19a9..16abcf8f79 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -77,7 +77,7 @@ class TestMaterialRequest(unittest.TestCase): "stock_uom": "_Test UOM 1", "transfer_qty": qty1, "uom": "_Test UOM 1", - "t_warehouse": "_Test Warehouse 1 - _TC", + "t_warehouse": warehouse or "_Test Warehouse 1 - _TC", }, { "conversion_factor": 1.0, @@ -89,7 +89,7 @@ class TestMaterialRequest(unittest.TestCase): "stock_uom": "_Test UOM 1", "transfer_qty": qty2, "uom": "_Test UOM 1", - "t_warehouse": "_Test Warehouse 1 - _TC", + "t_warehouse": warehouse or "_Test Warehouse 1 - _TC", } ] }) @@ -383,6 +383,56 @@ class TestMaterialRequest(unittest.TestCase): def _get_requested_qty(self, item_code, warehouse): return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty")) + def test_make_stock_entry_for_Material_Issue(self): + from erpnext.stock.doctype.material_request.material_request import make_stock_entry + + mr = frappe.copy_doc(test_records[0]).insert() + + self.assertRaises(frappe.ValidationError, make_stock_entry, + mr.name) + + mr = frappe.get_doc("Material Request", mr.name) + mr.material_request_type = "Material Issue" + mr.submit() + se = make_stock_entry(mr.name) + + self.assertEquals(se.doctype, "Stock Entry") + self.assertEquals(len(se.get("mtn_details")), len(mr.get("indent_details"))) + + def test_compleated_qty_for_issue(self): + def _get_requested_qty(): + return flt(frappe.db.get_value("Bin", {"item_code": "_Test Item Home Desktop 100", + "warehouse": "_Test Warehouse - _TC"}, "indented_qty")) + + from erpnext.stock.doctype.material_request.material_request import make_stock_entry + + existing_requested_qty = _get_requested_qty() + + mr = frappe.copy_doc(test_records[0]) + mr.material_request_type = "Material Issue" + mr.submit() + + #testing bin value after material request is submitted + self.assertEquals(_get_requested_qty(), existing_requested_qty + 54.0) + + # receive items to allow issue + self._insert_stock_entry(60, 6, "_Test Warehouse - _TC") + + # make stock entry against MR + + se_doc = make_stock_entry(mr.name) + se_doc.fiscal_year = "_Test Fiscal Year 2014" + se_doc.get("mtn_details")[0].qty = 60.0 + se_doc.insert() + se_doc.submit() + + # check if per complete is as expected + mr.load_from_db() + self.assertEquals(mr.get("indent_details")[0].ordered_qty, 60.0) + self.assertEquals(mr.get("indent_details")[1].ordered_qty, 3.0) + + #testing bin requested qty after issuing stock against material request + self.assertEquals(_get_requested_qty(), existing_requested_qty) test_dependencies = ["Currency Exchange"] test_records = frappe.get_test_records('Material Request') diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 839554a7f6..f0af283d99 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -219,7 +219,7 @@ class StockEntry(StockController): if not self.posting_date or not self.posting_time: frappe.throw(_("Posting date and posting time is mandatory")) - allow_negative_stock = cint(frappe.db.get_default("allow_negative_stock")) + allow_negative_stock = cint(frappe.db.get_value("Stock Settings", None, "allow_negative_stock")) for d in self.get('mtn_details'): d.transfer_qty = flt(d.transfer_qty) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index eae1bf68bf..62cc397ef9 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -87,7 +87,7 @@ def update_entries_after(args, allow_zero_rate=False, verbose=1): stock_value_difference = 0.0 for sle in entries_to_fix: - if sle.serial_no or not cint(frappe.db.get_default("allow_negative_stock")): + if sle.serial_no or not cint(frappe.db.get_value("Stock Settings", None, "allow_negative_stock")): # validate negative stock for serialized items, fifo valuation # or when negative stock is not allowed for moving average if not validate_negative_stock(qty_after_transaction, sle):