diff --git a/__init__.py b/__init__.py
index e0e3732f51f7a29dcbf1f51f3a6edb926e723bac..39bfba2465a35b8e95ff9feea03fe6d0d58d2f86 100644
--- a/__init__.py
+++ b/__init__.py
@@ -2,3 +2,5 @@
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 
 from . import models
+from . import wizard
+from . import controllers
diff --git a/__manifest__.py b/__manifest__.py
index 2bf177ed276ceb6ec39858e5dc36b2ee73933312..a4a1454a9d34f89fbb397abd98eef4d95aadd6bf 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -23,8 +23,11 @@
         "views/sale_project_admin_state_views.xml",
         "views/product_template_views.xml",
         "views/res_partner_views.xml",
+        "views/sale_intervention_location_view.xml",
+        "views/sale_project_plant_goal_view.xml",
         # views menu
         # wizard
+        "wizard/ap_export_wizard_views.xml",
     ],
     "qweb": [
         # "static/src/xml/*.xml",
diff --git a/controllers/__init__.py b/controllers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..4435ea7c2ee09c4f3ce1973681bb40f75f0a7e21
--- /dev/null
+++ b/controllers/__init__.py
@@ -0,0 +1 @@
+from . import export
diff --git a/controllers/export.py b/controllers/export.py
new file mode 100644
index 0000000000000000000000000000000000000000..d056e26cacb12932aa0e09d357899072e49435a6
--- /dev/null
+++ b/controllers/export.py
@@ -0,0 +1,322 @@
+# Copyright 2021 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import io
+import xlsxwriter
+from odoo import http
+from odoo.http import request
+
+
+def export_xlsx(data_by_sheet):
+    """
+    Génère un fichier XLSX avec plusieurs feuilles.
+
+    :param data_by_sheet: dict où chaque clé est un nom de feuille,
+                          et chaque valeur est une liste de dictionnaires.
+                          Exemple :
+                          {
+                              'Feuille1': [{'Nom': 'Alice', 'Age': 30}],
+                              'Feuille2': [{'Produit': 'Widget', 'Prix': 20.5}]
+                          }
+    :return: binary XLSX content
+    """
+    output = io.BytesIO()
+    workbook = xlsxwriter.Workbook(output, {"in_memory": True})
+
+    for sheet_name, rows in data_by_sheet.items():
+        sheet = workbook.add_worksheet(sheet_name[:31])  # Excel limite à 31 caractères
+
+        if not rows:
+            continue
+
+        headers = list(rows[0].keys())
+        for col_idx, header in enumerate(headers):
+            if header[:3] == "ROT":
+                cell_format = workbook.add_format()
+                cell_format.set_rotation(90)
+                sheet.write(0, col_idx, header[3:], cell_format)
+            else:
+                sheet.write(0, col_idx, header)
+
+        for row_idx, row in enumerate(rows, start=1):
+            for col_idx, header in enumerate(headers):
+                sheet.write(row_idx, col_idx, row.get(header, ""))
+
+    workbook.close()
+    output.seek(0)
+    return output.read()
+
+
+class ApExportController(http.Controller):
+
+    def get_filename(self, type, saison):
+        prefix = {
+            "order": "suivi_commande",
+            "fin": "suivi_financeurs",
+            "tech": "suivi_technique",
+        }
+
+        return f"{prefix.get(type, 'fichier')}_{saison.name}.xlsx"
+
+    def get_nb_staples(self, inter_id):
+        staples = 0
+        if inter_id.mulch_has_staples:
+
+            if inter_id.mulch_id:
+                if inter_id.mulch_id.nb_accesories and inter_id.mulch_id.nb_accesories > 0.0:
+                    mulch_qty = inter_id.mulch_id.nb_accesories
+                else:
+                    mulch_qty = 2
+                staples += inter_id.mulch_qty * mulch_qty
+
+        if inter_id.mulch2_has_staples:
+
+            if inter_id.mulch2_id:
+                if inter_id.mulch2_id.nb_accesories and inter_id.mulch2_id.nb_accesories > 0.0:
+                    mulch2_qty = inter_id.mulch2_id.nb_accesories
+                else:
+                    mulch2_qty = 2
+                staples += inter_id.mulch2_qty * mulch2_qty
+
+        return staples if staples > 0 else ""
+
+    def get_linked_contact(self, partner_id):
+        if partner_id.child_ids:
+            return ",".join([child.name for child in partner_id.child_ids])
+        return ""
+
+    def get_financial_help(self, inter):
+        if inter.financial_help_ids:
+            return ",".join([h.name for h in inter.financial_help_ids])
+        return ""
+
+    def get_nb_big_trees(self, inter_id):
+        if inter_id.plant_sequence_ids:
+            to_count = inter_id.plant_sequence_ids
+        else:
+            to_count = inter_id.plant_list_ids
+
+        trees = to_count.search([("scale", "=", "big")])
+        return len(trees) if len(trees) > 0 else ""
+
+    def get_order_data(self, saison):
+        """
+        export commande
+        """
+        # un onglet par programme (subvention)
+        programmes = request.env["sale.project.subvention"].search([])
+
+        # fichier final
+        file = {}
+
+        for programme in programmes:
+
+            page = []
+
+            # tout les projets sous ce programme pour la saison dont le devis est signé
+            projects = request.env["sale.project"].search(
+                [
+                    ("saison_id", "=", saison.id),
+                    ("project_subvention_id", "=", programme.id),
+                    ("sale_order_id.state", "=", "sale"),
+                ]
+            )
+            interventions = request.env["sale.intervention"].search(
+                [("project_id", "in", projects.ids)]
+            )
+            plant_data = {}
+            # sauvegarde de la liste des planteurs pour la premiere ligne
+            seeders_list = []
+            for intervention in interventions:
+                seeders_list.append(intervention.partner_id)
+                for sequence in intervention.plant_sequence_ids:
+                    plant = plant_data.setdefault(sequence.product_id, {})
+                    if plant.get(f"ROT{intervention.partner_id.name}"):
+                        plant[f"ROT{intervention.partner_id.name}"] += sequence.qty
+                    else:
+                        plant[f"ROT{intervention.partner_id.name}"] = sequence.qty
+
+            # format data for xls
+            for plant in plant_data:
+                line = {}
+                line.update(
+                    {
+                        "Article": plant.name,
+                        "Nom latin": plant.latin_name or "",
+                        "Nom de la catégorie": plant.categ_id.name or "",
+                        "Numéro de pépiniériste": plant.categ_id.nurseryman_id or "",
+                    }
+                )
+                qty = plant_data.get(plant)
+                for seeder in qty:
+                    line[seeder] = qty[seeder]
+                page.append(line)
+
+            # si on des commandes pour ce programe on l ajoute au fichier
+            if page:
+                # on construit la premier ligne avec les secteurs
+                # de plantation par planteur
+
+                first_line = {
+                    "Article": "Secteur plantation",
+                    "Nom latin": "",
+                    "Nom de la catégorie": "",
+                    "Numéro de pépiniériste": "",
+                }
+
+                for seeder in set(seeders_list):
+                    secteur_plat = (
+                        request.env["sale.project"]
+                        .search([("partner_id", "=", seeder.id)])
+                        .mapped("plant_sector_id")
+                        .mapped("name")
+                    )
+                    first_line[f"ROT{seeder.name}"] = ",".join(secteur_plat)
+                page.insert(0, first_line)
+                file[programme.name] = page
+
+        return file
+
+    def get_fin_data(self, saison):
+        """
+        export suivi financeurs
+        """
+        sheet_name = "suivi financeurs"
+        file = {sheet_name: []}
+
+        projects = request.env["sale.project"].search(
+            [("saison_id", "=", saison.id), ("state", "=", "sale")]
+        )
+
+        for project in projects:
+            if project.intervention_ids:
+                for inter in project.intervention_ids:
+                    project_data = {
+                        "Saison": saison.name or "",
+                        "Programme": project.project_subvention_id.name or "",
+                        "Numéro client": project.partner_id.ref or "",
+                        "Secteur de plantation": project.plant_sector_id.name or "",
+                        "Secteur de livraison": project.delivery_sector_id.name or "",
+                        "Réferent": project.user_id.name or "",
+                        "Planteur": project.partner_id.name or "",
+                        "Contacts": self.get_linked_contact(project.partner_id),
+                        "Adresse (rue)": project.partner_id.street or "",
+                        "Adresse (rue 2)": project.partner_id.street2 or "",
+                        "Code postal": project.partner_id.zip or "",
+                        "Ville": project.partner_id.city or "",
+                        "Télephone": project.partner_id.phone or "",
+                        "Email": project.partner_id.email or "",
+                        "Commune intervention": inter.city or "",
+                        "Geo latitude": str(inter.latitude).replace(",", "."),
+                        "Geo longitude": str(inter.longitude).replace(",", "."),
+                        "Bord de départementale": inter.near_road or "",
+                        "Forme juridique": project.partner_id.partner_company_type_id.name
+                        or "",
+                        "Type de culture": project.partner_id.culture_type_id.name
+                        or "",
+                        "Date de première adhésion": (
+                            project.partner_id.year_1st_membership.strftime("%d-%m-%Y")
+                            if project.partner_id.year_1st_membership
+                            else ""
+                        ),
+                        "Diffusion sur site internet": dict(
+                            project._fields["online"].selection
+                        ).get(project.online)
+                        or "",
+                        "Longueur de haie": inter.intervention_length or "",
+                        "Nombre de plants": inter.plant_qty or "",
+                        "Surface (en m²)": inter.surface or "",
+                        "Dont nombre total d'arbres (grands)": self.get_nb_big_trees(
+                            inter
+                        ),
+                        "Type d'intervention": inter.intervention_type_id.name or "",
+                        "Implantation": inter.location_id.name or "",
+                        "Objectif plantation": project.plant_goal_id.name or "",
+                        "Avancement": project.admin_state_id.name,
+                        "Aides financières": self.get_financial_help(inter),
+                    }
+
+                    file.get(sheet_name).append(project_data)
+
+        return file
+
+    def get_tech_data(self, saison):
+        """
+        export suivi technique
+        """
+        sheet_name = "suivi technique"
+        file = {sheet_name: []}
+        projects = request.env["sale.project"].search(
+            [("saison_id", "=", saison.id), ("state", "=", "sale")]
+        )
+
+        for project in projects:
+            if project.intervention_ids:
+                for inter in project.intervention_ids:
+                    project_data = {
+                        "Saison": saison.name or "",
+                        "Programme": project.project_subvention_id.name or "",
+                        "Client": project.partner_id.ref or "",
+                        "Secteur de plantation": project.plant_sector_id.name or "",
+                        "Secteur de livraison": project.delivery_sector_id.name or "",
+                        "Réferent": project.user_id.name or "",
+                        "Planteur": project.partner_id.name or "",
+                        "Contacts": self.get_linked_contact(project.partner_id),
+                        "Adresse (rue)": project.partner_id.street or "",
+                        "Adresse (rue 2)": project.partner_id.street2 or "",
+                        "Code postal": project.partner_id.zip or "",
+                        "Ville": project.partner_id.city or "",
+                        "Télephone": project.partner_id.phone or "",
+                        "Email": project.partner_id.email or "",
+                        "Commune intervention": inter.city or "",
+                        "Longueur de haie": inter.intervention_length or "",
+                        "Nombre de plants": inter.plant_qty or "",
+                        "Surface (en m²)": inter.surface or "",
+                        "Dont nombre total d'arbres (grands)": self.get_nb_big_trees(
+                            inter
+                        ),
+                        "Type d'intervention": inter.intervention_type_id.name or "",
+                        "Paillage 1": inter.mulch_id.name or "",
+                        "Paillage 2": inter.mulch2_id.name or "",
+                        "Qté paillage 1": inter.mulch_qty or "",
+                        "Qté paillage 2": inter.mulch2_qty or "",
+                        "Nom fournisseur copeaux/écorce": project.bark_supplier or "",
+                        "Qté protegée haut": inter.high_protection_qty or "",
+                        "Qté piquets": inter.stake_qty or "",
+                        "Qté protegée bas": inter.low_protection_qty or "",
+                        "Qté bambous": inter.bamboo_qty or "",
+                        "Nombre d'agrafes": self.get_nb_staples(inter),
+                        "Nombre de collerettes": inter.collarette_qty or "",
+                        "Mois livraison": project.delivery_month or "",
+                        "Accueil démo": dict(project._fields["demo"].selection).get(
+                            project.demo
+                        )
+                        or "",
+                        "Commentaires": project.comment or "",
+                    }
+
+                    file.get(sheet_name).append(project_data)
+
+        return file
+
+    @http.route("/ap_export/xlsx_download", type="http", auth="user")
+    def download_xlsx(self, wizard_id, **kwargs):
+        wizard = request.env["ap.export.wizard"].browse(int(wizard_id))
+        filename = self.get_filename(wizard.export_type, wizard.saison_id)
+
+        data_methods = {
+            "order": self.get_order_data,
+            "fin": self.get_fin_data,
+            "tech": self.get_tech_data,
+        }
+
+        xlsx_data = export_xlsx(data_methods.get(wizard.export_type)(wizard.saison_id))
+
+        headers = [
+            (
+                "Content-Type",
+                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+            ),
+            ("Content-Disposition", 'attachment; filename="%s"' % filename),
+        ]
+        return request.make_response(xlsx_data, headers)
diff --git a/models/product_category.py b/models/product_category.py
index c2330f95f4c669b0ef60586e9b982678803a8a85..169a51432357e7fd24e351dc82e62c69f951d55a 100644
--- a/models/product_category.py
+++ b/models/product_category.py
@@ -12,6 +12,7 @@ class ProductCategory(models.Model):
     # ------------------------------------------------------
     symbol = fields.Char("Symbole")
     accessory_label = fields.Char("Nom de l'accessoire associé")
+    nurseryman_id =  fields.Char("Numéro de pépinieriste")
 
     # ------------------------------------------------------
     # SQL Constraints
diff --git a/models/product_template.py b/models/product_template.py
index 79224d0677b6b4eb46fd20a105d2f7f1a4e5bcb7..ece02f6ad9be486e520a241c1b7ce14dd3229dbb 100644
--- a/models/product_template.py
+++ b/models/product_template.py
@@ -13,6 +13,9 @@ class ProductTemplate(models.Model):
     nb_accesories = fields.Float("Nombre d'accessoires")
     accessory_label = fields.Char(related="categ_id.accessory_label", readonly=True)
     mulch_quantity_multiplier = fields.Float("Multiplicateur paillage", default=1.0)
+    latin_name = fields.Char(
+         string="Nom latin"
+    )
 
     # ------------------------------------------------------
     # SQL Constraints
diff --git a/models/sale_intervention.py b/models/sale_intervention.py
index e90e6bb8cc4f2571246e9aaa9df245ff2d31005b..098f22fd315b78dd8cd319b112d41ca10f4bdd58 100644
--- a/models/sale_intervention.py
+++ b/models/sale_intervention.py
@@ -439,6 +439,13 @@ class SaleIntervention(models.Model):
         inverse_name="sale_intervention_id",
         string="Articles à déstocker",
     )
+    location_id = fields.Many2one(
+        "sale.intervention.location",
+        "Implantation",
+        ondelete="restrict",
+    )
+
+    near_road = fields.Char("Bord de départementale")
 
     # ------------------------------------------------------
     # SQL Constraints
@@ -1041,3 +1048,11 @@ class SaleIntervention(models.Model):
         res = super().unlink()
         project_id.update_order_lines()
         return res
+
+
+class SaleInterventionLocation(models.Model):
+    _name = "sale.intervention.location"
+    _description = "Implantation"
+    _order = "name"
+
+    name = fields.Char(string="Implantation", required=True)
diff --git a/models/sale_intervention_plant_sequence.py b/models/sale_intervention_plant_sequence.py
index 32984f192c1b42ebe96150fd06a05909bb6cf144..d9703ff6fa7af10186fe0a91bf5366f76ab933bc 100644
--- a/models/sale_intervention_plant_sequence.py
+++ b/models/sale_intervention_plant_sequence.py
@@ -46,6 +46,14 @@ class SaleInterventionPlantSequence(models.Model):
     qty = fields.Integer("Qté par espèces")
     sequence = fields.Integer(string="Ordre dans la séquence", default=10)
     is_list = fields.Boolean("Est une construction liste")
+    scale = fields.Selection(
+        [
+            ("little", "Petit"),
+            ("middle", "Moyen"),
+            ("big", "Grand"),
+        ],
+        string="Taille",
+    )
 
     # ------------------------------------------------------
     # SQL Constraints
diff --git a/models/sale_project.py b/models/sale_project.py
index 0883c192e6cb4f75253d300087234f219db944b5..26981a60b963a5be428760f66606b3a71493777a 100644
--- a/models/sale_project.py
+++ b/models/sale_project.py
@@ -124,7 +124,14 @@ class SaleProject(models.Model):
         readonly=True,
         states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
     )
-
+    plant_sector_id = fields.Many2one(
+        comodel_name="res.partner.geo.sector", string="Secteur de plantation"
+    )
+    delivery_sector_id = fields.Many2one(
+        comodel_name="res.partner.geo.sector", string="Secteur de livraison"
+    )
+    bark_supplier = fields.Char("Fournisseur de copeaux/écorce")
+    comment = fields.Text("Commentaires")
     saison_id = fields.Many2one(
         "sale.project.saison",
         "Saison",
@@ -132,6 +139,44 @@ class SaleProject(models.Model):
         ondelete="restrict",
     )
     date_visit = fields.Date("Date de visite")
+    delivery_month = fields.Selection(
+        [
+            ("1", "Janvier"),
+            ("2", "Février"),
+            ("3", "Mars"),
+            ("4", "Avril"),
+            ("5", "Mai"),
+            ("6", "Juin"),
+            ("7", "Juillet"),
+            ("8", "Août"),
+            ("9", "Septembre"),
+            ("10", "Octobre"),
+            ("11", "Novembre"),
+            ("12", "Décembre"),
+        ],
+        string="Mois de livraison",
+    )
+    demo = fields.Selection(
+        [
+            ("yes", "Oui"),
+            ("no", "Non"),
+        ],
+        string="Accueil démo",
+    )
+
+    online = fields.Selection(
+        [
+            ("yes", "Oui"),
+            ("no", "Non"),
+        ],
+        string="Diffusion sur site internet",
+    )
+
+    plant_goal_id = fields.Many2one(
+        "sale.project.plant.goal",
+        "Objectif plantation",
+        ondelete="restrict",
+    )
 
     intervention_ids = fields.One2many(
         comodel_name="sale.intervention",
@@ -385,6 +430,14 @@ class SaleProjectSaison(models.Model):
     end_date = fields.Date("Date de fin", required=True)
 
 
+class SaleProjectPlantGoal(models.Model):
+    _name = "sale.project.plant.goal"
+    _description = "Objectif plantation"
+    _order = "name"
+
+    name = fields.Char(string="Objectif plantation", required=True)
+
+
 class SaleProjectAdminState(models.Model):
     _name = "sale.project.admin.state"
     _description = "Étapes du projet"
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 997ea4073c668c5b0d6d06b745158d8b756b89b1..bb3e91914a345937b4db4091e1e70b2187955f2b 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -8,4 +8,8 @@ sale_financial_help_salesteam,sale_financial_help_salesteam,model_sale_financial
 sale_intervention_salesteam,sale_intervention_salesteam,model_sale_intervention,sales_team.group_sale_salesman,1,1,1,1
 sale_intervention_stock_salesteam,sale_intervention_stock_salesteam,model_sale_intervention_stock,sales_team.group_sale_salesman,1,1,1,1
 sale_intervention_plant_sequence_salesteam,sale_intervention_plant_sequence_salesteam,model_sale_intervention_plant_sequence,sales_team.group_sale_salesman,1,1,1,1
+sale_intervention_location_salesteam,sale_intervention_location_salesteam,model_sale_intervention_location,sales_team.group_sale_salesman,1,1,1,1
 sale_project_subvention_salesteam,sale_project_subvention_salesteam,model_sale_project_subvention,sales_team.group_sale_salesman,1,1,1,1
+sale_project_plant_goal_salesteam,sale_project_plant_goal_salesteam,model_sale_project_plant_goal,sales_team.group_sale_salesman,1,1,1,1
+access_ap_export_wizard,access_ap_export_wizard,model_ap_export_wizard,sales_team.group_sale_salesman,1,1,1,0
+
diff --git a/views/product_template_views.xml b/views/product_template_views.xml
index 31b5080f097de04f4663f078576d24c6b3cbfccf..35e7c2600dae356680752231a35295796c1110ba 100644
--- a/views/product_template_views.xml
+++ b/views/product_template_views.xml
@@ -9,7 +9,19 @@
                 <field name="parent_id" position="after">
                     <field name="symbol" />
                     <field name="accessory_label" />
-                    <field name="name" />
+                    <field name="nurseryman_id" />
+                </field>
+            </field>
+        </record>
+
+
+        <record id="product_template_form_view" model="ir.ui.view">
+            <field name="name">product.template.form.inherit</field>
+            <field name="model">product.template</field>
+            <field name="inherit_id" ref="product.product_template_form_view" />
+            <field name="arch" type="xml">
+                <field name="type" position="after">
+                    <field name="latin_name" />
                 </field>
             </field>
         </record>
diff --git a/views/sale_intervention_location_view.xml b/views/sale_intervention_location_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..04b672c5fb1215c7ba11648e8c9d85d3308a530a
--- /dev/null
+++ b/views/sale_intervention_location_view.xml
@@ -0,0 +1,29 @@
+<odoo>
+
+    <!-- List View-->
+    <record id="sale_intervention_admin_location_view_list" model="ir.ui.view">
+        <field name="name">Implantation</field>
+        <field name="model">sale.intervention.location</field>
+        <field name="arch" type="xml">
+            <tree editable="bottom">
+                <field name="name" />
+            </tree>
+        </field>
+    </record>
+
+    <!-- Actions opening views on models -->
+    <record model="ir.actions.act_window" id="sale_intervention_admin_location_act_window">
+        <field name="name">Implantation</field>
+        <field name="res_model">sale.intervention.location</field>
+        <field name="view_mode">tree</field>
+    </record>
+
+    <!-- Menu Items -->
+    <menuitem
+        id="menu_sale_intervention_admin_goal"
+        name="Implantation"
+        parent="ap_sale_project.menu_sale_project_config"
+        action="sale_intervention_admin_location_act_window"
+        sequence="22"
+    />
+</odoo>
diff --git a/views/sale_intervention_view.xml b/views/sale_intervention_view.xml
index d844bccff5d29bc53402ef518032f626f44a342e..4b08390fdab7af5a79d60ed888e0677948ca1fdc 100644
--- a/views/sale_intervention_view.xml
+++ b/views/sale_intervention_view.xml
@@ -25,6 +25,8 @@
                                 name="intervention_type_id"
                                 options="{'no_open': True, 'no_create': True}"
                             />
+                            <field name="location_id" />
+                            <field name="near_road" />
                             <field name="intervention_uom_name" invisible="True" />
                         </group>
                         <group>
@@ -215,6 +217,7 @@
                                 />
                                     <field name="qty" />
                                     <field name="is_local" />
+                                    <field name="scale" />
                                 </tree>
                             </field>
                             <field
@@ -240,6 +243,7 @@
                                     options="{'no_open': True, 'no_create': True}"
                                 />
                                     <field name="is_local" />
+                                    <field name="scale" />
                                 </tree>
                             </field>
                          <group
diff --git a/views/sale_project_plant_goal_view.xml b/views/sale_project_plant_goal_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aeaceee12f84a49a73d7b8d1097e8cfdb867a2b2
--- /dev/null
+++ b/views/sale_project_plant_goal_view.xml
@@ -0,0 +1,30 @@
+<odoo>
+
+    <!-- List View-->
+    <record id="sale_project_admin_goal_view_list" model="ir.ui.view">
+        <field name="name">Objectif plantation</field>
+        <field name="model">sale.project.plant.goal</field>
+        <field name="arch" type="xml">
+            <tree editable="bottom">
+                <field name="name" />
+            </tree>
+        </field>
+    </record>
+
+    <!-- Actions opening views on models -->
+    <record model="ir.actions.act_window" id="sale_project_admin_location_act_window">
+        <field name="name">Objectif plantation</field>
+        <field name="res_model">sale.project.plant.goal</field>
+        <field name="view_mode">tree</field>
+    </record>
+
+    <!-- Menu Items -->
+    <menuitem
+        id="menu_sale_project_admin_goal"
+        name="Objectif plantation"
+        parent="ap_sale_project.menu_sale_project_config"
+        action="sale_project_admin_location_act_window"
+        sequence="21"
+    />
+
+</odoo>
diff --git a/views/sale_project_view.xml b/views/sale_project_view.xml
index 1c4da6f7486d2345733c66efaf6609909be21eaf..0ec7675d824421f2ec0d84991ffd43a9516cde18 100644
--- a/views/sale_project_view.xml
+++ b/views/sale_project_view.xml
@@ -38,11 +38,19 @@
                             <group>
                                 <field name="project_subvention_id" readonly="True" />
                                 <field name="geo_sector_id" />
+                                <field name="plant_sector_id" />
+                                <field name="delivery_sector_id" />
                                 <field name="user_id" />
+                                <field name="bark_supplier" />
                             </group>
                             <group>
                                 <field name="saison_id" />
                                 <field name="date_visit" />
+                                <field name="comment" />
+                                <field name="delivery_month" />
+                                <field name="demo" />
+                                <field name="plant_goal_id" />
+                                <field name="online" />
                                 <field name="state" invisible="1" />
                             </group>
                         </group>
diff --git a/wizard/__init__.py b/wizard/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ae425c924e9a1504dd007de9a1082e963b43eef
--- /dev/null
+++ b/wizard/__init__.py
@@ -0,0 +1 @@
+from . import ap_export_wizard
diff --git a/wizard/ap_export_wizard.py b/wizard/ap_export_wizard.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b36c9d55466b884f16d9c18231650bf24ace704
--- /dev/null
+++ b/wizard/ap_export_wizard.py
@@ -0,0 +1,31 @@
+# Copyright 2021 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import models, fields
+
+
+class ApExportWizard(models.TransientModel):
+    _name = "ap.export.wizard"
+    _description = "Export de données"
+
+    export_type = fields.Selection(
+        [
+            ("order", "Commandes"),
+            ("fin", "Suivi financeurs"),
+            ("tech", "Suivi technique"),
+        ],
+        required=True,
+        default="order",
+        string="Type d'export"
+    )
+
+    saison_id = fields.Many2one(
+        comodel_name="sale.project.saison", string="Saison", required=True
+    )
+
+    def action_exporter(self):
+        return {
+            "type": "ir.actions.act_url",
+            "url": f"/ap_export/xlsx_download?wizard_id={self.id}",
+            "target": "self",
+        }
diff --git a/wizard/ap_export_wizard_views.xml b/wizard/ap_export_wizard_views.xml
new file mode 100644
index 0000000000000000000000000000000000000000..abe37f58af60eceb676b01e597e305cbcfc73c3f
--- /dev/null
+++ b/wizard/ap_export_wizard_views.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" ?>
+<!-- Copyright 2025 Le Filament
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+    <data>
+        <record id="view_ap_export_wizard_form" model="ir.ui.view">
+            <field name="name">ap.export.wizard.form</field>
+            <field name="model">ap.export.wizard</field>
+            <field name="arch" type="xml">
+                <form string="Export de données">
+                    <group>
+                        <field name="export_type"/>
+                    </group>
+                    <group>
+                        <field name="saison_id"/>
+                    </group>
+                    <footer>
+                        <button string="Valider" type="object" name="action_exporter" class="btn-primary"/>
+                        <button string="Annuler" class="btn-secondary" special="cancel"/>
+                    </footer>
+                </form>
+            </field>
+        </record>
+
+        <record id="action_ap_export_wizard" model="ir.actions.act_window">
+            <field name="name">Export de données</field>
+            <field name="res_model">ap.export.wizard</field>
+            <field name="view_mode">form</field>
+            <field name="target">new</field>
+        </record>
+
+        <menuitem
+            id="menu_export_root"
+            name="Export de données"
+            parent="sale.sale_menu_root"
+            sequence="7"
+            groups="sales_team.group_sale_salesman"
+        />
+
+        <menuitem
+            id="menu_export_wizard"
+            parent="menu_export_root"
+            name="Exporter"
+            action="action_ap_export_wizard"
+            sequence="10"
+            groups="sales_team.group_sale_salesman"
+        />
+
+    </data>
+</odoo>