diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/website_sale_delivery/models | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/website_sale_delivery/models')
| -rw-r--r-- | addons/website_sale_delivery/models/__init__.py | 6 | ||||
| -rw-r--r-- | addons/website_sale_delivery/models/delivery.py | 11 | ||||
| -rw-r--r-- | addons/website_sale_delivery/models/res_country.py | 41 | ||||
| -rw-r--r-- | addons/website_sale_delivery/models/sale_order.py | 93 |
4 files changed, 151 insertions, 0 deletions
diff --git a/addons/website_sale_delivery/models/__init__.py b/addons/website_sale_delivery/models/__init__.py new file mode 100644 index 00000000..45882aa3 --- /dev/null +++ b/addons/website_sale_delivery/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import res_country +from . import delivery +from . import sale_order diff --git a/addons/website_sale_delivery/models/delivery.py b/addons/website_sale_delivery/models/delivery.py new file mode 100644 index 00000000..6b14ba80 --- /dev/null +++ b/addons/website_sale_delivery/models/delivery.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class DeliveryCarrier(models.Model): + _name = 'delivery.carrier' + _inherit = ['delivery.carrier', 'website.published.multi.mixin'] + + website_description = fields.Text(related='product_id.description_sale', string='Description for Online Quotations', readonly=False) diff --git a/addons/website_sale_delivery/models/res_country.py b/addons/website_sale_delivery/models/res_country.py new file mode 100644 index 00000000..30f4d43e --- /dev/null +++ b/addons/website_sale_delivery/models/res_country.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResCountry(models.Model): + _inherit = 'res.country' + + def get_website_sale_countries(self, mode='billing'): + res = super(ResCountry, self).get_website_sale_countries(mode=mode) + if mode == 'shipping': + countries = self.env['res.country'] + + delivery_carriers = self.env['delivery.carrier'].sudo().search([('website_published', '=', True)]) + for carrier in delivery_carriers: + if not carrier.country_ids and not carrier.state_ids: + countries = res + break + countries |= carrier.country_ids + + res = res & countries + return res + + def get_website_sale_states(self, mode='billing'): + res = super(ResCountry, self).get_website_sale_states(mode=mode) + + states = self.env['res.country.state'] + if mode == 'shipping': + dom = ['|', ('country_ids', 'in', self.id), ('country_ids', '=', False), ('website_published', '=', True)] + delivery_carriers = self.env['delivery.carrier'].sudo().search(dom) + + for carrier in delivery_carriers: + if not carrier.country_ids or not carrier.state_ids: + states = res + break + states |= carrier.state_ids + if not states: + states = states.search([('country_id', '=', self.id)]) + res = res & states + return res diff --git a/addons/website_sale_delivery/models/sale_order.py b/addons/website_sale_delivery/models/sale_order.py new file mode 100644 index 00000000..8348b35a --- /dev/null +++ b/addons/website_sale_delivery/models/sale_order.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import logging + +from odoo import api, fields, models + +_logger = logging.getLogger(__name__) + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + amount_delivery = fields.Monetary( + compute='_compute_amount_delivery', + string='Delivery Amount', + help="The amount without tax.", store=True, tracking=True) + + def _compute_website_order_line(self): + super(SaleOrder, self)._compute_website_order_line() + for order in self: + order.website_order_line = order.website_order_line.filtered(lambda l: not l.is_delivery) + + @api.depends('order_line.price_unit', 'order_line.tax_id', 'order_line.discount', 'order_line.product_uom_qty') + def _compute_amount_delivery(self): + for order in self: + if self.env.user.has_group('account.group_show_line_subtotals_tax_excluded'): + order.amount_delivery = sum(order.order_line.filtered('is_delivery').mapped('price_subtotal')) + else: + order.amount_delivery = sum(order.order_line.filtered('is_delivery').mapped('price_total')) + + def _check_carrier_quotation(self, force_carrier_id=None): + self.ensure_one() + DeliveryCarrier = self.env['delivery.carrier'] + + if self.only_services: + self.write({'carrier_id': None}) + self._remove_delivery_line() + return True + else: + self = self.with_company(self.company_id) + # attempt to use partner's preferred carrier + if not force_carrier_id and self.partner_shipping_id.property_delivery_carrier_id: + force_carrier_id = self.partner_shipping_id.property_delivery_carrier_id.id + + carrier = force_carrier_id and DeliveryCarrier.browse(force_carrier_id) or self.carrier_id + available_carriers = self._get_delivery_methods() + if carrier: + if carrier not in available_carriers: + carrier = DeliveryCarrier + else: + # set the forced carrier at the beginning of the list to be verfied first below + available_carriers -= carrier + available_carriers = carrier + available_carriers + if force_carrier_id or not carrier or carrier not in available_carriers: + for delivery in available_carriers: + verified_carrier = delivery._match_address(self.partner_shipping_id) + if verified_carrier: + carrier = delivery + break + self.write({'carrier_id': carrier.id}) + self._remove_delivery_line() + if carrier: + res = carrier.rate_shipment(self) + if res.get('success'): + self.set_delivery_line(carrier, res['price']) + self.delivery_rating_success = True + self.delivery_message = res['warning_message'] + else: + self.set_delivery_line(carrier, 0.0) + self.delivery_rating_success = False + self.delivery_message = res['error_message'] + + return bool(carrier) + + def _get_delivery_methods(self): + address = self.partner_shipping_id + # searching on website_published will also search for available website (_search method on computed field) + return self.env['delivery.carrier'].sudo().search([('website_published', '=', True)]).available_carriers(address) + + def _cart_update(self, product_id=None, line_id=None, add_qty=0, set_qty=0, **kwargs): + """ Override to update carrier quotation if quantity changed """ + + self._remove_delivery_line() + + # When you update a cart, it is not enouf to remove the "delivery cost" line + # The carrier might also be invalid, eg: if you bought things that are too heavy + # -> this may cause a bug if you go to the checkout screen, choose a carrier, + # then update your cart (the cart becomes uneditable) + self.write({'carrier_id': False}) + + values = super(SaleOrder, self)._cart_update(product_id, line_id, add_qty, set_qty, **kwargs) + + return values |
