[minor] [webshop] [fix]

This commit is contained in:
Anand Doshi 2013-07-15 18:28:14 +05:30
parent d4e76bc1db
commit cefccb921e
11 changed files with 102 additions and 48 deletions

View File

@ -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() { set_dynamic_labels: function() {
this._super(); this._super();
set_sales_bom_help(this.frm.doc); set_sales_bom_help(this.frm.doc);

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-02 17:53:24", "creation": "2013-05-02 17:53:24",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-05 14:39:17", "modified": "2013-07-15 15:03:01",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -179,7 +179,6 @@
"fieldname": "hr", "fieldname": "hr",
"fieldtype": "Section Break", "fieldtype": "Section Break",
"label": "HR", "label": "HR",
"options": "<div style=\"padding-top: 8px;\" class=\"columnHeading\">HR</div>",
"read_only": 0 "read_only": 0
}, },
{ {

View File

@ -82,10 +82,10 @@ def get_profile_args():
phone = party.phone phone = party.phone
else: else:
mobile_no, phone = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user, mobile_no, phone = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user,
"customer": party.name}) "customer": party.name}, ["mobile_no", "phone"])
return { return {
"company_name": party.customer_name if party.doctype == "Customer" else party.company_name, "company_name": cstr(party.customer_name if party.doctype == "Customer" else party.company_name),
"mobile_no": mobile_no, "mobile_no": cstr(mobile_no),
"phone": phone "phone": cstr(phone)
} }

View File

@ -186,3 +186,8 @@ fieldset[disabled] .btn-default.active {
background-color: #a7a9aa; background-color: #a7a9aa;
border-color: #a7a9aa; border-color: #a7a9aa;
} }
.breadcrumb {
margin: 0 -20px 20px;
border-radius: 0px;
}

View File

@ -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;
}
}
});

View File

@ -9,6 +9,9 @@ from webnotes.model.controller import DocListController
class ShoppingCartSetupError(webnotes.ValidationError): pass class ShoppingCartSetupError(webnotes.ValidationError): pass
class DocType(DocListController): class DocType(DocListController):
def onload(self):
self.doc.fields["__quotation_series"] = webnotes.get_doctype("Quotation").get_options("naming_series")
def validate(self): def validate(self):
if self.doc.enabled: if self.doc.enabled:
self.validate_price_lists() self.validate_price_lists()
@ -17,6 +20,7 @@ class DocType(DocListController):
def on_update(self): def on_update(self):
webnotes.conn.set_default("shopping_cart_enabled", self.doc.fields.get("enabled") or 0) 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): def validate_overlapping_territories(self, parentfield, fieldname):
# for displaying message # for displaying message
@ -92,15 +96,16 @@ class DocType(DocListController):
for currency in price_list_currency_map.values() for currency in price_list_currency_map.values()
if currency != company_currency] if currency != company_currency]
exists = webnotes.conn.sql_list("""select name from `tabCurrency Exchange` if expected_to_exist:
where name in (%s)""" % (", ".join(["%s"]*len(expected_to_exist)),), exists = webnotes.conn.sql_list("""select name from `tabCurrency Exchange`
tuple(expected_to_exist)) 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: if missing:
msgprint(_("Missing Currency Exchange Rates for" + ": " + comma_and(missing)), msgprint(_("Missing Currency Exchange Rates for" + ": " + comma_and(missing)),
raise_exception=ShoppingCartSetupError) raise_exception=ShoppingCartSetupError)
def get_name_from_territory(self, territory, parentfield, fieldname): def get_name_from_territory(self, territory, parentfield, fieldname):
name = None name = None

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-06-19 15:57:32", "creation": "2013-06-19 15:57:32",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 18:42:29", "modified": "2013-07-15 17:33:05",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -78,6 +78,13 @@
"options": "Customer Group", "options": "Customer Group",
"reqd": 1 "reqd": 1
}, },
{
"doctype": "DocField",
"fieldname": "quotation_series",
"fieldtype": "Select",
"label": "Quotation Series",
"reqd": 1
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "section_break_6", "fieldname": "section_break_6",

View File

@ -58,6 +58,10 @@ def update_cart(item_code, qty, with_doclist=0):
qty = flt(qty) qty = flt(qty)
if qty == 0: if qty == 0:
quotation.set_doclist(quotation.doclist.get({"item_code": ["!=", item_code]})) 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: else:
quotation_items = quotation.doclist.get({"item_code": item_code}) quotation_items = quotation.doclist.get({"item_code": item_code})
if not quotation_items: if not quotation_items:
@ -72,8 +76,12 @@ def update_cart(item_code, qty, with_doclist=0):
apply_cart_settings(quotation=quotation) apply_cart_settings(quotation=quotation)
quotation.ignore_permissions = True if hasattr(quotation, "__delete"):
quotation.save() 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) set_cart_count(quotation)
@ -191,7 +199,7 @@ def decorate_quotation_doclist(doclist):
for d in doclist: for d in doclist:
if d.item_code: if d.item_code:
d.fields.update(webnotes.conn.get_value("Item", 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_rate = fmt_money(d.export_rate, currency=doclist[0].currency)
d.formatted_amount = fmt_money(d.export_amount, currency=doclist[0].currency) d.formatted_amount = fmt_money(d.export_amount, currency=doclist[0].currency)
elif d.charge_type: elif d.charge_type:
@ -215,7 +223,7 @@ def _get_cart_quotation(party=None):
else: else:
qbean = webnotes.bean({ qbean = webnotes.bean({
"doctype": "Quotation", "doctype": "Quotation",
"naming_series": "QTN-CART-", "naming_series": webnotes.defaults.get_user_default("shopping_cart_quotation_series") or "QTN-CART-",
"quotation_to": party.doctype, "quotation_to": party.doctype,
"company": webnotes.defaults.get_user_default("company"), "company": webnotes.defaults.get_user_default("company"),
"order_type": "Shopping Cart", "order_type": "Shopping Cart",
@ -224,7 +232,10 @@ def _get_cart_quotation(party=None):
(party.doctype.lower()): party.name (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") qbean.run_method("onload_post_render")
apply_cart_settings(party, qbean) apply_cart_settings(party, qbean)
@ -259,10 +270,11 @@ def update_party(fullname, company_name=None, mobile_no=None, phone=None):
party_bean.save() party_bean.save()
qbean = _get_cart_quotation(party) qbean = _get_cart_quotation(party)
qbean.doc.customer_name = company_name or fullname if not qbean.doc.fields.get("__islocal"):
qbean.run_method("set_contact_fields") qbean.doc.customer_name = company_name or fullname
qbean.ignore_permissions = True qbean.run_method("set_contact_fields")
qbean.save() qbean.ignore_permissions = True
qbean.save()
def apply_cart_settings(party=None, quotation=None): def apply_cart_settings(party=None, quotation=None):
if not party: if not party:
@ -374,27 +386,26 @@ def get_address_territory(address_name):
return territory 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 import unittest
test_dependencies = ["Item", "Price List", "Contact"] test_dependencies = ["Item", "Price List", "Contact", "Shopping Cart Settings"]
class TestCart(unittest.TestCase): 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): def test_get_lead_or_customer(self):
webnotes.session.user = "test@example.com" webnotes.session.user = "test@example.com"
party1 = get_lead_or_customer() party1 = get_lead_or_customer()
@ -407,7 +418,9 @@ class TestCart(unittest.TestCase):
self.assertEquals(party.name, "_Test Customer") self.assertEquals(party.name, "_Test Customer")
def test_add_to_cart(self): def test_add_to_cart(self):
self.enable_shopping_cart()
webnotes.session.user = "test@example.com" webnotes.session.user = "test@example.com"
update_cart("_Test Item", 1) update_cart("_Test Item", 1)
quotation = _get_cart_quotation() quotation = _get_cart_quotation()
@ -440,8 +453,9 @@ class TestCart(unittest.TestCase):
quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"}) quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
self.assertEquals(quotation_items, []) self.assertEquals(quotation_items, [])
def test_checkout(self): def test_place_order(self):
quotation = self.test_update_cart() 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) self.assertEquals(sales_order.doclist.getone({"item_code": "_Test Item"}).prevdoc_docname, quotation.doc.name)

View File

@ -7,4 +7,7 @@
font-size: 18px; font-size: 18px;
line-height: 200%; line-height: 200%;
} }
.item-stock {
margin-bottom: 10px !important;
}
</style> </style>

View File

@ -32,8 +32,7 @@
<p class="help">Item Code: <span itemprop="productID">{{ name }}</span></p> <p class="help">Item Code: <span itemprop="productID">{{ name }}</span></p>
<h4>Product Description</h4> <h4>Product Description</h4>
<div itemprop="description"> <div itemprop="description">
{{ web_long_description or web_short_description or description or {{ web_long_description or description or "[No description given]" }}
"[No description given]" }}
</div> </div>
<div style="min-height: 100px; margin: 10px 0;"> <div style="min-height: 100px; margin: 10px 0;">
<div class="item-price-info" style="display: none;"> <div class="item-price-info" style="display: none;">

View File

@ -143,7 +143,7 @@ $.extend(wn.cart, {
'<div style="height: 120px; overflow: hidden;"><img src="' + doc.image + '" /></div>' : '<div style="height: 120px; overflow: hidden;"><img src="' + doc.image + '" /></div>' :
'{% include "app/website/templates/html/product_missing_image.html" %}'; '{% 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">\ $(repl('<div class="row">\
<div class="col col-lg-9 col-sm-9">\ <div class="col col-lg-9 col-sm-9">\
@ -151,7 +151,7 @@ $.extend(wn.cart, {
<div class="col col-lg-3">%(image_html)s</div>\ <div class="col col-lg-3">%(image_html)s</div>\
<div class="col col-lg-9">\ <div class="col col-lg-9">\
<h4><a href="%(page_name)s">%(item_name)s</a></h4>\ <h4><a href="%(page_name)s">%(item_name)s</a></h4>\
<p>%(web_short_description)s</p>\ <p>%(description)s</p>\
</div>\ </div>\
</div>\ </div>\
</div>\ </div>\