Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e3994d6f9f | |||
| 9af0df3cca | |||
| 48d2a3ff42 | |||
| cf44e67922 | |||
| 35021e9d9b | |||
| 497ebda65a | |||
| b0024edb70 | |||
| b9852ba226 | |||
| 407d6884a1 | |||
| 1a4beadbb2 | |||
| 4bb0445cff | |||
| 73dd8f4ce8 | |||
| bdc4e0e60c | |||
| ef8f2d8000 | |||
| 74c9a1d02a | |||
| cd3bccd183 | |||
| 78154e43a9 | |||
| 9fe9243e60 | |||
| a8330d4aba | |||
| 82d6a2ee18 | |||
| d8eddb3aa5 | |||
| f60dc64b2d | |||
| 4e4cae1df8 | |||
| 8838edf3a1 | |||
| e75be99e43 | |||
| a482d975da | |||
| 6ec0c2062e | |||
| 03771e3ca8 |
+7
-18
@@ -7,9 +7,9 @@ LOG_CHANNEL=stack
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST="localhost"
|
||||
DB_DATABASE="trfcertest"
|
||||
DB_USERNAME="solocla"
|
||||
DB_PASSWORD="xxxxxxx"
|
||||
DB_DATABASE="xxxx"
|
||||
DB_USERNAME="xxxx"
|
||||
DB_PASSWORD="xxxxx"
|
||||
DB_PREFIX="auth_"
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
@@ -41,19 +41,8 @@ MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
# Credenziali API VisualLims
|
||||
SIMULATE_EXPORT_LIMS=true
|
||||
API_BASE_URL=https://93.43.5.102/limsapi
|
||||
API_USERNAME=xxxx
|
||||
API_PASSWORD=XXXX
|
||||
API_BASE_URL=https://bvcpsitaly-elims.com/limsapi
|
||||
API_USERNAME=WebApiUser
|
||||
API_PASSWORD=webapiuser01
|
||||
|
||||
BASE_URL=http://localhost:8000/userarea/
|
||||
|
||||
# Credenziali ENTRAID
|
||||
|
||||
AZURE_CLIENT_ID=your-client-id
|
||||
AZURE_CLIENT_SECRET=your-client-secret
|
||||
AZURE_REDIRECT_URI=https://your-app.com/auth/azure/callback
|
||||
AZURE_TENANT_ID=
|
||||
|
||||
MICROSOFT_CLIENT_ID=your_client_id_here
|
||||
MICROSOFT_CLIENT_SECRET=your_client_secret_here
|
||||
MICROSOFT_REDIRECT_URI="${APP_URL}/auth/microsoft/callback"
|
||||
BASE_URL=http://localhost:8000/userarea/
|
||||
+32
-43
@@ -1,66 +1,55 @@
|
||||
.DS_Store
|
||||
|
||||
/node_modules
|
||||
/public/hot
|
||||
/public/storage
|
||||
/storage/*.key
|
||||
/vendor
|
||||
|
||||
/.idea
|
||||
/.fleet
|
||||
/.vscode
|
||||
/.vagrant
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
.env
|
||||
.phpunit.result.cache
|
||||
.php_cs.cache
|
||||
/documentation
|
||||
/.phpunit.cache
|
||||
|
||||
/public/hot
|
||||
/public/storage
|
||||
/public/build
|
||||
|
||||
/storage/*.key
|
||||
|
||||
.env
|
||||
.env.backup
|
||||
.env.production
|
||||
auth.json
|
||||
# File di debug e temporanei JSON e log
|
||||
|
||||
.phpunit.result.cache
|
||||
.php_cs.cache
|
||||
/.phpunit.cache
|
||||
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
|
||||
/documentation
|
||||
|
||||
# --- Runtime / Debug (userarea) ---
|
||||
/public/userarea/*.json
|
||||
/public/userarea/*.log
|
||||
/public/userarea/*.txt
|
||||
|
||||
# File di log nella sottocartella class
|
||||
/public/userarea/*_response.json
|
||||
/public/userarea/error_log.txt
|
||||
/public/userarea/import_debug.log
|
||||
/public/userarea/last_url.txt
|
||||
/public/userarea/logaspi/
|
||||
/public/userarea/logsapi/
|
||||
/public/userarea/photostrf/
|
||||
/public/userarea/class/*.log
|
||||
/public/userarea/class/curl_auth_debug.log
|
||||
/public/userarea/class/curl_request_debug.log
|
||||
|
||||
# File XLSX temporanei importati
|
||||
/public/userarea/imported_trf/*.xlsx
|
||||
/public/userarea/xlstemplates/*.xlsx
|
||||
|
||||
# Ignora cartelle di foto generate
|
||||
# Cartelle foto generate
|
||||
/public/photostrf/
|
||||
/public/photostrf/qrcodes/
|
||||
public/userarea/import_debug.log
|
||||
public/userarea/last_url.txt
|
||||
public/userarea/class/curl_auth_debug.log
|
||||
public/userarea/class/curl_request_debug.log
|
||||
public/userarea/last_url.txt
|
||||
public/userarea/class/curl_auth_debug.log
|
||||
public/userarea/class/curl_request_debug.log
|
||||
|
||||
# Ignora tutti i log
|
||||
*.log
|
||||
|
||||
|
||||
# Ignora cartella photostrf in public/userarea
|
||||
/public/userarea/photostrf/
|
||||
public/userarea/customfield_values_response.json
|
||||
/public/userarea/logaspi/
|
||||
|
||||
public/userarea/logsapi/campione_762_1.json
|
||||
public/userarea/logsapi/campione_763_1.json
|
||||
public/userarea/logsapi/campione_762_2.json
|
||||
public/userarea/logsapi/campione_763_2.json
|
||||
public/userarea/logsapi/commessaweb_create_762.json
|
||||
public/userarea/logsapi/commessaweb_create_763.json
|
||||
public/userarea/logsapi/commessaweb_customfields_762.json
|
||||
public/userarea/logsapi/commessaweb_customfields_763.json
|
||||
public/userarea/logsapi/commessaweb_invia_762.json
|
||||
public/userarea/logsapi/commessaweb_invia_763.json
|
||||
public/userarea/logsapi/last_auth_url.txt
|
||||
# Ignora tutti i log ovunque
|
||||
*.log
|
||||
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
require_once(__DIR__ . '/include/headscript.php'); // Auth + $iduserlogin + DBHandlerSelect
|
||||
|
||||
try {
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
throw new Exception('Invalid request method');
|
||||
}
|
||||
|
||||
$iddatadb = isset($_POST['iddatadb']) ? (int)$_POST['iddatadb'] : 0;
|
||||
|
||||
if ($iddatadb <= 0) {
|
||||
throw new Exception('Missing iddatadb');
|
||||
}
|
||||
|
||||
// ✅ Supporta sia singola stringa (con |) che array part_descriptions[]
|
||||
$parts = [];
|
||||
|
||||
if (isset($_POST['part_descriptions']) && is_array($_POST['part_descriptions'])) {
|
||||
$parts = $_POST['part_descriptions'];
|
||||
} else {
|
||||
$raw = isset($_POST['part_description']) ? (string)$_POST['part_description'] : '';
|
||||
// split su "|" per multi-part
|
||||
$parts = preg_split('/\s*\|\s*/', $raw);
|
||||
}
|
||||
|
||||
// normalizza: trim + rimuovi vuoti + dedup
|
||||
$cleanParts = [];
|
||||
foreach ($parts as $p) {
|
||||
$p = trim((string)$p);
|
||||
if ($p === '') continue;
|
||||
|
||||
// limita lunghezza come da DB varchar(255)
|
||||
if (mb_strlen($p) > 255) {
|
||||
$p = mb_substr($p, 0, 255);
|
||||
}
|
||||
$cleanParts[] = $p;
|
||||
}
|
||||
$cleanParts = array_values(array_unique($cleanParts));
|
||||
|
||||
if (count($cleanParts) === 0) {
|
||||
throw new Exception('Part description is empty');
|
||||
}
|
||||
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
try {
|
||||
// prende il prossimo part_number per iddatadb
|
||||
$stmtMax = $pdo->prepare("SELECT COALESCE(MAX(part_number), 0) AS maxnum FROM identification_parts WHERE iddatadb = ?");
|
||||
$stmtMax->execute([$iddatadb]);
|
||||
$nextNumber = (int)$stmtMax->fetchColumn() + 1;
|
||||
|
||||
$stmtIns = $pdo->prepare("
|
||||
INSERT INTO identification_parts (iddatadb, part_number, part_description)
|
||||
VALUES (?, ?, ?)
|
||||
");
|
||||
|
||||
$insertedIds = [];
|
||||
|
||||
foreach ($cleanParts as $p) {
|
||||
$ok = $stmtIns->execute([$iddatadb, $nextNumber, $p]);
|
||||
if (!$ok) {
|
||||
throw new Exception('Insert failed');
|
||||
}
|
||||
$insertedIds[] = $pdo->lastInsertId();
|
||||
$nextNumber++;
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Parts added',
|
||||
'count' => count($insertedIds),
|
||||
'ids' => $insertedIds
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
if ($pdo->inTransaction()) $pdo->rollBack();
|
||||
throw $e;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['success' => false, 'message' => $e->getMessage()]);
|
||||
}
|
||||
exit;
|
||||
@@ -798,6 +798,48 @@ $(document).ready(function () {
|
||||
});
|
||||
}
|
||||
|
||||
function enableDragDropPartsList() {
|
||||
const list = $("#partsListAnnotations");
|
||||
if (!list.length || typeof $.ui === "undefined" || !$.ui.sortable) {
|
||||
console.warn("jQuery UI o .sortable non disponibile. Ritento...");
|
||||
setTimeout(enableDragDropPartsList, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
if (list.hasClass("ui-sortable")) {
|
||||
list.sortable("destroy"); // evita duplicati
|
||||
}
|
||||
|
||||
list.sortable({
|
||||
items: "li.list-group-item",
|
||||
placeholder: "list-group-item placeholder",
|
||||
axis: "y",
|
||||
containment: "parent",
|
||||
tolerance: "pointer",
|
||||
start: function (e, ui) {
|
||||
ui.item.addClass("dragging");
|
||||
},
|
||||
stop: function (e, ui) {
|
||||
ui.item.removeClass("dragging");
|
||||
const newOrder = [];
|
||||
list.find("li").each(function () {
|
||||
const partNumber = $(this).data("part-number");
|
||||
const part = partsListData.find(
|
||||
(p) => p.part_number == partNumber,
|
||||
);
|
||||
if (part) newOrder.push(part);
|
||||
});
|
||||
partsListData = newOrder;
|
||||
console.log(
|
||||
"Ordine parti aggiornato:",
|
||||
partsListData.map((p) => p.part_number),
|
||||
);
|
||||
markUnsaved();
|
||||
updateMarkers();
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// Delegazione evento per il checkbox
|
||||
$(document)
|
||||
.off("change.showMix", "#showMixPartsAnnotations")
|
||||
@@ -830,6 +872,7 @@ $(document).ready(function () {
|
||||
}
|
||||
updatePartsList();
|
||||
updateMarkers();
|
||||
setTimeout(enableDragDropPartsList, 50);
|
||||
if (
|
||||
photoAnnotations[$("#samplePhotoAnnotations").attr("src")]
|
||||
?.hasDescriptions
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
require_once(__DIR__ . '/include/headscript.php');
|
||||
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
$templateId = (int)($input['template_id'] ?? 0);
|
||||
|
||||
if ($templateId <= 0) {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid template_id']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// If already exists, do nothing
|
||||
$stmt = $pdo->prepare("SELECT COUNT(*) FROM template_fixed_mapping WHERE template_id = ?");
|
||||
$stmt->execute([$templateId]);
|
||||
if ((int)$stmt->fetchColumn() > 0) {
|
||||
echo json_encode(['success' => true, 'created' => 0, 'message' => 'Fixed fields already exist']);
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* FIXED FIELDS STANDARD (no UI selection)
|
||||
* is_manual always 1
|
||||
* is_visible_import default 1
|
||||
*/
|
||||
$fixedFields = [
|
||||
// fixed_field_key, data_type
|
||||
['ClienteResponsabile', 'INT'],
|
||||
['MoltiplicatorePrezzo', 'INT'],
|
||||
['AnagraficaCertestObject', 'INT'],
|
||||
['AnagraficaCertestService', 'INT'],
|
||||
['ConsegnaRichiesta', 'DATE'],
|
||||
];
|
||||
|
||||
|
||||
try {
|
||||
$pdo->beginTransaction();
|
||||
|
||||
$ins = $pdo->prepare("
|
||||
INSERT INTO template_fixed_mapping
|
||||
(template_id, fixed_field_key, is_manual, data_type, is_required, default_value, is_visible_import)
|
||||
VALUES
|
||||
(:template_id, :fixed_field_key, 1, :data_type, 1, NULL, 1)
|
||||
");
|
||||
|
||||
|
||||
foreach ($fixedFields as $f) {
|
||||
$ins->execute([
|
||||
':template_id' => $templateId,
|
||||
':fixed_field_key' => $f[0],
|
||||
':data_type' => $f[1],
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
// Return rows (for client render)
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT id, template_id, fixed_field_key, is_manual, data_type, is_required, default_value, is_visible_import
|
||||
FROM template_fixed_mapping
|
||||
WHERE template_id = ?
|
||||
ORDER BY id ASC
|
||||
");
|
||||
|
||||
$stmt->execute([$templateId]);
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo json_encode(['success' => true, 'created' => count($rows), 'rows' => $rows]);
|
||||
} catch (Exception $e) {
|
||||
if ($pdo->inTransaction()) $pdo->rollBack();
|
||||
echo json_encode(['success' => false, 'message' => $e->getMessage()]);
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -12,3 +12,303 @@
|
||||
2025-08-26 16:49:24 - Risposta non JSON valida: <?xml version="1.0" encoding="utf-8"?><edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx"><edmx:DataServices><Schema Namespace="DevExpress.ExpressApp.SystemModule" xmlns="http://docs.oasis-open.org/odata/ns/edm"><EntityType Name="DashboardViewItemDescriptor"><Key><PropertyRef Name="ViewId" /></Key><Property Name="ViewId" Type="Edm.String" Nullable="false" /></EntityType><EntityType Name="DashboardOrganizationItem" BaseType="DevExpress.ExpressApp.NonPersistentLiteObject" Abstract="true"><Property Name="Visibility" Type="DevExpress.ExpressApp.Editors.ViewItemVisibility" Nullable="false" /></EntityType><EntityType Name="DashboardOrganizationItem_1OfIModelDashboardViewItem" BaseType="DevExpress.ExpressApp.SystemModule.DashboardOrganizationItem" Abstract="true" /><EntityType Name="ViewDashboardOrganizationItem" BaseType="DevExpress.ExpressApp.SystemModule.DashboardOrganizationItem_1OfIModelDashboardViewItem"><Property Name="ObjectType" Type="System.Type" /><Proper
|
||||
2025-08-26 16:50:23 - Risposta non JSON valida: <?xml version="1.0" encoding="utf-8"?><edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx"><edmx:DataServices><Schema Namespace="DevExpress.ExpressApp.SystemModule" xmlns="http://docs.oasis-open.org/odata/ns/edm"><EntityType Name="DashboardViewItemDescriptor"><Key><PropertyRef Name="ViewId" /></Key><Property Name="ViewId" Type="Edm.String" Nullable="false" /></EntityType><EntityType Name="DashboardOrganizationItem" BaseType="DevExpress.ExpressApp.NonPersistentLiteObject" Abstract="true"><Property Name="Visibility" Type="DevExpress.ExpressApp.Editors.ViewItemVisibility" Nullable="false" /></EntityType><EntityType Name="DashboardOrganizationItem_1OfIModelDashboardViewItem" BaseType="DevExpress.ExpressApp.SystemModule.DashboardOrganizationItem" Abstract="true" /><EntityType Name="ViewDashboardOrganizationItem" BaseType="DevExpress.ExpressApp.SystemModule.DashboardOrganizationItem_1OfIModelDashboardViewItem"><Property Name="ObjectType" Type="System.Type" /><Proper
|
||||
2025-09-08 08:39:17 - Risposta non JSON valida: <?xml version="1.0" encoding="utf-8"?><edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx"><edmx:DataServices><Schema Namespace="DevExpress.ExpressApp.SystemModule" xmlns="http://docs.oasis-open.org/odata/ns/edm"><EntityType Name="DashboardViewItemDescriptor"><Key><PropertyRef Name="ViewId" /></Key><Property Name="ViewId" Type="Edm.String" Nullable="false" /></EntityType><EntityType Name="DashboardOrganizationItem" BaseType="DevExpress.ExpressApp.NonPersistentLiteObject" Abstract="true"><Property Name="Visibility" Type="DevExpress.ExpressApp.Editors.ViewItemVisibility" Nullable="false" /></EntityType><EntityType Name="DashboardOrganizationItem_1OfIModelDashboardViewItem" BaseType="DevExpress.ExpressApp.SystemModule.DashboardOrganizationItem" Abstract="true" /><EntityType Name="ViewDashboardOrganizationItem" BaseType="DevExpress.ExpressApp.SystemModule.DashboardOrganizationItem_1OfIModelDashboardViewItem"><Property Name="ObjectType" Type="System.Type" /><Proper
|
||||
2026-01-27 15:33:53 - Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-27 15:34:06 - Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-27 15:34:10 - Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-27 15:35:13 - Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-29 14:33:38 [ClienteResponsabile] Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-29 14:33:39 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-01-29 14:34:04 [ClienteResponsabile] Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-29 14:37:29 [ClienteResponsabile] Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-29 14:41:55 [ClienteResponsabile] Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-29 14:42:03 [ClienteResponsabile] Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-29 14:42:52 [ClienteResponsabile] Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-29 14:43:00 [ClienteResponsabile] Errore nel recupero dati: HTTP 404, Risposta:
|
||||
2026-01-30 10:50:43 [AnagraficaCertestService] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-01-30 10:50:43 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-01-30 11:09:22 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-02-19 10:00:13 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-02-19 10:00:42 [AnagraficaCertestObject] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-02-19 10:00:44 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-02-23 10:44:04 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:42 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:43 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:43 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:43 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:52 [AnagraficaCertestObject] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:44:53 [AnagraficaCertestService] Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:48:26 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:48:26 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:48:27 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:48:27 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:48:27 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:49:04 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:49:04 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:49:04 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:49:05 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 10:49:05 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 14:26:52 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 14:26:59 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 15:54:16 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 16:22:45 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-23 16:32:17 - Autenticazione fallita: HTTP 404, Errore cURL: , Risposta: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
|
||||
<HTML><HEAD><TITLE>Not Found</TITLE>
|
||||
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
|
||||
<BODY><h2>Not Found</h2>
|
||||
<hr><p>HTTP Error 404. The requested resource is not found.</p>
|
||||
</BODY></HTML>
|
||||
|
||||
2026-02-25 15:23:12 [AnagraficaCertestObject] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
2026-02-26 15:01:32 [AnagraficaCertestObject] Autenticazione fallita: HTTP 400, Errore cURL: , Risposta: {"title":"Bad Request","status":400,"detail":"Cannot persist the object. It was modified or deleted (purged) by another application.","instance":"POST /api/authentication/authenticate","errorCode":"96bfc1252b"}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
|
||||
require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
ini_set('display_errors', '0');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
try {
|
||||
$api = VisualLimsApiClient::getInstance();
|
||||
|
||||
// Endpoint: GET api/odata/AnagraficaCertestObject
|
||||
$endpoint = 'AnagraficaCertestObject';
|
||||
|
||||
// Opzionale: parametri OData ($top, $filter, $orderby, ecc.)
|
||||
$options = []; // es: ['$top' => 100]
|
||||
|
||||
// Debug: salva URL usata
|
||||
$base_url = 'https://93.43.5.102/limsapi/api/odata/';
|
||||
$query = http_build_query($options);
|
||||
$full_url = $base_url . $endpoint . ($query ? '?' . $query : '');
|
||||
file_put_contents(__DIR__ . '/last_url.txt', $full_url . PHP_EOL, FILE_APPEND);
|
||||
|
||||
// Chiamata API
|
||||
$data = $api->get($endpoint, $options);
|
||||
|
||||
// Salva il JSON in locale
|
||||
file_put_contents(__DIR__ . '/anagrafica_certest_object_response.json', json_encode($data, JSON_PRETTY_PRINT));
|
||||
|
||||
echo json_encode($data);
|
||||
} catch (Exception $e) {
|
||||
file_put_contents(
|
||||
__DIR__ . '/error_log.txt',
|
||||
date('Y-m-d H:i:s') . ' - ' . $e->getMessage() . PHP_EOL,
|
||||
FILE_APPEND
|
||||
);
|
||||
http_response_code(500);
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
|
||||
require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
ini_set('display_errors', '0');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
try {
|
||||
$api = VisualLimsApiClient::getInstance();
|
||||
|
||||
// Endpoint: GET api/odata/AnagraficaCertestService
|
||||
$endpoint = 'AnagraficaCertestService';
|
||||
|
||||
// Opzionale: parametri OData ($top, $filter, $orderby, ecc.)
|
||||
$options = []; // es: ['$top' => 100]
|
||||
|
||||
// Debug: salva URL usata
|
||||
$base_url = 'https://93.43.5.102/limsapi/api/odata/';
|
||||
$query = http_build_query($options);
|
||||
$full_url = $base_url . $endpoint . ($query ? '?' . $query : '');
|
||||
file_put_contents(__DIR__ . '/last_url.txt', $full_url . PHP_EOL, FILE_APPEND);
|
||||
|
||||
// Chiamata API
|
||||
$data = $api->get($endpoint, $options);
|
||||
|
||||
// Salva il JSON in locale
|
||||
file_put_contents(__DIR__ . '/anagrafica_certest_service_response.json', json_encode($data, JSON_PRETTY_PRINT));
|
||||
|
||||
echo json_encode($data);
|
||||
} catch (Exception $e) {
|
||||
file_put_contents(
|
||||
__DIR__ . '/error_log.txt',
|
||||
date('Y-m-d H:i:s') . ' - ' . $e->getMessage() . PHP_EOL,
|
||||
FILE_APPEND
|
||||
);
|
||||
http_response_code(500);
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
|
||||
require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
ini_set('display_errors', '0');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
try {
|
||||
$idCliente = isset($_GET['id_cliente']) ? (int)$_GET['id_cliente'] : 0;
|
||||
if ($idCliente <= 0) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => 'Missing or invalid id_cliente']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$api = VisualLimsApiClient::getInstance();
|
||||
|
||||
// Build endpoint with OData $expand WITHOUT encoding '$' as %24
|
||||
$endpoint = "Cliente($idCliente)?\$expand=Responsabili";
|
||||
|
||||
// Debug URL (real final URL)
|
||||
$base_url = 'https://93.43.5.102/limsapi/api/odata/';
|
||||
$full_url = $base_url . $endpoint;
|
||||
file_put_contents(__DIR__ . '/last_url.txt', $full_url . PHP_EOL, FILE_APPEND);
|
||||
|
||||
// Call API: options must be empty because expand is already in endpoint
|
||||
$data = $api->get($endpoint, []);
|
||||
|
||||
|
||||
file_put_contents(__DIR__ . '/cliente_responsabili_response.json', json_encode($data, JSON_PRETTY_PRINT));
|
||||
|
||||
// Return only the list (standard shape used by the frontend)
|
||||
$responsabili = $data['Responsabili'] ?? [];
|
||||
echo json_encode(['value' => $responsabili]);
|
||||
} catch (Exception $e) {
|
||||
file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
|
||||
http_response_code(500);
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
}
|
||||
@@ -13,7 +13,7 @@ try {
|
||||
|
||||
// Parametri OData
|
||||
$params = [
|
||||
'$select' => 'IdCliente,Nominativo,CodiceNazioneFatturazione',
|
||||
'$select' => 'IdCliente,Nominativo,CodiceCliente',
|
||||
'$orderby' => 'Nominativo asc'
|
||||
];
|
||||
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
// get_fixed_field_data.php
|
||||
|
||||
require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
|
||||
require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
ini_set('display_errors', '0');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$field = $_GET['field'] ?? ''; // es: MoltiplicatorePrezzo, AnagraficaCertestObject, ...
|
||||
|
||||
if (!$field) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => 'Parametro "field" mancante']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$api = VisualLimsApiClient::getInstance();
|
||||
$base_url = 'https://93.43.5.102/limsapi/api/odata/';
|
||||
|
||||
$data = null;
|
||||
$endpoint = null;
|
||||
$cache_file = null;
|
||||
$options = []; // qui puoi aggiungere filtri/ordering per campo se serve
|
||||
|
||||
try {
|
||||
switch ($field) {
|
||||
case 'MoltiplicatorePrezzo':
|
||||
$endpoint = 'MoltiplicatorePrezzi';
|
||||
$cache_file = __DIR__ . '/cache/moltiplicatori_prezzo.json';
|
||||
break;
|
||||
|
||||
case 'AnagraficaCertestObject':
|
||||
$endpoint = 'AnagraficaCertestObject';
|
||||
$cache_file = __DIR__ . '/cache/anagrafica_certest_object.json';
|
||||
break;
|
||||
|
||||
case 'AnagraficaCertestService':
|
||||
$endpoint = 'AnagraficaCertestService';
|
||||
$cache_file = __DIR__ . '/cache/anagrafica_certest_service.json';
|
||||
break;
|
||||
|
||||
case 'ClienteResponsabile':
|
||||
$id_cliente = (int)($_GET['id_cliente'] ?? 0);
|
||||
if ($id_cliente <= 0) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => 'Manca o invalido id_cliente']);
|
||||
exit;
|
||||
}
|
||||
$endpoint = "Cliente($id_cliente)?\$expand=Responsabili";
|
||||
$cache_file = __DIR__ . '/cache/cliente_responsabili_' . $id_cliente . '.json';
|
||||
break;
|
||||
|
||||
// case 'FuturoCampo5':
|
||||
// $endpoint = 'QualcosaElse';
|
||||
// break;
|
||||
|
||||
default:
|
||||
http_response_code(400);
|
||||
echo json_encode(['error' => "Campo non supportato: $field"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Opzionale: caching semplice (molto utile se i dati cambiano poco)
|
||||
if ($cache_file && file_exists($cache_file) && (time() - filemtime($cache_file) < 3600)) { // 1 ora
|
||||
$data = json_decode(file_get_contents($cache_file), true);
|
||||
} else {
|
||||
$data = $api->get($endpoint, $options);
|
||||
|
||||
if ($cache_file) {
|
||||
file_put_contents($cache_file, json_encode($data, JSON_PRETTY_PRINT));
|
||||
}
|
||||
}
|
||||
|
||||
// Log ultimo URL (opzionale, per debug)
|
||||
$full_url = $base_url . $endpoint . ($options ? '?' . http_build_query($options) : '');
|
||||
file_put_contents(__DIR__ . '/last_urls.log', date('c') . " - $field - $full_url\n", FILE_APPEND);
|
||||
|
||||
echo json_encode($data);
|
||||
} catch (Exception $e) {
|
||||
file_put_contents(
|
||||
__DIR__ . '/error_log.txt',
|
||||
date('Y-m-d H:i:s') . " [$field] " . $e->getMessage() . PHP_EOL,
|
||||
FILE_APPEND
|
||||
);
|
||||
http_response_code(500);
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
|
||||
require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
ini_set('display_errors', '0');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
try {
|
||||
$api = VisualLimsApiClient::getInstance();
|
||||
|
||||
// Endpoint per recuperare i Moltiplicatori Prezzo
|
||||
// (dal documento: GET api/odata/MoltiplicatorePrezzi)
|
||||
$endpoint = 'MoltiplicatorePrezzi';
|
||||
|
||||
// Opzionale: parametri OData ($top, $filter, $orderby, ecc.)
|
||||
$options = [
|
||||
'$orderby' => 'Descrizione asc'
|
||||
];
|
||||
|
||||
// Debug: salva URL usata
|
||||
$base_url = 'https://93.43.5.102/limsapi/api/odata/';
|
||||
$queryParts = [];
|
||||
foreach ($options as $k => $v) {
|
||||
// mantieni il $ nella chiave, encoda solo il valore
|
||||
$queryParts[] = $k . '=' . rawurlencode($v);
|
||||
}
|
||||
$query = implode('&', $queryParts);
|
||||
$full_url = $base_url . $endpoint . ($query ? '?' . $query : '');
|
||||
file_put_contents(__DIR__ . '/last_url.txt', $full_url . PHP_EOL, FILE_APPEND);
|
||||
|
||||
// Chiamata API
|
||||
$data = $api->get($endpoint, $options);
|
||||
// ✅ Force sort locally by "Descrizione" (A→Z)
|
||||
if (isset($data['value']) && is_array($data['value'])) {
|
||||
usort($data['value'], function ($a, $b) {
|
||||
$da = isset($a['Descrizione']) ? trim((string)$a['Descrizione']) : '';
|
||||
$db = isset($b['Descrizione']) ? trim((string)$b['Descrizione']) : '';
|
||||
return strcasecmp($da, $db); // case-insensitive alphabetical
|
||||
});
|
||||
}
|
||||
// Salva il JSON in locale
|
||||
file_put_contents(__DIR__ . '/moltiplicatori_prezzo_response.json', json_encode($data, JSON_PRETTY_PRINT));
|
||||
|
||||
echo json_encode($data);
|
||||
} catch (Exception $e) {
|
||||
file_put_contents(
|
||||
__DIR__ . '/error_log.txt',
|
||||
date('Y-m-d H:i:s') . ' - ' . $e->getMessage() . PHP_EOL,
|
||||
FILE_APPEND
|
||||
);
|
||||
http_response_code(500);
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
}
|
||||
@@ -59,7 +59,8 @@ foreach ($allMappings as $mapping) {
|
||||
}
|
||||
}
|
||||
if (!$mainFieldMapping) {
|
||||
$mainFieldMapping = reset(array_filter($allMappings, fn($m) => !$m['is_manual']));
|
||||
$filtered = array_filter($allMappings, fn($m) => !$m['is_manual']);
|
||||
$mainFieldMapping = reset($filtered);
|
||||
}
|
||||
|
||||
// Retrieve data from datadb
|
||||
|
||||
+1252
-138
File diff suppressed because it is too large
Load Diff
@@ -20,9 +20,10 @@ if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['template_id']) || !i
|
||||
|
||||
$template_id = intval($_POST['template_id']);
|
||||
$selected_rows = array_map('intval', $_POST['selected_rows']);
|
||||
$columns = json_decode($_POST['columns'], true);
|
||||
$rows = json_decode($_POST['rows'], true);
|
||||
$excelrows = json_decode($_POST['excelrows'], true);
|
||||
$columns = json_decode(urldecode($_POST['columns'] ?? '[]'), true);
|
||||
$rows = json_decode(urldecode($_POST['rows'] ?? '[]'), true);
|
||||
$excelrows = json_decode(urldecode($_POST['excelrows'] ?? '[]'), true);
|
||||
|
||||
$newFilename = htmlspecialchars($_POST['filename']);
|
||||
|
||||
$_SESSION['template_id'] = $template_id;
|
||||
|
||||
@@ -121,6 +121,16 @@ error_log("Loaded template: " . print_r($template, true));
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.column-filters th {
|
||||
background: #ffffff;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.column-filters input {
|
||||
width: 100%;
|
||||
min-width: 80px;
|
||||
}
|
||||
</style>
|
||||
<title><?= htmlspecialchars($template['name']) ?> - <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?></title>
|
||||
</head>
|
||||
@@ -305,13 +315,12 @@ error_log("Loaded template: " . print_r($template, true));
|
||||
let html = `
|
||||
<form id="selectRowsForm" action="import_insert.php" method="POST">
|
||||
<input type="hidden" name="template_id" value="${data.template_id}">
|
||||
<input type="hidden" name="columns" value='${JSON.stringify(data.columns)}'>
|
||||
<input type="hidden" name="rows" value='${JSON.stringify(data.rows)}'>
|
||||
<input type="hidden" name="excelrows" value='${JSON.stringify(data.excel_data.map(row => row.excelrow))}'>
|
||||
<input type="hidden" name="columns" value="${encodeURIComponent(JSON.stringify(data.columns))}">
|
||||
<input type="hidden" name="rows" value="${encodeURIComponent(JSON.stringify(data.rows))}">
|
||||
<input type="hidden" name="excelrows" value="${encodeURIComponent(JSON.stringify(data.excel_data.map(r => r.excelrow)))}">
|
||||
|
||||
<input type="hidden" name="filename" value="${data.filename}">
|
||||
<div class="search-container">
|
||||
<input type="text" id="searchInput" class="form-control" placeholder="Cerca nelle righe...">
|
||||
</div>
|
||||
|
||||
<div class="table-container">
|
||||
<table class="table table-striped table-bordered">
|
||||
<thead>
|
||||
@@ -319,6 +328,17 @@ error_log("Loaded template: " . print_r($template, true));
|
||||
<th><input type="checkbox" id="selectAll"> Seleziona</th>
|
||||
${data.columns.map(col => `<th>${col || 'Colonna senza nome'}<div class="resize-handle"></div></th>`).join('')}
|
||||
</tr>
|
||||
<tr class="column-filters">
|
||||
<th></th>
|
||||
${data.columns.map((col, i) => `
|
||||
<th>
|
||||
<input type="text"
|
||||
class="form-control form-control-sm column-filter"
|
||||
data-col-index="${i}"
|
||||
placeholder="Filter...">
|
||||
</th>
|
||||
`).join('')}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
${data.excel_data.map((row, index) => `
|
||||
@@ -393,14 +413,39 @@ error_log("Loaded template: " . print_r($template, true));
|
||||
}
|
||||
});
|
||||
|
||||
const searchInput = document.getElementById('searchInput');
|
||||
const rows = document.querySelectorAll('.table tbody tr');
|
||||
const filterInputs = document.querySelectorAll('.column-filter');
|
||||
|
||||
searchInput.addEventListener('input', function() {
|
||||
const searchTerm = this.value.toLowerCase();
|
||||
// Stato filtri: key = colIndex, value = testo
|
||||
const activeFilters = {};
|
||||
|
||||
function applyColumnFilters() {
|
||||
rows.forEach(row => {
|
||||
const text = Array.from(row.cells).slice(1).map(cell => cell.textContent.toLowerCase()).join(' ');
|
||||
row.style.display = text.includes(searchTerm) ? '' : 'none';
|
||||
// Le celle di data partono da index 1 (perché index 0 è checkbox)
|
||||
let visible = true;
|
||||
|
||||
for (const [colIndexStr, filterValue] of Object.entries(activeFilters)) {
|
||||
const colIndex = parseInt(colIndexStr, 10); // 0..N-1 sulle colonne dati
|
||||
const cell = row.cells[colIndex + 1]; // +1 per saltare la colonna checkbox
|
||||
|
||||
const cellText = (cell?.textContent || '').toLowerCase();
|
||||
const searchText = (filterValue || '').toLowerCase().trim();
|
||||
|
||||
if (searchText && !cellText.includes(searchText)) {
|
||||
visible = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
row.style.display = visible ? '' : 'none';
|
||||
});
|
||||
}
|
||||
|
||||
filterInputs.forEach(input => {
|
||||
input.addEventListener('input', function() {
|
||||
const colIndex = this.dataset.colIndex; // string
|
||||
activeFilters[colIndex] = this.value;
|
||||
applyColumnFilters();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -35,8 +35,6 @@ $kindofrole = $user->present()->role_id;
|
||||
//$iduserlogin="1";
|
||||
//$nameuser="Claudio";
|
||||
//$emailuser="info@claudiosironi.com";
|
||||
?>
|
||||
<?php
|
||||
if (session_status() == PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
@@ -49,13 +47,8 @@ $_SESSION["emailuser"] = $emailuser;
|
||||
$_SESSION["photouser"] = $avatar;
|
||||
$photouser = $_SESSION["photouser"];
|
||||
$photousername = basename($avatar);
|
||||
?>
|
||||
|
||||
|
||||
<?php //include files
|
||||
|
||||
//include files
|
||||
require_once(__DIR__ . '/../../languages/en/general.php');
|
||||
|
||||
//include("generalsettings.php");
|
||||
|
||||
?>
|
||||
//include("generalsettings.php");
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
include('include/headscript.php');
|
||||
|
||||
$dbHandler = DBHandlerSelect::getInstance();
|
||||
$pdo = $dbHandler->getConnection();
|
||||
|
||||
// Recupera l'ID dell'utente loggato
|
||||
$user_id = $iduserlogin ?? 1;
|
||||
|
||||
if (!$user_id) {
|
||||
echo json_encode(['success' => false, 'message' => "ID dell'utente autenticato mancante"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare(
|
||||
"SELECT DISTINCT q.*
|
||||
FROM quotations q
|
||||
INNER JOIN identification_parts ip
|
||||
ON ip.idquotations = q.id
|
||||
AND ip.iddatadb IS NULL
|
||||
WHERE q.iduser = :iduser"
|
||||
);
|
||||
$stmt->execute([':iduser' => $user_id]);
|
||||
$quotations = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo json_encode(['success' => true, 'quotations' => $quotations]);
|
||||
} catch (PDOException $e) {
|
||||
echo json_encode(['success' => false, 'message' => 'Errore nel caricamento delle quotations: ' . $e->getMessage()]);
|
||||
}
|
||||
@@ -97,6 +97,31 @@ if (!$template) {
|
||||
<ul id="associationsList" class="list-group border p-3"></ul>
|
||||
</div>
|
||||
|
||||
<!-- Default Values (Fixed fields) -->
|
||||
<div class="mt-4">
|
||||
<h5>Default Values (Fixed fields)</h5>
|
||||
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">MoltiplicatorePrezzo (default)</label>
|
||||
<select id="defaultMoltiplicatorePrezzo" class="form-select">
|
||||
<option value="">Loading...</option>
|
||||
</select>
|
||||
<small class="text-muted">Loaded from API: get_moltiplicatoreprezzo.php</small>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">ConsegnaRichiesta (default)</label>
|
||||
<input type="date" id="defaultConsegnaRichiesta" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-3">
|
||||
<button class="btn btn-success" id="saveDefaultsBtn">💾 Save defaults</button>
|
||||
<span id="defaultsStatus" class="ms-2 text-muted"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Save Button -->
|
||||
<div class="mt-4 text-end">
|
||||
<a href="templates_dashboard.php" class="btn btn-primary">⬅ Back to Template Dashboard</a>
|
||||
@@ -273,7 +298,7 @@ if (!$template) {
|
||||
}
|
||||
})
|
||||
.catch(error => console.error('Error loading table columns:', error));
|
||||
*/
|
||||
*/
|
||||
/** =======================
|
||||
* CARICAMENTO MAPPATURE GIÀ ESISTENTI
|
||||
* ======================= */
|
||||
@@ -441,6 +466,97 @@ if (!$template) {
|
||||
})
|
||||
.catch(error => console.error("❌ Fetch error:", error));
|
||||
}
|
||||
|
||||
/** =======================
|
||||
* DEFAULTS (Fixed fields)
|
||||
* - stored in localStorage for now
|
||||
* ======================= */
|
||||
|
||||
const defaultsKey = "tpl_defaults_" + templateId;
|
||||
|
||||
function loadDefaultsFromLocal() {
|
||||
try {
|
||||
const raw = localStorage.getItem(defaultsKey);
|
||||
if (!raw) return;
|
||||
const saved = JSON.parse(raw);
|
||||
|
||||
if (saved && typeof saved === "object") {
|
||||
if (saved.moltiplicatore_prezzo_id !== undefined) {
|
||||
document.getElementById('defaultMoltiplicatorePrezzo').value = saved.moltiplicatore_prezzo_id || "";
|
||||
}
|
||||
if (saved.consegna_richiesta !== undefined) {
|
||||
document.getElementById('defaultConsegnaRichiesta').value = saved.consegna_richiesta || "";
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn("⚠️ Cannot parse saved defaults:", e);
|
||||
}
|
||||
}
|
||||
|
||||
function saveDefaultsToLocal() {
|
||||
const moltiplicatoreId = document.getElementById('defaultMoltiplicatorePrezzo').value || "";
|
||||
const consegna = document.getElementById('defaultConsegnaRichiesta').value || "";
|
||||
|
||||
const payload = {
|
||||
moltiplicatore_prezzo_id: moltiplicatoreId,
|
||||
consegna_richiesta: consegna
|
||||
};
|
||||
|
||||
localStorage.setItem(defaultsKey, JSON.stringify(payload));
|
||||
|
||||
const status = document.getElementById('defaultsStatus');
|
||||
status.textContent = "✅ Defaults saved for this template (local)";
|
||||
setTimeout(() => status.textContent = "", 2500);
|
||||
}
|
||||
|
||||
function loadMoltiplicatoriPrezzo() {
|
||||
const select = document.getElementById('defaultMoltiplicatorePrezzo');
|
||||
select.innerHTML = `<option value="">-- Select --</option>`;
|
||||
|
||||
fetch('get_moltiplicatoreprezzo.php')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
// OData tipico: { value: [...] }
|
||||
const rows = Array.isArray(data?.value) ? data.value : (Array.isArray(data) ? data : []);
|
||||
if (!rows.length) {
|
||||
select.innerHTML = `<option value="">(No data)</option>`;
|
||||
return;
|
||||
}
|
||||
|
||||
rows.forEach(item => {
|
||||
// ⚠️ Qui i nomi campi dipendono dal JSON reale:
|
||||
// - id: item.Id / item.ID / item.idMoltiplicatorePrezzo
|
||||
// - label: item.Descrizione / item.Nome / item.Codice
|
||||
const id = item.IdMoltiplicatorePrezzo;
|
||||
const label = `${item.Descrizione} (x${item.Fattore})`;
|
||||
|
||||
|
||||
if (id === undefined || id === null) return;
|
||||
|
||||
const opt = document.createElement('option');
|
||||
opt.value = String(id);
|
||||
opt.textContent = String(label);
|
||||
select.appendChild(opt);
|
||||
});
|
||||
|
||||
// dopo aver popolato, prova a rimettere il valore salvato
|
||||
loadDefaultsFromLocal();
|
||||
})
|
||||
.catch(err => {
|
||||
console.error("❌ Error loading MoltiplicatorePrezzo:", err);
|
||||
select.innerHTML = `<option value="">(Load error)</option>`;
|
||||
});
|
||||
}
|
||||
|
||||
// Events
|
||||
document.getElementById('saveDefaultsBtn').addEventListener('click', function() {
|
||||
saveDefaultsToLocal();
|
||||
});
|
||||
|
||||
// Init
|
||||
loadMoltiplicatoriPrezzo();
|
||||
loadDefaultsFromLocal();
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
@@ -21,10 +21,22 @@ $schemajson = $template['schemajson'] ? json_decode($template['schemajson'], tru
|
||||
$isSchemajsonEmpty = empty(trim($template['schemajson']));
|
||||
|
||||
// Recupera i campi dalla tabella template_mapping
|
||||
$stmt = $pdo->prepare("SELECT id, field_id, excel_column, is_manual, manual_default, data_type, is_required, default_value, has_list, length, decimals, min_value, max_value, default_curr_date, tablename, field_label, main_field, is_visible_import FROM template_mapping WHERE template_id = ?");
|
||||
$stmt = $pdo->prepare("SELECT id, field_id, excel_column, is_manual, manual_default, auto_value, data_type, is_required, default_value, has_list, length, decimals, min_value, max_value, default_curr_date, tablename, field_label, main_field, is_visible_import, is_visible_parts FROM template_mapping WHERE template_id = ?");
|
||||
$stmt->execute([$id]);
|
||||
$mappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// Recupera i fixed fields dalla tabella template_fixed_mapping
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT id, fixed_field_key, is_manual, data_type, is_required, default_value, is_visible_import
|
||||
FROM template_fixed_mapping
|
||||
WHERE template_id = ?
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$stmt->execute([$id]);
|
||||
$fixedMappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$hasFixedMappings = !empty($fixedMappings);
|
||||
|
||||
// Recupera le colonne già associate nel database
|
||||
$usedColumnsFromDB = array_filter(array_column($mappings, 'excel_column'));
|
||||
|
||||
@@ -42,6 +54,8 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
<?php include('cssinclude.php'); ?>
|
||||
<title>Configure Template <?= htmlspecialchars($template['name'], ENT_QUOTES, 'UTF-8'); ?></title>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
|
||||
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
|
||||
|
||||
<style>
|
||||
.dropdown-select {
|
||||
width: 100%;
|
||||
@@ -89,6 +103,19 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* fix bootstrap/select2 width */
|
||||
.select2-container {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
/* Make Title column narrower + ellipsis */
|
||||
#schemaFieldsTable td.title-col {
|
||||
max-width: 320px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
@@ -138,67 +165,240 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
<table id="schemaFieldsTable" class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Main</th>
|
||||
<th>Visible on Import</th>
|
||||
<th>Title</th>
|
||||
<th>Type</th>
|
||||
<th style="width:90px; text-align:center;">Main</th>
|
||||
<th style="width:110px; text-align:center;">Import</th>
|
||||
<th style="width:110px; text-align:center;">Parts</th>
|
||||
<th style="width:320px;">Title</th>
|
||||
<th style="width:140px;">Type</th>
|
||||
<th>Mapping</th>
|
||||
<th>Default Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<tbody id="schemaFieldsBody">
|
||||
<?php foreach ($mappings as $mapping): ?>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" class="main-field-checkbox" data-mapping-id="<?php echo $mapping['id']; ?>" <?php echo $mapping['main_field'] == 1 ? 'checked' : ''; ?>>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="main-field-checkbox"
|
||||
data-mapping-id="<?php echo (int)$mapping['id']; ?>"
|
||||
<?php echo ((int)$mapping['main_field'] === 1) ? 'checked' : ''; ?>>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" class="visible-import-checkbox" data-mapping-id="<?php echo $mapping['id']; ?>" <?php echo (isset($mapping['is_visible_import']) ? $mapping['is_visible_import'] : 1) == 1 ? 'checked' : ''; ?>>
|
||||
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="visible-import-checkbox"
|
||||
data-mapping-id="<?php echo (int)$mapping['id']; ?>"
|
||||
<?php echo ((int)($mapping['is_visible_import'] ?? 1) === 1) ? 'checked' : ''; ?>>
|
||||
</td>
|
||||
<td>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="visible-parts-checkbox"
|
||||
data-mapping-id="<?php echo (int)$mapping['id']; ?>"
|
||||
<?php echo ((int)($mapping['is_visible_parts'] ?? 0) === 1) ? 'checked' : ''; ?>>
|
||||
</td>
|
||||
|
||||
|
||||
<td class="title-col">
|
||||
<?php echo htmlspecialchars($mapping['field_label'] ?? 'N/A'); ?>
|
||||
<?php if ($mapping['is_required'] == 1): ?>
|
||||
<?php if ((int)$mapping['is_required'] === 1): ?>
|
||||
<span class="badge bg-danger ms-2">Required</span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
|
||||
|
||||
<td><?php echo htmlspecialchars($mapping['data_type'] ?? 'N/A'); ?></td>
|
||||
|
||||
<td>
|
||||
<?php
|
||||
$isSceltaMultipla = $mapping['data_type'] === 'SceltaMultipla';
|
||||
$mappingValue = $isSceltaMultipla ? 'manual' : ($mapping['excel_column'] ? 'xls' : ($mapping['is_manual'] ? 'manual' : ''));
|
||||
$isSceltaMultipla = ($mapping['data_type'] === 'SceltaMultipla');
|
||||
|
||||
$autoValue = $mapping['auto_value'] ?? 'none';
|
||||
$hasAuto = ($autoValue && $autoValue !== 'none');
|
||||
|
||||
$mappingValue = $isSceltaMultipla
|
||||
? 'manual'
|
||||
: ($hasAuto ? 'auto' : ($mapping['excel_column'] ? 'xls' : ((int)$mapping['is_manual'] === 1 ? 'manual' : '')));
|
||||
?>
|
||||
<select class="form-select mapping-select" data-id="<?php echo $mapping['id']; ?>" data-field-id="<?php echo $mapping['field_id']; ?>" <?php echo $isSceltaMultipla ? 'disabled' : ''; ?>>
|
||||
|
||||
<select class="form-select mapping-select"
|
||||
data-id="<?php echo (int)$mapping['id']; ?>"
|
||||
data-field-id="<?php echo (int)$mapping['field_id']; ?>"
|
||||
<?php echo $isSceltaMultipla ? 'disabled' : ''; ?>>
|
||||
|
||||
<?php if (!$isSceltaMultipla): ?>
|
||||
<option value="">Select Option</option>
|
||||
<option value="xls" <?php echo $mappingValue === 'xls' ? 'selected' : ''; ?>>Map to XLS Column</option>
|
||||
<option value="xls" <?php echo ($mappingValue === 'xls') ? 'selected' : ''; ?>>Map to XLS Column</option>
|
||||
<option value="auto" <?php echo ($mappingValue === 'auto') ? 'selected' : ''; ?>>Auto value</option>
|
||||
<?php endif; ?>
|
||||
<option value="manual" <?php echo $mappingValue === 'manual' ? 'selected' : ''; ?>>Manual Entry</option>
|
||||
|
||||
<option value="manual" <?php echo ($mappingValue === 'manual') ? 'selected' : ''; ?>>Manual Entry</option>
|
||||
</select>
|
||||
<select class="form-select xls-columns" style="display:<?php echo $mappingValue === 'xls' ? 'block' : 'none'; ?>" data-id="<?php echo $mapping['id']; ?>" <?php echo $mapping['excel_column'] ? 'data-current-xls="' . htmlspecialchars($mapping['excel_column']) . '"' : ''; ?>></select>
|
||||
<?php if ($mapping['excel_column']): ?>
|
||||
<span class="mapped-column" style="margin-left: 5px;"><?php echo htmlspecialchars($mapping['excel_column']); ?></span>
|
||||
<button class="btn btn-danger btn-sm remove-xls" data-id="<?php echo $mapping['id']; ?>" style="margin-left: 5px;">X</button>
|
||||
|
||||
<select class="form-select xls-columns"
|
||||
style="display:<?php echo ($mappingValue === 'xls') ? 'block' : 'none'; ?>"
|
||||
data-id="<?php echo (int)$mapping['id']; ?>"
|
||||
<?php echo $mapping['excel_column'] ? 'data-current-xls="' . htmlspecialchars($mapping['excel_column']) . '"' : ''; ?>>
|
||||
</select>
|
||||
|
||||
<select class="form-select auto-value-select"
|
||||
style="display:<?php echo ($mappingValue === 'auto') ? 'block' : 'none'; ?>; margin-top:6px;"
|
||||
data-id="<?php echo (int)$mapping['id']; ?>">
|
||||
<option value="none">Select auto value</option>
|
||||
<option value="import_date" <?php echo ($autoValue === 'import_date') ? 'selected' : ''; ?>>Current date (import)</option>
|
||||
<option value="import_time" <?php echo ($autoValue === 'import_time') ? 'selected' : ''; ?>>Current time (import)</option>
|
||||
<option value="export_date" <?php echo ($autoValue === 'export_date') ? 'selected' : ''; ?>>Current date (export)</option>
|
||||
<option value="export_time" <?php echo ($autoValue === 'export_time') ? 'selected' : ''; ?>>Current time (export)</option>
|
||||
</select>
|
||||
|
||||
<?php if (!empty($mapping['excel_column'])): ?>
|
||||
<span class="mapped-column" style="margin-left:5px;">
|
||||
(<?php echo htmlspecialchars($mapping['excel_column']); ?>)
|
||||
</span>
|
||||
<button class="btn btn-danger btn-sm remove-xls"
|
||||
data-id="<?php echo (int)$mapping['id']; ?>"
|
||||
style="margin-left:5px;">
|
||||
X
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<?php if ($mapping['data_type'] === 'SceltaMultipla'): ?>
|
||||
<select class="form-select dropdown-select manual-default" data-id="<?php echo $mapping['id']; ?>" data-field-id="<?php echo $mapping['field_id']; ?>" data-manual-default="<?php echo htmlspecialchars($mapping['manual_default'] ?? ''); ?>" style="display:block;">
|
||||
<select class="form-select dropdown-select manual-default"
|
||||
data-id="<?php echo (int)$mapping['id']; ?>"
|
||||
data-field-id="<?php echo (int)$mapping['field_id']; ?>"
|
||||
data-manual-default="<?php echo htmlspecialchars($mapping['manual_default'] ?? ''); ?>"
|
||||
style="display:block;">
|
||||
<option value="">Seleziona...</option>
|
||||
</select>
|
||||
<?php else: ?>
|
||||
<input type="text" class="form-control manual-default" placeholder="Default value" value="<?php echo htmlspecialchars($mapping['manual_default'] ?? ''); ?>" style="display:<?php echo $mapping['is_manual'] ? 'block' : 'none'; ?>" data-field-id="<?php echo $mapping['field_id']; ?>">
|
||||
<input type="text"
|
||||
class="form-control manual-default"
|
||||
placeholder="Default value"
|
||||
value="<?php echo htmlspecialchars($mapping['manual_default'] ?? ''); ?>"
|
||||
style="display:<?php echo ($mappingValue === 'manual') ? 'block' : 'none'; ?>"
|
||||
data-field-id="<?php echo (int)$mapping['field_id']; ?>">
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Defaults for fixed fields (not part of XLS mapping) -->
|
||||
<!-- Fixed fields defaults (saved in DB, autosave) -->
|
||||
<div class="row mt-4">
|
||||
<div class="col-12 d-flex align-items-center justify-content-between">
|
||||
<h5 class="mb-0">Fixed Fields Defaults</h5>
|
||||
|
||||
<?php if (!$hasFixedMappings): ?>
|
||||
<button id="btnAddFixedFields" class="btn btn-outline-primary">
|
||||
Add Fixed Fields
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<small class="text-muted">Defaults are saved automatically when changed</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-3" id="fixedFieldsSection" style="display: <?php echo $hasFixedMappings ? 'block' : 'none'; ?>;">
|
||||
<div class="col-12">
|
||||
<table class="table table-striped" id="fixedFieldsTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:120px; text-align:center;">Visible on Import</th>
|
||||
<th style="width:120px; text-align:center;">Required</th>
|
||||
<th>Field</th>
|
||||
<th style="width:140px;">Type</th>
|
||||
<th>Default Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<?php foreach ($fixedMappings as $fm): ?>
|
||||
<tr>
|
||||
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="fixed-visible-checkbox"
|
||||
data-fixed-id="<?php echo (int)$fm['id']; ?>"
|
||||
<?php echo ((int)$fm['is_visible_import'] === 1) ? 'checked' : ''; ?>>
|
||||
</td>
|
||||
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="fixed-required-checkbox"
|
||||
data-fixed-id="<?php echo (int)$fm['id']; ?>"
|
||||
<?php echo ((int)$fm['is_required'] === 1) ? 'checked' : ''; ?>>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<strong><?php echo htmlspecialchars($fm['fixed_field_key']); ?></strong>
|
||||
</td>
|
||||
|
||||
|
||||
<td><?php echo htmlspecialchars($fm['data_type']); ?></td>
|
||||
|
||||
<td>
|
||||
|
||||
<?php if ($fm['data_type'] === 'DATE'): ?>
|
||||
|
||||
<input type="date"
|
||||
class="form-control fixed-default-input"
|
||||
data-fixed-id="<?php echo (int)$fm['id']; ?>"
|
||||
value="<?php echo htmlspecialchars($fm['default_value'] ?? ''); ?>">
|
||||
|
||||
<?php elseif (in_array($fm['fixed_field_key'], [
|
||||
'ClienteResponsabile',
|
||||
'MoltiplicatorePrezzo',
|
||||
'AnagraficaCertestObject',
|
||||
'AnagraficaCertestService'
|
||||
])): ?>
|
||||
|
||||
<select class="form-select fixed-default-select"
|
||||
data-fixed-id="<?php echo (int)$fm['id']; ?>"
|
||||
data-fixed-key="<?php echo htmlspecialchars($fm['fixed_field_key']); ?>"
|
||||
data-current-value="<?php echo htmlspecialchars($fm['default_value'] ?? ''); ?>">
|
||||
<option value="">Loading...</option>
|
||||
</select>
|
||||
|
||||
<?php else: ?>
|
||||
|
||||
<input type="text"
|
||||
class="form-control fixed-default-input"
|
||||
data-fixed-id="<?php echo (int)$fm['id']; ?>"
|
||||
value="<?php echo htmlspecialchars($fm['default_value'] ?? ''); ?>">
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
<div id="fixedSaveStatus" class="small mt-2 text-muted"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="mt-4 text-end">
|
||||
<a href="templates_dashboard.php" class="btn btn-primary">⬅ Back to Template Dashboard</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -209,7 +409,7 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
</div>
|
||||
|
||||
<?php include('jsinclude.php'); ?>
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
|
||||
<script>
|
||||
let availableXlsColumns = <?php echo json_encode($xlsHeaders); ?> || [];
|
||||
let usedColumnsFromDB = <?php echo json_encode($usedColumnsFromDB); ?> || [];
|
||||
@@ -316,6 +516,80 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
});
|
||||
}
|
||||
|
||||
function initSelect2ForSchemaDropdowns() {
|
||||
// dropdown-select = SceltaMultipla (manual default)
|
||||
if (window.jQuery && $.fn.select2) {
|
||||
$('.dropdown-select').each(function() {
|
||||
if ($(this).hasClass('select2-hidden-accessible')) return; // già inizializzato
|
||||
$(this).select2({
|
||||
width: '100%',
|
||||
placeholder: 'Seleziona...',
|
||||
allowClear: true
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function initSelect2ForFixedDropdowns() {
|
||||
if (!(window.jQuery && $.fn.select2)) return;
|
||||
|
||||
$('.fixed-default-select').each(function() {
|
||||
const $el = $(this);
|
||||
|
||||
// se era già Select2, lo resettiamo (utile quando renderizzi righe nuove)
|
||||
if ($el.hasClass('select2-hidden-accessible')) {
|
||||
$el.select2('destroy');
|
||||
}
|
||||
|
||||
$el.select2({
|
||||
width: '100%',
|
||||
placeholder: 'Seleziona...',
|
||||
allowClear: true
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function saveFixedDefaultSelect(selectEl) {
|
||||
const id = selectEl.dataset.fixedId;
|
||||
const value = selectEl.value;
|
||||
|
||||
fetch('update_fixed_field.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
id,
|
||||
field: 'default_value',
|
||||
value
|
||||
})
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(d => {
|
||||
if (!d.success) throw new Error(d.message || 'Update failed');
|
||||
// aggiorno anche il dataset così rimane coerente
|
||||
selectEl.dataset.currentValue = value;
|
||||
fixedStatus('✅ Saved');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
fixedStatus('❌ Save error', true);
|
||||
});
|
||||
}
|
||||
|
||||
// Eventi Select2 (jQuery)
|
||||
if (window.jQuery) {
|
||||
$(document).on('select2:select select2:clear', '.fixed-default-select', function() {
|
||||
saveFixedDefaultSelect(this);
|
||||
});
|
||||
|
||||
// fallback (nel caso cambi senza select2)
|
||||
$(document).on('change', '.fixed-default-select', function() {
|
||||
saveFixedDefaultSelect(this);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
let templateId = <?php echo $id; ?>;
|
||||
let schemaId = <?php echo json_encode($template['idschema'] ?? 0); ?>;
|
||||
@@ -403,9 +677,13 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
dropdown.disabled = true;
|
||||
});
|
||||
} finally {
|
||||
// attiva Select2 dopo aver messo le options
|
||||
initSelect2ForSchemaDropdowns();
|
||||
|
||||
console.log('Nascondo overlay di caricamento.');
|
||||
loadingOverlay.style.display = 'none';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Carica i dropdown con overlay
|
||||
@@ -420,6 +698,61 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
|
||||
loadDropdownsWithOverlay();
|
||||
|
||||
// =======================
|
||||
// SAVE: SceltaMultipla dropdown (Select2-safe)
|
||||
// =======================
|
||||
|
||||
// 1) listener nativo a livello document (più robusto del delegation su tbody)
|
||||
document.addEventListener('change', function(event) {
|
||||
const el = event.target;
|
||||
if (!(el && el.matches && el.matches('select.manual-default.dropdown-select'))) return;
|
||||
|
||||
const tr = el.closest('tr');
|
||||
const mappingId =
|
||||
el.getAttribute('data-id') ||
|
||||
tr?.querySelector('.mapping-select')?.getAttribute('data-id');
|
||||
|
||||
const xlsSelect = tr?.querySelector('.xls-columns');
|
||||
|
||||
console.log('[SceltaMultipla change] saving', {
|
||||
mappingId,
|
||||
value: el.value
|
||||
});
|
||||
|
||||
if (!mappingId) {
|
||||
console.error('❌ Missing mappingId for SceltaMultipla dropdown');
|
||||
return;
|
||||
}
|
||||
|
||||
saveMapping(mappingId, 'manual', el.value, xlsSelect ? xlsSelect.value : null);
|
||||
});
|
||||
|
||||
// 2) eventi Select2 (quando Select2 “mangia” il change)
|
||||
if (window.jQuery) {
|
||||
$(document).on('select2:select select2:clear', 'select.manual-default.dropdown-select', function() {
|
||||
const el = this;
|
||||
const tr = el.closest('tr');
|
||||
const mappingId =
|
||||
el.getAttribute('data-id') ||
|
||||
tr?.querySelector('.mapping-select')?.getAttribute('data-id');
|
||||
|
||||
const xlsSelect = tr?.querySelector('.xls-columns');
|
||||
|
||||
console.log('[SceltaMultipla select2] saving', {
|
||||
mappingId,
|
||||
value: el.value
|
||||
});
|
||||
|
||||
if (!mappingId) {
|
||||
console.error('❌ Missing mappingId for SceltaMultipla dropdown (select2)');
|
||||
return;
|
||||
}
|
||||
|
||||
saveMapping(mappingId, 'manual', el.value, xlsSelect ? xlsSelect.value : null);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async function loadClientAndSchemaNames() {
|
||||
if (<?php echo json_encode($template['idclient'] ?? 0); ?> > 0) {
|
||||
let response = await fetch(`get_clienti.php?id=<?php echo $template['idclient']; ?>`);
|
||||
@@ -484,27 +817,57 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
let mappingId = event.target.getAttribute('data-id');
|
||||
let xlsSelect = tr.querySelector('.xls-columns');
|
||||
let manualInput = tr.querySelector('.manual-default');
|
||||
let autoSelect = tr.querySelector('.auto-value-select');
|
||||
let mappedColumn = tr.querySelector('.mapped-column');
|
||||
let removeBtn = tr.querySelector('.remove-xls');
|
||||
if (event.target.value === 'xls') {
|
||||
xlsSelect.style.display = 'block';
|
||||
if (autoSelect) autoSelect.style.display = 'none';
|
||||
|
||||
manualInput.style.display = 'none';
|
||||
manualInput.value = '';
|
||||
|
||||
if (mappedColumn) mappedColumn.style.display = 'none';
|
||||
if (removeBtn) removeBtn.style.display = xlsSelect.value ? 'inline-block' : 'none';
|
||||
|
||||
} else if (event.target.value === 'manual') {
|
||||
xlsSelect.style.display = 'none';
|
||||
if (autoSelect) autoSelect.style.display = 'none';
|
||||
|
||||
manualInput.style.display = 'block';
|
||||
|
||||
if (mappedColumn) mappedColumn.style.display = 'none';
|
||||
if (removeBtn) removeBtn.style.display = 'none';
|
||||
} else {
|
||||
|
||||
} else if (event.target.value === 'auto') {
|
||||
xlsSelect.style.display = 'none';
|
||||
xlsSelect.value = ''; // libera UI
|
||||
|
||||
manualInput.style.display = 'none';
|
||||
manualInput.value = '';
|
||||
|
||||
if (mappedColumn) mappedColumn.style.display = 'none';
|
||||
if (removeBtn) removeBtn.style.display = 'none';
|
||||
|
||||
if (autoSelect) autoSelect.style.display = 'block';
|
||||
|
||||
} else {
|
||||
xlsSelect.style.display = 'none';
|
||||
if (autoSelect) autoSelect.style.display = 'none';
|
||||
|
||||
manualInput.style.display = 'none';
|
||||
manualInput.value = '';
|
||||
|
||||
if (mappedColumn) mappedColumn.style.display = 'none';
|
||||
if (removeBtn) removeBtn.style.display = 'none';
|
||||
}
|
||||
saveMapping(mappingId, event.target.value, manualInput.value, xlsSelect.value);
|
||||
saveMapping(
|
||||
mappingId,
|
||||
event.target.value,
|
||||
manualInput.value,
|
||||
xlsSelect.value,
|
||||
autoSelect ? autoSelect.value : null
|
||||
);
|
||||
updateXlsDropdowns();
|
||||
} else if (event.target.classList.contains('main-field-checkbox')) {
|
||||
const checkbox = event.target;
|
||||
@@ -577,19 +940,65 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
console.error("❌ Fetch error:", error);
|
||||
checkbox.checked = !checkbox.checked;
|
||||
});
|
||||
} else if (event.target.classList.contains('visible-parts-checkbox')) {
|
||||
const checkbox = event.target;
|
||||
const mappingId = checkbox.dataset.mappingId;
|
||||
const value = checkbox.checked ? 1 : 0;
|
||||
|
||||
fetch('update_visible_parts.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
template_id: <?php echo $id; ?>,
|
||||
mapping_id: mappingId,
|
||||
value: value
|
||||
})
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (!data.success) {
|
||||
console.error("❌ Error updating is_visible_parts:", data.message);
|
||||
checkbox.checked = !checkbox.checked;
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("❌ Fetch error:", error);
|
||||
checkbox.checked = !checkbox.checked;
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// Salva lo stato originale dei checkbox al caricamento
|
||||
document.querySelectorAll('.main-field-checkbox').forEach(cb => {
|
||||
cb.dataset.originalChecked = cb.checked;
|
||||
});
|
||||
// AUTO VALUE select change -> save auto_value
|
||||
document.getElementById('schemaFieldsBody').addEventListener('change', function(event) {
|
||||
if (!event.target.classList.contains('auto-value-select')) return;
|
||||
|
||||
const tr = event.target.closest('tr');
|
||||
const mappingId = event.target.getAttribute('data-id');
|
||||
|
||||
const xlsSelect = tr.querySelector('.xls-columns');
|
||||
const manualInput = tr.querySelector('.manual-default');
|
||||
|
||||
saveMapping(
|
||||
mappingId,
|
||||
'auto',
|
||||
manualInput ? manualInput.value : '',
|
||||
xlsSelect ? xlsSelect.value : null,
|
||||
event.target.value
|
||||
);
|
||||
});
|
||||
document.getElementById('schemaFieldsBody').addEventListener('change', function(event) {
|
||||
if (event.target.classList.contains('xls-columns')) {
|
||||
let tr = event.target.closest('tr');
|
||||
let mappingId = event.target.getAttribute('data-id');
|
||||
let manualInput = tr.querySelector('.manual-default');
|
||||
let autoSelect = tr.querySelector('.auto-value-select');
|
||||
let mappedColumn = tr.querySelector('.mapped-column');
|
||||
let removeBtn = tr.querySelector('.remove-xls');
|
||||
|
||||
@@ -630,6 +1039,10 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
mappedColumn.style.display = event.target.value ? 'inline' : 'none';
|
||||
}
|
||||
if (removeBtn) removeBtn.style.display = event.target.value ? 'inline-block' : 'none';
|
||||
const mappingSelect = tr.querySelector('.mapping-select');
|
||||
if (mappingSelect && mappingSelect.value !== 'xls') {
|
||||
return; // non salvare XLS se non siamo in modalità XLS
|
||||
}
|
||||
saveMapping(mappingId, 'xls', manualInput.value, event.target.value);
|
||||
updateXlsDropdowns();
|
||||
}
|
||||
@@ -681,7 +1094,7 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
}
|
||||
});
|
||||
|
||||
function saveMapping(mappingId, mappingType, defaultValue, excelColumn) {
|
||||
function saveMapping(mappingId, mappingType, defaultValue, excelColumn, autoValue) {
|
||||
console.log("Saving mapping:", {
|
||||
id: mappingId,
|
||||
mapping_type: mappingType,
|
||||
@@ -698,6 +1111,7 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
mapping_type: mappingType,
|
||||
excel_column: mappingType === 'xls' ? excelColumn : null,
|
||||
manual_default: mappingType === 'manual' ? defaultValue : null,
|
||||
auto_value: mappingType === 'auto' ? (autoValue || 'none') : 'none',
|
||||
tablename: "<?php echo $template['target_table']; ?>"
|
||||
})
|
||||
}).then(response => response.json())
|
||||
@@ -713,9 +1127,352 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
|
||||
.catch(error => console.error("❌ Fetch error:", error));
|
||||
}
|
||||
|
||||
// =======================
|
||||
// FIXED FIELDS (DB autosave)
|
||||
// =======================
|
||||
|
||||
function escapeHtml(str) {
|
||||
return String(str ?? '')
|
||||
.replaceAll('&', '&')
|
||||
.replaceAll('<', '<')
|
||||
.replaceAll('>', '>')
|
||||
.replaceAll('"', '"')
|
||||
.replaceAll("'", ''');
|
||||
}
|
||||
|
||||
function fixedStatus(msg, isError = false) {
|
||||
const el = document.getElementById('fixedSaveStatus');
|
||||
if (!el) return;
|
||||
el.textContent = msg;
|
||||
el.classList.toggle('text-danger', isError);
|
||||
el.classList.toggle('text-muted', !isError);
|
||||
setTimeout(() => {
|
||||
el.textContent = '';
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
function renderFixedRows(rows) {
|
||||
const tbody = document.querySelector('#fixedFieldsTable tbody');
|
||||
if (!tbody) return;
|
||||
|
||||
const keysWithDropdown = [
|
||||
'ClienteResponsabile',
|
||||
'MoltiplicatorePrezzo',
|
||||
'AnagraficaCertestObject',
|
||||
'AnagraficaCertestService'
|
||||
];
|
||||
|
||||
tbody.innerHTML = rows.map(r => {
|
||||
const type = String(r.data_type || '').toUpperCase();
|
||||
const dv = r.default_value ?? '';
|
||||
const isDate = type === 'DATE';
|
||||
const isDropdown = keysWithDropdown.includes(String(r.fixed_field_key || ''));
|
||||
|
||||
return `
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="fixed-visible-checkbox"
|
||||
data-fixed-id="${r.id}"
|
||||
${parseInt(r.is_visible_import) === 1 ? 'checked' : ''}>
|
||||
</td>
|
||||
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="fixed-required-checkbox"
|
||||
data-fixed-id="${r.id}"
|
||||
${parseInt(r.is_required) === 1 ? 'checked' : ''}>
|
||||
</td>
|
||||
|
||||
<td><strong>${escapeHtml(r.fixed_field_key)}</strong></td>
|
||||
|
||||
|
||||
<td>${escapeHtml(r.data_type || '')}</td>
|
||||
|
||||
<td>
|
||||
${
|
||||
isDate
|
||||
? `<input type="date"
|
||||
class="form-control fixed-default-input"
|
||||
data-fixed-id="${r.id}"
|
||||
value="${escapeHtml(dv)}">`
|
||||
: isDropdown
|
||||
? `<select class="form-select fixed-default-select"
|
||||
data-fixed-id="${r.id}"
|
||||
data-fixed-key="${escapeHtml(r.fixed_field_key)}"
|
||||
data-current-value="${escapeHtml(dv)}">
|
||||
<option value="">Loading...</option>
|
||||
</select>`
|
||||
: `<input type="text"
|
||||
class="form-control fixed-default-input"
|
||||
data-fixed-id="${r.id}"
|
||||
value="${escapeHtml(dv)}"
|
||||
placeholder="Default value">`
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Button: Add Fixed Fields
|
||||
const btnAddFixedFields = document.getElementById('btnAddFixedFields');
|
||||
if (btnAddFixedFields) {
|
||||
btnAddFixedFields.addEventListener('click', async () => {
|
||||
btnAddFixedFields.disabled = true;
|
||||
btnAddFixedFields.textContent = 'Creating...';
|
||||
|
||||
try {
|
||||
const res = await fetch('create_fixed_fields.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
template_id: templateId
|
||||
})
|
||||
});
|
||||
const data = await res.json();
|
||||
|
||||
if (!data.success) throw new Error(data.message || 'Create failed');
|
||||
|
||||
document.getElementById('fixedFieldsSection').style.display = 'block';
|
||||
btnAddFixedFields.style.display = 'none';
|
||||
|
||||
if (Array.isArray(data.rows)) {
|
||||
renderFixedRows(data.rows);
|
||||
await fillFixedDropdowns();
|
||||
initSelect2ForFixedDropdowns();
|
||||
|
||||
|
||||
}
|
||||
|
||||
fixedStatus('✅ Fixed fields created');
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
fixedStatus('❌ ' + e.message, true);
|
||||
btnAddFixedFields.disabled = false;
|
||||
btnAddFixedFields.textContent = 'Add Fixed Fields';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Autosave: Visible on import
|
||||
document.addEventListener('change', (e) => {
|
||||
if (!e.target.classList.contains('fixed-visible-checkbox')) return;
|
||||
|
||||
const id = e.target.dataset.fixedId;
|
||||
const value = e.target.checked ? 1 : 0;
|
||||
|
||||
fetch('update_fixed_field.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
id,
|
||||
field: 'is_visible_import',
|
||||
value
|
||||
})
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(d => {
|
||||
if (!d.success) throw new Error(d.message || 'Update failed');
|
||||
fixedStatus('✅ Saved');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
e.target.checked = !e.target.checked;
|
||||
fixedStatus('❌ Save error', true);
|
||||
});
|
||||
});
|
||||
|
||||
document.addEventListener('change', (e) => {
|
||||
if (!e.target.classList.contains('fixed-required-checkbox')) return;
|
||||
|
||||
const id = e.target.dataset.fixedId;
|
||||
const value = e.target.checked ? 1 : 0;
|
||||
|
||||
fetch('update_fixed_field.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
id,
|
||||
field: 'is_required',
|
||||
value
|
||||
})
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(d => {
|
||||
if (!d.success) throw new Error(d.message || 'Update failed');
|
||||
fixedStatus('✅ Saved');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
e.target.checked = !e.target.checked;
|
||||
fixedStatus('❌ Save error', true);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// Autosave: manual_default (debounce)
|
||||
let fixedTimer = null;
|
||||
document.addEventListener('input', (e) => {
|
||||
if (!e.target.classList.contains('fixed-default-input')) return;
|
||||
|
||||
clearTimeout(fixedTimer);
|
||||
fixedTimer = setTimeout(() => {
|
||||
const id = e.target.dataset.fixedId;
|
||||
const value = e.target.value;
|
||||
|
||||
fetch('update_fixed_field.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
id,
|
||||
field: 'default_value',
|
||||
value
|
||||
})
|
||||
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(d => {
|
||||
if (!d.success) throw new Error(d.message || 'Update failed');
|
||||
fixedStatus('✅ Saved');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
fixedStatus('❌ Save error', true);
|
||||
});
|
||||
}, 350);
|
||||
});
|
||||
|
||||
|
||||
if (availableXlsColumns.length) updateXlsDropdowns();
|
||||
|
||||
fillFixedDropdowns().then(() => {
|
||||
initSelect2ForFixedDropdowns();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
async function fillFixedDropdowns() {
|
||||
const selects = document.querySelectorAll('.fixed-default-select');
|
||||
console.log('[fillFixedDropdowns] found selects:', selects.length);
|
||||
|
||||
if (!selects.length) return;
|
||||
|
||||
const clientId = <?php echo (int)($template['idclient'] ?? 0); ?>;
|
||||
|
||||
async function fetchJson(url) {
|
||||
const r = await fetch(url);
|
||||
const text = await r.text();
|
||||
if (!r.ok) throw new Error(`HTTP ${r.status} on ${url}: ${text.slice(0, 200)}`);
|
||||
try {
|
||||
return JSON.parse(text);
|
||||
} catch (e) {
|
||||
throw new Error(`Invalid JSON from ${url}: ${text.slice(0, 200)}`);
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeList(j, key) {
|
||||
// Accetta vari formati: {value:[]}, {Responsabili:[]}, {results:[]}, array diretto
|
||||
if (Array.isArray(j)) return j;
|
||||
if (j && Array.isArray(j.value)) return j.value;
|
||||
if (j && Array.isArray(j.Responsabili)) return j.Responsabili;
|
||||
if (j && Array.isArray(j.results)) return j.results;
|
||||
|
||||
console.warn('[fillFixedDropdowns] unknown JSON shape for', key, j);
|
||||
return [];
|
||||
}
|
||||
|
||||
async function loadData(key) {
|
||||
if (key === 'MoltiplicatorePrezzo') {
|
||||
const j = await fetchJson('get_moltiplicatoreprezzo.php');
|
||||
const list = normalizeList(j, key);
|
||||
return list.map(x => ({
|
||||
id: x.IdMoltiplicatorePrezzo,
|
||||
label: `${x.Descrizione} (x${x.Fattore})`
|
||||
}));
|
||||
}
|
||||
|
||||
if (key === 'AnagraficaCertestObject') {
|
||||
const j = await fetchJson('get_anagrafica_certest_object.php');
|
||||
const list = normalizeList(j, key);
|
||||
return list.map(x => ({
|
||||
id: x.IdAnagrafica,
|
||||
label: `${x.Codice} - ${x.NomeAnagrafica}`
|
||||
}));
|
||||
}
|
||||
|
||||
if (key === 'AnagraficaCertestService') {
|
||||
const j = await fetchJson('get_anagrafica_certest_service.php');
|
||||
const list = normalizeList(j, key);
|
||||
return list.map(x => ({
|
||||
id: x.IdAnagrafica,
|
||||
label: `${x.Codice} - ${x.NomeAnagrafica}`
|
||||
}));
|
||||
}
|
||||
|
||||
if (key === 'ClienteResponsabile') {
|
||||
if (!clientId) return [];
|
||||
const j = await fetchJson('get_cliente_responsabile.php?id_cliente=' + clientId);
|
||||
const list = normalizeList(j, key);
|
||||
|
||||
// supporto due possibili campi:
|
||||
// - {IdClienteResponsabile, Nominativo}
|
||||
// - {Id, Nome} o simili
|
||||
return list.map(x => ({
|
||||
id: x.IdClienteResponsabile ?? x.Id ?? x.id,
|
||||
label: x.Nominativo ?? x.Nome ?? x.name ?? ''
|
||||
})).filter(x => x.id != null && x.label);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
for (const select of selects) {
|
||||
const key = select.dataset.fixedKey;
|
||||
const current = select.dataset.currentValue;
|
||||
|
||||
// IMPORTANT: togli "Loading..." subito (così se crasha non resta bloccato)
|
||||
select.innerHTML = '<option value="">Loading...</option>';
|
||||
|
||||
try {
|
||||
console.log('[fillFixedDropdowns] loading', key);
|
||||
const items = await loadData(key);
|
||||
|
||||
if (!items.length) {
|
||||
select.innerHTML = '<option value="">No data</option>';
|
||||
continue;
|
||||
}
|
||||
|
||||
select.innerHTML = '<option value=""></option>';
|
||||
|
||||
for (const it of items) {
|
||||
const opt = document.createElement('option');
|
||||
opt.value = it.id;
|
||||
opt.textContent = it.label;
|
||||
select.appendChild(opt);
|
||||
}
|
||||
|
||||
if (current) select.value = current;
|
||||
|
||||
} catch (err) {
|
||||
console.error('[fillFixedDropdowns] error for', key, err);
|
||||
select.innerHTML = '<option value="">Error loading data</option>';
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -255,4 +255,20 @@
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
#partsListAnnotations .list-group-item.dragging {
|
||||
opacity: 0.6;
|
||||
background-color: #d1e7dd !important;
|
||||
transform: rotate(3deg);
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
#partsListAnnotations .placeholder {
|
||||
background-color: #f8d7da !important;
|
||||
border: 2px dashed #dc3545;
|
||||
height: 40px;
|
||||
margin: 2px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
</style>
|
||||
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
|
||||
@@ -14,6 +14,7 @@
|
||||
<div style="display: flex; align-items: center;">
|
||||
<button type="button" class="btn btn-info btn-sm" id="renumberPartsBtn" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Rinumera Parti</button>
|
||||
<button type="button" class="btn btn-secondary btn-sm ms-2" id="toggleVoiceBtn" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;"><i class="fas fa-microphone"></i> Voce</button>
|
||||
<button type="button" class="btn btn-info btn-sm ms-2 d-none" id="quotationeBtn" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">Add Quotation</button>
|
||||
<button type="button" class="btn btn-primary btn-sm ms-2" id="showHideImageBtn" style="padding: 0.1rem 0.5rem; font-size: 0.8rem;">
|
||||
<i class="fas fa-eye-slash" style="font-size: 0.8rem;"></i>
|
||||
<i class="fas fa-image ms-1" style="font-size: 0.8rem;"></i>
|
||||
@@ -145,6 +146,24 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Finestra modale "Aggiungi preventivo" -->
|
||||
<div class="modal fade" id="addQuotationModal" tabindex="-1" aria-labelledby="addQuotationModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-md">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="addQuotationModalLabel">Choose a quotation</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<select id="addQuotationSelect" class="form-control form-control-sm" style="width: 100% !important; min-width: 100% !important"></select>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Annulla</button>
|
||||
<button type="button" class="btn btn-primary btn-sm" id="addQuotationBtn">Confirm</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* --- Base --- */
|
||||
@@ -161,6 +180,14 @@
|
||||
max-width: 100% !important
|
||||
}
|
||||
|
||||
#addQuotationModal {
|
||||
z-index: 1060 !important
|
||||
}
|
||||
|
||||
#addQuotationModal .modal-backdrop {
|
||||
z-index: 1055 !important
|
||||
}
|
||||
|
||||
/* Tabelle */
|
||||
#partsTable tr {
|
||||
display: table-row !important
|
||||
|
||||
@@ -6,6 +6,7 @@ $(document).ready(function () {
|
||||
let unsavedChanges = false;
|
||||
let matrici = [];
|
||||
let macroMatrici = [];
|
||||
let quotations = [];
|
||||
|
||||
// --- ROW ID helpers: niente più cache impazzita di jQuery .data() ---
|
||||
function getPartId($row) {
|
||||
@@ -141,7 +142,7 @@ $(document).ready(function () {
|
||||
// ===================
|
||||
// MODAL HANDLING
|
||||
// ===================
|
||||
function loadParts(iddatadb, idquotations) {
|
||||
function loadParts(iddatadb, idquotations, callback = null) {
|
||||
if (iddatadb) {
|
||||
if (matrici.length === 0) {
|
||||
$.ajax({
|
||||
@@ -153,14 +154,14 @@ $(document).ready(function () {
|
||||
loadMacroMatrici();
|
||||
initializeGlobalSelect2();
|
||||
loadPhoto(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations, callback);
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
matrici = [];
|
||||
loadMacroMatrici();
|
||||
initializeGlobalSelect2();
|
||||
loadPhoto(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations, callback);
|
||||
const errorMsg = $(
|
||||
'<div class="alert alert-danger temp-alert" role="alert">Errore nel caricamento delle matrici: ' +
|
||||
error +
|
||||
@@ -180,11 +181,11 @@ $(document).ready(function () {
|
||||
loadMacroMatrici();
|
||||
initializeGlobalSelect2();
|
||||
loadPhoto(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations, callback);
|
||||
}
|
||||
} else {
|
||||
loadPhoto(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations);
|
||||
loadExistingParts(iddatadb, idquotations, callback);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -589,6 +590,8 @@ $(document).ready(function () {
|
||||
if (response.success) {
|
||||
$saveStatus.show();
|
||||
setTimeout(() => $saveStatus.hide(), 2000);
|
||||
|
||||
if (!$("#quotationeBtn").hasClass('d-none')) $("#quotationeBtn").addClass("d-none");
|
||||
} else {
|
||||
const errorMsg = $(
|
||||
'<div class="alert alert-danger temp-alert" role="alert">Errore nel salvataggio: ' +
|
||||
@@ -1155,7 +1158,7 @@ $(document).ready(function () {
|
||||
saveRow($(this).closest("tr"));
|
||||
});
|
||||
|
||||
function loadExistingParts(iddatadb, idquotations) {
|
||||
function loadExistingParts(iddatadb, idquotations, callback = null) {
|
||||
const endpoint = idquotations
|
||||
? "load_parts_quotation.php"
|
||||
: "load_parts.php";
|
||||
@@ -1233,8 +1236,11 @@ $(document).ready(function () {
|
||||
});
|
||||
} else {
|
||||
addNewRow(1, false); // Riga iniziale normale
|
||||
$("#quotationeBtn").removeClass("d-none");
|
||||
}
|
||||
updateRowButtons();
|
||||
|
||||
if (callback) callback();
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
const errorMsg = $(
|
||||
@@ -1787,6 +1793,122 @@ $(document).ready(function () {
|
||||
|
||||
// Esporta la funzione loadParts per essere usata da import_Edit2.php
|
||||
window.loadParts = loadParts;
|
||||
|
||||
$(document).on("click", "#quotationeBtn", function () {
|
||||
$("#addQuotationModal").modal("show");
|
||||
|
||||
if (quotations.length > 0) {
|
||||
reloadQuotations();
|
||||
} else {
|
||||
$.ajax({
|
||||
url: "load_quotations.php",
|
||||
method: "GET",
|
||||
success: function (response) {
|
||||
quotations = response?.quotations || [];
|
||||
|
||||
reloadQuotations();
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
console.error("Errore AJAX caricamento quotations:", error, xhr.responseText);
|
||||
let message = `
|
||||
<div class="alert alert-danger temp-alert" role="alert">
|
||||
Errore nel caricamento delle quotations: ${error} (${xhr.status})
|
||||
</div>
|
||||
`;
|
||||
|
||||
$("#partsModal .modal-body").prepend(errorMsg);
|
||||
|
||||
setTimeout(function () {
|
||||
message.fadeOut(500, function () {
|
||||
$(this).remove();
|
||||
});
|
||||
}, 5000);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on("click", "#addQuotationBtn", function () {
|
||||
const quotationId = $("#addQuotationSelect").val();
|
||||
|
||||
if (quotationId && confirm("Confermo di collegare la quotazione al campione?")) {
|
||||
$("#addQuotationModal").modal("hide");
|
||||
|
||||
loadParts(null, quotationId, () => {
|
||||
$("#quotationeBtn").addClass("d-none");
|
||||
|
||||
setTimeout(() => {
|
||||
$("#partsTableBody tr").each(function () {
|
||||
$(this).find(".save-loading").show();
|
||||
});
|
||||
|
||||
let photoList = $('#photoSelector option').map(function () {
|
||||
return this.value?.split('/')?.pop();
|
||||
}).get();
|
||||
|
||||
if (!photoList.length) {
|
||||
let path = $('#samplePhoto').attr("src")?.split('/')?.pop();
|
||||
|
||||
if (path) photoList = [path];
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "save_parts_photo_iddatadb.php",
|
||||
method: "POST",
|
||||
data: JSON.stringify({
|
||||
iddatadb: $("#partsModal").data("iddatadb"),
|
||||
photoList,
|
||||
partIds: $('#partsTableBody tr').map(function () {
|
||||
return $(this).data("part-id");
|
||||
}).get(),
|
||||
}),
|
||||
success: function () {
|
||||
$("#partsTableBody tr").each(function () {
|
||||
let $row = $(this);
|
||||
let $saveStatus = $row.find(".save-status");
|
||||
let $saveLoading = $row.find(".save-loading");
|
||||
|
||||
$saveLoading.hide();
|
||||
$saveStatus.show();
|
||||
|
||||
setTimeout(() => $saveStatus.hide(), 2000);
|
||||
});
|
||||
}, error: function (xhr, status, error) {
|
||||
let message = `
|
||||
<div class="alert alert-danger temp-alert" role="alert">
|
||||
Errore di salvataggio: ${error} (${xhr.status})
|
||||
</div>
|
||||
`;
|
||||
|
||||
$("#partsModal .modal-body").prepend(message);
|
||||
|
||||
setTimeout(function () {
|
||||
message.fadeOut(500, function () {
|
||||
$(this).remove();
|
||||
});
|
||||
}, 5000);
|
||||
}
|
||||
});
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function reloadQuotations() {
|
||||
if (quotations.length > 0) {
|
||||
$("#addQuotationSelect").empty();
|
||||
|
||||
$("#addQuotationSelect").append("<option value=''>Seleziona Quotation</option>");
|
||||
|
||||
quotations.forEach(quotation => {
|
||||
if (quotation?.description) {
|
||||
$("#addQuotationSelect").append(`<option value='${quotation?.id}'>${quotation?.description}</option>`);
|
||||
}
|
||||
});
|
||||
|
||||
$("#addQuotationSelect").select2();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on("change", ".propagate-date-input", function () {
|
||||
|
||||
@@ -12,9 +12,73 @@ try {
|
||||
|
||||
$iddatadb = intval($_POST['iddatadb']);
|
||||
$idclient = isset($_POST['idclient']) ? (is_numeric($_POST['idclient']) ? intval($_POST['idclient']) : null) : null;
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
// ---------------- FIXED FIELDS (template_fixed_mapping) ----------------
|
||||
|
||||
// ALIAS: fixed_field_key "logico" -> colonna reale su datadb
|
||||
// (NON tocchiamo MySQL, gestiamo solo qui la traduzione)
|
||||
$fixedAliasMap = [
|
||||
'ClienteResponsabile' => 'cliente_responsabile_id',
|
||||
'MoltiplicatorePrezzo' => 'moltiplicatore_prezzo_id',
|
||||
'AnagraficaCertestObject' => 'anagrafica_certest_object_id',
|
||||
'AnagraficaCertestService' => 'anagrafica_certest_service_id',
|
||||
'ClienteFornitore' => 'cliente_fornitore_id',
|
||||
'ConsegnaRichiesta' => 'consegna_richiesta',
|
||||
];
|
||||
|
||||
// 1) Recupera templateid dalla riga datadb (serve per sapere quali fixed_field_key sono permessi)
|
||||
$stmtTpl = $pdo->prepare("SELECT templateid FROM datadb WHERE iddatadb = ?");
|
||||
$stmtTpl->execute([$iddatadb]);
|
||||
$tplRow = $stmtTpl->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
$templateId = isset($tplRow['templateid']) ? (int)$tplRow['templateid'] : 0;
|
||||
if ($templateId <= 0) {
|
||||
throw new Exception("Template non trovato per iddatadb=$iddatadb");
|
||||
}
|
||||
|
||||
// 2) Recupera elenco fixed fields visibili per quel template
|
||||
$fxStmt = $pdo->prepare("
|
||||
SELECT fixed_field_key, data_type, is_required, default_value
|
||||
FROM template_fixed_mapping
|
||||
WHERE template_id = ? AND is_visible_import = 1
|
||||
");
|
||||
$fxStmt->execute([$templateId]);
|
||||
$fixedList = $fxStmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// 3) Crea whitelist LOGICA: fixed_field_key => metadata
|
||||
$fixedWhitelist = [];
|
||||
foreach ($fixedList as $fx) {
|
||||
$k = (string)$fx['fixed_field_key'];
|
||||
|
||||
// sicurezza: key ammessa solo se "safe"
|
||||
if (!preg_match('/^[a-zA-Z0-9_]+$/', $k)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$fixedWhitelist[$k] = [
|
||||
'data_type' => (string)$fx['data_type'], // INT | DATE
|
||||
'is_required' => (int)$fx['is_required'],
|
||||
'default_value' => $fx['default_value'] ?? null
|
||||
];
|
||||
}
|
||||
|
||||
// 3b) Crea whitelist REALE: colonna datadb reale => metadata
|
||||
$realWhitelist = [];
|
||||
foreach ($fixedWhitelist as $logicalKey => $meta) {
|
||||
$realCol = $fixedAliasMap[$logicalKey] ?? $logicalKey;
|
||||
|
||||
// sicurezza: anche la colonna reale deve essere "safe"
|
||||
if (!preg_match('/^[a-zA-Z0-9_]+$/', $realCol)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$realWhitelist[$realCol] = $meta;
|
||||
}
|
||||
|
||||
// ---------------- DETAILS (import_data_details) ----------------
|
||||
$data = $_POST;
|
||||
$details = [];
|
||||
|
||||
@@ -56,27 +120,82 @@ try {
|
||||
|
||||
foreach ($changed as $mappingId => $values) {
|
||||
$updateStmt->execute([
|
||||
':newValue' => $values['new'],
|
||||
':iddatadb' => $iddatadb,
|
||||
':mappingId' => $mappingId
|
||||
':newValue' => $values['new'],
|
||||
':iddatadb' => $iddatadb,
|
||||
':mappingId' => $mappingId
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Aggiorna idclient in datadb
|
||||
// ---------------- UPDATE datadb: idclient + FIXED FIELDS ----------------
|
||||
$setParts = [];
|
||||
$params = [];
|
||||
|
||||
// 5a) idclient (se presente)
|
||||
if (isset($idclient)) {
|
||||
$updateStmt = $pdo->prepare("
|
||||
UPDATE datadb
|
||||
SET idclient = :idclient
|
||||
WHERE iddatadb = :iddatadb
|
||||
");
|
||||
$updateStmt->execute([
|
||||
':idclient' => $idclient,
|
||||
':iddatadb' => $iddatadb
|
||||
]);
|
||||
$response['message'] = !empty($changed) ? "Updated details and idclient successfully" : "Updated idclient successfully";
|
||||
$setParts[] = "idclient = ?";
|
||||
$params[] = $idclient;
|
||||
}
|
||||
|
||||
// 5b) fixed fields dal POST
|
||||
// QUI è il punto chiave: accettiamo SOLO colonne reali (realWhitelist),
|
||||
// ma se dal JS arrivassero ancora key logiche, funzionerebbe uguale
|
||||
// perché sotto controlliamo anche l'alias.
|
||||
foreach ($realWhitelist as $realCol => $meta) {
|
||||
|
||||
$postKeyToRead = null;
|
||||
|
||||
// Caso 1: POST contiene già la colonna reale
|
||||
if (array_key_exists($realCol, $_POST)) {
|
||||
$postKeyToRead = $realCol;
|
||||
} else {
|
||||
// Caso 2: POST contiene la key logica -> troviamo quale logica mappa su questa colonna reale
|
||||
// (fallback, utile se non hai ancora aggiornato il JS)
|
||||
foreach ($fixedAliasMap as $logical => $mappedReal) {
|
||||
if ($mappedReal === $realCol && array_key_exists($logical, $_POST)) {
|
||||
$postKeyToRead = $logical;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($postKeyToRead === null) {
|
||||
continue; // non inviato
|
||||
}
|
||||
|
||||
$val = $_POST[$postKeyToRead];
|
||||
|
||||
// Normalizzazione per tipo
|
||||
if ($meta['data_type'] === 'DATE') {
|
||||
$val = trim((string)$val);
|
||||
$val = ($val === '') ? null : $val; // atteso formato Y-m-d
|
||||
} else { // INT
|
||||
$val = trim((string)$val);
|
||||
$val = ($val === '') ? null : (int)$val;
|
||||
}
|
||||
|
||||
$setParts[] = "`$realCol` = ?";
|
||||
$params[] = $val;
|
||||
}
|
||||
|
||||
// esegui update solo se c'è qualcosa da aggiornare
|
||||
if (!empty($setParts)) {
|
||||
$params[] = $iddatadb;
|
||||
|
||||
$sqlUpd = "UPDATE datadb SET " . implode(", ", $setParts) . " WHERE iddatadb = ?";
|
||||
$updStmt = $pdo->prepare($sqlUpd);
|
||||
$updStmt->execute($params);
|
||||
}
|
||||
|
||||
// Messaggio risposta (mantengo la tua logica ma includo fixed)
|
||||
if (!empty($setParts) && !empty($changed)) {
|
||||
$response['message'] = "Updated details and datadb fields successfully";
|
||||
} elseif (!empty($setParts)) {
|
||||
$response['message'] = "Updated datadb fields successfully";
|
||||
} elseif (!empty($changed)) {
|
||||
$response['message'] = "Updated details successfully";
|
||||
} else {
|
||||
$response['message'] = !empty($changed) ? "Updated details successfully" : "No changes found";
|
||||
$response['message'] = "No changes found";
|
||||
}
|
||||
|
||||
$response['success'] = true;
|
||||
|
||||
@@ -20,19 +20,82 @@ $mappingId = $data['id'];
|
||||
$mappingType = $data['mapping_type'] ?? '';
|
||||
$excelColumn = $data['excel_column'] ?? null;
|
||||
$manualDefault = $data['manual_default'] ?? null;
|
||||
|
||||
$autoValue = $data['auto_value'] ?? 'none';
|
||||
$tablename = $data['tablename'] ?? '';
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare("UPDATE template_mapping SET is_manual = ?, excel_column = ?, manual_default = ? WHERE id = ?");
|
||||
$isManual = ($mappingType === 'manual') ? 1 : 0;
|
||||
$result = $stmt->execute([$isManual, $excelColumn, $manualDefault, $mappingId]);
|
||||
// Normalize mapping type
|
||||
$allowedTypes = ['', 'xls', 'manual', 'auto'];
|
||||
if (!in_array($mappingType, $allowedTypes, true)) {
|
||||
echo json_encode(["success" => false, "message" => "Invalid mapping_type"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Normalize auto_value
|
||||
$allowedAuto = ['none', 'import_date', 'import_time', 'export_date', 'export_time'];
|
||||
if (!in_array($autoValue, $allowedAuto, true)) {
|
||||
$autoValue = 'none';
|
||||
}
|
||||
|
||||
// Decide what to persist based on mapping_type
|
||||
$isManual = 0;
|
||||
$excelToSave = null;
|
||||
$manualToSave = null;
|
||||
$autoToSave = 'none';
|
||||
|
||||
if ($mappingType === 'xls') {
|
||||
$isManual = 0;
|
||||
$excelToSave = $excelColumn ?: null;
|
||||
$manualToSave = null;
|
||||
$autoToSave = 'none';
|
||||
} elseif ($mappingType === 'manual') {
|
||||
$isManual = 1;
|
||||
$excelToSave = null;
|
||||
$manualToSave = $manualDefault;
|
||||
$autoToSave = 'none';
|
||||
} elseif ($mappingType === 'auto') {
|
||||
$isManual = 0;
|
||||
$excelToSave = null;
|
||||
$manualToSave = null;
|
||||
$autoToSave = $autoValue ?: 'none';
|
||||
} else {
|
||||
// reset
|
||||
$isManual = 0;
|
||||
$excelToSave = null;
|
||||
$manualToSave = null;
|
||||
$autoToSave = 'none';
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE template_mapping
|
||||
SET
|
||||
is_manual = ?,
|
||||
excel_column = ?,
|
||||
manual_default = ?,
|
||||
auto_value = ?
|
||||
WHERE id = ?
|
||||
");
|
||||
|
||||
$result = $stmt->execute([$isManual, $excelToSave, $manualToSave, $autoToSave, $mappingId]);
|
||||
|
||||
if (!$result) {
|
||||
echo json_encode(["success" => false, "message" => "Database update failed"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode(["success" => true, "message" => "Mapping updated successfully", "data" => $data]); // Aggiunto debug
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => "Mapping updated successfully",
|
||||
"saved" => [
|
||||
"id" => (int)$mappingId,
|
||||
"mapping_type" => $mappingType,
|
||||
"is_manual" => $isManual,
|
||||
"excel_column" => $excelToSave,
|
||||
"manual_default" => $manualToSave,
|
||||
"auto_value" => $autoToSave
|
||||
]
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["success" => false, "message" => "Error: " . $e->getMessage()]);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
include('include/headscript.php');
|
||||
|
||||
$dbHandler = DBHandlerSelect::getInstance();
|
||||
$pdo = $dbHandler->getConnection();
|
||||
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
$iddatadb = $data['iddatadb'] ?? null;
|
||||
$partIds = $data['partIds'] ?? [];
|
||||
$photoList = $data['photoList'] ?? null;
|
||||
|
||||
if ($iddatadb) {
|
||||
if (count($partIds) != 0) {
|
||||
$idList = array_values(array_map('intval', $partIds));
|
||||
$placeholders = [];
|
||||
$parameters = [':iddatadb' => $iddatadb];
|
||||
|
||||
foreach ($idList as $index => $id) {
|
||||
$paramName = ":id{$index}";
|
||||
$placeholders[] = $paramName;
|
||||
$parameters[$paramName] = $id;
|
||||
}
|
||||
|
||||
$sql = 'UPDATE identification_parts SET iddatadb = :iddatadb WHERE id IN (' . implode(',', $placeholders) . ')';
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($parameters);
|
||||
}
|
||||
|
||||
if (count($photoList) != 0) {
|
||||
$placeholders = [];
|
||||
$parameters = [':iddatadb' => $iddatadb];
|
||||
|
||||
foreach ($photoList as $index => $photo) {
|
||||
$paramName = ":photo{$index}";
|
||||
$placeholders[] = $paramName;
|
||||
$parameters[$paramName] = $photo;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare('UPDATE datadb_photos SET iddatadb = :iddatadb WHERE file_path IN (' . implode(',', $placeholders) . ')');
|
||||
$stmt->execute($parameters);
|
||||
}
|
||||
|
||||
echo json_encode(['success' => true, 'message' => '']);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => 'Dati mancanti']);
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,60 +1,881 @@
|
||||
{
|
||||
"@odata.context": "https:\/\/93.43.5.102\/limsapi\/api\/odata\/$metadata#SchemaCustomField",
|
||||
"@odata.context": "https:\/\/bvcpsitaly-elims.com\/limsapi\/api\/odata\/$metadata#SchemaCustomField",
|
||||
"value": [
|
||||
{
|
||||
"IdSchemaCustomFields": 41,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Labostudio",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 42,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Schema 1",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 43,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Schema1",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 44,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Cuoio\/Pelle Standard \/ Leather",
|
||||
"Descrizione": "Schema per tutti i campioni in cuoio\/pelle per i quali non \u00e8 specificato un destinatario.\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 45,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Borse",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 46,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Borse Burberry",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 47,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "pelle calzatura",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 48,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Standard Generico \/ Generic Standard",
|
||||
"Descrizione": "Schema per tutti i campioni di qualsiasi matrice escluso cuoio\/pelle\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 49,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Accessori Metallici \/ Metallic Accessories",
|
||||
"Descrizione": "Schema per tutti gli Accessori Metallici\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 50,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Tessile \/ Textiles",
|
||||
"Descrizione": "Schema per tutti i Tessuti\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 52,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Brasport",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 54,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Chanel Calzatura",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 55,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Burberry",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 57,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_Ralph Lauren - Tessile",
|
||||
"Descrizione": "Schema per tutti i campioni in tessuto per Ralph Lauren.\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 58,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LIU JO",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 59,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Migrazione tra Componenti",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 60,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Prova Outsourcing",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 61,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Marc Jacobs",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 62,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "A. TESTONI",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 63,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Chanel CHINA PROJECT",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 66,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "GUESS",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 68,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Valentino",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 69,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "DESIGUAL",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 70,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "FENDI PELLETTERIA",
|
||||
"Descrizione": "Solo per FENDI Pelletteria_INGLESE\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 71,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_Cuoio\/Pelle Standard ACCREDIA",
|
||||
"Descrizione": "Schema per tutti i campioni in cuoio\/pelle per i quali non \u00e8 specificato un destinatario.\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 72,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_BALLY",
|
||||
"Descrizione": "sia per calzatura che pelletteria. Aggiunto campo TEST DESCRIPTION, compreso nella fatturazione per le divisioni pelletteria.\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 73,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_Ralph Lauren - Leather",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 74,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_Ralph Lauren - Fabric",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 76,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "NORDSTROM",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 77,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ONWARD LUXURY GROUP",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 78,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "P&G SRL_Progetto Durability",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 79,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Bally qualsiasi divisione",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 80,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "FENDI CALZATURA",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 81,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LouBoutin",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 82,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "MONCLER Brand",
|
||||
"Descrizione": "Da utilizzare solo per il Brand Diretto\r\nGR 19\/03\/2024"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 83,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "JIMMY CHOO",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 84,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Yves Saint Laurent",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 85,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "BENETTON",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 86,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "UPLOAD REPORT",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 87,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Hermes Calzatura",
|
||||
"Descrizione": "\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 88,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "C&A",
|
||||
"Descrizione": "Schema per fornitori e C&A diretto\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 89,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "AMERICAN EAGLE",
|
||||
"Descrizione": "Schema per American Eagle\/Todd snyder\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 91,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Ferragamo",
|
||||
"Descrizione": "\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 93,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_Alexander McQueen",
|
||||
"Descrizione": "\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 95,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Balenciaga Pelletteria",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 96,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "DUNHILL",
|
||||
"Descrizione": "SCHEMA DUNHILL tutti i tipi di campioni\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 97,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "PRELIEVI ACQUE",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 98,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LouBoutin_Tossicologico",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 99,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ROBAN'S ",
|
||||
"Descrizione": "tutte le divisioni\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 100,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "PROGETTO LUGGAGE",
|
||||
"Descrizione": "Progetto Luggage Hermes\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 102,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Balmain",
|
||||
"Descrizione": "Schema per tutti i campioni Balmain"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 103,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ZDHC",
|
||||
"Descrizione": "Schema di Riferimento ZDHC Wastewaters"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 104,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "GUCCI CDC 4172",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 105,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_ASOS",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 106,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_BOUX AVENUE",
|
||||
"Descrizione": "28\/09 no indicazioni su esigenze di fatturazione (detto da Frosini)\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 107,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "BONPOINT",
|
||||
"Descrizione": "05\/10 creazione\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 108,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Canada Goose",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 109,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "DIESEL",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 110,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "AQC_Leather",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 111,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "BEAUMANOIR (CC-Mor-Bon-Breal)",
|
||||
"Descrizione": "04\/02\/21_ AGGIORNATO 05\/08\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 112,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "BooHoo",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 114,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Golden Goose",
|
||||
"Descrizione": "Golden goose\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 115,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_ZLABEL",
|
||||
"Descrizione": "Schema per ZLABEL"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 116,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Zadig & Voltaire",
|
||||
"Descrizione": "Schema per Zadig & Voltaire"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 117,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Gemo",
|
||||
"Descrizione": "Schema solo per Gemo\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 118,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "PROMOD",
|
||||
"Descrizione": "CHF 06\/08\r\n\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 119,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LA HALLE (BEAUMANOIR)",
|
||||
"Descrizione": "13\/08\/2021 CHF\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 120,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LA REDOUTE",
|
||||
"Descrizione": "14\/09\/2021 AD\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 121,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "TOD'S",
|
||||
"Descrizione": "Schema per materiale gb18401 e GB20400\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 122,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ASOS rev 1",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 123,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Monoprix",
|
||||
"Descrizione": "Schema per Monoprix\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 124,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "DIOR Ita",
|
||||
"Descrizione": "CHF 21\/03\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 125,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "GEOX - Raw Material",
|
||||
"Descrizione": "SCHEMA DA USARE SOLO PER GEOX - SOLO PER LE SUOLE E MATERIALI DENOMINATI RPU \/ RAW MATERIAL"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 126,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "CAMAIEU",
|
||||
"Descrizione": "SCHEMA DA USARE SOLO PER CAMAIEU\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 127,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_Golden Goose FTW",
|
||||
"Descrizione": "Golden goose\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 128,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "STEVE MADDEN - FOOTWEAR",
|
||||
"Descrizione": "DA UTILIZZARE SOLO PER DESTINAZIONE D'USO CALZATURA\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 129,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_Carhartt",
|
||||
"Descrizione": "SCHEMA DA UTILIZZARE SOLO PER RICHIESTE UFFICIALI CARHARTT\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 131,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "DAMART",
|
||||
"Descrizione": "\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 132,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Gruppo OTB",
|
||||
"Descrizione": "Schema per Staff International, Diesel e Brave kid\r\n\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 133,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "FERRARI",
|
||||
"Descrizione": "Schema da usare per Ferrari e fornitori\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 134,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "GAP - ABBIGLIAMENTO",
|
||||
"Descrizione": "Schema GAP da utilizzare solo per destinazione abbigliamento\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 135,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "GAP - CALZATURA",
|
||||
"Descrizione": "Schema GAP da utilizzare solo per destinazione calzatura\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 136,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "SALLING GROUP",
|
||||
"Descrizione": "Schema per Salling Group\r\n\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 137,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "SOFT SURROUNDINGS",
|
||||
"Descrizione": "Schema da utilizzare per Soft Surroundings\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 138,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "E-LIMS - Cuoio\/Pelle Standard \/ Leather",
|
||||
"Descrizione": "Schema da utilizzare solo per accettazioni online\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 139,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_ZALANDO",
|
||||
"Descrizione": "Schema per ZALANDO ------ (NON per ZLABEL che ha il suo)\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 140,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LVMH",
|
||||
"Descrizione": "gennaio 2023\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 141,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Valentino - eLims",
|
||||
"Descrizione": "SCHEMA DA UTILIZZARE SOLO PER L'ACCETTAZIONE ONLINE DI VALENTINO"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 142,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "FENDI PELLETTERIA COMPLIANCE",
|
||||
"Descrizione": "Solo per FENDI Pelletteria_INGLESE 04\/05\/2023\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 143,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "TAPESTRY",
|
||||
"Descrizione": "04\/05\/2023, agg secondo procedura 08\/11\/23\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 144,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ALEXANDER MC QUEEN",
|
||||
"Descrizione": "ALEXANDER MC QUEEN 15\/05\/2023\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 145,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Hermes_Chimici_Parigi",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 146,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "CELINE ABBIGLIAMENTO_Progetto Speciale",
|
||||
"Descrizione": "IO 202 CELINE ABBIGLIAMENTO_06\/06\/203_CHF\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 147,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "GEOX - Prodotto Finito",
|
||||
"Descrizione": "SCHEMA DA USARE SOLO PER GEOX - SOLO PER PRODOTTO FINITO"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 149,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Hermes\/IDO",
|
||||
"Descrizione": "creato il 05\/07\/2023 CHF\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 150,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Tessile \/ Textiles PER CLIENTI CON OBLO",
|
||||
"Descrizione": "Schema per tutti i Tessuti QUANDO IL CLIENTE NECESSITA DI NR OBLO\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 151,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "J JIll",
|
||||
"Descrizione": "Schema per cliente J JIll, necessario riportare la recommended fiber content in schema verde\r\n\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 152,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "AUCHAN - TAPE A L'OEIL",
|
||||
"Descrizione": "Schema AUCHAN da utilizzare solo per la divisione TAPE A L'OEIL SA, successivamente se uguale da usare anche per le altre divisioni ed uniformarlo come generico"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 153,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ALL SAINTS - BUSCEMI",
|
||||
"Descrizione": "SCHE DA USARE SOLO PER ALL SAINTS E BUSCEMI\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 154,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "CELINE - LVMH",
|
||||
"Descrizione": "Schema con aggiunta campi LVMH per estrazioni\r\nAD-29\/03\/2024"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 155,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "SeyMeChamLou",
|
||||
"Descrizione": "DA USARE SOLO PER SEYMECHAMLOU (LOUBOUTIN)\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 156,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "PRADA",
|
||||
"Descrizione": "PER ADESSO DA USARE PER ABBIGLIAMENTO E CALZATURA\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 157,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Hermes_HCP",
|
||||
"Descrizione": "Schema per unicamente HCP"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 158,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "STONE ISLAND",
|
||||
"Descrizione": "Schema per tutti i campioni in cuoio\/pelle per i quali non \u00e8 specificato un destinatario.\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 159,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Chanel_Pierre Damien",
|
||||
"Descrizione": "Schema da usare per Campioni ricevuti da Pierre-Damien Verine e suo staff CHANEL.\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 160,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Z_ACNE",
|
||||
"Descrizione": "\r\n.\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 161,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "OBERALP GROUP",
|
||||
"Descrizione": "Schema da usare solo per Oberalp Group\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 162,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Club Monaco",
|
||||
"Descrizione": "da usare solo per Club Monaco GR 20\/02\/2024"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 163,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Devred",
|
||||
"Descrizione": "Schema creato per cliente DEVRED\r\nGR 18\/03\/2024\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 164,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "MONCLER Supplier",
|
||||
"Descrizione": "Da utilizzare per fornitori Moncler \r\nGR 19\/03\/2024"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 165,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Kering Sunglasses",
|
||||
"Descrizione": "Schema per tutti i campioni di qualsiasi matrice escluso cuoio\/pelle\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 166,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Giorgio Armani",
|
||||
"Descrizione": "\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 167,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Chanel USA",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 168,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Staff Calzatura",
|
||||
"Descrizione": "Schema per tutti i campioni di qualsiasi matrice escluso cuoio\/pelle\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 169,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "P&G SRL",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 170,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "INCOM",
|
||||
"Descrizione": "Schema da utilizzare per INCOM"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 171,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "RIVER ISLAND",
|
||||
"Descrizione": "SCHEDA DA USARE SOLO PER RIVER ISLAND - NO CALZATURA\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 172,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Longchamp",
|
||||
"Descrizione": "Schema per tutti i campioni con RIchiesta Longchamp ufficiale\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 173,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Bottega Veneta",
|
||||
"Descrizione": "Schema per tutti i campioni di Bottega Veneta di Stella"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 174,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Mint Velvet",
|
||||
"Descrizione": "Schema per tutti i campioni di Mint Velvel con richiesta ufficiale.\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 176,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "RIVER ISLAND FOOTWEAR",
|
||||
"Descrizione": "SCHEDA DA USARE SOLO PER RIVER ISLAND - USARE SOLO PER\r\n CALZATURA\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 177,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Phoebe philo ACC",
|
||||
"Descrizione": "(scarpe, borse, cinture, occhiali, gioielleria)\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 178,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "New Guards Group",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 179,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Giorgio Armani Operation",
|
||||
"Descrizione": "\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 180,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Chloe'",
|
||||
"Descrizione": "\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 181,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LVMH non diretti",
|
||||
"Descrizione": "utilizzato ogni qualvolta siano caricati pacchetti \/ prove singole che non rientrano nel programma LVMH \r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 182,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Ralph Lauren - All testing V.6",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 183,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "TWINSET",
|
||||
"Descrizione": "Schema da usare per Twinset - come da mail di EP del 20\/05\/2025\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 184,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ACNE STUDIOS rev 01",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 185,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Brunello cucinelli",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 186,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "TWINSET",
|
||||
"Descrizione": "Schema per tutti i campioni di qualsiasi matrice escluso cuoio\/pelle\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 187,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LORO PIANA",
|
||||
"Descrizione": "Schema per tutti i campioni Loro Piana\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 188,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LEMAIRE",
|
||||
"Descrizione": "Schema per tutti i campioni in cuoio\/pelle per i quali non \u00e8 specificato un destinatario.\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 189,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "TEST_IT_SCHEMA",
|
||||
"Descrizione": "Test per IT"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 190,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "LBS Interscambio",
|
||||
"Descrizione": "Schema per tutti i campioni interscambio LBS\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 191,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "KIABI",
|
||||
"Descrizione": "Schema per il cliente Kiabi\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 192,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "INDITEX",
|
||||
"Descrizione": "Schema da usare solo per richieste INDITEX"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 193,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "AQC_Other materials",
|
||||
"Descrizione": null
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 194,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Hermes ADM & Silk",
|
||||
"Descrizione": "SCHEMA DA USARE SOLO PER LA DIVISIONE ADM & SILK\r\n\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 195,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "Chloe'_APPAREL",
|
||||
"Descrizione": "Schema aggiornato il 18\/12\/25 secondo modulo excel x codifica Elims\r\nGR"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 196,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "DUNHILL_DRAFT NON USARE",
|
||||
"Descrizione": "SCHEMA DUNHILL NON USARE STUDIO NUOVA PROCEDURA NOVEMBRE 2025\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 197,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "BERLUTI - LVMH",
|
||||
"Descrizione": "Creato per accettazione Elims\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 198,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "PIAGET (gruppo Cartier)",
|
||||
"Descrizione": "Schema per tutti i campioni PIAGET (gruppo Cartier)\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 199,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "HERMES PAP FEMME",
|
||||
"Descrizione": "Schema per tutti i campioni di HERMES PAP FEMME \r\n15\/01\/2025\r\n\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 200,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "CARHARTT ( provvisiorio in revisione)",
|
||||
"Descrizione": "Schema per tutti i campioni CARHARTT provvissorio\r\n\r\n"
|
||||
},
|
||||
{
|
||||
"IdSchemaCustomFields": 201,
|
||||
"ConteggioClienti": 0,
|
||||
"Nome": "ROSSIMODA",
|
||||
"Descrizione": "Per tutti i campioni di ROSSIMODA\r\n\r\n"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
require_once(__DIR__ . '/include/headscript.php');
|
||||
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
$id = (int)($input['id'] ?? 0);
|
||||
$field = (string)($input['field'] ?? '');
|
||||
$value = $input['value'] ?? null;
|
||||
|
||||
if ($id <= 0) {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid id']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$allowed = ['default_value', 'is_visible_import', 'is_required'];
|
||||
if (!in_array($field, $allowed, true)) {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid field']);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($field === 'is_visible_import' || $field === 'is_required') {
|
||||
$value = ((int)$value === 1) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
$sql = "UPDATE template_fixed_mapping SET {$field} = :val WHERE id = :id";
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$ok = $stmt->execute([':val' => $value, ':id' => $id]);
|
||||
|
||||
echo json_encode(['success' => (bool)$ok]);
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
require_once 'include/headscript.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
$template_id = isset($data['template_id']) ? (int)$data['template_id'] : 0;
|
||||
$mapping_id = isset($data['mapping_id']) ? (int)$data['mapping_id'] : 0;
|
||||
$value = isset($data['value']) ? (int)$data['value'] : null;
|
||||
|
||||
// Validate input
|
||||
if ($template_id <= 0 || $mapping_id <= 0 || $value === null) {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid input']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Normalize to 0/1
|
||||
$value = ($value === 1) ? 1 : 0;
|
||||
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
$stmt = $pdo->prepare("UPDATE template_mapping SET is_visible_parts = ? WHERE id = ? AND template_id = ?");
|
||||
$result = $stmt->execute([$value, $mapping_id, $template_id]);
|
||||
|
||||
if ($result) {
|
||||
echo json_encode(['success' => true]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to update is_visible_parts']);
|
||||
}
|
||||
Reference in New Issue
Block a user