<?php

class Catalogue
{

    protected $ID_CATAL;
 // String : Identifiant du catalogue
    protected $FRS;
 // Array : Tableau contenant les informations d'un fournisseur trouvé sur catalogue remise
    protected $TYPE_CATA;
 // String : Type de catalogue
    
    /**
     * Constructeur
     *
     * @param string $id_cat
     *            : Identifiant du catalogue
     */
    public function __construct($id_cat)
    {
        $this->ID_CATAL = $id_cat;
        $this->TYPE_CATA = $this->getTypeCatalogue();
    }

    public function &getFRS()
    {
        return $this->FRS;
    }

    public function &getTypeCata()
    {
        return $this->TYPE_CATA;
    }

    /**
     * Fonction retournant le type d'un catlogue donné
     *
     * @return string : Type de catalogue : F => monoforunisseur | M => multifournisseur
     */
    public function &getTypeCatalogue()
    {
        $result = & SqlFavoriCatalogue::rqGetTypeCatalogue($this->ID_CATAL)->Trouve1();
        return $result['TYPECATA'];
    }

    /**
     * Fonction retournant dans un tableau les informations relatives à un catalogue de type PunchOut
     *
     * @return array
     */
    public function &getInfoOnCatPunchOut()
    {
        
        return SqlFavoriCatalogue::rqGetInfoOnCatPunchOutByIdCat($this->ID_CATAL)->Trouve1();
    }

    /**
     * Fonction permettant de savoir si une transcodification existe sur un catalogue de type punch out
     *
     * @return boolean : true si une transcodification existe false sinon
     */
    public function &getTranscoOnCatPunchOutByIdCat($type_data, $value_entree = '')
    {
        return SqlFavoriCatalogue::rqGetTranscoOnCatPunchOutByIdCat($this->ID_CATAL, $type_data, $value_entree)->Trouve1();
    }

    /**
     * Fonction permettant de connaitre la valeur par défaut de transcodification des unités
     *
     * @return string : valeur par défaut de l'unité transcodée
     */
    public function &getDefaultTranscoOnCatPunchOutByIdCat($type_data)
    {
        return SqlFavoriCatalogue::rqGetDefaultTranscoOnCatPunchOutByIdCat($this->ID_CATAL, $type_data)->Trouve1();
    }

    /**
     * Fonction permettant de tester si un catalogue est considéré comme multifounisseur ou pas
     *
     * @return boolean : retourne vrai si la catalogue est du type R ( multifournisseur remise) ou bien du type X( multifournisseur accord-cadre) sinon faux
     */
    public function isMultiFournisseur()
    {
        return ('R' == $this->TYPE_CATA || 'X' == $this->TYPE_CATA || 'M' == $this->TYPE_CATA || 'G' == $this->TYPE_CATA);
    }

    /**
     * Fonction retournant le tableau XML permettant d'afficher la liste des catalogues de l'utilisateur afin d'effectuer des recherches spécifiques sur un ou plusieurs catalogues sélectionnés
     *
     * @param string $login
     *            : Login du demandeur
     * @param string $centre_livraison
     *            : Centre de livraison de la session utilisateur
     * @param string $centre_emet
     *            : Centre émetteur de la session utilisateur
     */
    public static function &buildXmlSearchByCatalogue($classRechercheCatalogue, & $login, & $centre_livraison, & $centre_emet, $liste_cat_selected = array())
    {
        // Initialisation du tableau contenant les données XML qui seront fusionné avec la XSL
        global $connecteur;
        
        // On récupère la liste des catalogues disponibles pour l'utilisateur
        
        if ($articleCmp = ArticleSelect::restoreSession())
            $array_xml = $articleCmp->getXmlArray();
        else
            $array_xml = null;
        
        // Si la liste n'est pas vide
        if ($liste_catalogue_user = utilisateur::getAllCatalogueByUser($login, $centre_livraison, $centre_emet)) {
            $array_xml[0]['!CAT_IMG'] = 'img_folder_32x32';
            $array_xml[0]['!CAT_MISS_IMG'] = 1;
            $array_xml[0]['!CAT_NOM'] = trad('TOUS LES CATALOGUES');
            $array_xml[0]['!CAT_DESIGN'] = trad('Recherche globale sur tous les catalogues');
            $array_xml[0]['!existe_fav'] = 2;
            
            $recherche_directe = " if(switchCheckBoxBySearchName('frm_saisie_panier', 'CAT_', false, '')){";
            $recherche_directe .= " document.getElementById('texte_recherche').value = ''; document.getElementById('btn_recherche_panel_catalogue_direct').click();";
            $recherche_directe .= ' }';
            
            $array_xml[0]['!RECH_DIRECTE_ONCLICK'] = $recherche_directe;
            
            $ind_cat = 1; // Indice du catalogue dans le tableau $array_xml
            $nb_cat_selected = 0; // Compteur indiquant le nombre de catalogues sélectionné par l'utilisateur
                                  // Pour chaque catalogue
                                  
            // Suite
            foreach ($liste_catalogue_user as & $catalogue_user) {
                
                if (is_null($classRechercheCatalogue) || $classRechercheCatalogue->getContexte() == 'panier') // En mode panier tous les types de catalogue
                    $okToContinue = true;
                else if ('PC' == $catalogue_user['SRCDATA'] || 'PO' == $catalogue_user['SRCDATA']) // Pour les autres configuration PAS DE CATALOGUE PUNCHOUT Dossier 26800
                    $okToContinue = false;
                else
                    $okToContinue = true;
                
                if ($okToContinue) {
                    // Données du catalogues
                    $array_xml[$ind_cat]['!CAT_ID'] = & $catalogue_user['ID_CATPR']; // Identifiant
                    $array_xml[$ind_cat]['!CAT_NOM'] = & $catalogue_user['NCATAPR']; // Nom
                    $array_xml[$ind_cat]['!CAT_DESIGN'] = & $catalogue_user['DESCRCATA']; // Description
                    
                    if ($catalogue_user['PDF_URL'] != '' && $catalogue_user['PDF_URL_TYPE'] != '') {
                        if ($catalogue_user['PDF_URL_TYPE'] == 'E') {
                            if ($catalogue_user['PDF_URL'] != '') {
                                $url = "window.open('" . ReplaceSqlPointeur($catalogue_user['PDF_URL']) . "','win_pop_lad');";
                                $array_xml[$ind_cat]['!CAT_URL_ACTION'] = $url;
                                $array_xml[$ind_cat]['!CAT_URL_TITLE'] = trad('Ouvrir le catalogue PDF du fournisseur');
                            }
                        } else if ($catalogue_user['PDF_URL_TYPE'] == 'I' && $catalogue_user['PDF_URL'] != '') {
                            $param = '?uniq=' . uniqid();
                            $param .= '&token=' . password_hash($_SESSION['Session_Login'].session_id(), PASSWORD_DEFAULT);
                            
                            $url = "charge_document.php" . $param . '&EmplacementFichier=web&UrlFichier=' . urlencode($catalogue_user['PDF_URL']);
                            
                            $url = "window.open('" . ReplaceSqlPointeur($url) . "','win_pop_lad');";
                            
                            $array_xml[$ind_cat]['!CAT_URL_ACTION'] = $url;
                            $array_xml[$ind_cat]['!CAT_URL_TITLE'] = trad('Ouvrir le catalogue PDF du fournisseur');
                        }
                    }
                    
                    if ('' != trim($catalogue_user['URLIMG'])) {
                        
                        // Si l'image est un lien du type http
                        if (false !== stripos($catalogue_user['URLIMG'], 'http') || '\\' == mb_substr($catalogue_user['URLIMG'], 0, 2))
                            $array_xml[$ind_cat]['!CAT_IMG'] = & $catalogue_user['URLIMG'];
                        // Si l'image est un lien unc
                        else
                            $array_xml[$ind_cat]['!CAT_IMG'] = Param::getImageWeb($catalogue_user['URLIMG']);
                    } else {
                        $array_xml[$ind_cat]['!CAT_IMG'] = 'img_folder_32x32';
                        $array_xml[$ind_cat]['!CAT_MISS_IMG'] = 1;
                    }
                    
                    /**
                     * A revoir pour passer sur le process punchout
                     */
                    
                    // Si la source du catalogue est du type punchOut
                    if (('PC' == $catalogue_user['SRCDATA'] || 'PO' == $catalogue_user['SRCDATA'])) {
                        /*
                         * $nbCat = 0;
                         * // EXEC Oxaproc_countcataprive 66
                         * $sql = SqlSynequa::rqCountCataloguePrive($catalogue_user['ID_CATPR']);
                         * if ($result_req = $connecteur->CanFind($sql, DB_OXACATDB, true, false))
                         * $nbCat = $result_req['computed'];
                         *
                         * if ($nbCat == 0){
                         */
                        $array_xml[$ind_cat]['!RECH_DIRECTE_ONCLICK'] = "CallUrl('punchOut.php?action=accueil&id_cat={$catalogue_user['ID_CATPR']}&type_po={$catalogue_user['SRCDATA']}');";
                        $notCataPunchOut = false;
                        /*
                         * }
                         * else{
                         * $notCataPunchOut = true;
                         * }
                         */
                    } else
                        $notCataPunchOut = true;
                    
                    // Pour tous les autre cas
                    if ($notCataPunchOut) {
                        switch ($catalogue_user['SRCDATA']) {
                            case 'AG':
                                $type_cat = 'AG';
                                break;
                            
                            case 'SF':
                                $type_cat = 'SF';
                                break;
                            
                            case 'H':
                            case 'E':
                            case 'PO':
                            case 'PC':
                                $type_cat = 'ART';
                                break;
                            default:
                                /**
                                 * Si l'on arrive ici c'est une bug fonctionnelle suite à la mise en place de la possibilité
                                 * d'avoir un catalogue de punchout avec des articles réel
                                 */
                                print_r($catalogue_user);
                                exit();
                        }
                        
                        // Eléments du formulaire
                        // Case à cocher permettant à un utilisateur de sélectionner un catalogue dans la liste
                        $array_xml[$ind_cat]['!CHECKBOX_NAME'] = "CAT_{$type_cat}_{$catalogue_user['ID_CATPR']}"; // Nom de la checkbox
                        $array_xml[$ind_cat]['!CAT_SELECT'] = "document.getElementById('btn_recherche_panel_catalogue').click();";
                        
                        if (array_key_exists($array_xml[$ind_cat]['!CHECKBOX_NAME'], $liste_cat_selected) && BoolSql($liste_cat_selected[$array_xml[$ind_cat]['!CHECKBOX_NAME']])) {
                            $array_xml[$ind_cat]['!CHECKBOX_CHECKED'] = 1;
                            
                            $deselection_catalogue = " if(switchCheckBox(new Array('CAT_{$type_cat}_{$catalogue_user['ID_CATPR']}','CAT_{$type_cat}_{$catalogue_user['ID_CATPR']}'),false,true)){";
                            $deselection_catalogue .= " document.getElementById('texte_recherche').value = ''; document.getElementById('btn_recherche_panel_catalogue_direct').click();";
                            $deselection_catalogue .= ' }';
                            $array_xml[$ind_cat]['!CAT_SUP_SELECT'] = $deselection_catalogue;
                            
                            $nb_cat_selected ++;
                        } else
                            $array_xml[$ind_cat]['!CHECKBOX_CHECKED'] = 0;
                        
                        // COTE OXAPROC NE JAMAIS UTILISE URLSITE, c'est seulement pour SRM
                        {
                            $recherche_directe = " if(switchCheckBoxBySearchName('frm_saisie_panier', 'CAT_', false, 'CAT_{$type_cat}_{$catalogue_user['ID_CATPR']}')){";
                            $recherche_directe .= " document.getElementById('texte_recherche').value = ''; document.getElementById('btn_recherche_panel_catalogue_direct').click();";
                            $recherche_directe .= ' }';
                            
                            $array_xml[$ind_cat]['!RECH_DIRECTE_ONCLICK'] = $recherche_directe; // Comportement onclick sur la recherche directe
                        }
                    }
                    
                    // Ajout de la notion de favoris
                    FavoriCatalogue::setPropHtml($catalogue_user, $array_xml[$ind_cat], $ind_cat, "javascript:CallUrl('panier_ong_1.php?action=updFav" . "&lg=" . $ind_cat . "&ID_CAT={$catalogue_user['ID_CATPR']}')");
                    
                    $ind_cat ++;
                }
            }
            $indice_ligne = 0;
            $ind_catalogue = 0;
            
            foreach ($array_xml as & $catalogue_user) {
                if ($ind_catalogue % 3 == 0)
                    $indice_ligne ++;
                
                $array_final['Ligne'][$indice_ligne]['Catalogue'][$ind_catalogue] = $catalogue_user;
                
                $ind_catalogue ++;
            }
            
            $array_final['Entete']['compteur']['COMPTEUR_ID'] = 'NB_CAT_SELECTED'; // Identifiant de la zone contenant le nombre de catalogues sélectionné par l'utilisateur
            $array_final['Entete']['compteur']['COMPTEUR_VALEUR'] = $nb_cat_selected; // Compteur indiquant le nombre de catalogue sélectionnés
            
            /*
             * Voir avec SGR si paramétrage pour la liste catalogue coté droit ou bas
             * $array_final['Entete']['liste_catalogues'] ['id'] = 'liste_catalogues_selection'; //
             * $array_final['Entete']['bouton_liste_catalogues']['id'] = 'bouton_liste_catalogues'; //
             * // collapseExpandMenu(id_menu,id_bouton,reduire_img,title_reduire,develop_img,title_develop)
             * $array_final['Entete']['bouton_liste_catalogues']['onclick'] = "collapseExpandMenu('liste_catalogues','{$array_final['Entete']['bouton_liste_catalogues']['id']}','images/normal/suivi_close.GIF','" . cnv_to_javascript(Trad("Masquer la liste des catalogues")) . "','images/normal/suivi_open.GIF','" . cnv_to_javascript(Trad("Afficher la liste des catalogues")) . "');";
             */
        }
        
        return $array_final;
    }

    /**
     * Fonction retournant le tableau XML permettant d'afficher la liste des catalogues de l'utilisateur afin d'effectuer des recherches spécifiques sur un ou plusieurs catalogues sélectionnés
     */
    public static function &buildXmlSearchByCaracteristique($liste_caract_selected = array())
    {
        
        // Initialisation du tableau contenant les données XML qui seront fusionné avec la XSL
        $array_xml = array();
        
        // On récupère la liste des catégories existante dans Haplus
        if ($liste_categories = Catalogue::getAllCaractArtInItuition()) {
            $ind_caract = 0; // Indice de la catégorie dans le tableau $array_xml
            $nb_caract_selected = 0; // Compteur indiquant le nombre de caractéristique sélectionnées
            foreach ($liste_categories as & $caracteristique) {
                // Données de la caractéristique
                $array_xml[$ind_caract] = array(
                    'CARACT_ID' => & $caracteristique['CAR_ID'], // Identifiant de la caractéristique
                    'CARACT_NOM' => & $caracteristique['CAR_DES'], // Désignation
                    'CARACT_IMG' => & $caracteristique['CAR_IMG'], // Image
                    
                    'CHECKBOX_NAME' => "CARACT_{$caracteristique['CAR_ID']}" // Nom de la checkbox
                );
                
                if ('' != trim($caracteristique['CAR_IMG']))
                    if (false !== stripos($caracteristique['CAR_IMG'], 'http') || '\\' == mb_substr($caracteristique['CAR_IMG'], 0, 2))
                        $array_xml[$ind_caract]['CARACT_IMG'] = & $caracteristique['CAR_IMG'];
                    else
                        $array_xml[$ind_caract]['CARACT_IMG'] = Param::getImageWeb($caracteristique['CAR_IMG']); // Image associée à la caractéristique
                else
                    $array_xml[$ind_caract]['CARACT_IMG'] = 'images/normal/photo_mini.jpg';
                
                if (array_key_exists($array_xml[$ind_caract]['CHECKBOX_NAME'], $liste_caract_selected) && BoolSql($liste_caract_selected[$array_xml[$ind_caract]['CHECKBOX_NAME']])) {
                    $array_xml[$ind_caract]['CHECKBOX_CHECKED'] = 1;
                    
                    $array_xml[$ind_caract]['CARACT_SUP_SELECT'] = " if(switchCheckBox(new Array('CARACT_{$caracteristique['CAR_ID']}','CARACT_{$caracteristique['CAR_ID']}'),false,true)){" . " document.getElementById('texte_recherche').value = ''; TraiteUrlAsyncNoWait('recherche_article.php?action=activeRayon',document.forms.frm_saisie_panier.elements[0],'',''); document.getElementById('btn_rechercher').click();" . ' }';
                    
                    $nb_caract_selected ++;
                } else
                    $array_xml[$ind_caract]['CHECKBOX_CHECKED'] = 0;

                $recherche_directe = " if(switchCheckBoxBySearchName('frm_saisie_panier', 'CARACT_', false, 'CARACT_{$caracteristique['CAR_ID']}')){";
                $recherche_directe .= " document.getElementById('texte_recherche').value = ''; TraiteUrlAsyncNoWait('recherche_article.php?action=activeRayon',document.forms.frm_saisie_panier.elements[0],'',''); document.getElementById('btn_rechercher').click();";
                $recherche_directe .= ' }';
                
                $array_xml[$ind_caract]['RECH_DIRECTE_ONCLICK'] = $recherche_directe; // Comportement onclick sur la recherche directe sur une caractéristique
                
                $ind_caract ++;
            }
            $indice_ligne = 0;
            $ind_caract = 0;
            
            foreach ($array_xml as & $caracteristique) {
                if ($ind_caract % 3 == 0)
                    $indice_ligne ++;
                
                $array_final['Ligne'][$indice_ligne]['Caracteristique'][$ind_caract ++] = & $caracteristique;
            }
            
            $array_final['Entete']['compteur']['COMPTEUR_ID'] = 'NB_CARACT_SELECTED'; // Identifiant de la zone contenant le nombre de catalogues sélectionné par l'utilisateur
            $array_final['Entete']['compteur']['COMPTEUR_VALEUR'] = $nb_caract_selected; // Compteur indiquant le nombre de catalogue sélectionnés
            $array_final['Entete']['liste_caracteristiques']['id'] = 'liste_caracteristiques';
            $array_final['Entete']['bouton_liste_caracteristiques']['id'] = 'bouton_liste_caracteristiques';
            $array_final['Entete']['bouton_liste_caracteristiques']['onclick'] = "collapseExpandMenu('{$array_final['Entete']['liste_caracteristiques']['id']}','{$array_final['Entete']['bouton_liste_caracteristiques']['id']}','images/normal/suivi_close.GIF','" . cnv_to_javascript(Trad("Masquer la liste des caractéristiques")) . "','images/normal/suivi_open.GIF','" . cnv_to_javascript(Trad("Afficher la liste des caractéristiques")) . "');";
        }
        
        return $array_final;
    }

    /**
     * Fonction retournant un tableau contenant les informations sur les caractéristiques présentes dans Intuition
     *
     * @return $liste_catagories_finale array.
     */
    public static function getAllCaractArtInItuition()
    {
        if (! array_key_exists('liste_caract_intuition', $_SESSION)) {
            $liste_categories_finale = array();
            
            // On récupère la liste des catégories existantes dans Haplus
            $liste_catagories = SqlArticle::rqGetAllCaractArt()->TrouveTous();
            
            // On recherche la présence de ces caractéristiques dans Intuition
            $IntuitionSearch = new CaractArt();
            $liste_caract_intuition = & $IntuitionSearch->getAllCaractPresent($liste_catagories);
            
            // Si des caractéristiques ont été trouvées dans Intuition
            if (is_array($liste_caract_intuition) && count($liste_caract_intuition) > 0) {
                $liste_caract = '';
                
                // On contruit une liste de recherche
                foreach ($liste_caract_intuition as & $caract)
                    $liste_caract .= ",'{$caract}'";
                
                // On supprime la première ','
                $liste_caractTmp = mb_substr($liste_caract, 1);
                
                // On récupère les informations liées aux catégories trouvées à partir de la liste précédemment constituée
                $liste_categories_finale = SqlArticle::rqGetAllCaractArt('', $liste_caractTmp)->TrouveTous();
            }
            
            $_SESSION['liste_caract_intuition'] = serializeSecure($liste_categories_finale);
        }
        
        return unserializeSecure($_SESSION['liste_caract_intuition']);
    }
}