224 lines
11 KiB
PHP
224 lines
11 KiB
PHP
<?php
|
|
// Sopprime eventuali output di errori (li logghiamo invece di mostrarli)
|
|
ob_start();
|
|
ini_set('display_errors', 0);
|
|
error_reporting(E_ALL);
|
|
|
|
// Inizia la sessione
|
|
session_start();
|
|
|
|
// Includi PHPSpreadsheet e la classe DBHandler
|
|
require_once '../../vendor/autoload.php';
|
|
require_once __DIR__ . '/class/db-functions.php';
|
|
|
|
function findHeaderRow(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $worksheet, array $expectedHeaders, int $startCol, int $highestColIndex, int $maxRowsToScan = 20): ?int
|
|
{
|
|
$normalizedExpected = array_filter(array_map(function ($h) {
|
|
return strtolower(trim(str_replace(['\\r\\n', '\r\n', "\r\n", "\n", "\r"], ' ', $h)));
|
|
}, $expectedHeaders));
|
|
$normalizedExpected = array_values($normalizedExpected);
|
|
sort($normalizedExpected);
|
|
|
|
for ($row = 1; $row <= $maxRowsToScan; $row++) {
|
|
$rowHeaders = [];
|
|
for ($col = $startCol; $col <= $highestColIndex; $col++) {
|
|
$colLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
|
|
$cell = $worksheet->getCell($colLetter . $row);
|
|
$val = $cell ? trim((string)$cell->getCalculatedValue()) : '';
|
|
if ($val !== '') {
|
|
$rowHeaders[] = strtolower(trim(str_replace(["\r\n", "\n", "\r"], ' ', $val)));
|
|
}
|
|
}
|
|
$normalizedRow = $rowHeaders;
|
|
sort($normalizedRow);
|
|
|
|
$matches = count(array_intersect($normalizedExpected, $normalizedRow));
|
|
$threshold = (int) ceil(count($normalizedExpected) * 0.6);
|
|
if ($matches >= $threshold) {
|
|
return $row;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
$response = ['error' => '', 'rows' => [], 'columns' => [], 'template_id' => 0, 'filename' => '', 'apply_routine' => false];
|
|
|
|
try {
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['excel_file'])) {
|
|
$template_id = isset($_POST['template_id']) ? intval($_POST['template_id']) : 0;
|
|
$header_row = isset($_POST['header_row']) ? intval($_POST['header_row']) : 1;
|
|
$start_column = isset($_POST['start_column']) ? intval($_POST['start_column']) : 1;
|
|
|
|
// Debug del template_id ricevuto
|
|
error_log("Received template_id from POST: " . print_r($_POST['template_id'], true));
|
|
error_log("Converted template_id: $template_id");
|
|
|
|
$file = $_FILES['excel_file'];
|
|
$fileError = $file['error'];
|
|
|
|
if ($fileError === UPLOAD_ERR_OK) {
|
|
// Recupera l'ID dell'utente loggato
|
|
if (!isset($iduserlogin)) {
|
|
$iduserlogin = 1;
|
|
error_log("Warning: iduserlogin non definito, usando 1 come default");
|
|
}
|
|
|
|
// Genera il nome del file rinominato
|
|
$timestamp = date('YmdHis');
|
|
$originalFilename = basename($file['name']);
|
|
$newFilename = "{$iduserlogin}-{$timestamp}-{$originalFilename}";
|
|
$importFolder = __DIR__ . '/imported_trf/';
|
|
if (!file_exists($importFolder)) {
|
|
mkdir($importFolder, 0777, true);
|
|
}
|
|
$destination = $importFolder . $newFilename;
|
|
|
|
// Sposta il file
|
|
if (!move_uploaded_file($file['tmp_name'], $destination)) {
|
|
throw new Exception("Errore durante lo spostamento del file in $destination");
|
|
}
|
|
error_log("File spostato con successo in: $destination");
|
|
|
|
// Connessione al database
|
|
$db = DBHandlerSelect::getInstance();
|
|
$pdo = $db->getConnection();
|
|
|
|
// Recupera il mapping da template_mapping
|
|
$stmt = $pdo->prepare("SELECT field_id AS excel_column, field_id AS mysql_column, data_type, is_required, default_value, is_manual FROM template_mapping WHERE template_id = ?");
|
|
$stmt->execute([$template_id]);
|
|
$mappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Debug dei mapping
|
|
error_log("Mappings found for template_id $template_id: " . print_r($mappings, true));
|
|
|
|
if (empty($mappings)) {
|
|
$response['error'] = "Nessun mapping trovato per il template con ID $template_id";
|
|
} else {
|
|
// Carica il file rinominato con PHPSpreadsheet
|
|
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($destination);
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$highestRow = $worksheet->getHighestRow();
|
|
$highestColumn = $worksheet->getHighestColumn();
|
|
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
|
|
|
|
$startColumn = max(1, $start_column);
|
|
|
|
// Recupera routine e headers dal template — DEVE essere prima dell'auto-detect
|
|
$stmt = $pdo->prepare("SELECT idroutine, idclient, xls_headers FROM excel_templates WHERE id = ?");
|
|
$stmt->execute([$template_id]);
|
|
$template = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
error_log("=== DEBUG TEMPLATE ===");
|
|
error_log("template raw: " . print_r($template, true));
|
|
error_log("xls_headers value: " . var_export($template['xls_headers'] ?? 'KEY NON ESISTE', true));
|
|
error_log("xls_headers empty check: " . var_export(empty($template['xls_headers']), true));
|
|
// Auto-detect della riga header se xls_headers è disponibile
|
|
$detectedHeaderRow = $header_row;
|
|
if (!empty($template['xls_headers'])) {
|
|
$expectedHeaders = json_decode($template['xls_headers'], true);
|
|
if (is_array($expectedHeaders) && !empty($expectedHeaders)) {
|
|
error_log("Expected headers from DB: " . print_r($expectedHeaders, true));
|
|
$found = findHeaderRow($worksheet, $expectedHeaders, $startColumn, $highestColumnIndex);
|
|
error_log("findHeaderRow result: " . var_export($found, true));
|
|
if ($found !== null) {
|
|
$detectedHeaderRow = $found;
|
|
error_log("Header row auto-detected at row: $detectedHeaderRow (was: $header_row)");
|
|
} else {
|
|
error_log("Header row auto-detection failed, using provided header_row: $header_row");
|
|
}
|
|
}
|
|
}
|
|
$startRow = max(1, $detectedHeaderRow);
|
|
$header_row = $detectedHeaderRow;
|
|
|
|
// Debug dei parametri
|
|
error_log("Processing - template_id: $template_id, startRow: $startRow, startColumn: $startColumn, highestRow: $highestRow, highestColumn: $highestColumn, highestColumnIndex: $highestColumnIndex");
|
|
|
|
// Validazione degli indici
|
|
if ($startRow > $highestRow) {
|
|
$response['error'] = "La riga di partenza ($startRow) supera il numero totale di righe ($highestRow).";
|
|
} elseif ($startColumn > $highestColumnIndex) {
|
|
$response['error'] = "La colonna di partenza ($startColumn) supera il numero totale di colonne ($highestColumnIndex).";
|
|
} else {
|
|
$excelData = [];
|
|
// Estrai la riga degli header
|
|
$headerRowData = [];
|
|
for ($col = $startColumn; $col <= $highestColumnIndex; $col++) {
|
|
$columnLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
|
|
$cell = $worksheet->getCell($columnLetter . $header_row);
|
|
$cellValue = $cell ? $cell->getCalculatedValue() : '';
|
|
$headerRowData[] = htmlspecialchars($cellValue ?: '');
|
|
}
|
|
|
|
// Estrai i dati a partire dalla riga successiva, includendo excelrow
|
|
for ($row = $header_row + 1; $row <= $highestRow; $row++) {
|
|
$rowData = [];
|
|
for ($col = $startColumn; $col <= $highestColumnIndex; $col++) {
|
|
$columnLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
|
|
$cell = $worksheet->getCell($columnLetter . $row);
|
|
$cellValue = $cell ? $cell->getCalculatedValue() : '';
|
|
$rowData[] = htmlspecialchars($cellValue ?: '');
|
|
}
|
|
if (!empty(array_filter($rowData))) {
|
|
$excelData[] = ['data' => $rowData, 'excelrow' => $row];
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if ($template && $template['idroutine']) {
|
|
$stmtRoutine = $pdo->prepare("SELECT idroutine, name, filename, headerrow, instruction FROM routine WHERE idroutine = ?");
|
|
$stmtRoutine->execute([$template['idroutine']]);
|
|
$routineData = $stmtRoutine->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if ($routineData) {
|
|
$response['apply_routine'] = true;
|
|
$response['routine_data'] = [
|
|
'name' => $routineData['name'] ?? 'Routine Sconosciuta',
|
|
'instruction' => $routineData['instruction'] ?? 'Nessuna descrizione disponibile',
|
|
'filename' => $routineData['filename'] ?? '',
|
|
'headerrow' => $routineData['headerrow'] ?? $header_row
|
|
];
|
|
error_log("Routine rilevata per template {$template_id}: " . print_r($routineData, true));
|
|
} else {
|
|
error_log("Errore: Nessuna routine trovata per idroutine {$template['idroutine']}");
|
|
}
|
|
} else {
|
|
error_log("Nessuna routine associata al template {$template_id}");
|
|
}
|
|
|
|
// Aggiungi idclient alla risposta
|
|
$response['idclient'] = $template['idclient'] ?? null;
|
|
|
|
// Salva i dati in sessione
|
|
$_SESSION['excel_data'] = $excelData;
|
|
$_SESSION['template_id'] = $template_id;
|
|
$_SESSION['headers'] = $headerRowData;
|
|
$_SESSION['mappings'] = $mappings;
|
|
|
|
// Includi excel_data nella risposta JSON in ogni caso
|
|
$response['excel_data'] = $excelData;
|
|
$response['rows'] = array_column($excelData, 'data');
|
|
$response['columns'] = $headerRowData;
|
|
$response['template_id'] = $template_id;
|
|
$response['filename'] = $newFilename;
|
|
}
|
|
}
|
|
} else {
|
|
$response['error'] = "Errore nell'upload del file: Codice errore $fileError.";
|
|
}
|
|
} else {
|
|
$response['error'] = "Richiesta non valida.";
|
|
}
|
|
} catch (Exception $e) {
|
|
$response['error'] = "Errore durante il caricamento del file: " . $e->getMessage();
|
|
error_log("Exception in process_import_xls2.php: " . $e->getMessage());
|
|
}
|
|
|
|
// Pulisce qualsiasi output indesiderato
|
|
ob_end_clean();
|
|
|
|
// Invia la risposta JSON
|
|
header('Content-Type: application/json');
|
|
echo json_encode($response);
|
|
exit;
|