Files
trf_certest/public/userarea/import_pdf.php
T
2026-08-18 16:00:06 +02:00

321 lines
12 KiB
PHP

<?php
include('include/headscript.php');
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
header("Location: template_dashboard.php?status=error&message=" . urlencode("Invalid ID"));
exit;
}
$id = intval($_GET['id']);
$db = DBHandlerSelect::getInstance();
$pdo = $db->getConnection();
$stmt = $pdo->prepare("SELECT id, name, source_type, idclient, sample_pdf FROM excel_templates WHERE id = ?");
$stmt->execute([$id]);
$template = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$template) {
header("Location: template_dashboard.php?status=error&message=" . urlencode("Template not found"));
exit;
}
$sourceType = strtoupper($template['source_type'] ?? '');
if ($sourceType !== 'PDF') {
// Non è un template PDF: rimanda al flusso corretto
header("Location: import_xls2.php?id=" . $id);
exit;
}
// Conta i mapping con riquadri, per avvisare se non è configurato
$stmt = $pdo->prepare("SELECT COUNT(*) FROM template_mapping WHERE template_id = ? AND pdf_regions IS NOT NULL AND pdf_regions <> ''");
$stmt->execute([$id]);
$mappedRegions = (int)$stmt->fetchColumn();
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="assets/images/favicon-32x32.png" type="image/png" />
<?php include('cssinclude.php'); ?>
<title><?= htmlspecialchars($template['name']) ?> - PDF Import</title>
<style>
#dropZone {
border: 2px dashed #adb5bd;
border-radius: 10px;
padding: 40px 20px;
text-align: center;
color: #6c757d;
background: #f8f9fa;
cursor: pointer;
transition: background 0.15s, border-color 0.15s;
}
#dropZone.dragover {
background: #e7f1ff;
border-color: #0d6efd;
color: #0d6efd;
}
#dropZone .big {
font-size: 42px;
line-height: 1;
margin-bottom: 10px;
}
.file-row {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
border: 1px solid #e5e5e5;
border-radius: 8px;
margin-bottom: 8px;
font-size: 14px;
}
.file-row .status-icon {
font-size: 18px;
width: 24px;
text-align: center;
}
.file-row .fname {
font-weight: 600;
flex: 0 0 260px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-row .fvals {
flex: 1;
color: #555;
font-size: 13px;
}
.file-row.ok {
background: #eaffea;
}
.file-row.err {
background: #ffecec;
}
.file-row.pending {
background: #fff8e1;
}
.val-pair {
display: inline-block;
margin-right: 12px;
}
.val-pair b {
color: #333;
}
</style>
</head>
<body>
<div class="wrapper">
<?php include('include/navbar.php'); ?>
<?php include('include/topbar.php'); ?>
<div class="page-wrapper">
<div class="page-content">
<?php include('top_stat_widget.php'); ?>
<div class="card radius-10">
<div class="card-header">
<h6 class="mb-0"><?= htmlspecialchars($template['name']) ?> <span class="badge bg-danger">PDF</span></h6>
<small>Template ID: <?= $id ?> — Ogni PDF diventa una riga importata.</small>
</div>
<div class="card-body">
<?php if ($mappedRegions === 0): ?>
<div class="alert alert-warning">
Questo template non ha ancora riquadri PDF configurati. Configura il mapping prima di importare.
</div>
<?php endif; ?>
<div id="dropZone">
<div class="big">📄⬇</div>
<div><strong>Trascina qui i PDF</strong> oppure clicca per selezionarli</div>
<div style="font-size:13px; margin-top:6px;">Puoi caricarne più di uno insieme</div>
<input type="file" id="pdfInput" accept="application/pdf" multiple style="display:none;">
</div>
<div class="d-flex align-items-center justify-content-between mt-3">
<span class="badge bg-secondary" id="fileCount">0 file</span>
<button id="startImportBtn" class="btn btn-primary" disabled>Importa PDF</button>
</div>
<div id="fileList" class="mt-3"></div>
<div class="mt-4">
<a href="imported.php?id=<?= $id ?>" class="btn btn-warning">Vai agli Imported</a>
<a href="template_dashboard.php" class="btn btn-secondary">Dashboard</a>
</div>
</div>
</div>
</div>
</div>
<div class="overlay toggle-icon"></div>
<a href="javaScript:;" class="back-to-top"><i class='bx bxs-up-arrow-alt'></i></a>
<?php include('include/footer.php'); ?>
</div>
<?php include('jsinclude.php'); ?>
<script>
(function() {
const TEMPLATE_ID = <?= (int)$id ?>;
const dropZone = document.getElementById('dropZone');
const pdfInput = document.getElementById('pdfInput');
const fileList = document.getElementById('fileList');
const fileCount = document.getElementById('fileCount');
const startBtn = document.getElementById('startImportBtn');
let selectedFiles = [];
function updateCount() {
fileCount.textContent = selectedFiles.length + ' file';
startBtn.disabled = selectedFiles.length === 0;
}
function renderList() {
fileList.innerHTML = '';
selectedFiles.forEach((f, idx) => {
const row = document.createElement('div');
row.className = 'file-row pending';
row.id = 'file-row-' + idx;
row.innerHTML = `
<span class="status-icon">⏳</span>
<span class="fname">${escapeHtml(f.name)}</span>
<span class="fvals">In attesa...</span>
`;
fileList.appendChild(row);
});
}
function escapeHtml(s) {
const d = document.createElement('div');
d.textContent = s;
return d.innerHTML;
}
function addFiles(files) {
for (const f of files) {
if (f.type === 'application/pdf' || f.name.toLowerCase().endsWith('.pdf')) {
selectedFiles.push(f);
}
}
updateCount();
renderList();
}
// Click per selezionare
dropZone.addEventListener('click', () => pdfInput.click());
pdfInput.addEventListener('change', (e) => addFiles(e.target.files));
// Drag & drop
['dragenter', 'dragover'].forEach(ev => {
dropZone.addEventListener(ev, (e) => {
e.preventDefault();
e.stopPropagation();
dropZone.classList.add('dragover');
});
});
['dragleave', 'drop'].forEach(ev => {
dropZone.addEventListener(ev, (e) => {
e.preventDefault();
e.stopPropagation();
dropZone.classList.remove('dragover');
});
});
dropZone.addEventListener('drop', (e) => {
addFiles(e.dataTransfer.files);
});
// Genera un importreferencecode condiviso da tutto il gruppo
function makeImportRef() {
return new Date().toISOString().replace(/[-:.TZ]/g, '').slice(0, 14) +
'-' + Math.random().toString(36).slice(2, 10);
}
startBtn.addEventListener('click', async () => {
if (selectedFiles.length === 0) return;
startBtn.disabled = true;
startBtn.textContent = 'Importazione...';
const importRef = makeImportRef();
const formData = new FormData();
formData.append('template_id', TEMPLATE_ID);
formData.append('importreferencecode', importRef);
selectedFiles.forEach(f => formData.append('pdf_files[]', f));
// segna tutte le righe come "in corso"
selectedFiles.forEach((f, idx) => {
const row = document.getElementById('file-row-' + idx);
if (row) row.querySelector('.fvals').textContent = 'Elaborazione...';
});
try {
const resp = await fetch('process_import_pdf.php', {
method: 'POST',
body: formData
});
const data = await resp.json();
if (!data.ok) {
alert('Errore: ' + (data.error || 'sconosciuto'));
startBtn.disabled = false;
startBtn.textContent = 'Importa PDF';
return;
}
// Aggiorna ogni riga con l'esito (l'ordine dei results segue quello inviato)
data.results.forEach((res, idx) => {
const row = document.getElementById('file-row-' + idx);
if (!row) return;
const icon = row.querySelector('.status-icon');
const vals = row.querySelector('.fvals');
if (res.ok) {
row.className = 'file-row ok';
icon.textContent = '✅';
const pairs = Object.entries(res.values || {})
.map(([k, v]) => `<span class="val-pair"><b>${escapeHtml(k)}:</b> ${escapeHtml(v || '—')}</span>`)
.join('');
vals.innerHTML = pairs || 'Importato (nessun valore estratto)';
} else {
row.className = 'file-row err';
icon.textContent = '❌';
vals.textContent = res.error || 'Errore sconosciuto';
}
});
startBtn.textContent = 'Importa altri PDF';
startBtn.disabled = false;
// svuota la selezione (i file sono stati processati)
selectedFiles = [];
pdfInput.value = '';
updateCount();
} catch (err) {
console.error(err);
alert('Errore di rete durante l\'importazione.');
startBtn.disabled = false;
startBtn.textContent = 'Importa PDF';
}
});
})();
</script>
</body>
</html>