<?php
namespace Modules\Fournisseur\Controller;

use Entity\Model\Alias\ParamFourniss;
use Entity\Model\Fourniss;
use Helpers\Outil\ArrayHelper;
use Helpers\Outil\StringHelper;
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\Oxaproc\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');
        $ficheFournissTMP = [];

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

        
        $trad = $this->getTranslationService();
        if ((!roles::droitsUtilisateur($this->pdo, 'HA_PRO_VIS') || !roles::droitsUtilisateur($this->pdo, 'HA_FOU_VIS')) && $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);
        $sessionFournisseur->setSession('searchImport', false);
        
        $codeDemande = null;
        $codeFrs = null;
        $paravrac = new ParamFourniss($this->pdo);
        $SaieiCode = $paravrac->getValue('NUM_FO_PAR', 'MODE');

        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"     => '',
                '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);
        }

        //________________________
        // Injection ListChiffreAffaire
        // Case : SearchImport send data from $post wihich must override the default values
        $listAnnee = ArrayHelper::filterByKey($post, function ($fieldName) {
            return str_starts_with($fieldName, 'ANNEE_CA');
        });
        foreach ($listAnnee as $id => $annee) {
            $id = StringHelper::removePrefix($id, 'ANNEE_CA');
            $ChiffreAffaire = $ficheFourniss
                ->Fournisseur
                ->ListChiffreAffaire
                ->addChild('ChiffreAffaire');
            $ChiffreAffaire->addChild('ANNEE', $annee);
            $ChiffreAffaire->addChild('CHIFF_AFF', $post['CHIFF_AFF'.$id]);
            $ChiffreAffaire->addChild('DEVISE_CA', $post['DEVISE_CA'.$id]);
            $ChiffreAffaire->addChild('ETAT', '');
            // TODO : simplify with
            // ->ListChiffreAffaire[] = [
            //     'ANNEE' => $annee,
            //     'CHIFF_AFF' => $post['CHIFF_AFF'.$id],
            //     'DEVISE_CA' => $post['DEVISE_CA'.$id],
            //     'ETAT' => '',
            // ];
        }

        if (isset($post['NO_SIRET'])) {
            $ficheFourniss
                ->Fournisseur
                ->Identity
                ->NO_SIRET = $post['NO_SIRET'];
        }


        //________________________

         /*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'];
        }
 
        $langues = (new Langues($this->pdo))->listChoice();
        $periodes = (new Periodes($this->pdo))->listChoiceActive();
        
        /*
         * 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 (!roles::droitsUtilisateur($this->pdo, 'HA_FOU_CRE') || !roles::droitsUtilisateur($this->pdo, 'HA_PRO_CRE')) {
            //$modifType = 'disabled';
            $accesRestreint = false;
            
            if (roles::droitsUtilisateur($this->pdo, 'HA_PRO_CRE')) {
                $ficheFourniss->Fournisseur->PROSPECT = 1;
            } elseif (roles::droitsUtilisateur($this->pdo, 'HA_FOU_CRE')) {
                $ficheFourniss->Fournisseur->PROSPECT = 0;
            }
            /** @phpstan-ignore-next-line */
        } elseif (roles::droitsUtilisateur($this->pdo, 'HA_FOU_CRE') && roles::droitsUtilisateur($this->pdo, 'HA_PRO_CRE')) {
            $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';
        }
        if (!empty($post['PROSPECT'])) {
            $_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT'] = $post['PROSPECT'];
        }
        
       // $parametrageOnglet = $sessionFournisseur->getSessionArray('parametrageOnglet');
        $parametrageOnglet= [];

        
        // if (!$parametrageOnglet) {
            $fournissTMP['PROSPECT'] = $_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT']??strval($ficheFourniss->Fournisseur->PROSPECT);
            /** @phpstan-ignore-next-line */
        if (!$DroitUtilisateur->DroitUtilisateur($this->pdo, $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
       
        $paramChamp   = [];
        $tab          = [];
        $entete       = [];
        $chpsInitialiser = [];

        $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);
            }
        }

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


                $paramDico = new ParamDico($this->pdo);
                $listeParmaBDD = $paramDico->findAll(['TYPEDICO' => 'PARAMBDDFOU']);
                
                $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'])) {
                // onglet affiché ici
                $parametrageOnglet['ZONESGEO_NONVISIBLE'] = $arraytmp['ZONEGEO'];
            }
            if (empty($parametrageOnglet['SFAM_NONVISIBLE'])) {
                // onglet affiché ici
                $parametrageOnglet['SFAM_NONVISIBLE'] = $arraytmp['SSFAMILL'];
            }
            if (empty($parametrageOnglet['TYPACH_NONVISIBLE'])) {
                // onglet affiché ici
                $parametrageOnglet['TYPACH_NONVISIBLE'] = $arraytmp['TAC'];
            }
            if (empty($parametrageOnglet['MOTSCLEFS_NONVISIBLE'])) {
                // onglet affiché ici
                $parametrageOnglet['MOTSCLEFS_NONVISIBLE'] = $arraytmp['MOTSCLES'];
            }
        }
        
        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));
        
        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'     ];
                // }
            }
        }

        $taxes = Sql::parametrageTaxePays($this->pdo, ((string)$ficheFourniss->Fournisseur->Identity->CODE_PAYS));


        
        foreach ($listeChps as $k => &$data) {
            /** @var array<mixed> $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 == 'NO_SIRET') {
                    /** @phpstan-ignore-next-line */
                    $data['paramValidator'] = "{'sizeMin' : '".$oblig."', 'sizeMax' : '".$taxes[1][0]."'}";
                } elseif ($k == 'TAXE2') {
                    /** @phpstan-ignore-next-line */
                    $data['paramValidator'] = "{'sizeMin' : '".$oblig."', 'sizeMax' : '".$taxes[3][0]."'}";
                } elseif ($k == 'TAXE3') {
                    /** @phpstan-ignore-next-line */
                    $data['paramValidator'] = "{'sizeMin' : '".$oblig."', 'sizeMax' : '".$taxes[5][0]."'}";
                } elseif ($k == 'TAXE4') {
                    /** @phpstan-ignore-next-line */
                    $data['paramValidator'] = "{'sizeMin' : '".$oblig."', 'sizeMax' : '".$taxes[7][0]."'}";
                } elseif ($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'])) {
                //$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'        ] ?? '';
            }

            $data['VALEUR'] = $post[ $k ] ?? null;

            //____________________
            
            if (isset($data['HEAD'])) {
                $entete[$data['HEAD']][$k] = $data;
            }

            if (($data['VISIBLE']??'N') == 'N' && ($data['init']??false)) {
                $chpsInitialiser[$k] = $data;
            }
        }
        unset($data);
        ///MOT CLE  // EDI / BDD // ZEONE GEO // TYPE ACHAT  ====> masqué


        
        $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 mots clef

        if ((
                isset($parametrageOnglet['MOTSCLEFS_NONVISIBLE'])
                && empty($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);
            
            $paginator = new \Helpers\Pagination\Paginator();
            $infopaginationBdd = $paginator->generate($BddSession, 0, $post, $this->renderer);
        }
        

        // fin BDD

        // debut Sous Famille SFAM_NONVISIBLE
        if (!($parametrageOnglet['SFAM_NONVISIBLE'] ?? false)) {
            $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']) || 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;
        }

        if (!empty($entete["Détails"]["CODE_REGR"])) {
            $entete["Détails"]["CODE_REGR"]["nomChamp"] = $trad->t('Catégorie fournisseur');
            $entete["Détails"]["CODE_REGR"]["titleZoom"] = $trad->t('Liste des catégories fournisseur');
        }
        
        return $this->renderer->render('@Fournisseur/CreationFournisseur/creationSimplie', [
            'menuActive'        => 'eproc',
            'menuLeft'          => 'Fournisseur',
            'taxes'             => null,
            '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,

            'configIban' => [
                'CTLCODEBIC' => explode('|', $paravrac->getValue('PARAMFOU', 'CTLCODEBIC'))[0],
                'CTLIBAN' => explode('|', $paravrac->getValue('PARAMFOU', 'CTLCODEBIC'))[0],
            ],
            'configSiret' => [
                'PROSP' => $paravrac->getSiretControl(true),
                'REFER' => $paravrac->getSiretControl(false),
            ],
            'frsProspect'       => $_SESSION['FournisseurSimplie']['Fournisseur']['PROSPECT']??null,
            'licenceOxalink'    => (new LicenceOxalys($this->pdo))->hasOxalink(),
            '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,

            'mapTaxeConfig' => $paravrac->getTaxeFieldMap(),
        ]);
    }
    
    
    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
        ]);
    }
}
