From 756d739e5ac0331c84abff44188885de06cbd9ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com>
Date: Tue, 22 Nov 2022 19:18:34 +0100
Subject: [PATCH] [ADD] round timesheets

---
 models/__init__.py              |  1 +
 models/account_analytic_line.py | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 models/account_analytic_line.py

diff --git a/models/__init__.py b/models/__init__.py
index 409ca0e..de5a756 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,3 +1,4 @@
+from . import account_analytic_line
 from . import account_move
 from . import ecozimut_project_perf
 from . import project
diff --git a/models/account_analytic_line.py b/models/account_analytic_line.py
new file mode 100644
index 0000000..2669927
--- /dev/null
+++ b/models/account_analytic_line.py
@@ -0,0 +1,33 @@
+# © 2022 Le Filament (https://le-filament.com)
+# © Odoo (see https://github.com/odoo/odoo/blob/14.0/LICENSE)
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+
+from math import ceil
+
+from odoo import models
+
+
+class AccountAnalyticLine(models.Model):
+    _inherit = "account.analytic.line"
+
+    def _timesheet_preprocess(self, vals):
+        """
+        Update timesheet duration with rounding defined in timesheet configuration
+        """
+        vals = super()._timesheet_preprocess(vals)
+        if vals.get("unit_amount"):
+            minimum_duration = int(
+                self.env["ir.config_parameter"]
+                .sudo()
+                .get_param("hr_timesheet.timesheet_min_duration", 0)
+            )
+            rounding = int(
+                self.env["ir.config_parameter"]
+                .sudo()
+                .get_param("hr_timesheet.timesheet_rounding", 0)
+            )
+            minutes_spent = max(minimum_duration, vals.get("unit_amount") * 60)
+            if rounding and ceil(minutes_spent % rounding) != 0:
+                minutes_spent = ceil(minutes_spent / rounding) * rounding
+            vals["unit_amount"] = minutes_spent / 60
+        return vals
-- 
GitLab