Merge branch 'hotfix'
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 26dca9a..e6c50b5 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
 from erpnext.hooks import regional_overrides
 from frappe.utils import getdate
 
-__version__ = '10.0.3'
+__version__ = '10.0.4'
 
 def get_default_company(user=None):
 	'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 07c136b..07853d0 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -277,6 +277,8 @@
 						.format(item.purchase_receipt))
 
 	def on_submit(self):
+		super(PurchaseInvoice, self).on_submit()
+
 		self.check_prev_docstatus()
 		self.update_status_updater_args()
 
@@ -606,6 +608,8 @@
 			))
 
 	def on_cancel(self):
+		super(PurchaseInvoice, self).on_cancel()
+
 		self.check_for_closed_status()
 
 		self.update_status_updater_args()
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index fac70aa..df65ef9 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -11,8 +11,7 @@
 from erpnext.stock.doctype.item.item import get_last_purchase_details
 from erpnext.stock.stock_balance import update_bin_qty, get_ordered_qty
 from frappe.desk.notifications import clear_doctype_notifications
-from erpnext.buying.utils import (validate_for_items, check_for_closed_status,
-	update_last_purchase_rate)
+from erpnext.buying.utils import validate_for_items, check_for_closed_status
 
 
 form_grid_templates = {
@@ -189,6 +188,8 @@
 		clear_doctype_notifications(self)
 
 	def on_submit(self):
+		super(PurchaseOrder, self).on_submit()
+
 		if self.is_against_so():
 			self.update_status_updater()
 
@@ -199,9 +200,9 @@
 		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
 			self.company, self.base_grand_total)
 
-		update_last_purchase_rate(self, is_submit = 1)
-
 	def on_cancel(self):
+		super(PurchaseOrder, self).on_cancel()
+
 		if self.is_against_so():
 			self.update_status_updater()
 
@@ -218,8 +219,6 @@
 		self.update_requested_qty()
 		self.update_ordered_qty()
 
-		update_last_purchase_rate(self, is_submit = 0)
-
 	def on_update(self):
 		pass
 
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index fcf6a80..e450f0b 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -8,7 +8,7 @@
 
 from erpnext.accounts.party import get_party_details
 from erpnext.stock.get_item_details import get_conversion_factor
-from erpnext.buying.utils import validate_for_items
+from erpnext.buying.utils import validate_for_items, update_last_purchase_rate
 from erpnext.stock.stock_ledger import get_valuation_rate
 
 from erpnext.controllers.stock_controller import StockController
@@ -409,6 +409,18 @@
 					"actual_qty": -1*flt(d.consumed_qty),
 				}))
 
+	def on_submit(self):
+		if self.get('is_return'):
+			return
+
+		update_last_purchase_rate(self, is_submit = 1)
+
+	def on_cancel(self):
+		if self.get('is_return'):
+			return
+
+		update_last_purchase_rate(self, is_submit = 0)
+
 	def validate_schedule_date(self):
 		if not self.schedule_date:
 			self.schedule_date = min([d.schedule_date for d in self.get("items")])
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js
index fb7ced9..8a86668 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.js
+++ b/erpnext/manufacturing/doctype/production_order/production_order.js
@@ -226,6 +226,7 @@
 				args: { production_item: frm.doc.production_item },
 				callback: function(r) {
 					frm.set_query("sales_order", function() {
+						erpnext.in_production_item_onchange = true;
 						return {
 							filters: [
 								["Sales Order","name", "in", r.message]
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index e8f3997..5976915 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -478,7 +478,7 @@
 erpnext.patches.v9_2.delete_process_payroll
 erpnext.patches.v10_0.add_agriculture_domain
 erpnext.patches.v10_0.add_non_profit_domain
-erpnext.patches.v10_0.setup_vat_for_uae_and_saudi_arabia #2017-12-27
+erpnext.patches.v10_0.setup_vat_for_uae_and_saudi_arabia #2017-12-28
 erpnext.patches.v10_0.set_primary_contact_for_customer
 erpnext.patches.v10_0.copy_projects_renamed_fields
 erpnext.patches.v10_0.enabled_regional_print_format_based_on_country
diff --git a/erpnext/regional/united_arab_emirates/setup.py b/erpnext/regional/united_arab_emirates/setup.py
index f88c32f..aa27d61 100644
--- a/erpnext/regional/united_arab_emirates/setup.py
+++ b/erpnext/regional/united_arab_emirates/setup.py
@@ -56,8 +56,11 @@
 		dict(fieldname='total_amount', label='Total Amount',
 			fieldtype='Currency', insert_after='tax_amount',
 			print_hide=1, hidden=1, read_only=1, options="currency"),
+	]
+
+	delivery_date_field = [
 		dict(fieldname='delivery_date', label='Delivery Date',
-			fieldtype='Date', insert_after='item_name', print_hide=1),
+			fieldtype='Date', insert_after='item_name', print_hide=1)
 	]
 
 	custom_fields = {
@@ -74,9 +77,19 @@
 				fieldtype='Data', insert_after='supplier_name'),
 		],
 		'Purchase Invoice': purchase_invoice_fields + invoice_fields,
+		'Purchase Order': purchase_invoice_fields + invoice_fields,
+		'Purchase Receipt': purchase_invoice_fields + invoice_fields,
 		'Sales Invoice': sales_invoice_fields + invoice_fields,
-		'Sales Invoice Item': invoice_item_fields,
-		'Purchase Invoice Item': invoice_item_fields
+		'Sales Order': sales_invoice_fields + invoice_fields,
+		'Delivery Note': sales_invoice_fields + invoice_fields,
+		'Sales Invoice Item': invoice_item_fields + delivery_date_field,
+		'Purchase Invoice Item': invoice_item_fields,
+		'Sales Order Item': invoice_item_fields,
+		'Delivery Note Item': invoice_item_fields,
+		'Quotation Item': invoice_item_fields,
+		'Purchase Order Item': invoice_item_fields,
+		'Purchase Receipt Item': invoice_item_fields,
+		'Supplier Quotation Item': invoice_item_fields,
 	}
 
 	create_custom_fields(custom_fields)
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index e49f993..29f3553 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -12,7 +12,7 @@
 from erpnext.controllers.buying_controller import BuyingController
 from erpnext.accounts.utils import get_account_currency
 from frappe.desk.notifications import clear_doctype_notifications
-from erpnext.buying.utils import check_for_closed_status, update_last_purchase_rate
+from erpnext.buying.utils import check_for_closed_status
 
 form_grid_templates = {
 	"items": "templates/form_grid/item_grid.html"
@@ -111,6 +111,8 @@
 
 	# on submit
 	def on_submit(self):
+		super(PurchaseReceipt, self).on_submit()
+
 		# Check for Approving Authority
 		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
 			self.company, self.base_grand_total)
@@ -119,9 +121,6 @@
 		if self.per_billed < 100:
 			self.update_billing_status()
 
-		if not self.is_return:
-			update_last_purchase_rate(self, 1)
-
 		# Updating stock ledger should always be called after updating prevdoc status,
 		# because updating ordered qty in bin depends upon updated ordered qty in PO
 		self.update_stock_ledger()
@@ -140,6 +139,8 @@
 			frappe.throw(_("Purchase Invoice {0} is already submitted").format(self.submit_rv[0][0]))
 
 	def on_cancel(self):
+		super(PurchaseReceipt, self).on_cancel()
+
 		self.check_for_closed_status()
 		# Check if Purchase Invoice has been submitted against current Purchase Order
 		submitted = frappe.db.sql("""select t1.name
@@ -152,9 +153,6 @@
 		self.update_prevdoc_status()
 		self.update_billing_status()
 
-		if not self.is_return:
-			update_last_purchase_rate(self, 0)
-
 		# Updating stock ledger should always be called after updating prevdoc status,
 		# because updating ordered qty in bin depends upon updated ordered qty in PO
 		self.update_stock_ledger()