diff --git a/addons/website_sale_quote/__openerp__.py b/addons/website_sale_quote/__openerp__.py index 726bfa0bb47..03806300594 100644 --- a/addons/website_sale_quote/__openerp__.py +++ b/addons/website_sale_quote/__openerp__.py @@ -9,7 +9,7 @@ OpenERP Sale Quote Roller """, 'author': 'OpenERP SA', - 'depends': ['sale', 'portal_sale', 'mail'], + 'depends': ['website','sale', 'portal_sale', 'mail'], 'data': [ 'views/website_sale_quote.xml', 'sale_quote_view.xml', diff --git a/addons/website_sale_quote/controllers/main.py b/addons/website_sale_quote/controllers/main.py index 23ccc8ca1e4..98ca55dbedf 100644 --- a/addons/website_sale_quote/controllers/main.py +++ b/addons/website_sale_quote/controllers/main.py @@ -97,3 +97,19 @@ class sale_quote(http.Controller): 'template': quote, } return request.website.render('website_sale_quote.so_template', values) + + @website.route(['/quote/add_line'], type='json', auth="public") + def add(self, option=None, order=None, product=None, **post): + vals = {} + product_obj = request.registry.get('product.product').browse(request.cr, SUPERUSER_ID, int(product), context=request.context) + vals.update({ + 'price_unit': product_obj.list_price, + 'website_description': product_obj.website_description, + 'name': product_obj.name, + 'order_id': int(order), + 'product_id' : product_obj.id, + }) + new = request.registry.get('sale.order.line').create(request.cr, SUPERUSER_ID, vals, context=request.context) + request.registry.get('sale.option.line').write(request.cr, SUPERUSER_ID, [int(option)], {'add_to_line': True}, context=request.context) + return [new] + diff --git a/addons/website_sale_quote/models/order.py b/addons/website_sale_quote/models/order.py index 6c9424f4b3f..fe463c45a8f 100644 --- a/addons/website_sale_quote/models/order.py +++ b/addons/website_sale_quote/models/order.py @@ -33,11 +33,12 @@ class sale_quote_template(osv.osv): 'quote_line': fields.one2many('sale.quote.line', 'quote_id', 'Quote Template Lines'), 'note': fields.text('Terms and conditions'), } + def open_template(self, cr, uid, quote_id, context=None): return { 'type': 'ir.actions.act_url', 'target': 'self', - 'url': '/template/%d' % quote_id + 'url': '/template/%d' % quote_id[0] } @@ -86,6 +87,7 @@ class sale_order(osv.osv): 'access_token': fields.char('Security Token', size=256, required=True), 'template_id': fields.many2one('sale.quote.template', 'Quote Template'), 'website_description': fields.html('Description'), + 'options' : fields.one2many('sale.option.line', 'option_id', 'Optional Products Lines'), } _defaults = { 'access_token': lambda self, cr, uid, ctx={}: str(uuid.uuid4()) @@ -95,7 +97,7 @@ class sale_order(osv.osv): return { 'type': 'ir.actions.act_url', 'target': 'self', - 'url': '/quote/%d/%s' % (quote.id, quote.access_token) + 'url': '/quote/%s/%s' % (quote.id, quote.access_token) } def _get_sale_order_line(self, cr, uid, template_id, context=None): @@ -124,3 +126,31 @@ class sale_order(osv.osv): for line in order_line: products += line.product_id.product_tmpl_id.recommended_products(context=context) return products + +class sale_option_line(osv.osv): + _name = "sale.option.line" + _description = "Sale Options" + _columns = { + 'option_id': fields.many2one('sale.order', 'Sale Order Reference', required=True, ondelete='cascade', select=True), + 'name': fields.text('Description', required=True), + 'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True), + 'website_description': fields.html('Line Description'), + 'price_unit': fields.float('Unit Price', required=True), + 'add_to_line': fields.boolean('Add to Line'), + } + + def on_change_product_id(self, cr, uid, ids, product, context=None): + vals = {} + product_obj = self.pool.get('product.product').browse(cr, uid, product, context=context) + vals.update({ + 'price_unit': product_obj.list_price, + 'website_description': product_obj.website_description, + 'name': product_obj.name, + }) + return {'value': vals} + +class product_template(osv.Model): + _inherit = "product.template" + _columns = { + 'website_description': fields.html('Description for the website'), + } diff --git a/addons/website_sale_quote/sale_quote_view.xml b/addons/website_sale_quote/sale_quote_view.xml index 2935b082bed..8fb9baaac0b 100644 --- a/addons/website_sale_quote/sale_quote_view.xml +++ b/addons/website_sale_quote/sale_quote_view.xml @@ -10,6 +10,17 @@ + + + + + + + + + + + diff --git a/addons/website_sale_quote/static/src/js/sale_quote.js b/addons/website_sale_quote/static/src/js/sale_quote.js index 5e187816143..97345d2255f 100644 --- a/addons/website_sale_quote/static/src/js/sale_quote.js +++ b/addons/website_sale_quote/static/src/js/sale_quote.js @@ -20,5 +20,23 @@ $(document).ready(function () { }); return false; }); + + $('a.js_add_line_json').on('click', function (ev) { + ev.preventDefault(); + var $link = $(ev.currentTarget); + var href = $link.attr("href"); + var order = $link.attr("href").match(/order=([0-9]+)/); + var option = href.match(/add_line\/([0-9]+)/); + var product = $link.attr("href").match(/product=([0-9]+)/); + openerp.jsonRpc("/quote/add_line/", 'call', { + 'option': option[1], + 'order': order[1], + 'product': product[1], + }) + .then(function (data) { + location.reload(); + }); + return false; + }); }); //vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: diff --git a/addons/website_sale_quote/views/website_sale_quote.xml b/addons/website_sale_quote/views/website_sale_quote.xml index a5e2f8b9188..ae677990862 100644 --- a/addons/website_sale_quote/views/website_sale_quote.xml +++ b/addons/website_sale_quote/views/website_sale_quote.xml @@ -2,7 +2,34 @@ + + + + + + Bill To: + + Ship To: + + + + Ship to the same address + + + + Date: + + + Quotation #: + + @@ -19,18 +46,8 @@ - - - - - - - - - - - - + + @@ -76,6 +93,24 @@ + + + + + + + + + + + + + + + + + + @@ -137,66 +172,72 @@ - - - - Introduction - - - - - - - Pricing - Terms & Conditions - - - - - - - - - - Reason - - - - - - - - - + + + + + Introduction + + + + + + + Pricing + Terms & Conditions + - - - - - + + + + + + + + Reason + + + + + + + + + + + - - - - - + + + + + + + + + + - - - Customers who have bought this product also bought: + + + Optional Products & Services: - - - - - + + + + + + + + Add To Quotation + - +
+ Date: +
+ Quotation #: +