Merge branch 'responsive' of github.com:webnotes/erpnext into responsive
diff --git a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
index 6d7f2db..a2c3321 100644
--- a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
+++ b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
@@ -8,19 +8,20 @@
 // 
 // This program is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 // GNU General Public License for more details.
 // 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
 
 //--------- ONLOAD -------------
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
-  // 
+	if(doc.doctype === "Sales Taxes and Charges Master")
+		erpnext.add_for_territory();
 }
 
 cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-   cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
+	 cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
 }
 
 // For customizing print
@@ -41,7 +42,7 @@
 }
 
 cur_frm.pformat.other_charges= function(doc){
-  //function to make row of table
+	//function to make row of table
 	var make_row = function(title,val,bold){
 		var bstart = '<b>'; var bend = '</b>';
 		return '<tr><td style="width:50%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
@@ -63,7 +64,7 @@
 	if (!doc.print_without_amount) {
 		var cl = getchildren('Sales Taxes and Charges',doc.name,'other_charges');
 
-		// outer table  
+		// outer table	
 		var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 60%"></td><td>';
 
 		// main table
@@ -77,7 +78,7 @@
 		if(cl.length){
 			for(var i=0;i<cl.length;i++){
 				if(convert_rate(cl[i].tax_amount)!=0 && !cl[i].included_in_print_rate)
-				  out += make_row(cl[i].description,convert_rate(cl[i].tax_amount),0);
+					out += make_row(cl[i].description,convert_rate(cl[i].tax_amount),0);
 			}
 		}
 
@@ -96,98 +97,98 @@
 			out += '<table><tr><td style="width:25%;"><b>In Words</b></td>'
 			out+= '<td style="width:50%;">'+doc.in_words_export+'</td></tr>'
 		}
-		out +='</table></td></tr></table></div>';   
+		out +='</table></td></tr></table></div>';	 
 	}
 	return out;
 }
 
 cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
-    alert("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row");
-    d.charge_type = '';
-  }
-  validated = false;
-  refresh_field('charge_type',d.name,'other_charges');
-  cur_frm.cscript.row_id(doc, cdt, cdn);
-  cur_frm.cscript.rate(doc, cdt, cdn);
-  cur_frm.cscript.tax_amount(doc, cdt, cdn);
+	var d = locals[cdt][cdn];
+	if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
+		alert("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row");
+		d.charge_type = '';
+	}
+	validated = false;
+	refresh_field('charge_type',d.name,'other_charges');
+	cur_frm.cscript.row_id(doc, cdt, cdn);
+	cur_frm.cscript.rate(doc, cdt, cdn);
+	cur_frm.cscript.tax_amount(doc, cdt, cdn);
 }
 
 cur_frm.cscript.row_id = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(!d.charge_type && d.row_id){
-    alert("Please select Charge Type first");
-    d.row_id = '';
-  }
-  else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
-    alert("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'");
-    d.row_id = '';
-  }
-  else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id){
-    if(d.row_id >= d.idx){
-      alert("You cannot Enter Row no. greater than or equal to current row no. for this Charge type");
-      d.row_id = '';
-    }
-  }
-  validated = false;
-  refresh_field('row_id',d.name,'other_charges');
+	var d = locals[cdt][cdn];
+	if(!d.charge_type && d.row_id){
+		alert("Please select Charge Type first");
+		d.row_id = '';
+	}
+	else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
+		alert("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'");
+		d.row_id = '';
+	}
+	else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id){
+		if(d.row_id >= d.idx){
+			alert("You cannot Enter Row no. greater than or equal to current row no. for this Charge type");
+			d.row_id = '';
+		}
+	}
+	validated = false;
+	refresh_field('row_id',d.name,'other_charges');
 }
 
 /*---------------------- Get rate if account_head has account_type as TAX or CHARGEABLE-------------------------------------*/
 
 cur_frm.fields_dict['other_charges'].grid.get_field("account_head").get_query = function(doc,cdt,cdn) {
-  return{
-    filters:[
-      ['Account', 'group_or_ledger', '=', 'Ledger'],
-      ['Account', 'account_type', 'in', 'Tax, Chargeable, Income Account'],
-      ['Account', 'company', '=', doc.company]
-    ]
-  }  
+	return{
+		filters:[
+			['Account', 'group_or_ledger', '=', 'Ledger'],
+			['Account', 'account_type', 'in', 'Tax, Chargeable, Income Account'],
+			['Account', 'company', '=', doc.company]
+		]
+	}	
 }
 
 cur_frm.fields_dict['other_charges'].grid.get_field("cost_center").get_query = function(doc) {
-  return{
-    'company': doc.company,
-    'group_or_ledger': "Ledger"
-  }	
+	return{
+		'company': doc.company,
+		'group_or_ledger': "Ledger"
+	}	
 }
 
 
 cur_frm.cscript.account_head = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(!d.charge_type && d.account_head){
-    alert("Please select Charge Type first");
-    validated = false;
-    d.account_head = '';
-  }
-  else if(d.account_head && d.charge_type) {
-    arg = "{'charge_type' : '" + d.charge_type +"', 'account_head' : '" + d.account_head + "'}";
-    get_server_fields('get_rate', arg, 'other_charges', doc, cdt, cdn, 1);
-  }
-  refresh_field('account_head',d.name,'other_charges');
+	var d = locals[cdt][cdn];
+	if(!d.charge_type && d.account_head){
+		alert("Please select Charge Type first");
+		validated = false;
+		d.account_head = '';
+	}
+	else if(d.account_head && d.charge_type) {
+		arg = "{'charge_type' : '" + d.charge_type +"', 'account_head' : '" + d.account_head + "'}";
+		get_server_fields('get_rate', arg, 'other_charges', doc, cdt, cdn, 1);
+	}
+	refresh_field('account_head',d.name,'other_charges');
 }
 
 cur_frm.cscript.rate = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(!d.charge_type && d.rate) {
-    alert("Please select Charge Type first");
-    d.rate = '';
-  }
-  validated = false;
-  refresh_field('rate',d.name,'other_charges');
+	var d = locals[cdt][cdn];
+	if(!d.charge_type && d.rate) {
+		alert("Please select Charge Type first");
+		d.rate = '';
+	}
+	validated = false;
+	refresh_field('rate',d.name,'other_charges');
 }
 
 cur_frm.cscript.tax_amount = function(doc, cdt, cdn) {
-  var d = locals[cdt][cdn];
-  if(!d.charge_type && d.tax_amount){
-    alert("Please select Charge Type first");
-    d.tax_amount = '';
-  }
-  else if(d.charge_type && d.tax_amount) {
-    alert("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate");
-    d.tax_amount = '';
-  }
-  validated = false;
-  refresh_field('tax_amount',d.name,'other_charges');
+	var d = locals[cdt][cdn];
+	if(!d.charge_type && d.tax_amount){
+		alert("Please select Charge Type first");
+		d.tax_amount = '';
+	}
+	else if(d.charge_type && d.tax_amount) {
+		alert("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate");
+		d.tax_amount = '';
+	}
+	validated = false;
+	refresh_field('tax_amount',d.name,'other_charges');
 };
\ No newline at end of file
diff --git a/accounts/doctype/shipping_rule/shipping_rule.js b/accounts/doctype/shipping_rule/shipping_rule.js
new file mode 100644
index 0000000..8e8580b
--- /dev/null
+++ b/accounts/doctype/shipping_rule/shipping_rule.js
@@ -0,0 +1,5 @@
+$.extend(cur_frm.cscript, {
+	onload: function() {
+		erpnext.add_for_territory();
+	}
+});
\ No newline at end of file
diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py
index 70151a6..7bcc92e 100644
--- a/controllers/accounts_controller.py
+++ b/controllers/accounts_controller.py
@@ -30,11 +30,6 @@
 		self.validate_date_with_fiscal_year()
 		
 		if self.meta.get_field("currency"):
-			self.company_currency = get_company_currency(self.doc.company)
-			
-			validate_conversion_rate(self.doc.currency, self.doc.conversion_rate,
-				self.meta.get_label("conversion_rate"), self.doc.company)
-			
 			self.calculate_taxes_and_totals()
 			self.validate_value("grand_total", ">=", 0)
 			self.set_total_in_words()
@@ -66,7 +61,7 @@
 					"price_list_name": self.doc.price_list_name, 
 					"buying_or_selling": buying_or_selling
 				}))
-
+				
 				if self.doc.price_list_currency:
 					if not self.doc.plc_conversion_rate:
 						company_currency = get_company_currency(self.doc.company)
@@ -129,6 +124,14 @@
 				self.doclist.append(tax)
 					
 	def calculate_taxes_and_totals(self):
+		# validate conversion rate
+		if not self.doc.currency:
+			self.doc.currency = get_company_currency(self.doc.company)
+			self.doc.conversion_rate = 1.0
+		else:
+			validate_conversion_rate(self.doc.currency, self.doc.conversion_rate,
+				self.meta.get_label("conversion_rate"), self.doc.company)
+		
 		self.doc.conversion_rate = flt(self.doc.conversion_rate)
 		self.item_doclist = self.doclist.get({"parentfield": self.fname})
 		self.tax_doclist = self.doclist.get({"parentfield": self.other_fname})
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 80e3102..af74a89 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -197,7 +197,6 @@
 	"execute:webnotes.reload_doc('website', 'doctype', 'blog_post') #2013-03-25",
 	"execute:webnotes.reload_doc('website', 'doctype', 'web_page') #2013-03-25",
 	"execute:webnotes.reload_doc('setup', 'doctype', 'sales_partner') #2013-06-25",
-	"execute:webnotes.bean('Style Settings').save() #2013-03-25",
 	"execute:webnotes.conn.set_value('Email Settings', None, 'send_print_in_body_and_attachment', 1)",
 	"patches.march_2013.p09_unset_user_type_partner",
 	"patches.march_2013.p10_set_fiscal_year_for_stock",
@@ -251,4 +250,5 @@
 	"execute:webnotes.delete_doc('Report', 'Received Items To Be Billed')",
 	"patches.july_2013.p02_copy_shipping_address",
 	"patches.july_2013.p03_cost_center_company",
+	"execute:webnotes.bean('Style Settings').save() #2013-07-16",
 ]
\ No newline at end of file
diff --git a/public/js/utils.js b/public/js/utils.js
index b44a875..743c02b 100644
--- a/public/js/utils.js
+++ b/public/js/utils.js
@@ -39,5 +39,14 @@
 				cur_frm.toggle_display("company", false);
 			}
 		}
-	}
+	},
+	
+	add_for_territory: function() {
+		if(cur_frm.doc.__islocal && 
+			wn.model.get_doclist(cur_frm.doc.doctype, cur_frm.doc.name).length === 1) {
+				var territory = wn.model.add_child(cur_frm.doc, "For Territory", 
+					"valid_for_territories");
+				territory.territory = wn.defaults.get_default("territory");
+		}
+	},
 });
\ No newline at end of file
diff --git a/selling/doctype/sales_common/sales_common.js b/selling/doctype/sales_common/sales_common.js
index 919de22..9c11eea 100644
--- a/selling/doctype/sales_common/sales_common.js
+++ b/selling/doctype/sales_common/sales_common.js
@@ -492,6 +492,21 @@
 		}
 	},
 	
+	shipping_rule: function() {
+		var me = this;
+		if(this.frm.doc.shipping_rule) {
+			this.frm.call({
+				doc: this.frm.doc,
+				method: "apply_shipping_rule",
+				callback: function(r) {
+					if(!r.exc) {
+						me.calculate_taxes_and_totals();
+					}
+				}
+			})
+		}
+	},
+	
 	set_dynamic_labels: function() {
 		this._super();
 		set_sales_bom_help(this.frm.doc);
diff --git a/setup/doctype/global_defaults/global_defaults.txt b/setup/doctype/global_defaults/global_defaults.txt
index 6fc07b6..b59ca94 100644
--- a/setup/doctype/global_defaults/global_defaults.txt
+++ b/setup/doctype/global_defaults/global_defaults.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-02 17:53:24", 
   "docstatus": 0, 
-  "modified": "2013-07-05 14:39:17", 
+  "modified": "2013-07-15 15:03:01", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -179,7 +179,6 @@
   "fieldname": "hr", 
   "fieldtype": "Section Break", 
   "label": "HR", 
-  "options": "<div style=\"padding-top: 8px;\" class=\"columnHeading\">HR</div>", 
   "read_only": 0
  }, 
  {
diff --git a/setup/doctype/price_list/price_list.js b/setup/doctype/price_list/price_list.js
index 3bfa63a..26c9854 100644
--- a/setup/doctype/price_list/price_list.js
+++ b/setup/doctype/price_list/price_list.js
@@ -14,43 +14,46 @@
 // You should have received a copy of the GNU General Public License
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-cur_frm.cscript.onload = function() {
-	cur_frm.cscript.show_item_prices();
-}
-
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-	cur_frm.set_intro("");
-	if(doc.__islocal) {
-		cur_frm.toggle_display("item_prices_section", false);
-		cur_frm.set_intro("Save this list to begin.");
-		return;
-	} else {
+$.extend(cur_frm.cscript, {
+	onload: function() {
 		cur_frm.cscript.show_item_prices();
+		erpnext.add_for_territory();
+	},
+	
+	refresh: function(doc) {
+		cur_frm.set_intro("");
+		if(doc.__islocal) {
+			cur_frm.toggle_display("item_prices_section", false);
+			cur_frm.set_intro("Save this list to begin.");
+			return;
+		} else {
+			cur_frm.cscript.show_item_prices();
+		}
+	},
+	
+	show_item_prices: function() {
+		var item_price = wn.model.get("Item Price", {price_list_name: cur_frm.doc.name});
+	
+		var show = item_price && item_price.length;
+	
+		cur_frm.toggle_display("item_prices_section", show);
+		$(cur_frm.fields_dict.item_prices.wrapper).empty();
+		if (!show) return;
+	
+		var out = '<table class="table table-striped table-bordered">\
+			<thead><tr>\
+				<th>' + wn._("Item Code") + '</th>\
+				<th>' + wn._("Price") + '</th>\
+			</tr></thead>\
+			<tbody>'
+			+ $.map(item_price.sort(function(a, b) { return a.parent.localeCompare(b.parent); }), function(d) {
+				return '<tr>'
+					+ '<td><a href="#Form/Item/' + encodeURIComponent(d.parent) +'">' + d.parent + '</a></td>'
+					+ '<td style="text-align: right;">' + format_currency(d.ref_rate, d.ref_currency) + '</td>'
+					+ '</tr>'
+			}).join("\n")
+			+ '</tbody>\
+		</table>';
+		$(out).appendTo($(cur_frm.fields_dict.item_prices.wrapper));
 	}
-}
-
-cur_frm.cscript.show_item_prices = function() {
-	var item_price = wn.model.get("Item Price", {price_list_name: cur_frm.doc.name});
-	
-	var show = item_price && item_price.length;
-	
-	cur_frm.toggle_display("item_prices_section", show);
-	$(cur_frm.fields_dict.item_prices.wrapper).empty();
-	if (!show) return;
-	
-	var out = '<table class="table table-striped table-bordered">\
-		<thead><tr>\
-			<th>' + wn._("Item Code") + '</th>\
-			<th>' + wn._("Price") + '</th>\
-		</tr></thead>\
-		<tbody>'
-		+ $.map(item_price.sort(function(a, b) { return a.parent.localeCompare(b.parent); }), function(d) {
-			return '<tr>'
-				+ '<td><a href="#Form/Item/' + encodeURIComponent(d.parent) +'">' + d.parent + '</a></td>'
-				+ '<td style="text-align: right;">' + format_currency(d.ref_rate, d.ref_currency) + '</td>'
-				+ '</tr>'
-		}).join("\n")
-		+ '</tbody>\
-	</table>';
-	$(out).appendTo($(cur_frm.fields_dict.item_prices.wrapper));
-}
+});
\ No newline at end of file
diff --git a/startup/webutils.py b/startup/webutils.py
index 4c1f528..87d12e4 100644
--- a/startup/webutils.py
+++ b/startup/webutils.py
@@ -82,10 +82,10 @@
 		phone = party.phone
 	else:
 		mobile_no, phone = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user, 
-			"customer": party.name})
+			"customer": party.name}, ["mobile_no", "phone"])
 		
 	return {
-		"company_name": party.customer_name if party.doctype == "Customer" else party.company_name,
-		"mobile_no": mobile_no,
-		"phone": phone
+		"company_name": cstr(party.customer_name if party.doctype == "Customer" else party.company_name),
+		"mobile_no": cstr(mobile_no),
+		"phone": cstr(phone)
 	}
\ No newline at end of file
diff --git a/website/css/website.css b/website/css/website.css
index b71ff13..f2880e8 100644
--- a/website/css/website.css
+++ b/website/css/website.css
@@ -186,3 +186,8 @@
   background-color: #a7a9aa;
   border-color: #a7a9aa;
 }
+
+.breadcrumb {
+	margin: 0 -20px 20px;
+	border-radius: 0px;
+}
\ No newline at end of file
diff --git a/website/doctype/shopping_cart_settings/shopping_cart_settings.js b/website/doctype/shopping_cart_settings/shopping_cart_settings.js
new file mode 100644
index 0000000..74988dc
--- /dev/null
+++ b/website/doctype/shopping_cart_settings/shopping_cart_settings.js
@@ -0,0 +1,7 @@
+$.extend(cur_frm.cscript, {
+	onload: function() {
+		if(cur_frm.doc.__quotation_series) {
+			cur_frm.fields_dict.quotation_series.df.options = cur_frm.doc.__quotation_series;
+		}
+	}
+});
\ No newline at end of file
diff --git a/website/doctype/shopping_cart_settings/shopping_cart_settings.py b/website/doctype/shopping_cart_settings/shopping_cart_settings.py
index 7fe14c3..853eeb4 100644
--- a/website/doctype/shopping_cart_settings/shopping_cart_settings.py
+++ b/website/doctype/shopping_cart_settings/shopping_cart_settings.py
@@ -9,6 +9,9 @@
 class ShoppingCartSetupError(webnotes.ValidationError): pass
 
 class DocType(DocListController):
+	def onload(self):
+		self.doc.fields["__quotation_series"] = webnotes.get_doctype("Quotation").get_options("naming_series")
+	
 	def validate(self):
 		if self.doc.enabled:
 			self.validate_price_lists()
@@ -17,6 +20,7 @@
 			
 	def on_update(self):
 		webnotes.conn.set_default("shopping_cart_enabled", self.doc.fields.get("enabled") or 0)
+		webnotes.conn.set_default("shopping_cart_quotation_series", self.doc.fields.get("quotation_series"))
 			
 	def validate_overlapping_territories(self, parentfield, fieldname):
 		# for displaying message
@@ -91,16 +95,17 @@
 		expected_to_exist = [currency + "-" + company_currency 
 			for currency in price_list_currency_map.values()
 			if currency != company_currency]
-
-		exists = webnotes.conn.sql_list("""select name from `tabCurrency Exchange`
-			where name in (%s)""" % (", ".join(["%s"]*len(expected_to_exist)),),
-			tuple(expected_to_exist))
+			
+		if expected_to_exist:
+			exists = webnotes.conn.sql_list("""select name from `tabCurrency Exchange`
+				where name in (%s)""" % (", ".join(["%s"]*len(expected_to_exist)),),
+				tuple(expected_to_exist))
 		
-		missing = list(set(expected_to_exist).difference(exists))
+			missing = list(set(expected_to_exist).difference(exists))
 		
-		if missing:
-			msgprint(_("Missing Currency Exchange Rates for" + ": " + comma_and(missing)),
-				raise_exception=ShoppingCartSetupError)
+			if missing:
+				msgprint(_("Missing Currency Exchange Rates for" + ": " + comma_and(missing)),
+					raise_exception=ShoppingCartSetupError)
 				
 	def get_name_from_territory(self, territory, parentfield, fieldname):
 		name = None
diff --git a/website/doctype/shopping_cart_settings/shopping_cart_settings.txt b/website/doctype/shopping_cart_settings/shopping_cart_settings.txt
index 7455864..21e6ee3 100644
--- a/website/doctype/shopping_cart_settings/shopping_cart_settings.txt
+++ b/website/doctype/shopping_cart_settings/shopping_cart_settings.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-06-19 15:57:32", 
   "docstatus": 0, 
-  "modified": "2013-07-10 18:42:29", 
+  "modified": "2013-07-15 17:33:05", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -80,6 +80,13 @@
  }, 
  {
   "doctype": "DocField", 
+  "fieldname": "quotation_series", 
+  "fieldtype": "Select", 
+  "label": "Quotation Series", 
+  "reqd": 1
+ }, 
+ {
+  "doctype": "DocField", 
   "fieldname": "section_break_6", 
   "fieldtype": "Section Break"
  }, 
diff --git a/website/helpers/cart.py b/website/helpers/cart.py
index ea72e40..2149534 100644
--- a/website/helpers/cart.py
+++ b/website/helpers/cart.py
@@ -58,6 +58,10 @@
 	qty = flt(qty)
 	if qty == 0:
 		quotation.set_doclist(quotation.doclist.get({"item_code": ["!=", item_code]}))
+		if not quotation.doclist.get({"parentfield": "quotation_details"}) and \
+			not quotation.doc.fields.get("__islocal"):
+				quotation.__delete = True
+			
 	else:
 		quotation_items = quotation.doclist.get({"item_code": item_code})
 		if not quotation_items:
@@ -72,8 +76,12 @@
 	
 	apply_cart_settings(quotation=quotation)
 
-	quotation.ignore_permissions = True
-	quotation.save()
+	if hasattr(quotation, "__delete"):
+		webnotes.delete_doc("Quotation", quotation.doc.name, ignore_permissions=True)
+		quotation = _get_cart_quotation()
+	else:
+		quotation.ignore_permissions = True
+		quotation.save()
 	
 	set_cart_count(quotation)
 	
@@ -191,7 +199,7 @@
 	for d in doclist:
 		if d.item_code:
 			d.fields.update(webnotes.conn.get_value("Item", d.item_code, 
-				["website_image", "web_short_description", "page_name"], as_dict=True))
+				["website_image", "description", "page_name"], as_dict=True))
 			d.formatted_rate = fmt_money(d.export_rate, currency=doclist[0].currency)
 			d.formatted_amount = fmt_money(d.export_amount, currency=doclist[0].currency)
 		elif d.charge_type:
@@ -215,7 +223,7 @@
 	else:
 		qbean = webnotes.bean({
 			"doctype": "Quotation",
-			"naming_series": "QTN-CART-",
+			"naming_series": webnotes.defaults.get_user_default("shopping_cart_quotation_series") or "QTN-CART-",
 			"quotation_to": party.doctype,
 			"company": webnotes.defaults.get_user_default("company"),
 			"order_type": "Shopping Cart",
@@ -224,7 +232,10 @@
 			(party.doctype.lower()): party.name
 		})
 		
-		# map_contact_fields(qbean, party)
+		if party.doctype == "Customer":
+			qbean.doc.contact_person = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user,
+				"customer": party.name})
+			qbean.run_method("set_contact_fields")
 		
 		qbean.run_method("onload_post_render")
 		apply_cart_settings(party, qbean)
@@ -259,10 +270,11 @@
 	party_bean.save()
 	
 	qbean = _get_cart_quotation(party)
-	qbean.doc.customer_name = company_name or fullname
-	qbean.run_method("set_contact_fields")
-	qbean.ignore_permissions = True
-	qbean.save()
+	if not qbean.doc.fields.get("__islocal"):
+		qbean.doc.customer_name = company_name or fullname
+		qbean.run_method("set_contact_fields")
+		qbean.ignore_permissions = True
+		qbean.save()
 
 def apply_cart_settings(party=None, quotation=None):
 	if not party:
@@ -374,27 +386,26 @@
 	
 	return territory
 	
-@webnotes.whitelist()
-def checkout():
-	quotation = _get_cart_quotation()
-	
-	quotation.ignore_permissions = True
-	quotation.submit()
-	
-	from selling.doctype.quotation.quotation import make_sales_order
-	
-	sales_order = webnotes.bean(make_sales_order(quotation.doc.name))
-		
-	sales_order.ignore_permissions = True
-	sales_order.insert()
-	sales_order.submit()
-	
-	return sales_order
-
 import unittest
-test_dependencies = ["Item", "Price List", "Contact"]
+test_dependencies = ["Item", "Price List", "Contact", "Shopping Cart Settings"]
 
 class TestCart(unittest.TestCase):
+	def tearDown(self):
+		return
+		
+		cart_settings = webnotes.bean("Shopping Cart Settings")
+		cart_settings.ignore_permissions = True
+		cart_settings.doc.enabled = 0
+		cart_settings.save()
+	
+	def enable_shopping_cart(self):
+		return
+		if not webnotes.conn.get_value("Shopping Cart Settings", None, "enabled"):
+			cart_settings = webnotes.bean("Shopping Cart Settings")
+			cart_settings.ignore_permissions = True
+			cart_settings.doc.enabled = 1
+			cart_settings.save()
+			
 	def test_get_lead_or_customer(self):
 		webnotes.session.user = "test@example.com"
 		party1 = get_lead_or_customer()
@@ -407,7 +418,9 @@
 		self.assertEquals(party.name, "_Test Customer")
 		
 	def test_add_to_cart(self):
+		self.enable_shopping_cart()
 		webnotes.session.user = "test@example.com"
+		
 		update_cart("_Test Item", 1)
 		
 		quotation = _get_cart_quotation()
@@ -440,8 +453,9 @@
 		quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
 		self.assertEquals(quotation_items, [])
 		
-	def test_checkout(self):
+	def test_place_order(self):
 		quotation = self.test_update_cart()
-		sales_order = checkout()
+		sales_order_name = place_order()
+		sales_order = webnotes.bean("Sales Order", sales_order_name)
 		self.assertEquals(sales_order.doclist.getone({"item_code": "_Test Item"}).prevdoc_docname, quotation.doc.name)
 		
\ No newline at end of file
diff --git a/website/templates/css/product_page.css b/website/templates/css/product_page.css
index 566b6b5..457fc62 100644
--- a/website/templates/css/product_page.css
+++ b/website/templates/css/product_page.css
@@ -7,4 +7,7 @@
 			font-size: 18px;
 			line-height: 200%;
 		}
+		.item-stock {
+			margin-bottom: 10px !important;
+		}
 	</style>
\ No newline at end of file
diff --git a/website/templates/html/product_page.html b/website/templates/html/product_page.html
index 73520ef..4f04cec 100644
--- a/website/templates/html/product_page.html
+++ b/website/templates/html/product_page.html
@@ -32,8 +32,7 @@
 				<p class="help">Item Code: <span itemprop="productID">{{ name }}</span></p>
 				<h4>Product Description</h4>
 				<div itemprop="description">
-				{{ web_long_description or web_short_description or description or 
-					"[No description given]" }}
+				{{ web_long_description or description or "[No description given]" }}
 				</div>
 				<div style="min-height: 100px; margin: 10px 0;">
 					<div class="item-price-info" style="display: none;">
diff --git a/website/templates/js/cart.js b/website/templates/js/cart.js
index bb3fcb9..2f5ad31 100644
--- a/website/templates/js/cart.js
+++ b/website/templates/js/cart.js
@@ -143,7 +143,7 @@
 			'<div style="height: 120px; overflow: hidden;"><img src="' + doc.image + '" /></div>' :
 			'{% include "app/website/templates/html/product_missing_image.html" %}';
 			
-		if(!doc.web_short_description) doc.web_short_description = doc.description;
+		if(doc.description === doc.item_name) doc.description = "";
 		
 		$(repl('<div class="row">\
 			<div class="col col-lg-9 col-sm-9">\
@@ -151,7 +151,7 @@
 					<div class="col col-lg-3">%(image_html)s</div>\
 					<div class="col col-lg-9">\
 						<h4><a href="%(page_name)s">%(item_name)s</a></h4>\
-						<p>%(web_short_description)s</p>\
+						<p>%(description)s</p>\
 					</div>\
 				</div>\
 			</div>\