<?php

class ControleSaisie
{

    public static $callback_php = 'controle_saisie.php';

    public static $actCheckValue = 'checkValue';

    public static function &getJSCheckValue(& $form = '', & $id = '')
    {
        $js = 'TraiteUrl(\'' . ControleSaisie::$callback_php . '?action=' . ControleSaisie::$actCheckValue . '&form=' . $form . '\', this);';
        return $js;
    }

    public static $zoneCtrone = null;

    public function construct()
    {}

    /**
     * $arrayControle = array(
     * 'ref_art_frs' => array(
     * 'REF_FOURN' => array('value' => getValue('ref_art_frs'))
     * )
     * );
     */
    public static function controleChamp($array)
    {
        if (is_null(ControleSaisie::$zoneCtrone))
            ControleSaisie::$zoneCtrone = array(
                'REF_FOURN' => array(
                    'limit' => 30,
                    'texteLimit' => trad("La référence fournisseur de l'article ne doit pas dépasser 30 caractères, veuillez vérifier")
                ),
                'DESIGN_COMP' => array(
                    'limit' => 3000,
                    'texteLimit' => trad("La désignation complémentaire de l'article ne doit pas dépasser 3000 caractères, veuillez vérifier")
                )
            );
        if (is_array($array))
            foreach ($array as & $element)
                foreach ($element as $value => & $key)
                    if (array_key_exists($value, ControleSaisie::$zoneCtrone)) {
                        $elementControle = ControleSaisie::$zoneCtrone[$value];
                        if (mb_strlen($key['value']) > $elementControle['limit'])
                            return $elementControle['texteLimit'];
                    }
    }

    /**
     * Fonction basée sur une expression régulière permettant de tester la validité d'une @mail
     * 
     * @param string $mail
     *            : adresse mail que l'on souhaite contrôler
     * @return boolean : retourne vrai si la syntaxe de l'adresse est correcte
     */
    public static function checkMail($mail)
    {
        $regexp = "/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i";
        
        if (preg_match($regexp, $mail) == 0)
            return false;
        else
            return true;
    }

    public static function checkEmail($mail)
    {
        return filter_var($mail, FILTER_VALIDATE_EMAIL);
    }

    public static function checkUrl($url)
    {
        if(substr($url, -1)!='/')
        {
            $url .= '/';
        }
        return filter_var(trim($url), FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED);
        // return preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$url);
    }

    public static function checkAlphaNum($chaine)
    {
        return preg_match('/^[_\\.\\-a-zA-Z0-9]*$/', $chaine);
    }

    // Finalement pas besoin maintenant, mais voir avec YA pour le workflow fournisseur a placer dans un validator
    public static function checkAlphaNumWithSpace($chaine)
    {
        $chaine = strtr($chaine, 'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ', 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
        return ctype_alnum(str_replace(' ', '', $chaine));
    }

    public static function checkAlphaNumUpper($chaine)
    {
        return preg_match('/^[A-Z0-9]*$/', $chaine);
    }

    /**
     * Fonction permettant de comparer 2 champs retourne vrai en cas dégalité et si renseigné
     *
     * @param string $pass
     * @param string $pass_confirm
     * @param string $champ_pass
     * @param string $champ_pass_confirm
     * @param string $message_si_vide
     * @param string $message_si_diff
     * @return boolean
     */
    public static function &checkPassword($pass, $pass_confirm, $champ_pass, $champ_pass_confirm, $message_si_vide, $message_si_diff)
    {
        $validation = true;
        $pass = trim($pass);

        if ($pass != $pass_confirm) {
            echo 'alert("', $message_si_diff, '");';
            Affichage::setAttribut($champ_pass, 'value', '');
            Affichage::setAttribut($champ_pass_confirm, 'value', '');
            $validation = false;
        } else {
            $msgErreur = '';
            $password_verif = true;

            // On recupere le nombre de caractère minimum obligatoire du mot de passe
            $result = SqlParam::rqSelectOneNbCaractMDP()->Trouve1();
            if (! is_numeric($result['LIB01PARV'])){
                $result['LIB01PARV'] = 0;
            }
            // on controle la longueur du mot de passe
            if (strlen($pass) < $result['LIB01PARV'] || strlen($pass) > 30) {
                $msgErreur .= trad('- Entre') . ' ' . $result['LIB01PARV'] . trad(' et 30 caractères')."\n\r";
            }
            
            // On récupère les règles de gestion des mots de passe
            $rulesUserPassword = SqlUsers::rqGetRulesPassword()->TrouveTous();
            $listeRulesUserPassword = [];
            foreach($rulesUserPassword as $value)
            {
                $value['CODEPARV'] = str_replace(' ', '', $value['CODEPARV']);
                $value['LIB01PARV'] = str_replace(' ', '', $value['LIB01PARV']);
                $listeRulesUserPassword[$value['CODEPARV']] = $value['LIB01PARV'];
            }

            if($listeRulesUserPassword['MDP_A_MAJ'] == 'O' && !preg_match('/[A-Z]+/', $pass))
            {
                $password_verif = false;
                $msgErreur .= trad('- Au moins une majuscule. ')."\n\r";
            }

            if($listeRulesUserPassword['MDP_A_MIN'] == 'O' && !preg_match('/[a-z]+/', $pass))
            {
                $password_verif = false;
                $msgErreur .= trad('- Au moins une minuscule. ')."\n\r";
            }

            if($listeRulesUserPassword['MDP_A_CHI'] == 'O' && !preg_match('/[0-9]+/', $pass))
            {
                $password_verif = false;
                $msgErreur .= trad('- Au moins un chiffre. ')."\n\r";
            }

            if($listeRulesUserPassword['MDP_A_CS'] == 'O' && !preg_match('/\W+/', $pass))
            {
                $password_verif = false;
                $msgErreur .= trad('- Au moins un caractère spécial. ')."\n\r";
            }

            // Si présence d'au moins une erreur, affichage du message
            if(!$password_verif){
                $msgErreur = trad('Un problème est survenu, votre mot de passe saisi doit contenir :') . "\n\r" . $msgErreur;
                Affichage::messageJS($msgErreur);
                $validation = false;
            }
        }
        
        return $validation;
    }

    /**
     * Fonction retouranant l'expression régulière
     * 
     * @param
     *            string budget : budget saisi dans l'entête du panier
     * @return booelan
     */
    public static function CtrlBudgetSaisi($budget)
    {
        return preg_match("/^[0-9]{1,13}([.]{1}[0-9]{1,2}){0,1}$/i", $budget);
    }

    /**
     * Fonction controlant si une date est valide
     *
     * @param string $date
     * @return boolean
     */
    public static function isDateValide($date)
    {
        if (mb_strlen($date) != 8 || ! checkdate((int) mb_substr($date, 4, 2), (int) mb_substr($date, 6, 2), (int) mb_substr($date, 0, 4)))
            return false;
        else
            return true;
    }

    /**
     * Définit si une date est valide ou nulle selon le format de Date de la session
     *
     * @param $date au
     *            format date
     * @return bool
     */
    public static function isDateValideFormat($date)
    {
        $date = str_replace('/', '', $date);
        $date = str_replace('-', '', $date);
        
        if (param::getFormatDateAAAAMMJJ() == $_SESSION['DATE_FORMAT']) // format : aaaa/mm/jj
{
            $mois = mb_substr($date, 4, 2);
            if ('0' == mb_substr($mois, 0, 1)) {
                $mois = mb_substr($mois, 1, 2);
            }
            
            return (checkdate((int) $mois, (int) mb_substr($date, 6, 2), (int) mb_substr($date, 0, 4)) || '00000000' == $date);
        } elseif (param::getFormatDateMMJJAAAA() == $_SESSION['DATE_FORMAT']) // format : mm/jj/aaaa
{
            $annee = mb_substr($date, 4, 4);
            if (mb_strlen($annee) == 2)
                $annee = '20' . $annee;
            
            if (mb_strlen($annee) == 4) {
                $mois = mb_substr($date, 0, 2);
                if ('0' == mb_substr($mois, 0, 1)) {
                    $mois = mb_substr($mois, 1, 2);
                }
                
                return (checkdate((int) $mois, (int) mb_substr($date, 2, 2), (int) mb_substr($date, 4, 4)) || '00000000' == $date);
            } else
                return false;
        } elseif (param::getFormatDateAAMMJJ_tiret() == $_SESSION['DATE_FORMAT']) // format : aa-mm-jj
{
            $mois = mb_substr($date, 2, 2);
            if ('0' == mb_substr($mois, 0, 1)) {
                $mois = mb_substr($mois, 1, 2);
            }
            
            return (checkdate((int) $mois, (int) substr($date, 4, 2), '20' . (int) mb_substr($date, 0, 2)) || '00000000' == $date);
        } elseif (param::getFormatDateAAAAMMJJ_tiret() == $_SESSION['DATE_FORMAT']) // format : aaaa-mm-jj
{
            $mois = mb_substr($date, 4, 2);
            if ('0' == mb_substr($mois, 0, 1)) {
                $mois = mb_substr($mois, 1, 2);
            }
            return (checkdate((int) $mois, (int) mb_substr($date, 6, 2), (int) mb_substr($date, 0, 4)) || '00000000' == $date);
        } elseif (param::getFormatDateJJMMAAAA() == $_SESSION['DATE_FORMAT']) // format : jj/mm/aaaa
{
            $annee = mb_substr($date, 4, 4);
            if (mb_strlen($annee) == 2)
                $annee = '20' . $annee;
            
            if (mb_strlen($annee) == 4) {
                $mois = mb_substr($date, 2, 2);
                if ('0' == mb_substr($mois, 0, 1))
                    $mois = mb_substr($mois, 1, 2);
                
                return (checkdate((int) $mois, (int) mb_substr($date, 0, 2), (int) mb_substr($date, 4, 4)) || '00000000' == $date);
            } else
                return false;
        } else
            return false;
    }

    public static function getDateNulle()
    {
        if (param::getFormatDateAAAAMMJJ() == $_SESSION['DATE_FORMAT'])
            return '0000/00/00';
        elseif (param::getFormatDateAAMMJJ_tiret() == $_SESSION['DATE_FORMAT'])
            return '00-00-00';
        elseif (param::getFormatDateAAAAMMJJ_tiret() == $_SESSION['DATE_FORMAT'])
            return '0000-00-00';
        else // format : jj/mm/aaaa ou bien mm/jj/aaaa
            return '00/00/0000';
    }

    /**
     * Fonction permettant de tester si un nom logique est présent dans une chaine de caractère
     * 
     * @param string $ch
     *            : chaine de caractuère dans laquelle le nom logique estrecherché
     * @param string $logicalName
     *            @type string : type de variable contrôlé
     * @return boolean : retourne vrai si le nom logique est présent sinon false
     */
    public static function CtrlLogicalNames($ch, $logicalName, $type = 'logical')
    {
        if ($type == 'logical')
            $type_variable = 'MAGIC_LOGICAL_NAMES';
        elseif ($type == 'database')
            $type_variable = 'MAGIC_DATABASES';
        
        return (preg_match('/^[\040]*[\[]' . $type_variable . '{1}[\]][\040]*' . $logicalName . '[\040]*[=]{1}/', $ch));
    }

    /**
     * Fonction retournant l'expression régulière permettant de contrôler des quantités saisies
     * 
     * @param string $qte
     *            : quantité saisie par l'utilisateur
     * @return booelan
     */
    public static function CtrlQuantite($qte)
    {
        //return (preg_match('/^[0-9]{1,6}([.]{1}[0-9]{1,3}){0,1}$/', $qte));
        return (preg_match('/^[0-9]{1,8}([.]{1}[0-9]{1,3}){0,1}$/', $qte));
    }

    public static function CtrlSaisieNumerique($valeur, $avant, $apres = null)
    { // 27291
        if (is_null($apres)) { // 27291
            return (preg_match('/^[0-9]{1,' . $avant . '}([.]{1})$/', $valeur)); // 27291
        } else
            return (preg_match('/^[0-9]{1,' . $avant . '}([.]{1}[0-9]{1,' . $apres . '}){0,1}$/', $valeur));
    }

    /**
     * Fonction retournant l'expression régulière permettant de contrôler des quantités saisies
     * 
     * @param string $qte
     *            : quantité saisie par l'utilisateur
     * @return booelan
     */
    public static function CtrlPrix($prix, $nb_decimal = 2)
    {
        return (preg_match("/^[-]{0,1}[0-9]{1,13}([.]{1}[0-9]{1,{$nb_decimal}}){0,1}$/", $prix));
    }

    /**
     * Fonction contrôlant le format d'un champ numérique
     *
     * @param int $nombre
     *            : nombre à contrôler
     * @param int $nb_entier
     *            : nombre de chiffre pour la partie entière
     * @param int $nb_decimal
     *            : nombre de chiffre pour la partie décimale
     * @return boolean : true si ok false sinon
     */
    public static function CtrlFormatNumber($nombre, $nb_entier, $nb_decimal)
    {
        $expression = '/^[0-9]{0,' . $nb_entier . '}[.]?[0-9]{0,' . $nb_decimal . '}$/';
        return (preg_match($expression, $nombre) === 1);
    }

    /**
     * Fonction contrôlant la longueur d'une chaine de caractères
     *
     * @param string $chaine
     *            : chaine dont on contrôle la longueur
     * @param int $longueur_max
     *            : Longueur maxmimale de la chaine
     * @return boolean
     */
    public static function LengthControl($chaine, $longueur_max)
    {
        return (mb_strlen($chaine) <= $longueur_max);
    }

    /**
     * Fonction controlant si le format d'une heure est correct
     * Le format attendu est HH:MM
     *
     * @param string $heure
     * @return booelan
     */
    public static function IsHour($heure)
    {
        // return (ereg("^([0]{1}[0-9]{1})|([10-23]{1})[:]([0]{1}[0-9]{1})|([10-59]{1})$",$heure));
        $expression = '/^(2[0-3]|[01][0-9]):([0-5][0-9])$/';
        return (preg_match($expression, $heure) === 1);
    }

    /**
     * Fonction controlant si le format d'une heure est correct
     * Le format attendu est HH:MM:SS
     *
     * @param string $heure
     * @return booelan
     */
    public static function IsHourWithSecond($heure)
    {
        // return (ereg("^([0]{1}[0-9]{1})|([10-23]{1})[:]([0]{1}[0-9]{1})|([10-59]{1})$",$heure));
        $expression = '/^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])$/';
        return (preg_match($expression, $heure) === 1);
    }

    /**
     * Fonction contrôlant l'existence d'une donnée d'un type donné
     * Ex : ctrlExistData('SI', '00005') => Vérifie si la donnée 00005 existe dans la table des sections d'imputation
     *
     * @param string $type_data
     *            : Type de donnée
     * @param string $value_data
     *            : Valeur de la donnée
     * @return boolean : true si la donnée existe, false sinon
     */
    public static function ctrlExistData($type_data, $value_data)
    {
        $value_data['DATA_STRICT'] = ReplaceSqlPointeur($value_data['DATA_STRICT']);
        $result = SearchForBrowse::search($type_data, $value_data);
        
        return (is_array($result['resultat']) && count($result['resultat']) > 0);
    }

    //
    // Nouveau framework 2016
    //
    /**
     * Méthode getLongueurChamp(& $format)
     * renvoie la longueur du champ associée au format, i.e.
     * pour le $format 'AU60', renvoie '60'
     */
    public static function &getLongueurChamp(& $format)
    {
        $resultat = str_replace(array(
            'A',
            'U',
            'D',
            'N',
            'L',
            'C'
        ), '', $format);
        return $resultat;
    }

    /**
     * Méthode getTypeChamp(& $format)
     * renvoie le type du champ associé au format, i.e.
     * pour le $format 'AU60', renvoie 'AU'
     */
    public static function &getTypeChamp(& $format)
    {
        $resultat = str_replace(array(
            '0',
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
            '8',
            '9',
            '.'
        ), '', $format);
        return $resultat;
    }

    /**
     * Méthode checkValueFormat(& $format, & $valeur, & $context = null)
     * renvoie les infos de vérification de format pour la valeur ; le format est celui renvoyé par les wsdl (AU60, N5.2, etc...)
     * en sortie, un tableau qui contient 2 éléments
     * messageErreur
     * valeurModifiee
     */
    public static function &checkValueFormat(& $format, & $value)
    {
        $messageErreur = '';
        $valeurModifiee = '';
        
        if ('' != $format && '' != $value) {
            $typeValeur = ControleSaisie::GetTypeChamp($format);
            $lg_max = ControleSaisie::getLongueurChamp($format);
            switch ($typeValeur) {
                case 'AU':
                    $valeurModifiee = trim($value);
                    if (! ControleSaisie::LengthControl($value, $lg_max)) {
                        $messageErreur = Trad('La longueur du champ ne doit dépasser') . ' ' . $lg_max . ' ' . Trad('caractères') . '.';
                    } elseif (! ControleSaisie::checkAlphaNumUpper(str_replace(',','',str_replace('.','',$value)))) {
                        $messageErreur = Trad('Le champ ne doit comporter que des majuscules et des chiffres.');
                    }
                    break;
                case 'A':
                    $valeurModifiee = trim($value);
                    if (! ControleSaisie::LengthControl($value, $lg_max))
                        $messageErreur = strBuild(Trad('La longueur du champ ne doit dépasser @1@ caractères.'), $lg_max);
                    break;
                case 'D':
                    if ($value != '' && $value != '00000000' && ! ControleSaisie::isDateValideFormat($value))
                        $messageErreur = Trad('La date n\'est pas dans un format correct.');
                    else
                        $valeurModifiee = convertDateSqlToFr(convertDateUserToSql($value));
                    break;
                case 'NN': // Numérique avec négatif
                           // On enlève le signe négatif au cas où...
                    $signe = '';
                    $valueTmp = $value;
                    if (false !== strpos($valueTmp, '-')) {
                        $valueTmp = substr($valueTmp, 1);
                        $signe = '-';
                    }
                    $formatTmp = 'N' . $lg_max;
                    $result = ControleSaisie::checkValueFormat($formatTmp, $valueTmp);
                    $messageErreur = $result['messageErreur'];
                    $valeurModifiee = $result['valeurModifiee'];
                    if ('' != $valeurModifiee)
                        $valeurModifiee = $signe . $valeurModifiee;
                    break;
                case 'NC': // Numérique avec séparateur de milliers (Magic pour signifier "Commas")
                    $sepMilliers = Param::AllParamsGetValue('SEPARATEUR_MILLIERS');
                    $sepDecimales = Param::AllParamsGetValue('SEPARATEUR_DECIMALES');
                    $value = mb_str_replace(Param::AllParamsGetValue('SEPARATEUR_DECIMALES'), '.', mb_str_replace(Param::AllParamsGetValue('SEPARATEUR_MILLIERS'), '', $value));
                case 'N': // Numérique
                    if (false !== strpos($lg_max, '.'))
                        @list ($nb_entier, $nb_decimal) = explode('.', $lg_max);
                    else {
                        $nb_entier = $lg_max;
                        $nb_decimal = 0;
                    }
                    if (! ControleSaisie::CtrlFormatNumber($value, $nb_entier, $nb_decimal))
                        $messageErreur = Trad('Le nombre saisi n\' est pas correct.');
                    if ('NC' == $typeValeur) {
                        $valeurModifiee = number_format($value, $nb_decimal, $sepDecimales, $sepMilliers);
                    }
                    break;
            }
        }
        
        $resultat = array(
            'messageErreur' => $messageErreur,
            'valeurModifiee' => $valeurModifiee
        );
        return $resultat;
    }

    /**
     * Méthode checkValueObjet(& $objet, & $value, & $context = null)
     * renvoie les infos de vérification de format pour la valeur ; l'objet est le nom de la table associée (ex.:ARTICLES)
     * en sortie, un tableau qui contient 4 éléments
     * messageErreur
     * valeurModifiee
     * libelleValeur : le libellé associé à la valeur, par exemple le nom associé au code utilisateur
     * infosComplementaires : un enregistrement des infos complémentaires associées à la valeur, par exemple le SIRET pour une société
     */
    public static function &checkValueObjet(& $objet, & $value, & $context = null)
    {
        $valeurModifiee = '';
        $libelleValeur = '';
        $messageErreur = '';
        $infosComplementaires = null;
        
        if ('' != $objet && '' != $value) {
            switch ($objet) {
                case 'COUNTRY':
                    if (! ($reqSql = SqlFrs::rqGetRecordCountry($value)->Trouve1()))
                        $messageErreur = Trad('Le pays choisi est inconnu.');
                    else
                        $libelleValeur = $reqSql['LIBELLE'];
                    break;
                case 'LANGUES':
                    if (! ($reqSql = SqlUsers::rqLangues($value)->Trouve1()))
                        $messageErreur = Trad('La langue choisie est inconnue.');
                    else
                        $libelleValeur = $reqSql['LIBELLE'];
                    break;
                case 'HASTUTIL':
                    if (! ($reqSql = SqlUsers::rqGetInfoUser($value)->Trouve1()))
                        $messageErreur = Trad('L\'utilisateur choisi est inconnu.');
                    else {
                        $libelleValeur = $reqSql['NOM'];
                        $valeurModifiee = $reqSql['CODE'];
                    }
                    break;
                case 'CONDPAIE':
                    if (! ($reqSql = SqlFrs::rqSelectAllCDP($value)->Trouve1()))
                        $messageErreur = Trad('La condition de paiement choisie est inconnue.');
                    else {
                        $libelleValeur = $reqSql['Libelle'];
                        $valeurModifiee = $reqSql['Code'];
                    }
                    break;
                case 'MODEPAIE':
                    if (! ($reqSql = SqlFrs::rqSelectAllMDP($value)->Trouve1()))
                        $messageErreur = Trad('Le mode de paiement choisi est inconnu.');
                    else {
                        $libelleValeur = $reqSql['Libelle'];
                        $valeurModifiee = $reqSql['Code'];
                    }
                    break;
                case 'MODELIVR':
                    if (! ($reqSql = SqlFrs::rqSelectAllMDL($value)->Trouve1()))
                        $messageErreur = Trad('Le mode de livraison choisi est inconnu.');
                    else {
                        $libelleValeur = $reqSql['Libelle'];
                        $valeurModifiee = $reqSql['Code'];
                    }
                    break;
                case 'DEVISE':
                    if (! ($reqSql = SqlPanier::rqSqlTableDevise($value)->Trouve1()))
                        $messageErreur = Trad('La devise choisie est inconnue.');
                    else
                        $libelleValeur = $reqSql['LIBELLE'];
                    break;
                case 'TTV':
                    $array_filters['CODE_TTV'] = $value;
                    if (! ($reqSql = SqlParam::rqPopupGetAllTypeTVA($array_filters, true)->Trouve1()))
                        $messageErreur = Trad('Le type de TVA choisi est inconnu.');
                    else
                        $libelleValeur = $reqSql['LIBELLE'];
                    break;
                case 'ARTICLES':
                    $array_filters['DATA_STRICT'] = $value;
                    if (! ($reqSql = SqlArticle::rqPopupGetAllArticlesHaplus($array_filters, true)->Trouve1()))
                        $messageErreur = Trad('L\'article choisi est inconnu.');
                    else
                        $libelleValeur = $reqSql['DES_ART'];
                    break;
                case 'REGROUPF':
                    
                    break;
                case 'SOCIETES_USER':
                case 'SOCIETE':
                    if ('' != $value) {
                        $array_filters['CODE_STE'] = $value;
                        $array_filters['DATA_STRICT'] = $value;
                        $infosSociete = & SqlSociete::rqPopupGetAllSocieteForUser($array_filters, true)->Trouve1();
                    }
                    if (is_null($infosSociete)) {
                        $messageErreur = Trad('La société choisie n\'est pas valide.');
                    } else {
                        $libelleValeur = $infosSociete['RAIS_SOC'];
                        $valeurModifiee = $infosSociete['CODE_STE'];
                        $infosComplementaires = & $infosSociete;
                    }
                    break;
                case 'GROUPSOC':
                    if ('' != $value) {
                        $array_filters['CODE_GRP'] = $value;
                        // $array_filters['DATA_STRICT'] = $value;
                        $infosGrpSociete = SqlSociete::rqPopupGetAllGroupeSocieteForUser($array_filters, true)->Trouve1();
                    }
                    if (is_null($infosGrpSociete)) {
                        $messageErreur = Trad('Le groupe société choisi n\'est pas valide.');
                    } else {
                        $libelleValeur = $infosGrpSociete['RS_GRP'];
                        $infosComplementaires = & $infosGrpSociete;
                    }
                    break;
                case 'CENTRE_E':
                    if ('' != $value) {
                        $array_filters['CODE_CTR'] = $value;
                        $array_filters['relevance'] = 'strict';
                        if (is_array($context) && ! is_null($context)) {
                            $array_filters['GRPSOC'] = $context['TypeGrpSoc'];
                            $array_filters['GROUPE'] = $context['CodeGrp'];
                            $array_filters['CODE_STE'] = $context['CodeSoc'];
                        }
                        
                        $infosGrpCentreEmet = SqlCentre::rqPopupGetAllCentreEmetteur($array_filters, 'CENTRE_E', true)->Trouve1();
                    }
                    if (is_null($infosGrpCentreEmet)) {
                        $messageErreur = Trad('Le centre émetteur choisi n\'est pas valide.');
                    } else {
                        $libelleValeur = $infosGrpCentreEmet['RAIS_SOC'];
                        $value = $infosGrpCentreEmet['CODE_CTR'];
                        $infosComplementaires = & $infosGrpCentreEmet;
                    }
                    break;
                case 'CENTRE_L':
                case 'CENTRE_R':
                    if ('' != $value) {
                        $array_filters['CODE_CTR'] = $value;
                        $array_filters['relevance'] = 'strict';
                        $contexteWhere = null;
                        if ($context instanceof ContexteWhereDynamic) {
                            $contexteWhere = & $context;
                        } else if (is_array($context) && ! is_null($context)) {
                            $array_filters['GRPSOC'] = $context['TypeGrpSoc'];
                            $array_filters['GROUPE'] = $context['CodeGrp'];
                            $array_filters['CODE_STE'] = $context['CodeSoc'];
                        }
                        $infosGrpCentreLivr = SqlCentre::rqPopupGetAllCentreLivraison($array_filters, true, null, $contexteWhere)->Trouve1();
                    }
                    if (is_null($infosGrpCentreLivr)) {
                        $messageErreur = Trad('Le centre de livraison choisi n\'est pas valide.');
                    } else {
                        $libelleValeur = $infosGrpCentreLivr['RAIS_SOC'];
                        $value = $infosGrpCentreLivr['CODE_CTR'];
                        $infosComplementaires = & $infosGrpCentreLivr;
                    }
                    break;
                
                case 'SI':
                    if ('' != $value) {
                        $array_filters['CODE_SI'] = $value;
                        $array_filters['relevance'] = 'strict';
                        if ($context instanceof ContexteWhereDynamic) {
                            $contexteWhere = & $context;
                            $array_filters['GRPSOC'] = 'soc';
                            $array_filters['CODE_STE'] = $contexteWhere->getProperties('CODE_STE');
                        } elseif (is_array($context) && ! is_null($context)) {
                            $array_filters['GRPSOC'] = $context['TypeGrpSoc'];
                            $array_filters['GROUPE'] = (array_key_exists('CodeGrp', $context)) ? $context['CodeGrp'] : '';
                            $array_filters['CODE_STE'] = $context['CodeSoc'];
                        }
                        $infoSI = SqlSi::rqPopupGetAllSI(null, $array_filters, true)->Trouve1();
                    }
                    if (is_null($infoSI)) {
                        $messageErreur = Trad('La section d\'imputation choisie n\'est pas valide.');
                    } else {
                        $libelleValeur = $infoSI['LIBELLE'];
                        $infosComplementaires = & $infoSI;
                    }
                    break;
                
                case 'CDC':
                    if ('' != $value) {
                        $array_filters['DATA_STRICT'] = $value;
                        if ($context instanceof ContexteWhereDynamic) {
                            $contexteWhere = & $context;
                            $array_filters['GRPSOC'] = 'soc';
                            $array_filters['CODE_STE'] = $contexteWhere->getProperties('CODE_STE');
                        } elseif (is_array($context) && ! is_null($context)) {
                            $array_filters['GRPSOC'] = $context['TypeGrpSoc'];
                            $array_filters['GROUPE'] = $context['CodeGrp'];
                            $array_filters['CODE_STE'] = $context['CodeSoc'];
                        }
                        $infoCDC = SqlSi::rqPopupGetAllCDC(null, $array_filters, $context, true)->Trouve1();
                    }
                    if (is_null($infoCDC)) {
                        $messageErreur = Trad('Le code complémentaire choisi n\'est pas valide.');
                    } else {
                        $libelleValeur = $infoCDC['LIBELLE'];
                        $infosComplementaires = & $infoCDC;
                    }
                    break;
                
                case 'SCA':
                    if ('' != $value) {
                        $array_filters['DATA_STRICT'] = $value;
                        if ($context instanceof ContexteWhereDynamic) {
                            $contexteWhere = & $context;
                            $array_filters['GRPSOC'] = 'soc';
                            $array_filters['CODE_STE'] = $contexteWhere->getProperties('CODE_STE');
                        } elseif (is_array($context) && ! is_null($context)) {
                            $array_filters['GRPSOC'] = $context['TypeGrpSoc'];
                            $array_filters['GROUPE'] = $context['CodeGrp'];
                            $array_filters['CODE_STE'] = $context['CodeSoc'];
                        }
                   
                        $infoSCA = SqlSi::rqPopupGetAllSCA(null, $array_filters, true)->Trouve1();
                    }
                    if (is_null($infoSCA)) {
                        $messageErreur = Trad('Le sous-compte d\'analyse choisi n\'est pas valide.');
                    } else {
                        $libelleValeur = $infoSCA['LIBELLE'];
                        $infosComplementaires = & $infoSCA;
                    }
                    break;
                
                case 'SsFam':
                    if ('' != $value) {
                        $array_filters['DATA_STRICT'] = $value;
                        $infoSFA = SqlInfo::rqPopupGetAllSousFamillesAchat($array_filters, true, NULL)->Trouve1();
                    }
                    if (is_null($infoSCA)) {
                        $messageErreur = Trad('La sous-famille choisie n\'est pas valide.');
                    } else {
                        $libelleValeur = $infoSFA['DESIGNAT'];
                        $infosComplementaires = & $infoSFA;
                    }
                    break;
                case 'TYPDOC':
                    if ('' != $value) {
                        $array_filters['DATA_STRICT'] = $value;
                        $infoTypdoc = SqlInfo::rqPopupGetAllTypesDocument($array_filters, true)->Trouve1();
                    }
                    if (is_null($infoTypdoc)) {
                        $messageErreur = Trad('Le type de document choisi n\'est pas valide.');
                    } else {
                        $libelleValeur = $infoTypdoc['LIBELLE'];
                        $infosComplementaires = & $infoTypdoc;
                    }
                    break;
                
                case 'FOURNISS':
                    $infoFournisseur = SqlFrs::rqGetFournisseurAllColonne($value)->Trouve1();
                    if (is_null($infoFournisseur)) {
                        $messageErreur = Trad('Le fournisseur choisi n\'est pas valide.');
                    } else {
                        $libelleValeur = $infoFournisseur['RS'];
                        $infosComplementaires = & $infoFournisseur;
                    }
                    break;
                
                case 'ADRFOU':
                    // select * from ADRFOURN
                    break;
            }
        }
        $resultat = array(
            'valeurModifiee' => & $valeurModifiee,
            'libelleValeur' => & $libelleValeur,
            'messageErreur' => & $messageErreur,
            'infosComplementaires' => & $infosComplementaires
        );
        return $resultat;
    }

    /**
     * Méthode checkValue(& $format, & $objet, & $value, & $context = null)
     * renvoie les infos de vérification de format et d'objet pour la valeur ; effectue un checkValueFormat et un checkValueObjet
     * en sortie, un tableau qui contient 4 éléments
     * messageErreur
     * valeurModifiee
     * libelleValeur : le libellé associé à la valeur, par exemple le nom associé au code utilisateur
     * infosComplementaires : un enregistrement des infos complémentaires associées à la valeur, par exemple le SIRET pour une société
     */
    public static function &checkValue(& $format, & $objet, & $value, & $context = null)
    {
        $valeurModifiee = '';
        $libelleValeur = '';
        $messageErreur = '';
        $infosComplementaires = null;
        
        if ('' != $format && $value != '') {
            $infosFormat = ControleSaisie::checkValueFormat($format, $value);
            $valeurModifiee = $infosFormat['valeurModifiee'];
            $messageErreur = $infosFormat['messageErreur'];
            if ('D' == $format) {
                $libelleValeur = $valeurModifiee;
            }
        }
        
        if ('' == $messageErreur && '' != $objet && '' != $value) {
            $infosObjet = ControleSaisie::checkValueObjet($objet, $value, $context);
            
            $valeurModifiee = $infosObjet['valeurModifiee'];
            $libelleValeur = $infosObjet['libelleValeur'];
            $messageErreur = $infosObjet['messageErreur'];
            $infosComplementaires = $infosObjet['infosComplementaires'];
        }
        
        $resultat = array(
            'valeurModifiee' => & $valeurModifiee,
            'libelleValeur' => & $libelleValeur,
            'messageErreur' => & $messageErreur,
            'infosComplementaires' => & $infosComplementaires
        );
        return $resultat;
    }
}//fin class
