<?php
namespace Modules\Fournisseur\Controller;

use Entity\Model\Fourniss;
use Entity\Model\LienFouGrpSte;
use Entity\Model\WftDemEnt;
use Skeleton\Controller\Controller;
use Modules\Fournisseur\WebService\Fournisseur;
use Entity\Model\Paravrac;
use Helpers\Outil\Date;
use Helpers\Session\Session;
use Modules\Fournisseur\Outil\DroitModification;
use GuzzleHttp\Psr7\Response;
use Helpers\Trad\Trad;
use Helpers\Outil\Sql;
use Modules\Fournisseur\Repository\GestFourniss;
use Entity\Model\ParamDico;
use Helpers\Outil\Roles;
use Modules\Parametrage\Oxaproc\Repository\ParametrageOxaproc;
use Helpers\Parametres\Constante;
use Helpers\Session\ParseBase1;
use Traits\Validator\ValidatorChampSupp;

class ValidationFournisseurController extends Controller
{
    public function validationAction()
    {
        $postOrigin = $this->request->getParsedBody();

        $tmpCS = [];

        $typeSession=$this->request->getAttribute('type');
        $tmpListeChampsType = [];
        if (!$typeSession || $typeSession == 'Fournisseur') {
            $typeSession = 'Fournisseur';
            $modeSimplifie  = false;
        } else {
            $modeSimplifie  = true;
            $paramOxaproc = new ParametrageOxaproc($this->pdo);
            $listeParamChpsFrsOxaproc = $paramOxaproc->listeParamChpsFrsOxaproc(false);
            
            foreach ($listeParamChpsFrsOxaproc as $champs) {
                if ($champs['ID1'] == 'CONTFOUR') {
                    $tmpListeChampsType[$champs['ID1'].'.'.$champs['ID2']] = $champs;
                } elseif ($champs['ID3'] == 'Reglement' || $champs['ID3'] == 'Conditions' || $champs['ID3'] == 'Details' || $champs['ID3'] == 'ParamEDI') {
                    $tmpListeChampsType[$champs['ID3'].'.'.$champs['ID2']] = $champs;
                } else {
                    $tmpListeChampsType[$champs['ID2']] = $champs;
                }
                if (strpos($champs['ID2'], 'CS_') === 0) {
                    /** @phpstan-ignore-next-line */
                    $tmpCS[str_replace('CS_', '', $champs['ID2'])] = $champs;
                }
            }
        }

        /* trad */
        
        $trad = $this->getTranslationService();
        
        
        $session = new Session($typeSession);
        $post    = $session->getSession('Fournisseur');
        
        $mode    = $this->request->getAttribute('mode');
        $session->setSession('modeValidation', $mode);

        $codeFournisseur='';
        $codeDemande = '';
        if ($session->getMode()=='Modification') {
            $codeFournisseur= $session->getSession('CODE');
            $modeWSDL = $session->getSession('etatFournisseur');

            $demande = 'TRUE';
        } elseif ($session->getMode()=='Creation' && $session->getSession('codeDemande') != '') {
            $codeFournisseur= $session->getSession('CODE');
            $codeDemande = $session->getSession('codeDemande');
            $modeWSDL = $session->getSession('etatFournisseur');
            
            $demande = 'TRUE';
        } else {
            $modeWSDL = 'C';
            $demande = 'FALSE';
        }
        
        $value=[
            "Langue" => $_SESSION['Session_Langue'],
            "Login" => $_SESSION['Session_Login'],
            "no_ao" => $_SESSION["Session_SocUsr"],
            "codeFrs" => $codeFournisseur??'',
            'codeDemande' => $codeDemande,
            'affDemande' => $demande,
            'mode' => $modeWSDL,
            'signa' => $session->getSession('signa'),
        ];
        
        $xmlFile = $session->getSession('file_save_frs');

        if ($xmlFile) {
            $fileTMP = (new ParseBase1())->getRep()->tmp.$xmlFile;

            $fileContentXML = file_get_contents($fileTMP);
            $ficheFourniss = new \SimpleXMLElement($fileContentXML);
        } else {
            $ficheFourniss = new Fournisseur();
            $ficheFourniss = $ficheFourniss->ficheFournisseur($value);
            $ficheFourniss = new \SimpleXMLElement($ficheFourniss->responseData);
        }
        
        /*
         * le code depend du parametrage
         * M Manuelle (code obligatoire a la saisie)
         * I Indifferent (il peut etre saisie ou non par l'utilisateur)
         * A Automatique (Il ne peut pas etre saisie par l'utilisateur)
        */
        
        $modeCode = (new Paravrac($this->pdo))->getValue('NUM_FO_PAR', 'MODE');

        
        $validator = $this->createValidator();
        if (((($session->getMode()=='Creation' || ($session->getSession('ModifSigner'))
                && $session->getSession('etatFournisseur') == 'C')))
                && ($modeCode == 'M'  || $modeCode == 'I')
            ) {
            if ($modeCode == 'I') {
                $modeCode=0;
            } else {
                $modeCode=1;
            }

            $fourniss = new \Entity\Model\Fourniss($this->pdo);
            if (count($fourniss->findAll(['CODE' => $post['CODE']]))) {
                $validator->setError($trad->t('Le code du fournisseur est déjà existant'));
            }
        } else {
            $modeCode=0;
        }

        $Droit = new DroitModification();
         
        /* Identité */
        
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->RS, $post['RS'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->ENSCOMM, $post['ENSCOMM'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->ADR, $post['ADR'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->CPOSTAL, $post['CPOSTAL'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->VILLE1, $post['VILLE1'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->CODE_PAYS, $post['CODE_PAYS'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->TEL, $post['TEL'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->TELEX, $post['TELEX'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->FAX, $post['FAX'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->EMAIL, $post['EMAIL'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->NO_SIRET, $post['NO_SIRET'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->TAXE2, $post['TAXE2'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->TAXE3, $post['TAXE3'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->TAXE4, $post['TAXE4'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->NO_TVA_IC, $post['NO_TVA_IC'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->NO_DUNS, $post['NO_DUNS'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->ID_EXT, $post['ID_EXT'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->FOUPPAL, $post['FOUPPAL'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->COD_LNG, $post['COD_LNG'], true, false, $typeSession);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Identity->SITEWEB, $post['SITEWEB'], true, false, $typeSession);
        
        // TODO YANIS // RAJOUTER OBLIGATOIRE POUR SIZE MIN
        $label_category = $trad->t('Identité');
        
        $validator->isStringSansEspace($label_category . $trad->colon() . $trad->t('Code'), $post['CODE'] ?? '', $modeCode, 12);
        $validator->isStringAvecEspace($label_category . $trad->colon() . $trad->t('Raison sociale'), $post['RS'], 1, 45);
        $validator->isStringAvecEspace($label_category . $trad->colon() . $trad->t('Enseigne commerciale'), $post['ENSCOMM'], (isset($tmpListeChampsType['ENSCOMM']) && $tmpListeChampsType['ENSCOMM']['ALPHA2'] == 'O')?1:0, 45);
        $validator->isStringAvecEspace($label_category . $trad->colon() . $trad->t('Adresse'), $post['ADR'], (isset($tmpListeChampsType['ADR']) && $tmpListeChampsType['ADR']['ALPHA2'] == 'O')?1:0, 90);
        
        $validator->isObligatoire($post['CODE_PAYS'], $trad->t('Pays'));
        $label_codepost = $label_category . $trad->colon() . $trad->t('Code Postal');
        if (isset($post['CPOSTAL'])) {
            $validator->isCodePostal($label_codepost, $post['CPOSTAL'], $post['CODE_PAYS'] ?? 'FR');
        }

        // TODO: improve
        $codePostalType = $validator->getContenaire()['codePostalType'][ $label_codepost ] ?? '';
        if ($codePostalType== 3 || $codePostalType== 4 || $codePostalType== 7 || $codePostalType== 8) {
            $tmpListeChampsType['CPOSTAL']['ALPHA2'] = 'N';
        }

        $validator->zoom('grpFou', $post['FOUPPAL'], $trad->t('Identité : Groupement'), $this->pdo, true);

        $validator->isStringAvecEspace(
            $label_category . $trad->colon() . $trad->t('Code Postal'),
            $post['CPOSTAL'],
            ($tmpListeChampsType['CPOSTAL']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            10
        );

        
        $validator->isStringAvecEspace(
            $label_category . $trad->colon() . $trad->t('Ville'),
            $post['VILLE1'],
            ($tmpListeChampsType['VILLE1']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            35
        );
        $validator->isStringAvecEspace(
            $label_category . $trad->colon() . $trad->t('Téléphone'),
            $post['TEL'],
            ($tmpListeChampsType['TEL']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            16
        );
        $validator->isStringAvecEspace(
            $label_category . $trad->colon() . $trad->t('Télex'),
            $post['TELEX'],
            ($tmpListeChampsType['TELEX']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            16
        );
        $validator->isStringAvecEspace(
            $label_category . $trad->colon() . $trad->t('Fax'),
            $post['FAX'],
            ($tmpListeChampsType['FAX']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            16
        );
        $validator->adresseMail(
            $label_category . $trad->colon() . $trad->t('Email'),
            $post['EMAIL'],
            ($tmpListeChampsType['EMAIL']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            100,
            true
        );
          
        /* gestion des taxes initialisation */
        $PARAVRAC = Sql::parametrageTaxePays($this->pdo, $post['CODE_PAYS']);
        
        /*  ********************  */
        //$validator->isStringSansEspace($PARAVRAC[0], $post['NO_SIRET'] , $PARAVRAC[1]['1']=='N'? 0:1, $PARAVRAC[1]['0']);
        if ($PARAVRAC[0]) {
            if ($post['CODE_PAYS'] == 'FR') {
                if ($post['PROSPECT']) {
                    $obligSiret = $PARAVRAC[1]['OBLI']['PRO'];
                } else {
                    $obligSiret = $PARAVRAC[1]['OBLI']['FOU'];
                }
            } else {
                $obligSiret = $PARAVRAC[1]['OBLI'];
            }

            $validator->isStringAvecEspace($PARAVRAC[0], $post['NO_SIRET'], $obligSiret, $PARAVRAC[1]['0']);
            if ($PARAVRAC[1]['1']=='O' && $post['NO_SIRET']) {
                $validator->size($post['NO_SIRET'], $PARAVRAC[0], $PARAVRAC[1]['0'], $PARAVRAC[1]['0']);
            }
        }
        
        if ($PARAVRAC[2]) {
            //$validator->isStringSansEspace($PARAVRAC[2], $post['TAXE2'], $PARAVRAC[3]['1']=='N'? 0:1, $PARAVRAC[3]['0']);
            $validator->isStringAvecEspace($PARAVRAC[2], $post['TAXE2'], $PARAVRAC[3]['OBLI'], $PARAVRAC[3]['0']);
            if ($PARAVRAC[3]['1']=='O' && $post['TAXE2']) {
                $validator->size($post['TAXE2'], $PARAVRAC[2], $PARAVRAC[3]['0'], $PARAVRAC[3]['0']);
            }
        }
        if ($PARAVRAC[4]) {
            //$validator->isStringSansEspace($PARAVRAC[4], $post['TAXE3'], $PARAVRAC[5]['1']=='N'? 0:1 , $PARAVRAC[5]['0']);
            $validator->isStringAvecEspace($PARAVRAC[4], $post['TAXE3'], $PARAVRAC[5]['OBLI'], $PARAVRAC[5]['0']);
            if ($PARAVRAC[5]['1']=='O' && $post['TAXE3']) {
                $validator->size($post['TAXE3'], $PARAVRAC[4], $PARAVRAC[5]['0'], $PARAVRAC[5]['0']);
            }
        }
        if ($PARAVRAC[6]) {
            //$validator->isStringSansEspace($PARAVRAC[6], $post['TAXE4'], $PARAVRAC[7]['1']=='N'? 0:1 , $PARAVRAC[7]['0']);
            $validator->isStringAvecEspace($PARAVRAC[6], $post['TAXE4'], $PARAVRAC[7]['OBLI'], $PARAVRAC[7]['0']);
            if ($PARAVRAC[7]['1']=='O' && $post['TAXE4']) {
                $validator->size($post['TAXE4'], $PARAVRAC[6], $PARAVRAC[7]['0'], $PARAVRAC[7]['0']);
            }
        }
        
        
        /*$gestionFournisseur = new GestFourniss($this->pdo);
        $paramTMP = $gestionFournisseur->parametreObligatoire();

        foreach($paramTMP as $param)
        {
            if ((!$post['PROSPECT'] && $param['CODEPARV'] == 'FOU_SAISIE_SIRET') || ($post['PROSPECT'] && $param['CODEPARV'] == 'PRO_SAISIE_SIRET'))
            {
                $explode = explode('|', $param['LIB01PARV']);

                if ($explode[0] == 'B') {
                    $validator->isStringSansEspace($trad->t('Identité : N° SIRET'), $post['NO_SIRET'], 1);
                }
            }
        }*/
        
        $validator->isStringAvecEspace(
            $label_category . $trad->colon() . $trad->t('TVA Intra-communautaire'),
            $post['NO_TVA_IC'],
            ($tmpListeChampsType['NO_TVA_IC']['ALPHA2'] ?? null) == 'O' ?
                1 : 0,
            15
        );
        $validator->isStringSansEspace(
            $label_category . $trad->colon() . $trad->t('DUNS Number'),
            $post['NO_DUNS'],
            ($tmpListeChampsType['NO_DUNS']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            15
        );
        $validator->isStringSansEspace(
            $label_category . $trad->colon() . $trad->t('Identifiant externe'),
            $post['ID_EXT'],
            ($tmpListeChampsType['ID_EXT']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            30
        );
        
        $post['DTEVALMIN'] = DATE::dateConverte($post['DTEVALMIN'] ?? '');
        $validator->isDate(
            $post['DTEVALMIN'],
            '',
            '',
            ($tmpListeChampsType['DTEVALMIN']['ALPHA2'] ?? null) != 'O',
            $label_category . $trad->colon() . $trad->t('Validité du')
        );
        $post['DTEVALMAX'] = DATE::dateConverte($post['DTEVALMAX'] ?? '');
        $validator->isDate(
            $post['DTEVALMAX'],
            '',
            '',
            ($tmpListeChampsType['DTEVALMAX']['ALPHA2'] ?? null) != 'O',
            $label_category . $trad->colon() . $trad->t('Validité au')
        );
        
        
        $validator->isStringSansEspace(
            $label_category . $trad->colon() . $trad->t('Groupement'),
            $post['FOUPPAL'],
            ($tmpListeChampsType['FOUPPAL']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            12
        );
        
        $validator->isUrlValide(
            $label_category . $trad->colon() . $trad->t('Site Web'),
            $post['SITEWEB'],
            ($tmpListeChampsType['SITEWEB']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
            100
        );
        
        $adresseCdePresent = false;
        
        /* adresse complementaire  */
        $matches  = (array)str_replace("adrCompl_COD_ADR", "", preg_grep('/^adrCompl_COD_ADR/', array_keys($post)));
        $position = array_keys($matches);
        
        $adresseCompl = [];
        
        if ($ficheFourniss->Fournisseur->ListAdresses
            && $Droit->droitModifBloqueXML(
                $ficheFourniss->Fournisseur->ListAdresses->attributes()->Modifiable,
                ''
            )
        ) {
            for ($compteur=0; $compteur<count($matches); $compteur++) {
                $i = $position[$compteur];
            
                $numAdr = $post['adrCompl_COD_ADR'.$matches[$i]];
            
                if ($post['adrCompl_etat'.$matches[$i]]!='S') {
                    $label_adrcompl = $trad->t('Adr compl.  @1@');
                    $validator->isStringAvecEspace(
                        Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Raison sociale'), $numAdr),
                        $post['adrCompl_RAISOC' . $matches[$i]],
                        1,
                        45
                    );
                    if (isset($post['adrCompl_ADRFOUR'.$matches[$i]])) {
                        $validator->isStringAvecEspace(
                            Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Adresse'), $numAdr),
                            $post['adrCompl_ADRFOUR'.$matches[$i]],
                            0,
                            90
                        );
                    }
                    if (isset($post['adrCompl_CP'.$matches[$i]])) {
                        $validator->isStringSansEspace(
                            Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Code Postal'), $numAdr),
                            $post['adrCompl_CP'.$matches[$i]],
                            0,
                            10
                        );
                    }
                    if (isset($post['adrCompl_VILLE'.$matches[$i]])) {
                        $validator->isStringAvecEspace(
                            Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Ville'), $numAdr),
                            $post['adrCompl_VILLE'.$matches[$i]],
                            0,
                            35
                        );
                    }
                    if (isset($post['adrCompl_TELEPHONE'.$matches[$i]])) {
                        $validator->isStringAvecEspace(
                            Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Téléphone'), $numAdr),
                            $post['adrCompl_TELEPHONE'.$matches[$i]],
                            0,
                            16
                        );
                    }
                    $validator->isStringAvecEspace(
                        Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Télex'), $numAdr),
                        $post['adrCompl_TELEX'.$matches[$i]],
                        0,
                        16
                    );
                    $validator->isStringAvecEspace(
                        Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Fax'), $numAdr),
                        $post['adrCompl_FAX'.$matches[$i]],
                        0,
                        16
                    );
                    $validator->adresseMail(
                        Trad::strBuild($label_adrcompl . $trad->colon() . $trad->t('Email'), $numAdr),
                        $post['adrCompl_EMAIL'.$matches[$i]],
                        0,
                        100,
                        true
                    );
                }
            
                if ($post['adrCompl_ADR_COMMANDE'.$matches[$i]]) {
                    $adresseCdePresent = true;
                }
            
                $adresseCompl[$compteur]=[
                    'COD_ADR' => $numAdr,
                    'ETAT' => $post['adrCompl_etat'.$matches[$i]],
                    'ADRFOUR' => $post['adrCompl_ADRFOUR'.$matches[$i]],
                    'RAISOC' => $post['adrCompl_RAISOC'.$matches[$i]],
                    'CP' => $post['adrCompl_CP'.$matches[$i]],
                    'VILLE' => $post['adrCompl_VILLE'.$matches[$i]],
                    'CODPAYS' => $post['adrCompl_CODPAYS'.$matches[$i]],
                    'TELEPHONE' => $post['adrCompl_TELEPHONE'.$matches[$i]],
                    'TELEX' => $post['adrCompl_TELEX'.$matches[$i]],
                    'FAX' => $post['adrCompl_FAX'.$matches[$i]],
                    'EMAIL' => $post['adrCompl_EMAIL'.$matches[$i]],
                    'ADR_COMMANDE' => $post['adrCompl_ADR_COMMANDE'.$matches[$i]],
                ];
            }
        }
        
        if (!($post['ADR_COMMANDE'] ?? '') && !$adresseCdePresent) {
            $validator->setError($trad->t('Vous devez avoir au moins 1 adresse de commande.'));
        }
        
        $session->setSession('adresseCompl', $adresseCompl);
        /* Contact */

        $matches  = (array)str_replace("nom_contact", "", preg_grep('/^nom_contact/', array_keys($post)));
        
        // Case : bug fix creation simplifier
        if (empty($matches)) {
            $matches = $post['listContactId'] ?? [];
        }
        $position = array_keys($matches);
        
        $contact=[];
        
        $contact_oxaLink = true;
        if ($post['GEREPORTAIL'] ?? false) {
            $contact_oxaLink = false;
        }

        $gestFourniss = new GestFourniss($this->pdo);

        if ($ficheFourniss->Fournisseur->ListContacts) {
            if ($Droit->droitModifBloqueXML($ficheFourniss->Fournisseur->ListContacts->attributes()->Modifiable, '')) {
                for ($compteur=0; $compteur<count($matches); $compteur++) {
                    $i = $position[$compteur];
                    
                    if ($post['nom_contact'.$matches[$i]] || (isset($post['fonction_contact'.$matches[$i]]) && $post['fonction_contact'.$matches[$i]]) || (isset($post['fixe_contact'.$matches[$i]]) && $post['fixe_contact'.$matches[$i]]) || (isset($post['portable_contact'.$matches[$i]]) && $post['portable_contact'.$matches[$i]]) || $post['email_contact'.$matches[$i]]
                    ||
                    ((isset($tmpListeChampsType['CONTFOUR.NOM']) && $tmpListeChampsType['CONTFOUR.NOM']['ALPHA2'] == 'O') || (isset($tmpListeChampsType['CONTFOUR.FONCTION']) && $tmpListeChampsType['CONTFOUR.FONCTION']['ALPHA2'] == 'O') || (isset($tmpListeChampsType['CONTFOUR.TEL']) && $tmpListeChampsType['CONTFOUR.TEL']['ALPHA2'] == 'O')
                    || (isset($tmpListeChampsType['CONTFOUR.TELPORT']) && $tmpListeChampsType['CONTFOUR.TELPORT']['ALPHA2'] == 'O') || (isset($tmpListeChampsType['CONTFOUR.FAX']) && $tmpListeChampsType['CONTFOUR.FAX']['ALPHA2'] == 'O') || (isset($tmpListeChampsType['CONTFOUR.EMAIL']) && $tmpListeChampsType['CONTFOUR.EMAIL']['ALPHA2'] == 'O'))
                    ) {
                        if (($post['etat'.$matches[$i]]??'')!='S') {
                            $idCtc = $matches[$i];

                            $labelContact = Trad::strBuild($trad->t('Contact @1@'), ($idCtc==''? '0':$idCtc)) . $trad->colon();
                            $validator->isStringAvecEspace(
                                $labelContact . $trad->t('Nom'),
                                $post['nom_contact'.$matches[$i]],
                                ($tmpListeChampsType['CONTFOUR.NOM']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
                                45
                            );
                            if (isset($post['fonction_contact'.$matches[$i]])) {
                                $validator->isStringAvecEspace(
                                    $labelContact . $trad->t('Fonction'),
                                    $post['fonction_contact'.$matches[$i]],
                                    ($tmpListeChampsType['CONTFOUR.FONCTION']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
                                    45
                                );
                            }
                            if (isset($post['fixe_contact'.$matches[$i]])) {
                                $validator->isStringAvecEspace(
                                    $labelContact . $trad->t('Téléphone'),
                                    $post['fixe_contact'.$matches[$i]],
                                    ($tmpListeChampsType['CONTFOUR.TEL']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
                                    45
                                );
                            }
                            if (isset($post['portable_contact'.$matches[$i]])) {
                                $validator->isStringAvecEspace(
                                    $labelContact . $trad->t('Portable'),
                                    $post['portable_contact'.$matches[$i]],
                                    ($tmpListeChampsType['CONTFOUR.TELPORT']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
                                    45
                                );
                            }
                            if (isset($post['fax_contact'.$matches[$i]])) {
                                $validator->isStringAvecEspace(
                                    $labelContact . $trad->t('Fax'),
                                    $post['fax_contact'.$matches[$i]],
                                    ($tmpListeChampsType['CONTFOUR.FAX']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
                                    45
                                );
                            }
                            if (isset($post['email_contact'.$matches[$i]])) {
                                $validator->adresseMail(
                                    $labelContact . $trad->t('Email'),
                                    $post['email_contact'.$matches[$i]],
                                    ($tmpListeChampsType['CONTFOUR.EMAIL']['ALPHA2'] ?? null) == 'O' ? 1 : 0,
                                    100,
                                    true
                                );
                            }

                            if ($post['GEREPORTAIL']
                                && (
                                    $post['OXALINK_ID'.$matches[$i]] != ''
                                    || $post['CTC_OXALINK'.$matches[$i]]
                                )
                            ) {
                                $contact_oxaLink = true;
                            
                                if (!$post['email_contact'.$matches[$i]]) {
                                    $validator->setError($trad->t('L\'adresse mail est obligatoire pour un contact lié OXA.LINK.'));
                                }
                                $erreurEmail = 0;

                                if ($session->getMode()=='Modification') {
                                    if (!$idCtc) {
                                        $idCtc = '0';
                                    }
                                    //$idCtc_TMP = $idCtc;
                                    $frsCTC = (string)$ficheFourniss->Fournisseur->CODE;
                                    
                                    if ($gestFourniss->compteOxalink($post['email_contact'.$matches[$i]], $frsCTC, $idCtc) && !$session->getSession('OXALINK')) {
                                        $validator->setError($trad->t('L\'adresse mail existe déjà pour un contact lié OXA.LINK de ce fournisseur.'));
                                        $erreurEmail = 1;
                                    }
                                }
                                foreach ($contact as $ctc) {
                                    if ($post['email_contact'.$matches[$i]] == $ctc['EMAIL'] && $ctc['CTC_OXALINK'] && !$erreurEmail) {
                                        $validator->setError($trad->t('L\'adresse mail existe déjà pour un contact lié OXA.LINK de ce fournisseur.'));
                                    }
                                }
                            }
                        }

                        $contact[$compteur]=[
                            'ETAT'          => $post['etat'.$matches[$i]] ?? '',
                            'IND_FOU'       => $matches[$i],
                            'NOM'           => $post['nom_contact'.$matches[$i]] ?? '',
                            'FONCTION'      => $post['fonction_contact'.$matches[$i]] ?? '',
                            'TEL'           => $post['fixe_contact'.$matches[$i]] ?? '',
                            'FAX'           => $post['fax_contact'.$matches[$i]] ?? '',
                            'VIBOXAP'       => $post['e-proc'.$matches[$i]] ?? '',
                            /** @phpstan-ignore-next-line */
                            'TELPORT'       => $post['portable_contact'.$matches[$i]] ?? '',
                            /** @phpstan-ignore-next-line */
                            'EMAIL'         => $post['email_contact'.$matches[$i]] ?? '',
                            /** @phpstan-ignore-next-line */
                            'OXALINK_ID'    => $post['OXALINK_ID'.$matches[$i]] ?? '',
                            /** @phpstan-ignore-next-line */
                            'CTC_OXALINK'   => $post['CTC_OXALINK'.$matches[$i]] ?? '',
                            /** @phpstan-ignore-next-line */
                            'CTC_CONSULT'   => Sql::toBool($post['CTC_CONSULT'.$matches[$i]]??'')
                        ];
                    }
                }
            } else {
                $contact_oxaLink = true;
                for ($i=0; $i<count($ficheFourniss->Fournisseur->ListContacts->Contact); $i++) {
                    $contact_XML= $ficheFourniss->Fournisseur->ListContacts->Contact[$i];
                
                    $contact[$i]=[
                    'ETAT' => strval($contact_XML->attributes()->ETAT),
                    'IND_FOU' => strval($contact_XML->IND_FOU),
                    'NOM' => strval($contact_XML->NOM),
                    'FONCTION' => strval($contact_XML->FONCTION),
                    'TEL' => strval($contact_XML->TEL),
                    'FAX' => strval($contact_XML->FAX),
                    'VIBOXAP' => strval($contact_XML->VIBOXAP),
                    'TELPORT' => strval($contact_XML->TELPORT),
                    'EMAIL' => strval($contact_XML->EMAIL),
                    'OXALINK_ID' => strval($contact_XML->OXALINK_ID),
                    'CTC_OXALINK' => strval($contact_XML->OXALINK_ID)? 1:0,
                    'CTC_CONSULT'   => strval($contact_XML->CTC_CONSULT)
                    ];
                }
            }
        }
        $validator->isFalse($contact_oxaLink, $trad->t('Au moins un contact doit être coché utilisateur OXA.LINK'));

        $session->setSession('contact', $contact);

        $chiffreAffaire = [];
        
        if ($ficheFourniss->Fournisseur->ListChiffreAffaire) {
            if ($Droit->droitModifBloqueXML($ficheFourniss->Fournisseur->ListChiffreAffaire->attributes()->Modifiable, '')) {
                $i = 1;
                foreach ($post as $k => $v) {
                    if (strpos($k, 'ANNEE_CA') !== false) {
                        $position = str_replace('ANNEE_CA', '', $k);

                        if ($post['ca_etat'.$position]!='S') {
                            $validator->isFloat($trad->t('Détails : Chiffre d\'affaire').' '.$i, $post['CHIFF_AFF'.$position], Constante::formatMontant);
                            $validator->zoom('Devise', $post['DEVISE_CA'.$position], $trad->t('Détails : Devise CA').' '.$i, $this->pdo, true);
                            $validator->isFalse($post['ANNEE_CA'.$position], Trad::strBuild($trad->t('Détails : Le champ Année doit être renseigné pour le chiffre d\'affaires @1@'), $i));
                        }
                        
                        $chiffreAffaire[$i]=[
                            'ANNEE' => $post['ANNEE_CA'.$position],
                            'CHIFF_AFF' => str_replace(' ', '', $post['CHIFF_AFF'.$position]),
                            'DEVISE_CA' => $post['DEVISE_CA'.$position],
                            'ETAT' => $post['ca_etat'.$position],
                        ];

                        $i++;
                    }
                }
            }
        }
            
        $session->setSession('chiffreAffaire', $chiffreAffaire);
        /* Règlement */
        
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->RS_REGL, $post['RS_REGL']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->ADR_REGL, $post['ADR_REGL']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->CPREGL, $post['CPREGL']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->VILREGL, $post['VILREGL']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->PAYSREGL, $post['PAYSREGL']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->RESP_FAC, $post['RESP_FAC']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->DOM_BK, $post['DOM_BK']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->CODE_BK, $post['CODE_BK']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->CODE_GUIC, $post['CODE_GUIC']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->NO_CPTE, $post['NO_CPTE']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->CLE_RIB, $post['CLE_RIB']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->IBANPAYS, $post['IBANPAYS']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->IBANCLE, $post['IBANCLE']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->IBANCPT, $post['IBANCPT']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Reglement->CODEBIC, $post['CODEBIC']);
        
        $labelCategory = $trad->t('Règlement') . $trad->colon();
        $validator->isStringAvecEspace(
            $labelCategory . $trad->t('RS règlement'),
            $post['RS_REGL'],
            (isset($tmpListeChampsType['Reglement.RS_REGL']) && $tmpListeChampsType['Reglement.RS_REGL']['ALPHA2'] == 'O')? 1:0,
            45
        );
        $validator->isStringAvecEspace(
            $labelCategory . $trad->t('Adresse règlement'),
            $post['ADR_REGL'],
            (isset($tmpListeChampsType['Reglement.ADR_REGL']) && $tmpListeChampsType['Reglement.ADR_REGL']['ALPHA2'] == 'O')? 1:0,
            90
        );
        if (isset($post['CPREGL']) && $post['CPREGL'] != '' && (isset($tmpListeChampsType['Reglement.CPREGL']) && $tmpListeChampsType['Reglement.CPREGL']['ALPHA1'] == 'O')) {
            $validator->isCodePostal(
                $labelCategory . $trad->t('Code postal règlement'),
                $post['CPREGL'],
                ($post['PAYSREGL']) ? $post['PAYSREGL'] : 'FR'
            );
        }
        $validator->isStringAvecEspace(
            $labelCategory . $trad->t('Code postal règlement'),
            $post['VILREGL'],
            (isset($tmpListeChampsType['Reglement.VILREGL']) && $tmpListeChampsType['Reglement.VILREGL']['ALPHA2'] == 'O')? 1:0,
            35
        );
        $validator->zoom(
            'HASTUTIL',
            $post['RESP_FAC'],
            $labelCategory . $trad->t('Resp. Traitement facture'),
            $this->pdo,
            (isset($tmpListeChampsType['Reglement.RESP_FAC']) && $tmpListeChampsType['Reglement.RESP_FAC']['ALPHA2'] == 'O')? false:true,
        );
        $validator->isStringAvecEspace(
            $labelCategory . $trad->t('Domiciliation bancaire'),
            $post['DOM_BK'],
            (isset($tmpListeChampsType['Reglement.DOM_BK']) && $tmpListeChampsType['Reglement.DOM_BK']['ALPHA2'] == 'O')? 1:0,
            26
        );
        $validator->isStringAvecEspace(
            $labelCategory . $trad->t('Banque'),
            $post['CODE_BK'],
            (isset($tmpListeChampsType['Reglement.CODE_BK']) && $tmpListeChampsType['Reglement.CODE_BK']['ALPHA2'] == 'O')? 1:0,
            5
        );
        $validator->isStringAvecEspace(
            $labelCategory . $trad->t('Guichet'),
            $post['CODE_GUIC'],
            (isset($tmpListeChampsType['Reglement.CODE_GUIC']) && $tmpListeChampsType['Reglement.CODE_GUIC']['ALPHA2'] == 'O')? 1:0,
            5
        );
        $validator->isStringSansEspace(
            $labelCategory . $trad->t('N° Compte'),
            $post['NO_CPTE'],
            (isset($tmpListeChampsType['Reglement.NO_CPTE']) && $tmpListeChampsType['Reglement.NO_CPTE']['ALPHA2'] == 'O')? 1:0,
            11
        );

        $validator->isStringSansEspace(
            $labelCategory . $trad->t('N° Compte'),
            $post['CLE_RIB'],
            (isset($tmpListeChampsType['Reglement.CLE_RIB']) && $tmpListeChampsType['Reglement.CLE_RIB']['ALPHA2'] == 'O')? 1:0,
            2
        );
        
        $validator->isInteger(
            $labelCategory . $trad->t('IBAN'),
            $post['IBANCLE'],
            (isset($tmpListeChampsType['Reglement.IBANCLE']) && $tmpListeChampsType['Reglement.IBANCLE']['ALPHA2'] == 'O')? 1:0,
            2
        );
        $validator->checkBic(
            $labelCategory . $trad->t('Code BIC'),
            $post['CODEBIC'],
            (isset($tmpListeChampsType['Reglement.CODEBIC']) && $tmpListeChampsType['Reglement.CODEBIC']['ALPHA2'] == 'O')? 1:0,
            11
        );
        $validator->checkRib(
            $labelCategory . $trad->t('Clé RIB'),
            $post['NO_CPTE'],
            $post['CODE_BK'],
            $post['CODE_GUIC'],
            $post['CLE_RIB']
        );
        
        if (isset($tmpListeChampsType['Reglement.IBANCPT'])
            && $tmpListeChampsType['Reglement.IBANCPT']['ALPHA2'] == 'O'
            && trim($post['IBANCPT'])==''
        ) {
            $validator->setError($labelCategory . $trad->t('l\'IBAN doit être renseigné'));
        }

        $post['IBANCPT'] = strtoupper(str_replace('-', '', strtoupper(str_replace(' ', '', strtoupper($post['IBANCPT'])))));
        if ($post['IBANCLE']!='' && $post['IBANCPT']!='') {
            $validator->checkIban($labelCategory . $trad->t('IBAN'), ($post['IBANPAYS'].$post['IBANCLE'].$post['IBANCPT']));
        }
        
        if ($post['CODEBIC'] && !ctype_upper(substr($post['CODEBIC'], 0, 6))) {
            $validator->setError($trad->t('Règlement - les 6 premiers caractères du CODE BIC doivent être en majuscules.'));
        }
        
        /* Conditions */
        if ($typeSession != 'Fournisseur' && (!isset($post['DEVISE']) || (isset($post['DEVISE']) && $post['DEVISE'] == ''))) {
            $post['DEVISE'] = $ficheFourniss->Fournisseur->Conditions->DEVISE;
        }
        
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->COND_PAIE, $post['COND_PAIE']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->MODE_PAIE, $post['MODE_PAIE']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->LIV, $post['LIV']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Eproc->AUTOCC, $post['AUTOCC']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Eproc->NOCCGEN, $post['NOCCGEN']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Eproc->SEUILEPDIF, $post['SEUILEPDIF']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Eproc->MTMAXCC, $post['MTMAXCC']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Eproc->MTMAXCCHCT, $post['MTMAXCCHCT']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Eproc->FOURPREF, $post['FOURPREF']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->RMINCPXN, $post['RMINCPXN']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->REMISE, $post['REMISE']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->DEVISE, $post['DEVISE']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->TYP_TVA, $post['TYP_TVA']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->MNTMINFAC, $post['MNTMINFAC']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->CA_MIN_ST, $post['CA_MIN_ST']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->CA_MAX_ST, $post['CA_MAX_ST']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Franco->RFRACT, $post['RFRACT']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Franco->ARTFRPORT, $post['ARTFRPORT']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Franco->MNTMINFRA, $post['MNTMINFRA']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->Franco->FRPOBLIG, $post['FRPOBLIG']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->DEFTYPDOC, $post['DEFTYPDOC']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->ZONE_LIB1, $post['ZONE_LIB1']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->ZONE_LIB2, $post['ZONE_LIB2']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Conditions->MOTCLE, $post['MOTCLE']);
        

        (isset($tmpListeChampsType['CONTFOUR.NOM']) && $tmpListeChampsType['CONTFOUR.NOM']['ALPHA2'] == 'O')?1:

        $labelCategory = $trad->t('Conditions') . $trad->colon();
        $validator->zoom("CondPaie", $post['COND_PAIE'], $labelCategory . $trad->t('Condition de paiement'), $this->pdo, (isset($tmpListeChampsType['Conditions.COND_PAIE']) && $tmpListeChampsType['Conditions.COND_PAIE']['ALPHA2'] == 'O')?false:true);
        $validator->zoom("Modepaie", $post['MODE_PAIE'], $labelCategory . $trad->t('Mode de paiement'), $this->pdo, (isset($tmpListeChampsType['Conditions.MODE_PAIE']) && $tmpListeChampsType['Conditions.MODE_PAIE']['ALPHA2'] == 'O')?false:true);
        $validator->zoom("Modelivr", $post['LIV'], $labelCategory . $trad->t('Mode de livraison'), $this->pdo, (isset($tmpListeChampsType['Conditions.LIV']) && $tmpListeChampsType['Conditions.LIV']['ALPHA2'] == 'O')?false:true);
        $validator->isFloat($labelCategory . $trad->t('Montant Max (catalogue)'), $post['MTMAXCC'], Constante::formatMontant, (isset($tmpListeChampsType['Conditions.MTMAXCC']) && $tmpListeChampsType['Conditions.MTMAXCC']['ALPHA2'] == 'O')?true:false);
        $validator->isFloat($labelCategory . $trad->t('Montant Max (Hors catalogue)'), $post['MTMAXCCHCT'], Constante::formatMontant, (isset($tmpListeChampsType['Conditions.MTMAXCCHCT']) && $tmpListeChampsType['Conditions.MTMAXCCHCT']['ALPHA2'] == 'O')?true:false);
        $validator->isFloat($labelCategory . $trad->t('Remise'), $post['REMISE'], Constante::formatMontant, (isset($tmpListeChampsType['Conditions.REMISE']) && $tmpListeChampsType['Conditions.REMISE']['ALPHA2'] == 'O')?true:false);
        $validator->zoom("Devise", $post['DEVISE'], $labelCategory . $trad->t('Devises'), $this->pdo, false);
        $validator->isFloat($trad->t("Conditions : Minimum de facturation"), $post['MNTMINFAC'], Constante::formatMontant, (isset($tmpListeChampsType['Conditions.MNTMINFAC']) && $tmpListeChampsType['Conditions.MNTMINFAC']['ALPHA2'] == 'O')?true:false);
        $validator->isFloat($trad->t("Conditions : CA Minimum Sous-traitant"), $post['CA_MIN_ST'], Constante::formatMontant, (isset($tmpListeChampsType['Conditions.CA_MIN_ST']) && $tmpListeChampsType['Conditions.CA_MIN_ST']['ALPHA2'] == 'O')?true:false);
        $validator->isFloat($trad->t("Conditions : CA Maximum Sous-traitant"), $post['CA_MAX_ST'], Constante::formatMontant, (isset($tmpListeChampsType['Conditions.CA_MAX_ST']) && $tmpListeChampsType['Conditions.CA_MAX_ST']['ALPHA2'] == 'O')?true:false);
        $validator->isFloat($trad->t("Conditions : Minimum de franco"), $post['MNTMINFRA'], Constante::formatMontant, (isset($tmpListeChampsType['Conditions.MNTMINFRA']) && $tmpListeChampsType['Conditions.MNTMINFRA']['ALPHA2'] == 'O')?true:false);
        $validator->zoom("typeDoc", $post['DEFTYPDOC'], $trad->t('Conditions : Type de document'), $this->pdo, (isset($tmpListeChampsType['Conditions.DEFTYPDOC']) && $tmpListeChampsType['Conditions.DEFTYPDOC']['ALPHA2'] == 'O')?false:true);
        $validator->isStringAvecEspace($trad->t("Conditions : Zone libre 1"), $post['ZONE_LIB1'], (isset($tmpListeChampsType['Conditions.ZONE_LIB1']) && $tmpListeChampsType['Conditions.ZONE_LIB1']['ALPHA2'] == 'O')?1:0, 30);
        $validator->isStringAvecEspace($trad->t("Conditions : Zone libre 2"), $post['ZONE_LIB2'], (isset($tmpListeChampsType['Conditions.ZONE_LIB2']) && $tmpListeChampsType['Conditions.ZONE_LIB2']['ALPHA2'] == 'O')?1:0, 30);
        $validator->isStringAvecEspace($trad->t("Détails : Zone libre 3"), $post['MOTCLE'], (isset($tmpListeChampsType['Details.MOTCLE']) && $tmpListeChampsType['Details.MOTCLE']['ALPHA2'] == 'O')?1:0, 30);
        
        if ($post['RFRACT']) {
            if ($post['FRPOBLIG']) {
                $article_obli = false;
            } else {
                $article_obli = true;
            }

            $validator->zoom("Articles", $post['ARTFRPORT'], $trad->t('Article frais de port'), $this->pdo, $article_obli, ['filter_ARTFRAISPORT' => 'T']);
        } else {
            $post['ARTFRPORT'] = '';
        }
    
        /* Détails */

        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->CODE_REGR, $post['CODE_REGR']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->DTE_AGREM, $post['DTE_AGREM'], true, true);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->FRANCTVA, $post['FRANCTVA']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->NOT_MANU, $post['NOT_MANU']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->NAUTOSFA, $post['NAUTOSFA']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->IND_QUALI, $post['IND_QUALI']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->RECEP_AUTO, $post['RECEP_AUTO']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->PER_REC_AUTO, $post['PER_REC_AUTO']);
        $Droit->modifFourniss($ficheFourniss->Fournisseur->Detail->CERTIF, $post['CERTIF']);
        $post['CLASSE'] = (string) $ficheFourniss->Fournisseur->Detail->CLASSE;

        


        $post['DTE_AGREM'] = DATE::dateConverte($post['DTE_AGREM']);
        
        $validator->isDate($post['DTE_AGREM'], '', '', (isset($tmpListeChampsType['Details.DTE_AGREM']) && $tmpListeChampsType['Details.DTE_AGREM']['ALPHA2'] == 'O')?false:true, $trad->t('Détails : Date d\'agrément'));
        $validator->isStringSansEspace($trad->t("Détails : Indice qualité"), $post['IND_QUALI'], (isset($tmpListeChampsType['Details.IND_QUALI']) && $tmpListeChampsType['Details.IND_QUALI']['ALPHA2'] == 'O')?1:0, 5);
        $validator->isStringAvecEspace($trad->t("Détails : Certification"), $post['CERTIF'], (isset($tmpListeChampsType['Details.CERTIF']) && $tmpListeChampsType['Details.CERTIF']['ALPHA2'] == 'O')?1:0, 20);
        $validator->zoom("Regroupement", $post['CODE_REGR'], $trad->t('Détails : Catégorie fournisseur'), $this->pdo, (isset($tmpListeChampsType['Details.CODE_REGR']) && $tmpListeChampsType['Details.CODE_REGR']['ALPHA2'] == 'O')?false:true);
        
        /* OXALINK */
        
        //$validator->isCheck($post['GEREPORTAIL']);
        /*if($post['GEREPORTAIL'])
        {
            $oxalinkOblig = 1;
        }
        else
        {
            $oxalinkOblig = 0;
        }*/

        /* EDI & ROUTAGE */
        if ($typeSession == 'FournisseurSimplie') {
            $ediRoutage = $post;
        } else {
            $ediRoutage = $session->getSession('EdiRoutage');
        }
        
        if ($ediRoutage!='' && (string)$ficheFourniss->Fournisseur->ImpressionCde->attributes()->Modifiable==1) {
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->BDC_ELEC, $ediRoutage['BDC_ELEC']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->ROUTAGECDE, $ediRoutage['ROUTAGECDE']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->TYPE_FORM, $ediRoutage['TYPE_FORM']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->FORMAT, $ediRoutage['FORMAT']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->MODE_ENV, $ediRoutage['MODE_ENV']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->MAIL_DEST, $ediRoutage['MAIL_DEST']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->ADR_FTP, $ediRoutage['ADR_FTP']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->USER_FTP, $ediRoutage['USER_FTP']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->PWD_FTP, $ediRoutage['PWD_FTP']);
            $Droit->modifSansDroitXml($ficheFourniss->Fournisseur->ImpressionCde->PATH_DEP, $ediRoutage['PATH_DEP']);

            $validator->ischeck($ediRoutage['BDC_ELEC']);
            
            if ($ediRoutage['BDC_ELEC']) {
                $validator->zoom("BceFexp", $ediRoutage['FORMAT'], $trad->t("Edi&Routage : Format"), $this->pdo, (isset($tmpListeChampsType['ParamEDI.FORMAT']) && $tmpListeChampsType['ParamEDI.FORMAT']['ALPHA2'] == 'O')?false:true);
                $validator->isInteger($trad->t("Edi&Routage : Type de Format"), $ediRoutage['TYPE_FORM']);
                
                if ($ediRoutage['MODE_ENV'] == '1') {
                    $validator->adresseMail($trad->t("Edi&Routage : Email destinataire"), $ediRoutage['MAIL_DEST'], (isset($tmpListeChampsType['ParamEDI.MAIL_DEST']) && $tmpListeChampsType['ParamEDI.MAIL_DEST']['ALPHA2'] == 'O')?1:0, 100, true);
                }

                if ($ediRoutage['MODE_ENV'] == '2') {
                    $validator->isStringSansEspace($trad->t("Edi&Routage : Adresse site FTP"), $ediRoutage['ADR_FTP'], (isset($tmpListeChampsType['ParamEDI.ADR_FTP']) && $tmpListeChampsType['ParamEDI.ADR_FTP']['ALPHA2'] == 'O')?1:0, 255);
                    $validator->isStringSansEspace($trad->t("Edi&Routage : Utilisateur FTP"), $ediRoutage['USER_FTP'], (isset($tmpListeChampsType['ParamEDI.USER_FTP']) && $tmpListeChampsType['ParamEDI.USER_FTP']['ALPHA2'] == 'O')?1:0, 30);
                    $validator->isStringSansEspace($trad->t("Edi&Routage : Mot de passe FTP"), $ediRoutage['PWD_FTP'], (isset($tmpListeChampsType['ParamEDI.PWD_FTP']) && $tmpListeChampsType['ParamEDI.PWD_FTP']['ALPHA2'] == 'O')?1:0, 30);
                    $validator->isStringSansEspace($trad->t("Edi&Routage : Chemin de dépose"), $ediRoutage['PATH_DEP'], (isset($tmpListeChampsType['ParamEDI.PATH_DEP']) && $tmpListeChampsType['ParamEDI.PATH_DEP']['ALPHA2'] == 'O')?1:0, 255);
                }
            }
            $ediRoutage=[
                'BDC_ELEC' =>   $ediRoutage['BDC_ELEC'],
                'ROUTAGECDE' => $ediRoutage['ROUTAGECDE'],
                'TYPE_FORM' =>  $ediRoutage['TYPE_FORM'],
                'FORMAT' =>     $ediRoutage['FORMAT'],
                'MODE_ENV' =>   $ediRoutage['MODE_ENV'],
                'MAIL_DEST' =>  $ediRoutage['MAIL_DEST'],
                'ADR_FTP' =>    $ediRoutage['ADR_FTP'],
                'USER_FTP' =>   $ediRoutage['USER_FTP'],
                'PWD_FTP' =>    $ediRoutage['PWD_FTP'],
                'PATH_DEP' =>   $ediRoutage['PATH_DEP'],
            ];
            $session->setSession('EdiRoutage', $ediRoutage);
        } else {
            $ediRoutage=[
                'BDC_ELEC' =>   strval($ficheFourniss->Fournisseur->ImpressionCde->BDC_ELEC),
                'ROUTAGECDE' => strval($ficheFourniss->Fournisseur->ImpressionCde->ROUTAGECDE),
                'TYPE_FORM' =>  strval($ficheFourniss->Fournisseur->ImpressionCde->TYPE_FORM),
                'FORMAT' =>     strval($ficheFourniss->Fournisseur->ImpressionCde->FORMAT),
                'MODE_ENV' =>   strval($ficheFourniss->Fournisseur->ImpressionCde->MODE_ENV),
                'MAIL_DEST' =>  strval($ficheFourniss->Fournisseur->ImpressionCde->MAIL_DEST),
                'ADR_FTP' =>    strval($ficheFourniss->Fournisseur->ImpressionCde->ADR_FTP),
                'USER_FTP' =>   strval($ficheFourniss->Fournisseur->ImpressionCde->USER_FTP),
                'PWD_FTP' =>    strval($ficheFourniss->Fournisseur->ImpressionCde->PWD_FTP),
                'PATH_DEP' =>   strval($ficheFourniss->Fournisseur->ImpressionCde->PATH_DEP),
            ];
            $session->setSession('EdiRoutage', $ediRoutage);
        }
        
        if ($session->getSessionArray('Bdd')) {
            foreach ($session->getSessionArray('Bdd') as $bdd) {
                $noPage = $bdd['NO_PAGE']<10 ? '0'.(int)$bdd['NO_PAGE']:$bdd['NO_PAGE'];
                $parm = sql::paramDicoAllCol($this->pdo, 'PARAMBDDFOU', $noPage);
                $obliBDD = 0;
                if ($parm) {
                    /** @phpstan-ignore-next-line */
                    $paramBDD = explode('|', $parm['LIBELLE']);
                    if ($paramBDD[3]=='B') {
                        $obliBDD = 1;
                    }
                } else {
                    $obliBDD = 1;
                }
                
                $validator->isStringAvecEspace(Trad::strBuild($trad->t('BDD - @1@ : @2@'), $bdd['NO_PAGE'], $bdd['TITRE']), $bdd['TEXTEBDD'], $obliBDD, 3000);
            }
        } else {
            $paramDico  = new ParamDico($this->pdo);
            $paramDico  = $paramDico->findAll(['TYPEDICO' => 'PARAMBDDFOU']);
            
            foreach ($paramDico as $parm) {
                $paramBDD = explode('|', $parm['LIBELLE']);

                if ($paramBDD[3]=='B') {
                    $validator->isStringAvecEspace(Trad::strBuild($trad->t('BDD - @1@ : @2@'), $parm['ID1'], $paramBDD[2]), '', 1, 3000);
                }
            }
        }

        //TODO ICI TOUJOURS REMETTRE UN FORMAT DATE AU FORMAT DE L UTILISATEUR
        ValidatorChampSupp::reformateDate($this->pdo, 'FOURNISS', '', null, null, $post, $_SESSION['DATE_FORMAT']);
        if ($typeSession == 'Fournisseur') {
            /* ******* */
            // On vérifie si la demande est en modification, ou si l'utilisateur modifie une demande de création refusé.
            if ($session->getMode()=='Modification' || ($session->getMode()=='Creation' && ($session->getSession('CODE') != '' && $session->getSession('CODE') != 'noId'))) {
                $validator->validatorCS('FOURNISS', '', $post, $this->pdo, '', '', '', true);
            } else {
                $validator->validatorCS('FOURNISS', '', $post, $this->pdo, '', '', '', true);
            }
        } else {
            foreach ($tmpCS as $key => $value) {
                if ($tmpCS[$key]['ALPHA1'] == 'O') {
                    $validator->validatorCS('FOURNISS', '', $post, $this->pdo, '', 0, '', true, $tmpCS[$key]['ALPHA2']=='O'?true:null, '', $key);
                }
            }
        }
        $session->setSession($typeSession, $post);
        
        if ($validator->isValid()) {
            $linkFrsSte = Roles::droit($this->pdo, 'LIEN_FOU_STE_ACTIF', 'PARAMFOU');
            if (!$modeSimplifie
                && $linkFrsSte
                && empty($postOrigin['byPassSociete'])
                && $session->getMode()=='Creation'
            ) {
                $fourniss = new Fourniss($this->pdo);
                $frs = $fourniss->find(['NO_SIRET' => $post['NO_SIRET']]);

                if ($frs) {
                    $liensSocFrs = new LienFouGrpSte($this->pdo);
                    $liensSoc = $liensSocFrs->fetchAll([], ['filter_egal_TYPE_FG' => 'F', 'filter_egal_CODE_FOUGR' => $frs['CODE']]);

                    $arraySocFrs = [];
                    foreach ($liensSoc as $s) {
                        $arraySocFrs[] = $s['CODE_STE'];
                    }

                    /**
                     * Si on a trouvé un fournisseur avec le même SIRET, alors on regarde si
                     */
                    if ($liensSoc) {
                        $listeSteToAdd = [];

                        foreach ($session->getSessionArray('societe') as $societe) {
                            if (!in_array($societe['CODE_STE'], $arraySocFrs)) {
                                $listeSteToAdd[] = [
                                    'CODE_STE' => $societe['CODE_STE'],
                                    'LIBELLE' => $societe['libSte']
                                ];
                            }
                        }


                        if ($listeSteToAdd) {
                            return $this->renderer->render('@Fournisseur/CreationFournisseur/popupConfirmSociete', [
                                'fournisseur' => $frs['RS'].' ('.$frs['CODE'].') ',
                                'listeSteToAdd' => $listeSteToAdd,
                                'pathSociete' => $this->router->generateUri('Fournisseur.ValidationFournisseur.liaisonSociete', ['type'=> $typeSession]),
                                'pathValidation' => $this->router->generateUri('Fournisseur.ValidationFournisseur.validation', ['mode' => 'validation','type'=> $typeSession]),
                            ]);
                        }
                    }
                }
            }


            $xmlResult = new \Modules\Fournisseur\WebService\CreationFournisseur($this->pdo);

            $xmlResult = $xmlResult->ficheFournisseur($post, $contact, "FALSE", $typeSession);

        
            $reponse = new \SimpleXMLElement($xmlResult->responseData);
            if ($reponse->Statut == "O") {
                $codeFrs = strval($reponse->CODE);
                
                if (!$codeFrs) {
                    $codeFrs = 'noId';
                }
                
                if ($mode=='validation' && strval($reponse->CODE_DEMANDE)) {
                    if ($session->getSession('ModifSigner')) {
                        return $this->redirect('GlobalApplication.WorkflowSignature.signatureWF', ["type" => 'Fournisseur', 'codeDemande' => $reponse->CODE_DEMANDE, 'signataire' => $_SESSION['Session_Login'], 'mode' => 'MS']);
                    } else {
                        $_SESSION['Fournisseur']['CODE']= $reponse->CODE;
                        return $this->redirect('GlobalApplication.Workflow.validationWF', ["type" => 'FOURNISS', 'codeDemande' => $reponse->CODE_DEMANDE, 'codeEnreg' => $codeFrs]);
                    }
                } else {
                    $session->suppresionSession();

                    $infoDemande = (new WftDemEnt($this->pdo))->find((string) $reponse->CODE_DEMANDE);

                    if (strval($reponse->CODE_DEMANDE) && $infoDemande) {
                        $path = $this->router->generateUri('Fournisseur.Fournisseur.index', ["id" => $codeFrs, 'codeDemande' => $reponse->CODE_DEMANDE]);
                    } else {
                        $path = $this->router->generateUri('Fournisseur.Fournisseur.index', ["id" => $codeFrs]);
                    }
                        
                    return new Response(443, [
                        
                    ], (string) \json_encode([
                        'statut' => 'O',
                        'path' => $path,
                    ]));
                }
            } else {
                $path = $this->router->generateUri('Fournisseur.ValidationFournisseur.Confirmationvalidation', ['type' => $typeSession]);

                $Xml_erreur = str_replace('"', '\'', $xmlResult->responseData);
                $Xml_erreur= preg_replace("#\n|\t|\r#", "", $Xml_erreur);
                
                if ($Xml_erreur=='') {
                    return $this->renderer->render('@popup-erreur/ErreurXml', [
                        'ErreurValid' => ['MsgErreur' => $trad->t('Une erreur est survenue lors de l\'appel webService.')],
                    ]);
                }

                return $this->renderer->render('@popup-erreur/ErreurXml', [
                    'ErreurValid' => $reponse,
                    'pathValidation' => $path,
                ]);
            }
        } else {
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $validator->getError(),
            ]);
        }

        if ($session->getMode()=='Creation') {
            $path = $this->redirect('Fournisseur.CreationFournisseur.nouveauFournisseur');
        } else {
            $path = $this->redirect('Fournisseur.ModificationFournisseur.ModificationFournisseur', ["id" => $codeFournisseur]);
        }
        
        return new Response(443, [
            
        ], (string) \json_encode([
            'statut' => 'O',
            'path' => $path,
        ]));
    }

    public function liaisonSocieteAction() : string
    {
        $type = $this->request->getAttribute('type');

        if ($type) {
            $session = new Session($type);
        } else {
            $session = new Session('Fournisseur');
            $type = 'Fournisseur';
        }

        $post           = $session->getSession('Fournisseur');

        $fourniss = new Fourniss($this->pdo);
        $frs = $fourniss->find(['NO_SIRET' => $post['NO_SIRET']]);

        $liensSocFrs = new LienFouGrpSte($this->pdo);
        $liensSoc = $liensSocFrs->fetchAll([], ['filter_egal_TYPE_FG' => 'F', 'filter_egal_CODE_FOUGR' => $frs['CODE']]);

        $arraySocFrs = [];
        foreach ($liensSoc as $s) {
            $arraySocFrs[] = $s['CODE_STE'];
        }

        $lienFou = new LienFouGrpSte($this->pdo);

        foreach ($session->getSessionArray('societe') as $societe) {
            if (!in_array($societe['CODE_STE'], $arraySocFrs)) {
                $lienFou->insert([
                    'TYPE_FG' => 'F',
                    'CODE_FOUGR' => $frs['CODE'],
                    'CODE_STE' => $societe['CODE_STE'],
                ]);
            }
        }

        $session->suppresionSession();

        return $this->renderer->render('@popup-erreur/confirmationRedirection', [
            'message' => $this->getTranslationService()->t('Les sociétés ont bien été ajoutées.'),
            'pathURL' => $this->router->generateUri('Fournisseur.Fournisseur.index', ['id' => $frs['CODE']]),
        ]);
    }

    public function confirmationValidationAction()
    {
        $type = $this->request->getAttribute('type');

        if ($type) {
            $session = new Session($type);
        } else {
            $session = new Session('Fournisseur');
            $type = 'Fournisseur';
        }


        $post           = $session->getSession('Fournisseur');
        $contact        = $session->getSession('contact');
        $mode           = $session->getSession('modeValidation');
         
        $xmlResult = new \Modules\Fournisseur\WebService\CreationFournisseur($this->pdo);
        
         
        $xmlResult = $xmlResult->ficheFournisseur($post, $contact, "TRUE", $type);
        $reponse = new \SimpleXMLElement($xmlResult->responseData);
         
        if ($reponse->Statut == "O") {
            $codeFrs = strval($reponse->CODE);
             
            if (!$codeFrs) {
                $codeFrs = 'noId';
            }
             
            if ($mode=='validation' && strval($reponse->CODE_DEMANDE)) {
                //$session->suppresionSession();
                
                if ($session->getSession('ModifSigner')) {
                    return $this->redirect('GlobalApplication.WorkflowSignature.signatureWF', ["type" => 'Fournisseur', 'codeDemande' => $reponse->CODE_DEMANDE, 'signataire' => $_SESSION['Session_Login'], 'mode' => 'MS']);
                } else {
                    return $this->redirect('GlobalApplication.Workflow.validationWF', ["type" => 'FOURNISS', 'codeDemande' => $reponse->CODE_DEMANDE, 'codeEnreg' => $codeFrs]);
                }
            } else {
                $session->suppresionSession();

                $infoDemande = (new WftDemEnt($this->pdo))->find((string) $reponse->CODE_DEMANDE);
                 
                if (strval($reponse->CODE_DEMANDE) && $infoDemande) {
                    $path = $this->router->generateUri('Fournisseur.Fournisseur.index', ["id" => $codeFrs, 'codeDemande' => $reponse->CODE_DEMANDE]);
                } else {
                    $path = $this->router->generateUri('Fournisseur.Fournisseur.index', ["id" => $codeFrs]);
                }
                     
                return new Response(443, [
                     
                ], (string) \json_encode([
                    'statut' => 'O',
                    'path' => $path,
                ]));
            }
        } else {
            $Xml_erreur = str_replace('"', '\'', $xmlResult->responseData);
            $Xml_erreur= preg_replace("#\n|\t|\r#", "", $Xml_erreur);
             
            return $this->renderer->render('@popup-erreur/ErreurXml', [
                    'ErreurValid' => $reponse,
                ]);
        }
    }
}
