2
0
account-financial-tools/account_loan/wizard/account_loan_post.py
2023-09-15 11:24:49 +02:00

95 lines
3.0 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class AccountLoanPost(models.TransientModel):
_name = "account.loan.post"
_description = 'Loan post'
@api.model
def _default_journal_id(self):
loan_id = self._context.get('default_loan_id')
if loan_id:
return self.env['account.loan'].browse(loan_id).journal_id.id
@api.model
def _default_account_id(self):
loan_id = self._context.get('default_loan_id')
if loan_id:
loan = self.env['account.loan'].browse(loan_id)
if loan.is_leasing:
return loan.leased_asset_account_id.id
else:
return loan.partner_id.with_context(
force_company=loan.company_id.id
).property_account_receivable_id.id
loan_id = fields.Many2one(
'account.loan',
required=True,
readonly=True,
)
journal_id = fields.Many2one(
'account.journal',
required=True,
default=_default_journal_id
)
account_id = fields.Many2one(
'account.account',
required=True,
default=_default_account_id
)
def move_line_vals(self):
res = list()
partner = self.loan_id.partner_id.with_context(
force_company=self.loan_id.company_id.id)
line = self.loan_id.line_ids.filtered(lambda r: r.sequence == 1)
res.append({
'account_id': self.account_id.id,
'partner_id': partner.id,
'credit': 0,
'debit': line.pending_principal_amount,
})
if (
line.pending_principal_amount -
line.long_term_pending_principal_amount > 0
):
res.append({
'account_id': self.loan_id.short_term_loan_account_id.id,
'credit': (line.pending_principal_amount -
line.long_term_pending_principal_amount),
'debit': 0,
})
if (
line.long_term_pending_principal_amount > 0 and
self.loan_id.long_term_loan_account_id
):
res.append({
'account_id': self.loan_id.long_term_loan_account_id.id,
'credit': line.long_term_pending_principal_amount,
'debit': 0,
})
return res
def move_vals(self):
return {
'loan_id': self.loan_id.id,
'date': self.loan_id.start_date,
'ref': self.loan_id.name,
'journal_id': self.journal_id.id,
'line_ids': [(0, 0, vals) for vals in self.move_line_vals()]
}
@api.multi
def run(self):
self.ensure_one()
if self.loan_id.state != 'draft':
raise UserError(_('Only loans in draft state can be posted'))
self.loan_id.post()
move = self.env['account.move'].create(self.move_vals())
move.post()