You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
8.0 KiB
Python

8 months ago
"""
客户联系人
合作伙伴模型扩展
"""
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