diff --git a/models/__init__.py b/models/__init__.py
index 409ca0eeb0396bf40db3ff393827934bf48e4f35..de5a756bf26a1a6f3566d999e1b838e272de85d2 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 0000000000000000000000000000000000000000..26699274cb09296bd9954c129046c45d64807974
--- /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