from odoo import models, fields, api, _, SUPERUSER_ID from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from datetime import datetime, timedelta, date class RefundWizard(models.TransientModel): _name = 'refund.wizard' _description = '批量退押' refund_type = fields.Selection([('out','外退'),('in','内退')],string='退押类型',default='out') refund_line_ids = fields.One2many('refund.wizard.line','refund_id',string='退押明细') start_index = fields.Date(string='生效时间', default=fields.Date.today()) payment_unit_ids = fields.Many2many('yuthon.property.company', string="付款单位") pay_unit_id = fields.Many2one('yuthon.property.company', string="收款单位") def confirm(self): deposit_management_type = self.env['yuthon.management.type'].search([('name', '=', '押金')], limit=1) if self.refund_type == 'out': bills_line_list = [] for line in self.refund_line_ids: existing_bill = self.env['property.bills.list'].search([ ('contract_id', '=', line.contract_id.id), ('due_date', '=', self.start_index), ('management_type_id', '=', deposit_management_type.id), ], limit=1) if existing_bill: continue bills_line_list.append({ 'lessor_id': line.contract_id.lessor_id.id, 'due_date': self.start_index, 'management_type_id': deposit_management_type.id, 'amount': line.deposit, 'contract_id': line.contract_id.id, }) if bills_line_list: self.env['property.bills.list'].create(bills_line_list) elif self.refund_type == 'in': for line in self.refund_line_ids: lessor_id = line.contract_id.lessor_id company_id = self.env['res.company'].search([('name', '=', '集团本部')], limit=1) if lessor_id.referred in ['天河物管']: company_id = self.env['res.company'].search([('name', '=', '天河物管')], limit=1) elif lessor_id.referred in ['天河粮储']: company_id = self.env['res.company'].search([('name', '=', '天河粮储')], limit=1) bank_accounts = self.env['property.bank.line'].search([ ('tenant_id', '=', line.lessee_id.id) ]).mapped('bank') bank_accounts = [acc for acc in bank_accounts if acc] bank_account = bank_accounts[0] if bank_accounts else False existing_receivable = self.env['property.accounts.receivable'].search([ ('contract_id', '=', line.contract_id.id), ('management_type_id', '=', deposit_management_type.id), ('due_date', '=', self.start_index), ('original_amount', '=', line.deposit), ('remark', '=', '出租方变更调整'), ], limit=1) if not existing_receivable: self.env['property.accounts.receivable'].create({ 'contract_id': line.contract_id.id, 'management_type_id': deposit_management_type.id, 'due_date': self.start_index, 'original_amount': line.deposit, 'remark': '出租方变更调整', }) existing_bank_statement = self.env['property.bank.statements'].sudo().search([ ('start_time', '=', self.start_index), ('original_amount', '=', line.deposit), ('name_account', '=', line.lessee_id.name), ('remake', '=', '出租方变更调整'), ], limit=1) if not existing_bank_statement and bank_account: bank_id = self.env['property.bank.statements'].sudo().create({ 'start_time': self.start_index, 'name': bank_account, 'original_amount': line.deposit, 'name_account': line.lessee_id.name, 'remake': '出租方变更调整', 'lending_direction': 'loan', 'company_id': company_id.id if company_id else False, 'your_own_unit': lessor_id.referred, 'your_own_account': lessor_id.rent_account, }) bank_id._compute_property_employee_id() class RefundWizardLine(models.TransientModel): _name = 'refund.wizard.line' _description = '退押明细' refund_id = fields.Many2one('refund.wizard',string='退押单') contract_id = fields.Many2one('property.lease.contract',string='合同编号') property_name = fields.Char(related='contract_id.property_name',string='物业名称') lessee_id = fields.Many2one(related='contract_id.lessee_id', string='承租方') lessor_id = fields.Many2one(related='contract_id.lessor_id', string='出租方') deposit= fields.Float(related='contract_id.deposit',string='押金')