<?php

use PHPMailer\PHPMailer\PHPMailer;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;

global $Conf;
global $Session;
global $Route;

$fkUser = $Session->_user["rowid"];

function nettoie_text($input)
{
  $retour = trim($input);  // on supprime les espaces en début et fin de chaîne
  $retour = str_replace('"', '', $retour);  // on remplace les doubles guillemets par rien
  $retour = str_replace("  ", " ", $retour); // on remplace les doubles espaces par un simple espace
  return $retour;
}

function formate_date($sdate)
{
  //! $sdate au format 1. 1. 1900 && 26. 4. 2019
  $sday = "";
  $smonth = "";
  $syear = "";
  $ladate = "";
  $pospoint = strpos($sdate, ". ");
  if ($pospoint !== FALSE) {
    $sday = substr($sdate, 0, $pospoint);
    if (strlen($sday) == 1) {
      $sday = "0" . $sday;
    }
    $sdate = substr($sdate, $pospoint + 2);
    $pospoint = strpos($sdate, ". ");
    if ($pospoint !== FALSE) {
      $smonth = substr($sdate, 0, $pospoint);
      if (strlen($smonth) == 1) {
        $smonth = "0" . $smonth;
      }
      $syear = substr($sdate, $pospoint + 2);
    }
  }
  if ($sday != "" && $syear != "1900") {
    $ladate = $syear . "-" . $smonth . "-" . $sday;
  }
  eLog("formate_date : " . $sdate . " => " . $ladate);
  return $ladate;
}

function syncContactClient($code, $contactNom, $contactPrenom, $contactFonction, $telephone, $mobile, $email, $fkUser)
{
  try {
    $db = Database::getInstance();

    // 1. Compter les contacts actifs pour ce client
    $sql = 'SELECT COUNT(*) as nb FROM clients_contacts WHERE fk_client = :code AND active = 1';
    $countResult = $db->fetchAll($sql, [':code' => $code]);
    $nbContacts = $countResult[0]['nb'];

    if ($nbContacts == 0) {
      // Aucun contact : créer directement avec principal=1
      $principal = 1;
    } else {
      // Des contacts existent : vérifier si ce nom+prénom existe (en MAJUSCULES)
      $sql = 'SELECT rowid FROM clients_contacts
              WHERE fk_client = :code
              AND UPPER(nom) = UPPER(:nom)
              AND UPPER(prenom) = UPPER(:prenom)
              AND active = 1';
      $existingContact = $db->fetchAll($sql, [
        ':code' => $code,
        ':nom' => $contactNom,
        ':prenom' => $contactPrenom
      ]);

      if (count($existingContact) > 0) {
        // Contact déjà présent : ne rien faire
        eLog("syncContactClient : Contact existe déjà pour client " . $code);
        return;
      }

      // Contact pas trouvé : créer avec principal=0
      $principal = 0;
    }

    // Créer le contact
    $sql = 'INSERT INTO clients_contacts SET fk_client = :code, nom = :nom, prenom = :prenom, fonction = :fonction, telephone = :telephone, mobile = :mobile, email = :email, principal = :principal, active = 1, date_creat = NOW(), fk_user_creat = :fk_user';
    $db->query($sql, [
      ':code' => $code,
      ':nom' => $contactNom,
      ':prenom' => $contactPrenom,
      ':fonction' => $contactFonction,
      ':telephone' => $telephone,
      ':mobile' => $mobile,
      ':email' => $email,
      ':principal' => $principal,
      ':fk_user' => $fkUser
    ]);

    eLog("syncContactClient : Contact créé pour client " . $code . " (principal=" . $principal . ")");

  } catch (Exception $e) {
    error_log("Erreur syncContactClient : " . $e->getMessage());
    eLog("Erreur syncContactClient pour client " . $code . " : " . $e->getMessage());
  }
}


switch ($Route->_action) {
  case "upload_clients":
    //! Importation du fichier CSV des clients SAP

    $upLoadDir = ROOT . $Conf->_pathupload . "import" . DS;
    // on crée le dossier et son arborescence s'il n'existe pas
    if (!file_exists($upLoadDir)) {
      mkdir($upLoadDir, 0777, true);
    }
    eLog("upLoadDir : " . $upLoadDir);
    $erreur = 0;
    $messageErreur = "";
    $size_max = 10297150; // 10 Mo
    foreach ($_FILES as $file) {
      $size_file = filesize($file['tmp_name']);
      if ($size_file > $size_max) {
        $message = "Vous avez dépassé la taille de fichier autorisée";
        eLog("problème de taille de fichier : " . $size_file . " pour un max de " . $size_max);
      } else {
        // on remplace les espaces par des _ dans le nom du fichier sur le serveur
        $fileName = str_normalize(basename($file["name"]), true);
        if (strrpos($fileName, ".") === false) {
          // pas d'extension
          $typ = "";
        } else {
          $typ = substr($fileName, strrpos($fileName, ".") + 1);
        }
        eLog("Import fichier : " . $fileName);
        if (move_uploaded_file($file['tmp_name'], $upLoadDir . $fileName)) {
          eLog("Importation Clients : Fichier " . $upLoadDir . $fileName . " uploadé");

          $row = 1;
          $headers = true;
          $separateur = ";";

          $import_libelle = "Importation du fichier Clients SAP";
          $sql_prepa = "UPDATE clients SET chk_import=0;";
          $sql_final1 = "UPDATE clients SET active=chk_import;";
          $sql_final2 = "UPDATE clients SET chk_import=0;";

          // Structure du fichier CSV
          $colonnes = array('code', 'libelle', 'siret', 'adresse1', 'adresse2', 'adresse3', 'cp', 'ville', 'fk_type', 'contact_civilite', 'contact_nom', 'contact_prenom', 'contact_fonction', 'telephone', 'mobile', 'email');

          $nbColonnes = count($colonnes);
          $nomLog = 'csv-' . date("Y") . '-' . date("m") . '-' . date("d") . '-' . date("H") . '-' . date("i") . '-' . date("s") . '.log';
          $log = $upLoadDir . $nomLog;
          eLog("création du fichier log : " . $log);
          $source = $upLoadDir . $fileName;
          $fhlog = fopen($log, "a");
          fwrite($fhlog, "importCSV " . $import_libelle . " : " . $source . "\r\n");

          //! on lance la requête de préparation
          if ($sql_prepa != "") {
            qSQL($sql_prepa);
          }

          $row = 1;

          if (($handle = fopen($source, "r")) !== FALSE) {
            while (($data = fgetcsv($handle, 500, ";")) !== FALSE) {
              $num = count($data);
              if ($headers && $row == 1) {
                // ce csv contient une ligne d'entêtes de colonnes, on ne traite pas cette ligne
              } else {
                eLog("lecture de la ligne " . $row . " avec " . $num . " colonnes");
                if ($num == $nbColonnes) {
                  // on a le bon nombre de colonnes, on peut continuer

                  $code = nettoie_text($data[0]);  // on remplace les doubles guillemets par rien
                  $libelle = nettoie_text($data[1]); // on remplace les doubles espaces par un simple espace
                  $siret = nettoie_text($data[2]);
                  $adresse1 = nettoie_text($data[3]);
                  $adresse2 = nettoie_text($data[4]);
                  $adresse3 = nettoie_text($data[5]);
                  $cp = trim($data[6]);
                  if (strlen($cp) == 4) {
                    $cp = "0" . $cp;
                  }
                  $ville = nettoie_text($data[7]);
                  $fkType = $data[8];
                  $contactNom = nettoie_text($data[10]);
                  $contactPrenom = nettoie_text($data[11]);
                  $contactFonction = nettoie_text($data[12]);
                  $telephone = $data[13];
                  $mobile = $data[14];
                  $email = nettoie_text($data[15]);

                  try {
                    $db = Database::getInstance();
                    $sql = 'SELECT c.* FROM clients c WHERE c.code = :code';
                    $record = $db->fetchAll($sql, [':code' => $code]);
                  } catch (Exception $e) {
                    error_log("Erreur recherche client : " . $e->getMessage());
                    $record = [];
                  }
                  switch (count($record)) {
                    case 0:
                      //! Code client non trouvé = nouveau client
                      try {
                        $db = Database::getInstance();
                        $sql = 'INSERT INTO clients SET code = :code, libelle = :libelle, siret = :siret, adresse1 = :adresse1, adresse2 = :adresse2, adresse3 = :adresse3, cp = :cp, ville = :ville, ';
                        $sql .= 'type_client = :type_client, contact_nom = :contact_nom, contact_prenom = :contact_prenom, contact_fonction = :contact_fonction, telephone = :telephone, mobile = :mobile, email = :email, chk_import = 1';
                        $stmt = $db->query($sql, [
                          ':code' => $code,
                          ':libelle' => $libelle,
                          ':siret' => $siret,
                          ':adresse1' => $adresse1,
                          ':adresse2' => $adresse2,
                          ':adresse3' => $adresse3,
                          ':cp' => $cp,
                          ':ville' => $ville,
                          ':type_client' => $fkType,
                          ':contact_nom' => $contactNom,
                          ':contact_prenom' => $contactPrenom,
                          ':contact_fonction' => $contactFonction,
                          ':telephone' => $telephone,
                          ':mobile' => $mobile,
                          ':email' => $email
                        ]);
                        $fkClient = $db->lastInsertId();
                        fwrite($fhlog, $row . "--- Ajout client avec requête préparée\r\n");

                        // Synchroniser le contact dans clients_contacts
                        syncContactClient($code, $contactNom, $contactPrenom, $contactFonction, $telephone, $mobile, $email, $fkUser);

                      } catch (Exception $e) {
                        error_log("Erreur insertion client : " . $e->getMessage());
                        fwrite($fhlog, "Erreur insertion : " . $e->getMessage() . "\r\n");
                        $fkClient = 0;
                      }
                      fwrite($fhlog, "--- Ajout fait\r\n");
                      $message = "Importation Clients SAP : Le client " . $libelle . " vient d'être créé en " . $ville . " (" . $cp . ")";
                      $fkUserSafe = intval($fkUser);
                      $sql = 'INSERT INTO notifications SET dateheure="' . date("Y-m-d H:i:s") . '", fk_user=' . $fkUserSafe . ', action="Création fiche", theme="Fiche Client", message="' . $message . '";';
                      qSQL($sql, "gen");

                      fwrite($fhlog, "--- Fin Creation ---" . "\r\n");
                      break;

                    case 1:
                      //! Un seul enregistrement trouvé : on met à jour le client
                      $rec = $record[0];

                      try {
                        $db = Database::getInstance();
                        $sql = 'UPDATE clients SET libelle = :libelle, siret = :siret, adresse1 = :adresse1, adresse2 = :adresse2, adresse3 = :adresse3, cp = :cp, ville = :ville, ';
                        $sql .= 'type_client = :type_client, contact_nom = :contact_nom, contact_prenom = :contact_prenom, contact_fonction = :contact_fonction, telephone = :telephone, mobile = :mobile, email = :email, chk_import = 1 ';
                        $sql .= 'WHERE code = :code';
                        $stmt = $db->query($sql, [
                          ':libelle' => $libelle,
                          ':siret' => $siret,
                          ':adresse1' => $adresse1,
                          ':adresse2' => $adresse2,
                          ':adresse3' => $adresse3,
                          ':cp' => $cp,
                          ':ville' => $ville,
                          ':type_client' => $fkType,
                          ':contact_nom' => $contactNom,
                          ':contact_prenom' => $contactPrenom,
                          ':contact_fonction' => $contactFonction,
                          ':telephone' => $telephone,
                          ':mobile' => $mobile,
                          ':email' => $email,
                          ':code' => $code
                        ]);
                        fwrite($fhlog, $row . "--- MàJ client avec requête préparée\r\n");

                        // Synchroniser le contact dans clients_contacts
                        syncContactClient($code, $contactNom, $contactPrenom, $contactFonction, $telephone, $mobile, $email, $fkUser);

                      } catch (Exception $e) {
                        error_log("Erreur mise à jour client : " . $e->getMessage());
                        fwrite($fhlog, "Erreur MàJ : " . $e->getMessage() . "\r\n");
                      }
                      fwrite($fhlog, "--- Fin MaJ ---" . "\r\n");
                      break;

                    default:
                      // Plusieurs lignes trouvées pour le même code : Erreur !!
                      $messageErreur = "Erreur Ligne " . $row . ", le code " . $code . " a été trouvé " . count($record) . " fois !! ****************************";
                      fwrite($fhlog, $messageErreur . "\r\n");
                      $erreur++;
                      break;
                  }
                } else {
                  $messageErreur = "Erreur Ligne " . $row . ", " . $nbColonnes . " colonnes attendues, mais " . $num . " trouvées !! ***************************";
                  fwrite($fhlog, $messageErreur . "\r\n");
                  $erreur++;
                }
              }
              $row++;
            } // end while
            fclose($handle);
          }

          fwrite($fhlog, "Fichier CSV fermé\r\n");
          //! Enfin on exécute les requêtes de fin
          if ($sql_final1 != "") {
            qSQL($sql_final1);
            fwrite($fhlog, "Requete finale 1 executee : " . $sql_final1 . "\r\n");
          }
          if ($sql_final2 != "") {
            qSQL($sql_final2);
            fwrite($fhlog, "Requete finale 2 executee : " . $sql_final2 . "\r\n");
          }
          fclose($fhlog);
          if ($erreur > 0) {
            $dest = "support@unikoffice.com";
            $sujet = $Conf->_appname . " Import clients : erreurs trouvées";
            $message = "Message automatique de CLEO 1 (jximport/upload_clients)<br/>Le fichier " . $upLoadDir . $fileName . " a été importé et a montré des erreurs lors de son importation.<br/>Merci";
            envoieMail($dest, $sujet, $message);
          }
          $message = "Importation terminée avec succès pour " . $row . " lignes";
          eLog($message);
        }
      }
    }

    if ($erreur == 0) {
      $reponse = array('ret' => "ok", 'msg' => "Importation terminée avec succès pour " . $row . " lignes");
    } else {
      $reponse = array('ret' => "ko", 'msg' => $messageErreur);
    }
    echo json_encode($reponse);
    break;

  case "upload_marche_produits":
    //! Importation du fichier CSV des produits d'un marché
    $data = json_decode(file_get_contents("php://input"));

    $upLoadDir = ROOT . $Conf->_pathupload . "import" . DS;
    // on crée le dossier et son arborescence s'il n'existe pas
    if (!file_exists($upLoadDir)) {
      mkdir($upLoadDir, 0777, true);
    }

    ini_set('max_execution_time', '600'); // 600 seconds = 10 minutes

    // if (isset($_POST["importIdMarche"])) {
    $erreur = "";
    $fileName = "";
    $size_max = 10500500; // 10 Mo
    foreach ($_FILES as $file) {
      $size_file = filesize($file['tmp_name']);
      if ($size_file > $size_max) {
        $erreur = "Vous avez dépassé la taille de fichier autorisée : " . $size_file . " pour un max de " . $size_max;
        eLog("problème de taille de fichier : " . $size_file . " pour un max de " . $size_max);
      } else {
        // on remplace les espaces par des _ dans le nom du fichier sur le serveur
        $fileName = str_normalize(basename($file["name"]), true);
        if (strrpos($fileName, ".") === false) {
          // pas d'extension
          $typ = "";
        } else {
          $typ = substr($fileName, strrpos($fileName, ".") + 1);
        }
        eLog("Import fichier : " . $upLoadDir . $fileName);
        if (move_uploaded_file($file['tmp_name'], $upLoadDir . $fileName)) {
          eLog("Importation Produits Marché : Fichier " . $upLoadDir . $fileName . " uploadé");

          // Chemin et nom du fichier CSV à importer
          $source = $upLoadDir . $fileName;

          // L'utilisateur qui importe est celui qui est connecté
          $fkUser = $Session->_user["rowid"];

          // Structure du fichier CSV
          $row = 1; // une ligne d'en-tête
          $headers = true;
          $separateur = ";";
          // Item No.;ItemName;Item Group;ListName;List Price;Discount in %;Quantity
          $colonnes = array('code', 'libelle', 'groupe', 'liste', 'prix', 'prc_discount', 'quantite');
          $nbColonnes = count($colonnes);

          // Libellé de l'importation
          $import_libelle = "Importation du fichier CSV des produits d'un marché";

          // Fichier log utilisé pour le debug
          $nomLog = 'csv-' . date("Y") . '-' . date("m") . '-' . date("d") . '-' . date("H") . '-' . date("i") . '-' . date("s") . '.log';
          $log = $upLoadDir . $nomLog;
          $fhlog = fopen($log, "a");
          fwrite($fhlog, "importCSV " . $import_libelle . " : " . $source . "\r\n");

          //! on détecte l'encodage du fichier CSV
          $codOrigin = mb_detect_encoding(file_get_contents($source), "Windows-1252, UTF-8, ISO-8859-1, ISO-8859-15", true);
          fwrite($fhlog, "Encodage détecté : " . $codOrigin . "\r\n");


          //! on charge les listes tarifaires par marché
          $sql = 'SELECT l.rowid, l.fk_marche, l.mot_cle, l.terme_achat, l.terme_vente FROM marches_listes l LEFT JOIN marches m ON l.fk_marche=m.rowid WHERE m.active=1;';
          $marchesListes = getinfos($sql, "gen");
          //! Tableaux des marchés mis à jour pour effectuer en fin d'import la purge des produits non importés de ces marchés
          $idMarches = array();
          $idMarche = 0;    // le marché en cours d'importation
          $termeAchat = "ACHAT";
          $termeVente = "VENTE";
          //! tableaux des marché-code-incrément discount pour gérer dans quel discount on enregistre la paire discount-quantité (de 1 à 6)
          $lstMarchesCodesDiscount = array();

          //! on lance la requête de préparation
          $sql = 'UPDATE produits SET chk_import=0;';
          qSQL($sql, "gen");
          fwrite($fhlog, "Requête de preparation terminée : " . $sql . "\r\n");

          //! On récupère le contenu de la table produits pour vérifier si le produit existe ou non à chaque ligne
          $sql = 'SELECT rowid, CONCAT(fk_marche, "-", code) AS marchecode FROM produits;';
          $produitsExistants = getinfos($sql, "gen");

          //! on récupère le nombre de lignes de ce fichier CSV pour alimenter la progress bar
          $totUpload = 0;
          $fh = fopen($source, 'rb') or die("ERROR OPENING DATA");
          while (fgets($fh) !== false) $totUpload++;
          fclose($fh);

          if (($handle = fopen($source, "rb")) !== FALSE) {
            fwrite($fhlog, "Fichier CSV ouvert : démarrage de la lecture ligne par ligne\r\n");
            eLog("jximport démarrage de la lecture du fichier csv ligne par ligne");

            while (($data = fgetcsv($handle, 700, $separateur)) !== FALSE) {
              $num = count($data);
              if ($headers && $row == 1) {
                // ce csv contient une ligne d'entêtes de colonnes, on ne traite pas cette ligne
                fwrite($fhlog, "Ok lecture CSV 1ère ligne en-tête\r\n");
              } else {
                // on traite la ligne
                $code = trim($data[0]);
                if (strlen($code) > 0) {
                  // on ne traite pas la ligne si le code est vide : dernière ligne du fichier ?
                  $libelle = str_replace('"', '', trim($data[1]));  // on remplace les doubles guillemets par rien
                  // on réencode en ISO 8859-1 pour éviter les problèmes d'accent
                  if ($codOrigin == "UTF-8") {
                    // Utiliser mb_convert_encoding au lieu de utf8_decode (déprécié en PHP 8.3)
                    $libelle = mb_convert_encoding($libelle, "ISO-8859-1", "UTF-8");
                  } elseif ($codOrigin == "Windows-1252" || $codOrigin == "CP1252") {
                    // Windows-1252 est très proche de ISO-8859-1
                    // On traite le texte tel quel car les caractères de base sont compatibles
                    // Seulement quelques caractères spéciaux diffèrent (€, œ, etc.)
                    $libelle = $libelle; // Pas de conversion, on garde tel quel
                  } elseif ($codOrigin == "ISO-8859-15") {
                    // ISO-8859-15 est compatible avec ISO-8859-1 sauf pour le symbole €
                    $libelle = str_replace('€', 'EUR', $libelle);
                  }
                  // Pour ISO-8859-1, on ne fait rien, c'est déjà le bon format

                  $groupe = str_replace("  ", " ", trim($data[2])); // on remplace les doubles espaces par un simple espace
                  $liste = trim($data[3]);

                  if ($idMarche == 0) {
                    foreach ($marchesListes as $corr) {
                      $lmc = strlen($corr["mot_cle"]);
                      if ($lmc > 0) {
                        $posMotCle = strpos($liste, $corr["mot_cle"]);
                        if ($posMotCle !== false) {
                          //! le mot clé est bien dans $liste
                          $idMarche = $corr["fk_marche"];
                          $termeAchat = $corr["terme_achat"];
                          $termeVente = $corr["terme_vente"];

                          //! on rajoute ce fk_marche dans la liste des marchés traités pour effectuer la purge des chk_import=0 à la fin
                          if (!in_array($idMarche, $idMarches)) {
                            $idMarches[] = $idMarche;
                            // C'est la 1ère ligne de produit pour ce marché :on supprime d'office tous les prix d'achat et de vente des produits de ce marché
                            $sql = 'UPDATE produits p SET p.prix_achat_net=0, p.prix_vente=0, p.prc_discount_1=0, p.quantite_1=0, p.prc_discount_2=0, p.quantite_2=0, p.prc_discount_3=0, p.quantite_3=0, p.prc_discount_4=0, p.quantite_4=0, p.prc_discount_5=0, p.quantite_5=0, p.prc_discount_6=0, p.quantite_6=0 WHERE fk_marche=' . $idMarche;
                            eLog("Import produits marché : suppression des prix d'achat et de vente pour ce marché : " . $idMarche);
                            fwrite($fhlog, "Nettoyage des infos produits du marché " . $idMarche . "\r\n");
                            eLog($sql);
                            qSQL($sql, "gen");
                          }
                          break;
                        }
                      }
                    }
                  }
                  if ($idMarche == 0) {
                    //! on n'a pas trouvé de marché correspondant à la liste
                    $erreur = "ligne " . $row . " : pas de marché correspondant à la liste (" . $liste . ")";
                    fwrite($fhlog, $erreur . "\r\n");
                    break;
                  }
                  // fwrite($fhlog, "ligne " . $row . " : c'est le marché " . $fkMarche . " avec pour achat (" . $termeAchat . ") et pour vente (" . $termeVente . ")\r\n");
                  fwrite($fhlog, "ligne " . $row . " : code (" . $code . ") libelle (" . $libelle . ") groupe (" . $groupe . ") liste (" . $liste . ")\r\n");

                  // pour le prix, on vérifie qu'il n'y ait pas de séparateur de milliers avec un . ou un espace, sinon on le l'enlève (on ne le fait que pour les chaînes d'un longueur > 6)
                  // Ex : 16,63 on ne traite pas, 1.663,63 ou 1 663,63 on traite
                  if (strlen($data[4]) > 6) {
                    $data[4] = str_replace(".", "", $data[4]);
                    $data[4] = str_replace(" ", "", $data[4]);
                  }
                  // ensuite on remplace à chaque fois la virgule de la décimale par un point pour le prix
                  $prix = floatval(str_replace(",", ".", trim($data[4])));
                  $prc_discount = floatval(str_replace(",", ".", trim($data[5])));
                  $quantite = intval(str_replace(",", ".", trim($data[6])));

                  $set = 'libelle="' . $libelle . '", groupe="' . $groupe . '", liste="' . $liste . '", ';
                  $posHa = strpos($liste, $termeAchat);
                  if ($posHa !== false) {
                    $set .= 'prix_achat_net=' . $prix . ', ';
                  } else {
                    $posVe = strpos($liste, $termeVente);
                    if ($posVe !== false) {
                      // ce n'est que pour la vente que l'on active le produit (on affiche ce produit que s'il est à vendre)
                      $set .= 'prix_vente=' . $prix . ', active=1, chk_import=1, ';
                    } else {
                      $erreur = 'Erreur sur la ligne ' . $row . ' où la LISTNAME ne contient ni ACHAT ni VENTE';
                      fwrite($fhlog, $erreur . "\r\n");
                      break;
                    }
                  }
                  if ($prc_discount > 0) {
                    $lstMarchesCodesDiscounts[] = $idMarche . '-' . $code . '-';
                    $incDiscount = array_count_values($lstMarchesCodesDiscounts)[$idMarche . '-' . $code . '-'];
                    if ($incDiscount < 7) {
                      $set .= 'prc_discount_' . $incDiscount . '=' . $prc_discount . ', quantite_' . $incDiscount . '=' . $quantite . ', ';
                    } else {
                      $erreur = 'Erreur sur la ligne ' . $row . ' où le nombre de discount > 0 est supérieur à 6 : code produit (' . $code . ')';
                      fwrite($fhlog, $erreur . "\r\n");
                      break;
                    }
                  } else {
                    // pas de % discount sur cette ligne
                    if ($posHa !== false) {
                      // et on est sur une ligne Achat, donc on met tous les prc_discount et qte à 0
                      $set .= 'prc_discount_1=0, prc_discount_2=0, prc_discount_3=0, prc_discount_4=0, prc_discount_5=0, prc_discount_6=0, quantite_1=0, quantite_2=0, quantite_3=0, quantite_4=0, quantite_5=0, quantite_6=0, ';
                    }
                  }
                  // on enlève la virgule de fin
                  $set = substr($set, 0, strlen($set) - 2);

                  //! On regarde si ce produit existe déjà sur ce marché
                  $idExistant = 0;
                  $aRechercher = $idMarche . '-' . $code;
                  foreach ($produitsExistants as $produitExistant) {
                    if ($produitExistant["marchecode"] == $aRechercher) {
                      $idExistant = $produitExistant["rowid"];
                      break;
                    }
                  }

                  if ($idExistant > 0) {
                    // le produit existe déjà, on le met à jour
                    $sql = 'UPDATE produits SET ' . $set . ' WHERE rowid=' . $idExistant . ';';
                    fwrite($fhlog, $row . " update : " . $sql . "\r\n");
                    qSQL($sql, "gen");
                  } else {
                    // le produit n'existe pas, on le crée
                    $sql = 'INSERT INTO produits SET fk_marche=' . $idMarche . ', code="' . $code . '", ' . $set . ';';
                    fwrite($fhlog, $row . " insert : " . $sql . "\r\n");
                    $newId = qSQL($sql, "gen", true);
                    // on ajoute le produit à la liste des produits existants, pour gérer le cas où on a plusieurs fois le même produit dans le fichier (cas de plusieurs discounts)
                    $produitsExistants[] = array("rowid" => $newId, "marchecode" => $idMarche . '-' . $code);
                  }
                  // eLog("jximport ligne " . $row . " : " . $sql);
                  fwrite($fhlog, "ligne " . $row . " : import terminé\r\n");
                }
              }
              $row++;
              // echo json_encode(['progress' => ($row / $totUpload) * 100]);
              // ob_flush();
              // flush();
              // usleep(50);
            } // end while
            fclose($handle);
            fwrite($fhlog, "Fichier CSV fermé\r\n");
          } // end if fopen

          fwrite($fhlog, "Fin de la boucle\r\n");
          // Enfin, on désactive les produits qui n'ont pas été importés dans le ou les marchés traités
          // la règle est qu'on traite un marché en entier et non partiellement
          // on commence par récupérer la liste des marchés traités
          foreach ($idMarches as $idMarch) {
            $sql = 'UPDATE produits SET active=0 WHERE fk_marche=' . $idMarch . ' AND chk_import=0;';
            eLog($sql);
            fwrite($fhlog, "Désactivation des produits non importés : " . $sql . "\r\n");
            qSQL($sql, "gen");
            // et on enregistre la date de l'import au niveau de chaque marché concerné
            $sql = 'UPDATE marches SET date_import="' . date("Y-m-d H:i:s") . '" WHERE rowid=' . $idMarch . ';';
            eLog($sql);
            fwrite($fhlog, "Mise à jour de la date d'import dans marches : " . $sql . "\r\n");
            qSQL($sql, "gen");
          }
          fwrite($fhlog, "Fin de l'importation et fermeture du fichier log\r\n");
          fclose($fhlog);
        } // end if move_uploaded
      } // end if size_max
    } // end foreach file uploaded

    // ob_clean();
    if ($fileName == "") {
      $ret = array('ret' => "ko", 'msg' => "Aucun fichier à importer");
    } else {
      if ($erreur == "") {
        $nbLignes = isset($row) ? $row - 1 : 0; // On enlève la ligne d'en-tête
        $nbMarches = isset($idMarches) ? count($idMarches) : 0;
        $msgMarches = $nbMarches > 1 ? " pour " . $nbMarches . " marchés" : ($nbMarches == 1 ? " pour 1 marché" : "");
        $ret = array('ret' => "ok", 'msg' => "Import terminé : " . $nbLignes . " produits traités" . $msgMarches);
      } else {
        $ret = array('ret' => "ko", 'msg' => $erreur);
      }
    }
    // } else {
    //   $ret = array('ret' => "ko", 'msg' => "Pas d'idMarche");
    // }
    echo json_encode($ret);
    break;

  case "upload_sap_pdf":
    if (isset($_POST["cid"])) {
      $cid = nettoie_input($_POST["cid"]);
      eLog("upload_sap_pdf: " . $cid);

      $upDir = ROOT . $Conf->_pathupload . "devis" . DS;
      if (!is_dir($upDir)) {
        mkdir($upDir, 0777, true);
      }
      eLog("Dossier upload : " . $upDir);
      $ret = array('ret' => "ko", 'msg' => "Erreur Aucun PDF SAP à importer");
      foreach ($_FILES as $file) {
        $size_file = filesize($file['tmp_name']);
        $size_max = 10500600;
        if ($size_file > $size_max) {
          $ret = array('ret' => "ko", 'msg' => "Le PDF SAP a une taille trop importante : " . $size_file . " pour un max de " . $size_max);
          eLog("problème de taille de fichier : " . $size_file . " pour un max de " . $size_max);
        } else {
          //! on remplace les espaces par des _ dans le nom du fichier sur le serveur
          $filename = str_normalize(basename($file["name"]), true);
          if (strrpos($filename, ".") === false) {
            //! pas d'extension
            $typ = "";
          } else {
            $typ = substr($filename, strrpos($filename, ".") + 1);
          }
          eLog("le fichier sera uploadé : " . $upDir . $filename);
          if (move_uploaded_file($file['tmp_name'], $upDir . $filename)) {
            // On enregistre les infos de ce fichier dans la table medias
            $upDirMedia = "pub/files/upload/devis/";
            $sql = 'INSERT INTO medias SET dir0="' . $upDirMedia . '", support="devis_pdf_sap", support_rowid=' . $cid . ', fichier="' . $filename . '", type_fichier="' . $typ . '", date_creat="' . date("Y-m-d H:i:s") . '", fk_user_creat=' . $fkUser . ';';
            qSQL($sql, "gen");

            // On change le statut du devis et on prévient le RR de la réception du PDF SAP par email
            $sql = 'UPDATE devis SET fk_statut_devis=6, date_modif="' . date("Y-m-d H:i:s") . '", fk_user_modif=' . $fkUser . ' WHERE rowid=' . $cid . ';';
            qSQL($sql, "gen");

            // On ajoute un message automatique dans le chat
            $sql = 'INSERT INTO devis_histo SET fk_devis=' . $cid . ', fk_user=' . $fkUser . ', date_histo="' . date("Y-m-d H:i:s") . '", commentaire="Le PDF SAP du devis a été déposé pour vérification du RR";';
            qSQL($sql, "gen");

            // On récupère les infos du devis pour envoyer un email au RR
            $sql = 'SELECT d.rowid, d.date_demande, d.fk_client, d.lib_new_client, d.cp_new_client, d.ville_new_client, u.prenom, u.libelle, u.email FROM devis d LEFT JOIN users u ON d.fk_user = u.rowid WHERE d.rowid=' . $cid . ';';
            $res = getinfos($sql, "gen");
            $data = $res[0];

            $nom = $data["prenom"] . " " . $data["libelle"];
            $dest = $data["email"];
            $idClient = $data["fk_client"];
            $nomClient = "";

            if ($idClient == 0) {
              $nomClient = $data["lib_new_client"] . ", (" . $data["cp_new_client"] . " - " . $data["ville_new_client"] . ")";
            } else {
              $sql = 'SELECT c.libelle, c.cp, c.ville FROM clients c WHERE c.rowid=' . $idClient . ';';
              $client = getinfos($sql, "gen");
              if (count($client) == 1) {
                $nomClient = $client[0]["libelle"] . " (" . $client[0]["cp"] . " - " . $client[0]["ville"] . ")";
              }
            }

            $sujet = "DEVIS - Réception Devis SAP";
            $message = "Bonjour " . $nom . ",<br><br>Vous venez de recevoir la version SAP PDF d'un de vos devis. Merci de procéder à la vérification de celui-ci et de le valider sur CLEO.<br/>";
            $message .= "Devis : #" . $data["rowid"] . " du " . affiche_date($data["date_demande"]) . "<br/>";
            $message .= "Client : " . $nomClient . "<br/>";
            $message .= "<br/><br/>Cordialement,<br/>L'équipe ADV<br/>";
            $message .= "Email généré automatiquement par l'application CLEO de gestion des devis";

            // Ajout de logs détaillés pour l'envoi d'email
eLog("Tentative d'envoi d'email à " . $dest . " avec le sujet : " . $sujet);
$email = envoieMail($dest, $sujet, $message);
eLog("Résultat de l'envoi d'email : " . json_encode($email));

            $ret = array('ret' => "ok", 'msg' => "L'importation est terminée et s'est bien déroulée");
            eLog("Le fichier PDF SAP a été correctement uploadé");
          } else {
            $ret = array('ret' => "ko", 'msg' => "Erreur lors de l'importation du PDF SAP");
            eLog("Le fichier PDF SAP n'a pas pu être uploadé");
          }
        }
      }
    } else {
      $ret = array('ret' => "ko", 'msg' => "Pas d'id");
    }
    echo json_encode($ret);
    break;

  case "get_files":
    $data = json_decode(file_get_contents("php://input"));
    if (isset($data->cid) && isset($data->sup)) {
      $idMedia = nettoie_input($data->cid);
      $support = nettoie_input($data->sup);
      $sql = 'SELECT * FROM medias WHERE support="' . $support . '" AND support_rowid=' . $idMedia . ';';
      $ret = getinfos($sql, "gen");
    } else {
      $ret = array('ret' => "ko", 'msg' => "Pas d'id");
    }
    echo json_encode($ret);
    break;

  case "delete_file":
    $data = json_decode(file_get_contents("php://input"));
    if (isset($data->cid)) {
      $idMedia = nettoie_input($data->cid);
      $sql = 'DELETE FROM medias WHERE rowid=' . $idMedia . ';';
      qSQL($sql, "gen");
      $ret = array('ret' => "ok", 'msg' => "Le fichier a bien été supprimé");
    } else {
      $ret = array('ret' => "ko", 'msg' => "Pas d'id");
    }
    echo json_encode($ret);
    break;
}
exit();
