diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py
index 4cf050cea7d..58a9e26a36b 100644
--- a/addons/website_sale_delivery/controllers/main.py
+++ b/addons/website_sale_delivery/controllers/main.py
@@ -29,6 +29,22 @@ class WebsiteSaleDelivery(WebsiteSale):
order._check_carrier_quotation(force_carrier_id=carrier_id)
return self._update_website_sale_delivery_return(order, **post)
+ @http.route(['/shop/carrier_rate_shipment'], type='json', auth='public', methods=['POST'], website=True)
+ def cart_carrier_rate_shipment(self, carrier_id, **kw):
+ order = request.website.sale_get_order(force_create=True)
+ res = {'carrier_id': carrier_id}
+ carrier = request.env['delivery.carrier'].browse(int(carrier_id))
+ rate = carrier.rate_shipment(order)
+ if rate.get('success'):
+ res['status'] = True
+ res['new_amount_delivery'] = rate['price']
+ res['error_message'] = rate['warning_message']
+ else:
+ res['status'] = False
+ res['new_amount_delivery'] = 0.0
+ res['error_message'] = rate['error_message']
+ return res
+
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)
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 f893f743a83..f2d775362ee 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
@@ -19,6 +19,7 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
* @override
*/
start: function () {
+ var self = this;
var $carriers = $('#delivery_carrier input[name="delivery_type"]');
// Workaround to:
// - update the amount/error on the label at first rendering
@@ -26,6 +27,18 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
if ($carriers.length > 0) {
$carriers.filter(':checked').click();
}
+
+ // Asynchronously retrieve every carrier price
+ _.each($carriers, function (carrierInput, k) {
+ self._showLoading($(carrierInput));
+ self._rpc({
+ route: '/shop/carrier_rate_shipment',
+ params: {
+ 'carrier_id': carrierInput.value,
+ },
+ }).then(self._handleCarrierUpdateResultBadge.bind(self));
+ });
+
return this._super.apply(this, arguments);
},
@@ -33,6 +46,14 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
// Private
//--------------------------------------------------------------------------
+ /**
+ * @private
+ * @param {jQuery} $carrierInput
+ */
+ _showLoading: function ($carrierInput) {
+ $carrierInput.siblings('.o_wsale_delivery_badge_price').addClass('d-none');
+ $carrierInput.siblings('.o_delivery_compute').removeClass('d-none').html('');
+ },
/**
* @private
* @param {Object} result
@@ -94,6 +115,7 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
*/
_onCarrierClick: function (ev) {
var $radio = $(ev.currentTarget).find('input[type="radio"]');
+ this._showLoading($radio);
$radio.prop("checked", true);
var $payButton = $('#o_payment_form_pay');
$payButton.prop('disabled', true);
diff --git a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml
index 96f3aae0cdd..0f802fe7d80 100644
--- a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml
+++ b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml
@@ -31,7 +31,7 @@
Free
-
+
Select to compute delivery rate