server-ux/sequence_reset_period/models/ir_sequence.py

74 lines
2.4 KiB
Python
Raw Normal View History

2024-05-03 09:21:24 +00:00
# Copyright (C) 2017 Creu Blanca
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from datetime import date as datetime_date
from datetime import timedelta
from dateutil.relativedelta import relativedelta
from flectra import fields, models
class IrSequence(models.Model):
_inherit = "ir.sequence"
range_reset = fields.Selection(
[
("daily", "Daily"),
("weekly", "Weekly"),
("monthly", "Monthly"),
("yearly", "Yearly"),
]
)
def _compute_date_from_to(self, date):
self.ensure_one()
date_from = date_to = date
if self.range_reset == "weekly":
date_from = date_from - timedelta(days=date_from.weekday())
date_to = date_from + timedelta(days=6)
elif self.range_reset == "monthly":
date_from = datetime_date(date_from.year, date_from.month, 1)
date_to = date_from + relativedelta(months=1)
date_to += relativedelta(days=-1)
elif self.range_reset == "yearly":
date_from = datetime_date(date_from.year, 1, 1)
date_to = datetime_date(date_from.year, 12, 31)
return date_from, date_to
def _create_date_range_seq(self, date):
self.ensure_one()
if not self.range_reset:
return super()._create_date_range_seq(date)
date_from, date_to = self._compute_date_from_to(date)
date_range = self.env["ir.sequence.date_range"].search(
[
("sequence_id", "=", self.id),
("date_from", ">=", date),
("date_from", "<=", date_to),
],
order="date_from desc",
limit=1,
)
if date_range:
date_to = date_range.date_from + timedelta(days=-1)
date_range = self.env["ir.sequence.date_range"].search(
[
("sequence_id", "=", self.id),
("date_to", ">=", date_from),
("date_to", "<=", date),
],
order="date_to desc",
limit=1,
)
if date_range:
date_from = date_range.date_to + timedelta(days=1)
seq_date_range = (
self.env["ir.sequence.date_range"]
.sudo()
.create(
{"date_from": date_from, "date_to": date_to, "sequence_id": self.id}
)
)
return seq_date_range