<?php

class Etats
{

    const id_form = 'critereEtat';

    const valeurTout = '@ALL@';

    /**
     * Attributs
     */
    protected $chemin;
 // Chemin d'accès au répertoire de stokage des états de l'utilisateur
    protected $url;
 // URL pointant sur le répertoire de stokage des états de l'utilisateur
    protected $acces;
 // Flag indiquant si l'accès aux états est possible
    protected $liste_etats;
 // Tableau contenant la liste des états de l'utilisateur
    protected $array_xml;
 // Tableau des données XML transmises à la XSL
    
    /**
     * Constructeur de la classe Etats
     * Pour le login d'un utilisateur, on récupère les groupes et les états associés à l'utilisataeur
     * On construit le tableau des données XML transmise à la XSL
     *
     * @param string $login
     *            : Login de l'utilisateur dont on recherche les états
     */
    public function __construct()
    {
        // On définit le répertoire d'accès aux états de l'utilisateur
        $this->chemin = $_SESSION['chemin_pj'] . 'EtatStat' . "\\";
        
        // Ondéfinit l'url d'accès au répertoire de base via url
        $this->url = $_SESSION['url_pj'] . 'EtatStat' . '/';
        
        $this->acces = true;
    }

    /**
     * Méthodes
     */
    
    /**
     * Fonction SelectAllEtatGroupeByUser : retournant les états provenant des groupes associés à un utilisateur
     *
     * retourne un tableau regroupant les états
     */
    public function SelectAllEtatGroupeByUser(& $login)
    {
        return SqlEtat::rqSelectAllEtatGroupeByUser($login)->TrouveTous();
    }

    /**
     * Fonction retournant les états associés à un utilisateur
     *
     * retourne un tableau regroupant les états
     */
    public function SelectAllEtatByUser($login)
    {
        return SqlEtat::rqSelectAllEtatByUser($login)->TrouveTous();
    }

    /**
     * Fonction retournant les états associés à un utilisateur à partir d'un Code etat
     * Retourne un tableau regroupant les états
     */
    public function SelectOneInfoByEtat($etat)
    {
        return SqlEtat::rqSelectOneInfoByEtat($etat)->Trouve1();
    }

    /**
     * Selectionne tous les themes de la table ETATTHEM
     *
     * @return array les tables
     */
    public function SelectAllTheme()
    {
        return SqlEtat::rqSelectAllTheme()->TrouveTous();
    }

    /**
     * Fonction permettant de lister les états d'un utilisateur
     *
     * @return boolean : retourne vrai si les états on pu être récupérés sinon faux
     */
    public function getListEtatsUser($login)
    {
        // Si l'accès au répertoire est OK
        if ($this->acces) {
            // On définit le tableau ou seront stocké les états
            $this->liste_etats = array();
            
            // on recherche les états des groupes associés à l'utilisateur table ETGRPUSER - ETGRPET
            $etat_groupe = $this->SelectAllEtatGroupeByUser($login);
            
            // on ajoute les états présent dans la table ETUSER
            $etat_user = $this->SelectAllEtatByUser($login);
            
            foreach ($etat_groupe as & $etat) {
                $this->liste_etats[] = $etat['CODETAT'];
                // $etatliste permet de déterminé les element dejà ajouter à $this->liste_etats[]
                $etatliste[$etat['CODETAT']] = $etat['CODETAT'];
            }
            
            foreach ($etat_user as & $etat)
                if (! isset($etatliste[$etat['CODETAT']]))
                    $this->liste_etats[] = $etat['CODETAT'];
            
            return true;
        } else
            return false;
    }

    /**
     * Fonction permettant de construire le tableau de données XML transmises à la XSL
     * Cette fonction récupère la liste des états avec getListEtatsUser
     * 
     * @return $array : tableau de données XML
     */
    public function &buildXMLListEtatsUser($login)
    {
        
        // Si le réperoire des états est accessible
        if ($this->getListEtatsUser($login)) {
            
            $this->array_xml['ListeEtats']['acces']['!statut'] = 1;
            
            // Si au moins un état est présent
            if (count($this->liste_etats) > 0) {
                
                // On construit notre tableau de theme
                $tabTheme = $this->SelectAllTheme();
                $indice = 0;
                foreach ($tabTheme as & $theme) {
                    $this->array_xml['ListeThemes']['Theme'][] = array(
                        '!code_theme' => $theme['CODTHEM'], // Code du theme
                        '!lib_theme' => $theme['LIBELLE'] // libellé du theme
                    );
                    $this->array_xml['Themeindice'][$theme['CODTHEM']] = $indice;
                    $indice ++;
                }
                
                foreach ($this->liste_etats as & $fichier_etat) {
                    // On récupère les infos de l'état
                    $infoEtat = $this->SelectOneInfoByEtat($fichier_etat);
                    
                    if (isset($infoEtat)) {
                        if (0 === stripos($infoEtat['NOMFIC'], 'http://') || 0 === stripos($infoEtat['NOMFIC'], 'https://') || 0 === stripos($infoEtat['NOMFIC'], '/') || 0 === stripos($infoEtat['NOMFIC'], "\\"))
                            $lien = $infoEtat['NOMFIC'];
                        else
                            // On définit le lien qui permettra d'ouvrir le fichier
                            $lien = $this->url . $infoEtat['NOMFIC'];
                        
                        // On détermine la partie extension
                        $fic = explode('.', $infoEtat['NOMFIC']);
                        $max = count($fic);
                        $extension = $fic[$max - 1];
                        
                        // Attention : il se peut que l'indice ne soit pas renseigné sur un theme, on l'affecte alors au premier theme
                        if (is_null($this->array_xml['Themeindice'][$infoEtat['CODTHEM']])) {
                            $ind_theme = '0';
                        } else {
                            $ind_theme = $this->array_xml['Themeindice'][$infoEtat['CODTHEM']];
                        }
                        // $ind_theme = $this->array_xml['Themeindice'][$infoEtat['CODTHEM']];
                        
                        $this->array_xml['ListeThemes']['Theme'][$ind_theme]['ListeEtats']['Etat'][] = array(
                            '!nom_etat' => $infoEtat['DESCRIPT'], // Nom du fichier
                            '!nom_fichier' => $infoEtat['NOMFIC'], // Nom du fichier
                            '!extension' => $extension, // Son extension
                            '!onclick' => "window.open(\"$lien\");", // Lien permettant de l'ouvrir
                            '!codetheme' => $infoEtat['CODTHEM'], // code theme
                            '!libtheme' => $infoEtat['LIBELLE'], // Libelle theme
                            '!image' => $this->getImage($extension)
                        );
                    }
                }
            } else {
                $this->array_xml['ListeEtats']['acces']['!statut'] = 0;
                $this->array_xml['ListeEtats']['acces']['!message'] = trad("Aucun état n'est actuellement présent pour votre profil");
            }
        }        // Si le réperoire des états n'est pas accessible
        else {
            $this->array_xml['ListeEtats']['acces']['!statut'] = 0;
            $this->array_xml['ListeEtats']['acces']['!message'] = trad("Le répertoire d'accès aux états n'est pas défini dans le base1.ini ou est inaccessible");
        }
        
        return $this->array_xml;
    }

    /**
     * Fonction permettant de récupérer l'icône associée à un type de fichier
     *
     * @param string $extension
     */
    public function &getImage($extension)
    {
        switch (strtoupper($extension)) {
            case 'PDF':
                $images = 'img_pdf_16x16';
                break;
            
            case 'DOC':
            case 'DOCX':
                $images = 'img_doc_16x16';
                break;
            
            case 'XLS':
            case 'XLSX':
                $images = 'img_xls_16x16';
                break;
            
            case 'REP':
            case 'LGX':
                $images = 'img_report_16x16';
                break;
            
            default:
                $images = 'img_duppliquer_16x16';
                break;
        }
        
        return $images;
    }

    /**
     * Function permettant de charger les informations d'un utilisateur dans la table LOGISES
     */
    function MAJ_LOGISESUserParam()
    {
        // On vérifie si l'utilisateur est déjà dans la table
        $LigneExiste = Etats::SelectOneLigneSessionLOGISES();
        
        // Si Oui on fait un update avec les valeurs de session actuelles
        if ($LigneExiste)
            Etats::UpdateUserSessionLOGISES();
        // Sinon on Crée une nouvelle ligne pour l'utlisateur
        else
            Etats::InsertUserSessionLOGISES();
    }

    /**
     * SelectOneLigneSessionLOGISES()
     * Renvoi un booleen selon si une ligne existe ou non dans la table LOGISES pour l'utilisateur.
     */
    function SelectOneLigneSessionLOGISES()
    {
        $result = SqlEtat::rqExistUserLOGISES()->Trouve1();
        return is_array($result);
    }

    /**
     * UpdateUserSessionLOGISES()
     * met a jour la table LOGSES avec les variables de session de l'utilisateur Loggé .
     */
    function UpdateUserSessionLOGISES()
    {
        // On met à jour les valeurs de session de l'utilisateur dans la table LOGISES
        return SqlEtat::rqUpdatetUserLOGISES()->ExecuteSql();
    }

    /**
     * InsertUserSessionLOGISES()
     * Créé une nouvelle ligne dans la table LOGSES avec les variables de session de l'utilisateur Loggé .
     */
    function InsertUserSessionLOGISES()
    {
        // On ajoute une ligne et on ajoute les valeurs de session de l'utilisateur dans la table LOGISES
        return SqlEtat::rqInsertUserLOGISES()->ExecuteSql();
    }

    // Spec 3581
    public static function ListeEtatsHighCharts()
    {
        return SqlEtat::rqGetListeEtatsHighChart()->TrouveTous();
    }

    // Spec 3581
    public static function CompteEtats()
    {
        $tmp = Etats::ListeEtatsHighCharts();
        return count($tmp);
    }

    public static function &XMLEcranHighCharts(& $action)
    {
        $array = array();
        $array['ide'] = Etats::XMLListeEtatsHighCharts();
        $array['ide']['!action'] = $action;
        if ($_SESSION['OXAADHOC_ACTIVE'] || Menu::allMenu) {
            $array['ide']['!adhoc'] = 'CallUrl("suivi_etats.php","action=AdHoc");window.scrollTo(0,0);';
        }
        return $array;
    }

    // Spec 3581
    public static function &XMLListeEtatsHighCharts()
    {
        $listeEtat = Etats::ListeEtatsHighCharts();
        $resultat = array();
        
        $indexThemes = array();
        $listeThemesXml = array();
        $listeEtatsXml = array();
        foreach ($listeEtat as $value) {
            // On liste tous les thèmes concernés
            $codeTheme = $value['CODTHEM'];
            if (! array_key_exists($codeTheme, $indexThemes)) {
                $indexThemes[$codeTheme] = $codeTheme;
                $listeThemesXml[] = array(
                    '!code' => $codeTheme,
                    '!libelle' => ('-' === $codeTheme) ? trad('Etats sans thème') : trad($value['LIBELLE'])
                );
            }
            // Ainsi que les états ; la XSL se débrouille pour afficher les états par thèmes
            $codeEtat = $value['CODETAT'];
            $description = $value['DESCRIPT'];
            $descriptionHtml = htmlentities(urlencode($description));
            $jsOnClick = '';
            $source = $value['SOURCE'];
            switch ($source) {
                case 'OXACHARTS':
                case 'OXACHARTS_INT':
                case 'OXACHARTS_REQ':
                    if($value['TYPERES']=='T')
                    {
                        $guid = getGUID();
                        //move_uploaded_file($file_tmp, $racine . $new_name);
                        $sec = $_SESSION['oxa_prc_https']=='N'? 'http':'https';
                        $broker = $_SESSION['_brokernumber'];
                        $jsOnClick = '
                                TraiteUrlAsync("EtatsHighCharts.php?action=generateXML_ETAT_TABLEAU&guid='.$guid.'&CODETAT='.$value['CODETAT'].'");
                                window.open("'.$sec.'://'.$_SESSION['_serveurweb'].'/OXAREPORTS'.$broker.'_web/FR/index.awp?P1='.$guid.'");';
                    }
                    else
                    {
                        $jsOnClick = 'TraiteUrlAsync("EtatsHighCharts.php?action=AfficherCriteres&ancrage=ListeCriteres&codeEtat=' . $codeEtat . '&description=' . $descriptionHtml . '&source=' . $source . '");';
                    }
                    break;
                case 'OXAREPORTS':
                    $nomFic = $value['NOMFIC'];
                    $jsOnClick = 'TraiteUrlAsync("EtatsHighCharts.php?action=AfficherEtat&nomFic=' . $nomFic . '&description=' . $descriptionHtml . '&source=' . $source . '");';
                    break;
                case '-':
                case ' ':
                case '' :
                    $jsOnClick = 'TraiteUrlAsync("EtatsHighCharts.php?action=AfficherEtat&ancrage=ListeCriteres&codeEtat=' . $codeEtat . '&source=");';
                    break;
                default:
                    $jsOnClick = 'alert(\'Type non géré : ' . $value['SOURCE'] . '\');';
                    break;
            }
            $listeEtatsXml[] = array(
                '!theme' => $codeTheme,
                '!codeEtat' => $codeEtat,
                '!description' => $description,
                '!onclick' => $jsOnClick
            );
        }
        $resultat['ListeThemes'] = $listeThemesXml;
        $resultat['ListeEtats'] = $listeEtatsXml;
        return $resultat;
    }

    // Spec 3581
    public static function &XMLListeCriteresHighCharts_REQ_INT(& $source, & $codeEtat)
    {
        $resultat = array();
        $listeCriteres = array();
        
        // Selon la source du rapport, on sélectionne les filtres pour l'affichage
        
        switch ($source) {
            case 'OXACHARTS_INT':
                switch ($codeEtat) {
                    case 'ACD_QTE':
                        $listeCriteres = array(
                            'ACD' => '1',
                            'Societe' => '0',
                            'Periode' => '0',
                            'SI' => '0'
                        );
                        break;
                    case 'PALM_NOTF':
                        $listeCriteres = array(
                            'ACD' => '0',
                            'Societe' => '0',
                            'Periode' => '1',
                            'SI' => '0'
                        );
                        break;
                    case 'ENG_SFA_SI':
                    case 'ENG_SI_2':
                        $listeCriteres = array(
                            'ACD' => '0',
                            'Societe' => '1',
                            'Periode' => '1',
                            'SI' => '1'
                        );
                        break;
                    default:
                        $listeCriteres = array(
                            'ACD' => '0',
                            'Societe' => '1',
                            'Periode' => '1',
                            'SI' => '0'
                        );
                        break;
                }
                break;
            case 'OXACHARTS_REQ':
                // Mail YA 20160421
                $filtreEtat = SqlEtat::rqGeFiltresEtat($codeEtat)->TrouveTous();
                if (is_array($filtreEtat)) {
                    foreach ($filtreEtat as & $filtre) {
                        switch ($filtre['CODE_FILTRE']) {
                            case 'SOCIETE':
                                $listeCriteres['Societe'] = '1';
                                break;
                            case 'PERIODE':
                                $listeCriteres['Periode'] = '1';
                                break;
                            case 'ACD' :
                                $listeCriteres['ACD'] = '1';
                                break;
                            case 'SI' :
                                $listeCriteres['SI'] = '1';
                                break;
                            // pour plus tard
                            // case 'DATE':
                            // $listeCriteres['Date'] = '1';
                            // break;
                        }
                    }
                }
                if (! array_key_exists('ACD', $listeCriteres))
                    $listeCriteres['ACD'] = '0';
                if (! array_key_exists('Societe', $listeCriteres))
                    $listeCriteres['Societe'] = '0';
                if (! array_key_exists('Periode', $listeCriteres))
                    $listeCriteres['Periode'] = '0';
                // pour plus tard
                // if (!array_key_exists('Date', $listeCriteres))
                // $listeCriteres['Date'] = '0';
                break;
        }
        
        // Est-ce que l'utilisateur a droit à plusieurs sociétés?
        $fake = ['relevance' => 1, 'orderByField' => 'RAIS_SOC','orderByValue'=> 'asc'];
        $listeSocietes =  SqlSociete::rqPopupGetAllSocieteForUser($fake, true)->TrouveTous();
        
        if ('1' == $listeCriteres['Societe']) {
            // L'utilisateur a droit à plusieurs sociétés.
            if (1 == count($listeSocietes)) {
                $societe = array(
                    '!modifiable' => 0,
                    '!visible' => 1,
                    '!code' => $listeSocietes[0]['CODE_STE'],
                    '!libelle' => $listeSocietes[0]['RAIS_SOC']
                );
            } else {
                $societe['!onchange'] = 'CallUrlAsync("EtatsHighCharts.php?action=OXACHARTS_INT_societe");';
                $societe['!modifiable'] = 1;
                $societe['!visible'] = 1;
                $code_ste_utilisateur = $_SESSION['Session_SocUsr'];
                foreach ($listeSocietes as $key => &$value) {
                    $code_ste = $value['CODE_STE'];
                    $societe['ListeSocietes'][] = array(
                        '!code' => $code_ste,
                        '!libelle' => $value['RAIS_SOC'],
                        '!courante' => ($code_ste_utilisateur === $code_ste) ? 1 : 0
                    );
                }
            }
        } else {
            // L'utilisateur n'a pas le droit à plusieurs sociétés.
            $societe = array(
                '!modifiable' => 0,
                '!visible' => 0
            );
        }
        
        if ('1' === $listeCriteres['Periode']) {
            $listePeriodes = SqlEtat::rqGetListePeriodes()->TrouveTous();
            $periode['!libelle'] = 'Periode';
            $periode['!visible'] = 1;
            $periode['liste'] = array();
            $dateDuJour=date('Ymd');
            foreach ($listePeriodes as $key => &$value) {
                // dossier 28164
                if ($dateDuJour >= $value['DATE_DEB'] && $dateDuJour <= $value['DATE_FIN'])
                    $value['PERIODECOURANTE'] = 1;
                else
                    $value['PERIODECOURANTE'] = 0;
                
                $periode['liste'][] = array(
                    '!code' => $value['CODE_PER'],
                    '!libelle' => $value['LIBELLE'],
                    '!courante' => $value['PERIODECOURANTE']
                );
            }
        } else
            $periode['visible'] = 0;
        
        if ('1' === $listeCriteres['ACD']) {
            $liste_ACD = SqlEtat::rqGetListeACDPourEtats()->TrouveTous();
            $acd['!visible'] = 1;
            $acd['liste'] = array();
            foreach ($liste_ACD as $key => & $value) {
                $acd['liste'][] = array(
                    '!code' => htmlentities($value['CODE_ACD']),
                    '!libelle' => $value['LIBELLE'] . ' - ' . (($value['TYPE_FG'] == 'F') ? Trad('Fournisseur') : Trad('Groupement')) . ' : ' . $value['RS']
                );
            }
        } else
            $acd['!visible'] = 0;
        
        if ('1' === $listeCriteres['SI']) {
            $id_SI = 'SI';
            $lbl_final = 'n/a';
            
            $popupSI = new AffichePopup('SI');
            $popupSI->setVariable('action', 'initPopup');
            $popupSI->setVariable('formName', Etats::id_form);
            $popupSI->setVariable('inputField', $id_SI);
            $popupSI->setVariable('labelField', $id_SI . '_lib');
            if (Param::IsSISecto()) {
                $popupSI->addDependanceHtml('Societe');
            } else {
                $popupSI->addDependanceHtmlFacultative('Societe');
            }
            
            $popupSI->setToSession();
            $img_onclick = $popupSI->getUrl();
            
            $actionSI = 'TraiteUrl("EtatsHighCharts.php?action=OXACHARTS_INT_SI", this);';
            $compXsl = new ComposantXslTexte($id_SI);
            $compXsl->setAction($actionSI);
            $compXsl->setLibelleFinal($lbl_final);
            $compXsl->setImgOnclick($img_onclick);
            $compXsl->setImgClasse('zoom_Etat_Stat_SI');
            
            $si['composant'] = $compXsl->buildXml();
            $si['!visible'] = 1;
        } else {
            $si['!visible'] = 0;
        }
        
        $resultat['acd'] = $acd;
        $resultat['societe'] = $societe;
        $resultat['periode'] = $periode;
        $resultat['si'] = $si;
        
        return $resultat;
    }

    // Spec 3750
    public static function &XMLListeCriteresEtatStd(& $codeEtat)
    {
        $listeCriteres = array();
        $message = '';
        $false = false;
        $fakeArray = array();
        $min_width = 325;
        
        $resultatTmp = Etats::TraiteWsdlGetEtatStdInfos($codeEtat);
        $message = $resultatTmp['message'];
        if ('' == $message) {
            foreach ($resultatTmp['criteres'] as $key => & $value) {
                if (is_array($value)) {
                    $objet = $value['!objet'];
                    $is_multiple = BoolSql($value['!EstMultiple']);
                    $avecElementTout = BoolSql($value['!AvecElementTout']);
                    
                    switch ($objet) {
                        case 'SOCIETE':
                            $libelle = Trad('Société') . ' :';
                            
                            $compXsl = new ComposantXslSelection($objet);
                            $compXsl->setLibelle($libelle);
                            $compXsl->setLibelleVisible($false);
                            $compXsl->setIsMultiple($is_multiple);
                            $compXsl->setMinWidth($min_width);
                            
                            $options = array();
                            if ($avecElementTout) {
                                $options[] = array(
                                    '!value' => Etats::valeurTout,
                                    '!texte' => trad('Toutes')
                                );
                            }
                            
                            $fakeArray = ['relevance' => 1, 'orderByField' => 'RAIS_SOC','orderByValue'=> 'asc']; 
                            $listeSocietes = SqlSociete::rqPopupGetAllSocieteForUser($fakeArray, true)->TrouveTous();
                            if (is_array($listeSocietes)) {
                                foreach ($listeSocietes as $key => &$value) {
                                    $options[] = array(
                                        '!value' => $value['CODE_STE'],
                                        '!texte' => $value['RAIS_SOC'] . ' (' . $value['CODE_STE'] . ')'
                                    );
                                }
                                $compXsl->setListeOptions($options);
                                $listeCriteres[$objet] = $compXsl->buildXml();
                            } else {
                                $message = Trad('Vous n\'avez accès à aucune société');
                                break;
                            }
                            break;
                        case 'PERIODES':
                            $libelle = Trad('Période') . ' :';
                            
                            $compXsl = new ComposantXslSelection($objet);
                            $compXsl->setLibelle($libelle);
                            $compXsl->setLibelleVisible($false);
                            $compXsl->setIsMultiple($is_multiple);
                            $compXsl->setMinWidth($min_width);
                            
                            $options = array();
                            if ($avecElementTout) {
                                $options[] = array(
                                    '!value' => Etats::valeurTout,
                                    '!texte' => trad('Toutes')
                                );
                            }
                            $listePeriodes = SqlEtat::rqGetListePeriodes()->TrouveTous();
                            if (is_array($listePeriodes)) {
                                foreach ($listePeriodes as $key => &$value) {
                                    $options[] = array(
                                        '!value' => $value['CODE_PER'],
                                        '!texte' => $value['LIBELLE'] . ' (' . $value['CODE_PER'] . ')'
                                    );
                                }
                                $compXsl->setListeOptions($options);
                                $listeCriteres[$objet] = $compXsl->buildXml();
                            }
                            break;
                        case 'TYPEACHAT':
                            $libelle = Trad('Type d\'achat') . ' :';
                            $fakeArray = array();
                            
                            $compXsl = new ComposantXslSelection($objet);
                            $compXsl->setLibelle($libelle);
                            $compXsl->setLibelleVisible($false);
                            $compXsl->setIsMultiple($is_multiple);
                            $compXsl->setMinWidth($min_width);
                            
                            $options = array();
                            if ($avecElementTout) {
                                $options[] = array(
                                    '!value' => Etats::valeurTout,
                                    '!texte' => trad('Tous')
                                );
                            }
                            $listeTypeAchat = SqlInfo::rqPopupGetAllTypesAchat($fakeArray, true)->TrouveTous();
                            if (is_array($listeTypeAchat)) {
                                foreach ($listeTypeAchat as $key => &$value) {
                                    $options[] = array(
                                        '!value' => $value['TYP_ACH'],
                                        '!texte' => $value['LIB_TAC'] . ' (' . $value['TYP_ACH'] . ')'
                                    );
                                }
                                $compXsl->setListeOptions($options);
                                $listeCriteres[$objet] = $compXsl->buildXml();
                            }
                            
                            break;
                        case 'TYPDOC':
                            $libelle = Trad('Type document') . ' :';
                            
                            $compXsl = new ComposantXslSelection($objet);
                            $compXsl->setLibelle($libelle);
                            $compXsl->setLibelleVisible($false);
                            $compXsl->setIsMultiple($is_multiple);
                            $compXsl->setMinWidth($min_width);
                            
                            $options = array();
                            if ($avecElementTout) {
                                $options[] = array(
                                    '!value' => Etats::valeurTout,
                                    '!texte' => trad('Tous')
                                );
                            }
                            
                            $listeTypeDocument = SqlInfo::rqPopupGetAllTypesDocument($fakeArray, true)->TrouveTous();
                            if (is_array($listeTypeDocument)) {
                                foreach ($listeTypeDocument as $key => &$value) {
                                    $options[] = array(
                                        '!value' => $value['TYPE'],
                                        '!texte' => $value['LIBELLE'] . ' (' . $value['TYPE'] . ')'
                                    );
                                }
                                $compXsl->setListeOptions($options);
                                $listeCriteres[$objet] = $compXsl->buildXml();
                            }
                            
                            break;
                        case 'ACHETEUR':
                            $libelle = Trad('Acheteur') . ' :';
                            
                            //
                            // Composant standard sélection
                            //
                            /*
                             * $compXsl = new ComposantXslSelection($objet);
                             * $compXsl->setLibelle($libelle);
                             * $compXsl->setLibelleVisible($false);
                             * $compXsl->setIsMultiple($is_multiple);
                             * $compXsl->setMinWidth($min_width);
                             * $nbEltAffichage = 10;
                             * $compXsl->setSize($nbEltAffichage);
                             *
                             * $options = array();
                             * if ($avecElementTout) {
                             * $options[] = array('!value' => Etats::valeurTout, '!texte' => trad('Tous'));
                             * }
                             * $array_filters = array( 'contexte' => 'Acheteur' );
                             * $listeAcheteurs = SqlUsers::rqPopupGetAllUtilisateurs($array_filters, true)->TrouveTous();
                             * if (is_array($listeAcheteurs)) {
                             * foreach($listeAcheteurs as $key => &$value) {
                             * $options[] = array( '!value' => $value['CODE'], '!texte' => $value['NOM'].' ('.$value['CODE'].')' );
                             * }
                             * $compXsl->setListeOptions($options);
                             * $listeCriteres[$objet] = $compXsl->buildXml();
                             * }
                             */
                            
                            // Composant double liste
                            $id_form = Etats::id_form;
                            $objListe = new DoubleListeAcheteur($id_form, $objet);
                            $listeCriteres[$objet] = $objListe->buildXml();
                            $listeCriteres[$objet]['!libelle'] = $libelle;
                            
                            break;
                    }
                }
            }
        }
        
        $array = array(
            'message' => $message,
            'criteres' => $listeCriteres
        );
        return $array;
    }

    // Spec 3750
    public static function &XmlEnvoieCriteresEtatStd(& $codeEtat, & $data)
    {
        $message = '';
        $nomFichier = '';
        
        $resultatTmp = Etats::TraiteWsdlGetEtatStdInfos($codeEtat);
        $message = $resultatTmp['message'];
        if ('' == $message) {
            $xmlToSend = '';
            foreach ($resultatTmp['criteres'] as $key => & $value) {
                if (is_array($value)) {
                    $objet = $value['!objet'];
                    
                    if (BoolSql(BoolSql($value['!EstMultiple']))) {
                        $xmlTmp = '';
                        $valeurCourante = (array_key_exists($objet, $data)) ? $data[$objet] : '';
                        if (is_array($valeurCourante)) {
                            foreach ($valeurCourante as $valeurSimple) {
                                if (Etats::valeurTout == $valeurSimple) {
                                    $xmlTmp = '';
                                    break;
                                } else
                                    $xmlTmp .= (('' != $xmlTmp) ? '|' : '') . htmlentities($valeurSimple);
                            }
                            $xmlToSend .= '<Critere objet=\'' . $objet . '\'>' . $xmlTmp . '</Critere>';
                        } else {
                            $xmlToSend .= '<Critere objet=\'' . $objet . '\'>' . htmlentities(trim($valeurCourante)) . '</Critere>';
                        }
                    } else {
                        $valeurCourante = (array_key_exists($objet, $data)) ? trim($data[$objet]) : '';
                        if (Etats::valeurTout == $valeurCourante)
                            $valeurCourante = '';
                        $xmlToSend .= '<Critere objet=\'' . $objet . '\'>' . htmlentities($valeurCourante) . '</Critere>';
                    }
                }
            }
            $xmlFinal = '<EtatIn><Code>' . $codeEtat . '</Code><Criteres>' . $xmlToSend . '</Criteres></EtatIn>';
            $resultWsdl = Wsdl::wsdlGenerique('OXAPRC_ETAT_STD_HC', $xmlFinal);
            if ('O' != $resultWsdl['Retour']) {
                $message = $resultWsdl['MsgErreur'];
            } else {
                $nomFichier = trim($resultWsdl['NomFichier']);
                if ('' == $nomFichier) {
                    $message = Trad('Nom de fichier absent du WSDL OXAPRC_ETAT_STD_HC');
                }
            }
        }
        
        $resultat = array(
            'message' => $message,
            'NomFichier' => $nomFichier
        );
        return $resultat;
    }

    public static function &XMLEcranCriteresHighCharts($action, $codeEtat, $source, $description)
    {
        $array = array();
        $message = '';
        
        $array['ide']['!action'] = $action;
        $array['ide']['!source'] = $source;
        $array['ide']['!codeEtat'] = $codeEtat;
        $array['ide']['!descriptionEtat'] = $description;
        
        // Bouton retour à la liste
        $id = 'btnRetourliste';
        $libelle = Trad('Retour à la liste');
        $compXsl = new ComposantXslAction($id);
        $compXsl->setLibelle($libelle);
        $compXsl->setEstPrimaire(true);
        $compXsl->setEstFlecheGauche();
        $action = 'TraiteUrlAsync("EtatsHighCharts.php?action=RetourListe")';
        $compXsl->setAction($action);
        $array['ide']['btnRetourListe'] = $compXsl->buildXml();
        
        // Bouton afficher
        $id = 'btnAfficher';
        $libelle = Trad('Afficher');
        $compXsl = new ComposantXslAction($id);
        $compXsl->setLibelle($libelle);
        $compXsl->setEstPrimaire(true);
        $action = 'TraiteUrlAsync("EtatsHighCharts.php?action=AfficherEtat&ancrage=Etats&codeEtat=' . $codeEtat . '&source=' . $source . '", document.forms["critereEtat"].elements[0]);';
        $compXsl->setAction($action);
        
        $array['ide']['btnAfficher'] = $compXsl->buildXml();
        
        $array['ide']['form'] = array(
            '!id' => Etats::id_form
        );
        
        switch ($source) {
            case 'OXACHARTS':
                $resultat = Etats::XMLListeCriteresEtatStd($codeEtat);
                $message = $resultat['message'];
                $array['ide']['criteres'] = & $resultat['criteres'];
                break;
            case 'OXACHARTS_INT':
            case 'OXACHARTS_REQ':
                $array['ide']['criteres'] = Etats::XMLListeCriteresHighCharts_REQ_INT($source, $codeEtat);
                break;
            default:
                break;
        }
        
        $resultat = array(
            'message' => $message,
            'array' => & $array
        );
        return $resultat;
    }

    // Spec 3581
    public static function &AppelWsdlHighCharts_REQ_INT($etat, $societe, $periode, $acd, $si, $nbEnreg)
    {
        $xml = '<EtatIn LngUtilisation=\'' . $_SESSION['Session_Langue'] . '\'>
					<Code>' . $etat . '</Code>
					<Criteres>
						<ACD>' . htmlentities($acd) . '</ACD>
						<Societe>' . htmlentities($societe) . '</Societe>
						<Periode>' . htmlentities($periode) . '</Periode>
						<SI>' . htmlentities($si) . '</SI>
						<NbEnreg>' . $nbEnreg . '</NbEnreg>
					</Criteres>
				</EtatIn>';
        return Wsdl::wsdlGenerique('OXAPRC_ETAT_STD_HC', $xml);
    }

    // Spec 3750
    public static function AppelWsdlGetEtatStdInfos(& $etat)
    {
        $xml = '<EtatStdInfosIn>
					<CodeEtat>' . $etat . '</CodeEtat>
				</EtatStdInfosIn>';
        
        return Wsdl::wsdlGenerique('OXAPRC_ETAT_STD_INFOS', $xml);
    }

    // Spec 3750
    public static function &TraiteWsdlGetEtatStdInfos(& $codeEtat)
    {
        $message = '';
        $criteres = NULL;
        $critereWsdl = Etats::AppelWsdlGetEtatStdInfos($codeEtat);
        if (is_array($critereWsdl)) {
            if (array_key_exists('Retour', $critereWsdl) && 'O' == $critereWsdl['Retour']) {
                if (array_key_exists('Criteres', $critereWsdl) && is_array($critereWsdl['Criteres']) && array_key_exists('Critere', $critereWsdl['Criteres']) && is_array($critereWsdl['Criteres']['Critere'])) {
                    $criteres = &$critereWsdl['Criteres']['Critere'];
                }
            } else {
                if (array_key_exists('MsgErreur', $critereWsdl) && '' != $critereWsdl['MsgErreur']) {
                    $message = $critereWsdl['MsgErreur'];
                } else {
                    $message = Trad('Retour incorrect du message d\'erreur du WSDL OXAPRC_ETAT_STD_INFOS');
                }
            }
        } else {
            $message = Trad('Retour incorrect du WSDL OXAPRC_ETAT_STD_INFOS');
        }
        $resultat = array(
            'message' => $message,
            'criteres' => $criteres
        );
        return $resultat;
    }

    public static function &GetNomFicFromEtat(& $codeEtat)
    {
        $infosEtat = SqlEtat::rqGetInfoEtat($codeEtat)->Trouve1();
        return $infosEtat['NOMFIC'];
    }
}