<?php
namespace Modules\Fournisseur\Controller;

require_once 'application/helpers/downloadHelper.php';

use Entity\Model\Fourniss;
use Modules\Fournisseur\MenuContextuel\BddMenuContextuel;
use Modules\GlobalApplication\Repository\LicenceOxalys;
use Skeleton\Controller\Controller;
use Modules\Fournisseur\WebService\Fournisseur;
use Entity\Model\TypeTVA;
use Entity\Model\Paravrac;
use Entity\Model\Pays;
use Entity\Model\Langues;
use Entity\Model\ParamDico;
use Helpers\Session\Session;
use Helpers\Ariane\Ariane;
use Entity\Model\Periodes;
use Helpers\ChampsSupplementaire\ChampSupp;
use Helpers\Fichier\Fichier;
use Helpers\Outil\Date;
use Modules\Fournisseur\Repository\Articles;
use Helpers\Outil\Roles;
use Helpers\Outil\Sql;
use Modules\Fournisseur\Outil\CreationFournisseurSimplifier\Outil;
use Modules\Fournisseur\Repository\ZoneGeo;
use Modules\Fournisseur\Outil\DroitUtilisateur;
use Modules\Fournisseur\Repository\GestFourniss;
use Modules\Fournisseur\Repository\MotsClefs;
use Modules\Parametrage\Repository\ParametrageOxaproc;
use Helpers\Parametres\Constante;
use Modules\Fournisseur\MenuContextuel\TypeAchatMenuContextuel;
use Modules\Fournisseur\Repository\SousFamille;
use Modules\Fournisseur\Repository\TypeAchat;

class CreationFournisseurSimplifierController extends Controller
{

    
    /**
     * pageInit
     *
     * @return void
     */
    public function pageInit()
    {
        // unset($_SESSION['FournisseurSimplie']);
        // unset($_SESSION['FournisseurSimplie']);
        // $simplie        = $this->request->getAttribute('simplie');
        // if ($simplie) {
            $session = new Session('FournisseurSimplie');
        // } else {
        //     $session = new Session('Fournisseur');
        // }
        $session->SuppresionErreurSession();
    }
    
    /**
     * nouveauFournisseurAction
     *
     * @return string|\GuzzleHttp\Psr7\Response
     */
    public function nouveauFournisseurAction()
    {
        $post = $this->request->getParsedBody(true);

        if (!($post['refresh']??'')) {
            unset($_SESSION['FournisseurSimplie']);
        }
        
        $codeDemande    = $this->request->getAttribute('codeDemande');
        $codeFrs        = $this->request->getAttribute('id');
        $simplie        = $this->request->getAttribute('simplie');
        $ficheFournissTMP = [];

        $DroitUtilisateur = new DroitUtilisateur($this->router);
        $paramOxaproc = new ParametrageOxaproc($this->pdo);
        /** gestion des droits d'acces **/
        $accesRestreint = false;
        
        /* ******************************** */

        
        $trad = $this->getTranslationService();
        if ((!$_SESSION['VisuDonneesProspect'] || !$_SESSION['VisuDonneesFournisseur']) && $DroitUtilisateur->parametrageFournisseurPresent($this->pdo) && ($_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT']??null) == null) {
            $accesRestreint = true;
        }
        
        $droitCreaProspect = Roles::droitsUtilisateur($this->pdo, 'HA_PRO_CRE');
        $droitCreaRef = Roles::droitsUtilisateur($this->pdo, 'HA_FOU_CRE');

        $droitModifProspect = Roles::droitsUtilisateur($this->pdo, 'HA_PRO_MOD');
        $droitModifRef = Roles::droitsUtilisateur($this->pdo, 'HA_FOU_MOD');

        /** *** **/
        
        // if ($simplie) {
            $sessionFournisseur = new Session('FournisseurSimplie', 'Creation');
        // } else {
        //     $sessionFournisseur = new Session('Fournisseur', 'Creation');
        // }
      //  $sessionFournisseur = new Session('Fournisseur', 'Creation');
        $sessionFournisseur->setSession('modifFourniss', false);
        $sessionFournisseur->setSession('simplie', true);
        
        if ($simplie === '1' || $sessionFournisseur->getSession('simplie')) {
            $codeDemande = null;
            $codeFrs = null;
        }
        $PARAVRAC = new Paravrac($this->pdo);
        $paramCode = $PARAVRAC->find(["TYPEPARV" => 'NUM_FO_PAR', "CODEPARV" => 'MODE']);
        
        $SaieiCode = str_replace(' ', '', $paramCode['LIB01PARV']);

        if ($SaieiCode == 'M') {
            $modeCode=1;
        } else {
            $modeCode=0;
        }
       
        if (empty($post['importFournisseur'])) {
            $value=[
                "Langue"      => $_SESSION['Session_Langue'],
                "Login"       => $_SESSION['Session_Login'],
                "no_ao"       => $_SESSION["Session_SocUsr"],
                "codeFrs"     => $codeFrs == 'noId'? '':$codeFrs,
                'codeDemande' => $codeDemande,
                'affDemande'  => 'FALSE',
                'mode'        => 'V',
            ];

            $ficheFourniss = new Fournisseur();
            $ficheFourniss = $ficheFourniss->ficheFournisseur($value);

            $xmlName = 'fiche_frs_'.Sql::guidGenerate().'.xml';

            Fichier::createFichierTmp($xmlName, $ficheFourniss->responseData);
            
            $sessionFournisseur->setSession('file_save_frs', $xmlName);
            
            $ficheFourniss = new \SimpleXMLElement($ficheFourniss->responseData);
            $ficheFournissTMPForArray = json_encode($ficheFourniss);
            $ficheFournissTMPForArray = json_decode((string)$ficheFournissTMPForArray, true);
            
            foreach ($ficheFournissTMPForArray['Fournisseur'] as $key => $value) {
                if ($key == 'DTEVALMIN' || $key == 'DTEVALMAX') {
                    $ficheFournissTMP['Identity'][$key] = $value;
                } elseif ($key == 'Identity' || $key == 'Reglement' || $key == 'Conditions' || $key == 'Detail' || $key == 'ImpressionCde') {
                    if ($key == 'ImpressionCde') {
                        $key ='Paramétrage EDI';
                    }
                    if ($key == 'Detail') {
                        $key = 'Détails';
                    }
                    if ($key == 'Reglement') {
                        $key = 'Règlement';
                    }
                    if ($key == 'Identity') {
                        $key = 'Identité';
                    }
                    $ficheFournissTMPMerge[$key] = $value;
                    $ficheFournissTMP = array_merge($ficheFournissTMP, $ficheFournissTMPMerge);
                    $ficheFournissTMPMerge=[];

                    if ($key == 'Conditions') {
                        unset($ficheFournissTMP['Conditions']['Eproc']);
                        unset($ficheFournissTMP['Conditions']['Franco']);
                        // unset($ficheFournissTMP['Conditions']['Franco']);
                        foreach ($value['Eproc'] as $keyTMP => $valueTMP) {
                            $ficheFournissTMP[$key][$keyTMP] = $valueTMP;
                        }
                        foreach ($value['Franco'] as $keyTMP => $valueTMP) {
                            $ficheFournissTMP[$key][$keyTMP] = $valueTMP;
                        }
                    }
                }
            }
        } else {
            /**
             * Mode IMPORT
             */
            $ficheFourniss = new \SimpleXMLElement($post['importFournisseur']);
            $sessionFournisseur->setSession('NOM_FIC_SOURCE', (string) $ficheFourniss->Fournisseur->NOM_FIC_SOURCE);
        }

         /*GENERATION DES SELECT  */
         $listeTVA = new TypeTVA($this->pdo);
         $listeTVA = $listeTVA->fetchAll();
        foreach ($listeTVA as $valTva) {
            $TVA[$valTva['CODE_TTV']] = $valTva['LIBELLE'];
        }
 
         $listePays = new Pays($this->pdo);
         $listePays = $listePays->fetchAll([], ['tri_CODE_PAYS' => 'asc']);
         
        foreach ($listePays as $valPays) {
            $CodePays[$valPays['CODE_PAYS']] = $valPays['CODE_PAYS'];
            $Pays[$valPays['CODE_PAYS']]=$valPays['LIBELLE'];
        }
 
         $listeLangues = new Langues($this->pdo);
         $listeLangues = $listeLangues->fetchAll();
        foreach ($listeLangues as $valLangue) {
            $langues[$valLangue['COD_LNG']]=$valLangue['LIBELLE'];
        }
         
         $listePeriodes = new Periodes($this->pdo);
         $listePeriodes = $listePeriodes->fetchAll([], ['tri_DATE_DEB' => 'desc']);
         
        foreach ($listePeriodes as $valPeriode) {
            if ($valPeriode['DATE_DEB'] <= date('Ymd')) {
                $periodes[$valPeriode['CODE_PER']]=$valPeriode['LIBELLE'];
            }
        }
        
        /*
         * Gestion du droit création prospect/reference
         * si l'utilisateur n'as qu'un seul droit, alors on lock le switch  PROSPECT
         * coter twig on ajout un input hidden si il est autorisé au prospect pour récupéré en post l'état 1 du prospect
        */
        if (!$_SESSION['AuthCreatFournisseur'] || !$_SESSION['AuthCreatProspect']) {
            //$modifType = 'disabled';
            $accesRestreint = false;
            
            if ($_SESSION['AuthCreatProspect']) {
                $ficheFourniss->Fournisseur->PROSPECT = 1;
            } elseif ($_SESSION['AuthCreatFournisseur']) {
                $ficheFourniss->Fournisseur->PROSPECT = 0;
            }
            /** @phpstan-ignore-next-line */
        } elseif ($_SESSION['AuthCreatFournisseur'] && $_SESSION['AuthCreatProspect']) {
            $ficheFourniss->Fournisseur->PROSPECT = 0;
        }
        
        if (empty($_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT']) && ($_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT']??null)!=='0' && !$accesRestreint) {
            $_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT'] = (strval($ficheFourniss->Fournisseur->PROSPECT)=='' || strval($ficheFourniss->Fournisseur->PROSPECT)=='0')? '0':'1';
        }
        
       // $parametrageOnglet = $sessionFournisseur->getSessionArray('parametrageOnglet');
        $parametrageOnglet= [];

        
        // if (!$parametrageOnglet) {
            $fournissTMP['PROSPECT'] = $_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT']??strval($ficheFourniss->Fournisseur->PROSPECT);
            /** @phpstan-ignore-next-line */
        if (!$DroitUtilisateur->DroitUtilisateur($fournissTMP) && $DroitUtilisateur->parametrageFournisseurPresent($this->pdo)) {
             $parametrageOnglet = $DroitUtilisateur->parametrageOngletFournisseur($this->pdo);
        }
            $sessionFournisseur->setSession('parametrageOnglet', $parametrageOnglet);
        // }

        $arraytmp = [
            'Identity'            => null,
            'Détails'             => null,
            'ListeChiffreAffaire' => null,
            'Reglement'           => null,
            'Conditions'          => null,
            'ListContacts'        => null,
            'ListDomCompetence'   => null,
            'ListChampsSup'       => null,
            'Mots Clés'           => null,
            // 'BDD'                 => null,
            // 'Zone géo'            => null,
            'Sous-famille'        => null,
            'Type d\'achat'       => null,
            'Paramétrage EDI'     => null,

        ];
        // On vas ici tester si il y à au moins un champs parmis la liste paramétré présent dans un bloc tels que identité ou contact etc..
        // Dans le cas c'est présent on le rend visible car il fais bien partie d'une des branches
       

        $returnRender = '';
        $paramChamp   = [];
        $tab          = [];
        $entete       = [];

        if ($simplie) {
            $listeParamChpsFrsOxaproc = $paramOxaproc->listeParamChpsFrsOxaproc();
            foreach ($listeParamChpsFrsOxaproc as &$param) {
                /** @phpstan-ignore-next-line */
                // if (!isset($arraytmp[$param['ALPHA3']]) || ) {

                if ($param['TYPEDICO'] == 'OXAPROC_FOURN_STR') {
                    $arraytmp[$param['ID1']] = (trim($param['ALPHA1'])=='O'? false:true);
                }
                // elseif (!isset($arraytmp[$param['ALPHA3']])) {
                //     $arraytmp[$param['ID3']] = (trim($param['ALPHA1'])=='O'? false:true);
                // }

                // if ($param['TYPEDICO'] == 'OXAPROC_FOURN_CHP' &&  $param['ID2'] == 'RS') {
                //     $param['ALPHA1'] = 'O';
                //     $param['ALPHA2'] = 'O';
                //     $arraytmp[$param['ALPHA3']] = $param['ALPHA1']!='O'? false:true;
                //     echo $param['ALPHA3'].' '.$param['ALPHA1'].'<br />';
                // } else {

                //     $arraytmp[$param['ALPHA3']] = $param['ALPHA1']!='O'? false:true;
                //     echo $param['ALPHA3'].' '.$param['ALPHA1'].'<br />';
                // }
                    // if($arraytmp[$param['ALPHA3']])
                    // {
                    //     $parametrageOnglet = true;
                    // }
                // }
            }

            if (count($listeParamChpsFrsOxaproc) > 0) {
                if (isset($parametrageOnglet['CHIFFAFF_NONVISIBLE']) && empty($parametrageOnglet['CHIFFAFF_NONVISIBLE'])
                || (isset($parametrageOnglet['CHIFFAFF_NONVISIBLE']) && $parametrageOnglet['CHIFFAFF_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['CHIFFAFF_NONVISIBLE'])) {
                    $parametrageOnglet['CHIFFAFF_NONVISIBLE'] =  $arraytmp['ListeChiffreAffaire'];
                }
                
                // if($param['ALPHA3'] == 'Contacts' && $param['ALPHA1'] == 'O')
                // {
                //     $parametrageOnglet['CONTACT_VISIBLE'] = true;
                // }
                if (empty($parametrageOnglet['ID']) || (isset($parametrageOnglet['ID']) && $parametrageOnglet['ID'] == false)) {
                    // onglet affiché ici
                    $parametrageOnglet['ID'] = $arraytmp['Identity'];
                }
                if (empty($parametrageOnglet['DETAIL_NONVISIBLE']) || (isset($parametrageOnglet['DETAIL_NONVISIBLE']) && $parametrageOnglet['DETAIL_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['DETAIL_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['DETAIL_NONVISIBLE'] = $arraytmp['Details'];
                }
                if (empty($parametrageOnglet['CONTACTS_NONVISIBLE']) || (isset($parametrageOnglet['CONTACTS_NONVISIBLE']) && $parametrageOnglet['CONTACTS_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['CONTACTS_NONVISIBLE'])) {
                    $parametrageOnglet['CONTACTS_NONVISIBLE'] = $arraytmp['ListContacts'];
                }
                //     // onglet affiché ici00
                if (empty($parametrageOnglet['CONDT_NONVISIBLE']) || (isset($parametrageOnglet['CONDT_NONVISIBLE']) && $parametrageOnglet['CONDT_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['CONDT_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['CONDT_NONVISIBLE'] = $arraytmp['Conditions'];
                }
                if (empty($parametrageOnglet['CS_NONVISIBLE']) || (isset($parametrageOnglet['CS_NONVISIBLE']) && $parametrageOnglet['CS_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['CS_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['CS_NONVISIBLE'] = $arraytmp['ListChampsSup'];
                }
                if (empty($parametrageOnglet['BDD_NONVISIBLE']) || (isset($parametrageOnglet['BDD_NONVISIBLE']) && $parametrageOnglet['BDD_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['BDD_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['BDD_NONVISIBLE'] = $arraytmp['BDD'];


                    $paramDico = new ParamDico($this->pdo);
                    $listeParmaBDD = $paramDico->findAll(['TYPEDICO' => 'PARAMBDDFOU'], ['LIBELLE']);
                    
                    $obliBDD = 0;
                    foreach ($listeParmaBDD as $parm) {
                        if ($parm) {
                            /** @phpstan-ignore-next-line */
                            $paramBDD = explode('|', $parm['LIBELLE']);
                            if ($paramBDD[3]=='B') {
                                $obliBDD = 1;
                            }
                        } else {
                            $obliBDD = 1;
                        }
                    }

                    if ($obliBDD) {
                        $parametrageOnglet['BDD_NONVISIBLE'] = false;
                    }
                }


                if (empty($parametrageOnglet['ZONESGEO_NONVISIBLE']) || (isset($parametrageOnglet['ZONESGEO_NONVISIBLE']) && $parametrageOnglet['ZONESGEO_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['ZONESGEO_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['ZONESGEO_NONVISIBLE'] = $arraytmp['ZONEGEO'];
                }
                if (empty($parametrageOnglet['SFAM_NONVISIBLE']) || (isset($parametrageOnglet['SFAM_NONVISIBLE']) && $parametrageOnglet['SFAM_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['SFAM_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['SFAM_NONVISIBLE'] = $arraytmp['SSFAMILL'];
                }
                if (empty($parametrageOnglet['TYPACH_NONVISIBLE']) || (isset($parametrageOnglet['TYPACH_NONVISIBLE']) && $parametrageOnglet['TYPACH_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['TYPACH_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['TYPACH_NONVISIBLE'] = $arraytmp['TAC'];
                }
                if (empty($parametrageOnglet['MOTSCLEFS_NONVISIBLE']) || (isset($parametrageOnglet['MOTSCLEFS_NONVISIBLE']) && $parametrageOnglet['MOTSCLEFS_NONVISIBLE'] == false)
                || !isset($parametrageOnglet['MOTSCLEFS_NONVISIBLE'])) {
                    // onglet affiché ici
                    $parametrageOnglet['MOTSCLEFS_NONVISIBLE'] = $arraytmp['MOTSCLES'];
                }
            }

            $returnRender = 'creationSimplie';

            //$parametrageOnglet['MOTSCLEFS_NONVISIBLE'] = true;
           // $parametrageOnglet['PARAMIMPCDE_NONVISIBLE'] = true;

            // TODO BBA test à enlever
            // $parametrageOnglet['BDD_NONVISIBLE'] = false;
            //  $parametrageOnglet['ZONESGEO_NONVISIBLE'] = false;
            //$parametrageOnglet['SFAM_NONVISIBLE'] = true;
            //$parametrageOnglet['TYPACH_NONVISIBLE'] = true;
            // $parametrageOnglet['CONTACTS_NONVISIBLE'] = false;
            
            
                    
            Ariane::generate(0, $trad->t('Nouveau fournisseur'));
            $champSupp = new ChampSupp($this->pdo);
            $outil = new Outil($this->pdo, $this->router, $trad);
            $listeChps = $outil->getArchitectureFournisseur(($parametrageOnglet['CHIFFAFF_NONVISIBLE'] ?? false)?false:true);
            
            foreach ($listeParamChpsFrsOxaproc as $p) {
                if ($p['TYPEDICO'] == 'OXAPROC_FOURN_CHP' && ($p['ID3'] != '' || $p['LIBELLE'] != '')) {
                    $paramChamp[$p['ID2'].'separation_visible' ] = $p['ALPHA1'  ];
                    $paramChamp[$p['ID2'].'separation_oblig'   ] = $p['ALPHA2'  ];
                    $paramChamp[$p['ID2'].'separation_head'    ] = $p['ALPHA3'  ];
                    $paramChamp[$p['ID2'].'separation_groupe'  ] = $p['LIBELLE' ];
                    $paramChamp[$p['ID2'].'separation_bloc'    ] = $p['ID1'     ];
                    
                    
                    $p['ALPHA3'] == 'Identity'      ? $tab = $ficheFourniss->Fournisseur->Identity      : '';
                    $p['ALPHA3'] == 'Conditions'    ? $tab = $ficheFourniss->Fournisseur->Conditions    : '';
                    $p['ALPHA3'] == 'Reglement'     ? $tab = $ficheFourniss->Fournisseur->Reglement     : '';
                    $p['ALPHA3'] == 'Détails'       ? $tab = $ficheFourniss->Fournisseur->Detail        : '';
                    $p['ALPHA3'] == 'ListChampsSup' ? $tab = $ficheFourniss->Fournisseur->ListChampsSup : '';
                   
                    $p['ALPHA3'] == 'Contacts'      ? $tab = $ficheFourniss->Fournisseur->ListContacts->Contact  : '';

                    // Paramétrage EDI // A ne pas oublier pour le tableau
                    $json = json_encode($tab);
                    $tab  = (array)json_decode((string)$json, true);

                    // On parcourir chaque liste du wsdl pour récupérer le paramétre du champs si il est modifiable ou non, pour ensuite alimenter notre tableau final et le traiter dans la vue
                 
                    foreach ($tab as $value) {
                        if (isset($value['@attributes'])) {
                            if (array_key_exists('Modifiable', $value['@attributes'])) {
                                $paramChamp[$p['ID2'].'separateur_modifiable'] = $value['@attributes']['Modifiable'];
                            }
                            if (array_key_exists('Etat', $value['@attributes'])) {
                                $paramChamp[$p['ID2'].'separateur_etat'] = $value['@attributes']['ETAT'];
                            }
                        }
                    }
                }
            }
            
            // On va parcourir notre architecture fournisseur déjà prédéfinie avec leur type etc, puis match avec chacune des clés que la fiche fournisseur nous à renvoyer puis rajouter si c'est modifiable ou non
            foreach ($listeChps as $k => &$value) {
                foreach ($paramChamp as $z => $v) {
                    if (explode('separation_', $z)[0] == $k) {
                        if (isset($paramChamp[explode('separation_', $z)[0].'separateur_modifiable' ])) {
                            $value['MODIFIABLE'  ] = $paramChamp[explode('separation_', $z)[0].'separateur_modifiable' ];
                        }
                        
                        $value['OBLIGATOIRE' ] = $paramChamp[explode('separation_', $z)[0].'separation_oblig'      ];
                        $value['HEAD'        ] = $paramChamp[explode('separation_', $z)[0].'separation_head'       ];
                        $value['VISIBLE'     ] = in_array($k, ['NO_SIRET', 'TAXE2', 'TAXE3', 'TAXE4'])
                            ? 'O' // Field taxe are always visible and handled on the js side due to their dependency to CODE_PAYS
                            : $paramChamp[explode('separation_', $z)[0].'separation_visible'    ];
                        $value['GROUPE'      ] = $paramChamp[explode('separation_', $z)[0].'separation_groupe'     ];
                        $value['BLOC'        ] = $paramChamp[explode('separation_', $z)[0].'separation_bloc'       ];
                    }
                    // if(explode('CONTFOUR', $z)[0] == $k)
                    // {
                    //     $value['MODIFIABLE'  ] = $paramChamp[explode('CONTFOUR_separation_', $z)[0].'separateur_modifiable' ];
                    //     $value['OBLIGATOIRE' ] = $paramChamp[explode('CONTFOUR_separation_', $z)[0].'separation_oblig'      ];
                    //     $value['HEAD'        ] = $paramChamp[explode('CONTFOUR_separation_', $z)[0].'separation_head'];
                    //     $value['VISIBLE'     ] = $paramChamp[explode('CONTFOUR_separation_', $z)[0].'separation_visible'    ];
                    //     $value['GROUPE'      ] = $paramChamp[explode('CONTFOUR_separation_', $z)[0].'separation_groupe'     ];
                    // }
                }
            }
            
            foreach ($listeChps as $k => &$data) {
                if (strpos($k, '|') !== false) {
                    $k = explode('|', $k)[0];
                }
                // On s'occupe ici de regrouper les groupes et les associé a une tête
                if (array_key_exists('GROUPE', $data)) {
                    if ($data['GROUPE'] == 'ADR') {
                        $data['HEAD'] = 'Identité';
                    }
                    if ($data['GROUPE'] == 'ADR_REGL') {
                        $data['HEAD'] = 'Règlement';
                    }
                    if ($data['GROUPE'] == 'IBAN') {
                        $data['HEAD'] = 'Règlement';
                    }
                }
                
                if ($data['type'] == 'TEXT' || $data['type'] =='TEXTAREA') {
                    $oblig = $SaieiCode == 'M' ? 1 : 0;
                    $data['pathValidator'] = !key_exists('pathValidator', $data) ? $this->router->generateUri('Ajax.validator.isStringAvecEspace') : $data['pathValidator'];
                    
                    // Faux positif
                    /** @phpstan-ignore-next-line */
                    if ($k == 'CPOSTAL') {
                        /** @phpstan-ignore-next-line */
                        $data['paramValidator'] = "{'sizeMin' : '".$oblig."', 'sizeMax' : '".$data['sizeMax']."', 'PAYS' : $('#input_CODE_PAYS').val()}";
                    } else {
                        /** @phpstan-ignore-next-line */
                        $data['paramValidator'] = "{'sizeMin' : '".$oblig."', 'sizeMax' : '".$data['sizeMax']."'}";
                    }
                } elseif ($data['type'] == 'SELECT') {
                    //echo $k.'<br />';
                    $data['listeValue'] =  $outil->getListeSelect($k);

                    $data['paramValidator'] = "{}";
                } elseif ($data['type'] == 'DEVISE') {
                    $data['pathValidator'] = $this->router->generateUri('Ajax.validator.float');
                    $data['paramValidator'] = "{'format' : ".Constante::formatMontant."}";
                } elseif ($data['type'] == 'DATE') {
                    $data['pathValidator'] = $this->router->generateUri('Ajax.validator.date');
                    // Faux positif
                    /** @phpstan-ignore-next-line */
                    $data['paramValidator'] = "{'nomChamp' : '".$data['nomChamp']."', 'null': '".$data['OBLIGATOIRE']."'}";
                } elseif ($data['type'] == 'ZOOMPATH' && isset($data['titleZoom']) && isset($data['paramValidator']) && isset($data['paramValidator'])) {
                    //$inputGenerate = $champSupp->generateImput($this->router, $data['TABLE'] ?? '', true, null, null);
                   /**
                    * Il y a des faux positif
                    */
                    $data['pathZoom'      ] = $data['pathZoom'];
                    // $data['paramZoom'     ] = $data['paramZoom'     ] ?? '';
                    /** @phpstan-ignore-next-line */
                    $data['titleZoom'     ] = $data['titleZoom'     ] ?? '';
                    /** @phpstan-ignore-next-line */
                    $data['pathValidator' ] = $data['pathValidator' ] ?? '';
                    /** @phpstan-ignore-next-line */
                    $data['paramValidator'] = $data['paramValidator'] ?? '';
                    $data['type'] = 'ZOOM';
                } elseif ($data['type'] == 'ZOOM') {
                    $inputGenerate = $champSupp->generateImputProjetAchat(
                        $this->router,
                        $this->getTranslationService(),
                        $data['TABLE'] ?? '',
                        null,
                        null
                    );

                    $data['csType'        ] = $inputGenerate['csType'        ] ?? '';
                    $data['pathZoom'      ] = $inputGenerate['pathZoom'      ] ?? '';
                    $data['paramZoom'     ] = $inputGenerate['paramZoom'     ] ?? '';
                    $data['titleZoom'     ] = $inputGenerate['titleZoom'     ] ?? '';
                    $data['pathValidator' ] = $inputGenerate['pathValidator' ] ?? '';
                    $data['paramValidator'] = $inputGenerate['paramValidator'] ?? '';
                    $data['Entity'        ] = $inputGenerate['Entity'        ] ?? '';
                }
                
                if (isset($data['HEAD'])) {
                    $entete[$data['HEAD']][$k] = $data;
                }

                if (($data['VISIBLE']??'N') == 'N' && ($data['init']??false)) {
                    $chpsInitialiser[$k] = $data;
                }
            }
            ///MOT CLE  // EDI / BDD // ZEONE GEO // TYPE ACHAT  ====> masqué
        } else {
            Ariane::generate(1, $trad->t('Nouveau fournisseur'));
            $returnRender = 'index';
        }
        
        $enteteTMP = $entete;
        $listeCSArray = $paramOxaproc->listeParamChpsFrsOxaproc(false, 'CS');
        $listeCS = [];
        foreach ($listeCSArray as $listeCsTmp) {
            $listeCS[str_replace('CS_', '', (string)$listeCsTmp['ID2'])] = [
                'ALPHA1' => $listeCsTmp['ALPHA1'],
                'ALPHA2' => $listeCsTmp['ALPHA2']
            ];
        }
        $listeParamChpsFrsOxaprocIdentity = $paramOxaproc->listeParamChpsFrsOxaproc(false, 'Identity');

        foreach ($listeParamChpsFrsOxaprocIdentity as $val) {
            if (!array_key_exists($val['ID2'], $entete['Identité'])) {
                $enteteTMP['Contacts'][$val['ID2']]['BLOC'] = 'FOURNISS';
                $enteteTMP['Contacts'][$val['ID2']]['HEAD'] = 'Identité';
                $enteteTMP['Contacts'][$val['ID2']]['OBLIGATOIRE'] = $val['ALPHA2'];
                $enteteTMP['Contacts'][$val['ID2']]['VISIBLE'] = $val['ALPHA1'];
                
                $entete['Identité'][$val['ID2']]= $enteteTMP['Contacts'][$val['ID2']];
            }
        }
       
        if ($parametrageOnglet['CONDT_NONVISIBLE'] == true) {
            unset($entete['Conditions']);
        }
        // if ($parametrageOnglet['DETAIL_NONVISIBLE'] == true) {
        //     unset($entete['Détails']);
        // }
        if ($parametrageOnglet['DETAIL_NONVISIBLE'] == true) {
            unset($entete['Détails']);
        }

        foreach ($listeParamChpsFrsOxaproc ?? [] as $val) {
            if ($val['TYPEDICO'] == 'OXAPROC_FOURN_STR') {
                if ($val['ID1'] == 'Reglement' && $val['ALPHA1'] == 'N') {
                    unset($entete['Règlement']);
                } elseif ($val['ID1'] == 'ParamEDI' && $val['ALPHA1'] == 'N') {
                    unset($entete['Paramétrage EDI']);
                }
            }
        }


        

        // if(isset($parametrageOnglet['CONTACT_VISIBLE'] ) && $parametrageOnglet['CONTACT_VISIBLE'] == true)
        // {
            $listeContact = $entete['Contacts']??[];
        // }
        // unset($entete['Contacts']);

        $sessionFournisseur->setSession('parametrageOnglet', $parametrageOnglet);
        
        $tabPeriodicite =
        [
            'M' => $trad->t('Mensuelle'),
            'T' => $trad->t('Trimestrielle'),
            'S' => $trad->t('Semestrielle'),
            'A' => $trad->t('Annuelle'),
        ];

        $listeZoneGeo = new ZoneGeo($this->pdo);
        $listeZoneGeo = $listeZoneGeo->listeDecoupZG();
        
        /* gestion des taxes initialisation */
        $PARAVRAC = Sql::parametrageTaxePays($this->pdo, $ficheFourniss->Fournisseur->Identity->CODE_PAYS);

        $gestionFournisseur = new GestFourniss($this->pdo);
        $paramTMP = $gestionFournisseur->parametreObligatoire();
        
        $chpsObligatoire = [];
        foreach ($paramTMP as $param) {
            if ($param['CODEPARV']=='CTLCODEBIC' || $param['CODEPARV']=='CTLIBAN') {
                $explode = explode('|', $param['LIB01PARV']);
                $chpsObligatoire[$param['CODEPARV']] = $explode[0] == 'B'? true:false;
            } elseif ($param['CODEPARV'] == 'FOU_SAISIE_SIRET' || $param['CODEPARV'] == 'PRO_SAISIE_SIRET') {
                $chpsObligatoire[$param['CODEPARV']]    = $param['LIB01PARV'] == 'B' ? true:false;
            } else {
                $chpsObligatoire[$param['CODEPARV']] = $param['LIB01PARV'] == 'B'? true:false;
            }
        }
        
     
        $licenceOxalink = (new LicenceOxalys($this->pdo))->hasOxalink();

        // Gestion des mots clef

        if ((isset($parametrageOnglet['MOTSCLEFS_NONVISIBLE']) && (!$parametrageOnglet['MOTSCLEFS_NONVISIBLE'] || $parametrageOnglet['MOTSCLEFS_NONVISIBLE']=='')) || is_null($parametrageOnglet['MOTSCLEFS_NONVISIBLE'])) {
            $motClefsSession = [];

            if ($sessionFournisseur->getSession('motclef')) {
                foreach ($sessionFournisseur->getSession('motclef') as $value) {
                    array_push($motClefsSession, ['MOTCLEF' =>$value['MOTCLEF'], 'ETAT' => $value['ETAT']]);
                }
            }
            $sessionFournisseur->setSession('motclef', $motClefsSession);

            
            $lockModif = ($sessionFournisseur->getSessionArray('droitInteraction')['MotsClef'] ?? '' )=='0'? true:false;

            $motClefs =  new MotsClefs($this->pdo);
            $motClefs = $motClefs->ListeCreationMotClef($motClefsSession, $post);
            
            $paginator = new \Helpers\Pagination\Paginator();
            $infopaginationMotclef = $paginator->generate($motClefs, 10, $post, $this->renderer);
        }

        // fin gestion mot clef

        $linkFrsSte = Roles::droit($this->pdo, 'LIEN_FOU_STE_ACTIF', 'PARAMFOU');
        
        if ($linkFrsSte) {
            $listeSocieteSession = $sessionFournisseur->getSessionArray('societe');

            if (!$listeSocieteSession) {
                $listeSocieteSession = [];
                foreach ($ficheFourniss->Fournisseur->ListSocietes->CODE_STE as $value) {
                    if (strval($value) != '') {
                        array_push($listeSocieteSession, [
                            'CODE_STE' => strval($value),
                            'Etat'     => strval($value->attributes()->Etat)
                        ]);
                    }
                }
                $sessionFournisseur->setSession('societe', $listeSocieteSession);
            }
        }

        // debu BDD
        if (isset($parametrageOnglet['BDD_NONVISIBLE']) && !$parametrageOnglet['BDD_NONVISIBLE']) {
            $BddSession = $sessionFournisseur->getSessionArray('Bdd');
            $paramDico  = new ParamDico($this->pdo);
            $paramDico  = $paramDico->findAll(['TYPEDICO' => 'PARAMBDDFOU']);
            
            foreach ($paramDico as $parm) { // On verifie si fournisseur a NO_PAGE BDD du parametrage
                $paramBDD = explode('|', $parm['LIBELLE']);
                
                $estPresent=false;
                foreach ($BddSession as $BDD) {
                    if ($BDD['NO_PAGE']==$parm['ID1']) {
                        $estPresent=true;
                        break;
                    }
                }
                
                if (!$estPresent) {
                    if ($paramBDD[3]==' ') {
                        $paramBDD[3] = SQL::boolSql(false);
                    }
                    
                    if (str_replace(' ', '', (string)$paramBDD[4])=='O') {
                        $paramBDD[4] = SQL::boolSql(true);
                    } else {
                        $paramBDD[4] = SQL::boolSql(false);
                    }
                    
                    array_push($BddSession, [
                        'ETAT'            => 'A',
                        'NO_PAGE'         => $parm['ID1'],
                        'NUMORDRE'        => $paramBDD[0],
                        'TITRE'           => $paramBDD[2],
                        'TEXTEBDD'        => '',
                        'VEPROC'          => $paramBDD[4],
                        'ONGLET'          => $paramBDD[5],
                        'LANGUE'          => $paramBDD[1],
                        'EXIST_PARAM'     => 1,
                        'EXIST_SURGRP'    => 0,
                        'LIEPARAM'        => 1,
                        'HERITAGE'        => 0,
                        'menuContextuel'  => (new BddMenuContextuel($this->pdo, $this->router, $this->getTranslationService()))->generate($parm['ID1'], (string)$paramBDD[2], 'FournisseurSimplie'),
                    ]);
                }
            }
    
            sort($BddSession);
            
            $sessionFournisseur->setSession('Bdd', $BddSession);
            
            $OuiNonTrad = [
                'Oui' => $trad->t('Oui'),
                'Non' => $trad->t('Non'),
            ];
            
            $paginator = new \Helpers\Pagination\Paginator();
            $infopaginationBdd = $paginator->generate($BddSession, 0, $post, $this->renderer);
        }
        

        // fin BDD

        // debut Sous Famille SFAM_NONVISIBLE
        if ((isset($parametrageOnglet['SFAM_NONVISIBLE']) && (!$parametrageOnglet['SFAM_NONVISIBLE'] || $parametrageOnglet['SFAM_NONVISIBLE']==''))  || is_null($parametrageOnglet['SFAM_NONVISIBLE'])) {
            $listeSSFamille = $sessionFournisseur->getSessionArray('sousFamille');


            $listeSousFamille = new SousFamille($this->pdo);
            $listeSousFamille = $listeSousFamille->ListeCreationSousFamille($listeSSFamille, $post);
        }

        // Fin Sous Famille

        // Debut Type Achat
        if ((isset($parametrageOnglet['TYPACH_NONVISIBLE']) && (!$parametrageOnglet['TYPACH_NONVISIBLE'] || $parametrageOnglet['TYPACH_NONVISIBLE']=='')) || is_null($parametrageOnglet['TYPACH_NONVISIBLE'])) {
            $typeAchatSession = $sessionFournisseur->getSessionArray('typeAchat');
            $listeTypeAchat = new TypeAchat($this->pdo);
            $defaut = $listeTypeAchat->TypeAchatParDefaut(); // on récupere la valeur par defaut du parametrage
            
            if (!$typeAchatSession) {                                                                                                    // si le fournisseur n'a pas de type d'achat,
                array_push($typeAchatSession, ['TACFOTAC' => $defaut['TYP_ACH'], 'ETAT' => 'A', 'DEFAUT' => 1]); // on affiche le type d'achat par defaut
                $sessionFournisseur->setSession('typeAchat', $typeAchatSession);
            }
                
            $listeTypeAchat = $listeTypeAchat->ListeTypeAchatFournisseur($typeAchatSession, $post);
            $typeAchatMenuContextuel = new TypeAchatMenuContextuel($this->pdo, $this->router, $this->getTranslationService());
            
            foreach ($listeTypeAchat as &$typeAchat) { // pour savoir si l'element est par defaut ou pas
                foreach ($typeAchatSession as $tpAchatSession) {
                    if ($typeAchat['TYP_ACH'] == $tpAchatSession['TACFOTAC']) {
                        $typeAchat['DEFAUT'] = $tpAchatSession['DEFAUT'];
                    }
                }
                $typeAchat['menuContextuel'] = $typeAchatMenuContextuel->generate($typeAchat['LIB_TAC'], $typeAchat['TYP_ACH']);
            }

            $paginator = new \Helpers\Pagination\Paginator();
            $infopaginationTypeAchat = $paginator->generate($listeTypeAchat, 0, $post, $this->renderer);
        }
        // Fin Type Achat
        
        $listeContactTmp = $paramOxaproc->listeParamChpsFrsOxaproc(false, 'ListContacts');
        foreach ($listeContactTmp as $listCont) {
            $listeContact[$listCont['ID2']] = $listCont;
        }
        
        return $this->renderer->render('@Fournisseur/CreationFournisseur/'. $returnRender, [
            'menuActive'        => 'eproc',
            'menuLeft'          => 'Fournisseur',
            'taxes'             => $PARAVRAC,
            'langues'           => $langues ?? '',
            'codePays'          => $CodePays ?? '',
            'paramChamp'         => $paramChamp,
            'pays'              => $Pays ?? '',
            'listePays'         => $listePays,
            'listeTVA'          => $TVA ?? '',
            'listePeriode'      => $periodes ?? '',
            'param'             => $listeParamChpsFrsOxaproc ?? [],
            'FF'                => $ficheFourniss,
            'post'              => $sessionFournisseur->getSession('Fournisseur'),
            'contacts'          => $sessionFournisseur->getSession('contact'),
            'ErreurValid'       => $sessionFournisseur->getSession('ErreurValid'),
            'ErreurXml'         => $sessionFournisseur->getSession('ErreurXml'),
            'sendForm'          => $sessionFournisseur->getSession('validation'),
            'adresseCompl'      => $sessionFournisseur->getSession('adresseCompl'),
            'chiffreAffaire'    => $sessionFournisseur->getSession('chiffreAffaire'),
            'modeFournisseur'   => $sessionFournisseur->getMode(),
            'ficheFourniss'     => true,
            'listeChps'         => $entete,
            'modeCode'          => $modeCode,
            'SaieiCode'         => $SaieiCode,
            'tabPeriodicite'    => $tabPeriodicite,
            
            'listeZoneGeo'      => $listeZoneGeo,
            'accesRestreint'    => $accesRestreint,
            'parametrageOnglet' => $parametrageOnglet,
            'chpsObligatoire'   => $chpsObligatoire,
            'frsProspect'       => $_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT']??null,
            'licenceOxalink'    => $licenceOxalink,
            'listeContact'      => $listeContact,
            'ficheFournissWSDL' => $ficheFournissTMP,
            // Mot cled
            'lockModif'         => $lockModif ?? '',
            'infopaginationMotclef'=> $infopaginationMotclef ?? '',
            'listeMotsClefs'          => $motClefs ?? '',
            'chpsInitialiser'       => $chpsInitialiser??[],
            // droits
            'droitCreaProspect'     => $droitCreaProspect,
            'droitCreaRef'          => $droitCreaRef,
            'droitModifProspect'    => $droitModifProspect,
            'droitModifRef'         => $droitModifRef,
            // BDD
            'listeBdd'          => $BddSession ?? '',
            'infopaginationBdd' => $infopaginationBdd ?? '',
            // Sous Famille
            'listeSousFamille' => $listeSousFamille ?? [],

            // Type Achat
            'infopaginationTypeAchat' => $infopaginationTypeAchat ?? [],
            'listeTypeAchat' => $listeTypeAchat ?? [],

            //CS
            'listeCS' => $listeCS
        ]);
    }
    
    
    public function gestionTaxeAction() : string
    {
        $post = $this->request->getParsedBody();

        $PARAVRAC = Sql::parametrageTaxePays($this->pdo, $post['pays']);
        
        return $this->renderer->render('@Fournisseur/CreationFournisseur/GestionTaxeSimply', [
            'taxes' => $PARAVRAC,
            'post' => $post
        ]);
    }
}
