From 5816fc280133e2061408b0270310f4579a6b61c8 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 26 Mar 2019 12:39:28 +0530 Subject: [PATCH] Renamed subcontract to Send to Subcontractor --- .../doctype/purchase_order/purchase_order.py | 2 +- erpnext/controllers/buying_controller.py | 2 +- ...e_backflush_subcontract_rm_based_on_bom.py | 6 ++-- .../patches/v12_0/stock_entry_enhancements.py | 3 +- .../operations/install_fixtures.py | 2 +- erpnext/stock/doctype/bin/bin.py | 2 +- .../stock/doctype/stock_entry/stock_entry.js | 8 +++--- .../doctype/stock_entry/stock_entry.json | 16 +++++------ .../stock/doctype/stock_entry/stock_entry.py | 28 +++++++++---------- .../tests/test_stock_entry_for_subcontract.js | 2 +- .../stock_entry_type/stock_entry_type.json | 4 +-- .../itemwise_recommended_reorder_level.py | 2 +- 12 files changed, 39 insertions(+), 38 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index a993ab853f..b7450744da 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -444,7 +444,7 @@ def make_rm_stock_entry(purchase_order, rm_items): item_wh = get_item_details(items) stock_entry = frappe.new_doc("Stock Entry") - stock_entry.purpose = "Subcontract" + stock_entry.purpose = "Send to Subcontractor" stock_entry.purchase_order = purchase_order.name stock_entry.supplier = purchase_order.supplier stock_entry.supplier_name = purchase_order.supplier_name diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 06b2753b3c..a1dfffe611 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -729,7 +729,7 @@ def get_subcontracted_raw_materials_from_se(purchase_orders): sed.stock_uom, sed.subcontracted_item as main_item_code, sed.serial_no, sed.batch_no from `tabStock Entry` se,`tabStock Entry Detail` sed where - se.name = sed.parent and se.docstatus=1 and se.purpose='Subcontract' + se.name = sed.parent and se.docstatus=1 and se.purpose='Send to Subcontractor' and se.purchase_order in (%s) and ifnull(sed.t_warehouse, '') != '' group by sed.item_code, sed.t_warehouse """ % (','.join(['%s'] * len(purchase_orders))), tuple(purchase_orders), as_dict=1) diff --git a/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py b/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py index f71d9b43cf..f2eeadac60 100644 --- a/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py +++ b/erpnext/patches/v11_0/update_backflush_subcontract_rm_based_on_bom.py @@ -7,13 +7,13 @@ import frappe def execute(): frappe.reload_doc('buying', 'doctype', 'buying_settings') frappe.db.set_value('Buying Settings', None, 'backflush_raw_materials_of_subcontract_based_on', 'BOM') - + frappe.reload_doc('stock', 'doctype', 'stock_entry_detail') - frappe.db.sql(""" update `tabStock Entry Detail` as sed, + frappe.db.sql(""" update `tabStock Entry Detail` as sed, `tabStock Entry` as se, `tabPurchase Order Item Supplied` as pois set sed.subcontracted_item = pois.main_item_code where - se.purpose = 'Subcontract' and sed.parent = se.name + se.purpose = 'Send to Subcontractor' and sed.parent = se.name and pois.rm_item_code = sed.item_code and se.docstatus = 1 and pois.parenttype = 'Purchase Order'""") \ No newline at end of file diff --git a/erpnext/patches/v12_0/stock_entry_enhancements.py b/erpnext/patches/v12_0/stock_entry_enhancements.py index edd95d54e3..d04b3d3862 100644 --- a/erpnext/patches/v12_0/stock_entry_enhancements.py +++ b/erpnext/patches/v12_0/stock_entry_enhancements.py @@ -19,7 +19,7 @@ def create_stock_entry_types(): for purpose in ["Material Issue", "Material Receipt", "Material Transfer", "Material Transfer for Manufacture", "Material Consumption for Manufacture", "Manufacture", - "Repack", "Subcontract", "Send to Warehouse", "Receive at Warehouse"]: + "Repack", "Send to Subcontractor", "Send to Warehouse", "Receive at Warehouse"]: ste_type = frappe.get_doc({ 'doctype': 'Stock Entry Type', @@ -32,6 +32,7 @@ def create_stock_entry_types(): except frappe.DuplicateEntryError: pass + frappe.db.sql(" UPDATE `tabStock Entry` set purpose = 'Send to Subcontractor' where purpose = 'Subcontract'") frappe.db.sql(" UPDATE `tabStock Entry` set stock_entry_type = purpose ") def add_gst_hsn_code_field(): diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py index c0fb0d7686..66871dbd5a 100644 --- a/erpnext/setup/setup_wizard/operations/install_fixtures.py +++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py @@ -89,7 +89,7 @@ def install(country=None): {'doctype': 'Stock Entry Type', 'name': 'Material Transfer', 'purpose': 'Material Transfer'}, {'doctype': 'Stock Entry Type', 'name': 'Manufacture', 'purpose': 'Manufacture'}, {'doctype': 'Stock Entry Type', 'name': 'Repack', 'purpose': 'Repack'}, - {'doctype': 'Stock Entry Type', 'name': 'Subcontract', 'purpose': 'Subcontract'}, + {'doctype': 'Stock Entry Type', 'name': 'Send to Subcontractor', 'purpose': 'Send to Subcontractor'}, {'doctype': 'Stock Entry Type', 'name': 'Material Transfer for Manufacture', 'purpose': 'Material Transfer for Manufacture'}, {'doctype': 'Stock Entry Type', 'name': 'Material Consumption for Manufacture', 'purpose': 'Material Consumption for Manufacture'}, {'doctype': 'Stock Entry Type', 'name': 'Send to Warehouse', 'purpose': 'Send to Warehouse'}, diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index aa5c69e64f..97a84726da 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -106,7 +106,7 @@ class Bin(Document): `tabStock Entry` se, `tabStock Entry Detail` sed, `tabPurchase Order` po where se.docstatus=1 - and se.purpose='Subcontract' + and se.purpose='Send to Subcontractor' and ifnull(se.purchase_order, '') !='' and (sed.item_code = %(item)s or sed.original_item = %(item)s) and se.name = sed.parent diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index ba761a7249..bfbcb3cf8d 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -49,7 +49,7 @@ frappe.ui.form.on('Stock Entry', { if(!item.item_code) { frappe.throw(__("Please enter Item Code to get Batch Number")); } else { - if (in_list(["Material Transfer for Manufacture", "Manufacture", "Repack", "Subcontract"], doc.purpose)) { + if (in_list(["Material Transfer for Manufacture", "Manufacture", "Repack", "Send to Subcontractor"], doc.purpose)) { var filters = { 'item_code': item.item_code, 'posting_date': frm.doc.posting_date || frappe.datetime.nowdate() @@ -781,9 +781,9 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ if(!row.t_warehouse) row.t_warehouse = this.frm.doc.to_warehouse; }, - source_mandatory: ["Material Issue", "Material Transfer", "Subcontract", + source_mandatory: ["Material Issue", "Material Transfer", "Send to Subcontractor", "Material Transfer for Manufacture", "Send to Warehouse", "Receive at Warehouse"], - target_mandatory: ["Material Receipt", "Material Transfer", "Subcontract", + target_mandatory: ["Material Receipt", "Material Transfer", "Send to Subcontractor", "Material Transfer for Manufacture", "Send to Warehouse", "Receive at Warehouse"], from_warehouse: function(doc) { @@ -831,7 +831,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ this.frm.cscript.toggle_enable_bom(); - if (doc.purpose == 'Subcontract') { + if (doc.purpose == 'Send to Subcontractor') { doc.customer = doc.customer_name = doc.customer_address = doc.delivery_note_no = doc.sales_invoice_no = null; } else { diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.json b/erpnext/stock/doctype/stock_entry/stock_entry.json index 9a035ce5d1..4a2ae538ae 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.json +++ b/erpnext/stock/doctype/stock_entry/stock_entry.json @@ -210,7 +210,7 @@ "no_copy": 0, "oldfieldname": "purpose", "oldfieldtype": "Select", - "options": "Material Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSubcontract\nSend to Warehouse\nReceive at Warehouse", + "options": "Material Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSend to Subcontractor\nSend to Warehouse\nReceive at Warehouse", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -301,7 +301,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.purpose==\"Subcontract\"", + "depends_on": "eval:doc.purpose==\"Send to Subcontractor\"", "fetch_if_empty": 0, "fieldname": "purchase_order", "fieldtype": "Link", @@ -615,7 +615,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:in_list([\"Material Issue\", \"Material Transfer\", \"Manufacture\", \"Repack\", \t\t\t\t\t\"Subcontract\", \"Material Transfer for Manufacture\", \"Material Consumption for Manufacture\"], doc.purpose)", + "depends_on": "eval:in_list([\"Material Issue\", \"Material Transfer\", \"Manufacture\", \"Repack\", \t\t\t\t\t\"Send to Subcontractor\", \"Material Transfer for Manufacture\", \"Material Consumption for Manufacture\"], doc.purpose)", "fetch_if_empty": 0, "fieldname": "from_bom", "fieldtype": "Check", @@ -1524,7 +1524,7 @@ "bold": 0, "collapsible": 1, "columns": 0, - "depends_on": "eval: in_list([\"Sales Return\", \"Purchase Return\", \"Subcontract\"], doc.purpose)", + "depends_on": "eval: in_list([\"Sales Return\", \"Purchase Return\", \"Send to Subcontractor\"], doc.purpose)", "fetch_if_empty": 0, "fieldname": "contact_section", "fieldtype": "Section Break", @@ -1557,7 +1557,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.purpose==\"Purchase Return\" || doc.purpose==\"Subcontract\"", + "depends_on": "eval:doc.purpose==\"Purchase Return\" || doc.purpose==\"Send to Subcontractor\"", "fetch_if_empty": 0, "fieldname": "supplier", "fieldtype": "Link", @@ -1593,7 +1593,7 @@ "bold": 1, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.purpose==\"Purchase Return\" || doc.purpose==\"Subcontract\"", + "depends_on": "eval:doc.purpose==\"Purchase Return\" || doc.purpose==\"Send to Subcontractor\"", "fetch_if_empty": 0, "fieldname": "supplier_name", "fieldtype": "Data", @@ -1628,7 +1628,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.purpose==\"Purchase Return\" || doc.purpose==\"Subcontract\"", + "depends_on": "eval:doc.purpose==\"Purchase Return\" || doc.purpose==\"Send to Subcontractor\"", "fetch_if_empty": 0, "fieldname": "supplier_address", "fieldtype": "Link", @@ -2246,7 +2246,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2019-03-26 12:02:19.319467", + "modified": "2019-03-26 12:24:46.439626", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry", diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index bd563b4579..da2d09ff95 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -83,7 +83,7 @@ class StockEntry(StockController): update_serial_nos_after_submit(self, "items") self.update_work_order() self.validate_purchase_order() - if self.purchase_order and self.purpose == "Subcontract": + if self.purchase_order and self.purpose == "Send to Subcontractor": self.update_purchase_order_supplied_items() self.make_gl_entries() self.update_cost_in_project() @@ -94,7 +94,7 @@ class StockEntry(StockController): def on_cancel(self): - if self.purchase_order and self.purpose == "Subcontract": + if self.purchase_order and self.purpose == "Send to Subcontractor": self.update_purchase_order_supplied_items() if self.work_order and self.purpose == "Material Consumption for Manufacture": @@ -123,7 +123,7 @@ class StockEntry(StockController): def validate_purpose(self): valid_purposes = ["Material Issue", "Material Receipt", "Material Transfer", - "Material Transfer for Manufacture", "Manufacture", "Repack", "Subcontract", + "Material Transfer for Manufacture", "Manufacture", "Repack", "Send to Subcontractor", "Material Consumption for Manufacture", "Send to Warehouse", "Receive at Warehouse"] if self.purpose not in valid_purposes: @@ -227,10 +227,10 @@ class StockEntry(StockController): def validate_warehouse(self): """perform various (sometimes conditional) validations on warehouse""" - source_mandatory = ["Material Issue", "Material Transfer", "Subcontract", "Material Transfer for Manufacture", + source_mandatory = ["Material Issue", "Material Transfer", "Send to Subcontractor", "Material Transfer for Manufacture", "Material Consumption for Manufacture", "Send to Warehouse", "Receive at Warehouse"] - target_mandatory = ["Material Receipt", "Material Transfer", "Subcontract", + target_mandatory = ["Material Receipt", "Material Transfer", "Send to Subcontractor", "Material Transfer for Manufacture", "Send to Warehouse", "Receive at Warehouse"] validate_for_manufacture_repack = any([d.bom_no for d in self.get("items")]) @@ -502,7 +502,7 @@ class StockEntry(StockController): backflush_raw_materials_based_on = frappe.db.get_single_value("Buying Settings", "backflush_raw_materials_of_subcontract_based_on") - if (self.purpose == "Subcontract" and self.purchase_order and + if (self.purpose == "Send to Subcontractor" and self.purchase_order and backflush_raw_materials_based_on == 'BOM'): purchase_order = frappe.get_doc("Purchase Order", self.purchase_order) for se_item in self.items: @@ -538,7 +538,7 @@ class StockEntry(StockController): "overproduction_percentage_for_work_order")) for d in self.get('items'): - 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): + if self.purpose != "Send to Subcontractor" 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)) @@ -738,7 +738,7 @@ class StockEntry(StockController): if self.bom_no: if self.purpose in ["Material Issue", "Material Transfer", "Manufacture", "Repack", - "Subcontract", "Material Transfer for Manufacture", "Material Consumption for Manufacture"]: + "Send to Subcontractor", "Material Transfer for Manufacture", "Material Consumption for Manufacture"]: if self.work_order and self.purpose == "Material Transfer for Manufacture": item_dict = self.get_pending_raw_materials() @@ -764,7 +764,7 @@ class StockEntry(StockController): item_dict = self.get_bom_raw_materials(self.fg_completed_qty) #Get PO Supplied Items Details - if self.purchase_order and self.purpose == "Subcontract": + if self.purchase_order and self.purpose == "Send to Subcontractor": #Get PO Supplied Items Details item_wh = frappe._dict(frappe.db.sql(""" select rm_item_code, reserve_warehouse @@ -776,13 +776,13 @@ class StockEntry(StockController): if self.pro_doc and (cint(self.pro_doc.from_wip_warehouse) or not self.pro_doc.skip_transfer): item["from_warehouse"] = self.pro_doc.wip_warehouse #Get Reserve Warehouse from PO - if self.purchase_order and self.purpose=="Subcontract": + if self.purchase_order and self.purpose=="Send to Subcontractor": item["from_warehouse"] = item_wh.get(item.item_code) - item["to_warehouse"] = self.to_warehouse if self.purpose=="Subcontract" else "" + item["to_warehouse"] = self.to_warehouse if self.purpose=="Send to Subcontractor" else "" self.add_to_stock_entry_detail(item_dict) - if self.purpose != "Subcontract": + if self.purpose != "Send to Subcontractor": scrap_item_dict = self.get_bom_scrap_material(self.fg_completed_qty) for item in itervalues(scrap_item_dict): if self.pro_doc and self.pro_doc.scrap_warehouse: @@ -1116,7 +1116,7 @@ class StockEntry(StockController): frappe.MappingMismatchError) def validate_batch(self): - if self.purpose in ["Material Transfer for Manufacture", "Manufacture", "Repack", "Subcontract", "Material Issue"]: + if self.purpose in ["Material Transfer for Manufacture", "Manufacture", "Repack", "Send to Subcontractor", "Material Issue"]: for item in self.get("items"): if item.batch_no: disabled = frappe.db.get_value("Batch", item.batch_no, "disabled") @@ -1349,7 +1349,7 @@ def get_used_alternative_items(purchase_order=None, work_order=None): cond = "" if purchase_order: - cond = "and ste.purpose = 'Subcontract' and ste.purchase_order = '{0}'".format(purchase_order) + cond = "and ste.purpose = 'Send to Subcontractor' and ste.purchase_order = '{0}'".format(purchase_order) elif work_order: cond = "and ste.purpose = 'Material Transfer for Manufacture' and ste.work_order = '{0}'".format(work_order) diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js index 131d3ca1de..770f886d04 100644 --- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js +++ b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js @@ -6,7 +6,7 @@ QUnit.test("test material Transfer to manufacture", function(assert) { frappe.run_serially([ () => { return frappe.tests.make('Stock Entry', [ - {purpose:'Subcontract'}, + {purpose:'Send to Subcontractor'}, {from_warehouse:'Work In Progress - '+frappe.get_abbr(frappe.defaults.get_default('Company'))}, {to_warehouse:'Finished Goods - '+frappe.get_abbr(frappe.defaults.get_default('Company'))}, {items: [ diff --git a/erpnext/stock/doctype/stock_entry_type/stock_entry_type.json b/erpnext/stock/doctype/stock_entry_type/stock_entry_type.json index 11188c6dc3..edee3c7dc9 100644 --- a/erpnext/stock/doctype/stock_entry_type/stock_entry_type.json +++ b/erpnext/stock/doctype/stock_entry_type/stock_entry_type.json @@ -35,7 +35,7 @@ "label": "Purpose", "length": 0, "no_copy": 0, - "options": "\nMaterial Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSubcontract\nSend to Warehouse\nReceive at Warehouse", + "options": "\nMaterial Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSend to Subcontractor\nSend to Warehouse\nReceive at Warehouse", "permlevel": 0, "precision": "", "print_hide": 0, @@ -60,7 +60,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2019-03-25 19:30:42.144377", + "modified": "2019-03-26 12:02:42.144377", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry Type", diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py index 618fd152ff..c5cf6c4243 100644 --- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py @@ -59,7 +59,7 @@ def get_consumed_items(condition): sum(se_item.transfer_qty) as 'consume_qty' from `tabStock Entry` se, `tabStock Entry Detail` se_item where se.name = se_item.parent and se.docstatus = 1 - and (ifnull(se_item.t_warehouse, '') = '' or se.purpose = 'Subcontract') %s + and (ifnull(se_item.t_warehouse, '') = '' or se.purpose = 'Send to Subcontractor') %s group by se_item.item_code""" % (condition), as_dict=1) cn_items_map = {}