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 6d7f2db704..a2c3321a86 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 . +// along with this program. If not, see . //--------- 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.in_words_export = function(doc) { } 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 = ''; var bend = ''; return ''+(bold?bstart:'')+title+(bold?bend:'')+'' @@ -63,7 +64,7 @@ cur_frm.pformat.other_charges= function(doc){ if (!doc.print_without_amount) { var cl = getchildren('Sales Taxes and Charges',doc.name,'other_charges'); - // outer table + // outer table var out='
' } - out +='
'; // main table @@ -77,7 +78,7 @@ cur_frm.pformat.other_charges= function(doc){ if(cl.length){ for(var i=0;i
'; + out +=''; } 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 0000000000..8e8580bedc --- /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 70151a6e3e..7bcc92e118 100644 --- a/controllers/accounts_controller.py +++ b/controllers/accounts_controller.py @@ -30,11 +30,6 @@ class AccountsController(TransactionBase): 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 @@ class AccountsController(TransactionBase): "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 @@ class AccountsController(TransactionBase): 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 80e3102cd1..af74a89574 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -197,7 +197,6 @@ patch_list = [ "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 @@ patch_list = [ "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 b44a8755db..743c02bd0d 100644 --- a/public/js/utils.js +++ b/public/js/utils.js @@ -39,5 +39,14 @@ $.extend(erpnext, { 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 919de227d9..9c11eeab7e 100644 --- a/selling/doctype/sales_common/sales_common.js +++ b/selling/doctype/sales_common/sales_common.js @@ -492,6 +492,21 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ } }, + 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 6fc07b6c57..b59ca94c25 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": "
HR
", "read_only": 0 }, { diff --git a/setup/doctype/price_list/price_list.js b/setup/doctype/price_list/price_list.js index 3bfa63af5e..26c9854592 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 . -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 = '\ + \ + \ + \ + \ + ' + + $.map(item_price.sort(function(a, b) { return a.parent.localeCompare(b.parent); }), function(d) { + return '' + + '' + + '' + + '' + }).join("\n") + + '\ +
' + wn._("Item Code") + '' + wn._("Price") + '
' + d.parent + '' + format_currency(d.ref_rate, d.ref_currency) + '
'; + $(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 = '\ - \ - \ - \ - \ - ' - + $.map(item_price.sort(function(a, b) { return a.parent.localeCompare(b.parent); }), function(d) { - return '' - + '' - + '' - + '' - }).join("\n") - + '\ -
' + wn._("Item Code") + '' + wn._("Price") + '
' + d.parent + '' + format_currency(d.ref_rate, d.ref_currency) + '
'; - $(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 4c1f5283e1..87d12e4ec2 100644 --- a/startup/webutils.py +++ b/startup/webutils.py @@ -82,10 +82,10 @@ def get_profile_args(): 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 b71ff1316e..f2880e892d 100644 --- a/website/css/website.css +++ b/website/css/website.css @@ -186,3 +186,8 @@ fieldset[disabled] .btn-default.active { 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 0000000000..74988dc719 --- /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 7fe14c3d86..853eeb42a7 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 @@ from webnotes.model.controller import DocListController 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 @@ class DocType(DocListController): 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 @@ class DocType(DocListController): 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 7455864141..21e6ee37c4 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" }, @@ -78,6 +78,13 @@ "options": "Customer Group", "reqd": 1 }, + { + "doctype": "DocField", + "fieldname": "quotation_series", + "fieldtype": "Select", + "label": "Quotation Series", + "reqd": 1 + }, { "doctype": "DocField", "fieldname": "section_break_6", diff --git a/website/helpers/cart.py b/website/helpers/cart.py index ea72e40ff0..2149534ebe 100644 --- a/website/helpers/cart.py +++ b/website/helpers/cart.py @@ -58,6 +58,10 @@ def update_cart(item_code, qty, with_doclist=0): 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 @@ def update_cart(item_code, qty, with_doclist=0): 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 @@ def decorate_quotation_doclist(doclist): 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 @@ def _get_cart_quotation(party=None): 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 @@ def _get_cart_quotation(party=None): (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 @@ def update_party(fullname, company_name=None, mobile_no=None, phone=None): 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 @@ def get_address_territory(address_name): 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 @@ class TestCart(unittest.TestCase): 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 @@ class TestCart(unittest.TestCase): 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 566b6b57aa..457fc6276b 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; + } \ No newline at end of file diff --git a/website/templates/html/product_page.html b/website/templates/html/product_page.html index 73520ef643..4f04cec6f9 100644 --- a/website/templates/html/product_page.html +++ b/website/templates/html/product_page.html @@ -32,8 +32,7 @@

Item Code: {{ name }}

Product Description

- {{ web_long_description or web_short_description or description or - "[No description given]" }} + {{ web_long_description or description or "[No description given]" }}