# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import fields, models from odoo.addons.base.models.res_partner import WARNING_MESSAGE, WARNING_HELP class ResPartner(models.Model): _inherit = 'res.partner' sale_order_count = fields.Integer(compute='_compute_sale_order_count', string='Sale Order Count') sale_order_ids = fields.One2many('sale.order', 'partner_id', 'Sales Order') sale_warn = fields.Selection(WARNING_MESSAGE, 'Sales Warnings', default='no-message', help=WARNING_HELP) sale_warn_msg = fields.Text('Message for Sales Order') def _compute_sale_order_count(self): # retrieve all children partners and prefetch 'parent_id' on them all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)]) all_partners.read(['parent_id']) sale_order_groups = self.env['sale.order'].read_group( domain=[('partner_id', 'in', all_partners.ids)], fields=['partner_id'], groupby=['partner_id'] ) partners = self.browse() for group in sale_order_groups: partner = self.browse(group['partner_id'][0]) while partner: if partner in self: partner.sale_order_count += group['partner_id_count'] partners |= partner partner = partner.parent_id (self - partners).sale_order_count = 0 def can_edit_vat(self): ''' Can't edit `vat` if there is (non draft) issued SO. ''' can_edit_vat = super(ResPartner, self).can_edit_vat() if not can_edit_vat: return can_edit_vat SaleOrder = self.env['sale.order'] has_so = SaleOrder.search([ ('partner_id', 'child_of', self.commercial_partner_id.id), ('state', 'in', ['sent', 'sale', 'done']) ], limit=1) return can_edit_vat and not bool(has_so)