2
0
account-financial-tools/account_loan/wizards/account_loan_post.py
2023-09-28 16:47:31 +02:00

94 lines
3.1 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import Command, _, 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.env.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.env.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_company(
loan.company_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=lambda r: r._default_journal_id()
)
account_id = fields.Many2one(
"account.account", required=True, default=lambda r: r._default_account_id()
)
def move_line_vals(self):
res = list()
partner = self.loan_id.partner_id.with_company(self.loan_id.company_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": [Command.create(vals) for vals in self.move_line_vals()],
}
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.action_post()