from odoo import models, fields, api, _, SUPERUSER_ID from odoo.exceptions import UserError, ValidationError class BindingInformationWizard(models.Model): _name = 'binding.information.wizard' _description = '绑定信息弹窗' bank_id = fields.Many2one('property.bank.statements',string="银行") property_ids = fields.Many2many('yuthon.property', string='物业') contract_ids = fields.Many2many('property.lease.contract',string="新增绑定合同") lessee_ids = fields.Many2many('property.tenant.information', string="承租方") your_own_unit = fields.Char(string="账号单位") available_contract_ids = fields.Many2many( 'property.lease.contract', 'binding_information_wizard_available_contract_rel', 'wizard_id', 'contract_id', string='已绑定合同', ) @api.onchange('contract_ids') def onchange_contract_ids(self): if not self.contract_ids: return new_property_ids = [] for contract_id in self.contract_ids: for line in contract_id.lease_ids: if line.address_id: new_property_ids.append(line.address_id.id) new_property_ids = list(set(new_property_ids) - set(self.property_ids.ids)) if new_property_ids: self.property_ids = [(4, property_id) for property_id in new_property_ids] new_lessee_ids = [] for contract in self.contract_ids: if contract.lessee_id: new_lessee_ids.append(contract.lessee_id.id) new_lessee_ids = list(set(new_lessee_ids) - set(self.lessee_ids.ids)) if new_lessee_ids: self.lessee_ids = [(4, lid) for lid in new_lessee_ids] @api.onchange('bank_id') def _onchange_bank_id(self): """计算不可用的合同ID""" for record in self: record.available_contract_ids = [(6, 0, self.bank_id.contract_ids.ids)] if self.bank_id.contract_ids else [(5,)] def confirm(self): # 校验:合同出租方与银行流水公司必须匹配 if self.your_own_unit: for contract in self.contract_ids: if contract.lessor_id and contract.lessor_id.referred != self.your_own_unit: raise UserError(f"银行账户和【{contract.name}】出租方不匹配,无法绑定") if self.bank_id.name: latest_contract_ids = self.available_contract_ids + self.contract_ids # 根据银行账号查找承租方信息 bank_accounts = self.env['property.bank.line'].search([ ('bank', '=', self.bank_id.name), ('tenant_id.name', '!=', False), ]) if bank_accounts: for bank_account in bank_accounts: # 删除空记录 invalid_bank_lines = self.env['property.bank.line'].search([ ('name', '=', False), ('user', '=', False), ('bank', '=', False), ]) if invalid_bank_lines: invalid_bank_lines.unlink() old_lines = self.env['property.tenant.line'].search([ ('tenant_id', '=', bank_account.tenant_id.id) ]) if old_lines: old_lines.unlink() for contract_id in latest_contract_ids: self.env['property.tenant.line'].sudo().create({ 'tenant_id': bank_account.tenant_id.id, 'lease_contract_id': contract_id.id, }) if self.contract_ids: for new_contract in self.contract_ids: lessee_id = new_contract.lessee_id existing_bank = lessee_id.bank_ids.filtered( lambda b: b.bank == self.bank_id.name ) if not existing_bank: self.env['property.bank.line'].create({ 'tenant_id': lessee_id.id, 'bank': self.bank_id.name, 'user': self.bank_id.name_account, 'name': self.bank_id.bank_branch, }) else: if self.contract_ids: first_contract = self.contract_ids[0] lessee_id = first_contract.lessee_id bank_line = self.env['property.bank.line'].search( [('tenant_id', '=', lessee_id.id)], limit=1 ) name = bank_line.bank if not bank_line or not bank_line.bank: raise UserError(f"承租方【{lessee_id.name}】未填写银行账号,请补全信息后再操作!") for contract_id in self.contract_ids.ids: existing_line = self.env['property.tenant.line'].sudo().search([ ('tenant_id', '=', bank_line.id), ('lease_contract_id', '=', contract_id), ], limit=1) if not existing_line: self.env['property.tenant.line'].sudo().create({ 'tenant_id': bank_line.id, 'lease_contract_id': contract_id, }) self.bank_id.write({ 'name': name, }) self.bank_id._compute_property_employee_id() bank_accounts = self.bank_id.lessee_ids.bank_ids.mapped('bank') clean_accounts = [x for x in bank_accounts if x.strip() if x] bank_ids = self.env['property.bank.statements'].search([ ('name', 'in', clean_accounts), ('your_own_unit', '=', self.bank_id.your_own_unit), ('bank_state', '!=', 'reconciled'), ]) for bank_id in bank_ids: bank_id._compute_property_employee_id()