mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-27 22:51:59 +02:00
Initial commit: Sale packages
This commit is contained in:
commit
14e3d26998
6469 changed files with 2479670 additions and 0 deletions
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
@ -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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue