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

    class CtrlArticle extends BaseSynequa
    {

        public static $clauseTmp = null;

        

        var $unique_oxaproc_art = array(
            'COD_ART',
            'COD_FOURN',
            'REF_FOURN',
            'COD_FAB',
            'REF_FAB',
            'COD_ACD',
            'ID_CAT',
            'TYPECATA'
        );

        var $unique_oxaproc_frs = array(
            'COD_ART',
            'COD_FAB',
            'REF_FAB'
        );

        var $select = '';
        var $centre = '';
        var $siteStock = '';

        /*
         * @author Eric Carles
         * Commentaires ajoutés le 02/10/2007 dans le cadre de la spécification import d'article CSV.
         * Pour la classe CtrlArticle : le constructeur initialise l'attribut $clause qui contient notamment par défaut les filtres sur les catalogues publiés pour l'utilisateurs
         */
        function __construct()
        {
            if (is_null(CtrlArticle::$clauseTmp)) {
                // SPEC 4100 remplacer le centre émetteur de la session par le centre émetteur du panier;
                $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();
                
                CtrlArticle::$clauseTmp = " AND (catprlst <> '' AND catprlst IN {$lst_cat} ) " . ($lst_ctr != '' && $lst_ctr != "('')" && $lst_ctr != '' ? " AND (dcouplst = '' OR dcouplst IN {$lst_ctr} ) " : '');
            }

            $this->centre = $_SESSION['Session_CodeCtrLivraison'];

            $centreTmp = new Centre();
            $this->siteStock = $centreTmp->getSiteStkFromCtrLiv($_SESSION['Session_CodeCtrLivraison']);
            
            $this->clause = CtrlArticle::$clauseTmp;
            
            $this->select = 'SELECT * FROM ' . $_SESSION['INTUITION_CAT'] . ' ';
        }

        static function &MajRecordSigneQuaV2(& $row, $is_getFrsAndTxForArtCatRemise = FALSE)
        {
            $resMaj = array(
                'PROVENANCE' => & $row['PROVENANCE'],
                'IDLIGNE' => & $row['IDLIGNE'],
                'NO_SERIALIZATION' => & $row['ROW_COMPTEUR'],
                'DATABASEID' => null, // Utilisation reference unique information
                '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' => '',
                'REF_FOURN' => & $row['REF_FOURN'],
                'COD_FAB' => & $row['COD_FAB'],
                'RS_FAB' => & $row['REF_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_HT_SANS_REM' => sprintf(Param::getFormatNombreDeciamlePU(), $row['PX_ART']), // Dossier 25785
                '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'],
                'SERIALIZATION' => & $row['ROW_COMPTEUR'],
                'DATABASEID' => null, // Utilisation reference unique information
                'FICHTECH' => BoolSql($row['FICHTECH']),
                'ARTASSOCIE' => BoolSql($row['ARTASSOCIE']),
                'PRIXDEGRESSIF' => BoolSql($row['PRIXDEGRESSIF']),
                'TYPECATA' => & $row['TYPECATA'],
                'RAYON' => array(
                    $row['RAYON1'],
                    $row['RAYON2'],
                    $row['RAYON3'],
                    $row['RAYON4'],
                    $row['RAYON5']
                ),
                'CATPRLST' => & $row['CATPRLST'],
                'COEFCONV' => & $row['COEFCONV'],
                'COD_DEV' => & $row['DEVISE'],
                'flg_cde' => ($row['AUTOSTD'] > 0 ? 1 : 0),
                'IS_AUTH_CDE_OXAPROC' => ($row['AUTOSTD'] > 0 ? 1 : 0),
                'RECEP_AUTO' => BoolSql($row['RECEP_AUTO']),
                'PER_REC_AUTO' => $row['PER_REC_AUTO'],
                'NONRECEPT' => BoolSql($row['NONRECEPT']),
                'ARTFRAISPORT' => BoolSql($row['ARTFRAISPORT']) // Dossier 20466
            );
            if ($row['IDLIGNE'] != 0)
                Article::getCaractInfoFromIdLigne($resMaj, $row['IDLIGNE']);
         
            $resMaj['VILLE_FOURN'] = $resMaj['CPOSTAL'] . ' ' . $resMaj['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'] && $is_getFrsAndTxForArtCatRemise)
                Article::getFrsAndTxForArtCatRemise($row['ID_CAT'], $row['COD_FAB'], $row['COD_GAM'], $resMaj, 1);
            
            if ($resMaj['PROVENANCE'] == 'HAP')
                $resMaj['docatt'] = Article::getDocAttInfoFromCodArt($resMaj['COD_ART']);
            else if ($resMaj['PROVENANCE'] == 'CAT')
                array_push($resMaj, array(
                    'doc_att' => Article::getDocAttInfoFromIdLigne($resMaj['IDLIGNE'])
                ));
                
            return $resMaj;
        }

        static function &MajRecordSigneQua(& $row, $is_getFrsAndTxForArtCatRemise = FALSE)
        {
            $resMaj = array(
                'PROVENANCE' => & $row['provenance'],
                'IDLIGNE' => & $row['idligne'],
                'NO_SERIALIZATION' => & $row['serialization'],
                'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                '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_HT_SANS_REM' => sprintf(Param::getFormatNombreDeciamlePU(), $row['px_art']), // Dossier 25785
                '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'],
                'SERIALIZATION' => & $row['serialization'],
                'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                'FICHTECH' => BoolSql($row['fichtech']),
                'ARTASSOCIE' => BoolSql($row['artassocie']),
                'PRIXDEGRESSIF' => BoolSql($row['prixdegressif']),
                'TYPECATA' => & $row['typecata'],
                'RAYON' => array(
                    $row['rayon1'],
                    $row['rayon2'],
                    $row['rayon3'],
                    $row['rayon4'],
                    $row['rayon5']
                ),
                'CATPRLST' => & $row['catprlst'],
                'COEFCONV' => & $row['coefconv'],
                'COD_DEV' => & $row['devise'],
                'flg_cde' => ($row['autostd'] > 0 ? 1 : 0),
                'IS_AUTH_CDE_OXAPROC' => ($row['autostd'] > 0 ? 1 : 0),
                'RECEP_AUTO' => BoolSql($row['recep_auto']),
                'PER_REC_AUTO' => $row['per_rec_auto'],
                'NONRECEPT' => BoolSql($row['nonrecept']),
                'ARTFRAISPORT' => BoolSql($row['artfraisport']) // Dossier 20466
            );
            if ($row['idligne'] != 0)
                Article::getCaractInfoFromIdLigne($resMaj, $row['idligne']);
                
                if (trim($row['ville_fourn']) == '')
                    $resMaj['VILLE_FOURN'] = $resMaj['CPOSTAL'] . ' ' . $resMaj['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'] && $is_getFrsAndTxForArtCatRemise)
                        Article::getFrsAndTxForArtCatRemise($row['id_cat'], $row['cod_fab'], $row['cod_gam'], $resMaj, 1);
                        
                        if ($resMaj['PROVENANCE'] == 'HAP')
                            $resMaj['docatt'] = Article::getDocAttInfoFromCodArt($resMaj['COD_ART']);
                            else if ($resMaj['PROVENANCE'] == 'CAT')
                                array_push($resMaj, array(
                                    'doc_att' => Article::getDocAttInfoFromIdLigne($resMaj['IDLIGNE'])
                                ));
                                
                                return $resMaj;
        }
        
        /*
         * @author Eric Carles
         * Commentaires ajoutés le 02/10/2007 dans le cadre de la spécification import d'article CSV.
         * La fonction RechercheArt ajoute des clauses supplémentaires à la clause initialisée dans le constructeur.
         * @param $article : array contenant les caractèristiques de l'article, indicé avec les noms des champs
         *
         */
        function &old_RechercheArt(& $article, $is_getFrsAndTxForArtCatRemise = true)
        {
            // Lorsque la recherche porte sur une ligne issue d'un catalogue remise alors on passe le fournisseur à blanc
            if (is_array($article) && array_key_exists('TYPECATA', $article) && 'M' == $article['TYPECATA'])
                $article['COD_FOURN'] = '';
                $requete = '';
                $result = null;
                
                // dossier 28041 ne pas chercher les produits dans intuitions si il n'y pas tous les champs requis pour faire une recherche adequate lors d'un AVENANT
                if ((isset($_SESSION['PANIER_MODE_AVENANT']) && $_SESSION['PANIER_MODE_AVENANT']) && ! (($article['COD_FAB'] != '' && $article['REF_FAB'] != '') || ($article['COD_FOURN'] != '' && $article['REF_FOURN'] != ''))
                    )
                    return false;
                    
                    if (is_array($article))
                        foreach ($this->unique_oxaproc_art as & $index)
                            if (array_key_exists($index, $article) && '' != $article[$index]) {
                                // Lors des recherche articles, si le catalogue est de type remise alors on ne prend pas en compte le critère code forunisseur
                                // car celui-ci n'est pas renseigné au niveau des lignes sinequa issues des catalogues remises
                                $requete .= ($requete != '' ? 'AND ' : '');
                                
                                if ($index == 'COD_FOURN') {
                                    if ($article[$index] != '')
                                        $requete .= "({$index} = '" . ReplaceSqlPointeur($article[$index]) . "' OR TYPECATA = 'M') ";
                                } else
                                    $requete .= "{$index} = '" . ReplaceSqlPointeur($article[$index]) . "' ";
                            }
                        
                        if ($requete == '')
                            return $result;
                            
                            // 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 .= ($requete != '' ? 'AND ' : '');
                                $requete .= " (COD_FOURN =  '" . ReplaceSqlPointeur($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . '\' ' . SqlSynequa::getListeIdCatFromFrs($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . ') ';
                            }
                            
                            $today = date('Ymd');
                            $requete .= ($requete != '' ? 'AND ' : '');
                            $requete .= " (datepub   <= '{$today}' OR datepub = '00000000')  AND (validcata >= '{$today}' OR validcata = '00000000') ";
                            
                            $requeteFinale = "{$this->select} where ({$requete}) {$this->clause} ";
                            
                            if ($this->connect()) {
                                $this->DebugCall($requeteFinale);
                                $the_query = BaseSynequa::$the_session->in_query($requeteFinale);
                                
                                $buf = [];
                                if ($the_query) {
                                    while ($row = & $the_query->in_fetch_row()) {
                                        $result = & CtrlArticle::MajRecordSigneQua($row, $is_getFrsAndTxForArtCatRemise);
                                        
                                        
                                        Article::getAllFrsAndTxForArtCatRemise($row['ID_CAT'], $row['COD_FAB'], $row['COD_GAM'], $buf);
                                        
                                        break; // Attention est aussi mis ici un limit 1 au niveau de la requete sinequa afin d'eviter le flux intuition
                                    }
                                }
                                
                                BaseSynequa::disconnect();
                            }
                            return $result;
        }
        
        function &RechercheArt(& $article, $is_getFrsAndTxForArtCatRemise = true)
        {
            if ($_SESSION['STATUT_RECH_ART'] != 1) {
                return [];
            }
            
            // Lorsque la recherche porte sur une ligne issue d'un catalogue remise alors on passe le fournisseur à blanc
            if (is_array($article) && array_key_exists('TYPECATA', $article) && 'M' == $article['TYPECATA'])
                $article['COD_FOURN'] = '';
            $requete = '';
            $result = null;
            
            // dossier 28041 ne pas chercher les produits dans intuitions si il n'y pas tous les champs requis pour faire une recherche adequate lors d'un AVENANT
            if ((isset($_SESSION['PANIER_MODE_AVENANT']) && $_SESSION['PANIER_MODE_AVENANT']) && ! (($article['COD_FAB'] != '' && $article['REF_FAB'] != '') || ($article['COD_FOURN'] != '' && $article['REF_FOURN'] != ''))
            )
                return false;
            
            if (is_array($article))
                foreach ($this->unique_oxaproc_art as & $index)
                    if (array_key_exists($index, $article) && '' != $article[$index]) {
                        // Lors des recherche articles, si le catalogue est de type remise alors on ne prend pas en compte le critère code forunisseur
                        // car celui-ci n'est pas renseigné au niveau des lignes sinequa issues des catalogues remises
                        $requete .= " AND ";

                        $value = str_replace("'", "''''", $article[$index]);
                        
                        if ($index == 'COD_FOURN') {
                            if ($article[$index] != '')
                                $requete .= "({$index} = ''" . ReplaceSqlPointeur($value) . "'' OR TYPECATA = ''M'') ";
                        } else
                            $requete .= "{$index} = ''" . ReplaceSqlPointeur($value) . "'' ";
                    }
            
            if ($requete == '')
                return $result;
             
            // 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 .= ($requete != '' ? 'AND ' : '');
                $requete .= " (COD_FOURN =  ''" . ReplaceSqlPointeur($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . "'' " . SqlSynequa::getListeIdCatFromFrs($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . ') ';
            }  
            
            if($requete)
            {
                if(strpos(trim(strtoupper($requete)), "AND") === false)
                {
                    $requete = ' AND '.$requete;
                } 
            } else 
            {
                $requete ='';
            }

            
            $req = "EXEC Oxaproc_CatArtContRankDes '".$_SESSION["Session_Login"]."','".$this->centre."', '".$this->siteStock."', 1,'CATAPROC','','".$requete."','','',1,1";
            
            //TODO NEW CONNECTEUR
            $requete = new RequeteSQL($req, DB_OXAFTDB);
            $row = $requete->Trouve1();

            if (!$row) {
                return [];
            }
                        
            $result = CtrlArticle::MajRecordSigneQuaV2($row, $is_getFrsAndTxForArtCatRemise);
            
            $buf = [];
            Article::getAllFrsAndTxForArtCatRemise($result['ID_CAT'], $result['COD_FAB'], $result['COD_GAM'], $buf);
            
            return $result;
        }

        function CtrlImportCsv(& $critereIntuition)
        {
            $resultat = null;
            $requete = '';
            
            // foreach ( $ligne as $index => & $info )
            foreach ($critereIntuition as $indexCritere => & $infoCritere) {
                //if ('' != $requete)
                $requete .= ' and ';
                
                if ('COD_FOURN' == $indexCritere)
                    $requete .= '(' . $indexCritere . "=''" . ReplaceSql(trim($infoCritere)) . "'' OR TYPECATA = ''M'') ";
                else
                    $requete .= $indexCritere . "=''" . ReplaceSql(trim($infoCritere)) . "''";
            }
            
            // 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 .= ($requete != '' ? 'AND ' : '');
                $requete .= " (COD_FOURN =  ''" . ReplaceSqlPointeur($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . '\'\' ' . SqlSynequa::getListeIdCatFromFrs($_SESSION['PANIER_FOURNISSEUR_IMPOSE']) . ') ';
            }

            if($requete)
            {
                if(strpos(trim(strtoupper($requete)), "AND") === false)
                {
                    $requete = ' AND '.$requete;
                } 
            } else 
            {
                $requete ='';
            }
            $req = "EXEC Oxaproc_CatArtContRankDes '".$_SESSION["Session_Login"]."','".$this->centre."', '".$this->siteStock."', 1,'CATAPROC','','".$requete."','','',1,1";

            //TODO NEW CONNECTEUR
            $requete = new RequeteSQL($req, DB_OXAFTDB);
            $row = $requete->Trouve1();

            if (!$row) {
                return [];
            }
                        
            $result = CtrlArticle::MajRecordSigneQuaV2($row, true);
            
            $buf = [];
            Article::getAllFrsAndTxForArtCatRemise($result['ID_CAT'], $result['COD_FAB'], $result['COD_GAM'], $buf);
            
            return $result; 
            
            $today = date('Ymd');
            $requete .= ($requete != '' ? 'AND ' : '');
            $requete .= " (datepub   <= '{$today}' OR datepub = '00000000')  AND (validcata >= '{$today}' OR validcata = '00000000') ";
            
            // On consolide la requête
            $requete = $this->select . ' where ' . $requete . $this->clause;
            // 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) {
                    $this->count_row = $the_query->in_num_rows();
                    while ($row = & $the_query->in_fetch_row()) {
                        $resultat = & CtrlArticle::MajRecordSigneQua($row, true);
                        break; // Attention est aussi mis limit 1 dans la requete afin d'eviter le flux signequa
                    }
                }
                BaseSynequa::disconnect();
            }
            return $resultat;
        }

        /**
         * Fonction permettant de retrouver une ligne sinequa à partir de la clé d'unicité : Numéro de ligne + Identifiant du catalogue
         *
         * @param int $id_ligne_sinequa
         *            : Numéro de la ligne catalogue
         * @param string $id_cat
         *            : Identifiant du catalogue
         * @return array $result : Tableau contenant les informations de la ligne unique retrouvée
         */
        function &selectLigneCatByIdLigneAndIdCat(& $id_ligne_sinequa, & $id_cat)
        {
            $req =  "SELECT * 
                        FROM CATAPROC
                        WHERE ROW_COMPTEUR = '$id_ligne_sinequa' 
                        AND ID_CAT = '" . ReplaceSqlPointeur($id_cat) . '\'';
            //TODO NEW CONNECTEUR
            $requete = new RequeteSQL($req, DB_OXAFTDB);
            return $requete->Trouve1();
        }

        /**
         * Fonction effectuant une recherche dans Sinequa sur :
         * - un code article donné
         * - ou un couple code fabricant / référence fabricant
         * - ou un couple référence fournisseur / code groupement
         *
         * @param array $article
         *            : Tableau contenant les caractéristiques de l'article
         * @param string $code_frs
         *            : Code fournisseur recherché
         * @param string $rs_frs
         *            : Raison sociale du fournisseur recherchée
         *            
         * @return array : résultat de la recherche
         */
        function &RechercheArtFrs($rechAtutoCC, $isCertifieIntuition, & $article, $code_frs = '', $rs_frs = '', $qte = null, $rech_artfou = true, $calc_type = true, $searchWithOutIDCata = false)
        {
            if ($_SESSION['STATUT_RECH_ART'] != 1) {
                return [];
            }
            
            $result = array();

            // Probleme de conditionnement car ca sert a rien si nous ne l'alimenton pas ailleur
            $liste_multi_frs = null;
            $query_where = '';
            
            if (is_array($article)) {
                if ($isCertifieIntuition) {
                    $retour_sinequa = $article;                    
                } else {
                    // Phase 1 on se recherche soit meme dans sinequa
                    if ($retour_sinequa = $this->RechercheArt($article, false)) {
                        $result[$retour_sinequa['SERIALIZATION']] = & $retour_sinequa;                        
                    } else {
                        $retour_sinequa = $article;                    
                    }
                }
                
                $codFab     = str_replace("'", "''''", $retour_sinequa['COD_FAB']);
                $refFab     = str_replace("'", "''''", $retour_sinequa['REF_FAB']);
                $codGrp     = str_replace("'", "''''", $retour_sinequa['COD_GRP']);
                $refFourn   = str_replace("'", "''''", $retour_sinequa['REF_FOURN']);
                $codFourn   = str_replace("'", "''''", $retour_sinequa['COD_FOURN']);
                $codeArt    = str_replace("'", "''''", $retour_sinequa['COD_ART']);


                // Alors on construit la requête
                if (array_key_exists('COD_FAB', $retour_sinequa) && trim($codFab) != '' && trim($refFab) != '')
                    $Partie1 = " ( COD_FAB = ''" . ReplaceSqlPointeur($codFab) . "'' AND REF_FAB = ''" . ReplaceSqlPointeur($refFab) . "'' )";
                else
                    $Partie1 = '';
                if (array_key_exists('COD_GRP', $retour_sinequa) && trim($codGrp) != '' && trim($refFourn) != '')
                    $Partie2 = "(REGRFOUR = ''" . ReplaceSqlPointeur($codGrp) . "'' AND REF_FOURN = ''" . ReplaceSqlPointeur($refFourn) . "'') ";
                else if (array_key_exists('REF_FOURN', $retour_sinequa) && trim($refFourn) != '')
                    $Partie2 = "REF_FOURN = ''" . ReplaceSqlPointeur($refFourn) . "'' AND COD_FOURN= ''" . ReplaceSqlPointeur($codFourn) . "''";
                else
                    $Partie2 = '';
                
                if ('' != trim($codeArt)) {
                    // Dossier 27506 dans le cas de présence de code article, si c'est une article typé generique alors PAS DE RECHERCHE en mode générique
                    if ($rTmp = SqlArticle::rqIsArticleGenerique($codeArt)->Trouve1())
                        if (BoolSql($rTmp['GENRERIQUE']))
                            $Partie3 = '';
                        else
                            $Partie3 = "( COD_ART = ''" . ReplaceSqlPointeur($codeArt) . "'' )";
                    else
                        $Partie3 = '';
                } else
                    $Partie3 = '';
                
                if ($Partie1 != '' && $Partie2 != '')
                    $query_where = " {$Partie1} OR {$Partie2} ";
                else if ($Partie1 != '')
                    $query_where = $Partie1;
                else if ($Partie2 != '')
                    $query_where = $Partie2;
                else
                    $query_where = '';
                
                if ($query_where != '' && $Partie3 != '')
                    $query_where = " {$query_where} OR {$Partie3} ";
                else if ($Partie3 != '')
                    $query_where = $Partie3;
                if (trim($query_where) != '') {
                    // print_r($this->select); exit; 
                    $requete = " AND  {$query_where} ";
                    
                    // 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'])." ) ";
                    }                
                    // Si un code fournisseur est recherché alors on recherche ce code en mode 'contient'
                    if ('' != $code_frs) {
                        $code_frs = ReplaceSqlPointeur($code_frs);
                        $requete .= " AND (COD_FOURN like ''%$code_frs%'')";
                    }
                    // Si une raison sociale est recherchée alors on recherche ce code en mode 'contient'
                    if ('' != $rs_frs) {
                        $rs_frs = ReplaceSqlPointeur($rs_frs);
                        $requete .= " AND (RS_FOURN like ''%$rs_frs%'')";
                    }
                    $today = date('Ymd');
                    
                    if (array_key_exists('ID_CAT', $retour_sinequa) && trim($retour_sinequa['ID_CAT']) != '' && !$searchWithOutIDCata)
                        $requete .= " AND ID_CAT = ''" . ReplaceSqlPointeur($retour_sinequa['ID_CAT']) . "''";

                    if($requete)
                    {
                        if(strpos(trim(strtoupper($requete)), "AND") === false)
                        {
                            $requete = ' AND '.$requete;
                        } 
                    } else 
                    {
                        $requete ='';
                    }

                    $req = "EXEC Oxaproc_CatArtContRankDes '".$_SESSION["Session_Login"]."','".$this->centre."','".$this->siteStock."', 1, 'CATAPROC','','".$requete."','','',20,1";
                    
                    //TODO NEW CONNECTEUR
                    $requete = new RequeteSQL($req, DB_OXAFTDB);
                    $listeRow = $requete->TrouveTous();
                    
                    foreach($listeRow as $row) {
                        $result[$row['ROW_COMPTEUR']] = & CtrlArticle::MajRecordSigneQuaV2($row);
                    }
                }
                
                // Traitement de la liste des differents article sinequa trouve
                if (is_array($result)) {
                    $cacheRemFour = array();
                    foreach ($result as & $element)
                        if (is_array($element) && array_key_exists('TYPECATA', $element) && $element['TYPECATA'] == 'M') {
                            if (! $calc_type && is_array($liste_multi_frs)) {
                                $ind_frs_trouve = count($liste_multi_frs);
                                $liste_multi_frs[$ind_frs_trouve] = $element;
                            } else {
                                $motIndex = $element['ID_CAT'] . '|' . $element['COD_FAB'] . '|' . $element['COD_GAM'];
                                
                                $buf = array();
                                if (array_key_exists($motIndex, $cacheRemFour))
                                    $buf = $cacheRemFour[$motIndex];
                                else {
                                    Article::getAllFrsAndTxForArtCatRemise($element['ID_CAT'], $element['COD_FAB'], $element['COD_GAM'], $buf);
                                    $cacheRemFour[$motIndex] = $buf;
                                }
                                if (is_array($buf))
                                    foreach ($buf as &$frs_trouve) {
                                        $okToCharge = true;
                                        if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE'])) {
                                            if ($frs_trouve['COD_FOURN'] != $_SESSION['PANIER_FOURNISSEUR_IMPOSE'])
                                                $okToCharge = false;
                                        } else if ('' != $code_frs && $frs_trouve['COD_FOURN'] != $code_frs)
                                            $okToCharge = false;
                                        
                                        if ($okToCharge || $liste_multi_frs) {
                                            $ind_frs_trouve = count($liste_multi_frs);
                                            $liste_multi_frs[$ind_frs_trouve] = $element;
                                            $liste_multi_frs[$ind_frs_trouve]['PX_ART'] = FormatageData::formatMontant($element['PX_ART_INIT'] * (1 - ($frs_trouve['REMGAM'] / 100)), Param::getNombreDeciamlePU());
                                            $liste_multi_frs[$ind_frs_trouve]['PX_ART_INIT'] = & $liste_multi_frs[$ind_frs_trouve]['PX_ART'];
                                            $liste_multi_frs[$ind_frs_trouve]['VILLE_FOURN'] = & $frs_trouve['CPOSTAL'] . ' ' . $frs_trouve['VILLE1'];
                                            $liste_multi_frs[$ind_frs_trouve]['CPOSTAL'] = & $frs_trouve['CPOSTAL'];
                                            $liste_multi_frs[$ind_frs_trouve]['VILLE1'] = & $frs_trouve['VILLE1'];
                                            $liste_multi_frs[$ind_frs_trouve]['COD_FOURN'] = & $frs_trouve['COD_FOURN']; // On met le code fournisseur à jour
                                            $liste_multi_frs[$ind_frs_trouve]['RS_FOURN'] = & $frs_trouve['RS_FOURN']; // On met la raison sociale à jour
                                            if ($rechAtutoCC)
                                                $liste_multi_frs[$ind_frs_trouve]['IS_AUTH_CDE_OXAPROC'] = Article::isArtMultiFrsAutCdeOxaproc($frs_trouve['COD_FOURN'], $element['COD_FAB'], $element['COD_ACD'], $element['COD_ART']);
                                            if (! is_null($qte) && BoolSql($element['PRIXDEGRESSIF']))
                                                $liste_multi_frs[$ind_frs_trouve]['PX_ART'] = Article::getPrixDegressifByQte($element, $qte);
                                        }
                                    }
                            }
                        } else {
                            if(is_array($liste_multi_frs))
                                $ind_frs_trouve = count($liste_multi_frs);
                            else
                                $ind_frs_trouve = 0;
                            $liste_multi_frs[$ind_frs_trouve] = $element;
                        }
                    
                    // Traitement unicite fournisseur
                    Fournisseur::selectAllFrsWithAcdAndBestPrice($liste_multi_frs);
                }
            }
            
            return $liste_multi_frs;
        }

        function &old_RechercheArtFrs($rechAtutoCC, $isCertifieIntuition, & $article, $code_frs = '', $rs_frs = '', $qte = null, $rech_artfou = true, $calc_type = true, $searchWithOutIDCata = false)
        {
            $result = array();

            // Probleme de conditionnement car ca sert a rien si nous ne l'alimenton pas ailleur
            $liste_multi_frs = null;
            $query_where = '';
            
            if (is_array($article)) {
                if ($isCertifieIntuition)
                    $retour_sinequa = $article;
                else 
                // Phase 1 on se recherche soit meme dans sinequa
                if ($retour_sinequa = $this->RechercheArt($article, false))
                    $result[$retour_sinequa['SERIALIZATION']] = & $retour_sinequa;
                else
                    $retour_sinequa = $article;
                
                // Alors on construit la requête
                if (array_key_exists('COD_FAB', $retour_sinequa) && trim($retour_sinequa['COD_FAB']) != '' && trim($retour_sinequa['REF_FAB']) != '')
                    $Partie1 = " ( COD_FAB = '" . ReplaceSqlPointeur($retour_sinequa['COD_FAB']) . "' AND REF_FAB = '" . ReplaceSqlPointeur($retour_sinequa['REF_FAB']) . "' )";
                else
                    $Partie1 = '';
                if (array_key_exists('COD_GRP', $retour_sinequa) && trim($retour_sinequa['COD_GRP']) != '' && trim($retour_sinequa['REF_FOURN']) != '')
                    $Partie2 = "(regrfour = '" . ReplaceSqlPointeur($retour_sinequa['COD_GRP']) . "' AND REF_FOURN = '" . ReplaceSqlPointeur($retour_sinequa['REF_FOURN']) . "') ";
                else if (array_key_exists('REF_FOURN', $retour_sinequa) && trim($retour_sinequa['REF_FOURN']) != '')
                    $Partie2 = "REF_FOURN = '" . ReplaceSqlPointeur($retour_sinequa['REF_FOURN']) . "' AND COD_FOURN= '" . ReplaceSqlPointeur($retour_sinequa['COD_FOURN']) . "'";
                else
                    $Partie2 = '';
                
                if ('' != trim($retour_sinequa['COD_ART'])) {
                    // Dossier 27506 dans le cas de présence de code article, si c'est une article typé generique alors PAS DE RECHERCHE en mode générique
                    if ($rTmp = SqlArticle::rqIsArticleGenerique($retour_sinequa['COD_ART'])->Trouve1())
                        if (BoolSql($rTmp['GENRERIQUE']))
                            $Partie3 = '';
                        else
                            $Partie3 = "( COD_ART = '" . ReplaceSqlPointeur($retour_sinequa['COD_ART']) . "' )";
                    else
                        $Partie3 = '';
                } else
                    $Partie3 = '';
                
                if ($Partie1 != '' && $Partie2 != '')
                    $query_where = " {$Partie1} OR {$Partie2} ";
                else if ($Partie1 != '')
                    $query_where = $Partie1;
                else if ($Partie2 != '')
                    $query_where = $Partie2;
                else
                    $query_where = '';
                
                if ($query_where != '' && $Partie3 != '')
                    $query_where = " {$query_where} OR {$Partie3} ";
                else if ($Partie3 != '')
                    $query_where = $Partie3;
                if (trim($query_where) != '') {
                    // print_r($this->select); exit; 
                    $query_where = "  {$query_where} ";
                    $requete = "{$this->select} where ({$query_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'])." ) '";
                    // Si un code fournisseur est recherché alors on recherche ce code en mode 'contient'
                    if ('' != $code_frs) {
                        $code_frs = ReplaceSqlPointeur($code_frs);
                        $requete .= " AND (COD_FOURN like '%$code_frs%')";
                    }
                    // Si une raison sociale est recherchée alors on recherche ce code en mode 'contient'
                    if ('' != $rs_frs) {
                        $rs_frs = ReplaceSqlPointeur($rs_frs);
                        $requete .= " AND (RS_FOURN like '%$rs_frs%')";
                    }
                    $today = date('Ymd');
                    
                    if (array_key_exists('ID_CAT', $retour_sinequa) && trim($retour_sinequa['ID_CAT']) != '' && !$searchWithOutIDCata)
                        $requete .= " AND ID_CAT = '" . ReplaceSqlPointeur($retour_sinequa['ID_CAT']) . "' 	";
                    
                    $requete .= " AND (datepub   <= '{$today}' OR datepub = '00000000')  AND (validcata >= '{$today}' OR validcata = '00000000') 	";
                    
                    
                    // print_r($requete); exit; 

                    // Ajout des clauses spécifiques
                    BaseSynequa::ajoutClauseSpecifique($requete);
                    if ($this->connect()) {
                        $the_query = BaseSynequa::$the_session->in_query($requete);
                        if ($the_query) {
                            $this->count_row = $the_query->in_num_rows();
                            while ($row = & $the_query->in_fetch_row())
                                $result[$row['serialization']] = & CtrlArticle::MajRecordSigneQua($row);
                        }
                        BaseSynequa::disconnect();
                    }
                }
                // Traitement de la liste des differents article sinequa trouve
                if (is_array($result)) {
                    $cacheRemFour = array();
                    foreach ($result as & $element)
                        if (is_array($element) && array_key_exists('TYPECATA', $element) && $element['TYPECATA'] == 'M') {
                            if (! $calc_type && is_array($liste_multi_frs)) {
                                $ind_frs_trouve = count($liste_multi_frs);
                                $liste_multi_frs[$ind_frs_trouve] = $element;
                            } else {
                                $motIndex = $element['ID_CAT'] . '|' . $element['COD_FAB'] . '|' . $element['COD_GAM'];
                                
                                $buf = array();
                                if (array_key_exists($motIndex, $cacheRemFour))
                                    $buf = $cacheRemFour[$motIndex];
                                else {
                                    Article::getAllFrsAndTxForArtCatRemise($element['ID_CAT'], $element['COD_FAB'], $element['COD_GAM'], $buf);
                                    $cacheRemFour[$motIndex] = $buf;
                                }
                                if (is_array($buf))
                                    foreach ($buf as &$frs_trouve) {
                                        $okToCharge = true;
                                        if (array_key_exists('PANIER_FOURNISSEUR_IMPOSE', $_SESSION) && '' != trim($_SESSION['PANIER_FOURNISSEUR_IMPOSE'])) {
                                            if ($frs_trouve['COD_FOURN'] != $_SESSION['PANIER_FOURNISSEUR_IMPOSE'])
                                                $okToCharge = false;
                                        } else if ('' != $code_frs && $frs_trouve['COD_FOURN'] != $code_frs)
                                            $okToCharge = false;
                                        
                                        if ($okToCharge || $liste_multi_frs) {
                                            $ind_frs_trouve = count($liste_multi_frs);
                                            $liste_multi_frs[$ind_frs_trouve] = $element;
                                            $liste_multi_frs[$ind_frs_trouve]['PX_ART'] = FormatageData::formatMontant($element['PX_ART_INIT'] * (1 - ($frs_trouve['REMGAM'] / 100)), Param::getNombreDeciamlePU());
                                            $liste_multi_frs[$ind_frs_trouve]['PX_ART_INIT'] = & $liste_multi_frs[$ind_frs_trouve]['PX_ART'];
                                            $liste_multi_frs[$ind_frs_trouve]['VILLE_FOURN'] = & $frs_trouve['CPOSTAL'] . ' ' . $frs_trouve['VILLE1'];
                                            $liste_multi_frs[$ind_frs_trouve]['CPOSTAL'] = & $frs_trouve['CPOSTAL'];
                                            $liste_multi_frs[$ind_frs_trouve]['VILLE1'] = & $frs_trouve['VILLE1'];
                                            $liste_multi_frs[$ind_frs_trouve]['COD_FOURN'] = & $frs_trouve['COD_FOURN']; // On met le code fournisseur à jour
                                            $liste_multi_frs[$ind_frs_trouve]['RS_FOURN'] = & $frs_trouve['RS_FOURN']; // On met la raison sociale à jour
                                            if ($rechAtutoCC)
                                                $liste_multi_frs[$ind_frs_trouve]['IS_AUTH_CDE_OXAPROC'] = Article::isArtMultiFrsAutCdeOxaproc($frs_trouve['COD_FOURN'], $element['COD_FAB'], $element['COD_ACD'], $element['COD_ART']);
                                            if (! is_null($qte) && BoolSql($element['PRIXDEGRESSIF']))
                                                $liste_multi_frs[$ind_frs_trouve]['PX_ART'] = Article::getPrixDegressifByQte($element, $qte);
                                        }
                                    }
                            }
                        } else {
                            if(is_array($liste_multi_frs))
                                $ind_frs_trouve = count($liste_multi_frs);
                            else
                                $ind_frs_trouve = 0;
                            $liste_multi_frs[$ind_frs_trouve] = $element;
                        }
                    
                    // Traitement unicite fournisseur
                    Fournisseur::selectAllFrsWithAcdAndBestPrice($liste_multi_frs);
                }
            }
            
            return $liste_multi_frs;
        }
    }
}
