[wip] shopping cart shipping rule, price list cleanup
diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.json b/erpnext/accounts/doctype/shipping_rule/shipping_rule.json
index 97828d6..62d5cb8 100644
--- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.json
+++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.json
@@ -141,17 +141,17 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "description": "Specify a list of Territories, for which, this Shipping Rule is valid",
- "fieldname": "territories",
+ "fieldname": "countries",
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Valid For Territories",
+ "label": "Valid for Countries",
"no_copy": 0,
- "options": "Applicable Territory",
+ "options": "Shipping Rule Country",
"permlevel": 0,
+ "precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
@@ -296,7 +296,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 0,
- "modified": "2015-09-07 15:51:26",
+ "modified": "2015-09-17 06:44:05.127516",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Shipping Rule",
@@ -304,7 +304,7 @@
"permissions": [
{
"amend": 0,
- "apply_user_permissions": 0,
+ "apply_user_permissions": 1,
"cancel": 0,
"create": 0,
"delete": 0,
@@ -324,7 +324,7 @@
},
{
"amend": 0,
- "apply_user_permissions": 0,
+ "apply_user_permissions": 1,
"cancel": 0,
"create": 0,
"delete": 0,
diff --git a/erpnext/accounts/doctype/shipping_rule_country/__init__.py b/erpnext/accounts/doctype/shipping_rule_country/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/shipping_rule_country/__init__.py
diff --git a/erpnext/accounts/doctype/shipping_rule_country/shipping_rule_country.json b/erpnext/accounts/doctype/shipping_rule_country/shipping_rule_country.json
new file mode 100644
index 0000000..90fe3d3
--- /dev/null
+++ b/erpnext/accounts/doctype/shipping_rule_country/shipping_rule_country.json
@@ -0,0 +1,53 @@
+{
+ "allow_copy": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "creation": "2015-09-17 06:43:22.767534",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Other",
+ "fields": [
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "country",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Country",
+ "no_copy": 0,
+ "options": "Country",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 1,
+ "modified": "2015-09-17 06:43:22.767534",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Shipping Rule Country",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [],
+ "read_only": 0,
+ "read_only_onload": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/shipping_rule_country/shipping_rule_country.py b/erpnext/accounts/doctype/shipping_rule_country/shipping_rule_country.py
new file mode 100644
index 0000000..b9646cf
--- /dev/null
+++ b/erpnext/accounts/doctype/shipping_rule_country/shipping_rule_country.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class ShippingRuleCountry(Document):
+ pass
diff --git a/erpnext/public/js/shopping_cart.js b/erpnext/public/js/shopping_cart.js
index cff831d..f52c296 100644
--- a/erpnext/public/js/shopping_cart.js
+++ b/erpnext/public/js/shopping_cart.js
@@ -30,7 +30,7 @@
args: {
item_code: opts.item_code,
qty: opts.qty,
- with_doc: opts.with_doc || 0
+ with_items: opts.with_items || 0
},
btn: opts.btn,
callback: function(r) {
diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py
index 6ff164b..0d28406 100644
--- a/erpnext/shopping_cart/cart.py
+++ b/erpnext/shopping_cart/cart.py
@@ -28,6 +28,8 @@
doc = quotation
set_cart_count(quotation)
+ print get_applicable_shipping_rules(party)
+
return {
"doc": decorate_quotation_doc(doc),
"addresses": [{"name": address.name, "display": address.display}
@@ -63,7 +65,7 @@
return sales_order.name
@frappe.whitelist()
-def update_cart(item_code, qty, with_doc):
+def update_cart(item_code, qty, with_items=False):
quotation = _get_cart_quotation()
qty = flt(qty)
@@ -95,8 +97,15 @@
set_cart_count(quotation)
- if with_doc:
- return get_cart_quotation(quotation)
+
+ if with_items:
+ context = get_cart_quotation(quotation)
+ return {
+ "items": frappe.render_template("templates/includes/cart/cart_items.html",
+ context),
+ "taxes": frappe.render_template("templates/includes/order/order_taxes.html",
+ context),
+ }
else:
return quotation.name
diff --git a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py
index da7d27a..a8a4b76 100644
--- a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py
+++ b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py
@@ -8,8 +8,7 @@
from frappe import _, msgprint
from frappe.utils import comma_and
from frappe.model.document import Document
-from frappe.utils.nestedset import get_ancestors_of, get_root_of
-from erpnext.utilities.doctype.address.address import get_territory_from_address
+from frappe.utils.nestedset import get_root_of
class ShoppingCartSetupError(frappe.ValidationError): pass
@@ -19,57 +18,8 @@
def validate(self):
if self.enabled:
- self.validate_price_lists()
+ self.validate_tax_masters()
self.validate_exchange_rates_exist()
- self.validate_tax_rule()
-
- def validate_overlapping_territories(self, parentfield, fieldname):
- # for displaying message
- doctype = self.meta.get_field(parentfield).options
-
- # specify atleast one entry in the table
- self.validate_table_has_rows(parentfield, raise_exception=ShoppingCartSetupError)
-
- territory_name_map = self.get_territory_name_map(parentfield, fieldname)
- for territory, names in territory_name_map.items():
- if len(names) > 1:
- frappe.throw(_("{0} {1} has a common territory {2}").format(_(doctype), comma_and(names), territory), ShoppingCartSetupError)
-
- return territory_name_map
-
- def validate_price_lists(self):
- self.validate_overlapping_territories("price_lists", "selling_price_list")
-
- # validate that a Shopping Cart Price List exists for the default territory as a catch all!
- price_list_for_default_territory = self.get_name_from_territory(self.default_territory, "price_lists",
- "selling_price_list")
-
- if not price_list_for_default_territory:
- msgprint(_("Please specify a Price List which is valid for Territory") +
- ": " + self.default_territory, raise_exception=ShoppingCartSetupError)
-
- def get_territory_name_map(self, parentfield, fieldname):
- territory_name_map = {}
-
- # entries in table
- names = [doc.get(fieldname) for doc in self.get(parentfield)]
- if names:
- # for condition in territory check
- parenttype = frappe.get_meta(self.meta.get_options(parentfield)).get_options(fieldname)
- # to validate territory overlap
- # make a map of territory: [list of names]
- # if list against each territory has more than one element, raise exception
- territory_name = frappe.db.sql("""select `territory`, `parent`
- from `tabApplicable Territory`
- where `parenttype`=%s and `parent` in (%s)""" %
- ("%s", ", ".join(["%s"]*len(names))), tuple([parenttype] + names))
-
- for territory, name in territory_name:
- territory_name_map.setdefault(territory, []).append(name)
-
- if len(territory_name_map[territory]) > 1:
- territory_name_map[territory].sort(key=lambda val: names.index(val))
- return territory_name_map
def validate_exchange_rates_exist(self):
"""check if exchange rates exist for all Price List currencies (to company's currency)"""
@@ -102,20 +52,6 @@
msgprint(_("Missing Currency Exchange Rates for {0}").format(comma_and(missing)),
raise_exception=ShoppingCartSetupError)
- def get_name_from_territory(self, territory, parentfield, fieldname):
- name = None
- territory_name_map = self.get_territory_name_map(parentfield, fieldname)
- if territory_name_map.get(territory):
- name = territory_name_map.get(territory)
- else:
- territory_ancestry = self.get_territory_ancestry(territory)
- for ancestor in territory_ancestry:
- if territory_name_map.get(ancestor):
- name = territory_name_map.get(ancestor)
- break
-
- return name
-
def get_price_list(self, billing_territory):
price_list = self.get_name_from_territory(billing_territory, "price_lists", "selling_price_list")
if not (price_list and price_list[0]):
@@ -123,11 +59,11 @@
"price_lists", "selling_price_list")
return price_list and price_list[0] or None
-
+
def validate_tax_rule(self):
if not frappe.db.get_value("Tax Rule", {"use_for_shopping_cart" : 1}, "name"):
frappe.throw(frappe._("Set Tax Rule for shopping cart"), ShoppingCartSetupError)
-
+
def get_tax_master(self, billing_territory):
tax_master = self.get_name_from_territory(billing_territory, "sales_taxes_and_charges_masters",
"sales_taxes_and_charges_master")
@@ -136,15 +72,6 @@
def get_shipping_rules(self, shipping_territory):
return self.get_name_from_territory(shipping_territory, "shipping_rules", "shipping_rule")
- def get_territory_ancestry(self, territory):
- if not hasattr(self, "_territory_ancestry"):
- self._territory_ancestry = {}
-
- if not self._territory_ancestry.get(territory):
- self._territory_ancestry[territory] = get_ancestors_of("Territory", territory)
-
- return self._territory_ancestry[territory]
-
def validate_cart_settings(doc, method):
frappe.get_doc("Shopping Cart Settings", "Shopping Cart Settings").run_method("validate")
@@ -163,4 +90,4 @@
def check_shopping_cart_enabled():
if not get_shopping_cart_settings().enabled:
frappe.throw(_("You need to enable Shopping Cart"), ShoppingCartSetupError)
-
+
diff --git a/erpnext/stock/doctype/price_list/price_list.json b/erpnext/stock/doctype/price_list/price_list.json
index fcd204c..0d2baa4 100644
--- a/erpnext/stock/doctype/price_list/price_list.json
+++ b/erpnext/stock/doctype/price_list/price_list.json
@@ -163,21 +163,21 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "description": "Specify a list of Territories, for which, this Price List is valid",
- "fieldname": "territories",
+ "fieldname": "countries",
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Valid for Territories",
+ "label": "Applicable for Countries",
"no_copy": 0,
- "options": "Applicable Territory",
+ "options": "Price List Country",
"permlevel": 0,
+ "precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
- "reqd": 1,
+ "reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
@@ -193,7 +193,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 1,
- "modified": "2015-09-14 02:55:58.919822",
+ "modified": "2015-09-17 06:50:31.465221",
"modified_by": "Administrator",
"module": "Stock",
"name": "Price List",
@@ -201,7 +201,7 @@
"permissions": [
{
"amend": 0,
- "apply_user_permissions": 0,
+ "apply_user_permissions": 1,
"cancel": 0,
"create": 0,
"delete": 0,
@@ -241,7 +241,7 @@
},
{
"amend": 0,
- "apply_user_permissions": 0,
+ "apply_user_permissions": 1,
"cancel": 0,
"create": 0,
"delete": 0,
@@ -281,7 +281,7 @@
},
{
"amend": 0,
- "apply_user_permissions": 0,
+ "apply_user_permissions": 1,
"cancel": 0,
"create": 0,
"delete": 0,
diff --git a/erpnext/stock/doctype/price_list/price_list.py b/erpnext/stock/doctype/price_list/price_list.py
index 6b03bb6..8773b9c 100644
--- a/erpnext/stock/doctype/price_list/price_list.py
+++ b/erpnext/stock/doctype/price_list/price_list.py
@@ -13,19 +13,6 @@
if not cint(self.buying) and not cint(self.selling):
throw(_("Price List must be applicable for Buying or Selling"))
- try:
- # at least one territory
- self.validate_table_has_rows("territories")
- except frappe.EmptyTableError:
- # if no territory, set default territory
- if frappe.defaults.get_user_default("territory"):
- self.append("territories", {
- "doctype": "Applicable Territory",
- "territory": frappe.defaults.get_user_default("territory")
- })
- else:
- raise
-
def on_update(self):
self.set_default_if_missing()
self.update_item_price()
diff --git a/erpnext/stock/doctype/price_list_country/__init__.py b/erpnext/stock/doctype/price_list_country/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/stock/doctype/price_list_country/__init__.py
diff --git a/erpnext/stock/doctype/price_list_country/price_list_country.json b/erpnext/stock/doctype/price_list_country/price_list_country.json
new file mode 100644
index 0000000..be02c20
--- /dev/null
+++ b/erpnext/stock/doctype/price_list_country/price_list_country.json
@@ -0,0 +1,53 @@
+{
+ "allow_copy": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "creation": "2015-09-17 06:49:51.810318",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "fields": [
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "country",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Country",
+ "no_copy": 0,
+ "options": "Country",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 1,
+ "modified": "2015-09-17 06:49:51.810318",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Price List Country",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [],
+ "read_only": 0,
+ "read_only_onload": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/price_list_country/price_list_country.py b/erpnext/stock/doctype/price_list_country/price_list_country.py
new file mode 100644
index 0000000..db1a060
--- /dev/null
+++ b/erpnext/stock/doctype/price_list_country/price_list_country.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class PriceListCountry(Document):
+ pass
diff --git a/erpnext/templates/includes/cart.js b/erpnext/templates/includes/cart.js
index e0706f7..e6ce25a 100644
--- a/erpnext/templates/includes/cart.js
+++ b/erpnext/templates/includes/cart.js
@@ -14,28 +14,9 @@
bind_events: function() {
shopping_cart.bind_address_select();
+ shopping_cart.bind_place_order();
+ shopping_cart.bind_change_qty();
- // bind update button
- $(document).on("click", ".item-update-cart button", function() {
- var item_code = $(this).attr("data-item-code");
- shopping_cart.update_cart({
- item_code: item_code,
- qty: $('input[data-item-code="'+item_code+'"]').val(),
- with_doc: 1,
- btn: this,
- callback: function(r) {
- if(!r.exc) {
- shopping_cart.render(r.message);
- var $button = $('button[data-item-code="'+item_code+'"]').addClass("btn-success");
- setTimeout(function() { $button.removeClass("btn-success"); }, 1000);
- }
- },
- });
- });
-
- $(".btn-place-order").on("click", function() {
- shopping_cart.place_order(this);
- });
},
bind_address_select: function() {
@@ -63,95 +44,31 @@
},
- render: function(out) {
- var doc = out.doc;
- var addresses = out.addresses;
-
- var $cart_items = $("#cart-items").empty();
- var $cart_taxes = $("#cart-taxes").empty();
- var $cart_totals = $("#cart-totals").empty();
- var $cart_billing_address = $("#cart-billing-address").empty();
- var $cart_shipping_address = $("#cart-shipping-address").empty();
-
- var no_items = $.map(doc.items || [],
- function(d) { return d.item_code || null;}).length===0;
- if(no_items) {
- shopping_cart.show_error("Cart Empty", frappe._("Go ahead and add something to your cart."));
- $("#cart-addresses").toggle(false);
- return;
- }
-
- var shipping_rule_added = false;
- var taxes_exist = false;
- var shipping_rule_labels = $.map(out.shipping_rules || [], function(rule) { return rule[1]; });
-
- $.each(doc.items || [], function(i, d) {
- shopping_cart.render_item_row($cart_items, d);
+ bind_place_order: function() {
+ $(".btn-place-order").on("click", function() {
+ shopping_cart.place_order(this);
});
-
- $.each(doc.taxes || [], function(i, d) {
- if(out.shipping_rules && out.shipping_rules.length &&
- shipping_rule_labels.indexOf(d.description)!==-1) {
- shipping_rule_added = true;
- shopping_cart.render_tax_row($cart_taxes, d, out.shipping_rules);
- } else {
- shopping_cart.render_tax_row($cart_taxes, d);
- }
-
- taxes_exist = true;
- });
-
- if(out.shipping_rules && out.shipping_rules.length && !shipping_rule_added) {
- shopping_cart.render_tax_row($cart_taxes, {description: "", formatted_tax_amount: ""},
- out.shipping_rules);
- taxes_exist = true;
- }
-
- if(taxes_exist)
- $('<hr>').appendTo($cart_taxes);
-
- shopping_cart.render_tax_row($cart_totals, {
- description: "",
- formatted_tax_amount: __("Total") + ": <strong>" + doc.formatted_grand_total_export + "</strong>"
- });
-
- if(!(addresses && addresses.length)) {
- $cart_shipping_address.html('<p>'+frappe._("Please add a new address")+'</p>');
- } else {
- shopping_cart.render_address($cart_shipping_address, addresses, doc.shipping_address_name);
- shopping_cart.render_address($cart_billing_address, addresses, doc.customer_address);
- }
},
- render_item_row: function($cart_items, doc) {
- doc.image_html = doc.website_image ?
- '<div style="height: 120px; overflow: hidden;"><img src="' + doc.website_image + '" /></div>': "";
+ bind_change_qty: function() {
+ // bind update button
+ $(".cart-items").on("change", ".cart-qty", function() {
+ var item_code = $(this).attr("data-item-code");
+ shopping_cart.update_cart({
+ item_code: item_code,
+ qty: $(this).val(),
+ with_items: 1,
+ btn: this,
+ callback: function(r) {
+ if(!r.exc) {
+ $(".cart-items").html(r.message.items);
+ $(".cart-tax-items").html(r.message.taxes);
+ }
+ $(".tax-grand-total").temp_highlight();
+ },
+ });
+ });
- if(doc.description === doc.item_name) doc.description = "";
-
- $(repl('<div class="row">\
- <div class="col-md-9 col-sm-9">\
- <div class="row">\
- <div class="col-md-2">%(image_html)s</div>\
- <div class="col-md-10">\
- <h5><a href="%(page_name)s">%(item_name)s</a></h5>\
- <p>%(description)s</p>\
- </div>\
- </div>\
- </div>\
- <div class="col-md-3 col-sm-3 text-right">\
- <div class="input-group item-update-cart">\
- <input type="text" placeholder="Qty" value="%(qty)s" \
- data-item-code="%(item_code)s" class="text-right form-control">\
- <div class="input-group-btn">\
- <button class="btn btn-primary" data-item-code="%(item_code)s">\
- <i class="icon-ok"></i></button>\
- </div>\
- </div>\
- <p class="text-muted small" style="margin-top: 10px;">' + __("Rate") + ': %(formatted_rate)s</p>\
- <small style="margin-top: 10px;">%(formatted_amount)s</small>\
- </div>\
- </div><hr>', doc)).appendTo($cart_items);
},
render_tax_row: function($cart_taxes, doc, shipping_rules) {
@@ -201,46 +118,6 @@
});
},
- render_address: function($address_wrapper, addresses, address_name) {
- $.each(addresses, function(i, address) {
- $(repl('<div class="panel panel-default"> \
- <div class="panel-heading"> \
- <div class="row"> \
- <div class="col-md-10 address-title" \
- data-address-name="%(name)s"><strong>%(name)s</strong></div> \
- <div class="col-md-2 text-right"><input type="checkbox" \
- data-address-name="%(name)s"></div> \
- </div> \
- </div> \
- <div class="panel-collapse collapse" data-address-name="%(name)s"> \
- <div class="panel-body text-muted small">%(display)s</div> \
- </div> \
- </div>', address))
- .css({"margin": "10px auto"})
- .appendTo($address_wrapper);
- });
-
- $address_wrapper.find(".panel-heading")
- .find(".address-title")
- .css({"cursor": "pointer"})
- .on("click", function() {
- $address_wrapper.find('.panel-collapse[data-address-name="'
- +$(this).attr("data-address-name")+'"]').collapse("toggle");
- });
-
-
- $address_wrapper.find('input[type="checkbox"][data-address-name="'+ address_name +'"]')
- .prop("checked", true);
-
- $address_wrapper.find(".panel-collapse").collapse({
- parent: $address_wrapper,
- toggle: false
- });
-
- $address_wrapper.find('.panel-collapse[data-address-name="'+ address_name +'"]')
- .collapse("show");
- },
-
place_order: function(btn) {
return frappe.call({
type: "POST",
@@ -267,24 +144,4 @@
$(document).ready(function() {
shopping_cart.bind_events();
- // return frappe.call({
- // type: "POST",
- // method: "erpnext.shopping_cart.cart.get_cart_quotation",
- // callback: function(r) {
- // $("#cart-container").removeClass("hide");
- // $(".loading").remove();
- // if(r.exc) {
- // if(r.exc.indexOf("WebsitePriceListMissingError")!==-1) {
- // shopping_cart.show_error("Configuration Error", frappe._("Price List not configured."));
- // } else if(r["403"]) {
- // shopping_cart.show_error("Not Allowed", frappe._("You need to be logged in to view your cart."));
- // } else {
- // shopping_cart.show_error("Error", frappe._("Something went wrong."));
- // }
- // } else {
- // shopping_cart.set_cart_count();
- // shopping_cart.render(r.message);
- // }
- // }
- // });
});
diff --git a/erpnext/templates/includes/cart/cart_item_line.html b/erpnext/templates/includes/cart/cart_item_line.html
deleted file mode 100644
index cd15763..0000000
--- a/erpnext/templates/includes/cart/cart_item_line.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{% from "erpnext/templates/includes/order/order_macros.html" import item_name_and_description %}
-
-<div class="row">
- <div class="col-sm-8 col-xs-6" style="margin-bottom: 10px;">
- {{ item_name_and_description(d) }}
- </div>
- <div class="col-sm-2 col-xs-3 text-right">
- <div>{{ d.get_formatted('qty') }}</div>
- <p class="text-muted small" style="margin-top: 10px;">
- {{ _("Rate") + ': ' + d.get_formatted("rate") }}
- </p>
- </div>
- <div class="col-sm-2 col-xs-3 text-right">
- {{ d.get_formatted("amount") }}
- </div>
-</div>
diff --git a/erpnext/templates/includes/cart/cart_items.html b/erpnext/templates/includes/cart/cart_items.html
new file mode 100644
index 0000000..f7efa78
--- /dev/null
+++ b/erpnext/templates/includes/cart/cart_items.html
@@ -0,0 +1,23 @@
+{% from "erpnext/templates/includes/order/order_macros.html" import item_name_and_description %}
+
+{% for d in doc.items %}
+<div class="cart-item">
+ <div class="row">
+ <div class="col-sm-8 col-xs-6" style="margin-bottom: 10px;">
+ {{ item_name_and_description(d) }}
+ </div>
+ <div class="col-sm-2 col-xs-3 text-right">
+ <span style="max-width: 50px; display: inline-block">
+ <input class="form-control text-right cart-qty"
+ value = "{{ d.get_formatted('qty') }}"
+ data-item-code="{{ d.item_code }}"></span>
+ <p class="text-muted small" style="margin-top: 10px;">
+ {{ _("Rate") + ': ' + d.get_formatted("rate") }}
+ </p>
+ </div>
+ <div class="col-sm-2 col-xs-3 text-right">
+ {{ d.get_formatted("amount") }}
+ </div>
+ </div>
+</div>
+{% endfor %}
diff --git a/erpnext/templates/includes/issue_row.html b/erpnext/templates/includes/issue_row.html
index 8e87fca..2935a24 100644
--- a/erpnext/templates/includes/issue_row.html
+++ b/erpnext/templates/includes/issue_row.html
@@ -2,13 +2,13 @@
<a class="no-decoration" href="/issues?name={{ doc.name }}" no-pjax>
<div class="row">
<div class="col-xs-8">
- <span class="indicator {{ "red" if doc.status=="Open" else "blue" }}">
+ <span class="indicator {{ "red" if doc.status=="Open" else "darkgrey" }}">
{{ doc.name }}</span>
<span style="margin-left: 15px;">
{{ doc.subject }}</span>
</div>
- <div class="col-xs-4 text-right small">
- {{ frappe.format_date(doc.creation) }}
+ <div class="col-xs-4 text-right small text-muted">
+ {{ frappe.format_date(doc.modified) }}
</div>
</div>
</a>
diff --git a/erpnext/templates/includes/order/order_taxes.html b/erpnext/templates/includes/order/order_taxes.html
index 510e1a3..8c8e886 100644
--- a/erpnext/templates/includes/order/order_taxes.html
+++ b/erpnext/templates/includes/order/order_taxes.html
@@ -15,5 +15,8 @@
<div class="row tax-grand-total-row">
<div class="col-xs-6 text-right">{{ _("Grand Total") }}</div>
<div class="col-xs-6 text-right">
- {{ doc.get_formatted("grand_total") }}</div>
+ <span class="tax-grand-total">
+ {{ doc.get_formatted("grand_total") }}
+ </span>
+ </div>
</div>
diff --git a/erpnext/templates/pages/cart.html b/erpnext/templates/pages/cart.html
index 837df3b..a97e658 100644
--- a/erpnext/templates/pages/cart.html
+++ b/erpnext/templates/pages/cart.html
@@ -35,11 +35,9 @@
</div>
</div>
{% if doc.items %}
- {% for d in doc.items %}
- <div class="cart-item">
- {% include "templates/includes/cart/cart_item_line.html" %}
+ <div class="cart-items">
+ {% include "templates/includes/cart/cart_items.html" %}
</div>
- {% endfor %}
{% else %}
<p>{{ _("Cart is Empty") }}</p>
{% endif %}
@@ -48,7 +46,7 @@
<!-- taxes -->
<div class="cart-taxes row small">
<div class="col-sm-8"><!-- empty --></div>
- <div class="col-sm-4">
+ <div class="col-sm-4 cart-tax-items">
{% include "templates/includes/order/order_taxes.html" %}
</div>
</div>