Skip to content
Snippets Groups Projects
define_invoicing_mode_wizard.py 6.04 KiB
Newer Older
from odoo.exceptions import UserError
from ..models.selfconsumption import INVOICING_VALUES


class ContractGenerationWizard(models.TransientModel):
    _name = "energy_selfconsumption.define_invoicing_mode.wizard"
    invoicing_mode = fields.Selection(
        INVOICING_VALUES,
        string="Invoicing Mode",
        default="power_acquired",
    )
    recurring_rule_type = fields.Selection(
    selfconsumption_id = fields.Many2one(
        "energy_selfconsumption.selfconsumption", readonly=True
    )

    def _prepare_product_values(self):
        account_income_xml_id = "l10n_es.%i_account_common_7050" % self.env.company.id
        account_income_id = self.env.ref(account_income_xml_id)
        account_tax_xml_id = (
            "l10n_es.%i_account_tax_template_s_iva21s" % self.env.company.id
        )
        account_tax_id = self.env.ref(account_tax_xml_id)
        uom_kw_id = self.env.ref("energy_project.kw_uom")
        return {
            "name": self.selfconsumption_id.name,
            "lst_price": self.price,
            "company_id": self.env.company.id,
            "property_account_income_id": account_income_id.id,
            "taxes_id": [account_tax_id.id],
            "sale_ok": True,
            "purchase_ok": False,
            "uom_id": uom_kw_id.id,
            "uom_po_id": uom_kw_id.id,
        }

    def _prepare_formula_values(self, code):
        return {
            "name": _("Formula - %s") % (self.selfconsumption_id.name),
            "code": code,
        }

    def _prepare_contract_template_values(self, journal_id, contract_line):
        return {
            "name": self.selfconsumption_id.name,
            "journal_id": journal_id.id,
            "company_id": self.env.company.id,
            "contract_line_ids": contract_line,
            "recurring_rule_type": self.recurring_rule_type,
    def _prepare_contract_line_template_values(self, product_id, formula_contract_id):
        return {
            "product_id": product_id.id,
            "automatic_price": True,
            "company_id": self.env.company.id,
            "qty_type": "variable",
            "qty_formula_id": formula_contract_id.id,
            # Values are formatted in contract_generation_wizard
            "name": """CUPS: {code}\nOwner: {owner_id}\nInvoicing period: #START# - #END#""",
    def save_data_to_selfconsumption(self):
        if self.invoicing_mode == "energy_delivered_variable":
            raise UserError(_("This invoicing mode is not yet implemented"))
        product_id = self.env["product.product"].create(self._prepare_product_values())

        # Create contract formula
        # TODO:Update formula energy_delivered and energy_delivered_variable.
        formula_contract_id = None
        if self.invoicing_mode == "power_acquired":
days_timedelta = line.next_period_date_end - line.next_period_date_start
if days_timedelta:
  # Add one so it counts the same day too (month = 29 + 1)
  days_between = days_timedelta.days + 1
else:
  days_between = 0
result = line.supply_point_assignation_id.distribution_table_id.selfconsumption_project_id.power * line.supply_point_assignation_id.coefficient *  days_between
"""
            formula_contract_id = self.env["contract.line.qty.formula"].create(
                self._prepare_formula_values(code)
            )
        elif self.invoicing_mode == "energy_delivered":
days_timedelta = line.next_period_date_end - line.next_period_date_start
if days_timedelta:
  # Add one so it counts the same day too (month = 29 + 1)
  days_between = days_timedelta.days + 1
  days_between = 0
result = line.supply_point_assignation_id.distribution_table_id.selfconsumption_project_id.power * line.supply_point_assignation_id.coefficient *  days_between
"""
            formula_contract_id = self.env["contract.line.qty.formula"].create(
                self._prepare_formula_values(code)
            )
        elif self.invoicing_mode == "energy_delivered_variable":
days_timedelta = line.next_period_date_end - line.next_period_date_start
if days_timedelta:
    # Add one so it counts the same day too (month = 29 + 1)
    days_between = days_timedelta.days + 1
else:
    days_between = 0
result = line.supply_point_assignation_id.distribution_table_id.selfconsumption_project_id.power * line.supply_point_assignation_id.coefficient * days_between
""",
            )
            formula_contract_id = self.env["contract.line.qty.formula"].create(
                self._prepare_formula_values(code)
        # Search accounting journal
        journal_id = self.env["account.journal"].search(
            [("company_id", "=", self.env.company.id), ("type", "=", "sale")], limit=1
        )
        if not journal_id:
            raise UserWarning(_("Accounting Journal not found."))

        # Create Contract Template
                self._prepare_contract_line_template_values(
                    product_id, formula_contract_id
                ),
        contract_template_id = self.env["contract.template"].create(
            self._prepare_contract_template_values(journal_id, contract_line)
        product_id.write({"contract_template_id": contract_template_id.id})

        self.selfconsumption_id.write(
            {
                "invoicing_mode": self.invoicing_mode,
                "product_id": product_id,
            }
        )

        return {
            "type": "ir.actions.act_window_close",
        }