<?php
if (! class_exists('RechercheArticleMetier')) {

    class RechercheArticleMetier extends BaseSynequa
    {

        protected $index_m;

        private $clause = null;

        /*
         * @author Eric Carles le 03/10/2007
         * Ajout de commentaires
         *
         * $this->index_m est un attribut permettant d'indicer la ligne ayant le meilleur prix
         */
        function __construct($properties = array(), $CODE_FM, $CODE_MET, $CODE_SPE, $noPerimetre = false)
        {
            $this->CODE_FM = $CODE_FM;
            $this->CODE_MET = $CODE_MET;
            $this->CODE_SPE = $CODE_SPE;
            
            $this->select = 'SELECT * FROM ' . $_SESSION['INTUITION_FMT'] . ' ';
            
            // SPEC 4100 remplacer le centre émetteur de la session par le centre émetteur du panier s'il existe
            $panierEntete = new PanierEntete();
            if($panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user'])){
                $centreEmetteur = $panierEntete->getCENTRE_EMETTEUR();
            }
            else{
                $centreEmetteur = $_SESSION['Session_CodeCtrEmetteur'];
            }
            $lst_cat = & BaseSynequa::getListeCatPubForUser($_SESSION['Session_Login'], $_SESSION['Session_CodeCtrLivraison'], $centreEmetteur);
            $lst_ctr = & BaseSynequa::getListeCatPubForCtr();
            
            if ((is_null($properties) || ! array_key_exists('clause', $properties) || $properties['clause'] == 1) && !$noPerimetre) {
                $this->clause = " AND (catprlst <> '' AND catprlst IN {$lst_cat} ) " . ($lst_ctr != '' && $lst_ctr != "('')" && $lst_ctr != '' ? " AND (dcouplst = '' OR dcouplst IN {$lst_ctr} ) " : '');
            }
        
        /**
         * ' AND (datepub <= '{$today}' OR datepub = '00000000') '.
         * AND (validcata >= '{$today}' OR validcata = '00000000') '.
         */
        }

        public function &getIndex_m()
        {
            return $this->index_m;
        }

        public function setIndex_m($v)
        {
            $this->index_m = & $v;
        }

        
        function &InfoArt($article = array(), $code_frs = '', $limite = 0, $estRechercheCatalogueFournisseur = false, $clauseSsFam = false, $catAvecCC = false)
        {
            if ($_SESSION['STATUT_RECH_ART'] != 1) {
                return [];
            }
            
            $this->unique_oxaproc_art = array(
                'COD_ART',
                'COD_ACD'
            );
            
            $this->flg_cde = 0;
            $this->index_m = - 1;
            
            $where = '';
            
            // Si un code article est présent dans le tableau passé en paramètre
            if (is_array($article) && array_key_exists('COD_ART', $article)) {
                foreach ($this->unique_oxaproc_art as $index) {
                    if (isset($article[$index]) && '' != $article[$index]) {
                        // pb reference
                        $art = trim($article[$index]);
                        $where .= " AND {$index} = '" . ReplaceSqlPointeur($art) . "' ";
                    }
                }
                
            }
            
            // Si un code et une référence fabricant sont passés en paramètre
            if($catAvecCC && array_key_exists('COD_FAB', $article) && array_key_exists('REF_FAB', $article) && ('' != trim($article['COD_FAB']) || '' != trim($article['REF_FAB']))){
                $where .= " AND (REF_FAB = '" . replacesql(trim($article['REF_FAB'])) . "' AND COD_FAB = '" . replacesql(trim($article['COD_FAB'])) . "') ";
            }
            elseif (is_array($article) && array_key_exists('COD_FAB', $article) && array_key_exists('REF_FAB', $article) && '' != trim($article['COD_FAB']) && '' != trim($article['REF_FAB'])){
                $where .= " OR (REF_FAB = '" . replacesql(trim($article['REF_FAB'])) . "' AND COD_FAB = '" . replacesql(trim($article['COD_FAB'])) . "') ";
            }elseif (is_array($article)){
                $clauseFab = '';
                if(array_key_exists('COD_FAB', $article) && '' != trim($article['COD_FAB'])){
                    $clauseFab .= "COD_FAB = '" . replacesql(trim($article['COD_FAB'])) . "'";
                }
                if(array_key_exists('REF_FAB', $article) && '' != trim($article['REF_FAB'])){
                    if($clauseFab != ''){
                        $clauseFab .= " AND ";
                    }
                    $clauseFab .= " REF_FAB = '" . replacesql(trim($article['REF_FAB'])) . "'";
                }
                if(array_key_exists('REF_FOURN', $article) && '' != trim($article['REF_FOURN'])){
                    if($clauseFab != ''){
                        $clauseFab .= " AND ";
                    }
                    $clauseFab .= " REF_FOURN = '" . replacesql(trim($article['REF_FOURN'])) . "'";
                }
                if($clauseFab != ''){
                    $where .= " OR ($clauseFab) ";
                }
            }
            
            // Si un code fournisseur est passé en paramètre
            if ('' != $code_frs) {
                $where .= " AND (COD_FOURN = '" . ReplaceSqlPointeur($code_frs) . '\' ' . SqlSynequa::getListeIdCatFromFrs($code_frs) . ' ) ';                
            }
            
            // DOSSIER 33392 : Panier de type régul ou avenant : Prise en compte des sous-familles liés au fournisseur et aux sous-familles sans lien avec des fournisseurs si le paramètre « Limiter le choix du fournisseur à la liste des fournisseurs référencés pour la sous-famille et l’article » est activé et si l’utilisateur n'a pas le droit « Oxaproc : Voir tous fourn/art gén »
            if($clauseSsFam){
                // Récupération du code fournisseur
                $codeFrsRegul = '';
                if (array_key_exists('PANIER_TYPE_SPEC', $_SESSION) && 'REGUL' === $_SESSION['PANIER_TYPE_SPEC']) {
                    $panierEntete = new PanierEntete();
                    $panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);
                    $champSpecifique = explode('=', $panierEntete->getCHPSPECCLT());
                    
                    if (('codfrs' === $champSpecifique[0] || 'REGUL|codfrs' === $champSpecifique[0]) && '' != $champSpecifique[1]) {
                        $codeFrsRegul = $champSpecifique[1];
                    }
                }
                if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE'])) {
                    $codeFrsRegul = $_SESSION['PANIER_FOURNISSEUR_IMPOSE'];
                }
                
                if($codeFrsRegul != ''){
                    // Sous-famille liées au fournisseur
                    $r = SqlParam::rqGetParamParavrac('OXAPROC', 'ARTGEN_LISTEFOURN_LIMITEE')->Trouve1();
                    $limitationChoixFournisseur = is_array($r) && array_key_exists('LIB01PARV', $r) && $r['LIB01PARV'] == 'O';
                    $droitVoirTousFourniss = SqlUsers::droitsUtilisateur('OX_AG_LF_L')->Trouve1()['DROIT'];
                    if($limitationChoixFournisseur && !$droitVoirTousFourniss){
                        
                        $where .= " and SSFAM in (select CODE_SFAM from SSFAMFOU where CODE_FOUR= ''$codeFrsRegul'')
                        or SSFAM  NOT IN (select CODE_SFAM from SSFAMFOU where CODE_FOUR <> ''$codeFrsRegul'')";
                        
                    }
                }
            }
            
            //ajout de la clause dossier 34350
            // Si un fournisseur est imposé alors on ajoute le filtre du fournisseur sur la recherche Intuition
            if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE'])) {
                $where .= " AND (COD_FOURN =   '" . ReplaceSqlPointeur($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . '\' ' . SqlSynequa::getListeIdCatFromFrs($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . ") ";                
            }
            
            $req = "select * from CATAPROC where 1=1".($where?:'');
            
            //TODO NEW CONNECTEUR
            
            $requete = new RequeteSQL($req, DB_OXAFTDB);
            $listeRow = $requete->TrouveTous();
            
            $cpt = 0;
            foreach($listeRow as $row) {
                $this->count_row =  $this->count_row+1;
                
                $result[$cpt] = CtrlArticle::MajRecordSigneQuaV2($row);
                
                if ('M' == $row['TYPECATA']) {
                    Article::getFrsAndTxForArtCatRemise($row['ID_CAT'], $row['COD_FAB'], $row['COD_GAM'], $result[$cpt], 1);                    
                }
                
                if ($result[$cpt]['flg_cde'] == 1) {
                    $this->flg_cde = $result[$cpt]['flg_cde'];                    
                }
                    
                    // Si le meilleur prix n'a pas encore été trouvé alors on prend la ligne courante comme référence
                if (- 1 == $this->index_m || ('' != $result[$cpt]['COD_FOURN'] && '' == $result[$this->index_m]['COD_FOURN'])) {
                    $this->index_m = $cpt;
                        
                    $frs = new Fournisseur($row['cod_fourn']);
                        
                    $result[$cpt]['PREF'] = $frs->getFOURPREF();
                }                            // Si un fournisseur est présent sur la ligne en cours et celle en cours et que ces 2 fournisseurs sont tous 2 autorisés ou non autorisés aux commandes e-proc
                elseif ('' != $result[$cpt]['COD_FOURN'] && '' != $result[$this->index_m]['COD_FOURN'] && - 1 != $this->index_m && $result[$cpt]['flg_cde'] == $result[$this->index_m]['flg_cde']) {
                        // Récupération infos 'Mt cde chantier', 'préférentiel' dans la table FOURNISS d'HA Plus
                        // ( Car info non présente dans sinequa ).
                    $frs = new Fournisseur($row['cod_fourn']);
                        
                    $result[$cpt]['PREF'] = $frs->getFOURPREF();
                        
                    $flg_acc_enc = (trim($result[$cpt]['COD_ACD']) > '' ? 1 : 0);
                    $flg_acc_ind = (trim($result[$this->index_m]['COD_ACD']) > '' ? 1 : 0);
                        
                    $flg_pref_enc = $result[$cpt]['PREF'];
                    $flg_pref_ind = $result[$this->index_m]['PREF'];
                        
                        // Priorité sur le choix des FRS : 1:(ACD + préférentiels) 2:(ACD mais Non préf) 3:(NON ACD Mais préférentiel) 4:(NON ACD ET non préférentiel)
                    if ($flg_acc_enc > $flg_acc_ind) {
                        $this->index_m = $cpt;                            
                    }elseif ($flg_acc_enc == $flg_acc_ind && $flg_pref_enc > $flg_pref_ind) {
                        $this->index_m = $cpt;                            
                    } elseif (($flg_acc_enc == $flg_acc_ind && $flg_pref_enc == $flg_pref_ind)) {
                            // Si les 2 lignes sont liées à un accord-cadre
                           
                                // Alors on garde en référence celle ayant le meilleur prix
                        if ($result[$cpt]['PX_ART'] != 0 && $result[$cpt]['PX_ART'] < $result[$this->index_m]['PX_ART']) {
                            $this->index_m = $cpt;
                        }
                    }
                }
                
                $cpt++;
            }

            return $result;
        }
        /*
         * Fonction permettant de récupèrer toutes les lignes présente dans SINEQUA
         * pour un article donné et un fournisseur
         *
         * @param unknown_type $article
         * @param unknown_type $code_frs
         * @return unknown
         */
        
        // NE PAS PRENDRE EN COMPTE catprlst dans cette fonction en rapport avec les frais de port
        function &old_InfoArt($article = array(), $code_frs = '', $limite = 0, $estRechercheCatalogueFournisseur = false, $clauseSsFam = false, $catAvecCC = false)
        {
            $this->unique_oxaproc_art = array(
                'COD_ART',
                'COD_ACD'
            );
            
            $this->flg_cde = 0;
            $this->index_m = - 1;
            
            // On initialise la clause where
            $where = " Serialization <> '0' ";

            if (is_array($article) && array_key_exists('SERIALIZATION', $article) && '' != trim($article['SERIALIZATION'])){
                $where .= " AND Serialization = '" . replacesql(trim($article['SERIALIZATION'])) . "' ";
            }
            
            // Si un code article est présent dans le tableau passé en paramètre
            if (is_array($article) && array_key_exists('COD_ART', $article))
                foreach ($this->unique_oxaproc_art as $index)
                    if (isset($article[$index]) && '' != $article[$index]) {
                        // pb reference
                        $art = trim($article[$index]);
                        $where .= "AND {$index} = '" . ReplaceSqlPointeur($art) . "' ";
                    }
            
            // Si un code et une référence fabricant sont passés en paramètre
            if($catAvecCC && array_key_exists('COD_FAB', $article) && array_key_exists('REF_FAB', $article) && ('' != trim($article['COD_FAB']) || '' != trim($article['REF_FAB']))){
                $where .= " AND (REF_FAB = '" . replacesql(trim($article['REF_FAB'])) . "' AND COD_FAB = '" . replacesql(trim($article['COD_FAB'])) . "') ";
            }
            elseif (is_array($article) && array_key_exists('COD_FAB', $article) && array_key_exists('REF_FAB', $article) && '' != trim($article['COD_FAB']) && '' != trim($article['REF_FAB'])){
                $where .= " OR (REF_FAB = '" . replacesql(trim($article['REF_FAB'])) . "' AND COD_FAB = '" . replacesql(trim($article['COD_FAB'])) . "') ";
            }elseif (is_array($article)){
                $clauseFab = '';
                if(array_key_exists('COD_FAB', $article) && '' != trim($article['COD_FAB'])){
                    $clauseFab .= "COD_FAB = '" . replacesql(trim($article['COD_FAB'])) . "'";
                }
                if(array_key_exists('REF_FAB', $article) && '' != trim($article['REF_FAB'])){
                    if($clauseFab != ''){
                        $clauseFab .= " AND ";
                    }
                    $clauseFab .= "REF_FAB = '" . replacesql(trim($article['REF_FAB'])) . "'";
                }
                if(array_key_exists('REF_FOURN', $article) && '' != trim($article['REF_FOURN'])){
                    if($clauseFab != ''){
                        $clauseFab .= " AND ";
                    }
                    $clauseFab .= "REF_FOURN = '" . replacesql(trim($article['REF_FOURN'])) . "'";
                }
                if($clauseFab != ''){
                    $where .= " OR ($clauseFab) ";
                }
            }
            
            // Si un code fournisseur est passé en paramètre
            if ('' != $code_frs)
                $where .= ($where != '' ? 'AND ' : '') . " (COD_FOURN = '" . ReplaceSqlPointeur($code_frs) . '\' ' . SqlSynequa::getListeIdCatFromFrs($code_frs) . ' ) ';

            // DOSSIER 33392 : Panier de type régul ou avenant : Prise en compte des sous-familles liés au fournisseur et aux sous-familles sans lien avec des fournisseurs si le paramètre « Limiter le choix du fournisseur à la liste des fournisseurs référencés pour la sous-famille et l’article » est activé et si l’utilisateur n'a pas le droit « Oxaproc : Voir tous fourn/art gén »
            if($clauseSsFam){
                // Récupération du code fournisseur
                $codeFrsRegul = '';
                if (array_key_exists('PANIER_TYPE_SPEC', $_SESSION) && 'REGUL' === $_SESSION['PANIER_TYPE_SPEC']) {
                    $panierEntete = new PanierEntete();
                    $panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);
                    $champSpecifique = explode('=', $panierEntete->getCHPSPECCLT());
                    
                    if (('codfrs' === $champSpecifique[0] || 'REGUL|codfrs' === $champSpecifique[0]) && '' != $champSpecifique[1]) {
                        $codeFrsRegul = $champSpecifique[1];
                    }
                }
                if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE'])) {
                    $codeFrsRegul = $_SESSION['PANIER_FOURNISSEUR_IMPOSE'];
                }
                
                if($codeFrsRegul != ''){
                    // Sous-famille liées au fournisseur
                    $r = SqlParam::rqGetParamParavrac('OXAPROC', 'ARTGEN_LISTEFOURN_LIMITEE')->Trouve1();
                    $limitationChoixFournisseur = is_array($r) && array_key_exists('LIB01PARV', $r) && $r['LIB01PARV'] == 'O';
                    $droitVoirTousFourniss = SqlUsers::droitsUtilisateur('OX_AG_LF_L')->Trouve1()['DROIT'];
                    if($limitationChoixFournisseur && !$droitVoirTousFourniss){
                        $limitationSsfam = '';
                        // On récupère la liste des sous-familles liées au fournisseur
                        $listeSsfamFourniss = SqlFrs::rqGetListeSousfamilleFournisseurRS($codeFrsRegul)->TrouveTous();
                        $SsfamFourniss = '';
                        foreach ($listeSsfamFourniss as & $value){
                            $SsfamFourniss .= ($SsfamFourniss == '' ? '' : ',') . '\'' . ReplaceSql($value['CODE_SFAM']) . '\'';
                        }
                        if($SsfamFourniss != ''){
                            $limitationSsfam .= " AND ( SSFAM in ($SsfamFourniss)";
                        }

                        // Si présence de sous-famille pour le fournisseur, on ajoute les sous-familles qui ne sont pas liées à un fournisseur
                        $listefamAllFourniss = SqlFrs::rqGetListeSousfamilleFournisseurRS()->TrouveTous();
                        $SsfamAllFourniss = '';
                        foreach ($listefamAllFourniss as & $value){
                            $SsfamAllFourniss .= ($SsfamAllFourniss == '' ? '' : ',') . '\'' . ReplaceSql($value['CODE_SFAM']) . '\'';
                        }
                        if($SsfamAllFourniss != '' && $limitationSsfam != ''){
                            $limitationSsfam .= " OR NOT(SSFAM in ($SsfamAllFourniss))";
                        }

                        if($limitationSsfam != ''){
                            $where .= $limitationSsfam.')';
                        }
                    }
                }
            }
            // FIN DOSSIER 33392
            
            //ajout de la clause dossier 34350
            $requete = "{$this->select} where ({$where}) {$this->clause}";
            // Si un fournisseur est imposé alors on ajoute le filtre du fournisseur sur la recherche Intuition
            if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE']))
                $requete .= " AND (COD_FOURN =   '" . ReplaceSqlPointeur($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . '\' ' . SqlSynequa::getListeIdCatFromFrs($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . ") ";
            
            $today = date('Ymd');
            $requete .= " AND (datepub   <= '{$today}' OR datepub = '00000000')  AND (validcata >= '{$today}' OR validcata = '00000000') 	";
            
            // Ajout des clauses spécifiques
            BaseSynequa::ajoutClauseSpecifique($requete);
            
            // Dossier 25430 : Ajout des clauses pour la recherche de présence catalogue fournisseur            
            if ($estRechercheCatalogueFournisseur) {
                $requete .= ' AND ARTFRAISPORT=\'N\' ';
                // SPEC 4100 remplacer le centre émetteur de la session par le centre émetteur du panier s'il existe
                $panierEntete = new PanierEntete();
                if($panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user'])){
                    $centreEmetteur = $panierEntete->getCENTRE_EMETTEUR();
                }
                else{
                    $centreEmetteur = $_SESSION['Session_CodeCtrEmetteur'];
                }
                $lst_cat = & BaseSynequa::getListeCatPubForUser($_SESSION['Session_Login'], $_SESSION['Session_CodeCtrLivraison'], $centreEmetteur);
                $requete .= ' AND (catprlst <> \'\' AND catprlst IN ' . $lst_cat . ' ) ';
                
            }
            
            if ($limite != 0)
                $requete .= " count {$limite}";
                
            if ($this->connect()) {
                $the_query = BaseSynequa::$the_session->in_query($requete);
                
                if ($the_query) {
                    $cpt = 0;
                    
                    $this->count_row = $the_query->in_num_rows();
                    
                    if ($this->count_row == 0)
                        $result = null;
                    else
                        while ($row = & $the_query->in_fetch_row()) {
                            $result[$cpt] = array(
                                'PROVENANCE' => & $row['provenance'],
                                'ID_CAT' => & $row['id_cat'],
                                'COD_ART' => & $row['cod_art'],
                                'COD_FOURN' => & $row['cod_fourn'],
                                'RS_FOURN' => (is_null($row['enscomm']) || $row['enscomm'] == '') ? $row['rs_fourn'] : $row['enscomm'],
                                'VILLE_FOURN' => & $row['ville_fourn'],
                                'REF_FOURN' => & $row['ref_fourn'],
                                'COD_FAB' => & $row['cod_fab'],
                                'RS_FAB' => & $row['rs_fab'],
                                'COD_GAM' => & $row['cod_gam'],
                                'LIB_GAM' => & $row['lib_gam'],
                                'REF_FAB' => & $row['ref_fab'],
                                'COD_SFAM' => & $row['cod_sfam'],
                                'LIB_SFAM' => & $row['lib_sfam'],
                                'CODE_FAM' => & $row['code_fam'],
                                'DESIGNFAM' => & $row['designfam'],
                                'DES_ART' => & $row['des_art'],
                                'DES_COMP' => & $row['des_comp'],
                                'COD_UNIT' => & $row['cod_unit'],
                                'PX_ART' => sprintf(Param::getFormatNombreDeciamlePU(), $row['px_art']),
                                'PX_ART_INIT' => sprintf(Param::getFormatNombreDeciamlePU(), $row['px_art']),
                                'TAUX_TVA' => & $row['taux_tva'], // SPEC 3502
                                'DELAI' => & $row['delai'],
                                'CARACT' => & $row['caract'],
                                'IMGART' => & $row['imgart'],
                                'TYPIMAGE' => & $row['typimage'],
                                'COD_ACD' => & $row['cod_acd'],
                                'CPOSTAL' => & $row['cpostal'],
                                'VILLE1' => & $row['ville1'],
                                'COD_GRP' => & $row['regrfour'],
                                'CONDITNT' => & $row['conditnt'],
                                'TXTCOND' => & $row['txtcond'],
                                'CLASSNUM' => & $row['classnum'],
                                'TYPECATA' => & $row['typecata'],
                                'SERIALIZATION' => & $row['serialization'],
                                'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                                'FICHTECH' => BoolSql($row['fichtech']),
                                'ARTASSOCIE' => BoolSql($row['artassocie']),
                                'PRIXDEGRESSIF' => BoolSql($row['prixdegressif']),
                                'flg_cde' => ($row['autostd'] > 0 ? 1 : 0),
                                'CATPRLST' => & $row['catprlst'],
                                'COD_DEV' => & $row['devise'],
                                'RECEP_AUTO' => array_key_exists('RECEP_AUTO', $row) && BoolSql($row['RECEP_AUTO']),
                                'PER_REC_AUTO' => array_key_exists('PER_REC_AUTO', $row) && BoolSql($row['PER_REC_AUTO'])
                            );
                            
                            if (trim($row['ville_fourn']) == '')
                                $result[$cpt]['VILLE_FOURN'] = $result[$cpt]['CPOSTAL'] . ' ' . $result[$cpt]['VILLE1'];
                            
                            /*
                             * Spécification N°2268 : catalogue remise
                             * Pour les articles issus d'un catalogue multifournisseur on détermine le fournisseur le taux de remise associé
                             * et on met à jour le tableau de résultat
                             */
                            if ('M' == $row['typecata'])
                                Article::getFrsAndTxForArtCatRemise($row['id_cat'], $row['cod_fab'], $row['cod_gam'], $result[$cpt], 1);
                            
                            if ($result[$cpt]['flg_cde'] == 1)
                                $this->flg_cde = $result[$cpt]['flg_cde'];
                            
                            // Si le meilleur prix n'a pas encore été trouvé alors on prend la ligne courante comme référence
                            if (- 1 == $this->index_m || ('' != $result[$cpt]['COD_FOURN'] && '' == $result[$this->index_m]['COD_FOURN'])) {
                                $this->index_m = $cpt;
                                
                                $frs = new Fournisseur($row['cod_fourn']);
                                
                                $result[$cpt]['PREF'] = $frs->getFOURPREF();
                            }                            // Si un fournisseur est présent sur la ligne en cours et celle en cours et que ces 2 fournisseurs sont tous 2 autorisés ou non autorisés aux commandes e-proc
                            elseif ('' != $result[$cpt]['COD_FOURN'] && '' != $result[$this->index_m]['COD_FOURN'] && - 1 != $this->index_m && $result[$cpt]['flg_cde'] == $result[$this->index_m]['flg_cde']) {
                                // Récupération infos 'Mt cde chantier', 'préférentiel' dans la table FOURNISS d'HA Plus
                                // ( Car info non présente dans sinequa ).
                                $frs = new Fournisseur($row['cod_fourn']);
                                
                                $result[$cpt]['PREF'] = $frs->getFOURPREF();
                                
                                $flg_acc_enc = (trim($result[$cpt]['COD_ACD']) > '' ? 1 : 0);
                                $flg_acc_ind = (trim($result[$this->index_m]['COD_ACD']) > '' ? 1 : 0);
                                
                                $flg_pref_enc = $result[$cpt]['PREF'];
                                $flg_pref_ind = $result[$this->index_m]['PREF'];
                                
                                // Priorité sur le choix des FRS : 1:(ACD + préférentiels) 2:(ACD mais Non préf) 3:(NON ACD Mais préférentiel) 4:(NON ACD ET non préférentiel)
                                if ($flg_acc_enc > $flg_acc_ind)
                                    $this->index_m = $cpt;
                                elseif ($flg_acc_enc == $flg_acc_ind && $flg_pref_enc > $flg_pref_ind)
                                    $this->index_m = $cpt;
                                // Si les 2 lignes sont liées à un accord-cadre
                                elseif (($flg_acc_enc == $flg_acc_ind && $flg_pref_enc == $flg_pref_ind)) {
                                    // Alors on garde en référence celle ayant le meilleur prix
                                    if ($result[$cpt]['PX_ART'] != 0 && $result[$cpt]['PX_ART'] < $result[$this->index_m]['PX_ART'])
                                        $this->index_m = $cpt;
                                }
                            }
                            
                            $cpt ++;
                        }
                }
                $this->result = & $result;
                BaseSynequa::disconnect();
            } else
                $this->result = null;
            
            return $this->result;
        }

        /*
         * Fonction permettant de récupèrer toutes les lignes présente dans SINEQUA
         * pour un article donné.
         *
         * @param array $liste_articles : Tableau contenant la liste des articles à rechercher
         * @return array $liste_article_finale : Tableau indexé par les codes articles contenant les informations relatives à l'article trouvée dans sinequa
         */
        function &InfoListeArtFrm($liste_articles = array())
        {
            
            // On initialise le tableau final qui contiendra la liste des résultats
            $liste_article_finale = array();
            
            // A partir de la liste d'articles passée en paramètre, on constitue une chaine globale de codes article a rechercher
            $chaine_code_article = '';
            $chaine_code_fab = '';
            $where = '';
            
            $ind_liste_article = 0;
            
            // On construit la clause where de recherche globale pour les articles. On recherche les lignes Intuition possédant soit le même code article soit le même couple code fabricant, référence fabricant que l'article issu
            // du formulaire métier
            foreach ($liste_articles as & $articles) {
                if ('' != trim($articles['COD_ART']))
                    $chaine_code_article .= '\'' . ReplaceSqlPointeur($articles['COD_ART']) . "',";
                
                if ('' != trim($articles['COD_FAB']) && '' != trim($articles['REF_FAB'])) {
                    if (0 != $ind_liste_article || (0 == $ind_liste_article && '' != trim($chaine_code_article)))
                        $chaine_code_fab .= " OR ( COD_FAB = '" . ReplaceSqlPointeur($articles['COD_FAB']) . "' AND REF_FAB = '" . ReplaceSqlPointeur($articles['REF_FAB']) . "') ";
                    
                    $ind_liste_article ++;
                }
            }
            
            if ('' != trim($chaine_code_article)) {
                $chaine_code_article = mb_substr($chaine_code_article, 0, mb_strlen($chaine_code_article) - 1);
                $where .= " COD_ART in ($chaine_code_article)";
            }
            
            if ('' != trim($chaine_code_fab))
                $where .= ' ' . $chaine_code_fab;
            
            // Si la clause where est définie alors on éxécute la requête Intuition, sinon on retourne un tableau vide
            if ('' != $where) {
                
                $requete = "{$this->select} where ({$where}) {$this->clause} ";
                
                // Si un fournisseur est imposé alors on ajoute le filtre du fournisseur sur la recherche Intuition
                if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE']))
                    $requete .= " AND (COD_FOURN =   '" . ReplaceSqlPointeur($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . '\' ' . SqlSynequa::getListeIdCatFromFrs($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . ') ';
                
                $today = date('Ymd');
                $requete .= " AND (datepub   <= '{$today}' OR datepub = '00000000')  AND (validcata >= '{$today}' OR validcata = '00000000') 	";
                
                // Ajout des clauses spécifiques
                BaseSynequa::ajoutClauseSpecifique($requete);
                
                $requete .= ' count 1000000 ';
                
                if ($this->connect()) {
                    $the_query = BaseSynequa::$the_session->in_query($requete);
                    
                    if ($the_query) {
                        $cpt = 0;
                        $this->count_row = $the_query->in_num_rows();
                        
                        $liste_article_temp = array();
                        
                        // Pour chacun des résultats retournés par sinequa
                        while ($row = & $the_query->in_fetch_row()) {
                            $result[$cpt] = array(
                                'PROVENANCE' => & $row['provenance'],
                                'ID_CAT' => & $row['id_cat'],
                                'NO_SERIALIZATION' => & $row['serialization'], // Utilisation reference unique information
                                'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                                'COD_ART' => & $row['cod_art'],
                                'COD_FOURN' => & $row['cod_fourn'],
                                'RS_FOURN' => (is_null($row['enscomm']) || $row['enscomm'] == '') ? $row['rs_fourn'] : $row['enscomm'],
                                'VILLE_FOURN' => & $row['ville_fourn'],
                                'REF_FOURN' => & $row['ref_fourn'],
                                'COD_FAB' => & $row['cod_fab'],
                                'RS_FAB' => & $row['rs_fab'],
                                'COD_GAM' => & $row['cod_gam'],
                                'LIB_GAM' => & $row['lib_gam'],
                                'REF_FAB' => & $row['ref_fab'],
                                'COD_SFAM' => & $row['cod_sfam'],
                                'LIB_SFAM' => & $row['cod_sfam'],
                                'DES_ART' => & $row['des_art'],
                                'DES_COMP' => & $row['des_comp'],
                                'COD_UNIT' => & $row['cod_unit'],
                                'PX_ART' => sprintf(Param::getFormatNombreDeciamlePU(), $row['px_art']),
                                'TAUX_TVA' => & $row['taux_tva'], // SPEC 3502
                                'DELAI' => & $row['delai'],
                                'CARACT' => & $row['caract'],
                                'IMGART' => & $row['imgart'],
                                'TYPIMAGE' => & $row['typimage'],
                                'COD_ACD' => & $row['cod_acd'],
                                'CPOSTAL' => & $row['cpostal'],
                                'VILLE1' => & $row['ville1'],
                                'COD_GRP' => & $row['regrfour'],
                                'CONDITNT' => & $row['conditnt'],
                                'TXTCOND' => & $row['txtcond'],
                                'CLASSNUM' => & $row['classnum'],
                                'TYPECATA' => & $row['typecata'],
                                'SERIALIZATION' => & $row['serialization'],
                                'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                                'FICHTECH' => BoolSql($row['fichtech']),
                                'ARTASSOCIE' => BoolSql($row['artassocie']),
                                'PRIXDEGRESSIF' => BoolSql($row['prixdegressif']),
                                'flg_cde' => ($row['autostd'] > 0 ? 1 : 0),
                                'RECEP_AUTO' => array_key_exists('RECEP_AUTO', $row) ? BoolSql($row['RECEP_AUTO']) : false,
                                'PER_REC_AUTO' => array_key_exists('PER_REC_AUTO', $row) ? BoolSql($row['PER_REC_AUTO']) : false
                            );
                            
                            // Si la ligne n'est pas présente dans le tableau temporaire des lignes retenues alors on l'ajoute
                            if (! array_key_exists($result[$cpt]['COD_ART'], $liste_article_temp))
                                $liste_article_temp[$result[$cpt]['COD_ART']] = $result[$cpt];
                            // Si la ligne en cours est autorisé à commande chantier alors elle remplace la précédente
                            elseif (0 == $liste_article_temp[$result[$cpt]['COD_ART']]['flg_cde'] && (1 == $result[$cpt]['flg_cde'] || 'M' == $row['typecata']))
                                $liste_article_temp[$result[$cpt]['COD_ART']] = $result[$cpt];
                            
                            $cpt ++;
                        }
                        
                        foreach ($liste_article_temp as & $article)
                            $liste_article_finale[] = $article;
                    }
                }
                
                BaseSynequa::disconnect();
            }
            
            return $liste_article_finale;
        }

        function &InfoArtRefFab($article)
        {
            $this->unique_oxaproc_art = array(
                'COD_ART',
                'COD_FAB',
                'REF_FAB'
            );
            
            $this->COD_ART = $article['COD_ART'];
            $this->COD_FAB = $article['COD_FAB'];
            $this->REF_FAB = $article['REF_FAB'];
            $this->flg_cde = 0;
            $this->index_m = - 1;
            
            foreach ($this->unique_oxaproc_art as $index) {
                $this->$index = trim($this->$index);
                
                if ('' != $this->$index)
                    $where .= ($where != '' ? 'AND ' : '') . "{$index} = '" . ($this->$index) . "' ";
            }
            
            $requete = "{$this->select} where ({$where}) {$this->clause} ";
            
            // Si un fournisseur est imposé alors on ajoute le filtre du fournisseur sur la recherche Intuition
            if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE']))
                $requete .= " AND (COD_FOURN =   '" . ReplaceSqlPointeur($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . '\' ' . SqlSynequa::getListeIdCatFromFrs($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . ') ';
            
            $today = date('Ymd');
            $requete .= " AND (datepub   <= '{$today}' OR datepub = '00000000')  AND (validcata >= '{$today}' OR validcata = '00000000') 	";
            
            // Ajout des clauses spécifiques
            BaseSynequa::ajoutClauseSpecifique($requete);
            
            if ($this->connect()) {
                $this->DebugCall($requete);
                $the_query = BaseSynequa::$the_session->in_query($requete);
                
                if ($the_query) {
                    $cpt = 0;
                    $this->count_row = $the_query->in_num_rows();
                    while ($row = & $the_query->in_fetch_row()) {
                        $result[$cpt] = array(
                            'PROVENANCE' => & $row['provenance'],
                            'ID_CAT' => & $row['id_cat'],
                            'COD_ART' => & $row['cod_art'],
                            'COD_FOURN' => & $row['cod_fourn'],
                            'RS_FOURN' => (is_null($row['enscomm']) || $row['enscomm'] == '') ? $row['rs_fourn'] : $row['enscomm'],
                            'VILLE_FOURN' => & $row['ville_fourn'],
                            'REF_FOURN' => & $row['ref_fourn'],
                            'COD_FAB' => & $row['cod_fab'],
                            'RS_FAB' => & $row['rs_fab'],
                            'COD_GAM' => & $row['cod_gam'],
                            'LIB_GAM' => & $row['lib_gam'],
                            'REF_FAB' => & $row['ref_fab'],
                            'COD_SFAM' => & $row['cod_sfam'],
                            'LIB_SFAM' => & $row['cod_sfam'],
                            'DES_ART' => & $row['des_art'],
                            'DES_COMP' => & $row['des_comp'],
                            'COD_UNIT' => & $row['cod_unit'],
                            'PX_ART' => sprintf(Param::getFormatNombreDeciamlePU(), $row['px_art']),
                            'TAUX_TVA' => & $row['taux_tva'], // SPEC 3502
                            'DELAI' => & $row['delai'],
                            'CARACT' => & $row['caract'],
                            'IMGART' => & $row['imgart'],
                            'TYPIMAGE' => & $row['typimage'],
                            'COD_ACD' => & $row['cod_acd'],
                            'CPOSTAL' => & $row['cpostal'],
                            'VILLE1' => & $row['ville1'],
                            'COD_GRP' => & $row['regrfour'],
                            'CONDITNT' => & $row['conditnt'],
                            'TXTCOND' => & $row['txtcond'],
                            'CLASSNUM' => & $row['classnum'],
                            'TYPECATA' => & $row['typecata'],
                            'SERIALIZATION' => & $row['serialization'],
                            'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                            'FICHTECH' => BoolSql($row['fichtech']),
                            'ARTASSOCIE' => BoolSql($row['artassocie']),
                            'PRIXDEGRESSIF' => BoolSql($row['prixdegressif']),
                            'flg_cde' => ($row['autostd'] > 0 ? 1 : 0),
                            'RECEP_AUTO' => BoolSql($row['RECEP_AUTO']),
                            'PER_REC_AUTO' => BoolSql($row['PER_REC_AUTO'])
                        );
                        
                        if (trim($row['ville_fourn']) == '')
                            $result[$cpt]['VILLE_FOURN'] = $result[$cpt]['CPOSTAL'] . ' ' . $result[$cpt]['VILLE1'];
                        
                        if ($result[$cpt]['flg_cde'] == 1)
                            $this->flg_cde = $result[$cpt]['flg_cde'];
                        
                        if ('F' == $row['typecata'])
                            if ($result[$cpt]['PX_ART'] != 0) {
                                if ($this->index_m == - 1)
                                    $this->index_m = $cpt;
                                else { // Algo de comparaison du meilleur prix
                                    $flg_acc_enc = (trim($result[$cpt]['COD_ACD']) > '' ? 1 : 0);
                                    $flg_acc_ind = (trim($result[$this->index_m]['COD_ACD']) > '' ? 1 : 0);
                                    
                                    if ($flg_acc_enc > $flg_acc_ind)
                                        $this->index_m = $cpt;
                                    else if ($result[$cpt]['PX_ART'] < $result[$this->index_m]['PX_ART'])
                                        $this->index_m = $cpt;
                                }
                            }
                        
                        $cpt ++;
                    }
                }
                
                $this->result = & $result;
                BaseSynequa::disconnect();
                return $this->result;
            }
        }
    }
}
