<?php
require_once 'application/class/class_ManageSession.php';
require_once 'Excel/reader.php';

// Permet de ne pas afficher l'entete dans l'Iframe
$_POST['THROUGH'] = 'TRUE';

/**
 * Script permettant de récupérer les lignes de données articles d'un fichier d'import de devis OPTIMA
 * et de les injecter dans un panier.
 * Uniquement Pour ERI : Code Client 59 -- SPEC 2854 Import des devis Optima
 */
// On attrape la valeur de action
if (getValue('action') == 'import_devis_OPTIMA') {
    // On enregistre le type de panier ou sera enregistrer l'import (ENCOURS, MODELE ou BROUILLON )
    If (isset($_POST['modeImportArticle']) && $_POST['modeImportArticle'] != '') {
        $typePanier = getValue('modeImportArticle');
    }    // sinon par defaut, on l'enregistre dans un panier modele
    else {
        $typePanier = 'MODELE';
    }
    
    // On récupère le fichier excel
    $file = $_FILES['file_import']['tmp_name'];
    
    // on vérifie que le fichier existe bien
    $erreur_fichier_exist = ('' == $file);
    
    // On teste si le fichier en est véritablement un
    $file_info = pathinfo($_FILES['file_import']['name']);
    
    // si le fichier sélectionné existe est son extension est correct
    if (('txt' == strtolower($file_info['extension']) || 'csv' == strtolower($file_info['extension'])) && fopen($file, 'r+') && ! $erreur_fichier_exist) {
        // Chargement type CSV
        // if ("csv" == strtolower($file_info['extension'])){
        // On ouvre le fichier chargé en lecture seule
        $handle = fopen($file, 'r');
        
        // On lit le fichier jusqu'à la fin
        $i = 1;
        $NbMaxLigne = 1;
        $NbMaxColonne = 1;
        $encodage = false;
        while (($data = fgetcsv($handle, 4096, ';')) !== false) {
            // Pour chaque champ de la ligne on enregistre les données lues dans le tableau de résultats
            for ($j = 1; $j < count($data) + 1; $j ++) {
                $contenuTmp = $data[$j - 1];
                if (is_string($contenuTmp) && '' !== $contenuTmp) {
                    // Si on est sur une chaîne
                    if (false === $encodage) {
                        $encodage = mb_detect_encoding($contenuTmp);
                        // On ne prend pas en compte le codage ASCII qui ne nous apprend rien
                        if ($encodage === 'ASCII') {
                            $encodage = false;
                        }
                    }
                    if (false !== $encodage) {
                        $contenuTmp = mb_convert_encoding($contenuTmp, $encodage, 'ISO-8859-1');
                    }
                }
                // Si le nombre de données de la ligne est différent du nombre de données attendues d'après le type d'import utilisé
                // alors on passe la ligne et on enregistre la présence d'une erreur au niveau de la ligne en question.
                $Contenu_gen[$i][$j] = $contenuTmp;
                if ($NbMaxLigne < $i) {
                    $NbMaxLigne = $i;
                }
                if ($NbMaxColonne < $j) {
                    $NbMaxColonne = $j;
                }
            }
            $i ++;
        }
        
        // On ferme le fichier
        fclose($handle);
        
        $NbLignes = $NbMaxLigne;
        $NbColonnes = $NbMaxColonne;
        /*
         * probleme d'encodage avec les fichiers xsl
         * }
         * else {
         *
         *
         * //On charge le contenu du ficher excel dans un tableau
         * $tab_chargement = new Spreadsheet_Excel_Reader();
         * //$tab_chargement->setOutputEncoding('UTF-8');
         *
         * //on enregistre les données du fichier dans le tableau de traitement
         * $tab_chargement->read($file);
         *
         * for ($i = 1; $i <= $tab_chargement->sheets[0]['numRows']; $i++) {
         * for ($j = 1; $j <= $tab_chargement->sheets[0]['numCols']; $j++) {
         * //$tab_chargement->sheets[0]['cells'][$i][$j] = mb_convert_encoding($tab_chargement->sheets[0]['cells'][$i][$j], "UTF-8");
         * $tab_chargement->sheets[0]['cells'][$i][$j] = convStrUTF8($tab_chargement->sheets[0]['cells'][$i][$j]);
         * }
         * }
         * $Contenu_gen = $tab_chargement->sheets[0]['cells'];
         * $NbLignes = $tab_chargement->sheets[0]['numRows'];
         * $NbColonnes = $tab_chargement->sheets[0]['numCols'];
         * }
         */
        
        // récupération ligne et colonne des cellules #ENTETE, #CLIENTS, #METRE, #DETAIL, #COEFFS
        for ($i = 1; $i <= $NbLignes; $i ++) {
            for ($j = 1; $j <= $NbColonnes; $j ++) {
                if ($Contenu_gen[$i][$j] == '#ENTETE' || $Contenu_gen[$i][$j] == '#CLIENTS' || $Contenu_gen[$i][$j] == '#METRE' || $Contenu_gen[$i][$j] == '#DETAIL' || $Contenu_gen[$i][$j] == '#REMISES' || $Contenu_gen[$i][$j] == '#COEFFS') {
                    $tab_repere[$Contenu_gen[$i][$j]]['ligne'] = $i;
                    $tab_repere[$Contenu_gen[$i][$j]]['colonne'] = $j;
                }
            }
        }
        
        // /PARTIE #ENTETE
        // On récupère le numéro de ligne ou sont stockées les informations de l'entete
        $lg_info_ent = $tab_repere['#ENTETE']['ligne'] + 2;
        
        // la colonne devise de l'entête doit être déterminée :
        for ($j = 1; $j <= $NbColonnes; $j ++) {
            if ($Contenu_gen[$tab_repere['#ENTETE']['ligne'] + 1][$j] == 'Devise') {
                $col_info_Devise_ent = $j;
                break;
            }
        }
        
        // si le numero de devis n'est pas renseigné
        // if ($Contenu_gen[$lg_info_ent][2] == '' || !ctype_alnum($Contenu_gen[$lg_info_ent][2]))
        // plus de contrôle particuleier sur les numéro de devis (il faut que l'on puisse enregistrer ce numéro comme nom de panier)
        if ($Contenu_gen[$lg_info_ent][2] == '') {
            $erreur_numero_devis = true;
        } else {
            // On stocke les valeurs
            $tab_devis['#ENTETE'] = array(
                '!TitreDev' => $Contenu_gen[$lg_info_ent][1],
                '!NumDev' => $Contenu_gen[$lg_info_ent][2],
                '!Devise' => $Contenu_gen[$lg_info_ent][$col_info_Devise_ent]
            );
            
            // /PARTIE #CLIENTS
            // spec : "pour récupérer le nom du client il faut prendre le champ <Client> de la ligne #CLIENTS pour laquelle la valeur du champ <Type> est égal à <Client>"
            // On récupère le numéro de ligne où champ <Type> est égal à <Client> (On test sur les 50 lignessuivant la zone #CLIENTS )
            for ($i = $tab_repere['#CLIENTS']['ligne'] + 1; $i <= $tab_repere['#CLIENTS']['ligne'] + 50; $i ++) {
                if ($Contenu_gen[$i][11] == 'Client') {
                    $lg_info_Client = $i;
                    break;
                }
            }
            
            $tab_devis['#CLIENTS'] = array(
                '!CLIENT' => $Contenu_gen[$lg_info_Client][1]
            );
            
            // /PARTIE #DETAIL
            // les colonnes de la table détails doivent êtes récupéés pour pouvoir sélectionner les informations dans les bonnes colonnes :
            // On récupère le numéro de ligne ou sont stockées les informations de l'entete
            $lg_libelle_detail = $tab_repere['#DETAIL']['ligne'] + 1;
            
            // On récupère le nom des colonnes ou sont stockés les valeurs de détailles
            for ($j = 1; $j <= $NbColonnes; $j ++) {
                if (($Contenu_gen[$lg_libelle_detail][$j] == 'ref') || ($Contenu_gen[$lg_libelle_detail][$j] == 'lib') || ($Contenu_gen[$lg_libelle_detail][$j] == 'qte') || ($Contenu_gen[$lg_libelle_detail][$j] == 'qteV') || ($Contenu_gen[$lg_libelle_detail][$j] == 'marque') || ($Contenu_gen[$lg_libelle_detail][$j] == 'codeTarif') || ($Contenu_gen[$lg_libelle_detail][$j] == 'pxPublic') || ($Contenu_gen[$lg_libelle_detail][$j] == 'kRem') || ($Contenu_gen[$lg_libelle_detail][$j] == 'ctmRef') || ($Contenu_gen[$lg_libelle_detail][$j] == 'fabRef')) {
                    $col_info_detail[$Contenu_gen[$lg_libelle_detail][$j]] = $j;
                }
            }
            
            // numero de la premiere ligne de détail
            $lg_information_detail = $tab_repere['#DETAIL']['ligne'] + 2;
            
            // On génére le tableau avec le détail des lignes
            // On part de la premiere ligne de detail jusqu'à la partie REMISE ou COEFFS ou une ligne vide
            $lg_en_cours = $lg_information_detail;
            while ($Contenu_gen[$lg_en_cours][1] != '#REMISES' && $Contenu_gen[$lg_en_cours][1] != '#COEFFS' && $Contenu_gen[$lg_en_cours][1] != '') {
                $tab_devis['#DETAIL'][] = array(
                    '!marque' => $Contenu_gen[$lg_en_cours][$col_info_detail['marque']],
                    '!ref' => $Contenu_gen[$lg_en_cours][$col_info_detail['ref']],
                    '!lib' => $Contenu_gen[$lg_en_cours][$col_info_detail['lib']],
                    '!qte' => $Contenu_gen[$lg_en_cours][$col_info_detail['qte']],
                    '!qteV' => $Contenu_gen[$lg_en_cours][$col_info_detail['qteV']],
                    '!codeTarif' => $Contenu_gen[$lg_en_cours][$col_info_detail['codeTarif']],
                    '!pxPublic' => $Contenu_gen[$lg_en_cours][$col_info_detail['pxPublic']],
                    '!kRem' => $Contenu_gen[$lg_en_cours][$col_info_detail['kRem']],
                    '!ctmRef' => $Contenu_gen[$lg_en_cours][$col_info_detail['ctmRef']],
                    '!fabRef' => $Contenu_gen[$lg_en_cours][$col_info_detail['fabRef']]
                );
                $lg_en_cours ++;
            }
        }
        // A ce niveau, $tab_devis contient les infos du fichier excel dont on a besoin pour la suite
        // On vérifie le contenu du fichier
        $Fichier_contenu_correct = true;
        
        // Si on contenu est correct
        if ($Fichier_contenu_correct && ! $erreur_numero_devis) {
            $NomPanier = substr($tab_devis['#ENTETE']['!NumDev'] . '-' . $tab_devis['#CLIENTS']['!CLIENT'], 0, 64);
            
            // Si on est sur un panier modele ou brouillon, on doit vérifier que le panier n'existe pas déjà
            if ($typePanier == 'MODELE')
                $NumTypePanier = 1;
            else
                $NumTypePanier = 0;
            
            if (($doublon = PanierExisteParType($_SESSION['id_user'], $NomPanier, $NumTypePanier)) && $typePanier != 'ENCOURS') {
                $messageExiste = cnv_to_javascript(Trad('Ce panier existe pour cet utilisateur. Voulez-vous le remplacer ?'));
                echo "<script type='text/javascript' >if(window.parent.confirm(\"" . JsValue($messageExiste) . "\")){}
									else{window.parent.loadIframeForImportOPTIMA('zone_import');}
									</script>";
                
                $id_panier = $doublon['id_panier'];
                
                /*** SPEC 4241 Caractéristiques complémentaires : ajout de la suppression des CC ***/        
                $SqlListe = new PileSql(DB_OXAPROCDB);
                if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelPj($id_panier)))
                    if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelFourClause($id_panier)))
                        if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelFour($id_panier)))
                            if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelLigneFrs($id_panier)))
                                if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelLigne($id_panier)))
                                    if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelEntete($id_panier)))
                                        if($SqlListe->AddRequeteSql(SqlCaracteristiquesCompl::rqSupCCDoc('PAN', $id_panier, null, $_SESSION['id_user'])))
                                            if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelCS_DON($id_panier)))
                                                if ($SqlListe->AddRequeteSql(SqlPanier::rqCopiePanierDelPanier($id_panier)))
                                                    if ($SqlListe->AddRequeteSql(SqlPanier::rqDeleteContactOnBlocFrs($id_panier)))
                                                        if ($SqlListe->Commit()) {
                                                            // Si le panier supprimé correspond au panier qui était chargé
                                                            if ($id_panier == $_SESSION['id_panier']) {
                                                                // Alors on ré-initialise le panier chargé en indiquant qu'il s'agit du panier en cours : 0
                                                                // $_SESSION['id_panier'] = 0;
                                                            }
                                                        }
            }
            
            // On crée un nouveau panier
            if ($typePanier == 'BROUILLON' || $typePanier == 'MODELE') {
                // Obtention d'un nouvel Id
                $id_new_panier = GetNewIdPanier($_SESSION['id_user']);
                // Et on détermine le nom du panier
                $val_entete_panier['lib_panier'] = $NomPanier;
            }            // On garde le numéro de panier à 0 si on est sur le panier en cours
            else {
                $id_new_panier = 0;
            }
            
            // on initialise la variable de session avec le nouvel identifiant
            $_SESSION['id_panier'] = $id_new_panier;
            
            // /////////////////////////////////
            // On initialise l'entete du panier
            // /////////////////////////////////
            $PanierEntete = new PanierEntete();
            $PanierEntete->initEntetePanier($_SESSION['id_panier'], true);
            
            // On met à jour l'entête du panier
            // Si le panier est un panier modèle
            if ($typePanier == 'MODELE')
                $val_entete_panier['flg_panier_modele'] = 1;
            else
                $val_entete_panier['flg_panier_modele'] = 0;
            
            // Si la devise n'est pas renseigné, on choisi par défaut Euro
            if ($tab_devis['#ENTETE']['!Devise'] == '') {
                $val_entete_panier['COD_DEV'] = 'EUR';
            } else {
                $val_entete_panier['COD_DEV'] = $tab_devis['#ENTETE']['!Devise'];
            }
            
            // information contact centre de livraison
            $info_contact_liv = SqlCentreGene::getContactLibByCentreLiv($_SESSION['Session_CodeCtrLivraison'], 0)->Trouve1();
            $val_entete_panier['CTC_GSM'] = $info_contact_liv['CTC_GSM'];
            
            $val_entete_panier['ZONE_LIBRE'] = $tab_devis['#ENTETE']['!NumDev'];
            // attention titre est découpé avec un explode sur les ':' pour retrouver le titre
            $val_entete_panier['TITRE_DA'] = $tab_devis['#ENTETE']['!TitreDev'];
            
            // On met a jour l'entête du panier
            PanierEntete::updateEntetePanier($_SESSION['id_panier'], $val_entete_panier);
            
            // /////////////////////////////////
            // On insère les lignes du panier
            // /////////////////////////////////
            // pour chaque ligne de resultat
            for ($i = 0; $i < count($tab_devis['#DETAIL']); $i ++) {
                // Par défault, on considère que la ligne peut être importée
                $import_ligne_ok = 1;
                
                // On teste les numériques
                // on transforme les ',' en '.' pour les numériques
                $tab_devis['#DETAIL'][$i]['!qte'] = str_replace(',', '.', $tab_devis['#DETAIL'][$i]['!qte']);
                $tab_devis['#DETAIL'][$i]['!qteV'] = str_replace(',', '.', $tab_devis['#DETAIL'][$i]['!qteV']);
                $tab_devis['#DETAIL'][$i]['!pxPublic'] = str_replace(',', '.', $tab_devis['#DETAIL'][$i]['!pxPublic']);
                $tab_devis['#DETAIL'][$i]['!kRem'] = str_replace(',', '.', $tab_devis['#DETAIL'][$i]['!kRem']);
                
                // On controle les valeurs numeriques
                if (! is_numeric($tab_devis['#DETAIL'][$i]['!qte']) || ! is_numeric($tab_devis['#DETAIL'][$i]['!qteV']) || ! is_numeric($tab_devis['#DETAIL'][$i]['!pxPublic']) || ! is_numeric($tab_devis['#DETAIL'][$i]['!kRem'])) {
                    // la ligne est en erreur
                    $import_ligne_ok = 0;
                }
                
                // Le tableau $values contient les valeurs de chaque ligne à injecter
                $values['qte'] = $tab_devis['#DETAIL'][$i]['!qte'];
                
                $values['PX_ART'] = $tab_devis['#DETAIL'][$i]['!pxPublic'] * (1 - $tab_devis['#DETAIL'][$i]['!kRem']);
                
                // Seuls les 30 premiers caractères de la référence seront récupérés.
                $values['REF_FOURN'] = substr($tab_devis['#DETAIL'][$i]['!ref'], 0, 30);
                
                // Il s’agit ici de récupéré dans la zone “ Code CTM + référence Article ” (exemple : SCN 50927) le code fabricant qui se trouve en début de chaîne (avant le caractère à blanc).
                // Si ce dernier n’existe pas dans le référentiel HA Plus, ce code fabricant sera initialisé à blanc.
                // Note : Dans le cas où le code fabricant n’existe pas dans le référentiel HA Plus et afin de ne pas perdre cette information on pourrait stocker ce code dans la désignation complémentaire de l’article sous la forme de “ fabricant Optima : <ctmRef> <marque>).
                $codefab = explode(' ', trim($tab_devis['#DETAIL'][$i]['!fabRef']), 2);
                
                // On vérifie que le code $codefab[0] existe dans HAPLUS
                $values['COD_FAB'] = $codefab[0];
                if (trim($values['COD_FAB']) != '') {
                    if ($record = SqlPanier::rqGetRecordFABRICAN($values['COD_FAB'])->Trouve1()) {
                        
                        $values['RS_FAB'] = $tab_devis['#DETAIL'][$i]['!marque'];
                        $values['REF_FAB'] = substr(trim($codefab[1]), 0, 30);
                    } else { // si le COD FAB n'existe pas dans HAPLUS
                        $values['COD_FAB'] = '';
                        $values['RS_FAB'] = '';
                        $values['REF_FAB'] = '';
                        
                        $values['DES_COMP'] = ' fabricant Optima : ' . $tab_devis['#DETAIL'][$i]['!ctmRef'] . ' ' . $tab_devis['#DETAIL'][$i]['!marque'] . ' ';
                    }
                }
                
                // on vérifie si si on retrouve une ligne dans un catalogue actif
                $info_article = new CtrlArticle();
                $article = '';
                $info_art_cata = $info_article->RechercheArtFrs($values, '', $article);
                // Si la recherche nous renvoie des lignes, et que la ligne retournée n'est pas le tableau passé en paramètre, on sélectionne celle avec le prix le plus bas
                if (count($info_art_cata) > 0 && $info_art_cata[0] != $values) {
                    $Prix_min = $info_art_cata[0]['PX_ART'];
                    $indice_Ligne_ok = 0;
                    // on boucle pour sélectionner la ligne avec le prix le plus bas
                    for ($j = 0; $j < count($info_art_cata); $j ++) {
                        if ($info_art_cata[$j]['PX_ART'] < $Prix_min) {
                            $Prix_min = $info_art_cata[$j]['PX_ART'];
                            $indice_Ligne_ok = $j;
                        }
                    }
                    $Result_Cata = $info_art_cata[$indice_Ligne_ok];
                }
                
                $values['DES_ART'] = substr($tab_devis['#DETAIL'][$i]['!lib'], 0, 60);
                if (mb_strlen($tab_devis['#DETAIL'][$i]['!lib']) > 60) {
                    $values['DES_COMP'] = trim($tab_devis['#DETAIL'][$i]['!lib']) . ' ' . $values['DES_COMP'];
                }
                
                if (isset($Result_Cata)) {
                    
                    // L’unité sera récupérée du catalogue si l’article est référencé sinon on utilisera l’unité par défaut défini dans le paramétrage HA Plus (menu : Système – HA Plus – Paramétrage HA – Environnement).
                    if (isset($Result_Cata['COD_UNIT']) && $Result_Cata['COD_UNIT'] != '')
                        $values['COD_UNIT'] = $Result_Cata['COD_UNIT'];
                    else
                        $values['COD_UNIT'] = param::getUniteDefautHaplus();
                    
                    $values['TYPIMAGE'] = $Result_Cata['TYPIMAGE'];
                    $values['IMGART'] = $Result_Cata['IMGART'];
                    $values['CARACT'] = $Result_Cata['CARACT'];
                    $values['COD_SFAM'] = $Result_Cata['COD_SFAM'];
                    $values['LIB_SFAM'] = $Result_Cata['LIB_SFAM'];
                    $values['COD_GAM'] = $Result_Cata['COD_GAM'];
                    $values['LIB_GAM'] = $Result_Cata['LIB_GAM'];
                    $values['COD_FOURN'] = $Result_Cata['COD_FOURN'];
                    $values['PX_ART'] = $Result_Cata['PX_ART'];
                    
                    $values['RS_FOURN'] = $Result_Cata['RS_FOURN'];
                    $values['VILLE_FOURN'] = $Result_Cata['VILLE_FOURN'];
                    $values['DELAI'] = $Result_Cata['DELAI'];
                    $values['TXTCOND'] = $Result_Cata['TXTCOND'];
                    $values['type_de_ligne'] = 0;
                    
                    $values['PROVENANCE'] = $Result_Cata['PROVENANCE'];
                    $values['ID_CAT'] = $Result_Cata['ID_CAT'];
                    $values['IDLIGNE'] = $Result_Cata['IDLIGNE'];
                    $values['COD_ART'] = $Result_Cata['COD_ART'];
                    // Si on trouve la référence dans intuition,on reprend cette valeur
                    if ($Result_Cata['REF_FOURN'] != '')
                        $values['REF_FOURN'] = $Result_Cata['REF_FOURN'];
                    
                    $values['COD_FAB'] = $Result_Cata['COD_FAB'];
                    $values['RS_FAB'] = $Result_Cata['RS_FAB'];
                    $values['REF_FAB'] = $Result_Cata['REF_FAB'];
                    $values['COD_SFAM'] = $Result_Cata['COD_SFAM'];
                    $values['LIB_SFAM'] = $Result_Cata['LIB_SFAM'];
                    // On joute la designation complémentaire de l'article intuition en première position
                    $values['DES_COMP'] = $Result_Cata['DES_COMP'] . ' ' . $values['DES_COMP'];
                    if (trim($values['LIB_GAM']) == '') {
                        // Mise à jour de designatino complémentaire si le code Gamme n'est pas présent dans HAPLUS
                        $values['DES_COMP'] = $values['DES_COMP'] . ' gamme  Optima : ' . $tab_devis['#DETAIL'][$i]['!codeTarif'] . ' ';
                    }
                    
                    $values['COD_ACD'] = $Result_Cata['COD_ACD'];
                    $values['COD_GRP'] = $Result_Cata['COD_GRP'];
                    $values['CLASSNUM'] = $Result_Cata['CLASSNUM'];
                    $values['TYPECATA'] = $Result_Cata['TYPECATA'];
                    
                    // si la désignation est renseigné dans intuition, on prend la valeur intuition
                    if (trim($Result_Cata['DES_ART']) != '')
                        $values['DES_ART'] = $Result_Cata['DES_ART'];
                } else { // unite par defaut definit dans HAPlus
                    $values['TYPIMAGE'] = '';
                    $values['IMGART'] = '';
                    $values['CARACT'] = '';
                    
                    // unite par defaut definit dans HAPlus
                    $values['COD_UNIT'] = param::getUniteDefautHaplus();
                    
                    // Evaluer lors de l’import pour les articles “ catalogues ” sinon la zone sera initialisée à blanc.
                    $values['COD_FOURN'] = '';
                    
                    $sous_famille_defaut = Param::getSousFamilleArtLibre();
                    $values['COD_SFAM'] = $sous_famille_defaut['CODE_SFAM'];
                    $values['LIB_SFAM'] = $sous_famille_defaut['DESIGNAT'];
                    $values['COD_GAM'] = $tab_devis['#DETAIL'][$i]['!codeTarif'];
                    
                    if ($res = SqlFrs::rqGetGammeNom($values['COD_GAM'], $values['COD_FAB'])->Trouve1()) {
                        $values['LIB_GAM'] = $res['DESIGN'];
                    } else {
                        // Mise à jour de designation complémentaire si le code Gamme n'est pas présent dans HAPLUS
                        $values['DES_COMP'] .= ' gamme  Optima : ' . $tab_devis['#DETAIL'][$i]['!codeTarif'] . ' ';
                        // on remet à blanc le code Gamme
                        $values['COD_GAM'] = '';
                    }
                    
                    // Ligne Libre
                    $values['type_de_ligne'] = 1;
                }
                
                $values['budget_tot'] = $tab_devis['#DETAIL'][$i]['!qteV'] * ($tab_devis['#DETAIL'][$i]['!pxPublic'] * (1 - $tab_devis['#DETAIL'][$i]['!kRem']));
                
                // si ligne libre mais non autorisé
                if ($values['type_de_ligne'] == 1 && ! $_SESSION['GLOB_AuthLigneLibre']) {
                    $import_ligne_ok = 0;
                }
                if ($tab_devis['#DETAIL'][$i]['!lib'] == '') {
                    $import_ligne_ok = 0;
                }
                if ($erreur_numero_devis) {
                    $import_ligne_ok = 0;
                }
                
                if ($import_ligne_ok == 1) {
                    if (array_key_exists('TAUX_TVA', $values))
                        $values['TAUX_TVA'] = Article::getTauxTva($values['type_de_ligne'], $values['COD_ART'], $values['COD_SFAM'], $values['COD_FOURN'], $values['TAUX_TVA']);
                    else
                        $values['TAUX_TVA'] = Article::getTauxTva($values['type_de_ligne'], $values['COD_ART'], $values['COD_SFAM'], $values['COD_FOURN']);
                    
                    try {
                        $reqSql = SqlPanier::rqInsertQteArticlePanier($_SESSION['id_panier'], $values['type_de_ligne'], $values, $values['qte'], '', '', $PanierEntete->getSI_CODE(), $PanierEntete->getCG_CODE(), $PanierEntete->getCDC_CODE(), $PanierEntete->getSCA_CODE(), '', $PanierEntete->getLIV_CTR(), '', '', 0, '');
                        // $reqSql->EncodeUTF8();
                        if ($reqSql->ExecuteSql()) {
                            /* Spéc N°2229 : Lors de l'ajout d'une ligne libre dans le panier on créé et on initialise les CS pour la ligne */
                            $result = SqlPanier::rqGetLastLigneCreated($_SESSION['id_panier'])->Trouve1();
                            
                            SqlPanier::recalculCritereRegroup($_SESSION['id_panier'], $result['LAST_LIGNE']);
                            
                            $SqlListe = new PileSql(DB_OXAPROCDB);
                            /*** SPEC 4241 Caractéristiques complémentaires : Initialisation des CC et insertion en BDD***/
                            $listeCCLigne = CaracteristiquesCompl::getListeCCInit($values['COD_SFAM'], '', $values['COD_ART']);
                            CaracteristiquesCompl::InsertListeCC($SqlListe, $listeCCLigne, 'PAN', $_SESSION['id_panier'], $result['LAST_LIGNE'], $_SESSION['id_user']);
                            Panier::InsertListeCsIntoPanier($SqlListe, 'DA_LIGNE', $_SESSION['id_panier'], $result['LAST_LIGNE']);
                            $SqlListe->Commit();
                        }
                    } catch (Exception $e) {
                        echo '';
                    }
                }
                
                // on vide les variables utilisée pour la ligne
                unset($values);
                unset($info_article);
                unset($Result_Cata);
            }
            
            // Rafraichissement du menu et affichage du panier - onglet 2
            echo "<script type='text/javascript'>window.parent.CallUrl('panier_ong_2.php','MODE=httpreq&OBJECT=relance');</script>";
            exit();
        } else
            // Flag indiquant que le contenu du fichier n'est pas exploitable
            $erreur_contenu_incorrect = true;
    }    // sinon on indique que le fichier n'est n'as pas était trouvé
    else
        // Flag indiquant que le fichier n'est pas exploitable
        $erreur_fichier_extension = true;
}

// Sinon on est sur l'affichage de la sélection du fichier
/*
 * $array['bouton_action']['annuler_import'] = array('!value' => "Oxa_getDevice().getElementById('zone_import').style.display = 'none';" .
 * "window.parent.document.getElementById('zone_recherche').style.display = '';" .
 * "window.parent.document.getElementById('zone_import').innerHTML='';");
 */

// $array['bouton_action']['lancement_import'] =
// array('!value' => "document.getElementById('btn_import_OPTIMA').disabled = 'disabled';" .
// "document.forms.import_optima.submit();" .
// "document.getElementById('btn_import_OPTIMA').disabled = 'enabled';");
// Traite('import_csv_v10.php?action=submit',document.forms.frm_saisie_panier.file_import);
$array['bouton_action']['lancement_import'] = array(
    '!value' => "document.forms.import_optima.submit();"
);

// si il y a des lignes sur le panier en cours, l'import dans le panier en cours n'est pas disponible
if (CountLigne(0, false) == 0) {
    $array['import_encours']['!disponible'] = 1;
} else {
    $array['import_encours']['!disponible'] = 0;
}

$xslt = new GenXslt();
$xsl_import = 'application/xsl/iframe_import_optima.xsl';
echo "getObj('men_gene').innerHTML = \"", HttpReplacePointeur($xslt->XslHtml($xsl_import, $array)), '";';

// Si le fichier récupéré n'est pas exploitable
if ($erreur_fichier_exist)
    echo "<script type='text/javascript'>window.alert(\"", JsValue(trad("Le fichier saisi n'existe pas, veuillez sélectionner un fichier existant.")), "\");</script>";

// si l'extension est incorrecte
elseif ($erreur_fichier_extension)
    echo "<script type='text/javascript'>window.alert(\"", JsValue(trad("Le fichier sélectionner doit être au format 'csv'. ")), "\");</script>";

// si le numéro de devis n'est pas un alpha numérique
elseif ($erreur_numero_devis)
    echo "<script type='text/javascript'>window.alert(\"", JsValue(trad('Le numéro de devis n\'est pas correct.')), "\");</script>";

// Si le fichier n'a pu être récupéré
elseif ($erreur_contenu_incorrect)
    echo "<script type='text/javascript'>window.alert(\"", JsValue(trad('Le contenu du fichier n\'est pas exploitable.')), "\");</script>";

exit();
