diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index d39145da32c..78d8e3e2fc3 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -1104,23 +1104,6 @@ class WebsiteSale(http.Controller): phone_code=country.phone_code ) - @http.route(['/shop/update_carrier'], type='json', auth='public', methods=['POST'], website=True, csrf=False) - def update_eshop_carrier(self, **post): - results = {} - if hasattr(self, '_update_website_sale_delivery'): - results.update(self._update_website_sale_delivery(**post)) - - if hasattr(self, '_update_website_sale_coupon'): - results.update(self._update_website_sale_coupon(**post)) - - return results - - def _format_amount(self, amount, currency): - fmt = "%.{0}f".format(currency.decimal_places) - lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US') - return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ - .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}') - # -------------------------------------------------------------------------- # Products Search Bar # -------------------------------------------------------------------------- diff --git a/addons/website_sale_coupon/controllers/main.py b/addons/website_sale_coupon/controllers/main.py index 0e0c87e3d2f..2df0ed34fed 100644 --- a/addons/website_sale_coupon/controllers/main.py +++ b/addons/website_sale_coupon/controllers/main.py @@ -28,23 +28,6 @@ class WebsiteSale(WebsiteSale): order.recompute_coupon_lines() return super(WebsiteSale, self).cart(**post) - def _update_website_sale_coupon(self, **post): - order = request.website.sale_get_order() - order.recompute_coupon_lines() - free_shipping_lines = order._get_free_shipping_lines() - currency = order.currency_id - result = {} - if free_shipping_lines: - amount_free_shipping = sum(free_shipping_lines.mapped('price_subtotal')) - result.update({ - 'new_amount_delivery': self._format_amount(0.0, currency), - 'new_amount_untaxed': self._format_amount(order.amount_untaxed, currency), - 'new_amount_tax': self._format_amount(order.amount_tax, currency), - 'new_amount_total': self._format_amount(order.amount_total, currency), - 'new_amount_order_discounted': self._format_amount(order.reward_amount - amount_free_shipping, currency) - }) - return result - # Override # Add in the rendering the free_shipping_line def _get_shop_payment_values(self, order, **kwargs): diff --git a/addons/website_sale_coupon_delivery/__init__.py b/addons/website_sale_coupon_delivery/__init__.py new file mode 100644 index 00000000000..dd15b5c32e5 --- /dev/null +++ b/addons/website_sale_coupon_delivery/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import controllers diff --git a/addons/website_sale_coupon_delivery/__manifest__.py b/addons/website_sale_coupon_delivery/__manifest__.py new file mode 100644 index 00000000000..f6ea078f258 --- /dev/null +++ b/addons/website_sale_coupon_delivery/__manifest__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': "Free Delivery with Coupon on eCommerce", + 'summary': """Allows to offer free shippings in coupon reward on eCommerce""", + 'description': """Allows to offer free shippings in coupon reward on eCommerce""", + 'category': 'Website', + 'version': '1.0', + 'depends': ['website_sale_delivery', 'sale_coupon_delivery'], + 'data': [ + 'views/website_sale_coupon_delivery_templates.xml', + ], + 'auto_install': True, +} diff --git a/addons/website_sale_coupon_delivery/controllers/__init__.py b/addons/website_sale_coupon_delivery/controllers/__init__.py new file mode 100644 index 00000000000..5d4b25db9c0 --- /dev/null +++ b/addons/website_sale_coupon_delivery/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/addons/website_sale_coupon_delivery/controllers/main.py b/addons/website_sale_coupon_delivery/controllers/main.py new file mode 100644 index 00000000000..bd2190b1035 --- /dev/null +++ b/addons/website_sale_coupon_delivery/controllers/main.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from odoo import http +from odoo.addons.website_sale_delivery.controllers.main import WebsiteSaleDelivery +from odoo.http import request + + +class WebsiteSaleCouponDelivery(WebsiteSaleDelivery): + + @http.route() + def update_eshop_carrier(self, **post): + result = super(WebsiteSaleCouponDelivery, self).update_eshop_carrier(**post) + order = request.website.sale_get_order() + order.recompute_coupon_lines() + free_shipping_lines = order._get_free_shipping_lines() + if free_shipping_lines: + currency = order.currency_id + amount_free_shipping = sum(free_shipping_lines.mapped('price_subtotal')) + result.update({ + 'new_amount_delivery': self._format_amount(0.0, currency), + 'new_amount_untaxed': self._format_amount(order.amount_untaxed, currency), + 'new_amount_tax': self._format_amount(order.amount_tax, currency), + 'new_amount_total': self._format_amount(order.amount_total, currency), + 'new_amount_order_discounted': self._format_amount(order.reward_amount - amount_free_shipping, currency), + }) + return result diff --git a/addons/website_sale_coupon_delivery/static/src/js/website_sale_coupon_delivery.js b/addons/website_sale_coupon_delivery/static/src/js/website_sale_coupon_delivery.js new file mode 100644 index 00000000000..e8c04a04de6 --- /dev/null +++ b/addons/website_sale_coupon_delivery/static/src/js/website_sale_coupon_delivery.js @@ -0,0 +1,31 @@ +odoo.define('website_sale_coupon_delivery.checkout', function (require) { +'use strict'; + +var core = require('web.core'); +var publicWidget = require('web.public.widget'); +require('website_sale_delivery.checkout'); + +var _t = core._t; + +publicWidget.registry.websiteSaleDelivery.include({ + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + */ + _handleCarrierUpdateResult: function (result) { + this._super.apply(this, arguments); + if (result.new_amount_order_discounted) { + // Update discount of the order + $('#order_discounted').find('.oe_currency_value').text(result.new_amount_order_discounted); + + // We are in freeshipping, so every carrier is Free but we don't + // want to replace error message by 'Free' + $('#delivery_carrier .badge:not(.o_wsale_delivery_carrier_error)').text(_t('Free')); + } + }, +}); +}); diff --git a/addons/website_sale_coupon_delivery/views/website_sale_coupon_delivery_templates.xml b/addons/website_sale_coupon_delivery/views/website_sale_coupon_delivery_templates.xml new file mode 100644 index 00000000000..f42b869f009 --- /dev/null +++ b/addons/website_sale_coupon_delivery/views/website_sale_coupon_delivery_templates.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py index 6a111cb2212..4cf050cea7d 100644 --- a/addons/website_sale_delivery/controllers/main.py +++ b/addons/website_sale_delivery/controllers/main.py @@ -21,6 +21,14 @@ class WebsiteSaleDelivery(WebsiteSale): return super(WebsiteSaleDelivery, self).payment(**post) + @http.route(['/shop/update_carrier'], type='json', auth='public', methods=['POST'], website=True, csrf=False) + def update_eshop_carrier(self, **post): + order = request.website.sale_get_order() + carrier_id = int(post['carrier_id']) + if order: + order._check_carrier_quotation(force_carrier_id=carrier_id) + return self._update_website_sale_delivery_return(order, **post) + def order_lines_2_google_api(self, order_lines): """ Transforms a list of order lines into a dict for google analytics """ order_lines_not_delivery = order_lines.filtered(lambda line: not line.is_delivery) @@ -55,13 +63,6 @@ class WebsiteSaleDelivery(WebsiteSale): values['delivery_action_id'] = request.env.ref('delivery.action_delivery_carrier_form').id return values - def _update_website_sale_delivery(self, **post): - order = request.website.sale_get_order() - carrier_id = int(post['carrier_id']) - if order: - order._check_carrier_quotation(force_carrier_id=carrier_id) - return self._update_website_sale_delivery_return(order, **post) - def _update_website_sale_delivery_return(self, order, **post): carrier_id = int(post['carrier_id']) currency = order.currency_id @@ -76,3 +77,9 @@ class WebsiteSaleDelivery(WebsiteSale): 'new_amount_total': self._format_amount(order.amount_total, currency), } return {} + + def _format_amount(self, amount, currency): + fmt = "%.{0}f".format(currency.decimal_places) + lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US') + return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ + .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}') \ No newline at end of file diff --git a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js index 63a0ea6ab1b..c3d44bd9069 100644 --- a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js +++ b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js @@ -46,16 +46,6 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({ var $carrierBadge = $('#delivery_carrier input[name="delivery_type"][value=' + result.carrier_id + '] ~ .badge.d-none'); var $computeBadge = $('#delivery_carrier input[name="delivery_type"][value=' + result.carrier_id + '] ~ .o_delivery_compute'); - if (result.new_amount_order_discounted) { - // Cross module without bridge - // Update discount of the order - $('#order_discounted').find('.oe_currency_value').text(result.new_amount_order_discounted); - - // We are in freeshipping, so every carrier is Free but we don't - // want to replace error message by 'Free' - $('#delivery_carrier .badge:not(.o_wsale_delivery_carrier_error)').text(_t('Free')); - } - if (result.status === true) { // if free delivery (`free_over` field), show 'Free', not '$0' if (parseInt(result.new_amount_delivery)) {