From 30514bc86aa12a76833cf6edb7a57fdf10bbb9bd Mon Sep 17 00:00:00 2001
From: Juliana <juliana@le-filament.com>
Date: Tue, 24 Jan 2023 15:56:21 +0100
Subject: [PATCH] [ADD]Add new model to manage prices

---
 __manifest__.py                        |   2 +
 models/__init__.py                     |   1 +
 models/acc_operation.py                |  41 ++++--
 models/acc_price_conf.py               | 175 +++++++++++++++++++++++++
 security/ir.model.access.csv           |   4 +
 views/acc_operation_views.xml          |  54 +++++++-
 views/acc_price_conf_views.xml         | 127 ++++++++++++++++++
 views/menu_views.xml                   |  46 ++++++-
 wizard/__init__.py                     |   1 +
 wizard/acc_price_conf_wizard.py        |  91 +++++++++++++
 wizard/acc_price_conf_wizard_views.xml |  91 +++++++++++++
 11 files changed, 613 insertions(+), 20 deletions(-)
 create mode 100644 models/acc_price_conf.py
 create mode 100644 views/acc_price_conf_views.xml
 create mode 100644 wizard/acc_price_conf_wizard.py
 create mode 100644 wizard/acc_price_conf_wizard_views.xml

diff --git a/__manifest__.py b/__manifest__.py
index 316cbed..15d01ad 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -14,11 +14,13 @@
         # wizard
         "wizard/acc_sale_price_wizard_views.xml",
         "wizard/acc_sale_price_surplus_wizard_views.xml",
+        "wizard/acc_price_conf_wizard_views.xml",
         "wizard/acc_account_wizard_views.xml",
         "wizard/acc_account_surplus_wizard_views.xml",
         # views
         "views/assets.xml",
         "views/acc_sale_price_views.xml",
+        "views/acc_price_conf_views.xml",
         "views/acc_operation_views.xml",
         "views/acc_counter_views.xml",
         "views/acc_account_views.xml",
diff --git a/models/__init__.py b/models/__init__.py
index 7545f9f..a10533d 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -2,6 +2,7 @@
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
 from . import acc_sale_price
+from . import acc_price_conf
 from . import acc_operation
 from . import acc_account
 from . import acc_counter
diff --git a/models/acc_operation.py b/models/acc_operation.py
index 32ade83..d0a8c07 100644
--- a/models/acc_operation.py
+++ b/models/acc_operation.py
@@ -20,6 +20,23 @@ class AccOperation(models.Model):
         "Facturation Surplus activée", compute="_compute_is_surplus_active", store=True
     )
     acc_sale_price_ids = fields.One2many("acc.sale.price", "acc_operation_id")
+
+    acc_sale_price_conf_ids = fields.One2many(
+        "acc.price.conf",
+        "acc_operation_id",
+        domain=[("type", "=", "sale")],
+        string="Liste des Prix de Vente")
+    acc_buyer_price_conf_ids = fields.One2many(
+        "acc.price.conf",
+        "acc_operation_id",
+        domain=[("type", "=", "buyer")],
+        string="Liste des Prix d'Achat")
+    acc_accise_price_conf_ids = fields.One2many(
+        "acc.price.conf",
+        "acc_operation_id",
+        domain=[("type", "=", "accise")],
+        string="Liste des Tarifs ACCISE")
+
     acc_sale_price_surplus_ids = fields.One2many(
         "acc.sale.price.buyer", "acc_operation_id"
     )
@@ -189,18 +206,20 @@ class AccOperation(models.Model):
             }
         )
 
-        interval_ids = self.env["acc.sale.price"].search(
+        interval_ids = self.env["acc.price.conf"].search(
             [
                 ("acc_operation_id", "=", self.id),
                 ("acc_injection_id", "=", acc_injection_id.id),
                 ("acc_delivery_id", "=", acc_delivery_id.id),
                 ("start_date", "<=", date_start),
+                ("type", "=", "sale"),
                 ("end_date", "=", False),
             ]
         )
         if not interval_ids:
-            price_ids = self.env["acc.sale.price"].search(
+            price_ids = self.env["acc.price.conf"].search(
                 [
+                    ("type", "=", "sale"),
                     ("acc_operation_id", "=", self.id),
                     ("acc_injection_id", "=", acc_injection_id.id),
                     ("acc_delivery_id", "=", acc_delivery_id.id),
@@ -209,8 +228,9 @@ class AccOperation(models.Model):
                     ("end_date", "=", False),
                 ]
             )
-            price2_ids = self.env["acc.sale.price"].search(
+            price2_ids = self.env["acc.price.conf"].search(
                 [
+                    ("type", "=", "sale"),
                     ("acc_operation_id", "=", self.id),
                     ("acc_injection_id", "=", acc_injection_id.id),
                     ("acc_delivery_id", "=", acc_delivery_id.id),
@@ -449,8 +469,9 @@ class AccOperation(models.Model):
             }
         )
 
-        interval_ids = self.env["acc.sale.price.buyer"].search(
+        interval_ids = self.env["acc.price.conf"].search(
             [
+                ("type", "=", "buyer"),
                 ("acc_operation_id", "=", self.id),
                 ("acc_injection_id", "=", injection_id.id),
                 ("acc_buyer_id", "=", injection_id.buyer_id.id),
@@ -459,16 +480,18 @@ class AccOperation(models.Model):
             ]
         )
         if not interval_ids:
-            price_ids = self.env["acc.sale.price.buyer"].search(
+            price_ids = self.env["acc.price.conf"].search(
                 [
+                    ("type", "=", "buyer"),
                     ("acc_operation_id", "=", self.id),
                     ("acc_injection_id", "=", injection_id.id),
                     ("acc_buyer_id", "=", injection_id.buyer_id.id),
                     ("end_date", ">=", date_start),
                 ]
             )
-            price2_ids = self.env["acc.sale.price.buyer"].search(
+            price2_ids = self.env["acc.price.conf"].search(
                 [
+                    ("type", "=", "buyer"),
                     ("acc_operation_id", "=", self.id),
                     ("acc_injection_id", "=", injection_id.id),
                     ("acc_buyer_id", "=", injection_id.buyer_id.id),
@@ -569,7 +592,7 @@ class AccOperation(models.Model):
         :param  view_xmlid: Vue appelée
         :return: action
         """
-        wiz = self.env["acc.sale.price.wizard"].create({})
+        wiz = self.env["acc.price.conf.wizard"].create({})
         view_id = self.env.ref(
             "acc_account.%s" % view_xmlid,
         ).id
@@ -578,7 +601,7 @@ class AccOperation(models.Model):
             "type": "ir.actions.act_window",
             "view_type": "form",
             "view_mode": "form",
-            "res_model": "acc.sale.price.wizard",
+            "res_model": "acc.price.conf.wizard",
             "target": "new",
             "res_id": wiz.id,
             "view_id": view_id,
@@ -586,7 +609,7 @@ class AccOperation(models.Model):
         }
 
     def open_x2m_matrix(self):
-        return self._open_x2m_matrix("x2many_2d_matrix_demo")
+        return self._open_x2m_matrix("x2many_2d_matrix_sale")
 
     # ------------------------------------------------------
     # Financial method APP
diff --git a/models/acc_price_conf.py b/models/acc_price_conf.py
new file mode 100644
index 0000000..0e55429
--- /dev/null
+++ b/models/acc_price_conf.py
@@ -0,0 +1,175 @@
+# Copyright 2023 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from dateutil.relativedelta import relativedelta
+
+from odoo import _, api, fields, models
+from odoo.exceptions import ValidationError
+
+
+class AccPriceConf(models.Model):
+    _name = "acc.price.conf"
+    _description = "Gestion des prix"
+
+    def _get_default_currency_id(self):
+        return self.env.company.currency_id.id
+
+    # ------------------------------------------------------
+    # Fields declaration
+    # ------------------------------------------------------
+    acc_operation_id = fields.Many2one(
+        "acc.operation", "Opération", ondelete="cascade")
+    acc_injection_id = fields.Many2one(
+        "acc.counter",
+        domain=[("is_injection", "=", True)],
+        string="Point d'injection",
+        ondelete="cascade",
+    )
+    acc_delivery_id = fields.Many2one(
+        "acc.counter",
+        domain=[("is_delivery", "=", True)],
+        string="Point de soutirage",
+        ondelete="cascade",
+    )
+    acc_buyer_id = fields.Many2one(
+        "res.partner",
+        domain=[("is_buyer_surplus", "=", True)],
+        string="Acheteur de surplus",
+        ondelete="cascade",
+    )
+    start_date = fields.Date("Début de la période")
+    end_date = fields.Date("Fin de la période")
+    currency_id = fields.Many2one(
+        "res.currency", "Devise", default=_get_default_currency_id
+    )
+    price = fields.Float("Tarif", digits="Sale Price")
+    power_delivery = fields.Float(related="acc_delivery_id.power_delivery", store=True)
+    zip = fields.Char(related="acc_delivery_id.zip", store=True)
+    type = fields.Selection([
+        ("sale", "Vente"),
+        ("buyer", "Achat"),
+        ("accise", "ACCISE")
+    ], string="Type de prix")
+
+    @api.model_create_multi
+    def create(self, vals_list):
+        new_vals = []
+        for vals in vals_list:
+            if "acc_operation_id" in vals:
+                acc_operation_id = vals["acc_operation_id"]
+                acc_operation = self.env["acc.operation"].browse(acc_operation_id)
+            if "acc_injection_id" in vals:
+                acc_injection_id = vals["acc_injection_id"]
+            if "acc_delivery_id" in vals:
+                acc_delivery_id = vals["acc_delivery_id"]
+            else:
+                acc_delivery_id = False
+            if "acc_buyer_id" in vals:
+                acc_buyer_id = vals["acc_buyer_id"]
+            else:
+                acc_buyer_id = False
+            if "start_date" in vals:
+                start_date = fields.Date.to_date(vals["start_date"])
+            type = self.env.context.get("type")
+            vals["type"] = type
+            # If date start period doesn't exist
+            if type == "buyer":
+                price_ids = self.env["acc.price.conf"].search(
+                    [
+                        ("type", "=", type),
+                        ("acc_operation_id", "=", acc_operation_id),
+                        ("acc_buyer_id", "=", acc_buyer_id),
+                        ("acc_injection_id", "=", acc_injection_id),
+                    ]
+                )
+            else:
+                price_ids = self.env["acc.price.conf"].search(
+                    [
+                        ("type", "=", type),
+                        ("acc_operation_id", "=", acc_operation_id),
+                        ("acc_delivery_id", "=", acc_delivery_id),
+                        ("acc_injection_id", "=", acc_injection_id),
+                    ]
+                )
+
+            if acc_operation.date_start_contract > start_date:
+                raise ValidationError(
+                    _("L'opération n'est pas active à cette période là")
+                )
+
+            # Creation d'une nouvelle période date
+            # anniversaire à date renseignée - 1 jour
+            if not price_ids and acc_operation.date_start_contract < start_date:
+                val_new = {
+                    "acc_operation_id": acc_operation_id,
+                    "acc_injection_id": acc_injection_id,
+                    "acc_delivery_id": acc_delivery_id,
+                    "acc_buyer_id": acc_buyer_id,
+                    "price": vals["price"],
+                    "start_date": acc_operation.date_start_contract,
+                    "end_date": start_date - relativedelta(days=1),
+                    "type": type,
+                }
+                new_vals.append(val_new)
+
+            # Si une période existe après la date renseignée
+            if type == "buyer":
+                price_ids = self.env["acc.price.conf"].search(
+                    [
+                        ("acc_operation_id", "=", acc_operation_id),
+                        ("acc_buyer_id", "=", acc_buyer_id),
+                        ("acc_injection_id", "=", acc_injection_id),
+                        ("start_date", "<=", start_date),
+                        ("end_date", ">", start_date),
+                        ("type", "=", type),
+                    ]
+                )
+            else:
+                price_ids = self.env["acc.price.conf"].search(
+                    [
+                        ("acc_operation_id", "=", acc_operation_id),
+                        ("acc_delivery_id", "=", acc_delivery_id),
+                        ("acc_injection_id", "=", acc_injection_id),
+                        ("start_date", "<=", start_date),
+                        ("end_date", ">", start_date),
+                        ("type", "=", type),
+                    ]
+                )
+            if price_ids:
+                if type == "sale":
+                    message = "Un prix de vente existe déjà pour cette date là"
+                elif type == "buyer":
+                    message = "Un prix d'achat existe déjà pour cette date là"
+                else:
+                    message = "Un tarif ACCISE existe déjà pour cette date là"
+                raise ValidationError(
+                    _(message)
+                )
+
+            if type == "buyer":
+                price_id = self.env["acc.price.conf"].search(
+                    [
+                        ("type", "=", type),
+                        ("acc_operation_id", "=", acc_operation_id),
+                        ("acc_buyer_id", "=", acc_buyer_id),
+                        ("acc_injection_id", "=", acc_injection_id),
+                    ],
+                    limit=1,
+                    order="create_date desc",
+                )
+            else:
+                price_id = self.env["acc.price.conf"].search(
+                    [
+                        ("type", "=", type),
+                        ("acc_operation_id", "=", acc_operation_id),
+                        ("acc_delivery_id", "=", acc_delivery_id),
+                        ("acc_injection_id", "=", acc_injection_id),
+                    ],
+                    limit=1,
+                    order="create_date desc",
+                )
+            if price_id:
+                price_id.end_date = start_date - relativedelta(days=1)
+        vals_list += new_vals
+        res = super(AccPriceConf, self).create(vals_list)
+        return res
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 647f9df..4f95c3f 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -1,10 +1,14 @@
 id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
 "access_acc_sale_price_group_partner_manager","acc_sale_price group_partner_manager","model_acc_sale_price","base.group_partner_manager",1,1,1,1
 "access_acc_sale_price_group_user","acc_sale_price group_user","model_acc_sale_price","base.group_user",1,0,0,0
+"access_acc_price_conf_group_partner_manager","acc_price_conf group_partner_manager","model_acc_price_conf","base.group_partner_manager",1,1,1,1
+"access_acc_price_conf_group_user","acc_price_conf group_user","model_acc_price_conf","base.group_user",1,0,0,0
 "access_acc_sale_price_buyer_group_partner_manager","acc_sale_price_buyer group_partner_manager","model_acc_sale_price_buyer","base.group_partner_manager",1,1,1,1
 "access_acc_sale_price_buyer_group_user","acc_sale_price_buyer group_user","model_acc_sale_price_buyer","base.group_user",1,0,0,0
 "access_acc_sale_price_wizard_group_partner_manager","acc_sale_price_wizard group_partner_manager","model_acc_sale_price_wizard","base.group_partner_manager",1,1,1,1
 "access_acc_sale_price_wizard_group_user","acc_sale_price_wizard group_user","model_acc_sale_price_wizard","base.group_user",1,0,0,0
+"access_acc_price_conf_wizard_group_partner_manager","acc_price_conf_wizard group_partner_manager","model_acc_price_conf_wizard","base.group_partner_manager",1,1,1,1
+"access_acc_price_conf_wizard_group_user","acc_price_conf_wizard group_user","model_acc_price_conf_wizard","base.group_user",1,0,0,0
 "access_acc_sale_price_surplus_wizard_group_partner_manager","acc_sale_price_surplus_wizard group_partner_manager","model_acc_sale_price_surplus_wizard","base.group_partner_manager",1,1,1,1
 "access_acc_sale_price_surplus_wizard_group_user","acc_sale_price_surplus_wizard group_user","model_acc_sale_price_surplus_wizard","base.group_user",1,0,0,0
 "access_acc_account_group_partner_manager","acc_account group_partner_manager","model_acc_account","base.group_partner_manager",1,1,1,1
diff --git a/views/acc_operation_views.xml b/views/acc_operation_views.xml
index 5e68cd6..725eba6 100644
--- a/views/acc_operation_views.xml
+++ b/views/acc_operation_views.xml
@@ -77,15 +77,22 @@
                             <button
                                 string="Générer des Prix de vente"
                                 type="action"
-                                name="%(acc_account.act_x2many_2d_matrix_demo)d"
+                                context="{'type': 'sale'}"
+                                name="%(acc_account.act_x2many_2d_matrix_sale)d"
                                 class="btn-primary"
                                 attrs="{'invisible': [('is_account_active', '=', False)]}"
                             />
                         </header>
-                        <field name="acc_sale_price_ids" widget="one2many">
+                        <field
+                            name="acc_sale_price_conf_ids"
+                            widget="one2many"
+                            domain="[('type', '=', 'sale')]"
+                            context="{'default_type': 'sale'}"
+                        >
                             <tree editable="bottom" default_order="start_date desc">
                                 <field name="acc_injection_id" />
                                 <field name="acc_delivery_id" />
+                                <field name="power_delivery" />
                                 <field name="start_date" />
                                 <field name="end_date" />
                                 <field name="currency_id" invisible="1" />
@@ -102,12 +109,18 @@
                             <button
                                 string="Générer des Prix de vente Surplus"
                                 type="action"
-                                name="%(acc_account.act_x2many_2d_matrix_demo_surplus)d"
+                                context="{'type': 'buyer'}"
+                                name="%(acc_account.act_x2many_2d_matrix_buyer)d"
                                 class="btn-primary"
                                 attrs="{'invisible': [('is_account_active', '=', False)]}"
                             />
                         </header>
-                        <field name="acc_sale_price_surplus_ids" widget="one2many">
+                        <field
+                            name="acc_buyer_price_conf_ids"
+                            widget="one2many"
+                            domain="[('type', '=', 'buyer')]"
+                            context="{'default_type': 'buyer'}"
+                        >
                             <tree editable="bottom" default_order="start_date desc">
                                 <field name="acc_injection_id" />
                                 <field name="acc_buyer_id" />
@@ -118,6 +131,39 @@
                             </tree>
                         </field>
                     </page>
+                    <page
+                        string="Tarifs ACCISE"
+                        name="account_accise"
+                        attrs="{'invisible': [('is_account_active', '=', False)]}"
+                    >
+                        <header>
+                            <button
+                                string="Générer les Tarifs ACCISE"
+                                type="action"
+                                name="%(acc_account.act_x2many_2d_matrix_sale)d"
+                                class="btn-primary"
+                                context="{'type': 'accise'}"
+                                attrs="{'invisible': [('is_account_active', '=', False)]}"
+                            />
+                        </header>
+                        <field
+                            name="acc_accise_price_conf_ids"
+                            widget="one2many"
+                            domain="[('type', '=', 'accise')]"
+                            context="{'default_type': 'accise'}"
+                        >
+                            <tree editable="bottom" default_order="start_date desc">
+                                <field name="acc_injection_id" />
+                                <field name="acc_delivery_id" />
+                                <field name="power_delivery" />
+                                <field name="zip" />
+                                <field name="start_date" />
+                                <field name="end_date" />
+                                <field name="currency_id" invisible="1" />
+                                <field name="price" widget="monetary" />
+                            </tree>
+                        </field>
+                    </page>
                     <page
                         string="Facturation"
                         name="account"
diff --git a/views/acc_price_conf_views.xml b/views/acc_price_conf_views.xml
new file mode 100644
index 0000000..138e3bb
--- /dev/null
+++ b/views/acc_price_conf_views.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <data>
+
+        <record id="acc_price_conf_form_view" model="ir.ui.view">
+            <field name="name">acc.acc_price_conf.form</field>
+            <field name="model">acc.price.conf</field>
+            <field name="arch" type="xml">
+                <form string="Gestion des prix">
+                    <sheet>
+                        <group>
+                            <field name="type"/>
+                        </group>
+                        <group>
+                            <group>
+                                <field name="acc_operation_id" />
+                                <field name="acc_injection_id" />
+                                <field name="acc_delivery_id" attrs="{'invisible': [('type', '=', 'buyer')]}"/>
+                                <field name="acc_buyer_id" attrs="{'invisible': [('type', '!=', 'buyer')]}"/>
+                                <field name="power_delivery" attrs="{'invisible': [('type', '=', 'buyer')]}"/>
+                                <field name="zip" attrs="{'invisible': [('type', '!=', 'accise')]}"/>
+                            </group>
+                            <group>
+                                <field name="start_date" />
+                                <field name="end_date" />
+                                <field
+                                    name="price"
+                                    widget='monetary'
+                                    options="{'field_digits': True}"
+                                />
+                                <field name="currency_id" />
+                            </group>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+
+        <record id="acc_sale_price_conf_tree_view" model="ir.ui.view">
+            <field name="name">acc.sale.acc_price_conf.tree</field>
+            <field name="model">acc.price.conf</field>
+            <field name="arch" type="xml">
+                <tree string="Prix de vente" default_order="start_date desc">
+                    <field name="acc_operation_id" />
+                    <field name="acc_injection_id" />
+                    <field name="acc_delivery_id" />
+                    <field name="power_delivery" />
+                    <field name="start_date" />
+                    <field name="end_date" />
+                    <field name="currency_id" invisible="1" />
+                    <field
+                        name="price"
+                        widget="monetary"
+                        options="{'field_digits': True}"
+                    />
+                </tree>
+            </field>
+        </record>
+
+        <record id="acc_buyer_price_conf_tree_view" model="ir.ui.view">
+            <field name="name">acc.buyer.acc_price_conf.tree</field>
+            <field name="model">acc.price.conf</field>
+            <field name="arch" type="xml">
+                <tree string="Prix de vente" default_order="start_date desc">
+                    <field name="acc_operation_id" />
+                    <field name="acc_injection_id" />
+                    <field name="acc_buyer_id" />
+                    <field name="power_delivery" />
+                    <field name="start_date" />
+                    <field name="end_date" />
+                    <field name="currency_id" invisible="1" />
+                    <field
+                        name="price"
+                        widget="monetary"
+                        options="{'field_digits': True}"
+                    />
+                </tree>
+            </field>
+        </record>
+
+        <record id="acc_sale_price_conf_act_window" model="ir.actions.act_window">
+            <field name="name">Prix de Vente</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">acc.price.conf</field>
+            <field name="view_mode">tree,form</field>
+            <field name="domain">[('type', '=', 'sale')]</field>
+            <field name="context">{'default_type': 'sale'}</field>
+            <field name="view_id" ref="acc_sale_price_conf_tree_view" />
+            <field name="help" type="html">
+              <p class="o_view_nocontent_smiling_face">
+                Créer une entrée de données
+              </p>
+            </field>
+        </record>
+
+        <record id="acc_accise_price_conf_act_window" model="ir.actions.act_window">
+            <field name="name">Prix ACCISE</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">acc.price.conf</field>
+            <field name="view_mode">tree,form</field>
+            <field name="domain">[('type', '=', 'accise')]</field>
+            <field name="context">{'default_type': 'accise'}</field>
+            <field name="view_id" ref="acc_sale_price_conf_tree_view" />
+            <field name="help" type="html">
+              <p class="o_view_nocontent_smiling_face">
+                Créer une entrée de données
+              </p>
+            </field>
+        </record>
+
+        <record id="acc_buyer_price_conf_act_window" model="ir.actions.act_window">
+            <field name="name">Prix d'achat</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">acc.price.conf</field>
+            <field name="view_mode">tree,form</field>
+            <field name="domain">[('type', '=', 'buyer')]</field>
+            <field name="context">{'default_type': 'buyer'}</field>
+            <field name="view_id" ref="acc_buyer_price_conf_tree_view" />
+            <field name="help" type="html">
+              <p class="o_view_nocontent_smiling_face">
+                Créer une entrée de données
+              </p>
+            </field>
+        </record>
+
+    </data>
+</odoo>
diff --git a/views/menu_views.xml b/views/menu_views.xml
index 430795c..32c818b 100644
--- a/views/menu_views.xml
+++ b/views/menu_views.xml
@@ -17,21 +17,53 @@
             action="acc_account.action_acc_account"
         />
 
+<!--        <menuitem-->
+<!--            id="acc_sale_price_menu"-->
+<!--            parent="menu_account"-->
+<!--            name="Prix de vente"-->
+<!--            sequence="20"-->
+<!--            action="acc_sale_price_act_window"-->
+<!--        />-->
+
+<!--        <menuitem-->
+<!--            id="acc_sale_price_buyer_menu"-->
+<!--            parent="menu_account"-->
+<!--            name="Prix de vente Acheteur"-->
+<!--            sequence="30"-->
+<!--            action="acc_sale_price_buyer_act_window"-->
+<!--        />-->
+
         <menuitem
-            id="acc_sale_price_menu"
+            id="acc_sale_price_conf_menu"
             parent="menu_account"
-            name="Prix de vente"
+            name="Gestion Prix de vente"
             sequence="20"
-            action="acc_sale_price_act_window"
+            action="acc_sale_price_conf_act_window"
         />
 
         <menuitem
-            id="acc_sale_price_buyer_menu"
+            id="acc_accise_price_conf_menu"
             parent="menu_account"
-            name="Prix de vente Acheteur"
-            sequence="30"
-            action="acc_sale_price_buyer_act_window"
+            name="Gestion Tarifs ACCISE"
+            sequence="20"
+            action="acc_accise_price_conf_act_window"
+        />
+
+        <menuitem
+            id="acc_buyer_price_conf_menu"
+            parent="menu_account"
+            name="Gestion Prix d'achat"
+            sequence="20"
+            action="acc_buyer_price_conf_act_window"
         />
+<!--        -->
+<!--        <menuitem-->
+<!--            id="acc_sale_price_buyer_menu"-->
+<!--            parent="menu_account"-->
+<!--            name="Prix de vente Acheteur"-->
+<!--            sequence="30"-->
+<!--            action="acc_sale_price_buyer_act_window"-->
+<!--        />-->
 
         <menuitem
             id="acc_acc_account_menu"
diff --git a/wizard/__init__.py b/wizard/__init__.py
index 0f3a3cf..f5bf661 100644
--- a/wizard/__init__.py
+++ b/wizard/__init__.py
@@ -2,6 +2,7 @@
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
 from . import acc_sale_price_wizard
+from . import acc_price_conf_wizard
 from . import acc_sale_price_surplus_wizard
 from . import acc_account_wizard
 from . import acc_account_surplus_wizard
diff --git a/wizard/acc_price_conf_wizard.py b/wizard/acc_price_conf_wizard.py
new file mode 100644
index 0000000..3e1cf40
--- /dev/null
+++ b/wizard/acc_price_conf_wizard.py
@@ -0,0 +1,91 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from odoo import api, fields, models
+
+
+class AccPriceConfWizard(models.TransientModel):
+    _name = "acc.price.conf.wizard"
+    _description = "Gestion des prix wizard"
+
+    def _default_operation_id(self):
+        return self.env.context.get("active_id")
+
+    def _default_type(self):
+        return self.env.context.get("type")
+
+    def _default_price_conf_ids(self):
+        type = self.env.context.get("type")
+        if type == "buyer":
+            inj_ids = self.env["acc.counter"].search(
+                [
+                    ("is_injection", "=", True),
+                    ("acc_operation_id", "=", self.env.context.get("active_id")),
+                    ("buyer_id", "!=", False),
+                ]
+            )
+
+            return [
+                (
+                    0,
+                    0,
+                    {
+                        "acc_buyer_id": inj.buyer_id.id,
+                        "acc_injection_id": inj.id,
+                        "acc_operation_id": self.env.context.get("active_id"),
+                    },
+                )
+                # # if there isn't a demo line record for the user, create a new one
+                # if not rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == op) else
+                # # otherwise, return the line
+                # (4, rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == usr)[0].id)
+                for inj in inj_ids
+            ]
+        else:
+            inj_ids = self.env["acc.counter"].search(
+                [
+                    ("is_injection", "=", True),
+                    ("acc_operation_id", "=", self.env.context.get("active_id")),
+                ]
+            )
+            recs = self.env["acc.counter"].search(
+                [
+                    ("is_delivery", "=", True),
+                    ("acc_operation_id", "=", self.env.context.get("active_id")),
+                ]
+            )
+
+            return [
+                (
+                    0,
+                    0,
+                    {
+                        "acc_delivery_id": rec.id,
+                        "acc_injection_id": inj.id,
+                        "acc_operation_id": self.env.context.get("active_id"),
+                    },
+                )
+                # # if there isn't a demo line record for the user, create a new one
+                # if not rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == op) else
+                # # otherwise, return the line
+                # (4, rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == usr)[0].id)
+                for rec in recs
+                for inj in inj_ids
+            ]
+
+
+    acc_price_conf_ids = fields.Many2many(
+        "acc.price.conf", default=lambda self: self._default_price_conf_ids()
+    )
+    start_date = fields.Date("Début de période", default=fields.Date.context_today)
+    acc_operation_id = fields.Many2one("acc.operation", default=_default_operation_id)
+    type = fields.Selection([
+        ("sale", "Vente"),
+        ("buyer", "Achat"),
+        ("accise", "ACCISE")
+    ], default=_default_type)
+
+    @api.onchange("start_date")
+    def _onchange_start_date(self):
+        if self.start_date:
+            for price in self.acc_price_conf_ids:
+                price.start_date = self.start_date
+
diff --git a/wizard/acc_price_conf_wizard_views.xml b/wizard/acc_price_conf_wizard_views.xml
new file mode 100644
index 0000000..c284b60
--- /dev/null
+++ b/wizard/acc_price_conf_wizard_views.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="x2many_2d_matrix_sale" model="ir.ui.view">
+        <field name="name">acc.sale.price.conf.wizard.wiz</field>
+        <field name="model">acc.price.conf.wizard</field>
+        <field name="type">form</field>
+        <field name="arch" type="xml">
+            <form>
+                <field name="acc_operation_id" invisible="1" />
+                <group>
+                    <group>
+                        <field name="start_date" />
+                        <field name="type" invisible="1"/>
+                    </group>
+                </group>
+                <field
+                    name="acc_price_conf_ids"
+                    widget="x2many_2d_matrix"
+                    field_x_axis="acc_injection_id"
+                    field_y_axis="acc_delivery_id"
+                    field_value="price"
+                    show_row_totals="0"
+                    show_column_totals="0"
+                >
+                    <tree>
+                        <field name="acc_injection_id" />
+                        <field name="acc_delivery_id" />
+                        <field name="price" />
+                        <field name="type" />
+                        <field name="acc_operation_id" />
+                        <field name="start_date" />
+                    </tree>
+                </field>
+            </form>
+        </field>
+    </record>
+
+    <record id="x2many_2d_matrix_buyer" model="ir.ui.view">
+        <field name="name">acc.buyer.price.conf.wizard.wiz</field>
+        <field name="model">acc.price.conf.wizard</field>
+        <field name="type">form</field>
+        <field name="arch" type="xml">
+            <form>
+                <field name="acc_operation_id" invisible="1" />
+                <group>
+                    <group>
+                        <field name="start_date" />
+                        <field name="type" invisible="1"/>
+                    </group>
+                </group>
+                <field
+                    name="acc_price_conf_ids"
+                    widget="x2many_2d_matrix"
+                    field_x_axis="acc_injection_id"
+                    field_y_axis="acc_buyer_id"
+                    field_value="price"
+                    show_row_totals="0"
+                    show_column_totals="0"
+                >
+                    <tree>
+                        <field name="acc_injection_id" />
+                        <field name="acc_buyer_id" />
+                        <field name="price" />
+                        <field name="type" />
+                        <field name="acc_operation_id" />
+                        <field name="start_date" />
+                    </tree>
+                </field>
+            </form>
+        </field>
+    </record>
+
+    <record id="act_x2many_2d_matrix_sale" model="ir.actions.act_window">
+        <field name="name">Gestion prix de vente</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">acc.price.conf.wizard</field>
+        <field name="view_mode">form</field>
+        <field name="view_id" ref="x2many_2d_matrix_sale" />
+        <field name="target">new</field>
+    </record>
+
+    <record id="act_x2many_2d_matrix_buyer" model="ir.actions.act_window">
+        <field name="name">Gestion prix d'achat</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">acc.price.conf.wizard</field>
+        <field name="view_mode">form</field>
+        <field name="view_id" ref="x2many_2d_matrix_buyer" />
+        <field name="target">new</field>
+    </record>
+
+</odoo>
-- 
GitLab