Merge branch 'develop' of github.com:trhura/erpnext
diff --git a/accounts/doctype/sales_invoice/pos.js b/accounts/doctype/sales_invoice/pos.js
index b71b45e..a594f7f 100644
--- a/accounts/doctype/sales_invoice/pos.js
+++ b/accounts/doctype/sales_invoice/pos.js
@@ -109,6 +109,7 @@
 		this.party = party;
 		this.price_list = (party == "Customer" ? 
 			this.frm.doc.selling_price_list : this.frm.doc.buying_price_list);
+		this.price_list_field = (party == "Customer" ? "selling_price_list" : "buying_price_list");
 		this.sales_or_purchase = (party == "Customer" ? "Sales" : "Purchase");
 		this.net_total = "net_total_" + export_or_import;
 		this.grand_total = "grand_total_" + export_or_import;
@@ -269,22 +270,17 @@
 				this.frm.cscript.fname,	this.frm.doctype), function(i, d) {
 				if (d.item_code == item_code) {
 					caught = true;
-					if (serial_no) {
-						d.serial_no += '\n' + serial_no;
-						me.frm.script_manager.trigger("serial_no", d.doctype, d.name);
-					}
-					else {
-						d.qty += 1;
-						me.frm.script_manager.trigger("qty", d.doctype, d.name);
-					}
+					if (serial_no)
+						wn.model.set_value(d.doctype, d.name, "serial_no", d.serial_no + '\n' + serial_no);
+					else
+						wn.model.set_value(d.doctype, d.name, "qty", d.qty + 1);
 				}
 			});
 		}
 		
 		// if item not found then add new item
-		if (!caught) {
+		if (!caught)
 			this.add_new_item_to_grid(item_code, serial_no);
-		}
 
 		this.refresh();
 		this.refresh_search_box();
@@ -319,15 +315,16 @@
 					wn.model.clear_doc(d.doctype, d.name);
 					me.refresh_grid();
 				} else {
-					d.qty = qty;
-					me.frm.script_manager.trigger("qty", d.doctype, d.name);
+					wn.model.set_value(d.doctype, d.name, "qty", qty);
 				}
 			}
 		});
-		me.refresh();
+		this.refresh();
 	},
 	refresh: function() {
 		var me = this;
+
+		this.refresh_item_list();
 		this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]);
 		this.barcode.set_input("");
 
@@ -350,6 +347,14 @@
 				this.make_party();
 		}
 	},
+	refresh_item_list: function() {
+		var me = this;
+		// refresh item list on change of price list
+		if (this.frm.doc[this.price_list_field] != this.price_list) {
+			this.price_list = this.frm.doc[this.price_list_field];
+			this.make_item_list();
+		}
+	},
 	show_items_in_item_cart: function() {
 		var me = this;
 		var $items = this.wrapper.find("#cart tbody").empty();
@@ -383,9 +388,8 @@
 			)).appendTo($items);
 		});
 
-		this.wrapper.find(".increase-qty, .decrease-qty").on("click", function() {
-			var item_code = $(this).closest("tr").attr("id");
-			me.selected_item_qty_operation(item_code, $(this).attr("class"));
+		this.wrapper.find("input.qty").on("focus", function() {
+			$(this).select();
 		});
 	},
 	show_taxes: function() {
@@ -422,10 +426,16 @@
 
 		// append quantity to the respective item after change from input box
 		$(this.wrapper).find("input.qty").on("change", function() {
-			var item_code = $(this).closest("tr")[0].id;
+			var item_code = $(this).closest("tr").attr("id");
 			me.update_qty(item_code, $(this).val());
 		});
 
+		// increase/decrease qty on plus/minus button
+		$(this.wrapper).find(".increase-qty, .decrease-qty").on("click", function() {
+			var tr = $(this).closest("tr");
+			me.increase_decrease_qty(tr, $(this).attr("class"));
+		});
+
 		// on td click toggle the highlighting of row
 		$(this.wrapper).find("#cart tbody tr td").on("click", function() {
 			var row = $(this).closest("tr");
@@ -443,6 +453,15 @@
 		me.refresh_delete_btn();
 		this.barcode.$input.focus();
 	},
+	increase_decrease_qty: function(tr, operation) {
+		var item_code = tr.attr("id");
+		var item_qty = cint(tr.find("input.qty").val());
+
+		if (operation == "increase-qty")
+			this.update_qty(item_code, item_qty + 1);
+		else if (operation == "decrease-qty" && item_qty != 1)
+			this.update_qty(item_code, item_qty - 1);
+	},
 	disable_text_box_and_button: function() {
 		var me = this;
 		// if form is submitted & cancelled then disable all input box & buttons
@@ -514,27 +533,11 @@
 		this.refresh_grid();
 	},
 	refresh_grid: function() {
+		this.frm.dirty();
 		this.frm.fields_dict[this.frm.cscript.fname].grid.refresh();
 		this.frm.script_manager.trigger("calculate_taxes_and_totals");
 		this.refresh();
 	},
-	selected_item_qty_operation: function(item_code, operation) {
-		var me = this;
-		var child = wn.model.get_children(this.frm.doctype + " Item", this.frm.doc.name, 
-			this.frm.cscript.fname, this.frm.doctype);
-
-		$.each(child, function(i, d) {
-			if (d.item_code == item_code) {
-				if (operation == "increase-qty")
-					d.qty += 1;
-				else if (operation == "decrease-qty")
-					d.qty != 1 ? d.qty -= 1 : d.qty = 1;
-
-				me.frm.script_manager.trigger("qty", d.doctype, d.name);
-				me.refresh();
-			}
-		});
-	},
 	make_payment: function() {
 		var me = this;
 		var no_of_items = $(this.wrapper).find("#cart tbody tr").length;
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index a39702b..1768b9b 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -320,12 +320,9 @@
 			item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life >	now())"% d.item_code)
 			acc =	webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account)
 			if not acc:
-				msgprint("Account: "+d.income_account+" does not exist in the system")
-				raise Exception
+				msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
 			elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset Account':
-				msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code)
-				raise Exception
-				
+				msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code, raise_exception=True)				
 		
 	def validate_with_previous_doc(self):
 		super(DocType, self).validate_with_previous_doc(self.tname, {
diff --git a/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt b/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt
index 49c7478..4d3558c 100644
--- a/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt
+++ b/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-13 16:10:02", 
   "docstatus": 0, 
-  "modified": "2013-05-13 16:21:07", 
+  "modified": "2014-01-24 18:19:11", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -11,7 +11,7 @@
   "doctype": "Report", 
   "is_standard": "Yes", 
   "name": "__common__", 
-  "query": "select \n    mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tmr_item.qty as \"Qty:Float:100\",\n\tmr_item.ordered_qty as \"Ordered Qty:Float:100\", \n\t(mr_item.qty - ifnull(mr_item.ordered_qty, 0)) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\n\tand ifnull(mr_item.ordered_qty, 0) < ifnull(mr_item.qty, 0)\norder by mr.transaction_date asc", 
+  "query": "select \n    mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tsum(ifnull(mr_item.qty, 0)) as \"Qty:Float:100\",\n\tsum(ifnull(mr_item.ordered_qty, 0)) as \"Ordered Qty:Float:100\", \n\t(sum(mr_item.qty) - sum(ifnull(mr_item.ordered_qty, 0))) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\ngroup by mr.name, mr_item.item_code\nhaving\n\tsum(ifnull(mr_item.ordered_qty, 0)) < sum(ifnull(mr_item.qty, 0))\norder by mr.transaction_date asc", 
   "ref_doctype": "Purchase Order", 
   "report_name": "Requested Items To Be Ordered", 
   "report_type": "Query Report"
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 29232f5..90d9dc5 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -243,10 +243,10 @@
 				"item_code": [qty_required, description, stock_uom, min_order_qty]
 			}
 		"""
-		bom_wise_item_details = {}
 		item_list = []
 
 		for bom, so_wise_qty in bom_dict.items():
+			bom_wise_item_details = {}
 			if self.doc.use_multi_level_bom:
 				# get all raw materials with sub assembly childs					
 				for d in webnotes.conn.sql("""select fb.item_code, 
diff --git a/portal/templates/sale.html b/portal/templates/sale.html
index 5dc72c7..c0996cc 100644
--- a/portal/templates/sale.html
+++ b/portal/templates/sale.html
@@ -10,9 +10,9 @@
     	<li class="active"><i class="icon-file icon-fixed-width"></i> {{ doc.name }}</li>
     </ul>
 	<h3><i class="icon-file icon-fixed-width"></i> {{ doc.name }}</h3>
-	{% if doc.name == "Not Allowed" -%}
+	{% if session_user == "Guest" -%}
 		<script>ask_to_login();</script>
-	{% else %}
+	{% elif doc.name != "Not Allowed"%}
 	<hr>
 	<div>
 	<div class="row">
diff --git a/portal/utils.py b/portal/utils.py
index 89800f3..e210f1a 100644
--- a/portal/utils.py
+++ b/portal/utils.py
@@ -41,21 +41,23 @@
 	}
 
 def get_transaction_context(doctype, name):
+	context = {"session_user": webnotes.session.user}
+	
 	customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user}, 
 		"customer")
 		
 	bean = webnotes.bean(doctype, name)
 	if bean.doc.customer != customer:
-		return {
-			"doc": {"name": "Not Allowed"}
-		}
+		context.update({"doc": {"name": "Not Allowed"}})
 	else:
-		return {
+		context.update({
 			"doc": bean.doc,
 			"doclist": bean.doclist,
 			"webnotes": webnotes,
 			"utils": webnotes.utils
-		}
+		})
+	
+	return context
 
 @webnotes.whitelist(allow_guest=True)
 def send_message(subject="Website Query", message="", sender="", status="Open"):
diff --git a/selling/doctype/sales_order/templates/pages/order.py b/selling/doctype/sales_order/templates/pages/order.py
index d53a8b0..9b4a83c 100644
--- a/selling/doctype/sales_order/templates/pages/order.py
+++ b/selling/doctype/sales_order/templates/pages/order.py
@@ -10,11 +10,12 @@
 def get_context():
 	from portal.utils import get_transaction_context
 	context = get_transaction_context("Sales Order", webnotes.form_dict.name)
-	modify_status(context.get("doc"))
-	context.update({
-		"parent_link": "orders",
-		"parent_title": "My Orders"
-	})
+	if context.get("doc").get("name") != "Not Allowed":
+		modify_status(context.get("doc"))
+		context.update({
+			"parent_link": "orders",
+			"parent_title": "My Orders"
+		})
 	return context
 	
 def modify_status(doc):
diff --git a/selling/utils/cart.py b/selling/utils/cart.py
index 3cd7b3c..7904627 100644
--- a/selling/utils/cart.py
+++ b/selling/utils/cart.py
@@ -282,7 +282,7 @@
 		party = get_lead_or_customer()
 	if not quotation:
 		quotation = _get_cart_quotation(party)
-	
+
 	cart_settings = webnotes.get_obj("Shopping Cart Settings")
 	
 	billing_territory = get_address_territory(quotation.doc.customer_address) or \
@@ -310,7 +310,8 @@
 	quotation.run_method("set_price_list_and_item_details")
 	
 	# set it in cookies for using in product page
-	webnotes.local._response.set_cookie("selling_price_list", quotation.doc.selling_price_list)
+	if quotation.doc.selling_price_list:
+		webnotes.local._response.set_cookie("selling_price_list", quotation.doc.selling_price_list)
 	
 def set_taxes(quotation, cart_settings, billing_territory):
 	"""set taxes based on billing territory"""
diff --git a/stock/doctype/item/test_item.py b/stock/doctype/item/test_item.py
index b8f6f9e..4754174 100644
--- a/stock/doctype/item/test_item.py
+++ b/stock/doctype/item/test_item.py
@@ -36,6 +36,7 @@
 		"stock_uom": "_Test UOM",
 		"default_income_account": "Sales - _TC",
 		"default_warehouse": "_Test Warehouse - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC"
 	}, {
 		"doctype": "Item Reorder",
 		"parentfield": "item_reorder",
@@ -64,6 +65,7 @@
 		"stock_uom": "_Test UOM",
 		"default_income_account": "Sales - _TC",
 		"default_warehouse": "_Test Warehouse - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC"
 	}],	
 	[{
 		"doctype": "Item",
@@ -73,6 +75,7 @@
 		"item_group": "_Test Item Group Desktops",
 		"default_warehouse": "_Test Warehouse - _TC",
 		"default_income_account": "Sales - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC",
 		"is_stock_item": "Yes",
 		"is_asset_item": "No",
 		"has_batch_no": "No",
@@ -99,6 +102,7 @@
 		"item_group": "_Test Item Group Desktops",
 		"default_warehouse": "_Test Warehouse - _TC",
 		"default_income_account": "Sales - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC",
 		"is_stock_item": "Yes",
 		"is_asset_item": "No",
 		"has_batch_no": "No",
@@ -119,6 +123,7 @@
 		"description": "_Test Sales BOM Item",
 		"item_group": "_Test Item Group Desktops",
 		"default_income_account": "Sales - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC",
 		"is_stock_item": "No",
 		"is_asset_item": "No",
 		"has_batch_no": "No",
@@ -140,6 +145,7 @@
 		"is_stock_item": "Yes",
 		"default_warehouse": "_Test Warehouse - _TC",
 		"default_income_account": "Sales - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC",
 		"is_asset_item": "No",
 		"has_batch_no": "No",
 		"has_serial_no": "No",
@@ -216,6 +222,7 @@
 		"item_group": "_Test Item Group Desktops",
 		"default_warehouse": "_Test Warehouse - _TC",
 		"default_income_account": "Sales - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC",
 		"is_stock_item": "Yes",
 		"is_asset_item": "No",
 		"has_batch_no": "No",
@@ -238,6 +245,7 @@
 		"is_stock_item": "Yes",
 		"default_warehouse": "_Test Warehouse - _TC",
 		"default_income_account": "Sales - _TC",
+		"purchase_account": "_Test Account Cost for Goods Sold - _TC",
 		"is_asset_item": "No",
 		"has_batch_no": "No",
 		"has_serial_no": "No",
diff --git a/utilities/demo/demo_docs/Fiscal_Year.csv b/utilities/demo/demo_docs/Fiscal_Year.csv
index d56b1b9..1a06e87 100644
--- a/utilities/demo/demo_docs/Fiscal_Year.csv
+++ b/utilities/demo/demo_docs/Fiscal_Year.csv
@@ -20,4 +20,5 @@
 Start entering data below this line,,,,

 ,,2009,01-01-2009,31-12-2009,No

 ,,2010,01-01-2010,31-12-2010,No

-,,2011,01-01-2011,31-12-2011,No
\ No newline at end of file
+,,2011,01-01-2011,31-12-2011,No

+,,2012,01-01-2012,31-12-2012,No
\ No newline at end of file
diff --git a/utilities/demo/make_demo.py b/utilities/demo/make_demo.py
index b98fd7a..99c3e8b 100644
--- a/utilities/demo/make_demo.py
+++ b/utilities/demo/make_demo.py
@@ -19,7 +19,7 @@
 country = "United States"
 currency = "USD"
 time_zone = "America/New_York"
-start_date = '2013-01-01'
+start_date = '2014-01-01'
 bank_name = "Citibank"
 runs_for = None
 prob = {
@@ -105,6 +105,10 @@
 		for so in list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="Total"]))[:how_many("Sales Invoice")]:
 			si = webnotes.bean(make_sales_invoice(so))
 			si.doc.posting_date = current_date
+			for d in si.doclist.get({"parentfield": "entries"}):
+				if not d.income_account:
+					d.income_account = "Sales - {}".format(company_abbr)
+			
 			si.insert()
 			si.submit()
 			webnotes.conn.commit()
@@ -170,6 +174,9 @@
 			dn = webnotes.bean(make_delivery_note(so))
 			dn.doc.posting_date = current_date
 			dn.doc.fiscal_year = current_date.year
+			for d in dn.doclist.get({"parentfield": "delivery_note_details"}):
+				d.expense_account = "Cost of Goods Sold - {}".format(company_abbr)
+				
 			dn.insert()
 			try:
 				dn.submit()
@@ -236,7 +243,7 @@
 	ppt = webnotes.bean("Production Planning Tool", "Production Planning Tool")
 	ppt.doc.company = company
 	ppt.doc.use_multi_level_bom = 1
-	ppt.doc.purchase_request_for_warehouse = "Stores - WP"
+	ppt.doc.purchase_request_for_warehouse = "Stores - {}".format(company_abbr)
 	ppt.run_method("get_open_sales_orders")
 	ppt.run_method("get_items_from_so")
 	ppt.run_method("raise_production_order")
@@ -380,8 +387,8 @@
 	setup_account({
 		"first_name": "Test",
 		"last_name": "User",
-		"fy_start_date": "2013-01-01",
-		"fy_end_date": "2013-12-31",
+		"fy_start_date": "2014-01-01",
+		"fy_end_date": "2014-12-31",
 		"industry": "Manufacturing",
 		"company_name": company,
 		"company_abbr": company_abbr,