<?php

class SqlUsers
{
    

    /**
     * function renvoyant une requete sql de la liste des utilisateurs demandeeur (Fonction de transfert de DA)
     * 
     * @param
     *            char ident login de l'utilisateur connecté
     * @param
     *            char cod_ste code de la societe de l'utilisateur
     * @param
     *            char cod_rech code de la recherche
     * @param
     *            char lib_rech libelle de la recherche
     * @param
     *            boolean methode true exact / false liste
     * @return char la requete sql
     */
    
    
    public static function getListeUsersDemandeur($ident, $cod_ste, $cod_rech, $lib_rech, $methode)
    {
        // On récupère la liste des utilisateurs enregistré dans la table oxa_users pour le transferts de panier
        $sql = 'SELECT login from oxa_users with (nolock) ';
        if ($cod_rech) {
            $sql .= " where login = ".'\'' . ReplaceSqlPointeur($cod_rech) . '\'';
        }
        
        $result = (new RequeteSQL($sql, DB_OXAPROCDB))->TrouveTous();
        $nbRes = count($result);
        if (!$result) {
            return new RequeteSQL($sql, DB_OXAPROCDB);
        }
        
        $listeUser = '';
        for ($i = 0; $i < $nbRes; $i ++)
            if ($i == 0)
                $listeUser .= '\'' . ReplaceSqlPointeur($result[$i]['login']) . '\'';
            else
                $listeUser .= ',' . '\'' . ReplaceSqlPointeur($result[$i]['login']) . '\'';
        
        if ($listeUser != '')
            $ajout = "AND CODE in (" . $listeUser . ") ";
        else
            $ajout = '';
        
        if ($methode) { // Recherche exacte
            $sql = "SELECT CODE AS Code, NOM AS Libelle from HASTUTIL with (nolock) WHERE DEMAND = 0x54 AND CODE_STE = '" . ReplaceSqlPointeur($cod_ste) . "' AND CODE <> '" . ReplaceSqlPointeur($ident) . "' AND ACCOXAPR = 0x54 " . ($cod_rech == '' ? '' : " AND CODE = '" . ReplaceSqlPointeur($cod_rech) . "' ") . "";
            $sql .= $ajout;
        } else {
            $sql = "SELECT CODE AS Code, NOM AS Libelle from HASTUTIL with (nolock) WHERE DEMAND = 0x54 AND CODE_STE = '" . ReplaceSqlPointeur($cod_ste) . "' AND CODE <> '" . ReplaceSqlPointeur($ident) . "' AND ACCOXAPR = 0x54 " . ($cod_rech == '' ? '' : " AND CODE LIKE '%" . ReplaceSqlPointeur($cod_rech) . "%' ") . ($lib_rech == '' ? '' : " AND upper(NOM) LIKE '%" . ReplaceSqlPointeur($lib_rech) . "%' ") . "";
            $sql .= $ajout;
        }
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqInfoUsers(& $id_user)
    {
        $sql = 'SELECT * from oxa_users with (nolock) where oxa_users.id_user = ' . ReplaceSqlPointeur($id_user);
        
        return new RequeteSQL($sql, DB_OXAPROCDB);
    }

    public static function rqInfoUserByLogin(& $login)
    {
        $sql = "SELECT * from oxa_users with (nolock) where login = upper('" . ReplaceSqlPointeur($login) . "') ";
        return new RequeteSQL($sql, DB_OXAPROCDB);
    }

    public static function getPanierUser_SYS()
    {
        $sql = 'SELECT * from oxa_users_panier with (nolock) ' . "where oxa_users_panier.id_user   = {$_SESSION['id_user']} " . "and   oxa_users_panier.id_panier = {$_SESSION['id_panier']}";
        return new RequeteSQL($sql, DB_OXAPROCDB);
    }

    public static function rqIsSaisiePrixNullOk()
    {
        $sql = "
            SELECT
                LIB01PARV
            from
                PARAVRAC with (nolock)
            where
                TYPEPARV='OXAPROC'
                and CODEPARV='SAISIE_PRIX_SI_NUL'
        ";

        $cacheName = __FUNCTION__;

        return \SqlWincache::getSql($cacheName, $sql);
    }

    public static function rqIsAuditActif()
    {
        return SqlParam::rqGetParamParavrac('OXA_AUDIT', 'OXAPROC');
    }

    /**
     * Spec 3369
     *
     * @param string $codeLangue
     * @return RequeteSQL
     */
    public static function rqLangues($codeLangue = null)
    {
        $sql = 'SELECT * from LANGUES with (nolock) ' . (is_null($codeLangue) ? '' : 'where COD_LNG = \'' . ReplaceSqlPointeur($codeLangue) . '\' ') . 'order by LIBELLE'; // EDP Spec 3369
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de sélectionner la liste des sociétés valides
     *
     * @param string $code
     *            : Code société recherché
     * @param string $libelle
     *            : Libellé société recherché
     * @return string sql : Requête SQL
     */
    public static function rqListSociete($code = '', $libelle = '')
    {
        $sql = 'SELECT distinct(CODE_STE) as Code, RAIS_SOC as Libelle from SOCIETE with (nolock) ' . 'where (DTEVALMAX >= CONVERT(char(8),GETDATE(),112) OR DTEVALMAX = 0) and (DTEVALMIN <= CONVERT(char(8),GETDATE(),112) OR DTEVALMIN = 0)';
        if ($code != '')
            $sql .= " and upper(CODE_STE) LIKE upper('%" . ReplaceSqlPointeur($code) . "%')";
        if ($libelle != '')
            $sql .= " and upper(RAIS_SOC) LIKE upper('%" . ReplaceSqlPointeur($libelle) . "%')";
        $sql .= ' order by RAIS_SOC ';
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de sélectionner la liste des sociétés auxquelles l'utilisateur a accès.
     * Cette requête tient compte du profil utilisateur : Si l'utilisateur est multisociété alors toutes les sociétés sont retournées, sinon seules la liste des sociétés autorisées est retournée
     *
     * @param string $code
     *            : Code société recherché
     * @param string $libelle
     *            : Libellé société recherché
     * @return string sql : Requête SQL
     */
    public static function rqListSocieteForUser($codeUtilisateur, $code = '', $libelle = '', $testerValiditeSociete = true, $strict = false)
    {
        $sql = 'SELECT distinct(CODE_STE) as Code, RAIS_SOC as Libelle from SOCIETE with (nolock) where 1=1 ';
        $sqlDate = '';
        if ($testerValiditeSociete) {
            $sql .= ' and (DTEVALMAX >= CONVERT(char(8),GETDATE(),112) OR DTEVALMAX = 0) and (DTEVALMIN <= CONVERT(char(8),GETDATE(),112) OR DTEVALMIN = 0) ';
        }
        if ($code != '') {
            if ($strict)
                $sql .= " and upper(CODE_STE) = upper('" . ReplaceSqlPointeur($code) . "')";
            else
                $sql .= " and upper(CODE_STE) LIKE upper('%" . ReplaceSqlPointeur($code) . "%')";
        }
        
        if ($libelle != '')
            $sql .= " and upper(RAIS_SOC) LIKE upper('%" . ReplaceSqlPointeur($libelle) . "%')";
        $sql .= " and CODE_STE in ( SELECT SOC_USR.COD_STE from SOC_USR with(nolock), HASTUTIL with(nolock)  where  (" . (($codeUtilisateur != 'OXAUSER' && $codeUtilisateur != 'ADMIN') ? " SOC_USR.COD_USR 	= upper('" . ReplaceSqlPointeur($codeUtilisateur) . "') and " : '') . "HASTUTIL.CODE   = SOC_USR.COD_USR and HASTUTIL.UTIMULTI 	    = 0x46 )
				UNION 	SELECT distinct(SOCIETE.CODE_STE) from SOCIETE with(nolock), HASTUTIL with(nolock) 
						where  HASTUTIL.UTIMULTI 	    = 0x54 " . (($codeUtilisateur != 'OXAUSER' && $codeUtilisateur != 'ADMIN') ? "and HASTUTIL.CODE = upper('" . ReplaceSqlPointeur($codeUtilisateur) . "') " : '') . " UNION	SELECT HASTUTIL.CODE_STE from HASTUTIL  with(nolock) " . (($codeUtilisateur != 'OXAUSER' && $codeUtilisateur != 'ADMIN') ? "where HASTUTIL.CODE = upper('" . ReplaceSqlPointeur($codeUtilisateur) . "')" : '') . ')';
        $sql .= ' order by RAIS_SOC ';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqGetInfoSTE(& $ste)
    {
        $sql = "SELECT CODE_STE, RAIS_SOC, SUIVI_BPA from SOCIETE with (nolock) where (DTEVALMAX >= CONVERT(char(8),GETDATE(),112) OR DTEVALMAX = 0) AND  (DTEVALMIN <= CONVERT(char(8),GETDATE(),112) OR DTEVALMIN = 0) AND CODE_STE = '" . ReplaceSqlPointeur($ste) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqListFonction($code = '')
    {
        $sql = 'SELECT FONCTION as Code from FONCUSR with (nolock)';
        if ($code != '')
            $sql .= " where upper(FONCTION) LIKE upper('%" . ReplaceSqlPointeur($code) . "%')";
        
        $sql .= ' order by FONCTION';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqGetOneFonction($code)
    {
        $sql = "SELECT FONCTION from FONCUSR with (nolock) where FONCTION = '" . ReplaceSqlPointeur($code) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqListSupHie($ste, $code = '', $libelle = '')
    {
        $sql = 'SELECT CODE as Code, NOM as Libelle, USRSUPHIE, UTIMULTI from HASTUTIL with (nolock) ' . "where (CODE_STE = ' " . ReplaceSqlPointeur($ste) . " ' or UTIMULTI = 0x54) and USRSUPHIE=0x54 ";
        
        if ($code != '')
            $sql .= " and upper(CODE) LIKE upper('%" . ReplaceSqlPointeur($code) . "%') ";
        
        if ($libelle != '')
            $sql .= " and upper(NOM) LIKE upper('%" . ReplaceSqlPointeur($libelle) . "%') ";
        
        $sql .= 'order by NOM';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqGetSupHier(& $ste, & $code)
    {
        $sql = "SELECT CODE, NOM, USRSUPHIE, UTIMULTI from HASTUTIL with (nolock)
			where (CODE_STE = '" . ReplaceSqlPointeur($ste) . "' or UTIMULTI = 0x54) and USRSUPHIE=0x54
			and CODE = '" . ReplaceSqlPointeur($code) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function reqGetSupHier($codeUO)
    {
        $sql = "SELECT RESP_HIER from UO with (nolock)
			where CODE_UO = '" . ReplaceSqlPointeur($codeUO) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }
    
    /**
     *
     * @param unknown $centre
     * @param unknown $societe
     * @param string $typeCodeSte
     *            S pour societe / G pour egroupe de société
     * @return RequeteSQL
     */
    public static function rqCentreEmet(& $centre, & $societe, $typeCodeSte = 'S')
    {
        $sql = 'SELECT ltrim(rtrim(CODE_CTR)) as CODE, RAIS_SOC as NOM, ADRESSE' . ' from CENTRE with (nolock)' . " where CODE_CTR = '" . ReplaceSqlPointeur($centre) . "' ";
        if ($typeCodeSte == 'S')
            $sql .= " and CODE_STE ='" . ReplaceSqlPointeur($societe) . "' ";
        else if ($typeCodeSte == 'G')
            $sql .= " and CODE_STE IN (SELECT CODE_STE from SOCIETE with (nolock) where GROUPE = '" . ReplaceSqlPointeur($societe) . "') ";
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqGetAllCountry()
    {
        $sql = 'SELECT * from COUNTRY with (nolock) order by LIBELLE';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     *
     * @param unknown $centre_liv
     * @param unknown $societe
     * @param string $array
     * @param string $typeCodeSte
     *            S pour societe / G pour egroupe de société
     * @return RequeteSQL
     */
    public static function rqCentreLivr(& $centre_liv, & $societe, $array = null, $typeCodeSte = 'S')
    {
        $sql = ' SELECT ltrim(rtrim(CODE_CTR)) as CODE, upper(rtrim(ltrim(RAIS_SOC))) as NOM, rtrim(ltrim(ADRESSE)) ' . ' from CENTRE with (nolock) ' . " where CODE_CTR = '" . ReplaceSqlPointeur($centre_liv) . "' ";
        
        // SPEC 3440 Restriction supplementaire sur la notion emetteur
        if (CLT_SPAC == $_SESSION['Session_NumClient']) {
            if (is_array($array) && $array['CODE_SI'] == $centre_liv)
                $sql .= ' and LIVRAISON = 0x54 ';
            else
                $sql .= ' and EMISSION = 0x54  and LIVRAISON = 0x54 ';
        } else
            $sql .= ' and LIVRAISON = 0x54 ';
        
        if ($typeCodeSte == 'S')
            $sql .= " and CODE_STE ='" . ReplaceSqlPointeur($societe) . "' ";
        else if ($typeCodeSte == 'G')
            $sql .= " and CODE_STE IN (SELECT CODE_STE from SOCIETE with (nolock) where GROUPE = '" . ReplaceSqlPointeur($societe) . "') ";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    // modification de la requete pour le dossier 28573
    public static function rqOneSiteStock($site_stk, $societe = '')
    {
        $sql = "SELECT SITE as CODE, DESIGN as NOM, ADR as ADRESSE from SSITESTO with (nolock) where SITE ='" . ReplaceSqlPointeur($site_stk) . '\' AND (SIST_DTE_FERM > \''.date('Ymd').'\' OR SIST_DTE_FERM = \'0000000\'  or SIST_DTE_FERM= \'00000000\' or SIST_DTE_FERM=\'\' )';
        if ($societe != '')
            $sql .= " and CODE_STE = '" . ReplaceSqlPointeur($societe) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant pour un responsable hierarchique l'ensemble des collaborateurs rattachés
     * 
     * @param $login :
     *            tableau contenant les logins des responsables => tableau utilisé dans le cadre de la délégation
     */
    public static function getAllCollabForOneRespHie(& $login)
    {
        $sql = "SELECT HASTUTIL.CODE, HASTUTIL.NOM, HASTUTIL.CODE_STE from HASTUTIL with(nolock)
				where HASTUTIL.SUPHIER = '" . ReplaceSql(strtoupper($login)) . "'
				UNION
				SELECT HASTUTIL.CODE, HASTUTIL.NOM, HASTUTIL.CODE_STE  from HASTUTIL with(nolock),UO with(nolock)
				where HASTUTIL.CODE_UO = UO.CODE_UO
				and UO.RESP_HIER = '" . ReplaceSqlPointeur($login) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete récupérant l'ensemble des informations pour un user donné
     * 
     * @param $code :
     *            login de l'utilisateur recherché
     */
    public static function rqGetInfoUser(& $code)
    {
        $sql = ' SELECT HASTUTIL.*, DILISPEC.LIB01DICO as SIGNAT_DA_FAV from HASTUTIL with (nolock) ' . " left outer join DILISPEC with (nolock) on CODEDICO = HASTUTIL.CODE and DILISPEC.TYPEDICO = 'ETDESDAFAV' " . " where HASTUTIL.CODE = '" . ReplaceSql(strtoupper($code)) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete permettant de savoir si un compte existe pour une adresse mail donnée
     * 
     * @param $mail :
     *            adresse mail dont l'existence est testée
     */
    public static function rqCompteExist(& $mail, $login)
    {
        $sql = "SELECT * from HASTUTIL with (nolock) where EMAIL = '" . ReplaceSqlPointeur($mail) . '\'';
        if ($login != '')
            $sql .= " and CODE !='" . strtoupper(ReplaceSqlPointeur($login)) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete permettant de savoir si une demande existe déjà avec cette adresse mail
     * 
     * @param $mail :
     *            adresse mail dont l'existence est testée
     */
    public static function rqDemandeCompteExist(& $mail, $code)
    {
        // Dossier 27236 : on supprime la condition sur and CREATMOD='C'
        $sql = "SELECT * from UTILCREAT with (nolock) where EMAIL = '" . ReplaceSqlPointeur($mail) . "' ";
        if ($code != '')
            $sql .= " and CODE != $code";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction permettant de renvoyer les domaines fonctionnels d'un utilisateur
     *
     * @param string $cod_usr
     * @return string commande sql
     */
    public static function rqLstDomFonctUserTmp($mode, $code_demande)
    {
        // On sélectionne tous les domaines fonctionnels que l'utilisateur a sélectionné lors de sa demande
        if ($mode == 'user')
            $sql = ' SELECT DOMFONCT.* from UTDFCREAT with (nolock) , DOMFONCT with (nolock) ' . " where UTDFCREAT.REFDEM   = '" . ReplaceSqlPointeur($code_demande) . "' " . ' and   UTDFCREAT.CODE_DFO = DOMFONCT.CODE ';
        
        // On sélectionne tous les domaines fonctionnels non associé à la demande de l'utilisateur
        elseif ($mode == 'userLeft')
            $sql = ' SELECT DOMFONCT.* from DOMFONCT with (nolock) ' . ' where DOMFONCT.CODE not in ' . ' (  SELECT UTDFCREAT.CODE_DFO from UTDFCREAT with (nolock) , DOMFONCT with (nolock) ' . "	where UTDFCREAT.REFDEM   = '" . ReplaceSqlPointeur($code_demande) . "' )";
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete permettant de connaitre les backups pour un utilisateur donné
     *
     * @param string $login
     *            : Login de l'utilisateur qui appelle la liste des backups
     * @param string $code_usr
     *            : Code utilisateur recherché parmis les backups
     * @param string $nom_usr
     *            : Nom de l'utilisateur recherché parmis les backups
     * @return string $sql : requete sql retournée
     */
    public static function rqGetBackupForUser(& $login)
    {
        $sql = " SELECT USRBACK.COD_USR, USRBACK.COD_BAC, USRBACK.ACHAT, USRBACK.SUPHIER, HASTUTIL.NOM, HASTUTIL.CODE_STE, SOCIETE.RAIS_SOC  from USRBACK with(nolock)
				 left outer join HASTUTIL with(nolock) on HASTUTIL.CODE  	= USRBACK.COD_BAC
				 left outer join SOCIETE with(nolock) on SOCIETE.CODE_STE  	= HASTUTIL.CODE_STE
				 where COD_USR = '" . ReplaceSql(strtoupper($login)) . "'
				 order by COD_BAC ";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete sélectionnant les utilisateurs pour lesquel l'utilisateur passé en paramètre est le backup
     *
     * @param string $login
     * @return string $sql
     */
    public static function rqGetListeUserBackupOf(& $login)
    {
        $sql = " SELECT USRBACK.COD_USR, USRBACK.COD_BAC, USRBACK.ACHAT, USRBACK.SUPHIER, HASTUTIL.NOM, HASTUTIL.CODE_STE, SOCIETE.RAIS_SOC  from USRBACK with(nolock)
				 left outer join HASTUTIL with(nolock) on HASTUTIL.CODE  	= USRBACK.COD_USR
				 left outer join SOCIETE with(nolock) on SOCIETE.CODE_STE  	= HASTUTIL.CODE_STE
				 where COD_BAC = '" . ReplaceSql(strtoupper($login)) . "'
				 order by COD_USR";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete permettant de connaitre les types de backup pour un utilisateur et le backup donné
     * 
     * @param string $user
     *            : code de l'utilisateur qui a sélectionné le backup
     * @param string $backup
     *            : code de l'utilisateur jouant le rôle de backup
     * @return string $sql
     */
    public static function rqGetTypeBackupForUser($user, $backup)
    {
        $sql = ' SELECT * from USRBACK with(nolock) where COD_BAC = \'' . ReplaceSql(strtoupper($backup)) . "' and COD_USR = '" . ReplaceSql(strtoupper($user)) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete permettant pour un utilisateur donné de lister les utilisateurs pouvant être désigné comme backup soit backup acheteur soit backup responsable hierarchique
     * Ces backups sotn de la même société ou bien sont multisociétés
     *
     * @param string $login
     *            : login de l'utilisateur connecté
     * @param string $code_usr
     *            : code utilisateur recherché
     * @param string $nom_usr
     *            : nom de l'utilisateur recherché
     * @return string $sql
     */
    public static function rqGetListeUserForBackup($login, $code_usr = '', $nom_usr = '')
    {
        $sql = " SELECT CODE, NOM, FONCTION, ADMLOCAL, ADMCENTR, EMAIL, UTIMULTI, HASTUTIL.CODE_STE, DEMAND, USRSUPHIE, SOCIETE.RAIS_SOC
				from  HASTUTIL with(nolock)
				left outer join SOCIETE with(nolock) on SOCIETE.CODE_STE  = HASTUTIL.CODE_STE
				where HASTUTIL.CODE !='" . ReplaceSql(strtoupper($login)) . "'
				and (HASTUTIL.CODE_STE = (SELECT tb_user.CODE_STE from HASTUTIL tb_user with(nolock) where tb_user.CODE='" . ReplaceSql(strtoupper($login)) . "') or UTIMULTI = 0x54)
				and  HASTUTIL.CODE not in (SELECT COD_BAC from USRBACK with(nolock) where COD_USR = '" . ReplaceSql(strtoupper($login)) . "' AND USRBACK.COD_BAC = HASTUTIL.CODE) 
				   and  HASTUTIL.ACCOXAPR  = 0x54 
				 and (HASTUTIL.DTE_FERM = '00000000' or HASTUTIL.DTE_FERM >= CONVERT(VARCHAR,GETDATE(),112))
				 and (HASTUTIL.DTE_OUV  = '00000000' or HASTUTIL.DTE_OUV  <= CONVERT(VARCHAR,GETDATE(),112))";
        
        if ($code_usr != '')
            $sql .= " and upper(CODE) LIKE upper('%" . ReplaceSql(strtoupper($code_usr)) . "%')";
        
        if ($nom_usr != '')
            $sql .= " and upper(NOM) LIKE upper('%" . ReplaceSqlPointeur($nom_usr) . "%')";
        
        $sql .= ' order by NOM, CODE';
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete permettant de savoir si un utilisateur donné peut être backup d'un autre utilisateur donné
     *
     * @param string $login
     *            : login de l'utilisateur pour lequel on vérifie que le backup proposé est valide
     * @param string $login_backup
     *            : login du backup proposé
     * @return string sql : requete SQL
     */
    public static function rqIsUserForBackup($login, $login_backup)
    {
        // Dossier 26189 : on ajoute la condition d'accès à Oxaproc et le fait que l'utilisateur soit actif
        $sql = " SELECT *
				from  HASTUTIL with(nolock)
				left outer join SOCIETE with(nolock) on SOCIETE.CODE_STE  = HASTUTIL.CODE_STE
				where HASTUTIL.CODE !='" . ReplaceSql(strtoupper($login)) . "'
				and (HASTUTIL.CODE_STE = (SELECT tb_user.CODE_STE from HASTUTIL tb_user with(nolock) where tb_user.CODE='" . ReplaceSql(strtoupper($login)) . "') or UTIMULTI = 0x54)
				and  HASTUTIL.CODE = '" . ReplaceSql(strtoupper($login_backup)) . "'
				and  '" . ReplaceSql(strtoupper($login)) . "' not in (SELECT COD_BAC from USRBACK with(nolock) where COD_USR = '" . ReplaceSql(strtoupper($login)) . "' )
				and HASTUTIL.ACCOXAPR = 0x54
				and (HASTUTIL.DTE_OUV = '00000000' or HASTUTIL.DTE_OUV <=convert(char(8), GETDATE(), 112)) and (DTE_FERM = '00000000' or DTE_FERM >= convert(char(8), GETDATE(), 112))
				order by CODE";
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     *
     * @author Eric Carles
     * @version 1.0 du 28/12/2007
     *         
     *          Section de requete liée à la récupération du paramétrage du workflow de signature lié à la spéc 2173
     */
    
    /**
     *
     * @author Eric Carles
     * @version 1.0 du 28/12/2007
     *         
     *          Fonction retournant la requete permettant de savoir si l'option "Recevoir des e-mails de relance pour mes signatures de comandes en attente" est activée
     *          pour un utilisateur donné
     *         
     * @param string $code_user
     *            : code de l'utilisateur
     * @return string sql requete
     */
    public static function rqIsMailRelSigCdeActive($code_user, $mode = "S")
    {
        switch ($mode) {
            
            case 'S':
                $sql = " SELECT  CS_DON.VALEUR from DILISPEC with (nolock)
								 left outer join CS_DON on DILISPEC.LIB01DICO 		= CS_DON.NUM_FIX
								 where 	DILISPEC.CODEDICO		= 'NCS_HASTUTIL_MAILRELSIGCDE'
								 and 	DILISPEC.TYPEDICO 		= 'BYCNWFPAR'
								 and 	CS_DON.COD_TAB			= 'HASTUTIL'
								 and 	CS_DON.COD_ENR 			= '" . ReplaceSqlPointeur($code_user) . '\'';
                
                break;
            case 'M':
                $sql = " SELECT  CS_DON.VALEUR from DILISPEC with (nolock)
								 left outer join CS_DON on DILISPEC.LIB01DICO 		= CS_DON.NUM_FIX
								 where 	DILISPEC.CODEDICO		= 'NCS_HASTUTIL_MAILRELSIGCDE'
								 and 	DILISPEC.TYPEDICO 		= 'BYCNWFPAR'
								 and 	CS_DON.COD_TAB			= 'UTILCREAT'
								 and 	CS_DON.COD_ENR 			= '" . ReplaceSqlPointeur($code_user) . '\'';
                break;
        }
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     *
     * @author Eric Carles
     * @version 1.0 du 28/12/2007
     *         
     *          Fonction retournant la requete permettant de savoir si l'option "Recevoir en copie des emails de relance sur la signature de mes commandes" est activée
     *          pour un utilisateur donné
     *         
     * @param string $code_user
     *            : code de l'utilisateur
     * @param $mode :
     *            mode dans lequel est appelée la fonction : "M" pour une modification en cours "S" si l'utilisateur consulte son profil
     * @return string sql requete
     */
    public static function rqIsCopieMailSigCdeActive($code_user, $mode = "S")
    {
        switch ($mode) {
            case 'S':
                $sql = " SELECT  CS_DON.VALEUR from DILISPEC with (nolock)
								 left outer join CS_DON on DILISPEC.LIB01DICO 		= CS_DON.NUM_FIX
								 where 	DILISPEC.CODEDICO		= 'NCS_HASTUTIL_COPIEMAILRELSIGCDE'
								 and 	DILISPEC.TYPEDICO 		= 'BYCNWFPAR'
								 and 	CS_DON.COD_TAB			= 'HASTUTIL'
								 and 	CS_DON.COD_ENR 			= '" . ReplaceSql(strtoupper($code_user)) . '\'';
                break;
            case 'M':
                $sql = " SELECT  CS_DON.VALEUR from DILISPEC with (nolock)
								 left outer join CS_DON on DILISPEC.LIB01DICO 		= CS_DON.NUM_FIX
								 where 	DILISPEC.CODEDICO		= 'NCS_HASTUTIL_COPIEMAILRELSIGCDE'
								 and 	DILISPEC.TYPEDICO 		= 'BYCNWFPAR'
								 and 	CS_DON.COD_TAB			= 'UTILCREAT'
								 and 	CS_DON.COD_ENR 			= '" . ReplaceSql(strtoupper($code_user)) . '\'';
                break;
        }
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requete listant tous les utilisateurs de la base HAPLUS
     * 
     * @return string $SQL
     */
    public static function rqGetListUser($ste, $code = '', $lib = '')
    {
        $sql = "SELECT HASTUTIL.CODE as Code,
							HASTUTIL.NOM as Libelle
					 from HASTUTIL with(nolock)
					 where (
								HASTUTIL.CODE_STE = '" . ReplaceSqlPointeur($ste) . "'
							or  HASTUTIL.UTIMULTI = 0x54
							) ";
        
        if ($code != '')
            $sql .= " and upper(CODE) LIKE '%" . strtoupper(ReplaceSqlPointeur($code)) . "%'";
        
        if ($lib != '')
            $sql .= " and upper(NOM) LIKE '%" . strtoupper(ReplaceSqlPointeur($lib)) . "%'";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Liste des utilisateurs pouvant etre potentiellement en liaison avec un utilisateurs origine
     * via les sociétés qui lui sont communes
     * !!! IMPORTANT dans cette liste peut se retouver soi meme aussi
     * 
     * @param unknown $codeUtilisateurSource
     * @param string $code
     * @param string $lib
     * @return RequeteSQL
     */
    public static function rqGetListUserMultiSoc($codeUtilisateurSource, $code = '', $lib = '')
    {
        $sqlSte = '';
        foreach (SqlUsers::rqListSocieteForUser($codeUtilisateurSource)->TrouveTous() as $value) {
            if ('' !== $sqlSte)
                $sqlSte .= ',';
            
            $sqlSte .= '\'' . ReplaceSqlPointeur($value['Code']) . '\'';
        }
        
        $sql = "select CODE as Code, NOM as Libelle from HASTUTIL with(nolock) " . "where (CODE_STE IN (" . $sqlSte . ") OR HASTUTIL.UTIMULTI = 0x54) ";
        
        if ($code != '')
            $sql .= " and CODE LIKE '%" . strtoupper(ReplaceSqlPointeur($code)) . "%'";
        
        if ($lib != '')
            $sql .= " and upper(NOM) LIKE '%" . strtoupper(ReplaceSqlPointeur($lib)) . "%'";
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqGetInfoForSTE(& $ste)
    {
        $sql = "SELECT * from SOCIETE with (nolock) where CODE_STE ='" . ReplaceSqlPointeur($ste) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de récupérer les valeurs d'initialisation de la session d'un utilisateur lors d'un changement de société
     *
     * @param string $login
     *            : Login de l'utilisateur
     * @param string $ste
     *            : Societe de l'utilisateur
     * @return string : Requête SQL
     */
    public static function rqGetValueSessionByUserAndSte(& $login,  $ste)
    {
        $sql = " SELECT 
	                    COD_USR , 
	                    COD_STE					SOCIETE, 
	                    CTREMET					CTR_EMET, 
	                    CTRLIVR					CTR_LIV, 
	                    CODSI					SI, 
	                    CODCDC					CDC, 
	                    CODSCA					SCA, 
	                    CODSIT					SITE_STK,
	                    SOCIETE.RAIS_SOC		SOCIETE_LIB,
	                    SECTIMPU.LIBELLE		SI_LIB,	
	                    SSCPTANA.LIBELLE		SCA_LIB,
	                    CODECOMP.LIBELLE		CDC_LIB,
	                    CENTRE_LIVR.RAIS_SOC	CTR_LIV_RS,
	                    CENTRE_EMET.RAIS_SOC	CTR_EMET_RS,
	                    SSITESTO.DESIGN			SITE_STK_RS
	                    from SOC_USR with(nolock)
	                    left outer join SOCIETE   	with(nolock) on SOCIETE.CODE_STE	= SOC_USR.COD_STE	 								
	                    left outer join SECTIMPU 		with(nolock) on SECTIMPU.CODE_SI	= SOC_USR.CODSI   AND SECTIMPU.CODE_STE = '" . (Param::IsSISecto() ? ReplaceSqlPointeur($ste) : '') . "'   
	                    left outer join SSCPTANA 		with(nolock) on SSCPTANA.CODE_SCA	= SOC_USR.CODSCA  AND SSCPTANA.CODE_STE = '" . (Param::IsSCASecto() ? ReplaceSqlPointeur($ste) : '') . "'
	                    left outer join CODECOMP 		with(nolock) on CODECOMP.CODE_CDC	= SOC_USR.CODCDC  AND CODECOMP.CODE_STE = '" . (Param::IsCDCSecto() ? ReplaceSqlPointeur($ste) : '') . "'
	                    left outer join CENTRE CENTRE_LIVR  with(nolock) on	 CENTRE_LIVR.CODE_CTR	= SOC_USR.CTRLIVR
	                    left outer join CENTRE CENTRE_EMET  with(nolock) on  CENTRE_EMET.CODE_CTR	= SOC_USR.CTREMET
	                    left outer join SSITESTO with(nolock) on  SSITESTO.SITE	= SOC_USR.CODSIT 	
	                    where SOC_USR.COD_USR ='" . ReplaceSqlPointeur($login) . "'";
        if (! is_null($ste) && '' != $ste) {
            $sql .= ' and SOC_USR.COD_STE = \'' . ReplaceSqlPointeur($ste) . '\'';
        }

        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de récupérer les valeurs d'initialisation de la session d'un utilisateur par rapport à son profil de base haplus
     *
     * @param string $login
     *            : Login de l'utilisateur
     * @return string : Requête SQL
     */
    public static function rqGetValueSessionByUserProfil(& $login)
    {
        $sql = "SELECT 
			HASTUTIL.CODE , 
			HASTUTIL.CODE_STE		SOCIETE, 
			HASTUTIL.CTR_ADR		CTR_EMET, 
			HASTUTIL.CTRLIV			CTR_LIV, 
			HASTUTIL.SI				SI, 
			HASTUTIL.CDC			CDC, 
			HASTUTIL.SCA			SCA, 
			HASTUTIL.SIT_STO		SITE_STK,
			SOCIETE.RAIS_SOC		SOCIETE_LIB,
			SECTIMPU.LIBELLE		SI_LIB,	
			SSCPTANA.LIBELLE		SCA_LIB,
			CODECOMP.LIBELLE		CDC_LIB,
			CENTRE_LIVR.RAIS_SOC	CTR_LIV_RS,
			CENTRE_EMET.RAIS_SOC	CTR_EMET_RS,
			SSITESTO.DESIGN			SITE_STK_RS
			from HASTUTIL with(nolock)
			left outer join SOCIETE   	with(nolock) on SOCIETE.CODE_STE	= HASTUTIL.CODE_STE
			left outer join SECTIMPU 		with(nolock) on SECTIMPU.CODE_SI	= HASTUTIL.SI   AND SECTIMPU.CODE_STE = " . (Param::IsSISecto() ? " HASTUTIL.CODE_STE " : "'' ") . "    
			left outer join SSCPTANA 		with(nolock) on SSCPTANA.CODE_SCA	= HASTUTIL.SCA  AND SSCPTANA.CODE_STE = " . (Param::IsSCASecto() ? " HASTUTIL.CODE_STE " : "'' ") . " 
			left outer join CODECOMP 		with(nolock) on CODECOMP.CODE_CDC	= HASTUTIL.CDC  AND CODECOMP.CODE_STE = " . (Param::IsCDCSecto() ? " HASTUTIL.CODE_STE " : "'' ") . " 
			left outer join CENTRE CENTRE_LIVR  with(nolock) on	 CENTRE_LIVR.CODE_CTR	= HASTUTIL.CTRLIV
			left outer join CENTRE CENTRE_EMET  with(nolock) on  CENTRE_EMET.CODE_CTR	= HASTUTIL.CTR_ADR
			left outer join SSITESTO with(nolock) on  SSITESTO.SITE	= HASTUTIL.SIT_STO 	
			where HASTUTIL.CODE ='" . ReplaceSql(strtoupper($login)) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de savoir si un utilisateur est valide ou non pour l'Oxaproc : Date de validité OK + utilisateur paramétré sur l'Oxaproc
     *
     * @param string $login
     *            : Login de l'utilisateur
     * @return string sql
     */
    public static function rqIsUserValide(& $login)
    {
        $sql = "SELECT * from HASTUTIL with (nolock) where HASTUTIL.CODE ='" . ReplaceSql(strtoupper($login)) . "' and  HASTUTIL.ACCOXAPR  = 0x54 and (HASTUTIL.DTE_FERM =00000000 or HASTUTIL.DTE_FERM >= CONVERT(VARCHAR,GETDATE(),112)) and (HASTUTIL.DTE_OUV  =00000000 or HASTUTIL.DTE_OUV  <= CONVERT(VARCHAR,GETDATE(),112))";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de sélectionner un code organigramme pour une société et un si donné
     *
     * @param string $ste
     *            : Code de la société recherchée
     * @param string $si
     *            : Code du si recherché
     *            
     * @return string sql
     *        
     *         Modification suite prise en compte du code de direction spec 3106
     */
    public static function rqGetOneNumOrganigrammeBySteAndSi($ste, $si, $ref)
    {
        $sql = 'SELECT CODE_ORG, NUM_VERS from WFO_ENT with(nolock) ' . "where 	CODE_REF = '" . ReplaceSqlPointeur($ref) . "' " . "and   	CODE_STE = '" . ReplaceSqlPointeur($ste) . "' " . 'and   	' . ' ( ' . "CODE_SI  = '" . ReplaceSqlPointeur($si) . "' OR " . 'exists (SELECT CODE_DIR  from SECTIMPU with(nolock) ' . "where SECTIMPU.CODE_STE = '" . (Param::IsSISecto() ? ReplaceSqlPointeur($ste) : '') . '\' ' . "and   SECTIMPU.CODE_SI  = '" . ReplaceSqlPointeur($si) . "' " . 'and   SECTIMPU.CODE_DIR = WFO_ENT.CODE_DIR ' . ' ) ' . ' ) ' . 'and ACTIF    = 0x54 ';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de sélectionner un code organigramme pour une société et un si donné
     *
     * @param string $login
     *            : Login de l'utilisateur
     * @param string $code_orga
     *            : Code de l'organigramme de rattachement
     *            
     * @return string sql
     */
    public static function rqIsNumOrganigrammeExistForUser($login, $code_orga)
    {
        $sql = "SELECT * from WFO_VAL with(nolock) where CODE_USR ='" . ReplaceSql(strtoupper($login)) . "' and CODE_ORG = '" . ReplaceSqlPointeur($code_orga) . "' ";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant d'obtenir le code référentiel d'organigramme pour une société et un type de document donné
     *
     * @param string $ste
     *            : Société de la session utilisateur
     * @param string $type_doc
     *            : Type de document de l'Oxaproc
     * @param string $type_achat
     *            : Type d'achat associé au fournisseur
     *            
     * @return string sql
     */
    public static function rqGetRefWfOrganigrammeBySteAndTypeDocAndTypeAchat($ste, $type_doc, $type_achat)
    {
        $sql = "SELECT * from WFR_PARAM with(nolock) where CODE_STE = '" . ReplaceSqlPointeur($ste) . "' and TYP_DOC = '" . ReplaceSqlPointeur($type_doc) . "' and TYP_ACH = '" . ReplaceSqlPointeur($type_achat) . "'";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la requête permettant de sélectionner tous les signataires de DA
     *
     * @param string $ste
     *            : Société de la session utilisateur
     *            
     * @return string sql
     */
    public static function rqGetAllUserSignDA($ste)
    {
        $sql = " SELECT CODE LOGIN, NOM from HASTUTIL with(nolock) where CODE_STE = '" . ReplaceSqlPointeur($ste) . "' and SIG_DA = 0x54 ";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqPopupGetAllUtilisateurs(& $array_filters, $modeData, $is_sup_hierarchique = false, $is_magasinier = false)
    {
        // Skype YA 2016.07.18
        // SELECT * from HASTUTIL where HASTUTIL.UTIMULTI=0x54
        // or HASTUTIL.CODE_STE IN ('<liste sté périmètre user>')
        // or exists (SELECT null from SOC_USR where SOC_USR.COD_STE in ('<liste sté périmètre user>'))
        
        // Liste sociétés du périmètre
        $perimetreSociete = SqlSociete::rqPopupGetAllSocieteForUser()->TrouveTous();
        $steStr = '';
        if (is_array($perimetreSociete))
            foreach ($perimetreSociete as & $ste) {
                if ('' != $steStr)
                    $steStr .= ',';
                $steStr .= '\'' . ReplaceSqlPointeur($ste['CODE_STE']) . '\'';
            }
        unset($perimetreSociete);
        
        //
        //
        //
        $contexte = (array_key_exists('contexte', $array_filters)) ? $array_filters['contexte'] : '';
        $popup_contexte = (array_key_exists('popup_contexte', $array_filters)) ? $array_filters['popup_contexte'] : '';
        
        if (array_key_exists('CODE_STE', $array_filters) && '' != $array_filters['CODE_STE'])
            $clause_ste = " or HASTUTIL.CODE_STE = '" . ReplaceSqlPointeur($array_filters['CODE_STE']) . "' or exists (SELECT COD_STE from SOC_USR with(nolock) where COD_USR = '" . ReplaceSqlPointeur($array_filters['CODE_STE']) . "') ";
        else
            $clause_ste = '';
        
        if ('' != $steStr)
            $perimetreSocieteSql = ' or (
					HASTUTIL.CODE_STE in (' . $steStr . ')
					or
					exists(
							SELECT null from SOC_USR with(nolock) where HASTUTIL.CODE = SOC_USR.COD_USR and SOC_USR.COD_STE in (' . $steStr . ')
							)
					)';
        
        $sql = 'SELECT ' . ($modeData ? "HASTUTIL.CODE,HASTUTIL.NOM, HASTUTIL.SIT_STO " : "count(*) CPTRESTBL  ") . 'from HASTUTIL with(nolock) ' . 'where ( ' . " ";
        if (! (TypeSuivi::SignDA == $popup_contexte || TypeSuivi::DelSignDA == $popup_contexte || TypeSuivi::SignCDE == $popup_contexte || TypeSuivi::DelSignCDE == $popup_contexte || TypeSuivi::SignBAP == $popup_contexte || TypeSuivi::DelSignBAP == $popup_contexte || '' == $popup_contexte)) // sauf specifique la clause multi user DOIT ETRE proposé
            $sql .= ' (HASTUTIL.UTIMULTI = 0x54 ' . $perimetreSocieteSql . ')';
        else
            $sql .= ' 1 = 1 ';
        
        $sql .= $clause_ste . ') ';
        
        if (array_key_exists('DATA_STRICT', $array_filters)) {
            $sql .= " and HASTUTIL.CODE = '" . ReplaceSqlPointeur($array_filters['DATA_STRICT']) . "'";
        }
        
        if ($is_sup_hierarchique)
            $sql .= ' and USRSUPHIE = 0x54 ';
        
        if ($is_magasinier)
            $sql .= ' and MAGASIN = 0x54 ';
        
        switch ($contexte) {
            case 'Demandeur':
                $sql .= ' and DEMAND = 0x54 ';
                break;
            case 'Acheteur':
                $sql .= ' and ACHETEUR = 0x54 ';
                break;
            default:
                break;
        }
        
        if (array_key_exists('WHERE_SUP', $array_filters))
            $sql .= $array_filters['WHERE_SUP'];
        
        // Spec 3528 - Dans le cas des écrans des écrand de signature, on limite
        if (! is_null($popup_contexte) && '' != $popup_contexte) {
            $signataire = (TypeSuivi::DelSignDA == $popup_contexte || TypeSuivi::DelSignCDE == $popup_contexte || TypeSuivi::DelSignBAP == $popup_contexte) ? getValue('SIGNAT') : $_SESSION['Session_Login'];
            switch ($popup_contexte) {
                case TypeSuivi::DelSignDA:
                case TypeSuivi::SignDA:
                    $sql .= " and HASTUTIL.CODE in (SELECT distinct DA_ENTET.NO_DEM
							from SIG_DA with (nolock), DA_ENTET with (nolock)
							where SIG_DA.NO_DA = DA_ENTET.NO_DA
							and DA_ENTET.SIGNEE = 0x46	
							and	SIG_DA.SIGNAT='" . ReplaceSqlPointeur($signataire) . "'
							and SIG_DA.SIGNABLE= 0x54
						union
						SELECT CA_ENTET.ACH
							from SIG_DA with (nolock), DA_ENTET with (nolock), CA_LIGNE with (nolock), CA_ENTET with (nolock) 
							where SIG_DA.NO_DA = DA_ENTET.NO_DA
							and DA_ENTET.SIGNEE = 0x46	
							and	SIG_DA.SIGNAT='" . ReplaceSqlPointeur($signataire) . "'
							and SIG_DA.SIGNABLE= 0x54
							and CA_LIGNE.NO_DA = DA_ENTET.NO_DA
							and CA_ENTET.NO_CDE = CA_LIGNE.NO_CDE ";
                    if (1 == $_SESSION['DA_ToutDemandeur']) {
                        $sql .= " union
							SELECT CA_ENTET.DEMANDEUR
								from SIG_DA with (nolock), DA_ENTET with (nolock), CA_LIGNE with (nolock), CA_ENTET with (nolock) 
								where SIG_DA.NO_DA = DA_ENTET.NO_DA
								and DA_ENTET.SIGNEE = 0x46	
								and	SIG_DA.SIGNAT='" . ReplaceSqlPointeur($signataire) . "'
								and SIG_DA.SIGNABLE= 0x54
								and CA_LIGNE.NO_DA = DA_ENTET.NO_DA
								and CA_ENTET.NO_CDE = CA_LIGNE.NO_CDE ";
                    }
                    $sql .= ") ";
                    break;
                case TypeSuivi::DelSignCDE:
                case TypeSuivi::SignCDE:
                    $sql .= " and HASTUTIL.CODE in (SELECT distinct CA_ENTET.DEMANDEUR
							from SIG_CDE with (nolock), CA_ENTET with (nolock)
							where SIG_CDE.NO_CDE = CA_ENTET.NO_CDE
							and CA_ENTET.SIGNEE = 0x46
							and SIG_CDE.SIGNAT='" . ReplaceSqlPointeur($signataire) . "'
							and SIG_CDE.SIGNABLE= 0x54 and SIG_CDE.BON_SIGNE = 0x54
						union
						SELECT distinct CA_ENTET.ACH
							from SIG_CDE with (nolock), CA_ENTET with (nolock)
							where SIG_CDE.NO_CDE = CA_ENTET.NO_CDE
							and CA_ENTET.SIGNEE = 0x46
							and SIG_CDE.SIGNAT='" . ReplaceSqlPointeur($signataire) . "'
							and SIG_CDE.SIGNABLE= 0x54 and SIG_CDE.BON_SIGNE = 0x54) ";
                    break;
                case TypeSuivi::DelSignBAP:
                case TypeSuivi::SignBAP:
                    $sql .= " and HASTUTIL.CODE in (SELECT distinct CA_ENTET.DEMANDEUR
							from SIG_BAP with (nolock), FAC_ENT with (nolock), FAC_LIG with (nolock), CA_ENTET with (nolock) 
							where SIG_BAP.NO_FAC  = FAC_ENT.NUM_FACT
							and FAC_ENT.ATT_SIG   = 0x54	
							and SIG_BAP.SIGNAT    = '" . ReplaceSqlPointeur($signataire) . "'
							and SIG_BAP.SIGNABLE  = 0x54
							and SIG_BAP.BAP_BAS   = 0x54
							and FAC_ENT.NUM_FACT  = FAC_LIG.NUM_FACT
							and FAC_LIG.NUM_CDE = CA_ENTET.NO_CDE
						union
						SELECT distinct DA_ENTET.NO_DEM
							from SIG_BAP with (nolock), FAC_ENT with (nolock), FAC_LIG with (nolock), CA_LIGNE with (nolock), DA_ENTET with (nolock)
							where SIG_BAP.NO_FAC  = FAC_ENT.NUM_FACT
							and FAC_ENT.ATT_SIG   = 0x54	
							and SIG_BAP.SIGNAT    = '" . ReplaceSqlPointeur($signataire) . "'
							and SIG_BAP.SIGNABLE  = 0x54
							and SIG_BAP.BAP_BAS   = 0x54
							and FAC_ENT.NUM_FACT  = FAC_LIG.NUM_FACT
							and FAC_LIG.NUM_CDE = CA_LIGNE.NO_CDE and FAC_LIG.NUM_LICDE = CA_LIGNE.NO_PO
							and CA_LIGNE.NO_DA = DA_ENTET.NO_DA and CA_LIGNE.NO_DA > 0
							) ";
                    break;
            }
        }
        
        $clause = '';
        $is_clause = false;
        if (array_key_exists('relevance', $array_filters)) {
            switch ($array_filters['relevance']) {
                case 'OR':
                case 'AND':
                    if ('' != trim($array_filters['CODE'])) {
                        $liste_code = explode(' ', $array_filters['CODE']);
                        foreach ($liste_code as $code)
                            if ('' !== trim($code))
                                $clause .= " upper(CODE) like upper('%" . ReplaceSqlPointeur($code) . "%') {$array_filters['relevance']}";
                        $clause = mb_substr($clause, 0, mb_strlen($clause) - mb_strlen($array_filters['relevance']));
                        if ('' != $clause) {
                            $clause = " ({$clause})";
                            $is_clause = true;
                        }
                    }
                    if ('' != trim($array_filters['NOM'])) {
                        $liste_nom = explode(' ', $array_filters['NOM']);
                        if ($is_clause)
                            $clause .= ' AND ';
                        foreach ($liste_nom as $nom)
                            if ('' !== trim($nom))
                                $clause .= " upper(NOM) like upper('%" . ReplaceSqlPointeur($nom) . "%') {$array_filters['relevance']}";
                        $clause = mb_substr($clause, 0, mb_strlen($clause) - mb_strlen($array_filters['relevance']));
                        if ('' != trim($clause)) {
                            $clause = "({$clause})";
                            $is_clause = true;
                        }
                    }
                    break;
                case 'strict':
                    if ('' != trim($array_filters['CODE'])) {
                        $clause .= " (upper(CODE) like upper('" . ReplaceSqlPointeur($array_filters['CODE']) . "%'))";
                        $is_clause = true;
                    }
                    if ('' != trim($array_filters['NOM'])) {
                        if ($is_clause)
                            $clause .= ' AND ';
                        $clause .= " (upper(NOM) like upper('" . ReplaceSqlPointeur($array_filters['NOM']) . "%'))";
                        $is_clause = true;
                    }
                    break;
            }
            if ($is_clause)
                $sql .= ' AND ' . $clause;
            if ($modeData && array_key_exists('orderByField', $array_filters) && '' != $array_filters['orderByValue'])
                $sql .= " order by {$array_filters['orderByField']} {$array_filters['orderByValue']}";
        }
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * function renvoyant une requete sql de la liste des utilisateurs demandeeur (Fonction de transfert de DA)
     * 
     * @param
     *            char ident login de l'utilisateur connecté
     * @param
     *            char cod_ste code de la societe de l'utilisateur
     * @param
     *            char cod_rech code de la recherche
     * @param
     *            char lib_rech libelle de la recherche
     * @param
     *            boolean methode true exact / false liste
     * @return char la requete sql
     */
    public static function rqPopupGetAllUsersPanierTransfert(& $array_filters, $modeData)
    {
        
        // On récupère la liste des utilisateurs enregistré dans la table oxa_users pour le transferts de panier
        /**
         * Suite au dossier
         * 
         * @var string $sql 27998, IL EST OBLIGATOIRE du faire un IN avec la liste des codes utilisateurs
         *      car même si au niveau sql on peut faire un in d'un select, nous sommes en présence de 2 tables pouvant se trouver
         *      sur des instances sql différente exemple BOUYGUES donc ca va planter si l'on fait cette transformation
         *      DECISION YA,VAN,EDP le 17/11/2017
         */
        $sql = " SELECT login from oxa_users with (nolock) ";
        $result = (new RequeteSQL($sql, DB_OXAPROCDB))->TrouveTous();
        
        $nbRes = count($result);
        $listeUser = '';
        
        /*for ($i = 0; $i < $nbRes; $i ++)
            if ($i == 0)
                $listeUser .= '\'' . ReplaceSqlPointeur($result[$i]['login']) . '\'';
            else
                $listeUser .= ',' . '\'' . ReplaceSqlPointeur($result[$i]['login']) . '\'';*/
        
        if ($listeUser != '')
            $ajout = "AND CODE in (" . $listeUser . ") ";
        else
            $ajout = '';
        
        $sql = 'SELECT ' . ($modeData ? "CODE, NOM " : 'count(*) CPTRESTBL  ') . ' from HASTUTIL with (nolock) ' . "WHERE CODE <> '" . ReplaceSqlPointeur($_SESSION['Session_Login']) . "' " . "AND DEMAND = 0x54 AND CODE_STE = '" . ReplaceSqlPointeur($array_filters['CODE_STE']) . "' " . "AND ACCOXAPR = 0x54 ";
        $sql .= $ajout;
        
        if (array_key_exists('DATA_STRICT', $array_filters)) {
            $sql .= " and CODE = '" . ReplaceSqlPointeur($array_filters['DATA_STRICT']) . "'";
        }
        
        $clause = '';
        $is_clause = false;
        
        if (array_key_exists('relevance', $array_filters)) {
            switch ($array_filters['relevance']) {
                case 'OR':
                case 'AND':
                    
                    if ('' != trim($array_filters['CODE'])) {
                        $liste_code = explode(' ', $array_filters['CODE']);
                        
                        foreach ($liste_code as $code)
                            if ('' !== trim($code))
                                $clause .= " upper(CODE) like upper('%" . ReplaceSqlPointeur($code) . "%') {$array_filters['relevance']}";
                        
                        $clause = mb_substr($clause, 0, mb_strlen($clause) - mb_strlen($array_filters['relevance']));
                        
                        if ('' != $clause) {
                            $clause = " ({$clause})";
                            $is_clause = true;
                        }
                    }
                    
                    if ('' != trim($array_filters['NOM'])) {
                        $liste_nom = explode(' ', $array_filters['NOM']);
                        
                        if ($is_clause)
                            $clause .= ' AND ';
                        
                        foreach ($liste_nom as $nom)
                            if ('' !== trim($nom))
                                $clause .= " upper(NOM) like upper('%" . ReplaceSqlPointeur($nom) . "%') {$array_filters['relevance']}";
                        
                        $clause = mb_substr($clause, 0, mb_strlen($clause) - mb_strlen($array_filters['relevance']));
                        
                        if ('' != trim($clause)) {
                            $clause = "({$clause})";
                            $is_clause = true;
                        }
                    }
                    
                    break;
                
                case 'strict':
                    
                    
                    if ('' != trim($array_filters['CODE'])) {
                        $clause .= "(upper(CODE) like upper('" . ReplaceSqlPointeur($array_filters['CODE']) . "%'))";
                        $is_clause = true;
                    }
                    
                    if ('' != trim($array_filters['NOM'])) {
                        if ($is_clause)
                            $clause .= ' AND ';
                        
                        $clause .= "(upper(NOM) like upper('" . ReplaceSqlPointeur($array_filters['NOM']) . "%'))";
                        $is_clause = true;
                    }
                    
                    break;
            }
            
            if ($is_clause)
                $sql .= ' AND ' . $clause;
            
            if ($modeData && array_key_exists('orderByField', $array_filters) && '' != $array_filters['orderByValue'])
                $sql .= " order by {$array_filters['orderByField']} {$array_filters['orderByValue']}";
        }
        // var_dump($sql);
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Fonction retournant la liste des demandeurs
     *
     * @param array $array_filters
     *            : Liste des filtres applicables à la requête
     * @return string sql
     */
    public static function rqPopupGetAllDemandeurs(& $array_filters, $profil, $modeData, $objectSupport = null)
    {
        $typeSte = null;
        $codeSte = null;
        $groupe = null;
        
        $sqlRestrictionSociete = '';
        $sqlRestrictionGroupe1 = '';
        $sqlRestrictionGroupe2 = '';
        if (! is_null($objectSupport)) {
            $typeSte = $objectSupport->getProperties('GRPSOC');
            $groupe = $objectSupport->getProperties('GROUPE');
            $codeSte = $objectSupport->getProperties('CODE_STE');
            switch ($typeSte) {
                case 'G':
                    $groupe = $codeSte;
                    $codeSte = null;
                case 'grp':
                    $sqlRestrictionGroupe1 = ' AND exists(SELECT null from SOCIETE with (nolock) where SOCIETE.CODE_STE = HASTUTIL.CODE_STE and   SOCIETE.GROUPE = \'' . ReplaceSqlPointeur($groupe) . '\') ';
                    $sqlRestrictionGroupe2 = ' AND exists(SELECT null from SOCIETE with (nolock) where SOCIETE.CODE_STE = SOC_USR.COD_STE and   SOCIETE.GROUPE = \'' . ReplaceSqlPointeur($groupe) . '\') ';
                    break;
            }
        }
        
        if (is_null($typeSte)) {
            if (array_key_exists('CODE_STE', $array_filters))
                $codeSte = $array_filters['CODE_STE'];
            else
                $codeSte = $_SESSION['Session_SocUsr'];
        }
        
        if ('' != $codeSte)
            $sqlRestrictionSociete = ' HASTUTIL.CODE_STE = \'' . ReplaceSqlPointeur($codeSte) . '\' ';
        else
            $sqlRestrictionSociete = ' 1=1 ';
        
        switch ($profil) {
            case 'DEMANDEURS':
                $profil = ' DEMAND = 0x54 ';
                break;
            case 'ACHETEURS':
                $profil = ' ACHETEUR = 0x54 ';
                break;
            case 'AUTEURS':
                $profil = ' ACCOXAPR = 0x54 ';
                break;
        }
        
        // Mise en place de la possibilité de l'intersection relative au groupoe de societe
        $sql = "SELECT " . ($modeData ? "HASTUTIL.CODE, HASTUTIL.NOM, SOCIETE.CODE_STE, SOCIETE.RAIS_SOC " : "count(*) CPTRESTBL  ") . 'from HASTUTIL with(nolock) left outer join SOCIETE with(nolock) on HASTUTIL.CODE_STE = SOCIETE.CODE_STE ' . 
        // Ajout de la notion de ferme selon mail PP 23/12/2016 15:19
        "where $profil AND (DTE_FERM <> '00000000' or DTE_FERM <= CONVERT(char(8),GETDATE(),112)) " . 
        // "and (HASTUTIL.CODE_STE = '" . ReplaceSqlPointeur($array_filters['CODE_STE']) . "' or HASTUTIL.UTIMULTI = 0x54 or HASTUTIL.CODE = '{$_SESSION['Session_Login']}')".
        'and   ((' . $sqlRestrictionSociete . ' ' . $sqlRestrictionGroupe1 . ') OR UTIMULTI =  0x54 OR ' . 'exists (SELECT * from HASTUTIL with(nolock) ' . 'where CODE = \'' . ReplaceSqlPointeur($_SESSION['Session_Login']) . '\' AND UTIMULTI = 0x54) ' . 'or (HASTUTIL.CODE IN ( ' . 'SELECT CODE_STE COD_STE from HASTUTIL with(nolock) where CODE = \'' . ReplaceSqlPointeur($_SESSION['Session_Login']) . '\' ' . 'union ' . 'SELECT COD_STE COD_STE from SOC_USR with(nolock) ' . 'where  SOC_USR.COD_USR = \'' . ReplaceSqlPointeur($_SESSION['Session_Login']) . '\' ' . ')' . $sqlRestrictionGroupe1 . ') ' . 'or ' . 'exists (SELECT * from SOC_USR with(nolock) ' . 'where SOC_USR.COD_USR = HASTUTIL.CODE ' . 'and   SOC_USR.COD_STE IN ( ' . 'SELECT CODE_STE COD_STE from HASTUTIL with(nolock) where CODE = \'' . ReplaceSqlPointeur($_SESSION['Session_Login']) . '\' ' . 'union ' . 'SELECT COD_STE COD_STE from SOC_USR with(nolock) ' . 'where  SOC_USR.COD_USR = \'' . ReplaceSqlPointeur($_SESSION['Session_Login']) . '\' ' . $sqlRestrictionGroupe2 . ') ' . ') ' . ') ';
        
        if (array_key_exists('DATA_STRICT', $array_filters)) {
            $sql .= " and HASTUTIL.CODE = '" . ReplaceSqlPointeur($array_filters['DATA_STRICT']) . "'";
        }
        
        $clause = '';
        $is_clause = false;
        
        if (array_key_exists('relevance', $array_filters)) {
            switch ($array_filters['relevance']) {
                case 'OR':
                case 'AND':
                    
                    if ('' != trim($array_filters['CODE'])) {
                        $liste_code = explode(' ', $array_filters['CODE']);
                        
                        foreach ($liste_code as $code)
                            if ('' !== trim($code))
                                $clause .= " upper(CODE) like upper('%" . ReplaceSqlPointeur($code) . "%') {$array_filters['relevance']}";
                        
                        $clause = mb_substr($clause, 0, mb_strlen($clause) - mb_strlen($array_filters['relevance']));
                        
                        if ('' != $clause) {
                            $clause = " ({$clause})";
                            $is_clause = true;
                        }
                    }
                    
                    if ('' != trim($array_filters['NOM'])) {
                        $liste_nom = explode(' ', $array_filters['NOM']);
                        
                        if ($is_clause)
                            $clause .= ' AND ';
                        
                        foreach ($liste_nom as $nom)
                            if ('' !== trim($nom))
                                $clause .= " upper(NOM) like upper('%" . ReplaceSqlPointeur($nom) . "%') {$array_filters['relevance']}";
                        
                        $clause = mb_substr($clause, 0, mb_strlen($clause) - mb_strlen($array_filters['relevance']));
                        
                        if ('' != trim($clause)) {
                            $clause = "({$clause})";
                            $is_clause = true;
                        }
                    }
                    
                    break;
                
                case 'strict':
                    
                    if ('' != trim($array_filters['CODE'])) {
                        $clause .= "(upper(CODE) like upper('" . ReplaceSqlPointeur($array_filters['CODE']) . "%'))";
                        $is_clause = true;
                    }
                    
                    if ('' != trim($array_filters['NOM'])) {
                        if ($is_clause)
                            $clause .= ' AND ';
                        
                        $clause .= "(upper(NOM) like upper('" . ReplaceSqlPointeur($array_filters['NOM']) . "%'))";
                        $is_clause = true;
                    }
                    
                    break;
            }
            
            if ($is_clause)
                $sql .= ' AND ' . $clause;
            
            if ($modeData && array_key_exists('orderByField', $array_filters) && '' != $array_filters['orderByValue']) {
                if ('CODE_STE' == $array_filters['orderByField'])
                    $array_filters['orderByField'] = 'HASTUTIL.CODE_STE';
                
                $sql .= " order by {$array_filters['orderByField']} {$array_filters['orderByValue']}";
            }
        }
        
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    /**
     * Function de creation de ligne dans la table PARAMDICO pour le dialogue entre l'oxaproc et l'IPADE
     * Dans le cadre du Portail I-pade
     *
     *
     * @return string commande sql
     */
    public static function rqInsertConnexionUserPARAMDICO($LOGIN, $Langue, $Societe)
    {
        $date_jour = date('Ymd'); // Date sous la format aaaammjj
        $heure_jour = date("His"); // Date sous la format hhmmss
        
        $sql = "insert into PARAMDICO (TYPEDICO, ID1, ID2, ID3, ID4, LIBELLE) values ('TRACELOGIN','" . session_id() . "','" . ReplaceSqlPointeur($LOGIN) . "','" . ReplaceSqlPointeur($Langue . '|' . $Societe) . "','{$date_jour}|{$heure_jour}','OXAPROC' )";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqSelectConnexionUserPARAMDICO($LOGIN)
    {
        $sql = "
            SELECT
                *
            from
                PARAMDICO with(nolock)
            WHERE
                TYPEDICO = 'TRACELOGIN'
                AND ID1  = '" . session_id() . "'
                AND ID2  = '" . ReplaceSqlPointeur($LOGIN) . "'
        ";

        $cacheName = __FUNCTION__ . '.' . $LOGIN;

        return \SqlWincache::getSql($cacheName, $sql);
    }

    public static function rqUpdateSkinUser(& $login, & $code_skin)
    {
        $sql = "UPDATE HASTUTIL set INT_COUL = '" . ReplaceSqlPointeur($code_skin) . "' where CODE = '" . ReplaceSqlPointeur($login) . "'";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    public static function rqSelectSkinUser(& $login)
    {
        $sql = "SELECT INT_COUL from HASTUTIL with(nolock) where CODE = '" . ReplaceSqlPointeur($login) . "'";
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    // pour l'envoi de mails lors de la délégation
    public static function rqGetNameEMail(& $utilisateur)
    {
        $sql = 'SELECT NOM, EMAIL from HASTUTIL where CODE = \'' . ReplaceSqlPointeur($utilisateur) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }

    // pour l'envoi de mails lors de la délégation
    public static function rqGetValueSpec($champ, $utilisateur)
    {
        $sql = 'SELECT '.$champ.' from HASTUTIL where CODE = \'' . ReplaceSqlPointeur($utilisateur) . '\'';
        return new RequeteSQL($sql, DB_OXASQLDB);
    }
    
    public static function droitsUtilisateur($droit, $ident = null)
    {
        $user = $_SESSION['Session_Login'] ?? $ident;

        if($user == 'OXAUSER')
        {
            $sql="SELECT 1 as  DROIT";

        }else
        {
            $sql= "SELECT case when exists
                (SELECT COD_DR from DROITUSR where COD_USR='".$user."' and COD_DR='$droit'
                union
                SELECT dg.COD_GRP from DROITGRP dg
                inner join GRPUSR g on g.COD_GRP=dg.COD_GRP and g.COD_USR='".$user."'
                where dg.COD_DR='$droit')
                then 1
                else 0
                end as DROIT";
        }

        return new RequeteSQL($sql, DB_OXASQLDB);
        
    }

    public static function getNbrTentative()
    {
        $sql = "
            SELECT
                LIB01PARV
            from
                PARAVRAC
            where
                TYPEPARV='PARAMGEN'
                and CODEPARV='MDPNBCONNECT'";

        $cacheName = __FUNCTION__;

        return \SqlWincache::getSql($cacheName, $sql);
    }


    // pour l'envoi de mails lors de la délégation
    public static function isVisibleCdeDa()
    {
        $sql = "
            SELECT
                LIB01PARV
            FROM
                PARAVRAC
            WHERE
                TYPEPARV = 'OXAPROC'
                AND CODEPARV = 'MASQUER_BTN_PASS_DA'
        ";

        $cacheName = __FUNCTION__;

        return \SqlWincache::getSql($cacheName, $sql);
    }

    public static function rqGetRulesPassword()
    {
        $sql = "
            SELECT
                *
            from
                PARAVRAC
            WHERE
                TYPEPARV='PARAMGEN'
                AND (
                    CODEPARV='LONG_MINI_MDP' OR
                    CODEPARV='MDP_A_MAJ' OR
                    CODEPARV='MDP_A_MIN' OR
                    CODEPARV='MDP_A_CHI' OR
                    CODEPARV='MDP_A_CS'
                )";

        $cacheName = __FUNCTION__;

        return \SqlWincache::getSqlAll($cacheName, $sql);
    }

    public static function masquerSMTP()
    {
        $sql = "
            SELECT
                LIB01PARV
            FROM
                PARAVRAC
            WHERE
                TYPEPARV='OXAPROC'
                AND CODEPARV='PROFILUSER_MASQ_CPT_SMTP'
        ";

        $cacheName = __FUNCTION__;

        return \SqlWincache::getSql($cacheName, $sql);
    }
    
    public static function contratAlerte()
    {
        $sql = "SELECT * from ACCCADRE a with(nolock)
                left outer join MARCHES m with(nolock) on m.CODE=a.MARCHE
                where 
                (a.ACH_RESP='".$_SESSION["Session_Login"]."' or m.ACHETEUR='".$_SESSION["Session_Login"]."')
                and a.DATE_FIN<>'00000000' and a.DEL_ALE<>0
                and DATE_FIN>convert(varchar,getdate(),112)
                and
                getdate() between
                DATEADD(day,-1*a.DEL_ALE,
                	CASE
                	WHEN a.JOU_MOI='M' 
                	THEN DATEADD(month, a.DEL_PRE*-1,a.DATE_FIN)
                	ELSE DATEADD(day, a.DEL_PRE*-1,a.DATE_FIN )
                	END
                	)
                and
                DATEADD(DAY,-1,
                CASE
                WHEN a.JOU_MOI='M' 
                THEN DATEADD(month, a.DEL_PRE*-1,a.DATE_FIN)
                ELSE DATEADD(day, a.DEL_PRE*-1,a.DATE_FIN )
                END
                )";
        
        return new RequeteSQL($sql, DB_OXASQLDB);
        
    }
    

   public static function contratDepasser()
   {
       $sql = "SELECT * from ACCCADRE a with(nolock)
                left outer join MARCHES m with(nolock) on m.CODE=a.MARCHE
                where 
                (a.ACH_RESP='".$_SESSION["Session_Login"]."' or m.ACHETEUR='".$_SESSION["Session_Login"]."')
                and a.DATE_FIN<>'00000000' and a.DEL_PRE<>0
                and DATE_FIN>convert(varchar,getdate(),112)
                and
                CASE
                WHEN a.JOU_MOI='M' 
                THEN DATEADD(month, a.DEL_PRE*-1,a.DATE_FIN)
                ELSE DATEADD(day, a.DEL_PRE*-1,a.DATE_FIN )
                END
                <= 
                getdate()";

       return new RequeteSQL($sql, DB_OXASQLDB);
   }

}
