Initial commit: Sale packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:49 +02:00
commit 14e3d26998
6469 changed files with 2479670 additions and 0 deletions

View file

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import delivery
from . import res_country
from . import sale_order_line
from . import sale_order

View file

@ -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)

View file

@ -0,0 +1,39 @@
# -*- 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
res = res & states
return res

View file

@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
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)
@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, keep_carrier=False):
self.ensure_one()
DeliveryCarrier = self.env['delivery.carrier']
if self.only_services:
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 and not keep_carrier:
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):
# 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),
'|', ('company_id', '=', False), ('company_id', '=', self.company_id.id)
]).filtered(lambda carrier: carrier._is_available_for_order(self))
def _cart_update(self, *args, **kwargs):
""" Override to update carrier quotation if quantity changed """
self._remove_delivery_line()
return super()._cart_update(*args, **kwargs)

View file

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
def _show_in_cart(self):
# Exclude delivery line from showing up in the cart
return not self.is_delivery and super()._show_in_cart()