summaryrefslogtreecommitdiff
path: root/addons/website_sale_delivery/controllers/main.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_sale_delivery/controllers/main.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_sale_delivery/controllers/main.py')
-rw-r--r--addons/website_sale_delivery/controllers/main.py121
1 files changed, 121 insertions, 0 deletions
diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py
new file mode 100644
index 00000000..bd8a7649
--- /dev/null
+++ b/addons/website_sale_delivery/controllers/main.py
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import http, _
+from odoo.http import request
+from odoo.addons.website_sale.controllers.main import WebsiteSale
+from odoo.exceptions import UserError
+
+
+class WebsiteSaleDelivery(WebsiteSale):
+
+ @http.route(['/shop/payment'], type='http', auth="public", website=True)
+ def payment(self, **post):
+ order = request.website.sale_get_order()
+ carrier_id = post.get('carrier_id')
+ if carrier_id:
+ carrier_id = int(carrier_id)
+ if order:
+ order._check_carrier_quotation(force_carrier_id=carrier_id)
+ if carrier_id:
+ return request.redirect("/shop/payment")
+
+ 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)
+
+ @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)
+
+ if not int(carrier_id) in order._get_delivery_methods().ids:
+ raise UserError(_('It seems that a delivery method is not compatible with your address. Please refresh the page and try again.'))
+
+ Monetary = request.env['ir.qweb.field.monetary']
+
+ res = {'carrier_id': carrier_id}
+ carrier = request.env['delivery.carrier'].sudo().browse(int(carrier_id))
+ rate = carrier.rate_shipment(order)
+ if rate.get('success'):
+ tax_ids = carrier.product_id.taxes_id.filtered(lambda t: t.company_id == order.company_id)
+ if tax_ids:
+ fpos = order.fiscal_position_id
+ tax_ids = fpos.map_tax(tax_ids, carrier.product_id, order.partner_shipping_id)
+ taxes = tax_ids.compute_all(
+ rate['price'],
+ currency=order.currency_id,
+ quantity=1.0,
+ product=carrier.product_id,
+ partner=order.partner_shipping_id,
+ )
+ if request.env.user.has_group('account.group_show_line_subtotals_tax_excluded'):
+ rate['price'] = taxes['total_excluded']
+ else:
+ rate['price'] = taxes['total_included']
+
+ res['status'] = True
+ res['new_amount_delivery'] = Monetary.value_to_html(rate['price'], {'display_currency': order.currency_id})
+ res['is_free_delivery'] = not bool(rate['price'])
+ res['error_message'] = rate['warning_message']
+ else:
+ res['status'] = False
+ res['new_amount_delivery'] = Monetary.value_to_html(0.0, {'display_currency': order.currency_id})
+ 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)
+ return super(WebsiteSaleDelivery, self).order_lines_2_google_api(order_lines_not_delivery)
+
+ def order_2_return_dict(self, order):
+ """ Returns the tracking_cart dict of the order for Google analytics """
+ ret = super(WebsiteSaleDelivery, self).order_2_return_dict(order)
+ for line in order.order_line:
+ if line.is_delivery:
+ ret['transaction']['shipping'] = line.price_unit
+ return ret
+
+ def _get_shop_payment_values(self, order, **kwargs):
+ values = super(WebsiteSaleDelivery, self)._get_shop_payment_values(order, **kwargs)
+ has_storable_products = any(line.product_id.type in ['consu', 'product'] for line in order.order_line)
+
+ if not order._get_delivery_methods() and has_storable_products:
+ values['errors'].append(
+ (_('Sorry, we are unable to ship your order'),
+ _('No shipping method is available for your current order and shipping address. '
+ 'Please contact us for more information.')))
+
+ if has_storable_products:
+ if order.carrier_id and not order.delivery_rating_success:
+ order._remove_delivery_line()
+
+ delivery_carriers = order._get_delivery_methods()
+ values['deliveries'] = delivery_carriers.sudo()
+
+ values['delivery_has_storable'] = has_storable_products
+ values['delivery_action_id'] = request.env.ref('delivery.action_delivery_carrier_form').id
+ return values
+
+ def _update_website_sale_delivery_return(self, order, **post):
+ Monetary = request.env['ir.qweb.field.monetary']
+ carrier_id = int(post['carrier_id'])
+ currency = order.currency_id
+ if order:
+ return {
+ 'status': order.delivery_rating_success,
+ 'error_message': order.delivery_message,
+ 'carrier_id': carrier_id,
+ 'is_free_delivery': not bool(order.amount_delivery),
+ 'new_amount_delivery': Monetary.value_to_html(order.amount_delivery, {'display_currency': currency}),
+ 'new_amount_untaxed': Monetary.value_to_html(order.amount_untaxed, {'display_currency': currency}),
+ 'new_amount_tax': Monetary.value_to_html(order.amount_tax, {'display_currency': currency}),
+ 'new_amount_total': Monetary.value_to_html(order.amount_total, {'display_currency': currency}),
+ }
+ return {}