diff --git a/composer.json b/composer.json index c38cbe7..e0cb6ff 100644 --- a/composer.json +++ b/composer.json @@ -30,6 +30,7 @@ "ext-json": "*", "akaunting/laravel-setting": "^1.2.9", "anhskohbo/no-captcha": "3.*", + "endroid/qr-code": "^6.0", "guzzlehttp/guzzle": "^7.2", "intervention/image": "^2.3", "jenssegers/agent": "^2.5", diff --git a/composer.lock b/composer.lock index 8a6ece5..5291d9b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a7749f3b43e37d8fb607bcccd227f5ee", + "content-hash": "ef3e05e7260284f5b7c7b4b6f93b252b", "packages": [ { "name": "akaunting/laravel-setting", @@ -820,6 +820,78 @@ ], "time": "2023-10-06T06:47:41+00:00" }, + { + "name": "endroid/qr-code", + "version": "6.0.6", + "source": { + "type": "git", + "url": "https://github.com/endroid/qr-code.git", + "reference": "11e6a94458dab8dd18736c11892130ec788b5028" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/11e6a94458dab8dd18736c11892130ec788b5028", + "reference": "11e6a94458dab8dd18736c11892130ec788b5028", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^3.0", + "php": "^8.2" + }, + "require-dev": { + "endroid/quality": "dev-main", + "ext-gd": "*", + "khanamiryan/qrcode-detector-decoder": "^2.0.2", + "setasign/fpdf": "^1.8.2" + }, + "suggest": { + "ext-gd": "Enables you to write PNG images", + "khanamiryan/qrcode-detector-decoder": "Enables you to use the image validator", + "roave/security-advisories": "Makes sure package versions with known security issues are not installed", + "setasign/fpdf": "Enables you to use the PDF writer" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Endroid\\QrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeroen van den Enden", + "email": "info@endroid.nl" + } + ], + "description": "Endroid QR Code", + "homepage": "https://github.com/endroid/qr-code", + "keywords": [ + "code", + "endroid", + "php", + "qr", + "qrcode" + ], + "support": { + "issues": "https://github.com/endroid/qr-code/issues", + "source": "https://github.com/endroid/qr-code/tree/6.0.6" + }, + "funding": [ + { + "url": "https://github.com/endroid", + "type": "github" + } + ], + "time": "2025-03-14T23:29:08+00:00" + }, { "name": "firebase/php-jwt", "version": "v6.10.1", diff --git a/public/languages/en/general.php b/public/languages/en/general.php index 1ddad96..82a67da 100644 --- a/public/languages/en/general.php +++ b/public/languages/en/general.php @@ -1,6 +1,6 @@ false, 'message' => 'Richiesta non valida']); + exit; +} + +$photoId = intval($_POST['photo_id']); + +$db = DBHandlerSelect::getInstance(); +$pdo = $db->getConnection(); + +// Recupera il percorso del file +$stmt = $pdo->prepare("SELECT file_path FROM datadb_photos WHERE id = ?"); +$stmt->execute([$photoId]); +$photo = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$photo) { + echo json_encode(['success' => false, 'message' => 'Foto non trovata']); + exit; +} + +// Elimina il file dal server +$filePath = '../photostrf/' . $photo['file_path']; +if (file_exists($filePath)) { + unlink($filePath); +} + +// Elimina il record dal database +$stmt = $pdo->prepare("DELETE FROM datadb_photos WHERE id = ?"); +$stmt->execute([$photoId]); + +echo json_encode(['success' => true, 'message' => 'Foto eliminata con successo']); diff --git a/public/userarea/fetch_tracking_info.php b/public/userarea/fetch_tracking_info.php new file mode 100644 index 0000000..1ed680c --- /dev/null +++ b/public/userarea/fetch_tracking_info.php @@ -0,0 +1,150 @@ + false, 'message' => 'Numero di tracking o corriere non fornito']); +} + +$trackingNumber = $_POST['tracking_number']; +$courierCode = $_POST['courier_code']; + +// Lista dei corrieri validi per validazione +$validCarriers = ['tnt-it', 'dhl', 'gls', 'sda', 'ups']; +if (!in_array($courierCode, $validCarriers)) { + sendResponse(['success' => false, 'message' => 'Corriere non valido']); +} + +// Imposta il nome del corriere in base al codice +$carrierNames = [ + 'tnt-it' => 'TNT Italy', + 'dhl' => 'DHL', + 'gls' => 'GLS', + 'sda' => 'SDA', + 'ups' => 'UPS' +]; +$courierName = $carrierNames[$courierCode]; + +// Funzione per fare una richiesta cURL a TrackingMore +function makeRequest($url, $data, $apiKey, $method = 'POST') +{ + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Tracking-Api-Key: ' . $apiKey, + 'Content-Type: application/json' + ]); + if ($method === 'POST') { + curl_setopt($ch, CURLOPT_POST, true); + $jsonData = json_encode($data, JSON_PRETTY_PRINT); + curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); + file_put_contents('debug.log', "Encoded JSON Data: $jsonData\n", FILE_APPEND); + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + curl_close($ch); + + file_put_contents('debug.log', "Request URL: $url\nRequest Data: " . json_encode($data) . "\nResponse: $response\nHTTP Code: $httpCode\nError: $error\n", FILE_APPEND); + + if ($response === false) { + return [ + 'success' => false, + 'code' => $httpCode, + 'message' => 'Errore nella richiesta API: ' . $error + ]; + } + + $decodedResponse = json_decode($response, true); + if ($decodedResponse === null) { + return [ + 'success' => false, + 'code' => $httpCode, + 'message' => 'Risposta API non valida (non è JSON)' + ]; + } + + $decodedResponse['success'] = isset($decodedResponse['meta']['code']) && ($decodedResponse['meta']['code'] === 200 || $decodedResponse['meta']['code'] === 201); + $decodedResponse['http_code'] = $httpCode; + return $decodedResponse; +} + +// Step 1: Prova a creare il tracking +$createUrl = 'https://api.trackingmore.com/v4/trackings/create'; +$createData = [ + 'tracking_number' => $trackingNumber, + 'courier_code' => $courierCode +]; +$createResponse = makeRequest($createUrl, $createData, $apiKey); +file_put_contents('debug.log', "Create Response: " . json_encode($createResponse) . "\n", FILE_APPEND); + +$trackingInfo = null; +if ($createResponse['success']) { + // Creazione riuscita, usa i dati restituiti + $trackingInfo = $createResponse['data']; +} else { + // Controlla se l'errore è "Tracking No. already exists" (4101) + if (isset($createResponse['meta']['code']) && $createResponse['meta']['code'] === 4101) { + // Il tracking esiste già, usa /trackings (GET) con tracking_number e courier_code + $getUrl = 'https://api.trackingmore.com/v4/get?tracking_numbers=' . urlencode($trackingNumber); + $getResponse = makeRequest($getUrl, [], $apiKey, 'GET'); + file_put_contents('debug.log', "Get Response: " . json_encode($getResponse) . "\n", FILE_APPEND); + + if ($getResponse['success'] && !empty($getResponse['data']['items']) && !empty($getResponse['data']['items'][0])) { + $trackingInfo = $getResponse['data']['items'][0]; + } else { + $errorMessage = isset($getResponse['meta']['message']) ? $getResponse['meta']['message'] : 'Errore sconosciuto'; + sendResponse(['success' => false, 'message' => 'Errore nel recupero del tracking esistente: ' . $errorMessage]); + } + } else { + // Altro errore nella creazione + $errorMessage = isset($createResponse['meta']['message']) ? $createResponse['meta']['message'] : 'Errore sconosciuto'; + sendResponse(['success' => false, 'message' => 'Errore nella creazione del tracking: ' . $errorMessage]); + } +} + +if (!$trackingInfo) { + sendResponse(['success' => false, 'message' => 'Nessuna informazione di tracking trovata']); +} + +// Estrai la data di consegna e il firmatario +$deliveryDate = 'Non disponibile'; +$signedBy = 'Non disponibile'; +if (isset($trackingInfo['origin_info']['trackinfo']) && is_array($trackingInfo['origin_info']['trackinfo'])) { + foreach ($trackingInfo['origin_info']['trackinfo'] as $checkpoint) { + if (isset($checkpoint['checkpoint_delivery_status']) && $checkpoint['checkpoint_delivery_status'] === 'delivered') { + $deliveryDate = $checkpoint['checkpoint_date'] ?? 'Non disponibile'; + $signedBy = $trackingInfo['signed_by'] ?? 'Non disponibile'; + break; + } + } +} + +// Restituisci i dati al frontend +sendResponse([ + 'success' => true, + 'deliveryDate' => $deliveryDate, + 'signedBy' => $signedBy, + 'carrierName' => $courierName +]); diff --git a/public/userarea/fetch_tracking_info17track.php b/public/userarea/fetch_tracking_info17track.php new file mode 100644 index 0000000..381ce14 --- /dev/null +++ b/public/userarea/fetch_tracking_info17track.php @@ -0,0 +1,166 @@ + false, 'message' => 'Numero di tracking non fornito']); +} + +$trackingNumber = $_POST['tracking_number']; + +// Funzione per fare una richiesta cURL a 17Track +function makeRequest($url, $data, $apiKey, $method = 'POST') +{ + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + '17token: ' . $apiKey, + 'Content-Type: application/json' + ]); + if ($method === 'POST') { + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + curl_close($ch); + + file_put_contents('debug.log', "Request URL: $url\nRequest Data: " . json_encode($data) . "\nResponse: $response\nHTTP Code: $httpCode\nError: $error\n", FILE_APPEND); + + if ($response === false || $httpCode !== 200) { + return [ + 'success' => false, + 'code' => $httpCode, + 'message' => 'Errore nella richiesta API: HTTP ' . $httpCode . ' - ' . $error + ]; + } + + $decodedResponse = json_decode($response, true); + if ($decodedResponse === null) { + return [ + 'success' => false, + 'code' => $httpCode, + 'message' => 'Risposta API non valida (non è JSON)' + ]; + } + + return $decodedResponse; +} + +// Step 1: Prova con auto-detection +$trackUrl = 'https://api.17track.net/track/v2/register'; +$trackData = [ + [ + 'number' => $trackingNumber, + 'carrier' => null, + 'auto_detection' => true + ] +]; +$registerResponse = makeRequest($trackUrl, $trackData, $apiKey); + +file_put_contents('debug.log', "Register Response (Auto-detect): " . json_encode($registerResponse) . "\n", FILE_APPEND); + +if (!isset($registerResponse['data']['accepted']) || empty($registerResponse['data']['accepted'])) { + $errorMessage = $registerResponse['data']['rejected'][0]['error']['message'] ?? 'Errore sconosciuto'; + sendResponse(['success' => false, 'message' => 'Errore nella registrazione del tracking: ' . $errorMessage]); +} + +// Step 2: Recupera i dettagli con riprova +$getUrl = 'https://api.17track.net/track/v2/gettrackinfo'; +$getData = [['number' => $trackingNumber]]; +$maxAttempts = 3; +$delaySeconds = 5; + +for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) { + $trackResponse = makeRequest($getUrl, $getData, $apiKey); + file_put_contents('debug.log', "Track Response (Attempt $attempt): " . json_encode($trackResponse) . "\n", FILE_APPEND); + + if (isset($trackResponse['data']['accepted']) && !empty($trackResponse['data']['accepted'])) { + break; + } + + if ($attempt < $maxAttempts) { + sleep($delaySeconds); + } +} + +// Se auto-detection ha successo, procedi +if (isset($trackResponse['data']['accepted']) && !empty($trackResponse['data']['accepted'])) { + $trackingInfo = $trackResponse['data']['accepted'][0]['track'] ?? null; + if (!$trackingInfo) { + sendResponse(['success' => false, 'message' => 'Nessuna informazione di tracking trovata']); + } + + $deliveryDate = 'Non disponibile'; + $signedBy = 'Non disponibile'; + $carrierName = $trackingInfo['carrier']['name'] ?? 'Sconosciuto'; + + if (isset($trackingInfo['z0']['e']) && $trackingInfo['z0']['e'] == 40) { + $deliveryDate = $trackingInfo['z0']['z'] ?? 'Non disponibile'; + $signedBy = $trackingInfo['z0']['d'] ?? 'Non disponibile'; + } + + sendResponse([ + 'success' => true, + 'deliveryDate' => $deliveryDate, + 'signedBy' => $signedBy, + 'carrierName' => $carrierName + ]); +} + +// Step 3: Se auto-detection fallisce, prova una lista di corrieri comuni +$commonCarriers = [ + ['code' => 100003, 'name' => 'TNT'], // TNT + ['code' => 100001, 'name' => 'DHL'], // DHL Express + ['code' => 100065, 'name' => 'DHL eCommerce'], // DHL eCommerce + ['code' => 100002, 'name' => 'UPS'] // UPS +]; + +$possibleCarriers = []; +foreach ($commonCarriers as $carrier) { + $trackData = [ + [ + 'number' => $trackingNumber, + 'carrier' => $carrier['code'], + 'auto_detection' => false + ] + ]; + $registerResponse = makeRequest($trackUrl, $trackData, $apiKey); + + if (isset($registerResponse['data']['accepted']) && !empty($registerResponse['data']['accepted'])) { + $possibleCarriers[] = $carrier['name']; + } + sleep(1); // Piccolo ritardo per evitare limiti di rate +} + +if (!empty($possibleCarriers)) { + sendResponse([ + 'success' => false, + 'message' => 'Auto-detection fallita. Seleziona un corriere tra quelli possibili.', + 'possibleCarriers' => $possibleCarriers + ]); +} else { + sendResponse(['success' => false, 'message' => 'Nessun corriere identificato per questo numero di tracking']); +} diff --git a/public/userarea/fetch_tracking_infotracking.php b/public/userarea/fetch_tracking_infotracking.php new file mode 100644 index 0000000..08ee258 --- /dev/null +++ b/public/userarea/fetch_tracking_infotracking.php @@ -0,0 +1,166 @@ + false, 'message' => 'Numero di tracking non fornito']); +} + +$trackingNumber = $_POST['tracking_number']; + +// Funzione per fare una richiesta cURL a TrackingMore +function makeRequest($url, $data, $apiKey, $method = 'POST') +{ + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Tracking-Api-Key: ' . $apiKey, + 'Content-Type: application/json' + ]); + if ($method === 'POST') { + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + } + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + curl_close($ch); + + file_put_contents('debug.log', "Request URL: $url\nRequest Data: " . json_encode($data) . "\nResponse: $response\nHTTP Code: $httpCode\nError: $error\n", FILE_APPEND); + + if ($response === false || ($httpCode !== 200 && $httpCode !== 201)) { + return [ + 'success' => false, + 'code' => $httpCode, + 'message' => 'Errore nella richiesta API: HTTP ' . $httpCode . ' - ' . $error + ]; + } + + $decodedResponse = json_decode($response, true); + if ($decodedResponse === null) { + return [ + 'success' => false, + 'code' => $httpCode, + 'message' => 'Risposta API non valida (non è JSON)' + ]; + } + + $decodedResponse['success'] = isset($decodedResponse['meta']['code']) && ($decodedResponse['meta']['code'] === 200 || $decodedResponse['meta']['code'] === 201); + return $decodedResponse; +} + +// Step 1: Identifica il corriere +$detectUrl = 'https://api.trackingmore.com/v4/couriers/detect'; +$detectData = ['tracking_number' => $trackingNumber]; +$detectResponse = makeRequest($detectUrl, $detectData, $apiKey); +file_put_contents('debug.log', "Detect Response: " . json_encode($detectResponse) . "\n", FILE_APPEND); + +if (!$detectResponse['success']) { + $errorMessage = isset($detectResponse['meta']['message']) ? $detectResponse['meta']['message'] : 'Errore sconosciuto'; + sendResponse(['success' => false, 'message' => 'Errore nella rilevazione del corriere: ' . $errorMessage]); +} + +$couriers = $detectResponse['data'] ?? []; +if (empty($couriers)) { + sendResponse(['success' => false, 'message' => 'Corriere non identificato per il numero di tracking']); +} + +// Prendi il primo corriere per ora +$courierCode = $couriers[0]['courier_code'] ?? null; +$courierName = $couriers[0]['courier_name'] ?? 'Sconosciuto'; +if (!$courierCode) { + sendResponse(['success' => false, 'message' => 'Corriere non identificato']); +} + +// Step 2: Crea un tracking +$createUrl = 'https://api.trackingmore.com/v4/trackings/create'; +$createData = [ + 'tracking_number' => $trackingNumber, + 'courier_code' => $courierCode +]; +$createResponse = makeRequest($createUrl, $createData, $apiKey); +file_put_contents('debug.log', "Create Response: " . json_encode($createResponse) . "\n", FILE_APPEND); + +if (!$createResponse['success']) { + $errorMessage = isset($createResponse['meta']['message']) ? $createResponse['meta']['message'] : 'Errore sconosciuto'; + sendResponse(['success' => false, 'message' => 'Errore nella creazione del tracking: ' . $errorMessage]); +} + +// Step 3: Recupera i dettagli del tracking con riprova +$getUrl = 'https://api.trackingmore.com/v4/trackings/get?tracking_number=' . urlencode($trackingNumber); +$maxAttempts = 3; +$delaySeconds = 5; + +for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) { + $trackResponse = makeRequest($getUrl, [], $apiKey, 'GET'); + file_put_contents('debug.log', "Track Response (Attempt $attempt): " . json_encode($trackResponse) . "\n", FILE_APPEND); + + if ($trackResponse['success'] && !empty($trackResponse['data'])) { + break; + } + + if ($attempt < $maxAttempts) { + sleep($delaySeconds); + } +} + +if (!$trackResponse['success']) { + $errorMessage = isset($trackResponse['meta']['message']) ? $trackResponse['meta']['message'] : 'Errore sconosciuto'; + sendResponse(['success' => false, 'message' => 'Errore nel recupero delle informazioni: ' . $errorMessage]); +} + +$trackingInfo = $trackResponse['data'] ?? null; +if (!$trackingInfo) { + // Se ci sono più corrieri rilevati, restituisci una lista per la tendina + if (count($couriers) > 1) { + $possibleCarriers = array_map(function ($courier) { + return ['code' => $courier['courier_code'], 'name' => $courier['courier_name']]; + }, $couriers); + sendResponse([ + 'success' => false, + 'message' => 'Dati non trovati. Seleziona un corriere tra quelli rilevati.', + 'possibleCarriers' => $possibleCarriers + ]); + } + sendResponse(['success' => false, 'message' => 'Nessuna informazione di tracking trovata']); +} + +// Estrai la data di consegna e il firmatario +$deliveryDate = 'Non disponibile'; +$signedBy = 'Non disponibile'; +foreach ($trackingInfo['trackinfo'] as $checkpoint) { + if ($checkpoint['status'] === 'delivered') { + $deliveryDate = $checkpoint['Date']; + $signedBy = $checkpoint['signed_by'] ?? 'Non disponibile'; + break; + } +} + +// Restituisci i dati al frontend +sendResponse([ + 'success' => true, + 'deliveryDate' => $deliveryDate, + 'signedBy' => $signedBy, + 'carrierName' => $courierName +]); diff --git a/public/userarea/import_dashboard.php b/public/userarea/import_dashboard.php index b3c0ad0..7c1f5b7 100644 --- a/public/userarea/import_dashboard.php +++ b/public/userarea/import_dashboard.php @@ -20,12 +20,19 @@ padding: 20px; } + /* Definizione delle dimensioni */ /* Definizione delle dimensioni */ .btn-small { font-size: 12px; padding: 6px 12px; min-width: 100px; min-height: 30px; + display: flex; + /* Aggiunto */ + justify-content: center; + /* Aggiunto */ + align-items: center; + /* Aggiunto */ } .btn-medium { @@ -33,6 +40,12 @@ padding: 10px 20px; min-width: 130px; min-height: 45px; + display: flex; + /* Aggiunto */ + justify-content: center; + /* Aggiunto */ + align-items: center; + /* Aggiunto */ } .btn-large { @@ -40,6 +53,12 @@ padding: 14px 28px; min-width: 180px; min-height: 60px; + display: flex; + /* Aggiunto */ + justify-content: center; + /* Aggiunto */ + align-items: center; + /* Aggiunto */ } /* Stile della barra di ricerca */ diff --git a/public/userarea/import_edit.php b/public/userarea/import_edit.php new file mode 100644 index 0000000..41cd30b --- /dev/null +++ b/public/userarea/import_edit.php @@ -0,0 +1,1006 @@ +getConnection(); + +// Genera un UUID univoco per importreferencecode +$importReferenceCode = date('YmdHis') . '-' . uniqid(); + +// Recupera il mapping per il template +$stmt = $pdo->prepare("SELECT excel_column, mysql_column, data_type, is_required, default_value FROM excel_column_mappings WHERE template_id = ?"); +$stmt->execute([$template_id]); +$mappings = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if (empty($mappings)) { + header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Nessun mapping trovato per il template")); + exit; +} + +// Recupera il client_specific_fields dal template +$stmt = $pdo->prepare("SELECT client_specific_fields FROM excel_templates WHERE id = ?"); +$stmt->execute([$template_id]); +$template = $stmt->fetch(PDO::FETCH_ASSOC); +$clientSpecificFields = $template && !empty($template['client_specific_fields']) ? json_decode($template['client_specific_fields'], true) : []; + +// Crea un array per il mapping +$columnMapping = []; +foreach ($mappings as $mapping) { + $excelColumnIndex = array_search($mapping['excel_column'], $columns); + if ($excelColumnIndex !== false) { + $columnMapping[$excelColumnIndex] = [ + 'mysql_column' => $mapping['mysql_column'], + 'data_type' => $mapping['data_type'], + 'is_required' => $mapping['is_required'], + 'default_value' => $mapping['default_value'] + ]; + } +} + +// Inserisci le righe selezionate in datadb +$insertedIds = []; +foreach ($selected_rows as $rowIndex) { + $row = $rows[$rowIndex]; + $values = []; + $placeholders = []; + $columnsToInsert = []; + + foreach ($columnMapping as $excelIndex => $mapping) { + $mysqlColumn = $mapping['mysql_column']; + $value = $row[$excelIndex] ?? $mapping['default_value']; + + if ($mapping['is_required'] && (is_null($value) || $value === '')) { + $value = $mapping['default_value']; + if (is_null($value)) { + header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Valore richiesto mancante per la colonna $mysqlColumn")); + exit; + } + } + + switch ($mapping['data_type']) { + case 'INT': + $value = is_numeric($value) ? (int)$value : ($mapping['default_value'] ?? null); + break; + case 'DATE': + $value = !empty($value) ? date('Y-m-d', strtotime($value)) : ($mapping['default_value'] ?? null); + break; + case 'CHAR': + $value = !empty($value) ? substr($value, 0, 1) : ($mapping['default_value'] ?? null); + break; + case 'VARCHAR': + default: + $value = !empty($value) ? htmlspecialchars($value) : ($mapping['default_value'] ?? null); + break; + } + + if (!is_null($value)) { + $columnsToInsert[] = $mysqlColumn; + $placeholders[] = '?'; + $values[] = $value; + } + } + + $columnsToInsert[] = 'importreferencecode'; + $placeholders[] = '?'; + $values[] = $importReferenceCode; + + $columnsToInsert[] = 'filename_import'; + $placeholders[] = '?'; + $values[] = $newFilename; + + $columnsToInsert[] = 'status'; + $placeholders[] = '?'; + $values[] = 'i'; + + $columnsToInsert[] = 'user_id'; + $placeholders[] = '?'; + $values[] = $user_id; + + $columnsToInsert[] = 'limscode'; + $placeholders[] = '?'; + $values[] = null; + + $columnsToInsert[] = 'importdate'; + $placeholders[] = '?'; + $values[] = date('Y-m-d'); + + $sql = "INSERT INTO datadb (" . implode(', ', $columnsToInsert) . ") VALUES (" . implode(', ', $placeholders) . ")"; + $stmt = $pdo->prepare($sql); + $stmt->execute($values); + + $insertedIds[] = $pdo->lastInsertId(); +} + +// Recupera i dati appena inseriti con i nomi degli utenti +$stmt = $pdo->prepare(" + SELECT d.*, CONCAT(u.first_name, ' ', u.last_name) AS user_name + FROM datadb d + LEFT JOIN auth_users u ON d.user_id = u.id + WHERE d.iddatadb IN (" . implode(',', array_fill(0, count($insertedIds), '?')) . ") +"); +$stmt->execute($insertedIds); +$importedData = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// Recupera il mapping globale per mostrare gli slug leggibili +$stmt = $pdo->query("SELECT mysql_column_name, user_friendly_slug FROM column_mapping"); +$slugMapping = []; +foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { + $slugMapping[$row['mysql_column_name']] = $row['user_friendly_slug']; +} +?> + + + + +
+ + + + + + +