diff --git a/energy_selfconsumption/models/selfconsumption.py b/energy_selfconsumption/models/selfconsumption.py index 8e7aafda9c14f2db366c0d2ab927a1f3abcaea0b..6fb264200ac3460e04cc28fd31eff0c942815e41 100644 --- a/energy_selfconsumption/models/selfconsumption.py +++ b/energy_selfconsumption/models/selfconsumption.py @@ -167,6 +167,10 @@ class Selfconsumption(models.Model): raise ValidationError(_("Project must have a valid CIL.")) if not record.power or record.power <= 0: raise ValidationError(_("Project must have a valid Rated Power.")) + if not record.invoicing_mode: + raise ValidationError( + _("Project must have defined a invoicing mode before activation.") + ) # Create ContractGenerationWizard contract_wizard = self.env[ diff --git a/energy_selfconsumption/tests/test_contract_generation_wizard.py b/energy_selfconsumption/tests/test_contract_generation_wizard.py index 70dedb2aec7acbb6daaa5bd76b3c9d3084970963..13d3eaafc28b18a87e010f8a06178b360ecb835d 100644 --- a/energy_selfconsumption/tests/test_contract_generation_wizard.py +++ b/energy_selfconsumption/tests/test_contract_generation_wizard.py @@ -66,18 +66,34 @@ class TestContractGenerationWizard(TransactionCase): "coefficient": 1, } ) + self.define_invoicing_mode_wizard = self.env[ + "energy_selfconsumption.define_invoicing_mode.wizard" + ].create( + { + "selfconsumption_id": self.selfconsumption.id, + "price": 0.1, + "recurrence_interval": 1, + "recurring_rule_type": "monthly", + "invoicing_mode": "power_acquired", + } + ) self.contract_generation_wizard = self.env[ "energy_selfconsumption.contract_generation.wizard" ].create( { - "price_energy": 0.1, - "recurring_interval": 1, - "recurring_rule_type": "monthly", "selfconsumption_id": self.selfconsumption.id, } ) def test_generation_contracts(self): + res = self.define_invoicing_mode_wizard.save_data_to_selfconsumption() + self.assertEqual( + res, + { + "type": "ir.actions.act_window_close", + }, + ) + res = self.contract_generation_wizard.generate_contracts_button() self.assertEqual(res, True) diff --git a/energy_selfconsumption/wizards/contract_generation_wizard.py b/energy_selfconsumption/wizards/contract_generation_wizard.py index 476967c1f85a7b6a3cfe32747c51410c6a84d07f..3a784ab8c8f1c21937bd9bd3ffec93ede1b33579 100644 --- a/energy_selfconsumption/wizards/contract_generation_wizard.py +++ b/energy_selfconsumption/wizards/contract_generation_wizard.py @@ -24,19 +24,6 @@ class ContractGenerationWizard(models.TransientModel): UserWarning: When no accounting journal is found. SomeException: When no distribution table in process of activation is found. """ - - product_id = self.selfconsumption_id.product_id - formula_contract_id = ( - self.selfconsumption_id.product_id.contract_template_id.contract_line_ids.qty_formula_id - ) - - # 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.")) - # Get distribution table distribution_id = ( self.selfconsumption_id.distribution_table_ids.filtered_domain( @@ -56,22 +43,24 @@ class ContractGenerationWizard(models.TransientModel): supply_point_assignation.supply_point_id.partner_id.name, ), "partner_id": supply_point_assignation.supply_point_id.partner_id.id, - "journal_id": journal_id.id, - "recurring_interval": self.selfconsumption_id.product_id.contract_template_id.recurring_interval, - "recurring_rule_type": self.selfconsumption_id.product_id.contract_template_id.recurring_rule_type, - "recurring_invoicing_type": "post-paid", + "project_id": self.selfconsumption_id.id, + "company_id": self.env.company.id, "date_start": fields.date.today(), "contract_template_id": self.selfconsumption_id.product_id.contract_template_id.id, } ) # We use the next method from the contract model to update the contract fields with contract template contract._onchange_contract_template_id() - # Now, we need to update the name field using the code and display_name fields - name = _("""CUPS: %s\nOwner: %s\nInvoicing period: #START# - #END#""") % ( - supply_point_assignation.supply_point_id.code, - supply_point_assignation.supply_point_id.owner_id.display_name, - ) - contract.contract_line_ids.name = name + for contract_line_id in contract.contract_line_ids: + contract_line_id.write( + { + "name": contract_line_id.name.format( + code=supply_point_assignation.supply_point_id.code, + owner_id=supply_point_assignation.supply_point_id.owner_id.display_name, + ), + "supply_point_assignation_id": supply_point_assignation.id, + } + ) # Update selfconsumption and distribution_table state self.selfconsumption_id.write({"state": "active"}) self.selfconsumption_id.distribution_table_state("process", "active") diff --git a/energy_selfconsumption/wizards/define_invoicing_mode_wizard.py b/energy_selfconsumption/wizards/define_invoicing_mode_wizard.py index b6e87f368f0d8e82c96e03dfb4439d0b10a9f896..49bec96f08abb24a978c7021921d3c2cad272ab7 100644 --- a/energy_selfconsumption/wizards/define_invoicing_mode_wizard.py +++ b/energy_selfconsumption/wizards/define_invoicing_mode_wizard.py @@ -71,7 +71,7 @@ class ContractGenerationWizard(models.TransientModel): "code": code, } - def _prepare_contract_values(self, journal_id, contract_line): + def _prepare_contract_template_values(self, journal_id, contract_line): return { "name": self.selfconsumption_id.name, "journal_id": journal_id.id, @@ -82,6 +82,18 @@ class ContractGenerationWizard(models.TransientModel): "recurring_invoicing_type": "post-paid", } + 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, + "uom_id": product_id.uom_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")) @@ -146,19 +158,14 @@ result = line.supply_point_assignation_id.distribution_table_id.selfconsumption_ ( 0, 0, - { - "product_id": product_id.id, - "automatic_price": True, - "company_id": self.env.company.id, - "qty_type": "variable", - "qty_formula_id": formula_contract_id.id, - "name": "", - }, + self._prepare_contract_line_template_values( + product_id, formula_contract_id + ), ) ] contract_template_id = self.env["contract.template"].create( - self._prepare_contract_values(journal_id, contract_line) + self._prepare_contract_template_values(journal_id, contract_line) ) product_id.write({"contract_template_id": contract_template_id.id})