Merge branch 'develop' into company_ui/ux_fix
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index 307b72d..d9f395b 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -128,7 +128,8 @@
 		order_by_statement = "order by posting_date, voucher_type, voucher_no"
 
 	if filters.get("group_by") == _("Group by Voucher (Consolidated)"):
-		group_by_statement = "group by voucher_type, voucher_no, account, cost_center, against_voucher"
+		group_by_statement = "group by voucher_type, voucher_no, account, cost_center"
+
 		select_fields = """, sum(debit) as debit, sum(credit) as credit,
 			sum(debit_in_account_currency) as debit_in_account_currency,
 			sum(credit_in_account_currency) as  credit_in_account_currency"""
diff --git a/erpnext/config/buying.py b/erpnext/config/buying.py
index 264f88f..d1b0d91 100644
--- a/erpnext/config/buying.py
+++ b/erpnext/config/buying.py
@@ -72,9 +72,14 @@
 				},
 				{
 					"type": "doctype",
+					"name": "Promotional Scheme",
+					"description": _("Rules for applying different promotional schemes.")
+				},
+				{
+					"type": "doctype",
 					"name": "Pricing Rule",
 					"description": _("Rules for applying pricing and discount.")
-				},
+				}
 			]
 		},
 		{
diff --git a/erpnext/config/selling.py b/erpnext/config/selling.py
index 9209ca9..b31eb02 100644
--- a/erpnext/config/selling.py
+++ b/erpnext/config/selling.py
@@ -113,6 +113,11 @@
 				},
 				{
 					"type": "doctype",
+					"name": "Promotional Scheme",
+					"description": _("Rules for applying different promotional schemes.")
+				},
+				{
+					"type": "doctype",
 					"name": "Pricing Rule",
 					"description": _("Rules for applying pricing and discount."),
 					"dependencies": ["Item"],
diff --git a/erpnext/public/js/website_theme.js b/erpnext/public/js/website_theme.js
index 6c7edfa..84de2f5 100644
--- a/erpnext/public/js/website_theme.js
+++ b/erpnext/public/js/website_theme.js
@@ -2,16 +2,13 @@
 // MIT License. See license.txt
 
 frappe.ui.form.on('Website Theme', {
-	apply_custom_theme(frm) {
-		let custom_theme = frm.doc.custom_theme;
-		custom_theme = custom_theme.split('\n');
-		if (
-			frm.doc.apply_custom_theme
-				&& custom_theme.length === 2
-				&& custom_theme[1].includes('frappe/public/scss/website')
+	validate(frm) {
+		let theme_scss = frm.doc.theme_scss;
+		if (theme_scss.includes('frappe/public/scss/website')
+			&& !theme_scss.includes('erpnext/public/scss/website')
 		) {
-			frm.set_value('custom_theme',
-				`$primary: #7575ff;\n@import "frappe/public/scss/website";\n@import "erpnext/public/scss/website";`);
+			frm.set_value('theme_scss',
+				`${frm.doc.theme_scss}\n@import "erpnext/public/scss/website";`);
 		}
 	}
 });
diff --git a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py
index 01da810..6569833 100644
--- a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py
+++ b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py
@@ -138,14 +138,15 @@
 		outward_supply_tax_amounts = self.get_tax_amounts("Sales Invoice")
 		inward_supply_tax_amounts = self.get_tax_amounts("Purchase Invoice", reverse_charge="Y")
 		itc_details = self.get_itc_details()
-		inter_state_supplies = self.get_inter_state_supplies(self.gst_details.get("gst_state"))
-		inward_nil_exempt = self.get_inward_nil_exempt(self.gst_details.get("gst_state"))
 
 		self.prepare_data("Sales Invoice", outward_supply_tax_amounts, "sup_details", "osup_det", ["Registered Regular"])
 		self.prepare_data("Sales Invoice", outward_supply_tax_amounts, "sup_details", "osup_zero", ["SEZ", "Deemed Export", "Overseas"])
 		self.prepare_data("Purchase Invoice", inward_supply_tax_amounts, "sup_details", "isup_rev", ["Registered Regular"], reverse_charge="Y")
 		self.report_dict["sup_details"]["osup_nil_exmp"]["txval"] = flt(self.get_nil_rated_supply_value(), 2)
 		self.set_itc_details(itc_details)
+
+		inter_state_supplies = self.get_inter_state_supplies(self.gst_details.get("gst_state_number"))
+		inward_nil_exempt = self.get_inward_nil_exempt(self.gst_details.get("gst_state"))
 		self.set_inter_state_supply(inter_state_supplies)
 		self.set_inward_nil_exempt(inward_nil_exempt)
 
@@ -221,7 +222,7 @@
 		for k, v in iteritems(account_map):
 			txval -= self.report_dict.get(supply_type, {}).get(supply_category, {}).get(v, 0)
 
-		self.report_dict[supply_type][supply_category]["txval"] = flt(txval, 2)
+		self.report_dict[supply_type][supply_category]["txval"] += flt(txval, 2)
 
 	def set_inter_state_supply(self, inter_state_supply):
 
@@ -283,28 +284,40 @@
 			and s.company = %s and s.company_gstin = %s""",
 			(self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)[0].total
 
-	def get_inter_state_supplies(self, state):
+	def get_inter_state_supplies(self, state_number):
 
-		inter_state_supply = frappe.db.sql(""" select sum(s.grand_total) as total, t.tax_amount, a.gst_state, s.gst_category
-			from `tabSales Invoice` s, `tabSales Taxes and Charges` t, `tabAddress` a
-			where t.parent = s.name and s.customer_address = a.name and
-			s.docstatus = 1 and month(s.posting_date) = %s and year(s.posting_date) = %s and
-			a.gst_state <> %s and s.company = %s and s.company_gstin = %s and
-			s.gst_category in ('Unregistered', 'Registered Composition', 'UIN Holders')
-			group by s.gst_category, a.state""", (self.month_no, self.year, state, self.company, self.gst_details.get("gstin")), as_dict=1)
+		inter_state_supply_taxable_value = frappe.db.sql(""" select sum(s.net_total) as total, s.place_of_supply, s.gst_category
+			from `tabSales Invoice` s where s.docstatus = 1 and month(s.posting_date) = %s and year(s.posting_date) = %s
+			and s.company = %s and s.company_gstin = %s and s.gst_category in ('Unregistered', 'Registered Composition', 'UIN Holders')
+			group by s.gst_category, s.place_of_supply""", (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
 
+		inter_state_supply_tax = frappe.db.sql(""" select sum(t.tax_amount) as tax_amount, s.place_of_supply, s.gst_category
+			from `tabSales Invoice` s, `tabSales Taxes and Charges` t
+			where t.parent = s.name and s.docstatus = 1 and month(s.posting_date) = %s and year(s.posting_date) = %s
+			and s.company = %s and s.company_gstin = %s and s.gst_category in ('Unregistered', 'Registered Composition', 'UIN Holders')
+			group by s.gst_category, s.place_of_supply""", (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1)
+
+		inter_state_supply_tax_mapping={}
 		inter_state_supply_details = {}
 
-		for d in inter_state_supply:
+		for d in inter_state_supply_tax:
+			inter_state_supply_tax_mapping.setdefault(d.place_of_supply, d.tax_amount)
+
+		for d in inter_state_supply_taxable_value:
 			inter_state_supply_details.setdefault(
 				d.gst_category, []
 			)
 
-			inter_state_supply_details[d.gst_category].append({
-				"pos": get_state_code(d.gst_state),
-				"txval": d.total - d.tax_amount,
-				"iamt": d.tax_amount
-			})
+			if state_number != d.place_of_supply.split("-")[0]:
+				inter_state_supply_details[d.gst_category].append({
+					"pos": d.place_of_supply,
+					"txval": flt(d.total, 2),
+					"iamt": flt(inter_state_supply_tax_mapping.get(d.place_of_supply), 2)
+				})
+			else:
+				self.report_dict["sup_details"]["osup_det"]["txval"] += flt(d.total, 2)
+				self.report_dict["sup_details"]["osup_det"]["camt"] += flt(inter_state_supply_tax_mapping.get(d.place_of_supply)/2, 2)
+				self.report_dict["sup_details"]["osup_det"]["samt"] += flt(inter_state_supply_tax_mapping.get(d.place_of_supply)/2, 2)
 
 		return inter_state_supply_details
 
diff --git a/erpnext/shopping_cart/product_info.py b/erpnext/shopping_cart/product_info.py
index f9a45ce..d69b5e3 100644
--- a/erpnext/shopping_cart/product_info.py
+++ b/erpnext/shopping_cart/product_info.py
@@ -13,8 +13,11 @@
 def get_product_info_for_website(item_code):
 	"""get product price / stock info for website"""
 
-	cart_quotation = _get_cart_quotation()
 	cart_settings = get_shopping_cart_settings()
+	if not cart_settings.enabled:
+		return frappe._dict()
+
+	cart_quotation = _get_cart_quotation()
 
 	price = get_price(
 		item_code,
diff --git a/erpnext/templates/generators/item/item_details.html b/erpnext/templates/generators/item/item_details.html
index 4f8f8c2..8e56033 100644
--- a/erpnext/templates/generators/item/item_details.html
+++ b/erpnext/templates/generators/item/item_details.html
@@ -9,7 +9,13 @@
 </p>
 <!-- description -->
 <div itemprop="description">
-	{{ doc.web_long_description or doc.description or _("No description given") | safe }}
+{% if frappe.utils.strip_html(doc.web_long_description) %}
+	{{ doc.web_long_description | safe }}
+{% elif frappe.utils.strip_html(doc.description)  %}
+	{{ doc.description | safe }}
+{% else %}
+	{{ _("No description given") }}
+{% endif  %}
 </div>
 
 {% if has_variants %}
diff --git a/erpnext/templates/generators/item/item_specifications.html b/erpnext/templates/generators/item/item_specifications.html
index a12a074..469a45f 100644
--- a/erpnext/templates/generators/item/item_specifications.html
+++ b/erpnext/templates/generators/item/item_specifications.html
@@ -1,8 +1,6 @@
 {% if doc.website_specifications -%}
 <div class="row item-website-specification mt-5">
 	<div class="col-md-12">
-		<h6 class="text-uppercase text-muted">{{ _("Specifications") }}</h6>
-
 		<table class="table table-bordered">
 		{% for d in doc.website_specifications -%}
 			<tr>
diff --git a/erpnext/templates/pages/home.html b/erpnext/templates/pages/home.html
index b67a465..2ef9c10 100644
--- a/erpnext/templates/pages/home.html
+++ b/erpnext/templates/pages/home.html
@@ -33,7 +33,7 @@
 			{% for item in homepage.products %}
 			<div class="col-md-4 mb-4">
 				<div class="card h-100 justify-content-between">
-					<div class="website-image-lazy" data-class="card-img-top h-100" data-src="{{ item.image }}" data-alt="{{ item.item_name }}"></div>
+					<div class="website-image-lazy" data-class="card-img-top website-image-extra-large" data-src="{{ item.image }}" data-alt="{{ item.item_name }}"></div>
 					<div class="card-body flex-grow-0">
 						<h5 class="card-title">{{ item.item_name }}</h5>
 						<a href="{{ item.route }}" class="card-link">{{ _('More details') }}</a>
diff --git a/erpnext/www/all-products/index.html b/erpnext/www/all-products/index.html
index ade72a2..f090214 100644
--- a/erpnext/www/all-products/index.html
+++ b/erpnext/www/all-products/index.html
@@ -42,7 +42,7 @@
 	</div>
 	<div class="col-12 order-1 col-md-4 order-md-2">
 
-		{% if frappe.form_dict.start or frappe.form_dict.field_filters or frappe.form_dict.search %}
+		{% if frappe.form_dict.start or frappe.form_dict.field_filters or frappe.form_dict.attribute_filters or frappe.form_dict.search %}
 		<a class="mb-3 d-inline-block" href="/all-products">{{ _('Clear filters') }}</a>
 		{% endif  %}