Skip to content

Commit

Permalink
[FIX] product_contract: Compute date_start and date_end correctly. Ma…
Browse files Browse the repository at this point in the history
…ke fields computed
  • Loading branch information
sergio-teruel committed Jan 24, 2025
1 parent 891236a commit a3b606d
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 38 deletions.
1 change: 1 addition & 0 deletions product_contract/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ Contributors
- Ernesto Tejeda
- Pedro M. Baeza
- Carlos Roca
- Sergio Teruel

- David Jaen <[email protected]>

Expand Down
96 changes: 60 additions & 36 deletions product_contract/models/sale_order_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,16 @@ class SaleOrderLine(models.Model):
recurring_invoicing_type = fields.Selection(
related="product_id.recurring_invoicing_type"
)
date_start = fields.Date()
date_end = fields.Date()

date_start = fields.Date(compute="_compute_date_start", readonly=False, store=True)
date_end = fields.Date(compute="_compute_date_end", readonly=False, store=True)
contract_line_id = fields.Many2one(
comodel_name="contract.line",
string="Contract Line to replace",
required=False,
copy=False,
)
is_auto_renew = fields.Boolean(
string="Auto Renew",
compute="_compute_auto_renew",
default=False,
store=True,
readonly=False,
)
Expand Down Expand Up @@ -93,47 +90,74 @@ def _compute_contract_template_id(self):
rec.order_id.company_id
).property_contract_template_id

@api.depends("product_id", "order_id.date_order")
def _compute_date_start(self):
for sol in self:
if sol.contract_start_date_method == "start_this":
sol.date_start = sol.order_id.date_order.replace(day=1)
elif sol.contract_start_date_method == "end_this":
sol.date_start = (
sol.order_id.date_order
+ self.get_relative_delta(
sol.recurring_rule_type, sol.product_id.default_qty
)
).replace(day=1) - relativedelta(days=1)
elif sol.contract_start_date_method == "start_next":
# Dia 1 del siguiente recurring_rule_type
sol.date_start = (
sol.order_id.date_order
+ self.get_relative_delta(
sol.recurring_rule_type, sol.product_id.default_qty
)
).replace(day=1)
elif sol.contract_start_date_method == "end_next":
# Last day of next recurring period
sol.date_start = (
sol.order_id.date_order
+ self.get_relative_delta(
sol.recurring_rule_type, sol.product_id.default_qty + 1
)
).replace(day=1) - relativedelta(days=1)
else:
# Manual method
sol.date_start = False

@api.depends(
"order_id.date_order",
"is_auto_renew",
"date_start",
"auto_renew_interval",
"auto_renew_rule_type",
)
def _compute_date_end(self):
for sol in self:
if sol.is_auto_renew and sol.date_start:
sol.date_end = self.env["contract.line"]._get_first_date_end(
sol.date_start, sol.auto_renew_rule_type, sol.auto_renew_interval
)
else:
sol.date_end = False

@api.model
def get_relative_delta(self, recurring_rule_type, interval):
return self.env["contract.recurrency.mixin"].get_relative_delta(
recurring_rule_type, interval
)

def _get_auto_renew_rule_type(self):
"""monthly last day don't make sense for auto_renew_rule_type"""
self.ensure_one()
if self.recurring_rule_type == "monthlylastday":
return "monthly"
return self.recurring_rule_type

def _get_date_end(self):
self.ensure_one()
contract_start_date_method = self.product_id.contract_start_date_method
date_end = False
if contract_start_date_method == "manual":
contract_line_model = self.env["contract.line"]
date_end = (
self.date_start
+ contract_line_model.get_relative_delta(
self._get_auto_renew_rule_type(),
int(self.product_uom_qty),
)
- relativedelta(days=1)
)
return date_end

@api.depends("product_id")
def _compute_auto_renew(self):
for rec in self:
if rec.product_id.is_contract:
rec.product_uom_qty = rec.product_id.default_qty
contract_start_date_method = rec.product_id.contract_start_date_method
if contract_start_date_method == "manual":
rec.date_start = rec.date_start or fields.Date.today()
rec.date_end = rec._get_date_end()
rec.is_auto_renew = rec.product_id.is_auto_renew
if rec.is_auto_renew:
rec.auto_renew_interval = rec.product_id.auto_renew_interval
rec.auto_renew_rule_type = rec.product_id.auto_renew_rule_type

@api.onchange("date_start", "product_uom_qty")
def onchange_date_start(self):
for rec in self.filtered("product_id.is_contract"):
rec.date_end = rec._get_date_end() if rec.date_start else False
rec.product_uom_qty = rec.product_id.default_qty
rec.is_auto_renew = rec.product_id.is_auto_renew
rec.auto_renew_interval = rec.product_id.auto_renew_interval
rec.auto_renew_rule_type = rec.product_id.auto_renew_rule_type

def _get_contract_line_qty(self):
"""Returns the amount that will be placed in new contract lines."""
Expand Down
1 change: 1 addition & 0 deletions product_contract/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
- Ernesto Tejeda
- Pedro M. Baeza
- Carlos Roca
- Sergio Teruel
- David Jaen \<<[email protected]>\>
1 change: 1 addition & 0 deletions product_contract/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,7 @@ <h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<li>Ernesto Tejeda</li>
<li>Pedro M. Baeza</li>
<li>Carlos Roca</li>
<li>Sergio Teruel</li>
</ul>
</li>
<li>David Jaen &lt;<a class="reference external" href="mailto:david.jaen.revert&#64;gmail.com">david.jaen.revert&#64;gmail.com</a>&gt;</li>
Expand Down
4 changes: 2 additions & 2 deletions product_contract/wizards/product_contract_configurator.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,9 @@ def _compute_auto_renew(self):
def _get_auto_renew_rule_type(self):
"""monthly last day don't make sense for auto_renew_rule_type"""
self.ensure_one()
if self.recurring_rule_type == "monthlylastday":
if self.auto_renew_rule_type == "monthlylastday":
return "monthly"
return self.recurring_rule_type
return self.auto_renew_rule_type

def _get_date_end(self):
self.ensure_one()
Expand Down

0 comments on commit a3b606d

Please sign in to comment.