mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-27 08:32:05 +02:00
19.0 vanilla
This commit is contained in:
parent
79f83631d5
commit
73afc09215
6267 changed files with 1534193 additions and 1130106 deletions
|
|
@ -1,30 +1,13 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.addons.website.models import ir_http
|
||||
from odoo import _, api, models
|
||||
from odoo.fields import Domain
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
last_website_so_id = fields.Many2one('sale.order', compute='_compute_last_website_so_id', string='Last Online Sales Order')
|
||||
|
||||
def _compute_last_website_so_id(self):
|
||||
SaleOrder = self.env['sale.order']
|
||||
for partner in self:
|
||||
is_public = partner.is_public
|
||||
website = ir_http.get_request_website()
|
||||
if website and not is_public:
|
||||
partner.last_website_so_id = SaleOrder.search([
|
||||
('partner_id', '=', partner.id),
|
||||
('pricelist_id', '=', partner.property_product_pricelist.id),
|
||||
('website_id', '=', website.id),
|
||||
('state', '=', 'draft'),
|
||||
], order='write_date desc', limit=1)
|
||||
else:
|
||||
partner.last_website_so_id = SaleOrder # Not in a website context or public User
|
||||
|
||||
@api.onchange('property_product_pricelist')
|
||||
def _onchange_property_product_pricelist(self):
|
||||
open_order = self.env['sale.order'].sudo().search([
|
||||
|
|
@ -45,22 +28,47 @@ class ResPartner(models.Model):
|
|||
),
|
||||
}}
|
||||
|
||||
def _get_current_partner(self, *, order_sudo=False, **kwargs):
|
||||
""" Override `portal` to get current partner from order_sudo if user is not signed up. """
|
||||
if order_sudo:
|
||||
return (
|
||||
(not order_sudo._is_anonymous_cart() and order_sudo.partner_id)
|
||||
or self.env['res.partner'] # Avoid returning public user's partner
|
||||
)
|
||||
return super()._get_current_partner(order_sudo=order_sudo, **kwargs)
|
||||
|
||||
def _get_frontend_writable_fields(self):
|
||||
""" Override `portal` to make website whitelist fields writable in portal address. """
|
||||
frontend_writable_fields = super()._get_frontend_writable_fields()
|
||||
frontend_writable_fields.update(
|
||||
self.env['ir.model']._get('res.partner')._get_form_writable_fields().keys()
|
||||
)
|
||||
|
||||
return frontend_writable_fields
|
||||
|
||||
def _get_order_fiscal_position_recompute_domain(self):
|
||||
"""Return a domain of sale orders for which we should recompute fiscal position after address update."""
|
||||
return Domain([
|
||||
('state', '=', 'draft'),
|
||||
('website_id', '!=', False),
|
||||
'|', ('partner_id', 'in', self.ids),
|
||||
('partner_shipping_id', 'in', self.ids),
|
||||
])
|
||||
|
||||
def write(self, vals):
|
||||
res = super().write(vals)
|
||||
if {'country_id', 'vat', 'zip'} & vals.keys():
|
||||
if {'country_id', 'vat', 'zip'} & vals.keys() and self:
|
||||
# Recompute fiscal position for open website orders
|
||||
orders_sudo = self.env['sale.order'].sudo().search([
|
||||
('state', '=', 'draft'),
|
||||
('website_id', '!=', False),
|
||||
'|', ('partner_id', 'in', self.ids), ('partner_shipping_id', 'in', self.ids),
|
||||
])
|
||||
if orders_sudo:
|
||||
fpos_by_order = {so.id: so.fiscal_position_id.id for so in orders_sudo}
|
||||
order_fpos_recompute_domain = self._get_order_fiscal_position_recompute_domain()
|
||||
if orders_sudo := self.env['sale.order'].sudo().search(order_fpos_recompute_domain):
|
||||
orders_by_fpos = orders_sudo.grouped('fiscal_position_id')
|
||||
self.env.add_to_compute(orders_sudo._fields['fiscal_position_id'], orders_sudo)
|
||||
fpos_changed = orders_sudo.filtered(
|
||||
lambda so: so.fiscal_position_id.id != fpos_by_order[so.id],
|
||||
)
|
||||
if fpos_changed:
|
||||
if fpos_changed := orders_sudo.filtered(
|
||||
lambda so: so not in orders_by_fpos.get(so.fiscal_position_id, []),
|
||||
):
|
||||
fpos_changed._recompute_taxes()
|
||||
fpos_changed._recompute_prices()
|
||||
# other modules may extend the orders to recompute for
|
||||
# non-draft orders (for ex. sale_subscription), we need
|
||||
# to ensure to only recompute prices for draft orders
|
||||
fpos_changed.filtered(lambda order: order.state == 'draft')._recompute_prices()
|
||||
return res
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue