diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 6641a460fe3..9151b6e810e 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -579,7 +579,7 @@ class PurchaseOrder(models.Model): 'narration': self.notes, 'currency_id': self.currency_id.id, 'invoice_user_id': self.user_id and self.user_id.id or self.env.user.id, - 'partner_id': partner_invoice, + 'partner_id': partner_invoice.id, 'fiscal_position_id': (self.fiscal_position_id or self.fiscal_position_id._get_fiscal_position(partner_invoice)).id, 'payment_reference': self.partner_ref or '', 'partner_bank_id': self.partner_id.bank_ids[:1].id, diff --git a/addons/sale/models/sale_order.py b/addons/sale/models/sale_order.py index 5583e54dc5d..cf392896f71 100644 --- a/addons/sale/models/sale_order.py +++ b/addons/sale/models/sale_order.py @@ -117,10 +117,6 @@ class SaleOrder(models.Model): return _('Terms & Conditions: %s', baseurl) return use_invoice_terms and self.env.company.invoice_terms or '' - @api.model - def _get_default_team(self): - return self.env['crm.team']._get_default_team_id() - def _search_invoice_ids(self, operator, value): if operator == 'in' and value: self.env.cr.execute(""" @@ -179,30 +175,31 @@ class SaleOrder(models.Model): create_date = fields.Datetime(string='Creation Date', readonly=True, index=True, help="Date on which sales order is created.") user_id = fields.Many2one( - 'res.users', string='Salesperson', index=True, tracking=2, default=lambda self: self.env.user, - compute='_compute_order_info_from_partner', store=True, readonly=False, + 'res.users', string='Salesperson', index=True, tracking=2, + compute='_compute_user_id', store=True, readonly=False, pre_compute=True, domain=lambda self: [('groups_id', 'in', self.env.ref('sales_team.group_sale_salesman').id)]) partner_id = fields.Many2one( - 'res.partner', string='Customer', readonly=True, pre_compute=True, - states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, + 'res.partner', string='Customer', readonly=False, pre_compute=True, + states={'sale': [('readonly', True)], 'done': [('readonly', True)], 'cancel': [('readonly', True)]}, required=True, change_default=True, index=True, tracking=1, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) partner_invoice_id = fields.Many2one( 'res.partner', string='Invoice Address', readonly=False, required=True, pre_compute=True, - states={'draft': [('done', True)], 'cancel': [('readonly', True)]}, + states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, compute='_compute_order_info_from_partner', store=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) partner_shipping_id = fields.Many2one( 'res.partner', string='Delivery Address', readonly=False, required=True, - states={'draft': [('done', True)], 'cancel': [('readonly', True)]}, + states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, compute='_compute_order_info_from_partner', store=True, pre_compute=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) pricelist_id = fields.Many2one( 'product.pricelist', string='Pricelist', check_company=True, # Unrequired company - required=True, readonly=True, pre_compute=True, - states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, + required=False, readonly=False, store=True, + compute='_compute_order_info_from_partner', pre_compute=True, + states={'sale': [('readonly', True)], 'done': [('readonly', True)], 'cancel': [('readonly', True)]}, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", tracking=1, help="If you change the pricelist, only newly added lines will be affected.") currency_id = fields.Many2one(related='pricelist_id.currency_id', depends=["pricelist_id"], store=True, ondelete="restrict") @@ -253,8 +250,8 @@ class SaleOrder(models.Model): team_id = fields.Many2one( 'crm.team', 'Sales Team', ondelete="set null", tracking=True, - compute='_compute_order_info_from_partner', store=True, readonly=False, - change_default=True, default=_get_default_team, check_company=True, # Unrequired company + compute='_compute_team_id', store=True, readonly=False, pre_compute=True, + change_default=True, check_company=True, # Unrequired company domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") signature = fields.Image('Signature', help='Signature received through the portal.', copy=False, attachment=True, max_width=1024, max_height=1024) @@ -440,18 +437,12 @@ class SaleOrder(models.Model): order = order.with_company(order.company_id) addr = order.partner_id.address_get(['delivery', 'invoice']) - partner_user = order.partner_id.user_id or order.partner_id.commercial_partner_id.user_id values = { 'pricelist_id': order.partner_id.property_product_pricelist and order.partner_id.property_product_pricelist.id or False, 'payment_term_id': order.partner_id.property_payment_term_id and order.partner_id.property_payment_term_id.id or False, 'partner_invoice_id': addr['invoice'], 'partner_shipping_id': addr['delivery'], } - user_id = partner_user.id - if not self.env.context.get('not_self_saleperson'): - user_id = user_id or self.env.context.get('default_user_id', self.env.uid) - if user_id and order.user_id.id != user_id: - values['user_id'] = user_id if self.env['ir.config_parameter'].sudo().get_param('account.use_invoice_terms'): if order.terms_type == 'html' and self.env.company.invoice_terms_html: @@ -459,18 +450,22 @@ class SaleOrder(models.Model): values['note'] = _('Terms & Conditions: %s', baseurl) elif not is_html_empty(self.env.company.invoice_terms): values['note'] = order.with_context(lang=order.partner_id.lang).env.company.invoice_terms - if not self.env.context.get('not_self_saleperson') or not order.team_id: - values['team_id'] = self.env['crm.team'].with_context( - default_team_id=order.partner_id.team_id.id - )._get_default_team_id(domain=['|', ('company_id', '=', self.company_id.id), ('company_id', '=', False)], user_id=user_id) order.update(values) - @api.onchange('user_id') - def onchange_user_id(self): - if self.user_id: - self.team_id = self.env['crm.team'].with_context( - default_team_id=self.team_id.id - )._get_default_team_id(user_id=self.user_id.id, domain=None) + @api.depends('partner_id') + def _compute_user_id(self): + for order in self: + order.user_id = order.partner_id.user_id or order.partner_id.commercial_partner_id.user_id or self.env.user + + @api.depends('partner_id', 'user_id') + def _compute_team_id(self): + for order in self: + order.team_id = self.env['crm.team'].with_context( + default_team_id=(order.team_id or order.partner_id.team_id).id + )._get_default_team_id( + user_id=self.user_id.id, + domain=[('company_id', 'in', [self.company_id.id, False])] + ) @api.onchange('partner_id') def _onchange_partner_id_warning(self): diff --git a/addons/sale/tests/test_sale_order.py b/addons/sale/tests/test_sale_order.py index 37d50eff4f7..a944d96ebea 100644 --- a/addons/sale/tests/test_sale_order.py +++ b/addons/sale/tests/test_sale_order.py @@ -534,7 +534,6 @@ class TestSaleOrder(TestSaleCommon): 'team_id': self.crm_team1.id }) sale_order.user_id = self.user_in_team - sale_order.onchange_user_id() self.assertEqual(sale_order.team_id.id, self.crm_team0.id, 'Should assign to team of sales person') def test_keep_sales_team_when_changing_user_with_no_team(self): @@ -544,7 +543,6 @@ class TestSaleOrder(TestSaleCommon): 'team_id': self.crm_team1.id }) sale_order.user_id = self.user_not_in_team - sale_order.onchange_user_id() self.assertEqual(sale_order.team_id.id, self.crm_team1.id, 'Should not reset the team to default') def test_onchange_packaging_00(self): diff --git a/addons/sale_stock/models/sale_order.py b/addons/sale_stock/models/sale_order.py index 6d98f0cd958..3c4343a87c6 100644 --- a/addons/sale_stock/models/sale_order.py +++ b/addons/sale_stock/models/sale_order.py @@ -17,12 +17,6 @@ _logger = logging.getLogger(__name__) class SaleOrder(models.Model): _inherit = "sale.order" - @api.model - def _default_warehouse_id(self): - # !!! Any change to the default value may have to be repercuted - # on _init_column() below. - return self.env.user._get_default_warehouse_id() - incoterm = fields.Many2one( 'account.incoterms', 'Incoterm', help="International Commercial Terms are a series of predefined commercial terms used in international transactions.") @@ -34,9 +28,10 @@ class SaleOrder(models.Model): ,help="If you deliver all products at once, the delivery order will be scheduled based on the greatest " "product lead time. Otherwise, it will be based on the shortest.") warehouse_id = fields.Many2one( - 'stock.warehouse', string='Warehouse', - required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, - default=_default_warehouse_id, check_company=True) + 'stock.warehouse', string='Warehouse', required=True, + compute='_compute_warehouse_id', store=True, readonly=False, pre_compute=True, + states={'sale': [('readonly', True)], 'done': [('readonly', False)], 'cancel': [('readonly', False)]}, + check_company=True) picking_ids = fields.One2many('stock.picking', 'sale_id', string='Transfers') delivery_count = fields.Integer(string='Delivery Orders', compute='_compute_picking_ids') procurement_group_id = fields.Many2one('procurement.group', 'Procurement Group', copy=False) @@ -155,17 +150,19 @@ class SaleOrder(models.Model): for order in self: order.delivery_count = len(order.picking_ids) - @api.onchange('company_id') - def _onchange_company_id(self): - if self.company_id: - warehouse_id = self.env['ir.default'].get_model_defaults('sale.order').get('warehouse_id') - self.warehouse_id = warehouse_id or self.user_id.with_company(self.company_id.id)._get_default_warehouse_id().id - - @api.onchange('user_id') - def onchange_user_id(self): - super().onchange_user_id() - if self.state in ['draft', 'sent']: - self.warehouse_id = self.user_id.with_company(self.company_id.id)._get_default_warehouse_id().id + @api.depends('user_id', 'company_id') + def _compute_warehouse_id(self): + default_warehouse_id = self.env['ir.default'].get_model_defaults('sale.order').get('warehouse_id') + for order in self: + if order.company_id and order.company_id != order._origin.company_id: + warehouse = default_warehouse_id + else: + warehouse = self.env['stock.warehouse'] + if order.state in ['draft', 'sent']: + order.warehouse_id = warehouse or order.user_id.with_company(order.company_id.id)._get_default_warehouse_id() + # In case we create a record in another state (eg: demo data, or business code) + if not order.warehouse_id: + order.warehouse_id = self.env.user._get_default_warehouse_id() @api.onchange('partner_shipping_id') def _onchange_partner_shipping_id(self): diff --git a/addons/sale_timesheet/wizard/project_create_sale_order.py b/addons/sale_timesheet/wizard/project_create_sale_order.py index f89f3999191..ca368aeaf6a 100644 --- a/addons/sale_timesheet/wizard/project_create_sale_order.py +++ b/addons/sale_timesheet/wizard/project_create_sale_order.py @@ -119,7 +119,6 @@ class ProjectCreateSalesOrder(models.TransientModel): }) # rewrite the user as the onchange_partner_id erases it sale_order.write({'user_id': self.project_id.user_id.id}) - sale_order.onchange_user_id() # create the sale lines, the map (optional), and assign existing timesheet to sale lines self._make_billable(sale_order)