<?php

/**
 * Classe permettant de gérer les imputations
 *
 */
class Imputation
{

    /**
     * Attributs
     */
    // Chaque axe d'imputation est initialisé selon 3 priorités
    // Ex : $prioritesSI[0] => priorité 1 | $prioritesSI[1] => priorité 2 | $prioritesSI[3] => priorité 3
    public $prioritesSI = array();
 // Tableau contenant les règles d'initialisation de l'axe imput SI
    public $prioritesSCA = array();
 // Tableau contenant les règles d'initialisation de l'axe imput SCA
    public $prioritesCDC = array();
 // Tableau contenant les règles d'initialisation de l'axe imput CDC
    public $prioritesCG = array();
 // Tableau contenant les règles d'initialisation de l'axe imput CG
    protected $IsPrioritesInit = false;
 // Flag indiquant si les attributs $prioritesSI, $prioritesSCA et $prioritesCDC ont été initialisés

    public $prioritesForCdeOrDASI = array();
 // Tableau contenant les règles d'initialisation de l'axe imput SI
    public $prioritesForCdeOrDASCA = array();
 // Tableau contenant les règles d'initialisation de l'axe imput SCA
    public $prioritesForCdeOrDACDC = array();
 // Tableau contenant les règles d'initialisation de l'axe imput CDC
    public $prioritesForCdeOrDACG = array();
    
    /**
     * Constructeur
     */
    public function __construct()
    {
        $this->getReglesInitImput();
    }

    /**
     * Méthodes
     */
    
    /**
     * Fonction permettant d'initialiser les attributs $prioritesSI, $prioritesSCA et $prioritesCDC
     */
    public function getReglesInitImput()
    {
        // On recherche le type de document par défault
        $r = & SqlParam::rqGetParamParavrac('OXAPROC', 'TYPDOCUMENT')->Trouve1();
        $typeDoc = $r['LIB01PARV'];
        
        // Si celui-ci existe alors on recherche les priorités relatives à ce type de document
        if ($typeDoc !== '') {
            $chaine_priorites = & SqlParam::rqGetInitImputPriorite($typeDoc)->Trouve1(true);
            // Si aucune priorité n'est définie pour ce type de document
            if (! is_array($chaine_priorites))
                // Alors on recherche les priorités définies pas défaut
                $chaine_priorites = & SqlParam::rqGetInitImputPrioriteDefaut()->Trouve1();
        }
        
        // A partir de la chaine globale de priorités récupérées on initialise les priorités de chaque axe
        // Rappel : la chaine des priorités est de la forme '<si>|<sca>|<cdc>' => 'DEM;ART;ENT|DEM;ART;|ENT;DEM;'
        if (is_array($chaine_priorites) && array_key_exists('LIB01PARV', $chaine_priorites)) {
            $priorites = explode('|', $chaine_priorites['LIB01PARV']);
            $this->prioritesSI = explode(';', $priorites[0]);
            $this->prioritesCG = $this->prioritesSI;
            $this->prioritesSCA = explode(';', $priorites[1]);
            $this->prioritesCDC = explode(';', $priorites[2]);
            // On passe le flag d'initialisée àÂ  vrai
            $this->IsPrioritesInit = true;
        }
    }

    /**
     * Fonction retournant la valeur d'une imputation selon les règles de priorités définies dans Haplus
     *
     * @param string $type_imput
     *            : type d'imputation pour laquelle on recherche la valeur d'init
     * @param string $code_art
     *            : code de l'article pour lequel on recherche l'imputation, paramètre optionnel
     * @param int $id_panier
     *            : Id du panier dont les valeurs d'entête vont servir pour l'initialisation
     */
    public function &getInitImput($type_imput, & $code_art, & $code_sfam, $id_panier)
    {
        // On recherche les priorités d'initialisation des axes d'imputation pour le type de document par défaut renseigné dans HAPLUS
        $valeur_init = '';
        
        // Dans l'ordre des priorités et tant que la valeur d'initialisation est vide
        foreach ($this->{'priorites' . $type_imput} as & $value) { // La référence àÂ  la priorité est construite dynamiquement en fonction de $type_imput
                                                                   // Recherche de la valeur d'initialisation selon le type de priorité

            switch ($value) {
                
                case 'ENT': // Initialisation àÂ  partir de la valeur d'entete du panier
                    
                    if (is_numeric($id_panier)) {
                        $PanierEntete = new PanierEntete();
                        $PanierEntete->getEntetePanier($id_panier, $_SESSION['id_user']);
                        
                        $si = $PanierEntete->getSI_CODE();
                        $sca = $PanierEntete->getSCA_CODE();
                        $cdc = $PanierEntete->getCDC_CODE();
                        $cg = $PanierEntete->getCG_CODE();
                    } else {
                        $si = $_SESSION['Session_SectionImputation'];
                        $sca = $_SESSION['Session_SCA'];
                        $cdc = $_SESSION['Session_CDC'];
                        $cg = '';
                    }
                    
                    if ($type_imput == 'SI') // Dans le cas des SI
                        $valeur_init = $si;
                    elseif ($type_imput == 'SCA') // Dans le cas des SCA
                        $valeur_init = $sca;
                    elseif ($type_imput == 'CDC') // Dans le cas des CDC
                        $valeur_init = $cdc;
                    elseif ($type_imput == 'CG')
                        $valeur_init = $cg;
                    
                    break;
                
                case 'DEM': // Initialisation par le profil du demandeur
                    
                    if ($type_imput == 'SI') // Dans le cas des SI
                        $valeur_init = $_SESSION['Session_SectionImputation'];
                    elseif ($type_imput == 'SCA') // Dans le cas des SCA
                        $valeur_init = $_SESSION['Session_SCA'];
                    elseif ($type_imput == 'CDC') // Dans le cas des CDC
                        $valeur_init = $_SESSION['Session_CDC'];
                    elseif ($type_imput == 'CG') // Dans le cas des CG
                        $valeur_init = '';
                    
                    break;
                
                case 'ART': // Initialisation par la fiche article
                            // Si le code article est renseigné alors la recherche de l'initialisation est réalisé par rapport au code article
                    if ('' != trim($code_art))
                    {    // Alors on initialise l'axe d'imputation
                        $valeur_init = $this->getImputByArticle($_SESSION['Session_SocUsr'], $code_art, $type_imput);
                    }
                    // Sinon, on réalise l'initialisation par rapport à la sous-famille
                    else
                    {    // Alors on initialise l'axe d'imputation
                        $valeur_init = $this->getImputBySousFamille($_SESSION['Session_SocUsr'], $code_sfam, $type_imput);                        
                    }
                    break;
                
                case '': // Initialisation à blanc
                    
                    $valeur_init = '';
                    
                    break;
            }
            
            // Si valeur d'initialisation de l'axe SI ou SCA ou CDC est renseignée ou bien si la prirorité est àÂ  blanc
            // alors on sort de la boucle
            if ($valeur_init != '' || $value == '')
                break;
        }
        
        // Et on retourne la valeur d'initialisation
        return $valeur_init;
    }

    /**
     * Fonction permettant d'initialiser les attributs $prioritesSI, $prioritesSCA et $prioritesCDC
     */
    public function getReglesInitImputForCdeOrDA($type, $type_doc)
    {
        // Si celui-ci existe alors on recherche les priorités relatives à ce type de document
        if ($type == 'DA') {
            $chaine_priorites = & SqlParam::rqGetInitImputPriorite($type_doc)->Trouve1(true);
            // Si aucune priorité n'est définie pour ce type de document
            if (! is_array($chaine_priorites))
                // Alors on recherche les priorités définies pas défaut
                $chaine_priorites = & SqlParam::rqGetInitImputPrioriteDefaut()->Trouve1();
        }
        else{
            $chaine_priorites = & SqlParam::rqGetInitImputPrioriteForCde($type_doc)->Trouve1(true);
            // Si aucune priorité n'est définie pour ce type de document
            if (! is_array($chaine_priorites))
                // Alors on recherche les priorités définies pas défaut
                $chaine_priorites = & SqlParam::rqGetInitImputPrioriteDefautForCde()->Trouve1();
        }
        // A partir de la chaine globale de priorités récupérées on initialise les priorités de chaque axe
        // Rappel : la chaine des priorités est de la forme '<si>|<sca>|<cdc>' => 'DEM;ART;ENT|DEM;ART;|ENT;DEM;'
        if (is_array($chaine_priorites) && array_key_exists('LIB01PARV', $chaine_priorites)) {
            $priorites = explode('|', $chaine_priorites['LIB01PARV']);
            $this->prioritesForCdeOrDASI = explode(';', $priorites[0]);
            $this->prioritesForCdeOrDACG = $this->prioritesForCdeOrDASI;
            $this->prioritesForCdeOrDASCA = explode(';', $priorites[1]);
            $this->prioritesForCdeOrDACDC = explode(';', $priorites[2]);
        }
    }

    /**
     * Fonction retournant la valeur d'une imputation selon les règles de priorités définies dans Haplus
     *
     * @param string $type_imput
     *            : type d'imputation pour laquelle on recherche la valeur d'init
     * @param string $code_art
     *            : code de l'article pour lequel on recherche l'imputation, paramètre optionnel
     * @param int $id_panier
     *            : Id du panier dont les valeurs d'entête vont servir pour l'initialisation
     */
    public function &getInitImputForCdeOrDA($type_imput, $code_art, $code_sfam, $type, $type_doc, $id_doc, $si_init = '')
    {
        // On recherche les priorités d'initialisation des axes d'imputation pour le type de document par défaut renseigné dans HAPLUS
        $valeur_init = '';
        
        if($type_imput == 'CG'){
            $type_imput_temp = 'SI';
        }
        
        // Dans l'ordre des priorités et tant que la valeur d'initialisation est vide
        $this->getReglesInitImputForCdeOrDA($type, $type_doc);
        foreach ($this->{'prioritesForCdeOrDA' . ($type_imput_temp ?? $type_imput)} as $key => & $value) { // La référence à la priorité est construite dynamiquement en fonction de $type_imput
            // Recherche de la valeur d'initialisation selon le type de priorité
            switch ($value) {
                case 'ENT': // Initialisation à partir de la valeur d'entete
                    if($type == 'DA'){
                        $info_da = SqlDa::getInfoOnEnteteDA($id_doc)->Trouve1();
                        
                        $code_ste = $info_da['CODE_STE'];
                        $si = $info_da['SECTIMP'];
                        $sca = $info_da['SSCPTEANA'];
                        $cdc = $info_da['CODECOMP'];
                        $cg = $info_da['CODGES'];
                    }
                    if($type == 'CDE'){
                        $info_cde = SqlCDE::getInfoOnEnteteCDE($id_doc)->Trouve1();
                        
                        $code_ste = $info_cde['CODE_STE'];
                        $si = $info_cde['SECTIMP'];
                        $sca = $info_cde['SSCPTEANA'];
                        $cdc = $info_cde['CODECOMP'];
                        $cg = $info_cde['CODGES'];
                    }
                    
                    $infoSI = SqlInfo::getInfoOnSI($si, $code_ste);
                    
                    if ($type_imput == 'SI')
                    {
                        $valeur_init = $si;
                    }

                    if ($type_imput == 'SCA')
                    {
                        $valeur_init = $sca;
                    }

                    if ($type_imput == 'CDC')
                    {
                        $valeur_init = $cdc;
                    }

                    if ($type_imput == 'CG' && $key == 0 && $si_init == $si && BoolSql($infoSI['SICODG']))
                    {
                        $valeur_init = $cg;
                    }else{
                        $valeur_init = '';
                    }
                    
                    break;
                
                case 'ART': // Initialisation par la fiche article
                    if(trim($code_art) != '')
                    {
                        // Si le code article est renseigné, la recherche de l'initialisation est réalisé par rapport au code article
                        $valeur_init = $this->getImputByArticle($code_ste, $code_art, $type_imput);
                        
                        // Si cette valeur est vide, on réalise l'initialisation par rapport à la sous-famille ou la famille
                        if($valeur_init == '' && $code_sfam != ''){
                            $valeur_init = $this->getImputBySousFamille($code_ste, $code_sfam, $type_imput);
                        }
                    }       
                
                    break;
                
                case 'DEM': // Initialisation par le profil du demandeur (Spécifique DA)
                    if ($type_imput == 'SI')
                        $valeur_init = $_SESSION['Session_SectionImputation'];
                    elseif ($type_imput == 'SCA')
                        $valeur_init = $_SESSION['Session_SCA'];
                    elseif ($type_imput == 'CDC')
                        $valeur_init = $_SESSION['Session_CDC'];
                    elseif ($type_imput == 'CG')
                        $valeur_init = '';
                    
                    break;
                    
                case 'DA':  // Initialisation par la DA (Spécifique CDE)            
                    // TODO

                    break;
                
                case '': // Initialisation à blanc
                    $valeur_init = '';
                    
                    break;
            }
            
            // Si valeur d'initialisation de l'axe SI ou SCA ou CDC est renseignée ou bien si la prirorité est à blanc
            // alors on sort de la boucle
            if ($valeur_init != '' || $value == '')
                break;
        }
        
        // Et on retourne la valeur d'initialisation
        return $valeur_init;
    }

    /**
     *
     * @param unknown $CG
     *            NE PAS METTRE DE REFERENCE. Cette valeur est retrounée à lidentique si le spécifique n'est pas concerné
     * @param unknown $id_panier
     * @param unknown $codSfam
     * @return unknown
     */
    public static function majSpecfiqueCG_28_35_37($CG, $SI, $id_panier, $codSfam)
    {
        if ($_SESSION['Session_NumClient'] == 35 || $_SESSION['Session_NumClient'] == 37 || $_SESSION['Session_NumClient'] == 28) {
            $panierEntete = new PanierEntete();
            $panierEntete->getEntetePanier($id_panier, $_SESSION['id_user']);
            
            $codeSociete = $panierEntete->getCODE_STE();
            
            $cgTrouve = null;
            
            /**
             * On recherche si le CG sur la base de société
             */
            $concat = 'S|' . trim($codeSociete) . '|' . trim($codSfam);
            $sql = " SELECT LIB01DICO FROM DILISPEC WITH(NOLOCK) WHERE	TYPEDICO ='BYCN_EOTP'	AND		CODEDICO ='" . ReplaceSqlPointeur($concat) . "'";
            if (($tmp = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) && trim($tmp['LIB01DICO']) != '') {
                $cgTrouve = $tmp['LIB01DICO'];
            } else {
                /**
                 * Sinon on recherche au niveau du groupe de la societe
                 */
                $sql = 'SELECT GROUPE FROM SOCIETE WITH(NOLOCK) WHERE CODE_STE = \'' . ReplaceSqlPointeur($codeSociete) . '\'';
                $requete = new RequeteSQL($sq, DB_OXASQLDB);
                if (($tmp = $requete->Trouve1())) {
                    $concat = 'G|' . trim($tmp['GROUPE']) . '|' . trim($codSfam);
                    $sql = " SELECT LIB01DICO FROM DILISPEC WITH(NOLOCK) WHERE	TYPEDICO ='BYCN_EOTP'	AND		CODEDICO ='" . ReplaceSqlPointeur($concat) . "'";
                    if ($tmp = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                        $cgTrouve = $tmp['LIB01DICO'];
                    }
                }
            }
            /**
             * Dans le cas d'existence de CG via DILISPEC alors on verifie sa validité et SI alors on retourne le resultat
             */
            if (! is_null($cgTrouve)) {
                if ($lot = SqlCg::getNumLot()->Trouve1()) {
                    
                    // ECA 26/11/2007 Sécurisation du numéro de lot à 0 afin d'éviter les erreurs sql
                    if (! is_numeric($lot['NUM_LOT']))
                        $lot['NUM_LOT'] = 0;
                    
                    if (Param::IsSISecto())
                        $reqSql = SqlCg::getUniqCGSecto($panierEntete->getCODE_STE(), $SI, $lot['NUM_LOT'], $cgTrouve);
                    else
                        $reqSql = SqlCg::getUniqCG($SI, $lot['NUM_LOT'], $cgTrouve);
                    
                    if ($reqSql->Trouve1())
                        $CG = $cgTrouve;
                }
            }
        }
        return $CG;
    }

    /**
     * Fonction vérifiant l'existence de CG pour une société et un si donné
     *
     * @param string $code_ste
     *            : Code de la société en cours
     * @param string $code_si
     *            : Code de la section d'imputation par rapport à laquelle on recherche l'existence de CG
     *            
     * @return array : liste des CG trouvés
     */
    public static function &getListeCGForSI($code_ste, $code_si)
    {
        // On détermine le numéro de lot de CG en cours
        $lot = SqlCg::getNumLot()->Trouve1();
        
        // On établit la liste des CG liés à la SI
        if (1 == Param::IsSISecto()) // Si les SI sont sectorisés
            $reqSql = SqlInfo::SqlCGSteSectoRecherche($code_ste, $code_si, $lot['NUM_LOT'], '', '', 1);
        else // Sinon
            $reqSql = SqlInfo::SqlCGSteRecherche($code_si, $lot['NUM_LOT'], '', '', 1);
        $listeCG = $reqSql->TrouveTous();
        // Retourne vrai si au moins 1 CG est présent sur la SI donnée
        return $listeCG;
    }

    /**
     * Fonction retournant un booelan pour indiquer la présence de CG pour un SI donné
     *
     * @param string $code_ste
     *            : code de la société
     * @param string $code_si
     *            : code de la SI par rapport à laquelle on recherche l'existence de CG
     * @return booelan : 1 si un CG au moins existe sinon 0
     */
    public static function existCGforSI($code_ste, $code_si)
    {
        $listeCG = Imputation::getListeCGForSI($code_ste, $code_si);
        
        return (is_array($listeCG) && count($listeCG) > 0);
    }

    /**
     * Fonction gérant l'affichage de la zone de saisie de code gestion en fonction de la société et de la section d'imputation
     *
     * @param string $code_ste
     *            : Code de la société en cours
     * @param string $code_si
     *            : Code de la section d'imputation par rapport à laquelle on recherche l'existence de CG
     * @param string $zone_cg
     *            : Zone qui sera masquée ou affichée selon la présence de CG pour la société et la section d'imputation passée en paramètre
     * @param string $affichage
     *            : Mode d'affichage/masquage de la zone : mode display ou visibility
     *            
     * @return void
     */
    public function setVisibilityCG($code_ste, $code_si, $zone_cg, $affichage = 'visibility')
    {
        $listeCG = Imputation::getListeCGForSI($code_ste, $code_si);
        // Si des CG existent sur la SI donnée alors on affiche la zone de saisie
        if (is_array($listeCG) && count($listeCG) > 0)
            if ('visibility' == $affichage)
                Affichage::vueElement($zone_cg, true);
            else
                Affichage::vueElement($zone_cg, false);
        // Sinon on la masque
        else if ('visibility' == $affichage)
            Affichage::vueElement($zone_cg, true);
        else
            Affichage::vueElement($zone_cg, false);
    }

    /**
     * Fonction permettant de retourner pour un article donné, un type d'imputation donné et une société donnée,
     * la valeur de l'axe d'imputation liée à l'article ou à la sous-famille de l'article ou liée à la famille de l'article
     *
     * @param string $ste
     *            : Société de l'utilisateur
     * @param string $code_art
     *            : Code article pour lequel la valeur de l'axe d'imputation est recherché
     * @param string $type_imput
     *            : Type d'axe d'imputation : SI, CDC, SCA et CG
     * @return string : Valeur de l'axe d'imputation
     */
    public function &getImputByArticle(& $ste, & $code_art, & $type_imput)
    {
        
        // On recherche les informations et notamment les imputations associées àÂ  l'article en question
        $data = & Article::getInfoOnArticle($code_art);
        
        // Si l'imputation de l'article est renseignée alors on récupère sa valeur
        if (is_array($data) && array_key_exists($type_imput, $data))
            $valeur_init = $data[$type_imput];
        else
            $valeur_init = '';
        
        // Sinon, on recherche la valeur d'initialisation associée à la sous-famille
        if ('' == trim($valeur_init)) {
            switch ($type_imput) {
                case 'SI':
                    $data = & SqlSi::rqSelectSIbySousFamilleArt($ste, $code_art)->Trouve1();
                    if (is_array($data) && array_key_exists($type_imput, $data)) {
                        $valeur_init = $data[$type_imput];
                    }
                    break;
                
                case 'SCA':
                    $data = & SqlSi::rqSelectSCAbySousFamilleArt($ste, $code_art)->Trouve1();
                    if (is_array($data) && array_key_exists($type_imput, $data)) {
                        $valeur_init = $data[$type_imput];
                    }
                    break;
                
                case 'CDC':
                    $data = & SqlSi::rqSelectCDCbySousFamilleArt($ste, $code_art)->Trouve1();
                    if (is_array($data) && array_key_exists($type_imput, $data)) {
                        $valeur_init = $data[$type_imput];
                    }
                    break;
                
                default:
                    $valeur_init = '';
                    break;
            }
            
            // Sinon on recherche la valeur d'initialisation associée à la famille
            if ('' == trim($valeur_init)) {
                switch ($type_imput) {
                    case 'SI':
                        $data = & SqlSi::rqSelectSIbyFamilleArt($ste, $code_art)->Trouve1();
                        if (is_array($data) && array_key_exists($type_imput, $data)) {
                            $valeur_init = $data[$type_imput];
                        }
                        break;
                    
                    case 'SCA':
                        $data = & SqlSi::rqSelectSCAbyFamilleArt($ste, $code_art)->Trouve1();
                        if (is_array($data) && array_key_exists($type_imput, $data)) {
                            $valeur_init = $data[$type_imput];
                        }
                        break;
                    
                    case 'CDC':
                        $data = & SqlSi::rqSelectCDCbyFamilleArt($ste, $code_art)->Trouve1();
                        if (is_array($data) && array_key_exists($type_imput, $data)) {
                            $valeur_init = $data[$type_imput];
                        }
                        break;
                    
                    default:
                        $valeur_init = '';
                        break;
                }
            }
        }
        
        return $valeur_init;
    }

    /**
     * Fonction permettant de retourner pour une sous-famille donnée, un type d'imputation donné et une société donnée,
     * la valeur de l'axe d'imputation liée à la sous-famille ou liée à la famille de l'article
     *
     * @param string $ste
     *            : Société de l'utilisateur
     * @param string $code_sfam
     *            : Code sous-famille pour lequel on recherche l'initialisation de l'imputation
     * @param string $type_imput
     *            : Type d'axe d'imputation : SI, CDC, SCA et CG
     * @return string : Valeur de l'axe d'imputation
     */
    public function &getImputBySousFamille(& $ste, & $code_sfam, & $type_imput)
    {
        $valeur_init = '';
        switch ($type_imput) {
            case 'SI':
                $data = & SqlSi::rqSelectSIbySousFamille($ste, $code_sfam)->Trouve1();
                if (is_array($data) && array_key_exists($type_imput, $data))
                    $valeur_init = $data[$type_imput];
                
                break;
            
            case 'SCA':
                $data = & SqlSi::rqSelectSCAbySousFamille($ste, $code_sfam)->Trouve1();
                if (is_array($data) && array_key_exists($type_imput, $data))
                    $valeur_init = $data[$type_imput];
                
                break;
            
            case 'CDC':
                $data = & SqlSi::rqSelectCDCbySousFamille($ste, $code_sfam)->Trouve1();
                if (is_array($data) && array_key_exists($type_imput, $data))
                    $valeur_init = $data[$type_imput];
                break;
            
            default:
                $valeur_init = '';
                break;
        }
        
        // Sinon on recherche la valeur d'initialisation associée à la famille
        if ('' == trim($valeur_init)) {
            switch ($type_imput) {
                case 'SI':
                    $data = & SqlSi::rqSelectSIbyFamille($ste, $code_sfam)->Trouve1();
                    if (is_array($data) && array_key_exists($type_imput, $data))
                        $valeur_init = $data[$type_imput];
                    
                    break;
                
                case 'SCA':
                    $data = & SqlSi::rqSelectSCAbyFamille($ste, $code_sfam)->Trouve1();
                    if (is_array($data) && array_key_exists($type_imput, $data))
                        $valeur_init = $data[$type_imput];
                    
                    break;
                
                case 'CDC':
                    $data = & SqlSi::rqSelectCDCbyFamille($ste, $code_sfam)->Trouve1();
                    if (is_array($data) && array_key_exists($type_imput, $data))
                        $valeur_init = $data[$type_imput];
                    
                    break;
                
                default:
                    $valeur_init = '';
                    break;
            }
        }
        
        return $valeur_init;
    }

    /**
     * Fonction retournant pour un axe d'imputation donné, une société donnée, un code d'imputation donné, la valeur du libellé correspondant
     *
     * @param string $type_imputation
     * @param string $ste
     * @param string $code_axe_imputation
     * @param string $si
     * @return string libelle
     */
    public static function &getLibelleImput($type_imputation, & $ste, & $code_axe_imputation, $si = '')
    {
        $libelle = '';
        
        switch ($type_imputation) {
            case 'CTA':
                $info_imput = & SqlSi::getInfoForOneCTA($code_axe_imputation, $ste)->Trouve1();
                $libelle = $info_imput['LIBELLE'];
                
                break;
            case 'SI':
                $info_imput = & SqlSi::getInfoForOneSI($code_axe_imputation, $ste)->Trouve1();
                $libelle = $info_imput['LIBELLE'];
                
                break;
            
            case 'SCA':
                $info_imput = & SqlSi::getInfoForOneSCA($code_axe_imputation, $ste)->Trouve1();
                $libelle = $info_imput['LIBELLE'];
                break;
            
            case 'CDC':
                $info_imput = & SqlSi::getInfoForOneCDC($code_axe_imputation, $ste)->Trouve1();
                $libelle = $info_imput['LIBELLE'];
                break;
            
            case 'CG':
                $num_lot = SqlCg::getNumLot()->Trouve1();
                
                if (is_array($num_lot) && array_key_exists('NUM_LOT', $num_lot)) {
                    $info_imput = & SqlCg::getLibelleCG($si, $num_lot['NUM_LOT'], $code_axe_imputation)->Trouve1();
                    $libelle = $info_imput['libelle'];
                }
                
                break;
        }
        
        return $libelle;
    }

    /**
     * fonction retournant le centre de livraison associé à une SI via le CS défini à cet effet.
     *
     * @param string $si
     * @param string $ste
     * @return string $centre de livraison
     */
    public function &getCtrLivBySiAndSte(& $si, & $ste)
    {
        $result = & SqlCentreGene::rqGetCtrLivBySiandSte($si, $ste)->Trouve1();
        if (is_array($result) && count($result) > 0 && '' != trim($result['VALEUR']))
            return $result['VALEUR'];
        
        return $result;
    }
}
