- Configuration du debug conditionnel pour dev/recette - Fonction debug() globale avec niveaux - Logging des requêtes SQL - Handlers d'exceptions et d'erreurs globaux 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
602 lines
30 KiB
PHP
602 lines
30 KiB
PHP
<?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;
|
|
}
|
|
|
|
|
|
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]);
|
|
|
|
$sql = "SELECT c.* FROM clients c WHERE c.code='" . $code . "';";
|
|
$record = getinfos($sql, "gen");
|
|
switch (count($record)) {
|
|
case 0:
|
|
//! Code client non trouvé = nouveau client
|
|
$sql = 'INSERT INTO clients SET code="' . $code . '", libelle="' . $libelle . '", siret="' . $siret . '", adresse1="' . $adresse1 . '", adresse2="' . $adresse2 . '", adresse3="' . $adresse3 . '", cp="' . $cp . '", ville="' . $ville . '", ';
|
|
$sql .= 'type_client="' . $fkType . '", contact_nom="' . $contactNom . '", contact_prenom="' . $contactPrenom . '", contact_fonction="' . $contactFonction . '", telephone="' . $telephone . '", mobile="' . $mobile . '", email="' . $email . '", chk_import=1;';
|
|
fwrite($fhlog, $row . "---" . $sql . "\r\n");
|
|
$fkClient = qSQL($sql, "gen", true);
|
|
fwrite($fhlog, "--- Ajout fait\r\n");
|
|
$message = "Importation Clients SAP : Le client " . $libelle . " vient d'être créé en " . $ville . " (" . $cp . ")";
|
|
$sql = 'INSERT INTO notifications SET dateheure="' . date("Y-m-d H:i:s") . '", fk_user=' . $fkUser . ', 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];
|
|
|
|
$sql = 'UPDATE clients SET libelle="' . $libelle . '", siret="' . $siret . '", adresse1="' . $adresse1 . '", adresse2="' . $adresse2 . '", adresse3="' . $adresse3 . '", cp="' . $cp . '", ville="' . $ville . '", ';
|
|
$sql .= 'type_client="' . $fkType . '", contact_nom="' . $contactNom . '", contact_prenom="' . $contactPrenom . '", contact_fonction="' . $contactFonction . '", telephone="' . $telephone . '", mobile="' . $mobile . '", email="' . $email . '", chk_import=1 ';
|
|
$sql .= 'WHERE code="' . $code . '";';
|
|
qSQL($sql);
|
|
fwrite($fhlog, $row . "---" . $sql . "\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") {
|
|
$libelle = utf8_decode($libelle);
|
|
}
|
|
if ($codOrigin != "ISO-8859-1") {
|
|
// Convertir en ISO 8859-1
|
|
$libelle = iconv($codOrigin, "ISO-8859-15//IGNORE", $libelle);
|
|
}
|
|
|
|
$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 == "") {
|
|
$ret = array('ret' => "ok", 'msg' => "L'importation est terminée et s'est bien déroulée");
|
|
} 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();
|