from odoo import api, fields, models, _ class AccountPayment(models.Model): _inherit = 'account.payment' mt_contract_id = fields.Many2one( 'partner.contract.customer', string=_('Номер договора'), compute='_compute_mt_contract_id', store=True, readonly=False, help='Договор-основание платежа. Используется для ведения расчётов ' 'с контрагентом в разрезе договора (в т.ч. в РСБУ-слое).') @api.depends('partner_id', 'company_id', 'partner_type') def _compute_mt_contract_id(self): """Подставить договор контрагента по умолчанию. Для клиентских платежей — действующий (signed) клиентский договор партнёра в рамках компании; для платежей поставщикам — договор с поставщиком. Выбранный вручную договор не перезаписываем. """ Contract = self.env['partner.contract.customer'] for payment in self: if payment.mt_contract_id: continue if not payment.partner_id: payment.mt_contract_id = False continue partner = payment.partner_id.commercial_partner_id \ or payment.partner_id contract_type = 'customer' if payment.partner_type == 'customer' \ else 'supplier' domain = [ ('partner_id', '=', partner.id), ('type', '=', contract_type), ('is_template', '=', False), ] if payment.company_id: domain.append(('company_id', '=', payment.company_id.id)) contract = Contract.search( domain + [('state', '=', 'signed')], order='date_start desc', limit=1, ) or Contract.search(domain, order='date_start desc', limit=1) payment.mt_contract_id = contract.id if contract else False