Compare commits
3 Commits
aa355905d7
...
56eee99a67
| Author | SHA1 | Date | |
|---|---|---|---|
| 56eee99a67 | |||
| f514b3d2c7 | |||
| a3eb0f0a57 |
@@ -26,6 +26,16 @@ $stmt = $pdo->prepare("SELECT * FROM routine");
|
|||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
$routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
// Retrieve active API/JSON configurations
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT id, name, provider_code, api_type, php_class_name
|
||||||
|
FROM api_configurations
|
||||||
|
WHERE is_active = 1
|
||||||
|
ORDER BY name ASC
|
||||||
|
");
|
||||||
|
$stmt->execute();
|
||||||
|
$apiConfigurations = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
$buttonBgPalette = [
|
$buttonBgPalette = [
|
||||||
'#0d6efd' => 'Blue',
|
'#0d6efd' => 'Blue',
|
||||||
'#6610f2' => 'Indigo',
|
'#6610f2' => 'Indigo',
|
||||||
@@ -181,6 +191,8 @@ if (!array_key_exists($currentButtonTextColor, array_change_key_case($buttonText
|
|||||||
<select name="source_type" id="sourceType" class="form-control" required>
|
<select name="source_type" id="sourceType" class="form-control" required>
|
||||||
<option value="XLS" <?php echo (($template['source_type'] ?? 'XLS') === 'XLS') ? 'selected' : ''; ?>>XLS</option>
|
<option value="XLS" <?php echo (($template['source_type'] ?? 'XLS') === 'XLS') ? 'selected' : ''; ?>>XLS</option>
|
||||||
<option value="API" <?php echo (($template['source_type'] ?? 'XLS') === 'API') ? 'selected' : ''; ?>>API</option>
|
<option value="API" <?php echo (($template['source_type'] ?? 'XLS') === 'API') ? 'selected' : ''; ?>>API</option>
|
||||||
|
<option value="JSON" <?php echo (($template['source_type'] ?? 'XLS') === 'JSON') ? 'selected' : ''; ?>>JSON</option>
|
||||||
|
<option value="PDF" <?php echo (($template['source_type'] ?? 'XLS') === 'PDF') ? 'selected' : ''; ?>>PDF</option>
|
||||||
</select>
|
</select>
|
||||||
<small class="text-muted">Choose the source used by this template</small>
|
<small class="text-muted">Choose the source used by this template</small>
|
||||||
</div>
|
</div>
|
||||||
@@ -195,6 +207,60 @@ if (!array_key_exists($currentButtonTextColor, array_change_key_case($buttonText
|
|||||||
<input type="text" name="start_column" id="startColumn" class="form-control" value="<?php echo htmlspecialchars($template['start_column'] ?? ''); ?>">
|
<input type="text" name="start_column" id="startColumn" class="form-control" value="<?php echo htmlspecialchars($template['start_column'] ?? ''); ?>">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3" id="xlsSheetNumberWrapper">
|
||||||
|
<label class="form-label">XLS Sheet Number</label>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
name="xls_sheet_index"
|
||||||
|
id="xlsSheetIndex"
|
||||||
|
class="form-control"
|
||||||
|
min="0"
|
||||||
|
value="<?php echo htmlspecialchars($template['xls_sheet_index'] ?? 0); ?>">
|
||||||
|
<small class="text-muted">
|
||||||
|
Use 0 for the first sheet, 1 for the second sheet, 2 for the third sheet, and so on.
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3" id="apiConfigWrapper" style="display: none;">
|
||||||
|
<label class="form-label">API / JSON Configuration *</label>
|
||||||
|
<select name="api_config_id" id="apiConfigSelect" class="form-control">
|
||||||
|
<option value="">Select an API configuration...</option>
|
||||||
|
|
||||||
|
<?php foreach ($apiConfigurations as $apiConfig): ?>
|
||||||
|
<?php
|
||||||
|
$apiLabelParts = [];
|
||||||
|
|
||||||
|
if (!empty($apiConfig['name'])) {
|
||||||
|
$apiLabelParts[] = $apiConfig['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($apiConfig['provider_code'])) {
|
||||||
|
$apiLabelParts[] = '[' . $apiConfig['provider_code'] . ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($apiConfig['api_type'])) {
|
||||||
|
$apiLabelParts[] = '(' . $apiConfig['api_type'] . ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($apiConfig['php_class_name'])) {
|
||||||
|
$apiLabelParts[] = '- ' . $apiConfig['php_class_name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$apiLabel = implode(' ', $apiLabelParts);
|
||||||
|
?>
|
||||||
|
|
||||||
|
<option
|
||||||
|
value="<?php echo (int)$apiConfig['id']; ?>"
|
||||||
|
<?php echo ((int)($template['api_config_id'] ?? 0) === (int)$apiConfig['id']) ? 'selected' : ''; ?>>
|
||||||
|
<?php echo htmlspecialchars($apiLabel, ENT_QUOTES, 'UTF-8'); ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
<small class="text-muted">
|
||||||
|
Select the API/JSON configuration linked to this template.
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label"><?= htmlspecialchars($desctemplate, ENT_QUOTES, 'UTF-8'); ?></label>
|
<label class="form-label"><?= htmlspecialchars($desctemplate, ENT_QUOTES, 'UTF-8'); ?></label>
|
||||||
<textarea name="description" class="form-control"><?php echo htmlspecialchars($template['description'] ?? ''); ?></textarea>
|
<textarea name="description" class="form-control"><?php echo htmlspecialchars($template['description'] ?? ''); ?></textarea>
|
||||||
@@ -335,10 +401,16 @@ if (!array_key_exists($currentButtonTextColor, array_change_key_case($buttonText
|
|||||||
const routineAction3 = document.getElementById("routineAction3");
|
const routineAction3 = document.getElementById("routineAction3");
|
||||||
|
|
||||||
const sourceType = document.getElementById("sourceType");
|
const sourceType = document.getElementById("sourceType");
|
||||||
|
|
||||||
const headerRowWrapper = document.getElementById("headerRowWrapper");
|
const headerRowWrapper = document.getElementById("headerRowWrapper");
|
||||||
const startColumnWrapper = document.getElementById("startColumnWrapper");
|
const startColumnWrapper = document.getElementById("startColumnWrapper");
|
||||||
|
const xlsSheetNumberWrapper = document.getElementById("xlsSheetNumberWrapper");
|
||||||
|
const apiConfigWrapper = document.getElementById("apiConfigWrapper");
|
||||||
|
|
||||||
const headerRow = document.getElementById("headerRow");
|
const headerRow = document.getElementById("headerRow");
|
||||||
const startColumn = document.getElementById("startColumn");
|
const startColumn = document.getElementById("startColumn");
|
||||||
|
const xlsSheetIndex = document.getElementById("xlsSheetIndex");
|
||||||
|
const apiConfigSelect = document.getElementById("apiConfigSelect");
|
||||||
|
|
||||||
const selectedClientId = <?php echo json_encode((int)($template['idclient'] ?? 0)); ?>;
|
const selectedClientId = <?php echo json_encode((int)($template['idclient'] ?? 0)); ?>;
|
||||||
const selectedSchemaId = <?php echo json_encode((int)($template['idschema'] ?? 0)); ?>;
|
const selectedSchemaId = <?php echo json_encode((int)($template['idschema'] ?? 0)); ?>;
|
||||||
@@ -358,27 +430,55 @@ if (!array_key_exists($currentButtonTextColor, array_change_key_case($buttonText
|
|||||||
allowClear: true
|
allowClear: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#apiConfigSelect').select2({
|
||||||
|
placeholder: "Select an API configuration...",
|
||||||
|
allowClear: true
|
||||||
|
});
|
||||||
|
|
||||||
function updateSourceFields() {
|
function updateSourceFields() {
|
||||||
const selectedSource = sourceType.value;
|
const selectedSource = sourceType.value;
|
||||||
|
|
||||||
if (selectedSource === 'API') {
|
const isXls = selectedSource === 'XLS';
|
||||||
headerRowWrapper.style.opacity = '0.6';
|
const isApiOrJson = selectedSource === 'API' || selectedSource === 'JSON';
|
||||||
startColumnWrapper.style.opacity = '0.6';
|
|
||||||
|
|
||||||
headerRow.required = false;
|
if (isXls) {
|
||||||
startColumn.required = false;
|
headerRowWrapper.style.display = 'block';
|
||||||
|
startColumnWrapper.style.display = 'block';
|
||||||
headerRow.disabled = true;
|
xlsSheetNumberWrapper.style.display = 'block';
|
||||||
startColumn.disabled = true;
|
|
||||||
} else {
|
|
||||||
headerRowWrapper.style.opacity = '1';
|
|
||||||
startColumnWrapper.style.opacity = '1';
|
|
||||||
|
|
||||||
headerRow.required = true;
|
headerRow.required = true;
|
||||||
startColumn.required = true;
|
startColumn.required = true;
|
||||||
|
|
||||||
headerRow.disabled = false;
|
headerRow.disabled = false;
|
||||||
startColumn.disabled = false;
|
startColumn.disabled = false;
|
||||||
|
xlsSheetIndex.disabled = false;
|
||||||
|
|
||||||
|
apiConfigWrapper.style.display = 'none';
|
||||||
|
apiConfigSelect.required = false;
|
||||||
|
apiConfigSelect.disabled = true;
|
||||||
|
$('#apiConfigSelect').val(null).trigger('change');
|
||||||
|
} else {
|
||||||
|
headerRowWrapper.style.display = 'none';
|
||||||
|
startColumnWrapper.style.display = 'none';
|
||||||
|
xlsSheetNumberWrapper.style.display = 'none';
|
||||||
|
|
||||||
|
headerRow.required = false;
|
||||||
|
startColumn.required = false;
|
||||||
|
|
||||||
|
headerRow.disabled = true;
|
||||||
|
startColumn.disabled = true;
|
||||||
|
xlsSheetIndex.disabled = true;
|
||||||
|
|
||||||
|
if (isApiOrJson) {
|
||||||
|
apiConfigWrapper.style.display = 'block';
|
||||||
|
apiConfigSelect.required = true;
|
||||||
|
apiConfigSelect.disabled = false;
|
||||||
|
} else {
|
||||||
|
apiConfigWrapper.style.display = 'none';
|
||||||
|
apiConfigSelect.required = false;
|
||||||
|
apiConfigSelect.disabled = true;
|
||||||
|
$('#apiConfigSelect').val(null).trigger('change');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,6 +704,28 @@ if (!array_key_exists($currentButtonTextColor, array_change_key_case($buttonText
|
|||||||
const routineId = routineSelect.value;
|
const routineId = routineSelect.value;
|
||||||
formData.append("idroutine", routineId);
|
formData.append("idroutine", routineId);
|
||||||
|
|
||||||
|
const selectedSource = sourceType.value;
|
||||||
|
|
||||||
|
if ((selectedSource === 'API' || selectedSource === 'JSON') && !apiConfigSelect.value) {
|
||||||
|
Swal.fire({
|
||||||
|
title: "Error!",
|
||||||
|
text: "Please select an API/JSON configuration.",
|
||||||
|
icon: "error",
|
||||||
|
confirmButtonText: "OK"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedSource === 'XLS' && xlsSheetIndex.value === '') {
|
||||||
|
Swal.fire({
|
||||||
|
title: "Error!",
|
||||||
|
text: "Please enter the XLS sheet number.",
|
||||||
|
icon: "error",
|
||||||
|
confirmButtonText: "OK"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fetch("process_edit_template_xls.php", {
|
fetch("process_edit_template_xls.php", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: formData
|
body: formData
|
||||||
|
|||||||
@@ -167,7 +167,12 @@ error_log("Loaded template: " . print_r($template, true));
|
|||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div>
|
<div>
|
||||||
<h6 class="mb-0"><?= htmlspecialchars($template['name']) ?></h6>
|
<h6 class="mb-0"><?= htmlspecialchars($template['name']) ?></h6>
|
||||||
<small>Template ID: <?= $id ?>, Start Row: <?= $template['header_row'] ?>, Start Column: <?= $template['start_column'] ?></small>
|
<small>
|
||||||
|
Template ID: <?= $id ?>,
|
||||||
|
Sheet Number: <?= (int)($template['xls_sheet_index'] ?? 0) ?>,
|
||||||
|
Start Row: <?= $template['header_row'] ?>,
|
||||||
|
Start Column: <?= $template['start_column'] ?>
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -244,8 +249,9 @@ error_log("Loaded template: " . print_r($template, true));
|
|||||||
const templateId = <?= $id ?>;
|
const templateId = <?= $id ?>;
|
||||||
console.log('Template ID passed to formData:', templateId);
|
console.log('Template ID passed to formData:', templateId);
|
||||||
formData.append('template_id', templateId);
|
formData.append('template_id', templateId);
|
||||||
formData.append('header_row', <?= $template['header_row'] ?>);
|
formData.append('header_row', <?= (int)$template['header_row'] ?>);
|
||||||
formData.append('start_column', <?= $template['start_column'] ?>);
|
formData.append('start_column', <?= json_encode($template['start_column']) ?>);
|
||||||
|
formData.append('xls_sheet_index', <?= (int)($template['xls_sheet_index'] ?? 0) ?>);
|
||||||
|
|
||||||
fetch('process_import_xls2.php', {
|
fetch('process_import_xls2.php', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
|||||||
@@ -3,9 +3,20 @@
|
|||||||
// Retrieve all routines from database
|
// Retrieve all routines from database
|
||||||
$db = DBHandlerSelect::getInstance();
|
$db = DBHandlerSelect::getInstance();
|
||||||
$pdo = $db->getConnection();
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
$stmt = $pdo->prepare("SELECT * FROM routine");
|
$stmt = $pdo->prepare("SELECT * FROM routine");
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
$routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
// Retrieve active API/JSON configurations
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT id, name, provider_code, api_type, php_class_name
|
||||||
|
FROM api_configurations
|
||||||
|
WHERE is_active = 1
|
||||||
|
ORDER BY name ASC
|
||||||
|
");
|
||||||
|
$stmt->execute();
|
||||||
|
$apiConfigurations = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
?>
|
?>
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
@@ -40,7 +51,8 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
<li>Template Name</li>
|
<li>Template Name</li>
|
||||||
<li>Source Type</li>
|
<li>Source Type</li>
|
||||||
<li>Schema and Client</li>
|
<li>Schema and Client</li>
|
||||||
<li>Row Header and Column Header only for XLS templates</li>
|
<li>Row Header, Column Header and Sheet Number only for XLS templates</li>
|
||||||
|
<li>API / JSON Configuration only for API / JSON templates</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -67,7 +79,8 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
<label class="form-label">Source Type *</label>
|
<label class="form-label">Source Type *</label>
|
||||||
<select name="source_type" id="sourceType" class="form-control" required>
|
<select name="source_type" id="sourceType" class="form-control" required>
|
||||||
<option value="XLS" selected>XLS</option>
|
<option value="XLS" selected>XLS</option>
|
||||||
<option value="API">API</option>
|
<option value="API">API / JSON</option>
|
||||||
|
<option value="PDF">PDF</option>
|
||||||
</select>
|
</select>
|
||||||
<small class="text-muted">Choose the source used by this template</small>
|
<small class="text-muted">Choose the source used by this template</small>
|
||||||
</div>
|
</div>
|
||||||
@@ -82,6 +95,58 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
<input type="text" name="start_column" id="startColumn" class="form-control" value="A" required>
|
<input type="text" name="start_column" id="startColumn" class="form-control" value="A" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3" id="xlsSheetNumberWrapper">
|
||||||
|
<label class="form-label">XLS Sheet Number</label>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
name="xls_sheet_index"
|
||||||
|
id="xlsSheetIndex"
|
||||||
|
class="form-control"
|
||||||
|
min="0"
|
||||||
|
value="0">
|
||||||
|
<small class="text-muted">
|
||||||
|
Use 0 for the first sheet, 1 for the second sheet, 2 for the third sheet, and so on.
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3" id="apiConfigWrapper" style="display: none;">
|
||||||
|
<label class="form-label">API / JSON Configuration *</label>
|
||||||
|
<select name="api_config_id" id="apiConfigSelect" class="form-control">
|
||||||
|
<option value="">Select an API configuration...</option>
|
||||||
|
|
||||||
|
<?php foreach ($apiConfigurations as $apiConfig): ?>
|
||||||
|
<?php
|
||||||
|
$apiLabelParts = [];
|
||||||
|
|
||||||
|
if (!empty($apiConfig['name'])) {
|
||||||
|
$apiLabelParts[] = $apiConfig['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($apiConfig['provider_code'])) {
|
||||||
|
$apiLabelParts[] = '[' . $apiConfig['provider_code'] . ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($apiConfig['api_type'])) {
|
||||||
|
$apiLabelParts[] = '(' . $apiConfig['api_type'] . ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($apiConfig['php_class_name'])) {
|
||||||
|
$apiLabelParts[] = '- ' . $apiConfig['php_class_name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$apiLabel = implode(' ', $apiLabelParts);
|
||||||
|
?>
|
||||||
|
|
||||||
|
<option value="<?php echo (int)$apiConfig['id']; ?>">
|
||||||
|
<?php echo htmlspecialchars($apiLabel, ENT_QUOTES, 'UTF-8'); ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
<small class="text-muted">
|
||||||
|
Select the API/JSON configuration linked to this template.
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label"><?= htmlspecialchars($desctemplate, ENT_QUOTES, 'UTF-8'); ?></label>
|
<label class="form-label"><?= htmlspecialchars($desctemplate, ENT_QUOTES, 'UTF-8'); ?></label>
|
||||||
<textarea name="description" class="form-control"></textarea>
|
<textarea name="description" class="form-control"></textarea>
|
||||||
@@ -185,10 +250,16 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
const routineAction3 = document.getElementById("routineAction3");
|
const routineAction3 = document.getElementById("routineAction3");
|
||||||
|
|
||||||
const sourceType = document.getElementById("sourceType");
|
const sourceType = document.getElementById("sourceType");
|
||||||
|
|
||||||
const headerRowWrapper = document.getElementById("headerRowWrapper");
|
const headerRowWrapper = document.getElementById("headerRowWrapper");
|
||||||
const startColumnWrapper = document.getElementById("startColumnWrapper");
|
const startColumnWrapper = document.getElementById("startColumnWrapper");
|
||||||
|
const xlsSheetNumberWrapper = document.getElementById("xlsSheetNumberWrapper");
|
||||||
|
const apiConfigWrapper = document.getElementById("apiConfigWrapper");
|
||||||
|
|
||||||
const headerRow = document.getElementById("headerRow");
|
const headerRow = document.getElementById("headerRow");
|
||||||
const startColumn = document.getElementById("startColumn");
|
const startColumn = document.getElementById("startColumn");
|
||||||
|
const xlsSheetIndex = document.getElementById("xlsSheetIndex");
|
||||||
|
const apiConfigSelect = document.getElementById("apiConfigSelect");
|
||||||
|
|
||||||
if (!form || !clientLoadingStatus || !schemaLoadingStatus || !routineSelect || !routineDetails) {
|
if (!form || !clientLoadingStatus || !schemaLoadingStatus || !routineSelect || !routineDetails) {
|
||||||
alert("Errore: Uno o più elementi della pagina non sono stati trovati. Contatta l'amministratore.");
|
alert("Errore: Uno o più elementi della pagina non sono stati trovati. Contatta l'amministratore.");
|
||||||
@@ -210,27 +281,57 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
allowClear: true
|
allowClear: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#apiConfigSelect').select2({
|
||||||
|
placeholder: "Select an API configuration...",
|
||||||
|
allowClear: true
|
||||||
|
});
|
||||||
|
|
||||||
function updateSourceFields() {
|
function updateSourceFields() {
|
||||||
const selectedSource = sourceType.value;
|
const selectedSource = sourceType.value;
|
||||||
|
|
||||||
if (selectedSource === 'API') {
|
const isXls = selectedSource === 'XLS';
|
||||||
headerRowWrapper.style.opacity = '0.6';
|
const isApiJson = selectedSource === 'API';
|
||||||
startColumnWrapper.style.opacity = '0.6';
|
|
||||||
|
|
||||||
headerRow.required = false;
|
if (isXls) {
|
||||||
startColumn.required = false;
|
headerRowWrapper.style.display = 'block';
|
||||||
|
startColumnWrapper.style.display = 'block';
|
||||||
headerRow.disabled = true;
|
xlsSheetNumberWrapper.style.display = 'block';
|
||||||
startColumn.disabled = true;
|
|
||||||
} else {
|
|
||||||
headerRowWrapper.style.opacity = '1';
|
|
||||||
startColumnWrapper.style.opacity = '1';
|
|
||||||
|
|
||||||
headerRow.required = true;
|
headerRow.required = true;
|
||||||
startColumn.required = true;
|
startColumn.required = true;
|
||||||
|
xlsSheetIndex.required = true;
|
||||||
|
|
||||||
headerRow.disabled = false;
|
headerRow.disabled = false;
|
||||||
startColumn.disabled = false;
|
startColumn.disabled = false;
|
||||||
|
xlsSheetIndex.disabled = false;
|
||||||
|
|
||||||
|
apiConfigWrapper.style.display = 'none';
|
||||||
|
apiConfigSelect.required = false;
|
||||||
|
apiConfigSelect.disabled = true;
|
||||||
|
$('#apiConfigSelect').val(null).trigger('change');
|
||||||
|
} else {
|
||||||
|
headerRowWrapper.style.display = 'none';
|
||||||
|
startColumnWrapper.style.display = 'none';
|
||||||
|
xlsSheetNumberWrapper.style.display = 'none';
|
||||||
|
|
||||||
|
headerRow.required = false;
|
||||||
|
startColumn.required = false;
|
||||||
|
xlsSheetIndex.required = false;
|
||||||
|
|
||||||
|
headerRow.disabled = true;
|
||||||
|
startColumn.disabled = true;
|
||||||
|
xlsSheetIndex.disabled = true;
|
||||||
|
|
||||||
|
if (isApiJson) {
|
||||||
|
apiConfigWrapper.style.display = 'block';
|
||||||
|
apiConfigSelect.required = true;
|
||||||
|
apiConfigSelect.disabled = false;
|
||||||
|
} else {
|
||||||
|
apiConfigWrapper.style.display = 'none';
|
||||||
|
apiConfigSelect.required = false;
|
||||||
|
apiConfigSelect.disabled = true;
|
||||||
|
$('#apiConfigSelect').val(null).trigger('change');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,7 +362,12 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
data.value.forEach(client => {
|
data.value.forEach(client => {
|
||||||
const nome = client.Nominativo || "Nome non disponibile";
|
const nome = client.Nominativo || "Nome non disponibile";
|
||||||
const id = client.IdCliente || "ID non disponibile";
|
const id = client.IdCliente || "ID non disponibile";
|
||||||
const option = new Option(`${nome.trim()} (ID: ${id})`, id);
|
|
||||||
|
const codiceCliente = (client.CodiceCliente ?? client.codiceCliente ?? "").toString().trim();
|
||||||
|
const suffix = (codiceCliente.split("_")[1] || "").trim();
|
||||||
|
const shortCode = suffix || (codiceCliente ? codiceCliente.charAt(0) : "--");
|
||||||
|
|
||||||
|
const option = new Option(`${nome.trim()} - ${shortCode} (ID: ${id})`, id);
|
||||||
select.add(option);
|
select.add(option);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -388,6 +494,28 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
|
|
||||||
let formData = new FormData(this);
|
let formData = new FormData(this);
|
||||||
|
|
||||||
|
const selectedSource = sourceType.value;
|
||||||
|
|
||||||
|
if (selectedSource === 'XLS' && xlsSheetIndex.value === '') {
|
||||||
|
Swal.fire({
|
||||||
|
title: "Errore!",
|
||||||
|
text: "Inserisci il numero del foglio XLS.",
|
||||||
|
icon: "error",
|
||||||
|
confirmButtonText: "OK"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedSource === 'API' && !apiConfigSelect.value) {
|
||||||
|
Swal.fire({
|
||||||
|
title: "Errore!",
|
||||||
|
text: "Seleziona una configurazione API / JSON.",
|
||||||
|
icon: "error",
|
||||||
|
confirmButtonText: "OK"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const clientSelect = document.getElementById("clientSelect");
|
const clientSelect = document.getElementById("clientSelect");
|
||||||
const clientId = clientSelect.value;
|
const clientId = clientSelect.value;
|
||||||
const selectedClientOption = clientSelect.options[clientSelect.selectedIndex];
|
const selectedClientOption = clientSelect.options[clientSelect.selectedIndex];
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ $stmt = $pdo->prepare("
|
|||||||
start_column,
|
start_column,
|
||||||
target_table,
|
target_table,
|
||||||
source_type,
|
source_type,
|
||||||
|
xls_sheet_index,
|
||||||
sample_xlsx,
|
sample_xlsx,
|
||||||
idclient,
|
idclient,
|
||||||
clientname,
|
clientname,
|
||||||
idschema,
|
idschema,
|
||||||
schemaname,
|
schemaname,
|
||||||
@@ -39,6 +40,14 @@ if (!in_array($sourceType, ['XLS', 'API', 'PDF'], true)) {
|
|||||||
$sourceType = 'XLS';
|
$sourceType = 'XLS';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$xlsSheetIndex = isset($template['xls_sheet_index']) && $template['xls_sheet_index'] !== null
|
||||||
|
? (int)$template['xls_sheet_index']
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
if ($xlsSheetIndex < 0) {
|
||||||
|
$xlsSheetIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
$clientName = $template['clientname'] ?: '';
|
$clientName = $template['clientname'] ?: '';
|
||||||
$schemaName = $template['schemaname'] ?: '';
|
$schemaName = $template['schemaname'] ?: '';
|
||||||
$schemajson = $template['schemajson'] ? json_decode($template['schemajson'], true) : [];
|
$schemajson = $template['schemajson'] ? json_decode($template['schemajson'], true) : [];
|
||||||
@@ -267,7 +276,8 @@ $apiSampleJson = $template['api_sample_json'] ?? '';
|
|||||||
Source: <strong><?php echo htmlspecialchars($sourceType); ?></strong>
|
Source: <strong><?php echo htmlspecialchars($sourceType); ?></strong>
|
||||||
<?php if ($sourceType === 'XLS'): ?>
|
<?php if ($sourceType === 'XLS'): ?>
|
||||||
|
|
|
|
||||||
Header Row: <span id="headerRow"><?php echo $template['header_row']; ?></span> |
|
Sheet Number: <span id="xlsSheetIndex"><?php echo (int)$xlsSheetIndex; ?></span> |
|
||||||
|
Header Row: <span id="headerRow"><?php echo (int)$template['header_row']; ?></span> |
|
||||||
Start Column: <span id="startColumn"><?php echo htmlspecialchars($template['start_column']); ?></span>
|
Start Column: <span id="startColumn"><?php echo htmlspecialchars($template['start_column']); ?></span>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</p>
|
</p>
|
||||||
@@ -656,7 +666,30 @@ $apiSampleJson = $template['api_sample_json'] ?? '';
|
|||||||
let workbook = XLSX.read(data, {
|
let workbook = XLSX.read(data, {
|
||||||
type: 'array'
|
type: 'array'
|
||||||
});
|
});
|
||||||
let sheet = workbook.Sheets[workbook.SheetNames[0]];
|
|
||||||
|
const selectedSheetIndex = <?php echo (int)$xlsSheetIndex; ?>;
|
||||||
|
|
||||||
|
if (!workbook.SheetNames || workbook.SheetNames.length === 0) {
|
||||||
|
alert("No sheets found in this XLS file.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!workbook.SheetNames[selectedSheetIndex]) {
|
||||||
|
alert(
|
||||||
|
"The selected sheet number " + selectedSheetIndex +
|
||||||
|
" does not exist in this XLS file. Available sheets: " +
|
||||||
|
workbook.SheetNames.map((name, index) => index + " = " + name).join(", ")
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedSheetName = workbook.SheetNames[selectedSheetIndex];
|
||||||
|
let sheet = workbook.Sheets[selectedSheetName];
|
||||||
|
|
||||||
|
console.log("Selected XLS sheet:", {
|
||||||
|
index: selectedSheetIndex,
|
||||||
|
name: selectedSheetName
|
||||||
|
});
|
||||||
|
|
||||||
// Read sheet range to determine column offset
|
// Read sheet range to determine column offset
|
||||||
const sheetRange = XLSX.utils.decode_range(sheet['!ref'] || 'A1');
|
const sheetRange = XLSX.utils.decode_range(sheet['!ref'] || 'A1');
|
||||||
@@ -745,7 +778,8 @@ $apiSampleJson = $template['api_sample_json'] ?? '';
|
|||||||
const uniqueLabels = [...new Set(knownLabels)];
|
const uniqueLabels = [...new Set(knownLabels)];
|
||||||
|
|
||||||
console.group('🔍 Auto-detect header row');
|
console.group('🔍 Auto-detect header row');
|
||||||
console.log('Sheet name:', workbook.SheetNames[0]);
|
console.log('Sheet index:', selectedSheetIndex);
|
||||||
|
console.log('Sheet name:', selectedSheetName);
|
||||||
console.log('Total rows in sheet:', sheetData.length);
|
console.log('Total rows in sheet:', sheetData.length);
|
||||||
console.log('Labels from schema field titles:', knownLabels);
|
console.log('Labels from schema field titles:', knownLabels);
|
||||||
console.log('Unique labels to match against:', uniqueLabels);
|
console.log('Unique labels to match against:', uniqueLabels);
|
||||||
@@ -884,8 +918,10 @@ $apiSampleJson = $template['api_sample_json'] ?? '';
|
|||||||
function saveXlsHeaders(headers, headerRow, startColumn) {
|
function saveXlsHeaders(headers, headerRow, startColumn) {
|
||||||
const payload = {
|
const payload = {
|
||||||
template_id: <?php echo $id; ?>,
|
template_id: <?php echo $id; ?>,
|
||||||
xls_headers: JSON.stringify(headers)
|
xls_headers: JSON.stringify(headers),
|
||||||
|
xls_sheet_index: <?php echo (int)$xlsSheetIndex; ?>
|
||||||
};
|
};
|
||||||
|
|
||||||
if (headerRow !== undefined) payload.header_row = headerRow;
|
if (headerRow !== undefined) payload.header_row = headerRow;
|
||||||
if (startColumn !== undefined) payload.start_column = startColumn;
|
if (startColumn !== undefined) payload.start_column = startColumn;
|
||||||
|
|
||||||
@@ -897,8 +933,18 @@ $apiSampleJson = $template['api_sample_json'] ?? '';
|
|||||||
body: JSON.stringify(payload)
|
body: JSON.stringify(payload)
|
||||||
}).then(response => response.json())
|
}).then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (!data.success) console.error("❌ Error saving XLS headers:", data.message);
|
if (!data.success) {
|
||||||
else console.log("✅ Saved headers, header_row:", headerRow, "start_column:", startColumn);
|
console.error("❌ Error saving XLS headers:", data.message);
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
"✅ Saved headers, header_row:",
|
||||||
|
headerRow,
|
||||||
|
"start_column:",
|
||||||
|
startColumn,
|
||||||
|
"xls_sheet_index:",
|
||||||
|
<?php echo (int)$xlsSheetIndex; ?>
|
||||||
|
);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.catch(error => console.error("❌ Fetch error:", error));
|
.catch(error => console.error("❌ Fetch error:", error));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,21 @@ try {
|
|||||||
$id = intval($_POST['id'] ?? 0);
|
$id = intval($_POST['id'] ?? 0);
|
||||||
$name = trim($_POST['name'] ?? '');
|
$name = trim($_POST['name'] ?? '');
|
||||||
$source_type = strtoupper(trim($_POST['source_type'] ?? 'XLS'));
|
$source_type = strtoupper(trim($_POST['source_type'] ?? 'XLS'));
|
||||||
$header_row = isset($_POST['header_row']) && $_POST['header_row'] !== '' ? intval($_POST['header_row']) : null;
|
|
||||||
|
$header_row = isset($_POST['header_row']) && $_POST['header_row'] !== ''
|
||||||
|
? intval($_POST['header_row'])
|
||||||
|
: null;
|
||||||
|
|
||||||
$start_column = trim($_POST['start_column'] ?? '');
|
$start_column = trim($_POST['start_column'] ?? '');
|
||||||
|
|
||||||
|
$xls_sheet_index = isset($_POST['xls_sheet_index']) && $_POST['xls_sheet_index'] !== ''
|
||||||
|
? intval($_POST['xls_sheet_index'])
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
$api_config_id = isset($_POST['api_config_id']) && $_POST['api_config_id'] !== ''
|
||||||
|
? intval($_POST['api_config_id'])
|
||||||
|
: null;
|
||||||
|
|
||||||
$description = trim($_POST['description'] ?? '');
|
$description = trim($_POST['description'] ?? '');
|
||||||
$target_table = trim($_POST['target_table'] ?? 'datadb');
|
$target_table = trim($_POST['target_table'] ?? 'datadb');
|
||||||
$idclient = intval($_POST['client_id'] ?? 0);
|
$idclient = intval($_POST['client_id'] ?? 0);
|
||||||
@@ -27,7 +40,8 @@ try {
|
|||||||
$button_text_color = trim($_POST['button_text_color'] ?? '#ffffff');
|
$button_text_color = trim($_POST['button_text_color'] ?? '#ffffff');
|
||||||
$button_label = trim($_POST['button_label'] ?? 'Click Me');
|
$button_label = trim($_POST['button_label'] ?? 'Click Me');
|
||||||
|
|
||||||
if (!in_array($source_type, ['XLS', 'API'], true)) {
|
// Allowed source types
|
||||||
|
if (!in_array($source_type, ['XLS', 'API', 'JSON', 'PDF'], true)) {
|
||||||
$source_type = 'XLS';
|
$source_type = 'XLS';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,18 +55,52 @@ try {
|
|||||||
if ($header_row === null || $header_row <= 0 || $start_column === '') {
|
if ($header_row === null || $header_row <= 0 || $start_column === '') {
|
||||||
throw new Exception("Header Row and Start Column are required for XLS templates.");
|
throw new Exception("Header Row and Start Column are required for XLS templates.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($xls_sheet_index < 0) {
|
||||||
|
throw new Exception("XLS Sheet Number cannot be negative.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$api_config_id = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// API templates do not require XLS coordinates
|
// API/JSON validation
|
||||||
if ($source_type === 'API') {
|
if ($source_type === 'API' || $source_type === 'JSON') {
|
||||||
|
if (empty($api_config_id)) {
|
||||||
|
throw new Exception("API/JSON configuration is required for API or JSON templates.");
|
||||||
|
}
|
||||||
|
|
||||||
$header_row = null;
|
$header_row = null;
|
||||||
$start_column = null;
|
$start_column = null;
|
||||||
|
$xls_sheet_index = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PDF currently does not require XLS coordinates or API configuration
|
||||||
|
if ($source_type === 'PDF') {
|
||||||
|
$header_row = null;
|
||||||
|
$start_column = null;
|
||||||
|
$xls_sheet_index = null;
|
||||||
|
$api_config_id = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Database connection
|
// Database connection
|
||||||
$db = DBHandlerSelect::getInstance();
|
$db = DBHandlerSelect::getInstance();
|
||||||
$pdo = $db->getConnection();
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
|
// Optional check: verify API configuration exists and is active
|
||||||
|
if ($api_config_id !== null) {
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM api_configurations
|
||||||
|
WHERE id = ?
|
||||||
|
AND is_active = 1
|
||||||
|
");
|
||||||
|
$stmt->execute([$api_config_id]);
|
||||||
|
|
||||||
|
if ((int)$stmt->fetchColumn() === 0) {
|
||||||
|
throw new Exception("Selected API/JSON configuration does not exist or is not active.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update template
|
// Update template
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
UPDATE excel_templates
|
UPDATE excel_templates
|
||||||
@@ -61,6 +109,8 @@ try {
|
|||||||
source_type = ?,
|
source_type = ?,
|
||||||
header_row = ?,
|
header_row = ?,
|
||||||
start_column = ?,
|
start_column = ?,
|
||||||
|
xls_sheet_index = ?,
|
||||||
|
api_config_id = ?,
|
||||||
description = ?,
|
description = ?,
|
||||||
target_table = ?,
|
target_table = ?,
|
||||||
idclient = ?,
|
idclient = ?,
|
||||||
@@ -81,6 +131,8 @@ try {
|
|||||||
$source_type,
|
$source_type,
|
||||||
$header_row,
|
$header_row,
|
||||||
$start_column,
|
$start_column,
|
||||||
|
$xls_sheet_index,
|
||||||
|
$api_config_id,
|
||||||
$description,
|
$description,
|
||||||
$target_table,
|
$target_table,
|
||||||
$idclient,
|
$idclient,
|
||||||
|
|||||||
@@ -11,17 +11,105 @@ session_start();
|
|||||||
require_once '../../vendor/autoload.php';
|
require_once '../../vendor/autoload.php';
|
||||||
require_once __DIR__ . '/class/db-functions.php';
|
require_once __DIR__ . '/class/db-functions.php';
|
||||||
|
|
||||||
$response = ['error' => '', 'rows' => [], 'columns' => [], 'template_id' => 0, 'filename' => '', 'apply_routine' => false];
|
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
||||||
|
|
||||||
|
$response = [
|
||||||
|
'error' => '',
|
||||||
|
'rows' => [],
|
||||||
|
'columns' => [],
|
||||||
|
'template_id' => 0,
|
||||||
|
'filename' => '',
|
||||||
|
'apply_routine' => false
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a column value to a PhpSpreadsheet 1-based column index.
|
||||||
|
* Accepted values:
|
||||||
|
* - "A" => 1
|
||||||
|
* - "B" => 2
|
||||||
|
* - "AA" => 27
|
||||||
|
* - "1" => 1
|
||||||
|
* - 1 => 1
|
||||||
|
*/
|
||||||
|
function normalizeColumnIndex($value): int
|
||||||
|
{
|
||||||
|
$value = trim((string)$value);
|
||||||
|
|
||||||
|
if ($value === '') {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctype_digit($value)) {
|
||||||
|
return max(1, (int)$value);
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = strtoupper($value);
|
||||||
|
|
||||||
|
if (preg_match('/^[A-Z]+$/', $value)) {
|
||||||
|
return Coordinate::columnIndexFromString($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['excel_file'])) {
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['excel_file'])) {
|
||||||
$template_id = isset($_POST['template_id']) ? intval($_POST['template_id']) : 0;
|
$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;
|
if ($template_id <= 0) {
|
||||||
|
throw new Exception("Template ID non valido.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connessione al database
|
||||||
|
$db = DBHandlerSelect::getInstance();
|
||||||
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Recuperiamo i parametri direttamente dal template.
|
||||||
|
* Così non dipendiamo solo dal form e siamo sicuri di usare i dati salvati.
|
||||||
|
*/
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
header_row,
|
||||||
|
start_column,
|
||||||
|
xls_sheet_index,
|
||||||
|
idroutine,
|
||||||
|
idclient
|
||||||
|
FROM excel_templates
|
||||||
|
WHERE id = ?
|
||||||
|
");
|
||||||
|
$stmt->execute([$template_id]);
|
||||||
|
$template = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
if (!$template) {
|
||||||
|
throw new Exception("Template non trovato.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$header_row = isset($template['header_row']) && $template['header_row'] !== null
|
||||||
|
? (int)$template['header_row']
|
||||||
|
: 1;
|
||||||
|
|
||||||
|
$start_column_raw = $template['start_column'] ?? 'A';
|
||||||
|
$start_column = normalizeColumnIndex($start_column_raw);
|
||||||
|
|
||||||
|
$xlsSheetIndex = isset($template['xls_sheet_index']) && $template['xls_sheet_index'] !== null
|
||||||
|
? (int)$template['xls_sheet_index']
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
if ($header_row <= 0) {
|
||||||
|
$header_row = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($xlsSheetIndex < 0) {
|
||||||
|
$xlsSheetIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Debug del template_id ricevuto
|
// Debug del template_id ricevuto
|
||||||
error_log("Received template_id from POST: " . print_r($_POST['template_id'], true));
|
error_log("Received template_id from POST: " . print_r($_POST['template_id'], true));
|
||||||
error_log("Converted template_id: $template_id");
|
error_log("Converted template_id: $template_id");
|
||||||
|
error_log("Template XLS settings - header_row: $header_row, start_column_raw: $start_column_raw, start_column_index: $start_column, xls_sheet_index: $xlsSheetIndex");
|
||||||
|
|
||||||
$file = $_FILES['excel_file'];
|
$file = $_FILES['excel_file'];
|
||||||
$fileError = $file['error'];
|
$fileError = $file['error'];
|
||||||
@@ -38,23 +126,32 @@ try {
|
|||||||
$originalFilename = basename($file['name']);
|
$originalFilename = basename($file['name']);
|
||||||
$newFilename = "{$iduserlogin}-{$timestamp}-{$originalFilename}";
|
$newFilename = "{$iduserlogin}-{$timestamp}-{$originalFilename}";
|
||||||
$importFolder = __DIR__ . '/imported_trf/';
|
$importFolder = __DIR__ . '/imported_trf/';
|
||||||
|
|
||||||
if (!file_exists($importFolder)) {
|
if (!file_exists($importFolder)) {
|
||||||
mkdir($importFolder, 0777, true);
|
mkdir($importFolder, 0777, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
$destination = $importFolder . $newFilename;
|
$destination = $importFolder . $newFilename;
|
||||||
|
|
||||||
// Sposta il file
|
// Sposta il file
|
||||||
if (!move_uploaded_file($file['tmp_name'], $destination)) {
|
if (!move_uploaded_file($file['tmp_name'], $destination)) {
|
||||||
throw new Exception("Errore durante lo spostamento del file in $destination");
|
throw new Exception("Errore durante lo spostamento del file in $destination");
|
||||||
}
|
}
|
||||||
|
|
||||||
error_log("File spostato con successo 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
|
// 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 = $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]);
|
$stmt->execute([$template_id]);
|
||||||
$mappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$mappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
@@ -65,19 +162,45 @@ try {
|
|||||||
$response['error'] = "Nessun mapping trovato per il template con ID $template_id";
|
$response['error'] = "Nessun mapping trovato per il template con ID $template_id";
|
||||||
} else {
|
} else {
|
||||||
// Carica il file rinominato con PHPSpreadsheet
|
// Carica il file rinominato con PHPSpreadsheet
|
||||||
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($destination);
|
$spreadsheet = IOFactory::load($destination);
|
||||||
$worksheet = $spreadsheet->getActiveSheet();
|
|
||||||
|
$sheetCount = $spreadsheet->getSheetCount();
|
||||||
|
$sheetNames = $spreadsheet->getSheetNames();
|
||||||
|
|
||||||
|
if ($sheetCount <= 0) {
|
||||||
|
throw new Exception("Il file XLS non contiene fogli.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($xlsSheetIndex >= $sheetCount) {
|
||||||
|
throw new Exception(
|
||||||
|
"Il foglio XLS selezionato non esiste. " .
|
||||||
|
"Sheet Number selezionato: {$xlsSheetIndex}. " .
|
||||||
|
"Fogli disponibili: " . implode(", ", array_map(
|
||||||
|
fn($name, $index) => "{$index}={$name}",
|
||||||
|
$sheetNames,
|
||||||
|
array_keys($sheetNames)
|
||||||
|
))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Usa il foglio configurato nel template
|
||||||
|
$worksheet = $spreadsheet->getSheet($xlsSheetIndex);
|
||||||
|
$selectedSheetName = $worksheet->getTitle();
|
||||||
|
|
||||||
|
error_log("Selected XLS sheet - index: {$xlsSheetIndex}, name: {$selectedSheetName}");
|
||||||
|
|
||||||
$highestRow = $worksheet->getHighestRow();
|
$highestRow = $worksheet->getHighestRow();
|
||||||
$highestColumn = $worksheet->getHighestColumn();
|
$highestColumn = $worksheet->getHighestColumn();
|
||||||
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
|
$highestColumnIndex = Coordinate::columnIndexFromString($highestColumn);
|
||||||
|
|
||||||
$startRow = max(1, $header_row);
|
$startRow = max(1, $header_row);
|
||||||
$startColumn = max(1, $start_column);
|
$startColumn = max(1, $start_column);
|
||||||
|
|
||||||
// Advance startColumn to first non-empty cell in header row (match JS behavior)
|
// Advance startColumn to first non-empty cell in header row, matching JS behavior
|
||||||
for ($sc = $startColumn; $sc <= $highestColumnIndex; $sc++) {
|
for ($sc = $startColumn; $sc <= $highestColumnIndex; $sc++) {
|
||||||
$cl = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($sc);
|
$cl = Coordinate::stringFromColumnIndex($sc);
|
||||||
$cv = trim((string)($worksheet->getCell($cl . $header_row)->getCalculatedValue() ?? ''));
|
$cv = trim((string)($worksheet->getCell($cl . $header_row)->getCalculatedValue() ?? ''));
|
||||||
|
|
||||||
if ($cv !== '') {
|
if ($cv !== '') {
|
||||||
$startColumn = $sc;
|
$startColumn = $sc;
|
||||||
break;
|
break;
|
||||||
@@ -85,24 +208,32 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Debug dei parametri
|
// Debug dei parametri
|
||||||
error_log("Processing - template_id: $template_id, startRow: $startRow, startColumn: $startColumn, highestRow: $highestRow, highestColumn: $highestColumn, highestColumnIndex: $highestColumnIndex");
|
error_log(
|
||||||
|
"Processing - template_id: $template_id, " .
|
||||||
|
"sheetIndex: $xlsSheetIndex, sheetName: $selectedSheetName, " .
|
||||||
|
"startRow: $startRow, startColumn: $startColumn, " .
|
||||||
|
"highestRow: $highestRow, highestColumn: $highestColumn, highestColumnIndex: $highestColumnIndex"
|
||||||
|
);
|
||||||
|
|
||||||
// Validazione degli indici
|
// Validazione degli indici
|
||||||
if ($startRow > $highestRow) {
|
if ($startRow > $highestRow) {
|
||||||
$response['error'] = "La riga di partenza ($startRow) supera il numero totale di righe ($highestRow).";
|
$response['error'] = "La riga di partenza ($startRow) supera il numero totale di righe ($highestRow) del foglio '$selectedSheetName'.";
|
||||||
} elseif ($startColumn > $highestColumnIndex) {
|
} elseif ($startColumn > $highestColumnIndex) {
|
||||||
$response['error'] = "La colonna di partenza ($startColumn) supera il numero totale di colonne ($highestColumnIndex).";
|
$response['error'] = "La colonna di partenza ($startColumn) supera il numero totale di colonne ($highestColumnIndex) del foglio '$selectedSheetName'.";
|
||||||
} else {
|
} else {
|
||||||
$excelData = [];
|
$excelData = [];
|
||||||
|
|
||||||
// Build merge map for header row: physCol -> mergeStartCol
|
// Build merge map for header row: physCol -> mergeStartCol
|
||||||
$mergeStartMap = [];
|
$mergeStartMap = [];
|
||||||
|
|
||||||
foreach ($worksheet->getMergeCells() as $range) {
|
foreach ($worksheet->getMergeCells() as $range) {
|
||||||
[$startCell, $endCell] = explode(':', $range);
|
[$startCell, $endCell] = explode(':', $range);
|
||||||
$mStartCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString(preg_replace('/\d+/', '', $startCell));
|
|
||||||
$mEndCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString(preg_replace('/\d+/', '', $endCell));
|
$mStartCol = Coordinate::columnIndexFromString(preg_replace('/\d+/', '', $startCell));
|
||||||
|
$mEndCol = Coordinate::columnIndexFromString(preg_replace('/\d+/', '', $endCell));
|
||||||
$mStartRow = (int)preg_replace('/[A-Z]+/i', '', $startCell);
|
$mStartRow = (int)preg_replace('/[A-Z]+/i', '', $startCell);
|
||||||
$mEndRow = (int)preg_replace('/[A-Z]+/i', '', $endCell);
|
$mEndRow = (int)preg_replace('/[A-Z]+/i', '', $endCell);
|
||||||
|
|
||||||
if ($header_row >= $mStartRow && $header_row <= $mEndRow) {
|
if ($header_row >= $mStartRow && $header_row <= $mEndRow) {
|
||||||
for ($c = $mStartCol; $c <= $mEndCol; $c++) {
|
for ($c = $mStartCol; $c <= $mEndCol; $c++) {
|
||||||
$mergeStartMap[$c] = $mStartCol;
|
$mergeStartMap[$c] = $mStartCol;
|
||||||
@@ -111,12 +242,17 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build logical columns: each merge = one column
|
// Build logical columns: each merge = one column
|
||||||
$logicalCols = []; // array of physical column indices (one per logical column)
|
$logicalCols = []; // array of physical column indices, one per logical column
|
||||||
$seen = [];
|
$seen = [];
|
||||||
|
|
||||||
for ($col = $startColumn; $col <= $highestColumnIndex; $col++) {
|
for ($col = $startColumn; $col <= $highestColumnIndex; $col++) {
|
||||||
if (isset($mergeStartMap[$col])) {
|
if (isset($mergeStartMap[$col])) {
|
||||||
$ms = $mergeStartMap[$col];
|
$ms = $mergeStartMap[$col];
|
||||||
if (in_array($ms, $seen, true)) continue;
|
|
||||||
|
if (in_array($ms, $seen, true)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$seen[] = $ms;
|
$seen[] = $ms;
|
||||||
$logicalCols[] = $ms;
|
$logicalCols[] = $ms;
|
||||||
} else {
|
} else {
|
||||||
@@ -127,38 +263,48 @@ try {
|
|||||||
// Build header row using logical columns
|
// Build header row using logical columns
|
||||||
$headerRowData = [];
|
$headerRowData = [];
|
||||||
$logicalNum = 0;
|
$logicalNum = 0;
|
||||||
|
|
||||||
foreach ($logicalCols as $physCol) {
|
foreach ($logicalCols as $physCol) {
|
||||||
$logicalNum++;
|
$logicalNum++;
|
||||||
$columnLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($physCol);
|
|
||||||
|
$columnLetter = Coordinate::stringFromColumnIndex($physCol);
|
||||||
$cell = $worksheet->getCell($columnLetter . $header_row);
|
$cell = $worksheet->getCell($columnLetter . $header_row);
|
||||||
$cellValue = trim((string)($cell ? $cell->getCalculatedValue() : ''));
|
$cellValue = trim((string)($cell ? $cell->getCalculatedValue() : ''));
|
||||||
$cellValue = preg_replace('/[\r\n\t]+/', ' ', $cellValue);
|
$cellValue = preg_replace('/[\r\n\t]+/', ' ', $cellValue);
|
||||||
|
|
||||||
// Empty headers get __empty_N__ to match mapping page
|
// Empty headers get __empty_N__ to match mapping page
|
||||||
$headerRowData[] = ($cellValue !== '') ? $cellValue : '__empty_' . $logicalNum . '__';
|
$headerRowData[] = ($cellValue !== '') ? $cellValue : '__empty_' . $logicalNum . '__';
|
||||||
}
|
}
|
||||||
|
|
||||||
error_log("Logical headers: " . json_encode($headerRowData));
|
error_log("Logical headers: " . json_encode($headerRowData));
|
||||||
error_log("Logical cols (physical indices): " . json_encode($logicalCols));
|
error_log("Logical cols physical indices: " . json_encode($logicalCols));
|
||||||
|
|
||||||
// Find which logical columns have real headers
|
// Find which logical columns have real headers
|
||||||
$headerFilledIndices = [];
|
$headerFilledIndices = [];
|
||||||
|
|
||||||
foreach ($headerRowData as $idx => $hVal) {
|
foreach ($headerRowData as $idx => $hVal) {
|
||||||
if (!str_starts_with($hVal, '__empty_')) $headerFilledIndices[] = $idx;
|
if (!str_starts_with($hVal, '__empty_')) {
|
||||||
|
$headerFilledIndices[] = $idx;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$minFilled = max(1, min(2, count($headerFilledIndices)));
|
$minFilled = max(1, min(2, count($headerFilledIndices)));
|
||||||
|
|
||||||
// Extract data rows using logical columns
|
// Extract data rows using logical columns
|
||||||
for ($row = $startRow + 1; $row <= $highestRow; $row++) {
|
for ($row = $startRow + 1; $row <= $highestRow; $row++) {
|
||||||
$rowData = [];
|
$rowData = [];
|
||||||
|
|
||||||
foreach ($logicalCols as $physCol) {
|
foreach ($logicalCols as $physCol) {
|
||||||
$columnLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($physCol);
|
$columnLetter = Coordinate::stringFromColumnIndex($physCol);
|
||||||
$cell = $worksheet->getCell($columnLetter . $row);
|
$cell = $worksheet->getCell($columnLetter . $row);
|
||||||
$cellValue = $cell ? $cell->getCalculatedValue() : '';
|
$cellValue = $cell ? $cell->getCalculatedValue() : '';
|
||||||
|
|
||||||
$rowData[] = $cellValue ?: '';
|
$rowData[] = $cellValue ?: '';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count how many header columns have data in this row
|
// Count how many header columns have data in this row
|
||||||
$filledCount = 0;
|
$filledCount = 0;
|
||||||
|
|
||||||
foreach ($headerFilledIndices as $idx) {
|
foreach ($headerFilledIndices as $idx) {
|
||||||
if (isset($rowData[$idx]) && trim((string)$rowData[$idx]) !== '') {
|
if (isset($rowData[$idx]) && trim((string)$rowData[$idx]) !== '') {
|
||||||
$filledCount++;
|
$filledCount++;
|
||||||
@@ -166,17 +312,25 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($filledCount >= $minFilled) {
|
if ($filledCount >= $minFilled) {
|
||||||
$excelData[] = ['data' => $rowData, 'excelrow' => $row];
|
$excelData[] = [
|
||||||
|
'data' => $rowData,
|
||||||
|
'excelrow' => $row
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recupera routine dal template
|
// Recupera routine dal template
|
||||||
$stmt = $pdo->prepare("SELECT idroutine, idclient FROM excel_templates WHERE id = ?");
|
if ($template && !empty($template['idroutine'])) {
|
||||||
$stmt->execute([$template_id]);
|
$stmtRoutine = $pdo->prepare("
|
||||||
$template = $stmt->fetch(PDO::FETCH_ASSOC);
|
SELECT
|
||||||
|
idroutine,
|
||||||
if ($template && $template['idroutine']) {
|
name,
|
||||||
$stmtRoutine = $pdo->prepare("SELECT idroutine, name, filename, headerrow, instruction FROM routine WHERE idroutine = ?");
|
filename,
|
||||||
|
headerrow,
|
||||||
|
instruction
|
||||||
|
FROM routine
|
||||||
|
WHERE idroutine = ?
|
||||||
|
");
|
||||||
$stmtRoutine->execute([$template['idroutine']]);
|
$stmtRoutine->execute([$template['idroutine']]);
|
||||||
$routineData = $stmtRoutine->fetch(PDO::FETCH_ASSOC);
|
$routineData = $stmtRoutine->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
@@ -188,6 +342,7 @@ try {
|
|||||||
'filename' => $routineData['filename'] ?? '',
|
'filename' => $routineData['filename'] ?? '',
|
||||||
'headerrow' => $routineData['headerrow'] ?? $header_row
|
'headerrow' => $routineData['headerrow'] ?? $header_row
|
||||||
];
|
];
|
||||||
|
|
||||||
error_log("Routine rilevata per template {$template_id}: " . print_r($routineData, true));
|
error_log("Routine rilevata per template {$template_id}: " . print_r($routineData, true));
|
||||||
} else {
|
} else {
|
||||||
error_log("Errore: Nessuna routine trovata per idroutine {$template['idroutine']}");
|
error_log("Errore: Nessuna routine trovata per idroutine {$template['idroutine']}");
|
||||||
@@ -204,6 +359,8 @@ try {
|
|||||||
$_SESSION['template_id'] = $template_id;
|
$_SESSION['template_id'] = $template_id;
|
||||||
$_SESSION['headers'] = $headerRowData;
|
$_SESSION['headers'] = $headerRowData;
|
||||||
$_SESSION['mappings'] = $mappings;
|
$_SESSION['mappings'] = $mappings;
|
||||||
|
$_SESSION['xls_sheet_index'] = $xlsSheetIndex;
|
||||||
|
$_SESSION['xls_sheet_name'] = $selectedSheetName;
|
||||||
|
|
||||||
// Includi excel_data nella risposta JSON in ogni caso
|
// Includi excel_data nella risposta JSON in ogni caso
|
||||||
$response['excel_data'] = $excelData;
|
$response['excel_data'] = $excelData;
|
||||||
@@ -211,6 +368,8 @@ try {
|
|||||||
$response['columns'] = $headerRowData;
|
$response['columns'] = $headerRowData;
|
||||||
$response['template_id'] = $template_id;
|
$response['template_id'] = $template_id;
|
||||||
$response['filename'] = $newFilename;
|
$response['filename'] = $newFilename;
|
||||||
|
$response['xls_sheet_index'] = $xlsSheetIndex;
|
||||||
|
$response['xls_sheet_name'] = $selectedSheetName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -12,22 +12,39 @@ try {
|
|||||||
// Retrieve and sanitize form data
|
// Retrieve and sanitize form data
|
||||||
$name = trim($_POST['name'] ?? '');
|
$name = trim($_POST['name'] ?? '');
|
||||||
$source_type = strtoupper(trim($_POST['source_type'] ?? 'XLS'));
|
$source_type = strtoupper(trim($_POST['source_type'] ?? 'XLS'));
|
||||||
$header_row = isset($_POST['header_row']) && $_POST['header_row'] !== '' ? intval($_POST['header_row']) : null;
|
|
||||||
|
$header_row = isset($_POST['header_row']) && $_POST['header_row'] !== ''
|
||||||
|
? intval($_POST['header_row'])
|
||||||
|
: null;
|
||||||
|
|
||||||
$start_column = trim($_POST['start_column'] ?? '');
|
$start_column = trim($_POST['start_column'] ?? '');
|
||||||
|
|
||||||
|
$xls_sheet_index = isset($_POST['xls_sheet_index']) && $_POST['xls_sheet_index'] !== ''
|
||||||
|
? intval($_POST['xls_sheet_index'])
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
$api_config_id = isset($_POST['api_config_id']) && $_POST['api_config_id'] !== ''
|
||||||
|
? intval($_POST['api_config_id'])
|
||||||
|
: null;
|
||||||
|
|
||||||
$description = trim($_POST['description'] ?? '');
|
$description = trim($_POST['description'] ?? '');
|
||||||
$target_table = trim($_POST['target_table'] ?? 'datadb');
|
$target_table = trim($_POST['target_table'] ?? 'datadb');
|
||||||
$idclient = intval($_POST['client_id'] ?? 0);
|
$idclient = intval($_POST['client_id'] ?? 0);
|
||||||
$clientname = trim($_POST['client_name'] ?? '');
|
$clientname = trim($_POST['client_name'] ?? '');
|
||||||
$idschema = intval($_POST['idschema'] ?? 0);
|
$idschema = intval($_POST['idschema'] ?? 0);
|
||||||
$schemaname = trim($_POST['schemaname'] ?? '');
|
$schemaname = trim($_POST['schemaname'] ?? '');
|
||||||
$idroutine = isset($_POST['idroutine']) && $_POST['idroutine'] !== '' ? intval($_POST['idroutine']) : null;
|
$idroutine = isset($_POST['idroutine']) && $_POST['idroutine'] !== ''
|
||||||
|
? intval($_POST['idroutine'])
|
||||||
|
: null;
|
||||||
|
|
||||||
$button_size = trim($_POST['button_size'] ?? 'medium');
|
$button_size = trim($_POST['button_size'] ?? 'medium');
|
||||||
$button_bg_color = trim($_POST['button_bg_color'] ?? '#007bff');
|
$button_bg_color = trim($_POST['button_bg_color'] ?? '#007bff');
|
||||||
$button_text_color = trim($_POST['button_text_color'] ?? '#ffffff');
|
$button_text_color = trim($_POST['button_text_color'] ?? '#ffffff');
|
||||||
$button_label = trim($_POST['button_label'] ?? 'Click Me');
|
$button_label = trim($_POST['button_label'] ?? 'Click Me');
|
||||||
|
|
||||||
// Normalize source type
|
// Normalize source type
|
||||||
if (!in_array($source_type, ['XLS', 'API'], true)) {
|
// API / JSON is saved as API
|
||||||
|
if (!in_array($source_type, ['XLS', 'API', 'PDF'], true)) {
|
||||||
$source_type = 'XLS';
|
$source_type = 'XLS';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,26 +58,62 @@ try {
|
|||||||
if ($header_row === null || $header_row <= 0 || $start_column === '') {
|
if ($header_row === null || $header_row <= 0 || $start_column === '') {
|
||||||
throw new Exception("Header Row and Start Column are required for XLS templates.");
|
throw new Exception("Header Row and Start Column are required for XLS templates.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($xls_sheet_index < 0) {
|
||||||
|
throw new Exception("XLS Sheet Number cannot be negative.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$api_config_id = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// API templates do not require XLS coordinates
|
// API / JSON validation
|
||||||
if ($source_type === 'API') {
|
if ($source_type === 'API') {
|
||||||
|
if (empty($api_config_id)) {
|
||||||
|
throw new Exception("API / JSON configuration is required for API / JSON templates.");
|
||||||
|
}
|
||||||
|
|
||||||
$header_row = null;
|
$header_row = null;
|
||||||
$start_column = null;
|
$start_column = null;
|
||||||
|
$xls_sheet_index = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PDF currently does not require XLS coordinates or API configuration
|
||||||
|
if ($source_type === 'PDF') {
|
||||||
|
$header_row = null;
|
||||||
|
$start_column = null;
|
||||||
|
$xls_sheet_index = null;
|
||||||
|
$api_config_id = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Database connection
|
// Database connection
|
||||||
$db = DBHandlerSelect::getInstance();
|
$db = DBHandlerSelect::getInstance();
|
||||||
$pdo = $db->getConnection();
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
|
// Optional check: verify API configuration exists and is active
|
||||||
|
if ($api_config_id !== null) {
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM api_configurations
|
||||||
|
WHERE id = ?
|
||||||
|
AND is_active = 1
|
||||||
|
");
|
||||||
|
$stmt->execute([$api_config_id]);
|
||||||
|
|
||||||
|
if ((int)$stmt->fetchColumn() === 0) {
|
||||||
|
throw new Exception("Selected API / JSON configuration does not exist or is not active.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Insert the new template
|
// Insert the new template
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
INSERT INTO excel_templates
|
INSERT INTO excel_templates
|
||||||
(
|
(
|
||||||
name,
|
name,
|
||||||
source_type,
|
source_type,
|
||||||
header_row,
|
header_row,
|
||||||
start_column,
|
start_column,
|
||||||
|
xls_sheet_index,
|
||||||
|
api_config_id,
|
||||||
description,
|
description,
|
||||||
target_table,
|
target_table,
|
||||||
idclient,
|
idclient,
|
||||||
@@ -75,7 +128,13 @@ try {
|
|||||||
created_at,
|
created_at,
|
||||||
updated_at
|
updated_at
|
||||||
)
|
)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())
|
VALUES
|
||||||
|
(
|
||||||
|
?, ?, ?, ?, ?, ?,
|
||||||
|
?, ?, ?, ?, ?, ?,
|
||||||
|
?, ?, ?, ?, ?,
|
||||||
|
NOW(), NOW()
|
||||||
|
)
|
||||||
");
|
");
|
||||||
|
|
||||||
$stmt->execute([
|
$stmt->execute([
|
||||||
@@ -83,6 +142,8 @@ try {
|
|||||||
$source_type,
|
$source_type,
|
||||||
$header_row,
|
$header_row,
|
||||||
$start_column,
|
$start_column,
|
||||||
|
$xls_sheet_index,
|
||||||
|
$api_config_id,
|
||||||
$description,
|
$description,
|
||||||
$target_table,
|
$target_table,
|
||||||
$idclient,
|
$idclient,
|
||||||
|
|||||||
@@ -170,10 +170,30 @@ try {
|
|||||||
|
|
||||||
$newDataType = $custom_field['Tipo'] ?? 'Testo';
|
$newDataType = $custom_field['Tipo'] ?? 'Testo';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Required logic:
|
||||||
|
* First read SchemiCustomFieldsDettagli.ObbligatorioWeb.
|
||||||
|
*
|
||||||
|
* Values:
|
||||||
|
* - "Si" => required for this schema
|
||||||
|
* - "No" => not required for this schema
|
||||||
|
* - "Predefinito" => use CustomField.ObbligatorioWeb
|
||||||
|
*/
|
||||||
|
$schemaRequired = trim((string)($field['ObbligatorioWeb'] ?? 'Predefinito'));
|
||||||
|
$customRequired = !empty($custom_field['ObbligatorioWeb']);
|
||||||
|
|
||||||
|
if (strcasecmp($schemaRequired, 'Si') === 0) {
|
||||||
|
$isRequired = 1;
|
||||||
|
} elseif (strcasecmp($schemaRequired, 'No') === 0) {
|
||||||
|
$isRequired = 0;
|
||||||
|
} else {
|
||||||
|
$isRequired = $customRequired ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
':schema_id' => $schema_id,
|
':schema_id' => $schema_id,
|
||||||
':data_type' => $newDataType,
|
':data_type' => $newDataType,
|
||||||
':is_required' => !empty($custom_field['ObbligatorioWeb']) ? 1 : 0,
|
':is_required' => $isRequired,
|
||||||
':default_value' => $custom_field['ValoreDefault'] ?? null,
|
':default_value' => $custom_field['ValoreDefault'] ?? null,
|
||||||
':has_list' => !empty($custom_field['Elenco']) ? 1 : 0,
|
':has_list' => !empty($custom_field['Elenco']) ? 1 : 0,
|
||||||
':length' => $custom_field['Lunghezza'] ?? 0,
|
':length' => $custom_field['Lunghezza'] ?? 0,
|
||||||
@@ -182,7 +202,7 @@ try {
|
|||||||
':max_value' => $custom_field['Massimo'] ?? null,
|
':max_value' => $custom_field['Massimo'] ?? null,
|
||||||
':default_curr_date' => !empty($custom_field['DefaultCurrDate']) ? 1 : 0,
|
':default_curr_date' => !empty($custom_field['DefaultCurrDate']) ? 1 : 0,
|
||||||
':tablename' => $target_table,
|
':tablename' => $target_table,
|
||||||
':field_label' => $custom_field['TitoloTraduzione'] ?? ''
|
':field_label' => $custom_field['TitoloTraduzione'] ?? $custom_field['Titolo'] ?? ''
|
||||||
];
|
];
|
||||||
|
|
||||||
$checkStmt->execute([$template_id, $fieldId]);
|
$checkStmt->execute([$template_id, $fieldId]);
|
||||||
@@ -234,7 +254,6 @@ try {
|
|||||||
|
|
||||||
$response["success"] = true;
|
$response["success"] = true;
|
||||||
$response["message"] = "Schema JSON updated, mappings synchronized, removed fields deleted, and changed fields updated successfully.";
|
$response["message"] = "Schema JSON updated, mappings synchronized, removed fields deleted, and changed fields updated successfully.";
|
||||||
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
if (isset($pdo) && $pdo->inTransaction()) {
|
if (isset($pdo) && $pdo->inTransaction()) {
|
||||||
$pdo->rollback();
|
$pdo->rollback();
|
||||||
@@ -243,4 +262,4 @@ try {
|
|||||||
$response["message"] = $e->getMessage();
|
$response["message"] = $e->getMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
echo json_encode($response);
|
echo json_encode($response);
|
||||||
|
|||||||
@@ -6,22 +6,57 @@ error_reporting(E_ALL);
|
|||||||
|
|
||||||
require_once(__DIR__ . '/class/db-functions.php');
|
require_once(__DIR__ . '/class/db-functions.php');
|
||||||
|
|
||||||
$db = DBHandlerSelect::getInstance();
|
|
||||||
$pdo = $db->getConnection();
|
|
||||||
|
|
||||||
$data = json_decode(file_get_contents("php://input"), true);
|
|
||||||
|
|
||||||
if (!$data || !isset($data['template_id'], $data['xls_headers'])) {
|
|
||||||
echo json_encode(["success" => false, "message" => "Invalid or missing data"]);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$templateId = $data['template_id'];
|
|
||||||
$xlsHeaders = $data['xls_headers'];
|
|
||||||
$headerRow = isset($data['header_row']) ? (int)$data['header_row'] : null;
|
|
||||||
$startColumn = isset($data['start_column']) ? (int)$data['start_column'] : null;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
$db = DBHandlerSelect::getInstance();
|
||||||
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
|
$data = json_decode(file_get_contents("php://input"), true);
|
||||||
|
|
||||||
|
if (!$data || !isset($data['template_id'], $data['xls_headers'])) {
|
||||||
|
echo json_encode(["success" => false, "message" => "Invalid or missing data"]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$templateId = (int)$data['template_id'];
|
||||||
|
$xlsHeaders = $data['xls_headers'];
|
||||||
|
|
||||||
|
$headerRow = isset($data['header_row']) && $data['header_row'] !== ''
|
||||||
|
? (int)$data['header_row']
|
||||||
|
: null;
|
||||||
|
|
||||||
|
$startColumn = isset($data['start_column']) && $data['start_column'] !== ''
|
||||||
|
? (int)$data['start_column']
|
||||||
|
: null;
|
||||||
|
|
||||||
|
$xlsSheetIndex = isset($data['xls_sheet_index']) && $data['xls_sheet_index'] !== ''
|
||||||
|
? (int)$data['xls_sheet_index']
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if ($templateId <= 0) {
|
||||||
|
echo json_encode(["success" => false, "message" => "Invalid template ID"]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($xlsHeaders === '') {
|
||||||
|
echo json_encode(["success" => false, "message" => "XLS headers cannot be empty"]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($headerRow !== null && $headerRow <= 0) {
|
||||||
|
echo json_encode(["success" => false, "message" => "Header row must be greater than 0"]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($startColumn !== null && $startColumn <= 0) {
|
||||||
|
echo json_encode(["success" => false, "message" => "Start column must be greater than 0"]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($xlsSheetIndex !== null && $xlsSheetIndex < 0) {
|
||||||
|
echo json_encode(["success" => false, "message" => "XLS sheet number cannot be negative"]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
$sql = "UPDATE excel_templates SET xls_headers = ?";
|
$sql = "UPDATE excel_templates SET xls_headers = ?";
|
||||||
$params = [$xlsHeaders];
|
$params = [$xlsHeaders];
|
||||||
|
|
||||||
@@ -29,11 +64,18 @@ try {
|
|||||||
$sql .= ", header_row = ?";
|
$sql .= ", header_row = ?";
|
||||||
$params[] = $headerRow;
|
$params[] = $headerRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($startColumn !== null) {
|
if ($startColumn !== null) {
|
||||||
$sql .= ", start_column = ?";
|
$sql .= ", start_column = ?";
|
||||||
$params[] = $startColumn;
|
$params[] = $startColumn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($xlsSheetIndex !== null) {
|
||||||
|
$sql .= ", xls_sheet_index = ?";
|
||||||
|
$params[] = $xlsSheetIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= ", updated_at = NOW()";
|
||||||
$sql .= " WHERE id = ?";
|
$sql .= " WHERE id = ?";
|
||||||
$params[] = $templateId;
|
$params[] = $templateId;
|
||||||
|
|
||||||
@@ -45,8 +87,18 @@ try {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
echo json_encode(["success" => true, "message" => "XLS headers saved successfully"]);
|
echo json_encode([
|
||||||
|
"success" => true,
|
||||||
|
"message" => "XLS headers saved successfully",
|
||||||
|
"debug" => [
|
||||||
|
"template_id" => $templateId,
|
||||||
|
"header_row" => $headerRow,
|
||||||
|
"start_column" => $startColumn,
|
||||||
|
"xls_sheet_index" => $xlsSheetIndex
|
||||||
|
]
|
||||||
|
]);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
echo json_encode(["success" => false, "message" => "Error: " . $e->getMessage()]);
|
echo json_encode(["success" => false, "message" => "Error: " . $e->getMessage()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
exit;
|
exit;
|
||||||
|
|||||||
Reference in New Issue
Block a user