diff --git a/__manifest__.py b/__manifest__.py
index 2cb8596feea56970af84e38fb35a07532eb4742b..260d55a887ba5f5558502c068ea972b88e51ae3f 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -3,19 +3,30 @@
     "summary": "Module de gestion des clés de répartitions enedis OACC",
     "author": "Le Filament",
     "website": "https://le-filament.com",
-    "version": "16.0.1.0.0",
+    "version": "16.0.2.0.0",
     "license": "AGPL-3",
     "depends": ["oacc", "api_enedis_acc", "queue_job"],
     "data": [
         "security/ir.model.access.csv",
         # datas
         # wizard
-        "wizard/acc_repartition_keys_wizard_views.xml",
+        "wizard/acc_repartition_keys_file_wizard_views.xml",
+        "wizard/acc_repartition_keys_compute_wizard_views.xml",
         # views
         "views/acc_operation_views.xml",
         "views/acc_repartition_keys_views.xml",
+        "views/acc_priority_group_counter_views.xml",
+        "views/acc_priority_group_views.xml",
+        "views/acc_repartition_counter_views.xml",
         # views menu
+        "views/menu_views.xml",
     ],
+    "assets": {
+        "web.assets_backend": [
+            "/oacc_repartition_keys/static/src/js/kanban_button.js",
+            "/oacc_repartition_keys/static/src/xml/kanban_button.xml",
+        ],
+    },
     "installable": True,
     "auto_install": False,
 }
diff --git a/migrations/16.0.2.0.0/pre-migration.py b/migrations/16.0.2.0.0/pre-migration.py
new file mode 100644
index 0000000000000000000000000000000000000000..52618619973d447cd4a050e43668f645ad208303
--- /dev/null
+++ b/migrations/16.0.2.0.0/pre-migration.py
@@ -0,0 +1,14 @@
+# Copyright 2023- Le Filament (https://le-filament.com)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+from openupgradelib import openupgrade
+
+
+@openupgrade.migrate()
+def migrate(env, version):
+    # Rename models to preserve fields during upgrade
+    openupgrade.rename_models(
+        env.cr, [("acc.repartition.keys", "acc.repartition.keys.file")]
+    )
+    openupgrade.rename_tables(
+        env.cr, [("acc_repartition_keys", "acc_repartition_keys_file")]
+    )
diff --git a/models/__init__.py b/models/__init__.py
index 183168978d7da2e5bc4b899455e45738c23fa71c..d790d852cab00995333cca45298f2e5a0269c708 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,2 +1,6 @@
 from . import acc_operation
 from . import acc_repartition_keys
+from . import acc_repartition_keys_file
+from . import acc_priority_group
+from . import acc_priority_group_counter
+from . import acc_repartition_counter
diff --git a/models/acc_operation.py b/models/acc_operation.py
index cdead838e9f723bd4e686fec594390bae77e7a2f..f43c4c39e400f88459bf159eea59ee29bdcf5919 100644
--- a/models/acc_operation.py
+++ b/models/acc_operation.py
@@ -1,10 +1,15 @@
 # Copyright 2021- Le Filament (https://le-filament.com)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
-import logging
+import base64
+import csv
+from collections import OrderedDict
+from datetime import date, datetime
+from io import StringIO
 
-from odoo import fields, models
+from odoo import _, api, fields, models
+from odoo.exceptions import UserError, ValidationError
 
-_logger = logging.getLogger(__name__)
+from odoo.addons.api_connector.tools.date_utils import utc_to_local
 
 
 class AccOperation(models.Model):
@@ -13,13 +18,47 @@ class AccOperation(models.Model):
     # ------------------------------------------------------
     # Fields declaration
     # ------------------------------------------------------
-    keys_repartition_ids = fields.One2many(
+    keys_file_repartition_ids = fields.One2many(
+        comodel_name="acc.repartition.keys.file",
+        inverse_name="operation_id",
+        string="keys files repartition",
+        required=False,
+        groups="oacc.group_operation_superadmin",
+    )
+
+    repartition_keys_id = fields.One2many(
         comodel_name="acc.repartition.keys",
         inverse_name="operation_id",
-        string="keys repartition",
+        string="Repartition key",
         required=False,
         groups="oacc.group_operation_superadmin",
     )
+
+    acc_priority_group_ids = fields.One2many(
+        comodel_name="acc.priority.group",
+        inverse_name="acc_operation_id",
+        string="Groupe de priorité",
+    )
+
+    # uniquement pour des question d affichage
+    type_algo = fields.Selection(
+        [
+            ("prorata", "Dynamique par défaut"),
+            ("static", "Statique"),
+            ("dyn_perso_send", "Dynamique personalisée - envoi de fichier"),
+            ("dyn_perso_compute", "Dynamique personalisée - calcul automatisé"),
+        ],
+        string="Type de clé de répartition",
+        default="prorata",
+        required=True,
+    )
+
+    algo_description = fields.Text(
+        string="Description de l algorithme",
+        default="La clé de répartition est calculée automatiquement chaque mois, "
+        "au prorata de la consommation de chacun des consommateurs",
+    )
+
     # ------------------------------------------------------
     # SQL Constraints
     # ------------------------------------------------------
@@ -27,6 +66,82 @@ class AccOperation(models.Model):
     # ------------------------------------------------------
     # Default methods
     # ------------------------------------------------------
+    def compute_repartition(self):
+        """
+        compute task wich compute keys and generate csv file
+        """
+        self.generate()
+
+    def delete_keys(self):
+        repartitions = self.env["acc.repartition.keys"].search(
+            [("operation_id", "=", self.id)]
+        )
+        for repartition in repartitions:
+            keys = self.env["acc.repartition.counter"].search(
+                [("acc_repartition_id", "=", repartition.id)]
+            )
+            keys.unlink()
+
+        for repartition in repartitions:
+            repartition.unlink()
+
+    def generate(self):
+        """
+        generate repartition keys
+        """
+
+        if not self.acc_priority_group_ids:
+            raise ValidationError(
+                _("Aucune priorité n'est définie pour cette opération.")
+            )
+
+        self.delete_keys()
+
+        repartition = self.env["acc.repartition.keys"].create({"operation_id": self.id})
+
+        data = None
+        for piority in self.acc_priority_group_ids:
+            data = piority.compute(data)
+
+        if not data:
+            raise ValidationError(
+                _("Pas de données brute pour le mois précedent présente")
+            )
+        # todo : ajouter la verification de coherence des données
+        for slot in data:
+            affect = data.get(slot).get("affect")
+            if affect:
+                total_affecte = sum(affect.values())
+                for counter in affect:
+                    counter_id = self.env["acc.counter"].search(
+                        [("name", "=", counter)]
+                    )
+                    if total_affecte == 0:
+                        weight = 0.0
+                    else:
+                        weight = round((affect.get(counter) * 100) / total_affecte, 8)
+                    self.env["acc.repartition.counter"].create(
+                        {
+                            "acc_repartition_id": repartition.id,
+                            "time_slot": slot,
+                            "weight": weight,
+                            "acc_counter_id": counter_id.id,
+                        }
+                    )
+            else:
+                # aucune consommation n a été affecté, on envoi des clé a zero
+                for counter in data.get(slot).get("conso"):
+                    counter_id = self.env["acc.counter"].search(
+                        [("name", "=", counter)]
+                    )
+                    self.env["acc.repartition.counter"].create(
+                        {
+                            "acc_repartition_id": repartition.id,
+                            "time_slot": slot,
+                            "weight": 0,
+                            "acc_counter_id": counter_id.id,
+                        }
+                    )
 
     # ------------------------------------------------------
     # Computed fields / Search Fields
@@ -36,6 +151,20 @@ class AccOperation(models.Model):
     # Onchange / Constraints
     # ------------------------------------------------------
 
+    @api.onchange("type_algo")
+    def on_change_algo(self):
+        desc = {
+            "prorata": "La clé de répartition est calculée automatiquement chaque mois,"
+            " au prorata de la consommation de chacun des consommateurs.",
+            "static": "La clé de répartition est calculée automatiquement chaque mois, "
+            "en fonction des coefficients de répartition communiqués "
+            "initialement à Enedis.",
+            "dyn_perso_send": "",
+            "dyn_perso_compute": "",
+        }
+
+        self.algo_description = desc.get(self.type_algo)
+
     # ------------------------------------------------------
     # CRUD methods (ORM overrides)
     # ------------------------------------------------------
@@ -43,3 +172,159 @@ class AccOperation(models.Model):
     # ------------------------------------------------------
     # Actions
     # ------------------------------------------------------
+    def action_view_repartition_algo_priority_group(self):
+        """
+        Action pour accéder aux algo de calcul defini
+        """
+
+        action = self.env["ir.actions.actions"]._for_xml_id(
+            "oacc_repartition_keys.acc_priority_group_counter_act_window"
+        )
+
+        action["context"] = {
+            "default_acc_operation_id": self.id,
+        }
+        action["domain"] = [("acc_operation_id", "=", self.id)]
+        action["res_id"] = self.id
+
+        return action
+
+    def action_send_repartition_keys(self):
+        """
+        Action d envoi des clés calculées a Enedis
+        """
+        repartition = self.env["acc.repartition.keys"].search(
+            [("operation_id", "=", self.id)]
+        )
+
+        if not repartition:
+            raise UserError(_("Clés de répartition non générées"))
+
+        keys = (
+            self.env["acc.repartition.counter"]
+            .search([("acc_repartition_id", "=", repartition.id)])
+            .mapped("time_slot")
+        )
+
+        horodatages = list(OrderedDict.fromkeys(keys))
+
+        for time_slot in horodatages:
+            keys = self.env["acc.repartition.counter"].search(
+                [
+                    ("acc_repartition_id", "=", repartition.id),
+                    ("time_slot", "=", time_slot),
+                ]
+            )
+            body = []
+            for key in keys:
+                body.append({"id": key.acc_counter_id.name, "key": key.weight})
+            data = {"timestamp": time_slot.strftime("%Y%m%dT%H%M%SZ"), "body": body}
+            job_description = (
+                f"{self.name} - Send repartition key at {data.get('timestamp')}"
+            )
+            try:
+                self.with_delay(description=job_description).send_repartition_key(
+                    key=data
+                )
+            except ValidationError as exc:
+                raise UserError(_(str(exc))) from exc
+
+    def get_repartition_data_for_csv(self):
+        """
+        generate data for csv
+        """
+        repartition = self.env["acc.repartition.keys"].search(
+            [("operation_id", "=", self.id)]
+        )
+
+        keys = self.env["acc.repartition.counter"].search(
+            [("acc_repartition_id", "=", repartition.id)]
+        )
+        if not keys:
+            raise ValidationError(_("Clés de répartition non générées"))
+
+        counters = keys.mapped("acc_counter_id")
+        keys = keys.mapped("time_slot")
+
+        horodatages = list(OrderedDict.fromkeys(keys))
+
+        hearders = ["Horodate"] + [c.name for c in counters]
+        data = [hearders]
+        for time_slot in horodatages:
+            line = [utc_to_local(time_slot, "Europe/Paris")]
+            for counter in counters:
+                w = (
+                    self.env["acc.repartition.counter"]
+                    .search(
+                        [
+                            ("acc_counter_id", "=", counter.id),
+                            ("time_slot", "=", time_slot),
+                        ]
+                    )
+                    .weight
+                )
+                line.append(str(w).replace(".", ","))
+
+            data.append(line)
+
+        return data
+
+    def export_repartition(self):
+        """
+        Genere un fichier csv des repartitions
+        :param operation_id: operation
+        :return: file
+        """
+
+        csv_data = self.get_repartition_data_for_csv()
+
+        try:
+            start_date = csv_data[1][0]
+            end_date = csv_data[-1][0]
+
+            d = csv_data[2][0] - start_date
+        except IndexError as e:
+            raise ValidationError(_("Pas de données")) from e
+        ts = int(d.total_seconds() / 60)
+        if isinstance(start_date, datetime) and isinstance(end_date, datetime):
+            filename = (
+                f"{self.name}_{ts}_"
+                f"{start_date.strftime('%d%m%Y')}_{end_date.strftime('%d%m%Y')}"
+            )
+        else:
+            filename = f"cle_de_repartition_{self.name}"
+
+        return self.create_csv(filename, csv_data)
+
+    # ------------------------------------------------------
+    # Common function
+    # ------------------------------------------------------
+
+    def create_csv(self, filename, lines_to_export):
+        fp = StringIO()
+        export_file = csv.writer(fp, delimiter=";", quoting=csv.QUOTE_NONE)
+        # Add header line
+        for line in lines_to_export:
+            # Format date value
+            line_values = [
+                value
+                if not isinstance(value, date)
+                else value.strftime("%d-%m-%Y %H:%M")
+                for value in line
+            ]
+            export_file.writerow(line_values)
+
+        fp.seek(0)
+        data = fp.read()
+        fp.close()
+
+        filename = filename + ".csv"
+        # sauvegarde du fichier de cles
+        self.env["acc.repartition.keys.file"].create(
+            {
+                "csv_file": base64.b64encode(str.encode(data)),
+                "filename": filename,
+                "operation_id": self.id,
+                "date_send": datetime.now(),
+            }
+        )
diff --git a/models/acc_priority_group.py b/models/acc_priority_group.py
new file mode 100644
index 0000000000000000000000000000000000000000..4aeec6f8456135608694f0053b7564c428129aa8
--- /dev/null
+++ b/models/acc_priority_group.py
@@ -0,0 +1,176 @@
+from odoo import api, fields, models
+
+
+class AccPriorityGroup(models.Model):
+    _name = "acc.priority.group"
+    _description = "Groupe de clés de répartition"
+    _rec_name = "display_name"
+    _order = "sequence, id"
+
+    # ------------------------------------------------------
+    # Fields declaration
+    # ------------------------------------------------------
+
+    acc_operation_id = fields.Many2one("acc.operation", "Opération", required=True)
+    sequence = fields.Integer(required=True, default=1)
+    type_algo = fields.Selection(
+        [
+            ("prorata", "Répartition au prorata"),
+        ],
+        string="Répartition au sein du groupe",
+        default="prorata",
+        required=True,
+    )
+    display_name = fields.Char(
+        compute="_compute_display_name", store=True, readonly=True
+    )
+    acc_priority_group_counter_ids = fields.One2many(
+        comodel_name="acc.priority.group.counter",
+        inverse_name="acc_priority_group_id",
+        string="Affectation de compteur par groupe de priorité",
+        required=True,
+    )
+
+    counter_datas = fields.Json(compute="_compute_counter_datas")
+    # ------------------------------------------------------
+    # SQL Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Default methods
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Computed fields / Search Fields
+    # ------------------------------------------------------
+
+    @api.depends("type_algo", "sequence")
+    def _compute_display_name(self):
+        for prio_group in self:
+            prio_group.display_name = f"Priorité {str(prio_group.sequence)}"
+
+    def _compute_counter_datas(self):
+        for priority in self:
+            priority.counter_datas = (
+                priority.acc_priority_group_counter_ids.acc_counter_id.mapped(
+                    lambda q: {
+                        "name": q.name,
+                        "partner": q.partner_id.name,
+                        "street": q.street,
+                    }
+                )
+            )
+
+    # ------------------------------------------------------
+    # Onchange / Constraints
+    # ------------------------------------------------------
+    @api.onchange("sequence")
+    def on_change_algo(self):
+        self._compute_display_name()
+
+    # ------------------------------------------------------
+    # CRUD methods (ORM overrides)
+    # ------------------------------------------------------
+    @api.model
+    def unlink(self, _id):
+        self = self.env["acc.priority.group"].browse(_id)
+        current_operation_id = self.env.context.get("active_id")
+        existing_groups = self.env["acc.priority.group"].search(
+            [("acc_operation_id", "=", current_operation_id), ("id", "!=", _id)]
+        )
+        seq = 1
+        for group in existing_groups:
+            group.sequence = seq
+            seq += 1
+
+        return super().unlink()
+
+    @api.model_create_multi
+    def create(self, vals_list):
+        """
+        si c est le premier groupe cree on y affecte tout les compteurs
+        """
+        current_operation_id = self.env.context.get("active_id")
+
+        existing_groups = self.env["acc.priority.group"].search(
+            [
+                ("acc_operation_id", "=", current_operation_id),
+            ]
+        )
+
+        res = super().create(vals_list)
+
+        if existing_groups:
+            res.sequence = max(existing_groups.mapped("sequence")) + 1
+            return res
+
+        counters_to_affect = self.env["acc.counter"].search(
+            [
+                ("acc_operation_id", "=", res.acc_operation_id.id),
+                ("type", "in", ["del", "del_inj"]),
+            ]
+        )
+        for counter in counters_to_affect:
+            self.env["acc.priority.group.counter"].create(
+                {
+                    "acc_priority_group_id": res.id,
+                    "acc_operation_id": res.acc_operation_id.id,
+                    "acc_counter_id": counter.id,
+                    "counter_street": counter.street,
+                    "counter_owner": counter.partner_id.name,
+                }
+            )
+        return res
+
+    # ------------------------------------------------------
+    # Actions
+    # ------------------------------------------------------
+
+    def compute(self, data=None):
+        compute_algo = {
+            "prorata": self._prorata,
+        }
+        if data is None:
+            data = self.env["acc.enedis.raw.cdc"].get_repartition_data(
+                operation_id=self.acc_operation_id
+            )
+
+        d = compute_algo[self.type_algo](data)
+
+        return d
+
+    def get_conso_sum(self, data_slot):
+        conso = 0.0
+        for counter in self.acc_priority_group_counter_ids.acc_counter_id.mapped(
+            "name"
+        ):
+            consok = data_slot.get("conso").get(counter)
+            if consok:
+                conso += consok
+        return conso
+
+    def _prorata(self, data):
+        for slot in data:
+            prod = data.get(slot).get("prod_totale")
+            priority_counters_conso_sum = self.get_conso_sum(data.get(slot))
+
+            total_affecte = 0.0
+            if not data.get(slot).get("affect"):
+                data[slot]["affect"] = {}
+
+            for counter in self.acc_priority_group_counter_ids.acc_counter_id.mapped(
+                "name"
+            ):
+                if prod == 0 or priority_counters_conso_sum == 0:
+                    part_a_affecter = 0.0
+                else:
+                    conso_k = data.get(slot).get("conso").get(counter)
+                    part_a_affecter = min(
+                        conso_k, prod * (conso_k / priority_counters_conso_sum)
+                    )
+                data[slot]["affect"][counter] = part_a_affecter
+                total_affecte += part_a_affecter
+
+            data[slot]["prod_totale"] = prod - total_affecte
+
+        return data
diff --git a/models/acc_priority_group_counter.py b/models/acc_priority_group_counter.py
new file mode 100644
index 0000000000000000000000000000000000000000..a7575036357d4d0a49c73639578e4737f3ace0a7
--- /dev/null
+++ b/models/acc_priority_group_counter.py
@@ -0,0 +1,101 @@
+from odoo import api, fields, models
+from odoo.osv import expression
+
+
+class AccPriorityGroupCounter(models.Model):
+    _name = "acc.priority.group.counter"
+    _description = "Clé de répartition par groupe de priorité"
+    _rec_name = "acc_counter_id"
+
+    # ------------------------------------------------------
+    # Fields declaration
+    # ------------------------------------------------------
+
+    acc_priority_group_id = fields.Many2one(
+        "acc.priority.group",
+        "Groupe de priorité",
+        required=True,
+        ondelete="cascade",
+        group_expand="_group_expand_acc_priority_group_id",
+    )
+    acc_operation_id = fields.Many2one(
+        related="acc_priority_group_id.acc_operation_id", store=True, readonly=True
+    )
+    acc_counter_id = fields.Many2one(
+        "acc.counter",
+        "PRM",
+        required=True,
+        ondelete="cascade",
+        domain="[('acc_operation_id', '=', acc_operation_id),"
+        "('type', 'in', ['del', 'del_inj'])]",
+    )
+    counter_street = fields.Char(
+        related="acc_counter_id.street", store=True, readonly=True
+    )
+    counter_owner = fields.Char(
+        related="acc_counter_id.partner_id.name", store=True, readonly=True
+    )
+    acc_counter_id_domain = fields.Binary(
+        string="Counter domain", compute="_compute_acc_counter_id_domain"
+    )
+
+    # ------------------------------------------------------
+    # SQL Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Default methods
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Computed fields / Search Fields
+    # ------------------------------------------------------
+    @api.depends("acc_counter_id", "acc_priority_group_id")
+    def _compute_acc_counter_id_domain(self):
+        for counter in self:
+            domain = [
+                ("acc_operation_id", "=", counter.acc_operation_id.id),
+                ("type", "in", ["del", "del_inj"]),
+            ]
+            extended_domain = expression.AND(
+                [
+                    domain,
+                    [
+                        (
+                            "id",
+                            "not in",
+                            counter.acc_priority_group_id.acc_priority_group_counter_ids.acc_counter_id.ids,
+                        )
+                    ],
+                ]
+            )
+            counter.acc_counter_id_domain = extended_domain
+
+    # ------------------------------------------------------
+    # Onchange / Constraints
+    # ------------------------------------------------------
+    # @api.constrains("acc_counter_id_domain", "acc_counter_id")
+    # def _check_only_one_counter_per_group(self):
+    #     """
+    #     Vérification qu'il n'y a pas plusieurs fois le meme compteur dans un groupe
+    #     """
+    #
+    #     domain = expression.AND([self.acc_counter_id_domain, ])
+    #
+    #     s = self.env["acc.counter"].search(self.acc_counter_id_domain)
+    #     l = s.ids
+    #     c = self.acc_counter_id.id
+    #
+    #     if c not in l:
+    #         raise UserError("Compteur déjà affecté a ce groupe")
+
+    # ------------------------------------------------------
+    # CRUD methods (ORM overrides)
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Actions
+    # ------------------------------------------------------
+
+    def _group_expand_acc_priority_group_id(self, groups, domain, order):
+        return self.env["acc.priority.group"].search(domain=domain, order=order)
diff --git a/models/acc_repartition_counter.py b/models/acc_repartition_counter.py
new file mode 100644
index 0000000000000000000000000000000000000000..e88844c81e8d3d8860784ce63e25944bbb6474ee
--- /dev/null
+++ b/models/acc_repartition_counter.py
@@ -0,0 +1,42 @@
+from odoo import api, fields, models
+
+
+class AccRepartitionCounter(models.Model):
+    _name = "acc.repartition.counter"
+    _description = "Priorité par compteur"
+
+    acc_repartition_id = fields.Many2one("acc.repartition.keys", "Clé", required=True)
+    weight = fields.Float(string="Répartition en pourcentage", required=False)
+    time_slot = fields.Datetime("Horodatage de la clé")
+    acc_counter_id = fields.Many2one("acc.counter", string="Compteur", required=True)
+    acc_operation_id = fields.Many2one(
+        comodel_name="acc.operation", compute="_compute_operation_id", store=True
+    )
+
+    # ------------------------------------------------------
+    # SQL Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Default methods
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Computed fields / Search Fields
+    # ------------------------------------------------------
+    @api.depends("acc_repartition_id")
+    def _compute_operation_id(self):
+        for key in self:
+            key.acc_operation_id = key.acc_repartition_id.operation_id
+
+    # ------------------------------------------------------
+    # Onchange / Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # CRUD methods (ORM overrides)
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Actions
+    # ------------------------------------------------------
diff --git a/models/acc_repartition_keys.py b/models/acc_repartition_keys.py
index 234cd0eeda7e05845ffbf9a5bdcab066d41bcdbe..7aeb704c30ae7dd607af21f823716bdbaddf54e2 100644
--- a/models/acc_repartition_keys.py
+++ b/models/acc_repartition_keys.py
@@ -4,14 +4,16 @@ from odoo import fields, models
 class AccRepartitionKeys(models.Model):
     _name = "acc.repartition.keys"
     _description = "clés de repartition"
-    _order = "date_send DESC, id DESC"
 
     # ------------------------------------------------------
     # Fields declaration
-    csv_file = fields.Binary("Contenu du fichier CSV", required=True)
-    filename = fields.Char("Nom du fichier", required=True)
-    date_send = fields.Date("Date de l'envoi des clés", required=True, default=None)
+    # ------------------------------------------------------
     operation_id = fields.Many2one("acc.operation", "Opération", required=True)
+    acc_repartition_counter_ids = fields.One2many(
+        comodel_name="acc.repartition.counter",
+        inverse_name="acc_repartition_id",
+        string="Compteur",
+    )
 
     # ------------------------------------------------------
     # SQL Constraints
diff --git a/models/acc_repartition_keys_file.py b/models/acc_repartition_keys_file.py
new file mode 100644
index 0000000000000000000000000000000000000000..8cc99ef602552d5b6b548a3a7ecb8cb17d289708
--- /dev/null
+++ b/models/acc_repartition_keys_file.py
@@ -0,0 +1,42 @@
+from odoo import fields, models
+
+
+class AccRepartitionKeysFile(models.Model):
+    _name = "acc.repartition.keys.file"
+    _description = "clés de repartition"
+    _order = "date_send DESC, id DESC"
+
+    # ------------------------------------------------------
+    # Fields declaration
+    csv_file = fields.Binary("Contenu du fichier CSV", required=True)
+    filename = fields.Char("Nom du fichier", required=True)
+    date_send = fields.Date("Date de l'envoi des clés", default=None)
+    operation_id = fields.Many2one("acc.operation", "Opération", required=True)
+
+    # ------------------------------------------------------
+    # SQL Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Default methods
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Computed fields / Search Fields
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Onchange / Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # CRUD methods (ORM overrides)
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Actions
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Business methods
+    # ------------------------------------------------------
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index d2f220c5a1e1675964c06edb5df0db0fdc7c4247..01de11f6c621533d85fc6fa0b821c0f03c799a9c 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -1,4 +1,14 @@
 id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
-"access_acc_repartition_keys_group_operation_superadmin","acc_repartition_keys group_operation_superadmin","model_acc_repartition_keys","oacc.group_operation_superadmin",1,1,1,0
-"access_acc_repartition_keys_wizard_group_operation_superadmin","acc_repartition_keys_wizard group_operation_superadmin","model_acc_repartition_keys_wizard","oacc.group_operation_superadmin",1,1,1,1
+"access_acc_repartition_keys_file_group_operation_superadmin","acc_repartition_keys_file group_operation_superadmin","model_acc_repartition_keys_file","oacc.group_operation_superadmin",1,1,1,0
+"access_acc_repartition_keys_operation_superadmin","acc_repartition_keys group_operation_superadmin","model_acc_repartition_keys","oacc.group_operation_superadmin",1,1,1,1
+"access_acc_repartition_keys_file_wizard_group_operation_superadmin","acc_repartition_keys_file_wizard group_operation_superadmin","model_acc_repartition_keys_file_wizard","oacc.group_operation_superadmin",1,1,1,1
+"access_acc_priority_group_counter_operation_superadmin","acc_priority_group_counter group_operation_superadmin","model_acc_priority_group_counter","oacc.group_operation_superadmin",1,1,1,1
+"access_acc_priority_group_operation_superadmin","acc_priority_group group_operation_superadmin","model_acc_priority_group","oacc.group_operation_superadmin",1,1,1,1
+"access_acc_repartition_counter_group_operation_superadmin","acc_repartition_counter group_operation_superadmin","model_acc_repartition_counter","oacc.group_operation_superadmin",1,1,1,1
+"access_acc_repartition_keys_compute_wizard_group_operation_superadmin","acc_repartition_keys_compute_wizard group_operation_superadmin","model_acc_repartition_keys_compute_wizard","oacc.group_operation_admin",1,1,1,1
 
+"access_acc_priority_group_counter_operation_admin","acc_priority_group_counter group_operation_admin","model_acc_priority_group_counter","oacc.group_operation_admin",1,1,1,1
+"access_acc_priority_group_operation_admin","acc_priority_group group_operation_admin","model_acc_priority_group","oacc.group_operation_admin",1,1,1,1
+"access_acc_repartition_counter_group_operation_admin","acc_repartition_counter group_operation_admin","model_acc_repartition_counter","oacc.group_operation_admin",1,1,1,1
+"access_acc_repartition_keys_file_wizard_group_operation_admin","acc_repartition_keys_file_wizard group_operation_admin","model_acc_repartition_keys_file_wizard","oacc.group_operation_admin",1,1,1,1
+"access_acc_repartition_keys_file_group_operation_admin","acc_repartition_keys_file group_operation_admin","model_acc_repartition_keys_file","oacc.group_operation_admin",1,1,1,1
diff --git a/static/src/js/kanban_button.js b/static/src/js/kanban_button.js
new file mode 100644
index 0000000000000000000000000000000000000000..b1f668a77b60d7b896e94a1d423f497d5a61f8d0
--- /dev/null
+++ b/static/src/js/kanban_button.js
@@ -0,0 +1,28 @@
+/** @odoo-module */
+import {KanbanController} from "@web/views/kanban/kanban_controller";
+import {registry} from "@web/core/registry";
+import {kanbanView} from "@web/views/kanban/kanban_view";
+export class PriorityGroupKanbanController extends KanbanController {
+  setup() {
+    super.setup();
+  }
+  CreatePriorityGroupClick() {
+    console.log(this.props.context);
+    this.actionService.doAction({
+      type: "ir.actions.act_window",
+      res_model: "acc.priority.group",
+      name: "Creer un groupe de priorité",
+      view_mode: "form",
+      view_type: "form",
+      views: [[false, "form"]],
+      target: "new",
+      res_id: false,
+      context: this.props.context || {},
+    });
+  }
+}
+registry.category("views").add("button_in_kanban", {
+  ...kanbanView,
+  Controller: PriorityGroupKanbanController,
+  buttonTemplate: "button_priority_group.KanbanView.Buttons",
+});
diff --git a/static/src/xml/kanban_button.xml b/static/src/xml/kanban_button.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8bd0ca43cd035d76dfb26e3736000febc2572e55
--- /dev/null
+++ b/static/src/xml/kanban_button.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<odoo>
+   <t
+    t-name="button_priority_group.KanbanView.Buttons"
+    t-inherit="web.KanbanView.Buttons"
+  >
+       <xpath expr="//*[@class='btn btn-primary o-kanban-button-new']" position="after">
+           <button
+        type="button"
+        class="btn btn-primary"
+        style="margin-left: 10px;"
+        t-on-click="CreatePriorityGroupClick"
+      >
+               Creer un groupe de priorité
+           </button>
+       </xpath>
+   </t>
+</odoo>
diff --git a/views/acc_operation_views.xml b/views/acc_operation_views.xml
index a99f61a30356a0a3b396515236b67dc3111e7362..54dffadb2be0a366f717e3c5a4cc8320f3ab49e3 100644
--- a/views/acc_operation_views.xml
+++ b/views/acc_operation_views.xml
@@ -9,13 +9,40 @@
         <field name="arch" type="xml">
             <page name="other_infos" position="before">
                 <page string="Clés de répartition" name="keys">
+                    <div>
+                        <field name="type_algo" />
+
+                        <field name="algo_description" readonly="1" />
+                    </div>
+                    <separator />
                     <button
-            string="Importer un fichier"
+            string="Calcul clés de répartition"
             type="action"
-            name="%(oacc_repartition_keys.acc_repartition_keys_wizard_action)d"
+            name="%(oacc_repartition_keys.acc_repartition_keys_compute_wizard_action)d"
             class="btn-primary"
+            attrs="{'invisible': [('type_algo', 'in', ['prorata', 'static'])]}"
+            groups="oacc.group_operation_superadmin"
           />
-                    <field name="keys_repartition_ids" mode="tree">
+
+                    <button
+            string="Algorithme de clé de répartition"
+            type="object"
+            name="action_view_repartition_algo_priority_group"
+            class="btn-primary"
+            context="{'default_acc_operation_id': active_id}"
+            attrs="{'invisible': [('type_algo', 'in', ['prorata', 'static', 'dyn_perso_send'])]}"
+            groups="oacc.group_operation_admin"
+          />
+                    <separator />
+                    <button
+            string="Importer un fichier de clés"
+            type="action"
+            name="%(oacc_repartition_keys.acc_repartition_keys_file_wizard_action)d"
+            class="btn-primary"
+            attrs="{'invisible': [('type_algo', 'not in', ['dyn_perso_send'])]}"
+            groups="oacc.group_operation_admin"
+          />
+                    <field name="keys_file_repartition_ids" mode="tree">
                         <tree create="0" editable="bottom" delete="0">
                             <field name="date_send" readonly="1" />
                             <field name="filename" invisible="1" />
@@ -32,4 +59,5 @@
             </page>
         </field>
     </record>
+
 </odoo>
diff --git a/views/acc_priority_group_counter_views.xml b/views/acc_priority_group_counter_views.xml
new file mode 100644
index 0000000000000000000000000000000000000000..246eec47dda447148edf9feab05e96c53b44a13d
--- /dev/null
+++ b/views/acc_priority_group_counter_views.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="acc_priority_group_counter_act_window" model="ir.actions.act_window">
+        <field name="name">Clé de répartition par groupe de priorité</field>
+        <field name="res_model">acc.priority.group.counter</field>
+        <field name="view_mode">kanban</field>
+    </record>
+
+    <record id="acc_operation_priority_group_counter_form" model="ir.ui.view">
+            <field name="name">acc.operation.priority.group.counter.form</field>
+            <field name="model">acc.priority.group.counter</field>
+            <field name="arch" type="xml">
+                <form>
+                    <field name="acc_priority_group_id" invisible="1" />
+                    <field name="acc_operation_id" invisible="1" />
+                    <field name="acc_counter_id_domain" invisible="1" />
+                    <field
+          name="acc_counter_id"
+          options="{'no_create_edit': True, 'no_create': True}"
+          domain="acc_counter_id_domain"
+        />
+                </form>
+            </field>
+    </record>
+
+
+    <record id="acc_operation_priority_group_counter_kanban" model="ir.ui.view">
+            <field name="name">acc.operation.priority.group.counter.kanban</field>
+            <field name="model">acc.priority.group.counter</field>
+            <field name="arch" type="xml">
+                <kanban
+        default_group_by="acc_priority_group_id"
+        class="o_kanban_small_column"
+        on_create="quick_create"
+        quick_create_view="oacc_repartition_keys.acc_operation_priority_group_counter_form"
+        archivable="false"
+        sample="1"
+        js_class="button_in_kanban"
+        group_create="false"
+      >
+                    <field name="acc_counter_id" />
+                    <field name="acc_priority_group_id" />
+                    <field name="counter_street" />
+                    <field name="counter_owner" />
+
+                        <templates>
+                        <t t-name="kanban-box">
+                            <div t-attf-class="oe_kanban_global_click oe_kanban_card">
+                                <div class="oe_kanban_content">
+                                    <div class="o_kanban_record_top">
+                                        <div class="o_kanban_record_headings">
+                                            <a
+                      type="delete"
+                      style="position: absolute; right: 5px; top: 5px;"
+                    >X</a>
+                                            <strong class="o_kanban_record_title">
+                                                <field
+                        name="acc_counter_id"
+                        options="{'no_open': True}"
+                      />
+                                            </strong>
+                                        </div>
+                                    </div>
+                                    <div class="o_kanban_record_body">
+                                        <field name="counter_owner" />
+                                        <br />
+                                        <field name="counter_street" />
+                                    </div>
+                                </div>
+                                <div class="clearfix" />
+                            </div>
+                        </t>
+                    </templates>
+                </kanban>
+            </field>
+        </record>
+
+</odoo>
diff --git a/views/acc_priority_group_views.xml b/views/acc_priority_group_views.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ea7fe4d557335ef563991117e602b4b08656dd69
--- /dev/null
+++ b/views/acc_priority_group_views.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="acc_priority_group_act_window" model="ir.actions.act_window">
+        <field name="name">Groupes de priorités</field>
+        <field name="res_model">acc.priority.group</field>
+        <field name="view_mode">kanban,form</field>
+    </record>
+
+    <record id="acc_priority_group_form" model="ir.ui.view">
+        <field name="name">acc.priority.group.form</field>
+        <field name="model">acc.priority.group</field>
+        <field name="arch" type="xml">
+            <form>
+                <group>
+                    <field name="acc_operation_id" readonly="1" />
+
+                    <field name="type_algo" />
+                </group>
+            </form>
+        </field>
+    </record>
+
+</odoo>
diff --git a/views/acc_repartition_counter_views.xml b/views/acc_repartition_counter_views.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1438b38be0893de2bb61b90950633618aba922e8
--- /dev/null
+++ b/views/acc_repartition_counter_views.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright 2021- Le Filament (https://le-filament.com)
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+
+    <record id="acc_repartition_counter_filter" model="ir.ui.view">
+        <field name="name">acc.acc_repartition_counter.filter</field>
+        <field name="model">acc.repartition.counter</field>
+        <field name="arch" type="xml">
+            <search string="Recherche">
+                <field name="acc_repartition_id" string="Opération" />
+                <field name="acc_counter_id" string="PRM" />
+                <field name="time_slot" string="Horodatage" />
+                <separator />
+                <group expand="0" string="Group By">
+                    <filter
+            name="group_operation"
+            string="Opération"
+            context="{'group_by':'acc_operation_id'}"
+          />
+                    <filter
+            name="group_time_slot"
+            string="Horodatage"
+            context="{'group_by':'time_slot'}"
+          />
+                    <filter
+            name="group_counter"
+            string="PRMs"
+            context="{'group_by':'acc_counter_id'}"
+          />
+                </group>
+            </search>
+        </field>
+    </record>
+
+    <record id="acc_repartition_counter_form_view" model="ir.ui.view">
+        <field name="name">acc.acc_repartition_counter.form</field>
+        <field name="model">acc.repartition.counter</field>
+        <field name="arch" type="xml">
+            <form string="CDC Enedis">
+                <sheet>
+                    <div class="oe_title">
+                        <label for="time_slot" />
+                        <h1>
+                            <field name="time_slot" />
+                        </h1>
+                    </div>
+                    <group>
+                        <group>
+                            <field
+                name="acc_operation_id"
+                options="{'no_create_edit': True, 'no_create': True}"
+              />
+                            <field
+                name="acc_counter_id"
+                options="{'no_create_edit': True, 'no_create': True}"
+              />
+                            <field
+                name="time_slot"
+                options="{'no_create_edit': True, 'no_create': True}"
+              />
+                            <field
+                name="weight"
+                options="{'no_create_edit': True, 'no_create': True}"
+              />
+                        </group>
+                        <group>
+                            <field name="time_slot" />
+                            <field name="acc_counter_id" />
+                            <field name="weight" />
+                        </group>
+                    </group>
+                </sheet>
+            </form>
+        </field>
+    </record>
+
+    <record id="acc_repartition_counter_tree_view" model="ir.ui.view">
+        <field name="name">acc.acc_repartition_counter.tree</field>
+        <field name="model">acc.repartition.counter</field>
+        <field name="arch" type="xml">
+            <tree>
+                <field
+          name="acc_operation_id"
+          options="{'no_create_edit': True, 'no_create': True}"
+        />
+                <field name="time_slot" />
+                <field
+          name="acc_counter_id"
+          options="{'no_create_edit': True, 'no_create': True}"
+        />
+                <field name="weight" />
+            </tree>
+        </field>
+    </record>
+
+    <record id="acc_repartition_counter_pivot_view" model="ir.ui.view">
+        <field name="name">acc.acc_repartition_counter.pivot</field>
+        <field name="model">acc.repartition.counter</field>
+        <field name="arch" type="xml">
+            <pivot string="Clés de repartition" sample="1">
+                <field name="acc_operation_id" type="row" />
+                <field name="time_slot" type="col" />
+                <field name="weight" type="measure" />
+            </pivot>
+        </field>
+    </record>
+
+    <record id="acc_repartition_counter_act_window" model="ir.actions.act_window">
+        <field name="name">CLES CALCULEES</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">acc.repartition.counter</field>
+        <field name="view_mode">pivot,tree,form</field>
+        <field name="help" type="html">
+          <p class="o_view_nocontent_smiling_face">
+            Créer une entrée de données
+          </p>
+        </field>
+    </record>
+
+</odoo>
diff --git a/views/acc_repartition_keys_views.xml b/views/acc_repartition_keys_views.xml
index 2c5f15a5abe194ef29807a5aad2e224f9009b98a..7be5b5bfe5974359b367ac0f6602fb16506cdd06 100644
--- a/views/acc_repartition_keys_views.xml
+++ b/views/acc_repartition_keys_views.xml
@@ -1,21 +1,25 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <odoo>
-<!--    <data>-->
-        <record id="acc_keys_repartition_action" model="ir.actions.act_window">
-            <field name="name">Keys</field>
-            <field name="res_model">acc.repartition.keys</field>
+    <data>
+
+<!--                    KEYS FILES-->
+        <record id="acc_keys_repartition_file_action" model="ir.actions.act_window">
+            <field name="name">Keys file</field>
+            <field name="res_model">acc.repartition.keys.file</field>
             <field name="view_mode">tree,form</field>
         </record>
-        <record id="acc_keys_repartition_tree" model="ir.ui.view">
-            <field name="name">acc.repartition.keys.tree</field>
-            <field name="model">acc.repartition.keys</field>
+
+        <record id="acc_keys_file_repartition_tree" model="ir.ui.view">
+            <field name="name">acc.repartition.keys.file.tree</field>
+            <field name="model">acc.repartition.keys.file</field>
             <field name="arch" type="xml">
-                <tree string="Keys" create="false">
+                <tree string="Keys file" create="false">
                     <field name="date_send" />
                     <field name="csv_file" />
                     <field name="operation_id" />
                 </tree>
             </field>
         </record>
-<!--    </data>-->
+
+    </data>
 </odoo>
diff --git a/views/menu_views.xml b/views/menu_views.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3bc4ea9f143543817d847b1a23be57c1d2e3cda2
--- /dev/null
+++ b/views/menu_views.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright 2021- Le Filament (https://le-filament.com)
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+    <menuitem
+    id="menu_repartition_principal"
+    parent="oacc.menu_acc"
+    name="Clés de répartition"
+    sequence="15"
+    groups="oacc.group_operation_superadmin"
+  />
+<!--    <menuitem-->
+<!--    id="menu_send_key"-->
+<!--    parent="menu_repartition_principal"-->
+<!--    name="Clés envoyées"-->
+<!--    sequence="30"-->
+<!--    action="oacc_repartition_keys.acc_keys_repartition_file_action"-->
+<!--  />-->
+  <menuitem
+    id="menu_computed_key"
+    parent="menu_repartition_principal"
+    name="Clés calculées"
+    sequence="40"
+    action="acc_repartition_counter_act_window"
+  />
+</odoo>
diff --git a/wizard/__init__.py b/wizard/__init__.py
index cbd8c61e5e0dbd922961fa9b0b9117dc317a3bc3..7747d99f28e7bcd354835f7a631b898d55a4677d 100644
--- a/wizard/__init__.py
+++ b/wizard/__init__.py
@@ -1 +1,2 @@
-from . import acc_repartition_keys_wizard
+from . import acc_repartition_keys_file_wizard
+from . import acc_repartition_keys_compute_wizard
diff --git a/wizard/acc_repartition_keys_compute_wizard.py b/wizard/acc_repartition_keys_compute_wizard.py
new file mode 100644
index 0000000000000000000000000000000000000000..e4e830eec0a5840f0706670c634aea2e71194f3c
--- /dev/null
+++ b/wizard/acc_repartition_keys_compute_wizard.py
@@ -0,0 +1,74 @@
+# Copyright 2021- Le Filament (https://le-filament.com)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import _, fields, models
+from odoo.exceptions import UserError, ValidationError
+
+
+class AccRepartitionKeysComputeWizard(models.TransientModel):
+    _name = "acc.repartition.keys.compute.wizard"
+    _description = "Import fichier de clés de répartition"
+
+    # ------------------------------------------------------
+    # Default methods
+    # ------------------------------------------------------
+    def _default_operation_id(self):
+        return self.env.context.get("active_id")
+
+    # ------------------------------------------------------
+    # Fields declaration
+    # ------------------------------------------------------
+    operation_id = fields.Many2one(
+        "acc.operation", "Opération", default=_default_operation_id
+    )
+
+    # ------------------------------------------------------
+    # SQL Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Computed fields / Search Fields
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Onchange / Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # CRUD methods (ORM overrides)
+    # ------------------------------------------------------
+    def ignore(self):
+        return {"type": "ir.actions.act_window_close"}
+
+    # ------------------------------------------------------
+    # Actions
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Business methods
+    # ------------------------------------------------------
+
+    def send_keys(self):
+        self.operation_id.action_send_repartition_keys()
+
+    def get_csv(self):
+        job_description = f"{self.operation_id.name} - Generate repartition CSV "
+        try:
+            self.operation_id.with_delay(
+                description=job_description
+            ).export_repartition()
+        except ValidationError as exc:
+            raise UserError(_(str(exc))) from exc
+
+        return {"type": "ir.actions.act_window_close"}
+
+    def compute_keys(self):
+        job_description = f"{self.operation_id.name} - Generate repartition key "
+        try:
+            self.operation_id.with_delay(
+                description=job_description
+            ).compute_repartition()
+        except ValidationError as exc:
+            raise UserError(_(str(exc))) from exc
+
+        return {"type": "ir.actions.act_window_close"}
diff --git a/wizard/acc_repartition_keys_compute_wizard_views.xml b/wizard/acc_repartition_keys_compute_wizard_views.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2c9aecb352d83a328f50cc8e0df39459dcac3397
--- /dev/null
+++ b/wizard/acc_repartition_keys_compute_wizard_views.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="acc_repartition_keys_compute_wizard_form" model="ir.ui.view">
+        <field name="name">acc.repartition.keys.compute.wizard.form</field>
+        <field name="model">acc.repartition.keys.compute.wizard</field>
+        <field name="arch" type="xml">
+            <form string="Calcul des clés de repartition">
+                <button
+          class="btn btn-primary"
+          name="compute_keys"
+          type="object"
+          string="Lancer le calcul"
+        />
+
+                <footer>
+                    <button
+            class="btn btn-primary"
+            name="send_keys"
+            type="object"
+            string="Envoyer les clés"
+          />
+                    <button
+            class="btn btn-primary"
+            name="get_csv"
+            type="object"
+            string="Génerer CSV"
+          />
+                    <button
+            class="btn btn-primary"
+            name="ignore"
+            type="object"
+            string="Ignorer"
+          />
+                </footer>
+            </form>
+        </field>
+    </record>
+
+    <record
+    id="acc_repartition_keys_compute_wizard_action"
+    model="ir.actions.act_window"
+  >
+        <field name="name">Calcul des clés de repartition</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">acc.repartition.keys.compute.wizard</field>
+        <field name="view_mode">form</field>
+        <field name="view_id" ref="acc_repartition_keys_compute_wizard_form" />
+        <field name="target">new</field>
+    </record>
+</odoo>
diff --git a/wizard/acc_repartition_keys_wizard.py b/wizard/acc_repartition_keys_file_wizard.py
similarity index 91%
rename from wizard/acc_repartition_keys_wizard.py
rename to wizard/acc_repartition_keys_file_wizard.py
index 2f4fa917668408399ace667eeb5e62b1d7cbefc9..879495dd3d6623a0d5b274827dcbc218ecd1fd22 100644
--- a/wizard/acc_repartition_keys_wizard.py
+++ b/wizard/acc_repartition_keys_file_wizard.py
@@ -9,9 +9,9 @@ from odoo.exceptions import UserError, ValidationError
 from ..tools.key_file import RepartitionKeyEntryFile
 
 
-class AccRepartitionKeysWizard(models.TransientModel):
-    _name = "acc.repartition.keys.wizard"
-    _description = "clés de répartition"
+class AccRepartitionKeysFileWizard(models.TransientModel):
+    _name = "acc.repartition.keys.file.wizard"
+    _description = "Import fichier de clés de répartition"
 
     # ------------------------------------------------------
     # Default methods
@@ -100,7 +100,10 @@ class AccRepartitionKeysWizard(models.TransientModel):
             data_to_send = entry_file_handler.data_to_send(send_empty_key=True)
 
             for key in data_to_send:
-                job_description = f"{self.operation_id.name} - Send repartition key at {key.get('timestamp')}"
+                job_description = (
+                    f"{self.operation_id.name} - Send repartition key "
+                    f"at {key.get('timestamp')}"
+                )
                 try:
                     self.operation_id.with_delay(
                         description=job_description
@@ -108,7 +111,7 @@ class AccRepartitionKeysWizard(models.TransientModel):
                 except ValidationError as exc:
                     raise UserError(_(str(exc))) from exc
 
-            self.env["acc.repartition.keys"].create(
+            self.env["acc.repartition.keys.file"].create(
                 {
                     "csv_file": self.csv_file,
                     "filename": self.filename,
diff --git a/wizard/acc_repartition_keys_wizard_views.xml b/wizard/acc_repartition_keys_file_wizard_views.xml
similarity index 57%
rename from wizard/acc_repartition_keys_wizard_views.xml
rename to wizard/acc_repartition_keys_file_wizard_views.xml
index 81b5da0a99e588979e36e1c7216f77cd3ce5a2d0..fc167d55fb546686a2499c54c856923934a81de9 100644
--- a/wizard/acc_repartition_keys_wizard_views.xml
+++ b/wizard/acc_repartition_keys_file_wizard_views.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <odoo>
-    <record id="acc_repartition_keys_wizard_form" model="ir.ui.view">
-        <field name="name">acc.repartition.keys.wizard.form</field>
-        <field name="model">acc.repartition.keys.wizard</field>
+    <record id="acc_repartition_keys_file_wizard_form" model="ir.ui.view">
+        <field name="name">acc.repartition.keys.file.wizard.form</field>
+        <field name="model">acc.repartition.keys.file.wizard</field>
         <field name="arch" type="xml">
-            <form string="Création clés de repartition">
+            <form string="Importation fichier clés de repartition">
                 <field name="filename" invisible="1" />
                 <field widget="binary" name="csv_file" filename="filename" />
                 <footer>
@@ -25,12 +25,12 @@
         </field>
     </record>
 
-    <record id="acc_repartition_keys_wizard_action" model="ir.actions.act_window">
-        <field name="name">Création clés de repartition</field>
+    <record id="acc_repartition_keys_file_wizard_action" model="ir.actions.act_window">
+        <field name="name">Importation fichier clés de repartition</field>
         <field name="type">ir.actions.act_window</field>
-        <field name="res_model">acc.repartition.keys.wizard</field>
+        <field name="res_model">acc.repartition.keys.file.wizard</field>
         <field name="view_mode">form</field>
-        <field name="view_id" ref="acc_repartition_keys_wizard_form" />
+        <field name="view_id" ref="acc_repartition_keys_file_wizard_form" />
         <field name="target">new</field>
     </record>
 </odoo>