diff --git a/production/doctype/bom_replace_tool/__init__.py b/production/doctype/bom_replace_tool/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/production/doctype/bom_replace_tool/bom_replace_tool.js b/production/doctype/bom_replace_tool/bom_replace_tool.js
new file mode 100644
index 0000000000..60e88848c9
--- /dev/null
+++ b/production/doctype/bom_replace_tool/bom_replace_tool.js
@@ -0,0 +1,25 @@
+// ERPNext - web based ERP (http://erpnext.com)
+// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+
+cur_frm.set_query("current_bom", function(doc) {
+ return erpnext.queries.bom({name: "!" + doc.new_bom});
+});
+
+
+cur_frm.set_query("new_bom", function(doc) {
+ return erpnext.queries.bom({name: "!" + doc.current_bom});
+});
\ No newline at end of file
diff --git a/production/doctype/bom_replace_tool/bom_replace_tool.py b/production/doctype/bom_replace_tool/bom_replace_tool.py
new file mode 100644
index 0000000000..d9d9598424
--- /dev/null
+++ b/production/doctype/bom_replace_tool/bom_replace_tool.py
@@ -0,0 +1,56 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes.utils import cstr, flt
+from webnotes.model.code import get_obj
+from webnotes import msgprint
+
+class DocType:
+ def __init__( self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
+
+ def replace_bom(self):
+ self.validate_bom()
+ self.update_new_bom()
+ bom_list = self.get_parent_boms()
+ for bom in bom_list:
+ bom_obj = get_obj("BOM", bom, with_children=1)
+ bom_obj.update_cost_by_traversing()
+ bom_obj.update_flat_bom_by_traversing()
+
+ def validate_bom(self):
+ if cstr(self.doc.current_bom) == cstr(self.doc.new_bom):
+ msgprint("Current BOM and New BOM can not be same", raise_exception=1)
+
+ def update_new_bom(self):
+ current_bom_unitcost = webnotes.conn.sql("""select total_cost/quantity
+ from `tabBOM` where name = %s""", self.doc.current_bom)
+ current_bom_unitcost = current_bom_unitcost and flt(current_bom_unitcost[0][0]) or 0
+ webnotes.conn.sql("""update `tabBOM Item` set bom_no=%s,
+ rate=%s, amount=qty*%s where bom_no = %s and docstatus < 2""",
+ (self.doc.new_bom, current_bom_unitcost, current_bom_unitcost, self.doc.current_bom))
+
+ def get_parent_boms(bom_no):
+ return [d[0] for d in webnotes.conn.sql("""select distinct parent from
+ `tabBOM Item` where ifnull(bom_no, '')=%s and docstatus < 2""", bom_no)]
+
+ def get_parent_boms(self):
+ return [d[0] for d in webnotes.conn.sql("""select distinct parent
+ from `tabBOM Item` where ifnull(bom_no, '') = %s and docstatus < 2""",
+ self.doc.new_bom)]
\ No newline at end of file
diff --git a/production/doctype/bom_replace_tool/bom_replace_tool.txt b/production/doctype/bom_replace_tool/bom_replace_tool.txt
new file mode 100644
index 0000000000..bb2c56b3f8
--- /dev/null
+++ b/production/doctype/bom_replace_tool/bom_replace_tool.txt
@@ -0,0 +1,78 @@
+[
+ {
+ "owner": "Administrator",
+ "docstatus": 0,
+ "creation": "2012-12-06 12:10:10",
+ "modified_by": "Administrator",
+ "modified": "2012-12-06 12:32:22"
+ },
+ {
+ "in_create": 1,
+ "allow_print": 1,
+ "module": "Production",
+ "document_type": "Other",
+ "description": "Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM",
+ "read_only": 1,
+ "allow_email": 1,
+ "hide_heading": 1,
+ "issingle": 1,
+ "name": "__common__",
+ "doctype": "DocType",
+ "hide_toolbar": 1,
+ "allow_copy": 1
+ },
+ {
+ "name": "__common__",
+ "parent": "BOM Replace Tool",
+ "doctype": "DocField",
+ "parenttype": "DocType",
+ "permlevel": 0,
+ "parentfield": "fields"
+ },
+ {
+ "parent": "BOM Replace Tool",
+ "read": 1,
+ "name": "__common__",
+ "create": 1,
+ "doctype": "DocPerm",
+ "write": 1,
+ "parenttype": "DocType",
+ "role": "Administrator",
+ "permlevel": 0,
+ "parentfield": "permissions"
+ },
+ {
+ "name": "BOM Replace Tool",
+ "doctype": "DocType"
+ },
+ {
+ "description": "The BOM which will be replaced",
+ "colour": "White:FFF",
+ "doctype": "DocField",
+ "label": "Current BOM",
+ "fieldname": "current_bom",
+ "fieldtype": "Link",
+ "reqd": 1,
+ "options": "BOM"
+ },
+ {
+ "description": "The new BOM after replacement",
+ "colour": "White:FFF",
+ "doctype": "DocField",
+ "label": "New BOM",
+ "fieldname": "new_bom",
+ "fieldtype": "Link",
+ "reqd": 1,
+ "options": "BOM"
+ },
+ {
+ "doctype": "DocField",
+ "label": "Replace",
+ "fieldname": "replace",
+ "fieldtype": "Button",
+ "options": "replace_bom"
+ },
+ {
+ "doctype": "DocPerm"
+ }
+]
\ No newline at end of file