From 2b885beaee494875d82f133023f5c6956939267c Mon Sep 17 00:00:00 2001 From: pawan Date: Wed, 7 Feb 2018 19:06:18 +0530 Subject: [PATCH] code changes for single stock entry --- .../doctype/purchase_order/purchase_order.js | 3 +- .../doctype/purchase_order/purchase_order.py | 37 +++++++++---------- erpnext/manufacturing/doctype/bom/bom.py | 11 ++++-- .../stock/doctype/stock_entry/stock_entry.py | 15 ++------ 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index f49f1103c3..f84feab61b 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -284,7 +284,8 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( } , callback: function(r) { - frappe.set_route("List", "Stock Entry", "List",{"purchase_order":r.message,"doc_status":0}) + var doclist = frappe.model.sync(r.message); + frappe.set_route("Form", doclist[0].doctype, doclist[0].name); } }); }, diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index a021690d23..e78d4b72cf 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -435,30 +435,29 @@ def make_rm_stock_entry(purchase_order, rm_items): item_wh = frappe._dict(frappe.db.sql("""select item_code, description from `tabItem` where name in ({0})""". format(", ".join(["%s"] * len(item_code_list))), item_code_list)) + stock_entry = frappe.new_doc("Stock Entry") + stock_entry.purpose = "Subcontract" + stock_entry.purchase_order = purchase_order.name + stock_entry.supplier = purchase_order.supplier + stock_entry.supplier_name = purchase_order.supplier_name + stock_entry.supplier_address = purchase_order.supplier_address + stock_entry.address_display = purchase_order.address_display + stock_entry.company = purchase_order.company + stock_entry.from_bom = 1 for item_code in item_code_list: - stock_entry = frappe.new_doc("Stock Entry") - stock_entry.purpose = "Subcontract" - stock_entry.purchase_order = purchase_order.name - stock_entry.supplier = purchase_order.supplier - stock_entry.supplier_name = purchase_order.supplier_name - stock_entry.supplier_address = purchase_order.supplier_address - stock_entry.address_display = purchase_order.address_display - stock_entry.company = purchase_order.company - stock_entry.docstatus = 0 - stock_entry.from_bom = 1 po_item = [d for d in purchase_order.items if d.item_code == item_code][0] - stock_entry.fg_completed_qty = po_item.qty - stock_entry.bom_no = po_item.bom + bom_no = po_item.bom for rm_item_data in rm_items_list: if rm_item_data["item_code"] == item_code: items_dict = {rm_item_data["rm_item_code"]: - {"item_name":rm_item_data["item_name"], - "description":item_wh.get(rm_item_data["rm_item_code"]), - 'qty':rm_item_data["qty"], - 'from_warehouse':rm_item_data["warehouse"], - 'stock_uom':rm_item_data["stock_uom"]}} - stock_entry.add_to_stock_entry_detail(items_dict) - stock_entry.save() + {"item_name":rm_item_data["item_name"], + "description":item_wh.get(rm_item_data["rm_item_code"]), + 'qty':rm_item_data["qty"], + 'from_warehouse':rm_item_data["warehouse"], + 'stock_uom':rm_item_data["stock_uom"], + 'bom_no':bom_no}} + stock_entry.add_to_stock_entry_detail(items_dict, bom_no) + return stock_entry.as_dict() else: frappe.throw(_("No Items selected for transfer")) return purchase_order.name diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index a06645ad9f..81b899acbc 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -586,9 +586,14 @@ def validate_bom_no(item, bom_no): if bom.docstatus != 1: if not getattr(frappe.flags, "in_test", False): frappe.throw(_("BOM {0} must be submitted").format(bom_no)) - if item and not (bom.item.lower() == item.lower() or \ - bom.item.lower() == cstr(frappe.db.get_value("Item", item, "variant_of")).lower()): - frappe.throw(_("BOM {0} does not belong to Item {1}").format(bom_no, item)) + if item: + rm_item_exists = False + for d in bom.items: + if (d.item_code.lower() == item.lower() or \ + d.item_code.lower() == cstr(frappe.db.get_value("Item", item, "variant_of")).lower()): + rm_item_exists = True + if not rm_item_exists: + frappe.throw(_("BOM {0} does not belong to Item {1}").format(bom_no, item)) @frappe.whitelist() def get_children(doctype, parent=None, is_root=False, **filters): diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 4239751914..42ef79bbc1 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -64,13 +64,6 @@ class StockEntry(StockController): self.calculate_rate_and_amount(update_finished_item_rate=False) def on_submit(self): - if self.purpose == "Subcontract": - for d in self.items: - if not d.t_warehouse: - if self.to_warehouse: - d.t_warehouse = self.to_warehouse - else: - frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx)) self.update_stock_ledger() @@ -165,9 +158,7 @@ class StockEntry(StockController): if self.to_warehouse: d.t_warehouse = self.to_warehouse else: - #move validation for sub contract to submit - if self.purpose != "Subcontract": - frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx)) + frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx)) if self.purpose in ["Manufacture", "Repack"]: if validate_for_manufacture_repack: @@ -417,7 +408,7 @@ class StockEntry(StockController): """validation: finished good quantity should be same as manufacturing quantity""" items_with_target_warehouse = [] for d in self.get('items'): - if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty) and (d.t_warehouse != getattr(self, "pro_doc", frappe._dict()).scrap_warehouse): + if self.purpose != "Subcontract" and d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty) and (d.t_warehouse != getattr(self, "pro_doc", frappe._dict()).scrap_warehouse): frappe.throw(_("Quantity in row {0} ({1}) must be same as manufactured quantity {2}"). \ format(d.idx, d.transfer_qty, self.fg_completed_qty)) @@ -808,7 +799,7 @@ class StockEntry(StockController): def add_to_stock_entry_detail(self, item_dict, bom_no=None): expense_account, cost_center = frappe.db.get_values("Company", self.company, \ ["default_expense_account", "cost_center"])[0] - + for d in item_dict: stock_uom = item_dict[d].get("stock_uom") or frappe.db.get_value("Item", d, "stock_uom")