<?php

namespace Modules\Fournisseur\WebService;

use Helpers\Session\Session;
use Helpers\Parametres\Constante;
use Helpers\Outil\Sql;
use Entity\Model\Paravrac;
use Modules\Fournisseur\Repository\GestFourniss;
use Entity\Model\WftDemEnt;

class CreationFournisseur
{
    
    private $pdo;
    
    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    
    
    /**
     * mode (creation / modification)
     *      permet de voir si on créer un fournisseur, ou si on modifie un fournisseur déjà valider
     *
     * etatFournisseur (C / M)
     *      neccessaire pour l'appel WSDL
     *      C signifie une demande de création
     *      M signifie une demande de modification
     *
     * Les deux champs sont neccesaire car on peu modifie une demande de création
     *
     * ficheFournisseur
     *
     * @param  array<mixed> $array
     * @param  array<mixed> $contact
     * @param  string|int $confirmation
     * @param  string $type
     * @return \Helpers\Webservice\Wsdl
     */
    public function ficheFournisseur(
        $array,
        $contact,
        $confirmation = 'false',
        string $type = 'Fournisseur'
    ) {
        $spliter = constante::spliter;
        // @phpstan-ignore-next-line
        $session = new Session($type);
        
        $EdiRoutage = $session->getSession('EdiRoutage');
        $adressCompl = $session->getSession('adresseCompl');
        $chiffreAffaire = $session->getSession('chiffreAffaire');
        $file_save_frs = $session->getSession('file_save_frs');
        
        $zoneGeoAdresse = $session->getSessionArray('zoneGeoAdresse');

        $taxe1= isset($array['NO_SIRET'])? $array['NO_SIRET']:'';
        $taxe2= isset($array['TAXE2'])? $array['TAXE2']:'';
        $taxe3= isset($array['TAXE3'])? $array['TAXE3']:'';
        $taxe4= isset($array['TAXE4'])? $array['TAXE4']:'';

        if ($session->getMode()=='Creation' || $session->getSession('etatFournisseur')=='C') {
            $creation='TRUE';
        } else {
            $creation='FALSE';
        }
            
        $NomFicSource = $session->getSession('NOM_FIC_SOURCE');

        /*$array['RS'] = isset($array['RS'])?htmlspecialchars($array['RS']):'';
        $array['ENSCOMM'] = isset($array['ENSCOMM'])?htmlspecialchars($array['ENSCOMM']):'';
        $array['RS_REGL'] = isset($array['RS_REGL'])?htmlspecialchars($array['RS_REGL']):'';
        $array['ADR'] = isset($array['ADR'])?htmlspecialchars($array['ADR']):'';
        $array['ADR_REGL'] = isset($array['ADR_REGL'])?htmlspecialchars($array['ADR_REGL']):'';
        $array['MOTCLE'] = isset($array['MOTCLE'])?htmlspecialchars($array['MOTCLE']):'';*/
        
        foreach ($array as $key => $value) {
            if (!is_array($value)) {
                $array[$key] = htmlspecialchars($value);
            }
        }
        
        $codeDemande = $session->getSession('codeDemande') ?? '';

        $code = $array['CODE'];
        
        if ($session->getSession('refuser')) {
            $PARAVRAC = new Paravrac($this->pdo);
            $paramCode = $PARAVRAC->find(["TYPEPARV" => 'NUM_FO_PAR', "CODEPARV" => 'MODE']);
            
            $SaieiCode = str_replace(' ', '', $paramCode['LIB01PARV']);
            if ($SaieiCode == 'A') {
                $code = '';
            }
        }
        
        if ($codeDemande) {
            $wftDemEnt = new WftDemEnt($this->pdo);
            $demande = $wftDemEnt->find($codeDemande);
            
            if ($demande['STATUT_DEMANDE'] == '0') {
                $file_save_frs = '';
            }
        }
        
        $gestFournissRepo = new GestFourniss($this->pdo);

        $envoi =   '<MajFournisseurIn LangueUtilisation="'.$_SESSION['Session_Langue'].'">
                    <NOMFIC_FICHE_ORIGINE>'.$file_save_frs.'</NOMFIC_FICHE_ORIGINE>
                    <CodeDemande>'.$codeDemande.'</CodeDemande>
                    <CodeUtilisateur>'.$_SESSION['Session_Login'].'</CodeUtilisateur>
                    <ModeCreation>'.$creation.'</ModeCreation>
                    <Confirmation>'.$confirmation.'</Confirmation>
                    <OXALINK>false</OXALINK>
                    <Validation>true</Validation>
                    '.($NomFicSource? "<NOM_FIC_SOURCE>$NomFicSource</NOM_FIC_SOURCE>":"").'
                    <Fournisseur>
                        <CODE Format="A12" Modifiable="1" TypeNum="I">'.$code.'</CODE>
                        <PROSPECT Format="L">'.($array['PROSPECT']? 'true':'false').'</PROSPECT>
                        <DTEVALMIN Format="D" Modifiable="1">'.$array['DTEVALMIN'].'</DTEVALMIN>
                        <DTEVALMAX Format="D" Modifiable="1">'.$array['DTEVALMAX'].'</DTEVALMAX>
                        <Identity>
                            <RS Format="A45" Modifiable="1">'.$array['RS'].'</RS>
                            <ENSCOMM Format="A45" Modifiable="1">'.($array['ENSCOMM']??'').'</ENSCOMM>
                            <ADR Format="A90" Modifiable="1">'.$array['ADR'].'</ADR>
                            <CPOSTAL Format="A10" Modifiable="1">'.$array['CPOSTAL'].'</CPOSTAL>
                            <VILLE1 Format="A35" Modifiable="1">'.$array['VILLE1'].'</VILLE1>
                            <CODE_PAYS Format="A2" Modifiable="1">'.$array['CODE_PAYS'].'</CODE_PAYS>
                            <TEL Format="A16" Modifiable="1">'.($array['TEL']??'').'</TEL>
                            <TELEX Format="A16" Modifiable="1">'.($array['TELEX'] ?? '').'</TELEX>
                            <FAX Format="A16" Modifiable="1">'.($array['FAX'] ?? '').'</FAX>
                            <EMAIL Format="A100" Modifiable="1">'.($array['EMAIL'] ?? '').'</EMAIL>
                            <SITEWEB Format="A100" Modifiable="1">'.($array['SITEWEB'] ?? '').'</SITEWEB>
                            <COD_LNG Format="A3" Modifiable="1">'.($array['COD_LNG']?? '').'</COD_LNG>
                            <NO_SIRET Format="A30" Modifiable="1">'.$taxe1.'</NO_SIRET>
                            <TAXE2 Format="A30" Modifiable="1">'.$taxe2.'</TAXE2>
                            <TAXE3 Format="A30" Modifiable="1">'.$taxe3.'</TAXE3>
                            <TAXE4 Format="A30" Modifiable="1">'.$taxe4.'</TAXE4>
                            <NO_TVA_IC Format="A15" Modifiable="1">'.($array['NO_TVA_IC'] ?? '').'</NO_TVA_IC>
                            <NO_DUNS Format="A15" Modifiable="1">'.($array['NO_DUNS'] ?? '').'</NO_DUNS>
                            <ID_EXT Format="A30" Modifiable="1">'.($array['ID_EXT'] ?? '').'</ID_EXT>
                            <FOUPPAL Format="A12" Modifiable="1">'.($array['FOUPPAL']??'').'</FOUPPAL>
                            <ADR_COMMANDE Format="L" Modifiable="1">'.($array['ADR_COMMANDE']??'').'</ADR_COMMANDE>
                            <DISPO_MOBILITY Format="L" Modifiable="1">'.($array['DISPO_MOBILITY']??'').'</DISPO_MOBILITY>
                        </Identity>
                        <Reglement>
                            <RS_REGL Format="A45" Modifiable="1">'.($array['RS_REGL']??'').'</RS_REGL>
                            <ADR_REGL Format="A90" Modifiable="1">'.($array['ADR_REGL']??'').'</ADR_REGL>
                            <CPREGL Format="A10" Modifiable="1">'.($array['CPREGL'] ?? '').'</CPREGL>
                            <VILREGL Format="A35" Modifiable="1">'.($array['VILREGL'] ?? '').'</VILREGL>
                            <PAYSREGL Format="A2" Modifiable="1">'.($array['PAYSREGL'] ?? '').'</PAYSREGL>
                            <DOM_BK Format="A26" Modifiable="1" >'.($array['DOM_BK'] ?? '').'</DOM_BK>
                            <CODE_BK Format="AU5" Modifiable="1">'.($array['CODE_BK'] ?? '').'</CODE_BK>
                            <CODE_GUIC Format="AU5" Modifiable="1">'.($array['CODE_GUIC']?? '').'</CODE_GUIC>
                            <NO_CPTE Format="AU11" Modifiable="1">'.($array['NO_CPTE'] ?? '').'</NO_CPTE>
                            <CLE_RIB Format="AU2" Modifiable="1">'.($array['CLE_RIB'] ?? '').'</CLE_RIB>
                            <IBANPAYS Format="A2" Modifiable="1">'.($array['IBANPAYS'] ?? '').'</IBANPAYS>
                            <IBANCLE Format="N2" Modifiable="1">'.($array['IBANCLE'] ?? '').'</IBANCLE>
                            <IBANCPT Format="A30" Modifiable="1">'.($array['IBANCPT'] ?? '').'</IBANCPT>
                            <CODEBIC Format="AU11" Modifiable="1" >'.($array['CODEBIC'] ?? '').'</CODEBIC>
                            <RESP_FAC Format="A30" Modifiable="1">'.($array['RESP_FAC'] ?? '').'</RESP_FAC>
                        </Reglement>
                        <Conditions>
                            <COND_PAIE Format="A7" Modifiable="1">'.$array['COND_PAIE'].'</COND_PAIE>
                            <MODE_PAIE Format="A7" Modifiable="1">'.$array['MODE_PAIE'].'</MODE_PAIE>
                            <LIV Format="A7" Modifiable="1" >'.($array['LIV'] ?? '').'</LIV>
                            <DEVISE Format="AU3" Modifiable="1">'.$array['DEVISE'].'</DEVISE>
                            <TYP_TVA Format="A1" Modifiable="1" >'.($array['TYP_TVA'] ?? '').'</TYP_TVA>
                            <MNTMINFAC Format="N13.2" Modifiable="1">'.$array['MNTMINFAC'].'</MNTMINFAC>
                            <CA_MIN_ST Format="N13.2" Modifiable="1">'.$array['CA_MIN_ST'].'</CA_MIN_ST>
                            <CA_MAX_ST Format="N13.2" Modifiable="1">'.$array['CA_MAX_ST'].'</CA_MAX_ST>
                            <RMINCPXN Format="L" Modifiable="1">'.$array['RMINCPXN'].'</RMINCPXN>
                            <REMISE Format="N2.2" Modifiable="1">'.($array['REMISE'] ?? '').'</REMISE>
                            <ZONE_LIB1 Format="A26" Modifiable="1">'.($array['ZONE_LIB1'] ?? '').'</ZONE_LIB1>
                            <ZONE_LIB2 Format="A26" Modifiable="1">'.($array['ZONE_LIB2'] ?? '').'</ZONE_LIB2>
                            <MOTCLE Format="A20" Modifiable="1">'.($array['MOTCLE'] ?? '').'</MOTCLE>
                            <Eproc>
                                <FOURPREF Format="L" Modifiable="1">'.$array['FOURPREF'].'</FOURPREF>
                                <AUTOCC Format="L" Modifiable="1" >'.$array['AUTOCC'].'</AUTOCC>
                                <SEUILEPDIF Format="L" Modifiable="1" >'.$array['SEUILEPDIF'].'</SEUILEPDIF>
                                <MTMAXCC Format="N13.2" Modifiable="1" >'.$array['MTMAXCC'].'</MTMAXCC>
                                <MTMAXCCHCT Format="N13.2" Modifiable="1">'.$array['MTMAXCCHCT'].'</MTMAXCCHCT>
                                <NOCCGEN Format="L" Modifiable="1">'.$array['NOCCGEN'].'</NOCCGEN>
                            </Eproc>
                            <Franco>
                                <MNTMINFRA Format="N13.2" Modifiable="1">'.$array['MNTMINFRA'].'</MNTMINFRA>
                                <RFRACT Format="L" Modifiable="1">'.$array['RFRACT'].'</RFRACT>
                                <ARTFRPORT Format="A13" Modifiable="1">'.($array['ARTFRPORT'] ?? '').'</ARTFRPORT>
                                <FRPOBLIG Format="L" Modifiable="1">'.$array['FRPOBLIG'].'</FRPOBLIG>
                            </Franco>
                            <DEFTYPDOC Format="A7" Modifiable="1">'.($array['DEFTYPDOC'] ?? '').'</DEFTYPDOC>
                        </Conditions>
                        <Detail>
                            <CODE_REGR Format="A3" Modifiable="1">'.($array['CODE_REGR'] ?? '').'</CODE_REGR>
                            <DTE_AGREM Format="D" Modifiable="1">'.$array['DTE_AGREM'].'</DTE_AGREM>
                            <IND_QUALI Format="A5" Modifiable="1">'.($array['IND_QUALI'] ?? '').'</IND_QUALI>
                            <CERTIF Format="A20" Modifiable="1">'.($array['CERTIF'] ?? '').'</CERTIF>
                            <CLASSE Format="A1">'.($array['CLASSE']??'').'</CLASSE>
                            <FRANCTVA Format="L" Modifiable="1">'.$array['FRANCTVA'].'</FRANCTVA>
                            <NAUTOSFA Format="L" Modifiable="1">'.$array['NAUTOSFA'].'</NAUTOSFA>
                            <NOT_MANU Format="L" Modifiable="1">'.$array['NOT_MANU'].'</NOT_MANU>
                            <RECEP_AUTO Format="L" Modifiable="1">'.$array['RECEP_AUTO'].'</RECEP_AUTO>
                            <PER_REC_AUTO Format="A1" Modifiable="1">'.($array['PER_REC_AUTO'] ?? '').'</PER_REC_AUTO>
                        </Detail>
                        <ImpressionCde Modifiable="1">
                            <ROUTAGECDE Format="A1" >'.($EdiRoutage['ROUTAGECDE']??'').'</ROUTAGECDE>
                            <BDC_ELEC Format="L" >'.($EdiRoutage['BDC_ELEC']??'').'</BDC_ELEC>
                            <TYPE_FORM Format="A1" >'.($EdiRoutage['TYPE_FORM']??'').'</TYPE_FORM>
                            <FORMAT Format="N9">'.($EdiRoutage['FORMAT']??'').'</FORMAT>
                            <MODE_ENV Format="A1">'.($EdiRoutage['MODE_ENV']??'').'</MODE_ENV>
                            <MAIL_DEST Format="A100">'.($EdiRoutage['MAIL_DEST']??'').'</MAIL_DEST>
                            <ADR_FTP Format="A255">'.($EdiRoutage['ADR_FTP']??'').'</ADR_FTP>
                            <USER_FTP Format="A30">'.($EdiRoutage['USER_FTP']??'').'</USER_FTP>
                            <PWD_FTP Format="A30">'.($EdiRoutage['PWD_FTP']??'').'</PWD_FTP>
                            <PATH_DEP Format="A255">'.($EdiRoutage['PATH_DEP']??'').'</PATH_DEP>
                        </ImpressionCde>
                        <OXALINK>
                            <GEREPORTAIL Format="L">'.$array['GEREPORTAIL'].'</GEREPORTAIL>
                        </OXALINK>
                        <ListContacts Modifiable="1">';
                        
        for ($i=0; $i<count($contact); $i++) {
            $etat = $contact[$i]['ETAT'] ?? 'I'; // a la création d'un fournisseur $contact[$i]['ETAT'] n'éxiste pas !!

            if ($contact[$i]['OXALINK_ID'] && $contact[$i]['CTC_OXALINK']) {
                $idOxalinkUser = $contact[$i]['OXALINK_ID'];
            } elseif (!$contact[$i]['OXALINK_ID'] && $contact[$i]['CTC_OXALINK']) {
                $ctcOxalink = $gestFournissRepo->contactFrsExist($contact[$i]['EMAIL']);
                if ($ctcOxalink) {
                    $idOxalinkUser = $ctcOxalink['USER_ID'];
                    //$oxalinkUserEntity->update(['STATUT' => 'V'], $ctcOxalink['USER_ID']);
                } else {
                    $idOxalinkUser = Sql::guidGenerate();
                }
            } else {
                /*$ctcOxalink = $gestFournissRepo->contactFrsExist($contact[$i]['EMAIL']);
                                if($ctcOxalink)
                                {
                                    $oxalinkUserEntity->update(['STATUT' => 'F'], $ctcOxalink['USER_ID']);
                }*/
                $idOxalinkUser = '';
            }
            $contact[$i]['NOM']         = isset($contact[$i]['NOM'])?htmlspecialchars($contact[$i]['NOM']):'';
            $contact[$i]['FONCTION']    = isset($contact[$i]['FONCTION'])?htmlspecialchars($contact[$i]['FONCTION']):'';
            $envoi .= '<Contact Etat="'.$etat.'">
                                            <IND_FOU Format="N2">'.$contact[$i]['IND_FOU'].'</IND_FOU>
                                            <NOM Format="A25">'.$contact[$i]['NOM'].'</NOM>
                                            <FONCTION Format="A40" >'.$contact[$i]['FONCTION'].'</FONCTION>
                                            <TEL Format="A16">'.$contact[$i]['TEL'].'</TEL>
                                            <FAX Format="A16">'.$contact[$i]['FAX'].'</FAX>
                                            <TELPORT Format="A16" >'.$contact[$i]['TELPORT'].'</TELPORT>
                                            <EMAIL Format="A100">'.$contact[$i]['EMAIL'].'</EMAIL>
                                            <COD_ADR Format="A3"></COD_ADR>
                                            <VIBOXAP Format="L">'.($contact[$i]['VIBOXAP']? 'true':'false').'</VIBOXAP>
                                            <OXALINK_ID>'.$idOxalinkUser.'</OXALINK_ID>
                                            <CTC_CONSULT Format="L">'.($contact[$i]['CTC_CONSULT']? 'true':'false').'</CTC_CONSULT>
                                        </Contact>';
        }
        $envoi .='        </ListContacts>
                        <ListAdresses Modifiable="1">';
        if ($adressCompl) {
            for ($i=0; $i<count($adressCompl); $i++) {
                $etat = $adressCompl[$i]['ETAT'] ?? 'A';
                                    
                $adressCompl[$i]['RAISOC'] = isset($adressCompl[$i]['RAISOC'])?htmlspecialchars($adressCompl[$i]['RAISOC']):'';
                $adressCompl[$i]['ADRFOUR'] =  isset($adressCompl[$i]['RAISOC'])?htmlspecialchars($adressCompl[$i]['ADRFOUR']):'';
    
                $envoi .= '<Adresse Etat="'.$etat.'">
                                                    <COD_ADR Format="A12" Modifiable="1">'.$adressCompl[$i]['COD_ADR'].'</COD_ADR>
                                                    <RAISOC Format="A45" Modifiable="1">'.$adressCompl[$i]['RAISOC'].'</RAISOC>
                                                    <ADRFOUR Format="A90" Modifiable="1">'.$adressCompl[$i]['ADRFOUR'].'</ADRFOUR>
                                                    <CP Format="A10" Modifiable="1">'.$adressCompl[$i]['CP'].'</CP>
                                                    <VILLE Format="A35" Modifiable="1">'.$adressCompl[$i]['VILLE'].'</VILLE>
                                                    <CODPAYS Format="A2" Modifiable="1">'.$adressCompl[$i]['CODPAYS'].'</CODPAYS>
                                                    <TELEPHONE Format="A16" Modifiable="1">'.$adressCompl[$i]['TELEPHONE'].'</TELEPHONE>
                                                    <TELEX Format="A16" Modifiable="1">'.$adressCompl[$i]['TELEX'].'</TELEX>
                                                    <FAX Format="A16" Modifiable="1">'.$adressCompl[$i]['FAX'].'</FAX>
                                                    <EMAIL Format="A100" Modifiable="1">'.$adressCompl[$i]['EMAIL'].'</EMAIL>
                                                    <ADR_COMMANDE Format="L" Modifiable="1">'.$adressCompl[$i]['ADR_COMMANDE'].'</ADR_COMMANDE>
                                                    <ListZonesGeo Modifiable="1" NonVisible="0">';
                                    $listeGeoAdrTmp = $zoneGeoAdresse[$adressCompl[$i]['COD_ADR']]??[];
                foreach ($listeGeoAdrTmp as $zoneAdr) {
                    $envoi .= '  <ZoneGeo Etat="'.$zoneAdr['ETAT'].'">
                                                                            <DCOUP Format="A7" Objet="DCOUPGEO">'.$zoneAdr['DCOUP'].'</DCOUP>
                                                                            <ZONEGEO Format="A7" Objet="ZONEGEO">'.$zoneAdr['ZONEGEO'].'</ZONEGEO>
                                                                        </ZoneGeo>';
                }
                                        
                    $envoi .= ' </ListZonesGeo>
                                            </Adresse>';
            }
        }
        $envoi .='        </ListAdresses>
                        <ListBDD Modifiable="1">';
        foreach ($session->getSessionArray('Bdd') as $bdd) {
            $envoi .='<BDD Etat="'.$bdd['ETAT'].'">';
            $envoi .='<NO_PAGE Format="N2">'.($bdd['NO_PAGE']??'').'</NO_PAGE>';
            $envoi .='<NUMORDRE Format="N2">'.$bdd['NUMORDRE'].'</NUMORDRE>';
            $envoi .='<TITRE Format="A60" >'.$bdd['TITRE'].'</TITRE>';
            $envoi .='<TEXTEBDD Format="A3000" >'.$bdd['TEXTEBDD'].'</TEXTEBDD>';
            $envoi .='<VEPROC Format="L">'.$bdd['VEPROC'].'</VEPROC>';
            $envoi .='<ONGLET Format="A1" >'.$bdd['ONGLET'].'</ONGLET>';
            $envoi .='<LANGUE Format="A3">'.$bdd['LANGUE'].'</LANGUE>';
            $envoi .='<EXIST_PARAM Format="L"/>';
            $envoi .='<EXIST_SURGRP Format="L"/>';
            $envoi .='<LIEPARAM Format="L">'.$bdd['LIEPARAM'].'</LIEPARAM>';
            $envoi .='<HERITAGE Format="L">'.$bdd['HERITAGE'].'</HERITAGE>';
            $envoi .='</BDD>';
        }
        $envoi .='        </ListBDD>
                        <ListSsFamille Modifiable="1">';
        foreach ($session->getSessionArray('sousFamille') as $sousFamille) {
            $envoi .='<CODE_SFAM Etat="'.$sousFamille['ETAT'].'">'.$sousFamille['CODE_SFAM'].'</CODE_SFAM>';
        }
        $envoi .='        </ListSsFamille>
                        <ListTypeAchats Modifiable="1">';
        foreach ($session->getSessionArray('typeAchat') as $typeAchat) {
            $envoi .= '<TypeAchats Etat="'.$typeAchat['ETAT'].'">
                                            <TACFOTAC Objet="TAC">'.$typeAchat['TACFOTAC'].'</TACFOTAC>
                                            <TACFODEF>'.$typeAchat['DEFAUT'].'</TACFODEF>
                                        </TypeAchats>';
        }
        $envoi .='        </ListTypeAchats>
                        <ListMotsClef Modifiable="1">';
        foreach ($session->getSessionArray('motclef') as $motclef) {
            $motclef['MOTCLEF'] = isset($motclef['MOTCLEF'])?htmlspecialchars($motclef['MOTCLEF']):'';
            $envoi .='<MOTCLEF Etat="'.$motclef['ETAT'].'">'.$motclef['MOTCLEF'].'</MOTCLEF>';
        }
        $envoi .='        </ListMotsClef>
                        <ListZonesGeo Modifiable="1">';
        foreach ($session->getSessionArray('zoneGeo') as $zoneGeo) {
            $envoi .='
                                    <ZoneGeo Etat="'.$zoneGeo['ETAT'].'">
                                        <DCOUP Format="A7" >'.$zoneGeo['DCOUP'].'</DCOUP>
                                        <ZONEGEO Format="A7">'.$zoneGeo['ZONEGEO'].'</ZONEGEO>
                                      </ZoneGeo>
                                ';
        }
        $envoi .='        </ListZonesGeo>
                        <ListChampsSup Modifiable="1">';
                        $matches  = str_replace("CS_EXTENTION", "", preg_grep('/^CS_EXTENTION/', array_keys($array)));
        foreach ($matches as $key) {
            $completeKey = 'CS_EXTENTION'.$key;
            $explod = explode($spliter, $completeKey);
            $valeurCS = $array[$completeKey];
            $i = $explod[3];
            $envoi .='<ChpSup Etat="I">
                                            <NOCS>'.$i.'</NOCS>
                                            <VALEUR>'.$valeurCS.'</VALEUR>
                                        </ChpSup>';
        }
        $envoi .='        </ListChampsSup>
                        <ListChiffreAffaire Modifiable="1">';
        if (is_array($chiffreAffaire)) {
            foreach ($chiffreAffaire as $CA) {
                $envoi .='  <ChiffreAffaire Etat="'.$CA['ETAT'].'">
                                                <ANNEE>'.$CA['ANNEE'].'</ANNEE>
                                                <CHIFF_AFF>'.$CA['CHIFF_AFF'].'</CHIFF_AFF>
                                                <DEVISE_CA>'.$CA['DEVISE_CA'].'</DEVISE_CA>
                                                </ChiffreAffaire>';
            }
        }
        $envoi .='        </ListChiffreAffaire>
                        <ListSocietes Modifiable="1">';
        foreach ($session->getSessionArray('societe') as $societe) {
            $societe['CODE_STE'] = isset($societe['CODE_STE'])?htmlspecialchars($societe['CODE_STE']):'';
            $envoi .='<CODE_STE Etat="'.$societe['Etat'].'">'.$societe['CODE_STE'].'</CODE_STE>';
        }
        $envoi .='        </ListSocietes>
                    </Fournisseur>
                    </MajFournisseurIn>';
        
        return new \Helpers\Webservice\Wsdl('Oxaproc_fournisseur.wsdl', 'SRM_FOURNISS_ENREG', $envoi, false);
    }
    /**
     * @param array<mixed> $fourniss
     * @param array<mixed> $prevstate
     */
    public function updateFourniss(array $fourniss, array $prevstate) :\SimpleXMLElement
    {
        
        foreach ($fourniss as $key => $value) {
            if (!is_array($value)) {
                $fourniss[$key] = htmlspecialchars($value);
            }
        }



        $envoi =
            '<MajFournisseurIn LangueUtilisation="'.$_SESSION['Session_Langue'].'">
            <NOMFIC_FICHE_ORIGINE></NOMFIC_FICHE_ORIGINE>
            <CodeDemande></CodeDemande>
            <CodeUtilisateur>'.$_SESSION['Session_Login'].'</CodeUtilisateur>
            <ModeCreation>FALSE</ModeCreation>
            <Confirmation>TRUE</Confirmation>
            <OXALINK>false</OXALINK>
            <Validation>true</Validation>
            <Fournisseur>
                <CODE Format="A12" Modifiable="1" TypeNum="I">'.$fourniss['CODE'].'</CODE>
                <PROSPECT Format="L">'.($fourniss['PROSPECT']? 'true':'false').'</PROSPECT>
                <DTEVALMIN Format="D" Modifiable="1">'.$fourniss['DTEVALMIN'].'</DTEVALMIN>
                <DTEVALMAX Format="D" Modifiable="1">'.$fourniss['DTEVALMAX'].'</DTEVALMAX>
                <Identity>
                    <RS Format="A45" Modifiable="1">'.$fourniss['RS'].'</RS>
                    <ENSCOMM Format="A45" Modifiable="1">'.($fourniss['ENSCOMM']??'').'</ENSCOMM>
                    <ADR Format="A90" Modifiable="1">'.$fourniss['ADR'].'</ADR>
                    <CPOSTAL Format="A10" Modifiable="1">'.$fourniss['CPOSTAL'].'</CPOSTAL>
                    <VILLE1 Format="A35" Modifiable="1">'.$fourniss['VILLE1'].'</VILLE1>
                    <CODE_PAYS Format="A2" Modifiable="1">'.$fourniss['CODE_PAYS'].'</CODE_PAYS>
                    <TEL Format="A16" Modifiable="1">'.($fourniss['TEL']??'').'</TEL>
                    <TELEX Format="A16" Modifiable="1">'.($fourniss['TELEX'] ?? '').'</TELEX>
                    <FAX Format="A16" Modifiable="1">'.($fourniss['FAX'] ?? '').'</FAX>
                    <EMAIL Format="A100" Modifiable="1">'.($fourniss['EMAIL'] ?? '').'</EMAIL>
                    <SITEWEB Format="A100" Modifiable="1">'.($fourniss['SITEWEB'] ?? '').'</SITEWEB>
                    <COD_LNG Format="A3" Modifiable="1">'.($fourniss['COD_LNG']?? '').'</COD_LNG>
                    <NO_SIRET Format="A30" Modifiable="1">'.$fourniss['NO_SIRET'].'</NO_SIRET>
                    <TAXE2 Format="A30" Modifiable="1">'.$fourniss['TAXE2'].'</TAXE2>
                    <TAXE3 Format="A30" Modifiable="1">'.$fourniss['TAXE3'].'</TAXE3>
                    <TAXE4 Format="A30" Modifiable="1">'.$fourniss['TAXE4'].'</TAXE4>
                    <NO_TVA_IC Format="A15" Modifiable="1">'.($fourniss['NO_TVA_IC'] ?? '').'</NO_TVA_IC>
                    <NO_DUNS Format="A15" Modifiable="1">'.($fourniss['NO_DUNS'] ?? '').'</NO_DUNS>
                    <ID_EXT Format="A30" Modifiable="1">'.($fourniss['ID_EXT'] ?? '').'</ID_EXT>
                    <FOUPPAL Format="A12" Modifiable="1">'.($fourniss['FOUPPAL']??'').'</FOUPPAL>
                    <ADR_COMMANDE Format="L" Modifiable="1">'.($fourniss['ADR_COMMANDE']??'').'</ADR_COMMANDE>
                    <DISPO_MOBILITY Format="L" Modifiable="1">'.($fourniss['DISPO_MOBILITY']??'').'</DISPO_MOBILITY>
                </Identity>
                <Reglement>
                    <RS_REGL Format="A45" Modifiable="1">'.($fourniss['RS_REGL']??'').'</RS_REGL>
                    <ADR_REGL Format="A90" Modifiable="1">'.($fourniss['ADR_REGL']??'').'</ADR_REGL>
                    <CPREGL Format="A10" Modifiable="1">'.($fourniss['CPREGL'] ?? '').'</CPREGL>
                    <VILREGL Format="A35" Modifiable="1">'.($fourniss['VILREGL'] ?? '').'</VILREGL>
                    <PAYSREGL Format="A2" Modifiable="1">'.($fourniss['PAYSREGL'] ?? '').'</PAYSREGL>
                    <DOM_BK Format="A26" Modifiable="1" >'.($fourniss['DOM_BK'] ?? '').'</DOM_BK>
                    <CODE_BK Format="AU5" Modifiable="1">'.($fourniss['CODE_BK'] ?? '').'</CODE_BK>
                    <CODE_GUIC Format="AU5" Modifiable="1">'.($fourniss['CODE_GUIC']?? '').'</CODE_GUIC>
                    <NO_CPTE Format="AU11" Modifiable="1">'.($fourniss['NO_CPTE'] ?? '').'</NO_CPTE>
                    <CLE_RIB Format="AU2" Modifiable="1">'.($fourniss['CLE_RIB'] ?? '').'</CLE_RIB>
                    <IBANPAYS Format="A2" Modifiable="1">'.($fourniss['IBANPAYS'] ?? '').'</IBANPAYS>
                    <IBANCLE Format="N2" Modifiable="1">'.($fourniss['IBANCLE'] ?? '').'</IBANCLE>
                    <IBANCPT Format="A30" Modifiable="1">'.($fourniss['IBANCPT'] ?? '').'</IBANCPT>
                    <CODEBIC Format="AU11" Modifiable="1" >'.($fourniss['CODEBIC'] ?? '').'</CODEBIC>
                    <RESP_FAC Format="A30" Modifiable="1">'.($fourniss['RESP_FAC'] ?? '').'</RESP_FAC>
                </Reglement>
                <Conditions>
                    <COND_PAIE Format="A7" Modifiable="1">'.$fourniss['COND_PAIE'].'</COND_PAIE>
                    <MODE_PAIE Format="A7" Modifiable="1">'.$fourniss['MODE_PAIE'].'</MODE_PAIE>
                    <LIV Format="A7" Modifiable="1" >'.($fourniss['LIV'] ?? '').'</LIV>
                    <DEVISE Format="AU3" Modifiable="1">'.$fourniss['DEVISE'].'</DEVISE>
                    <TYP_TVA Format="A1" Modifiable="1" >'.($fourniss['TYP_TVA'] ?? '').'</TYP_TVA>
                    <MNTMINFAC Format="N13.2" Modifiable="1">'.$fourniss['MNTMINFAC'].'</MNTMINFAC>
                    <CA_MIN_ST Format="N13.2" Modifiable="1">'.$fourniss['CA_MIN_ST'].'</CA_MIN_ST>
                    <CA_MAX_ST Format="N13.2" Modifiable="1">'.$fourniss['CA_MAX_ST'].'</CA_MAX_ST>
                    <RMINCPXN Format="L" Modifiable="1">'.$fourniss['RMINCPXN'].'</RMINCPXN>
                    <REMISE Format="N2.2" Modifiable="1">'.($fourniss['REMISE'] ?? '').'</REMISE>
                    <ZONE_LIB1 Format="A26" Modifiable="1">'.($fourniss['ZONE_LIB1'] ?? '').'</ZONE_LIB1>
                    <ZONE_LIB2 Format="A26" Modifiable="1">'.($fourniss['ZONE_LIB2'] ?? '').'</ZONE_LIB2>
                    <MOTCLE Format="A20" Modifiable="1">'.($fourniss['MOTCLE'] ?? '').'</MOTCLE>
                    <Eproc>
                        <FOURPREF Format="L" Modifiable="1">'.$fourniss['FOURPREF'].'</FOURPREF>
                        <AUTOCC Format="L" Modifiable="1" >'.$fourniss['AUTOCC'].'</AUTOCC>
                        <SEUILEPDIF Format="L" Modifiable="1" >'.$fourniss['SEUILEPDIF'].'</SEUILEPDIF>
                        <MTMAXCC Format="N13.2" Modifiable="1" >'.$fourniss['MTMAXCC'].'</MTMAXCC>
                        <MTMAXCCHCT Format="N13.2" Modifiable="1">'.$fourniss['MTMAXCCHCT'].'</MTMAXCCHCT>
                        <NOCCGEN Format="L" Modifiable="1">'.$fourniss['NOCCGEN'].'</NOCCGEN>
                    </Eproc>
                    <Franco>
                        <MNTMINFRA Format="N13.2" Modifiable="1">'.$fourniss['MNTMINFRA'].'</MNTMINFRA>
                        <RFRACT Format="L" Modifiable="1">'.$fourniss['RFRACT'].'</RFRACT>
                        <ARTFRPORT Format="A13" Modifiable="1">'.($fourniss['ARTFRPORT'] ?? '').'</ARTFRPORT>
                        <FRPOBLIG Format="L" Modifiable="1">'.$fourniss['FRPOBLIG'].'</FRPOBLIG>
                    </Franco>
                    <DEFTYPDOC Format="A7" Modifiable="1">'.($fourniss['DEFTYPDOC'] ?? '').'</DEFTYPDOC>
                </Conditions>
                <Detail>
                    <CODE_REGR Format="A3" Modifiable="1">'.($fourniss['CODE_REGR'] ?? '').'</CODE_REGR>
                    <DTE_AGREM Format="D" Modifiable="1">'.$fourniss['DTE_AGREM'].'</DTE_AGREM>
                    <IND_QUALI Format="A5" Modifiable="1">'.($fourniss['IND_QUALI'] ?? '').'</IND_QUALI>
                    <CERTIF Format="A20" Modifiable="1">'.($fourniss['CERTIF'] ?? '').'</CERTIF>
                    <CLASSE Format="A1">'.($fourniss['CLASSE']??'').'</CLASSE>
                    <FRANCTVA Format="L" Modifiable="1">'.$fourniss['FRANCTVA'].'</FRANCTVA>
                    <NAUTOSFA Format="L" Modifiable="1">'.$fourniss['NAUTOSFA'].'</NAUTOSFA>
                    <NOT_MANU Format="L" Modifiable="1">'.$fourniss['NOT_MANU'].'</NOT_MANU>
                    <RECEP_AUTO Format="L" Modifiable="1">'.$fourniss['RECEP_AUTO'].'</RECEP_AUTO>
                    <PER_REC_AUTO Format="A1" Modifiable="1">'.($fourniss['PER_REC_AUTO'] ?? '').'</PER_REC_AUTO>
                </Detail>
                <ImpressionCde Modifiable="1">
                    <ROUTAGECDE Format="A1" >'.($fourniss['ROUTAGECDE']??'').'</ROUTAGECDE>
                    <BDC_ELEC Format="L" >'.($fourniss['BDC_ELEC']??'').'</BDC_ELEC>
                    <TYPE_FORM Format="A1" >'.($fourniss['TYPE_FORM']??'').'</TYPE_FORM>
                    <FORMAT Format="N9">'.($fourniss['FORMAT']??'').'</FORMAT>
                    <MODE_ENV Format="A1">'.($fourniss['MODE_ENV']??'').'</MODE_ENV>
                    <MAIL_DEST Format="A100">'.($fourniss['MAIL_DEST']??'').'</MAIL_DEST>
                    <ADR_FTP Format="A255">'.($fourniss['ADR_FTP']??'').'</ADR_FTP>
                    <USER_FTP Format="A30">'.($fourniss['USER_FTP']??'').'</USER_FTP>
                    <PWD_FTP Format="A30">'.($fourniss['PWD_FTP']??'').'</PWD_FTP>
                    <PATH_DEP Format="A255">'.($fourniss['PATH_DEP']??'').'</PATH_DEP>
                </ImpressionCde>
                <OXALINK>
                    <GEREPORTAIL Format="L">'.$fourniss['GEREPORTAIL'].'</GEREPORTAIL>
                </OXALINK>
                <ListContacts Modifiable="1">'
                . implode('', array_map(function ($contact) {

                    foreach ($contact as $key => $value) {
                        $contact[$key] = htmlspecialchars($value);
                    }
                    
                    return '<Contact Etat="'.$contact['ETAT'].'">
                            <IND_FOU Format="N2">'.$contact['IND_FOU'].'</IND_FOU>
                            <NOM Format="A25">'.$contact['NOM'].'</NOM>
                            <FONCTION Format="A40" >'.$contact['FONCTION'].'</FONCTION>
                            <TEL Format="A16">'.$contact['TEL'].'</TEL>
                            <FAX Format="A16">'.$contact['FAX'].'</FAX>
                            <TELPORT Format="A16" >'.$contact['TELPORT'].'</TELPORT>
                            <EMAIL Format="A100">'.$contact['EMAIL'].'</EMAIL>
                            <COD_ADR Format="A3"></COD_ADR>
                            <VIBOXAP Format="L">'.$contact['VIBOXAP'].'</VIBOXAP>
                            <OXALINK_ID>'.$contact['OXALINK_ID'].'</OXALINK_ID>
                            <CTC_CONSULT Format="L">'.intval($contact['CTC_CONSULT']).'</CTC_CONSULT>
                        </Contact>';
                }, $fourniss['ListContact']))
                . '</ListContacts>
                <ListAdresses Modifiable="1">'
                . implode('', array_map(function ($adr) {

                    foreach ($adr as $key => $value) {
                        if (! is_array($value)) {
                            $adr[$key] = htmlspecialchars($value);
                        }
                    }
                    
                    return
                        '<Adresse Etat="'.$adr['ETAT'].'">
                            <COD_ADR Format="A12" Modifiable="1">'.$adr['COD_ADR'].'</COD_ADR>
                            <RAISOC Format="A45" Modifiable="1">'.$adr['RAISOC'].'</RAISOC>
                            <ADRFOUR Format="A90" Modifiable="1">'.$adr['ADRFOUR'].'</ADRFOUR>
                            <CP Format="A10" Modifiable="1">'.$adr['CP'].'</CP>
                            <VILLE Format="A35" Modifiable="1">'.$adr['VILLE'].'</VILLE>
                            <CODPAYS Format="A2" Modifiable="1">'.$adr['CODPAYS'].'</CODPAYS>
                            <TELEPHONE Format="A16" Modifiable="1">'.$adr['TELEPHONE'].'</TELEPHONE>
                            <TELEX Format="A16" Modifiable="1">'.$adr['TELEX'].'</TELEX>
                            <FAX Format="A16" Modifiable="1">'.$adr['FAX'].'</FAX>
                            <EMAIL Format="A100" Modifiable="1">'.$adr['EMAIL'].'</EMAIL>
                            <ADR_COMMANDE Format="L" Modifiable="1">'.$adr['ADR_COMMANDE'].'</ADR_COMMANDE>
                            <ListZonesGeo Modifiable="1" NonVisible="0">'
                            . implode('', array_map(function ($zoneAdr) {
                                return
                                    '<ZoneGeo Etat="'.$zoneAdr['ETAT'].'">
                                        <DCOUP Format="A7" Objet="DCOUPGEO">'.$zoneAdr['DCOUP'].'</DCOUP>
                                        <ZONEGEO Format="A7" Objet="ZONEGEO">'.$zoneAdr['ZONEGEO'].'</ZONEGEO>
                                    </ZoneGeo>';
                            }, $adr['ListZonesGeo']))
                            . ' </ListZonesGeo>
                        </Adresse>';
                }, $fourniss['ListAdresse']))
                . '</ListAdresses>
                <ListBDD Modifiable="1">'
                . implode('', array_map(function ($bdd) {
                    foreach ($bdd as $key => $value) {
                        $bdd[$key] = htmlspecialchars($value);
                    }
                    return '<BDD Etat="'.$bdd['ETAT'].'">
                        <NO_PAGE Format="N2">'.($bdd['NO_PAGE']??'').'</NO_PAGE>
                        <NUMORDRE Format="N2">'.$bdd['NUMORDRE'].'</NUMORDRE>
                        <TITRE Format="A60" >'.$bdd['TITRE'].'</TITRE>
                        <TEXTEBDD Format="A3000" >'.$bdd['TEXTEBDD'].'</TEXTEBDD>
                        <VEPROC Format="L">'.$bdd['VEPROC'].'</VEPROC>
                        <ONGLET Format="A1" >'.$bdd['ONGLET'].'</ONGLET>
                        <LANGUE Format="A3">'.$bdd['LANGUE'].'</LANGUE>
                        <EXIST_PARAM Format="L"/>
                        <EXIST_SURGRP Format="L"/>
                        <LIEPARAM Format="L">'.$bdd['LIEPARAM'].'</LIEPARAM>
                        <HERITAGE Format="L">'.$bdd['HERITAGE'].'</HERITAGE>
                    </BDD>';
                }, $fourniss['ListBDD']))
                . '</ListBDD>
                <ListSsFamille Modifiable="1">'
                . implode('', array_map(function ($sfam) {
                    foreach ($sfam as $key => $value) {
                        $sfam[$key] = htmlspecialchars($value);
                    }
                    return '<CODE_SFAM Etat="'.$sfam['ETAT'].'">'
                        . $sfam['CODE_SFAM']
                        . '</CODE_SFAM>';
                }, $fourniss['ListSsFamille']))
                . '</ListSsFamille>
                <ListTypeAchats Modifiable="1">'
                . implode('', array_map(function ($tachat) {
                    foreach ($tachat as $key => $value) {
                        $tachat[$key] = htmlspecialchars($value);
                    }
                    return '<TypeAchats Etat="'.$tachat['ETAT'].'">
                        <TACFOTAC Objet="TAC">'.$tachat['TACFOTAC'].'</TACFOTAC>
                        <TACFODEF>'.$tachat['DEFAUT'].'</TACFODEF>
                    </TypeAchats>';
                }, $fourniss['ListTypeAchats']))
                . '</ListTypeAchats>
                <ListMotsClef Modifiable="1">'
                . implode('', array_map(function ($motclef) {
                    foreach ($motclef as $key => $value) {
                        $motclef[$key] = htmlspecialchars($value);
                    }
                    return '<MOTCLEF Etat="'.$motclef['ETAT'].'">'
                        . $motclef['MOTCLEF']
                        .'</MOTCLEF>';
                }, $fourniss['ListMotsClef']))
                . '</ListMotsClef>
                <ListZonesGeo Modifiable="1">'
                . implode('', array_map(function ($zoneGeo) {
                    foreach ($zoneGeo as $key => $value) {
                        $zoneGeo[$key] = htmlspecialchars($value);
                    }
                    return '<ZoneGeo Etat="'.$zoneGeo['ETAT'].'">
                        <DCOUP Format="A7" >'.$zoneGeo['DCOUP'].'</DCOUP>
                        <ZONEGEO Format="A7">'.$zoneGeo['ZONEGEO'].'</ZONEGEO>
                    </ZoneGeo>';
                }, $fourniss['ListZonesGeo']))
                . ' </ListZonesGeo>
                <ListChampsSup Modifiable="1">'
                . implode('', array_map(function ($chpsup) {
                    return '<ChpSup Etat="I">
                        <NOCS>'.$chpsup['NOCS'].'</NOCS>
                        <VALEUR>'.htmlspecialchars($chpsup['VALEUR']).'</VALEUR>
                    </ChpSup>';
                }, $fourniss['ListChampsSup']))
                . '</ListChampsSup>
                <ListChiffreAffaire Modifiable="1">'
                . (function () use ($fourniss, $prevstate) {
                    $xmlCA = '';
                    $mapNewChiffAff = array_column($fourniss['ListChiffreAffaire'] ?? [], null, 'ANNEE');
                    $mapOriginalChiffAff = array_column($prevstate['ListChiffreAffaire'] ?? [], null, 'ANNEE');
                    foreach ($mapNewChiffAff as $id => $CA) {
                        $originalBdd = $mapOriginalChiffAff[ $id ];
                        $xmlCA .=
                            '<ChiffreAffaire Etat="'.($originalBdd == null ? 'A' /* Ajout */ : 'I' /* I? */).'">
                                <ANNEE>'.$CA['ANNEE'].'</ANNEE>
                                <CHIFF_AFF>'.$CA['CHIFF_AFF'].'</CHIFF_AFF>
                                <DEVISE_CA>'.$CA['DEVISE_CA'].'</DEVISE_CA>
                            </ChiffreAffaire>';
                    }
                    // Chiffre affaire to be deleted
                    foreach ($mapOriginalChiffAff as $id => $CA) {
                        // Filter ChiffAff which aren't deleted
                        if (!empty($mapNewChiffAff[ $id ])) {
                            continue;
                        }
            
                        $xmlCA .='  <ChiffreAffaire Etat="S">
                            <ANNEE>'.$CA['ANNEE'].'</ANNEE>
                            <CHIFF_AFF></CHIFF_AFF>
                            <DEVISE_CA></DEVISE_CA>
                        </ChiffreAffaire>';
                    }
                    return $xmlCA;
                })()
                .'</ListChiffreAffaire>
                <ListSocietes Modifiable="1">'
                . implode('', array_map(function ($societe) {
                    return '<CODE_STE Etat="'.$societe['Etat'].'">'
                        .$societe['CODE_STE']
                        .'</CODE_STE>';
                }, $fourniss['ListSocietes']))
                . '</ListSocietes>
                </Fournisseur>
                </MajFournisseurIn>';
        $s = (new \Helpers\Webservice\Wsdl(
            'Oxaproc_fournisseur.wsdl',
            'SRM_FOURNISS_ENREG',
            $envoi,
            false
        ))->responseData;
        return new \SimpleXMLElement($s);
    }
}
