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

    class RechercheSynequaArtGen extends BaseSynequa
    {

        var $cod_art = '';

        var $cod_frs = '';

        // Création d'un tableau contenant les catalogues multifournisseur
        protected $liste_cata_multi_frs = array();

        public function &getliste_cata_multi_frs()
        {
            return $this->liste_cata_multi_frs;
        }

        /*
         * Fonction permettant de recherche un article générique en particulier Utilisé dans le cas de l'infobulle. @param array $article : Tableau contenant le code et la sous-famille de l'article recherché
         */
        public function old_searchArt(& $article)
        {
            $liste_champ = array(
                'CODE_ART',
                'SSFAM'
            );
            
            if ($this->connect()) {
                
                $requete = '';
                foreach ($liste_champ as $champ)
                    if (is_array($article) && array_key_exists($champ, $article))
                        if ($champ == 'CODE_ART' && $article[$champ] != '') {
                            $requete .= ($requete != '' ? ' or ' : '') . " ($champ = '" . ReplaceSqlPointeur($article[$champ]) . "' AND IDSTRUC = 'ART')";
                            break;
                        } elseif ($champ == 'SSFAM')
                            $requete .= ($requete != '' ? ' or ' : '') . " ($champ = '" . ReplaceSqlPointeur($article[$champ]) . "' AND IDSTRUC = 'SSF' )";
                
                // 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 »
                // 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 != ''){
                            $requete .= $limitationSsfam.')';
                        }
                    }
                }
                // FIN DOSSIER 33392

                if ($requete != '')
                    $requete = ' AND (' . $requete . ')';
                if ($_SESSION['Session_Langue'] != '' && Param::isMultiLanguages())
                    $requete .= " and LANGUE = '{$_SESSION['Session_Langue']}'";
                
                if (Param::isPublicationGenerique()) {
                    // 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} ) ";
                }
                
                $requete .= ' SKIP 0 COUNT 1 ';
                
                $requete = " SELECT * FROM {$_SESSION['INTUITION_HAP']} WHERE Serialization <> '0' " . $requete;
                
                if ($the_query = BaseSynequa::$the_session->in_query($requete))
                    return $the_query->in_fetch_row();
                else
                    return null;
            }
        }
        public function searchArt(& $article)
        {
            if ($_SESSION['STATUT_RECH_ART'] != 1) {
                return [];
            }
            
            $liste_champ = array(
                'CODE_ART',
                'SSFAM'
            );
            
                
                $requete = '';
                foreach ($liste_champ as $champ)
                    if (is_array($article) && array_key_exists($champ, $article))
                        if ($champ == 'CODE_ART' && $article[$champ] != '') {
                            $requete .= ($requete != '' ? ' or ' : '') . " ($champ = '" . ReplaceSqlPointeur($article[$champ]) . "' AND IDSTRUC = 'ART')";
                            break;
                        } elseif ($champ == 'SSFAM')
                            $requete .= ($requete != '' ? ' or ' : '') . " ($champ = '" . ReplaceSqlPointeur($article[$champ]) . "' AND IDSTRUC = 'SSF' )";
                
                // 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 »
                // 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){

                        $requete .= " SSFAM in (select CODE_SFAM from SSFAMFOU where CODE_FOUR= ''$codeFrsRegul'') 
                        or SSFAM  NOT IN (select CODE_SFAM from SSFAMFOU where CODE_FOUR <> ''$codeFrsRegul'')";
                    }
                }
                // FIN DOSSIER 33392

                if ($requete != '')
                    $requete = ' AND (' . $requete . ')';
                if ($_SESSION['Session_Langue'] != '' && Param::isMultiLanguages())
                    $requete .= " and LANGUE = '{$_SESSION['Session_Langue']}'";
                
                /*if (Param::isPublicationGenerique()) {
                    // 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} ) ";
                }*/

                //TODO NEW CONNECTEUR
                $req = " SELECT TOP 1 * FROM DALIBRE WHERE 1=1 " . $requete;
                $requete = new RequeteSQL($req, DB_OXAFTDB);
                $row = $requete->Trouve1();
                
                if ($row) {
                    return [
                        'idstruc'       => $row['IDSTRUC'],
                        'code_art'      => $row['CODE_ART'],
                        'ssfam'         => $row['SSFAM'],
                        'design'        => $row['DESIGN'],
                        'designlng'     => $row['DESIGNLG'],
                        'unite'         => $row['UNITE'],
                        'langue'        => $row['LANGUE'],
                        'catprlst'      => $row['CATPRLST'],
                        'rayon1'        => $row['RAYON1'],
                        'rayon2'        => $row['RAYON2'],
                        'rayon3'        => $row['RAYON3'],
                        'rayon4'        => $row['RAYON4'],
                        'rayon5'        => $row['RAYON5'],
                        'recep_auto'    => $row['RECEP_AUTO'],
                        'per_rec_auto'  => $row['PER_REC_AUTO'],
                        'nonrecept'     => $row['NONRECEPT'],
                        'taux_tva'      => $row['TAUX_TVA'],
                        'code_fam'      => $row['CODE_FAM'],
                        'provenance'    => $row['PROVENANCE'],
                        'serialization' => $row['ROW_COMPTEUR'],
                    ];
                } else {
                    return null;
                }
        }

        public function &old_searchArtGen(& $article)
        {
            $liste_champ = array(
                'CODE_ART',
                'SSFAM'
            );
            
            $result = null;
            if ($this->connect()) {
                $requete = " SELECT * FROM {$_SESSION['INTUITION_HAP']} WHERE Serialization <> '0' ";
                if ($_SESSION['Session_Langue'] != '' && Param::isMultiLanguages())
                    $requete .= "and LANGUE = '{$_SESSION['Session_Langue']}'";
                
                foreach ($liste_champ as & $champ)
                    if (is_array($article) && array_key_exists($champ, $article))
                        $requete .= " and $champ = '" . ReplaceSqlPointeur($article[$champ]) . "' ";
                
                $requete .= ' SKIP 0 COUNT 1 ';
                
                if ($the_query = BaseSynequa::$the_session->in_query($requete)) {
                    while ($row = & $the_query->in_fetch_row())
                        $result = array(
                            'PROVENANCE' => 'ARTGEN',
                            'ID_CAT' => '',
                            'COD_ART' => & $row['code_art'],
                            'COD_FOURN' => '',
                            'RS_FOURN' => '',
                            'VILLE_FOURN' => '',
                            'REF_FOURN' => '',
                            'COD_FAB' => '',
                            'RS_FAB' => '',
                            'COD_GAM' => '',
                            'LIB_GAM' => '',
                            'REF_FAB' => '',
                            'COD_SFAM' => & $row['ssfam'],
                            'LIB_SFAM' => & $row['lib_sfam'],
                            'COD_FAM' => (array_key_exists('code_fam', $row) ? $row['code_fam'] : ''), // En rapport avec le dossier 14122
                            'DES_ART' => & $row['design'],
                            'DES_COMP' => & $row['designlg'],
                            'COD_UNIT' => & $row['unite'],
                            'PX_ART' => '',
                            'DELAI' => '',
                            'CARACT' => '',
                            'IMGART' => '',
                            'TYPIMAGE' => '',
                            'COD_ACD' => '',
                            'CPOSTAL' => '',
                            'VILLE1' => '',
                            'TYPECATA' => & $row['typecata'],
                            // DOSSIER 30642
                            'FICHTECH' => !empty(Article::getDocAttInfoFromCodArt($row['code_art'], true)),
                            'SERIALIZATION' => & $row['serialization'],
                            'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                            'ARTASSOCIE' => false,
                            'PRIXDEGRESSIF' => false,
                            'INFO_BULLE' => '',
                            'PER_REC_AUTO' => & $row['per_rec_auto'],
                            'RECEP_AUTO' => BoolSql($row['recep_auto']),
                            'NONRECEPT' => BoolSql($row['nonrecept'])
                        );
                }
            }
            
            return $result;
        }

        public function &searchArtGen(& $article)
        {
            if ($_SESSION['STATUT_RECH_ART'] != 1) {
                return [];
            }
            
            $liste_champ = array(
                'CODE_ART',
                'SSFAM'
            );
            
            $result = null;
            
                $requete = " SELECT TOP 1 * FROM DALIBRE with (nolock) WHERE 1=1 ";
                if ($_SESSION['Session_Langue'] != '' && Param::isMultiLanguages()) {
                    $requete .= "and LANGUE = '{$_SESSION['Session_Langue']}'";
                }
                
                foreach ($liste_champ as & $champ) {
                    if (is_array($article) && array_key_exists($champ, $article)) {
                        $requete .= " and $champ = '" . ReplaceSqlPointeur($article[$champ]) . "' ";

                    }
                }
                     
                //TODO NEW CONNECTEUR
                $requete = new RequeteSQL($requete, DB_OXAFTDB);
                $row = $requete->Trouve1();
                
                $result = array(
                    'PROVENANCE' => 'ARTGEN',
                    'ID_CAT' => '',
                    'COD_ART' => $row['CODE_ART'],
                    'COD_FOURN' => '',
                    'RS_FOURN' => '',
                    'VILLE_FOURN' => '',
                    'REF_FOURN' => '',
                    'COD_FAB' => '',
                    'RS_FAB' => '',
                    'COD_GAM' => '',
                    'LIB_GAM' => '',
                    'REF_FAB' => '',
                    'COD_SFAM' => $row['SSFAM'],
                    'LIB_SFAM' => $row['DESIGN'],
                    'COD_FAM' => (array_key_exists('CODE_FAM', $row) ? $row['CODE_FAM'] : ''), // En rapport avec le dossier 14122
                    'DES_ART' => $row['DESIGN'],
                    'DES_COMP' => $row['DESIGNLG'],
                    'COD_UNIT' => $row['UNITE'],
                    'PX_ART' => '',
                    'DELAI' => '',
                    'CARACT' => '',
                    'IMGART' => '',
                    'TYPIMAGE' => '',
                    'COD_ACD' => '',
                    'CPOSTAL' => '',
                    'VILLE1' => '',
                    'TYPECATA' => '',
                    // DOSSIER 30642
                    'FICHTECH' => !empty(Article::getDocAttInfoFromCodArt($row['CODE_ART'], true)),
                    'SERIALIZATION' => & $row['ROW_COMPTEUR'],
                    'DATABASEID' => '',
                    'ARTASSOCIE' => false,
                    'PRIXDEGRESSIF' => false,
                    'INFO_BULLE' => '',
                    'PER_REC_AUTO' => $row['PER_REC_AUTO'],
                    'RECEP_AUTO' => BoolSql($row['RECEP_AUTO']),
                    'NONRECEPT' => BoolSql($row['NONRECEPT'])
                );
            
            
            return $result;
        }

        function &ReturnData($page, $nligne, $texte, $txt_frs, $COD_FOURN = '', $LIB_SFAM = '', $RS_FAB = '', $LIB_GAM = '', $ID_CAT = '', $SSFAM = '')
        {
            $indice = $_SESSION['nb_page_demande'];
            $_SESSION['req_syn_COD_FOURN_' . $indice] = $COD_FOURN;
            $_SESSION['req_syn_LIB_SFAM_' . $indice] = $LIB_SFAM;
            $_SESSION['req_syn_RS_FAB_' . $indice] = $RS_FAB;
            $_SESSION['req_syn_LIB_GAM_' . $indice] = $LIB_GAM;
            
            $result = null;
            
            $this->count_row = 0;
            $this->arr_cod_fourn = null;
            $this->arr_lib_sfam = null;
            $this->arr_rs_fab = null;
            $this->arr_lib_gam = null;
            
            if ('' != $SSFAM) {
                $CODE_SFAM = ReplaceSqlPointeur($SSFAM);
                $where .= " and SSFAM =''$CODE_SFAM'' ";
            }
            
            $req = "EXEC Oxaproc_GenArtFreeRankDes '".$_SESSION["Session_Login"]."','".$_SESSION['Session_Langue']."','ART','$texte','','$where',$nligne,$page";
            
            $requete = new RequeteSQL($req, DB_OXASQLDB);
            $listeRow = $requete->TrouveTous();
            
            foreach($listeRow as $row) {
                $this->count_row = $this->count_row+1;
                $result[] = array(
                    'PROVENANCE' => 'ARTGEN',
                    'ID_CAT' => '',
                    'COD_ART' => $row['CODE_ART'],
                    'COD_FOURN' => '',
                    'RS_FOURN' => '',
                    'VILLE_FOURN' => '',
                    'REF_FOURN' => '',
                    'COD_FAB' => '',
                    'RS_FAB' => '',
                    'COD_GAM' => '',
                    'LIB_GAM' => '',
                    'REF_FAB' => '',
                    'COD_SFAM' => $row['SSFAM'],
                    'LIB_SFAM' => $row['DESIGN'],
                    'COD_FAM' => (array_key_exists('CODE_FAM', $row) ? $row['CODE_FAM'] : ''), // En rapport avec le dossier 14122
                    'DES_ART' => $row['DESIGN'],
                    'DES_COMP' => $row['DESIGNLG'],
                    'COD_UNIT' => $row['UNITE'],
                    'PX_ART' => '',
                    'DELAI' => '',
                    'CARACT' => '',
                    'IMGART' => '',
                    'TYPIMAGE' => '',
                    'COD_ACD' => '',
                    'CPOSTAL' => '',
                    'VILLE1' => '',
                    'TYPECATA' => '',
                    // DOSSIER 30642
                    'FICHTECH' => false,
                    'SERIALIZATION' => & $row['ROW_COMPTEUR'],
                    'DATABASEID' => '',
                    'ARTASSOCIE' => false,
                    'PRIXDEGRESSIF' => false,
                    'INFO_BULLE' => '',
                    'PER_REC_AUTO' => $row['PER_REC_AUTO'],
                    'RECEP_AUTO' => BoolSql($row['RECEP_AUTO']),
                    'NONRECEPT' => BoolSql($row['NONRECEPT'])
                );
            }
            
            return $result;
            
            
            if ($this->connect()) {
                // Selection des catalogues privés de l'utilisateur
                $where = "IDSTRUC = 'ART' ";
                
                if ($texte != '' && $texte != '*')
                    $where .= ($where == '' ? '' : ' AND ') . " TEXT CONTAINS '" . ReplaceSqlPointeur($texte) . "' ";
                
                $requete = 'select query-expansion,' . '* from ' . $_SESSION['INTUITION_HAP'] . ' ' . "where {$where} " . ($SSFAM != '' ? " AND SSFAM  = '" . ReplaceSqlPointeur($SSFAM) . '\'' : '') . " AND LANGUAGE = '{$this->LANGAGE}' " . ($_SESSION['Session_Langue'] != '' && Param::isMultiLanguages() ? "and LANGUE = '{$_SESSION['Session_Langue']}' " : '') . 'and globalrelevance > ' . RechercheArticle::getTauxPertinence() . ' order by globalrelevance desc ' . 'SKIP ' . (($this->page_demande - 1) * $nligne) . " COUNT {$nligne}";
                
                // recherche sur des metas
                $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[] = array(
                            'PROVENANCE' => 'ARTGEN',
                            'ID_CAT' => '',
                            'COD_ART' => & $row['code_art'],
                            'COD_FOURN' => '',
                            'RS_FOURN' => '',
                            'VILLE_FOURN' => '',
                            'REF_FOURN' => '',
                            'COD_FAB' => '',
                            'RS_FAB' => '',
                            'COD_GAM' => '',
                            'LIB_GAM' => '',
                            'REF_FAB' => '',
                            'COD_SFAM' => & $row['ssfam'],
                            'LIB_SFAM' => & $row['lib_sfam'],
                            'COD_FAM' => (array_key_exists('code_fam', $row) ? $row['code_fam'] : ''), // En rapport avec le dossier 14122
                            'DES_ART' => & $row['design'],
                            'DES_COMP' => & $row['designlg'],
                            'COD_UNIT' => & $row['unite'],
                            'PX_ART' => '',
                            'DELAI' => '',
                            'CARACT' => '',
                            'IMGART' => '',
                            'TYPIMAGE' => '',
                            'COD_ACD' => '',
                            'CPOSTAL' => '',
                            'VILLE1' => '',
                            'TYPECATA' => & $row['typecata'],
                            'FICHTECH' => false,
                            'SERIALIZATION' => & $row['serialization'],
                            'DATABASEID' => & $row['databaseid'], // Utilisation reference unique information
                            'ARTASSOCIE' => false,
                            'PRIXDEGRESSIF' => false,
                            'INFO_BULLE' => '',
                            'RECEP_AUTO' => BoolSql($row['RECEP_AUTO']),
                            'PER_REC_AUTO' => BoolSql($row['PER_REC_AUTO'])
                        );
                    }
                }
                BaseSynequa::disconnect();
            }
            return $result;
        }
    }
}