<?php

class PunchOutOCI extends PunchOut
{
    
    protected $login;
    // Login de connexion
    protected $password;
    // Password de connexion
    protected $num_compte;
    // Numéro du compte utilisé
    protected $id_societe;
    // Identifiant de la société
    protected $oci_version;
    // Version OCI utilisée
    public function __construct($id_cat)
    {
        parent::__construct($id_cat);
        
        // Initialisation des propriétés
        $this->login = $this->info_catalogue['ID_CLI_LOGIN'];
        $this->password = $this->info_catalogue['ID_SRV_PASSW'];
        $this->num_compte = $this->info_catalogue['NUMCOMPTE'];
        $this->id_societe = $this->info_catalogue['ID_SOCIETE'];
        $this->oci_version = sprintf('%01.1f', $this->info_catalogue['VERSION_OCI']);
    }
    
    /**
     * Fonction retournant l'url à appeler afin d'établir une session punchOut chez le fournisseur
     *
     * @return string : url
     */
    public function &getUrlPunchOut()
    {
        $info_centre = SqlCentreGene::getInfoOnCentre($_SESSION['Session_CodeCtrLivraison'], 'L', $_SESSION['Session_SocUsr'])->Trouve1();

                $listeParam = SqlPanierLigne::getParamPunchOut($this->info_catalogue['IDFORMAT'])->TrouveTous();
                
                if(!$listeParam)
                {
                    if (false !== stripos($this->url_connexion_po, '?')) {
                        $this->url_connexion_po = $this->url_connexion_po . '&';
                    } else {
                        $this->url_connexion_po = $this->url_connexion_po . '?';
                    }
                    
                    $this->url_connexion_po .= "USERNAME={$this->login}&PASSWORD={$this->password}&account={$this->num_compte}";
                    $this->url_connexion_po .= "&company={$this->id_societe}&OCI_VERSION={$this->oci_version}&DPT={$info_centre['CPOSTAL']}";
                    $this->url_connexion_po .= '&HOOK_URL=' . ($this->url_retour_oxaproc);
                    
                    return $this->url_connexion_po;
                }
                
                foreach($listeParam as $param)
                {
                    if (false !== stripos($this->url_connexion_po, '?'))
                    {
                        $this->url_connexion_po = $this->url_connexion_po . '&';
                    }
                    else
                    {
                        $this->url_connexion_po = $this->url_connexion_po . '?';
                    }
                    
                    if($param['TYPE_PARAM']=='DYNAMIQUE')
                    {
                        if(substr($param['VALEUR_PARAM'], 0, 9) == 'HASTUTIL.')
                        {
                            
                            $champ = substr($param['VALEUR_PARAM'], 9);
                            
                            $value = SqlUsers::rqGetValueSpec($champ, $_SESSION['Session_Login'])->Trouve1();
                            
                            $this->url_connexion_po .= "{$param['NOM_PARAMETRE']}={$value[$champ]}";
                            
                        }
                        elseif($param['NOM_PARAMETRE']=='USERNAME' && $param['VALEUR_PARAM']!='')
                        {
                            $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->login}";
                        }
                        elseif($param['NOM_PARAMETRE']=='PASSWORD' && $param['VALEUR_PARAM']!='')
                        {
                            $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->password}";
                        }
                        elseif($param['NOM_PARAMETRE']=='account' && $param['VALEUR_PARAM']!='')
                        {
                            $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->num_compte}";
                        }
                        elseif($param['NOM_PARAMETRE']=='company' && $param['VALEUR_PARAM']!='')
                        {
                            $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->id_societe}";
                        }
                        elseif($param['NOM_PARAMETRE']=='OCI_VERSION' && $param['VALEUR_PARAM']!='')
                        {
                            $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->oci_version}";
                        }
                        elseif($param['NOM_PARAMETRE']=='DPT' && $param['VALEUR_PARAM']!='')
                        {
                            $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$info_centre['CPOSTAL']}";
                        }
                        elseif($param['NOM_PARAMETRE']=='HOOK_URL' && $param['VALEUR_PARAM']!='')
                        {
                            $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->url_retour_oxaproc}";
                        }
                        else 
                        {
                            
                        }

                    }
                    else
                    {
                        $this->url_connexion_po .= "{$param['NOM_PARAMETRE']}={$param['VALEUR_PARAM']}";
                    }
                }
                
                return $this->url_connexion_po;
    }
    
    /**
     * Fonction réalisant l'extraction des articles présent dans le panier PunchOut
     */
    public function getListeArticleFromPunchOut()
    {
        
        // ATTENTION LES encodages peuvent être ASCII ou UTF8 sur les flux IN
        $listeChamps = OxalysBib::utf8_converter($_REQUEST);
        //$listeChamps = OxalysBib::utf8_converter(getValueAll($_REQUEST));
        $nbItem = 0;
        // On détermine si une transcodification existe sur le format du catalogue PunchOut
        $catalogue = new Catalogue($this->id_cat);
        
        $info_catalogue = $catalogue->getInfoOnCatPunchOut();
        
        $idFormat = $info_catalogue['IDFORMAT'];
        
        $sql = "SELECT * FROM FMTMAPP WITH(NOLOCK) , STRUCATA WITH(NOLOCK) WHERE ACTIVE = 0x54 AND FMTMAPP.IDFORMAT = '{$idFormat}' AND   STRUCATA.LIGNE = FMTMAPP.LIGNE " . "order by OBLIGATOI DESC, ELEM_XML DESC ";
        
        $sql_racineXML = "SELECT RACINEXML FROM CFORMATS WHERE IDFORMAT = '{$idFormat}'";
        $racineXML = (new RequeteSQL($sql_racineXML, DB_OXACATDB))->Trouve1()['RACINEXML'];
        
        $sqlQteCond = "SELECT * FROM FMTMAPP WITH(NOLOCK) , STRUCATA WITH(NOLOCK) WHERE FMTMAPP.IDFORMAT = '{$idFormat}' AND   STRUCATA.LIGNE = FMTMAPP.LIGNE  AND TDBNAME = 'CONDITNT' ";
        
        $QteCondBDD = (new RequeteSQL($sqlQteCond, DB_OXACATDB))->Trouve1();
        
        if ($resultFmt = (new RequeteSQL($sql, DB_OXACATDB))->TrouveTous()) {
            if (count($resultFmt) > 0 && $resultFmt[0]['ELEM_XML'] != '') {
                /*
                 * Danger : Dois t'on mettre ne dure ?
                 */
                $rechMot = preg_split("/[\[\]\(\)]/", $resultFmt[0]['ELEM_XML']);
                
                // On va se baser sur le premiere element qui normalement à donc un nom dans ELEM_XML
                $retour = $listeChamps; // NE PAS METTRE DE REFERENCE UNE COPIE MEMOIRE EST VOULU
                foreach ($retour as $champ => & $listeItems)
                    if (strpos($champ, 'NEW_ITEM-LONGTEXT_') === 0) {
                        // Decoupage vis à vis du caratère ':'
                        $liste = explode(':', $champ);
                        $element = explode('_', $liste[0]); // Le dernier morceau de element va contenir le numéro de ligne
                        $numLigne = $element[count($element) - 1];
                        
                        // On regenere un element de plus dans les tableau
                        $listeChamps['NEW_ITEM-LONGTEXT_n:132'][$numLigne] = $listeItems[0];
                    }
                
                // On va se baser sur le premiere element qui normalement à donc un nom dans ELEM_XML
                
                foreach ($listeChamps as $champ => & $listeItems) {
                    $rechMotSource = preg_split("/[\[\]\(\)]/", $champ);
                    
                    // Danger : probleme car normalement c'est NEW_ITEM-VENDOR[n] mais la c'est NEW_ITEM-VENDORMAT[0] voila pourquoi quelque fois ca bug, es que c'est le fournisseur qui doit modififer sont flus ou autre ?
                    if ($rechMotSource[0] == $rechMot[0]) {
                        if (is_array($listeItems)) {
                            // Cette donnée n'est pas connu autrement que par l'outil punchOut
                            foreach ($listeItems as $noItem => $valueItem) {
                                
                                
                                if($QteCondBDD)
                                {
                                    $rechMotEncours = preg_split("/[\[\]\(\)]/", $QteCondBDD['ELEM_XML']);
                                    $QteCond = FormatageData::formatMontant($listeChamps[$rechMotEncours[0]][$noItem]);
                                }
                                
                                
                                $this->listeItemsPanier[$nbItem]['qte'] = $listeChamps['NEW_ITEM-QUANTITY'][$noItem];
                                
                                $this->initLigne($this->listeItemsPanier[$nbItem]);
                                $qteCondActif = false;
                                foreach ($resultFmt as & $value)
                                {
                                    if (array_key_exists($value['TDBNAME'], $this->lexique)) {
                                        $infoLexique = $this->lexique[$value['TDBNAME']];
                                        
                                        // Mise en place de la valeur par defaut s'il le faut
                                        // SURTOUT PAS METTRE A BLANC Sinon perte du code four $this->listeItemsPanier[$nbItem][$infoLexique] = "";
                                        
                                        if ($value['VALDEFAUT'] == 1) {
                                            $sql = "select * from FVALDEF with (nolock) where IDFORMAT = '{$idFormat}' AND Ligne = {$value['LIGNE']}";
                                            if ($valueDefault = (new RequeteSQL($sql, DB_OXACATDB))->Trouve1())
                                                $this->listeItemsPanier[$nbItem][$infoLexique] = $valueDefault['Valeur_par_defaut'] . $valueDefault['VALEUR_PAR_DEFAUT'];
                                        }
                                        
                                        if($racineXML)
                                        {
                                            $noeud = preg_split("/[\[\]\(\)]/", $racineXML);
                                            $this->listeItemsPanier[$nbItem]['ID_EXTERNE'] = $listeChamps[$noeud[0]][$noItem];
                                        }
                                        
                                        if ($value['ELEM_XML'] != '') {
                                            
                                            $rechMotEncours = preg_split("/[\[\]\(\)]/", $value['ELEM_XML']);
                                            
                                            /*if ($infoLexique == 'COD_FOURN') {
                                             $this->listeItemsPanier[$nbItem][$infoLexique] = $listeChamps[$rechMotEncours[0]][$noItem];
                                             }*/
                                            
                                            if ($value['RATTRIBUT'] == 'A' || $value['RATTRIBUT'] == 'U')
                                            {
                                                if (is_numeric($value['RFORMAT']) && $value['TRANSCOD'] != 1)
                                                {
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = mb_substr($listeChamps[$rechMotEncours[0]][$noItem], 0, $value['RFORMAT']);
                                                }
                                                else
                                                {
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = $listeChamps[$rechMotEncours[0]][$noItem];
                                                }
                                                
                                                $this->listeItemsPanier[$nbItem][$infoLexique] = $this->listeItemsPanier[$nbItem][$infoLexique];
                                            }
                                            else
                                            {
                                                
                                                if($infoLexique=='PRIXBASE' || $infoLexique=='PRIXNET' || $infoLexique == 'PX_ART') {
                                                    $valueFloat = FormatageData::formatMontant($listeChamps[$rechMotEncours[0]][$noItem], (int)Param::getNombreDeciamlePU());
                                                } else {
                                                    $valueFloat = FormatageData::formatMontant($listeChamps[$rechMotEncours[0]][$noItem], 2);
                                                }
                                                
                                                if($value['DIVISEUR']=='-1' && $QteCond)
                                                {
                                                    if($infoLexique=='PRIXBASE' || $infoLexique=='PRIXNET' || $infoLexique == 'PX_ART')
                                                    {
                                                        $this->listeItemsPanier[$nbItem][$infoLexique] = $valueFloat / $QteCond;
                                                        //$this->listeItemsPanier[$nbItem]['qte'] = $this->listeItemsPanier[$nbItem]['qte'] * $QteCond;
                                                    }
                                                    elseif($infoLexique=='CONDITNT')
                                                    {
                                                        $this->listeItemsPanier[$nbItem]['qte'] = $this->listeItemsPanier[$nbItem]['qte'] / $QteCond;
                                                    }
                                                    else
                                                    {
                                                        $this->listeItemsPanier[$nbItem][$infoLexique] = $valueFloat / $QteCond;
                                                    }
                                                    
                                                    $qteCondActif = true;
                                                }
                                                elseif($value['DIVISEUR']!='0')
                                                {
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = $valueFloat / floatval($value['DIVISEUR']);
                                                }
                                                else
                                                {
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = $valueFloat;
                                                }
                                                
                                                /*if($infoLexique=='PRIXBASE' || $infoLexique=='PRIXNET' || $infoLexique == 'PX_ART')
                                                {
                                                    
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = $valueFloat / $QteCond;
                                                    $this->listeItemsPanier[$nbItem]['qte'] = $this->listeItemsPanier[$nbItem]['qte'] * $QteCond;
                                                    
                                                }
                                                elseif($infoLexique=='CONDITNT')
                                                {
                                                    $this->listeItemsPanier[$nbItem]['qte'] = $this->listeItemsPanier[$nbItem]['qte'] / $QteCond;
                                                }
                                                else
                                                {
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = $valueFloat / $QteCond;
                                                }*/
                                            }
                                            
                                            if ($value['TRANSCOD'] == 1)
                                            {
                                                if ($resultTr = $catalogue->getTranscoOnCatPunchOutByIdCat($value['TDBNAME'], $this->listeItemsPanier[$nbItem][$infoLexique]))
                                                {
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = $resultTr["VALREMPLA"];
                                                }
                                                else
                                                {
                                                    $this->listeItemsPanier[$nbItem][$infoLexique] = '';
                                                    // $this->listeItemsPanier[$nbItem][$infoLexique] = mb_substr($this->listeItemsPanier[$nbItem][$infoLexique], 0, $value['RFORMAT']);
                                                }
                                            }
                                            
                                        }
                                        if ($infoLexique == 'COD_FOURN') {
                                            $fournisseur = new Fournisseur($this->listeItemsPanier[$nbItem][$infoLexique]);
                                            $this->listeItemsPanier[$nbItem]['RS_FOURN'] = (is_null($fournisseur->getEC()) || $fournisseur->getEC() == '') ? $fournisseur->getRS() : $fournisseur->getEC();
                                            $this->listeItemsPanier[$nbItem]['COD_DEV'] = $fournisseur->getDEVISE();
                                        }
                                    }
                                }
                                
                                // Il faut recherche maintenant le libelle de la sous famille
                                // Ajout de la notion non visible eproc SPEC 3093 => NVISIPROC 0x46
                                $sql = "SELECT * FROM SSFAMILL WITH(NOLOCK) WHERE SSFAMILL.CODE_SFA = '{$this->listeItemsPanier[$nbItem]['COD_SFAM']}' AND SSFAMILL.NVISIPROC = 0x46 ";
                                if ($resultFam = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1())
                                {
                                    $this->listeItemsPanier[$nbItem]['LIB_SFAM'] = $resultFam['DESIGNAT'];
                                }
                                else
                                {
                                    $this->listeItemsPanier[$nbItem]['LIB_SFAM'] = '';
                                }
                                    
                                if ($this->listeItemsPanier[$nbItem]['CONDITNT'] != '' && $this->listeItemsPanier[$nbItem]['CONDITNT'] != 0 && $this->listeItemsPanier[$nbItem]['CONDITNT'] != 1 && !$qteCondActif) {
                                    $this->listeItemsPanier[$nbItem]['qte'] = $this->listeItemsPanier[$nbItem]['qte'] / $this->listeItemsPanier[$nbItem]['CONDITNT'];
                                    $this->listeItemsPanier[$nbItem]['TXTCOND'] = Trad('Cdt de') . ' ' . $this->listeItemsPanier[$nbItem]['CONDITNT'] . ' ' . $this->listeItemsPanier[$nbItem]['COD_UNIT'] . ' ' . '(' . Trad('à') . ' ' . ($this->listeItemsPanier[$nbItem]['PX_ART'] / $this->listeItemsPanier[$nbItem]['CONDITNT']) . ' / ' . $this->listeItemsPanier[$nbItem]['COD_UNIT'] . ')';
                                    // OBLIGATOIRE DANS levenshtein(CAS DU PUNCHOUT IL FAUT OBLIGATOIREMENT REMETTE conditionnement à 0
                                    $this->listeItemsPanier[$nbItem]['CONDITNT'] = 0;
                                } else {
                                    $this->listeItemsPanier[$nbItem]['TXTCOND'] = '';
                                    $this->listeItemsPanier[$nbItem]['CONDITNT'] = 0;
                                }
                                
                                if (! array_key_exists('COD_DEV', $this->listeItemsPanier[$nbItem]) || $this->listeItemsPanier[$nbItem]['COD_DEV'] == '') {
                                    $fournisseur = new Fournisseur($this->listeItemsPanier[$nbItem]['COD_FOURN'], true);
                                    $this->listeItemsPanier[$nbItem]['RS_FOURN'] = (is_null($fournisseur->getEC()) || $fournisseur->getEC() == '') ? $fournisseur->getRS() : $fournisseur->getEC();
                                    $this->listeItemsPanier[$nbItem]['COD_DEV'] = $fournisseur->getDEVISE();
                                }
                                $nbItem ++;
                            }
                        }
                        break;
                    }
                }
                
            }
        }
    }
}