""" 客户联系人 合作伙伴模型扩展 """ from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class ResPartnerExtend(models.Model): """ 合作伙伴扩展 """ _inherit = "res.partner" @api.model def _get_default_account_pay(self): """ 创建客户。默认会计科目-应付 :return: """ pay_account = self.env["account.account"].search( [("account_type", "=", "payable"), ("fr_default_pay", "=", True)], limit=1 ) return pay_account @api.model def _get_default_account_recv(self): """ 创建客户。默认会计科目-应收 :return: """ recv_account = self.env["account.account"].search( # [("user_type_id.type", "=", "receivable"), ("fr_default_rec", "=", True)], limit=1 [("account_type", "=", "asset_receivable"), ("fr_default_rec", "=", True)], limit=1 ) return recv_account # 设置客户应收/应付账款科目的默认值 property_account_payable_id = fields.Many2one( default=_get_default_account_pay ) property_account_receivable_id = fields.Many2one( default=_get_default_account_recv ) @api.model def create(self, vals_list): """ 继承联系人创建方法,使在多公司创建联系人不选择公司时时,保证该联系人在每个公司的会计分录字段都为默认值。 :param vals_list: :return: """ res = super(ResPartnerExtend, self).create(vals_list) # 如果没有选择公司,则多公司字段会计分录需要为每个公司都创建一个。 if not vals_list.get('company_id'): company = self.env['res.company'].sudo().search([]) # 获取字段id payable_fields_id = self.env['ir.model.fields'].sudo().search( [('name', '=', 'property_account_payable_id'), ('model', '=', 'res.partner')]) receivable_fields_id = self.env['ir.model.fields'].sudo().search( [('name', '=', 'property_account_receivable_id'), ('model', '=', 'res.partner')]) for com in company: # 是当前公司则跳过 if com.id == self.env.company.id: continue # 获取该公司会计分录默认值 account_default_pay = self.env['account.account'].sudo().search( [("user_type_id.type", "=", "payable"), ("fr_default_pay", "=", True), ('company_id', '=', com.id)]) account_default_rec = self.env['account.account'].sudo().search( [("user_type_id.type", "=", "receivable"), ("fr_default_rec", "=", True), ('company_id', '=', com.id)]) # 如果有默认值,则为该联系人在该公司下创建记录(多公司字段保存在ir.property) if account_default_pay: self.env['ir.property'].sudo().create({ 'name': 'property_account_payable_id', 'res_id': 'res.partner,' + str(res.id), 'company_id': com.id, 'fields_id': payable_fields_id.id, 'value_reference': 'account.account,' + str(account_default_pay.id), 'type': 'many2one', }) if account_default_rec: self.env['ir.property'].sudo().create({ 'name': 'property_account_receivable_id', 'res_id': 'res.partner,' + str(res.id), 'company_id': com.id, 'fields_id': receivable_fields_id.id, 'value_reference': 'account.account,' + str(account_default_rec.id), 'type': 'many2one', }) return res def write(self, values): """ 重写联系人修改方法,使多公司下联系人公司修改为False时,保证该联系人在每个公司的会计分录字段都为默认值。 :param values: :return: """ res = super(ResPartnerExtend, self).write(values) # if values.get('company_id') is False and (self.is_company is True and self.parent_id is False): if values.get('company_id') is False: # 如果是公司并且有上级公司则不用设置 for partner in self: if partner.is_company and partner.parent_id is True: return res company = self.env['res.company'].sudo().search([]) # 获取字段id payable_fields_id = self.env['ir.model.fields'].sudo().search( [('name', '=', 'property_account_payable_id'), ('model', '=', 'res.partner')]) receivable_fields_id = self.env['ir.model.fields'].sudo().search( [('name', '=', 'property_account_receivable_id'), ('model', '=', 'res.partner')]) for com in company: # 是当前公司则跳过 if com.id == self.env.company.id: continue # 获取该公司会计分录默认值 account_default_pay = self.env['account.account'].sudo().search( [("user_type_id.type", "=", "payable"), ("fr_default_pay", "=", True), ('company_id', '=', com.id)]) account_default_rec = self.env['account.account'].sudo().search( [("user_type_id.type", "=", "receivable"), ("fr_default_rec", "=", True), ('company_id', '=', com.id)]) property_payable_id = self.env['ir.property'].sudo().search( [('company_id', '=', com.id), ('name', '=', 'property_account_payable_id'), ('res_id', '=', 'res.partner,' + str(partner.id))]) property_receivable_id = self.env['ir.property'].sudo().search( [('company_id', '=', com.id), ('name', '=', 'property_account_receivable_id'), ('res_id', '=', 'res.partner,' + str(partner.id))]) # 如果该公司已经有该条记录,则只需修改对应的值,否则需要新建 if property_payable_id: property_payable_id.write({ 'value_reference': 'account.account,' + str(account_default_pay.id) }) else: self.env['ir.property'].sudo().create({ 'name': 'property_account_payable_id', 'res_id': 'res.partner,' + str(partner.id), 'company_id': com.id, 'fields_id': payable_fields_id.id, 'value_reference': 'account.account,' + str(account_default_pay.id), 'type': 'many2one', }) # 如果该公司已经有该条记录,则只需修改对应的值,否则需要新建 if property_receivable_id: property_receivable_id.write({ 'value_reference': 'account.account,' + str(account_default_rec.id) }) else: self.env['ir.property'].sudo().create({ 'name': 'property_account_receivable_id', 'res_id': 'res.partner,' + str(partner.id), 'company_id': com.id, 'fields_id': receivable_fields_id.id, 'value_reference': 'account.account,' + str(account_default_rec.id), 'type': 'many2one', }) return res