<?php

class AdministrationUsers
{

    // Attributs
    public $type_admin;
 // String, Type d'administration : "centrale" ou "locale"
    public $xml_array;
 // Tableau contenant les données XML à afficher
    public $listCentre;
 // Tableau contenant la liste des centres administrés
    public $listGroupe;
 // Tableau contenant la liste des groupes administrés
    public $listSociete;
 // Tableau contenant la liste des societes administrés
    public $listUsers;
 // Tableau contenant la liste des utilsateurs administrés
    public $listUsersFiltr;
 // Tableau contenant la liste des utilisateurs obtenue avec filtre sur le nom/login
    public $listeUsersLeft;
 // Tableau contenant une liste d'utilisateurs non inclus dans un groupe de droits
    public $listDirection;
 // Tableau contenant la liste des directions pour une société donnée -- LEONG spec 3011
    public $listSIComplLeft;
 // Tableau contenant la liste des SI complémentaires moins celles déjà ajoutées sur une direction -- LEONG spec 3011
    public $listSIComplDir;
 // Tableau contenant la liste des SI complémentaires ajoutées sur une direction-- LEONG spec 3011
                            
    // Constructeur
    public function __construct()
    {}

    /**
     * Section regroupant les fonctions SQL
     */
    
    /**
     * Fonction retournant la liste des centres emetteur pour une société donnée
     * 
     * @param $société :
     *            société pour laquelle on recherche les centres emetteurs
     */
    function getListCentreForSoc(& $login, $isAdmLocal, $societe)
    {
        $this->listCentre = SqlAdministrationUsers::rqGetListCentreForSoc($login, $isAdmLocal, $societe)->TrouveTous();
    }

    /**
     * Fonction retournant la liste des utilisateurs rattachés à un centre emetteur
     * 
     * @param $centre :
     *            centre pour lequel on recherche les centres emetteurs
     */
    function getListUsersForCtr(& $login, $adminLocal, $centre)
    {
        $this->listUsers = & SqlAdministrationUsers::rqGetListUsersForCtr($login, $adminLocal, $centre)->TrouveTous();
    }

    /**
     * Fonction retournant la liste de tous les utilisateurs en tenant compte du profil de l'administrateur local ou central
     * 
     * @param string $login
     *            : Login de l'administrateur
     */
    function getListAllUsers(& $login, $adminLocal)
    {
        $this->listUsers = SqlAdministrationUsers::rqGetListAllUsers($login, $adminLocal)->TrouveTous();
    }

    /*
     * Fonction retournant la liste de toutes les sociétés
     */
    function getListAllSociete(& $login, $adminLocal, $tri_par_code = false)
    {
        $this->listSociete = SqlAdministrationUsers::rqGetListAllSociete($login, $adminLocal, $tri_par_code)->TrouveTous();
    }

    /*
     * Fonction retournant la liste de toutes les sociétés
     */
    function getListAllCentre(& $login, $adminLocal)
    {
        $this->listCentre = SqlAdministrationUsers::rqGetListAllCentre($login, $adminLocal)->TrouveTous();
    }

    /**
     * Fonction retournant la requete permettant de connaitre tous les groupes de sociétés
     * 
     * @param string $login
     *            : utilisateur pour lequel on recherche les groupes de sociétés
     * @param int $adminLocal
     *            : Si administrateur local alors 1 sinon 0
     */
    function getListGroup(& $login, $adminLocal)
    {
        $this->listGroupe = SqlAdministrationUsers::rqGetListGroup($login, $adminLocal)->TrouveTous();
    }

    /**
     * Fonction retournant la requete permettant de connaitre toutes les sociétés rattachées à un groupe
     * 
     * @param $groupe String
     *            : Nom du groupe dont on souhaite connaitre toutes les sociétés
     */
    function getListSocForGroup(& $login, $adminLocal, $groupe)
    {
        $this->listSociete = SqlAdministrationUsers::rqGetListSocForGroup($login, $adminLocal, $groupe)->TrouveTous();
    }

    /**
     * Fonction retournant la requete permettant de connaitre pour un admin la liste des centres administrés
     */
    function getListCentreForAdminLoc(& $login)
    {
        $this->listCentre = SqlAdministrationUsers::rqGetListCentreForAdminLoc($login)->TrouveTous();
    }

    /**
     * Fonction retournant la liste des utilisateurs pour un administrateur central monosociété
     */
    function getListUsersForAdminCtrMono($societe, $chaine)
    {
        if ($listeCentres = $this->getListCentreForSoc($societe))
            foreach ($listeCentres as & $centres)
                if ($listeUsers = $this->getListUsersForCtr($centres))
                    foreach ($listeUsers as & $users)
                        if (strripos($chaine, $users['CODE']) !== 0 || strripos($chaine, $users['NOM']) !== 0)
                            $this->listUsers[] = $users;
    }

    /**
     * Fonction filtrant une liste d'utilisateur en fonction de la chaine saisi par l'utilisateur
     * 
     * @param string $chaine
     *            : chaine de caractères rechecrhées
     * @param array $array
     *            : tableau d'utilisateur à filtrer sur le nom ou le code
     */
    function filtreListUsers($chaine, $array)
    {
        $this->listUsersFiltr = null;
        
        if (trim($chaine) != '') {
            foreach ($array as & $element)
                if (stripos($element['CODE'], $chaine) !== false || stripos($element['NOM'], $chaine) !== false)
                    $this->listUsersFiltr[] = $element;
        } else
            $this->listUsersFiltr = $array;
    }

    /**
     * Fonction initialisant la liste de tous les centres d'un groupe
     * 
     * @param string $grp
     *            : groupe dont on recherche les centres
     * @return void
     */
    function getListAllCentresInGroupe(& $login, $adminLocal, $groupe)
    {
        $this->listCentre = SqlAdministrationUsers::rqGetListAllCentreInGroupe($login, $adminLocal, $groupe)->TrouveTous();
    }

    /**
     * Fonction initialisant la liste de tous les utilisateurs d'un groupe
     * 
     * @param string $grp
     *            : groupe dont on recherche les centres
     * @return void
     */
    function getListAllUsersInGroupe(& $login, $adminLocal, $groupe)
    {
        $this->listUsers = SqlAdministrationUsers::rqGetListAllUsersInGroupe($login, $adminLocal, $groupe)->TrouveTous();
    }

    /**
     * Fonction initialisant la liste de tous les utilisateurs d'une societe
     * 
     * @param string $ste
     *            : societe dont on recherche les centres
     * @return void
     */
    function getListAllUsersInSte(& $login, $adminLocal, $ste)
    {
        $this->listUsers = SqlAdministrationUsers::rqGetListAllUsersInSociete($login, $adminLocal, $ste)->TrouveTous();
    }

    /**
     * Fonction initialisant la liste de toutes les directions présentent sur une societe
     * 
     * @param string $ste
     *            : societe dont on recherche les directions
     * @return void Spec 3011 - client 71 - Paramétrage fonction Liste chantiers
     */
    function getListAllDirectionsInSte($ste, $login, $adminLocal, $tri_par_code = false)
    {
        $this->listDirection = SqlAdministrationUsers::rqGetListAllDirectionsInSociete($ste, $login, $adminLocal, false, $tri_par_code)->TrouveTous();
    }

    /**
     * Fonction initialisant la liste de tous les SI supplémentaires que l'on peut associé à un code direction (Non déjà affecté) (spec 3011 - client 71 LG)
     * 
     * @param string $ste
     *            : societe
     * @param string $dir
     *            : direction
     * @return void
     *
     */
    function getListAllSIcomplLeft($societe, $direction, $tri_par_code = false)
    {
        $this->listSIComplLeft = SqlAdministrationUsers::rqGetListAllSIcomplLeft($societe, $direction, $tri_par_code)->TrouveTous();
    }

    /**
     * Fonction initialisant la liste de tous les SI supplémentaires associé à un code direction (spec 3011 - client 71 LG)
     * 
     * @param string $ste
     *            : societe
     * @param string $dir
     *            : direction
     * @return void
     *
     */
    function getListAllSIcomplDir($societe, $direction, $tri_par_code = false)
    {
        $this->listSIComplDir = SqlAdministrationUsers::rqGetListAllSIcomplDir($societe, $direction, $tri_par_code)->TrouveTous();
    }

    /**
     * Fonction permettant de lister les utilisateurs liés à un groupe d'utilisateur et inclus dans un groupe de droits
     *
     * @param string $grpUsers
     * @param string $grpDroits
     * @return void
     */
    function &getListAllUsersInGpeDroitsAndGpeUsers($grpUsers, $grpDroits, $left = false)
    {
        return SqlAdministrationUsers::rqGetListAllUsersInGpeDroitsAndGpeUsers($grpUsers, $grpDroits, $left)->TrouveTous();
    }

    /**
     * Fonction permettant de lister les utilisateurs pour une société donnée
     * et inclus dans un groupe de droits
     *
     * @param string $ste
     *            : Société dont on rechecrhe les utilisateurs
     * @param string $grpDroits
     *            : Groupe de droits dont on recherche les utilisateurs
     * @return void
     */
    function getListAllUsersInSocieteAndGrpDroits($ste, $grpDroits, $left = false)
    {
        return SqlAdministrationUsers::rqGetListAllUsersInSocieteAndGrpDroits($ste, $grpDroits, $left)->TrouveTous();
    }

    /**
     * Fonction retournant la requete permettant de connaitre la liste de tous les utilisateurs pour un centre donné
     * et inclus dans un groupe de droits
     *
     * @param string $centre
     *            : Centre dont on recherche tous les utilisateurs
     * @param string $grpDroits
     *            : Groupe de droits dont on recherche les utilisateurs
     * @return void
     */
    function &getListAllUsersInCtrAndGrpDroits($centre, $grpDroits, $left = false)
    {
        return SqlAdministrationUsers::rqGetListUsersInCtrAndGrpDroits($centre, $grpDroits, $left)->TrouveTous();
    }

    /**
     * Fonction initialisant les tableaux $listeUsers et $listeUsersLeft
     *
     * @param string $grpDroits
     */
    function init2ArrayForAllUsersInGroupesDroits($grpDroits)
    {
        $this->listeUsers = & SqlAdministrationUsers::rqGetListUsersInGrpDroits($grpDroits, false)->TrouveTous();
        $this->listeUsersLeft = & SqlAdministrationUsers::rqGetListUsersInGrpDroits($grpDroits, true)->TrouveTous();
    }

    /**
     * Fonction initialisant les tableaux $listeUsers et $listeUsersLeft
     *
     * @param string $grpUsers
     * @param string $grpDroits
     */
    function init2ArrayForGroupeUserInGroupesDroits($grpUsers, $grpDroits)
    {
        $this->listeUsers = $this->getListAllUsersInGpeDroitsAndGpeUsers($grpUsers, $grpDroits, false);
        $this->listeUsersLeft = $this->getListAllUsersInGpeDroitsAndGpeUsers($grpUsers, $grpDroits, true);
    }

    /**
     * Fonction initialisant les tableaux $listeUsers et $listeUsersLeft
     *
     * @param string $societe
     * @param string $grpDroits
     */
    function init2ArrayForSocieteUserInGroupesDroits($societe, $grpDroits)
    {
        $this->listeUsers = $this->getListAllUsersInSocieteAndGrpDroits($societe, $grpDroits, false);
        $this->listeUsersLeft = $this->getListAllUsersInSocieteAndGrpDroits($societe, $grpDroits, true);
    }

    /**
     * Fonction initialisant les tableaux $listeUsers et $listeUsersLeft
     *
     * @param string $centre
     * @param string $grpDroits
     */
    function init2ArrayForCentreUserInGroupesDroits($centre, $grpDroits)
    {
        $this->listeUsers = $this->getListAllUsersInCtrAndGrpDroits($centre, $grpDroits, false);
        $this->listeUsersLeft = $this->getListAllUsersInCtrAndGrpDroits($centre, $grpDroits, true);
    }

    /**
     * Section reservée au wsdl
     */
    
    /**
     * Fonction préparant la structure de données XML envoyées pour la modification d'association utilisateurs - groupe
     * 
     * @param string $groupe
     *            : code du groupe à modifier
     * @param array $ajout
     *            : tableau des utilisateurs à ajouter au groupe
     * @param array $retrait
     *            : tableau des utilisateurs à retirer du groupe
     * @return string $envoi : retourne la structure xml à transmettre au wsdl
     *        
     */
    function &prepareArrayForWsdlModifUserInGroup($groupe, $ajout, $retrait)
    {
        $ch_ajout = '';
        foreach ($ajout as & $element)
            $ch_ajout .= '<UserId>' . $element . '</UserId>';
        
        $envoi = '<ListUsrAjout>' . $ch_ajout . '</ListUsrAjout>';
        
        $ch_retrait = '';
        foreach ($retrait as & $element)
            $ch_retrait .= "<UserId>{$element}</UserId>";
        
        $envoi .= "<ListUsrSuppr>$ch_retrait</ListUsrSuppr>";
        
        $envoi = "<UsrGrpIn LngUtilisation='{$_SESSION['Session_Langue']}'><CodeGroupe>$groupe</CodeGroupe>$envoi</UsrGrpIn>";
        
        return $envoi;
    }

    /**
     * Fonction appelant le wsdl de modification d'users dans un groupe
     * 
     * @param string $envoi
     *            : structure de données au format XML tansmise au wsdl
     * @return array : retourne le resultat renvoyé par le wsdl
     */
    function &callWsdlForUpdateInGroupeUsers($envoi)
    {
        return Wsdl::wsdlCallGen('Oxaproc_CreatMod_User.wsdl', 'OXAPRC_MODIFUSERGRP', $envoi);
    }

    /**
     * Section réservée à la partie intégration des données dans le tableau xml
     */
    
    /**
     * Fonction intégrant une liste de groupe de société dans le tableau de données XML
     */
    function buildXML_ListGroup(&$xml_array, $login, $adminLocal)
    {
        $this->getListGroup($login, $adminLocal);
        if($this->listGroupe)
        {
            foreach ($this->listGroupe as $tmp)
                $xml_array['groupes']['liste'][] = array(
                    '!code' => $tmp['CODE_GRP'],
                    '!lib' => $tmp['RS_GRP']
                );
        }
    }

    /**
     * Fonction intégrant une liste de sociétés dans le tableau de données XML
     */
    function buildXML_ListSociete(&$xml_array, $login, $adminLocal, $groupe)
    {
        $this->getListSocForGroup($login, $adminLocal, $groupe);
        foreach ($this->listSociete as & $tmp)
            $xml_array['societes']['liste'][] = array(
                '!code' => & $tmp['CODE_STE'],
                '!lib' => & $tmp['RAIS_SOC']
            );
    }

    /**
     * Fonction intégrant une liste de centre dans le tableau de données XML
     */
    function buildXML_ListCentre(&$xml_array, $login, $adminLocal, $societe)
    {
        $this->getListCentreForSoc($login, $adminLocal, $societe);
        
        foreach ($this->listCentre as & $tmp)
            $xml_array['centres']['liste'][] = array(
                '!code' => & $tmp['CODE_CTR'],
                '!lib' => & $tmp['RAIS_SOC']
            );
    }

    /**
     * fonction intégrant la liste de toutes les societes dans le tableau de données XML
     */
    function buildXML_ListAllSocietes(&$xml_array, $login, $adminLocal, $tri_par_code = false)
    {
        $this->getListAllSociete($login, $adminLocal, $tri_par_code);
        
        foreach ($this->listSociete as & $tmp)
            $xml_array['societes']['liste'][] = array(
                '!code' => & $tmp['CODE_STE'],
                '!lib' => & $tmp['RAIS_SOC']
            );
    }

    /**
     * Fonction intégrant la liste de tous les centre dans le tableau de données XML
     */
    function buildXML_ListAllCentres(&$xml_array, $login, $adminLocal)
    {
        $this->getListAllCentre($login, $adminLocal);
        
        foreach ($this->listCentre as & $tmp)
            $xml_array['centres']['liste'][] = array(
                '!code' => & $tmp['CODE_CTR'],
                '!lib' => & $tmp['RAIS_SOC']
            );
    }

    /**
     * Fonction intégrant la liste de tous les utilisateurs dans le tableau de données XML
     */
    function buildXML_ListUsers(&$xml_array, $login, $isAdmLocal, $isMultiSoc, $societe)
    {
        if ($isMultiSoc == 1)
            $this->getListAllUsers($login, $isAdmLocal);
        else
            $this->getListAllUsersInSte($login, $isAdmLocal, $societe);
        
        foreach ($this->listUsers as & $tmp)
            $xml_array['users']['liste'][] = array(
                '!code' => & $tmp['CODE'],
                '!lib' => strtoupper($tmp['NOM'])
            );
    }

    /**
     * fonction intégrant la liste de toutes les directions en fonction de la société dans le tableau de données XML
     */
    function buildXML_ListDirections(&$xml_array, $societe, $login, $adminLocal, $tri_par_code = false)
    {
        $this->getListAllDirectionsInSte($societe, $login, $adminLocal, $tri_par_code);
        
        foreach ($this->listDirection as & $tmp)
            $xml_array['direction']['liste'][] = array(
                '!code' => & $tmp['CODE_DIR'],
                '!lib' => & $tmp['LIBELLE']
            );
    }

    function &buildXML_ListDirectionSociete($societe, $login, $adminLocal, $listeDisabled = null)
    {
        $array = array();
        $this->getListAllDirectionsInSte($societe, $login, $adminLocal);
        
        foreach ($this->listDirection as & $tmp)
            $array[] = array(
                '!code' => $tmp['CODE_DIR'],
                '!lib' => & $tmp['LIBELLE'],
                '!disable' => ($listeDisabled != null && array_key_exists($tmp['CODE_DIR'], $listeDisabled))
            );
        return $array;
    }

    function &buildXML_ListDirectionPartagePourUnSi($societe, $codeSi)
    {
        // La liaison du code SI se fait via le champ ID3
        $sql = 'SELECT DIRECTIO.CODE_DIR,DIRECTIO.LIBELLE ' . 'FROM PARAMDICO with(nolock),DIRECTIO with(nolock) ' . "WHERE PARAMDICO.TYPEDICO = 'GALEC_PARTAGE_GTSI' " . "AND   PARAMDICO.ID1 = '" . (Param::IsSISecto() ? ReplaceSqlPointeur($societe) : '') . "' " . "AND   PARAMDICO.ID3 = '" . ReplaceSqlPointeur($codeSi) . "' " . 'AND   DIRECTIO.CODE_STE = PARAMDICO.ID1 ' . 'AND   DIRECTIO.CODE_DIR  = PARAMDICO.ID2 ' . 'ORDER BY DIRECTIO.CODE_DIR ';
        $array = array();
        if ($res = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous())
            foreach ($res as & $tmp)
                $array[] = array(
                    '!code' => & $tmp['CODE_DIR'],
                    '!lib' => & $tmp['LIBELLE']
                );
        
        return $array;
    }

    /**
     * Spec 3213 Retourne la liste SI autorisé a etre exploité par l'administrateur en question
     */
    function &buildXML_ListSIFromDirection($societe, $login, $adminLocal)
    {
        // En premier donc obtenir la liste des directions autorisés pour l'administrateur connecté
        $xml_array = array();
        if ($listeDir = SqlAdministrationUsers::rqGetListAllDirectionsInSociete($societe, $login, $adminLocal, true)->TrouveTous()) {
            $requeteIn = '';
            foreach ($listeDir as & $direction)
                $requeteIn .= ($requeteIn == '' ? '' : ',') . '\'' . $direction['CODE_DIR'] . '\'';
            
            if ($this->listeSiCode = SqlAdministrationUsers::rqGetListSIFromDirection($societe, $requeteIn)->TrouveTous()) {
                foreach ($this->listeSiCode as & $tmp)
                    $xml_array[] = array(
                        '!code' => & $tmp['CODE_SI'],
                        '!lib' => & $tmp['LIB_CODE_SI'],
                        '!tooltip' => $tmp['CODE_DIR'] . ' ' . $tmp['LIB_CODE_DIR']
                    );
            }
        }
        
        return $xml_array;
    }

    function &getListeCodeSiGt()
    {
        return $this->listeSiCode;
    }

    /**
     * fonction intégrant la liste de tous les SI Complémentaires que l'on peut associé à un code direction et qui ne sont pas déjà associé
     * Spec 3011 - Client 71 Leon G
     */
    function buildXML_ListSIcomplémentires(&$xml_array, $societe, $direction, $tri_par_code = false)
    {
        $this->getListAllSIcomplLeft($societe, $direction, $tri_par_code);
        
        foreach ($this->listSIComplLeft as & $tmp)
            $xml_array['listSIComplLeft']['liste'][] = array(
                '!code' => & $tmp['CODE_SI'],
                '!lib' => & $tmp['LIBELLE']
            );
    }

    /**
     * fonction intégrant la liste de toutes les SI Complémentaires associées à un code direction sur une société
     * Spec 3011 - Client 71 Leon G
     */
    function buildXML_ListSIcomplémentiresDir(&$xml_array, $societe, $direction, $tri_par_code = false)
    {
        $this->getListAllSIcomplDir($societe, $direction, $tri_par_code);
        
        foreach ($this->listSIComplDir as & $tmp)
            $xml_array['listSIComplLeft']['liste'][] = array(
                '!code' => & $tmp['CODE_SI'],
                '!lib' => & $tmp['LIBELLE']
            );
    }

    function TraitementListeSIComplementairesSurDirection($societe, $direction, $ListeSIaTraiter)
    {
        if ('' != $societe && '' != $direction) {
            // suppression des enregistrements sur la société et la direction choisie des anciens enregistrements
            $resultSuppression = SqlAdministrationUsers::rqdeleteSIsurDirectionPARAMDICO($societe, $direction)->ExecuteSql();
            if (! is_null($ListeSIaTraiter) && $resultSuppression) {
                // mise à jour de la table PARAMDICO avec les nouveaux enregistrements
                foreach ($ListeSIaTraiter as & $codeSIaTraiter)
                    SqlAdministrationUsers::rqInsertSIsurDirectionPARAMDICO($societe, $direction, $codeSIaTraiter)->ExecuteSql();
                
                return true;
            }
        }
        return false;
    }

    function isPartageDirectionSI_GALEC($societe, $codeSi, $codeDir)
    {
        if (SqlAdministrationUsers::rqSelectPartageDirectionSI_GALEC($societe, $codeSi, $codeDir)->Trouve1())
            return true;
        else
            return false;
    }

    function insertPartageDirectionSI_GALEC($societe, $codeSi, $codeDir)
    {
        return SqlAdministrationUsers::rqInsertPartageDirectionSI_GALEC($societe, $codeSi, $codeDir)->ExecuteSql();
    }

    function deletePartageDirectionSI_GALEC($societe, $codeSi, $codeDir)
    {
        return SqlAdministrationUsers::rqDeletePartageDirectionSI_GALEC($societe, $codeSi, $codeDir)->ExecuteSql();
    }
}

// fin de class