summaryrefslogtreecommitdiff
path: root/addons/website_sale_delivery/models
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/models
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_sale_delivery/models')
-rw-r--r--addons/website_sale_delivery/models/__init__.py6
-rw-r--r--addons/website_sale_delivery/models/delivery.py11
-rw-r--r--addons/website_sale_delivery/models/res_country.py41
-rw-r--r--addons/website_sale_delivery/models/sale_order.py93
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