diff --git a/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt b/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt
index e58f738..4bb3141 100644
--- a/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt
+++ b/erpnext/accounts/DocType Mapper/Purchase Order-Payable Voucher/Purchase Order-Payable Voucher.txt
@@ -5,145 +5,145 @@
 	{
 		'creation': '2010-08-08 17:09:35',
 		'docstatus': 0,
-		'modified': '2011-10-12 12:10:15',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
+		'modified': '2012-02-06 15:25:06',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
 	},
 
 	# These values are common for all Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
+		'doctype': u'Table Mapper Detail',
 		'name': '__common__',
-		'parent': 'Purchase Order-Payable Voucher',
-		'parentfield': 'table_mapper_details',
-		'parenttype': 'DocType Mapper'
+		'parent': u'Purchase Order-Payable Voucher',
+		'parentfield': u'table_mapper_details',
+		'parenttype': u'DocType Mapper'
 	},
 
 	# These values are common for all Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
+		'doctype': u'Field Mapper Detail',
 		'name': '__common__',
-		'parent': 'Purchase Order-Payable Voucher',
-		'parentfield': 'field_mapper_details',
-		'parenttype': 'DocType Mapper'
+		'parent': u'Purchase Order-Payable Voucher',
+		'parentfield': u'field_mapper_details',
+		'parenttype': u'DocType Mapper'
 	},
 
 	# These values are common for all DocType Mapper
 	{
 		'doctype': u'DocType Mapper',
-		'from_doctype': 'Purchase Order',
-		'module': 'Accounts',
+		'from_doctype': u'Purchase Order',
+		'module': u'Accounts',
 		'name': '__common__',
 		'ref_doc_submitted': 1,
-		'to_doctype': 'Payable Voucher'
+		'to_doctype': u'Payable Voucher'
 	},
 
 	# DocType Mapper, Purchase Order-Payable Voucher
 	{
 		'doctype': u'DocType Mapper',
-		'name': 'Purchase Order-Payable Voucher'
+		'name': u'Purchase Order-Payable Voucher'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'eval: flt(obj.qty) - flt(obj.billed_qty)',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'eval: flt(obj.qty) - flt(obj.billed_qty)',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'qty'
+		'to_field': u'qty'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'purchase_rate',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'purchase_rate',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'rate'
+		'to_field': u'rate'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'amount'
+		'to_field': u'amount'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'import_amount'
+		'to_field': u'import_amount'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'parent',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'parent',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'purchase_order'
+		'to_field': u'purchase_order'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'name',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'name',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'po_detail'
+		'to_field': u'po_detail'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'naming_series',
-		'map': 'No',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'naming_series',
+		'map': u'No',
 		'match_id': 0,
-		'to_field': 'naming_series'
+		'to_field': u'naming_series'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'total_tax',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'total_tax',
+		'map': u'Yes',
 		'match_id': 0,
-		'to_field': 'total_tax'
+		'to_field': u'total_tax'
 	},
 
 	# Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
-		'from_table': 'Purchase Order',
+		'doctype': u'Table Mapper Detail',
+		'from_table': u'Purchase Order',
 		'match_id': 0,
-		'to_table': 'Payable Voucher',
-		'validation_logic': 'docstatus =1'
+		'to_table': u'Payable Voucher',
+		'validation_logic': u'docstatus =1'
 	},
 
 	# Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
-		'from_field': 'po_details',
-		'from_table': 'PO Detail',
+		'doctype': u'Table Mapper Detail',
+		'from_field': u'po_details',
+		'from_table': u'PO Detail',
 		'match_id': 1,
-		'to_field': 'entries',
-		'to_table': 'PV Detail',
-		'validation_logic': 'ifnull(billed_qty,0)  < qty and docstatus = 1'
+		'to_field': u'entries',
+		'to_table': u'PV Detail',
+		'validation_logic': u'ifnull(billed_qty,0)  < qty and docstatus = 1'
 	},
 
 	# Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
-		'from_field': 'purchase_tax_details',
-		'from_table': 'Purchase Tax Detail',
+		'doctype': u'Table Mapper Detail',
+		'from_field': u'purchase_tax_details',
+		'from_table': u'Purchase Tax Detail',
 		'match_id': 2,
-		'to_field': 'purchase_tax_details',
-		'to_table': 'Purchase Tax Detail',
-		'validation_logic': 'docstatus =1'
+		'to_field': u'purchase_tax_details',
+		'to_table': u'Purchase Tax Detail',
+		'validation_logic': u'docstatus =1'
 	}
 ]
\ No newline at end of file
diff --git a/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt b/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt
index 1744c4d..ffc748b 100644
--- a/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt
+++ b/erpnext/accounts/DocType Mapper/Purchase Receipt-Payable Voucher/Purchase Receipt-Payable Voucher.txt
@@ -5,181 +5,181 @@
 	{
 		'creation': '2010-08-08 17:09:35',
 		'docstatus': 0,
-		'modified': '2011-10-12 10:49:26',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
+		'modified': '2012-02-06 15:26:25',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
 	},
 
 	# These values are common for all Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
+		'doctype': u'Table Mapper Detail',
 		'name': '__common__',
-		'parent': 'Purchase Receipt-Payable Voucher',
-		'parentfield': 'table_mapper_details',
-		'parenttype': 'DocType Mapper'
+		'parent': u'Purchase Receipt-Payable Voucher',
+		'parentfield': u'table_mapper_details',
+		'parenttype': u'DocType Mapper'
 	},
 
 	# These values are common for all Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
+		'doctype': u'Field Mapper Detail',
 		'name': '__common__',
-		'parent': 'Purchase Receipt-Payable Voucher',
-		'parentfield': 'field_mapper_details',
-		'parenttype': 'DocType Mapper'
+		'parent': u'Purchase Receipt-Payable Voucher',
+		'parentfield': u'field_mapper_details',
+		'parenttype': u'DocType Mapper'
 	},
 
 	# These values are common for all DocType Mapper
 	{
 		'doctype': u'DocType Mapper',
-		'from_doctype': 'Purchase Receipt',
-		'module': 'Accounts',
+		'from_doctype': u'Purchase Receipt',
+		'module': u'Accounts',
 		'name': '__common__',
 		'ref_doc_submitted': 1,
-		'to_doctype': 'Payable Voucher'
+		'to_doctype': u'Payable Voucher'
 	},
 
 	# DocType Mapper, Purchase Receipt-Payable Voucher
 	{
 		'doctype': u'DocType Mapper',
-		'name': 'Purchase Receipt-Payable Voucher'
+		'name': u'Purchase Receipt-Payable Voucher'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'eval: flt(obj.qty) - flt(obj.billed_qty)',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'eval: flt(obj.qty) - flt(obj.billed_qty)',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'qty'
+		'to_field': u'qty'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'purchase_rate',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'purchase_rate',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'rate'
+		'to_field': u'rate'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.purchase_rate)',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'amount'
+		'to_field': u'amount'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'eval: (flt(obj.qty) - flt(obj.billed_qty)) * flt(obj.import_rate)',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'import_amount'
+		'to_field': u'import_amount'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'parent',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'parent',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'purchase_receipt'
+		'to_field': u'purchase_receipt'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'prevdoc_docname',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'prevdoc_docname',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'purchase_order'
+		'to_field': u'purchase_order'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'name',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'name',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'pr_detail'
+		'to_field': u'pr_detail'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'prevdoc_detail_docname',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'prevdoc_detail_docname',
+		'map': u'Yes',
 		'match_id': 1,
-		'to_field': 'po_detail'
+		'to_field': u'po_detail'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'naming_series',
-		'map': 'No',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'naming_series',
+		'map': u'No',
 		'match_id': 0,
-		'to_field': 'naming_series'
+		'to_field': u'naming_series'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'net_total',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'net_total',
+		'map': u'Yes',
 		'match_id': 0,
-		'to_field': 'net_total'
+		'to_field': u'net_total'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'grand_total',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'grand_total',
+		'map': u'Yes',
 		'match_id': 0,
-		'to_field': 'grand_total'
+		'to_field': u'grand_total'
 	},
 
 	# Field Mapper Detail
 	{
-		'doctype': 'Field Mapper Detail',
-		'from_field': 'total_tax',
-		'map': 'Yes',
+		'doctype': u'Field Mapper Detail',
+		'from_field': u'total_tax',
+		'map': u'Yes',
 		'match_id': 0,
-		'to_field': 'total_tax'
+		'to_field': u'total_tax'
 	},
 
 	# Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
-		'from_field': 'purchase_receipt_details',
-		'from_table': 'Purchase Receipt Detail',
+		'doctype': u'Table Mapper Detail',
+		'from_field': u'purchase_receipt_details',
+		'from_table': u'Purchase Receipt Detail',
 		'match_id': 1,
-		'to_field': 'entries',
-		'to_table': 'PV Detail',
-		'validation_logic': 'ifnull(billed_qty,0)  < qty'
+		'to_field': u'entries',
+		'to_table': u'PV Detail',
+		'validation_logic': u'ifnull(billed_qty,0)  < qty'
 	},
 
 	# Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
-		'from_table': 'Purchase Receipt',
+		'doctype': u'Table Mapper Detail',
+		'from_table': u'Purchase Receipt',
 		'match_id': 0,
-		'to_table': 'Payable Voucher',
-		'validation_logic': 'docstatus=1'
+		'to_table': u'Payable Voucher',
+		'validation_logic': u'docstatus=1'
 	},
 
 	# Table Mapper Detail
 	{
-		'doctype': 'Table Mapper Detail',
-		'from_field': 'purchase_tax_details',
-		'from_table': 'Purchase Tax Detail',
+		'doctype': u'Table Mapper Detail',
+		'from_field': u'purchase_tax_details',
+		'from_table': u'Purchase Tax Detail',
 		'match_id': 2,
-		'to_field': 'purchase_tax_details',
-		'to_table': 'Purchase Tax Detail',
-		'validation_logic': 'docstatus=1'
+		'to_field': u'purchase_tax_details',
+		'to_table': u'Purchase Tax Detail',
+		'validation_logic': u'docstatus=1'
 	}
 ]
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
index 99fb10a..b63f448 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
@@ -1,156 +1,177 @@
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
-  var cp = locals['Control Panel']['Control Panel'];
-  
-  if (!doc.voucher_date) doc.voucher_date = dateutil.obj_to_str(new Date());
+	var cp = locals['Control Panel']['Control Panel'];
+	
+	if (!doc.voucher_date) doc.voucher_date = dateutil.obj_to_str(new Date());
 
-  if(cp.country == 'India') {
-    unhide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']);
-  }
-  else {
-    hide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']);
-  }
+	if(cp.country == 'India') {
+		unhide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']);
+	}
+	else {
+		hide_field(['tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','supplier_account']);
+	}
+
+	cur_frm.cscript.load_defaults(doc, cdt, cdn);
+
 }
 
+
+cur_frm.cscript.load_defaults = function(doc, cdt, cdn) {
+	if(!cur_frm.doc.__islocal || !cur_frm.doc.company) { return; }
+
+	doc = locals[doc.doctype][doc.name];
+	var fields_to_refresh = LocalDB.set_default_values(doc);
+	if(fields_to_refresh) { refresh_many(fields_to_refresh); }
+
+	fields_to_refresh = null;
+	var children = getchildren('Journal Voucher Detail', doc.name, 'entries');
+	if(!children) { return; }
+	for(var i=0; i<children.length; i++) {
+		LocalDB.set_default_values(children[i]);
+	}
+	refresh_field('entries');
+}
+
+
 cur_frm.cscript.is_opening = function(doc, cdt, cdn) {
-  hide_field('aging_date');
-  if (doc.is_opening == 'Yes') unhide_field('aging_date');
-  
-  if(doc.docstatus==1) { unhide_field('View Ledger Entry'); }
-  else hide_field('View Ledger Entry');
+	hide_field('aging_date');
+	if (doc.is_opening == 'Yes') unhide_field('aging_date');
+	
+	if(doc.docstatus==1) { unhide_field('View Ledger Entry'); }
+	else hide_field('View Ledger Entry');
 }
 
 cur_frm.cscript.refresh = cur_frm.cscript.is_opening;
 
 cur_frm.fields_dict['entries'].grid.get_field('account').get_query = function(doc) {
-  return "SELECT `tabAccount`.name FROM `tabAccount` WHERE `tabAccount`.company='"+doc.company+"' AND tabAccount.group_or_ledger = 'Ledger' AND tabAccount.docstatus != 2 AND `tabAccount`.%(key)s LIKE '%s' ORDER BY `tabAccount`.name DESC LIMIT 50";
+	return "SELECT `tabAccount`.name FROM `tabAccount` WHERE `tabAccount`.company='"+doc.company+"' AND tabAccount.group_or_ledger = 'Ledger' AND tabAccount.docstatus != 2 AND `tabAccount`.%(key)s LIKE '%s' ORDER BY `tabAccount`.name DESC LIMIT 50";
 }
 
 cur_frm.fields_dict["entries"].grid.get_field("cost_center").get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.docstatus != 2 ORDER BY  `tabCost Center`.`name` ASC LIMIT 50';
+	return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.docstatus != 2 ORDER BY	`tabCost Center`.`name` ASC LIMIT 50';
 }
 
 // Restrict Voucher based on Account
 // ---------------------------------
 cur_frm.fields_dict['entries'].grid.get_field('against_voucher').get_query = function(doc) {
-  var d = locals[this.doctype][this.docname];
-  return "SELECT `tabPayable Voucher`.name, `tabPayable Voucher`.credit_to, `tabPayable Voucher`.outstanding_amount,`tabPayable Voucher`.bill_no, `tabPayable Voucher`.bill_date FROM `tabPayable Voucher` WHERE `tabPayable Voucher`.credit_to='"+d.account+"' AND `tabPayable Voucher`.outstanding_amount > 0 AND `tabPayable Voucher`.docstatus = 1 AND `tabPayable Voucher`.%(key)s LIKE '%s' ORDER BY `tabPayable Voucher`.name DESC LIMIT 200";
+	var d = locals[this.doctype][this.docname];
+	return "SELECT `tabPayable Voucher`.name, `tabPayable Voucher`.credit_to, `tabPayable Voucher`.outstanding_amount,`tabPayable Voucher`.bill_no, `tabPayable Voucher`.bill_date FROM `tabPayable Voucher` WHERE `tabPayable Voucher`.credit_to='"+d.account+"' AND `tabPayable Voucher`.outstanding_amount > 0 AND `tabPayable Voucher`.docstatus = 1 AND `tabPayable Voucher`.%(key)s LIKE '%s' ORDER BY `tabPayable Voucher`.name DESC LIMIT 200";
 }
 
 cur_frm.fields_dict['entries'].grid.get_field('against_invoice').get_query = function(doc) {
-  var d = locals[this.doctype][this.docname];
-  return "SELECT `tabReceivable Voucher`.name, `tabReceivable Voucher`.debit_to, `tabReceivable Voucher`.outstanding_amount FROM `tabReceivable Voucher` WHERE `tabReceivable Voucher`.debit_to='"+d.account+"' AND `tabReceivable Voucher`.outstanding_amount > 0 AND `tabReceivable Voucher`.docstatus = 1 AND `tabReceivable Voucher`.%(key)s LIKE '%s' ORDER BY `tabReceivable Voucher`.name DESC LIMIT 200";
+	var d = locals[this.doctype][this.docname];
+	return "SELECT `tabReceivable Voucher`.name, `tabReceivable Voucher`.debit_to, `tabReceivable Voucher`.outstanding_amount FROM `tabReceivable Voucher` WHERE `tabReceivable Voucher`.debit_to='"+d.account+"' AND `tabReceivable Voucher`.outstanding_amount > 0 AND `tabReceivable Voucher`.docstatus = 1 AND `tabReceivable Voucher`.%(key)s LIKE '%s' ORDER BY `tabReceivable Voucher`.name DESC LIMIT 200";
 }
 
 // TDS Account Head
 cur_frm.fields_dict['tax_code'].get_query = function(doc) {
-  return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50";
+	return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50";
 }
 
 //Set debit and credit to zero on adding new row
 //----------------------------------------------
 cur_frm.fields_dict['entries'].grid.onrowadd = function(doc, cdt, cdn){
-  var d = locals[cdt][cdn];
-  if(d.idx == 1){
-    d.debit = 0;
-    d.credit = 0;
-  }
+	var d = locals[cdt][cdn];
+	if(d.idx == 1){
+		d.debit = 0;
+		d.credit = 0;
+	}
 }
 
 // Get Outstanding of Payable & Receivable Voucher
 // -----------------------------------------------
 
 cur_frm.cscript.against_voucher = function(doc,cdt,cdn) {
-  var d = locals[cdt][cdn];
-  if (d.against_voucher && !flt(d.debit)) {
-    args = {'doctype': 'Payable Voucher', 'docname': d.against_voucher }
-    get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
-  }
+	var d = locals[cdt][cdn];
+	if (d.against_voucher && !flt(d.debit)) {
+		args = {'doctype': 'Payable Voucher', 'docname': d.against_voucher }
+		get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
+	}
 }
 
 cur_frm.cscript.against_invoice = function(doc,cdt,cdn) {
-  var d = locals[cdt][cdn];
-  if (d.against_invoice && !flt(d.credit)) {
-    args = {'doctype': 'Receivable Voucher', 'docname': d.against_invoice }
-    get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
-  }
+	var d = locals[cdt][cdn];
+	if (d.against_invoice && !flt(d.credit)) {
+		args = {'doctype': 'Receivable Voucher', 'docname': d.against_invoice }
+		get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
+	}
 }
 
 
 // Update Totals
 // ---------------
 cur_frm.cscript.update_totals = function(doc) {
-  var td=0.0; var tc =0.0;
-  var el = getchildren('Journal Voucher Detail', doc.name, 'entries');
-  for(var i in el) {
-    td += flt(el[i].debit);
-    tc += flt(el[i].credit);
-  }
-  var doc = locals[doc.doctype][doc.name];
-  tc += flt(doc.ded_amount)
-  doc.total_debit = td;
-  doc.total_credit = tc;
-  doc.difference = flt(td - tc);
-  refresh_many(['total_debit','total_credit','difference']);
+	var td=0.0; var tc =0.0;
+	var el = getchildren('Journal Voucher Detail', doc.name, 'entries');
+	for(var i in el) {
+		td += flt(el[i].debit);
+		tc += flt(el[i].credit);
+	}
+	var doc = locals[doc.doctype][doc.name];
+	tc += flt(doc.ded_amount)
+	doc.total_debit = td;
+	doc.total_credit = tc;
+	doc.difference = flt(td - tc);
+	refresh_many(['total_debit','total_credit','difference']);
 }
 
 cur_frm.cscript.debit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); }
 cur_frm.cscript.credit = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); }
 cur_frm.cscript.ded_amount = function(doc,dt,dn) { cur_frm.cscript.update_totals(doc); }
 cur_frm.cscript.rate = function(doc,dt,dn) {
-  doc.ded_amount = doc.total_debit*doc.rate/100;
-  refresh_field('ded_amount');
-  cur_frm.cscript.update_totals(doc); 
+	doc.ded_amount = doc.total_debit*doc.rate/100;
+	refresh_field('ded_amount');
+	cur_frm.cscript.update_totals(doc); 
 }
 cur_frm.cscript['Get Balance'] = function(doc,dt,dn) {
-  cur_frm.cscript.update_totals(doc); 
-  $c_obj(make_doclist(dt,dn), 'get_balance', '', function(r, rt){
-  cur_frm.refresh();
-  });
+	cur_frm.cscript.update_totals(doc); 
+	$c_obj(make_doclist(dt,dn), 'get_balance', '', function(r, rt){
+	cur_frm.refresh();
+	});
 }
 // Get balance
 // -----------
 
 cur_frm.cscript.account = function(doc,dt,dn) {
-  var d = locals[dt][dn];
-  $c_obj('GL Control','get_bal',d.account+'~~~'+doc.fiscal_year, function(r,rt) { d.balance = r.message; refresh_field('balance',d.name,'entries'); });
+	var d = locals[dt][dn];
+	$c_obj('GL Control','get_bal',d.account+'~~~'+doc.fiscal_year, function(r,rt) { d.balance = r.message; refresh_field('balance',d.name,'entries'); });
 } 
 
 cur_frm.cscript.validate = function(doc,cdt,cdn) {
-  cur_frm.cscript.update_totals(doc);
+	cur_frm.cscript.update_totals(doc);
 }
 
 // TDS
 // --------
 cur_frm.cscript['Get TDS'] = function(doc, dt, dn) {
-  $c_obj(make_doclist(dt,dn), 'get_tds', '', function(r, rt){
-    cur_frm.refresh();
-    cur_frm.cscript.update_totals(doc);
-  });
+	$c_obj(make_doclist(dt,dn), 'get_tds', '', function(r, rt){
+		cur_frm.refresh();
+		cur_frm.cscript.update_totals(doc);
+	});
 }
 
 // ***************** Get Print Heading based on Receivable Voucher *****************
 cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
+	return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
 }
 
 
 
 cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){
-  if(doc.select_print_heading){
-    // print heading
-    cur_frm.pformat.print_heading = doc.select_print_heading;
-  }
-  else
-    cur_frm.pformat.print_heading = "Journal Voucher";
+	if(doc.select_print_heading){
+		// print heading
+		cur_frm.pformat.print_heading = doc.select_print_heading;
+	}
+	else
+		cur_frm.pformat.print_heading = "Journal Voucher";
 }
 
 /****************** Get Accounting Entry *****************/
 cur_frm.cscript['View Ledger Entry'] = function(doc,cdt,cdn){
-  var callback = function(report){
-    report.set_filter('GL Entry', 'Voucher No',doc.name);
-    report.dt.run();
-  }
-  loadreport('GL Entry','General Ledger', callback);
+	var callback = function(report){
+		report.set_filter('GL Entry', 'Voucher No',doc.name);
+		report.dt.run();
+	}
+	loadreport('GL Entry','General Ledger', callback);
 }
 
 
diff --git a/erpnext/accounts/doctype/payable_voucher/payable_voucher.js b/erpnext/accounts/doctype/payable_voucher/payable_voucher.js
index b3cbd63..44dea8a 100644
--- a/erpnext/accounts/doctype/payable_voucher/payable_voucher.js
+++ b/erpnext/accounts/doctype/payable_voucher/payable_voucher.js
@@ -7,99 +7,102 @@
 // On Load
 // --------
 cur_frm.cscript.onload = function(doc,dt,dn) {
-  var cp = locals['Control Panel']['Control Panel'];
-  
-  if(!doc.voucher_date) set_multiple(dt,dn,{voucher_date:get_today()});
-  if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()});  
+	var cp = locals['Control Panel']['Control Panel'];
+	
+	if(!doc.voucher_date) set_multiple(dt,dn,{voucher_date:get_today()});
+	if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()});	
 
-  if(cp.country == 'India') {
-    unhide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']);
-  }
-  else {
-    hide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']);
-  }  
-  
-  if(doc.__islocal){
-    hide_field(['supplier_address', 'contact_person', 'supplier_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email']);
-  }
+	if(cp.country == 'India') {
+		unhide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']);
+	}
+	else {
+		hide_field(['TDS','tds_applicable','tds_category','Get TDS','tax_code','rate','ded_amount','total_tds_on_voucher','tds_amount_on_advance']);
+	}	
+	
+	if(doc.__islocal){
+		hide_field(['supplier_address', 'contact_person', 'supplier_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email']);
+	}
+	
+	// defined in purchase_common.js
+	cur_frm.cscript.update_item_details(doc, cdt, cdn);
 }
 
 
 //Onload post render
 //------------------------
 cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
-  if(doc.__islocal && doc.supplier) cur_frm.cscript.supplier(doc,dt,dn);
+	if(doc.__islocal && doc.supplier) cur_frm.cscript.supplier(doc,dt,dn);
 }
 
 // Refresh
 // --------
 cur_frm.cscript.refresh = function(doc, dt, dn) {
-  
-  cur_frm.clear_custom_buttons();
+	
+	cur_frm.clear_custom_buttons();
 
-  // Show / Hide button
-  if(doc.docstatus==1 && doc.outstanding_amount > 0)
-    cur_frm.add_custom_button('Make Payment Entry', cur_frm.cscript['Make Bank Voucher']);
-  
-  if(doc.docstatus==1) { 
-    unhide_field(['Repair Outstanding Amt']); 
-    cur_frm.add_custom_button('View Ledger', cur_frm.cscript['View Ledger Entry']);
-  } else hide_field(['Repair Outstanding Amt']);
-  
-  cur_frm.cscript.is_opening(doc, dt, dn);
+	// Show / Hide button
+	if(doc.docstatus==1 && doc.outstanding_amount > 0)
+		cur_frm.add_custom_button('Make Payment Entry', cur_frm.cscript['Make Bank Voucher']);
+	
+	if(doc.docstatus==1) { 
+		unhide_field(['Repair Outstanding Amt']); 
+		cur_frm.add_custom_button('View Ledger', cur_frm.cscript['View Ledger Entry']);
+	} else hide_field(['Repair Outstanding Amt']);
+	
+	cur_frm.cscript.is_opening(doc, dt, dn);
 }
 
 
 //Supplier
 cur_frm.cscript.supplier = function(doc,dt,dn) {
-  var callback = function(r,rt) {
-      var doc = locals[cur_frm.doctype][cur_frm.docname];    
-      get_server_fields('get_credit_to','','',doc, dt, dn, 0, callback2);
-  }
-  
-  var callback2 = function(r,rt){
-    var doc = locals[cur_frm.doctype][cur_frm.docname];    
-    var el = getchildren('PV Detail',doc.name,'entries');
-    for(var i in el){
-      if(el[i].item_code && (!el[i].expense_head || !el[i].cost_center)){
-        args = "{'item_code':'" + el[i].item_code + "','expense_head':'" + el[i].expense_head + "','cost_center':'" + el[i].cost_center + "'}";
-        get_server_fields('get_default_values', args, 'entries', doc, el[i].doctype, el[i].name, 1);
-      }
-    }
-    cur_frm.cscript.calc_amount(doc, 1);
-  }
+	var callback = function(r,rt) {
+			var doc = locals[cur_frm.doctype][cur_frm.docname];		
+			get_server_fields('get_credit_to','','',doc, dt, dn, 0, callback2);
+	}
+	
+	var callback2 = function(r,rt){
+		var doc = locals[cur_frm.doctype][cur_frm.docname];		
+		var el = getchildren('PV Detail',doc.name,'entries');
+		for(var i in el){
+			if(el[i].item_code && (!el[i].expense_head || !el[i].cost_center)){
+				args = "{'item_code':'" + el[i].item_code + "','expense_head':'" + el[i].expense_head + "','cost_center':'" + el[i].cost_center + "'}";
+				get_server_fields('get_default_values', args, 'entries', doc, el[i].doctype, el[i].name, 1);
+			}
+		}
+		cur_frm.cscript.calc_amount(doc, 1);
+	}
 
-  if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1,callback);
-  if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']);
+	if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1,callback);
+	if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']);
 }
 
 cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {
-  if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+	if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 
 
 cur_frm.fields_dict.supplier_address.on_new = function(dn) {
-  locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
-  locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
+	locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
+	locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
 }
 
 cur_frm.fields_dict.contact_person.on_new = function(dn) {
-  locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
-  locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
+	locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
+	locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
 }
 
 
 cur_frm.cscript.credit_to = function(doc,dt,dn) {
 
-  var callback = function(r,rt) {
-      var doc = locals[cur_frm.doctype][cur_frm.docname];    
-      if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
-      if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']);
-      cur_frm.refresh();
-  }
+	var callback = function(r,rt) {
+			var doc = locals[cur_frm.doctype][cur_frm.docname];		
+			if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
+			if(doc.supplier) unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']);
+			cur_frm.refresh();
+	}
 
-  get_server_fields('get_cust','','',doc,dt,dn,1,callback);  
+	get_server_fields('get_cust','','',doc,dt,dn,1,callback);	
 }
 
 
@@ -107,43 +110,43 @@
 //Set expense_head and cost center on adding new row
 //----------------------------------------------
 cur_frm.fields_dict['entries'].grid.onrowadd = function(doc, cdt, cdn){
-  
-  cl = getchildren('PV Detail', doc.name, cur_frm.cscript.fname, doc.doctype);
-  acc = '';
-  cc = '';
+	
+	cl = getchildren('PV Detail', doc.name, cur_frm.cscript.fname, doc.doctype);
+	acc = '';
+	cc = '';
 
-  for(var i = 0; i<cl.length; i++) {
-    if (cl[i].idx == 1){
-      acc = cl[i].expense_head;
-      cc = cl[i].cost_center;
-    }
-    else{
-      if (! cl[i].expense_head) { cl[i].expense_head = acc; refresh_field('expense_head', cl[i].name, 'entries');}
-      if (! cl[i].cost_center)  {cl[i].cost_center = cc; refresh_field('cost_center', cl[i].name, 'entries');}
-    }
-  }
+	for(var i = 0; i<cl.length; i++) {
+		if (cl[i].idx == 1){
+			acc = cl[i].expense_head;
+			cc = cl[i].cost_center;
+		}
+		else{
+			if (! cl[i].expense_head) { cl[i].expense_head = acc; refresh_field('expense_head', cl[i].name, 'entries');}
+			if (! cl[i].cost_center)	{cl[i].cost_center = cc; refresh_field('cost_center', cl[i].name, 'entries');}
+		}
+	}
 }
 
 cur_frm.cscript.is_opening = function(doc, dt, dn) {
-  hide_field('aging_date');
-  if (doc.is_opening == 'Yes') unhide_field('aging_date');
+	hide_field('aging_date');
+	if (doc.is_opening == 'Yes') unhide_field('aging_date');
 }
 
 // Recalculate Button
 // -------------------
 cur_frm.cscript['Recalculate'] = function(doc, dt, dn) {
-  cur_frm.cscript['Calculate Tax'](doc,cdt,cdn);
-  calc_total_advance(doc,cdt,cdn);
+	cur_frm.cscript['Calculate Tax'](doc,cdt,cdn);
+	calc_total_advance(doc,cdt,cdn);
 }
 
 // Get Items Button
 // -----------------
 cur_frm.cscript['Get Items'] = function(doc, dt, dn) {
-  var callback = function(r,rt) { 
-	  unhide_field(['supplier_address', 'contact_person', 'supplier_name', 'address_display', 'contact_display', 'contact_mobile','contact_email']);			  
-	  refresh_many(['credit_to','supplier','supplier_address','contact_person','supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email','entries', 'purchase_receipt_main', 'purchase_order_main', 'purchase_tax_details']);
-  }
-  $c_obj(make_doclist(dt,dn),'pull_details','',callback);
+	var callback = function(r,rt) { 
+		unhide_field(['supplier_address', 'contact_person', 'supplier_name', 'address_display', 'contact_display', 'contact_mobile','contact_email']);				
+		refresh_many(['credit_to','supplier','supplier_address','contact_person','supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email','entries', 'purchase_receipt_main', 'purchase_order_main', 'purchase_tax_details']);
+	}
+	$c_obj(make_doclist(dt,dn),'pull_details','',callback);
 }
 
 // ========== PV Details Table ============
@@ -151,17 +154,17 @@
 // Item Code
 // ----------
 cur_frm.cscript.item_code = function(doc,cdt,cdn){
-  var d = locals[cdt][cdn];
-  if(d.item_code){
-    get_server_fields('get_item_details',d.item_code,'entries',doc,cdt,cdn,1);
-  }
+	var d = locals[cdt][cdn];
+	if(d.item_code){
+		get_server_fields('get_item_details',d.item_code,'entries',doc,cdt,cdn,1);
+	}
 }
 
 // Rate in Deduct Taxes (TDS)
 // --------------------------
 cur_frm.cscript.rate = function(doc,dt,dn) {
-  //This is done as Purchase tax detail and PV detail both contain the same fieldname 'rate'
-  if(dt != 'Purchase Tax Detail')   cur_frm.cscript.calc_amount(doc, 2);
+	//This is done as Purchase tax detail and PV detail both contain the same fieldname 'rate'
+	if(dt != 'Purchase Tax Detail')	 cur_frm.cscript.calc_amount(doc, 2);
 }
 
 // Amount
@@ -171,41 +174,41 @@
 // Get TDS Button
 // ---------------
 cur_frm.cscript['Get TDS'] = function(doc, dt, dn) {
-  var callback = function(r,rt) {
-    cur_frm.refresh();
-    refresh_field('ded_amount');
-    //cur_frm.cscript.calc_total(locals[dt][dn]);
-  }
-  $c_obj(make_doclist(dt,dn), 'get_tds', '', callback);
+	var callback = function(r,rt) {
+		cur_frm.refresh();
+		refresh_field('ded_amount');
+		//cur_frm.cscript.calc_total(locals[dt][dn]);
+	}
+	$c_obj(make_doclist(dt,dn), 'get_tds', '', callback);
 }
 
 // ===================== Advance Allocation ==================
 cur_frm.cscript.allocated_amount = function(doc,cdt,cdn){
-  var d = locals[cdt][cdn];
-  if (d.allocated_amount && d.tds_amount){
-    d.tds_allocated=flt(d.tds_amount*(d.allocated_amount/d.advance_amount))
-    refresh_field('tds_allocated', d.name, 'advance_allocation_details');
-  }
-  tot_tds=0
-  el = getchildren('Advance Allocation Detail',doc.name,'advance_allocation_details')
-  for(var i in el){
-    tot_tds += el[i].tds_allocated
-  }
-  doc.tds_amount_on_advance = tot_tds
-  refresh_field('tds_amount_on_advance');
-  
-  calc_total_advance(doc, cdt, cdn);
+	var d = locals[cdt][cdn];
+	if (d.allocated_amount && d.tds_amount){
+		d.tds_allocated=flt(d.tds_amount*(d.allocated_amount/d.advance_amount))
+		refresh_field('tds_allocated', d.name, 'advance_allocation_details');
+	}
+	tot_tds=0
+	el = getchildren('Advance Allocation Detail',doc.name,'advance_allocation_details')
+	for(var i in el){
+		tot_tds += el[i].tds_allocated
+	}
+	doc.tds_amount_on_advance = tot_tds
+	refresh_field('tds_amount_on_advance');
+	
+	calc_total_advance(doc, cdt, cdn);
 }
 
 
 // Make Journal Voucher
 // --------------------
 cur_frm.cscript['Make Bank Voucher'] = function() {
-  $c('accounts.get_default_bank_account', { company: cur_frm.doc.company }, function(r, rt) {
-    if(!r.exc) {
-      cur_frm.cscript.make_jv(cur_frm.doc, null, null, r.message);
+	$c('accounts.get_default_bank_account', { company: cur_frm.doc.company }, function(r, rt) {
+		if(!r.exc) {
+			cur_frm.cscript.make_jv(cur_frm.doc, null, null, r.message);
 	}
-  });
+	});
 }
 
 
@@ -213,49 +216,49 @@
 
 
 cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 // Item Code
 // ----------
 cur_frm.fields_dict['entries'].grid.get_field("item_code").get_query = function(doc, cdt, cdn) {
-  return 'SELECT tabItem.name, tabItem.description FROM tabItem WHERE tabItem.is_purchase_item="Yes" AND (IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` ="0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50'
+	return 'SELECT tabItem.name, tabItem.description FROM tabItem WHERE tabItem.is_purchase_item="Yes" AND (IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` ="0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50'
 }
 
 // Credit To
 // ----------
 cur_frm.fields_dict['credit_to'].get_query = function(doc) {
-  return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Credit" AND tabAccount.is_pl_account="No" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'
+	return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Credit" AND tabAccount.is_pl_account="No" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'
 }
 
 
 // Purchase Order
 // ---------------
 cur_frm.fields_dict['purchase_order_main'].get_query = function(doc) {
-  if (doc.supplier){
-    return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.supplier = "'+ doc.supplier +'" AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`,0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'
-  } else {
-    return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`, 0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'
-  }
+	if (doc.supplier){
+		return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.supplier = "'+ doc.supplier +'" AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`,0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'
+	} else {
+		return 'SELECT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 AND `tabPurchase Order`.`status` != "Stopped" AND ifnull(`tabPurchase Order`.`per_billed`, 0) < 100 AND `tabPurchase Order`.`company` = "' + doc.company + '" AND `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50'
+	}
 }
 
 // Purchase Receipt
 // -----------------
 cur_frm.fields_dict['purchase_receipt_main'].get_query = function(doc) {
-  if (doc.supplier){
-    return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.supplier = "'+ doc.supplier +'" AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50'
-  } else {
-    return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50'
-  }
+	if (doc.supplier){
+		return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.supplier = "'+ doc.supplier +'" AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50'
+	} else {
+		return 'SELECT `tabPurchase Receipt`.`name` FROM `tabPurchase Receipt` WHERE `tabPurchase Receipt`.`docstatus` = 1 AND `tabPurchase Receipt`.`status` != "Stopped" AND ifnull(`tabPurchase Receipt`.`per_billed`, 0) < 100 AND `tabPurchase Receipt`.`company` = "' + doc.company + '" AND `tabPurchase Receipt`.%(key)s LIKE "%s" ORDER BY `tabPurchase Receipt`.`name` DESC LIMIT 50'
+	}
 }
 
 // Get Print Heading
 cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
+	return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
 }
 
 
@@ -263,45 +266,45 @@
 // Expense Head
 // -------------
 cur_frm.fields_dict['entries'].grid.get_field("expense_head").get_query = function(doc) {
-  return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"';
+	return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"';
 }
 cur_frm.cscript.expense_head = function(doc, cdt, cdn){
-  var d = locals[cdt][cdn];
-  if(d.idx == 1 && d.expense_head){
-    var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype);
-    for(var i = 0; i < cl.length; i++){
-      if(!cl[i].expense_head) cl[i].expense_head = d.expense_head;
-    }
-  }
-  refresh_field('entries');
+	var d = locals[cdt][cdn];
+	if(d.idx == 1 && d.expense_head){
+		var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype);
+		for(var i = 0; i < cl.length; i++){
+			if(!cl[i].expense_head) cl[i].expense_head = d.expense_head;
+		}
+	}
+	refresh_field('entries');
 }
 
 
 // Cost Center
 //-------------
 cur_frm.fields_dict['entries'].grid.get_field("cost_center").get_query = function(doc) {
-  return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.docstatus != 2 ORDER BY  `tabCost Center`.`name` ASC LIMIT 50';
+	return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.docstatus != 2 ORDER BY	`tabCost Center`.`name` ASC LIMIT 50';
 }
 
 cur_frm.cscript.cost_center = function(doc, cdt, cdn){
-  var d = locals[cdt][cdn];
-  if(d.idx == 1 && d.cost_center){
-    var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype);
-    for(var i = 0; i < cl.length; i++){
-      if(!cl[i].cost_center) cl[i].cost_center = d.cost_center;
-    }
-  }
-  refresh_field('entries');
+	var d = locals[cdt][cdn];
+	if(d.idx == 1 && d.cost_center){
+		var cl = getchildren('PV Detail', doc.name, 'entries', doc.doctype);
+		for(var i = 0; i < cl.length; i++){
+			if(!cl[i].cost_center) cl[i].cost_center = d.cost_center;
+		}
+	}
+	refresh_field('entries');
 }
 
 
 // TDS Account Head
 cur_frm.fields_dict['tax_code'].get_query = function(doc) {
-  return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50";
+	return "SELECT `tabTDS Category Account`.account_head FROM `tabTDS Category Account` WHERE `tabTDS Category Account`.parent = '"+doc.tds_category+"' AND `tabTDS Category Account`.company='"+doc.company+"' AND `tabTDS Category Account`.account_head LIKE '%s' ORDER BY `tabTDS Category Account`.account_head DESC LIMIT 50";
 }
 
 cur_frm.cscript.tax_code = function(doc, dt, dn) {
-  get_server_fields('get_tds_rate','','',doc, dt, dn, 0);
+	get_server_fields('get_tds_rate','','',doc, dt, dn, 0);
 }
 
 /* ***************************** UTILITY FUNCTIONS ************************ */
@@ -309,69 +312,69 @@
 // Calculate Advance
 // ------------------
 var calc_total_advance = function(doc,cdt,cdn) {
-  var doc = locals[doc.doctype][doc.name];
-  var el = getchildren('Advance Allocation Detail',doc.name,'advance_allocation_details')
-  var tot_tds=0;
-  var total_advance = 0;
-  for(var i in el) {
-    if (! el[i].allocated_amount == 0) {
-      total_advance += flt(el[i].allocated_amount);
-      tot_tds += flt(el[i].tds_allocated)
-    }
-  }
-  doc.total_amount_to_pay = flt(doc.grand_total) - flt(doc.ded_amount);
-  doc.tds_amount_on_advance = flt(tot_tds);
-  doc.total_advance = flt(total_advance);
-  doc.outstanding_amount = flt(doc.total_amount_to_pay) - flt(total_advance);
-  refresh_many(['total_advance','outstanding_amount','tds_amount_on_advance', 'total_amount_to_pay']);
+	var doc = locals[doc.doctype][doc.name];
+	var el = getchildren('Advance Allocation Detail',doc.name,'advance_allocation_details')
+	var tot_tds=0;
+	var total_advance = 0;
+	for(var i in el) {
+		if (! el[i].allocated_amount == 0) {
+			total_advance += flt(el[i].allocated_amount);
+			tot_tds += flt(el[i].tds_allocated)
+		}
+	}
+	doc.total_amount_to_pay = flt(doc.grand_total) - flt(doc.ded_amount);
+	doc.tds_amount_on_advance = flt(tot_tds);
+	doc.total_advance = flt(total_advance);
+	doc.outstanding_amount = flt(doc.total_amount_to_pay) - flt(total_advance);
+	refresh_many(['total_advance','outstanding_amount','tds_amount_on_advance', 'total_amount_to_pay']);
 }
 
 // Make JV
 // --------
 cur_frm.cscript.make_jv = function(doc, dt, dn, bank_account) {
-  var jv = LocalDB.create('Journal Voucher');
-  jv = locals['Journal Voucher'][jv];
-  jv.voucher_type = 'Bank Voucher';
-  jv.remark = repl('Payment against voucher %(vn)s for %(rem)s', {vn:doc.name, rem:doc.remarks});
-  jv.total_debit = doc.outstanding_amount;
-  jv.total_credit = doc.outstanding_amount;
-  jv.fiscal_year = doc.fiscal_year;
-  jv.company = doc.company;
-  
-  // debit to creditor
-  var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries');
-  d1.account = doc.credit_to;
-  d1.debit = doc.outstanding_amount;
-  d1.against_voucher = doc.name;
-  
-  // credit to bank
-  var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries');
-  d1.account = bank_account;
-  d1.credit = doc.outstanding_amount;
-  
-  loaddoc('Journal Voucher', jv.name);
+	var jv = LocalDB.create('Journal Voucher');
+	jv = locals['Journal Voucher'][jv];
+	jv.voucher_type = 'Bank Voucher';
+	jv.remark = repl('Payment against voucher %(vn)s for %(rem)s', {vn:doc.name, rem:doc.remarks});
+	jv.total_debit = doc.outstanding_amount;
+	jv.total_credit = doc.outstanding_amount;
+	jv.fiscal_year = doc.fiscal_year;
+	jv.company = doc.company;
+	
+	// debit to creditor
+	var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries');
+	d1.account = doc.credit_to;
+	d1.debit = doc.outstanding_amount;
+	d1.against_voucher = doc.name;
+	
+	// credit to bank
+	var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries');
+	d1.account = bank_account;
+	d1.credit = doc.outstanding_amount;
+	
+	loaddoc('Journal Voucher', jv.name);
 }
 
 // ***************** Get project name *****************
 cur_frm.fields_dict['entries'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
+	return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
 }
 
 
 cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){
-  if(doc.select_print_heading){
-    // print heading
-    cur_frm.pformat.print_heading = doc.select_print_heading;
-  }
-  else
-    cur_frm.pformat.print_heading = "Purchase Invoice";
+	if(doc.select_print_heading){
+		// print heading
+		cur_frm.pformat.print_heading = doc.select_print_heading;
+	}
+	else
+		cur_frm.pformat.print_heading = "Purchase Invoice";
 }
 
 /****************** Get Accounting Entry *****************/
 cur_frm.cscript['View Ledger Entry'] = function(){
-  var callback = function(report){
-    report.set_filter('GL Entry', 'Voucher No',cur_frm.doc.name);
-    report.dt.run();
-  }
-  loadreport('GL Entry','General Ledger', callback);
+	var callback = function(report){
+		report.set_filter('GL Entry', 'Voucher No',cur_frm.doc.name);
+		report.dt.run();
+	}
+	loadreport('GL Entry','General Ledger', callback);
 }
diff --git a/erpnext/accounts/doctype/payable_voucher/payable_voucher.py b/erpnext/accounts/doctype/payable_voucher/payable_voucher.py
index a7e128b..e220756 100644
--- a/erpnext/accounts/doctype/payable_voucher/payable_voucher.py
+++ b/erpnext/accounts/doctype/payable_voucher/payable_voucher.py
@@ -92,7 +92,19 @@
 
 	# Get Item Details
 	# -----------------		
-	def get_item_details(self,arg):
+	def get_item_details(self, arg=None):
+		if arg:
+			return self.get_pv_details(arg)
+		else:
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					ret = self.get_pv_details(doc.item_code)
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]
+
+
+	def get_pv_details(self, arg):
 		item_det = sql("select item_name, brand, description, item_group,purchase_account,cost_center from tabItem where name=%s",arg,as_dict=1)
 		tax = sql("select tax_type, tax_rate from `tabItem Tax` where parent = %s" , arg)
 		t = {}
@@ -110,6 +122,8 @@
 			'item_tax_rate'			: str(t)
 		}
 		return ret
+
+
 		
 	# Advance Allocation
 	# -------------------
diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js
index e56b16c..dcd522b 100644
--- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js
+++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js
@@ -25,6 +25,9 @@
 		if(doc.is_pos ==1) cur_frm.cscript.is_pos(doc, dt, dn);
 
  			hide_field(['customer_address', 'contact_person', 'customer_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
+
+		// defined in sales_common.js
+		cur_frm.cscript.update_item_details(doc, cdt, cdn);		
 	}
 }
 
diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
index 87d0373..22294c5 100644
--- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
+++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
@@ -147,8 +147,22 @@
 
 	# Item Details
 	# -------------
-	def get_item_details(self, item_code):
-		ret = get_obj('Sales Common').get_item_details(item_code, self)
+	def get_item_details(self, item_code=None):
+		if item_code:
+			ret = get_obj('Sales Common').get_item_details(item_code, self)
+			return self.get_pos_details(item_code, ret)
+		else:
+			obj = get_obj('Sales Common')
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					ret = obj.get_item_details(doc.item_code, self)
+					ret = self.get_pos_details(item_code, ret)
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]					
+
+
+	def get_pos_details(self, item_code, ret):
 		if item_code and cint(self.doc.is_pos) == 1:
 			dtl = webnotes.conn.sql("select income_account, warehouse, cost_center from `tabPOS Setting` where user = '%s' and company = '%s'" % (session['user'], self.doc.company), as_dict=1)				 
 			if not dtl:
@@ -160,7 +174,8 @@
 				actual_qty = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (item_code, ret['warehouse']))		
 				ret['actual_qty']= actual_qty and flt(actual_qty[0][0]) or 0
 		return ret
- 
+
+
 	# Fetch ref rate from item master as per selected price list
 	def get_adj_percent(self, arg=''):
 		get_obj('Sales Common').get_adj_percent(self)
diff --git a/erpnext/buying/doctype/indent/indent.js b/erpnext/buying/doctype/indent/indent.js
index d9008ba..28c5a5a 100644
--- a/erpnext/buying/doctype/indent/indent.js
+++ b/erpnext/buying/doctype/indent/indent.js
@@ -3,76 +3,78 @@
 
 $import(Purchase Common)
 $import(SMS Control)
-cur_frm.cscript.indent_doctype_label =  get_doctype_label('Indent');
-  
+cur_frm.cscript.indent_doctype_label =	get_doctype_label('Indent');
+	
 //========================== On Load =================================================
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
-  if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date())
-  if (!doc.status) doc.status = 'Draft';
-  
+	if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date())
+	if (!doc.status) doc.status = 'Draft';
+
+	// defined in purchase_common.js
+	//cur_frm.cscript.update_item_details(doc, cdt, cdn);
 }
 
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
-  // second call
-  if(doc.__islocal){ 
-    cur_frm.cscript.get_item_defaults(doc);
-  }	
+	// second call
+	if(doc.__islocal){ 
+		cur_frm.cscript.get_item_defaults(doc);
+	}	
 }
 
 cur_frm.cscript.get_item_defaults = function(doc) {
-    var ch = getchildren( 'Indent Detail', doc.name, 'indent_details');
-    if (flt(ch.length) > 0){
-      $c_obj(make_doclist(doc.doctype, doc.name), 'get_item_defaults', '', function(r, rt) {refresh_field('indent_details'); });
-    }
+		var ch = getchildren( 'Indent Detail', doc.name, 'indent_details');
+		if (flt(ch.length) > 0){
+			$c_obj(make_doclist(doc.doctype, doc.name), 'get_item_defaults', '', function(r, rt) {refresh_field('indent_details'); });
+		}
 }
 
 
 //======================= Refresh =====================================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) { 
 
-  // Unhide Fields in Next Steps
-  // ---------------------------------
-  
-  cur_frm.clear_custom_buttons();
+	// Unhide Fields in Next Steps
+	// ---------------------------------
+	
+	cur_frm.clear_custom_buttons();
 
-  if(doc.docstatus == 1 && doc.status != 'Stopped'){
-    var ch = getchildren('Indent Detail',doc.name,'indent_details');
-    var is_closed = 1;
-    for(var i in ch){
-      if(flt(ch[i].qty) > flt(ch[i].ordered_qty)) is_closed = 0;
-    }
-    if(!is_closed) {
-  	  cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order'])
-  	  cur_frm.add_custom_button('Stop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Stop Purchase Requisition'])
-    }
-    cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
-  }
+	if(doc.docstatus == 1 && doc.status != 'Stopped'){
+		var ch = getchildren('Indent Detail',doc.name,'indent_details');
+		var is_closed = 1;
+		for(var i in ch){
+			if(flt(ch[i].qty) > flt(ch[i].ordered_qty)) is_closed = 0;
+		}
+		if(!is_closed) {
+			cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order'])
+			cur_frm.add_custom_button('Stop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Stop Purchase Requisition'])
+		}
+		cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+	}
  
-  if(doc.docstatus == 1 && doc.status == 'Stopped')
-    cur_frm.add_custom_button('Unstop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Unstop Purchase Requisition'])
-    
-  if(doc.docstatus == 1)
-    unhide_field(['Repair Purchase Requisition']);
-  else
-    hide_field(['Repair Purchase Requisition']);
+	if(doc.docstatus == 1 && doc.status == 'Stopped')
+		cur_frm.add_custom_button('Unstop ' + cur_frm.cscript.indent_doctype_label, cur_frm.cscript['Unstop Purchase Requisition'])
+		
+	if(doc.docstatus == 1)
+		unhide_field(['Repair Purchase Requisition']);
+	else
+		hide_field(['Repair Purchase Requisition']);
 }
 
 //======================= validation ===================================
 cur_frm.cscript.validate = function(doc,cdt,cdn){
-  is_item_table(doc,cdt,cdn);
+	is_item_table(doc,cdt,cdn);
 }
 //======================= transaction date =============================
 cur_frm.cscript.transaction_date = function(doc,cdt,cdn){
-  if(doc.__islocal){ 
-    cur_frm.cscript.get_default_schedule_date(doc);
-  }
+	if(doc.__islocal){ 
+		cur_frm.cscript.get_default_schedule_date(doc);
+	}
 }
 
 //=================== Quantity ===================================================================
 cur_frm.cscript.qty = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if (flt(d.qty) < flt(d.min_order_qty))
-    alert("Warning: " + cur_frm.cscript.indent_doctype_label + " Qty is less than Minimum Order Qty");
+	var d = locals[cdt][cdn];
+	if (flt(d.qty) < flt(d.min_order_qty))
+		alert("Warning: " + cur_frm.cscript.indent_doctype_label + " Qty is less than Minimum Order Qty");
 }
 
 // On Button Click Functions
@@ -80,43 +82,43 @@
 
 // Make Purchase Order
 cur_frm.cscript['Make Purchase Order'] = function() {
-  var doc = cur_frm.doc;
-  n = createLocal('Purchase Order');
-  $c('dt_map', args={
-    'docs':compress_doclist([locals['Purchase Order'][n]]),
-    'from_doctype':doc.doctype,
-    'to_doctype':'Purchase Order',
-    'from_docname':doc.name,
-    'from_to_list':"[['Indent','Purchase Order'],['Indent Detail','PO Detail']]"
-    }, function(r,rt) {
-       loaddoc('Purchase Order', n);
-    }
-  );
+	var doc = cur_frm.doc;
+	n = createLocal('Purchase Order');
+	$c('dt_map', args={
+		'docs':compress_doclist([locals['Purchase Order'][n]]),
+		'from_doctype':doc.doctype,
+		'to_doctype':'Purchase Order',
+		'from_docname':doc.name,
+		'from_to_list':"[['Indent','Purchase Order'],['Indent Detail','PO Detail']]"
+		}, function(r,rt) {
+			 loaddoc('Purchase Order', n);
+		}
+	);
 }
 
 // Stop INDENT
 // ==================================================================================================
 cur_frm.cscript['Stop Purchase Requisition'] = function() {
-  var doc = cur_frm.doc;
-  var check = confirm("Do you really want to STOP this " + cur_frm.cscript.indent_doctype_label + "?");
+	var doc = cur_frm.doc;
+	var check = confirm("Do you really want to STOP this " + cur_frm.cscript.indent_doctype_label + "?");
 
-  if (check) {
-    $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
-      cur_frm.refresh();
-    });
-  }
+	if (check) {
+		$c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+			cur_frm.refresh();
+		});
+	}
 }
 
 // Un Stop INDENT
 //====================================================================================================
 cur_frm.cscript['Unstop Purchase Requisition'] = function(){
-  var doc = cur_frm.doc
-  var check = confirm("Do you really want to UNSTOP this " + cur_frm.cscript.indent_doctype_label + "?");
-  
-  if (check) {
-    $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted','docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
-      cur_frm.refresh();
-      
-    });
-  }
+	var doc = cur_frm.doc
+	var check = confirm("Do you really want to UNSTOP this " + cur_frm.cscript.indent_doctype_label + "?");
+	
+	if (check) {
+		$c('runserverobj', args={'method':'update_status', 'arg': 'Submitted','docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+			cur_frm.refresh();
+			
+		});
+	}
 }
diff --git a/erpnext/buying/doctype/indent/indent.py b/erpnext/buying/doctype/indent/indent.py
index 882098f..148d50d 100644
--- a/erpnext/buying/doctype/indent/indent.py
+++ b/erpnext/buying/doctype/indent/indent.py
@@ -90,7 +90,21 @@
 	# get item details
 	# ---------------------------------
 	def get_item_details(self, arg =''):
-		return get_obj(dt='Purchase Common').get_item_details(self,arg)
+		if arg:
+			return get_obj(dt='Purchase Common').get_item_details(self,arg)
+		else:
+			obj = get_obj('Purchase Common')
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					temp = {
+						'item_code': doc.fields.get('item_code'),
+						'warehouse': doc.fields.get('warehouse')
+					}
+					ret = obj.get_item_details(self, json.dumps(temp))
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]
+
 
 	# Get UOM Details
 	# ---------------------------------
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js
index 53304b0..541a225 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.js
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.js
@@ -7,389 +7,433 @@
 
 
 cur_frm.cscript.get_default_schedule_date = function(doc) {
-    var ch = getchildren( tname, doc.name, fname);
-    if (flt(ch.length) > 0){
-      $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_schedule_date', '', function(r, rt) { refresh_field(fname); });
-    }
+		var ch = getchildren( tname, doc.name, fname);
+		if (flt(ch.length) > 0){
+			$c_obj(make_doclist(doc.doctype, doc.name), 'get_default_schedule_date', '', function(r, rt) { refresh_field(fname); });
+		}
+}
+
+
+// Gets called after existing item details are update to fill in
+// remaining default values
+cur_frm.cscript.load_defaults = function(doc, dt, dn) {
+	if(!cur_frm.doc.__islocal) { return; }
+
+	doc = locals[doc.doctype][doc.name];
+	var fields_to_refresh = LocalDB.set_default_values(doc);
+	if(fields_to_refresh) { refresh_many(fields_to_refresh); }
+
+	fields_to_refresh = null;
+	var children = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
+	if(!children) { return; }
+	for(var i=0; i<children.length; i++) {
+		LocalDB.set_default_values(children[i]);
+	}
+	refresh_field(cur_frm.cscript.fname);
+}
+
+// Update existing item details
+cur_frm.cscript.update_item_details = function(doc, dt, dn) {
+	if(!cur_frm.doc.__islocal) return;
+	var children = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
+	if(children) {
+		$c_obj(make_doclist(doc.doctype, doc.name), 'get_item_details', '',
+		function(r, rt) {
+			if(!r.exc) {
+				refresh_field(cur_frm.cscript.fname);
+				doc = locals[doc.doctype][doc.name];
+				cur_frm.cscript.load_defaults(doc, dt, dn);
+			}
+		});
+	}
 }
 
 
 // ======================== Conversion Rate ==========================================
 cur_frm.cscript.conversion_rate = function(doc,cdt,cdn) {
-  cur_frm.cscript.calc_amount( doc, 1);
+	cur_frm.cscript.calc_amount( doc, 1);
 }
 
 //==================== Item Code Get Query =======================================================
 // Only Is Purchase Item = 'Yes' and Items not moved to trash are allowed.
 cur_frm.fields_dict[fname].grid.get_field("item_code").get_query = function(doc, cdt, cdn) {
-  return 'SELECT tabItem.name, tabItem.description FROM tabItem WHERE tabItem.is_purchase_item="Yes" AND (IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` ="0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50'
+	return 'SELECT tabItem.name, tabItem.description FROM tabItem WHERE tabItem.is_purchase_item="Yes" AND (IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` ="0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND tabItem.%(key)s LIKE "%s" LIMIT 50'
 }
 
 //==================== Get Item Code Details =====================================================
 cur_frm.cscript.item_code = function(doc,cdt,cdn) {
-  var d = locals[cdt][cdn];
-  if (d.item_code) {
-    temp = "{'item_code':'"+(d.item_code?d.item_code:'')+"', 'warehouse':'"+(d.warehouse?d.warehouse:'')+"'}"
-    get_server_fields('get_item_details', temp, fname, doc, cdt, cdn, 1);
-  }
+	var d = locals[cdt][cdn];
+	if (d.item_code) {
+		temp = {
+			item_code: d.item_code || '',
+			warehouse: d.warehouse || ''
+		}
+		get_server_fields('get_item_details', JSON.stringify(temp), fname, doc, cdt, cdn, 1);
+	}
 }
 
 //==================== Update Stock Qty ==========================================================
 cur_frm.cscript.update_stock_qty = function(doc,cdt,cdn){
-  d = locals[cdt][cdn]
-  // Step 1:=> Check if qty , uom, conversion_factor
-  if (d.qty && d.uom && d.conversion_factor){
-    // Step 2:=> Set stock_qty = qty * conversion_factor
-    d.stock_qty = flt(flt(d.qty) * flt(d.conversion_factor));
-    // Step 3:=> Refer stock_qty field a that particular row.
-    refresh_field('stock_qty' , d.name,fname);
-  }
+	d = locals[cdt][cdn]
+	// Step 1:=> Check if qty , uom, conversion_factor
+	if (d.qty && d.uom && d.conversion_factor){
+		// Step 2:=> Set stock_qty = qty * conversion_factor
+		d.stock_qty = flt(flt(d.qty) * flt(d.conversion_factor));
+		// Step 3:=> Refer stock_qty field a that particular row.
+		refresh_field('stock_qty' , d.name,fname);
+	}
 }
 
 //==================== UOM ======================================================================
 cur_frm.cscript.uom = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if (d.item_code && d.uom) {
-    call_back = function(doc, cdt, cdn){
-      cur_frm.cscript.calc_amount(doc, 2);
-    }
-    str_arg = {'item_code':d.item_code, 'uom':d.uom, 'stock_qty':flt(d.stock_qty), 'qty': flt(d.qty), 'conversion_rate':doc.conversion_rate}
-    // Updates Conversion Factor, Qty and Purchase Rate
-    get_server_fields('get_uom_details',JSON.stringify(str_arg), fname, doc,cdt,cdn,1, call_back);
-    // don't make mistake of calling update_stock_qty() the get_uom_details returns stock_qty as per conversion factor properly
-  }
+	var d = locals[cdt][cdn];
+	if (d.item_code && d.uom) {
+		call_back = function(doc, cdt, cdn){
+			cur_frm.cscript.calc_amount(doc, 2);
+		}
+		str_arg = {'item_code':d.item_code, 'uom':d.uom, 'stock_qty':flt(d.stock_qty), 'qty': flt(d.qty), 'conversion_rate':doc.conversion_rate}
+		// Updates Conversion Factor, Qty and Purchase Rate
+		get_server_fields('get_uom_details',JSON.stringify(str_arg), fname, doc,cdt,cdn,1, call_back);
+		// don't make mistake of calling update_stock_qty() the get_uom_details returns stock_qty as per conversion factor properly
+	}
 }
 
 
 //==================== Conversion factor =========================================================
 cur_frm.cscript.conversion_factor = function(doc, cdt, cdn) {
-  cur_frm.cscript.uom(doc, cdt, cdn);
+	cur_frm.cscript.uom(doc, cdt, cdn);
 }
 
 //==================== stock qty ======================================================================
 cur_frm.cscript.stock_qty = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(d.uom && d.qty){
-    d.conversion_factor = flt(d.stock_qty)/flt(d.qty);
-    refresh_field('conversion_factor', d.name, fname);
-  }
+	var d = locals[cdt][cdn];
+	if(d.uom && d.qty){
+		d.conversion_factor = flt(d.stock_qty)/flt(d.qty);
+		refresh_field('conversion_factor', d.name, fname);
+	}
 }
 
 //==================== Warehouse ================================================================
 cur_frm.cscript.warehouse = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if (d.item_code && d.warehouse) {
-    str_arg = "{'item_code':'" +  (d.item_code?d.item_code:'') + "', 'warehouse':'" + (d.warehouse?d.warehouse:'') + "'}"
-    get_server_fields('get_bin_details', str_arg, fname, doc, cdt, cdn, 1);
-  }  
+	var d = locals[cdt][cdn];
+	if (d.item_code && d.warehouse) {
+		str_arg = "{'item_code':'" +	(d.item_code?d.item_code:'') + "', 'warehouse':'" + (d.warehouse?d.warehouse:'') + "'}"
+		get_server_fields('get_bin_details', str_arg, fname, doc, cdt, cdn, 1);
+	}	
 }
 
 //=================== Quantity ===================================================================
 cur_frm.cscript.qty = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  // Step 1: => Update Stock Qty 
-  cur_frm.cscript.update_stock_qty(doc,cdt,cdn);
-  // Step 2: => Calculate Amount
-  cur_frm.cscript.calc_amount(doc, 2);
+	var d = locals[cdt][cdn];
+	// Step 1: => Update Stock Qty 
+	cur_frm.cscript.update_stock_qty(doc,cdt,cdn);
+	// Step 2: => Calculate Amount
+	cur_frm.cscript.calc_amount(doc, 2);
 }
 
 
 //=================== Purchase Rate ==============================================================
 cur_frm.cscript.purchase_rate = function(doc, cdt, cdn) {
-  cur_frm.cscript.calc_amount(doc, 2);
+	cur_frm.cscript.calc_amount(doc, 2);
 }
 
 //==================== Import Rate ================================================================
 cur_frm.cscript.import_rate = function(doc, cdt, cdn) {
-  cur_frm.cscript.calc_amount(doc, 1);
+	cur_frm.cscript.calc_amount(doc, 1);
 }
 
 //==================== Discount Rate ================================================================
 cur_frm.cscript.discount_rate = function(doc, cdt, cdn) {
-  cur_frm.cscript.calc_amount(doc, 4);
+	cur_frm.cscript.calc_amount(doc, 4);
 }
 //==================== Purchase Ref Rate ================================================================
 cur_frm.cscript.purchase_ref_rate = function(doc, cdt, cdn) {
-  cur_frm.cscript.calc_amount(doc, 4);
+	cur_frm.cscript.calc_amount(doc, 4);
 }
 //==================== Import Ref Rate ================================================================
 cur_frm.cscript.import_ref_rate = function(doc, cdt, cdn) {
-  cur_frm.cscript.calc_amount(doc, 5);
+	cur_frm.cscript.calc_amount(doc, 5);
 }
 
 //==================== check if item table is blank ==============================================
 var is_item_table = function(doc,cdt,cdn) {
-  // Step 1 :=>Get all childrens/ rows from Detail Table
-  var cl = getchildren(tname, doc.name, fname);
-  // Step 2 :=> If there are no rows then set validated = false, I hope this will stop further execution of code.
-  if (cl.length == 0) {
-    alert("There is no item in table"); validated = false;
-  }
+	// Step 1 :=>Get all childrens/ rows from Detail Table
+	var cl = getchildren(tname, doc.name, fname);
+	// Step 2 :=> If there are no rows then set validated = false, I hope this will stop further execution of code.
+	if (cl.length == 0) {
+		alert("There is no item in table"); validated = false;
+	}
 }
 
 //==================== Validate ====================================================================
 cur_frm.cscript.validate = function(doc, cdt, cdn) {
-  // Step 1:=> check if item table is blank
-  is_item_table(doc,cdt,cdn);
-  // Step 2:=> Calculate Amount
-  cur_frm.cscript.calc_amount(doc, 1);
+	// Step 1:=> check if item table is blank
+	is_item_table(doc,cdt,cdn);
+	// Step 2:=> Calculate Amount
+	cur_frm.cscript.calc_amount(doc, 1);
 
-  // calculate advances if pv
-  if(doc.doctype == 'Payable Voucher') calc_total_advance(doc, cdt, cdn);
+	// calculate advances if pv
+	if(doc.doctype == 'Payable Voucher') calc_total_advance(doc, cdt, cdn);
 }
 
 // **************** RE-CALCULATE VALUES ***************************
 
 cur_frm.cscript['Re-Calculate Values'] = function(doc, cdt, cdn) {
-  cur_frm.cscript['Calculate Tax'](doc,cdt,cdn);
+	cur_frm.cscript['Calculate Tax'](doc,cdt,cdn);
 }
 
 cur_frm.cscript['Calculate Tax'] = function(doc, cdt, cdn) {
-  var other_fname  = cur_frm.cscript.other_fname;
+	var other_fname	= cur_frm.cscript.other_fname;
 
-  var cl = getchildren('Purchase Tax Detail', doc.name, other_fname, doc.doctype);
-  for(var i = 0; i<cl.length; i++){
-    cl[i].total_tax_amount = 0;
-    cl[i].total_amount = 0;
-    cl[i].tax_amount = 0;                    // this is done to calculate other charges
-    cl[i].total = 0;
-    if(in_list(['On Previous Row Amount','On Previous Row Total'],cl[i].charge_type) && !cl[i].row_id){
-      alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
-      validated = false;
-    }
-  }
-  cur_frm.cscript.calc_amount(doc, 1);
+	var cl = getchildren('Purchase Tax Detail', doc.name, other_fname, doc.doctype);
+	for(var i = 0; i<cl.length; i++){
+		cl[i].total_tax_amount = 0;
+		cl[i].total_amount = 0;
+		cl[i].tax_amount = 0;										// this is done to calculate other charges
+		cl[i].total = 0;
+		if(in_list(['On Previous Row Amount','On Previous Row Total'],cl[i].charge_type) && !cl[i].row_id){
+			alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
+			validated = false;
+		}
+	}
+	cur_frm.cscript.calc_amount(doc, 1);
 }
 
 
 
 cur_frm.cscript.get_item_wise_tax_detail = function( doc, rate, cl, i, tax, t) {
-  doc = locals[doc.doctype][doc.name];
-  var detail = '';
-  detail = cl[i].item_code + " : " + cstr(rate) + NEWLINE;
-  return detail;
+	doc = locals[doc.doctype][doc.name];
+	var detail = '';
+	detail = cl[i].item_code + " : " + cstr(rate) + NEWLINE;
+	return detail;
 }
 
 cur_frm.cscript.amount = function(doc, cdt, cdn) {
-  cur_frm.cscript.calc_amount(doc, 3);
+	cur_frm.cscript.calc_amount(doc, 3);
 }
 
 
-//====================== Calculate Amount for PO and PR not for PV  ============================================================
+//====================== Calculate Amount for PO and PR not for PV	============================================================
 cur_frm.cscript.calc_amount = function(doc, n) {
-  // Set defaults
-  doc = locals[doc.doctype][doc.name]
-  var other_fname  = cur_frm.cscript.other_fname;
-  if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); }
-  if(!n) n=0;
-  var net_total = 0;
-  var net_total_import = 0;
-  
-  var cl = getchildren(tname, doc.name, fname);
-  
-  for(var i=0;i<cl.length;i++) 
-  {
+	// Set defaults
+	doc = locals[doc.doctype][doc.name]
+	var other_fname	= cur_frm.cscript.other_fname;
+	if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); }
+	if(!n) n=0;
+	var net_total = 0;
+	var net_total_import = 0;
+	
+	var cl = getchildren(tname, doc.name, fname);
+	
+	for(var i=0;i<cl.length;i++) 
+	{
 	var rate_fld = (doc.doctype != 'Payable Voucher') ? 'purchase_rate': 'rate';
-    var tmp = {};
+		var tmp = {};
 	if(!cl[i].discount_rate) cl[i].discount_rate = 0;
 
-    if(n == 1){ 
-      set_multiple(tname, cl[i].name, {'purchase_ref_rate':flt(cl[i].import_ref_rate)*flt(doc.conversion_rate)}, fname);
-	  set_multiple(tname, cl[i].name, {'discount_rate': flt(flt( flt( flt(cl[i].import_ref_rate) - flt(cl[i].import_rate) ) * 100 )/flt(cl[i].import_ref_rate)) }, fname);
-	  tmp[rate_fld] = flt(doc.conversion_rate) * flt(cl[i].import_rate);
-      set_multiple(tname, cl[i].name, tmp, fname);
+		if(n == 1){ 
+			set_multiple(tname, cl[i].name, {'purchase_ref_rate':flt(cl[i].import_ref_rate)*flt(doc.conversion_rate)}, fname);
+		set_multiple(tname, cl[i].name, {'discount_rate': flt(flt( flt( flt(cl[i].import_ref_rate) - flt(cl[i].import_rate) ) * 100 )/flt(cl[i].import_ref_rate)) }, fname);
+		tmp[rate_fld] = flt(doc.conversion_rate) * flt(cl[i].import_rate);
+			set_multiple(tname, cl[i].name, tmp, fname);
 
-      set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(doc.conversion_rate) * flt(cl[i].import_rate))}, fname);
-      set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) * flt(cl[i].import_rate))}, fname);
+			set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(doc.conversion_rate) * flt(cl[i].import_rate))}, fname);
+			set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) * flt(cl[i].import_rate))}, fname);
 
-    }else if(n == 2){
-	  set_multiple(tname, cl[i].name, {'purchase_ref_rate':flt(cl[i].import_ref_rate)*flt(doc.conversion_rate)}, fname);
-	  set_multiple(tname, cl[i].name, {'discount_rate': flt(flt( flt( flt(cl[i].purchase_ref_rate) - flt(cl[i][rate_fld]) ) * 100 )/flt(cl[i].purchase_ref_rate)) }, fname);
-      set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i][rate_fld])),}, fname);
-	  set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate)) }, fname);
-      set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *  flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname);
+		}else if(n == 2){
+		set_multiple(tname, cl[i].name, {'purchase_ref_rate':flt(cl[i].import_ref_rate)*flt(doc.conversion_rate)}, fname);
+		set_multiple(tname, cl[i].name, {'discount_rate': flt(flt( flt( flt(cl[i].purchase_ref_rate) - flt(cl[i][rate_fld]) ) * 100 )/flt(cl[i].purchase_ref_rate)) }, fname);
+			set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i][rate_fld])),}, fname);
+		set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate)) }, fname);
+			set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *	flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname);
 
 	}else if(n == 3){
-	  tmp[rate_fld] = flt(flt(cl[i].amount) / flt(cl[i].qty));
-      set_multiple(tname, cl[i].name, tmp, fname);
-      set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
-      set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *  flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname);
+		tmp[rate_fld] = flt(flt(cl[i].amount) / flt(cl[i].qty));
+			set_multiple(tname, cl[i].name, tmp, fname);
+			set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
+			set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *	flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname);
 
-    }else if( n==4){	  
+		}else if( n==4){		
 
-	  set_multiple(tname, cl[i].name, {'import_ref_rate': flt(flt(cl[i].purchase_ref_rate) / flt(doc.conversion_rate))}, fname);
+		set_multiple(tname, cl[i].name, {'import_ref_rate': flt(flt(cl[i].purchase_ref_rate) / flt(doc.conversion_rate))}, fname);
 
-      tmp[rate_fld] = flt( flt(cl[i].purchase_ref_rate) - flt(flt(cl[i].purchase_ref_rate)*flt(cl[i].discount_rate)/100) )
-	  set_multiple(tname, cl[i].name, tmp, fname);
+			tmp[rate_fld] = flt( flt(cl[i].purchase_ref_rate) - flt(flt(cl[i].purchase_ref_rate)*flt(cl[i].discount_rate)/100) )
+		set_multiple(tname, cl[i].name, tmp, fname);
 
-	  set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
-	  set_multiple(tname, cl[i].name, {'amount':flt(flt(cl[i].qty) * flt(cl[i][rate_fld]))}, fname);
-	  set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *  flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
+		set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
+		set_multiple(tname, cl[i].name, {'amount':flt(flt(cl[i].qty) * flt(cl[i][rate_fld]))}, fname);
+		set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *	flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
 
 	}else if( n==5){	
-	  tmp[rate_fld] = flt( flt(cl[i].import_ref_rate) - flt(flt(cl[i].import_ref_rate)*flt(cl[i].discount_rate)/100) ) * flt(doc.conversion_rate);
-	  set_multiple(tname, cl[i].name, {'purchase_ref_rate': flt(flt(cl[i].import_ref_rate) * flt(doc.conversion_rate))}, fname);
-	  set_multiple(tname, cl[i].name, tmp, fname);
-	  set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
-	  set_multiple(tname, cl[i].name, {'amount':flt(flt(cl[i].qty) * flt(cl[i][rate_fld]))}, fname);
-	  set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *  flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
+		tmp[rate_fld] = flt( flt(cl[i].import_ref_rate) - flt(flt(cl[i].import_ref_rate)*flt(cl[i].discount_rate)/100) ) * flt(doc.conversion_rate);
+		set_multiple(tname, cl[i].name, {'purchase_ref_rate': flt(flt(cl[i].import_ref_rate) * flt(doc.conversion_rate))}, fname);
+		set_multiple(tname, cl[i].name, tmp, fname);
+		set_multiple(tname, cl[i].name, {'import_rate': flt(flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
+		set_multiple(tname, cl[i].name, {'amount':flt(flt(cl[i].qty) * flt(cl[i][rate_fld]))}, fname);
+		set_multiple(tname, cl[i].name, {'import_amount': flt(flt(cl[i].qty) *	flt(cl[i][rate_fld]) / flt(doc.conversion_rate))}, fname); 
 	}
 	
-    if (n != 3){
-      net_total += flt(flt(cl[i].qty) * flt(cl[i][rate_fld]));
-      net_total_import += flt(flt(cl[i].qty) * flt(cl[i].import_rate));
-    } else if(n == 3){
-      net_total += flt(cl[i].amount);
-      net_total_import += flt(cl[i].amount) / flt(doc.conversion_rate);
-    }
-    //update stock uom
-    cur_frm.cscript.update_stock_qty(doc, tname, cl[i].name);
-  }
-  doc.net_total = flt(net_total) ;
-  doc.net_total_import = flt(net_total_import) ;
-  refresh_field('net_total');
-  refresh_field('net_total_import');
-  
-  cur_frm.cscript.val_cal_charges(doc, cdt, cdn, tname, fname, other_fname);
+		if (n != 3){
+			net_total += flt(flt(cl[i].qty) * flt(cl[i][rate_fld]));
+			net_total_import += flt(flt(cl[i].qty) * flt(cl[i].import_rate));
+		} else if(n == 3){
+			net_total += flt(cl[i].amount);
+			net_total_import += flt(cl[i].amount) / flt(doc.conversion_rate);
+		}
+		//update stock uom
+		cur_frm.cscript.update_stock_qty(doc, tname, cl[i].name);
+	}
+	doc.net_total = flt(net_total) ;
+	doc.net_total_import = flt(net_total_import) ;
+	refresh_field('net_total');
+	refresh_field('net_total_import');
+	
+	cur_frm.cscript.val_cal_charges(doc, cdt, cdn, tname, fname, other_fname);
 }
 
 
 //======== Function was broken away from cur_frm.cscript.calc_amount as PV has fieldname 'rate' instead of 'purchase_rate'===========
 cur_frm.cscript.val_cal_charges = function(doc, cdt, cdn, tname, fname, other_fname){
 
-  doc = locals[doc.doctype][doc.name]
-  if(flt(doc.net_total) > 0) {
-    var cl = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
-    for(var i = 0; i<cl.length; i++){
-      cl[i].total_tax_amount = 0;
-      cl[i].total_amount = 0;
-      cl[i].tax_amount = 0;                    // this is done to calculate other charges
-      cl[i].total = 0;
-      cl[i].item_wise_tax_detail = "";
-      if(in_list(['On Previous Row Amount','On Previous Row Total'],cl[i].charge_type) && !cl[i].row_id){
-        alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
-        validated = false;
-      }
-    }
-    cur_frm.cscript.calc_other_charges(doc , tname , fname , other_fname); // calculate other charges
-  }
-  cur_frm.cscript.calc_doc_values(doc, cdt, cdn, tname, fname, other_fname); // calculates total amounts
+	doc = locals[doc.doctype][doc.name]
+	if(flt(doc.net_total) > 0) {
+		var cl = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
+		for(var i = 0; i<cl.length; i++){
+			cl[i].total_tax_amount = 0;
+			cl[i].total_amount = 0;
+			cl[i].tax_amount = 0;										// this is done to calculate other charges
+			cl[i].total = 0;
+			cl[i].item_wise_tax_detail = "";
+			if(in_list(['On Previous Row Amount','On Previous Row Total'],cl[i].charge_type) && !cl[i].row_id){
+				alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
+				validated = false;
+			}
+		}
+		cur_frm.cscript.calc_other_charges(doc , tname , fname , other_fname); // calculate other charges
+	}
+	cur_frm.cscript.calc_doc_values(doc, cdt, cdn, tname, fname, other_fname); // calculates total amounts
 
-  refresh_many(['net_total', 'grand_total', 'rounded_total', 'grand_total_import', 'rounded_total_import', 'in_words', 'in_words_import', 'purchase_tax_details', 'total_tax', 'other_charges_added', 'other_charges_deducted', 'net_total_import', 'other_charges_added_import', 'other_charges_deducted_import']);
+	refresh_many(['net_total', 'grand_total', 'rounded_total', 'grand_total_import', 'rounded_total_import', 'in_words', 'in_words_import', 'purchase_tax_details', 'total_tax', 'other_charges_added', 'other_charges_deducted', 'net_total_import', 'other_charges_added_import', 'other_charges_deducted_import']);
 
 }
 
 
 // ******************************* OTHER CHARGES *************************************
 cur_frm.cscript.calc_other_charges = function(doc , tname , fname , other_fname) {
-  doc = locals[doc.doctype][doc.name];
-  // make display area
-  // ------------------
+	doc = locals[doc.doctype][doc.name];
+	// make display area
+	// ------------------
 
-  
-  cur_frm.fields_dict['Tax Calculation'].disp_area.innerHTML = '<b style="padding: 8px 0px;">Calculation Details for Other Charges and Landed cost:</b>';
-  var cl = getchildren(tname, doc.name, fname);
-  var tax = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
-  // make display table
-  // ------------------
-  var otc = make_table(cur_frm.fields_dict['Tax Calculation'].disp_area, cl.length + 1, tax.length + 1, '90%',[],{border:'1px solid #AAA',padding:'2px'});
-  $y(otc,{marginTop:'8px'});
-  
-  var tax_desc = {}; var tax_desc_rates = []; var net_total = 0;
-  
-  
-  for(var i=0;i<cl.length;i++) {
-    var item_tax = 0;
-    if(doc.doctype != 'Payable Voucher') net_total += flt(flt(cl[i].qty) * flt(cl[i].purchase_rate));
-    else if(doc.doctype == 'Payable Voucher') net_total += flt(flt(cl[i].qty) * flt(cl[i].rate));
+	
+	cur_frm.fields_dict['Tax Calculation'].disp_area.innerHTML = '<b style="padding: 8px 0px;">Calculation Details for Other Charges and Landed cost:</b>';
+	var cl = getchildren(tname, doc.name, fname);
+	var tax = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
+	// make display table
+	// ------------------
+	var otc = make_table(cur_frm.fields_dict['Tax Calculation'].disp_area, cl.length + 1, tax.length + 1, '90%',[],{border:'1px solid #AAA',padding:'2px'});
+	$y(otc,{marginTop:'8px'});
+	
+	var tax_desc = {}; var tax_desc_rates = []; var net_total = 0;
+	
+	
+	for(var i=0;i<cl.length;i++) {
+		var item_tax = 0;
+		if(doc.doctype != 'Payable Voucher') net_total += flt(flt(cl[i].qty) * flt(cl[i].purchase_rate));
+		else if(doc.doctype == 'Payable Voucher') net_total += flt(flt(cl[i].qty) * flt(cl[i].rate));
 
-    var prev_total = flt(cl[i].amount);
-    if(cl[i].item_tax_rate)
-      var check_tax = eval('var a='+cl[i].item_tax_rate+';a');        //to get in dictionary
-    
-    // Add Item Code in new Row 
-    //--------------------------
-    $td(otc,i+1,0).innerHTML = cl[i].item_code;
-    
-    var tax = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
-    var total = net_total;
-    for(var t=0;t<tax.length;t++){
+		var prev_total = flt(cl[i].amount);
+		if(cl[i].item_tax_rate) {
+			try {
+				var check_tax = JSON.parse(cl[i].item_tax_rate);				//to get in dictionary
+			} catch(exception) {
+				var check_tax = eval('var a='+cl[i].item_tax_rate+';a');        //to get in dictionary				 
+			}
+		}
+		
+		// Add Item Code in new Row 
+		//--------------------------
+		$td(otc,i+1,0).innerHTML = cl[i].item_code;
+		
+		var tax = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
+		var total = net_total;
+		for(var t=0;t<tax.length;t++){
  
-      var account = tax[t].account_head;
-      $td(otc,0,t+1).innerHTML = account?account:'';
-      //Check For Rate
-      if(cl[i].item_tax_rate && check_tax[account]!=null)  {rate = flt(check_tax[account]);}
-      else               // if particular item doesn't have particular rate it will take other charges rate
-        rate = flt(tax[t].rate);
-      //Check For Rate and get tax amount
-      var tax_amount = cur_frm.cscript.check_charge_type_and_get_tax_amount(doc,tax,t, cl[i], rate);
-      
-      //enter item_wise_tax_detail i.e. tax rate on each item
-      
-      item_wise_tax_detail = cur_frm.cscript.get_item_wise_tax_detail( doc, rate, cl, i, tax, t);
-      
-      
-      if(tax[t].add_deduct_tax == 'Add'){
-        // this is calculation part for all types
-        if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
-        tax[t].total_amount = flt(tax_amount.toFixed(2));     //stores actual tax amount in virtual field
-        tax[t].total_tax_amount = flt(prev_total.toFixed(2));      //stores total amount in virtual field
-        tax[t].tax_amount += flt(tax_amount.toFixed(2));       
-        var total_amount = flt(tax[t].tax_amount);
-        total_tax_amount = flt(tax[t].total_tax_amount) + flt(total_amount);
-        if(tax[t].category != "For Valuation"){
-          set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)+flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname);
-          prev_total += flt(tax[t].total_amount);
-          total += flt(tax[t].tax_amount);  // for adding total to previous amount       
-        }
-        else{
-          set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)/*_tax_amount)*/}, other_fname);
-          prev_total = prev_total;
-        }
-        //prev_total += flt(tax[t].total_amount);   // for previous row total
+			var account = tax[t].account_head;
+			$td(otc,0,t+1).innerHTML = account?account:'';
+			//Check For Rate
+			if(cl[i].item_tax_rate && check_tax[account]!=null)	{rate = flt(check_tax[account]);}
+			else							 // if particular item doesn't have particular rate it will take other charges rate
+				rate = flt(tax[t].rate);
 
-        if(tax[t].charge_type == 'Actual')
-          $td(otc,i+1,t+1).innerHTML = fmt_money(tax[t].total_amount);
-        else
-          $td(otc,i+1,t+1).innerHTML = '('+fmt_money(rate) + '%) ' +fmt_money(tax[t].total_amount);
+			//Check For Rate and get tax amount
+			var tax_amount = cur_frm.cscript.check_charge_type_and_get_tax_amount(doc,tax,t, cl[i], rate);
+			
+			//enter item_wise_tax_detail i.e. tax rate on each item
+			
+			item_wise_tax_detail = cur_frm.cscript.get_item_wise_tax_detail( doc, rate, cl, i, tax, t);
+			
+			
+			if(tax[t].add_deduct_tax == 'Add'){
+				// this is calculation part for all types
+				if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
+				tax[t].total_amount = flt(tax_amount.toFixed(2));		 //stores actual tax amount in virtual field
+				tax[t].total_tax_amount = flt(prev_total.toFixed(2));			//stores total amount in virtual field
+				tax[t].tax_amount += flt(tax_amount.toFixed(2));			 
+				var total_amount = flt(tax[t].tax_amount);
+				total_tax_amount = flt(tax[t].total_tax_amount) + flt(total_amount);
+				if(tax[t].category != "For Valuation"){
+					set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)+flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname);
+					prev_total += flt(tax[t].total_amount);
+					total += flt(tax[t].tax_amount);	// for adding total to previous amount			 
+				}
+				else{
+					set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)/*_tax_amount)*/}, other_fname);
+					prev_total = prev_total;
+				}
+				//prev_total += flt(tax[t].total_amount);	 // for previous row total
 
-        if (tax[t].category != "For Total"){
-          item_tax += tax[t].total_amount;
-        }
-      }
-      else if(tax[t].add_deduct_tax == 'Deduct'){
-        // this is calculation part for all types
-        if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
-        tax[t].total_amount = flt(tax_amount.toFixed(2));     //stores actual tax amount in virtual field
-        tax[t].total_tax_amount = flt(prev_total.toFixed(2));      //stores total amount in virtual field
-        tax[t].tax_amount += flt(tax_amount.toFixed(2));
-        var total_amount = flt(tax[t].tax_amount);
-        total_tax_amount = flt(tax[t].total_tax_amount) - flt(total_amount);
-        if(tax[t].category != "For Valuation"){
-          set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':total_amount, 'total':flt(total)-flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname);
-          prev_total -= flt(tax[t].total_amount); 
-          total -= flt(tax[t].tax_amount);  // for adding total to previous amount       
-        }
-        else{
-          set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':total_amount, 'total':flt(total)/*_tax_amount)*/}, other_fname);
-          prev_total = prev_total;
-        }
-        //prev_total += flt(tax[t].total_amount);   // for previous row total
+				if(tax[t].charge_type == 'Actual')
+					$td(otc,i+1,t+1).innerHTML = fmt_money(tax[t].total_amount);
+				else
+					$td(otc,i+1,t+1).innerHTML = '('+fmt_money(rate) + '%) ' +fmt_money(tax[t].total_amount);
 
-        if(tax[t].charge_type == 'Actual')
-          $td(otc,i+1,t+1).innerHTML = fmt_money(tax[t].total_amount);
-        else
-          $td(otc,i+1,t+1).innerHTML = '('+fmt_money(rate) + '%) ' +fmt_money(tax[t].total_amount);
+				if (tax[t].category != "For Total"){
+					item_tax += tax[t].total_amount;
+				}
+			}
+			else if(tax[t].add_deduct_tax == 'Deduct'){
+				// this is calculation part for all types
+				if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
+				tax[t].total_amount = flt(tax_amount.toFixed(2));		 //stores actual tax amount in virtual field
+				tax[t].total_tax_amount = flt(prev_total.toFixed(2));			//stores total amount in virtual field
+				tax[t].tax_amount += flt(tax_amount.toFixed(2));
+				var total_amount = flt(tax[t].tax_amount);
+				total_tax_amount = flt(tax[t].total_tax_amount) - flt(total_amount);
+				if(tax[t].category != "For Valuation"){
+					set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':total_amount, 'total':flt(total)-flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname);
+					prev_total -= flt(tax[t].total_amount); 
+					total -= flt(tax[t].tax_amount);	// for adding total to previous amount			 
+				}
+				else{
+					set_multiple('Purchase Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'tax_amount':total_amount, 'total':flt(total)/*_tax_amount)*/}, other_fname);
+					prev_total = prev_total;
+				}
+				//prev_total += flt(tax[t].total_amount);	 // for previous row total
 
-        if (tax[t].category != "For Total"){
-          item_tax -= tax[t].total_amount;
-        }
-      }      
-      
-      
-    }
-    set_multiple(tname, cl[i].name, {'item_tax_amount': item_tax }, fname);
-  }
+				if(tax[t].charge_type == 'Actual')
+					$td(otc,i+1,t+1).innerHTML = fmt_money(tax[t].total_amount);
+				else
+					$td(otc,i+1,t+1).innerHTML = '('+fmt_money(rate) + '%) ' +fmt_money(tax[t].total_amount);
+
+				if (tax[t].category != "For Total"){
+					item_tax -= tax[t].total_amount;
+				}
+			}			
+			
+			
+		}
+		set_multiple(tname, cl[i].name, {'item_tax_amount': item_tax }, fname);
+	}
 }
 
 
@@ -397,45 +441,45 @@
 
 // ******* Calculation of total amounts of document (item amount + other charges)****************
 cur_frm.cscript.calc_doc_values = function(doc, cdt, cdn, tname, fname, other_fname) {
-  doc = locals[doc.doctype][doc.name];
-  var net_total = 0; var total_tax = 0; var other_charges_added = 0; var other_charges_deducted = 0;
-  var cl = getchildren(tname, doc.name, fname);
-  for(var i = 0; i<cl.length; i++){
-    net_total += flt(cl[i].amount);
-  }
-  var d = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
-  for(var j = 0; j<d.length; j++){
-    if(d[j].category != 'For Valuation'){
-      
-      if(d[j].add_deduct_tax == 'Add'){
-        other_charges_added += flt(d[j].tax_amount);
-        total_tax += flt(d[j].tax_amount);
-      }
-      if(d[j].add_deduct_tax == 'Deduct'){
-        other_charges_deducted += flt(d[j].tax_amount);
-        total_tax -= flt(d[j].tax_amount);
-      }
-    }
-  }
-  doc.net_total = flt(net_total);
-  doc.total_tax = flt(total_tax);
+	doc = locals[doc.doctype][doc.name];
+	var net_total = 0; var total_tax = 0; var other_charges_added = 0; var other_charges_deducted = 0;
+	var cl = getchildren(tname, doc.name, fname);
+	for(var i = 0; i<cl.length; i++){
+		net_total += flt(cl[i].amount);
+	}
+	var d = getchildren('Purchase Tax Detail', doc.name, other_fname,doc.doctype);
+	for(var j = 0; j<d.length; j++){
+		if(d[j].category != 'For Valuation'){
+			
+			if(d[j].add_deduct_tax == 'Add'){
+				other_charges_added += flt(d[j].tax_amount);
+				total_tax += flt(d[j].tax_amount);
+			}
+			if(d[j].add_deduct_tax == 'Deduct'){
+				other_charges_deducted += flt(d[j].tax_amount);
+				total_tax -= flt(d[j].tax_amount);
+			}
+		}
+	}
+	doc.net_total = flt(net_total);
+	doc.total_tax = flt(total_tax);
 
-  doc.other_charges_added = flt(other_charges_added);
-  doc.other_charges_deducted = flt(other_charges_deducted);
-  doc.grand_total = flt(flt(net_total) + flt(other_charges_added) - flt(other_charges_deducted));
-  doc.rounded_total = Math.round(doc.grand_total);
-  doc.net_total_import = flt(flt(net_total) / flt(doc.conversion_rate));
-  doc.other_charges_added_import = flt(flt(other_charges_added) / flt(doc.conversion_rate));
-  doc.other_charges_deducted_import = flt(flt(other_charges_deducted) / flt(doc.conversion_rate));
-  doc.grand_total_import = flt(flt(doc.grand_total) / flt(doc.conversion_rate));
-  doc.rounded_total_import = Math.round(doc.grand_total_import);
+	doc.other_charges_added = flt(other_charges_added);
+	doc.other_charges_deducted = flt(other_charges_deducted);
+	doc.grand_total = flt(flt(net_total) + flt(other_charges_added) - flt(other_charges_deducted));
+	doc.rounded_total = Math.round(doc.grand_total);
+	doc.net_total_import = flt(flt(net_total) / flt(doc.conversion_rate));
+	doc.other_charges_added_import = flt(flt(other_charges_added) / flt(doc.conversion_rate));
+	doc.other_charges_deducted_import = flt(flt(other_charges_deducted) / flt(doc.conversion_rate));
+	doc.grand_total_import = flt(flt(doc.grand_total) / flt(doc.conversion_rate));
+	doc.rounded_total_import = Math.round(doc.grand_total_import);
 
-  refresh_many(['net_total','total_taxes','grand_total']);
+	refresh_many(['net_total','total_taxes','grand_total']);
 
 
-  if(doc.doctype == 'Payable Voucher'){
-    calculate_outstanding(doc);
-  }
+	if(doc.doctype == 'Payable Voucher'){
+		calculate_outstanding(doc);
+	}
 }
 
 var calculate_outstanding = function(doc) {
@@ -453,41 +497,41 @@
 
 
 cur_frm.cscript.check_charge_type_and_get_tax_amount = function(doc, tax, t, cl, rate, print_amt) {
-  doc = locals[doc.doctype][doc.name];
+	doc = locals[doc.doctype][doc.name];
 
-  var tax_amount = 0;
-  if(tax[t].charge_type == 'Actual') {
-    var value = flt(tax[t].rate) / flt(doc.net_total);   // this give the ratio in which all items are divided           
-    return tax_amount = flt(value) * flt(cl.amount);
-   }   
-  else if(tax[t].charge_type == 'On Net Total') {
-    return tax_amount = (flt(rate) * flt(cl.amount) / 100);
-  }
-  else if(tax[t].charge_type == 'On Previous Row Amount'){
-    var row_no = (tax[t].row_id).toString();
-    var row = (row_no).split("+");      // splits the values and stores in an array
-    for(var r = 0;r<row.length;r++){
-      var id = cint(row[r].replace(/^\s+|\s+$/g,""));
-      tax_amount += (flt(rate) * flt(tax[id-1].total_amount) / 100);
-    }
-    var row_id = row_no.indexOf("/");
-    if(row_id != -1) {
-      rate = '';
-      var row = (row_no).split("/");      // splits the values and stores in an array
-      if(row.length>2) alert("You cannot enter more than 2 nos. for division");
-      var id1 = cint(row[0].replace(/^\s+|\s+$/g,""));
-      var id2 = cint(row[1].replace(/^\s+|\s+$/g,""));
-      tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount);
-    }
-    return tax_amount
-  }
-  else if(tax[t].charge_type == 'On Previous Row Total') {
-    var row = cint(tax[t].row_id);
-    if(tax[row-1].add_deduct_tax == 'Add'){
-      return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100;
-     }
-    else if(tax[row-1].add_deduct_tax == 'Deduct'){
-      return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)-flt(tax[row-1].total_amount)) / 100;
-     }
-  }
+	var tax_amount = 0;
+	if(tax[t].charge_type == 'Actual') {
+		var value = flt(tax[t].rate) / flt(doc.net_total);	 // this give the ratio in which all items are divided					 
+		return tax_amount = flt(value) * flt(cl.amount);
+	 }	 
+	else if(tax[t].charge_type == 'On Net Total') {
+		return tax_amount = (flt(rate) * flt(cl.amount) / 100);
+	}
+	else if(tax[t].charge_type == 'On Previous Row Amount'){
+		var row_no = (tax[t].row_id).toString();
+		var row = (row_no).split("+");			// splits the values and stores in an array
+		for(var r = 0;r<row.length;r++){
+			var id = cint(row[r].replace(/^\s+|\s+$/g,""));
+			tax_amount += (flt(rate) * flt(tax[id-1].total_amount) / 100);
+		}
+		var row_id = row_no.indexOf("/");
+		if(row_id != -1) {
+			rate = '';
+			var row = (row_no).split("/");			// splits the values and stores in an array
+			if(row.length>2) alert("You cannot enter more than 2 nos. for division");
+			var id1 = cint(row[0].replace(/^\s+|\s+$/g,""));
+			var id2 = cint(row[1].replace(/^\s+|\s+$/g,""));
+			tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount);
+		}
+		return tax_amount
+	}
+	else if(tax[t].charge_type == 'On Previous Row Total') {
+		var row = cint(tax[t].row_id);
+		if(tax[row-1].add_deduct_tax == 'Add'){
+			return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100;
+		 }
+		else if(tax[row-1].add_deduct_tax == 'Deduct'){
+			return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)-flt(tax[row-1].total_amount)) / 100;
+		 }
+	}
 }
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py
index 5bade92..4a49373 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.py
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.py
@@ -96,9 +96,9 @@
 		if r: obj.doc.terms = r[0][0]
 
 	# Get Item Details
-	def get_item_details( self, obj, arg =''):
-
-		arg = eval(arg)
+	def get_item_details(self, obj, arg =''):
+		import json
+		arg = json.loads(arg)
 		item = sql("select item_name,item_group, brand, description, min_order_qty, stock_uom, default_warehouse,lead_time_days, last_purchase_rate from `tabItem` where name = %s and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life >	now())", (arg['item_code']), as_dict = 1)
 		tax = sql("select tax_type, tax_rate from `tabItem Tax` where parent = %s" , arg['item_code'])
 		t = {}
@@ -119,7 +119,7 @@
 			'stock_uom'					: item and item[0]['stock_uom'] or '',
 			'conversion_factor'	: '1',
 			'warehouse'					: wh,
-			'item_tax_rate'			: str(t),
+			'item_tax_rate'			: json.dumps(t),
 			'batch_no'					 : '',
 			'discount_rate'			: 0		
 		}
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index 05fe049..8435c02 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -8,86 +8,89 @@
 //========================== On Load =================================================
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
 
-  if(!doc.fiscal_year && doc.__islocal){ //set_default_values(doc);
-    doc.fiscal_year = sys_defaults.fiscal_year;
-  }
-  if(!doc.conversion_rate) doc.conversion_rate = 1;
-  if(!doc.currency) doc.currency = sys_defaults.currency;
-  if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
-  if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()});
-  
-  if(doc.__islocal){
-    hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
-  }
+	if(!doc.fiscal_year && doc.__islocal){ //set_default_values(doc);
+		doc.fiscal_year = sys_defaults.fiscal_year;
+	}
+	if(!doc.conversion_rate) doc.conversion_rate = 1;
+	if(!doc.currency) doc.currency = sys_defaults.currency;
+	if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
+	if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()});
+	
+	if(doc.__islocal){
+		hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
+	}
+
+	// defined in purchase_common.js
+	//cur_frm.cscript.update_item_details(doc, cdt, cdn);		
 }
 
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
-  if(doc.__islocal){ 
-    cur_frm.cscript.get_default_schedule_date(doc);
-  }	
+	if(doc.__islocal){ 
+		cur_frm.cscript.get_default_schedule_date(doc);
+	}	
 }
 
 // ================================== Refresh ==========================================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) { 
 
-  // Show buttons
-  // ---------------------------------
-  cur_frm.clear_custom_buttons();
-  if(doc.docstatus == 1 && doc.status != 'Stopped'){
-    var ch = getchildren('PO Detail',doc.name,'po_details');
-    var allow_billing = 0; var allow_receipt = 0;
-    cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+	// Show buttons
+	// ---------------------------------
+	cur_frm.clear_custom_buttons();
+	if(doc.docstatus == 1 && doc.status != 'Stopped'){
+		var ch = getchildren('PO Detail',doc.name,'po_details');
+		var allow_billing = 0; var allow_receipt = 0;
+		cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
 
-    for(var i in ch){
-      if(ch[i].qty > ch[i].received_qty) allow_receipt = 1; 
-      if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
-    }
-    if(allow_receipt)
-      cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']);
-	    
+		for(var i in ch){
+			if(ch[i].qty > ch[i].received_qty) allow_receipt = 1; 
+			if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
+		}
+		if(allow_receipt)
+			cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']);
+			
 	if(allow_billing)
-      cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']);
+			cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']);
 
-    if(allow_billing || allow_receipt)
-      cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']);
-  }
-    
-  if(doc.docstatus == 1 && doc.status == 'Stopped')
-    cur_frm.add_custom_button('Unstop Purchase Order', cur_frm.cscript['Unstop Purchase Order']);
+		if(allow_billing || allow_receipt)
+			cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']);
+	}
+		
+	if(doc.docstatus == 1 && doc.status == 'Stopped')
+		cur_frm.add_custom_button('Unstop Purchase Order', cur_frm.cscript['Unstop Purchase Order']);
 
-  if(doc.docstatus == 1) unhide_field(['Repair Purchase Order']);
-  else hide_field(['Repair Purchase Order']);
+	if(doc.docstatus == 1) unhide_field(['Repair Purchase Order']);
+	else hide_field(['Repair Purchase Order']);
 }
 
 
 
 //Supplier
 cur_frm.cscript.supplier = function(doc,dt,dn) {
-  if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
-  if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
+	if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
+	if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
 }
 
-cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {    
-  if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
+	if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 
 cur_frm.fields_dict.supplier_address.on_new = function(dn) {
-  locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
-  locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
+	locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
+	locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
 }
 
 cur_frm.fields_dict.contact_person.on_new = function(dn) {
-  locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
-  locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
+	locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
+	locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
 }
 
 
@@ -96,154 +99,154 @@
 
 //================ create new contact ============================================================================
 cur_frm.cscript.new_contact = function(){
-  tn = createLocal('Contact');
-  locals['Contact'][tn].is_supplier = 1;
-  if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier;
-  loaddoc('Contact', tn);
+	tn = createLocal('Contact');
+	locals['Contact'][tn].is_supplier = 1;
+	if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier;
+	loaddoc('Contact', tn);
 }
 
 //======================= transaction date =============================
 cur_frm.cscript.transaction_date = function(doc,cdt,cdn){
-  if(doc.__islocal){ 
-    cur_frm.cscript.get_default_schedule_date(doc);
-  }
+	if(doc.__islocal){ 
+		cur_frm.cscript.get_default_schedule_date(doc);
+	}
 }
 
 
 // ---------------------- Get project name --------------------------
 cur_frm.fields_dict['po_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
+	return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
 }
 
 //==================== Indent No Get Query =======================================================
 //===== Only those Indents status != 'Completed' and docstatus = 1 i.e. submitted=================
 cur_frm.fields_dict['indent_no'].get_query = function(doc) {
-  return 'SELECT DISTINCT `tabIndent`.`name` FROM `tabIndent` WHERE `tabIndent`.company = "' + doc.company + '" and `tabIndent`.`docstatus` = 1 and `tabIndent`.`status` != "Stopped" and ifnull(`tabIndent`.`per_ordered`,0) < 100 and `tabIndent`.%(key)s LIKE "%s" ORDER BY `tabIndent`.`name` DESC LIMIT 50';
+	return 'SELECT DISTINCT `tabIndent`.`name` FROM `tabIndent` WHERE `tabIndent`.company = "' + doc.company + '" and `tabIndent`.`docstatus` = 1 and `tabIndent`.`status` != "Stopped" and ifnull(`tabIndent`.`per_ordered`,0) < 100 and `tabIndent`.%(key)s LIKE "%s" ORDER BY `tabIndent`.`name` DESC LIMIT 50';
 }
 
 /*
 //*********** get approved supplier quotation ********************
 cur_frm.fields_dict['supplier_qtn'].get_query = function(doc) {
-  var cond='';
-  if(doc.supplier) cond = 'ifnull(`tabSupplier Quotation`.supplier, "") = "'+doc.supplier+'" and';
-  
-  return repl('SELECT DISTINCT `tabSupplier Quotation`.`name` FROM `tabSupplier Quotation` WHERE `tabSupplier Quotation`.company = "%(company)s" and`tabSupplier Quotation`.`docstatus` = 1 and `tabSupplier Quotation`.`approval_status` = "Approved" and %(cond)s `tabSupplier Quotation`.%(key)s LIKE "%s" ORDER BY `tabSupplier Quotation`.`name` DESC LIMIT 50', {company:doc.company,cond:cond});
+	var cond='';
+	if(doc.supplier) cond = 'ifnull(`tabSupplier Quotation`.supplier, "") = "'+doc.supplier+'" and';
+	
+	return repl('SELECT DISTINCT `tabSupplier Quotation`.`name` FROM `tabSupplier Quotation` WHERE `tabSupplier Quotation`.company = "%(company)s" and`tabSupplier Quotation`.`docstatus` = 1 and `tabSupplier Quotation`.`approval_status` = "Approved" and %(cond)s `tabSupplier Quotation`.%(key)s LIKE "%s" ORDER BY `tabSupplier Quotation`.`name` DESC LIMIT 50', {company:doc.company,cond:cond});
 }
 */
 
 
 //========================= Get Last Purhase Rate =====================================
 cur_frm.cscript['Get Last Purchase Rate'] = function(doc, cdt, cdn){
-  $c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', 
-      function(r, rt) { 
-        refresh_field(cur_frm.cscript.fname);
-        var doc = locals[cdt][cdn];
-        cur_frm.cscript.calc_amount( doc, 2);
-      }
-  );
+	$c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', 
+			function(r, rt) { 
+				refresh_field(cur_frm.cscript.fname);
+				var doc = locals[cdt][cdn];
+				cur_frm.cscript.calc_amount( doc, 2);
+			}
+	);
 
 }
 
 //========================= Make Purchase Receipt =======================================================
 cur_frm.cscript['Make Purchase Receipt'] = function() {
-  n = createLocal('Purchase Receipt');
-  $c('dt_map', args={
-    'docs':compress_doclist([locals['Purchase Receipt'][n]]),
-    'from_doctype': cur_frm.doc.doctype,
-    'to_doctype':'Purchase Receipt',
-    'from_docname':cur_frm.doc.name,
-    'from_to_list':"[['Purchase Order','Purchase Receipt'],['PO Detail','Purchase Receipt Detail'],['Purchase Tax Detail','Purchase Tax Detail']]"
-    }, function(r,rt) {
-       loaddoc('Purchase Receipt', n);
-    }
-  );
+	n = createLocal('Purchase Receipt');
+	$c('dt_map', args={
+		'docs':compress_doclist([locals['Purchase Receipt'][n]]),
+		'from_doctype': cur_frm.doc.doctype,
+		'to_doctype':'Purchase Receipt',
+		'from_docname':cur_frm.doc.name,
+		'from_to_list':"[['Purchase Order','Purchase Receipt'],['PO Detail','Purchase Receipt Detail'],['Purchase Tax Detail','Purchase Tax Detail']]"
+		}, function(r,rt) {
+			 loaddoc('Purchase Receipt', n);
+		}
+	);
 }
 
 //========================== Make Purchase Invoice =====================================================
 cur_frm.cscript['Make Purchase Invoice'] = function() {
-  n = createLocal('Payable Voucher');
-  $c('dt_map', args={
-    'docs':compress_doclist([locals['Payable Voucher'][n]]),
-    'from_doctype':cur_frm.doc.doctype,
-    'to_doctype':'Payable Voucher',
-    'from_docname': cur_frm.doc.name,
-    'from_to_list':"[['Purchase Order','Payable Voucher'],['PO Detail','PV Detail'],['Purchase Tax Detail','Purchase Tax Detail']]"
-    }, function(r,rt) {
-       loaddoc('Payable Voucher', n);
-    }
-  );
+	n = createLocal('Payable Voucher');
+	$c('dt_map', args={
+		'docs':compress_doclist([locals['Payable Voucher'][n]]),
+		'from_doctype':cur_frm.doc.doctype,
+		'to_doctype':'Payable Voucher',
+		'from_docname': cur_frm.doc.name,
+		'from_to_list':"[['Purchase Order','Payable Voucher'],['PO Detail','PV Detail'],['Purchase Tax Detail','Purchase Tax Detail']]"
+		}, function(r,rt) {
+			 loaddoc('Payable Voucher', n);
+		}
+	);
 }
 
 
 // Stop PURCHASE ORDER
 // ==================================================================================================
 cur_frm.cscript['Stop Purchase Order'] = function() {
-  var doc = cur_frm.doc;
-  var check = confirm("Do you really want to STOP " + doc.name);
+	var doc = cur_frm.doc;
+	var check = confirm("Do you really want to STOP " + doc.name);
 
-  if (check) {
-    $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
-      cur_frm.refresh();
-    });	
-  }
+	if (check) {
+		$c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+			cur_frm.refresh();
+		});	
+	}
 }
 
 // Unstop PURCHASE ORDER
 // ==================================================================================================
 cur_frm.cscript['Unstop Purchase Order'] = function() {
-  var doc = cur_frm.doc;
-  var check = confirm("Do you really want to UNSTOP " + doc.name);
+	var doc = cur_frm.doc;
+	var check = confirm("Do you really want to UNSTOP " + doc.name);
 
-  if (check) {
-    $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
-      cur_frm.refresh();
-    });	
-  }
+	if (check) {
+		$c('runserverobj', args={'method':'update_status', 'arg': 'Submitted', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+			cur_frm.refresh();
+		});	
+	}
 }
 
-// ***************** Get Print Heading  *****************
+// ***************** Get Print Heading	*****************
 cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
+	return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
 }
 //****************** For print sales order no and date*************************
 cur_frm.pformat.indent_no = function(doc, cdt, cdn){
-  //function to make row of table
-  
-  var make_row = function(title,val1, val2, bold){
-    var bstart = '<b>'; var bend = '</b>';
+	//function to make row of table
+	
+	var make_row = function(title,val1, val2, bold){
+		var bstart = '<b>'; var bend = '</b>';
 
-    return '<tr><td style="width:39%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
-     +'<td style="width:61%;text-align:left;">'+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'</td>'
-     +'</tr>'
-  }
+		return '<tr><td style="width:39%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
+		 +'<td style="width:61%;text-align:left;">'+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'</td>'
+		 +'</tr>'
+	}
 
-  out ='';
-  
-  var cl = getchildren('PO Detail',doc.name,'po_details');
+	out ='';
+	
+	var cl = getchildren('PO Detail',doc.name,'po_details');
 
-  // outer table  
-  var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 50%"></td><td>';
-  
-  // main table
-  out +='<table class="noborder" style="width:100%">';
+	// outer table	
+	var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 50%"></td><td>';
+	
+	// main table
+	out +='<table class="noborder" style="width:100%">';
 
-  // add rows
-  if(cl.length){
-    prevdoc_list = new Array();
-    for(var i=0;i<cl.length;i++){
-      if(cl[i].prevdoc_doctype == 'Indent' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
-        prevdoc_list.push(cl[i].prevdoc_docname);
-        if(prevdoc_list.length ==1)
-          out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
-        else
-          out += make_row('', cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
-      }
-    }
-  }
+	// add rows
+	if(cl.length){
+		prevdoc_list = new Array();
+		for(var i=0;i<cl.length;i++){
+			if(cl[i].prevdoc_doctype == 'Indent' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
+				prevdoc_list.push(cl[i].prevdoc_docname);
+				if(prevdoc_list.length ==1)
+					out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+				else
+					out += make_row('', cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+			}
+		}
+	}
 
-  out +='</table></td></tr></table></div>';
+	out +='</table></td></tr></table></div>';
 
-  return out;
+	return out;
 }
 
 $import(Notification Control)
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 752e348..d4c308d 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -19,325 +19,340 @@
 from utilities.transaction_base import TransactionBase
 
 class DocType(TransactionBase):
-  def __init__(self, doc, doclist=[]):
-    self.doc = doc
-    self.doclist = doclist
-    self.defaults = get_defaults()
-    self.tname = 'PO Detail'
-    self.fname = 'po_details'
+	def __init__(self, doc, doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
+		self.defaults = get_defaults()
+		self.tname = 'PO Detail'
+		self.fname = 'po_details'
 
-  # Autoname
-  # ---------
-  def autoname(self):
-    self.doc.name = make_autoname(self.doc.naming_series+'.#####')
+	# Autoname
+	# ---------
+	def autoname(self):
+		self.doc.name = make_autoname(self.doc.naming_series+'.#####')
 
-  def get_default_schedule_date(self):
-    get_obj(dt = 'Purchase Common').get_default_schedule_date(self)
-    
-  def validate_fiscal_year(self):
-    get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'PO Date')
+	def get_default_schedule_date(self):
+		get_obj(dt = 'Purchase Common').get_default_schedule_date(self)
+		
+	def validate_fiscal_year(self):
+		get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'PO Date')
 
 
-  # Get Item Details
-  def get_item_details(self, arg =''):
-    return get_obj(dt='Purchase Common').get_item_details(self,arg)
-
-  # Get UOM Details
-  def get_uom_details(self, arg = ''):
-    return get_obj(dt='Purchase Common').get_uom_details(arg)
-
-  # get available qty at warehouse
-  def get_bin_details(self, arg = ''):
-    return get_obj(dt='Purchase Common').get_bin_details(arg)
-
-  # Pull Indent
-  def get_indent_details(self):
-    #self.validate_prev_docname() 
-    if self.doc.indent_no:
-      get_obj('DocType Mapper','Indent-Purchase Order').dt_map('Indent','Purchase Order',self.doc.indent_no, self.doc, self.doclist, "[['Indent','Purchase Order'],['Indent Detail', 'PO Detail']]")
-      for d in getlist(self.doclist, 'po_details'):			
-        if d.item_code:
-          item = sql("select last_purchase_rate from tabItem where name = '%s'" %(d.item_code), as_dict=1)
-          d.purchase_rate = item and flt(item[0]['last_purchase_rate']) or 0
-          d.import_rate = flt(item and flt(item[0]['last_purchase_rate']) or 0) / flt(self.doc.fields.has_key('conversion_rate') and flt(self.doc.conversion_rate) or 1)
-    if self.doc.supplier_qtn:
-      get_obj('DocType Mapper','Supplier Quotation-Purchase Order').dt_map('Supplier Quotation','Purchase Order',self.doc.supplier_qtn, self.doc, self.doclist, "[['Supplier Quotation','Purchase Order'],['Supplier Quotation Detail', 'PO Detail']]")
-  
-  # GET TERMS & CONDITIONS
-  # =====================================================================================
-  def get_tc_details(self):
-    return get_obj('Purchase Common').get_tc_details(self)
-
-  # validate if indent has been pulled twice
-  def validate_prev_docname(self):
-    for d in getlist(self.doclist, 'po_details'): 
-      if d.prevdoc_docname and self.doc.indent_no == d.prevdoc_docname:
-        msgprint(cstr(self.doc.indent_no) + " indent details have already been pulled. ")
-        raise Exception
-
-  # get last purchase rate
-  def get_last_purchase_rate(self):
-    get_obj('Purchase Common').get_last_purchase_rate(self)
-    
-  # validation
-  #-------------------------------------------------------------------------------------------------------------
-  def validate_doc(self,pc_obj):
-    # Please Check Supplier Quotation - Purchase ORder Transaction , it has to be discussed
-    if self.doc.supp_quo_no:
-      pc_obj.validate_doc(obj = self, prevdoc_doctype = 'Supplier Quotation', prevdoc_docname = cstr(self.doc.supp_quo_no))
-    else:
-      # Validate values with reference document
-      pc_obj.validate_reference_value(obj = self)
-
-  # Check for Stopped status 
-  def check_for_stopped_status(self, pc_obj):
-    check_list =[]
-    for d in getlist(self.doclist, 'po_details'):
-      if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list:
-        check_list.append(d.prevdoc_docname)
-        pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname)
-
-    
-  # Validate
-  def validate(self):
-    self.validate_fiscal_year()
-    # Step 1:=> set status as "Draft"
-    set(self.doc, 'status', 'Draft')
-    
-    # Step 2:=> get Purchase Common Obj
-    pc_obj = get_obj(dt='Purchase Common')
-    
-    # Step 3:=> validate mandatory
-    pc_obj.validate_mandatory(self)
-
-    # Step 4:=> validate for items
-    pc_obj.validate_for_items(self)
-
-    # Step 5:=> validate conversion rate
-    pc_obj.validate_conversion_rate(self)
-    
-    # Get po date
-    pc_obj.get_prevdoc_date(self)
-    
-    # validate_doc
-    self.validate_doc(pc_obj)
-    
-    # Check for stopped status
-    self.check_for_stopped_status(pc_obj)
-    
-      
-     # get total in words
-    dcc = TransactionBase().get_company_currency(self.doc.company)
-    self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total)
-    self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import)
-  
-  # update bin
-  # ----------
-  def update_bin(self, is_submit, is_stopped = 0):
-    pc_obj = get_obj('Purchase Common')
-    for d in getlist(self.doclist, 'po_details'):
-      #1. Check if is_stock_item == 'Yes'
-      if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes':
-        
-        ind_qty, po_qty = 0, flt(d.qty) * flt(d.conversion_factor)
-        if is_stopped:
-          po_qty = flt(d.qty) > flt(d.received_qty) and flt( flt(flt(d.qty) - flt(d.received_qty)) * flt(d.conversion_factor))or 0 
-        
-        # No updates in Indent on Stop / Unstop
-        if cstr(d.prevdoc_doctype) == 'Indent' and not is_stopped:
-          # get qty and pending_qty of prevdoc 
-          curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'Indent Detail', 'Indent - Purchase Order', self.doc.name)
-          max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0
-          
-          if flt(qty) + flt(po_qty) > flt(max_qty):
-            curr_qty = flt(max_qty) - flt(qty)
-            # special case as there is no restriction for Indent - Purchase Order 
-            curr_qty = (curr_qty > 0) and curr_qty or 0
-          else:
-            curr_qty = flt(po_qty)
-          
-          ind_qty = -flt(curr_qty)
-
-        #==> Update Bin's Indent Qty by +- ind_qty and Ordered Qty by +- qty
-        get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(po_qty), (is_submit and 1 or -1) * flt(ind_qty), 0, d.item_code, self.doc.transaction_date)
-
-  def check_modified_date(self):
-    mod_db = sql("select modified from `tabPurchase Order` where name = '%s'" % self.doc.name)
-    date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))
-    
-    if date_diff and date_diff[0][0]:
-      msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
-      raise Exception
-
-  # On Close
-  #-------------------------------------------------------------------------------------------------
-  def update_status(self, status):
-    self.check_modified_date()
-    # step 1:=> Set Status
-    set(self.doc,'status',cstr(status))
-
-    # step 2:=> Update Bin
-    self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1)
-
-    # step 3:=> Acknowledge user
-    msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
+	# Get Item Details
+	def get_item_details(self, arg =''):
+		if arg:
+			return get_obj(dt='Purchase Common').get_item_details(self,arg)
+		else:
+			obj = get_obj('Purchase Common')
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					temp = {
+						'item_code': doc.fields.get('item_code'),
+						'warehouse': doc.fields.get('warehouse')
+					}
+					ret = obj.get_item_details(self, json.dumps(temp))
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]
 
 
-  # On Submit
-  def on_submit(self):
-    pc_obj = get_obj(dt ='Purchase Common')
-    
-    # Step 1 :=> Update Previous Doc i.e. update pending_qty and Status accordingly
-    pc_obj.update_prevdoc_detail(self, is_submit = 1)
 
-    # Step 2 :=> Update Bin 
-    self.update_bin(is_submit = 1, is_stopped = 0)
-    
-    # Step 3 :=> Check For Approval Authority
-    get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total)
-    
-    # Step 4 :=> Update Current PO No. in Supplier as last_purchase_order.
-    update_supplier = sql("update `tabSupplier` set last_purchase_order = '%s' where name = '%s'" % (self.doc.name, self.doc.supplier))
+	# Get UOM Details
+	def get_uom_details(self, arg = ''):
+		return get_obj(dt='Purchase Common').get_uom_details(arg)
 
-    # Step 5 :=> Update last purchase rate
-    pc_obj.update_last_purchase_rate(self, is_submit = 1)
+	# get available qty at warehouse
+	def get_bin_details(self, arg = ''):
+		return get_obj(dt='Purchase Common').get_bin_details(arg)
 
-    # Step 6 :=> Set Status
-    set(self.doc,'status','Submitted')
-    
-    self.doc.indent_no = '';
-  
-   
-  # On Cancel
-  # -------------------------------------------------------------------------------------------------------
-  def on_cancel(self):
-    pc_obj = get_obj(dt = 'Purchase Common')
-    
-    # 1.Check if PO status is stopped
-    pc_obj.check_for_stopped_status(cstr(self.doc.doctype), cstr(self.doc.name))
-    
-    self.check_for_stopped_status(pc_obj)
-    
-    # 2.Check if Purchase Receipt has been submitted against current Purchase Order
-    pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Receipt', docname = self.doc.name, detail_doctype = 'Purchase Receipt Detail')
+	# Pull Indent
+	def get_indent_details(self):
+		#self.validate_prev_docname() 
+		if self.doc.indent_no:
+			get_obj('DocType Mapper','Indent-Purchase Order').dt_map('Indent','Purchase Order',self.doc.indent_no, self.doc, self.doclist, "[['Indent','Purchase Order'],['Indent Detail', 'PO Detail']]")
+			for d in getlist(self.doclist, 'po_details'):			
+				if d.item_code:
+					item = sql("select last_purchase_rate from tabItem where name = '%s'" %(d.item_code), as_dict=1)
+					d.purchase_rate = item and flt(item[0]['last_purchase_rate']) or 0
+					d.import_rate = flt(item and flt(item[0]['last_purchase_rate']) or 0) / flt(self.doc.fields.has_key('conversion_rate') and flt(self.doc.conversion_rate) or 1)
+		if self.doc.supplier_qtn:
+			get_obj('DocType Mapper','Supplier Quotation-Purchase Order').dt_map('Supplier Quotation','Purchase Order',self.doc.supplier_qtn, self.doc, self.doclist, "[['Supplier Quotation','Purchase Order'],['Supplier Quotation Detail', 'PO Detail']]")
+	
+	# GET TERMS & CONDITIONS
+	# =====================================================================================
+	def get_tc_details(self):
+		return get_obj('Purchase Common').get_tc_details(self)
 
-    # 3.Check if Payable Voucher has been submitted against current Purchase Order
-    #pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail')
-    
-    submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_order = '%s' and t1.docstatus = 1" % self.doc.name)
-    if submitted:
-      msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
-      raise Exception
+	# validate if indent has been pulled twice
+	def validate_prev_docname(self):
+		for d in getlist(self.doclist, 'po_details'): 
+			if d.prevdoc_docname and self.doc.indent_no == d.prevdoc_docname:
+				msgprint(cstr(self.doc.indent_no) + " indent details have already been pulled. ")
+				raise Exception
 
-    # 4.Set Status as Cancelled
-    set(self.doc,'status','Cancelled')
+	# get last purchase rate
+	def get_last_purchase_rate(self):
+		get_obj('Purchase Common').get_last_purchase_rate(self)
+		
+	# validation
+	#-------------------------------------------------------------------------------------------------------------
+	def validate_doc(self,pc_obj):
+		# Please Check Supplier Quotation - Purchase ORder Transaction , it has to be discussed
+		if self.doc.supp_quo_no:
+			pc_obj.validate_doc(obj = self, prevdoc_doctype = 'Supplier Quotation', prevdoc_docname = cstr(self.doc.supp_quo_no))
+		else:
+			# Validate values with reference document
+			pc_obj.validate_reference_value(obj = self)
 
-    # 5.Update Indents Pending Qty and accordingly it's Status 
-    pc_obj.update_prevdoc_detail(self,is_submit = 0)
-    
-    # 6.Update Bin  
-    self.update_bin( is_submit = 0, is_stopped = 0)
-    
-    # Step 7 :=> Update last purchase rate 
-    pc_obj.update_last_purchase_rate(self, is_submit = 0)
-    
+	# Check for Stopped status 
+	def check_for_stopped_status(self, pc_obj):
+		check_list =[]
+		for d in getlist(self.doclist, 'po_details'):
+			if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list:
+				check_list.append(d.prevdoc_docname)
+				pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname)
+
+		
+	# Validate
+	def validate(self):
+		self.validate_fiscal_year()
+		# Step 1:=> set status as "Draft"
+		set(self.doc, 'status', 'Draft')
+		
+		# Step 2:=> get Purchase Common Obj
+		pc_obj = get_obj(dt='Purchase Common')
+		
+		# Step 3:=> validate mandatory
+		pc_obj.validate_mandatory(self)
+
+		# Step 4:=> validate for items
+		pc_obj.validate_for_items(self)
+
+		# Step 5:=> validate conversion rate
+		pc_obj.validate_conversion_rate(self)
+		
+		# Get po date
+		pc_obj.get_prevdoc_date(self)
+		
+		# validate_doc
+		self.validate_doc(pc_obj)
+		
+		# Check for stopped status
+		self.check_for_stopped_status(pc_obj)
+		
+			
+		 # get total in words
+		dcc = TransactionBase().get_company_currency(self.doc.company)
+		self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total)
+		self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import)
+	
+	# update bin
+	# ----------
+	def update_bin(self, is_submit, is_stopped = 0):
+		pc_obj = get_obj('Purchase Common')
+		for d in getlist(self.doclist, 'po_details'):
+			#1. Check if is_stock_item == 'Yes'
+			if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes':
+				
+				ind_qty, po_qty = 0, flt(d.qty) * flt(d.conversion_factor)
+				if is_stopped:
+					po_qty = flt(d.qty) > flt(d.received_qty) and flt( flt(flt(d.qty) - flt(d.received_qty)) * flt(d.conversion_factor))or 0 
+				
+				# No updates in Indent on Stop / Unstop
+				if cstr(d.prevdoc_doctype) == 'Indent' and not is_stopped:
+					# get qty and pending_qty of prevdoc 
+					curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'Indent Detail', 'Indent - Purchase Order', self.doc.name)
+					max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0
+					
+					if flt(qty) + flt(po_qty) > flt(max_qty):
+						curr_qty = flt(max_qty) - flt(qty)
+						# special case as there is no restriction for Indent - Purchase Order 
+						curr_qty = (curr_qty > 0) and curr_qty or 0
+					else:
+						curr_qty = flt(po_qty)
+					
+					ind_qty = -flt(curr_qty)
+
+				#==> Update Bin's Indent Qty by +- ind_qty and Ordered Qty by +- qty
+				get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(po_qty), (is_submit and 1 or -1) * flt(ind_qty), 0, d.item_code, self.doc.transaction_date)
+
+	def check_modified_date(self):
+		mod_db = sql("select modified from `tabPurchase Order` where name = '%s'" % self.doc.name)
+		date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))
+		
+		if date_diff and date_diff[0][0]:
+			msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
+			raise Exception
+
+	# On Close
+	#-------------------------------------------------------------------------------------------------
+	def update_status(self, status):
+		self.check_modified_date()
+		# step 1:=> Set Status
+		set(self.doc,'status',cstr(status))
+
+		# step 2:=> Update Bin
+		self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1)
+
+		# step 3:=> Acknowledge user
+		msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
+
+
+	# On Submit
+	def on_submit(self):
+		pc_obj = get_obj(dt ='Purchase Common')
+		
+		# Step 1 :=> Update Previous Doc i.e. update pending_qty and Status accordingly
+		pc_obj.update_prevdoc_detail(self, is_submit = 1)
+
+		# Step 2 :=> Update Bin 
+		self.update_bin(is_submit = 1, is_stopped = 0)
+		
+		# Step 3 :=> Check For Approval Authority
+		get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total)
+		
+		# Step 4 :=> Update Current PO No. in Supplier as last_purchase_order.
+		update_supplier = sql("update `tabSupplier` set last_purchase_order = '%s' where name = '%s'" % (self.doc.name, self.doc.supplier))
+
+		# Step 5 :=> Update last purchase rate
+		pc_obj.update_last_purchase_rate(self, is_submit = 1)
+
+		# Step 6 :=> Set Status
+		set(self.doc,'status','Submitted')
+		
+		self.doc.indent_no = '';
+	
+	 
+	# On Cancel
+	# -------------------------------------------------------------------------------------------------------
+	def on_cancel(self):
+		pc_obj = get_obj(dt = 'Purchase Common')
+		
+		# 1.Check if PO status is stopped
+		pc_obj.check_for_stopped_status(cstr(self.doc.doctype), cstr(self.doc.name))
+		
+		self.check_for_stopped_status(pc_obj)
+		
+		# 2.Check if Purchase Receipt has been submitted against current Purchase Order
+		pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Receipt', docname = self.doc.name, detail_doctype = 'Purchase Receipt Detail')
+
+		# 3.Check if Payable Voucher has been submitted against current Purchase Order
+		#pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail')
+		
+		submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_order = '%s' and t1.docstatus = 1" % self.doc.name)
+		if submitted:
+			msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
+			raise Exception
+
+		# 4.Set Status as Cancelled
+		set(self.doc,'status','Cancelled')
+
+		# 5.Update Indents Pending Qty and accordingly it's Status 
+		pc_obj.update_prevdoc_detail(self,is_submit = 0)
+		
+		# 6.Update Bin	
+		self.update_bin( is_submit = 0, is_stopped = 0)
+		
+		# Step 7 :=> Update last purchase rate 
+		pc_obj.update_last_purchase_rate(self, is_submit = 0)
+		
 #----------- code for Sub-contracted Items -------------------
-  #--------check for sub-contracted items and accordingly update PO raw material detail table--------
-  def update_rw_material_detail(self):
-    for d in getlist(self.doclist,'po_details'):
-      item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code))
-      
-      if item_det[0][0] == 'Yes':
-        if item_det[0][1] == 'Yes':
-          if not self.doc.is_subcontracted:
-            msgprint("Please enter whether purchase order to be made for subcontracting or for purchasing in 'Is Subcontracted' field .")
-            raise Exception
-          if self.doc.is_subcontracted == 'Yes':
-            self.add_bom(d)
-          else:
-            self.doc.clear_table(self.doclist,'po_raw_material_details',1)
-            self.doc.save()
-        elif item_det[0][1] == 'No':
-          self.add_bom(d)
-        
-      self.delete_irrelevant_raw_material()
-      #---------------calculate amt in  PO Raw Material Detail-------------
-      self.calculate_amount(d)
-      
-  def add_bom(self, d):
-    #----- fetching default bom from Bill of Materials instead of Item Master --
-    bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.parent from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1" % d.item_code)
-    
-    if not bom_det:
-      msgprint("No default BOM exists for item: %s" % d.item_code)
-      raise Exception
-    else:
-      #-------------- add child function--------------------
-      chgd_rqd_qty = []
-      for i in bom_det:
-        if i and not sql("select name from `tabPO Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
+	#--------check for sub-contracted items and accordingly update PO raw material detail table--------
+	def update_rw_material_detail(self):
+		for d in getlist(self.doclist,'po_details'):
+			item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code))
+			
+			if item_det[0][0] == 'Yes':
+				if item_det[0][1] == 'Yes':
+					if not self.doc.is_subcontracted:
+						msgprint("Please enter whether purchase order to be made for subcontracting or for purchasing in 'Is Subcontracted' field .")
+						raise Exception
+					if self.doc.is_subcontracted == 'Yes':
+						self.add_bom(d)
+					else:
+						self.doc.clear_table(self.doclist,'po_raw_material_details',1)
+						self.doc.save()
+				elif item_det[0][1] == 'No':
+					self.add_bom(d)
+				
+			self.delete_irrelevant_raw_material()
+			#---------------calculate amt in	PO Raw Material Detail-------------
+			self.calculate_amount(d)
+			
+	def add_bom(self, d):
+		#----- fetching default bom from Bill of Materials instead of Item Master --
+		bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.parent from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1" % d.item_code)
+		
+		if not bom_det:
+			msgprint("No default BOM exists for item: %s" % d.item_code)
+			raise Exception
+		else:
+			#-------------- add child function--------------------
+			chgd_rqd_qty = []
+			for i in bom_det:
+				if i and not sql("select name from `tabPO Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
 
-          rm_child = addchild(self.doc, 'po_raw_material_details', 'PO Raw Material Detail', 1, self.doclist)
+					rm_child = addchild(self.doc, 'po_raw_material_details', 'PO Raw Material Detail', 1, self.doclist)
 
-          rm_child.reference_name = d.name
-          rm_child.bom_detail_no = i and i[6] or ''
-          rm_child.main_item_code = i and i[0] or ''
-          rm_child.rm_item_code = i and i[1] or ''
-          rm_child.stock_uom = i and i[5] or ''
-          rm_child.rate = i and flt(i[3]) or flt(i[4])
-          rm_child.conversion_factor = d.conversion_factor
-          rm_child.required_qty = flt(i  and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
-          rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate))
-          rm_child.save()
-          chgd_rqd_qty.append(cstr(i[1]))
-        else:
-          act_qty = flt(i  and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
-          for po_rmd in getlist(self.doclist, 'po_raw_material_details'):
-            if i and i[6] == po_rmd.bom_detail_no and (flt(act_qty) != flt(po_rmd.required_qty) or i[1] != po_rmd.rm_item_code):
-              chgd_rqd_qty.append(cstr(i[1]))
-              po_rmd.main_item_code = i[0]
-              po_rmd.rm_item_code = i[1]
-              po_rmd.stock_uom = i[5]
-              po_rmd.required_qty = flt(act_qty)
-              po_rmd.rate = i and flt(i[3]) or flt(i[4])
-              po_rmd.amount = flt(flt(po_rmd.consumed_qty)*flt(po_rmd.rate))
-              
+					rm_child.reference_name = d.name
+					rm_child.bom_detail_no = i and i[6] or ''
+					rm_child.main_item_code = i and i[0] or ''
+					rm_child.rm_item_code = i and i[1] or ''
+					rm_child.stock_uom = i and i[5] or ''
+					rm_child.rate = i and flt(i[3]) or flt(i[4])
+					rm_child.conversion_factor = d.conversion_factor
+					rm_child.required_qty = flt(i	and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
+					rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate))
+					rm_child.save()
+					chgd_rqd_qty.append(cstr(i[1]))
+				else:
+					act_qty = flt(i	and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
+					for po_rmd in getlist(self.doclist, 'po_raw_material_details'):
+						if i and i[6] == po_rmd.bom_detail_no and (flt(act_qty) != flt(po_rmd.required_qty) or i[1] != po_rmd.rm_item_code):
+							chgd_rqd_qty.append(cstr(i[1]))
+							po_rmd.main_item_code = i[0]
+							po_rmd.rm_item_code = i[1]
+							po_rmd.stock_uom = i[5]
+							po_rmd.required_qty = flt(act_qty)
+							po_rmd.rate = i and flt(i[3]) or flt(i[4])
+							po_rmd.amount = flt(flt(po_rmd.consumed_qty)*flt(po_rmd.rate))
+							
 
-  # Delete irrelevant raw material from PR Raw material details
-  #--------------------------------------------------------------  
-  def delete_irrelevant_raw_material(self):
-    for d in getlist(self.doclist,'po_raw_material_details'):
-      if not sql("select name from `tabPO Detail` where name = '%s' and parent = '%s'and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)):
-        d.parent = 'old_par:'+self.doc.name
-        d.save()
-    
-  def calculate_amount(self, d):
-    amt = 0
-    for i in getlist(self.doclist,'po_raw_material_details'):
-      
-      if(i.reference_name == d.name):
-        i.amount = flt(i.required_qty)* flt(i.rate)
-        amt += i.amount
-    d.rm_supp_cost = amt
+	# Delete irrelevant raw material from PR Raw material details
+	#--------------------------------------------------------------	
+	def delete_irrelevant_raw_material(self):
+		for d in getlist(self.doclist,'po_raw_material_details'):
+			if not sql("select name from `tabPO Detail` where name = '%s' and parent = '%s'and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)):
+				d.parent = 'old_par:'+self.doc.name
+				d.save()
+		
+	def calculate_amount(self, d):
+		amt = 0
+		for i in getlist(self.doclist,'po_raw_material_details'):
+			
+			if(i.reference_name == d.name):
+				i.amount = flt(i.required_qty)* flt(i.rate)
+				amt += i.amount
+		d.rm_supp_cost = amt
 
-  # On Update
-  # ----------------------------------------------------------------------------------------------------    
-  def on_update(self):
-    self.update_rw_material_detail()
-    
+	# On Update
+	# ----------------------------------------------------------------------------------------------------		
+	def on_update(self):
+		self.update_rw_material_detail()
+		
 
 # OTHER CHARGES TRIGGER FUNCTIONS
 # ====================================================================================
-  
-  # *********** Get Tax rate if account type is TAX ********************
-  def get_rate(self,arg):
-    return get_obj('Purchase Common').get_rate(arg,self)
+	
+	# *********** Get Tax rate if account type is TAX ********************
+	def get_rate(self,arg):
+		return get_obj('Purchase Common').get_rate(arg,self)
 
-  # **** Pull details from other charges master (Get Other Charges) ****
-  def get_purchase_tax_details(self):
-    return get_obj('Purchase Common').get_purchase_tax_details(self)
+	# **** Pull details from other charges master (Get Other Charges) ****
+	def get_purchase_tax_details(self):
+		return get_obj('Purchase Common').get_purchase_tax_details(self)
 
-  # Repair Purchase Order
-  # ===========================================
-  def repair_purchase_order(self):
-    get_obj('Purchase Common', 'Purchase Common').repair_curr_doctype_details(self)
+	# Repair Purchase Order
+	# ===========================================
+	def repair_purchase_order(self):
+		get_obj('Purchase Common', 'Purchase Common').repair_curr_doctype_details(self)
diff --git a/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py b/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py
index febcd91..eb22179 100644
--- a/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py
+++ b/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py
@@ -94,8 +94,9 @@
       
     from webnotes.utils import file_manager
     fn, content = file_manager.get_file(filename[1])
-    
-    if not type(content) == str:
+ 
+	# NOTE: Don't know why this condition exists
+    if not isinstance(content, basestring) and hasattr(content, 'tostring'):
       content = content.tostring()
 
     import webnotes.model.import_docs
diff --git a/erpnext/selling/doctype/enquiry/enquiry.js b/erpnext/selling/doctype/enquiry/enquiry.js
index 499e6c6..f7159ab 100644
--- a/erpnext/selling/doctype/enquiry/enquiry.js
+++ b/erpnext/selling/doctype/enquiry/enquiry.js
@@ -2,49 +2,49 @@
 
 cur_frm.cscript.refresh = function(doc, cdt, cdn){
 
-  // 
+	// 
 
-  if(!doc.docstatus){
-    hide_field(['Update Follow up']);
-    hide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']);
-  }
-  else{
-    unhide_field(['Update Follow up']);
-    unhide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']);
-  }
+	if(!doc.docstatus){
+		hide_field(['Update Follow up']);
+		hide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']);
+	}
+	else{
+		unhide_field(['Update Follow up']);
+		unhide_field(['email_id1','cc_to','subject','message','Attachment Html', 'Create New File', 'enquiry_attachment_detail','Send Email']);
+	}
 
-  
-  cur_frm.clear_custom_buttons();
-  if(doc.docstatus == 1) {
-    cur_frm.add_custom_button('Create Quotation', cur_frm.cscript['Create Quotation']);
-    cur_frm.add_custom_button('Enquiry Lost', cur_frm.cscript['Declare Enquiry Lost']);
-    cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
-  }
+	
+	cur_frm.clear_custom_buttons();
+	if(doc.docstatus == 1) {
+		cur_frm.add_custom_button('Create Quotation', cur_frm.cscript['Create Quotation']);
+		cur_frm.add_custom_button('Enquiry Lost', cur_frm.cscript['Declare Enquiry Lost']);
+		cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+	}
 
-  //cur_frm.cscript.clear_values(doc,cdt,cdn);
+	//cur_frm.cscript.clear_values(doc,cdt,cdn);
 }
 
 // ONLOAD
 // ===============================================================
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
 
-  if(!doc.enquiry_from) hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
-  if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
-  if(!doc.date) doc.transaction_date = date.obj_to_str(new Date());
-  if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company});
-  if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});    
-  
-  if(doc.enquiry_from) {
-    if(doc.enquiry_from == 'Customer') {
-      hide_field(['lead', 'lead_name']);
-    }
-    else if (doc.enquiry_from == 'Lead') {
-      hide_field(['customer', 'customer_address', 'contact_person', 'customer_name', 'contact_display', 'customer_group']);
-    }
-  } 
+	if(!doc.enquiry_from) hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
+	if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
+	if(!doc.date) doc.transaction_date = date.obj_to_str(new Date());
+	if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company});
+	if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});		
+	
+	if(doc.enquiry_from) {
+		if(doc.enquiry_from == 'Customer') {
+			hide_field(['lead', 'lead_name']);
+		}
+		else if (doc.enquiry_from == 'Lead') {
+			hide_field(['customer', 'customer_address', 'contact_person', 'customer_name', 'contact_display', 'customer_group']);
+		}
+	} 
 
-  // setup fetch
-  cur_frm.cscript.set_fetch();
+	// setup fetch
+	cur_frm.cscript.set_fetch();
 }
 
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
@@ -57,119 +57,119 @@
 // ===============================================================
 cur_frm.cscript.set_fetch = function() {
 
-  // item
-  cur_frm.add_fetch('item_code', 'item_name', 'item_name');
-  cur_frm.add_fetch('item_code', 'stock_uom', 'uom');
-  cur_frm.add_fetch('item_code', 'description', 'description');
-  cur_frm.add_fetch('item_code', 'item_group', 'item_group');
-  cur_frm.add_fetch('item_code', 'brand', 'brand');
+	// item
+	cur_frm.add_fetch('item_code', 'item_name', 'item_name');
+	cur_frm.add_fetch('item_code', 'stock_uom', 'uom');
+	cur_frm.add_fetch('item_code', 'description', 'description');
+	cur_frm.add_fetch('item_code', 'item_group', 'item_group');
+	cur_frm.add_fetch('item_code', 'brand', 'brand');
 
-  // customer
+	// customer
 
 }
 
 // hide - unhide fields on basis of enquiry_from lead or customer
 cur_frm.cscript.enquiry_from = function(doc,cdt,cdn){
-  cur_frm.cscript.lead_cust_show(doc,cdt,cdn);
+	cur_frm.cscript.lead_cust_show(doc,cdt,cdn);
 }
 
 // hide - unhide fields based on lead or customer
 cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){
-  if(doc.enquiry_from == 'Lead'){
-    unhide_field(['lead']);
-    hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
-    doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
-  }
-  else if(doc.enquiry_from == 'Customer'){    
-    unhide_field(['customer']);
-    hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']);    
-    doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
-  }
+	if(doc.enquiry_from == 'Lead'){
+		unhide_field(['lead']);
+		hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+		doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
+	}
+	else if(doc.enquiry_from == 'Customer'){		
+		unhide_field(['customer']);
+		hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']);		
+		doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
+	}
 }
 
 // customer
 cur_frm.cscript.customer = function(doc,dt,dn) {
-  if(doc.customer) get_server_fields('get_default_customer_address', JSON.stringify({customer: doc.customer}),'', doc, dt, dn, 1);
-  if(doc.customer) unhide_field(['customer_name','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+	if(doc.customer) get_server_fields('get_default_customer_address', JSON.stringify({customer: doc.customer}),'', doc, dt, dn, 1);
+	if(doc.customer) unhide_field(['customer_name','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
 }
 
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {    
-  if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
+	if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict.customer_address.on_new = function(dn) {
-  locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict.contact_person.on_new = function(dn) {
-  locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 // lead
 cur_frm.fields_dict['lead'].get_query = function(doc,cdt,cdn){
-  return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s"  ORDER BY  `tabLead`.`name` ASC LIMIT 50';
+	return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s"	ORDER BY	`tabLead`.`name` ASC LIMIT 50';
 }
 
 cur_frm.cscript.lead = function(doc, cdt, cdn) {
-  if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1);
-  if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']);  
+	if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1);
+	if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']);	
 }
 
 
 //item getquery
 //=======================================
 cur_frm.fields_dict['enquiry_details'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
-  if (doc.enquiry_type == 'Maintenance')
-    return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_service_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
-  else 
-    return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
+	if (doc.enquiry_type == 'Maintenance')
+		return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_service_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
+	else 
+		return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
 }
-  
+	
  //Fetch Item Details
 //====================================================================================================================
 cur_frm.cscript.item_code = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if (d.item_code) {
-    get_server_fields('get_item_details',d.item_code,'enquiry_details',doc,cdt,cdn,1);
-  }
+	var d = locals[cdt][cdn];
+	if (d.item_code) {
+		get_server_fields('get_item_details',d.item_code,'enquiry_details',doc,cdt,cdn,1);
+	}
 }
 
 /*
  //Fetch Customer Details
 //======================================================================================================================
 cur_frm.cscript.customer = function(doc, cdt, cdn){
-  if (doc.customer) {
-    get_server_fields('get_cust_address',doc.customer,'',doc,cdt,cdn,1);
-  }
+	if (doc.customer) {
+		get_server_fields('get_cust_address',doc.customer,'',doc,cdt,cdn,1);
+	}
 }
 */
 
 /*
 //=======================================================================================================================
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE `tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'" AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50';
+	return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE `tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'" AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50';
 }
 */
 
 /*
 //=======================================================================================================================
 cur_frm.cscript.contact_person = function(doc, cdt, cdn){
-  if (doc.contact_person) {
-    arg = {};
-    arg.contact_person = doc.contact_person;
-    arg.customer = doc.customer;
-    get_server_fields('get_contact_details',docstring(arg),'',doc,cdt,cdn,1);
-  }
+	if (doc.contact_person) {
+		arg = {};
+		arg.contact_person = doc.contact_person;
+		arg.customer = doc.customer;
+		get_server_fields('get_contact_details',docstring(arg),'',doc,cdt,cdn,1);
+	}
 }
 */
 
@@ -177,159 +177,159 @@
 // hide - unhide fields based on lead or customer..
 //=======================================================================================================================
 cur_frm.cscript.clear_values = function(doc,cdt,cdn) {
-  if(doc.enquiry_from == 'Lead') {
-    doc.customer = doc.customer_name = doc.contact_person = doc.customer_group = "";
-  }
-  else if(doc.enquiry_from == 'Customer') {
-    doc.lead =  doc.lead_name = "";
-  }
-  refresh_many(['lead','lead_name','customer','customer_name','contact_person','customer_group']);
+	if(doc.enquiry_from == 'Lead') {
+		doc.customer = doc.customer_name = doc.contact_person = doc.customer_group = "";
+	}
+	else if(doc.enquiry_from == 'Customer') {
+		doc.lead =	doc.lead_name = "";
+	}
+	refresh_many(['lead','lead_name','customer','customer_name','contact_person','customer_group']);
 }
 */
 
 /*
 //================ hide - unhide fields on basis of enquiry from either lead or customer =============================== 
 cur_frm.cscript.enquiry_from = function(doc,cdt,cdn){
-  cur_frm.cscript.clear_values(doc,cdt,cdn);
-   doc.address = doc.territory = doc.contact_no = doc.email_id = "";
-   refresh_many(['territory','address','contact_no','email_id']);
+	cur_frm.cscript.clear_values(doc,cdt,cdn);
+	 doc.address = doc.territory = doc.contact_no = doc.email_id = "";
+	 refresh_many(['territory','address','contact_no','email_id']);
 }
 */
 
 /*
 //================ create new contact ============================================================================
 cur_frm.cscript.new_contact = function(){
-  tn = createLocal('Contact');
-  locals['Contact'][tn].is_customer = 1;
-  if(doc.customer) locals['Contact'][tn].customer = doc.customer;
-  loaddoc('Contact', tn);
+	tn = createLocal('Contact');
+	locals['Contact'][tn].is_customer = 1;
+	if(doc.customer) locals['Contact'][tn].customer = doc.customer;
+	loaddoc('Contact', tn);
 }
 */
 
 //=======================================================================================================================
 cur_frm.cscript['Create New File'] = function(doc){
-  var fl = LocalDB.create('File');
-  fl = locals['File'][fl];
-  loaddoc('File', fl.name);
+	var fl = LocalDB.create('File');
+	fl = locals['File'][fl];
+	loaddoc('File', fl.name);
 }
 
 //update follow up
 //=================================================================================
 cur_frm.cscript['Update Follow up'] = function(doc,cdt,cdn){
 
-  $c_obj(make_doclist(doc.doctype, doc.name),'update_follow_up','',function(r, rt){
-    refresh_field('follow_up');
-    doc.__unsaved = 0;
-    cur_frm.refresh_header();
-  });
+	$c_obj(make_doclist(doc.doctype, doc.name),'update_follow_up','',function(r, rt){
+		refresh_field('follow_up');
+		doc.__unsaved = 0;
+		cur_frm.refresh_header();
+	});
 }
 
  // Create New Quotation
 // =======================================================================================================================
 cur_frm.cscript['Create Quotation'] = function(){
-  n = createLocal("Quotation");
-  $c('dt_map', args={
-	  'docs':compress_doclist([locals["Quotation"][n]]),
-	  'from_doctype':'Enquiry',
-	  'to_doctype':'Quotation',
-	  'from_docname':cur_frm.docname,
-    'from_to_list':"[['Enquiry', 'Quotation'],['Enquiry Detail','Quotation Detail']]"
-  }
-  , function(r,rt) {
-    loaddoc("Quotation", n);
-    }
-  );
+	n = createLocal("Quotation");
+	$c('dt_map', args={
+		'docs':compress_doclist([locals["Quotation"][n]]),
+		'from_doctype':'Enquiry',
+		'to_doctype':'Quotation',
+		'from_docname':cur_frm.docname,
+		'from_to_list':"[['Enquiry', 'Quotation'],['Enquiry Detail','Quotation Detail']]"
+	}
+	, function(r,rt) {
+		loaddoc("Quotation", n);
+		}
+	);
 }
 
 
-// declare enquiry  lost
+// declare enquiry	lost
 //-------------------------
 cur_frm.cscript['Declare Enquiry Lost'] = function(){
-  var e_lost_dialog;
+	var e_lost_dialog;
 
-  set_e_lost_dialog = function(){
-    e_lost_dialog = new Dialog(400,150,'Add Enquiry Lost Reason');
-    e_lost_dialog.make_body([
-      ['HTML', 'Message', '<div class="comment">Please add enquiry lost reason</div>'],
-      ['Text', 'Enquiry Lost Reason'],
-      ['HTML', 'Response', '<div class = "comment" id="update_enquiry_dialog_response"></div>'],
-      ['HTML', 'Add Reason', '<div></div>']
-    ]);
-    
-    var add_reason_btn1 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button');
-    add_reason_btn1.innerHTML = 'Add';
-    add_reason_btn1.onclick = function(){ e_lost_dialog.add(); }
-    
-    var add_reason_btn2 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button');
-    add_reason_btn2.innerHTML = 'Cancel';
-    $y(add_reason_btn2,{marginLeft:'4px'});
-    add_reason_btn2.onclick = function(){ e_lost_dialog.hide();}
-    
-    e_lost_dialog.onshow = function() {
-      e_lost_dialog.widgets['Enquiry Lost Reason'].value = '';
-      $i('update_enquiry_dialog_response').innerHTML = '';
-    }
-    
-    e_lost_dialog.add = function() {
-      // sending...
-      $i('update_enquiry_dialog_response').innerHTML = 'Processing...';
-      var arg =  strip(e_lost_dialog.widgets['Enquiry Lost Reason'].value);
-      var call_back = function(r,rt) { 
-        if(r.message == 'true'){
-          $i('update_enquiry_dialog_response').innerHTML = 'Done';
-          e_lost_dialog.hide();
-        }
-      }
-      if(arg) {
-        $c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_enquiry_lost',arg,call_back);
-      }
-      else{
-        msgprint("Please add enquiry lost reason");
-      }
-      
-    }
-  }  
-  
-  if(!e_lost_dialog){
-    set_e_lost_dialog();
-  }  
-  e_lost_dialog.show();
+	set_e_lost_dialog = function(){
+		e_lost_dialog = new Dialog(400,150,'Add Enquiry Lost Reason');
+		e_lost_dialog.make_body([
+			['HTML', 'Message', '<div class="comment">Please add enquiry lost reason</div>'],
+			['Text', 'Enquiry Lost Reason'],
+			['HTML', 'Response', '<div class = "comment" id="update_enquiry_dialog_response"></div>'],
+			['HTML', 'Add Reason', '<div></div>']
+		]);
+		
+		var add_reason_btn1 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button');
+		add_reason_btn1.innerHTML = 'Add';
+		add_reason_btn1.onclick = function(){ e_lost_dialog.add(); }
+		
+		var add_reason_btn2 = $a($i(e_lost_dialog.widgets['Add Reason']), 'button', 'button');
+		add_reason_btn2.innerHTML = 'Cancel';
+		$y(add_reason_btn2,{marginLeft:'4px'});
+		add_reason_btn2.onclick = function(){ e_lost_dialog.hide();}
+		
+		e_lost_dialog.onshow = function() {
+			e_lost_dialog.widgets['Enquiry Lost Reason'].value = '';
+			$i('update_enquiry_dialog_response').innerHTML = '';
+		}
+		
+		e_lost_dialog.add = function() {
+			// sending...
+			$i('update_enquiry_dialog_response').innerHTML = 'Processing...';
+			var arg =	strip(e_lost_dialog.widgets['Enquiry Lost Reason'].value);
+			var call_back = function(r,rt) { 
+				if(r.message == 'true'){
+					$i('update_enquiry_dialog_response').innerHTML = 'Done';
+					e_lost_dialog.hide();
+				}
+			}
+			if(arg) {
+				$c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_enquiry_lost',arg,call_back);
+			}
+			else{
+				msgprint("Please add enquiry lost reason");
+			}
+			
+		}
+	}	
+	
+	if(!e_lost_dialog){
+		set_e_lost_dialog();
+	}	
+	e_lost_dialog.show();
 }
 
 //get query select Territory
 //=======================================================================================================================
 cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
-  return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"  ORDER BY  `tabTerritory`.`name` ASC LIMIT 50';}
+	return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"	ORDER BY	`tabTerritory`.`name` ASC LIMIT 50';}
 
 /*
 //===================== Enquiry From validation - either customer or lead is mandatory =====================================
 cur_frm.cscript.enq_frm_validate = function(doc,cdt,cdn){
-  
-  if(doc.enquiry_from == 'Lead'){
-    if(!doc.lead){
-      alert("Lead is mandatory.");  
-      validated = false; 
-    }
-  }
-  else if(doc.enquiry_from == 'Customer'){
-      if(!doc.customer){
-      alert("Customer is mandatory.");
-      validated = false;
-    }
-    else if(!doc.contact_person){
-      alert("Contact Person is mandatory.");
-      validated = false;
-    }
-    else if(!doc.customer_group){
-      alert("Customer Group is mandatory.");
-      validated = false;
-    }
-  } 
+	
+	if(doc.enquiry_from == 'Lead'){
+		if(!doc.lead){
+			alert("Lead is mandatory.");	
+			validated = false; 
+		}
+	}
+	else if(doc.enquiry_from == 'Customer'){
+			if(!doc.customer){
+			alert("Customer is mandatory.");
+			validated = false;
+		}
+		else if(!doc.contact_person){
+			alert("Contact Person is mandatory.");
+			validated = false;
+		}
+		else if(!doc.customer_group){
+			alert("Customer Group is mandatory.");
+			validated = false;
+		}
+	} 
 }
 */
 
 //===================validation function ==============================================================================
 
 cur_frm.cscript.validate = function(doc,cdt,cdn){
-  //cur_frm.cscript.enq_frm_validate(doc,cdt,cdn);
+	//cur_frm.cscript.enq_frm_validate(doc,cdt,cdn);
 }
diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js
index 9ff676f..9ba743d 100644
--- a/erpnext/selling/doctype/quotation/quotation.js
+++ b/erpnext/selling/doctype/quotation/quotation.js
@@ -12,53 +12,57 @@
 // ONLOAD
 // ===================================================================================
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
-  if(!doc.quotation_to) hide_field(['customer','customer_address','contact_person','customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
-  if(!doc.price_list_name) set_multiple(cdt,cdn,{price_list_name:sys_defaults.price_list_name});
-  if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
-  if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()});
-  if(!doc.conversion_rate) set_multiple(cdt,cdn,{conversion_rate:'1.00'});
-  if(!doc.currency && sys_defaults.currency) set_multiple(cdt,cdn,{currency:sys_defaults.currency});
-  if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1});
+	if(!doc.quotation_to) hide_field(['customer','customer_address','contact_person','customer_name','lead', 'lead_name', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
+	if(!doc.price_list_name) set_multiple(cdt,cdn,{price_list_name:sys_defaults.price_list_name});
+	if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
+	if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()});
+	if(!doc.conversion_rate) set_multiple(cdt,cdn,{conversion_rate:'1.00'});
+	if(!doc.currency && sys_defaults.currency) set_multiple(cdt,cdn,{currency:sys_defaults.currency});
+	if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1});
 
-  if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company});
-  if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});
+	if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company});
+	if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});
 
-  if(doc.quotation_to) {
-    if(doc.quotation_to == 'Customer') {
-      hide_field(['lead', 'lead_name']);
-    }
-    else if (doc.quotation_to == 'Lead') {
-      hide_field(['customer','customer_address','contact_person', 'customer_name','contact_display', 'customer_group']);
-    }
-  }
+	if(doc.quotation_to) {
+		if(doc.quotation_to == 'Customer') {
+			hide_field(['lead', 'lead_name']);
+		}
+		else if (doc.quotation_to == 'Lead') {
+			hide_field(['customer','customer_address','contact_person', 'customer_name','contact_display', 'customer_group']);
+		}
+	}
+
+	// defined in sales_common.js
+	cur_frm.cscript.update_item_details(doc, cdt, cdn);
+
 }
 
 cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
-  // load default charges
-  if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length)
-    cur_frm.cscript.load_taxes(doc, cdt, cdn);
+	// load default charges
+	if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length)
+		cur_frm.cscript.load_taxes(doc, cdt, cdn);
 }
 
 // hide - unhide fields based on lead or customer..
 // =======================================================================================================================
 cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){
-  if(doc.quotation_to == 'Lead'){
-    unhide_field(['lead']);
-    hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
-    doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
-  }
-  else if(doc.quotation_to == 'Customer'){
-    unhide_field(['customer']);
-    hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']);
-    doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
-  }
+	if(doc.quotation_to == 'Lead'){
+		unhide_field(['lead']);
+		hide_field(['lead_name','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+		doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
+	}
+	else if(doc.quotation_to == 'Customer'){
+		unhide_field(['customer']);
+		hide_field(['lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory']);
+		doc.lead = doc.lead_name = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
+	}
 }
 
 
 
 //================ hide - unhide fields on basis of quotation to either lead or customer ===============================
 cur_frm.cscript.quotation_to = function(doc,cdt,cdn){
-  cur_frm.cscript.lead_cust_show(doc,cdt,cdn);
+	cur_frm.cscript.lead_cust_show(doc,cdt,cdn);
 }
 
 
@@ -66,111 +70,111 @@
 // ===================================================================================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) {
 
-  cur_frm.clear_custom_buttons();
+	cur_frm.clear_custom_buttons();
 
-  if(doc.docstatus == 1 && doc.status!='Order Lost') {
-    cur_frm.add_custom_button('Make Sales Order', cur_frm.cscript['Make Sales Order']);
-    cur_frm.add_custom_button('Set as Lost', cur_frm.cscript['Declare Order Lost']);
-    cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
-  }
+	if(doc.docstatus == 1 && doc.status!='Order Lost') {
+		cur_frm.add_custom_button('Make Sales Order', cur_frm.cscript['Make Sales Order']);
+		cur_frm.add_custom_button('Set as Lost', cur_frm.cscript['Declare Order Lost']);
+		cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+	}
 
-  if (!doc.docstatus) hide_field(['Update Follow up']);
-  else unhide_field(['Update Follow up']);
+	if (!doc.docstatus) hide_field(['Update Follow up']);
+	else unhide_field(['Update Follow up']);
 }
 
 
 //customer
 cur_frm.cscript.customer = function(doc,dt,dn) {
-  var callback = function(r,rt) {
-      var doc = locals[cur_frm.doctype][cur_frm.docname];
-      cur_frm.refresh();
-  }
+	var callback = function(r,rt) {
+			var doc = locals[cur_frm.doctype][cur_frm.docname];
+			cur_frm.refresh();
+	}
 
-  if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback);
-  if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+	if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback);
+	if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
 }
 
 cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {
-  if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+	if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict.customer_address.on_new = function(dn) {
-  locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict.contact_person.on_new = function(dn) {
-  locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 //lead
 cur_frm.fields_dict['lead'].get_query = function(doc,cdt,cdn){
-  return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s"  ORDER BY  `tabLead`.`name` ASC LIMIT 50';
+	return 'SELECT `tabLead`.name, `tabLead`.lead_name FROM `tabLead` WHERE `tabLead`.%(key)s LIKE "%s"	ORDER BY	`tabLead`.`name` ASC LIMIT 50';
 }
 
 cur_frm.cscript.lead = function(doc, cdt, cdn) {
-  if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1);
-  if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']);
+	if(doc.lead) get_server_fields('get_lead_details', doc.lead,'', doc, cdt, cdn, 1);
+	if(doc.lead) unhide_field(['lead_name','address_display','contact_mobile','contact_email','territory']);
 }
 
 
 // =====================================================================================
 cur_frm.fields_dict['enq_no'].get_query = function(doc,cdt,cdn){
-  var cond='';
-  var cond1='';
-  if(doc.order_type) cond = 'ifnull(`tabEnquiry`.enquiry_type, "") = "'+doc.order_type+'" AND';
-  if(doc.customer) cond1 = '`tabEnquiry`.customer = "'+doc.customer+'" AND';
-  else if(doc.lead) cond1 = '`tabEnquiry`.lead = "'+doc.lead+'" AND';
+	var cond='';
+	var cond1='';
+	if(doc.order_type) cond = 'ifnull(`tabEnquiry`.enquiry_type, "") = "'+doc.order_type+'" AND';
+	if(doc.customer) cond1 = '`tabEnquiry`.customer = "'+doc.customer+'" AND';
+	else if(doc.lead) cond1 = '`tabEnquiry`.lead = "'+doc.lead+'" AND';
 
-  return repl('SELECT `tabEnquiry`.`name` FROM `tabEnquiry` WHERE `tabEnquiry`.`docstatus` = 1 AND `tabEnquiry`.status = "Submitted" AND %(cond)s %(cond1)s `tabEnquiry`.`name` LIKE "%s" ORDER BY `tabEnquiry`.`name` ASC LIMIT 50', {cond:cond, cond1:cond1});
+	return repl('SELECT `tabEnquiry`.`name` FROM `tabEnquiry` WHERE `tabEnquiry`.`docstatus` = 1 AND `tabEnquiry`.status = "Submitted" AND %(cond)s %(cond1)s `tabEnquiry`.`name` LIKE "%s" ORDER BY `tabEnquiry`.`name` ASC LIMIT 50', {cond:cond, cond1:cond1});
 }
 
 // Make Sales Order
 // =====================================================================================
 cur_frm.cscript['Make Sales Order'] = function() {
-  var doc = cur_frm.doc;
+	var doc = cur_frm.doc;
 
-  if (doc.docstatus == 1) {
-    var n = createLocal("Sales Order");
-    $c('dt_map', args={
-      'docs':compress_doclist([locals["Sales Order"][n]]),
-      'from_doctype':'Quotation',
-      'to_doctype':'Sales Order',
-      'from_docname':doc.name,
-      'from_to_list':"[['Quotation', 'Sales Order'], ['Quotation Detail', 'Sales Order Detail'],['RV Tax Detail','RV Tax Detail'], ['Sales Team', 'Sales Team'], ['TC Detail', 'TC Detail']]"
-    }, function(r,rt) {
-      loaddoc("Sales Order", n);
-    });
-  }
+	if (doc.docstatus == 1) {
+		var n = createLocal("Sales Order");
+		$c('dt_map', args={
+			'docs':compress_doclist([locals["Sales Order"][n]]),
+			'from_doctype':'Quotation',
+			'to_doctype':'Sales Order',
+			'from_docname':doc.name,
+			'from_to_list':"[['Quotation', 'Sales Order'], ['Quotation Detail', 'Sales Order Detail'],['RV Tax Detail','RV Tax Detail'], ['Sales Team', 'Sales Team'], ['TC Detail', 'TC Detail']]"
+		}, function(r,rt) {
+			loaddoc("Sales Order", n);
+		});
+	}
 }
 
 //pull enquiry details
 cur_frm.cscript['Pull Enquiry Detail'] = function(doc,cdt,cdn){
 
-  var callback = function(r,rt){
-    if(r.message){
-      doc.quotation_to = r.message;
+	var callback = function(r,rt){
+		if(r.message){
+			doc.quotation_to = r.message;
 
-		  if(doc.quotation_to == 'Lead') {
-  			  unhide_field(['lead','lead_name','address_display','contact_mobile','contact_email','territory']);
-		  }
-		  else if(doc.quotation_to == 'Customer') {
-			  unhide_field(['customer','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
-		  }
-		  refresh_many(['quotation_details','quotation_to','customer','customer_address','contact_person','lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','order_type']);
-    }
-  }
+			if(doc.quotation_to == 'Lead') {
+					unhide_field(['lead','lead_name','address_display','contact_mobile','contact_email','territory']);
+			}
+			else if(doc.quotation_to == 'Customer') {
+				unhide_field(['customer','customer_address','contact_person','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+			}
+			refresh_many(['quotation_details','quotation_to','customer','customer_address','contact_person','lead','lead_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','order_type']);
+		}
+	}
 
-  $c_obj(make_doclist(doc.doctype, doc.name),'pull_enq_details','',callback);
+	$c_obj(make_doclist(doc.doctype, doc.name),'pull_enq_details','',callback);
 
 }
 
@@ -178,70 +182,70 @@
 //=================================================================================
 cur_frm.cscript['Update Follow up'] = function(doc){
 
-  $c_obj(make_doclist(doc.doctype, doc.name),'update_followup_details','',function(r, rt){
-    refresh_field('follow_up');
-    doc.__unsaved = 0;
-    cur_frm.refresh_header();
-  });
+	$c_obj(make_doclist(doc.doctype, doc.name),'update_followup_details','',function(r, rt){
+		refresh_field('follow_up');
+		doc.__unsaved = 0;
+		cur_frm.refresh_header();
+	});
 }
 
 
 // declare order lost
 //-------------------------
 cur_frm.cscript['Declare Order Lost'] = function(){
-  var qtn_lost_dialog;
+	var qtn_lost_dialog;
 
-  set_qtn_lost_dialog = function(doc,cdt,cdn){
-    qtn_lost_dialog = new Dialog(400,400,'Add Quotation Lost Reason');
-    qtn_lost_dialog.make_body([
-      ['HTML', 'Message', '<div class="comment">Please add quotation lost reason</div>'],
-      ['Text', 'Quotation Lost Reason'],
-      ['HTML', 'Response', '<div class = "comment" id="update_quotation_dialog_response"></div>'],
-      ['HTML', 'Add Reason', '<div></div>']
-    ]);
+	set_qtn_lost_dialog = function(doc,cdt,cdn){
+		qtn_lost_dialog = new Dialog(400,400,'Add Quotation Lost Reason');
+		qtn_lost_dialog.make_body([
+			['HTML', 'Message', '<div class="comment">Please add quotation lost reason</div>'],
+			['Text', 'Quotation Lost Reason'],
+			['HTML', 'Response', '<div class = "comment" id="update_quotation_dialog_response"></div>'],
+			['HTML', 'Add Reason', '<div></div>']
+		]);
 
-    var add_reason_btn1 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button');
-    add_reason_btn1.innerHTML = 'Add';
-    add_reason_btn1.onclick = function(){ qtn_lost_dialog.add(); }
+		var add_reason_btn1 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button');
+		add_reason_btn1.innerHTML = 'Add';
+		add_reason_btn1.onclick = function(){ qtn_lost_dialog.add(); }
 
-    var add_reason_btn2 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button');
-    add_reason_btn2.innerHTML = 'Cancel';
-    $y(add_reason_btn2,{marginLeft:'4px'});
-    add_reason_btn2.onclick = function(){ qtn_lost_dialog.hide();}
+		var add_reason_btn2 = $a($i(qtn_lost_dialog.widgets['Add Reason']), 'button', 'button');
+		add_reason_btn2.innerHTML = 'Cancel';
+		$y(add_reason_btn2,{marginLeft:'4px'});
+		add_reason_btn2.onclick = function(){ qtn_lost_dialog.hide();}
 
-    qtn_lost_dialog.onshow = function() {
-      qtn_lost_dialog.widgets['Quotation Lost Reason'].value = '';
-      $i('update_quotation_dialog_response').innerHTML = '';
-    }
+		qtn_lost_dialog.onshow = function() {
+			qtn_lost_dialog.widgets['Quotation Lost Reason'].value = '';
+			$i('update_quotation_dialog_response').innerHTML = '';
+		}
 
-    qtn_lost_dialog.add = function() {
-      // sending...
-      $i('update_quotation_dialog_response').innerHTML = 'Processing...';
-      var arg =  strip(qtn_lost_dialog.widgets['Quotation Lost Reason'].value);
-      var call_back = function(r,rt) {
-        if(r.message == 'true'){
-          $i('update_quotation_dialog_response').innerHTML = 'Done';
-          qtn_lost_dialog.hide();
-        }
-      }
-      if(arg) $c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_order_lost',arg,call_back);
-      else msgprint("Please add Quotation lost reason");
-    }
-  }
+		qtn_lost_dialog.add = function() {
+			// sending...
+			$i('update_quotation_dialog_response').innerHTML = 'Processing...';
+			var arg =	strip(qtn_lost_dialog.widgets['Quotation Lost Reason'].value);
+			var call_back = function(r,rt) {
+				if(r.message == 'true'){
+					$i('update_quotation_dialog_response').innerHTML = 'Done';
+					qtn_lost_dialog.hide();
+				}
+			}
+			if(arg) $c_obj(make_doclist(cur_frm.doc.doctype, cur_frm.doc.name),'declare_order_lost',arg,call_back);
+			else msgprint("Please add Quotation lost reason");
+		}
+	}
 
-  if(!qtn_lost_dialog){
-    set_qtn_lost_dialog(doc,cdt,cdn);
-  }
-  qtn_lost_dialog.show();
+	if(!qtn_lost_dialog){
+		set_qtn_lost_dialog(doc,cdt,cdn);
+	}
+	qtn_lost_dialog.show();
 }
 
 
 // GET REPORT
 // ========================================================================================
 cur_frm.cscript['Get Report'] = function(doc,cdt,cdn) {
-  var callback = function(report){
-  report.set_filter('Sales Order Detail', 'Quotation No.',doc.name)
-  report.dt.run();
+	var callback = function(report){
+	report.set_filter('Sales Order Detail', 'Quotation No.',doc.name)
+	report.dt.run();
  }
  loadreport('Sales Order Detail','Itemwise Sales Details', callback);
 }
@@ -250,33 +254,34 @@
 //===================== Quotation to validation - either customer or lead mandatory ====================
 cur_frm.cscript.quot_to_validate = function(doc,cdt,cdn){
 
-  if(doc.quotation_to == 'Lead'){
+	if(doc.quotation_to == 'Lead'){
 
-    if(!doc.lead){
-      alert("Lead is mandatory.");
-      validated = false;
-    }
-  }
-  else if(doc.quotation_to == 'Customer'){
-    if(!doc.customer){
-      alert("Customer is mandatory.");
-      validated = false;
-    }
-  }
+		if(!doc.lead){
+			alert("Lead is mandatory.");
+			validated = false;
+		}
+	}
+	else if(doc.quotation_to == 'Customer'){
+		if(!doc.customer){
+			alert("Customer is mandatory.");
+			validated = false;
+		}
+	}
 }
 
 //===================validation function =================================
 
 cur_frm.cscript.validate = function(doc,cdt,cdn){
-  cur_frm.cscript.quot_to_validate(doc,cdt,cdn);
+	cur_frm.cscript['Re-Calculate Values'](doc, cdt, cdn);
+	cur_frm.cscript.quot_to_validate(doc,cdt,cdn);
 }
 
 //================ Last Quoted Price and Last Sold Price suggestion ======================
 cur_frm.fields_dict['quotation_details'].grid.get_field('item_code').get_query= function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  var cond = (doc.order_type == 'Maintenance')? " and tabItem.is_service_item = 'Yes'" : " and tabItem.is_sales_item = 'Yes'"
-  if(doc.customer)
-    return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate, i.item_name, i.description FROM\
+	var d = locals[cdt][cdn];
+	var cond = (doc.order_type == 'Maintenance')? " and tabItem.is_service_item = 'Yes'" : " and tabItem.is_sales_item = 'Yes'"
+	if(doc.customer)
+		return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate, i.item_name, i.description FROM\
 		(\
 			select item_code,name, item_name, description from tabItem where tabItem.%(key)s like '%s' %(cond)s\
 		)i\
@@ -300,8 +305,8 @@
 				select rd.item_code,max(voucher_date) as voucher_date from `tabRV Detail` rd, `tabReceivable Voucher` r where r.name=rd.parent and r.docstatus=1 and customer='%(cust)s' group by rd.item_code\
 			)m where r.item_code=m.item_code and r.voucher_date=m.voucher_date\
 		)s on i.item_code=s.item_code ORDER BY item_code LIMIT 50",{cust:doc.customer, cond:cond});
-  else
-    return repl("SELECT name, item_name, description FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond});
+	else
+		return repl("SELECT name, item_name, description FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond});
 }
 
 $import(Notification Control)
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index 01e67eb..795ef79 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -19,324 +19,334 @@
 from utilities.transaction_base import TransactionBase
 
 class DocType(TransactionBase):
-  def __init__(self, doc, doclist=[]):
-    self.doc = doc
-    self.doclist = doclist
-    self.tname = 'Quotation Detail'
-    self.fname = 'quotation_details'
-    
-  # Autoname
-  # ---------
-  def autoname(self):
-    self.doc.name = make_autoname(self.doc.naming_series+'.#####')
+	def __init__(self, doc, doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
+		self.tname = 'Quotation Detail'
+		self.fname = 'quotation_details'
+		
+	# Autoname
+	# ---------
+	def autoname(self):
+		self.doc.name = make_autoname(self.doc.naming_series+'.#####')
 
 
 # DOCTYPE TRIGGER FUNCTIONS
-# ==============================================================================    
+# ==============================================================================		
  
-  # Pull Enquiry Details
-  # --------------------
-  def pull_enq_details(self):
-    self.doc.clear_table(self.doclist, 'quotation_details')
-    get_obj('DocType Mapper', 'Enquiry-Quotation').dt_map('Enquiry', 'Quotation', self.doc.enq_no, self.doc, self.doclist, "[['Enquiry', 'Quotation'],['Enquiry Detail', 'Quotation Detail']]")
+	# Pull Enquiry Details
+	# --------------------
+	def pull_enq_details(self):
+		self.doc.clear_table(self.doclist, 'quotation_details')
+		get_obj('DocType Mapper', 'Enquiry-Quotation').dt_map('Enquiry', 'Quotation', self.doc.enq_no, self.doc, self.doclist, "[['Enquiry', 'Quotation'],['Enquiry Detail', 'Quotation Detail']]")
 
-    self.get_adj_percent()
+		self.get_adj_percent()
 
-    return self.doc.quotation_to
+		return self.doc.quotation_to
 
-  # Get contact person details based on customer selected
-  # ------------------------------------------------------
-  def get_contact_details(self):
-    return get_obj('Sales Common').get_contact_details(self,0)
-  
-  # Clear Quotation Details
-  # -----------------------
-  def clear_quotation_details(self):
-    self.doc.clear_table(self.doclist, 'quotation_details')  
-  
-    
+	# Get contact person details based on customer selected
+	# ------------------------------------------------------
+	def get_contact_details(self):
+		return get_obj('Sales Common').get_contact_details(self,0)
+	
+	# Clear Quotation Details
+	# -----------------------
+	def clear_quotation_details(self):
+		self.doc.clear_table(self.doclist, 'quotation_details')	
+	
+		
 # QUOTATION DETAILS TRIGGER FUNCTIONS
-# ================================================================================    
+# ================================================================================		
 
-  # Get Item Details
-  # -----------------
-  def get_item_details(self, item_code):
-    return get_obj('Sales Common').get_item_details(item_code, self)
-  
-  # Re-calculates Basic Rate & amount based on Price List Selected
-  # --------------------------------------------------------------
-  def get_adj_percent(self, arg=''):
-    get_obj('Sales Common').get_adj_percent(self)
-    
+	# Get Item Details
+	# -----------------
+	def get_item_details(self, item_code=None):
+		if item_code:
+			return get_obj('Sales Common').get_item_details(item_code, self)
+		else:
+			obj = get_obj('Sales Common')
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					ret = obj.get_item_details(doc.item_code, self)
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]					
+
+
+	# Re-calculates Basic Rate & amount based on Price List Selected
+	# --------------------------------------------------------------
+	def get_adj_percent(self, arg=''):
+		get_obj('Sales Common').get_adj_percent(self)
+		
 
 # OTHER CHARGES TRIGGER FUNCTIONS
 # ====================================================================================
-  
-  # Get Tax rate if account type is TAX
-  # -----------------------------------
-  def get_rate(self,arg):
-    return get_obj('Sales Common').get_rate(arg)
+	
+	# Get Tax rate if account type is TAX
+	# -----------------------------------
+	def get_rate(self,arg):
+		return get_obj('Sales Common').get_rate(arg)
 
-  # Load Default Charges
-  # ----------------------------------------------------------
-  def load_default_taxes(self):
-    return get_obj('Sales Common').load_default_taxes(self)
+	# Load Default Charges
+	# ----------------------------------------------------------
+	def load_default_taxes(self):
+		return get_obj('Sales Common').load_default_taxes(self)
 
-  # Pull details from other charges master (Get Other Charges)
-  # ----------------------------------------------------------
-  def get_other_charges(self):
-    return get_obj('Sales Common').get_other_charges(self)
-  
-  # Get Lead Details along with its details
-  # ==============================================================
-  def get_lead_details1(self, name):    
-    details = sql("select name, lead_name, address_line1, address_line2, city, country, state, pincode, territory, contact_no, mobile_no, email_id from `tabLead` where name = '%s'" %(name), as_dict = 1)   
-    ret = {
-      'lead_name' : details and details[0]['lead_name'] or '',
-      'address_display' : (details and details[0]['address_line1']
-				     + (details[0]['address_line2'] and '\n' + details[0]['address_line2'] or '') + '\n' 
-				     + details[0]['city'] 
-				     + (details[0]['pincode'] and ', ' + details[0]['pincode'] or '') + '\n' 
-				     + (details[0]['state'] and details[0]['state']+', ' or '') 
-				     + details[0]['country'] + '\nTel: ' + details[0]['contact_no'] + '\n' or '-'),
-      'territory' : details and details[0]['territory'] or '',
-      'contact_mobile' : details and details[0]['mobile_no'] or '-',
-      'contact_email' : details and details[0]['email_id'] or '-'      
-    }
-    return ret
+	# Pull details from other charges master (Get Other Charges)
+	# ----------------------------------------------------------
+	def get_other_charges(self):
+		return get_obj('Sales Common').get_other_charges(self)
+	
+	# Get Lead Details along with its details
+	# ==============================================================
+	def get_lead_details1(self, name):		
+		details = sql("select name, lead_name, address_line1, address_line2, city, country, state, pincode, territory, contact_no, mobile_no, email_id from `tabLead` where name = '%s'" %(name), as_dict = 1)	 
+		ret = {
+			'lead_name' : details and details[0]['lead_name'] or '',
+			'address_display' : (details and details[0]['address_line1']
+						 + (details[0]['address_line2'] and '\n' + details[0]['address_line2'] or '') + '\n' 
+						 + details[0]['city'] 
+						 + (details[0]['pincode'] and ', ' + details[0]['pincode'] or '') + '\n' 
+						 + (details[0]['state'] and details[0]['state']+', ' or '') 
+						 + details[0]['country'] + '\nTel: ' + details[0]['contact_no'] + '\n' or '-'),
+			'territory' : details and details[0]['territory'] or '',
+			'contact_mobile' : details and details[0]['mobile_no'] or '-',
+			'contact_email' : details and details[0]['email_id'] or '-'			
+		}
+		return ret
 
-     
+		 
 # GET TERMS AND CONDITIONS
 # ====================================================================================
-  def get_tc_details(self):
-    return get_obj('Sales Common').get_tc_details(self)
+	def get_tc_details(self):
+		return get_obj('Sales Common').get_tc_details(self)
 
-    
+		
 # VALIDATE
 # ==============================================================================================
-  
-  # Amendment date is necessary if document is amended
-  # --------------------------------------------------
-  def validate_mandatory(self):
-    if self.doc.amended_from and not self.doc.amendment_date:
-      msgprint("Please Enter Amendment Date")
-      raise Exception
+	
+	# Amendment date is necessary if document is amended
+	# --------------------------------------------------
+	def validate_mandatory(self):
+		if self.doc.amended_from and not self.doc.amendment_date:
+			msgprint("Please Enter Amendment Date")
+			raise Exception
 
-  # Fiscal Year Validation
-  # ----------------------
-  def validate_fiscal_year(self):
-    get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Quotation Date')
-  
-  # Does not allow same item code to be entered twice
-  # -------------------------------------------------
-  def validate_for_items(self):
-    chk_dupl_itm = []
-    for d in getlist(self.doclist,'quotation_details'):
-      if [cstr(d.item_code),cstr(d.description)] in chk_dupl_itm:
-        msgprint("Item %s has been entered twice. Please change description atleast to continue" % d.item_code)
-        raise Exception
-      else:
-        chk_dupl_itm.append([cstr(d.item_code),cstr(d.description)])
+	# Fiscal Year Validation
+	# ----------------------
+	def validate_fiscal_year(self):
+		get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Quotation Date')
+	
+	# Does not allow same item code to be entered twice
+	# -------------------------------------------------
+	def validate_for_items(self):
+		chk_dupl_itm = []
+		for d in getlist(self.doclist,'quotation_details'):
+			if [cstr(d.item_code),cstr(d.description)] in chk_dupl_itm:
+				msgprint("Item %s has been entered twice. Please change description atleast to continue" % d.item_code)
+				raise Exception
+			else:
+				chk_dupl_itm.append([cstr(d.item_code),cstr(d.description)])
 
 
-  #do not allow sales item in maintenance quotation and service item in sales quotation
-  #-----------------------------------------------------------------------------------------------
-  def validate_order_type(self):
-    if self.doc.order_type == 'Maintenance':
-      for d in getlist(self.doclist, 'quotation_details'):
-        is_service_item = sql("select is_service_item from `tabItem` where name=%s", d.item_code)
-        is_service_item = is_service_item and is_service_item[0][0] or 'No'
-        
-        if is_service_item == 'No':
-          msgprint("You can not select non service item "+d.item_code+" in Maintenance Quotation")
-          raise Exception
-    else:
-      for d in getlist(self.doclist, 'quotation_details'):
-        is_sales_item = sql("select is_sales_item from `tabItem` where name=%s", d.item_code)
-        is_sales_item = is_sales_item and is_sales_item[0][0] or 'No'
-        
-        if is_sales_item == 'No':
-          msgprint("You can not select non sales item "+d.item_code+" in Sales Quotation")
-          raise Exception
-  
-  #--------------Validation For Last Contact Date-----------------
-  # ====================================================================================================================
-  def set_last_contact_date(self):
-    #if not self.doc.contact_date_ref:
-      #self.doc.contact_date_ref=self.doc.contact_date
-      #self.doc.last_contact_date=self.doc.contact_date_ref
-    if self.doc.contact_date_ref and self.doc.contact_date_ref != self.doc.contact_date:
-      if getdate(self.doc.contact_date_ref) < getdate(self.doc.contact_date):
-        self.doc.last_contact_date=self.doc.contact_date_ref
-      else:
-        msgprint("Contact Date Cannot be before Last Contact Date")
-        raise Exception
-      #set(self.doc, 'contact_date_ref',self.doc.contact_date)
-  
+	#do not allow sales item in maintenance quotation and service item in sales quotation
+	#-----------------------------------------------------------------------------------------------
+	def validate_order_type(self):
+		if self.doc.order_type == 'Maintenance':
+			for d in getlist(self.doclist, 'quotation_details'):
+				is_service_item = sql("select is_service_item from `tabItem` where name=%s", d.item_code)
+				is_service_item = is_service_item and is_service_item[0][0] or 'No'
+				
+				if is_service_item == 'No':
+					msgprint("You can not select non service item "+d.item_code+" in Maintenance Quotation")
+					raise Exception
+		else:
+			for d in getlist(self.doclist, 'quotation_details'):
+				is_sales_item = sql("select is_sales_item from `tabItem` where name=%s", d.item_code)
+				is_sales_item = is_sales_item and is_sales_item[0][0] or 'No'
+				
+				if is_sales_item == 'No':
+					msgprint("You can not select non sales item "+d.item_code+" in Sales Quotation")
+					raise Exception
+	
+	#--------------Validation For Last Contact Date-----------------
+	# ====================================================================================================================
+	def set_last_contact_date(self):
+		#if not self.doc.contact_date_ref:
+			#self.doc.contact_date_ref=self.doc.contact_date
+			#self.doc.last_contact_date=self.doc.contact_date_ref
+		if self.doc.contact_date_ref and self.doc.contact_date_ref != self.doc.contact_date:
+			if getdate(self.doc.contact_date_ref) < getdate(self.doc.contact_date):
+				self.doc.last_contact_date=self.doc.contact_date_ref
+			else:
+				msgprint("Contact Date Cannot be before Last Contact Date")
+				raise Exception
+			#set(self.doc, 'contact_date_ref',self.doc.contact_date)
+	
 
-  # Validate
-  # --------
-  def validate(self):
-    self.validate_fiscal_year()
-    self.validate_mandatory()
-    self.set_last_contact_date()
-    self.validate_order_type()
-    self.validate_for_items()
-    sales_com_obj = get_obj('Sales Common')
-    sales_com_obj.check_active_sales_items(self)
-    sales_com_obj.validate_max_discount(self,'quotation_details') #verify whether rate is not greater than max_discount
-    sales_com_obj.check_conversion_rate(self)
-    
-    # Get total in words
-    dcc = TransactionBase().get_company_currency(self.doc.company)
-    self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total)
-    self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export)
+	# Validate
+	# --------
+	def validate(self):
+		self.validate_fiscal_year()
+		self.validate_mandatory()
+		self.set_last_contact_date()
+		self.validate_order_type()
+		self.validate_for_items()
+		sales_com_obj = get_obj('Sales Common')
+		sales_com_obj.check_active_sales_items(self)
+		sales_com_obj.validate_max_discount(self,'quotation_details') #verify whether rate is not greater than max_discount
+		sales_com_obj.check_conversion_rate(self)
+		
+		# Get total in words
+		dcc = TransactionBase().get_company_currency(self.doc.company)
+		self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total)
+		self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export)
 
-  def on_update(self):
-    # Add to calendar
-    #if self.doc.contact_date and self.doc.last_contact_date != self.doc.contact_date:
-    if self.doc.contact_date and self.doc.contact_date_ref != self.doc.contact_date:
-      if self.doc.contact_by:
-        self.add_calendar_event()
-      set(self.doc, 'contact_date_ref',self.doc.contact_date)
-    
-    # Set Quotation Status
-    set(self.doc, 'status', 'Draft')
+	def on_update(self):
+		# Add to calendar
+		#if self.doc.contact_date and self.doc.last_contact_date != self.doc.contact_date:
+		if self.doc.contact_date and self.doc.contact_date_ref != self.doc.contact_date:
+			if self.doc.contact_by:
+				self.add_calendar_event()
+			set(self.doc, 'contact_date_ref',self.doc.contact_date)
+		
+		# Set Quotation Status
+		set(self.doc, 'status', 'Draft')
 
-    # subject for follow
-    self.doc.subject = '[%(status)s] To %(customer)s worth %(currency)s %(grand_total)s' % self.doc.fields
+		# subject for follow
+		self.doc.subject = '[%(status)s] To %(customer)s worth %(currency)s %(grand_total)s' % self.doc.fields
 
-  
-  # Add to Calendar
-  # ====================================================================================================================
-  def add_calendar_event(self):
-    desc=''
-    user_lst =[]
-    if self.doc.customer:
-      if self.doc.contact_person:
-        desc = 'Contact '+cstr(self.doc.contact_person)
-      else:
-        desc = 'Contact customer '+cstr(self.doc.customer)
-    elif self.doc.lead:
-      if self.doc.lead_name:
-        desc = 'Contact '+cstr(self.doc.lead_name)
-      else:
-        desc = 'Contact lead '+cstr(self.doc.lead)
-    desc = desc+ '.By : ' + cstr(self.doc.contact_by)
-    
-    if self.doc.to_discuss:
-      desc = desc+' To Discuss : ' + cstr(self.doc.to_discuss)
-    
-    ev = Document('Event')
-    ev.description = desc
-    ev.event_date = self.doc.contact_date
-    ev.event_hour = '10:00'
-    ev.event_type = 'Private'
-    ev.ref_type = 'Enquiry'
-    ev.ref_name = self.doc.name
-    ev.save(1)
-    
-    user_lst.append(self.doc.owner)
-    
-    chk = sql("select t1.name from `tabProfile` t1, `tabSales Person` t2 where t2.email_id = t1.name and t2.name=%s",self.doc.contact_by)
-    if chk:
-      user_lst.append(chk[0][0])
-    
-    for d in user_lst:
-      ch = addchild(ev, 'event_individuals', 'Event User', 0)
-      ch.person = d
-      ch.save(1)
-  
-  #update enquiry
-  #------------------
-  def update_enquiry(self, flag):
-    prevdoc=''
-    for d in getlist(self.doclist, 'quotation_details'):
-      if d.prevdoc_docname:
-        prevdoc = d.prevdoc_docname
-    
-    if prevdoc:
-      if flag == 'submit': #on submit
-        sql("update `tabEnquiry` set status = 'Quotation Sent' where name = %s", prevdoc)
-      elif flag == 'cancel': #on cancel
-        sql("update `tabEnquiry` set status = 'Open' where name = %s", prevdoc)
-      elif flag == 'order lost': #order lost
-        sql("update `tabEnquiry` set status = 'Enquiry Lost' where name=%s", prevdoc)
-      elif flag == 'order confirm': #order confirm
-        sql("update `tabEnquiry` set status='Order Confirmed' where name=%s", prevdoc)
-  
-  # declare as order lost
-  #-------------------------
-  def declare_order_lost(self,arg):
-    chk = sql("select t1.name from `tabSales Order` t1, `tabSales Order Detail` t2 where t2.parent = t1.name and t1.docstatus=1 and t2.prevdoc_docname = %s",self.doc.name)
-    if chk:
-      msgprint("Sales Order No. "+cstr(chk[0][0])+" is submitted against this Quotation. Thus 'Order Lost' can not be declared against it.")
-      raise Exception
-    else:
-      set(self.doc, 'status', 'Order Lost')
-      set(self.doc, 'order_lost_reason', arg)
-      self.update_enquiry('order lost')
-      return 'true'
-  
-  #check if value entered in item table
-  #--------------------------------------
-  def check_item_table(self):
-    if not getlist(self.doclist, 'quotation_details'):
-      msgprint("Please enter item details")
-      raise Exception
-    
-  # ON SUBMIT
-  # =========================================================================
-  def on_submit(self):
-    self.check_item_table()
-    if not self.doc.amended_from:
-      set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been sent')
-    else:
-      set(self.doc, 'message', 'Quotation has been amended. New Quotation no:'+self.doc.name)
-    
-    # Check for Approving Authority
-    get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self)
+	
+	# Add to Calendar
+	# ====================================================================================================================
+	def add_calendar_event(self):
+		desc=''
+		user_lst =[]
+		if self.doc.customer:
+			if self.doc.contact_person:
+				desc = 'Contact '+cstr(self.doc.contact_person)
+			else:
+				desc = 'Contact customer '+cstr(self.doc.customer)
+		elif self.doc.lead:
+			if self.doc.lead_name:
+				desc = 'Contact '+cstr(self.doc.lead_name)
+			else:
+				desc = 'Contact lead '+cstr(self.doc.lead)
+		desc = desc+ '.By : ' + cstr(self.doc.contact_by)
+		
+		if self.doc.to_discuss:
+			desc = desc+' To Discuss : ' + cstr(self.doc.to_discuss)
+		
+		ev = Document('Event')
+		ev.description = desc
+		ev.event_date = self.doc.contact_date
+		ev.event_hour = '10:00'
+		ev.event_type = 'Private'
+		ev.ref_type = 'Enquiry'
+		ev.ref_name = self.doc.name
+		ev.save(1)
+		
+		user_lst.append(self.doc.owner)
+		
+		chk = sql("select t1.name from `tabProfile` t1, `tabSales Person` t2 where t2.email_id = t1.name and t2.name=%s",self.doc.contact_by)
+		if chk:
+			user_lst.append(chk[0][0])
+		
+		for d in user_lst:
+			ch = addchild(ev, 'event_individuals', 'Event User', 0)
+			ch.person = d
+			ch.save(1)
+	
+	#update enquiry
+	#------------------
+	def update_enquiry(self, flag):
+		prevdoc=''
+		for d in getlist(self.doclist, 'quotation_details'):
+			if d.prevdoc_docname:
+				prevdoc = d.prevdoc_docname
+		
+		if prevdoc:
+			if flag == 'submit': #on submit
+				sql("update `tabEnquiry` set status = 'Quotation Sent' where name = %s", prevdoc)
+			elif flag == 'cancel': #on cancel
+				sql("update `tabEnquiry` set status = 'Open' where name = %s", prevdoc)
+			elif flag == 'order lost': #order lost
+				sql("update `tabEnquiry` set status = 'Enquiry Lost' where name=%s", prevdoc)
+			elif flag == 'order confirm': #order confirm
+				sql("update `tabEnquiry` set status='Order Confirmed' where name=%s", prevdoc)
+	
+	# declare as order lost
+	#-------------------------
+	def declare_order_lost(self,arg):
+		chk = sql("select t1.name from `tabSales Order` t1, `tabSales Order Detail` t2 where t2.parent = t1.name and t1.docstatus=1 and t2.prevdoc_docname = %s",self.doc.name)
+		if chk:
+			msgprint("Sales Order No. "+cstr(chk[0][0])+" is submitted against this Quotation. Thus 'Order Lost' can not be declared against it.")
+			raise Exception
+		else:
+			set(self.doc, 'status', 'Order Lost')
+			set(self.doc, 'order_lost_reason', arg)
+			self.update_enquiry('order lost')
+			return 'true'
+	
+	#check if value entered in item table
+	#--------------------------------------
+	def check_item_table(self):
+		if not getlist(self.doclist, 'quotation_details'):
+			msgprint("Please enter item details")
+			raise Exception
+		
+	# ON SUBMIT
+	# =========================================================================
+	def on_submit(self):
+		self.check_item_table()
+		if not self.doc.amended_from:
+			set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been sent')
+		else:
+			set(self.doc, 'message', 'Quotation has been amended. New Quotation no:'+self.doc.name)
+		
+		# Check for Approving Authority
+		get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self)
 
-    # Set Quotation Status
-    set(self.doc, 'status', 'Submitted')
-    
-    #update enquiry status
-    self.update_enquiry('submit')
-    
-    
+		# Set Quotation Status
+		set(self.doc, 'status', 'Submitted')
+		
+		#update enquiry status
+		self.update_enquiry('submit')
+		
+		
 # ON CANCEL
 # ==========================================================================
-  def on_cancel(self):
-    set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been cancelled')
-    
-    #update enquiry status
-    self.update_enquiry('cancel')
-    
-    set(self.doc,'status','Cancelled')
-    
-  
+	def on_cancel(self):
+		set(self.doc, 'message', 'Quotation: '+self.doc.name+' has been cancelled')
+		
+		#update enquiry status
+		self.update_enquiry('cancel')
+		
+		set(self.doc,'status','Cancelled')
+		
+	
 # SEND SMS
 # =============================================================================
-  def send_sms(self):
-    if not self.doc.customer_mobile_no:
-      msgprint("Please enter customer mobile no")
-    elif not self.doc.message:
-      msgprint("Please enter the message you want to send")
-    else:
-      msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.contact_mobile,], self.doc.message))
-  
+	def send_sms(self):
+		if not self.doc.customer_mobile_no:
+			msgprint("Please enter customer mobile no")
+		elif not self.doc.message:
+			msgprint("Please enter the message you want to send")
+		else:
+			msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.contact_mobile,], self.doc.message))
+	
 # Print other charges
 # ===========================================================================
-  def print_other_charges(self,docname):
-    print_lst = []
-    for d in getlist(self.doclist,'other_charges'):
-      lst1 = []
-      lst1.append(d.description)
-      lst1.append(d.total)
-      print_lst.append(lst1)
-    return print_lst
-  
-  def update_followup_details(self):
-    sql("delete from `tabFollow up` where parent = '%s'"%self.doc.name)
-    for d in getlist(self.doclist, 'follow_up'):
-      d.save()
+	def print_other_charges(self,docname):
+		print_lst = []
+		for d in getlist(self.doclist,'other_charges'):
+			lst1 = []
+			lst1.append(d.description)
+			lst1.append(d.total)
+			print_lst.append(lst1)
+		return print_lst
+	
+	def update_followup_details(self):
+		sql("delete from `tabFollow up` where parent = '%s'"%self.doc.name)
+		for d in getlist(self.doclist, 'follow_up'):
+			d.save()
diff --git a/erpnext/selling/doctype/sales_common/sales_common.js b/erpnext/selling/doctype/sales_common/sales_common.js
index 5039fcd..57f379c 100644
--- a/erpnext/selling/doctype/sales_common/sales_common.js
+++ b/erpnext/selling/doctype/sales_common/sales_common.js
@@ -7,11 +7,47 @@
 
 // ============== Load Default Taxes ===================
 cur_frm.cscript.load_taxes = function(doc, cdt, cdn) {
-  // run if this is not executed from dt_map...
-  if(doc.customer) return;
-  $c_obj([doc],'load_default_taxes','',function(r,rt){
-     refresh_field('other_charges');
-  });
+	// run if this is not executed from dt_map...
+	if(doc.customer) return;
+	$c_obj([doc],'load_default_taxes','',function(r,rt){
+		 refresh_field('other_charges');
+	});
+}
+
+
+// Gets called after existing item details are update to fill in
+// remaining default values
+cur_frm.cscript.load_defaults = function(doc, dt, dn) {
+	if(!cur_frm.doc.__islocal) { return; }
+
+	doc = locals[doc.doctype][doc.name];
+	var fields_to_refresh = LocalDB.set_default_values(doc);
+	if(fields_to_refresh) { refresh_many(fields_to_refresh); }
+
+	fields_to_refresh = null;
+	var children = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
+	if(!children) { return; }
+	for(var i=0; i<children.length; i++) {
+		LocalDB.set_default_values(children[i]);
+	}
+	refresh_field(cur_frm.cscript.fname);
+}
+
+
+// Update existing item details
+cur_frm.cscript.update_item_details = function(doc, dt, dn) {
+	if(!cur_frm.doc.__islocal) return;
+	var children = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
+	if(children) {
+		$c_obj(make_doclist(doc.doctype, doc.name), 'get_item_details', '',
+		function(r, rt) {
+			if(!r.exc) {
+				refresh_field(cur_frm.cscript.fname);
+				doc = locals[doc.doctype][doc.name];
+				cur_frm.cscript.load_defaults(doc, dt, dn);
+			}
+		});
+	}
 }
 
 
@@ -26,28 +62,28 @@
 
 // ============== Customer and its primary contact Details ============================
 cur_frm.cscript.customer = function(doc, cdt, cdn) {
-  if(doc.customer){
-    if (!doc.company) {
-      msgprint("Please select company to proceed");
-      doc.customer = '';
-      refresh_field('customer');
-    } else {
-      var callback = function(r, rt){
-	    	cur_frm.refresh();
-      }
-      $c_obj(make_doclist(doc.doctype, doc.name), 'get_customer_details', '',callback);
-    }
-  }
+	if(doc.customer){
+		if (!doc.company) {
+			msgprint("Please select company to proceed");
+			doc.customer = '';
+			refresh_field('customer');
+		} else {
+			var callback = function(r, rt){
+				cur_frm.refresh();
+			}
+			$c_obj(make_doclist(doc.doctype, doc.name), 'get_customer_details', '',callback);
+		}
+	}
 }
 
 //====================opens territory tree page ==================
 cur_frm.cscript.TerritoryHelp = function(doc,dt,dn){
-  var call_back = function(){
+	var call_back = function(){
 
-    var sb_obj = new SalesBrowser();        
-    sb_obj.set_val('Territory');
-  }
-  loadpage('Sales Browser',call_back);
+		var sb_obj = new SalesBrowser();				
+		sb_obj.set_val('Territory');
+	}
+	loadpage('Sales Browser',call_back);
 }
 
 //====================opens customer group tree page ==================
@@ -64,7 +100,7 @@
 // =====================================================================================================
 
 // ********************* CURRENCY ******************************
-cur_frm.cscript.currency = function(doc, cdt, cdn) {     
+cur_frm.cscript.currency = function(doc, cdt, cdn) {		 
 	cur_frm.cscript.price_list_name(doc, cdt, cdn);
 }
 
@@ -76,54 +112,54 @@
 
 // ******************** PRICE LIST ******************************
 cur_frm.cscript.price_list_name = function(doc, cdt, cdn) {
-  var fname = cur_frm.cscript.fname;
-  var cl = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
-  if(doc.price_list_name && doc.currency && doc.price_list_currency && doc.conversion_rate && doc.plc_conversion_rate && cl.length) {
-    $c_obj(make_doclist(doc.doctype, doc.name), 'get_adj_percent', '',
-      function(r, rt) {
-        refresh_field(fname);
-        var doc = locals[cdt][cdn];
-        cur_frm.cscript.recalc(doc,3);    //this is to re-calculate BASIC RATE and AMOUNT on basis of changed REF RATE
-      }
-    );
-  }
+	var fname = cur_frm.cscript.fname;
+	var cl = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
+	if(doc.price_list_name && doc.currency && doc.price_list_currency && doc.conversion_rate && doc.plc_conversion_rate && cl.length) {
+		$c_obj(make_doclist(doc.doctype, doc.name), 'get_adj_percent', '',
+			function(r, rt) {
+				refresh_field(fname);
+				var doc = locals[cdt][cdn];
+				cur_frm.cscript.recalc(doc,3);		//this is to re-calculate BASIC RATE and AMOUNT on basis of changed REF RATE
+			}
+		);
+	}
 }
 
 
 
 // ******************** ITEM CODE ******************************** 
 cur_frm.fields_dict[cur_frm.cscript.fname].grid.get_field("item_code").get_query = function(doc, cdt, cdn) {
-  if (doc.order_type == 'Maintenance')
-    return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_service_item="Yes" AND tabItem.docstatus != 2 AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
-  else 
-    return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND tabItem.docstatus != 2 AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
+	if (doc.order_type == 'Maintenance')
+		return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_service_item="Yes" AND tabItem.docstatus != 2 AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
+	else 
+		return 'SELECT tabItem.name,tabItem.item_name,tabItem.description FROM tabItem WHERE tabItem.is_sales_item="Yes" AND tabItem.docstatus != 2 AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") AND tabItem.%(key)s LIKE "%s" LIMIT 50';
 }
 
 
 cur_frm.cscript.item_code = function(doc, cdt, cdn) {
-  var fname = cur_frm.cscript.fname;
-  var d = locals[cdt][cdn];
-  if (d.item_code) {
-    if (!doc.company) {
-      msgprint("Please select company to proceed");
-      d.item_code = '';
-      refresh_field('item_code', d.name, fname);
-    } else {
-      var callback = function(r, rt){
-        cur_frm.cscript.recalc(doc, 1);
-      }
-      get_server_fields('get_item_details',d.item_code, fname,doc,cdt,cdn,1,callback);
-    }
-  }
-  if(cur_frm.cscript.custom_item_code){
-  	cur_frm.cscript.custom_item_code(doc, cdt, cdn);
-  }
+	var fname = cur_frm.cscript.fname;
+	var d = locals[cdt][cdn];
+	if (d.item_code) {
+		if (!doc.company) {
+			msgprint("Please select company to proceed");
+			d.item_code = '';
+			refresh_field('item_code', d.name, fname);
+		} else {
+			var callback = function(r, rt){
+				cur_frm.cscript.recalc(doc, 1);
+			}
+			get_server_fields('get_item_details',d.item_code, fname,doc,cdt,cdn,1,callback);
+		}
+	}
+	if(cur_frm.cscript.custom_item_code){
+		cur_frm.cscript.custom_item_code(doc, cdt, cdn);
+	}
 }
 
 
 // *********************** QUANTITY ***************************
 cur_frm.cscript.qty = function(doc, cdt, cdn) { cur_frm.cscript.recalc(doc, 1); }
-  
+	
 // ************************ DISCOUNT (%) ***********************
 cur_frm.cscript.adj_rate = function(doc, cdt, cdn) { cur_frm.cscript.recalc(doc, 1); }
 
@@ -171,7 +207,7 @@
 	var cur_rec = locals[cdt][cdn];
 	var fname = cur_frm.cscript.fname;
 	var tname = cur_frm.cscript.tname;
-	if(flt(cur_rec.ref_rate)>0 && flt(cur_rec.export_rate)>0 && !flt(cur_rec.adj_rate)) {
+	if(flt(cur_rec.ref_rate)>0 && flt(cur_rec.export_rate)>0) {
 		var adj_rate = 100 * (1 - (flt(cur_rec.export_rate) / flt(cur_rec.ref_rate)));
 		set_multiple(tname, cur_rec.name, { 'adj_rate': adj_rate }, fname);
 	}
@@ -183,59 +219,59 @@
 
 // ************* GET OTHER CHARGES BASED ON COMPANY *************
 cur_frm.fields_dict.charge.get_query = function(doc) {
-  return 'SELECT DISTINCT `tabOther Charges`.name FROM `tabOther Charges` WHERE `tabOther Charges`.company = "'+doc.company+'" AND `tabOther Charges`.company is not NULL AND `tabOther Charges`.docstatus != 2 AND `tabOther Charges`.%(key)s LIKE "%s" ORDER BY `tabOther Charges`.name LIMIT 50';
+	return 'SELECT DISTINCT `tabOther Charges`.name FROM `tabOther Charges` WHERE `tabOther Charges`.company = "'+doc.company+'" AND `tabOther Charges`.company is not NULL AND `tabOther Charges`.docstatus != 2 AND `tabOther Charges`.%(key)s LIKE "%s" ORDER BY `tabOther Charges`.name LIMIT 50';
 }
 
 // ********************* Get Charges ****************************
 cur_frm.cscript['Get Charges'] = function(doc, cdt, cdn) {
-   $c_obj(make_doclist(doc.doctype,doc.name),'get_other_charges','', function(r, rt) { cur_frm.cscript['Calculate Charges'](doc, cdt, cdn);});
+	$c_obj(make_doclist(doc.doctype,doc.name),'get_other_charges','', function(r, rt) { cur_frm.cscript['Calculate Charges'](doc, cdt, cdn);});
 }
 
 
 // CALCULATION OF TOTAL AMOUNTS
 // ======================================================================================================== 
 cur_frm.cscript.recalc = function(doc, n) {
-  if(!n)n=0;
-  doc = locals[doc.doctype][doc.name];
-  var tname = cur_frm.cscript.tname;
-  var fname = cur_frm.cscript.fname;
-  var sales_team = cur_frm.cscript.sales_team_fname;
-  var other_fname  = cur_frm.cscript.other_fname;
-  
-  if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); }
-  if(!flt(doc.plc_conversion_rate)) { doc.plc_conversion_rate = 1; refresh_field('plc_conversion_rate'); }
+	if(!n)n=0;
+	doc = locals[doc.doctype][doc.name];
+	var tname = cur_frm.cscript.tname;
+	var fname = cur_frm.cscript.fname;
+	var sales_team = cur_frm.cscript.sales_team_fname;
+	var other_fname	= cur_frm.cscript.other_fname;
+	
+	if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); }
+	if(!flt(doc.plc_conversion_rate)) { doc.plc_conversion_rate = 1; refresh_field('plc_conversion_rate'); }
 
-  if(n > 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n, other_fname); // updates all values in table (i.e. amount, export amount, net total etc.)
-  
-  if(flt(doc.net_total) > 0) {
-    var cl = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
-    for(var i = 0; i<cl.length; i++){
-      cl[i].total_tax_amount = 0;
-      cl[i].total_amount = 0;
-      cl[i].tax_amount = 0;                    // this is done to calculate other charges
-      cl[i].total = 0;
-      cl[i].item_wise_tax_detail = "";
-      if(in_list(['On Previous Row Amount','On Previous Row Total'],cl[i].charge_type) && !cl[i].row_id){
-        alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
-        validated = false;
-      }
-    }
-    cur_frm.cscript.calc_other_charges(doc , tname , fname , other_fname); // calculate other charges
-  }
-  cur_frm.cscript.calc_doc_values(doc, cdt, cdn, tname, fname, other_fname); // calculates total amounts
+	if(n > 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n, other_fname); // updates all values in table (i.e. amount, export amount, net total etc.)
+	
+	if(flt(doc.net_total) > 0) {
+		var cl = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
+		for(var i = 0; i<cl.length; i++){
+			cl[i].total_tax_amount = 0;
+			cl[i].total_amount = 0;
+			cl[i].tax_amount = 0;										// this is done to calculate other charges
+			cl[i].total = 0;
+			cl[i].item_wise_tax_detail = "";
+			if(in_list(['On Previous Row Amount','On Previous Row Total'],cl[i].charge_type) && !cl[i].row_id){
+				alert("Please Enter Row on which amount needs to be calculated for row : "+cl[i].idx);
+				validated = false;
+			}
+		}
+		cur_frm.cscript.calc_other_charges(doc , tname , fname , other_fname); // calculate other charges
+	}
+	cur_frm.cscript.calc_doc_values(doc, cdt, cdn, tname, fname, other_fname); // calculates total amounts
 
-  // ******************* calculate allocated amount of sales person ************************
-  cl = getchildren('Sales Team', doc.name, sales_team);
-  for(var i=0;i<cl.length;i++) {
-    if (cl[i].allocated_percentage) {
-      cl[i].allocated_amount = flt(flt(doc.net_total)*flt(cl[i].allocated_percentage)/100);
-      refresh_field('allocated_amount', cl[i].name, sales_team);
-    }
-  }
-  doc.in_words = '';
-  doc.in_words_export = '';
-  refresh_many(['total_discount_rate','total_discount','net_total','total_commission','grand_total','rounded_total','grand_total_export','rounded_total_export','in_words','in_words_export','other_charges','other_charges_total']);
-  if(cur_frm.cscript.custom_recalc)cur_frm.cscript.custom_recalc(doc);
+	// ******************* calculate allocated amount of sales person ************************
+	cl = getchildren('Sales Team', doc.name, sales_team);
+	for(var i=0;i<cl.length;i++) {
+		if (cl[i].allocated_percentage) {
+			cl[i].allocated_amount = flt(flt(doc.net_total)*flt(cl[i].allocated_percentage)/100);
+			refresh_field('allocated_amount', cl[i].name, sales_team);
+		}
+	}
+	doc.in_words = '';
+	doc.in_words_export = '';
+	refresh_many(['total_discount_rate','total_discount','net_total','total_commission','grand_total','rounded_total','grand_total_export','rounded_total_export','in_words','in_words_export','other_charges','other_charges_total']);
+	if(cur_frm.cscript.custom_recalc)cur_frm.cscript.custom_recalc(doc);
 }
 
 // ******* Calculation of total amounts of document (item amount + other charges)****************
@@ -282,27 +318,32 @@
 
 	var cl = getchildren(tname, doc.name, fname);
 	var tax = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
-  
+	
 	// Make display table
 	var otc = make_table(cur_frm.fields_dict['Other Charges Calculation'].disp_area,
 		cl.length + 1, tax.length + 1, '90%', [], { border:'1px solid #AAA', padding:'2px' });
 	$y(otc,{marginTop:'8px'});
 
 	var tax_desc = {}; var tax_desc_rates = []; var net_total = 0;
-  
+	
 	for(var i=0;i<cl.length;i++) {
 		net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate));
 		var prev_total = flt(cl[i].amount);
-		if(cl[i].item_tax_rate)
-			var check_tax = eval('var a='+cl[i].item_tax_rate+';a');        //to get in dictionary
-    
+		if(cl[i].item_tax_rate) {
+			try {
+				var check_tax = JSON.parse(cl[i].item_tax_rate);				//to get in dictionary
+			} catch(exception) {
+				var check_tax = eval('var a='+cl[i].item_tax_rate+';a');        //to get in dictionary
+			}
+		}
+		
 		// Add Item Code in new Row
 		$td(otc,i+1,0).innerHTML = cl[i].item_code ? cl[i].item_code : cl[i].description;
-    
+		
 		//var tax = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype);
 		var total = net_total;
-    
-    
+		
+		
 		for(var t=0;t<tax.length;t++){
 			var account = tax[t].account_head;
 			$td(otc,0,t+1).innerHTML = account?account:'';
@@ -320,14 +361,14 @@
 			//enter item_wise_tax_detail i.e. tax rate on each item
 			var item_wise_tax_detail = cur_frm.cscript.get_item_wise_tax_detail(doc, rate, cl, i, tax, t);
 			if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail;
-			tax[t].total_amount = flt(tax_amount);     //stores actual tax amount in virtual field
-			tax[t].total_tax_amount = flt(prev_total);      //stores total amount in virtual field
-			tax[t].tax_amount += flt(tax_amount);       
+			tax[t].total_amount = flt(tax_amount);		 //stores actual tax amount in virtual field
+			tax[t].total_tax_amount = flt(prev_total);			//stores total amount in virtual field
+			tax[t].tax_amount += flt(tax_amount);			 
 			var total_amount = flt(tax[t].tax_amount);
 			total_tax_amount = flt(tax[t].total_tax_amount) + flt(total_amount);
 			set_multiple('RV Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':roundNumber(flt(total_amount), 2), 'total':roundNumber(flt(total)+flt(tax[t].tax_amount), 2)}, other_fname);
-			prev_total += flt(tax[t].total_amount);   // for previous row total
-			total += flt(tax[t].tax_amount);     // for adding total to previous amount
+			prev_total += flt(tax[t].total_amount);	 // for previous row total
+			total += flt(tax[t].tax_amount);		 // for adding total to previous amount
 
 			if(tax[t].charge_type == 'Actual')
 				$td(otc,i+1,t+1).innerHTML = fmt_money(tax[t].total_amount);
@@ -342,55 +383,55 @@
 	}
 }
 cur_frm.cscript.check_charge_type_and_get_tax_amount = function( doc, tax, t, cl, rate, print_amt) {
-  doc = locals[doc.doctype][doc.name];
-  if (! print_amt) print_amt = 0;
-  var tax_amount = 0;
-  if(tax[t].charge_type == 'Actual') {
-    var value = flt(tax[t].rate) / flt(doc.net_total);   // this give the ratio in which all items are divided           
-    return tax_amount = flt(value) * flt(cl.amount);
-   }   
-  else if(tax[t].charge_type == 'On Net Total') {
-    if (flt(print_amt) == 1) {
-      doc.excise_rate = flt(rate);
-      doc.total_excise_rate += flt(rate);
-      refresh_field('excise_rate');
-      refresh_field('total_excise_rate');
-      return
-    }
+	doc = locals[doc.doctype][doc.name];
+	if (! print_amt) print_amt = 0;
+	var tax_amount = 0;
+	if(tax[t].charge_type == 'Actual') {
+		var value = flt(tax[t].rate) / flt(doc.net_total);	 // this give the ratio in which all items are divided					 
+		return tax_amount = flt(value) * flt(cl.amount);
+	 }	 
+	else if(tax[t].charge_type == 'On Net Total') {
+		if (flt(print_amt) == 1) {
+			doc.excise_rate = flt(rate);
+			doc.total_excise_rate += flt(rate);
+			refresh_field('excise_rate');
+			refresh_field('total_excise_rate');
+			return
+		}
 	return tax_amount = (flt(rate) * flt(cl.amount) / 100);
-  }
-  else if(tax[t].charge_type == 'On Previous Row Amount'){
-    if(flt(print_amt) == 1) {
-      doc.total_excise_rate += flt(flt(doc.excise_rate) * 0.01 * flt(rate));
-      refresh_field('total_excise_rate');
-      return
-    }
-    var row_no = (tax[t].row_id).toString();
-    var row = (row_no).split("+");      // splits the values and stores in an array
-    for(var r = 0;r<row.length;r++){
-      var id = cint(row[r].replace(/^\s+|\s+$/g,""));
-      tax_amount += (flt(rate) * flt(tax[id-1].total_amount) / 100);
-    }
-    var row_id = row_no.indexOf("/");
-    if(row_id != -1) {
-      rate = '';
-      var row = (row_no).split("/");      // splits the values and stores in an array
-      if(row.length>2) alert("You cannot enter more than 2 nos. for division");
-      var id1 = cint(row[0].replace(/^\s+|\s+$/g,""));
-      var id2 = cint(row[1].replace(/^\s+|\s+$/g,""));
-      tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount);
-    }
-    return tax_amount
-  }
-  else if(tax[t].charge_type == 'On Previous Row Total') {
-    if(flt(print_amt) == 1) {
-      doc.sales_tax_rate += flt(rate);
-      refresh_field('sales_tax_rate');
-      return
-    }
-    var row = cint(tax[t].row_id);
-    return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100;
-  }
+	}
+	else if(tax[t].charge_type == 'On Previous Row Amount'){
+		if(flt(print_amt) == 1) {
+			doc.total_excise_rate += flt(flt(doc.excise_rate) * 0.01 * flt(rate));
+			refresh_field('total_excise_rate');
+			return
+		}
+		var row_no = (tax[t].row_id).toString();
+		var row = (row_no).split("+");			// splits the values and stores in an array
+		for(var r = 0;r<row.length;r++){
+			var id = cint(row[r].replace(/^\s+|\s+$/g,""));
+			tax_amount += (flt(rate) * flt(tax[id-1].total_amount) / 100);
+		}
+		var row_id = row_no.indexOf("/");
+		if(row_id != -1) {
+			rate = '';
+			var row = (row_no).split("/");			// splits the values and stores in an array
+			if(row.length>2) alert("You cannot enter more than 2 nos. for division");
+			var id1 = cint(row[0].replace(/^\s+|\s+$/g,""));
+			var id2 = cint(row[1].replace(/^\s+|\s+$/g,""));
+			tax_amount = flt(tax[id1-1].total_amount) / flt(tax[id2-1].total_amount);
+		}
+		return tax_amount
+	}
+	else if(tax[t].charge_type == 'On Previous Row Total') {
+		if(flt(print_amt) == 1) {
+			doc.sales_tax_rate += flt(rate);
+			refresh_field('sales_tax_rate');
+			return
+		}
+		var row = cint(tax[t].row_id);
+		return tax_amount = flt(rate) * (flt(tax[row-1].total_tax_amount)+flt(tax[row-1].total_amount)) / 100;
+	}
 }
 
 // ********************** Functions for inclusive value calc ******************************
@@ -409,8 +450,11 @@
 cur_frm.cscript.back_calc_basic_rate = function(doc, tname, fname, child, other_fname) {	
 	var get_item_tax_rate = function(item, tax) {
 		if(item.item_tax_rate) {
-			// Should to replace eval with JSON.parse when item_tax_rate is converted to json string notation
-			var item_tax = eval('var a='+item.item_tax_rate+';a');
+			try {
+				var item_tax = JSON.parse(item.item_tax_rate);
+			} catch(exception) {
+				var item_tax = eval('var a='+item.item_tax_rate+';a');
+			}
 			if(item_tax[tax.account_head]!=null) {
 				return flt(item_tax[tax.account_head]);
 			}
@@ -524,45 +568,45 @@
 				'base_ref_rate': flt(base_ref_rate)
 			}, fname);
 		}
-    }
-    else if(n == 2){
-      if(flt(cl[i].ref_rate) > 0)
-        set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].basic_rate)  * 100 / (flt(cl[i].ref_rate) * flt(doc.conversion_rate)))}, fname);
-      set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i].basic_rate)), 'export_rate': flt(flt(cl[i].basic_rate) / flt(doc.conversion_rate)), 'export_amount': flt((flt(cl[i].basic_rate) / flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname);
-    }
-    /*else if(n == 3){
-      set_multiple(tname, cl[i].name, {'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate))}, fname);
-      set_multiple(tname, cl[i].name, {'amount' : flt(flt(cl[i].basic_rate) * flt(cl[i].qty)), 'export_amount': flt(flt(cl[i].export_rate) * flt(cl[i].qty))}, fname);
-      if(cl[i].ref_rate > 0)
+		}
+		else if(n == 2){
+			if(flt(cl[i].ref_rate) > 0)
+				set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].basic_rate)	* 100 / (flt(cl[i].ref_rate) * flt(doc.conversion_rate)))}, fname);
+			set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i].basic_rate)), 'export_rate': flt(flt(cl[i].basic_rate) / flt(doc.conversion_rate)), 'export_amount': flt((flt(cl[i].basic_rate) / flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname);
+		}
+		/*else if(n == 3){
+			set_multiple(tname, cl[i].name, {'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate))}, fname);
+			set_multiple(tname, cl[i].name, {'amount' : flt(flt(cl[i].basic_rate) * flt(cl[i].qty)), 'export_amount': flt(flt(cl[i].export_rate) * flt(cl[i].qty))}, fname);
+			if(cl[i].ref_rate > 0)
 		set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].export_rate) * 100 / flt(cl[i].ref_rate)), 'base_ref_rate': flt(flt(cl[i].ref_rate) * flt(doc.conversion_rate)) }, fname);
-    }*/
-    net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate));
-  }
-  doc.net_total = net_total;
-  refresh_field('net_total');
+		}*/
+		net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate));
+	}
+	doc.net_total = net_total;
+	refresh_field('net_total');
 }
 
 cur_frm.cscript.get_item_wise_tax_detail = function( doc, rate, cl, i, tax, t) {
-  doc = locals[doc.doctype][doc.name];
-  var detail = '';
-  detail = cl[i].item_code + " : " + cstr(rate) + NEWLINE;
-  return detail;
+	doc = locals[doc.doctype][doc.name];
+	var detail = '';
+	detail = cl[i].item_code + " : " + cstr(rate) + NEWLINE;
+	return detail;
 }
 
 // **************** RE-CALCULATE VALUES ***************************
 
-cur_frm.cscript['Re-Calculate Values'] = function(doc, cdt, cdn) {  
-  cur_frm.cscript['Calculate Charges'](doc,cdt,cdn);
+cur_frm.cscript['Re-Calculate Values'] = function(doc, cdt, cdn) {	
+	cur_frm.cscript['Calculate Charges'](doc,cdt,cdn);
 }
 
 cur_frm.cscript['Calculate Charges'] = function(doc, cdt, cdn) {
-	var other_fname  = cur_frm.cscript.other_fname;
+	var other_fname	= cur_frm.cscript.other_fname;
 
 	var cl = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype);
 	for(var i = 0; i<cl.length; i++){
 		cl[i].total_tax_amount = 0;
 		cl[i].total_amount = 0;
-		cl[i].tax_amount = 0;                    // this is done to calculate other charges
+		cl[i].tax_amount = 0;										// this is done to calculate other charges
 		cl[i].total = 0;
 		if(in_list(['On Previous Row Amount','On Previous Row Total'], cl[i].charge_type)) { 
 			if(!cl[i].row_id){
@@ -586,71 +630,71 @@
 // Get Sales Partner Commission
 // =================================================================================
 cur_frm.cscript.sales_partner = function(doc, cdt, cdn){
-  if(doc.sales_partner){
+	if(doc.sales_partner){
 
-    get_server_fields('get_comm_rate', doc.sales_partner, '', doc, cdt, cdn, 1);
-  }
+		get_server_fields('get_comm_rate', doc.sales_partner, '', doc, cdt, cdn, 1);
+	}
 }
 
 // *******Commission Rate Trigger (calculates total commission amount)*********
 cur_frm.cscript.commission_rate = function(doc, cdt, cdn) {
-  if(doc.commission_rate > 100){
-    alert("Commision rate cannot be greater than 100.");
-    doc.total_commission = 0;
-    doc.commission_rate = 0;
-  }
-  else
-    doc.total_commission = doc.net_total * doc.commission_rate / 100;
-  refresh_many(['total_commission','commission_rate']);
+	if(doc.commission_rate > 100){
+		alert("Commision rate cannot be greater than 100.");
+		doc.total_commission = 0;
+		doc.commission_rate = 0;
+	}
+	else
+		doc.total_commission = doc.net_total * doc.commission_rate / 100;
+	refresh_many(['total_commission','commission_rate']);
 
 }
 
 // *******Total Commission Trigger (calculates commission rate)*********
 cur_frm.cscript.total_commission = function(doc, cdt, cdn) {
-  if(doc.net_total){
-    if(doc.net_total < doc.total_commission){
-      alert("Total commission cannot be greater than net total.");
-      doc.total_commission = 0;
-      doc.commission_rate = 0;
-    }
-    else
-      doc.commission_rate = doc.total_commission * 100 / doc.net_total;
-    refresh_many(['total_commission','commission_rate']);
-  }
+	if(doc.net_total){
+		if(doc.net_total < doc.total_commission){
+			alert("Total commission cannot be greater than net total.");
+			doc.total_commission = 0;
+			doc.commission_rate = 0;
+		}
+		else
+			doc.commission_rate = doc.total_commission * 100 / doc.net_total;
+		refresh_many(['total_commission','commission_rate']);
+	}
 }
 // Sales Person Allocated % trigger 
 // ==============================================================================
 cur_frm.cscript.allocated_percentage = function(doc, cdt, cdn) {
-  var fname = cur_frm.cscript.sales_team_fname;
-  var d = locals[cdt][cdn];
-  if (d.allocated_percentage) {
-    d.allocated_amount = flt(flt(doc.net_total)*flt(d.allocated_percentage)/100);
-    refresh_field('allocated_amount', d.name, fname);
-  }
+	var fname = cur_frm.cscript.sales_team_fname;
+	var d = locals[cdt][cdn];
+	if (d.allocated_percentage) {
+		d.allocated_amount = flt(flt(doc.net_total)*flt(d.allocated_percentage)/100);
+		refresh_field('allocated_amount', d.name, fname);
+	}
 }
 
 // Client Side Validation
 // =================================================================================
 cur_frm.cscript.validate = function(doc, cdt, cdn) {
-  cur_frm.cscript.validate_items(doc);
-  var cl = getchildren('Other Charges', doc.name, 'other_charges');
-  for(var i =0;i<cl.length;i++) {
-    if(!cl[i].amount) {
-      alert("Please Enter Amount in Row no. "+cl[i].idx+" in Other Charges table");
-      validated = false;
-    }
-  }
-  cur_frm.cscript['Calculate Charges'] (doc, cdt, cdn);
+	cur_frm.cscript.validate_items(doc);
+	var cl = getchildren('Other Charges', doc.name, 'other_charges');
+	for(var i =0;i<cl.length;i++) {
+		if(!cl[i].amount) {
+			alert("Please Enter Amount in Row no. "+cl[i].idx+" in Other Charges table");
+			validated = false;
+		}
+	}
+	cur_frm.cscript['Calculate Charges'] (doc, cdt, cdn);
 
-  if (cur_frm.cscript.calc_adjustment_amount) cur_frm.cscript.calc_adjustment_amount(doc);
+	if (cur_frm.cscript.calc_adjustment_amount) cur_frm.cscript.calc_adjustment_amount(doc);
 }
 
 
 // ************** Atleast one item in document ****************
 cur_frm.cscript.validate_items = function(doc) {
-  var cl = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
-  if(!cl.length){
-    alert("Please enter Items for " + doc.doctype);
-    validated = false;
-  }
+	var cl = getchildren(cur_frm.cscript.tname, doc.name, cur_frm.cscript.fname);
+	if(!cl.length){
+		alert("Please enter Items for " + doc.doctype);
+		validated = false;
+	}
 }
diff --git a/erpnext/selling/doctype/sales_common/sales_common.py b/erpnext/selling/doctype/sales_common/sales_common.py
index 0c3d858..1420ad6 100644
--- a/erpnext/selling/doctype/sales_common/sales_common.py
+++ b/erpnext/selling/doctype/sales_common/sales_common.py
@@ -109,10 +109,11 @@
 	# Get Item Details
 	# ===============================================================
 	def get_item_details(self, item_code, obj):
+		import json
 		if not obj.doc.price_list_name:
 			msgprint("Please Select Price List before selecting Items")
 			raise Exception
-		item = webnotes.conn.sql("select description, item_name, brand, item_group, stock_uom, default_warehouse, default_income_account, default_sales_cost_center, description_html from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life >	now() or end_of_life = '0000-00-00') and (is_sales_item = 'Yes' or is_service_item = 'Yes')" %(item_code), as_dict=1)
+		item = webnotes.conn.sql("select description, item_name, brand, item_group, stock_uom, default_warehouse, default_income_account, default_sales_cost_center, description_html from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life >	now() or end_of_life = '0000-00-00') and (is_sales_item = 'Yes' or is_service_item = 'Yes')" % (item_code), as_dict=1)
 		tax = webnotes.conn.sql("select tax_type, tax_rate from `tabItem Tax` where parent = %s" , item_code)
 		t = {}
 		for x in tax: t[x[0]] = flt(x[1])
@@ -130,7 +131,7 @@
 			'adj_rate'				: 0,
 			'amount'				: 0,
 			'export_amount'			: 0,
-			'item_tax_rate'			: str(t),
+			'item_tax_rate'			: json.dumps(t),
 			'batch_no'				: ''
 		}
 		if(obj.doc.price_list_name and item):	#this is done to fetch the changed BASIC RATE and REF RATE based on PRICE LIST
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 0229074..59f8b84 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -14,111 +14,114 @@
 // ONLOAD
 // ================================================================================================
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
-  if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
-  if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()});
-  if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1});
-  // load default charges
-  
-  if(doc.__islocal){
-    hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);
-  }
+	if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
+	if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()});
+	if(!doc.price_list_currency) set_multiple(cdt, cdn, {price_list_currency: doc.currency, plc_conversion_rate: 1});
+	// load default charges
+	
+	if(doc.__islocal){
+		hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);
+	}
+
+	// defined in sales_common.js
+	cur_frm.cscript.update_item_details(doc, cdt, cdn);
 }
 
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
-  if(doc.__islocal) {
-    if(doc.quotation) cur_frm.cscript['Pull Quotation Details'](doc,cdt,cdn);
-  } else {
+	if(doc.__islocal) {
+		if(doc.quotation) cur_frm.cscript['Pull Quotation Details'](doc,cdt,cdn);
+	} else {
 	cur_frm.cscript.load_taxes(doc, cdt, cdn);
-  }
+	}
 }
 
 // Refresh
 //==================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-  cur_frm.clear_custom_buttons();
-  
-  if(doc.docstatus==1) {
-  	if(doc.status != 'Stopped') {
-	    cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
-  	  // delivery note
-  	  if(doc.per_delivered < 100 && doc.order_type!='Maintenance')
-        cur_frm.add_custom_button('Make Delivery', cur_frm.cscript['Make Delivery Note']);
-  	  
-  	  // maintenance
-  	  if(doc.per_delivered < 100 && doc.order_type=='Maintenance') {
-        cur_frm.add_custom_button('Make Maint. Visit', cur_frm.cscript['Make Maintenance Visit']);
-        cur_frm.add_custom_button('Make Maint. Schedule', cur_frm.cscript['Make Maintenance Schedule']);
-  	  }
+	cur_frm.clear_custom_buttons();
+	
+	if(doc.docstatus==1) {
+		if(doc.status != 'Stopped') {
+			cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+			// delivery note
+			if(doc.per_delivered < 100 && doc.order_type!='Maintenance')
+				cur_frm.add_custom_button('Make Delivery', cur_frm.cscript['Make Delivery Note']);
+			
+			// maintenance
+			if(doc.per_delivered < 100 && doc.order_type=='Maintenance') {
+				cur_frm.add_custom_button('Make Maint. Visit', cur_frm.cscript['Make Maintenance Visit']);
+				cur_frm.add_custom_button('Make Maint. Schedule', cur_frm.cscript['Make Maintenance Schedule']);
+			}
 
-      // indent
-      if(doc.order_type != 'Maintenance')
-        cur_frm.add_custom_button('Make ' + get_doctype_label('Indent'), cur_frm.cscript['Make Purchase Requisition']);
-  	  
-      // sales invoice
-  	  if(doc.per_billed < 100)
-        cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']);
-      
-      // stop
-      if(doc.per_delivered < 100 || doc.per_billed < 100)
-        cur_frm.add_custom_button('Stop!', cur_frm.cscript['Stop Sales Order']);
-  } else {
-  	
-  	  // un-stop
-  	  cur_frm.add_custom_button('Unstop', cur_frm.cscript['Unstop Sales Order']);
-  }
-  	
-    unhide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no'])
-  } else {
-  	hide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no'])
-  }
+			// indent
+			if(doc.order_type != 'Maintenance')
+				cur_frm.add_custom_button('Make ' + get_doctype_label('Indent'), cur_frm.cscript['Make Purchase Requisition']);
+			
+			// sales invoice
+			if(doc.per_billed < 100)
+				cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']);
+			
+			// stop
+			if(doc.per_delivered < 100 || doc.per_billed < 100)
+				cur_frm.add_custom_button('Stop!', cur_frm.cscript['Stop Sales Order']);
+	} else {
+		
+			// un-stop
+			cur_frm.add_custom_button('Unstop', cur_frm.cscript['Unstop Sales Order']);
+	}
+		
+		unhide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no'])
+	} else {
+		hide_field(['Repair Sales Order', 'Send SMS', 'message', 'customer_mobile_no'])
+	}
 }
 
 //customer
 cur_frm.cscript.customer = function(doc,dt,dn) {
-  var callback = function(r,rt) {
-      var doc = locals[cur_frm.doctype][cur_frm.docname];
-      get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0);
-      cur_frm.refresh();
-  }   
+	var callback = function(r,rt) {
+			var doc = locals[cur_frm.doctype][cur_frm.docname];
+			get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0);
+			cur_frm.refresh();
+	}	 
 
-  if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback);
-  if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);
+	if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback);
+	if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);
 }
 
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {    
-  if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
+	if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict.customer_address.on_new = function(dn) {
-  locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict.contact_person.on_new = function(dn) {
-  locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.cscript['Pull Quotation Details'] = function(doc,dt,dn) {
-  var callback = function(r,rt){
-    var doc = locals[cur_frm.doctype][cur_frm.docname];          
-    if(r.message){              
-      doc.quotation_no = r.message;      
-		  if(doc.quotation_no) {		      
-  			  unhide_field(['quotation_date','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);			    			  
-  			  if(doc.customer) get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0);
-		  }		  
-		  cur_frm.refresh();
-    }
-  } 
+	var callback = function(r,rt){
+		var doc = locals[cur_frm.doctype][cur_frm.docname];					
+		if(r.message){							
+			doc.quotation_no = r.message;			
+			if(doc.quotation_no) {					
+					unhide_field(['quotation_date','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);									
+					if(doc.customer) get_server_fields('get_shipping_address',doc.customer,'',doc, dt, dn, 0);
+			}			
+			cur_frm.refresh();
+		}
+	} 
 
  $c_obj(make_doclist(doc.doctype, doc.name),'pull_quotation_details','',callback);
 }
@@ -126,10 +129,10 @@
 
 //================ create new contact ============================================================================
 cur_frm.cscript.new_contact = function(){
-  tn = createLocal('Contact');
-  locals['Contact'][tn].is_customer = 1;
-  if(doc.customer) locals['Contact'][tn].customer = doc.customer;
-  loaddoc('Contact', tn);
+	tn = createLocal('Contact');
+	locals['Contact'][tn].is_customer = 1;
+	if(doc.customer) locals['Contact'][tn].customer = doc.customer;
+	loaddoc('Contact', tn);
 }
 
 // DOCTYPE TRIGGERS
@@ -138,35 +141,35 @@
 /*
 // ***************** get shipping address based on customer selected *****************
 cur_frm.fields_dict['ship_det_no'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50';
+	return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50';
 }
 */
 
 
 // ***************** Get project name *****************
 cur_frm.fields_dict['project_name'].get_query = function(doc, cdt, cdn) {
-  var cond = '';
-  if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND';
-  return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond});
+	var cond = '';
+	if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND';
+	return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond});
 }
 
 //---- get customer details ----------------------------
 cur_frm.cscript.project_name = function(doc,cdt,cdn){
-  $c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){
-    refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']);
-  });
-  
+	$c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){
+		refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']);
+	});
+	
 }
 
 
 
 // *************** Customized link query for QUOTATION ***************************** 
 cur_frm.fields_dict['quotation_no'].get_query = function(doc) {
-  var cond='';
-  if(doc.order_type) cond = ' ifnull(`tabQuotation`.order_type, "") = "'+doc.order_type+'" and';
-  if(doc.customer) cond += ' ifnull(`tabQuotation`.customer, "") = "'+doc.customer+'" and';
-  
-  return repl('SELECT DISTINCT name, customer, transaction_date  FROM `tabQuotation` WHERE `tabQuotation`.company = "' + doc.company + '" and `tabQuotation`.`docstatus` = 1 and `tabQuotation`.status != "Order Lost" and %(cond)s `tabQuotation`.%(key)s LIKE "%s" ORDER BY `tabQuotation`.`name` DESC LIMIT 50', {cond:cond});
+	var cond='';
+	if(doc.order_type) cond = ' ifnull(`tabQuotation`.order_type, "") = "'+doc.order_type+'" and';
+	if(doc.customer) cond += ' ifnull(`tabQuotation`.customer, "") = "'+doc.customer+'" and';
+	
+	return repl('SELECT DISTINCT name, customer, transaction_date	FROM `tabQuotation` WHERE `tabQuotation`.company = "' + doc.company + '" and `tabQuotation`.`docstatus` = 1 and `tabQuotation`.status != "Order Lost" and %(cond)s `tabQuotation`.%(key)s LIKE "%s" ORDER BY `tabQuotation`.`name` DESC LIMIT 50', {cond:cond});
 }
 
 
@@ -175,164 +178,164 @@
 
 // ***************** Get available qty in warehouse of item selected **************** 
 cur_frm.cscript.reserved_warehouse = function(doc, cdt , cdn) {
-  var d = locals[cdt][cdn];
-  if (d.reserved_warehouse) {
-    arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.reserved_warehouse +"'}";
-    get_server_fields('get_available_qty',arg,'sales_order_details',doc,cdt,cdn,1);
-  }
+	var d = locals[cdt][cdn];
+	if (d.reserved_warehouse) {
+		arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.reserved_warehouse +"'}";
+		get_server_fields('get_available_qty',arg,'sales_order_details',doc,cdt,cdn,1);
+	}
 }
 
 //----------- make maintenance schedule----------
 cur_frm.cscript['Make Maintenance Schedule'] = function() {
-  var doc = cur_frm.doc;
+	var doc = cur_frm.doc;
 
-  if (doc.docstatus == 1) { 
-    $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_schedule','',
-      function(r,rt){
-        if(r.message == 'No'){
-          n = createLocal("Maintenance Schedule");
-          $c('dt_map', args={
-                  'docs':compress_doclist([locals["Maintenance Schedule"][n]]),
-                  'from_doctype':'Sales Order',
-                  'to_doctype':'Maintenance Schedule',
-                  'from_docname':doc.name,
-            'from_to_list':"[['Sales Order', 'Maintenance Schedule'], ['Sales Order Detail', 'Item Maintenance Detail']]"
-          }
-          , function(r,rt) {
-            loaddoc("Maintenance Schedule", n);
-          }
-          );
-        }
-        else{
-          msgprint("You have already created Maintenance Schedule against this Sales Order");
-        }
-      }
-    );
-  }
+	if (doc.docstatus == 1) { 
+		$c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_schedule','',
+			function(r,rt){
+				if(r.message == 'No'){
+					n = createLocal("Maintenance Schedule");
+					$c('dt_map', args={
+									'docs':compress_doclist([locals["Maintenance Schedule"][n]]),
+									'from_doctype':'Sales Order',
+									'to_doctype':'Maintenance Schedule',
+									'from_docname':doc.name,
+						'from_to_list':"[['Sales Order', 'Maintenance Schedule'], ['Sales Order Detail', 'Item Maintenance Detail']]"
+					}
+					, function(r,rt) {
+						loaddoc("Maintenance Schedule", n);
+					}
+					);
+				}
+				else{
+					msgprint("You have already created Maintenance Schedule against this Sales Order");
+				}
+			}
+		);
+	}
 }
 
 //------------ make maintenance visit ------------
 cur_frm.cscript['Make Maintenance Visit'] = function() {
-  var doc = cur_frm.doc;
+	var doc = cur_frm.doc;
 
-  if (doc.docstatus == 1) { 
-    $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_visit','',
-      function(r,rt){
-        if(r.message == 'No'){
-          n = createLocal("Maintenance Visit");
-          $c('dt_map', args={
-                  'docs':compress_doclist([locals["Maintenance Visit"][n]]),
-                  'from_doctype':'Sales Order',
-                  'to_doctype':'Maintenance Visit',
-                  'from_docname':doc.name,
-            'from_to_list':"[['Sales Order', 'Maintenance Visit'], ['Sales Order Detail', 'Maintenance Visit Detail']]"
-          }
-          , function(r,rt) {
-            loaddoc("Maintenance Visit", n);
-          }
-          );
-        }
-        else{
-          msgprint("You have already completed maintenance against this Sales Order");
-        }
-      }
-    );
-  }
+	if (doc.docstatus == 1) { 
+		$c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_visit','',
+			function(r,rt){
+				if(r.message == 'No'){
+					n = createLocal("Maintenance Visit");
+					$c('dt_map', args={
+									'docs':compress_doclist([locals["Maintenance Visit"][n]]),
+									'from_doctype':'Sales Order',
+									'to_doctype':'Maintenance Visit',
+									'from_docname':doc.name,
+						'from_to_list':"[['Sales Order', 'Maintenance Visit'], ['Sales Order Detail', 'Maintenance Visit Detail']]"
+					}
+					, function(r,rt) {
+						loaddoc("Maintenance Visit", n);
+					}
+					);
+				}
+				else{
+					msgprint("You have already completed maintenance against this Sales Order");
+				}
+			}
+		);
+	}
 }
 
 // make indent
 // ================================================================================================
 cur_frm.cscript['Make Purchase Requisition'] = function() {
-  var doc = cur_frm.doc;
-  if (doc.docstatus == 1) { 
-  n = createLocal("Indent");
-  $c('dt_map', args={
-          'docs':compress_doclist([locals["Indent"][n]]),
-          'from_doctype':'Sales Order',
-          'to_doctype':'Indent',
-          'from_docname':doc.name,
-    'from_to_list':"[['Sales Order', 'Indent'], ['Sales Order Detail', 'Indent Detail']]"
-  }
-  , function(r,rt) {
-    loaddoc("Indent", n);
-    }
-    );
-  }
+	var doc = cur_frm.doc;
+	if (doc.docstatus == 1) { 
+	n = createLocal("Indent");
+	$c('dt_map', args={
+					'docs':compress_doclist([locals["Indent"][n]]),
+					'from_doctype':'Sales Order',
+					'to_doctype':'Indent',
+					'from_docname':doc.name,
+		'from_to_list':"[['Sales Order', 'Indent'], ['Sales Order Detail', 'Indent Detail']]"
+	}
+	, function(r,rt) {
+		loaddoc("Indent", n);
+		}
+		);
+	}
 }
 
 
 // MAKE DELIVERY NOTE
 // ================================================================================================
 cur_frm.cscript['Make Delivery Note'] = function() {
-  var doc = cur_frm.doc;
-  if (doc.docstatus == 1) { 
-  n = createLocal("Delivery Note");
-  $c('dt_map', args={
-          'docs':compress_doclist([locals["Delivery Note"][n]]),
-          'from_doctype':'Sales Order',
-          'to_doctype':'Delivery Note',
-          'from_docname':doc.name,
-    'from_to_list':"[['Sales Order', 'Delivery Note'], ['Sales Order Detail', 'Delivery Note Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]"
-  }
-  , function(r,rt) {
-    loaddoc("Delivery Note", n);
-    }
-    );
-  }
+	var doc = cur_frm.doc;
+	if (doc.docstatus == 1) { 
+	n = createLocal("Delivery Note");
+	$c('dt_map', args={
+					'docs':compress_doclist([locals["Delivery Note"][n]]),
+					'from_doctype':'Sales Order',
+					'to_doctype':'Delivery Note',
+					'from_docname':doc.name,
+		'from_to_list':"[['Sales Order', 'Delivery Note'], ['Sales Order Detail', 'Delivery Note Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]"
+	}
+	, function(r,rt) {
+		loaddoc("Delivery Note", n);
+		}
+		);
+	}
 }
 
 
 // MAKE SALES INVOICE
 // ================================================================================================
 cur_frm.cscript['Make Sales Invoice'] = function() {
-  var doc = cur_frm.doc;
+	var doc = cur_frm.doc;
 
-  n = createLocal('Receivable Voucher');
-  $c('dt_map', args={
-    'docs':compress_doclist([locals['Receivable Voucher'][n]]),
-    'from_doctype':doc.doctype,
-    'to_doctype':'Receivable Voucher',
-    'from_docname':doc.name,
-    'from_to_list':"[['Sales Order','Receivable Voucher'],['Sales Order Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]"
-    }, function(r,rt) {
-       loaddoc('Receivable Voucher', n);
-    }
-  );
+	n = createLocal('Receivable Voucher');
+	$c('dt_map', args={
+		'docs':compress_doclist([locals['Receivable Voucher'][n]]),
+		'from_doctype':doc.doctype,
+		'to_doctype':'Receivable Voucher',
+		'from_docname':doc.name,
+		'from_to_list':"[['Sales Order','Receivable Voucher'],['Sales Order Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]"
+		}, function(r,rt) {
+			 loaddoc('Receivable Voucher', n);
+		}
+	);
 }
 
 
 // STOP SALES ORDER
 // ==================================================================================================
 cur_frm.cscript['Stop Sales Order'] = function() {
-  var doc = cur_frm.doc;
+	var doc = cur_frm.doc;
 
-  var check = confirm("Are you sure you want to STOP " + doc.name);
+	var check = confirm("Are you sure you want to STOP " + doc.name);
 
-  if (check) {
-    $c('runserverobj', args={'method':'stop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
-      cur_frm.refresh();
-    });
-  }
+	if (check) {
+		$c('runserverobj', args={'method':'stop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+			cur_frm.refresh();
+		});
+	}
 }
 
 // UNSTOP SALES ORDER
 // ==================================================================================================
 cur_frm.cscript['Unstop Sales Order'] = function() {
-  var doc = cur_frm.doc;
+	var doc = cur_frm.doc;
 
-  var check = confirm("Are you sure you want to UNSTOP " + doc.name);
+	var check = confirm("Are you sure you want to UNSTOP " + doc.name);
 
-  if (check) {
-    $c('runserverobj', args={'method':'unstop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
-      cur_frm.refresh();
-    });
-  }
+	if (check) {
+		$c('runserverobj', args={'method':'unstop_sales_order', 'docs': compress_doclist(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+			cur_frm.refresh();
+		});
+	}
 }
 
 //get query select Territory
 //=======================================================================================================================
 cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
-  return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"  ORDER BY  `tabTerritory`.`name` ASC LIMIT 50';
+	return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"	ORDER BY	`tabTerritory`.`name` ASC LIMIT 50';
 }
 
 $import(Notification Control)
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index aefe666..225e0dc 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -85,8 +85,18 @@
 # ================================================================================
 	# Get Item Details
 	# ----------------
-	def get_item_details(self, item_code):
-		return get_obj('Sales Common').get_item_details(item_code, self)
+	def get_item_details(self, item_code=None):
+		if item_code:
+			return get_obj('Sales Common').get_item_details(item_code, self)
+		else:
+			obj = get_obj('Sales Common')
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					ret = obj.get_item_details(doc.item_code, self)
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]					
+
 
 	# Re-calculates Basic Rate & amount based on Price List Selected
 	# --------------------------------------------------------------
diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py
index 93273ba..6524f5c 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -763,7 +763,7 @@
 	"""
 	edigest_list = webnotes.conn.sql("""
 		SELECT name FROM `tabEmail Digest`
-		WHERE enabled=1
+		WHERE enabled=1 and docstatus<2
 	""", as_list=1)
 
 	from webnotes.model.code import get_obj
diff --git a/erpnext/setup/doctype/price_list/price_list.py b/erpnext/setup/doctype/price_list/price_list.py
index 23a43e7..c4bab3b 100644
--- a/erpnext/setup/doctype/price_list/price_list.py
+++ b/erpnext/setup/doctype/price_list/price_list.py
@@ -85,8 +85,9 @@
 		  
 		from webnotes.utils import file_manager
 		fn, content = file_manager.get_file(fid)
-		
-		if not type(content) == str:
+	
+		# NOTE: Don't know why this condition exists
+		if not isinstance(content, basestring) and hasattr(content, 'tostring'):
 		  content = content.tostring()
 
-		return content	
\ No newline at end of file
+		return content	
diff --git a/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py b/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py
index 2028e5f..35564bb 100644
--- a/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py
+++ b/erpnext/setup/doctype/upload_accounts_transactions/upload_accounts_transactions.py
@@ -96,8 +96,9 @@
 
 		from webnotes.utils import file_manager
 		fn, content = file_manager.get_file(fid)
-
-		if not type(content) == str:
+		
+		# NOTE: Don't know why this condition exists
+		if not isinstance(content, basestring) and hasattr(content, 'tostring'):
 		  content = content.tostring()
 
 		return content
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js
index 59dff8a..4099174 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.js
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.js
@@ -11,93 +11,97 @@
 // ONLOAD
 // ================================================================================================
 cur_frm.cscript.onload = function(doc, dt, dn) {
-  if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
-  if(!doc.transaction_date) set_multiple(dt,dn,{transaction_date:get_today()});
-  if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()});
-  if(doc.__islocal && doc.customer) cur_frm.cscript.pull_item_details_onload(doc,dt,dn);
-  if(!doc.price_list_currency) {
-	set_multiple(dt, dn, {price_list_currency: doc.currency, plc_conversion_rate:1});
-}
-  if(!doc.posting_time) doc.posting_time = wn.datetime.get_cur_time()
-    
-  if(doc.__islocal){
-    hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
-  }   
+	if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
+	if(!doc.transaction_date) set_multiple(dt,dn,{transaction_date:get_today()});
+	if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()});
+	if(doc.__islocal && doc.customer) cur_frm.cscript.pull_item_details_onload(doc,dt,dn);
+	if(!doc.price_list_currency) {
+		set_multiple(dt, dn, {price_list_currency: doc.currency, plc_conversion_rate:1});
+	}
+	if(!doc.posting_time) doc.posting_time = wn.datetime.get_cur_time()
+		
+	if(doc.__islocal){
+		hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+	}
+
+	// defined in sales_common.js
+	//cur_frm.cscript.update_item_details(doc, cdt, cdn);
+	
 }
 
 cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
-  // load default charges
-  if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) 
-    cur_frm.cscript.load_taxes(doc, cdt, cdn);	
+	// load default charges
+	if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) 
+		cur_frm.cscript.load_taxes(doc, cdt, cdn);	
 } 
 
 // REFRESH
 // ================================================================================================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) { 
-  cur_frm.clear_custom_buttons();
+	cur_frm.clear_custom_buttons();
  
-  if(doc.per_billed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']);
-  
-  if(doc.per_installed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Installation Note', cur_frm.cscript['Make Installation Note']);
+	if(doc.per_billed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Sales Invoice']);
+	
+	if(doc.per_installed < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Installation Note', cur_frm.cscript['Make Installation Note']);
 
-  if (doc.docstatus!=1) {
-    hide_field(['SMS', 'Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']);
-  } else {
-    cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
-    unhide_field(['SMS','Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']);
-  }
+	if (doc.docstatus!=1) {
+		hide_field(['SMS', 'Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']);
+	} else {
+		cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+		unhide_field(['SMS','Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']);
+	}
 
-  if(doc.docstatus==1) {
-    cur_frm.add_custom_button('Make Packing Slip', cur_frm.cscript['Make Packing Slip']);
-  }
-  
-  set_print_hide(doc, cdt, cdn);
+	if(doc.docstatus==1) {
+		cur_frm.add_custom_button('Make Packing Slip', cur_frm.cscript['Make Packing Slip']);
+	}
+	
+	set_print_hide(doc, cdt, cdn);
 }
 
 
 //customer
-cur_frm.cscript.customer = function(doc,dt,dn) {  
-  var callback = function(r,rt) {
-      var doc = locals[cur_frm.doctype][cur_frm.docname];
-      cur_frm.refresh();
-  } 
-  if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_shipping_address', '', callback);
-  if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);
+cur_frm.cscript.customer = function(doc,dt,dn) {	
+	var callback = function(r,rt) {
+			var doc = locals[cur_frm.doctype][cur_frm.docname];
+			cur_frm.refresh();
+	} 
+	if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_shipping_address', '', callback);
+	if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group','shipping_address']);
 }
 
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {    
-  if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
+	if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict.customer_address.on_new = function(dn) {
-  locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict.contact_person.on_new = function(dn) {
-  locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
-  locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+	locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+	locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
 }
 
 cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.cscript['Get Items'] = function(doc,dt,dn) {
-  var callback = function(r,rt){
-    var doc = locals[cur_frm.doctype][cur_frm.docname];          
-    if(r.message){              
-      doc.sales_order_no = r.message;      
-		  if(doc.sales_order_no) {		      
-  			  unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);			    			    			  
-		  }		  
-		  refresh_many(['delivery_note_details','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
-    }
-  } 
+	var callback = function(r,rt){
+		var doc = locals[cur_frm.doctype][cur_frm.docname];					
+		if(r.message){							
+			doc.sales_order_no = r.message;			
+			if(doc.sales_order_no) {					
+					unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);														
+			}			
+			refresh_many(['delivery_note_details','customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+		}
+	} 
  $c_obj(make_doclist(doc.doctype, doc.name),'pull_sales_order_details','',callback); 
 }
 
@@ -105,45 +109,45 @@
 //RV-DN : Pull Item details - UOM, Item Group as it was not in Sales Invoice
 //---------------------------------------------------------------------
 cur_frm.cscript.pull_item_details_onload = function(doc,dt,dn){
-  var callback = function(r,rt){
-    refresh_field('delivery_note_details');
-    cur_frm.cscript.customer(doc,dt,dn);
-  } 
-  $c_obj(make_doclist(dt,dn),'set_item_details','',callback);
+	var callback = function(r,rt){
+		refresh_field('delivery_note_details');
+		cur_frm.cscript.customer(doc,dt,dn);
+	} 
+	$c_obj(make_doclist(dt,dn),'set_item_details','',callback);
 }
 
 //================ create new contact ============================================================================
 cur_frm.cscript.new_contact = function(){
-  tn = createLocal('Contact');
-  locals['Contact'][tn].is_customer = 1;
-  if(doc.customer) locals['Contact'][tn].customer = doc.customer;
-  loaddoc('Contact', tn);
+	tn = createLocal('Contact');
+	locals['Contact'][tn].is_customer = 1;
+	if(doc.customer) locals['Contact'][tn].customer = doc.customer;
+	loaddoc('Contact', tn);
 }
 
 //========================= Overloaded query for link batch_no =============================================================
 cur_frm.fields_dict['delivery_note_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(d.item_code){
-    return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50"
-  }
-  else{
-    alert("Please enter Item Code.");
-  }
+	var d = locals[cdt][cdn];
+	if(d.item_code){
+		return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50"
+	}
+	else{
+		alert("Please enter Item Code.");
+	}
 }
 
 // ***************** Get project name *****************
 cur_frm.fields_dict['project_name'].get_query = function(doc, cdt, cdn) {
-  var cond = '';
-  if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND';
-  return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond});
+	var cond = '';
+	if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND';
+	return repl('SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond});
 }
 
 /*
 //---- get customer details ----------------------------
 cur_frm.cscript.project_name = function(doc,cdt,cdn){
-  $c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){
-    refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']);
-  });
+	$c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){
+		refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']);
+	});
 }
 */
 
@@ -154,23 +158,23 @@
 /*
 var cfn_set_fields = function(doc, cdt, cdn) { 
  var supplier_field_list = ['Supplier','supplier','supplier_address'];
-  var customer_field_list = ['Customer','customer','customer_name','customer_address','territory','customer_group','Business Associate','sales_partner','commission_rate','total_commission','sales_order_no','Get Items'];
-  if (doc.delivery_type == 'Rejected' && doc.purchase_receipt_no) {
-    unhide_field('purchase_receipt_no');
-    unhide_field(supplier_field_list);
-    hide_field(customer_field_list);
-    get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1;
-  }
-  else if (doc.delivery_type == 'Subcontract' && doc.purchase_order_no) {
-    unhide_field('purchase_order_no');
-    unhide_field(supplier_field_list);
-    hide_field(cutomer_field_list);
-    get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1;
-  }
-  else if (doc.delivery_type == 'Sample') unhide_field('to_warehouse');
-  else get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 0;   
-    
-  
+	var customer_field_list = ['Customer','customer','customer_name','customer_address','territory','customer_group','Business Associate','sales_partner','commission_rate','total_commission','sales_order_no','Get Items'];
+	if (doc.delivery_type == 'Rejected' && doc.purchase_receipt_no) {
+		unhide_field('purchase_receipt_no');
+		unhide_field(supplier_field_list);
+		hide_field(customer_field_list);
+		get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1;
+	}
+	else if (doc.delivery_type == 'Subcontract' && doc.purchase_order_no) {
+		unhide_field('purchase_order_no');
+		unhide_field(supplier_field_list);
+		hide_field(cutomer_field_list);
+		get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 1;
+	}
+	else if (doc.delivery_type == 'Sample') unhide_field('to_warehouse');
+	else get_field(doc.doctype, 'delivery_type' , doc.name).permlevel = 0;	 
+		
+	
 }
 
 */
@@ -181,14 +185,14 @@
 /*
 // ***************** Get Contact Person based on customer selected *****************
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE ((`tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'") or (`tabContact`.is_sales_partner = 1 AND `tabContact`.sales_partner = "'+ doc.sales_partner+'")) AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50';
+	return 'SELECT `tabContact`.contact_name FROM `tabContact` WHERE ((`tabContact`.is_customer = 1 AND `tabContact`.customer = "'+ doc.customer+'") or (`tabContact`.is_sales_partner = 1 AND `tabContact`.sales_partner = "'+ doc.sales_partner+'")) AND `tabContact`.docstatus != 2 AND `tabContact`.contact_name LIKE "%s" ORDER BY `tabContact`.contact_name ASC LIMIT 50';
 }
 */
 
 /*
 // ***************** get shipping address based on customer selected *****************
 cur_frm.fields_dict['ship_det_no'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50';
+	return 'SELECT `tabShipping Address`.`name`, `tabShipping Address`.`ship_to`, `tabShipping Address`.`shipping_address` FROM `tabShipping Address` WHERE `tabShipping Address`.customer = "'+ doc.customer+'" AND `tabShipping Address`.`docstatus` != 2 AND `tabShipping Address`.`name` LIKE "%s" ORDER BY `tabShipping Address`.name ASC LIMIT 50';
 }
 */
 
@@ -196,179 +200,179 @@
 
 // *************** Customized link query for SALES ORDER based on customer and currency***************************** 
 cur_frm.fields_dict['sales_order_no'].get_query = function(doc) {
-  doc = locals[this.doctype][this.docname];
-  var cond = '';
-  
-  if(doc.customer) {
-    if(doc.currency) cond = '`tabSales Order`.customer = "'+doc.customer+'" and `tabSales Order`.currency = "'+doc.currency+'" and';
-    else cond = '`tabSales Order`.customer = "'+doc.customer+'" and';
-  }
-  else {
-    if(doc.currency) cond = '`tabSales Order`.currency = "'+doc.currency+'" and';
-    else cond = '';
-  }
-  if(doc.project_name){
-    cond += '`tabSales Order`.project_name ="'+doc.project_name+'"';
-  }
-  return repl('SELECT DISTINCT `tabSales Order`.`name` FROM `tabSales Order` WHERE `tabSales Order`.company = "%(company)s" and `tabSales Order`.`docstatus` = 1 and `tabSales Order`.`status` != "Stopped" and ifnull(`tabSales Order`.per_delivered,0) < 100 and %(cond)s `tabSales Order`.%(key)s LIKE "%s" ORDER BY `tabSales Order`.`name` DESC LIMIT 50', {company:doc.company,cond:cond})
+	doc = locals[this.doctype][this.docname];
+	var cond = '';
+	
+	if(doc.customer) {
+		if(doc.currency) cond = '`tabSales Order`.customer = "'+doc.customer+'" and `tabSales Order`.currency = "'+doc.currency+'" and';
+		else cond = '`tabSales Order`.customer = "'+doc.customer+'" and';
+	}
+	else {
+		if(doc.currency) cond = '`tabSales Order`.currency = "'+doc.currency+'" and';
+		else cond = '';
+	}
+	if(doc.project_name){
+		cond += '`tabSales Order`.project_name ="'+doc.project_name+'"';
+	}
+	return repl('SELECT DISTINCT `tabSales Order`.`name` FROM `tabSales Order` WHERE `tabSales Order`.company = "%(company)s" and `tabSales Order`.`docstatus` = 1 and `tabSales Order`.`status` != "Stopped" and ifnull(`tabSales Order`.per_delivered,0) < 100 and %(cond)s `tabSales Order`.%(key)s LIKE "%s" ORDER BY `tabSales Order`.`name` DESC LIMIT 50', {company:doc.company,cond:cond})
 }
 
 
 // ****************************** DELIVERY TYPE ************************************
 cur_frm.cscript.delivery_type = function(doc, cdt, cdn) {
-  if (doc.delivery_type = 'Sample') cfn_set_fields(doc, cdt, cdn);
+	if (doc.delivery_type = 'Sample') cfn_set_fields(doc, cdt, cdn);
 }
 
 cur_frm.cscript.serial_no = function(doc, cdt , cdn) {
-  var d = locals[cdt][cdn];
-  if (d.serial_no) {
-     get_server_fields('get_serial_details',d.serial_no,'delivery_note_details',doc,cdt,cdn,1);
-  }
+	var d = locals[cdt][cdn];
+	if (d.serial_no) {
+		 get_server_fields('get_serial_details',d.serial_no,'delivery_note_details',doc,cdt,cdn,1);
+	}
 }
 
 /* 
 // this won't work in case of Sales Bom item where item.is_stock_item = 'No'
 cur_frm.fields_dict['delivery_note_details'].grid.get_field('warehouse').get_query= function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  return "SELECT `tabBin`.`warehouse`, `tabBin`.`actual_qty` FROM `tabBin` WHERE `tabBin`.`item_code` = '"+ d.item_code +"' AND ifnull(`tabBin`.`actual_qty`,0) > 0 AND `tabBin`.`warehouse` like '%s' ORDER BY `tabBin`.`warehouse` DESC LIMIT 50";
+	var d = locals[cdt][cdn];
+	return "SELECT `tabBin`.`warehouse`, `tabBin`.`actual_qty` FROM `tabBin` WHERE `tabBin`.`item_code` = '"+ d.item_code +"' AND ifnull(`tabBin`.`actual_qty`,0) > 0 AND `tabBin`.`warehouse` like '%s' ORDER BY `tabBin`.`warehouse` DESC LIMIT 50";
 }
 */
 
 cur_frm.cscript.warehouse = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if (! d.item_code) {alert("please enter item code first"); return};
-  if (d.warehouse) {
-    arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.warehouse +"'}";
-    get_server_fields('get_actual_qty',arg,'delivery_note_details',doc,cdt,cdn,1);
-  }
+	var d = locals[cdt][cdn];
+	if (! d.item_code) {alert("please enter item code first"); return};
+	if (d.warehouse) {
+		arg = "{'item_code':'" + d.item_code + "','warehouse':'" + d.warehouse +"'}";
+		get_server_fields('get_actual_qty',arg,'delivery_note_details',doc,cdt,cdn,1);
+	}
 }
 
 
 cur_frm.fields_dict['transporter_name'].get_query = function(doc) {
-  return 'SELECT DISTINCT `tabSupplier`.`name` FROM `tabSupplier` WHERE `tabSupplier`.supplier_type = "transporter" AND `tabSupplier`.docstatus != 2 AND `tabSupplier`.%(key)s LIKE "%s" ORDER BY `tabSupplier`.`name` LIMIT 50';
+	return 'SELECT DISTINCT `tabSupplier`.`name` FROM `tabSupplier` WHERE `tabSupplier`.supplier_type = "transporter" AND `tabSupplier`.docstatus != 2 AND `tabSupplier`.%(key)s LIKE "%s" ORDER BY `tabSupplier`.`name` LIMIT 50';
 }
 
 //-----------------------------------Make Sales Invoice----------------------------------------------
 cur_frm.cscript['Make Sales Invoice'] = function() {
-  var doc = cur_frm.doc
-  n = createLocal('Receivable Voucher');
-  $c('dt_map', args={
-    'docs':compress_doclist([locals['Receivable Voucher'][n]]),
-    'from_doctype':doc.doctype,
-    'to_doctype':'Receivable Voucher',
-    'from_docname':doc.name,
-    'from_to_list':"[['Delivery Note','Receivable Voucher'],['Delivery Note Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]"
-    }, function(r,rt) {
-       loaddoc('Receivable Voucher', n);
-    }
-  );
+	var doc = cur_frm.doc
+	n = createLocal('Receivable Voucher');
+	$c('dt_map', args={
+		'docs':compress_doclist([locals['Receivable Voucher'][n]]),
+		'from_doctype':doc.doctype,
+		'to_doctype':'Receivable Voucher',
+		'from_docname':doc.name,
+		'from_to_list':"[['Delivery Note','Receivable Voucher'],['Delivery Note Detail','RV Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]"
+		}, function(r,rt) {
+			 loaddoc('Receivable Voucher', n);
+		}
+	);
 }
 
 //-----------------------------------Make Installation Note----------------------------------------------
 cur_frm.cscript['Make Installation Note'] = function() {
-  var doc = cur_frm.doc;
-  if(doc.per_installed < 100){
-    n = createLocal('Installation Note');
-    $c('dt_map', args={
-      'docs':compress_doclist([locals['Installation Note'][n]]),
-      'from_doctype':doc.doctype,
-      'to_doctype':'Installation Note',
-      'from_docname':doc.name,
-      'from_to_list':"[['Delivery Note','Installation Note'],['Delivery Note Detail','Installed Item Details']]"
-      }, function(r,rt) {
-         loaddoc('Installation Note', n);
-      }
-    );
-  }
-  else if(doc.per_installed >= 100)
-    msgprint("Item installation is already completed")
+	var doc = cur_frm.doc;
+	if(doc.per_installed < 100){
+		n = createLocal('Installation Note');
+		$c('dt_map', args={
+			'docs':compress_doclist([locals['Installation Note'][n]]),
+			'from_doctype':doc.doctype,
+			'to_doctype':'Installation Note',
+			'from_docname':doc.name,
+			'from_to_list':"[['Delivery Note','Installation Note'],['Delivery Note Detail','Installed Item Details']]"
+			}, function(r,rt) {
+				 loaddoc('Installation Note', n);
+			}
+		);
+	}
+	else if(doc.per_installed >= 100)
+		msgprint("Item installation is already completed")
 }
 
 //-----------------------------------Make Sales Invoice----------------------------------------------
 cur_frm.cscript['Make Packing Slip'] = function() {
-  var doc = cur_frm.doc
-  n = createLocal('Packing Slip');
-  $c('dt_map', args={
-    'docs':compress_doclist([locals['Packing Slip'][n]]),
-    'from_doctype':doc.doctype,
-    'to_doctype':'Packing Slip',
-    'from_docname':doc.name,
-    'from_to_list':"[['Delivery Note','Packing Slip'],['Delivery Note Detail','Packing Slip Detail']]"
-    }, function(r,rt) {
-       loaddoc('Packing Slip', n);
-    }
-  );
+	var doc = cur_frm.doc
+	n = createLocal('Packing Slip');
+	$c('dt_map', args={
+		'docs':compress_doclist([locals['Packing Slip'][n]]),
+		'from_doctype':doc.doctype,
+		'to_doctype':'Packing Slip',
+		'from_docname':doc.name,
+		'from_to_list':"[['Delivery Note','Packing Slip'],['Delivery Note Detail','Packing Slip Detail']]"
+		}, function(r,rt) {
+			 loaddoc('Packing Slip', n);
+		}
+	);
 }
 
 
 //get query select Territory
 //=======================================================================================================================
 cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
-  return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"  ORDER BY  `tabTerritory`.`name` ASC LIMIT 50';
+	return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"	ORDER BY	`tabTerritory`.`name` ASC LIMIT 50';
 }
 
 //------------------------for printing without amount----------
 
 var set_print_hide= function(doc, cdt, cdn){
-  if (doc.print_without_amount) {
-    fields['Delivery Note']['currency'].print_hide = 1;
-    fields['Delivery Note Detail']['export_rate'].print_hide = 1;
-    fields['Delivery Note Detail']['adj_rate'].print_hide = 1;
-    fields['Delivery Note Detail']['ref_rate'].print_hide = 1;
-    fields['Delivery Note Detail']['export_amount'].print_hide = 1;
-  } else {
-    fields['Delivery Note']['currency'].print_hide = 0;
-    fields['Delivery Note Detail']['export_rate'].print_hide = 0;
-    fields['Delivery Note Detail']['adj_rate'].print_hide = 0;
-    fields['Delivery Note Detail']['ref_rate'].print_hide = 0;
-    fields['Delivery Note Detail']['export_amount'].print_hide = 0;
-  }
+	if (doc.print_without_amount) {
+		fields['Delivery Note']['currency'].print_hide = 1;
+		fields['Delivery Note Detail']['export_rate'].print_hide = 1;
+		fields['Delivery Note Detail']['adj_rate'].print_hide = 1;
+		fields['Delivery Note Detail']['ref_rate'].print_hide = 1;
+		fields['Delivery Note Detail']['export_amount'].print_hide = 1;
+	} else {
+		fields['Delivery Note']['currency'].print_hide = 0;
+		fields['Delivery Note Detail']['export_rate'].print_hide = 0;
+		fields['Delivery Note Detail']['adj_rate'].print_hide = 0;
+		fields['Delivery Note Detail']['ref_rate'].print_hide = 0;
+		fields['Delivery Note Detail']['export_amount'].print_hide = 0;
+	}
 }
 
 cur_frm.cscript.print_without_amount = function(doc, cdt, cdn) {
-  set_print_hide(doc, cdt, cdn);
+	set_print_hide(doc, cdt, cdn);
 }
 
 
 //****************** For print sales order no and date*************************
 cur_frm.pformat.sales_order_no= function(doc, cdt, cdn){
-  //function to make row of table
-  
-  var make_row = function(title,val1, val2, bold){
-    var bstart = '<b>'; var bend = '</b>';
+	//function to make row of table
+	
+	var make_row = function(title,val1, val2, bold){
+		var bstart = '<b>'; var bend = '</b>';
 
-    return '<tr><td style="width:39%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
-     +'<td style="width:61%;text-align:left;">'+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'</td>'
-     +'</tr>'
-  }
+		return '<tr><td style="width:39%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
+		 +'<td style="width:61%;text-align:left;">'+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'</td>'
+		 +'</tr>'
+	}
 
-  out ='';
-  
-  var cl = getchildren('Delivery Note Detail',doc.name,'delivery_note_details');
+	out ='';
+	
+	var cl = getchildren('Delivery Note Detail',doc.name,'delivery_note_details');
 
-  // outer table  
-  var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 50%"></td><td>';
-  
-  // main table
-  out +='<table class="noborder" style="width:100%">';
+	// outer table	
+	var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 50%"></td><td>';
+	
+	// main table
+	out +='<table class="noborder" style="width:100%">';
 
-  // add rows
-  if(cl.length){
-    prevdoc_list = new Array();
-    for(var i=0;i<cl.length;i++){
-      if(cl[i].prevdoc_doctype == 'Sales Order' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
-        prevdoc_list.push(cl[i].prevdoc_docname);
-        if(prevdoc_list.length ==1)
-          out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
-        else
-          out += make_row('', cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
-      }
-    }
-  }
+	// add rows
+	if(cl.length){
+		prevdoc_list = new Array();
+		for(var i=0;i<cl.length;i++){
+			if(cl[i].prevdoc_doctype == 'Sales Order' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
+				prevdoc_list.push(cl[i].prevdoc_docname);
+				if(prevdoc_list.length ==1)
+					out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+				else
+					out += make_row('', cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+			}
+		}
+	}
 
-  out +='</table></td></tr></table></div>';
+	out +='</table></td></tr></table></div>';
 
-  return out;
+	return out;
 }
 
 $import(Notification Control)
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index f791893..60aee13 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -100,8 +100,18 @@
 # ================================================================================
 
 	# ***************** Get Item Details ******************************
-	def get_item_details(self, item_code):
-		return get_obj('Sales Common').get_item_details(item_code, self)
+	def get_item_details(self, item_code=None):
+		if item_code:
+			return get_obj('Sales Common').get_item_details(item_code, self)
+		else:
+			obj = get_obj('Sales Common')
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					ret = obj.get_item_details(doc.item_code, self)
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]					
+
 
 	# *** Re-calculates Basic Rate & amount based on Price List Selected ***
 	def get_adj_percent(self, arg=''):
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index b5c68c2..5d4310f 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -9,17 +9,19 @@
 //========================== On Load ================================================================
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
 
-  if(!doc.fiscal_year && doc.__islocal){ set_default_values(doc);}
-  if (!doc.posting_date) doc.posting_date = dateutil.obj_to_str(new Date());
-  if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date());
-  if (!doc.status) doc.status = 'Draft';
-  
-  if(doc.__islocal){
-    hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
-  }
-  
-  if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
-  
+	if(!doc.fiscal_year && doc.__islocal){ set_default_values(doc);}
+	if (!doc.posting_date) doc.posting_date = dateutil.obj_to_str(new Date());
+	if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date());
+	if (!doc.status) doc.status = 'Draft';
+	
+	if(doc.__islocal){
+		hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
+	}
+	
+	if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
+	
+	// defined in purchase_common.js
+	cur_frm.cscript.update_item_details(doc, cdt, cdn);	
 }
 
 cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
@@ -31,198 +33,198 @@
 //========================== Refresh ===============================================================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) { 
 
-  // Unhide Fields in Next Steps
-  // ---------------------------------
-  cur_frm.clear_custom_buttons();
-  if(doc.docstatus == 1){
-    var ch = getchildren('Purchase Receipt Detail',doc.name,'purchase_receipt_details');
-    allow_billing = 0;
-    for(var i in ch){
-      if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
-    }
-   cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']);
-   cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
-  }
-  else{
-    hide_field(['Repair Purchase Receipt']);
-  }
+	// Unhide Fields in Next Steps
+	// ---------------------------------
+	cur_frm.clear_custom_buttons();
+	if(doc.docstatus == 1){
+		var ch = getchildren('Purchase Receipt Detail',doc.name,'purchase_receipt_details');
+		allow_billing = 0;
+		for(var i in ch){
+			if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
+		}
+	 cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']);
+	 cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+	}
+	else{
+		hide_field(['Repair Purchase Receipt']);
+	}
 }
 
 
 //Supplier
 cur_frm.cscript.supplier = function(doc,dt,dn) {
-  if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
-  if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
+	if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
+	if(doc.supplier) unhide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
 }
 
-cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {    
-  if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+cur_frm.cscript.supplier_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
+	if(doc.supplier) get_server_fields('get_supplier_address', JSON.stringify({supplier: doc.supplier, address: doc.supplier_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,address_line1,city FROM tabAddress WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+	return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE supplier = "'+ doc.supplier +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
 }
 
 
 cur_frm.fields_dict.supplier_address.on_new = function(dn) {
-  locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
-  locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
+	locals['Address'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
+	locals['Address'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
 }
 
 cur_frm.fields_dict.contact_person.on_new = function(dn) {
-  locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
-  locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
+	locals['Contact'][dn].supplier = locals[cur_frm.doctype][cur_frm.docname].supplier;
+	locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name;
 }
 
 
 // Get Purchase Order Button
 // -----------------
 cur_frm.cscript['Pull Purchase Order Details'] = function(doc, dt, dn) {
-  var callback = function(r,rt) { 
-	  unhide_field(['supplier_address','contact_person','supplier_name','address_display', 'contact_display', 'contact_mobile','contact_email']);			  
-	  refresh_many(['supplier','supplier_address','contact_person', 'supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email', 'purchase_receipt_details', 'purchase_tax_details']);
-  }
-  $c_obj(make_doclist(dt,dn),'get_po_details','',callback);
+	var callback = function(r,rt) { 
+		unhide_field(['supplier_address','contact_person','supplier_name','address_display', 'contact_display', 'contact_mobile','contact_email']);				
+		refresh_many(['supplier','supplier_address','contact_person', 'supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email', 'purchase_receipt_details', 'purchase_tax_details']);
+	}
+	$c_obj(make_doclist(dt,dn),'get_po_details','',callback);
 }
 
 
 
 //================ create new contact ============================================================================
 cur_frm.cscript.new_contact = function(){
-  tn = createLocal('Contact');
-  locals['Contact'][tn].is_supplier = 1;
-  if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier;
-  loaddoc('Contact', tn);
+	tn = createLocal('Contact');
+	locals['Contact'][tn].is_supplier = 1;
+	if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier;
+	loaddoc('Contact', tn);
 }
 
 //======================= posting date =============================
 cur_frm.cscript.transaction_date = function(doc,cdt,cdn){
-  if(doc.__islocal){ 
-    cur_frm.cscript.get_default_schedule_date(doc);
-  }
+	if(doc.__islocal){ 
+		cur_frm.cscript.get_default_schedule_date(doc);
+	}
 }
 
 // ***************** Get project name *****************
 cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
+	return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
 }
 
 
 //========================= Overloaded query for link batch_no =============================================================
 cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(d.item_code){
-    return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50"
-  }
-  else{
-    alert("Please enter Item Code.");
-  }
+	var d = locals[cdt][cdn];
+	if(d.item_code){
+		return "SELECT tabBatch.name, tabBatch.description FROM tabBatch WHERE tabBatch.docstatus != 2 AND tabBatch.item = '"+ d.item_code +"' AND `tabBatch`.`name` like '%s' ORDER BY `tabBatch`.`name` DESC LIMIT 50"
+	}
+	else{
+		alert("Please enter Item Code.");
+	}
 }
 
 cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){
-  if(doc.select_print_heading){
-    // print heading
-    cur_frm.pformat.print_heading = doc.select_print_heading;
-  }
-  else
-    cur_frm.pformat.print_heading = "Purchase Receipt";
+	if(doc.select_print_heading){
+		// print heading
+		cur_frm.pformat.print_heading = doc.select_print_heading;
+	}
+	else
+		cur_frm.pformat.print_heading = "Purchase Receipt";
 }
-// ***************** Get Print Heading  *****************
+// ***************** Get Print Heading	*****************
 cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
-  return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
+	return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
 }
 
 //========================= Received Qty =============================================================
 
 cur_frm.cscript.received_qty = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  ret = {
-      'qty' : 0,
-      'stock_qty': 0,
-      'rejected_qty' : 0
-    }
-  set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
-  cur_frm.cscript.calc_amount(doc, 2);
+	var d = locals[cdt][cdn];
+	ret = {
+			'qty' : 0,
+			'stock_qty': 0,
+			'rejected_qty' : 0
+		}
+	set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
+	cur_frm.cscript.calc_amount(doc, 2);
 }
 
 //======================== Qty (Accepted Qty) =========================================================
 
 cur_frm.cscript.qty = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  // Step 1 :=> Check If Qty > Received Qty
-  if (flt(d.qty) > flt(d.received_qty)) {
-    alert("Accepted Qty cannot be greater than Received Qty")
-    ret = {
-      'qty' : 0,
-      'stock_qty': 0,
-      'rejected_qty' : 0
-    }
-    // => Set Qty = 0 and rejected_qty = 0
-    set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
-    cur_frm.cscript.calc_amount(doc, 2);
-    // => Return
-    return
-  }
-  // Step 2 :=> Check IF Qty <= REceived Qty
-  else {
-    ret = {
-      'rejected_qty':flt(d.received_qty) - flt(d.qty)
-    }
-    // => Set Rejected Qty = Received Qty - Qty
-    set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
-    // => Calculate Amount
-    cur_frm.cscript.calc_amount(doc, 2);
-    cur_frm.cscript.update_stock_qty(doc,cdt,cdn);
-  }  
+	var d = locals[cdt][cdn];
+	// Step 1 :=> Check If Qty > Received Qty
+	if (flt(d.qty) > flt(d.received_qty)) {
+		alert("Accepted Qty cannot be greater than Received Qty")
+		ret = {
+			'qty' : 0,
+			'stock_qty': 0,
+			'rejected_qty' : 0
+		}
+		// => Set Qty = 0 and rejected_qty = 0
+		set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
+		cur_frm.cscript.calc_amount(doc, 2);
+		// => Return
+		return
+	}
+	// Step 2 :=> Check IF Qty <= REceived Qty
+	else {
+		ret = {
+			'rejected_qty':flt(d.received_qty) - flt(d.qty)
+		}
+		// => Set Rejected Qty = Received Qty - Qty
+		set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
+		// => Calculate Amount
+		cur_frm.cscript.calc_amount(doc, 2);
+		cur_frm.cscript.update_stock_qty(doc,cdt,cdn);
+	}	
 }
 
 //======================== Rejected Qty =========================================================
 cur_frm.cscript.rejected_qty = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  // Step 1 :=> Check If Rejected Qty > Received Qty
-  if (flt(d.rejected_qty) > flt(d.received_qty)) {
-    alert("Rejected Qty cannot be greater than Received Qty") 
-    ret = {
-      'qty' : 0,
-      'stock_qty': 0,
-      'rejected_qty' : 0
-    }
-    // => Set Qty = 0 and rejected_qty = 0
-    set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
-    cur_frm.cscript.calc_amount(doc, 2);
-    // => Return
-    return
-  }
-  // Step 2 :=> Check IF Rejected Qty <= REceived Qty
-  else {
-    ret = {
-      'qty':flt(d.received_qty) - flt(d.rejected_qty)
-    }
-    // => Set Qty = Received Qty - Rejected Qty
-    set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
-    // Calculate Amount
-    cur_frm.cscript.calc_amount(doc, 2);
-    cur_frm.cscript.update_stock_qty(doc,cdt,cdn);
-  }
+	var d = locals[cdt][cdn];
+	// Step 1 :=> Check If Rejected Qty > Received Qty
+	if (flt(d.rejected_qty) > flt(d.received_qty)) {
+		alert("Rejected Qty cannot be greater than Received Qty") 
+		ret = {
+			'qty' : 0,
+			'stock_qty': 0,
+			'rejected_qty' : 0
+		}
+		// => Set Qty = 0 and rejected_qty = 0
+		set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
+		cur_frm.cscript.calc_amount(doc, 2);
+		// => Return
+		return
+	}
+	// Step 2 :=> Check IF Rejected Qty <= REceived Qty
+	else {
+		ret = {
+			'qty':flt(d.received_qty) - flt(d.rejected_qty)
+		}
+		// => Set Qty = Received Qty - Rejected Qty
+		set_multiple('Purchase Receipt Detail', cdn, ret, 'purchase_receipt_details');
+		// Calculate Amount
+		cur_frm.cscript.calc_amount(doc, 2);
+		cur_frm.cscript.update_stock_qty(doc,cdt,cdn);
+	}
 }
 
 //================================= Purchase Order No Get Query ====================================
 cur_frm.fields_dict['purchase_order_no'].get_query = function(doc) {
-  if (doc.supplier)
-    return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`supplier` = "' +doc.supplier + '" and`tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100  and `tabPurchase Order`.`currency` = ifnull("' +doc.currency+ '","") and `tabPurchase Order`.company = "'+ doc.company +'" and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50';
-  else
-    return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`company` = "'+ doc.company +'" and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100 and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50';
+	if (doc.supplier)
+		return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`supplier` = "' +doc.supplier + '" and`tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100	and `tabPurchase Order`.`currency` = ifnull("' +doc.currency+ '","") and `tabPurchase Order`.company = "'+ doc.company +'" and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50';
+	else
+		return 'SELECT DISTINCT `tabPurchase Order`.`name` FROM `tabPurchase Order` WHERE `tabPurchase Order`.`docstatus` = 1 and `tabPurchase Order`.`company` = "'+ doc.company +'" and `tabPurchase Order`.`status` != "Stopped" and ifnull(`tabPurchase Order`.`per_received`, 0) < 100 and `tabPurchase Order`.%(key)s LIKE "%s" ORDER BY `tabPurchase Order`.`name` DESC LIMIT 50';
 }
 
 // QA INspection report get_query
 //---------------------------------
 
 cur_frm.fields_dict.purchase_receipt_details.grid.get_field("qa_no").get_query = function(doc) {
-  return 'SELECT `tabQA Inspection Report`.name FROM `tabQA Inspection Report` WHERE `tabQA Inspection Report`.docstatus = 1 AND `tabQA Inspection Report`.%(key)s LIKE "%s"';
+	return 'SELECT `tabQA Inspection Report`.name FROM `tabQA Inspection Report` WHERE `tabQA Inspection Report`.docstatus = 1 AND `tabQA Inspection Report`.%(key)s LIKE "%s"';
 }
 
 // On Button Click Functions
@@ -231,17 +233,17 @@
 
 // ================================ Make Purchase Invoice ==========================================
 cur_frm.cscript['Make Purchase Invoice'] = function() {
-  n = createLocal('Payable Voucher');
-  $c('dt_map', args={
-    'docs':compress_doclist([locals['Payable Voucher'][n]]),
-    'from_doctype': cur_frm.doc.doctype,
-    'to_doctype':'Payable Voucher',
-    'from_docname': cur_frm.doc.name,
-    'from_to_list':"[['Purchase Receipt','Payable Voucher'],['Purchase Receipt Detail','PV Detail']]"
-    }, function(r,rt) {
-       loaddoc('Payable Voucher', n);
-    }
-  );
+	n = createLocal('Payable Voucher');
+	$c('dt_map', args={
+		'docs':compress_doclist([locals['Payable Voucher'][n]]),
+		'from_doctype': cur_frm.doc.doctype,
+		'to_doctype':'Payable Voucher',
+		'from_docname': cur_frm.doc.name,
+		'from_to_list':"[['Purchase Receipt','Payable Voucher'],['Purchase Receipt Detail','PV Detail'],['Purchase Tax Detail','Purchase Tax Detail']]"
+		}, function(r,rt) {
+			 loaddoc('Payable Voucher', n);
+		}
+	);
 }
 
 
@@ -249,43 +251,43 @@
 
 //****************** For print sales order no and date*************************
 cur_frm.pformat.purchase_order_no = function(doc, cdt, cdn){
-  //function to make row of table
-  
-  var make_row = function(title,val1, val2, bold){
-    var bstart = '<b>'; var bend = '</b>';
+	//function to make row of table
+	
+	var make_row = function(title,val1, val2, bold){
+		var bstart = '<b>'; var bend = '</b>';
 
-    return '<tr><td style="width:39%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
-     +'<td style="width:61%;text-align:left;">'+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'</td>'
-     +'</tr>'
-  }
+		return '<tr><td style="width:39%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
+		 +'<td style="width:61%;text-align:left;">'+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'</td>'
+		 +'</tr>'
+	}
 
-  out ='';
-  
-  var cl = getchildren('Purchase Receipt Detail',doc.name,'purchase_receipt_details');
+	out ='';
+	
+	var cl = getchildren('Purchase Receipt Detail',doc.name,'purchase_receipt_details');
 
-  // outer table  
-  var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 50%"></td><td>';
-  
-  // main table
-  out +='<table class="noborder" style="width:100%">';
+	// outer table	
+	var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 50%"></td><td>';
+	
+	// main table
+	out +='<table class="noborder" style="width:100%">';
 
-  // add rows
-  if(cl.length){
-    prevdoc_list = new Array();
-    for(var i=0;i<cl.length;i++){
-      if(cl[i].prevdoc_doctype == 'Purchase Order' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
-        prevdoc_list.push(cl[i].prevdoc_docname);
-        if(prevdoc_list.length ==1)
-          out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
-        else
-          out += make_row('', cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
-      }
-    }
-  }
+	// add rows
+	if(cl.length){
+		prevdoc_list = new Array();
+		for(var i=0;i<cl.length;i++){
+			if(cl[i].prevdoc_doctype == 'Purchase Order' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
+				prevdoc_list.push(cl[i].prevdoc_docname);
+				if(prevdoc_list.length ==1)
+					out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+				else
+					out += make_row('', cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+			}
+		}
+	}
 
-  out +='</table></td></tr></table></div>';
+	out +='</table></td></tr></table></div>';
 
-  return out;
+	return out;
 }
 
 $import(Notification Control)
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 41ee2ff..ccc4201 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -19,407 +19,422 @@
 from utilities.transaction_base import TransactionBase
 
 class DocType(TransactionBase):
-  def __init__(self, doc, doclist=[]):
-    self.doc = doc
-    self.doclist = doclist
-    self.defaults = get_defaults()
-    self.tname = 'Purchase Receipt Detail'
-    self.fname = 'purchase_receipt_details'
-    self.count = 0
+	def __init__(self, doc, doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
+		self.defaults = get_defaults()
+		self.tname = 'Purchase Receipt Detail'
+		self.fname = 'purchase_receipt_details'
+		self.count = 0
 
-  # Autoname
-  # ---------
-  def autoname(self):
-    self.doc.name = make_autoname(self.doc.naming_series+'.#####')
+	# Autoname
+	# ---------
+	def autoname(self):
+		self.doc.name = make_autoname(self.doc.naming_series+'.#####')
 
 
-  # Client Trigger Functions
-  #----------------------------------------------------------------------------------------------------
+	# Client Trigger Functions
+	#----------------------------------------------------------------------------------------------------
 
-  def get_default_schedule_date(self):
-    get_obj(dt = 'Purchase Common').get_default_schedule_date(self)
+	def get_default_schedule_date(self):
+		get_obj(dt = 'Purchase Common').get_default_schedule_date(self)
 
 #-----------------Validation For Fiscal Year------------------------
-  def validate_fiscal_year(self):
-    get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Transaction Date')
+	def validate_fiscal_year(self):
+		get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Transaction Date')
 
 
-  # Get Item Details
-  def get_item_details(self, arg = ''):
-    return get_obj(dt='Purchase Common').get_item_details(self,arg)
-
-  # Get UOM Details
-  def get_uom_details(self, arg = ''):
-    return get_obj(dt='Purchase Common').get_uom_details(arg)
-
-  # GET TERMS & CONDITIONS
-  # =====================================================================================
-  def get_tc_details(self):
-    return get_obj('Purchase Common').get_tc_details(self)
-
-  # get available qty at warehouse
-  def get_bin_details(self, arg = ''):
-    return get_obj(dt='Purchase Common').get_bin_details(arg)
-
-  # Pull Purchase Order
-  def get_po_details(self):
-    self.validate_prev_docname()
-    get_obj('DocType Mapper', 'Purchase Order-Purchase Receipt').dt_map('Purchase Order', 'Purchase Receipt', self.doc.purchase_order_no, self.doc, self.doclist, "[['Purchase Order','Purchase Receipt'],['PO Detail', 'Purchase Receipt Detail'],['Purchase Tax Detail','Purchase Tax Detail']]")
-
-  # validate if PO has been pulled twice
-  def validate_prev_docname(self):
-    for d in getlist(self.doclist, 'purchase_receipt_details'):
-      if self.doc.purchase_order_no and d.prevdoc_docname and self.doc.purchase_order_no == d.prevdoc_docname:
-        msgprint(cstr(self.doc.purchase_order_no) + " Purchase Order details have already been pulled. ")
-        raise Exception
+	# Get Item Details
+	def get_item_details(self, arg = ''):
+		if arg:
+			return get_obj(dt='Purchase Common').get_item_details(self,arg)
+		else:
+			import json
+			obj = get_obj('Purchase Common')
+			for doc in self.doclist:
+				if doc.fields.get('item_code'):
+					temp = {
+						'item_code': doc.fields.get('item_code'),
+						'warehouse': doc.fields.get('warehouse')
+					}
+					ret = obj.get_item_details(self, json.dumps(temp))
+					for r in ret:
+						if not doc.fields.get(r):
+							doc.fields[r] = ret[r]
 
 
-  # validation
-  #-------------------------------------------------------------------------------------------------------------
-  # validate accepted and rejected qty
-  def validate_accepted_rejected_qty(self):
-    for d in getlist(self.doclist, "purchase_receipt_details"):
+	# Get UOM Details
+	def get_uom_details(self, arg = ''):
+		return get_obj(dt='Purchase Common').get_uom_details(arg)
 
-      # If Reject Qty than Rejected warehouse is mandatory
-      if flt(d.rejected_qty) and (not self.doc.rejected_warehouse):
-        msgprint("Rejected Warehouse is necessary if there are rejections. See 'Receipt Items'")
-        raise Exception
+	# GET TERMS & CONDITIONS
+	# =====================================================================================
+	def get_tc_details(self):
+		return get_obj('Purchase Common').get_tc_details(self)
 
-      # Check Received Qty = Accepted Qty + Rejected Qty
-      if ((flt(d.qty) + flt(d.rejected_qty)) != flt(d.received_qty)):
+	# get available qty at warehouse
+	def get_bin_details(self, arg = ''):
+		return get_obj(dt='Purchase Common').get_bin_details(arg)
 
-        msgprint("Sum of Accepted Qty and Rejected Qty must be equal to Received quantity. Error for Item: " + cstr(d.item_code))
-        raise Exception
+	# Pull Purchase Order
+	def get_po_details(self):
+		self.validate_prev_docname()
+		get_obj('DocType Mapper', 'Purchase Order-Purchase Receipt').dt_map('Purchase Order', 'Purchase Receipt', self.doc.purchase_order_no, self.doc, self.doclist, "[['Purchase Order','Purchase Receipt'],['PO Detail', 'Purchase Receipt Detail'],['Purchase Tax Detail','Purchase Tax Detail']]")
+
+	# validate if PO has been pulled twice
+	def validate_prev_docname(self):
+		for d in getlist(self.doclist, 'purchase_receipt_details'):
+			if self.doc.purchase_order_no and d.prevdoc_docname and self.doc.purchase_order_no == d.prevdoc_docname:
+				msgprint(cstr(self.doc.purchase_order_no) + " Purchase Order details have already been pulled. ")
+				raise Exception
 
 
-  def validate_challan_no(self):
-    "Validate if same challan no exists for same supplier in a submitted purchase receipt"
-    if self.doc.challan_no:
-      exists = webnotes.conn.sql("""
-	    SELECT name FROM `tabPurchase Receipt`
-	    WHERE name!=%s AND supplier=%s AND challan_no=%s
+	# validation
+	#-------------------------------------------------------------------------------------------------------------
+	# validate accepted and rejected qty
+	def validate_accepted_rejected_qty(self):
+		for d in getlist(self.doclist, "purchase_receipt_details"):
+
+			# If Reject Qty than Rejected warehouse is mandatory
+			if flt(d.rejected_qty) and (not self.doc.rejected_warehouse):
+				msgprint("Rejected Warehouse is necessary if there are rejections. See 'Receipt Items'")
+				raise Exception
+
+			# Check Received Qty = Accepted Qty + Rejected Qty
+			if ((flt(d.qty) + flt(d.rejected_qty)) != flt(d.received_qty)):
+
+				msgprint("Sum of Accepted Qty and Rejected Qty must be equal to Received quantity. Error for Item: " + cstr(d.item_code))
+				raise Exception
+
+
+	def validate_challan_no(self):
+		"Validate if same challan no exists for same supplier in a submitted purchase receipt"
+		if self.doc.challan_no:
+			exists = webnotes.conn.sql("""
+			SELECT name FROM `tabPurchase Receipt`
+			WHERE name!=%s AND supplier=%s AND challan_no=%s
 		AND docstatus=1""", (self.doc.name, self.doc.supplier, self.doc.challan_no))
-      if exists:
-	    webnotes.msgprint("Another Purchase Receipt using the same Challan No. already exists.\
-		  Please enter a valid Challan No.", raise_exception=1)
+			if exists:
+				webnotes.msgprint("Another Purchase Receipt using the same Challan No. already exists.\
+			Please enter a valid Challan No.", raise_exception=1)
 
 
-  # update valuation rate
-  def update_valuation_rate(self):
-    total_b_cost = flt(self.doc.buying_cost_transport) + flt(self.doc.buying_cost_taxes) + flt(self.doc.buying_cost_other)
-    for d in getlist(self.doclist, 'purchase_receipt_details'):
-      if flt(self.doc.net_total) and flt(d.qty):
-        #d.valuation_rate = (flt(d.purchase_rate) + ((flt(d.amount) * (total_b_cost)) / (self.doc.net_total * flt(d.qty))) + (flt(d.rm_supp_cost) / flt(d.qty))) / flt(d.conversion_factor)
-        d.valuation_rate = (flt(d.purchase_rate) + ((flt(d.amount) * (total_b_cost)) / (self.doc.net_total * flt(d.qty))) + (flt(d.rm_supp_cost) / flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor)
+	# update valuation rate
+	def update_valuation_rate(self):
+		total_b_cost = flt(self.doc.buying_cost_transport) + flt(self.doc.buying_cost_taxes) + flt(self.doc.buying_cost_other)
+		for d in getlist(self.doclist, 'purchase_receipt_details'):
+			if flt(self.doc.net_total) and flt(d.qty):
+				#d.valuation_rate = (flt(d.purchase_rate) + ((flt(d.amount) * (total_b_cost)) / (self.doc.net_total * flt(d.qty))) + (flt(d.rm_supp_cost) / flt(d.qty))) / flt(d.conversion_factor)
+				d.valuation_rate = (flt(d.purchase_rate) + ((flt(d.amount) * (total_b_cost)) / (self.doc.net_total * flt(d.qty))) + (flt(d.rm_supp_cost) / flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor)
 
-  # Check for Stopped status
-  def check_for_stopped_status(self, pc_obj):
-    check_list =[]
-    for d in getlist(self.doclist, 'purchase_receipt_details'):
-      if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list:
-        check_list.append(d.prevdoc_docname)
-        pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname)
+	# Check for Stopped status
+	def check_for_stopped_status(self, pc_obj):
+		check_list =[]
+		for d in getlist(self.doclist, 'purchase_receipt_details'):
+			if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list:
+				check_list.append(d.prevdoc_docname)
+				pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname)
 
-  #check in manage account if purchase order required or not.
-  # ====================================================================================
-  def po_required(self):
-    res = sql("select value from `tabSingles` where doctype = 'Manage Account' and field = 'po_required'")
-    if res and res[0][0]== 'Yes':
-       for d in getlist(self.doclist,'purchase_receipt_details'):
-         if not d.prevdoc_docname:
-           msgprint("Purchse Order No. required against item %s"%d.item_code)
-           raise Exception
+	#check in manage account if purchase order required or not.
+	# ====================================================================================
+	def po_required(self):
+		res = sql("select value from `tabSingles` where doctype = 'Manage Account' and field = 'po_required'")
+		if res and res[0][0]== 'Yes':
+			 for d in getlist(self.doclist,'purchase_receipt_details'):
+				 if not d.prevdoc_docname:
+					 msgprint("Purchse Order No. required against item %s"%d.item_code)
+					 raise Exception
 
 
-  # validate
-  def validate(self):
-    self.po_required()
-    self.validate_fiscal_year()
-    set(self.doc, 'status', 'Draft')       # set status as "Draft"
-    self.validate_accepted_rejected_qty()
-    self.validate_inspection()             # Validate Inspection
-    get_obj('Stock Ledger').validate_serial_no(self, 'purchase_receipt_details')
-    self.validate_challan_no()
+	# validate
+	def validate(self):
+		self.po_required()
+		self.validate_fiscal_year()
+		set(self.doc, 'status', 'Draft')			 # set status as "Draft"
+		self.validate_accepted_rejected_qty()
+		self.validate_inspection()						 # Validate Inspection
+		get_obj('Stock Ledger').validate_serial_no(self, 'purchase_receipt_details')
+		self.validate_challan_no()
 
-    pc_obj = get_obj(dt='Purchase Common')
-    pc_obj.validate_for_items(self)
-    pc_obj.validate_mandatory(self)
-    pc_obj.validate_conversion_rate(self)
-    pc_obj.get_prevdoc_date(self)
-    pc_obj.validate_reference_value(self)
-    self.check_for_stopped_status(pc_obj)
+		pc_obj = get_obj(dt='Purchase Common')
+		pc_obj.validate_for_items(self)
+		pc_obj.validate_mandatory(self)
+		pc_obj.validate_conversion_rate(self)
+		pc_obj.get_prevdoc_date(self)
+		pc_obj.validate_reference_value(self)
+		self.check_for_stopped_status(pc_obj)
 
-    # get total in words
-    dcc = TransactionBase().get_company_currency(self.doc.company)
-    self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total)
-    self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import)
-    # update valuation rate
-    self.update_valuation_rate()
+		# get total in words
+		dcc = TransactionBase().get_company_currency(self.doc.company)
+		self.doc.in_words = pc_obj.get_total_in_words(dcc, self.doc.grand_total)
+		self.doc.in_words_import = pc_obj.get_total_in_words(self.doc.currency, self.doc.grand_total_import)
+		# update valuation rate
+		self.update_valuation_rate()
 
 
-  # On Update
-  # ----------------------------------------------------------------------------------------------------
-  def on_update(self):
-    if self.doc.rejected_warehouse:
-      for d in getlist(self.doclist,'purchase_receipt_details'):
-        d.rejected_warehouse = self.doc.rejected_warehouse
+	# On Update
+	# ----------------------------------------------------------------------------------------------------
+	def on_update(self):
+		if self.doc.rejected_warehouse:
+			for d in getlist(self.doclist,'purchase_receipt_details'):
+				d.rejected_warehouse = self.doc.rejected_warehouse
 
-    self.update_rw_material_detail()
-    get_obj('Stock Ledger').scrub_serial_nos(self)
+		self.update_rw_material_detail()
+		get_obj('Stock Ledger').scrub_serial_nos(self)
 
 
-  # On Submit
-  # -----------------------------------------------------------------------------------------------------
+	# On Submit
+	# -----------------------------------------------------------------------------------------------------
 
  # Update Stock
-  def update_stock(self, is_submit):
-    pc_obj = get_obj('Purchase Common')
-    self.values = []
-    for d in getlist(self.doclist, 'purchase_receipt_details'):
-      # Check if is_stock_item == 'Yes'
-      if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes':
-        ord_qty = 0
-        pr_qty = flt(d.qty) * flt(d.conversion_factor)
+	def update_stock(self, is_submit):
+		pc_obj = get_obj('Purchase Common')
+		self.values = []
+		for d in getlist(self.doclist, 'purchase_receipt_details'):
+			# Check if is_stock_item == 'Yes'
+			if sql("select is_stock_item from tabItem where name=%s", d.item_code)[0][0]=='Yes':
+				ord_qty = 0
+				pr_qty = flt(d.qty) * flt(d.conversion_factor)
 
-        # Check If Prevdoc Doctype is Purchase Order
-        if cstr(d.prevdoc_doctype) == 'Purchase Order':
-          # get qty and pending_qty of prevdoc
-          curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'PO Detail', 'Purchase Order - Purchase Receipt', self.doc.name)
-          max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0
+				# Check If Prevdoc Doctype is Purchase Order
+				if cstr(d.prevdoc_doctype) == 'Purchase Order':
+					# get qty and pending_qty of prevdoc
+					curr_ref_qty = pc_obj.get_qty( d.doctype, 'prevdoc_detail_docname', d.prevdoc_detail_docname, 'PO Detail', 'Purchase Order - Purchase Receipt', self.doc.name)
+					max_qty, qty, curr_qty = flt(curr_ref_qty.split('~~~')[1]), flt(curr_ref_qty.split('~~~')[0]), 0
 
-          if flt(qty) + flt(pr_qty) > flt(max_qty):
-            curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor)
-          else:
-            curr_qty = flt(pr_qty)
+					if flt(qty) + flt(pr_qty) > flt(max_qty):
+						curr_qty = (flt(max_qty) - flt(qty)) * flt(d.conversion_factor)
+					else:
+						curr_qty = flt(pr_qty)
 
-          ord_qty = -flt(curr_qty)
-          # update order qty in bin
-          bin = get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(ord_qty), 0, 0, d.item_code, self.doc.transaction_date)
+					ord_qty = -flt(curr_qty)
+					# update order qty in bin
+					bin = get_obj('Warehouse', d.warehouse).update_bin(0, 0, (is_submit and 1 or -1) * flt(ord_qty), 0, 0, d.item_code, self.doc.transaction_date)
 
-        # UPDATE actual qty to warehouse by pr_qty
-        self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit)
-        # UPDATE actual to rejected warehouse by rejected qty
-        if flt(d.rejected_qty) > 0:
-          self.make_sl_entry(d, self.doc.rejected_warehouse, flt(d.rejected_qty) * flt(d.conversion_factor), d.valuation_rate, is_submit)
+				# UPDATE actual qty to warehouse by pr_qty
+				self.make_sl_entry(d, d.warehouse, flt(pr_qty), d.valuation_rate, is_submit)
+				# UPDATE actual to rejected warehouse by rejected qty
+				if flt(d.rejected_qty) > 0:
+					self.make_sl_entry(d, self.doc.rejected_warehouse, flt(d.rejected_qty) * flt(d.conversion_factor), d.valuation_rate, is_submit)
 
-    self.bk_flush_supp_wh(is_submit)
+		self.bk_flush_supp_wh(is_submit)
 
-    if self.values:
-      get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values)
+		if self.values:
+			get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values)
 
 
-  # make Stock Entry
-  def make_sl_entry(self, d, wh, qty, in_value, is_submit):
-    self.values.append({
-      'item_code'           : d.fields.has_key('item_code') and d.item_code or d.rm_item_code,
-      'warehouse'           : wh,
-      'transaction_date'    : self.doc.transaction_date,
-      'posting_date'        : self.doc.posting_date,
-      'posting_time'        : self.doc.posting_time,
-      'voucher_type'        : 'Purchase Receipt',
-      'voucher_no'          : self.doc.name,
-      'voucher_detail_no'   : d.name,
-      'actual_qty'          : qty,
-      'stock_uom'           : d.stock_uom,
-      'incoming_rate'       : in_value,
-      'company'             : self.doc.company,
-      'fiscal_year'         : self.doc.fiscal_year,
-      'is_cancelled'        : (is_submit==1) and 'No' or 'Yes',
-      'batch_no'            : d.batch_no,
-      'serial_no'           : d.serial_no
-      })
+	# make Stock Entry
+	def make_sl_entry(self, d, wh, qty, in_value, is_submit):
+		self.values.append({
+			'item_code'					 : d.fields.has_key('item_code') and d.item_code or d.rm_item_code,
+			'warehouse'					 : wh,
+			'transaction_date'		: self.doc.transaction_date,
+			'posting_date'				: self.doc.posting_date,
+			'posting_time'				: self.doc.posting_time,
+			'voucher_type'				: 'Purchase Receipt',
+			'voucher_no'					: self.doc.name,
+			'voucher_detail_no'	 : d.name,
+			'actual_qty'					: qty,
+			'stock_uom'					 : d.stock_uom,
+			'incoming_rate'			 : in_value,
+			'company'						 : self.doc.company,
+			'fiscal_year'				 : self.doc.fiscal_year,
+			'is_cancelled'				: (is_submit==1) and 'No' or 'Yes',
+			'batch_no'						: d.batch_no,
+			'serial_no'					 : d.serial_no
+			})
 
 
-  def validate_inspection(self):
-    for d in getlist(self.doclist, 'purchase_receipt_details'):     #Enter inspection date for all items that require inspection
-      ins_reqd = sql("select inspection_required from `tabItem` where name = %s", (d.item_code), as_dict = 1)
-      ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No'
-      if ins_reqd == 'Yes' and not d.qa_no:
-        msgprint("Item: " + d.item_code + " requires QA Inspection. Please enter QA No or report to authorized person to create QA Inspection Report")
+	def validate_inspection(self):
+		for d in getlist(self.doclist, 'purchase_receipt_details'):		 #Enter inspection date for all items that require inspection
+			ins_reqd = sql("select inspection_required from `tabItem` where name = %s", (d.item_code), as_dict = 1)
+			ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No'
+			if ins_reqd == 'Yes' and not d.qa_no:
+				msgprint("Item: " + d.item_code + " requires QA Inspection. Please enter QA No or report to authorized person to create QA Inspection Report")
 
-  # Check for Stopped status
-  def check_for_stopped_status(self, pc_obj):
-    check_list =[]
-    for d in getlist(self.doclist, 'purchase_receipt_details'):
-      if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list:
-        check_list.append(d.prevdoc_docname)
-        pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname)
+	# Check for Stopped status
+	def check_for_stopped_status(self, pc_obj):
+		check_list =[]
+		for d in getlist(self.doclist, 'purchase_receipt_details'):
+			if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_docname not in check_list:
+				check_list.append(d.prevdoc_docname)
+				pc_obj.check_for_stopped_status( d.prevdoc_doctype, d.prevdoc_docname)
 
 
-  # on submit
-  def on_submit(self):
-    # Check for Approving Authority
-    get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total)
+	# on submit
+	def on_submit(self):
+		# Check for Approving Authority
+		get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total)
 
-    # Set status as Submitted
-    set(self.doc,'status', 'Submitted')
-    pc_obj = get_obj('Purchase Common')
+		# Set status as Submitted
+		set(self.doc,'status', 'Submitted')
+		pc_obj = get_obj('Purchase Common')
 
-    # Update Previous Doc i.e. update pending_qty and Status accordingly
-    pc_obj.update_prevdoc_detail(self, is_submit = 1)
+		# Update Previous Doc i.e. update pending_qty and Status accordingly
+		pc_obj.update_prevdoc_detail(self, is_submit = 1)
 
-    # Update Serial Record
-    get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 1, is_incoming = 1)
+		# Update Serial Record
+		get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 1, is_incoming = 1)
 
-    # Update Stock
-    self.update_stock(is_submit = 1)
+		# Update Stock
+		self.update_stock(is_submit = 1)
 
-    # Update last purchase rate
-    pc_obj.update_last_purchase_rate(self, 1)
+		# Update last purchase rate
+		pc_obj.update_last_purchase_rate(self, 1)
 
 
 
-  #On Cancel
-  #----------------------------------------------------------------------------------------------------
-  def check_next_docstatus(self):
-    submit_rv = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % (self.doc.name))
-    if submit_rv:
-      msgprint("Purchase Invoice : " + cstr(self.submit_rv[0][0]) + " has already been submitted !")
-      raise Exception , "Validation Error."
+	#On Cancel
+	#----------------------------------------------------------------------------------------------------
+	def check_next_docstatus(self):
+		submit_rv = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % (self.doc.name))
+		if submit_rv:
+			msgprint("Purchase Invoice : " + cstr(self.submit_rv[0][0]) + " has already been submitted !")
+			raise Exception , "Validation Error."
 
 
-  def on_cancel(self):
-    pc_obj = get_obj('Purchase Common')
+	def on_cancel(self):
+		pc_obj = get_obj('Purchase Common')
 
-    self.check_for_stopped_status(pc_obj)
-    # 1.Check if Payable Voucher has been submitted against current Purchase Order
-    # pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail')
+		self.check_for_stopped_status(pc_obj)
+		# 1.Check if Payable Voucher has been submitted against current Purchase Order
+		# pc_obj.check_docstatus(check = 'Next', doctype = 'Payable Voucher', docname = self.doc.name, detail_doctype = 'PV Detail')
 
-    submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % self.doc.name)
-    if submitted:
-      msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
-      raise Exception
+		submitted = sql("select t1.name from `tabPayable Voucher` t1,`tabPV Detail` t2 where t1.name = t2.parent and t2.purchase_receipt = '%s' and t1.docstatus = 1" % self.doc.name)
+		if submitted:
+			msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
+			raise Exception
 
-    # 2.Set Status as Cancelled
-    set(self.doc,'status','Cancelled')
+		# 2.Set Status as Cancelled
+		set(self.doc,'status','Cancelled')
 
-    # 3. Cancel Serial No
-    get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 0, is_incoming = 1)
+		# 3. Cancel Serial No
+		get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 0, is_incoming = 1)
 
-    # 4.Update Bin
-    self.update_stock(is_submit = 0)
+		# 4.Update Bin
+		self.update_stock(is_submit = 0)
 
-    # 5.Update Indents Pending Qty and accordingly it's Status
-    pc_obj.update_prevdoc_detail(self, is_submit = 0)
+		# 5.Update Indents Pending Qty and accordingly it's Status
+		pc_obj.update_prevdoc_detail(self, is_submit = 0)
 
-    # 6. Update last purchase rate
-    pc_obj.update_last_purchase_rate(self, 0)
+		# 6. Update last purchase rate
+		pc_obj.update_last_purchase_rate(self, 0)
 
 
 #----------- code for Sub-contracted Items -------------------
-  #--------check for sub-contracted items and accordingly update PR raw material detail table--------
-  def update_rw_material_detail(self):
+	#--------check for sub-contracted items and accordingly update PR raw material detail table--------
+	def update_rw_material_detail(self):
 
-    for d in getlist(self.doclist,'purchase_receipt_details'):
-      item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code))
+		for d in getlist(self.doclist,'purchase_receipt_details'):
+			item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code))
 
-      if item_det[0][0] == 'Yes':
-        if item_det[0][1] == 'Yes':
-          if not self.doc.is_subcontracted:
-            msgprint("Please enter whether purchase receipt to be made for subcontracting or for purchase in 'Is Subcontracted' field .")
-            raise Exception
-          if self.doc.is_subcontracted == 'Yes':
-            if not self.doc.supplier_warehouse:
-              msgprint("Please Enter Supplier Warehouse for subcontracted Items")
-              raise Exception
-            self.add_bom(d)
-          else:
-            self.doc.clear_table(self.doclist,'pr_raw_material_details',1)
-            self.doc.save()
-        elif item_det[0][1] == 'No':
-          if not self.doc.supplier_warehouse:
-            msgprint("Please Enter Supplier Warehouse for subcontracted Items")
-            raise Exception
-          self.add_bom(d)
+			if item_det[0][0] == 'Yes':
+				if item_det[0][1] == 'Yes':
+					if not self.doc.is_subcontracted:
+						msgprint("Please enter whether purchase receipt to be made for subcontracting or for purchase in 'Is Subcontracted' field .")
+						raise Exception
+					if self.doc.is_subcontracted == 'Yes':
+						if not self.doc.supplier_warehouse:
+							msgprint("Please Enter Supplier Warehouse for subcontracted Items")
+							raise Exception
+						self.add_bom(d)
+					else:
+						self.doc.clear_table(self.doclist,'pr_raw_material_details',1)
+						self.doc.save()
+				elif item_det[0][1] == 'No':
+					if not self.doc.supplier_warehouse:
+						msgprint("Please Enter Supplier Warehouse for subcontracted Items")
+						raise Exception
+					self.add_bom(d)
 
-      self.delete_irrelevant_raw_material()
-      #---------------calculate amt in  PR Raw Material Detail-------------
-      self.calculate_amount(d)
+			self.delete_irrelevant_raw_material()
+			#---------------calculate amt in	PR Raw Material Detail-------------
+			self.calculate_amount(d)
 
 
-  def add_bom(self, d):
-    #----- fetching default bom from Bill of Materials instead of Item Master --
-    bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.description from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1 and t2.docstatus =1" % d.item_code)
-    if not bom_det:
-      msgprint("No default BOM exists for item: %s" % d.item_code)
-      raise Exception
-    else:
-      #-------------- add child function--------------------
-      chgd_rqd_qty = []
-      for i in bom_det:
+	def add_bom(self, d):
+		#----- fetching default bom from Bill of Materials instead of Item Master --
+		bom_det = sql("select t1.item, t2.item_code, t2.qty_consumed_per_unit, t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.description from `tabBill Of Materials` t1, `tabBOM Material` t2 where t2.parent = t1.name and t1.item = '%s' and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1 and t2.docstatus =1" % d.item_code)
+		if not bom_det:
+			msgprint("No default BOM exists for item: %s" % d.item_code)
+			raise Exception
+		else:
+			#-------------- add child function--------------------
+			chgd_rqd_qty = []
+			for i in bom_det:
 
-        if i and not sql("select name from `tabPR Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
+				if i and not sql("select name from `tabPR Raw Material Detail` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
 
-          rm_child = addchild(self.doc, 'pr_raw_material_details', 'PR Raw Material Detail', 1, self.doclist)
+					rm_child = addchild(self.doc, 'pr_raw_material_details', 'PR Raw Material Detail', 1, self.doclist)
 
-          rm_child.reference_name = d.name
-          rm_child.bom_detail_no = i and i[6] or ''
-          rm_child.main_item_code = i and i[0] or ''
-          rm_child.rm_item_code = i and i[1] or ''
-          rm_child.description = i and i[7] or ''
-          rm_child.stock_uom = i and i[5] or ''
-          rm_child.rate = i and flt(i[3]) or flt(i[4])
-          rm_child.conversion_factor = d.conversion_factor
-          rm_child.required_qty = flt(i  and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
-          rm_child.consumed_qty = flt(i  and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
-          rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate))
-          rm_child.save()
-          chgd_rqd_qty.append(cstr(i[1]))
-        else:
-          act_qty = flt(i  and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
-          for pr_rmd in getlist(self.doclist, 'pr_raw_material_details'):
-            if i and i[6] == pr_rmd.bom_detail_no and (flt(act_qty) != flt(pr_rmd.required_qty) or i[1] != pr_rmd.rm_item_code or i[7] != pr_rmd.description):
-              chgd_rqd_qty.append(cstr(i[1]))
-              pr_rmd.main_item_code = i[0]
-              pr_rmd.rm_item_code = i[1]
-              pr_rmd.description = i[7]
-              pr_rmd.stock_uom = i[5]
-              pr_rmd.required_qty = flt(act_qty)
-              pr_rmd.consumed_qty = flt(act_qty)
-              pr_rmd.rate = i and flt(i[3]) or flt(i[4])
-              pr_rmd.amount = flt(flt(pr_rmd.consumed_qty)*flt(pr_rmd.rate))
-              pr_rmd.save()
-      if chgd_rqd_qty:
-        msgprint("Please check consumed quantity for Raw Material Item Code: '%s'in Raw materials Detail Table" % ((len(chgd_rqd_qty) > 1 and ','.join(chgd_rqd_qty[:-1]) +' and ' + cstr(chgd_rqd_qty[-1:][0]) ) or cstr(chgd_rqd_qty[0])))
+					rm_child.reference_name = d.name
+					rm_child.bom_detail_no = i and i[6] or ''
+					rm_child.main_item_code = i and i[0] or ''
+					rm_child.rm_item_code = i and i[1] or ''
+					rm_child.description = i and i[7] or ''
+					rm_child.stock_uom = i and i[5] or ''
+					rm_child.rate = i and flt(i[3]) or flt(i[4])
+					rm_child.conversion_factor = d.conversion_factor
+					rm_child.required_qty = flt(i	and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
+					rm_child.consumed_qty = flt(i	and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
+					rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate))
+					rm_child.save()
+					chgd_rqd_qty.append(cstr(i[1]))
+				else:
+					act_qty = flt(i	and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
+					for pr_rmd in getlist(self.doclist, 'pr_raw_material_details'):
+						if i and i[6] == pr_rmd.bom_detail_no and (flt(act_qty) != flt(pr_rmd.required_qty) or i[1] != pr_rmd.rm_item_code or i[7] != pr_rmd.description):
+							chgd_rqd_qty.append(cstr(i[1]))
+							pr_rmd.main_item_code = i[0]
+							pr_rmd.rm_item_code = i[1]
+							pr_rmd.description = i[7]
+							pr_rmd.stock_uom = i[5]
+							pr_rmd.required_qty = flt(act_qty)
+							pr_rmd.consumed_qty = flt(act_qty)
+							pr_rmd.rate = i and flt(i[3]) or flt(i[4])
+							pr_rmd.amount = flt(flt(pr_rmd.consumed_qty)*flt(pr_rmd.rate))
+							pr_rmd.save()
+			if chgd_rqd_qty:
+				msgprint("Please check consumed quantity for Raw Material Item Code: '%s'in Raw materials Detail Table" % ((len(chgd_rqd_qty) > 1 and ','.join(chgd_rqd_qty[:-1]) +' and ' + cstr(chgd_rqd_qty[-1:][0]) ) or cstr(chgd_rqd_qty[0])))
 
 
-  # Delete irrelevant raw material from PR Raw material details
-  #--------------------------------------------------------------
-  def delete_irrelevant_raw_material(self):
-    for d in getlist(self.doclist,'pr_raw_material_details'):
-      if not sql("select name from `tabPurchase Receipt Detail` where name = '%s' and parent = '%s' and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)):
-        d.parent = 'old_par:'+self.doc.name
-        d.save()
+	# Delete irrelevant raw material from PR Raw material details
+	#--------------------------------------------------------------
+	def delete_irrelevant_raw_material(self):
+		for d in getlist(self.doclist,'pr_raw_material_details'):
+			if not sql("select name from `tabPurchase Receipt Detail` where name = '%s' and parent = '%s' and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)):
+				d.parent = 'old_par:'+self.doc.name
+				d.save()
 
-  def calculate_amount(self, d):
-    amt = 0
-    for i in getlist(self.doclist,'pr_raw_material_details'):
+	def calculate_amount(self, d):
+		amt = 0
+		for i in getlist(self.doclist,'pr_raw_material_details'):
 
-      if(i.reference_name == d.name):
-        #if i.consumed_qty == 0:
-         # msgprint("consumed qty cannot be 0. Please Enter consumed qty ")
-          #raise Exception
-        i.amount = flt(i.consumed_qty)* flt(i.rate)
-        amt += i.amount
-    d.rm_supp_cost = amt
-    d.save()
+			if(i.reference_name == d.name):
+				#if i.consumed_qty == 0:
+				 # msgprint("consumed qty cannot be 0. Please Enter consumed qty ")
+					#raise Exception
+				i.amount = flt(i.consumed_qty)* flt(i.rate)
+				amt += i.amount
+		d.rm_supp_cost = amt
+		d.save()
 
 
-  # --------------- Back Flush function called on submit and on cancel from update stock
-  def bk_flush_supp_wh(self, is_submit):
-    for d in getlist(self.doclist, 'pr_raw_material_details'):
-      #--------- -ve quantity is passed as raw material qty has to be decreased when PR is submitted and it has to be increased when PR is cancelled
-      consumed_qty = - flt(d.consumed_qty)
-      self.make_sl_entry(d, self.doc.supplier_warehouse, flt(consumed_qty), 0, is_submit)
+	# --------------- Back Flush function called on submit and on cancel from update stock
+	def bk_flush_supp_wh(self, is_submit):
+		for d in getlist(self.doclist, 'pr_raw_material_details'):
+			#--------- -ve quantity is passed as raw material qty has to be decreased when PR is submitted and it has to be increased when PR is cancelled
+			consumed_qty = - flt(d.consumed_qty)
+			self.make_sl_entry(d, self.doc.supplier_warehouse, flt(consumed_qty), 0, is_submit)
 
 
-  # get current_stock
-  # ----------------
-  def get_current_stock(self):
-    for d in getlist(self.doclist, 'pr_raw_material_details'):
-      if self.doc.supplier_warehouse:
-        bin = sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.doc.supplier_warehouse), as_dict = 1)
-        d.current_stock = bin and flt(bin[0]['actual_qty']) or 0
+	# get current_stock
+	# ----------------
+	def get_current_stock(self):
+		for d in getlist(self.doclist, 'pr_raw_material_details'):
+			if self.doc.supplier_warehouse:
+				bin = sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.rm_item_code, self.doc.supplier_warehouse), as_dict = 1)
+				d.current_stock = bin and flt(bin[0]['actual_qty']) or 0
 
 
 
@@ -427,15 +442,15 @@
 # OTHER CHARGES TRIGGER FUNCTIONS
 # ====================================================================================
 
-  # *********** Get Tax rate if account type is TAX ********************
-  def get_rate(self,arg):
-    return get_obj('Purchase Common').get_rate(arg,self)
+	# *********** Get Tax rate if account type is TAX ********************
+	def get_rate(self,arg):
+		return get_obj('Purchase Common').get_rate(arg,self)
 
-  # **** Pull details from other charges master (Get Other Charges) ****
-  def get_purchase_tax_details(self):
-    return get_obj('Purchase Common').get_purchase_tax_details(self)
+	# **** Pull details from other charges master (Get Other Charges) ****
+	def get_purchase_tax_details(self):
+		return get_obj('Purchase Common').get_purchase_tax_details(self)
 
-  # Repair Purchase Order
-  # ===========================================
-  def repair_purchase_receipt(self):
-    get_obj('Purchase Common').repair_curr_doctype_details(self)
+	# Repair Purchase Order
+	# ===========================================
+	def repair_purchase_receipt(self):
+		get_obj('Purchase Common').repair_curr_doctype_details(self)
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 7b9d294..ace16fb 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -25,8 +25,9 @@
 		from webnotes.utils import file_manager
 		fn, content = file_manager.get_file(filename[1])
 		
-		if not type(content) == str:
-			content = content.tostring()
+		# NOTE: Don't know why this condition exists
+		if not isinstance(content, basestring) and hasattr(content, 'tostring'):
+		  content = content.tostring()
 
 		return content
 
diff --git a/erpnext/support/doctype/support_ticket/__init__.py b/erpnext/support/doctype/support_ticket/__init__.py
index 3b05bda..1b09fc9 100644
--- a/erpnext/support/doctype/support_ticket/__init__.py
+++ b/erpnext/support/doctype/support_ticket/__init__.py
@@ -1,4 +1,5 @@
 import webnotes
+from webnotes.utils import cstr
 
 from webnotes.utils.email_lib.receive import POP3Mailbox
 
@@ -111,7 +112,7 @@
 			status = add_file_list('Support Ticket', doc.name, attachment['filename'], fid)
 			if not status:
 				doc.description = doc.description \
-					+ "\nCould not attach: " + str(attachment['filename'])
+					+ "\nCould not attach: " + cstr(attachment['filename'])
 				doc.save()
 			webnotes.conn.commit()
 
@@ -137,7 +138,7 @@
 		sendmail(\
 			recipients = [d.raised_by], \
 			sender = self.email_settings.support_email, \
-			subject = '['+d.name+'] ' + str(d.subject or ''), \
+			subject = '['+d.name+'] ' + cstr(d.subject), \
 			msg = response)
 		
 	def auto_close_tickets(self):
diff --git a/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py b/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py
index 62d4d83..bb9d9e6 100644
--- a/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py
+++ b/erpnext/utilities/doctype/bulk_rename_tool/bulk_rename_tool.py
@@ -76,7 +76,8 @@
 		from webnotes.utils import file_manager
 		fn, content = file_manager.get_file(fid)
 		
-		if not type(content) == str:
+		# NOTE: Don't know why this condition exists
+		if not isinstance(content, basestring) and hasattr(content, 'tostring'):
 		  content = content.tostring()
 
 		return content
diff --git a/index.html b/index.html
index 2793bd7..150a2cf 100644
--- a/index.html
+++ b/index.html
@@ -3,7 +3,7 @@
 	<meta charset="utf-8">
 	<title>ERPNext</title>
 	<meta name="author" content="">
-	<script type="text/javascript">window._version_number="140"
+	<script type="text/javascript">window._version_number="146"
 
 wn={}
 wn.provide=function(namespace){var nsl=namespace.split('.');var l=nsl.length;var parent=window;for(var i=0;i<l;i++){var n=nsl[i];if(!parent[n]){parent[n]={}}
diff --git a/version.num b/version.num
index acfba60..bc768da 100644
--- a/version.num
+++ b/version.num
@@ -1 +1 @@
-141
\ No newline at end of file
+146
\ No newline at end of file
