<?php

class ArticleAssocie
{

    function __construct($idLigne)
    {
        $this->idLigne = $idLigne;
        $this->rech_arti = new CtrlArticle();
        
        if (is_numeric($idLigne)) {
            
            $this->infoLigne = & SqlPanier::rqGetAllLignePanier($_SESSION['id_panier'], $idLigne)->Trouve1();
            $this->catalogue = new Catalogue($this->infoLigne['ID_CAT']);
            if ($this->infoLigne['type_de_ligne'] == 0)
                $this->article_trouve = & $this->rech_arti->RechercheArt($this->infoLigne);
            else
                $this->article_trouve = & $this->infoLigne;
        } else {
            $this->catalogue = new Catalogue(getValue('ID_CAT'));
            $rechercheArticlesIntuition = new RechercheArticlesIntuition(true);
            $this->article_trouve = & $rechercheArticlesIntuition->getArtCatByIdCatAndSerialization(getValue('ID_CAT'), getValue('SERIALIZATION'));
            $this->infoLigne = & $this->article_trouve;
        }
    }

    function RechercheArticleAssoc()
    {
        $sql = '';
        
        // ‘R’ = Rayon : associé au rayon de rattachement de la ligne
        $in = '';
        if (is_array($this->article_trouve)) {
            if (array_key_exists('RAYON', $this->article_trouve) && is_array($this->article_trouve['RAYON']))
                foreach ($this->article_trouve['RAYON'] as & $rayon)
                    if ($rayon != '')
                        $in .= ($in == '' ? '' : ',') . '\'' . ReplaceSqlPointeur($rayon) . "'";
            
            if ($in != '')
                $sql .= ($sql == '' ? '' : ' UNION ') . "SELECT T_OBJ_ASS,ID_OBJ_ASS,-1 AS COEFF,OBLIG  FROM ART_ASSOC WHERE T_ASS = 'R' AND ID_OBJ IN ($in) ";
            
            // ‘F’ = Fournisseur : associés au fournisseur de la ligne
            if (array_key_exists('COD_GRP', $this->article_trouve) && $this->article_trouve['COD_GRP'] == '')
                if ($this->article_trouve['COD_FOURN'] != '')
                    $sql .= ($sql == '' ? '' : ' UNION ') . "SELECT T_OBJ_ASS,ID_OBJ_ASS,-1 AS COEFF,OBLIG  FROM ART_ASSOC WHERE T_ASS = 'F' AND ID_OBJ = '" . ReplaceSqlPointeur($this->article_trouve['COD_FOURN']) . "' ";
            
            // ‘S’ = Sous famille : associés à la sous famille de la ligne
            if (array_key_exists('COD_SFAM', $this->article_trouve) && $this->article_trouve['COD_SFAM'] != '')
                $sql .= ($sql == '' ? '' : ' UNION ') . "SELECT T_OBJ_ASS,ID_OBJ_ASS,-1 AS COEFF,OBLIG  FROM ART_ASSOC WHERE T_ASS = 'S' AND ID_OBJ = '" . ReplaceSqlPointeur($this->article_trouve['COD_SFAM']) . "' ";
            
            // ‘G’ = Groupement fournisseurs : associés au groupement de rattachement du fournisseur de la ligne
            
            if ($fournisseur = & SqlFrs::rqGetFournisseurAllColonne($this->article_trouve['COD_FOURN'])->Trouve1()) {
                // echo '';
                if ($fournisseur['CODE_REGR'] == '') {
                    $sql .= ($sql == '' ? '' : ' UNION ') . "SELECT T_OBJ_ASS,ID_OBJ_ASS,      COEFF,OBLIG  FROM ART_ASSOC WHERE T_ASS = 'F' AND ID_OBJ = '" . ReplaceSqlPointeur($fournisseur['CODE']) . "' ";
                } elseif ($fournisseur['FOURPRIN'] != '')
                    $sql .= ($sql == '' ? '' : ' UNION ') . "SELECT T_OBJ_ASS,ID_OBJ_ASS,-1 AS COEFF,OBLIG  FROM ART_ASSOC WHERE T_ASS = 'G' AND ID_OBJ = '" . ReplaceSqlPointeur($fournisseur['FOURPRIN']) . "' ";
            }
            // Les articles associés peuvent être de 2 types
            // - Article HA Plus : ART_ASSOC.T_OBJ_ASS=’A’
            $req = '';
            if ($this->infoLigne['PROVENANCE'] == 'HAP') {
                $sql .= ($sql == '' ? '' : ' UNION ') . 'SELECT T_OBJ_ASS,ID_OBJ_ASS,COEFF,OBLIG  FROM ART_ASSOC ' . "WHERE ID_OBJ     = '" . ReplaceSqlPointeur($this->infoLigne['COD_ART']) . "' " . "AND   T_ASS  = 'A'";
            } else {
                // NE PAS TOUCHER L'histoire du code de regroupement car il semble que tous soit un peu faux
                // Il faut donc chercher sur le code du fournisseur ou blanc sinon il arrive des fois que rien n'en sorte
                $identifiant = $this->infoLigne['ID_CAT'] . '|' . $this->infoLigne['COD_ART'] . '|' . '' . '|' . $this->infoLigne['REF_FOURN'] . '|' . $this->infoLigne['COD_FAB'] . '|' . $this->infoLigne['REF_FAB'];
                $req .= "WHERE (ID_OBJ     = '" . ReplaceSqlPointeur($identifiant) . "' ";
                
                $identifiant = $this->infoLigne['ID_CAT'] . '|' . $this->infoLigne['COD_ART'] . '|' . $this->infoLigne['COD_FOURN'] . '|' . $this->infoLigne['REF_FOURN'] . '|' . $this->infoLigne['COD_FAB'] . '|' . $this->infoLigne['REF_FAB'];
                $req .= " OR ID_OBJ     = '" . ReplaceSqlPointeur($identifiant) . "' ) ";
                
                $sql .= ($sql == '' ? '' : ' UNION ') . 'SELECT T_OBJ_ASS,ID_OBJ_ASS,COEFF,OBLIG  FROM ART_ASSOC ' . $req . "AND   T_ASS  = 'C'";
                
                if ($this->infoLigne['COD_ART'] != '') {
                    $sql .= ($sql == '' ? '' : ' UNION ') . 'SELECT T_OBJ_ASS,ID_OBJ_ASS,COEFF,OBLIG  FROM ART_ASSOC ' . "WHERE ID_OBJ     = '" . ReplaceSqlPointeur($this->infoLigne['COD_ART']) . "' " . "AND   T_ASS  = 'A'";
                }
            }
            
            // La liste est volontairement trie par odre decroissant avec l'information d'obligation / et le coeff si = -1 alors on prendra une quantité = 1
            $sql = 'SELECT DISTINCT T_OBJ_ASS,ID_OBJ_ASS,COEFF,OBLIG FROM (' . $sql . ') AS tmp ORDER BY OBLIG DESC,COEFF DESC ';
            
            $this->articleAssoc = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous();
        } else
            $this->articleAssoc = null;
    }

    function &decodeArticle()
    {
        $listeArticle = null;
        $result = null;
        $rechArt = null;
        
        if (is_array($this->articleAssoc))
            foreach ($this->articleAssoc as & $element) {
                if (! (is_array($listeArticle) && array_key_exists($element['ID_OBJ_ASS'], $listeArticle))) {
                    if (isset($rechArt))
                        unset($rechArt);
                    if ($element['T_OBJ_ASS'] == 'A') { // Article : associés à l’article HA Plus de la ligne
                        $rechArt['COD_ART'] = $element['ID_OBJ_ASS'];
                        $rechArt['COD_FOURN'] = $this->article_trouve['COD_FOURN'];
                        if ($rechArt['COD_ART'] != '') {
                            $articleTrouve = false;
                            // 1er essai : cet article existe-t-il chez le même fournisseur?
                            if (($rechArt['COD_FOURN'] ?? '') !== '') {
                                if ($r = $this->rech_arti->RechercheArt($rechArt)) {
                                    $result[] = array(
                                        'art' => $r,
                                        'filtre' => 'HAP',
                                        'enr' => $element,
                                        'type_ligne' => 0
                                    );
                                    $articleTrouve = true;
                                }
                            }
                            // 2ème essai : chez un autre fournisseur?
                            if (! $articleTrouve) {
                                $rechArt['COD_FOURN'] = '';
                                if ($r = $this->rech_arti->RechercheArt($rechArt)) {
                                    $result[] = array(
                                        'art' => $r,
                                        'filtre' => 'HAP',
                                        'enr' => $element,
                                        'type_ligne' => 0
                                    );
                                    $articleTrouve = true;
                                }
                            }
                            if (! $articleTrouve) {
                                // Maintenant on va aller chercer cette information dans sinequa dlibproc
                                // On ca chercher du cote haplus select DESIGN,NVIBOXAP from ARTICLES
                                if ($_SESSION['GLOB_AuthLigneGenerique']) {
                                    $rech_art_intuition = new RechercheSynequaArtGen();
                                    $rechArt['CODE_ART'] = $rechArt['COD_ART']; // A cause de la base de donnée diliproc qui n'est pas identique au mommage de chanp de catproc
                                    if ($info_art_trouve = & $rech_art_intuition->searchArtGen($rechArt))
                                        if ($info_article = & Article::getInfoOnArticle($rechArt['COD_ART'])) {
                                            if (! BoolSql($info_article['NVIBOXAP'])) {
                                                $info_article['PROVENANCE'] = 'HAP';
                                                $info_article['COD_ART'] = &$info_art_trouve['COD_ART'];
                                                $info_article['DES_COMP'] = &$info_article['DESIGN'];
                                                $info_article['DES_ART'] = &$info_art_trouve['DES_ART'];
                                                $info_article['COD_UNIT'] = &$info_art_trouve['COD_UNIT'];
                                                $info_article['COD_SFAM'] = &$info_art_trouve['COD_SFAM'];
                                                $result[] = array(
                                                    'art' => $info_article,
                                                    'filtre' => 'HAP',
                                                    'enr' => $element,
                                                    'type_ligne' => 1
                                                );
                                            }
                                        }
                                }
                            }
                        }
                    } else if ($element['T_OBJ_ASS'] == 'C') { // Article Catalogue Oxacat : associés à l’article du catalogue oxacat de la ligne
                                                        // ici on doit extraire les ifnormations pour rechercher l'article avec la notion de pipe
                                                        // - Code du catalogue Oxacat - Code article HAPlus - Code fournisseur - Référence fournisseur - Code fabricant - Référence fabricant
                        $listeElement = explode('|', $element['ID_OBJ_ASS']);
                        
                        $rechArt['ID_CAT'] = &$listeElement[0]; // ID_CATAL IDATACATA IDVERCATA
                        $rechArt['COD_ART'] = &$listeElement[1]; // CODEARTI
                        $rechArt['COD_FOURN'] = &$listeElement[2]; // CODEFOUR
                        $rechArt['REF_FOURN'] = &$listeElement[3]; // REFARTFOU
                        $rechArt['COD_FAB'] = &$listeElement[4]; // FABRICANT
                        $rechArt['REF_FAB'] = &$listeElement[5]; // REFARTFAB
                        
                        if ($r = & $this->rech_arti->RechercheArt($rechArt))
                            $result[] = array(
                                'art' => $r,
                                'filtre' => 'CAT',
                                'enr' => $element,
                                'type_ligne' => 0
                            );
                    }
                    $listeArticle[$element['ID_OBJ_ASS']] = true;
                }
            }
        
        return $result;
    }
}
