Skip to content
Snippets Groups Projects
Commit 8818d2ad authored by emanuel buzey's avatar emanuel buzey
Browse files

Merge branch 'feature/IMP_energy_selfconsumption_invoicing_energy_delivered'...

Merge branch 'feature/IMP_energy_selfconsumption_invoicing_energy_delivered' into 'feature/IMP_send_invoicing_reminder'

# Conflicts:
#   energy_selfconsumption/__manifest__.py
#   energy_selfconsumption/models/contract.py
#   energy_selfconsumption/views/contract_views.xml
#   energy_selfconsumption/wizards/invoicing_wizard.py
#   energy_selfconsumption/wizards/invoicing_wizard_views.xml
parents c23e66d9 512388b6
No related branches found
No related tags found
No related merge requests found
Pipeline #64171 passed
This commit is part of merge request !246. Comments created here will be created in the context of that merge request.
......@@ -18,6 +18,43 @@ class Contract(models.Model):
supply_point_name = fields.Char(
related="supply_point_assignation_id.supply_point_id.name"
)
last_period_date_start = fields.Date(
string="Last Period Start",
readonly=True,
)
last_period_date_end = fields.Date(
string="Last Period End",
readonly=True,
)
def invoicing_wizard_action(self):
"""
We create the wizard first, so it triggers the constraint of the contract_ids
:return: Window action with the wizard already created
"""
wizard_id = self.env["energy_selfconsumption.invoicing.wizard"].create(
{"contract_ids": [(6, 0, self.ids)]}
)
action = self.env.ref(
"energy_selfconsumption.invoicing_wizard_act_window"
).read()[0]
action["res_id"] = wizard_id.id
return action
def _recurring_create_invoice(self, date_ref=False):
last_period_date_start = last_period_date_end = False
if len(self) > 1:
last_period_date_start = self[0].next_period_date_start
last_period_date_end = self[0].next_period_date_end
res = super()._recurring_create_invoice(date_ref=date_ref)
if res and last_period_date_start and last_period_date_end:
self.write(
{
"last_period_date_start": last_period_date_start,
"last_period_date_end": last_period_date_end,
}
)
return res
class ContractRecurrencyMixin(models.AbstractModel):
......
......@@ -72,7 +72,7 @@ class SupplyPointAssignation(models.Model):
@api.constrains("supply_point_id")
def constraint_supply_point_id(self):
for record in self:
supply_points = record.distribution_table_id.selfconsumption_project_id.project_id.inscription_ids.mapped(
supply_points = record.distribution_table_id.selfconsumption_project_id.inscription_ids.mapped(
"partner_id.supply_ids"
)
if record.supply_point_id.id not in supply_points.ids:
......
......@@ -5,12 +5,14 @@
<field name="name">energy_selfconsumption.contract.tree</field>
<field name="model">contract.contract</field>
<field name="arch" type="xml">
<tree string="Contracts">
<tree string="Contracts" expand="1">
<field name="partner_id" />
<field name="supply_point_name" />
<field name="code" />
<field name="next_period_date_start" />
<field name="next_period_date_end" />
<field name="last_period_date_start" />
<field name="last_period_date_end" />
</tree>
</field>
......@@ -39,6 +41,17 @@
</field>
</record>
<record id="contract_invoicing_wizard_action" model="ir.actions.server">
<field name="name">Invoice Energy Recurrency</field>
<field name="model_id" ref="model_contract_contract" />
<field name="binding_model_id" ref="contract.model_contract_contract" />
<field name="binding_type">action</field>
<field name="binding_view_types">list,form</field>
<field name="groups_id" eval="[(4,ref('energy_project.group_admin'))]" />
<field name="state">code</field>
<field name="code">action = records.invoicing_wizard_action()</field>
</record>
</data>
</odoo>
......@@ -6,12 +6,69 @@ class InvoicingWizard(models.TransientModel):
_name = "energy_selfconsumption.invoicing.wizard"
power = fields.Float(string="Total Energy Generated (kWh)")
contract_ids = fields.Many2many("contract.contract")
contract_ids = fields.Many2many("contract.contract", readonly=True)
next_period_date_start = fields.Date(
string="Next Period Start",
compute="_compute_next_period_date_start_and_end",
readonly=True,
)
next_period_date_end = fields.Date(
string="Next Period End",
compute="_compute_next_period_date_start_and_end",
readonly=True,
)
@api.depends("contract_ids")
def _compute_next_period_date_start_and_end(self):
for record in self:
if len(record.contract_ids) > 0:
record.next_period_date_start = record.contract_ids[
0
].next_period_date_start
record.next_period_date_end = record.contract_ids[
0
].next_period_date_end
@api.constrains("contract_ids")
def constraint_contract_ids(self):
for record in self:
contract_list = record.contract_ids
all_same_project = all(
element.project_id == contract_list[0].project_id
for element in contract_list
)
if not all_same_project:
raise ValidationError(
_(
"""
Some of the contract selected are not of the same self-consumption project.
Please make sure that you are invoicing for only the same self-consumption project ({project_name}.
"""
).format(
project_name=contract_list[0].project_id.selfconsumption_id.name
)
)
valid_invoicing_mode = ["energy_delivered"]
all_invoicing_mode = all(
element.project_id.selfconsumption_id.invoicing_mode
in valid_invoicing_mode
for element in contract_list
)
if not all_invoicing_mode:
raise ValidationError(
_(
"""
Some of the contract selected are not defined as energy delivered self-consumption projects.
Please make sure that you are invoicing the correct self-consumption project.
"""
)
)
all_equal_period = all(
element.next_period_date_start
== contract_list[0].next_period_date_start
......@@ -33,7 +90,27 @@ Next period end: {next_period_date_end}"""
)
)
@api.constrains("power")
def constraint_power(self):
for record in self:
if not record.power or record.power <= 0:
raise ValidationError(
_("You must enter a valid total energy generated (kWh).")
)
def generate_invoices(self):
for contract in self.contract_ids:
template_name = contract.contract_template_id.contract_line_ids[0].name
template_name += _("Energy Delivered: {energy_delivered} kWh")
contract.contract_line_ids.write(
{
"name": template_name.format(
energy_delivered=self.power,
code=contract.supply_point_assignation_id.supply_point_id.code,
owner_id=contract.supply_point_assignation_id.supply_point_id.owner_id.display_name,
)
}
)
return self.with_context(
{"energy_delivered": self.power}
).contract_ids._recurring_create_invoice()
......@@ -10,8 +10,20 @@
<form string="Invoicing Energy Delivered">
<sheet>
<group>
<field name="power" />
<field name="contract_ids" />
<field name="next_period_date_start" />
<field name="next_period_date_end" />
</group>
<group>
<field name="power" />
<field name="contract_ids">
<tree>
<field name="partner_id" />
<field name="supply_point_name" />
<field name="code" />
<field name="next_period_date_start" />
<field name="next_period_date_end" />
</tree>
</field>
</group>
</sheet>
<footer>
......@@ -25,13 +37,9 @@
<field name="name">Invoice Energy Delivered</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">energy_selfconsumption.invoicing.wizard</field>
<field name="binding_model_id" ref="contract.model_contract_contract" />
<field name="binding_type">action</field>
<field name="binding_view_types">list,form</field>
<field name="groups_id" eval="[(4,ref('energy_project.group_admin'))]" />
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="context">{'default_contract_ids': active_ids}</field>
</record>
</data>
</odoo>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment