From 7e9c0e1dfb4f798ee2002d61ef83dae718db3440 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com>
Date: Mon, 20 Jan 2025 11:37:19 +0100
Subject: [PATCH] [DEL] remove dependency to Alfresco not used anymore

---
 __manifest__.py               |   2 +-
 models/__init__.py            |   1 -
 models/account_invoice.py     |  83 -------
 models/lefilament_alfresco.py |  82 -------
 models/project.py             | 423 ----------------------------------
 views/project_views.xml       |  24 --
 6 files changed, 1 insertion(+), 614 deletions(-)
 delete mode 100644 models/lefilament_alfresco.py

diff --git a/__manifest__.py b/__manifest__.py
index 620d246..0e80ae2 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -5,7 +5,7 @@
     "website": "https://www.le-filament.com",
     "version": "12.0.1.0.1",
     "license": "AGPL-3",
-    "depends": ["adefpat_project", "adefpat_alfresco_generation", "adefpat_account"],
+    "depends": ["adefpat_project", "adefpat_account"],
     "data": [
         "security/ir.model.access.csv",
         "views/account_invoice_views.xml",
diff --git a/models/__init__.py b/models/__init__.py
index d611a8c..fec8fd7 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -3,4 +3,3 @@
 
 from . import project
 from . import account_invoice
-from . import lefilament_alfresco
diff --git a/models/account_invoice.py b/models/account_invoice.py
index 47e9943..0822d2f 100644
--- a/models/account_invoice.py
+++ b/models/account_invoice.py
@@ -42,86 +42,3 @@ class AccountInvoice(models.Model):
     # ------------------------------------------------------
     # Business methods
     # ------------------------------------------------------
-    @api.multi
-    def generate_alfresco_file(self):
-        """
-        Ajoute un fichier sur la GED Alfresco
-        @return: fonction get_partner_files() de res.partner
-        """
-        if self.is_avenant:
-            # Get proof folder nodeRef
-            backend = self.env["cmis.backend"].search([], limit=1)
-            # Si la facture a déjà été créée, ouvrir dans Alfresco
-            if self.alfresco_file:
-                prop = (
-                    backend.get_cmis_repository()
-                    .getFolder(self.alfresco_file)
-                    .getProperties()
-                )
-                url = backend.get_content_details_url_from_props(prop)
-            # Sinon, la créer, puis la stocker ainsi que les documents liées à la
-            # facture dans Alfresco
-            else:
-                project_folder = self.project_id.cmis_folder
-                self.cmis_folder = project_folder
-
-                if not project_folder:
-                    raise UserError(_("Le dossier du projet n'est pas configuré"))
-
-                # Get Mimetype
-                attachment = self.env.ref(
-                    "account.account_invoices"
-                ).retrieve_attachment(self)
-                if not attachment:
-                    raise UserError(
-                        _(
-                            "La facture n'a pas encore été générée. "
-                            "Imprimer la facture pour pouvoir la visualiser dans Alfresco"
-                        )
-                    )
-
-                content_type = attachment.mimetype
-
-                path_proj = (
-                    backend.get_cmis_repository().getFolder(project_folder).getPaths()
-                )
-
-                # Get template doc Facture
-                template_doc = self.env["adefpat.template.doc"].search(
-                    [("type_temp", "=", "facture_av"), ("noderef_document", "=", False)]
-                )
-
-                # Get doc linked to Facture
-                template_doc_ids = self.env["adefpat.template.doc"].search(
-                    [
-                        ("type_temp", "=", "facture_av"),
-                        ("noderef_document", "!=", False),
-                    ]
-                )
-
-                # Strore template in Alfresco
-                for template in template_doc_ids:
-                    keys = self.fill_data()
-                    self._publipostage_documents(template, keys, False)
-
-                path_n0 = path_proj + [template_doc.dossier.name]
-                path = "/".join(path_n0)
-                cmis_obj = backend.get_folder_by_path(path)
-
-                file = cmis_obj.createDocument(
-                    name=attachment.name,
-                    properties={},
-                    contentFile=base64.b64decode(attachment.datas),
-                    contentType=content_type,
-                )
-                file_id = file.getProperties().get("cmis:objectId")
-                self.alfresco_file = file.getObjectId()
-                prop = backend.get_cmis_repository().getFolder(file_id).getProperties()
-                url = backend.get_content_details_url_from_props(prop)
-            return {
-                "type": "ir.actions.act_url",
-                "url": url,
-                "target": "new",
-            }
-        else:
-            return super(AccountInvoice, self).generate_alfresco_file()
diff --git a/models/lefilament_alfresco.py b/models/lefilament_alfresco.py
deleted file mode 100644
index 5da9b35..0000000
--- a/models/lefilament_alfresco.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# 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
-
-
-class LeFilamentAlfresco(models.AbstractModel):
-    """Appelle l'API alfresco et implémente les fonctions suivantes :"""
-
-    _inherit = "lefilament.alfresco"
-
-    def _publipostage_documents_malette_avenant(
-        self, template_doc, keys_obj=None, versionable=None
-    ):
-        url = "/alfresco/s/publipostage"
-
-        # Récupération du backend
-        backend_name = self._fields["cmis_folder"]
-        backend = backend_name.get_backend(self.env)
-
-        # Création du path
-        path_all, dossier_id = template_doc.get_path_all()
-        if dossier_id.model_id.model == "res.partner.porteur.project":
-            object_ids = self.env["res.partner.porteur.project"].search(
-                [("project_id", "=", self.id), ("is_malette_ok", "=", False)]
-            )
-
-            for obj in object_ids:
-                if obj.cmis_folder:
-                    parent_path = (
-                        backend.get_cmis_repository()
-                        .getFolder(obj.cmis_folder)
-                        .getPaths()
-                    )
-                    if path_all:
-                        path_n0 = parent_path + [path_all]
-                    else:
-                        path_n0 = parent_path
-                    path = "/".join(path_n0)
-                    keys = obj.fill_data()
-                    keys_obj.update(keys)
-
-                    # Document PDF
-                    cmis_obj_nodeRef = backend.get_folder_by_path(path).getProperties()[
-                        "alfcmis:nodeRef"
-                    ]
-                    mimetype = template_doc.name.split(".")[1]
-                    if mimetype == "pdf":
-                        # get ID document to copy
-                        id_doc = template_doc.noderef_document.replace(
-                            "workspace://SpacesStore/", ""
-                        )
-                        # Get ID to noderef Folder parent
-                        id_parent = cmis_obj_nodeRef.replace(
-                            "workspace://SpacesStore/", ""
-                        )
-                        uri = (
-                            "/alfresco/s/slingshot/doclib/action/copy-to/"
-                            "node/workspace/SpacesStore/" + id_parent
-                        )
-                        workspace = "workspace://SpacesStore/" + id_doc
-                        workspace_parent = "workspace://SpacesStore/" + id_parent
-                        # Copy the document and retur the objectId Created
-                        nodeDoc = self.copy_document(
-                            url=uri,
-                            workspace=workspace,
-                            workspace_parent=workspace_parent,
-                            backend=backend,
-                        )
-                        self.update_doc_properties(template_doc, nodeDoc)
-                    else:
-                        document = self.publipostage_documents(
-                            url, path, template_doc, backend, keys_obj, versionable
-                        )
-                        nodeDoc = (
-                            document.json()
-                            .get("nodeRef", "")
-                            .replace("workspace://SpacesStore/", "")
-                        )
-                        self.update_doc_properties(template_doc, nodeDoc)
-        else:
-            self._publipostage_documents(template_doc, keys_obj, versionable)
diff --git a/models/project.py b/models/project.py
index 5af7134..5e3ccd3 100644
--- a/models/project.py
+++ b/models/project.py
@@ -106,415 +106,6 @@ class Project(models.Model):
     # ------------------------------------------------------
     # Actions
     # ------------------------------------------------------
-    @api.multi
-    def fill_avenant(self):
-        for project in self:
-            project.write(
-                {
-                    "is_avenant": True,
-                    "contexte_av": project.contexte,
-                    "caract_beneficiaire_av": project.caract_beneficiaire,
-                    "objectifs_accompagnement_av": project.objectifs_accompagnement,
-                    "besoins_beneficiaires_av": project.besoins_beneficiaires,
-                    "contenu_formation_av": project.contenu_formation,
-                    "methode_savoir_av": project.methode_savoir,
-                    "travaux_intersessions_av": project.travaux_intersessions,
-                    "lieu_av": project.lieu,
-                    "periode_realisation_av": project.periode_realisation,
-                    "modalite_gap_av": project.modalite_gap,
-                    "explication_financement_av": project.explication_financement,
-                    "nb_jours_adefpat_av": project.nb_jours_adefpat,
-                    "cout_jour_adefpat_av": project.cout_jour_adefpat,
-                }
-            )
-
-    def fill_data(self):
-        res = super(Project, self).fill_data()
-        if self.is_avenant and self.date_ca_av_next:
-            res["##date_ca_next##"] = babel.dates.format_date(
-                date=self.date_ca_av_next,
-                format="dd MMMM Y",
-                locale=self._context.get("lang") or "en_US",
-            )
-        return res
-
-    def fill_data_av(self):
-
-        parser = [
-            "name",
-            "name:NAME",
-            "date_ca_av",
-            # Entête Dossier CA
-            "name_subtitle",
-            "num_dossier",
-            # Critères dossier CA
-            "nb_activité",
-            "nb_emplois",
-            "type_beneficiaire",
-            # Blocs CA
-            "contenu_formation_av",
-            "methode_savoir_av",
-            "travaux_intersessions_av",
-            "lieu_av",
-            "periode_realisation_av",
-            "explication_financement_av",
-            "modalite_gap_av",
-            "resultats_accompagnement",
-            # CDC
-            "contexte_av",
-            "caract_beneficiaire_av",
-            "historique",
-            "besoins_beneficiaires_av",
-            "objectifs_accompagnement_av",
-            "competences_requises",
-            "secteurs_requis",
-            "modalites_intervention",
-            "modalites_facturation",
-            "modalites_reponse",
-            "modalites_modif_marche",
-            "financement_adefpat_av",
-            "total_budget_financement_av",
-            "total_financement_av",
-            "nb_jours_adefpat_av",
-            "cout_jour_adefpat_av",
-            "total_cout_adefpat_av",
-            "total_budget_cout_av",
-            "total_cout_av",
-            # # Selection field
-            "departement",
-            "objectif_projet",
-            "secteur_crit",
-            "taille",
-            "objectif_formation",
-            "type_formation",
-            "encadrement",
-            # Many2one
-            ("territoire_id", ["display_name", "street"]),
-            ("elu_referent_id", ["name"]),
-            ("user_id:cfd_name", ["name"]),
-            ("user_id:cfd_email", ["email"]),
-            ("type_convention_id", ["name"]),
-            # One2many List
-            (
-                "membre_ids:LIST_membres",
-                {
-                    "type_data": "LIST",
-                    "fields": [("partner_id", ["display_name", "function"])],
-                },
-            ),
-            (
-                "porteurs_projets_ids:LIST_porteurs_project",
-                {"type_data": "LIST", "fields": [("porteur_id", ["display_name"])]},
-            ),
-            (
-                "financement_av_ids:LIST_financement",
-                {"type_data": "LIST", "fields": [("partner_id", ["display_name"])]},
-            ),
-            (
-                "porteurs_projets_ids:LIST_porteurs_adress",
-                {
-                    "type_data": "LIST",
-                    "fields": [
-                        ("porteur_id", ["display_name", "street", "zip", "city"])
-                    ],
-                },
-            ),
-            (
-                "financement_av_ids:LIST_financement_adress",
-                {
-                    "type_data": "LIST",
-                    "fields": [
-                        ("partner_id", ["display_name", "street", "zip", "city"])
-                    ],
-                },
-            ),
-            (
-                "od_ids:LIST_ods_adress",
-                {
-                    "type_data": "MULTI",
-                    "fields": ["display_name", "street", "zip", "city"],
-                },
-            ),
-            # One2many Enum
-            ("petr_ids:petr_list", {"type_data": "ENUM", "fields": ["name"]}),
-            (
-                "porteurs_projets_ids:commune_list",
-                {"type_data": "ENUM", "fields": ["commune"]},
-            ),
-            (
-                "cout_ids:consultants",
-                {"type_data": "ENUM", "fields": [("partner_id", ["name"])]},
-            ),
-            ("od_ids:ods", {"type_data": "ENUM", "fields": ["name"]}),
-            ("animateur_ids:animateurs", {"type_data": "ENUM", "fields": ["name"]}),
-        ]
-
-        keys = self.json_build(parser)[0]
-
-        # Ajout des champs spécifiques
-        # Nombre de PP eligibles
-        nb_stagiaires = 0
-        if self.porteurs_projets_ids:
-            nb_stagiaires = len(self.porteurs_projets_ids.filtered("eligible"))
-            keys["##nb_porteurs##"] = nb_stagiaires
-
-        # Tableau des modules
-        tab_mod = []
-        for modul in self.cout_av_ids:
-            tab_par_mod = [
-                modul.module,
-                nb_stagiaires,
-                modul.nb_jour_theorique,
-                modul.nb_jour_pratiques,
-                (7 * nb_stagiaires * modul.nb_jour_theorique),
-                (7 * nb_stagiaires * modul.nb_jour_pratiques),
-                (
-                    (7 * nb_stagiaires * modul.nb_jour_theorique)
-                    + (7 * nb_stagiaires * modul.nb_jour_pratiques)
-                ),
-            ]
-            tab_mod.append(tab_par_mod)
-
-        keys["##TAB_MODULE_AV##"] = tab_mod
-
-        # Tableau des porteurs de projets
-        tab_pp = []
-        for pp in self.porteurs_projets_ids:
-            tab_par_pp = [pp.name, pp.statut.name, pp.commune]
-            tab_pp.append(tab_par_pp)
-
-        # Enum consultants "name (mobile)"
-        res = ""
-        for cout in self.cout_av_ids:
-            if cout.partner_id:
-                if res:
-                    if cout.partner_id.name not in res:
-                        res += ", " + cout.partner_id.name
-                        if cout.partner_id.email:
-                            res += " (" + cout.partner_id.email + ")"
-                else:
-                    res += cout.partner_id.name
-                    if cout.partner_id.email:
-                        res += " (" + cout.partner_id.email + ")"
-        keys["##consultants_email##"] = res
-
-        keys["##TAB_PORTEURS##"] = tab_pp
-
-        if self.date_ca_av_next:
-            keys["##date_ca_av_next##"] = babel.dates.format_date(
-                date=self.date_ca_av_next,
-                format="dd MMMM Y",
-                locale=self._context.get("lang") or "en_US",
-            )
-        return keys
-
-    @api.multi
-    def generate_dossier_ca_av(self):
-        for project in self:
-            if not project.cmis_folder:
-                raise UserError(
-                    _("Le répertoire Projet d'Alfresco n'est pas configuré")
-                )
-
-            # Récupération du template de Dossier CA
-            template_docs = self.env["adefpat.template.doc"].search(
-                [
-                    "&",
-                    "|",
-                    ("convention_ids", "=", False),
-                    ("convention_ids", "=", project.type_convention_id.id),
-                    ("type_temp", "=", "dossier_ca_av"),
-                ]
-            )
-            keys = project.fill_data_av()
-            for template_doc in template_docs:
-                url = project._publipostage_documents(template_doc, keys, True)
-                return {
-                    "type": "ir.actions.act_url",
-                    "url": url,
-                    "target": "new",
-                }
-
-    @api.multi
-    def generate_dossier_conventions_av(self):
-        for project in self:
-            if not project.cmis_folder:
-                raise UserError(
-                    _("Le répertoire Projet d'Alfresco n'est pas configuré")
-                )
-
-            # Fill data project
-            keys = project.fill_data_av()
-
-            # Récupération des conventions d'accompagnement
-            # 1 par formateur
-            template_docs = self.env["adefpat.template.doc"].search(
-                [
-                    "&",
-                    "|",
-                    ("convention_ids", "=", False),
-                    ("convention_ids", "=", project.type_convention_id.id),
-                    ("type_temp", "=", "convention_accompagnement_av"),
-                ]
-            )
-
-            for template_doc in template_docs:
-
-                ####################################
-                # Group by consultants
-                ####################################
-                consulant_ok_ids = self.consulant_ids.filtered("is_selected")
-                for consult in consulant_ok_ids:
-                    keys_obj = consult.fill_data()
-                    keys.update(keys_obj)
-
-                    cout_ids = (
-                        self.env["adefpat.project.cout.av"]
-                        .sudo()
-                        .read_group(
-                            [
-                                ("project_id", "=", project.id),
-                                ("consultant_id", "=", consult.id),
-                            ],
-                            [
-                                "partner_id",
-                                "montant",
-                                "nb_jour_theorique",
-                                "nb_jour_pratiques",
-                            ],
-                            ["partner_id"],
-                            lazy=False,
-                        )
-                    )
-
-                    keys["##montant##"] = cout_ids[0]["montant"]
-                    keys["##nb_jour_theorique_tot_av##"] = cout_ids[0][
-                        "nb_jour_theorique"
-                    ]
-                    keys["##nb_jour_pratique_tot_av##"] = cout_ids[0][
-                        "nb_jour_pratiques"
-                    ]
-                    keys["##nb_jour_tot_av##"] = (
-                        cout_ids[0]["nb_jour_pratiques"]
-                        + cout_ids[0]["nb_jour_theorique"]
-                    )
-                    keys["##nb_heure_tot_av##"] = (
-                        cout_ids[0]["nb_jour_pratiques"]
-                        + cout_ids[0]["nb_jour_theorique"]
-                    ) * 7
-                    project._publipostage_documents(template_doc, keys, False)
-
-            # Récupération des annexes de conventions d'accompagnement
-            # 1 par bénéficiaire
-            template_docs = self.env["adefpat.template.doc"].search(
-                [
-                    "&",
-                    "|",
-                    ("convention_ids", "=", False),
-                    ("convention_ids", "=", project.type_convention_id.id),
-                    ("type_temp", "=", "annexe_convention_av"),
-                ]
-            )
-
-            for template_doc in template_docs:
-                for financ in project.financement_av_ids:
-                    keys_obj = financ.fill_data()
-                    keys.update(keys_obj)
-                    project._publipostage_documents(template_doc, keys, False)
-
-            # Récupération des conventions d'objectif
-            template_docs = self.env["adefpat.template.doc"].search(
-                [
-                    "&",
-                    "|",
-                    ("convention_ids", "=", False),
-                    ("convention_ids", "=", project.type_convention_id.id),
-                    ("type_temp", "=", "convention_objectif_av"),
-                ]
-            )
-            for template_doc in template_docs:
-                # Get the display name of first Animateur
-                if project.animateur_ids:
-                    first_od = project.animateur_ids[0]
-                    keys_anim = first_od.get_data_anim()
-                    keys.update(keys_anim)
-
-                # Get the OD
-                if project.od_ids:
-                    od_id = project.od_ids[0]
-                    keys_od = od_id.get_data_od()
-                    keys.update(keys_od)
-
-                project._publipostage_documents(template_doc, keys, True)
-
-            # Open URL from path in alfresco
-            backend_name = self._fields["cmis_folder"]
-            backend = backend_name.get_backend(project.env)
-            parent_path = (
-                backend.get_cmis_repository().getFolder(project.cmis_folder).getPaths()
-            )
-            path_proj = parent_path + [template_doc.dossier.name]
-            path = "/".join(path_proj)
-            cmis_folder = backend.get_folder_by_path(path)
-            properties = (
-                backend.get_cmis_repository().getFolder(cmis_folder).getProperties()
-            )
-            url = backend.get_content_details_url_from_props(properties)
-            return {
-                "type": "ir.actions.act_url",
-                "url": url,
-                "target": "new",
-            }
-
-    @api.multi
-    def generate_dossier_global(self):
-        for project in self:
-            if project.is_avenant:
-                if not project.cmis_folder:
-                    raise UserError(
-                        _("Le répertoire Projet d'Alfresco n'est pas configuré")
-                    )
-                project.is_send_malette = True
-                # Récupération des template pour les malettes
-                template_docs = self.env["adefpat.template.doc"].search(
-                    [
-                        "&",
-                        "&",
-                        "|",
-                        ("convention_ids", "=", False),
-                        ("convention_ids", "=", project.type_convention_id.id),
-                        ("type_temp", "=", False),
-                        ("noderef_document", "!=", False),
-                    ]
-                )
-                keys = project.fill_data()
-                for template_doc in template_docs:
-                    project._publipostage_documents_malette_avenant(
-                        template_doc, keys, True
-                    )
-
-                # Mise a jour de l'envoi malette sur les porteurs de projet
-                for porteur in project.porteurs_projets_ids:
-                    if porteur.cmis_folder:
-                        porteur.is_malette_ok = True
-
-                # Open URL Project in Alfresco
-                backend_name = self._fields["cmis_folder"]
-                backend = backend_name.get_backend(project.env)
-                properties = (
-                    backend.get_cmis_repository()
-                    .getFolder(project.cmis_folder)
-                    .getProperties()
-                )
-                url = backend.get_content_details_url_from_props(properties)
-                return {
-                    "type": "ir.actions.act_url",
-                    "url": url,
-                    "target": "new",
-                }
-            else:
-                return super(Project, self).generate_dossier_global()
-
     @api.multi
     def action_generate_invoices_av(self):
         for project in self:
@@ -705,17 +296,3 @@ class AdefpatCoutAV(models.Model):
     def _compute_montant(self):
         for r in self:
             r.montant = r.cout_jour * r.nb_jour_theorique
-
-
-class AdefpatTemplateDoc(models.Model):
-    _inherit = "adefpat.template.doc"
-
-    type_temp = fields.Selection(
-        selection_add=[
-            ("convention_accompagnement_av", "Avenant Conventions d'accompagnement"),
-            ("convention_objectif_av", "Avenant Conventions d'objectif"),
-            ("annexe_convention_av", "Avenant Annexes Conventions"),
-            ("dossier_ca_av", "Avenant Dossier CA"),
-            ("facture_av", "Avenant Facture"),
-        ]
-    )
diff --git a/views/project_views.xml b/views/project_views.xml
index 9df244d..8cd157c 100644
--- a/views/project_views.xml
+++ b/views/project_views.xml
@@ -15,36 +15,12 @@
                 <field name="nb_jour_plann" position="before">
                     <field name="nb_jour_theorique_tot_global" />
                 </field>
-                <header position="inside">
-                    <!-- Ajout du bouton pour récupérer les infos avenants -->
-                    <button
-                        string="Avenant"
-                        type="object"
-                        class="btn btn-primary"
-                        name="fill_avenant"
-                        attrs="{'invisible': [('is_avenant', '=', True)]}"
-                    />
-                </header>
                 <page name="gap" position="after">
                     <page
                         name="dossier_av"
                         string="Dossier Avenant"
                         attrs="{'invisible': [('is_avenant', '=', False)]}"
                     >
-                        <header>
-                            <button
-                                string="Générer Avenant Dossier CA"
-                                type="object"
-                                class="btn btn-primary"
-                                name="generate_dossier_ca_av"
-                            />
-                            <button
-                                string="Générer Avenant Conventions"
-                                type="object"
-                                class="btn btn-primary"
-                                name="generate_dossier_conventions_av"
-                            />
-                        </header>
                         <group>
                             <field name="date_ca_av" />
                         </group>
-- 
GitLab