2
0
account-financial-tools/account_spread_cost_revenue/wizards/account_spread_invoice_line_link_wizard.py
2023-10-17 13:51:31 +02:00

232 lines
9.1 KiB
Python

# Copyright 2018-2020 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
class AccountSpreadInvoiceLineLinkWizard(models.TransientModel):
_name = "account.spread.invoice.line.link.wizard"
_description = "Account Spread Invoice Line Link Wizard"
def _selection_spread_action_type(self):
base_selection = [
("template", _("Create from spread template")),
("new", _("Create new spread board")),
]
if not self.env.context.get("allow_spread_planning"):
return base_selection
link_selection = [
("link", _("Link to existing spread board")),
]
return link_selection + base_selection
def _selection_default_spread_action_type(self):
if not self.env.context.get("allow_spread_planning"):
return "template"
return "link"
invoice_line_id = fields.Many2one(
"account.move.line", readonly=True, required=True, ondelete="cascade"
)
invoice_id = fields.Many2one(related="invoice_line_id.move_id", readonly=True)
invoice_type = fields.Selection(
[
("out_invoice", "Customer Invoice"),
("in_invoice", "Vendor Bill"),
("out_refund", "Customer Credit Note"),
("in_refund", "Vendor Credit Note"),
],
compute="_compute_invoice_type",
store=True,
)
spread_type = fields.Selection(
[("sale", "Customer"), ("purchase", "Supplier")],
compute="_compute_invoice_type",
store=True,
)
spread_invoice_type_domain_ids = fields.One2many(
"account.spread",
compute="_compute_spread_invoice_type_domain",
)
spread_id = fields.Many2one(
"account.spread",
string="Spread Board",
domain="[('id', 'in', spread_invoice_type_domain_ids)]",
)
company_id = fields.Many2one("res.company", required=True)
spread_action_type = fields.Selection(
selection=_selection_spread_action_type,
default=_selection_default_spread_action_type,
)
template_id = fields.Many2one("account.spread.template", string="Spread Template")
use_invoice_line_account = fields.Boolean(
help="Use invoice line's account as Balance sheet / spread account.\n"
"In this case, user need to select expense/revenue account too.",
)
spread_account_id = fields.Many2one(
"account.account",
string="Balance sheet account / Spread account",
compute="_compute_spread_account",
readonly=False,
store=True,
)
exp_rev_account_id = fields.Many2one(
"account.account",
string="Expense/revenue account",
help="Optional account to overwrite the existing expense/revenue account",
)
spread_journal_id = fields.Many2one(
"account.journal",
string="Spread Journal",
compute="_compute_spread_journal",
readonly=False,
store=True,
)
@api.depends("invoice_line_id")
def _compute_invoice_type(self):
for wizard in self:
invoice = wizard.invoice_line_id.move_id
wizard.invoice_type = invoice.move_type
if invoice.is_sale_document(include_receipts=True):
wizard.spread_type = "sale"
else:
wizard.spread_type = "purchase"
@api.depends("invoice_type", "company_id")
def _compute_spread_journal(self):
for wizard in self:
journal_revenue = wizard.company_id.default_spread_revenue_journal_id
journal_expense = wizard.company_id.default_spread_expense_journal_id
if wizard.invoice_type in ("out_invoice", "in_refund"):
wizard.spread_journal_id = journal_revenue
else:
wizard.spread_journal_id = journal_expense
@api.depends("invoice_type", "company_id")
def _compute_spread_account(self):
for wizard in self:
acc_revenue = wizard.company_id.default_spread_revenue_account_id
acc_expense = wizard.company_id.default_spread_expense_account_id
if wizard.invoice_type in ("out_invoice", "in_refund"):
wizard.spread_account_id = acc_revenue
else:
wizard.spread_account_id = acc_expense
def _inverse_spread_journal_account(self):
"""Keep this for making the fields editable"""
@api.depends("company_id", "invoice_type")
def _compute_spread_invoice_type_domain(self):
for wizard in self:
spreads = self.env["account.spread"].search(
[
("invoice_id", "=", False),
("invoice_type", "=", wizard.invoice_type),
("company_id", "=", wizard.company_id.id),
]
)
wizard.spread_invoice_type_domain_ids = spreads
@api.onchange("use_invoice_line_account")
def _onchange_user_invoice_line_account(self):
self.spread_account_id = (
self.use_invoice_line_account and self.invoice_line_id.account_id or False
)
self.exp_rev_account_id = False
def confirm(self):
self.ensure_one()
if self.spread_action_type == "link":
if not self.invoice_line_id.spread_id:
self.invoice_line_id.spread_id = self.spread_id
return {
"name": _("Spread Details"),
"view_mode": "form",
"res_model": "account.spread",
"type": "ir.actions.act_window",
"target": "current",
"readonly": False,
"res_id": self.invoice_line_id.spread_id.id,
}
elif self.spread_action_type == "new":
debit_account = credit_account = self.spread_account_id
if self.invoice_type in ("out_invoice", "in_refund"):
credit_account = (
self.exp_rev_account_id or self.invoice_line_id.account_id
)
else:
debit_account = (
self.exp_rev_account_id or self.invoice_line_id.account_id
)
analytic_distribution = self.invoice_line_id.analytic_distribution
date_invoice = self.invoice_id.invoice_date or fields.Date.today()
return {
"name": _("New Spread Board"),
"view_type": "form",
"view_mode": "form",
"res_model": "account.spread",
"type": "ir.actions.act_window",
"target": "current",
"readonly": False,
"context": {
"default_name": self.invoice_line_id.name,
"default_invoice_type": self.invoice_type,
"default_invoice_line_id": self.invoice_line_id.id,
"default_use_invoice_line_account": self.use_invoice_line_account,
"default_debit_account_id": debit_account.id,
"default_credit_account_id": credit_account.id,
"default_journal_id": self.spread_journal_id.id,
"default_analytic_distribution": analytic_distribution,
"default_spread_date": date_invoice,
},
}
elif self.spread_action_type == "template":
if not self.invoice_line_id.spread_id:
account = self.invoice_line_id.account_id
spread_account_id = False
if self.template_id.use_invoice_line_account:
account = self.template_id.exp_rev_account_id
spread_account_id = self.invoice_line_id.account_id.id
spread_vals = self.template_id._prepare_spread_from_template(
spread_account_id=spread_account_id
)
date_invoice = self.invoice_id.invoice_date
date_invoice = date_invoice or self.template_id.start_date
date_invoice = date_invoice or fields.Date.today()
spread_vals["spread_date"] = date_invoice
spread_vals["name"] = ("%s %s") % (
spread_vals["name"],
self.invoice_line_id.name,
)
if spread_vals["invoice_type"] == "out_invoice":
spread_vals["credit_account_id"] = account.id
else:
spread_vals["debit_account_id"] = account.id
analytic_distribution = self.invoice_line_id.analytic_distribution
spread_vals["analytic_distribution"] = analytic_distribution
spread_vals["currency_id"] = self.invoice_id.currency_id.id
spread = self.env["account.spread"].create(spread_vals)
self.invoice_line_id.spread_id = spread
return {
"name": _("Spread Details"),
"view_mode": "form",
"res_model": "account.spread",
"type": "ir.actions.act_window",
"target": "current",
"readonly": False,
"res_id": self.invoice_line_id.spread_id.id,
}