diff --git a/__manifest__.py b/__manifest__.py
index 6b38d2bd3821dc79d0dfba3e8c276eb7a5d5c6c7..ef28e86857fe1707e786677b883e45b7f3fb50a9 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -4,7 +4,7 @@
     "website": "https://le-filament.com",
     "version": "16.0.3.0.0",
     "license": "AGPL-3",
-    "depends": ["oacc_perimeter_api", "queue_job"],
+    "depends": ["oacc_perimeter_api", "queue_job_batch"],
     "data": [
         "security/ir.model.access.csv",
         # datas
diff --git a/models/__init__.py b/models/__init__.py
index b9c11d9d929c89108a38db6f9596ab8bfd372d52..0bfe83887345e306f4c7e95e4b904aedaef472a2 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,2 +1,3 @@
 from . import acc_enedis_cdc
 from . import acc_operation
+from . import queue_job_batch
diff --git a/models/acc_enedis_cdc.py b/models/acc_enedis_cdc.py
index 8f81a37ef2477a3d1bf8547d6c6ef8df3438a218..02e43967c8fdeee17bd43e7f23197dcaf5830daf 100644
--- a/models/acc_enedis_cdc.py
+++ b/models/acc_enedis_cdc.py
@@ -70,6 +70,11 @@ class AccEnedisCdc(models.Model):
         """
         operation._check_access_api()
 
+        batch_name = f"{operation.name} curves"
+        queue_batch = self.env["queue.job.batch"].get_new_batch(
+            batch_name, acc_operation_id=operation.id, batch_type="monthly_curves"
+        )
+
         # Si pas de PRM sélectionnés
         if not usage_point_cons_ids and not usage_point_prod_ids:
             # TODO: get only active PRMs on selected period instead of all ?
@@ -141,7 +146,9 @@ class AccEnedisCdc(models.Model):
                         + str(end_date_upd)
                     )
                     message += desc + "<br/>"
-                    self.with_delay(description=desc)._get_definitive_load_curves(
+                    self.with_context(job_batch=queue_batch).with_delay(
+                        description=desc
+                    )._get_definitive_load_curves(
                         operation, start_date_upd, end_date_upd, usage_point_id, "cons"
                     )
 
@@ -195,7 +202,9 @@ class AccEnedisCdc(models.Model):
                         + str(end_date_upd)
                     )
                     message += desc + "<br/>"
-                    self.with_delay(description=desc)._get_definitive_load_curves(
+                    self.with_context(job_batch=queue_batch).with_delay(
+                        description=desc
+                    )._get_definitive_load_curves(
                         operation,
                         start_date_upd,
                         end_date_upd,
@@ -225,6 +234,7 @@ class AccEnedisCdc(models.Model):
                 "acc_operation_id": operation.id,
             }
         )
+        return queue_batch
 
     @api.model
     def _get_definitive_load_curves(
@@ -297,7 +307,10 @@ class AccEnedisCdc(models.Model):
                 )._update_cdc_partner_id()
             message += "Fin du traitement des données\n"
         else:
-            message += f"Pas de données pour {usage_point_id.name } entre {str(start_date)} et {str(end_date)}"
+            message += (
+                f"Pas de données pour {usage_point_id.name } "
+                f"entre {str(start_date)} et {str(end_date)}"
+            )
 
         _logger.info(message)
         return message
diff --git a/models/acc_operation.py b/models/acc_operation.py
index d3631bac39f84424ebfc2dc9b8d3fbf32bf328e2..eb2c21f0db76fe2caa646aa0c9be115676f69383 100644
--- a/models/acc_operation.py
+++ b/models/acc_operation.py
@@ -1,9 +1,9 @@
 # Copyright 2021- Le Filament (https://le-filament.com)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
-from datetime import date, datetime, timedelta
 
-from odoo import models
+from odoo import fields, models
 from odoo.osv import expression
+from odoo.tools import date_utils
 
 from odoo.addons.api_connector.tools.date_utils import local_to_utc
 
@@ -38,43 +38,32 @@ class AccOperation(models.Model):
     # ------------------------------------------------------
     # Actions
     # ------------------------------------------------------
-    def _get_end_date(self):
-        """
-        Returns the first day of current month (last day to retrieve curves since
-        excluded in request)
-        """
-        return date(
-            day=1,
-            month=datetime.now().month,
-            year=datetime.now().year,
-        )
-
-    def _get_start_date(self):
-        """
-        Returns the first day of last month (first day to retrieve curves)
-        """
-        first_of_last_month = datetime.now().replace(day=1) - timedelta(days=1)
-        return date(
-            day=1,
-            month=first_of_last_month.month,
-            year=first_of_last_month.year,
-        )
 
     def _get_monthly_enedis_data(self, from_cron):
         """
         Overrides function from oacc_perimeter_api to request curves for last month
         """
+        # we want to retrieve data from last month
+        # start_date is first day of previous month
+        start_date, end_month = date_utils.get_month(
+            fields.Date.context_today(self) - date_utils.relativedelta(months=1)
+        )
+        # end_date is excluded so it should be first day of next month
+        end_date = end_month + date_utils.relativedelta(days=1)
+
+
         super()._get_monthly_enedis_data(from_cron)
+
         if from_cron:
-            self._remove_cdc(
-                start_date=self._get_start_date(), end_date=self._get_end_date()
-            )
-        self.env["acc.enedis.cdc"]._curves(
+            self._remove_cdc(start_date=start_date, end_date=end_date)
+
+        jobs = self.env["acc.enedis.cdc"]._curves(
             operation=self,
-            start_date=self._get_start_date(),
-            end_date=self._get_end_date(),
+            start_date=start_date,
+            end_date=end_date,
             from_cron=from_cron,
         )
+        jobs.enqueue()
 
     def _remove_cdc(self, start_date, end_date):
         """
diff --git a/models/queue_job_batch.py b/models/queue_job_batch.py
new file mode 100644
index 0000000000000000000000000000000000000000..92c2cb0a951b74b17417eeb13c7a9aa9e25e8bd1
--- /dev/null
+++ b/models/queue_job_batch.py
@@ -0,0 +1,20 @@
+from odoo import fields, models
+
+
+class QueueJobBatch(models.Model):
+    _inherit = ["queue.job.batch"]
+
+    acc_operation_id = fields.Many2one("acc.operation", string="Opération liée")
+
+    batch_type = fields.Selection(
+        [("monthly_curves", "Récupération automatique des courbes")]
+    )
+
+    def write(self, vals):
+        super().write(vals)
+        if self.acc_operation_id and self.state == "finished":
+            self.post_finished_action()
+
+    def post_finished_action(self):
+        if self.acc_operation_id and self.batch_type == "monthly_curves":
+            self.acc_operation_id.set_static_data()