<?php

namespace Modules\Contrat\Controller;

use Entity\Model\Acccadre;
use Entity\Model\Hastutil;
use Helpers\Ariane\Ariane;
use Helpers\User\User;
use Skeleton\Controller\Controller;
use Helpers\Pagination\Paginator;
use Helpers\Validator\Validator;
use Helpers\Fichier\Fichier;
use Entity\Model\Fourniss;
use Entity\Model\Grpfou;
use Entity\Model\Paravrac;
use GuzzleHttp\Psr7\Response;
use Helpers\ChampsSupplementaire\ChampSupp;
use Helpers\Ariane\ArianeSub;
use Helpers\Trad\Trad;
use Helpers\Outil\Date;
use Helpers\Outil\Roles;
use Helpers\Outil\Sql;
use Helpers\Pagination\PaginatorGestion;
use Modules\Commande\Repository\ListeCommande;
use Modules\Contrat\MenuContextuel\GestionAccordCadreContextuel;
use Modules\Contrat\WebService\CreationAvenantAccordCadre;
use Helpers\Parametres\Constante;
use Modules\GlobalApplication\MenuContextuel\DocumentMenuContextuel;

class AccordCadreController extends Controller
{
    // PAGE PRINCIPAL DE L'ACCORD CADRE
    public function indexAction(): string
    {
        $droitOxaSuppAch = Roles::droitsUtilisateur($this->pdo, 'OX_SUPPACH');

        // GESTION DES DROITS UTILISATEUR //
        $listDroit = [
            'droitCreation'        => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_CM'),
            'droitModif'           => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_CM'),
            'droitModifAdm'        => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_ADM'),
            'droitDuplication'     => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_CM'),
            'droitCommande'        => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_CA_VIS'),
            'droitCreationAvenant' => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_CM'),
            'droitCumuls'          => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_STATTAB'),
            'droitCommentaire'     => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_CM'),
            'OX_SUPPACH'           => $droitOxaSuppAch,
        ];

                    
        // Getter
        $type = $this->request->getAttribute('type');
        $id = $this->request->getAttribute('idacc');
        $typeAcc = $this->request->getAttribute('type');
        $filterV1 = $this->request->getAttribute('filterV1');
        $trad = $this->getTranslationService();

        // Post
        $post = $this->request->getParsedBody();
        $postCount = count($post);
        if (!$post) {
            if ($filterV1) {
                if ($listDroit['droitCreation'] || $listDroit['droitModif']) {
                    $post['filter_ACH_RESP'] = $_SESSION['Session_Login'];
                }
                if ($filterV1 == 'accBientot') {
                    $post['filter_VALIDE'] = 'PREAVIS';
                } elseif ($filterV1 == 'accPerimer') {
                    $post['filter_VALIDE'] = 'NON_VALIDE';
                }
            }

            if ($type != 'fournisseur' && !isset($post['filter_ACH_RESP'])) {
                $post['filter_VALIDE'] = 'VALIDE';
                // $post['filter_ACH_RESP'] = $login;
                $_SESSION['bulleSousFiltre']['filter_VALIDE'] = [
                    'titre' => $trad->t('Etat') . $trad->colon(),
                    'value' => $trad->t('VALIDE')
                ];
            }
        } else {
            if ($post['filter_CODE_ACD']??'') {
                $_SESSION['bulleSousFiltre']['filter_CODE_ACD'] = [
                    'titre' => $trad->t('Code accord-cadre') . $trad->colon(),
                    'value' =>$post['filter_CODE_ACD']
                ];
            }
        }

        // Entity
        $marchEntity     = new \Entity\Model\Marches($this->pdo);
        $accEntity       = new \Entity\Model\Acccadre($this->pdo);

        // Repository
        $champSupp  = new ChampSupp($this->pdo);

        if (!(isset($post['detail']) && $post['detail'])) {
            $UOActif = (new Paravrac($this->pdo))->find(['CODEPARV' => 'CHOIX_UO', 'TYPEPARV' => 'OXAPROC']);
            if (($UOActif['LIB01PARV'] ?? 'N') == 'O') {
                $post['UOActif'] = 1;
            } else {
                $post['UOActif'] = 0;
            }
        }

        $date = date('Ymd');

        $login = $_SESSION['Session_Login'];
        $accListes = new \Modules\Contrat\Repository\AccordCadre($this->pdo);

        $listeTypeDate =
            [
                'M' => $trad->t('Mois'),
                'J' => $trad->t('Jours')
            ];
        $_SESSION['Acc']['type'] = $type;

        if ($type == 'marches' || $type == 'accordCadre') {
            $title = $accEntity->find($id);
            $post['filter_MARCHE'] = $id;
            $titre = $trad->t('Marchés');
            $detail_marche = $marchEntity->find($id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';
        }

        if ($type == 'fournisseur') {
            $fournis = new Fourniss($this->pdo);
            $title = $fournis->find($id);
            $title = $title['RS'];
            $post['filter_TYPE_FG'] = 'F';
            $post['filter_CODE_FOUR_fourGroup'] = $id;
            $post['filter_VALIDE'] = 'VALIDE';
            $titre = $trad->t('Fournisseurs');
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
            $post['mode'] = 'fourniss';

            if (!(isset($post['detail']) && $post['detail'])) {
                ArianeSub::generate(1, 0, $trad->t('Accord-cadre'), $_SERVER['REQUEST_URI'], 1);
            }
        }
        if ($type == 'groupement') {
            $groupement = new Grpfou($this->pdo);
            $title = $groupement->find($id);
            $title = $title['RS'];
            $post['filter_TYPE_FG'] = 'G';
            $post['filter_CODE_FOUR_fourGroup'] = $id;
            $post['filter_VALIDE'] = 'VALIDE';
            $titre = $trad->t('Groupement de fournisseur');
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';

            if (!(isset($post['detail']) && $post['detail'])) {
                ArianeSub::generate(1, 0, $trad->t('Accord-cadre'), $_SERVER['REQUEST_URI'], 1);
            }
        }

        

        $paginator = new \Helpers\Pagination\PaginatorGestion();
        $paginator->generate(0, 'CODE_ACD');

        if ($type == 'fournisseur') {
            $accListe = $accListes->listeAccordCadre('', $post, $type);
        } elseif ($type == 'groupement') {
            $accListe = $accListes->listeAccordCadre($id, $post, $type);
        } else {
            // si l'user connecté n'a pas le droit OX_SUPPACH ou s'il arrive sur cette page pour la première fois, on n'affiche que les accords-cadres dont il est responsable achats
            if ($droitOxaSuppAch == 0 || $postCount == 0) {
                // $post['filter_ACH_RESP'] = $login;
            }
            $accListe = $accListes->listeAccordCadre($id, $post, $type);
        }
        
        if ($type == 'ALL') {
            if ($_SESSION['Session_UsrMultiSoc'] == 1 || $_SESSION['Session_UsrPluriSoc'] != '') {
            } else {
                $post['user'] = $_SESSION['Session_SocUsrProfil'];
            }

            $nb_acc = PaginatorGestion::getNbrArticle();
            if (!(isset($post['detail']) && $post['detail'])) {
                \Helpers\Ariane\Ariane::generate(0, $trad->t('Gestion'), $post, $nb_acc);
            }

            $titre = $trad->t('Accords-cadres');
            $menuActive = 'Contrats';
            $menuLeft = null;
        } else {
            $nb_acc = PaginatorGestion::getNbrArticle();

            if (!(isset($post['detail']) && $post['detail'])) {
                if ($type == 'marches') {
                    \Helpers\Ariane\Ariane::generate(1, $trad->t('Gestion Accords-cadres'), $post, $nb_acc ? $nb_acc : 0);
                } elseif ($type == 'accordCadre') {
                    \Helpers\Ariane\Ariane::generate(1, $trad->t('Gestion'), $post, $nb_acc ? $nb_acc : 0);
                }
            }
        }
        if (!(isset($post['detail']) && $post['detail'])) {
            $infopagination = PaginatorGestion::getInfoPagination();
            
            $menuContextuel = new GestionAccordCadreContextuel($this->pdo, $this->router, $this->getTranslationService());
            foreach ($accListe as &$acc) {
                $acc['menuContextuel'] = $menuContextuel->generate($acc, $type, $id);
            }

            $filtreAvance = new \Helpers\Filter\FiltreAvance\GeneratorCs(
                $post,
                'ACD',
                'acc.CODE_ACD',
                $this->pdo,
                $this->getTranslationService()
            );
            $filtreAvance->setFiltre('acc.DATE_DEB', 'date', $trad->t('Date de début'));
            $filtreAvance->setFiltre('acc.DATE_FIN', 'date', $trad->t('Date de fin'));
            $filtreAvance->setFiltre('acc.CREERPAR', 'liste', $trad->t('Créateur'), '', 'Ajax.liste.acheteur', 'Hastutil');
            $filtreAvance->setFiltre('acc.CODE_FOUR', 'liste', $trad->t('Lié(s) au(x) groupement(s)'), '', 'Ajax.liste.grpfou', 'GrpFou');
            $filtreAvance->setFiltre('act.CODE_ART', 'liste', $trad->t('Contenant article'), '', 'Ajax.liste.articles', 'Articles');
            $filtreAvance->setFiltre('dcc.NO_DCC', 'text', $trad->t('Lié au DCC'), '', null, 'DccLien');
            
            return $this->renderer->render(
                '@Contrat/accord-cadre/accord-cadre',
                [
                    'id'               => $id,
                    'ruleUpdateResp'   => $listDroit['OX_SUPPACH'],
                    'typeAcc'          => $typeAcc,
                    'user'             => (new Hastutil($this->pdo))->find($login),
                    'listDroit'        => $listDroit,
                    'dateJ'            => $date,
                    'accListe'         => $accListe,
                    'menuActive'       => $menuActive,
                    'menuLeft'         => $menuLeft,
                    'filtreAvance'     => $filtreAvance->getFiltres(),
                    'initFiltreAvance' => $filtreAvance->getInit(),
                    'infoPagination'   => $infopagination,
                    'post'             => $post,
                    'type'             => $type,
                    'nb_acc'           => $nb_acc,
                    'csAcc'            => $champSupp->getInfoCS('ACD'),
                    'TITRE'            => $titre ?? '',
                    'libelleMarche'    => $detail_marche['LIBELLE'] ?? '',
                    'listeTypeDate'    => $listeTypeDate,
                    'title'            => $title ?? '',
                    'UOActif'          => $post['UOActif'],
                    'DEVISE'           => $_SESSION['parametrage']['DEVISE_BASE']
                ]
            );
        } else {
            $pathView = "@Contrat/accord-cadre/accord-cadre-detail";
            return $this->renderer->render($pathView, [
                'listeTypeDate'    => $listeTypeDate,
                'id'               => $id,
                'accListe'         => $accListe,
                
            ]);
        }
    }


    public function creationAction()
    {
        // GET
        $id                = $this->request->getAttribute('idacc');
        $type              = $this->request->getAttribute('type');

        // Repository
        $accCadrePreInsert = new \Modules\Contrat\Repository\AccordCadre($this->pdo);

        //Entity
        $accCadreEntity = new \Entity\Model\Acccadre($this->pdo);
        $accCadreEvnt   = new \Entity\Model\AcdEvent($this->pdo);
        $fourniss       = new \Entity\Model\Fourniss($this->pdo);
        $marchesentity  = new \Entity\Model\Marches($this->pdo);

        $sousTitre = '';
        if ($type == 'fournisseur' || $type == 'groupement') {
            $postRetour = $_SESSION['arianeSub'][1][0]['post'];
        } elseif ($type == 'marches') {
            $postRetour = $_SESSION['ariane'][1]['post'];
        } elseif ($type == 'ALL') {
            $postRetour = $_SESSION['ariane'][0]['post'];
        }
        $trad = $this->getTranslationService();
        $trad = $this->getTranslationService();

        $delais = \Helpers\Outil\Roles::droit($this->pdo, 'ACD_ANT_PREAVIS', 'PARAMGEN', false);
        $devise = $accCadrePreInsert->deviseParam();

        $listeType =
            [
                'F' => $trad->t('Fournisseur'),
                'G' => $trad->t('Groupements')
            ];
        $listeTypeDate =
            [
                'M' => $trad->t('Mois'),
                'J' => $trad->t('Jours')
            ];


        $listeCS = ChampSupp::listeIdCS('ACD', $this->pdo);

        $post = $this->request->getParsedBody();
        // TODO : put inside its own action
        if ($this->request->getMethod() == 'POST') {
            $validator = $this->createValidator();

            /* Accord-cadre */
            // Code - Libellé - Marché
            if ($validator->isTrue(count($accCadreEntity->find(['CODE_ACD' => $post['CODE_ACD']]) ?? []) > 0, Trad::strBuild($trad->t("Le code Accord-cadre @1@ existe déjà."), $post['CODE_ACD']))) {
                $validator->isStringSansEspace($trad->t('Code accord-cadre'), $post['CODE_ACD'], 1, 11);
            }
            // $specCaract = array("&", "?", ">", "|", "*", "^", "<", "'", '"', "%", ".","_",'+',"-", '(',')', '@', '[', ']', "ç","ñ","Ä","Â","À","�?","ä","â","à","á","Ë","Ê","È","É","é","è","ë","ê","�?","Î",",","Ì","�?","ï","î","ì","í","Ö","Ô","Ò","Ó","ö","ô","ò","ó","Ü","Û","Ù","Ú","ü","û","ù","ú","µ");
            // $validator->isStringWithContent($trad->t('Libellé'), $post['LIBELLE'], false, $specCaract);
            $validator->isStringAvecEspace($trad->t('Libellé accord-cadre'), $post['LIBELLE'], 1, 60);
            $validator->zoom('Marches', $post['MARCHE'], $trad->t('Marchés'), $this->pdo, true);

            $detail_marche = $marchesentity->find(['CODE' => $post['MARCHE']]);

            // Type - Fournisseur/Groupement fournisseur
            $validator->contentInArray($trad->t('Type de fournisseur F/G'), $post['TYPE_FG'], $listeType);
            if ($post['TYPE_FG'] == 'F') {
                $validator->zoom('Fourniss', $post['CODE_FOUR'], $trad->t('Fournisseurs'), $this->pdo, false);
            } elseif ($post['TYPE_FG'] == 'G') {
                $validator->zoom('Grpfou', $post['CODE_FOUR'], $trad->t('Groupements'), $this->pdo, false);
            }

            /* Validité */
            // Date de début - Date de fin
            $validator->isDate($post['DATE_DEB'], '', '', true, $trad->t('Date de début'));
            $validator->isDate($post['DATE_FIN'], '', '', true, $trad->t('Date de fin'));
            $validator->isCoherenceDate($post['DATE_DEB'], $post['DATE_FIN']);
            // Vérification des dates de validité (Lorsque l'on viens d'un marché)
            // La date de validité de l'accord-cadre qui est sur le point d'être crée ne doit pas être inférieur à celle du marché
            // La date de fin de validité de l'accord-cadre ne doit pas être supérieur à celle du marché

            if ($detail_marche && $detail_marche['DDEBVAL'] != '00000000' && $detail_marche['DFINVAL'] != '00000000') {
                if (isset($post['MARCHE']) && $post['MARCHE'] != '') {
                    if ((int)$detail_marche['DDEBVAL'] != 0 && (int)$post['DATE_DEB'] < (int)$detail_marche['DDEBVAL']) {
                        $validator->isTrue(true, ' <br />' . $trad->t('La date de début de validité de l\'Accord-cadre ne doit pas être inférieure à celle du marché') . ' ' . '(' . $post['MARCHE'] . ') ');
                    }
                    if ((int)$detail_marche['DFINVAL'] != 0 && (int)$post['DATE_FIN'] > (int)$detail_marche['DFINVAL']) {
                        $validator->isTrue(true, ' <br />' . $trad->t('La date de fin de validité de l\'Accord-cadre ne doit pas être supérieure à celle du marché') . ' ' . '(' . $post['MARCHE'] . ') ');
                    }
                }
            }

            // Montant prévisionnel
            $validator->isFloat($trad->t('Montant prévisionnel'), $post['BUDGET'], Constante::formatMontant);
            if (isset($post['MARCHE']) && $post['MARCHE'] != '') {
                // Vérification du montant prévisionnel de l'accord-cadre par rapport aux montants min et max du marché
                if ($detail_marche['MNTPREMAX'] != 0 || $detail_marche['MNTPREMIN'] != 0) {
                    if ((int)$post['BUDGET'] > (int)$detail_marche['MNTPREMAX']) {
                        $validator->isTrue(true, '<br>' . $trad->t('Le montant prévisionnel ne peut être supérieur au montant maximum du montant prévisionnel marché.'));
                    }
                    if ((int)$post['BUDGET'] < (int)$detail_marche['MNTPREMIN']) {
                        $validator->isTrue(true, '<br>' . $trad->t('Le montant prévisionnel ne peut être inférieur au montant minimum du montant prévisionnel marché.'));
                    }
                }
            }

            // Responsable achat - Commentaire
            $validator->acheteurZoom($post['ACH_RESP'], $trad->t('Responsables Achat'), $this->pdo, true, ['VALIDE' => 1]);
            $validator->isStringAvecEspace($trad->t('Commentaires'), $post['ACD_COMMENT'], 0, 3000);

            // Auth commande eproc - Préavis - Type date - Délai d'alerte
            $validator->isCheck($post['autorisation_eproc']);
            $validator->isInteger($trad->t('Préavis'), $post['DEL_PRE'], 0, 3);
            $validator->contentInArray($trad->t('Type date'), $post['JOU_MOI'], $listeTypeDate);
            $validator->isInteger($trad->t('Délais d\'alerte du responsable marché'), $post['DEL_ALE'], 0, 3);

            /* CS */
            $validator->validatorCS('ACD', '', $post, $this->pdo);

            if (!$validator->isValid()) {
                return new Response(400, [], $validator->getError());
            }
            $insert = [
                ':CODE_ACD'    => $post['CODE_ACD'],
                ':LIBELLE'     => $post['LIBELLE'],
                ':CODE_FOUR'   => $post['CODE_FOUR'],
                ':DATE_DEB'    => $post['DATE_DEB'],
                ':DATE_FIN'    => $post['DATE_FIN'],
                ':BUDGET'      => $post['BUDGET'],
                ':MARCHE'      => $post['MARCHE'],
                ':TYPE_FG'     => $post['TYPE_FG'],
                ':DEL_PRE'     => $post['DEL_PRE'],
                ':JOU_MOI'     => $post['JOU_MOI'] ?? 'M',
                ':DEL_ALE'     => $post['DEL_ALE'],
                ':ACH_RESP'    => $post['ACH_RESP'],
                ':ACD_COMMENT' => $post['ACD_COMMENT'],
                ':CREERPAR'    => $_SESSION['Session_Login'],
            ];

            $insertEvnt =
                [
                    'CODE_ACD'    => $post['CODE_ACD'],
                    'NUM_ORDRE'   => 1,
                    'DTE'   => date('Ymd'),
                    'HEURE' => date('His'),
                    'CODE_EVT' => 'CRE',
                    'AVENANT' => '',
                    'UTIL' => $_SESSION['Session_Login'],
                    //'HAPLUS' => 0,
                    'COMMENTAIRE' => 'Création',
                ];
            $accCadrePreInsert->insertNewAccordCadre($insert, $post['autorisation_eproc']);
            $accCadreEvnt->insert($insertEvnt);
            ChampSupp::ajouterCS($post, $this->pdo, $post['CODE_ACD']);

            return new Response(200);
        }
        if ($type == 'fournisseur') {
            $idType = 'F';
            $idFour = $id;
            ArianeSub::generate(2, 0, $trad->t('Nouveau accord-cadre'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Fournisseur');
            $sousTitre = Trad::strBuild($trad->t("Nouvel Accord-cadre du fournisseur @1@ (@2@)"), $fourniss->find($idFour)['RS'], $idFour);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'fournisseur', 'idacc' => $idFour]);
        } elseif ($type == 'groupement') {
            $idType = 'G';
            $idFour = $id;
            ArianeSub::generate(2, 0, $trad->t('Nouveau accord-cadre'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Groupement');
            $sousTitre = '';
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'groupement', 'idacc' => $idFour]);
        } elseif ($type == 'marches') {
            \Helpers\Ariane\Ariane::generate(2, $trad->t('Nouveau accord-cadre'));

            $titre = $trad->t('Marchés');
            $sousTitre = Trad::strBuild($trad->t("Nouvel Accord-cadre du marché @1@ (@2@)"), $marchesentity->find($id)['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'marches', 'idacc' => $id]);
            $post['MARCHE'] = $id;
        } elseif ($type == 'ALL') {
            $titre = $trad->t('Accords-cadres');
            $sousTitre = $trad->t("Nouvel Accord-cadre");
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.accord-cadre.index';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'ALL', 'idacc' => 'ALL']);
            \Helpers\Ariane\Ariane::generate(1, $trad->t('Nouvel Accord-cadre'));
            $postRetour = $_SESSION['ariane'][0]['post'];
        }

        return $this->renderer->render('@Contrat/accord-cadre/nouvel-accord-cadre', [
            'id'            => $id,
            'TITRE'         => $titre,
            'devise'        => $devise,
            'login'         => $_SESSION['Session_Login'],
            'SOUSTITRE'     => $sousTitre,
            'menuActive'    => $menuActive,
            'menuLeft'      => $menuLeft,
            'listeType'     => $listeType,
            'listeTypeDate' => $listeTypeDate,
            'delais'        => ((int)$delais),
            'post'          => $post,
            'type'          => $type,
            'idMarches'     => $type == 'marches' ? $id : '',
            'idFourniss'    => $idFour ?? '',
            'idType'        => $idType ?? '',
            'listeCSID'     => $listeCS,
            
            'pathRetour'    => $pathRetour ?? [],
        ]);
    }

    /**
     * MODIFICATION D'UN ACCORD CADRE
     * @return Response|string
     * @throws \Exception
     */
    public function modificationAction()
    {
        $id = $this->request->getAttribute('idacc');
        $type = $_SESSION['Acc']['type'];

        $accCadrePreInsert = new \Modules\Contrat\Repository\AccordCadre($this->pdo);
        $accCadreEntity    = new \Entity\Model\Acccadre($this->pdo);

        $listeCS = ChampSupp::listeIdCS('ACD', $this->pdo);

        $fourniss       = new \Entity\Model\Fourniss($this->pdo);
        $marchesentity     = new \Entity\Model\Marches($this->pdo);


        $delais = \Helpers\Outil\Roles::droit($this->pdo, 'ACD_ANT_PREAVIS', 'PARAMGEN', false);
        $devise = $accCadrePreInsert->deviseParam();

        if ($type == 'fournisseur' || $type == 'groupement') {
            $postRetour = $_SESSION['arianeSub'][1][0]['post'];
        } elseif ($type == 'marches') {
            $postRetour = $_SESSION['ariane'][1]['post'];
        } elseif ($type == 'ALL') {
            $postRetour = $_SESSION['ariane'][0]['post'];
        }

        $trad = $this->getTranslationService();

        $listeType =
            [
                'F' => $trad->t('Fournisseur'),
                'G' => $trad->t('Groupement')
            ];
        $listeTypeDate =
            [
                'M' => $trad->t('Mois'),
                'J' => $trad->t('Jours')
            ];



        $post = $this->request->getParsedBody();
        // TODO : put inside its own action
        if ($this->request->getMethod() == 'POST') {
            $validator = $this->createValidator();

            /* Accord-cadre */
            // Code - Libellé - Marché
            $validator->isStringAvecEspace($trad->t('Libellé Accord-cadre'), $post['LIBELLE']??'', 1, 60);
            $validator->zoom('Marches', $post['MARCHE'], $trad->t('Marchés'), $this->pdo, true);

            $detail_marche = $accCadreEntity->find($post['MARCHE']);

            // Type - Fournisseur/Groupement fournisseur
            $validator->contentInArray($trad->t('Type de fournisseur F/G'), $post['TYPE_FG'], $listeType);

            if ($post['TYPE_FG'] == 'F') {
                $validator->zoom('Fourniss', $post['CODE_FOUR'], $trad->t('Fournisseurs'), $this->pdo, false);
            } elseif ($post['TYPE_FG'] == 'G') {
                $validator->zoom('Grpfou', $post['CODE_FOUR'], $trad->t('Groupements'), $this->pdo, false);
            }

            /* Validité */
            // Date de début - Date de fin
            $validator->isDate($post['DATE_DEB'], '', '', true, $trad->t('Date de début'));
            $validator->isDate($post['DATE_FIN'], '', '', true, $trad->t('Date de fin'));
            $validator->isCoherenceDate($post['DATE_DEB'], $post['DATE_FIN']);



            // Vérification des dates de validité (Lorsque l'on viens d'un marché)
            // La date de validité de l'accord-cadre qui est sur le point d'être crée ne doit pas être inférieur à celle du marché
            // La date de fin de validité de l'accord-cadre ne doit pas être supérieur à celle du marché
            if (($detail_marche['DDEBVAL'] ?? '00000000') != '00000000' && ($detail_marche['DFINVAL'] ?? '00000000') != '00000000') {
                if (isset($post['MARCHE']) && $post['MARCHE'] != '') {
                    if ((int)$post['DATE_DEB'] < (int)$detail_marche['DDEBVAL']) {
                        $validator->isTrue(true, '<br>' . $trad->t('La date de début de validité de l\'Accord-cadre ne doit pas être inférieure à celle du marché') . '(' . $post['MARCHE'] . ')');
                    }
                    if ((int)$post['DATE_FIN'] > (int)$detail_marche['DFINVAL']) {
                        $validator->isTrue(true, '<br>' . $trad->t('La date de fin de validité de l\'Accord-cadre ne doit pas être supérieure à celle du marché') . '(' . $post['MARCHE'] . ')');
                    }
                }
            }

            // Montant prévisionnel
            $validator->isFloat($trad->t('Montant prévisionnel'), $post['BUDGET'], Constante::formatMontant);
            if (isset($post['MARCHE']) && $post['MARCHE'] != '') {
                // Vérification du montant prévisionnel de l'accord-cadre par rapport aux montants min et max du marché
                if (($detail_marche['MNTPREMAX'] ?? '0') != 0 || ($detail_marche['MNTPREMIN'] ?? '0') != 0) {
                    if ((int)$post['BUDGET'] > (int)$detail_marche['MNTPREMAX']) {
                        $validator->isTrue(true, '<br>' . $trad->t('Le montant prévisionnel ne peut être supérieur au montant maximum du montant prévisionnel marché.'));
                    }
                    if ((int)$post['BUDGET'] < (int)$detail_marche['MNTPREMIN']) {
                        $validator->isTrue(true, '<br>' . $trad->t('Le montant prévisionnel ne peut être inférieur au montant minimum du montant prévisionnel marché.'));
                    }
                }
            }

            // Responsable achat - Commentaire
            $validator->acheteurZoom($post['ACH_RESP'], $trad->t('Responsables Achat'), $this->pdo, true, ['VALIDE' => 1]);
            $validator->isStringAvecEspace($trad->t('Commentaires'), $post['ACD_COMMENT'], 0, 3000);

            // Auth commande eproc - Préavis - Type date - Délai d'alerte
            $validator->isCheck($post['autorisation_eproc']);
            $validator->isInteger($trad->t('Préavis'), $post['DEL_PRE'], 0, 3);
            $validator->contentInArray($trad->t('Type date'), $post['JOU_MOI'], $listeTypeDate);
            $validator->isInteger($trad->t('Délais d\'alerte du responsable marché'), $post['DEL_ALE'], 0, 3);

            $validator->validatorCS('ACD', $id, $post, $this->pdo);

            if (!$validator->isValid()) {
                return new Response(400, [], $validator->getError());
            }
            $modification = [
                ':LIBELLE'     => $post['LIBELLE'],
                ':MARCHE'      => $post['MARCHE'],
                ':CODE_FOUR'   => $post['CODE_FOUR'],
                ':DATE_DEB'    => $post['DATE_DEB'],
                ':DATE_FIN'    => $post['DATE_FIN'],
                ':BUDGET'      => $post['BUDGET'],
                ':TYPE_FG'     => $post['TYPE_FG'],
                ':DEL_PRE'     => $post['DEL_PRE'],
                ':JOU_MOI'     => $post['JOU_MOI'] ?? 'M',
                ':DEL_ALE'     => $post['DEL_ALE'],
                ':ACH_RESP'    => $post['ACH_RESP'],
                ':ACD_COMMENT' => $post['ACD_COMMENT']
            ];
            $accCadrePreInsert->updateAccordCadre($modification, $post['autorisation_eproc'], $post['CODE_ACD']);
            ChampSupp::updateCS($post, $this->pdo);

            $accCadrePreInsert->updateValArticleAcc($id, $post['DATE_DEB'], $post['DATE_FIN']);

            return new Response(200);
        }
        $accCadreValueDetail = $accCadreEntity->find($id);
        $trad = $this->getTranslationService();

        if (!$accCadreValueDetail) {
            return $this->redirect('Index.Index.error');
        }

        if ($type == 'fournisseur') {
            $idFour = $accCadreValueDetail['CODE_FOUR'];
            ArianeSub::generate(2, 0, $trad->t('Modification accord-cadre'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Fournisseur');
            $sousTitre = Trad::strBuild($trad->t("Modifier l'Accord-cadre @1@ (@2@) du fournisseur @3@ (@4@)"), $accCadreValueDetail['LIBELLE'], $id, $fourniss->find($idFour)['RS'], $idFour);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'fournisseur', 'idacc' => $idFour]);
        } elseif ($type == 'groupement') {
            $idFour = $accCadreValueDetail['CODE_FOUR'];
            ArianeSub::generate(2, 0, $trad->t('Modification accord-cadre'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Groupement');
            $sousTitre = Trad::strBuild($trad->t("Modifier l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'groupement', 'idacc' => $idFour]);
        } elseif ($type == 'marches') {
            $titre = $trad->t('Marchés');
            $idMarche = $accCadreValueDetail['MARCHE'];
            $sousTitre = Trad::strBuild($trad->t("Modifier l'Accord-cadre @1@ (@2@) du marché @3@ (@4@)"), $accCadreValueDetail['LIBELLE'], $id, $marchesentity->find($idMarche)['LIBELLE'], $idMarche);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'marches', 'idacc' => $id]);
            \Helpers\Ariane\Ariane::generate(2, $trad->t('Modification Accord-cadre'));
        } else {
            $titre = $trad->t('Accords-cadres');
            $sousTitre = Trad::strBuild($trad->t("Modifier l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.accord-cadre.index';
            $pathRetour = $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'ALL', 'idacc' => 'ALL']);
            \Helpers\Ariane\Ariane::generate(1, $trad->t('Modification Accord-cadre'));
        }

        if (is_array($accCadrePreInsert->gestionEvenementAcd($id, $accCadreValueDetail['AVENANT']))) {
            $dateTitle = $accCadrePreInsert->gestionEvenementAcd($id, $accCadreValueDetail['AVENANT']);
            if (count($dateTitle)) {
                $sousTitre .= ' ' . $trad->t('créé le') . ' ' . \Helpers\Outil\Date::dateConverte($dateTitle['DTE']);
            }
            if ($accCadreValueDetail['CREERPAR'] != '') {
                $sousTitre .= ' ' . $trad->t('par') . ' ' . $accCadreValueDetail['CREERPAR'] . ' (' . $accCadrePreInsert->societeInSessionUtilisateur($accCadreValueDetail['CREERPAR'])['NOM'] . ')';
            }
        }



        if (\Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_ADM')) {
            $droitModif = true;
        } elseif ($accCadreValueDetail['CREERPAR'] == $_SESSION['Session_Login']) {
            $droitModif = true;
        } elseif ($accCadreValueDetail['ACH_RESP'] == $_SESSION['Session_Login']) {
            $droitModif = true;
        } else {
            $droitModif = false;
        }

        return $this->renderer->render('@Contrat/accord-cadre/modifier-accord-cadre', [
            'menuActive'    => $menuActive,
            'menuLeft'      => $menuLeft,
            'id'            => $id,
            'devise'        => $devise,
            'acc'           => $accCadreValueDetail,
            'listeType'     => $listeType,
            'listeTypeDate' => $listeTypeDate,
            'delais'        => ((int)$delais),
            'post'          => $post,
            'listeCSID'     => $listeCS,
            'pathRetour'    => $pathRetour,
            'TITRE'         => $titre,
            'SOUSTITRE'     => $sousTitre,
            'type'          => $type,
            
            'droitModif'    => $droitModif
        ]);
    }

    public function commandeAction(): string
    {

        $post = $this->request->getParsedBody();

        $id = $this->request->getAttribute('idacc');
        $type = $this->request->getAttribute('type');

        $accCadreEntity = new \Entity\Model\Acccadre($this->pdo);
        $accCadreValueDetail = $accCadreEntity->find($id);

        $trad = $this->getTranslationService();
        if ($type == 'fournisseur') {
            ArianeSub::generate(2, 0, $trad->t('Commandes'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Fournisseur');
            $sousTitre  = Trad::strBuild($trad->t("Commandes de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';

            $post['filter_ACCORCA'] = $id;
        } elseif ($type == 'groupement') {
            ArianeSub::generate(2, 0, $trad->t('Commandes'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Groupement');
            $sousTitre  = Trad::strBuild($trad->t("Commandes de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';

            $post['filter_ACCORCA'] = $id;
        } elseif ($type == 'marches') {
            $titre = $trad->t('Marchés');
            $sousTitre  = Trad::strBuild($trad->t("Commandes de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';

            $post['filter_ACCORCA'] = $id;
            \Helpers\Ariane\Ariane::generate(2, $trad->t('Commandes'));
        } else {
            $titre = $trad->t('Accords-cadres');
            $sousTitre  = Trad::strBuild($trad->t("Commandes de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.accord-cadre.index';

            $post['filter_ACCORCA'] = $id;

            \Helpers\Ariane\Ariane::generate(2, $trad->t('Commandes'));
        }

        //$accListes = new \Modules\Contrat\Repository\AccordCadre($this->pdo);
        //$liste = $accListe = $accListes->listeCommandeAccordCadre($id, $post, $type);
        $accListes = new ListeCommande($this->pdo);
        $liste = $accListes->listeLigneCommande($post);


        $paginator = new \Helpers\Pagination\Paginator();
        $infopagination = $paginator->generate($liste, 0, $post, $this->renderer);


        /* **** */

        $listeEtatCommande = [
            ''   => $trad->t('Toutes'),
            'E'  => $trad->t('En cours'),
            'A'  => $trad->t('En Attente'),
            'V1' => $trad->t('A envoyer'),
            'V2' => $trad->t('En signature'),
            'V3' => $trad->t('Refusées'),
            'L'  => $trad->t('Livraison partielle'),
            'S'  => $trad->t('Soldées physiquement'),
            'Z'  => $trad->t('Annulées'),
        ];

        $listeEtatTab = [
            'E' => $trad->t('En cours'),
            'A' => $trad->t('En Attente'),
            'V' => $trad->t('Validée'),
            'S' => $trad->t('Soldées physiquement'),
            'Z' => $trad->t('Annulées'),
        ];

        $listeEtatFinancier = [
            ''  => $trad->t('Toutes'),
            'T' => $trad->t('Non soldées financièrement'),
            'F' => $trad->t('Soldées financièrement'),
        ];

        return $this->renderer->render('@Commande/Liste/listeLigneCde', [
            'infoPagination'     => $infopagination,
            
            'listeEtatPhysique'  => $listeEtatCommande,
            'listeEtatFinancier' => $listeEtatFinancier,
            'listeEtatTab'       => $listeEtatTab,
            'listeCde'           => $liste,
            'ACC'                => true,
            'menuActive'         => $menuActive,
            'menuLeft'           => $menuLeft,
            'TITRE'              => $titre,
            'SOUSTITRE'          => $sousTitre,
            'type'               => $type,
            'MODULE'             => 'acc',
            'idacc'              => $id,
        ]);
    }

    public function exportCommandeAction(): string
    {

        $id = $this->request->getAttribute('idacc');
        $post = $this->request->getParsedBody();
        $post['filter_ACCORCA'] = $id;

        $accListes = new ListeCommande($this->pdo);
        $liste = $accListes->listeLigneCommandeExport($post, $this->getTranslationService());


        \Helpers\ExportTo\Outils::gestionEmailAsync2(
            'export_acccadre_commande_',
            $liste,
            $this->JWTKEY,
            $this->router,
            $this->getTranslationService()
        );

        return 'ok';
    }

    public function historiseAction(): string
    {
        $post = $this->request->getParsedBody();
        $date = date('Ymd');

        $id = $this->request->getAttribute('idacc');
        $type = $this->request->getAttribute('type');


        $accListes = new \Modules\Contrat\Repository\AccordCadre($this->pdo);

        $accCadreEntity = new \Entity\Model\Acccadre($this->pdo);
        $accCadreValueDetail = $accCadreEntity->find($id);

        $trad = $this->getTranslationService();

        if ($type == 'fournisseur') {
            ArianeSub::generate(2, 0, $trad->t('Historique'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Fournisseur');
            $sousTitre  = Trad::strBuild($trad->t("Historique de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
        } elseif ($type == 'groupement') {
            ArianeSub::generate(2, 0, $trad->t('Historique'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Groupement');
            $sousTitre  = Trad::strBuild($trad->t("Historique de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';
        } elseif ($type == 'marches') {
            $titre = $trad->t('Marchés');
            $sousTitre  = Trad::strBuild($trad->t("Historique de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';
            $post['filter_MARCHE'] = $id;

            \Helpers\Ariane\Ariane::generate(2, $trad->t('Historique'));
        } else {
            $titre = $trad->t('Accords-cadres');
            $sousTitre  = Trad::strBuild($trad->t("Historique de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.accord-cadre.index';

            \Helpers\Ariane\Ariane::generate(2, $trad->t('Historique'));
        }

        $accListe = $accListes->listeAccordCadreHistorise($id, $post, $type);
        
        $paginator = new Paginator();
        $infoPagination = $paginator->generate($accListe, 0, $post);

        return $this->renderer->render('@Contrat/accord-cadre/historique-accord-cadre', [
            'TITRE'          => $titre,
            'SOUSTITRE'      => $sousTitre,
            'id'             => $id,
            'dateJ'          => $date,
            'accListe'       => $accListe,
            'menuActive'     => $menuActive,
            'menuLeft'       => $menuLeft,
            'infoPagination' => $infoPagination,
            'post'           => $post,
            'type'           => $type,
        ]);
    }

    /**
     * @return false|Response|string
     * @throws \Exception
     */
    public function dupliquerAction()
    {
        // GET & POST
        $post = $this->request->getParsedBody();
        $id   = $this->request->getAttribute('idacc');
        $type = $this->request->getAttribute('type');

        // Entity
        $accCadreEntity = new \Entity\Model\Acccadre($this->pdo);

        // Repository
        $accListes      = new \Modules\Contrat\Repository\AccordCadre($this->pdo);

        // Validator
        $validator      = $this->createValidator();

        // Variable
        $trad = $this->getTranslationService();
        $accCadreValueDetail = $accCadreEntity->find($id);
        $date                = date('Ymd');
        $trad = $this->getTranslationService();

        if (!$accCadreValueDetail) {
            return $this->redirect('Index.Index.error');
        }

        if ($type == 'fournisseur') {
            ArianeSub::generate(2, 0, $trad->t('Dupliquer accord-cadre'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Fournisseur');
            $sousTitre  = Trad::strBuild($trad->t("Duplication de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
        } elseif ($type == 'groupement') {
            ArianeSub::generate(2, 0, $trad->t('Dupliquer accord-cadre'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Groupement');
            $sousTitre  = Trad::strBuild($trad->t("Duplication de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';
        } elseif ($type == 'marches') {
            $titre = $trad->t('Marchés');
            $sousTitre  = Trad::strBuild($trad->t("Duplication de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';

            \Helpers\Ariane\Ariane::generate(2, $trad->t('Dupliquer accord-cadre'));
        } else {
            $titre = $trad->t('Accords-cadres');
            $sousTitre  = Trad::strBuild($trad->t("Duplication de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.accord-cadre.index';

            \Helpers\Ariane\Ariane::generate(1, $trad->t('Dupliquer accord-cadre'));
        }

        if ($this->request->getMethod() == 'POST') {
            $erreurValid = '';
            if (is_array($post['nbrLigne'])) {
                $post['nbrLigne'] = count($post['nbrLigne']);
            }

            for ($i = 1; $i <= $post['nbrLigne']; $i++) {
                // Ici à completer pour rajouter a ligne 1 etc ..
                $validator2 = $this->createValidator();
                $validator2->isStringSansEspace($trad->t('Accord-cadre'), $post['CODE_ACD_' . $i], 1, 12);
                $validator2->zoom('Fourniss', $post['FOURNISS_' . $i], $trad->t('Fournisseurs'), $this->pdo, false);
                $validator2->isCheck($post['TOGGLEMAJTARIF_' . $i]);
                $validator2->isInteger($trad->t("Taux Evol.Prx Art/ACD"), $post['TAUXEVOL_' . $i], 0, 15);
                $validator2->isDate($post['DDEBVAL_' . $i], '', '', true);
                $validator2->isDate($post['DFINVAL_' . $i], '', '', true);

                if ($validator2->getError()) {
                    $erreurValid .= '<br />' . $trad->t('Ligne') . ' ' . $i . ' : ' . $validator2->getError() . '<br /><br />';
                }

                if (isset($post['DDEBVAL_' . $i]) && $post['DFINVAL_' . $i] != '') {
                    if ((int)$post['DDEBVAL_' . $i] > (int)$post['DFINVAL_' . $i]) {
                        $msgFin = trad::strBuild($trad->t('La date de début de validité ne doit pas être supérieure à celle de la fin de validité (@1)'), \Helpers\Outil\Date::dateConverte($post['DFINVAL_' . $i]));
                        $validator2->isTrue(true, '<br>' . $msgFin . ')');
                        $dateValid = false;

                        $i == 1 ? $erreurValid = '<br>' . $trad->t('Ligne') . ' ' . $i . ': ' . $msgFin  : $erreurValid .= '<br>' . $trad->t('Ligne') . ' ' . $i . ': ' . $msgFin;
                    }
                    if ((int)$post['DDEBVAL_' . $i] < (int)$post['DDEBVAL_' . $i]) {
                        $msgDeb = trad::strBuild($trad->t('La date de fin de validité ne doit pas être inférieure à celle du début de validité (@1)'), \Helpers\Outil\Date::dateConverte($post['DDEBVAL_' . $i]));

                        $validator->isTrue(true, '<br>' . $msgDeb);
                        $dateValid = false;
                        $i == 1 ? $erreurValid = '<br>' . $trad->t('Ligne') . ' ' . $i . ': ' .  $msgDeb : $erreurValid .= '<br>' . $trad->t('Ligne') . ' ' . $i . ': ' .  $msgDeb;
                    }
                }
            }


            if (($dateValid ?? true) == false || $erreurValid != '') {
                return json_encode(['ok' => false, 'msgErreur' => $erreurValid]);
            } else {
                $res     = \Modules\Contrat\WebService\DuplicationAccordCadre::duplicationAcc($id, $post);
                $reponse = new \SimpleXMLElement($res->responseData);

                if ($reponse->Statut == 'O') {
                    return json_encode(
                        [
                            'ok'         => true,
                            'titreModal' => $trad->t('Confirmations'),
                            'message'    => $trad->t("Votre Accord-cadre a bien été dupliqué")
                        ]
                    );
                } else {
                    $erreurWsdl = '';
                    $lngArray = 0;

                    // Ce qui nous permettra de comptez le nombre d'occurence que contient le le retour wsdl
                    // => lngArray

                    // if($reponse->Statut == 'O' && !$validator->isValid())
                    // {
                    //     return json_encode(['ok' => false, 'msgErreur' => $erreurValid]);
                    // }

                    foreach ($reponse->ListeErreur->Erreur as $r) {
                        if ($r->Num != '') {
                            $lngArray++;
                        }
                    }

                    // Construction du message d'erreur pour gerer la ou les plusieurs lignes en erreurs.
                    for ($i = 0; $i < $lngArray; $i++) {
                        if ($i == 0) {
                            $erreurWsdl = $trad->t('Ligne') . ' ' . $reponse->ListeErreur->Erreur[$i]->Num . ': ';
                            if ($accCadreValueDetail['TYPE_FG'] == 'G') {
                                $erreurWsdl .= str_replace('fournisseur', 'groupement', $reponse->ListeErreur->Erreur[$i]->Texte);
                            } else {
                                $erreurWsdl .= $reponse->ListeErreur->Erreur[$i]->Texte;
                            }
                        } else {
                            $erreurWsdl .= '<br>' . $trad->t('Ligne') .  ' ' . $reponse->ListeErreur->Erreur[$i]->Num . ': ';

                            if ($accCadreValueDetail['TYPE_FG'] == 'G') {
                                $erreurWsdl .= str_replace('fournisseur', 'groupement', $reponse->ListeErreur->Erreur[$i]->Texte);
                            } else {
                                $erreurWsdl .= $reponse->ListeErreur->Erreur[$i]->Texte;
                            }
                        }
                    }

                    $erreurWsdl .= $erreurValid;

                    return json_encode(['ok' => false, 'msgErreur' => $erreurWsdl]);
                }
            }
        } else {
            $post['DDEBVAL_1'] = $accCadreValueDetail['DATE_DEB'];
            $post['DFINVAL_1'] = $accCadreValueDetail['DATE_FIN'];
        }

        return $this->renderer->render('@Contrat/accord-cadre/dupliquer-accord-cadre', [
            'TITRE'       => $titre,
            'SOUSTITRE'   => $sousTitre,
            'id'          => $id,
            'message'     => '',
            'dateJ'       => $date,
            'detailAcd'   => $accCadreValueDetail,
            'menuActive'  => $menuActive,
            'menuLeft'    => $menuLeft,
            'post'        => $post,
            'type'        => $type,
            
            'sizeArray'   => $post['nbrLigne'] ?? 1,
        ]);
    }

    public function arrayCastRecursive($array)
    {
        if (is_array($array)) {
            foreach ($array as $key => $value) {
                if (is_array($value)) {
                    $array[$key] = $this->arrayCastRecursive($value);
                }
                if ($value instanceof \stdClass) {
                    $array[$key] = $this->arrayCastRecursive((array)$value);
                }
            }
        }
        if ($array instanceof \stdClass) {
            return $this->arrayCastRecursive((array)$array);
        }
        return $array;
    }

    public function popupCreationAvenantAction()
    {


        $id = $this->request->getAttribute('idacc');
        $post = $this->request->getParsedBody();
        $validator = $this->createValidator();

        $trad = $this->getTranslationService();

        if ($this->request->getMethod() == 'POST' && isset($post['MOTIFAVENANT'])) {
            $validator->isStringAvecEspace($trad->t('Motif avenant'), $post['MOTIFAVENANT'], 1, 2000);
            if ($validator->isValid()) {
                $res = \Modules\Contrat\WebService\CreationAvenantAccordCadre::creationAvenant($id, $post);
                $reponse = new \SimpleXMLElement($res->responseData);

                if ($reponse->Statut == 'O') {
                    // TODO RETOUR OK
                    //return $this->redirect('Contrat.accord-cadre.index', ['type' => 'ALL', 'idacc' => 'ALL' ]);
                    return new Response(200, [], (string) \json_encode([
                        'path' => $this->router->generateUri('Contrat.accord-cadre.index', ['type' => 'ALL', 'idacc' => 'ALL']),
                        'statut' => $reponse->Statut,
                        'erreur' => $reponse->MsgErreur,
                        'post' => ['filter_CODE_ACD' => $id],
                    ]));
                } else {
                    //$erreur = $reponse->MsgErreur;
                    return new Response(200, [], (string) \json_encode(['statut' => $reponse->Statut, 'erreur' => $reponse->MsgErreur]));
                }
            } else {
                $erreur = $validator->getError();
            }
        }





        return $this->renderer->render('@Contrat/accord-cadre/popup-creation-avenant', [
            'erreur' => $erreur ?? '',
            'post'   => $post,
            
            'idacc'  => $id
        ]);
    }

    public function popupCommentaireAction(): string
    {
        // GET & POST
        $id = $this->request->getAttribute('idacc');
        $post = $this->request->getParsedBody();

        // Entity
        $accCadreEntity = new \Entity\Model\Acccadre($this->pdo);

        // Repository
        $accListes = new \Modules\Contrat\Repository\AccordCadre($this->pdo);

        if ($this->request->getMethod() == 'POST' && isset($post['ACD_COMMENT']) && isset($id)) {
            $accListes->modifCommentByACD($post['ACD_COMMENT'], $id);
        }

        return $this->renderer->render('@Contrat/accord-cadre/popup-commentaire-accord-cadre', [
            'idacc'       => $id,
            'commentaire' => $accCadreEntity->find($id),
        ]);
    }
    public function popupExportContentAction(): string
    {

        $post = $this->request->getParsedBody();
        $type = $this->request->getAttribute('type');
        $id = $this->request->getAttribute('idacc');

        $post['multiSelectexportRFOBLI1'] = 'acc.CODE_ACD';

        return $this->renderer->render('@GlobalApplication/Popup/popupExport', [
            'pathExport' => $this->router->generateUri('Contrat.accord-cadre.exportAccadre', ['type' => $type, 'idacc' => $id]),
            'formFilter' => 'form_filtre_acc',
            'coloneExport' => $this->_exportGetTab(),
            'tabObli' => ['acc.CODE_ACD'],
            'post' => $post,
            // 'modeDebug' => true,
        ]);
    }
    public function exportAccadreAction(): string
    {
        //dossier 37222
        $post = $this->request->getParsedBody();


        $id   = $this->request->getAttribute('idacc');
        $type = $this->request->getAttribute('type');

        $trad = $this->getTranslationService();

        $arrayMultiSelect = array_filter($post, function ($k) {
            return (bool)stristr($k, 'multiSelectexport');
        }, ARRAY_FILTER_USE_KEY);

        // Filter any unauthorized fields
        $arrayMultiSelect = array_intersect(
            $arrayMultiSelect,
            array_keys($this->_exportGetTab())
        );


        if (empty($post['okFilter'])) {
            $post = $arrayMultiSelect;
        }

        $listeCS = [];
        foreach ($arrayMultiSelect as $key => &$multiSelect) {
            if (substr($multiSelect, 0, 12) == 'CS_EXTENSION') {
                $listeCS[] = substr($multiSelect, 17);
                unset($arrayMultiSelect[$key]);
            }
        }

        if (count($arrayMultiSelect) != 0) {
            $listeSelect = 'DISTINCT ' . implode(',', $arrayMultiSelect);
        } else {
            $listeSelect = '';
        }


        $acc      = new \Modules\Contrat\Repository\AccordCadre($this->pdo);
        if ($_SESSION['Session_UsrMultiSoc'] == 1 || $_SESSION['Session_UsrPluriSoc'] != '') {
            $accListe = $acc->listeAccordCadre($id, $post, $type, $listeSelect);
        } else {
            $post['user'] = $_SESSION['Session_SocUsrProfil'];
            $accListe = $acc->listeAccordCadre($id, $post, $type, $listeSelect);
        }


        // Fichier::createFichierTmp('TestListeAcc_nb'.'_'. time().'.txt', json_encode($accListe));
        $accCadre = new Acccadre($this->pdo);
        $listeChps = $accCadre->getArchitecture($this->getTranslationService());

        $champSupp = new ChampSupp($this->pdo);
        $listeChpsDate = [];
        $listeChpsBool = [];
        $listeChpsMemo = [];
        $keyValue = [];

        foreach ($listeChps as $key => $value) {
            $keyValue['acc.' . $key] = $value['nomChamp'];

            if (isset($value['type'])) {
                if ($value['type'] == 'DATE') {
                    $listeChpsDate[] = (string)$key;
                }
                if ($value['type'] == 'RADIO') {
                    $listeChpsBool[] = (string)$key;
                }
                if ($value['type'] == 'MEMO') {
                    $listeChpsMemo[] = (string)$key;
                }
            }
        }

        $tab = [];
        //On génère l'entete du fichier d'export
        foreach ($arrayMultiSelect as $value) {
            $tab[$value] = $keyValue[$value];
        }
        foreach ($listeCS as &$cs) {
            $cs = $champSupp->getinfoOneCs('ACD', $cs);
            $tab['ACD' . $cs['NUM_FIX']] = $cs['NOM'];
        }

        $oui = $trad->t('Oui');
        $non = $trad->t('Non');
        foreach ($accListe as &$ligne) {
            foreach ($listeCS as $csRFx) {
                $value = null;
                //@phpstan-ignore-next-line
                $value = $champSupp->generateChampSupp('ACD', $ligne['CODE_ACD'], $csRFx['NUM_FIX']);
                $value = $value[0]['VALUECHAMPSUPP'];


                //@phpstan-ignore-next-line
                if ($csRFx['TYPE'] == 'LOGIQUE') {
                    $value = Sql::boolSql($value) == 1 ? $oui : $non;

                    //@phpstan-ignore-next-line
                }
                // elseif ($csRFx['TYPE']=='DATE') {
                //     $value = Date::dateConverte($value);
                // }
                //@phpstan-ignore-next-line
                $ligne['CS_EXTENSION' . $csRFx['NUM_FIX']] = $value;
            }

            foreach ($listeChpsDate as $chps) {
                if ($ligne[$chps]) {
                    $ligne[$chps] = Date::dateConverte($ligne[$chps]);
                }
            }

            foreach ($listeChpsBool as $chps) {
                if ($ligne[$chps]) {
                    $ligne[$chps] = Sql::toBool($ligne[$chps]) ? $oui : $non;
                }
            }

            foreach ($listeChpsMemo as $chps) {
                if ($ligne[$chps]) {
                    $ligne[$chps] = Sql::getMemo($this->pdo, $ligne[$chps]);
                }
            }
        }

        \Helpers\ExportTo\Outils::gestionEmailAsync2(
            'export_accord_cadres_' . date('Ymd'),
            $accListe,
            $this->JWTKEY,
            $this->router,
            $this->getTranslationService(),
            $tab
        );

        return 'ok';

        /*$champSupp = new ChampSupp($this->pdo);
        $Acccadre  = new \Entity\Model\Acccadre($this->pdo);
        $acc      = new \Modules\Contrat\Repository\AccordCadre($this->pdo);
        $accListe = $acc->listExport($id, $type);

        // Ici on va checker si premièrement on est dans un multiselect
        // Puis dans le cas ou l'option n'est pas cocher on va retirer les postes filtre
        if (isset($post['okFilter'])) {
            if (empty($post['okFilter'])) {
                $post= [];
            }
        }

        if ($_SESSION['Session_UsrMultiSoc'] == 1 || $_SESSION['Session_UsrPluriSoc'] != '') {
            $accListe = $acc->listeAccordCadre($id, $post, $type);
        } else {
            $post['user'] = $_SESSION['Session_SocUsrProfil'];
            $accListe = $acc->listeAccordCadre($id, $post, $type);
        }

        $trad = $this->getTranslationService();

        //on récupère les post multiselect*
        $arrayMultiSelect = array_filter($post, function ($k) {
            return stristr($k, 'multiSelect');
        }, ARRAY_FILTER_USE_KEY);

        //dans la liste multiselect on sépare les CS des champs normaux
        $listeCS = [];
        foreach ($arrayMultiSelect as $key => &$multiSelect) {
            if (substr($multiSelect, 0, 12) == 'CS_EXTENSION') {
                $listeCS[] = substr($multiSelect, 13);
                unset($arrayMultiSelect[$key]);
            }
        }

        //on créer une liste des champs pour la requête
        $listeSelect = implode(',', $arrayMultiSelect);



        // Récupération des formats des champs
        $listeChps = $Acccadre->getArchitecture($this->getTranslationService());

        //On récupère la liste des champs DATE & BOOL afin de les traités après
        $listeChpsDate = [];
        $listeChpsBool = [];


        foreach ($listeChps as $key => $value) {
            $keyValue[$key] = $value['nomChamp'];

            if (isset($value['type'])) {
                if ($value['type']=='DATE') {
                    $listeChpsDate[] = $key;
                }
                if ($value['type']=='RADIO') {
                    $listeChpsBool[] = $key;
                }
            }
        }
        $keyValue['RS'] = $trad->t('Raison Sociale');
        $keyValue['STEMARCHE'] = $trad->t('Société du marché');

        // On récupère la liste des marchés
        $select = "CODE_ACD, LIBELLE, MARCHE, TYPE_FG, CODE_FOUR, RS, DATE_DEB, DATE_FIN, BUDGET, ACH_RESP, DEL_PRE, JOU_MOI, DEL_ALE, DEJ_ALE, ACD_COMMENT, AVENANT, STEMARCHE, AUTOCC";


        //On génère l'entete du fichier d'export
        $listeSelect = explode(',', $select);
        foreach ($listeSelect as $value) {
            $tab[trim($value)] = $keyValue[trim($value)];
        }
        foreach ($listeCS as &$cs) {
            $cs = ChampSupp::getinfoOneCs('ACD', 'ACD', $this->pdo);
            $tab['CS_EXTENSION_ACD_'.$cs['NUM_FIX']] = $cs['NOM'];
        }

        // on traite les différents champs de l'export (date/bool...)
        foreach ($accListe as &$ligne) {
            foreach ($listeCS as $cs) {
                $code = ChampSupp::autoCompletCodeEnr($ligne['CODE_ACD']);
                $value = $champSupp->generateChampSupp($cs['COD_TAB'], $code, $cs['NUM_FIX']);
                $value = $value[0]['VALUECHAMPSUPP']??'';

                if ($cs['TYPE']=='LOGIQUE') {
                    $value = $value=='T'? $trad->t('Oui'):$trad->t('Non');
                } elseif ($cs['TYPE']=='DATE') {
                    $value = Date::dateConverte($value);
                }

                $ligne['CS_EXTENSION_ACD_'.$cs['NUM_FIX']] = $value;
            }

            foreach ($listeChpsDate as $chps) {
                if (isset($ligne[$chps])) {
                    $ligne[$chps] = Date::dateConverte($ligne[$chps]);
                }
            }

            foreach ($listeChpsBool as $chps) {
                if (isset($ligne[$chps])) {
                    if ($ligne[$chps]!=null) {
                        $ligne[$chps] = $ligne[$chps]=='T'? $trad->t('Oui'):$trad->t('Non');
                    }
                }
            }
        }

        // $y['TEST']  = $tab;
        // Fichier::createFichierTmp('TestCs'.'_'. time().'.txt', json_encode($y));

        // $router->get($container->get('baseUrl') . $container->get('API.prefix'). '/charge-document-externe/{type:'.$global.'+}/{extension:'.$global.'+}/{idDoc:'.$encodeUrl.'+}/{token:'.$encodeUrl.'+}', ChargeDocumentExterneController::class, 'API.ChargeDocumentExterne.chargeDocumentExterne');

        // //localhost/oxaproc/V2/API/charge-document-externe/facture/
        // pdf/
        // 0001$12497733/
        // 8876f3a7719d51687cdfe73b9ff05e53e064005c7f17c242e4920b70da59628c

        \Helpers\ExportTo\Outils::gestionEmailAsync2(
            'export_accord_cadres_',
            $accListe,
            $this->JWTKEY,
            $this->router,
            $this->getTranslationService()
        );
        return 'ok';*/
    }

    /**
     * @return string[] label indexed by export key
     */
    private function _exportGetTab() :array
    {
        $tab = [];

        $listeChps = (new Acccadre($this->pdo))->getArchitecture($this->getTranslationService());
        foreach ($listeChps as $key => $value) {
            $tab['acc.' . $key] = $value['nomChamp'];
        }

        $listeTmpCS = (new ChampSupp($this->pdo))->getInfoCS('ACD');
        foreach ($listeTmpCS as $cs) {
            $tab['CS_EXTENSION_ACD_' . $cs['NUM_FIX']] = 'CS Entête - ' . $cs['NOM'];// TODO : translate ?
        }
        return $tab;
    }

    public function exportHistoriqueAction(): string
    {
        $post = $this->request->getParsedBody();
        $id   = $this->request->getAttribute('idacc');
        $type = $this->request->getAttribute('type');

        $acc      = new \Modules\Contrat\Repository\AccordCadre($this->pdo);
        $accListe = $acc->listExport($id, $type);

        $accListe = $acc->listeAccordCadreHistorise($id, $post, $type);
        \Helpers\ExportTo\Outils::gestionEmailAsync2(
            'export_acccadre_',
            $accListe,
            $this->JWTKEY,
            $this->router,
            $this->getTranslationService()
        );

        return 'ok';
    }

    public function ajaxDupliquerAction(): string
    {
        $post = $this->request->getParsedBody();
        $accCadreEntity    = new \Entity\Model\Acccadre($this->pdo);
        return $this->renderer->render('@Contrat/accord-cadre/ajax-dupliquer-accord-cadre', [
            'id'        => $post['id'],
            
            'detailAcd' => $accCadreEntity->find($this->request->getAttribute('idacc')),
        ]);
    }

    /**
     * @return Response|string
     * @throws \Exception
     */
    public function imprimerAction()
    {
        // GET // POST
        $post = $this->request->getParsedBody();
        $type = $this->request->getAttribute('type');
        $idAcc = $this->request->getAttribute('idacc');
        $idFourniss = $this->request->getAttribute('idFourniss');

        // Validator
        $validator = $this->createValidator();

        //Repository
        $acc = new \Modules\Contrat\Repository\AccordCadre($this->pdo);

        //Entity
        $accCadreEntity    = new \Entity\Model\Acccadre($this->pdo);

        // Permet de tester si l'utilisateur est monosocieté , dans le cas ou la societe de l'utilisateur ne se trouve pas dans SOC_USR il es Monosociete
        $societeUser        = $acc->societeByCodeUser($_SESSION['Session_Login']);
        $societeAffiche     = $_SESSION['Session_SocUsr'];
        $societeUtilisateur = $acc->societeInSessionUtilisateur($_SESSION['Session_Login']);
        $societeImpression  = $acc->societeImpression($idAcc);
        $societeUser        = $acc->societeByCodeUser($_SESSION['Session_Login']);

        $trad = $this->getTranslationService();
        $typeAchatDefault   = $acc->typeAchat($idFourniss);
        $find = false;

        for ($i = 0; $i < count($societeImpression); $i++) {
            if ($societeUser['COD_STE'] == $societeImpression[$i]) {
                $find = true;
            }
        }
        if ($find == true) {
            $societeUtilisateurAfficher = $societeUtilisateur['CODE_STE'];
        } else {
            $societeUtilisateurAfficher = '';
        }


        if ($this->request->getMethod() == 'POST') {
            $validator->isStringSansEspace($trad->t("Société"), $post['CODE_STE'], 1, 15);
            $validator->isStringSansEspace($trad->t("Centre Emetteur"), $post['CTR_EMET'], 1, 15);
            $validator->isStringSansEspace($trad->t("Centre de livraison"), $post['CTR_LIV'], 1, 15);
            $validator->isStringSansEspace($trad->t("Fournisseur"), $post['CODE_FOURN'], 1, 15);
            $validator->isStringSansEspace($trad->t("Type de Document"), $post['TYPE_DOC'], 1, 15);

            $post = $this->request->getParsedBody();

            $res = \Modules\Contrat\WebService\ImprimerAccordCadre::imprimer($idAcc, $post);
            $reponse = new \SimpleXMLElement($res->responseData);

            if ($reponse->Statut == 'O') {
                $extention = pathinfo($reponse->FichierPDF);
                $url = Fichier::URLDownload($extention['basename']);
                Fichier::UploadClient($url, $extention['basename']);
            } else {
                $error =
                    [
                        'statut' => $reponse->Statut,
                        'erreur' => $reponse->MsgErreur
                    ];
            }
        }



        $role = \Helpers\Outil\Roles::getDroit($this->pdo, 'INITTAC', 'PARAMFOU', false);


        $accCadreEntity = new \Entity\Model\Acccadre($this->pdo);
        $accCadreValueDetail = $accCadreEntity->find($idAcc);

        if (!$accCadreValueDetail) {
            return $this->redirect('Index.Index.error');
        }
        $trad = $this->getTranslationService();

        if ($type == 'fournisseur') {
            ArianeSub::generate(2, 0, $trad->t('Imprimer'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Fournisseur');
            $sousTitre  = Trad::strBuild($trad->t("Impression de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $idAcc);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
        } elseif ($type == 'groupement') {
            ArianeSub::generate(2, 0, $trad->t('Imprimer'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Groupement');
            $sousTitre  = Trad::strBuild($trad->t("Impression de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $idAcc);
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';
        } elseif ($type == 'marches') {
            $titre = $trad->t('Marchés');
            $sousTitre  = Trad::strBuild($trad->t("Impression de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $idAcc);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';

            \Helpers\Ariane\Ariane::generate(2, $trad->t('Imprimer'));
        } else {
            $titre = $trad->t('Accords-cadres');
            $sousTitre  = Trad::strBuild($trad->t("Impression de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $idAcc);
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.accord-cadre.index';

            \Helpers\Ariane\Ariane::generate(2, $trad->t('Imprimer'));
        }

        return $this->renderer->render('@Contrat/accord-cadre/imprimer-accord-cadre', [
            'idAcd'            => $idAcc,
            'post'             => $post,
            'typeAchatDefault' => $typeAchatDefault,
            'isInSoc'          => $societeUtilisateurAfficher,
            'role'             => $role,
            'societeUser'      => $societeUser,
            'detailAcd'        => $accCadreEntity->find($idAcc),
            'societeAffiche'   => $societeAffiche,
            'menuActive'       => $menuActive,
            'menuLeft'         => $menuLeft,
            'erreur'           => $error ?? '',
            
            'idFourniss'       => $idFourniss ?? '',
            'TITRE'            => $titre,
            'SOUSTITRE'        => $sousTitre,
            'type'             => $type,
        ]);
    }


    /** Page document rattachés **/
    public function docRattacheAction(): string
    {
        $post = $this->request->getParsedBody();
        //
        $post['NO_DA'] = 'ACD';
        // ID à mettre sur 9 digits
        // $idTmp = $this->request->getAttribute('id');
        // $id = str_pad($idTmp, 9, '0', STR_PAD_LEFT);
        $id = $this->request->getAttribute('id');
        $type = $this->request->getAttribute('type') ?? '';

        /* Liste des documents attaché */

        $docAtt = new \Modules\GlobalApplication\Repository\DocumentsRattaches($this->pdo);
        $docAtt = $docAtt->detail($id, $post);
        $paginator = new \Helpers\Pagination\Paginator();
        $infopagination = $paginator->generate($docAtt, 0, $post, $this->renderer);

        $accCadreEntity = new \Entity\Model\Acccadre($this->pdo);
        $accCadreValueDetail = $accCadreEntity->find($id);
        $trad = $this->getTranslationService();

        $droitCreationModule = $droitModificationModule = 1;
        if ($type == 'fournisseur') {
            ArianeSub::generate(2, 0, $trad->t('Documents rattachés'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Fournisseur');
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
        } elseif ($type == 'groupement') {
            ArianeSub::generate(2, 0, $trad->t('Documents rattachés'), $_SERVER['REQUEST_URI'], 1);

            $titre = $trad->t('Groupement');
            $menuActive = 'Fournisseur';
            $menuLeft = 'GestionGroupement';
        } elseif ($type == 'marches') {
            $titre = $trad->t('Marchés');
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.marche.index';

            \Helpers\Ariane\Ariane::generate(2, $trad->t('Documents rattachés'));
        } else {
            $titre = $trad->t('Accords-cadres');
            $menuActive = 'Contrats';
            $menuLeft = 'Contrat.accord-cadre.index';
            $droitCreationModule = $droitModificationModule = \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_CM');
            \Helpers\Ariane\Ariane::generate(2, $trad->t('Documents rattachés'));
        }
        $trad = $this->getTranslationService();
        
        $menuContextuel = new DocumentMenuContextuel($this->pdo, $this->router, $this->getTranslationService());
        foreach ($docAtt as &$doc) {
            $doc['menuContextuel'] = $menuContextuel->generate($doc, $post['NO_DA'], $type);
        }
        
        return $this->renderer->render('@GlobalApplication/documents-rattaches/documents-rattaches', [
            'menuActive'     => $menuActive,
            'menuLeft'       => $menuLeft,
            'id'             => $id,
            'NO_DA'          => $post['NO_DA'],
            'docAtts'        => $docAtt,
            'date'           => date("Ymd"),
            'post'           => $post,
            'droitModif'     => ($droitModificationModule && Roles::droitsUtilisateur($this->pdo, 'HA_DOC_RAT')),
            'doc'            => true,
            'infoPagination' => $infopagination,
            'pathPage'       => 'Contrat.marche.docRattache',
            'pathRetour'     => $this->router->generateUri('Contrat.marche.index'),
            'titre'          => Trad::strBuild($trad->t("Documents rattachés de l'Accord-cadre @1@ (@2@)"), $accCadreValueDetail['LIBELLE'], $id),
            'TITREH1'        => $titre,
            'type'           => $type,
            'droitCreation'  => ($droitCreationModule && Roles::droitsUtilisateur($this->pdo, 'HA_DOC_RAT')),
        ]);
    }

    public function ajaxChangeTypeAction(): string
    {
        $post = $this->request->getParsedBody();
        return $this->renderer->render('@Contrat/Ajax-accordCadre/changeType', [
            'type' => $post['type'],
            'droitModifcation' => \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_ACD_ADM')
        ]);
    }


    public function suppresionAvenantAction(): string
    {
        $idAcc = $this->request->getAttribute('idacc');
        $idAvenant = $this->request->getAttribute('idAvenant');
        $trad = $this->getTranslationService();

        $xmlResult = CreationAvenantAccordCadre::suppresionAvenant($idAcc, $idAvenant);

        $wsdl = new \SimpleXMLElement($xmlResult->responseData);

        if ($wsdl->Statut == "O") {
            $message  = $trad->t("L'avenant a bien été supprimé.");
        } else {
            $message = $wsdl->MsgErreur;
        }

        return $this->renderer->render('@popup-erreur/confirmationGestion', [
            'message' => $message,
            'refresh' => true,
            'iconePopup' => 'information',
            'div_refresh' => 'marche',
            'form_refresh' => 'form_filtre_acc',
        ]);
    }


    public function suiviEventAction(): string
    {
        $idAcc = $this->request->getAttribute('idacc');

        $accordCadre = new \Modules\Contrat\Repository\AccordCadre($this->pdo);
        $listeSuiviEvent = $accordCadre->suiviEvent($idAcc);
        return $this->renderer->render('@Contrat/accord-cadre/popup-suivi-event', [
            'listeSuiviEvent' => $listeSuiviEvent,
            'nbrEven' => count($listeSuiviEvent),
        ]);
    }
}
