[feature] Ability to set UOM as Integer-only and related validations.
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py
index aa82492..4a4a3f2 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -58,6 +58,7 @@
 		self.check_for_acc_head_of_supplier()
 		self.check_for_stopped_status()
 		self.validate_with_previous_doc()
+		self.validate_uom_is_integer("uom", "qty")
 
 		if not self.doc.is_opening:
 			self.doc.is_opening = 'No'
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index 3859595..ceab40a 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -60,6 +60,8 @@
 		self.so_dn_required()
 		self.validate_proj_cust()
 		self.validate_with_previous_doc()
+		self.validate_uom_is_integer("stock_uom", "qty")
+
 		sales_com_obj = get_obj('Sales Common')
 		sales_com_obj.check_stop_sales_order(self)
 		sales_com_obj.check_active_sales_items(self)
diff --git a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt
index 03b9f8b..057f166 100644
--- a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt
+++ b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-06-04 11:02:19", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:19", 
+  "modified": "2013-07-25 16:32:10", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -107,9 +107,10 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_list_view": 0, 
   "label": "UOM", 
+  "options": "UOM", 
   "read_only": 1
  }, 
  {
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index e2d7a45..af61c69 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -58,6 +58,9 @@
 		pc_obj.get_prevdoc_date(self)
 		self.check_for_stopped_status(pc_obj)
 
+		self.validate_uom_is_integer("uom", "qty")
+		self.validate_uom_is_integer("stock_uom", ["qty", "required_qty"])
+
 		self.validate_with_previous_doc()
 		self.validate_for_subcontracting()
 		self.update_raw_materials_supplied("po_raw_material_details")
diff --git a/buying/doctype/purchase_order_item/purchase_order_item.txt b/buying/doctype/purchase_order_item/purchase_order_item.txt
index c7233d0..85abcb9 100755
--- a/buying/doctype/purchase_order_item/purchase_order_item.txt
+++ b/buying/doctype/purchase_order_item/purchase_order_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:06", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:14", 
+  "modified": "2013-07-25 16:32:51", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -265,12 +265,13 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "hidden": 0, 
   "in_list_view": 0, 
   "label": "Stock UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "print_hide": 1, 
   "print_width": "100px", 
   "read_only": 1, 
diff --git a/buying/doctype/purchase_order_item_supplied/purchase_order_item_supplied.txt b/buying/doctype/purchase_order_item_supplied/purchase_order_item_supplied.txt
index 1d91aa3..05ea4e2 100644
--- a/buying/doctype/purchase_order_item_supplied/purchase_order_item_supplied.txt
+++ b/buying/doctype/purchase_order_item_supplied/purchase_order_item_supplied.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-02-22 01:27:42", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:15", 
+  "modified": "2013-07-25 16:33:05", 
   "modified_by": "Administrator", 
   "owner": "dhanalekshmi@webnotestech.com"
  }, 
@@ -111,10 +111,11 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "label": "Stock Uom", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "read_only": 1
  }
 ]
\ No newline at end of file
diff --git a/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.txt b/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.txt
index 0ee20a5..1522510 100644
--- a/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.txt
+++ b/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-02-22 01:27:42", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:17", 
+  "modified": "2013-07-25 16:34:11", 
   "modified_by": "Administrator", 
   "owner": "wasim@webnotestech.com"
  }, 
@@ -130,10 +130,11 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "label": "Stock Uom", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "read_only": 1
  }, 
  {
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.py b/buying/doctype/supplier_quotation/supplier_quotation.py
index ae3fbd3..61b8411 100644
--- a/buying/doctype/supplier_quotation/supplier_quotation.py
+++ b/buying/doctype/supplier_quotation/supplier_quotation.py
@@ -36,6 +36,7 @@
 		
 		self.validate_common()
 		self.validate_with_previous_doc()
+		self.validate_uom_is_integer("uom", "qty")
 
 	def on_submit(self):
 		purchase_controller = webnotes.get_obj("Purchase Common")
diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py
index abefb9b..4e850ff 100644
--- a/controllers/accounts_controller.py
+++ b/controllers/accounts_controller.py
@@ -20,7 +20,7 @@
 from webnotes.utils import flt, cint, today, cstr
 from setup.utils import get_company_currency, get_price_list_currency
 from accounts.utils import get_fiscal_year, validate_fiscal_year
-from utilities.transaction_base import TransactionBase, validate_conversion_rate
+from utilities.transaction_base import TransactionBase, validate_conversion_rate, validate_uom_is_integer
 import json
 
 class AccountsController(TransactionBase):
@@ -28,7 +28,6 @@
 		self.set_missing_values(for_validate=True)
 		
 		self.validate_date_with_fiscal_year()
-		
 		if self.meta.get_field("currency"):
 			self.calculate_taxes_and_totals()
 			self.validate_value("grand_total", ">=", 0)
diff --git a/controllers/selling_controller.py b/controllers/selling_controller.py
index 2cd1be2..60cb43c 100644
--- a/controllers/selling_controller.py
+++ b/controllers/selling_controller.py
@@ -210,7 +210,7 @@
 						
 			item.export_amount = flt(item.export_rate * item.qty,
 				self.precision("export_amount", item))
-				
+
 			self._set_in_company_currency(item, "ref_rate", "base_ref_rate")
 			self._set_in_company_currency(item, "export_rate", "basic_rate")
 			self._set_in_company_currency(item, "export_amount", "amount")
diff --git a/manufacturing/doctype/bom/bom.py b/manufacturing/doctype/bom/bom.py
index 94f3d20..1dfb746 100644
--- a/manufacturing/doctype/bom/bom.py
+++ b/manufacturing/doctype/bom/bom.py
@@ -43,6 +43,10 @@
 	def validate(self):
 		self.clear_operations()
 		self.validate_main_item()
+
+		from utilities.transaction_base import validate_uom_is_integer
+		validate_uom_is_integer(self.doclist, "stock_uom", "qty")
+
 		self.validate_operations()
 		self.validate_materials()
 		self.set_bom_material_details()
diff --git a/manufacturing/doctype/bom/test_bom.py b/manufacturing/doctype/bom/test_bom.py
index cb91e78..bc99b89 100644
--- a/manufacturing/doctype/bom/test_bom.py
+++ b/manufacturing/doctype/bom/test_bom.py
@@ -36,7 +36,7 @@
 			"qty": 1.0, 
 			"rate": 5000.0, 
 			"amount": 5000.0, 
-			"stock_uom": "No."
+			"stock_uom": "_Test UOM"
 		}, 
 		{
 			"doctype": "BOM Item", 
@@ -45,7 +45,7 @@
 			"qty": 2.0, 
 			"rate": 1000.0,
 			"amount": 2000.0,
-			"stock_uom": "No."
+			"stock_uom": "_Test UOM"
 		}
 	]
 ]
\ No newline at end of file
diff --git a/manufacturing/doctype/bom_item/bom_item.txt b/manufacturing/doctype/bom_item/bom_item.txt
index a41ab65..e498c71 100644
--- a/manufacturing/doctype/bom_item/bom_item.txt
+++ b/manufacturing/doctype/bom_item/bom_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-02-22 01:27:49", 
   "docstatus": 0, 
-  "modified": "2013-07-22 15:28:20", 
+  "modified": "2013-07-25 16:34:42", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -75,11 +75,12 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_list_view": 0, 
   "label": "Stock UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "read_only": 1, 
   "reqd": 1
  }, 
diff --git a/manufacturing/doctype/production_order/production_order.py b/manufacturing/doctype/production_order/production_order.py
index 95a8272..625e567 100644
--- a/manufacturing/doctype/production_order/production_order.py
+++ b/manufacturing/doctype/production_order/production_order.py
@@ -23,8 +23,6 @@
 
 sql = webnotes.conn.sql
 
-	
-
 class DocType:
 	def __init__(self, doc, doclist=[]):
 		self.doc = doc
@@ -57,7 +55,10 @@
 				msgprint("Sales Order: %s is not valid" % self.doc.sales_order, raise_exception=1)
 				
 			self.validate_production_order_against_so()
-				
+
+		from utilities.transaction_base import validate_uom_is_integer
+		validate_uom_is_integer(self.doclist, "stock_uom", ["qty", "produced_qty"])
+
 	
 	def validate_production_order_against_so(self):
 		# already ordered qty
diff --git a/manufacturing/doctype/production_order/production_order.txt b/manufacturing/doctype/production_order/production_order.txt
index 6e5e379..c546692 100644
--- a/manufacturing/doctype/production_order/production_order.txt
+++ b/manufacturing/doctype/production_order/production_order.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:16", 
   "docstatus": 0, 
-  "modified": "2013-07-11 15:51:37", 
+  "modified": "2013-07-25 16:38:37", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -35,6 +35,7 @@
   "permlevel": 0, 
   "read": 1, 
   "report": 1, 
+  "role": "Manufacturing User", 
   "submit": 1, 
   "write": 1
  }, 
@@ -219,10 +220,11 @@
   "depends_on": "production_item", 
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "label": "Stock UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "read_only": 1
  }, 
  {
@@ -247,15 +249,6 @@
   "read_only": 1
  }, 
  {
-  "doctype": "DocPerm", 
-  "role": "System Manager"
- }, 
- {
-  "doctype": "DocPerm", 
-  "role": "Manufacturing Manager"
- }, 
- {
-  "doctype": "DocPerm", 
-  "role": "Manufacturing User"
+  "doctype": "DocPerm"
  }
 ]
\ No newline at end of file
diff --git a/manufacturing/doctype/production_plan_item/production_plan_item.txt b/manufacturing/doctype/production_plan_item/production_plan_item.txt
index 37f56c9..c4a5c23 100644
--- a/manufacturing/doctype/production_plan_item/production_plan_item.txt
+++ b/manufacturing/doctype/production_plan_item/production_plan_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-02-22 01:27:49", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:12", 
+  "modified": "2013-07-25 16:35:27", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -92,11 +92,12 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_list_view": 0, 
   "label": "UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "print_width": "80px", 
   "read_only": 1, 
   "reqd": 1, 
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 26644ad..966fc53 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -185,6 +185,9 @@
 		self.validate_company()
 		self.validate_data()
 
+		from utilities.transaction_base import validate_uom_is_integer
+		validate_uom_is_integer(self.doclist, "stock_uom", "planned_qty")
+
 		items = self.get_distinct_items_and_boms()[1]
 		pro = self.create_production_order(items)
 		if pro:
diff --git a/selling/doctype/opportunity/opportunity.py b/selling/doctype/opportunity/opportunity.py
index f31d533..e48fff9 100644
--- a/selling/doctype/opportunity/opportunity.py
+++ b/selling/doctype/opportunity/opportunity.py
@@ -24,6 +24,7 @@
 sql = webnotes.conn.sql
 	
 from utilities.transaction_base import TransactionBase
+
 class DocType(TransactionBase):
 	def __init__(self,doc,doclist):
 		self.doc = doc
@@ -138,6 +139,7 @@
 	def validate(self):
 		self.set_last_contact_date()
 		self.validate_item_details()
+		self.validate_uom_is_integer("uom", "qty")
 		self.validate_lead_cust()
 		
 		from accounts.utils import validate_fiscal_year
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index 1b286d1..abb1a1c 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -135,6 +135,9 @@
 		self.set_last_contact_date()
 		self.validate_order_type()
 		self.validate_for_items()
+
+		self.validate_uom_is_integer("stock_uom", "qty")
+
 		sales_com_obj = get_obj('Sales Common')
 		sales_com_obj.check_active_sales_items(self)
 		sales_com_obj.validate_max_discount(self,'quotation_details')
diff --git a/selling/doctype/quotation_item/quotation_item.txt b/selling/doctype/quotation_item/quotation_item.txt
index 32b8421..32a97c8 100644
--- a/selling/doctype/quotation_item/quotation_item.txt
+++ b/selling/doctype/quotation_item/quotation_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-03-07 11:42:57", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:18", 
+  "modified": "2013-07-25 16:35:50", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -110,11 +110,12 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_list_view": 0, 
   "label": "UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "print_hide": 0, 
   "print_width": "100px", 
   "read_only": 1, 
diff --git a/selling/doctype/sales_bom/sales_bom.py b/selling/doctype/sales_bom/sales_bom.py
index 13f68aa..43ab040 100644
--- a/selling/doctype/sales_bom/sales_bom.py
+++ b/selling/doctype/sales_bom/sales_bom.py
@@ -31,6 +31,9 @@
 		self.check_duplicate()
 		self.validate_main_item()
 
+		from utilities.transaction_base import validate_uom_is_integer
+		validate_uom_is_integer(self.doclist, "uom", "qty")
+
 	def validate_main_item(self):
 		"""main item must have Is Stock Item as No and Is Sales Item as Yes"""
 		if not webnotes.conn.sql("""select name from tabItem where name=%s and
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index fb04714..55abf9d 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -139,6 +139,7 @@
 		self.validate_mandatory()
 		self.validate_proj_cust()
 		self.validate_po()
+		self.validate_uom_is_integer("stock_uom", "qty")
 		
 		if self.doc.docstatus == 1:
 			self.validate_for_items()
diff --git a/selling/doctype/sales_order_item/sales_order_item.txt b/selling/doctype/sales_order_item/sales_order_item.txt
index 84e44b0..3211b2e 100644
--- a/selling/doctype/sales_order_item/sales_order_item.txt
+++ b/selling/doctype/sales_order_item/sales_order_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-03-07 11:42:58", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:21", 
+  "modified": "2013-07-25 16:36:10", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -104,12 +104,13 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "hidden": 0, 
   "in_list_view": 0, 
   "label": "UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "print_width": "70px", 
   "read_only": 1, 
   "reqd": 0, 
diff --git a/setup/doctype/uom/uom.txt b/setup/doctype/uom/uom.txt
index 0837558..6577f6c 100644
--- a/setup/doctype/uom/uom.txt
+++ b/setup/doctype/uom/uom.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:24", 
   "docstatus": 0, 
-  "modified": "2013-07-23 12:03:54", 
+  "modified": "2013-07-25 16:18:17", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -23,6 +23,7 @@
   "permlevel": 0
  }, 
  {
+  "amend": 0, 
   "doctype": "DocPerm", 
   "name": "__common__", 
   "parent": "UOM", 
@@ -30,7 +31,8 @@
   "parenttype": "DocType", 
   "permlevel": 0, 
   "read": 1, 
-  "report": 1
+  "report": 1, 
+  "submit": 0
  }, 
  {
   "doctype": "DocType", 
@@ -62,34 +64,31 @@
   "reqd": 1
  }, 
  {
-  "amend": 0, 
+  "description": "Check this to disallow fractions. (for Nos)", 
+  "doctype": "DocField", 
+  "fieldname": "must_be_whole_number", 
+  "fieldtype": "Check", 
+  "label": "Must be Whole Number"
+ }, 
+ {
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
   "role": "Material Master Manager", 
-  "submit": 0, 
   "write": 1
  }, 
  {
-  "amend": 0, 
   "cancel": 0, 
   "create": 0, 
   "doctype": "DocPerm", 
   "role": "Material Manager", 
-  "submit": 0, 
   "write": 0
  }, 
  {
-  "amend": 0, 
   "cancel": 0, 
   "create": 0, 
   "doctype": "DocPerm", 
   "role": "Material User", 
-  "submit": 0, 
   "write": 0
- }, 
- {
-  "doctype": "DocPerm", 
-  "role": "All"
  }
 ]
\ No newline at end of file
diff --git a/startup/install.py b/startup/install.py
index 896a6cd..9408c61 100644
--- a/startup/install.py
+++ b/startup/install.py
@@ -151,13 +151,13 @@
 		{'doctype': 'Sales Person', 'sales_person_name': 'Sales Team', 'is_group': "Yes", "parent_sales_person": ""},
 		
 		# UOM
-		{'uom_name': 'Unit', 'doctype': 'UOM', 'name': 'Unit'}, 
-		{'uom_name': 'Box', 'doctype': 'UOM', 'name': 'Box'}, 
+		{'uom_name': 'Unit', 'doctype': 'UOM', 'name': 'Unit', "must_be_whole_number": 1}, 
+		{'uom_name': 'Box', 'doctype': 'UOM', 'name': 'Box', "must_be_whole_number": 1}, 
 		{'uom_name': 'Kg', 'doctype': 'UOM', 'name': 'Kg'}, 
-		{'uom_name': 'Nos', 'doctype': 'UOM', 'name': 'Nos'}, 
-		{'uom_name': 'Pair', 'doctype': 'UOM', 'name': 'Pair'}, 
-		{'uom_name': 'Set', 'doctype': 'UOM', 'name': 'Set'}, 
-		{'uom_name': 'Hour', 'doctype': 'UOM', 'name': 'Hour'}, 
+		{'uom_name': 'Nos', 'doctype': 'UOM', 'name': 'Nos', "must_be_whole_number": 1}, 
+		{'uom_name': 'Pair', 'doctype': 'UOM', 'name': 'Pair', "must_be_whole_number": 1}, 
+		{'uom_name': 'Set', 'doctype': 'UOM', 'name': 'Set', "must_be_whole_number": 1}, 
+		{'uom_name': 'Hour', 'doctype': 'UOM', 'name': 'Hour'},
 		{'uom_name': 'Minute', 'doctype': 'UOM', 'name': 'Minute'}, 
 	]
 	
diff --git a/stock/doctype/bin/bin.txt b/stock/doctype/bin/bin.txt
index 676976a..1455fa6 100644
--- a/stock/doctype/bin/bin.txt
+++ b/stock/doctype/bin/bin.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:25", 
   "docstatus": 0, 
-  "modified": "2013-07-10 18:32:13", 
+  "modified": "2013-07-25 16:36:35", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -146,11 +146,12 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_filter": 1, 
   "label": "UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "search_index": 0
  }, 
  {
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 8cd5756..f7283eb 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -99,6 +99,7 @@
 		sales_com_obj.get_prevdoc_date(self)
 		self.validate_for_items()
 		self.validate_warehouse()
+		self.validate_uom_is_integer("stock_uom", "qty")
 		
 		sales_com_obj.validate_max_discount(self, 'delivery_note_details')
 		sales_com_obj.check_conversion_rate(self)
diff --git a/stock/doctype/delivery_note/test_delivery_note.py b/stock/doctype/delivery_note/test_delivery_note.py
index f4b9bbb..eac140d 100644
--- a/stock/doctype/delivery_note/test_delivery_note.py
+++ b/stock/doctype/delivery_note/test_delivery_note.py
@@ -141,7 +141,7 @@
 			"export_rate": 100.0,
 			"amount": 500.0,
 			"warehouse": "_Test Warehouse - _TC",
-			"stock_uom": "No."
+			"stock_uom": "_Test UOM"
 		}
 	]
 	
diff --git a/stock/doctype/delivery_note_item/delivery_note_item.txt b/stock/doctype/delivery_note_item/delivery_note_item.txt
index 346673f..8f133d2 100644
--- a/stock/doctype/delivery_note_item/delivery_note_item.txt
+++ b/stock/doctype/delivery_note_item/delivery_note_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-04-22 13:15:44", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:07", 
+  "modified": "2013-07-25 16:37:09", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -111,11 +111,12 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_list_view": 0, 
   "label": "UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "print_hide": 0, 
   "print_width": "50px", 
   "read_only": 1, 
diff --git a/stock/doctype/material_request/material_request.py b/stock/doctype/material_request/material_request.py
index 0830fd4..86de99e 100644
--- a/stock/doctype/material_request/material_request.py
+++ b/stock/doctype/material_request/material_request.py
@@ -60,6 +60,7 @@
 		super(DocType, self).validate()
 		
 		self.validate_schedule_date()
+		self.validate_uom_is_integer("uom", "qty")
 		
 		if not self.doc.status:
 			self.doc.status = "Draft"
diff --git a/stock/doctype/packing_slip/packing_slip.py b/stock/doctype/packing_slip/packing_slip.py
index 63aa6a9..9a0da82 100644
--- a/stock/doctype/packing_slip/packing_slip.py
+++ b/stock/doctype/packing_slip/packing_slip.py
@@ -37,6 +37,10 @@
 		self.validate_case_nos()
 		self.validate_qty()
 
+		from utilities.transaction_base import validate_uom_is_integer
+		validate_uom_is_integer(self.doclist, "stock_uom", "qty")
+		validate_uom_is_integer(self.doclist, "weight_uom", "net_weight")
+
 	def validate_delivery_note(self):
 		"""
 			Validates if delivery note has status as draft
diff --git a/stock/doctype/packing_slip_item/packing_slip_item.txt b/stock/doctype/packing_slip_item/packing_slip_item.txt
index 8dea877..41dd044 100644
--- a/stock/doctype/packing_slip_item/packing_slip_item.txt
+++ b/stock/doctype/packing_slip_item/packing_slip_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-04-08 13:10:16", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:11", 
+  "modified": "2013-07-25 16:37:30", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -61,9 +61,10 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_list_view": 0, 
   "label": "UOM", 
+  "options": "UOM", 
   "print_width": "100px", 
   "read_only": 1, 
   "width": "100px"
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 89a40e7..744130a 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -120,7 +120,10 @@
 
 		self.validate_with_previous_doc()
 		self.validate_accepted_rejected_qty()
-		self.validate_inspection()						 # Validate Inspection
+		self.validate_inspection()
+		self.validate_uom_is_integer("uom", ["qty", "received_qty"])
+		self.validate_uom_is_integer("stock_uom", "stock_qty")
+
 		get_obj('Stock Ledger').validate_serial_no(self, 'purchase_receipt_details')
 		self.validate_challan_no()
 
diff --git a/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt b/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt
index 60b1b56..913cdf5 100755
--- a/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt
+++ b/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:10", 
   "docstatus": 0, 
-  "modified": "2013-07-10 14:54:16", 
+  "modified": "2013-07-25 16:30:24", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -267,11 +267,12 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "in_list_view": 0, 
   "label": "Stock UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "print_hide": 1, 
   "print_width": "100px", 
   "read_only": 1, 
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index d389620..58f17c7 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -49,6 +49,9 @@
 			get_obj('Production Order', self.doc.production_order) or None
 
 		self.validate_item()
+		self.validate_uom_is_integer("uom", "qty")
+		self.validate_uom_is_integer("stock_uom", "transfer_qty")
+
 		self.validate_warehouse(pro_obj)
 		self.validate_production_order(pro_obj)
 		self.get_stock_and_rate()
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
index 6ca9cc6..5b65e97 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-29 19:25:42", 
   "docstatus": 0, 
-  "modified": "2013-07-10 18:34:09", 
+  "modified": "2013-07-25 16:39:10", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -181,10 +181,11 @@
  {
   "doctype": "DocField", 
   "fieldname": "stock_uom", 
-  "fieldtype": "Data", 
+  "fieldtype": "Link", 
   "label": "Stock UOM", 
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
+  "options": "UOM", 
   "print_width": "150px", 
   "read_only": 1, 
   "width": "150px"
diff --git a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
index f353629..7e5d972 100644
--- a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
+++ b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
@@ -17,15 +17,13 @@
 from __future__ import unicode_literals
 import webnotes
 
-from webnotes.utils import cstr, flt, now
+from webnotes.utils import cstr, flt, now, cint
 from webnotes.model import db_exists
 from webnotes.model.bean import copy_doclist
 from webnotes.model.code import get_obj
 from webnotes import msgprint
 
 sql = webnotes.conn.sql
-	
-
 
 class DocType:
 	def __init__(self, d, dl=[]):
@@ -97,7 +95,8 @@
 	def update_stock_uom(self):
 		# validate mandatory
 		self.validate_mandatory()
-		
+		self.validate_uom_integer_type()
+			
 		# update item master
 		self.update_item_master()
 		
@@ -108,6 +107,19 @@
 		self.update_bin()
 
 		get_obj("Item", self.doc.item_code).on_update()
+		
+	def validate_uom_integer_type(self):
+		current_is_integer = webnotes.conn.get_value("UOM", self.doc.current_stock_uom, "must_be_whole_number")
+		new_is_integer = webnotes.conn.get_value("UOM", self.doc.new_stock_uom, "must_be_whole_number")
+		
+		if current_is_integer and not new_is_integer:
+			webnotes.msgprint("New UOM must be of type Whole Number", raise_exception=True)
+
+		if not current_is_integer and new_is_integer:
+			webnotes.msgprint("New UOM must NOT be of type Whole Number", raise_exception=True)
+
+		if current_is_integer and new_is_integer and cint(self.doc.conversion_factor)!=self.doc.conversion_factor:
+			webnotes.msgprint("Conversion Factor cannot be fraction", raise_exception=True)
 
 @webnotes.whitelist()
 def get_stock_uom(item_code):
diff --git a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.txt b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.txt
index d820b01..6862a86 100644
--- a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.txt
+++ b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:30", 
   "docstatus": 0, 
-  "modified": "2013-07-05 14:56:45", 
+  "modified": "2013-07-25 17:39:14", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -64,18 +64,18 @@
  }, 
  {
   "doctype": "DocField", 
+  "fieldname": "conversion_factor", 
+  "fieldtype": "Float", 
+  "label": "Conversion Factor"
+ }, 
+ {
+  "doctype": "DocField", 
   "fieldname": "update", 
   "fieldtype": "Button", 
   "label": "Update", 
   "options": "update_stock_uom"
  }, 
  {
-  "doctype": "DocField", 
-  "fieldname": "conversion_factor", 
-  "fieldtype": "Float", 
-  "label": "Conversion Factor"
- }, 
- {
   "doctype": "DocPerm", 
   "role": "Material Master Manager"
  }, 
diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py
index 2900bf6..e980236 100644
--- a/utilities/transaction_base.py
+++ b/utilities/transaction_base.py
@@ -17,7 +17,7 @@
 from __future__ import unicode_literals
 import webnotes
 from webnotes import msgprint, _
-from webnotes.utils import load_json, cstr, flt, now_datetime
+from webnotes.utils import load_json, cstr, flt, now_datetime, cint
 from webnotes.model.doc import addchild
 
 from controllers.status_updater import StatusUpdater
@@ -276,6 +276,9 @@
 			
 			webnotes.bean(event_doclist).insert()
 			
+	def validate_uom_is_integer(self, uom_field, qty_fields):
+		validate_uom_is_integer(self.doclist, uom_field, qty_fields)
+			
 	def validate_with_previous_doc(self, source_dt, ref):
 		for key, val in ref.items():
 			is_child = val.get("is_child_table")
@@ -482,3 +485,23 @@
 def delete_events(ref_type, ref_name):
 	webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent` 
 		where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
+
+def validate_uom_is_integer(doclist, uom_field, qty_fields):
+	if isinstance(qty_fields, basestring):
+		qty_fields = [qty_fields]
+	
+	integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom, 
+		"must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
+		
+	if not integer_uoms:
+		return
+
+	for d in doclist:
+		if d.fields.get(uom_field) in integer_uoms:
+			for f in qty_fields:
+				if d.fields.get(f):
+					if cint(d.fields[f])!=d.fields[f]:
+						webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
+							+ "': " + _("Quantity cannot be a fraction.") \
+							+ " " + _("In Row") + ": " + str(d.idx),
+							raise_exception=True)