diff --git a/public/userarea/annotationsModal.js b/public/userarea/annotationsModal.js
deleted file mode 100644
index 05e4dc3..0000000
--- a/public/userarea/annotationsModal.js
+++ /dev/null
@@ -1,1473 +0,0 @@
-$(document).ready(function () {
- // ===================
- // GLOBAL STATE
- // ===================
- let photoData = {
- naturalWidth: 0,
- naturalHeight: 0,
- displayWidth: 0,
- displayHeight: 0,
- scale: 1,
- };
-
- let photoAnnotations = {};
- let partColors = {};
- let selectedPartNumber = null;
- let unsavedChanges = false;
- let fabricCanvas = null;
- let descriptionTextbox = null;
- let markerObjects = {};
- let partsListData = [];
-
- // ===================
- // MODAL INITIALIZATION
- // ===================
- window.initAnnotationsModal = function (iddatadb, idquotations, trfHeader) {
- console.log("initAnnotationsModal chiamato con:", {
- iddatadb,
- idquotations,
- trfHeader,
- });
-
- if (!iddatadb && !idquotations) {
- const errorMsg = $(
- '
Errore: ID TRF mancante. Impossibile inizializzare il modale delle annotazioni.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- $("#trfHeaderAnnotations").text(trfHeader || "N/D");
- $("#annotationsModal")
- .data("iddatadb", iddatadb || null)
- .data("idquotations", idquotations || null);
-
- loadPhoto(iddatadb, idquotations);
- loadExistingParts(iddatadb, idquotations);
-
- const modalElement = document.getElementById("annotationsModal");
- if (!modalElement) {
- console.error("Elemento #annotationsModal non trovato nel DOM.");
- alert(
- "Errore: Il modale delle annotazioni non è presente nel DOM.",
- );
- return;
- }
- let modal = bootstrap.Modal.getInstance(modalElement);
- if (!modal) {
- modal = new bootstrap.Modal(modalElement, {
- backdrop: true,
- keyboard: true,
- focus: true,
- });
- }
- modal.show();
-
- // Debug: Verifica presenza elementi DOM
- console.log(
- "Presenza #partsListAnnotations:",
- $("#partsListAnnotations").length,
- );
- console.log(
- "Presenza #showMixPartsAnnotations:",
- $("#showMixPartsAnnotations").length,
- );
- console.log(
- "Presenza #addDescriptionsBtnAnnotations:",
- $("#addDescriptionsBtnAnnotations").length,
- );
- console.log(
- "Presenza #removeAnnotationsBtnAnnotations:",
- $("#removeAnnotationsBtnAnnotations").length,
- );
- console.log(
- "Presenza #downloadPhotoBtnAnnotations:",
- $("#downloadPhotoBtnAnnotations").length,
- );
- console.log(
- "Presenza #backToPartsBtnAnnotations:",
- $("#backToPartsBtnAnnotations").length,
- );
- console.log(
- "Presenza #overlayCanvasAnnotations:",
- $("#overlayCanvasAnnotations").length,
- );
- };
-
- $("#annotationsModal").on("hide.bs.modal", function (e) {
- if (
- unsavedChanges &&
- !confirm("Hai modifiche non salvate. Vuoi davvero uscire?")
- ) {
- e.preventDefault();
- }
- });
-
- $("#annotationsModal").on("hidden.bs.modal", function () {
- photoData = {
- naturalWidth: 0,
- naturalHeight: 0,
- displayWidth: 0,
- displayHeight: 0,
- scale: 1,
- };
- photoAnnotations = {};
- partColors = {};
- selectedPartNumber = null;
- unsavedChanges = false;
- partsListData = [];
- if (fabricCanvas) {
- fabricCanvas.off();
- fabricCanvas.dispose();
- fabricCanvas = null;
- }
- descriptionTextbox = null;
- markerObjects = {};
- $("#photoSelectorContainerAnnotations").empty().hide();
- $("#samplePhotoAnnotations").attr("src", "");
- $("#partsListAnnotations").empty();
- $(".temp-alert").remove();
-
- const modalElement = document.getElementById("annotationsModal");
- const modal = bootstrap.Modal.getInstance(modalElement);
- if (modal) {
- modal.dispose();
- }
- $(".modal-backdrop").remove();
- $("body").removeClass("modal-open");
- $("body").css("padding-right", "");
- $(":focus").blur();
- });
-
- // ===================
- // PHOTO LOADERS
- // ===================
- function loadPhoto(iddatadb, idquotations) {
- const currentPhoto = $("#samplePhotoAnnotations").attr("src");
- const endpoint = idquotations
- ? "load_photo_quotation.php"
- : "load_photo.php";
- const data = idquotations
- ? { idquotations: idquotations }
- : { iddatadb: iddatadb };
- $.ajax({
- url: endpoint,
- method: "GET",
- data: data,
- success: function (response) {
- console.log("Risposta da load_photo:", response);
- if (response.success) {
- if (response.photos && response.photos.length > 1) {
- showPhotoSelector(response.photos, currentPhoto);
- } else if (
- response.photos &&
- response.photos.length === 1
- ) {
- loadSinglePhoto(response.photos[0]);
- } else {
- $("#samplePhotoAnnotations").attr("src", "");
- const errorMsg = $(
- 'Nessuna foto trovata per questo elemento.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- }
- } else {
- const errorMsg = $(
- '' +
- (response.message ||
- "Errore nel caricamento della foto.") +
- "
",
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- }
- },
- error: function (xhr, status, error) {
- console.error("Errore AJAX in loadPhoto:", {
- status,
- error,
- responseText: xhr.responseText,
- });
- const errorMsg = $(
- 'Errore nel caricamento della foto: ' +
- error +
- " (" +
- xhr.status +
- ")
",
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- },
- });
- }
-
- function showPhotoSelector(photos, selected = null) {
- const selectorContainer = $("#photoSelectorContainerAnnotations");
- selectorContainer.empty().show();
- const selector = $(
- ' ',
- );
- photos.forEach((photo, index) => {
- const photoName = photo.split("/").pop();
- const option = $(" ")
- .val(photo)
- .text(`Photo ${index + 1} - ${photoName}`);
- selector.append(option);
- });
- selector.on("change", function () {
- loadSinglePhoto($(this).val());
- });
- selectorContainer.append(selector);
- const photoToSelect =
- selected && photos.includes(selected) ? selected : photos[0];
- if (photoToSelect) {
- selector.val(photoToSelect);
- loadSinglePhoto(photoToSelect);
- }
- }
-
- function loadSinglePhoto(photoPath) {
- const img = $("#samplePhotoAnnotations");
- img.off("load").attr("src", photoPath);
- img.on("load", function () {
- console.log("Foto caricata:", photoPath);
- const canvas = document.getElementById("photoCanvasAnnotations");
- const ctx = canvas.getContext("2d");
- const naturalWidth = img[0].naturalWidth;
- const naturalHeight = img[0].naturalHeight;
- const parent = $(canvas).parent();
- const maxW = parent.width();
- const maxH = parent.height();
- const scale = Math.min(maxW / naturalWidth, maxH / naturalHeight);
-
- photoData = {
- naturalWidth,
- naturalHeight,
- displayWidth: Math.max(1, Math.round(naturalWidth * scale)),
- displayHeight: Math.max(1, Math.round(naturalHeight * scale)),
- scale,
- };
-
- canvas.width = naturalWidth;
- canvas.height = naturalHeight;
- canvas.style.width = `${photoData.displayWidth}px`;
- canvas.style.height = `${photoData.displayHeight}px`;
-
- ctx.clearRect(0, 0, naturalWidth, naturalHeight);
- ctx.drawImage(img[0], 0, 0, naturalWidth, naturalHeight);
-
- if (fabricCanvas) {
- fabricCanvas.off();
- fabricCanvas.dispose();
- fabricCanvas = null;
- }
-
- const overlayCanvas = document.getElementById(
- "overlayCanvasAnnotations",
- );
- const canvasContainer = overlayCanvas.parentElement;
- const newOverlayCanvas = document.createElement("canvas");
- newOverlayCanvas.id = "overlayCanvasAnnotations";
- newOverlayCanvas.width = photoData.displayWidth;
- newOverlayCanvas.height = photoData.displayHeight;
- newOverlayCanvas.style.width = `${photoData.displayWidth}px`;
- newOverlayCanvas.style.height = `${photoData.displayHeight}px`;
- newOverlayCanvas.style.position = "absolute";
- newOverlayCanvas.style.top = "0";
- newOverlayCanvas.style.left = "0";
- newOverlayCanvas.style.zIndex = "1000";
-
- canvasContainer.removeChild(overlayCanvas);
- canvasContainer.appendChild(newOverlayCanvas);
-
- setTimeout(() => {
- fabricCanvas = new fabric.Canvas("overlayCanvasAnnotations", {
- selection: true,
- preserveObjectStacking: true,
- width: photoData.displayWidth,
- height: photoData.displayHeight,
- });
-
- fabricCanvas.setDimensions({
- width: photoData.displayWidth,
- height: photoData.displayHeight,
- });
-
- fabricCanvas.on("mouse:down", function (options) {
- console.log(
- "Evento mouse:down su canvas, selectedPartNumber:",
- selectedPartNumber,
- );
- if (selectedPartNumber === null) {
- console.log(
- "Nessuna parte selezionata, ignoro il click.",
- );
- return;
- }
- if (options.target) {
- console.log("Click su un oggetto esistente, ignoro.");
- return;
- }
- const pointer = fabricCanvas.getPointer(options.e);
- const x = pointer.x / photoData.scale;
- const y = pointer.y / photoData.scale;
- const currentPhoto = $("#samplePhotoAnnotations").attr(
- "src",
- );
-
- if (!photoAnnotations[currentPhoto]) {
- photoAnnotations[currentPhoto] = {
- markers: [],
- hasDescriptions: false,
- descriptionPosition: { x: 10, y: 10 },
- descriptionSize: {
- width: photoData.displayWidth * 0.3,
- height: photoData.displayHeight * 0.3,
- },
- };
- }
-
- const partColor =
- partColors[selectedPartNumber] || "#ff0000";
- const existingMarker = photoAnnotations[
- currentPhoto
- ].markers.find((m) => m.partNumber == selectedPartNumber);
-
- if (existingMarker) {
- existingMarker.x = x;
- existingMarker.y = y;
- existingMarker.color = partColor;
- } else {
- photoAnnotations[currentPhoto].markers.push({
- partNumber: selectedPartNumber,
- x,
- y,
- color: partColor,
- });
- }
-
- console.log("Marker aggiunto/spostato:", {
- partNumber: selectedPartNumber,
- x,
- y,
- color: partColor,
- });
- updateMarkers();
- markUnsaved();
- selectedPartNumber = null;
- $("#partsListAnnotations li").removeClass("active");
- });
-
- fabricCanvas.upperCanvasEl.focus();
- fabricCanvas.renderAll();
-
- updateMarkers();
- updateDescriptions();
- }, 10);
- });
- }
-
- // ===================
- // DOWNLOAD PHOTO
- // ===================
- $(document)
- .off("click.downloadPhoto", "#downloadPhotoBtnAnnotations")
- .on(
- "click.downloadPhoto",
- "#downloadPhotoBtnAnnotations",
- function (e) {
- e.preventDefault();
- e.stopPropagation();
- console.log(
- "Evento click su #downloadPhotoBtnAnnotations, ID elemento:",
- $(this).attr("id"),
- );
- if (!$("#downloadPhotoBtnAnnotations").length) {
- console.error(
- "Pulsante #downloadPhotoBtnAnnotations non trovato nel DOM.",
- );
- const errorMsg = $(
- 'Errore: Pulsante #downloadPhotoBtnAnnotations non trovato nel DOM.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
- const photoSrc = $("#samplePhotoAnnotations").attr("src");
- console.log("URL immagine per il download:", photoSrc);
- if (!photoSrc) {
- console.error("Nessuna foto caricata da scaricare.");
- const errorMsg = $(
- 'Nessuna foto caricata da scaricare.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- // Verifica se l'URL è valido
- const img = new Image();
- img.src = photoSrc;
- img.onload = function () {
- const photoName =
- photoSrc.split("/").pop() || "downloaded_photo.png";
- console.log("Nome file per il download:", photoName);
- const link = document.createElement("a");
- link.href = photoSrc;
- link.download = photoName;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- console.log("Download avviato per:", photoName);
- };
- img.onerror = function () {
- console.error(
- "Errore: Impossibile caricare l'immagine per il download:",
- photoSrc,
- );
- const errorMsg = $(
- 'Errore: Impossibile caricare l\'immagine per il download.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- };
- },
- );
-
- // ===================
- // BACK TO PARTS MODAL
- // ===================
- $(document)
- .off("click.backToParts", "#backToPartsBtnAnnotations")
- .on("click.backToParts", "#backToPartsBtnAnnotations", function (e) {
- e.preventDefault();
- e.stopPropagation();
- console.log(
- "Evento click su #backToPartsBtnAnnotations, ID elemento:",
- $(this).attr("id"),
- );
- if (!$("#backToPartsBtnAnnotations").length) {
- console.error(
- "Pulsante #backToPartsBtnAnnotations non trovato nel DOM.",
- );
- const errorMsg = $(
- 'Errore: Pulsante #backToPartsBtnAnnotations non trovato nel DOM.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- // Controlla modifiche non salvate
- if (
- unsavedChanges &&
- !confirm(
- "Hai modifiche non salvate. Vuoi davvero tornare al modale delle parti?",
- )
- ) {
- console.log(
- "Tornare al modale delle parti annullato a causa di modifiche non salvate.",
- );
- return;
- }
-
- // Chiudi annotationsModal
- const annotationsModalElement =
- document.getElementById("annotationsModal");
- const annotationsModal = bootstrap.Modal.getInstance(
- annotationsModalElement,
- );
- if (annotationsModal) {
- annotationsModal.hide();
- } else {
- console.error(
- "Impossibile trovare l'istanza del modale #annotationsModal.",
- );
- }
-
- // Apri partsModal
- const iddatadb = $("#annotationsModal").data("iddatadb");
- const idquotations = $("#annotationsModal").data("idquotations");
- const trfHeader = $("#trfHeaderAnnotations").text();
- console.log("Apertura partsModal con:", {
- iddatadb,
- idquotations,
- trfHeader,
- });
-
- const partsModalElement = document.getElementById("partsModal");
- if (!partsModalElement) {
- console.error("Elemento #partsModal non trovato nel DOM.");
- const errorMsg = $(
- 'Errore: Il modale delle parti non è presente nel DOM.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- let partsModal = bootstrap.Modal.getInstance(partsModalElement);
- if (!partsModal) {
- partsModal = new bootstrap.Modal(partsModalElement, {
- backdrop: true,
- keyboard: true,
- focus: true,
- });
- }
-
- // Inizializza il modale delle parti
- if (typeof window.initPartsModal === "function") {
- window.initPartsModal(iddatadb, idquotations, trfHeader);
- partsModal.show();
- console.log("partsModal aperto con successo.");
- } else {
- console.error("Funzione initPartsModal non definita.");
- const errorMsg = $(
- 'Errore: Funzione initPartsModal non trovata.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- }
- });
-
- // ===================
- // PARTS LIST
- // ===================
- function updatePartsList() {
- console.log(
- "updatePartsList chiamato con partsListData:",
- partsListData,
- );
- const showMixParts = $("#showMixPartsAnnotations").is(":checked");
- console.log("Stato showMixPartsAnnotations:", showMixParts);
- const partsListElement = $("#partsListAnnotations");
-
- if (!partsListElement.length) {
- console.error(
- "Elemento #partsListAnnotations non trovato nel DOM.",
- );
- const errorMsg = $(
- 'Errore: Elemento #partsListAnnotations non trovato nel DOM.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- partsListElement.empty();
- const predefinedColors = [
- "#ff0000", // Rosso
- "#0000ff", // Blu
- "#00ff00", // Verde
- "#ffff00", // Giallo
- "#ff00ff", // Magenta
- "#00ffff", // Ciano
- "#800080", // Viola
- "#ffa500", // Arancione
- ];
-
- partsListData.forEach((part) => {
- const partNumber = part.part_number;
- const partDescription = part.part_description;
- const partColor =
- partColors[partNumber] ||
- (partDescription.toLowerCase().startsWith("mix")
- ? "#0000ff"
- : "#ff0000");
- if (
- partNumber &&
- partDescription &&
- (showMixParts ||
- !partDescription.toLowerCase().startsWith("mix"))
- ) {
- const colorOptions = predefinedColors
- .map(
- (color) =>
- `
`,
- )
- .join("");
- const listItem = `
-
- ${partNumber} - ${partDescription}
-
- `;
- partsListElement.append(listItem);
- }
- });
-
- console.log(
- "Elementi aggiunti a #partsListAnnotations:",
- partsListElement.find("li").length,
- );
- console.log("HTML di #partsListAnnotations:", partsListElement.html());
-
- // Associa evento di selezione all'intera riga
- partsListElement
- .off("click.partsList")
- .on("click.partsList", ".list-group-item", function (e) {
- e.stopPropagation();
- e.preventDefault();
- // Ignora il click se è sulla paletta dei colori
- if ($(e.target).closest(".color-picker-container").length) {
- console.log(
- "Click sulla paletta dei colori, ignoro selezione parte.",
- );
- return;
- }
- const $listItem = $(this);
- selectedPartNumber = $listItem.data("part-number");
- $listItem.addClass("active").siblings().removeClass("active");
- console.log(
- "Parte selezionata tramite riga:",
- selectedPartNumber,
- );
- });
-
- // Associa eventi alla paletta dei colori
- partsListElement
- .off("click.selectedColor")
- .on("click.selectedColor", ".selected-color", function (e) {
- e.stopPropagation();
- e.preventDefault();
- const $picker = $(this).siblings(".color-picker");
- console.log(
- "Cliccato .selected-color, mostro/nascondo paletta:",
- $picker.is(":visible"),
- );
- $(".color-picker").not($picker).hide();
- $picker.toggle();
- });
-
- partsListElement
- .off("click.colorOption")
- .on("click.colorOption", ".color-option", function (e) {
- e.stopPropagation();
- e.preventDefault();
- const $this = $(this);
- const color = $this.data("color");
- const $listItem = $this.closest("li");
- const partNumber = $listItem.data("part-number");
- console.log(
- "Cliccato .color-option, colore:",
- color,
- "per parte:",
- partNumber,
- );
- partColors[partNumber] = color;
- $listItem
- .find(".selected-color")
- .css("background-color", color);
- $this.closest(".color-picker").hide();
- updateMarkers();
- markUnsaved();
- });
-
- $(document)
- .off("click.colorPicker")
- .on("click.colorPicker", function (e) {
- if (!$(e.target).closest(".color-picker-container").length) {
- console.log("Cliccato fuori, nascondo tutte le palette.");
- $(".color-picker").hide();
- }
- });
- }
-
- // Delegazione evento per il checkbox
- $(document)
- .off("change.showMix", "#showMixPartsAnnotations")
- .on("change.showMix", "#showMixPartsAnnotations", function (e) {
- e.preventDefault();
- e.stopPropagation();
- console.log(
- "Evento change su #showMixPartsAnnotations, ID elemento:",
- $(this).attr("id"),
- );
- const isChecked = $(this).is(":checked");
- console.log(
- "Checkbox #showMixPartsAnnotations cambiato:",
- isChecked,
- );
- if (!$("#showMixPartsAnnotations").length) {
- console.error(
- "Checkbox #showMixPartsAnnotations non trovato nel DOM.",
- );
- const errorMsg = $(
- 'Errore: Checkbox #showMixPartsAnnotations non trovato nel DOM.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
- updatePartsList();
- updateMarkers();
- if (
- photoAnnotations[$("#samplePhotoAnnotations").attr("src")]
- ?.hasDescriptions
- ) {
- updateDescriptions();
- }
- });
-
- // ===================
- // LOAD EXISTING PARTS
- // ===================
- function loadExistingParts(iddatadb, idquotations) {
- console.log("loadExistingParts chiamato con:", {
- iddatadb,
- idquotations,
- });
- if (!iddatadb && !idquotations) {
- const errorMsg = $(
- 'Errore: ID TRF mancante per il caricamento delle parti.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- const endpoint = idquotations
- ? "load_parts_quotation.php"
- : "load_parts.php";
- const data = idquotations
- ? { idquotations: idquotations }
- : { iddatadb: iddatadb };
- $.ajax({
- url: endpoint,
- method: "GET",
- data: data,
- success: function (response) {
- console.log("Risposta da load_parts:", response);
- partsListData = [];
- if (
- response.success &&
- response.parts &&
- response.parts.length > 0
- ) {
- partsListData = response.parts;
- response.parts.forEach((part) => {
- const defaultColor = part.part_description
- .toLowerCase()
- .startsWith("mix")
- ? "#0000ff"
- : "#ff0000";
- partColors[part.part_number] = defaultColor;
- });
- updatePartsList();
- // Forza aggiornamento iniziale del checkbox
- setTimeout(() => {
- $("#showMixPartsAnnotations").trigger("change.showMix");
- }, 100);
- } else {
- const errorMsg = $(
- '' +
- (response.message ||
- "Nessuna parte trovata per questo elemento.") +
- "
",
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- }
- },
- error: function (xhr, status, error) {
- console.error("Errore AJAX in loadExistingParts:", {
- status,
- error,
- responseText: xhr.responseText,
- });
- const errorMsg = $(
- 'Errore nel caricamento delle parti: ' +
- error +
- " (" +
- xhr.status +
- ")
",
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- },
- });
- }
-
- // ===================
- // MARKERS & DESCRIPTIONS
- // ===================
- function updateMarkers() {
- console.log(
- "updateMarkers chiamato, markerObjects:",
- Object.keys(markerObjects),
- );
- for (let partNumber in markerObjects) {
- fabricCanvas.remove(markerObjects[partNumber]);
- delete markerObjects[partNumber];
- }
- markerObjects = {};
-
- const currentPhoto = $("#samplePhotoAnnotations").attr("src");
- const annotations = photoAnnotations[currentPhoto] || {
- markers: [],
- hasDescriptions: false,
- descriptionPosition: { x: 10, y: 10 },
- descriptionSize: {
- width: photoData.displayWidth * 0.3,
- height: photoData.displayHeight * 0.3,
- },
- };
- const showMixParts = $("#showMixPartsAnnotations").is(":checked");
-
- annotations.markers.forEach((marker) => {
- const part = partsListData.find(
- (p) => p.part_number == marker.partNumber,
- );
- const partDescription = part ? part.part_description : "";
- if (
- !showMixParts &&
- partDescription &&
- partDescription.toLowerCase().startsWith("mix")
- ) {
- console.log("Ignoro marker per parte Mix:", marker.partNumber);
- return;
- }
-
- const radius = 12;
- const fontSize = 16;
- const markerColor =
- marker.color || partColors[marker.partNumber] || "#ff0000";
-
- const circle = new fabric.Circle({
- radius: radius,
- fill: markerColor,
- stroke: markerColor,
- strokeWidth: 1,
- left: marker.x * photoData.scale,
- top: marker.y * photoData.scale,
- originX: "center",
- originY: "center",
- selectable: true,
- hasControls: false,
- lockScalingX: true,
- lockScalingY: true,
- lockRotation: true,
- });
-
- const text = new fabric.Text(marker.partNumber.toString(), {
- fontFamily: "Arial",
- fontSize: fontSize,
- fontWeight: "bold",
- fill: "#ffffff",
- left: marker.x * photoData.scale,
- top: marker.y * photoData.scale,
- originX: "center",
- originY: "middle",
- selectable: true,
- hasControls: false,
- lockScalingX: true,
- lockScalingY: true,
- lockRotation: true,
- });
-
- const group = new fabric.Group([circle, text], {
- left: marker.x * photoData.scale,
- top: marker.y * photoData.scale,
- originX: "center",
- originY: "center",
- selectable: true,
- hasControls: false,
- lockScalingX: true,
- lockScalingY: true,
- lockRotation: true,
- });
-
- group.on("moving", function () {
- marker.x = this.left / photoData.scale;
- marker.y = this.top / photoData.scale;
- console.log("Marker spostato:", {
- partNumber: marker.partNumber,
- x: marker.x,
- y: marker.y,
- });
- markUnsaved();
- });
-
- fabricCanvas.add(group);
- markerObjects[marker.partNumber] = group;
- });
-
- fabricCanvas.renderAll();
- console.log(
- "Canvas aggiornato, numero di marker:",
- Object.keys(markerObjects).length,
- );
- }
-
- function updateDescriptions() {
- console.log("updateDescriptions chiamato");
- const currentPhoto = $("#samplePhotoAnnotations").attr("src");
- const annotations = photoAnnotations[currentPhoto] || {
- markers: [],
- hasDescriptions: false,
- descriptionPosition: { x: 10, y: 10 },
- descriptionSize: {
- width: photoData.displayWidth * 0.3,
- height: photoData.displayHeight * 0.3,
- },
- };
- const showMixParts = $("#showMixPartsAnnotations").is(":checked");
-
- if (!annotations.hasDescriptions) {
- if (descriptionTextbox) {
- fabricCanvas.remove(descriptionTextbox);
- descriptionTextbox = null;
- fabricCanvas.renderAll();
- }
- console.log(
- "Nessuna descrizione attiva, rimuovo textbox se presente.",
- );
- return;
- }
-
- const partsList = partsListData
- .filter(
- (part) =>
- showMixParts ||
- !part.part_description.toLowerCase().startsWith("mix"),
- )
- .map((part) => `${part.part_number} ${part.part_description}`);
-
- const text = partsList.join("\n");
- console.log("Testo descrizione generato:", text);
-
- if (descriptionTextbox) {
- fabricCanvas.remove(descriptionTextbox);
- descriptionTextbox = null;
- }
-
- descriptionTextbox = new fabric.Textbox(text, {
- left: annotations.descriptionPosition.x * photoData.scale,
- top: annotations.descriptionPosition.y * photoData.scale,
- width: annotations.descriptionSize.width,
- scaleX: 1,
- scaleY: 1,
- backgroundColor: "transparent",
- fontFamily: "Arial",
- fontSize: 24,
- fill: "#000000",
- padding: 10,
- editable: false,
- selectable: true,
- hasControls: true,
- borderColor: "#ccc",
- cornerColor: "#888",
- cornerSize: 10,
- transparentCorners: false,
- lockRotation: true,
- lockScalingFlip: true,
- minScaleLimit: 0.1,
- });
-
- descriptionTextbox.on("scaling", function () {
- fitFontToBox(this);
- annotations.descriptionSize.width = this.width * this.scaleX;
- annotations.descriptionSize.height = this.height * this.scaleY;
- console.log(
- "Descrizione ridimensionata:",
- annotations.descriptionSize,
- );
- markUnsaved();
- });
-
- descriptionTextbox.on("moving", function () {
- annotations.descriptionPosition.x = this.left / photoData.scale;
- annotations.descriptionPosition.y = this.top / photoData.scale;
- console.log(
- "Descrizione spostata:",
- annotations.descriptionPosition,
- );
- markUnsaved();
- });
-
- fabricCanvas.add(descriptionTextbox);
- fitFontToBox(descriptionTextbox);
- fabricCanvas.renderAll();
- console.log("Descrizione aggiunta al canvas:", text);
- }
-
- function fitFontToBox(textbox) {
- let fontSize = 24;
- textbox.set("fontSize", fontSize);
- textbox.setCoords();
-
- while (
- (textbox.textLines.length * textbox.fontSize * 1.2 >
- textbox.height * textbox.scaleY ||
- textbox._getTransformedDimensions().x >
- textbox.width * textbox.scaleX) &&
- fontSize > 8
- ) {
- fontSize -= 1;
- textbox.set("fontSize", fontSize);
- textbox.setCoords();
- }
-
- while (
- textbox.textLines.length * textbox.fontSize * 1.2 <
- textbox.height * textbox.scaleY &&
- textbox._getTransformedDimensions().x <
- textbox.width * textbox.scaleX &&
- fontSize < 32
- ) {
- fontSize += 1;
- textbox.set("fontSize", fontSize);
- textbox.setCoords();
- }
- }
-
- function clearCanvasMarkers(clearDescriptions = true) {
- console.log(
- "clearCanvasMarkers chiamato, clearDescriptions:",
- clearDescriptions,
- );
- const currentPhoto = $("#samplePhotoAnnotations").attr("src");
- if (clearDescriptions && photoAnnotations[currentPhoto]) {
- photoAnnotations[currentPhoto].hasDescriptions = false;
- photoAnnotations[currentPhoto].descriptionPosition = {
- x: 10,
- y: 10,
- };
- photoAnnotations[currentPhoto].descriptionSize = {
- width: photoData.displayWidth * 0.3,
- height: photoData.displayHeight * 0.3,
- };
- if (descriptionTextbox) {
- fabricCanvas.remove(descriptionTextbox);
- descriptionTextbox = null;
- }
- }
-
- for (let partNumber in markerObjects) {
- fabricCanvas.remove(markerObjects[partNumber]);
- delete markerObjects[partNumber];
- }
- markerObjects = {};
-
- const canvas = document.getElementById("photoCanvasAnnotations");
- const ctx = canvas.getContext("2d");
- canvas.width = photoData.naturalWidth;
- canvas.height = photoData.naturalHeight;
- canvas.style.width = `${photoData.displayWidth}px`;
- canvas.style.height = `${photoData.displayHeight}px`;
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- if ($("#samplePhotoAnnotations")[0].naturalWidth) {
- ctx.drawImage(
- $("#samplePhotoAnnotations")[0],
- 0,
- 0,
- canvas.width,
- canvas.height,
- );
- }
- updateMarkers();
- if (photoAnnotations[currentPhoto]?.hasDescriptions) {
- updateDescriptions();
- }
- markUnsaved();
- }
-
- function undoLastMarker() {
- console.log("undoLastMarker chiamato");
- const currentPhoto = $("#samplePhotoAnnotations").attr("src");
- if (
- photoAnnotations[currentPhoto] &&
- photoAnnotations[currentPhoto].markers.length > 0
- ) {
- const lastMarker = photoAnnotations[currentPhoto].markers.pop();
- if (markerObjects[lastMarker.partNumber]) {
- fabricCanvas.remove(markerObjects[lastMarker.partNumber]);
- delete markerObjects[lastMarker.partNumber];
- fabricCanvas.renderAll();
- }
- console.log("Ultimo marker rimosso:", lastMarker);
- markUnsaved();
- }
- }
-
- // Delegazione evento per il pulsante "Descrizioni"
- $(document)
- .off("click.addDescriptions", "#addDescriptionsBtnAnnotations")
- .on(
- "click.addDescriptions",
- "#addDescriptionsBtnAnnotations",
- function (e) {
- e.preventDefault();
- e.stopPropagation();
- console.log(
- "Evento click su #addDescriptionsBtnAnnotations, ID elemento:",
- $(this).attr("id"),
- );
- if (!$("#addDescriptionsBtnAnnotations").length) {
- console.error(
- "Pulsante #addDescriptionsBtnAnnotations non trovato nel DOM.",
- );
- const errorMsg = $(
- 'Errore: Pulsante #addDescriptionsBtnAnnotations non trovato nel DOM.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
- const currentPhoto = $("#samplePhotoAnnotations").attr("src");
- if (!photoAnnotations[currentPhoto]) {
- photoAnnotations[currentPhoto] = {
- markers: [],
- hasDescriptions: false,
- descriptionPosition: { x: 10, y: 10 },
- descriptionSize: {
- width: photoData.displayWidth * 0.3,
- height: photoData.displayHeight * 0.3,
- },
- };
- }
- photoAnnotations[currentPhoto].hasDescriptions = true;
- updateDescriptions();
- markUnsaved();
- },
- );
-
- // Delegazione evento per il pulsante "Rimuovi"
- $(document)
- .off("click.removeAnnotations", "#removeAnnotationsBtnAnnotations")
- .on(
- "click.removeAnnotations",
- "#removeAnnotationsBtnAnnotations",
- function (e) {
- e.preventDefault();
- e.stopPropagation();
- console.log(
- "Evento click su #removeAnnotationsBtnAnnotations, ID elemento:",
- $(this).attr("id"),
- );
- if (!$("#removeAnnotationsBtnAnnotations").length) {
- console.error(
- "Pulsante #removeAnnotationsBtnAnnotations non trovato nel DOM.",
- );
- const errorMsg = $(
- 'Errore: Pulsante #removeAnnotationsBtnAnnotations non trovato nel DOM.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
- clearCanvasMarkers(true);
- },
- );
-
- // Delegazione evento per il pulsante "Undo"
- $(document)
- .off("click.undoMarker", "#undoMarkerBtnAnnotations")
- .on("click.undoMarker", "#undoMarkerBtnAnnotations", function (e) {
- e.preventDefault();
- e.stopPropagation();
- console.log(
- "Evento click su #undoMarkerBtnAnnotations, ID elemento:",
- $(this).attr("id"),
- );
- undoLastMarker();
- });
-
- // ===================
- // SAVE PHOTO
- // ===================
- $(document)
- .off("click.savePhoto", "#savePhotoBtnAnnotations")
- .on("click.savePhoto", "#savePhotoBtnAnnotations", function (e) {
- e.preventDefault();
- e.stopPropagation();
- console.log(
- "Evento click su #savePhotoBtnAnnotations, ID elemento:",
- $(this).attr("id"),
- );
- if (!$("#samplePhotoAnnotations").attr("src")) {
- const errorMsg = $(
- 'Nessuna foto caricata da salvare.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- if (!fabricCanvas) {
- const errorMsg = $(
- 'Errore: Canvas Fabric.js non inizializzato.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- const canvas = document.getElementById("photoCanvasAnnotations");
- const ctx = canvas.getContext("2d");
- const img = $("#samplePhotoAnnotations")[0];
-
- if (!img.complete || img.naturalWidth === 0) {
- const errorMsg = $(
- 'Errore: l\'immagine non è caricata correttamente.
',
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- canvas.width = photoData.naturalWidth;
- canvas.height = photoData.naturalHeight;
- ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
-
- try {
- const fabricDataURL = fabricCanvas.toDataURL({
- format: "png",
- multiplier: 1 / photoData.scale,
- });
-
- const tempImg = new Image();
- tempImg.src = fabricDataURL;
- tempImg.onload = function () {
- ctx.drawImage(tempImg, 0, 0, canvas.width, canvas.height);
-
- fetch(fabricDataURL)
- .then((res) => res.blob())
- .then((blob) => {
- canvas.toBlob(function (blob) {
- if (!blob) {
- const errorMsg = $(
- 'Errore durante la creazione dell\'immagine finale.
',
- );
- $("#annotationsModal .modal-body").prepend(
- errorMsg,
- );
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- return;
- }
-
- const timestamp = new Date()
- .toISOString()
- .replace(/[:.]/g, "-");
- const iddatadb =
- $("#annotationsModal").data("iddatadb");
- const idquotations =
- $("#annotationsModal").data("idquotations");
- const id = iddatadb || idquotations;
- const endpoint = idquotations
- ? "save_annotated_photo_quotation.php"
- : "save_annotated_photo.php";
- const finalName = `photo_${id}_${timestamp}.png`;
-
- const formData = new FormData();
- formData.append("file", blob, finalName);
- formData.append("filename", finalName);
- formData.append(
- idquotations ? "idquotations" : "iddatadb",
- id,
- );
-
- $.ajax({
- url: endpoint,
- method: "POST",
- data: formData,
- processData: false,
- contentType: false,
- success: function (response) {
- if (response.success) {
- const successMsg = $(
- 'Foto salvata con successo: ' +
- response.file_path +
- "
",
- );
- $(
- "#annotationsModal .modal-body",
- ).prepend(successMsg);
- setTimeout(function () {
- successMsg.fadeOut(
- 500,
- function () {
- $(this).remove();
- },
- );
- }, 5000);
-
- const photoSelector = $(
- "#photoSelectorAnnotations",
- );
- if (photoSelector.length > 0) {
- const newPhotoPath =
- response.file_path;
- const newPhotoName =
- newPhotoPath
- .split("/")
- .pop();
- const optionCount =
- photoSelector.find(
- "option",
- ).length;
-
- const newOption = $(
- " ",
- )
- .val(newPhotoPath)
- .text(
- `Photo ${optionCount + 1} - ${newPhotoName}`,
- );
- photoSelector.append(newOption);
- photoSelector
- .val(newPhotoPath)
- .trigger("change");
- }
-
- unsavedChanges = false;
- } else {
- const errorMsg = $(
- 'Errore nel salvataggio della foto: ' +
- response.message +
- "
",
- );
- $(
- "#annotationsModal .modal-body",
- ).prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(
- 500,
- function () {
- $(this).remove();
- },
- );
- }, 5000);
- }
- },
- error: function (xhr, status, error) {
- const errorMsg = $(
- 'Errore nel salvataggio della foto: ' +
- error +
- " (" +
- xhr.status +
- ")
",
- );
- $(
- "#annotationsModal .modal-body",
- ).prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- },
- });
- }, "image/png");
- });
- };
- } catch (e) {
- const errorMsg = $(
- 'Errore durante la generazione dell\'immagine: ' +
- e.message +
- "
",
- );
- $("#annotationsModal .modal-body").prepend(errorMsg);
- setTimeout(function () {
- errorMsg.fadeOut(500, function () {
- $(this).remove();
- });
- }, 5000);
- }
- });
-
- function markUnsaved() {
- if (!unsavedChanges) {
- unsavedChanges = true;
- console.log("Modifiche non salvate rilevate.");
- }
- }
-});
diff --git a/public/userarea/apply_routine.php b/public/userarea/apply_routine.php
deleted file mode 100644
index 601fb8f..0000000
--- a/public/userarea/apply_routine.php
+++ /dev/null
@@ -1,50 +0,0 @@
- '', 'rows' => [], 'columns' => [], 'template_id' => 0, 'filename' => '', 'excel_data' => []];
-
-try {
- if ($_SERVER['REQUEST_METHOD'] === 'POST') {
- $input = json_decode(file_get_contents('php://input'), true);
- $template_id = isset($input['template_id']) ? intval($input['template_id']) : 0;
- $filename = $input['routine_data']['filename'] ?? '';
- $headerrow = $input['routine_data']['headerrow'] ?? 1;
- $excelData = $input['excel_data'] ?? [];
- $routineData = $input['routine_data'] ?? [];
-
- if (!$filename || empty($excelData)) {
- throw new Exception("Dati della routine mancanti.");
- }
-
- $routineFile = __DIR__ . '/routines/' . $filename;
- if (file_exists($routineFile)) {
- include_once $routineFile;
- $routineData['xls_headers'] = $_SESSION['headers'] ?? [];
- applyRoutine($excelData, $routineData); // Modifica $excelData in place
- error_log("Routine {$routineData['name']} applicata (file: {$filename}) per template {$template_id}, header row: {$headerrow}");
- } else {
- throw new Exception("File della routine non trovato: $routineFile");
- }
-
- // Aggiorna la sessione con i dati modificati
- $_SESSION['excel_data'] = $excelData;
-
- $response['excel_data'] = $excelData;
- $response['rows'] = array_column($excelData, 'data');
- $response['columns'] = $_SESSION['headers'];
- $response['template_id'] = $template_id;
- $response['filename'] = $input['filename'] ?? '';
- } else {
- $response['error'] = "Richiesta non valida.";
- }
-} catch (Exception $e) {
- $response['error'] = "Errore durante l'applicazione della routine: " . $e->getMessage();
- error_log("Exception in apply_routine.php: " . $e->getMessage());
-}
-
-ob_end_clean();
-header('Content-Type: application/json');
-echo json_encode($response);
-exit;
diff --git a/public/userarea/assets/images/logo-zibo.svg b/public/userarea/assets/images/logo-zibo.svg
new file mode 100644
index 0000000..19f2d63
--- /dev/null
+++ b/public/userarea/assets/images/logo-zibo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/userarea/auth_proxy.php b/public/userarea/auth_proxy.php
deleted file mode 100644
index eff1f63..0000000
--- a/public/userarea/auth_proxy.php
+++ /dev/null
@@ -1,58 +0,0 @@
- 'WebApiUser',
- 'Password' => 'webapiuser01'
-];
-
-// Inizializza cURL
-$ch = curl_init($api_url);
-
-// Configura le opzioni di cURL
-curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-curl_setopt($ch, CURLOPT_POST, true);
-curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($credentials));
-curl_setopt($ch, CURLOPT_HTTPHEADER, [
- 'Content-Type: application/json',
- 'Accept: application/json'
-]);
-curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Solo per test
-curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // Solo per test
-curl_setopt($ch, CURLOPT_VERBOSE, true);
-$log = fopen('curl_auth_debug.log', 'w');
-curl_setopt($ch, CURLOPT_STDERR, $log);
-
-// Esegui la richiesta
-$response = curl_exec($ch);
-$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-$curl_error = curl_error($ch);
-fclose($log);
-
-// Verifica errori
-if ($response === false || $http_code != 200) {
- http_response_code($http_code ? $http_code : 500);
- echo json_encode([
- 'error' => 'Errore nella richiesta API',
- 'http_code' => $http_code,
- 'curl_error' => $curl_error,
- 'response' => substr($response, 0, 1000)
- ]);
-} else {
- $decoded = json_decode($response);
- if (json_last_error() === JSON_ERROR_NONE) {
- http_response_code($http_code);
- echo $response;
- } else {
- http_response_code(500);
- echo json_encode([
- 'error' => 'Risposta non JSON valida',
- 'http_code' => $http_code,
- 'response' => substr($response, 0, 1000)
- ]);
- }
-}
-
-curl_close($ch);
diff --git a/public/userarea/checkpatch.php b/public/userarea/checkpatch.php
deleted file mode 100644
index 7fefcce..0000000
--- a/public/userarea/checkpatch.php
+++ /dev/null
@@ -1,131 +0,0 @@
-getConnection();
-
-header("Content-Type: application/json");
-
-// 🔹 Configura directory log (creala se non esiste)
-$logDir = __DIR__ . '/logs/api/';
-if (!is_dir($logDir)) {
- mkdir($logDir, 0755, true);
-}
-
-// 🔹 Base URL API
-$apiBaseUrl = 'https://93.43.5.102/limsapi/api/odata/';
-
-// 🔹 Hardcoded values
-$iddatadb = 846;
-$commessaId = 533357;
-
-try {
- // 🔹 STEP 4: Fetch Field Values with Labels (usa dati reali per iddatadb=845)
- $stmt = $pdo->prepare("
- SELECT
- idd.field_value,
- m.field_label,
- m.schema_id,
- m.field_id
- FROM
- import_data_details as idd
- JOIN template_mapping m ON idd.mapping_id = m.id
- WHERE idd.id = :iddatadb
- ");
- $stmt->execute(['iddatadb' => $iddatadb]);
- $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
- $fieldValues = [];
- $valueMap = []; // Mappa per field_id -> valore
- foreach ($rows as $row) {
- $fieldValues[] = [
- "IdCommesseCustomFields" => (int) $row['field_id'],
- "Valore" => $row['field_value'],
- "FieldLabel" => $row['field_label']
- ];
- $valueMap[(int) $row['field_id']] = $row['field_value']; // Mappa per ID definizione
- }
-
- // Logga i fieldValues in error_log
- $logFieldValues = "FieldValues dal DB (iddatadb={$iddatadb}):\n" . json_encode($fieldValues, JSON_PRETTY_PRINT);
- error_log($logFieldValues);
-
- // 🔹 Initialize API client
- $api = VisualLimsApiClient::getInstance();
-
- // 🔹 STEP A: GET iniziale per CommesseCustomFields con espansione CustomField
- $expand = "CommesseCustomFields(\$expand=CustomField)"; // Espansione come da istruzioni fornitore
- $commessaWithFields = $api->get("CommessaWeb(" . $commessaId . ")?\$expand=" . $expand);
-
- // 🔹 STEP B: Prepara payload PATCH (tutti i campi, sovrascrivi se match su CustomField.IdCustomField == field_id)
- $commessaCustomFields = [];
- foreach ($commessaWithFields["CommesseCustomFields"] as $customField) {
- $definitionId = (int) ($customField["CustomField"]["IdCustomField"] ?? 0); // Usa IdCustomField dal CustomField
- $currentValue = $customField["Valore"] ?? '';
- $newValue = isset($valueMap[$definitionId]) ? $valueMap[$definitionId] : $currentValue;
-
- $commessaCustomFields[] = [
- "IdCommesseCustomFields" => (int) $customField["IdCommesseCustomFields"],
- "Valore" => $newValue
- ];
- }
-
- // 🔹 Unico file di log per tutto
- $logFile = $logDir . "commessa_{$commessaId}_patch_and_get_" . time() . ".txt";
- $logContent = "FieldValues dal DB (iddatadb={$iddatadb}):\n" . json_encode($fieldValues, JSON_PRETTY_PRINT) . "\n\n";
-
- // Log curl-like per GET iniziale
- $logContent .= "GET iniziale:\n" .
- "curl --location --request GET '{$apiBaseUrl}CommessaWeb({$commessaId})?\$expand=CommesseCustomFields(\$expand=CustomField)' \\\n" .
- "--header 'Authorization: Bearer ••••••'\n\n" .
- "RESPONSE:\n" . json_encode($commessaWithFields, JSON_PRETTY_PRINT) . "\n\n---\n";
-
- if (!empty($commessaCustomFields)) {
- $updatePayload = ["CommesseCustomFields" => $commessaCustomFields];
-
- // Log curl-like per PATCH
- $jsonPayload = json_encode($updatePayload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
- $logContent .= "PATCH:\n" .
- "curl --location --request PATCH '{$apiBaseUrl}CommessaWeb({$commessaId})' \\\n" .
- "--header 'Content-Type: application/json' \\\n" .
- "--header 'Authorization: Bearer ••••••' \\\n" .
- "--data '{$jsonPayload}'\n\n";
-
- $patchResponse = $api->patch("CommessaWeb({$commessaId})", $updatePayload);
-
- $logContent .= "PATCH RESPONSE:\n" . json_encode($patchResponse, JSON_PRETTY_PRINT) . "\n\n---\n";
- } else {
- $logContent .= "PATCH: Nessun campo custom da aggiornare\n\n---\n";
- }
-
- // 🔹 STEP C: GET di controllo post-PATCH
- $commessaAfterPatch = $api->get("CommessaWeb(" . $commessaId . ")?\$expand=" . $expand);
-
- // Log curl-like per GET di controllo
- $logContent .= "GET di controllo:\n" .
- "curl --location --request GET '{$apiBaseUrl}CommessaWeb({$commessaId})?\$expand=CommesseCustomFields(\$expand=CustomField)' \\\n" .
- "--header 'Authorization: Bearer ••••••'\n\n" .
- "RESPONSE:\n" . json_encode($commessaAfterPatch, JSON_PRETTY_PRINT);
-
- // Salva log unico
- file_put_contents($logFile, $logContent);
-
- // 🔹 Output a schermo
- echo json_encode([
- "success" => true,
- "message" => "PATCH eseguito su commessa {$commessaId} con dati da iddatadb {$iddatadb}",
- "commessaAfterPatch" => $commessaAfterPatch,
- "totalCustomFieldsUpdated" => count($commessaCustomFields),
- "fieldValues" => $fieldValues,
- "logFile" => $logFile
- ]);
-} catch (Exception $e) {
- error_log("Patch Error: " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString());
-
- echo json_encode([
- "success" => false,
- "message" => "Patch failed: " . $e->getMessage(),
- "logFile" => $logFile ?? 'Nessun log generato'
- ]);
-}
diff --git a/public/userarea/connectapi.php b/public/userarea/connectapi.php
deleted file mode 100644
index 39d0fa6..0000000
--- a/public/userarea/connectapi.php
+++ /dev/null
@@ -1,211 +0,0 @@
-
-
-
-
-
-
-
- Autenticazione VisualLims
-
-
-
-
-
-
- Autenticazione VisualLims
- Autentica
-
-
-
- Seleziona un cliente:
-
- Seleziona un cliente...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/cssinclude.php b/public/userarea/cssinclude.php
index 58417f9..3bee718 100644
--- a/public/userarea/cssinclude.php
+++ b/public/userarea/cssinclude.php
@@ -13,10 +13,145 @@
-
-
-
+
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/public/userarea/customfield_values_response.json b/public/userarea/customfield_values_response.json
deleted file mode 100644
index 670d529..0000000
--- a/public/userarea/customfield_values_response.json
+++ /dev/null
@@ -1 +0,0 @@
-{"146":[{"IdCustomFieldsValue":235,"Valore":"Pigmentato"},{"IdCustomFieldsValue":236,"Valore":"Anilina"},{"IdCustomFieldsValue":237,"Valore":"Verniciato"},{"IdCustomFieldsValue":238,"Valore":"Laminato"},{"IdCustomFieldsValue":259,"Valore":"Semi-Anilina"},{"IdCustomFieldsValue":274,"Valore":"Scamosciato"},{"IdCustomFieldsValue":305,"Valore":"Pigmented"},{"IdCustomFieldsValue":306,"Valore":"Aniline"},{"IdCustomFieldsValue":307,"Valore":"Patent"},{"IdCustomFieldsValue":308,"Valore":"Metallic"},{"IdCustomFieldsValue":309,"Valore":"Semi-Aniline"},{"IdCustomFieldsValue":310,"Valore":"Suede"},{"IdCustomFieldsValue":311,"Valore":"Nubuck"},{"IdCustomFieldsValue":336,"Valore":"Cavallino"},{"IdCustomFieldsValue":344,"Valore":"Abrasivato"},{"IdCustomFieldsValue":500,"Valore":"Gommato"},{"IdCustomFieldsValue":528,"Valore":"Paillettes"},{"IdCustomFieldsValue":538,"Valore":"PU"},{"IdCustomFieldsValue":559,"Valore":"Tintura di Botte"},{"IdCustomFieldsValue":570,"Valore":"Crosta"},{"IdCustomFieldsValue":572,"Valore":"Semianilina\/Stampato"},{"IdCustomFieldsValue":644,"Valore":"Accoppiato"},{"IdCustomFieldsValue":657,"Valore":"Serigrafato"},{"IdCustomFieldsValue":661,"Valore":"Stampato"},{"IdCustomFieldsValue":691,"Valore":"Brush-Off"},{"IdCustomFieldsValue":697,"Valore":"Crust"},{"IdCustomFieldsValue":707,"Valore":"Lucido Lissato"},{"IdCustomFieldsValue":729,"Valore":"Shearling"},{"IdCustomFieldsValue":733,"Valore":"Printed"},{"IdCustomFieldsValue":750,"Valore":"Ink-Jet"},{"IdCustomFieldsValue":804,"Valore":"Fur"},{"IdCustomFieldsValue":874,"Valore":"Esotico"},{"IdCustomFieldsValue":896,"Valore":"Shearling con lato carne scamosciato"},{"IdCustomFieldsValue":959,"Valore":"Ink-jet\/ Con film PU \"By-Cast\""},{"IdCustomFieldsValue":970,"Valore":"Anilina\/Ink-jet"},{"IdCustomFieldsValue":1020,"Valore":"Coated"},{"IdCustomFieldsValue":1021,"Valore":"By-Cast"},{"IdCustomFieldsValue":1024,"Valore":"Perlato"},{"IdCustomFieldsValue":1025,"Valore":"Pearled"},{"IdCustomFieldsValue":1030,"Valore":"Pelo"},{"IdCustomFieldsValue":1035,"Valore":"Glitterato"},{"IdCustomFieldsValue":1099,"Valore":"Transfer"},{"IdCustomFieldsValue":1111,"Valore":"Coupled"},{"IdCustomFieldsValue":1153,"Valore":"Saffiano"},{"IdCustomFieldsValue":1186,"Valore":"Pigmentato\/Accoppiato"},{"IdCustomFieldsValue":1238,"Valore":"Aniline\/Fixed"},{"IdCustomFieldsValue":1240,"Valore":"Laminated Foil Finish"},{"IdCustomFieldsValue":1348,"Valore":"Con applicazioni"},{"IdCustomFieldsValue":1349,"Valore":"Pony calf"},{"IdCustomFieldsValue":1415,"Valore":"Glittered"},{"IdCustomFieldsValue":1437,"Valore":"Scraped"},{"IdCustomFieldsValue":1445,"Valore":"Resinato"},{"IdCustomFieldsValue":1620,"Valore":"Stampa digitale"},{"IdCustomFieldsValue":1661,"Valore":"Laminato parziale"},{"IdCustomFieldsValue":1734,"Valore":"Hair"},{"IdCustomFieldsValue":1787,"Valore":"Smerigliato Rifinito"},{"IdCustomFieldsValue":1827,"Valore":"Uncoated"},{"IdCustomFieldsValue":1828,"Valore":"Nappa"},{"IdCustomFieldsValue":1942,"Valore":"M\u00e9tallique "},{"IdCustomFieldsValue":1943,"Valore":"Camoscina"},{"IdCustomFieldsValue":1974,"Valore":"Pigment\u00e9"},{"IdCustomFieldsValue":2002,"Valore":"Partial metallic finish"},{"IdCustomFieldsValue":2551,"Valore":"Coated con glitter"},{"IdCustomFieldsValue":3107,"Valore":"Metallic Suede"},{"IdCustomFieldsValue":3208,"Valore":"Plotter"},{"IdCustomFieldsValue":3216,"Valore":"Serigrafia con fissativo"},{"IdCustomFieldsValue":3236,"Valore":"Super Natural"},{"IdCustomFieldsValue":3239,"Valore":"Velour"},{"IdCustomFieldsValue":3251,"Valore":"Canvas"},{"IdCustomFieldsValue":3328,"Valore":"Resina stirata"},{"IdCustomFieldsValue":3335,"Valore":"Lucido"},{"IdCustomFieldsValue":3364,"Valore":"Palmellato"},{"IdCustomFieldsValue":3365,"Valore":"Volanato naturale"},{"IdCustomFieldsValue":3366,"Valore":"Trattamento Scotchgard"},{"IdCustomFieldsValue":3367,"Valore":"Passante in botte"},{"IdCustomFieldsValue":3370,"Valore":"Embroidery"},{"IdCustomFieldsValue":3371,"Valore":"Patchwork lettering"},{"IdCustomFieldsValue":3409,"Valore":"Tinto Pezza"},{"IdCustomFieldsValue":3410,"Valore":"Pronto per Tinta"},{"IdCustomFieldsValue":3411,"Valore":"Tinto Filo"},{"IdCustomFieldsValue":3412,"Valore":"Greggio"},{"IdCustomFieldsValue":3413,"Valore":"Vacchetta"},{"IdCustomFieldsValue":3424,"Valore":"Naturale"},{"IdCustomFieldsValue":3442,"Valore":"Barrel dyeing"},{"IdCustomFieldsValue":3454,"Valore":"Split leather with film"},{"IdCustomFieldsValue":3455,"Valore":"Printed Suede"},{"IdCustomFieldsValue":3460,"Valore":"Pigmented\/Patent"},{"IdCustomFieldsValue":3468,"Valore":"Non rifinito"},{"IdCustomFieldsValue":3482,"Valore":"Cruck"},{"IdCustomFieldsValue":3491,"Valore":"Stampa serigrafica"},{"IdCustomFieldsValue":3494,"Valore":"Fissativo all'acqua"},{"IdCustomFieldsValue":3498,"Valore":"Tintura"},{"IdCustomFieldsValue":3506,"Valore":"Rovesciato"},{"IdCustomFieldsValue":3511,"Valore":"Spalmato"},{"IdCustomFieldsValue":3514,"Valore":"Serigraphy"},{"IdCustomFieldsValue":3867,"Valore":"None"},{"IdCustomFieldsValue":4052,"Valore":"Pigmentato Abrasivato"},{"IdCustomFieldsValue":4082,"Valore":"Full Grain"},{"IdCustomFieldsValue":4109,"Valore":"Opaco"},{"IdCustomFieldsValue":4124,"Valore":"Embossed"},{"IdCustomFieldsValue":4135,"Valore":"Mat"},{"IdCustomFieldsValue":4136,"Valore":"Lisse"},{"IdCustomFieldsValue":4137,"Valore":"Coton"},{"IdCustomFieldsValue":4143,"Valore":"Alo\u00e9"},{"IdCustomFieldsValue":4144,"Valore":"Torino"},{"IdCustomFieldsValue":4145,"Valore":"Microsuede"},{"IdCustomFieldsValue":4151,"Valore":"Miroir"},{"IdCustomFieldsValue":4166,"Valore":"Stampa UV"},{"IdCustomFieldsValue":4185,"Valore":"Lavable"},{"IdCustomFieldsValue":4219,"Valore":"Radika"},{"IdCustomFieldsValue":4220,"Valore":"Natural"},{"IdCustomFieldsValue":4222,"Valore":"Abilo N\u00e9on"},{"IdCustomFieldsValue":4250,"Valore":"Canyon"},{"IdCustomFieldsValue":4257,"Valore":"Alo\u00e9 Shiny"},{"IdCustomFieldsValue":4258,"Valore":"Lisse\/Recoupe"},{"IdCustomFieldsValue":4280,"Valore":"Water-repellent"},{"IdCustomFieldsValue":4283,"Valore":"Lisse\/Entrepeaux"},{"IdCustomFieldsValue":4286,"Valore":"Metallo liquido spray + Stampa"},{"IdCustomFieldsValue":4288,"Valore":"Tinto"},{"IdCustomFieldsValue":4388,"Valore":"Cerato"},{"IdCustomFieldsValue":4389,"Valore":"Mat\/Recoupe"},{"IdCustomFieldsValue":4392,"Valore":"Pigmentato\/Poliuretanico finale"},{"IdCustomFieldsValue":4393,"Valore":"Semianilina Laminato"},{"IdCustomFieldsValue":4394,"Valore":"Semianilina Pigmentato"},{"IdCustomFieldsValue":4399,"Valore":"Primitivo"},{"IdCustomFieldsValue":4400,"Valore":"Ombre"},{"IdCustomFieldsValue":4401,"Valore":"Anilina Pigmentato"},{"IdCustomFieldsValue":4405,"Valore":"Caresse"},{"IdCustomFieldsValue":4429,"Valore":"Ultras\/Recoupe"},{"IdCustomFieldsValue":4552,"Valore":"Semi-Anilina + Stampa ink jet"},{"IdCustomFieldsValue":4563,"Valore":"Torino Ultra Brillante"},{"IdCustomFieldsValue":4573,"Valore":"Supernatural\/aniline"},{"IdCustomFieldsValue":5054,"Valore":"Peau d'ange"},{"IdCustomFieldsValue":5128,"Valore":"Mirage"},{"IdCustomFieldsValue":5129,"Valore":"Mirage\/Relance"},{"IdCustomFieldsValue":5130,"Valore":"Croute Chrome"},{"IdCustomFieldsValue":5309,"Valore":"PU Coated"},{"IdCustomFieldsValue":5315,"Valore":"Pigmentato stampato"},{"IdCustomFieldsValue":5498,"Valore":"Rubberized"},{"IdCustomFieldsValue":5610,"Valore":"By-Cast PU"},{"IdCustomFieldsValue":5615,"Valore":"Lamina liquida"},{"IdCustomFieldsValue":6193,"Valore":"Nubuck\/Rubber coated"},{"IdCustomFieldsValue":8523,"Valore":"Total print"},{"IdCustomFieldsValue":12774,"Valore":"Etoffe"},{"IdCustomFieldsValue":12775,"Valore":"Croute"},{"IdCustomFieldsValue":12776,"Valore":"Miroir Light"},{"IdCustomFieldsValue":12777,"Valore":"Etriviere"},{"IdCustomFieldsValue":12949,"Valore":"Vernice (Vernice\/Semianilina)"},{"IdCustomFieldsValue":13501,"Valore":"Seta Lux"},{"IdCustomFieldsValue":13733,"Valore":"Aniline Pigmented"},{"IdCustomFieldsValue":13807,"Valore":"Naturale\/Semilucido"},{"IdCustomFieldsValue":14047,"Valore":"Fissativo"},{"IdCustomFieldsValue":14140,"Valore":"Nubuk"},{"IdCustomFieldsValue":14141,"Valore":"Satin Soft"},{"IdCustomFieldsValue":14142,"Valore":"Priene\/ Millenium "},{"IdCustomFieldsValue":14887,"Valore":"Pigmented\/Metal"}],"147":[{"IdCustomFieldsValue":239,"Valore":"Cromo"},{"IdCustomFieldsValue":240,"Valore":"Vegetale"},{"IdCustomFieldsValue":272,"Valore":"\/"},{"IdCustomFieldsValue":273,"Valore":"Mista"},{"IdCustomFieldsValue":301,"Valore":"Chrome"},{"IdCustomFieldsValue":302,"Valore":"Vegetal"},{"IdCustomFieldsValue":303,"Valore":"Mixed"},{"IdCustomFieldsValue":519,"Valore":"White"},{"IdCustomFieldsValue":520,"Valore":"Bianca"},{"IdCustomFieldsValue":566,"Valore":"Chrome \/ Synthetic"},{"IdCustomFieldsValue":682,"Valore":"Sintetica"},{"IdCustomFieldsValue":1001,"Valore":"Vegetallizzato"},{"IdCustomFieldsValue":1054,"Valore":"Synthetic"},{"IdCustomFieldsValue":1208,"Valore":"Allume"},{"IdCustomFieldsValue":1264,"Valore":"Minerale"},{"IdCustomFieldsValue":1535,"Valore":"Blanche"},{"IdCustomFieldsValue":2447,"Valore":"Mineral"},{"IdCustomFieldsValue":2590,"Valore":"Semi-Vegetal"},{"IdCustomFieldsValue":2712,"Valore":"Metal free"},{"IdCustomFieldsValue":2737,"Valore":"Semi-Chrome"},{"IdCustomFieldsValue":2777,"Valore":"Wet Blue"},{"IdCustomFieldsValue":3090,"Valore":"Non conciata"},{"IdCustomFieldsValue":3199,"Valore":"Chrome free"},{"IdCustomFieldsValue":3469,"Valore":"Slow vegetal"},{"IdCustomFieldsValue":3527,"Valore":"Wet White"},{"IdCustomFieldsValue":3821,"Valore":"Sintetica + Cromo"},{"IdCustomFieldsValue":3888,"Valore":"Non metallica"},{"IdCustomFieldsValue":4568,"Valore":"Mineral"},{"IdCustomFieldsValue":5390,"Valore":"Cromo \/ Sintetico"},{"IdCustomFieldsValue":5398,"Valore":"Synthetique"},{"IdCustomFieldsValue":5647,"Valore":"Pickel"},{"IdCustomFieldsValue":6192,"Valore":"Chrome\/Mixed"},{"IdCustomFieldsValue":8709,"Valore":"Mixte"},{"IdCustomFieldsValue":11356,"Valore":"Mista Cromo"},{"IdCustomFieldsValue":13713,"Valore":"Bio"},{"IdCustomFieldsValue":13714,"Valore":"Bio\/Metal free"}],"150":[{"IdCustomFieldsValue":261,"Valore":"Pelletteria"},{"IdCustomFieldsValue":262,"Valore":"Calzatura (Tomaio)"},{"IdCustomFieldsValue":263,"Valore":"Calzatura (Fodera)"},{"IdCustomFieldsValue":264,"Valore":"Abbigliamento"},{"IdCustomFieldsValue":265,"Valore":"Arredamento"},{"IdCustomFieldsValue":266,"Valore":"Calzatura\/Pelletteria"},{"IdCustomFieldsValue":267,"Valore":"Cinture"},{"IdCustomFieldsValue":269,"Valore":"Piccola Pelletteria (Portafogli)"},{"IdCustomFieldsValue":270,"Valore":"Valigeria"},{"IdCustomFieldsValue":271,"Valore":"\/"},{"IdCustomFieldsValue":285,"Valore":"Leathergoods"},{"IdCustomFieldsValue":286,"Valore":"Footwear (Upper)"},{"IdCustomFieldsValue":287,"Valore":"Footwear (Lining)"},{"IdCustomFieldsValue":288,"Valore":"Apparel"},{"IdCustomFieldsValue":289,"Valore":"Furnishing"},{"IdCustomFieldsValue":290,"Valore":"Footwear\/Leathergoods"},{"IdCustomFieldsValue":291,"Valore":"Belts"},{"IdCustomFieldsValue":292,"Valore":"Watchstrap"},{"IdCustomFieldsValue":293,"Valore":"Small Leathergood"},{"IdCustomFieldsValue":338,"Valore":"Calzatura"},{"IdCustomFieldsValue":440,"Valore":"Footwear"},{"IdCustomFieldsValue":474,"Valore":"Apparel Trim"},{"IdCustomFieldsValue":495,"Valore":"Pelletteria (Fodera)"},{"IdCustomFieldsValue":582,"Valore":"Leathergoods (Bag)"},{"IdCustomFieldsValue":598,"Valore":"Pelletteria (Borsa)"},{"IdCustomFieldsValue":637,"Valore":"Shoes - Leathergoods"},{"IdCustomFieldsValue":676,"Valore":"Footwear (Insole)"},{"IdCustomFieldsValue":687,"Valore":"Piccola Pelletteria (Cinture)"},{"IdCustomFieldsValue":688,"Valore":"Cinturini da orologio"},{"IdCustomFieldsValue":692,"Valore":"Apparel (Outer)"},{"IdCustomFieldsValue":693,"Valore":"Apparel (Inner)"},{"IdCustomFieldsValue":695,"Valore":"Calzatura (Sottopiedi)"},{"IdCustomFieldsValue":742,"Valore":"Packaging"},{"IdCustomFieldsValue":756,"Valore":"Maroquinerie"},{"IdCustomFieldsValue":757,"Valore":"Maroquinerie (Sac a main)"},{"IdCustomFieldsValue":758,"Valore":"Maroquinerie (Petite maroquinerie)"},{"IdCustomFieldsValue":759,"Valore":"Maroquinerie (Ceintures)"},{"IdCustomFieldsValue":760,"Valore":"Maroquinerie (Bracelets de montres)"},{"IdCustomFieldsValue":761,"Valore":"Maroquinerie (Doublure)"},{"IdCustomFieldsValue":767,"Valore":"Bracelets de montres"},{"IdCustomFieldsValue":775,"Valore":"Pelletteria (Borsa) \/ Piccola Pelletteria (Portafogli)"},{"IdCustomFieldsValue":779,"Valore":"Leathergoods \/Finishedgoods"},{"IdCustomFieldsValue":807,"Valore":"Leathergoods (Lining)"},{"IdCustomFieldsValue":821,"Valore":"Accessori da Abbigliamento"},{"IdCustomFieldsValue":823,"Valore":"Gioielleria"},{"IdCustomFieldsValue":840,"Valore":"Jewellery"},{"IdCustomFieldsValue":855,"Valore":"Piccola Pelletteria"},{"IdCustomFieldsValue":889,"Valore":"Small Leathergood (Belt)"},{"IdCustomFieldsValue":898,"Valore":"Pelletteria (Borsa) \/ Gioielleria"},{"IdCustomFieldsValue":902,"Valore":"V\u00eatements"},{"IdCustomFieldsValue":912,"Valore":"Abbigliamento (Guanti)"},{"IdCustomFieldsValue":986,"Valore":"Leathergoods (Wallet)"},{"IdCustomFieldsValue":1009,"Valore":"Gioielleria \/ Bigiotteria"},{"IdCustomFieldsValue":1010,"Valore":"Bigiotteria"},{"IdCustomFieldsValue":1027,"Valore":"Abbigliamento esterno"},{"IdCustomFieldsValue":1028,"Valore":"Abbigliamento interno"},{"IdCustomFieldsValue":1032,"Valore":"Calzatura sfoderata"},{"IdCustomFieldsValue":1055,"Valore":"Leathergoods (Body of the bag)"},{"IdCustomFieldsValue":1082,"Valore":"Leathergoods (Belt)"},{"IdCustomFieldsValue":1104,"Valore":"Calzatura (Soletto)"},{"IdCustomFieldsValue":1204,"Valore":"Calzatura (fodera\/soletto)"},{"IdCustomFieldsValue":1205,"Valore":"Shoes"},{"IdCustomFieldsValue":1207,"Valore":"Pelletteria \/ Abbigliamento"},{"IdCustomFieldsValue":1236,"Valore":"Ombrelli"},{"IdCustomFieldsValue":1383,"Valore":"Abbigliamento\/Calzatura"},{"IdCustomFieldsValue":1421,"Valore":"Calzatura (Tacco)"},{"IdCustomFieldsValue":1467,"Valore":"Furniture"},{"IdCustomFieldsValue":1514,"Valore":"Footwear (Upper\/Lining)"},{"IdCustomFieldsValue":1662,"Valore":"Leathergoods (Exterior)"},{"IdCustomFieldsValue":1670,"Valore":"Chaussures"},{"IdCustomFieldsValue":1780,"Valore":"Abbigliamento\/Calzatura\/Pelletteria"},{"IdCustomFieldsValue":1970,"Valore":"Accessories"},{"IdCustomFieldsValue":1971,"Valore":"Carta da parati"},{"IdCustomFieldsValue":2087,"Valore":"Glasses case"},{"IdCustomFieldsValue":2190,"Valore":"Calzatura (Tomaio\/Fodera)"},{"IdCustomFieldsValue":2240,"Valore":"Pelletteria \/ Calzatura"},{"IdCustomFieldsValue":2530,"Valore":"Calzatura (Suola)"},{"IdCustomFieldsValue":2570,"Valore":"Occhiali"},{"IdCustomFieldsValue":2635,"Valore":"Footwear (Sandal)"},{"IdCustomFieldsValue":2639,"Valore":"Lining"},{"IdCustomFieldsValue":2671,"Valore":"Portachiavi"},{"IdCustomFieldsValue":3098,"Valore":"Pellicceria"},{"IdCustomFieldsValue":3200,"Valore":"Car seat upholstery"},{"IdCustomFieldsValue":3209,"Valore":"Fodera"},{"IdCustomFieldsValue":3243,"Valore":"Accessoristica"},{"IdCustomFieldsValue":3253,"Valore":"Cuscini da Viaggio"},{"IdCustomFieldsValue":3357,"Valore":"Coulisse"},{"IdCustomFieldsValue":3361,"Valore":"Leathergoods (Handbag)"},{"IdCustomFieldsValue":3369,"Valore":"Leathergoods (Knapsack)"},{"IdCustomFieldsValue":3445,"Valore":"Footwear (Lake shoe)"},{"IdCustomFieldsValue":3453,"Valore":"Apparel (Hat)"},{"IdCustomFieldsValue":3470,"Valore":"Bike saddle"},{"IdCustomFieldsValue":3476,"Valore":"Apparel (Shirts)"},{"IdCustomFieldsValue":3477,"Valore":"Apparel (Jackets)"},{"IdCustomFieldsValue":3478,"Valore":"Leathergoods (Flap)"},{"IdCustomFieldsValue":3484,"Valore":"Upholstery"},{"IdCustomFieldsValue":3485,"Valore":"Saddlery"},{"IdCustomFieldsValue":3519,"Valore":"Apparel (Lining)"},{"IdCustomFieldsValue":3837,"Valore":"Swimwear"},{"IdCustomFieldsValue":3847,"Valore":"Accoppiatura tessuti"},{"IdCustomFieldsValue":3876,"Valore":"Luggage"},{"IdCustomFieldsValue":3891,"Valore":"Pelletteria (Rinforzo)"},{"IdCustomFieldsValue":4041,"Valore":"Bijoux (Lining)"},{"IdCustomFieldsValue":4081,"Valore":"Label"},{"IdCustomFieldsValue":4189,"Valore":"Case"},{"IdCustomFieldsValue":4268,"Valore":"Abbigliamento (Camicia)"},{"IdCustomFieldsValue":4390,"Valore":"Bijoux"},{"IdCustomFieldsValue":4421,"Valore":"Apparel (tights)"},{"IdCustomFieldsValue":4424,"Valore":"Maglieria"},{"IdCustomFieldsValue":4425,"Valore":"Abbigliamento (Sciarpe)"},{"IdCustomFieldsValue":4588,"Valore":"Forniture"},{"IdCustomFieldsValue":4642,"Valore":"Calzatura (Tomaio\/Soletto)"},{"IdCustomFieldsValue":4746,"Valore":"Leathergoods\/Footwear"},{"IdCustomFieldsValue":4749,"Valore":"Orthopedic \/ comfort Shoes"},{"IdCustomFieldsValue":5308,"Valore":"Swimsuit"},{"IdCustomFieldsValue":5394,"Valore":"Pelletteria \/ Accessori"},{"IdCustomFieldsValue":5435,"Valore":"Accessoire"},{"IdCustomFieldsValue":6265,"Valore":"V\u00eatements\/Maroquinerie"},{"IdCustomFieldsValue":12514,"Valore":"\u00c9quitation"},{"IdCustomFieldsValue":12714,"Valore":"Montre"},{"IdCustomFieldsValue":13149,"Valore":"Calzatura (Tomaio\/Sottopiede)"},{"IdCustomFieldsValue":13486,"Valore":"Glasses"},{"IdCustomFieldsValue":13487,"Valore":"Sunglasses"},{"IdCustomFieldsValue":13897,"Valore":"Bagage"},{"IdCustomFieldsValue":13977,"Valore":"Apparel\/Leathergoods\/Footwear"},{"IdCustomFieldsValue":14000,"Valore":"Garment"},{"IdCustomFieldsValue":14023,"Valore":"Leathergoods (Waist bag)"},{"IdCustomFieldsValue":14681,"Valore":"Chaussures\/Maroquinerie"},{"IdCustomFieldsValue":14698,"Valore":"Small Leathergood (Key ring)"},{"IdCustomFieldsValue":14836,"Valore":"Abbigliamento (Costume da bagno)"},{"IdCustomFieldsValue":14991,"Valore":"Footwear\/Leathergoods\/Apparel"}],"156":[{"IdCustomFieldsValue":243,"Valore":"Bottone"},{"IdCustomFieldsValue":244,"Valore":"Cerniera"},{"IdCustomFieldsValue":245,"Valore":"Accessorio Metallico"},{"IdCustomFieldsValue":246,"Valore":"Accessorio Plastico"},{"IdCustomFieldsValue":247,"Valore":"Sottotacco"},{"IdCustomFieldsValue":304,"Valore":"Suola"},{"IdCustomFieldsValue":313,"Valore":"Tacco"},{"IdCustomFieldsValue":314,"Valore":"Composite"},{"IdCustomFieldsValue":315,"Valore":"Cuoio\/Pelle (1\/2 Vitello)"},{"IdCustomFieldsValue":316,"Valore":"Cuoio\/Pelle (Bovino)"},{"IdCustomFieldsValue":317,"Valore":"Cuoio\/Pelle (Capra)"},{"IdCustomFieldsValue":318,"Valore":"Cuoio\/Pelle (Coccodrillo)"},{"IdCustomFieldsValue":319,"Valore":"Cuoio\/Pelle (Crosta)"},{"IdCustomFieldsValue":320,"Valore":"Cuoio\/Pelle (Nabuck)"},{"IdCustomFieldsValue":321,"Valore":"Cuoio\/Pelle (Ovocaprino)"},{"IdCustomFieldsValue":322,"Valore":"Cuoio\/Pelle (Rettile)"},{"IdCustomFieldsValue":323,"Valore":"Cuoio\/Pelle (Vitello)"},{"IdCustomFieldsValue":324,"Valore":"Borsa"},{"IdCustomFieldsValue":325,"Valore":"Calzatura"},{"IdCustomFieldsValue":326,"Valore":"Cintura"},{"IdCustomFieldsValue":327,"Valore":"Portafoglio"},{"IdCustomFieldsValue":328,"Valore":"Tessile (Sintetico)"},{"IdCustomFieldsValue":329,"Valore":"Tessile (Ortogonale\/A maglia)"},{"IdCustomFieldsValue":330,"Valore":"Tessile (PVC)"},{"IdCustomFieldsValue":331,"Valore":"Tessile (Spalmato)"},{"IdCustomFieldsValue":332,"Valore":"Tessile (Stampato)"},{"IdCustomFieldsValue":333,"Valore":"Tessile (Accoppiato)"},{"IdCustomFieldsValue":335,"Valore":"Cuoio\/Pelle (Cavallino)"},{"IdCustomFieldsValue":342,"Valore":"Cuoio\/Pelle"},{"IdCustomFieldsValue":343,"Valore":"Tessile"},{"IdCustomFieldsValue":404,"Valore":"Leather (1\/2 Calf)"},{"IdCustomFieldsValue":405,"Valore":"Leather (Calf)"},{"IdCustomFieldsValue":406,"Valore":"Leather (Buffalo)"},{"IdCustomFieldsValue":407,"Valore":"Leather (Goat)"},{"IdCustomFieldsValue":408,"Valore":"Leather (Lamb)"},{"IdCustomFieldsValue":409,"Valore":"Leather (Exotic)"},{"IdCustomFieldsValue":410,"Valore":"Textile"},{"IdCustomFieldsValue":411,"Valore":"Final product"},{"IdCustomFieldsValue":412,"Valore":"Button"},{"IdCustomFieldsValue":413,"Valore":"Handbag"},{"IdCustomFieldsValue":414,"Valore":"Belt"},{"IdCustomFieldsValue":415,"Valore":"Heel"},{"IdCustomFieldsValue":416,"Valore":"Metallic accessories"},{"IdCustomFieldsValue":420,"Valore":"Leather"},{"IdCustomFieldsValue":446,"Valore":"Leather (Ram)"},{"IdCustomFieldsValue":480,"Valore":"Cuoio\/Pelle (Cervo)"},{"IdCustomFieldsValue":481,"Valore":"Cuoio\/Pelle (Vitellino)"},{"IdCustomFieldsValue":483,"Valore":"Wallet"},{"IdCustomFieldsValue":529,"Valore":"Cuoio\/Pelle (Nappa)"},{"IdCustomFieldsValue":533,"Valore":"Leather (Shearling)"},{"IdCustomFieldsValue":534,"Valore":"Leather (Cow)"},{"IdCustomFieldsValue":536,"Valore":"Cuoio\/Pelle (Agnello)"},{"IdCustomFieldsValue":537,"Valore":"Sottopiede"},{"IdCustomFieldsValue":547,"Valore":"Porta I-Pad"},{"IdCustomFieldsValue":558,"Valore":"Cuoio\/Pelle (Daino)"},{"IdCustomFieldsValue":571,"Valore":"Cuoio\/Pelle (Bufalo)"},{"IdCustomFieldsValue":597,"Valore":"Composito"},{"IdCustomFieldsValue":616,"Valore":"Leather (front calf)"},{"IdCustomFieldsValue":643,"Valore":"Cuoio\/Pelle (Canguro)"},{"IdCustomFieldsValue":653,"Valore":"Sole"},{"IdCustomFieldsValue":654,"Valore":"Cuoio\/Pelle (Montone)"},{"IdCustomFieldsValue":655,"Valore":"Cuoio\/Pelle (Volpe)"},{"IdCustomFieldsValue":660,"Valore":"Accessorio \/ Pitone"},{"IdCustomFieldsValue":666,"Valore":"Guanti"},{"IdCustomFieldsValue":667,"Valore":"Prodotto finito"},{"IdCustomFieldsValue":678,"Valore":"Colorante"},{"IdCustomFieldsValue":684,"Valore":"Elaphe Radiata"},{"IdCustomFieldsValue":689,"Valore":"Cuoio\/Pelle (Toro)"},{"IdCustomFieldsValue":690,"Valore":"Semilavorato"},{"IdCustomFieldsValue":696,"Valore":"Cuoio\/Pelle (Spalle)"},{"IdCustomFieldsValue":699,"Valore":"Leathergoods\/Footwear"},{"IdCustomFieldsValue":701,"Valore":"Cuoio\/Pelle (Visone)"},{"IdCustomFieldsValue":702,"Valore":"Wire"},{"IdCustomFieldsValue":705,"Valore":"Tessile (con Applicazioni)"},{"IdCustomFieldsValue":708,"Valore":"Cuoio\/Pelle (Incrociati)"},{"IdCustomFieldsValue":714,"Valore":"Cuoio\/Pelle (Cammello)"},{"IdCustomFieldsValue":717,"Valore":"Shoulder"},{"IdCustomFieldsValue":718,"Valore":"Handle"},{"IdCustomFieldsValue":719,"Valore":"Backpack"},{"IdCustomFieldsValue":731,"Valore":"Panel"},{"IdCustomFieldsValue":734,"Valore":"Textile (Coupled)"},{"IdCustomFieldsValue":736,"Valore":"Accessories"},{"IdCustomFieldsValue":738,"Valore":"Buckle"},{"IdCustomFieldsValue":740,"Valore":"Cuoio\/Pelle (Gropponi)"},{"IdCustomFieldsValue":743,"Valore":"Glittered Textile"},{"IdCustomFieldsValue":748,"Valore":"Leather (Deer)"},{"IdCustomFieldsValue":762,"Valore":"Cuir"},{"IdCustomFieldsValue":763,"Valore":"Doublure (Cro\u00fbte bovin P.U. Newcalf gris F\/32 F1.5\/1.7mm, T1.5\/2.0m2)"},{"IdCustomFieldsValue":764,"Valore":"Pieces Metallique"},{"IdCustomFieldsValue":765,"Valore":"Bracelets de montres"},{"IdCustomFieldsValue":768,"Valore":"Leather vs Textile"},{"IdCustomFieldsValue":770,"Valore":"Cuoio\/Pelle (Coniglio)"},{"IdCustomFieldsValue":792,"Valore":"Leather (Goat) vs Leather (Calf)"},{"IdCustomFieldsValue":797,"Valore":"Insock"},{"IdCustomFieldsValue":809,"Valore":"Leather (Shoulder)"},{"IdCustomFieldsValue":810,"Valore":"Cuoio\/Pelle (Fianchi)"},{"IdCustomFieldsValue":812,"Valore":"Zaino"},{"IdCustomFieldsValue":824,"Valore":"Shoe"},{"IdCustomFieldsValue":834,"Valore":"Glittered Textile"},{"IdCustomFieldsValue":835,"Valore":"Cuoio\/Pelle (Alligatore)"},{"IdCustomFieldsValue":838,"Valore":"Pannello"},{"IdCustomFieldsValue":841,"Valore":"Bracelet"},{"IdCustomFieldsValue":842,"Valore":"Chain"},{"IdCustomFieldsValue":843,"Valore":"Necklace"},{"IdCustomFieldsValue":847,"Valore":"Componente per calzatura"},{"IdCustomFieldsValue":849,"Valore":"Bracciale"},{"IdCustomFieldsValue":852,"Valore":"Cuoio\/Pelle (Cavallo)"},{"IdCustomFieldsValue":854,"Valore":"Nappa"},{"IdCustomFieldsValue":856,"Valore":"Cuoio\/Pelle (Suino)"},{"IdCustomFieldsValue":857,"Valore":"Bag"},{"IdCustomFieldsValue":862,"Valore":"PVC"},{"IdCustomFieldsValue":865,"Valore":"Cuoio\/Pelle Esotico (Ayers)"},{"IdCustomFieldsValue":877,"Valore":"Cuir (Veau)"},{"IdCustomFieldsValue":884,"Valore":"Leather (Pig)"},{"IdCustomFieldsValue":886,"Valore":"Leather (Baby Calf)"},{"IdCustomFieldsValue":888,"Valore":"Small Leathergood (Belt)"},{"IdCustomFieldsValue":899,"Valore":"Accoppiato (Tessile\/Pelle)"},{"IdCustomFieldsValue":900,"Valore":"Accoppiato (Pelle\/Pelle)"},{"IdCustomFieldsValue":901,"Valore":"Cuoio\/Pelle (Pitone)"},{"IdCustomFieldsValue":911,"Valore":"Culatte"},{"IdCustomFieldsValue":919,"Valore":"Leather (Kangaroo)"},{"IdCustomFieldsValue":934,"Valore":"Accessorio"},{"IdCustomFieldsValue":937,"Valore":"Leather (Bovine)"},{"IdCustomFieldsValue":938,"Valore":"Leather (Coupled)"},{"IdCustomFieldsValue":943,"Valore":"Textile (Glittered)"},{"IdCustomFieldsValue":945,"Valore":"Textile (Woven\/Knitted)"},{"IdCustomFieldsValue":946,"Valore":"Textile (Lining)"},{"IdCustomFieldsValue":949,"Valore":"Cuoio\/Pelle (Caribu')"},{"IdCustomFieldsValue":952,"Valore":"Tessile (Fodera)"},{"IdCustomFieldsValue":954,"Valore":"Metallic logo"},{"IdCustomFieldsValue":957,"Valore":"Plastic accessories"},{"IdCustomFieldsValue":961,"Valore":"Tessile (Paglia)"},{"IdCustomFieldsValue":962,"Valore":"Cuir (1\/2 Veau)"},{"IdCustomFieldsValue":965,"Valore":"Metallic \/ Plastic trims"},{"IdCustomFieldsValue":966,"Valore":"Prodotto chimico"},{"IdCustomFieldsValue":967,"Valore":"Cuoio\/Pelle (Culatta)"},{"IdCustomFieldsValue":974,"Valore":"I-Pad Holder"},{"IdCustomFieldsValue":979,"Valore":"Tessue"},{"IdCustomFieldsValue":984,"Valore":"Cuoio\/Pelle (Bovina)"},{"IdCustomFieldsValue":987,"Valore":"Footwear"},{"IdCustomFieldsValue":988,"Valore":"Textile (PVC)"},{"IdCustomFieldsValue":994,"Valore":"AYERS F.C. MAC."},{"IdCustomFieldsValue":995,"Valore":"Quadrante di borsa completo di maniglia"},{"IdCustomFieldsValue":1005,"Valore":"Leather (Baby calf with hair on printed)"},{"IdCustomFieldsValue":1007,"Valore":"Metallic Trims"},{"IdCustomFieldsValue":1012,"Valore":"Accessoire metallique"},{"IdCustomFieldsValue":1019,"Valore":"Fibbia"},{"IdCustomFieldsValue":1033,"Valore":"Component for Footwear"},{"IdCustomFieldsValue":1037,"Valore":"Cuoio\/Pelle (Capretto)"},{"IdCustomFieldsValue":1038,"Valore":"Leather (Crust)"},{"IdCustomFieldsValue":1040,"Valore":"Cuoio\/Pelle (Esotico)"},{"IdCustomFieldsValue":1045,"Valore":"Componente di pelletteria (tintura costola)"},{"IdCustomFieldsValue":1046,"Valore":"Tessile (Accoppiato con pelle)"},{"IdCustomFieldsValue":1049,"Valore":"Tessile (Accopiato con PU)"},{"IdCustomFieldsValue":1077,"Valore":"Sintetici"},{"IdCustomFieldsValue":1107,"Valore":"Textile (Synthetic)"},{"IdCustomFieldsValue":1126,"Valore":"Sughero"},{"IdCustomFieldsValue":1158,"Valore":"Accoppiato"},{"IdCustomFieldsValue":1159,"Valore":"Zip"},{"IdCustomFieldsValue":1178,"Valore":"Cellulosa"},{"IdCustomFieldsValue":1179,"Valore":"Pochette"},{"IdCustomFieldsValue":1218,"Valore":"Cuir (Chevre)"},{"IdCustomFieldsValue":1260,"Valore":"Watch strap"},{"IdCustomFieldsValue":1261,"Valore":"Lamina"},{"IdCustomFieldsValue":1356,"Valore":"Pietra verniciata"},{"IdCustomFieldsValue":1362,"Valore":"Cartone"},{"IdCustomFieldsValue":1369,"Valore":"Upper"},{"IdCustomFieldsValue":1373,"Valore":"Cuoio\/Pelle (Struzzo)"},{"IdCustomFieldsValue":1375,"Valore":"Prodotto liquido"},{"IdCustomFieldsValue":1376,"Valore":"Cuoio\/Pelle (Lapin Rex)"},{"IdCustomFieldsValue":1378,"Valore":"Wood Button"},{"IdCustomFieldsValue":1381,"Valore":"Lattice"},{"IdCustomFieldsValue":1419,"Valore":"Coupled"},{"IdCustomFieldsValue":1428,"Valore":"Tessile (Lana)"},{"IdCustomFieldsValue":1430,"Valore":"Tomaia"},{"IdCustomFieldsValue":1435,"Valore":"Tessile (PU)"},{"IdCustomFieldsValue":1446,"Valore":"Filo"},{"IdCustomFieldsValue":1447,"Valore":"Polvere"},{"IdCustomFieldsValue":1452,"Valore":"Leather (Sheep)"},{"IdCustomFieldsValue":1465,"Valore":"Textile (Printed)"},{"IdCustomFieldsValue":1487,"Valore":"Plastic sample"},{"IdCustomFieldsValue":1495,"Valore":"Pigmento"},{"IdCustomFieldsValue":1502,"Valore":"Shanks"},{"IdCustomFieldsValue":1506,"Valore":"Button (Urea)"},{"IdCustomFieldsValue":1521,"Valore":"Pietra"},{"IdCustomFieldsValue":1523,"Valore":"Fabric sample"},{"IdCustomFieldsValue":1525,"Valore":"Cuoio\/Pelle (Pesce)"},{"IdCustomFieldsValue":1526,"Valore":"Button (Sydney)"},{"IdCustomFieldsValue":1563,"Valore":"Metal Powder"},{"IdCustomFieldsValue":1569,"Valore":"Liquid product"},{"IdCustomFieldsValue":1582,"Valore":"Paint"},{"IdCustomFieldsValue":1588,"Valore":"Laminated paper"},{"IdCustomFieldsValue":1589,"Valore":"Accessoire"},{"IdCustomFieldsValue":1597,"Valore":"Lucido"},{"IdCustomFieldsValue":1623,"Valore":"Cuoio\/Pelle (Anguilla)"},{"IdCustomFieldsValue":1626,"Valore":"Tessile (Cotone)"},{"IdCustomFieldsValue":1663,"Valore":"ABS"},{"IdCustomFieldsValue":1664,"Valore":"Leather (Bos Taurus)"},{"IdCustomFieldsValue":1731,"Valore":"Leather (Ayers)"},{"IdCustomFieldsValue":1732,"Valore":"Leather (Colubro)"},{"IdCustomFieldsValue":1733,"Valore":"Leather (Python)"},{"IdCustomFieldsValue":1736,"Valore":"Heel with Insole"},{"IdCustomFieldsValue":1737,"Valore":"Cuoio\/Pelle (Lapin)"},{"IdCustomFieldsValue":1739,"Valore":"Cuoio\/Pelle (Caimano)"},{"IdCustomFieldsValue":1743,"Valore":"Cuir (Agneau)"},{"IdCustomFieldsValue":1760,"Valore":"Leather (Kid)"},{"IdCustomFieldsValue":1781,"Valore":"Packaging Box"},{"IdCustomFieldsValue":1782,"Valore":"Packaging Cloth"},{"IdCustomFieldsValue":1803,"Valore":"Textile (Coated)"},{"IdCustomFieldsValue":1811,"Valore":"Leather (Reclaimed) "},{"IdCustomFieldsValue":1882,"Valore":"Accoppiato (Tessile\/Tessile)"},{"IdCustomFieldsValue":1913,"Valore":"Lycra"},{"IdCustomFieldsValue":1930,"Valore":"Cuoio\/Pelle (Lucertola)"},{"IdCustomFieldsValue":1981,"Valore":"Leather (Baby Goat)"},{"IdCustomFieldsValue":1987,"Valore":"Cover"},{"IdCustomFieldsValue":2003,"Valore":"Tracolla"},{"IdCustomFieldsValue":2079,"Valore":"Leather (Bull)"},{"IdCustomFieldsValue":2080,"Valore":"Leather (Ovine)"},{"IdCustomFieldsValue":2176,"Valore":"Tessile (Poliestere)"},{"IdCustomFieldsValue":2184,"Valore":"Cuoio\/Pelle (Lama)"},{"IdCustomFieldsValue":2203,"Valore":"Accessorio in pelle"},{"IdCustomFieldsValue":2259,"Valore":"Leather (Eel)"},{"IdCustomFieldsValue":2273,"Valore":"Accoppiato (Accessorio\/Pelle)"},{"IdCustomFieldsValue":2274,"Valore":"Accoppiato (Accessorio\/Tessile)"},{"IdCustomFieldsValue":2276,"Valore":"Accessorio in tessuto"},{"IdCustomFieldsValue":2376,"Valore":"Cuoio rigenerato"},{"IdCustomFieldsValue":2460,"Valore":"Regenerated Leather"},{"IdCustomFieldsValue":2465,"Valore":"Resina acrilica"},{"IdCustomFieldsValue":2467,"Valore":"Bonded Leather"},{"IdCustomFieldsValue":2515,"Valore":"Tessile (Seta)"},{"IdCustomFieldsValue":2528,"Valore":"Cuoio"},{"IdCustomFieldsValue":2540,"Valore":"Paper packaging"},{"IdCustomFieldsValue":2541,"Valore":"Plastic packaging"},{"IdCustomFieldsValue":2576,"Valore":"Zip in Nylon"},{"IdCustomFieldsValue":2577,"Valore":"Nylon Zip"},{"IdCustomFieldsValue":2634,"Valore":"Footwear (Sandal)"},{"IdCustomFieldsValue":2644,"Valore":"Leather (Alligator)"},{"IdCustomFieldsValue":2716,"Valore":"Powder"},{"IdCustomFieldsValue":2770,"Valore":"Tissu"},{"IdCustomFieldsValue":2773,"Valore":"TBC"},{"IdCustomFieldsValue":2781,"Valore":"Leather (Nappa)"},{"IdCustomFieldsValue":3048,"Valore":"Leather (Bovine Split)"},{"IdCustomFieldsValue":3086,"Valore":"Valigia"},{"IdCustomFieldsValue":3087,"Valore":"Leather (Fox)"},{"IdCustomFieldsValue":3089,"Valore":"Cuoio\/Pelle (Mucca)"},{"IdCustomFieldsValue":3204,"Valore":"Tessile (Raso)"},{"IdCustomFieldsValue":3205,"Valore":"Ecopelle"},{"IdCustomFieldsValue":3212,"Valore":"Tessile (Termosaldatura)"},{"IdCustomFieldsValue":3215,"Valore":"Watch case"},{"IdCustomFieldsValue":3226,"Valore":"Shoulder strap"},{"IdCustomFieldsValue":3244,"Valore":"Tessile (Microfibra)"},{"IdCustomFieldsValue":3252,"Valore":"Spandex"},{"IdCustomFieldsValue":3259,"Valore":"Glue"},{"IdCustomFieldsValue":3264,"Valore":"EVA"},{"IdCustomFieldsValue":3284,"Valore":"Leather (Horse)"},{"IdCustomFieldsValue":3308,"Valore":"Soletto"},{"IdCustomFieldsValue":3312,"Valore":"Textile (PU)"},{"IdCustomFieldsValue":3316,"Valore":"Cufflinks"},{"IdCustomFieldsValue":3348,"Valore":"Synthetic Fur"},{"IdCustomFieldsValue":3355,"Valore":"Resina poliuretanica ad acqua"},{"IdCustomFieldsValue":3356,"Valore":"Resina siliconica"},{"IdCustomFieldsValue":3437,"Valore":"Leather (Whips)"},{"IdCustomFieldsValue":3438,"Valore":"Leather (Karung)"},{"IdCustomFieldsValue":3448,"Valore":"Swimming cap"},{"IdCustomFieldsValue":3458,"Valore":"Leather (Crocodile)"},{"IdCustomFieldsValue":3459,"Valore":"Leather (Crocodile Niloticus)"},{"IdCustomFieldsValue":3464,"Valore":"Leather (Cayman)"},{"IdCustomFieldsValue":3466,"Valore":"Leather (Ostrich)"},{"IdCustomFieldsValue":3471,"Valore":"Accessorio Metallico (Ottone)"},{"IdCustomFieldsValue":3486,"Valore":"Leather (Fish)"},{"IdCustomFieldsValue":3495,"Valore":"Textile (Woven)"},{"IdCustomFieldsValue":3510,"Valore":"Tessile (Ortogonale)"},{"IdCustomFieldsValue":3512,"Valore":"Lacquer"},{"IdCustomFieldsValue":3513,"Valore":"Textile (Cotton)"},{"IdCustomFieldsValue":3522,"Valore":"Cuoio\/Pelle (Coccodrillo Porosus)"},{"IdCustomFieldsValue":3737,"Valore":"Cuir (Alligator)"},{"IdCustomFieldsValue":3752,"Valore":"Canvas"},{"IdCustomFieldsValue":3834,"Valore":"Leather (Lizard)"},{"IdCustomFieldsValue":3844,"Valore":"LV"},{"IdCustomFieldsValue":3850,"Valore":"Textile (Synthetic & blend)"},{"IdCustomFieldsValue":3854,"Valore":"Pelliccia ecologica"},{"IdCustomFieldsValue":3856,"Valore":"Insole"},{"IdCustomFieldsValue":3861,"Valore":"Textile (Natural) + Prints\/Coating"},{"IdCustomFieldsValue":3875,"Valore":"Trolley"},{"IdCustomFieldsValue":3877,"Valore":"Rubber"},{"IdCustomFieldsValue":3878,"Valore":"Rubber + Plastic"},{"IdCustomFieldsValue":4032,"Valore":"Fake leather"},{"IdCustomFieldsValue":4097,"Valore":"Produit fini"},{"IdCustomFieldsValue":4121,"Valore":"Materiali adesivi in Nylon"},{"IdCustomFieldsValue":4138,"Valore":"Cuir (Porosus)"},{"IdCustomFieldsValue":4139,"Valore":"Cuir (Niloticus)"},{"IdCustomFieldsValue":4141,"Valore":"Gloves"},{"IdCustomFieldsValue":4146,"Valore":"Tessile (Rafia)"},{"IdCustomFieldsValue":4159,"Valore":"Raw material"},{"IdCustomFieldsValue":4165,"Valore":"Textile (Lace)"},{"IdCustomFieldsValue":4169,"Valore":"Tessile (Tulle)"},{"IdCustomFieldsValue":4188,"Valore":"Polycarbonate"},{"IdCustomFieldsValue":4190,"Valore":"Wax"},{"IdCustomFieldsValue":4202,"Valore":"Tessile (Rete)"},{"IdCustomFieldsValue":4203,"Valore":"Tessile (Neoprene)"},{"IdCustomFieldsValue":4232,"Valore":"Sludge"},{"IdCustomFieldsValue":4249,"Valore":"Feather"},{"IdCustomFieldsValue":4264,"Valore":"Legno"},{"IdCustomFieldsValue":4281,"Valore":"Textile (Nylon)"},{"IdCustomFieldsValue":4285,"Valore":"Textile (Knitted)"},{"IdCustomFieldsValue":4402,"Valore":"Cuoio\/Pelle (Porosus)"},{"IdCustomFieldsValue":4422,"Valore":"Tights"},{"IdCustomFieldsValue":4564,"Valore":"Sock"},{"IdCustomFieldsValue":4698,"Valore":"Wood"},{"IdCustomFieldsValue":4720,"Valore":"Cuoio\/Pelle (Ovinocaprino)"},{"IdCustomFieldsValue":5063,"Valore":"Synth\u00e9tique"},{"IdCustomFieldsValue":5089,"Valore":"Solid Product"},{"IdCustomFieldsValue":5106,"Valore":"Cuoio\/Pelle (Cocco)"},{"IdCustomFieldsValue":5314,"Valore":"Cuoio\/Pelle (\u00bd bovina)"},{"IdCustomFieldsValue":5372,"Valore":"Plastique accessoires"},{"IdCustomFieldsValue":5484,"Valore":"Hat"},{"IdCustomFieldsValue":5689,"Valore":"Produit liquide"},{"IdCustomFieldsValue":6528,"Valore":"Textile accessories"},{"IdCustomFieldsValue":8580,"Valore":"Poussi\u00e8re"},{"IdCustomFieldsValue":8778,"Valore":"Eco-Leather"},{"IdCustomFieldsValue":9269,"Valore":"Polietilene"},{"IdCustomFieldsValue":9602,"Valore":"Silk"},{"IdCustomFieldsValue":11227,"Valore":"Bois"},{"IdCustomFieldsValue":11228,"Valore":"Produit solide"},{"IdCustomFieldsValue":12432,"Valore":"Polyester"},{"IdCustomFieldsValue":12597,"Valore":"Mousse"},{"IdCustomFieldsValue":12612,"Valore":"Papier"},{"IdCustomFieldsValue":12689,"Valore":"Accessoires en plastique"},{"IdCustomFieldsValue":13244,"Valore":"Cuir (Autreches)"},{"IdCustomFieldsValue":13256,"Valore":"TPU"},{"IdCustomFieldsValue":13257,"Valore":"Gomma"},{"IdCustomFieldsValue":13726,"Valore":"Micro"},{"IdCustomFieldsValue":14025,"Valore":"Tessile (Nylon)"},{"IdCustomFieldsValue":14173,"Valore":"Poliuretano"},{"IdCustomFieldsValue":14238,"Valore":"Accessorio plastico"},{"IdCustomFieldsValue":14239,"Valore":"Plastica"},{"IdCustomFieldsValue":14633,"Valore":"Cuir (Bovin)"},{"IdCustomFieldsValue":14927,"Valore":"Cuoio\/Pelle (Varano)"},{"IdCustomFieldsValue":15048,"Valore":"Plexiglas"}],"163":[{"IdCustomFieldsValue":248,"Valore":"a cura del laboratorio secondo la UNI EN ISO 2418:2006 "},{"IdCustomFieldsValue":251,"Valore":"a cura del committente "},{"IdCustomFieldsValue":278,"Valore":"done by the laboratory according to the UNI EN ISO 2418:2006 "},{"IdCustomFieldsValue":281,"Valore":"done by the client "},{"IdCustomFieldsValue":649,"Valore":"the specimen has been sampled from the footwear supplied by the client"},{"IdCustomFieldsValue":677,"Valore":"materiale campionato da borsa fornita dal cliente"},{"IdCustomFieldsValue":727,"Valore":"the specimen has been sampled from the bag supplied by the client"},{"IdCustomFieldsValue":755,"Valore":"par le client"},{"IdCustomFieldsValue":878,"Valore":"effectu\u00e9e par le laboratoire selon la norme UNI EN ISO 2418:2006"},{"IdCustomFieldsValue":1029,"Valore":"the specimen has been sampled from the wallet supplied by the client"},{"IdCustomFieldsValue":1627,"Valore":"materiale campionato da calzatura fornita dal cliente"},{"IdCustomFieldsValue":1628,"Valore":"materiale campionato da portafogli fornito dal cliente"},{"IdCustomFieldsValue":4716,"Valore":"Grab, sampled by the Lab"},{"IdCustomFieldsValue":5355,"Valore":"Material sampled by the Lab."},{"IdCustomFieldsValue":9142,"Valore":"materiale campionato da cappello fornito dal cliente"}],"165":[{"IdCustomFieldsValue":825,"Valore":"Nessuno, come da accordi con il cliente"},{"IdCustomFieldsValue":826,"Valore":"None, as agreed with the client"},{"IdCustomFieldsValue":1632,"Valore":"Aucun, selon accords avec le client"},{"IdCustomFieldsValue":2088,"Valore":"24\u00b12h; 21\u00b11\u00b0C; 65\u00b12%U.R. (Se richiesto dal Metodo di Prova, analisi eseguita in atmosfera standard)"},{"IdCustomFieldsValue":2089,"Valore":"24\u00b12h; 21\u00b11\u00b0C; 65\u00b12% R.H. (If required by the test method, analysis carried out in standard atmosphere)"},{"IdCustomFieldsValue":2450,"Valore":"(According to UNI EN ISO 2419:2012) 23\u00b0+\/-2\u00b0C; 50+\/-5% R.H. (If required by the test method, trial carried out in standard atmosphere)"},{"IdCustomFieldsValue":2552,"Valore":"Atmosfera di condizionamento e di prova: 20\u00b12\u00b0, 65\u00b15% UR"},{"IdCustomFieldsValue":3187,"Valore":"Il campione \u00e8 conservato a temperatura <4\u00b0C"},{"IdCustomFieldsValue":3188,"Valore":"the sample is stored at temperature <4\u00b0C"},{"IdCustomFieldsValue":6133,"Valore":"24\u00b12h; 21\u00b11\u00b0C; 65\u00b12%U.R. (Si prevu par le m\u00e9thode du test, analyse execut\u00e9e en atmosph\u00e8re standardis\u00e9e)"},{"IdCustomFieldsValue":15005,"Valore":"24\u00b12h; 23\u00b12\u00b0C; 50\u00b15%U.R. (Se richiesto dal Metodo di Prova, analisi eseguita in atmosfera standard)"},{"IdCustomFieldsValue":15006,"Valore":"24\u00b12h; 23\u00b12\u00b0C; 50\u00b15% R.H. (If required by the test method, analysis carried out in standard atmosphere)"},{"IdCustomFieldsValue":15007,"Valore":"24\u00b12h; 23\u00b12\u00b0C; 50\u00b15%U.R. (Si prevu par le m\u00e9thode du test, analyse execut\u00e9e en atmosph\u00e8re standardis\u00e9e)"}],"169":[{"IdCustomFieldsValue":672,"Valore":"Si"},{"IdCustomFieldsValue":673,"Valore":"No"},{"IdCustomFieldsValue":778,"Valore":"Si se FAIL"},{"IdCustomFieldsValue":4408,"Valore":"Procedura Standard"}],"170":[{"IdCustomFieldsValue":674,"Valore":"No"},{"IdCustomFieldsValue":675,"Valore":"Si"},{"IdCustomFieldsValue":777,"Valore":"Si se FAIL"},{"IdCustomFieldsValue":4409,"Valore":"Procedura Standard"}],"171":[{"IdCustomFieldsValue":668,"Valore":"Si"},{"IdCustomFieldsValue":669,"Valore":"No"},{"IdCustomFieldsValue":670,"Valore":"Si se FAIL"},{"IdCustomFieldsValue":671,"Valore":"Si FINE MESE"},{"IdCustomFieldsValue":1013,"Valore":"SI OGNI GIOVED\u00ec"},{"IdCustomFieldsValue":1185,"Valore":"SI due volte alla settimana"},{"IdCustomFieldsValue":2216,"Valore":"SI una volta alla settimana"},{"IdCustomFieldsValue":4410,"Valore":"Procedura Standard"},{"IdCustomFieldsValue":5722,"Valore":"SI stesso giorno"}],"181":[{"IdCustomFieldsValue":744,"Valore":"Il campione \u00e8 preparato secondo la ISO 4044 (quando richiesto dal metodo di prova)."},{"IdCustomFieldsValue":745,"Valore":"Sample is prepared according to ISO 4044 (whenever requested by the test method)"},{"IdCustomFieldsValue":753,"Valore":"L\u2019\u00e9chantillon est pr\u00e9par\u00e9 conform\u00e9ment \u00e0 la norme ISO 4044 (lorsque cela est requis par la m\u00e9thode d\u2019essai)."}],"236":[{"IdCustomFieldsValue":1468,"Valore":"Consegnato a mano"},{"IdCustomFieldsValue":1469,"Valore":"Inviato tramite corriere"},{"IdCustomFieldsValue":4945,"Valore":"Navetta Scandicci"}],"241":[{"IdCustomFieldsValue":1603,"Valore":"a Pacchetto"},{"IdCustomFieldsValue":1604,"Valore":">3"},{"IdCustomFieldsValue":1605,"Valore":"<=3"}],"246":[{"IdCustomFieldsValue":1753,"Valore":"BV Shangai"},{"IdCustomFieldsValue":1755,"Valore":"BV Hamburg- Eva Maria Benkhoff"},{"IdCustomFieldsValue":1756,"Valore":"BV Turkey"},{"IdCustomFieldsValue":1757,"Valore":"BV UK"},{"IdCustomFieldsValue":1937,"Valore":"BV Vietnam"},{"IdCustomFieldsValue":1938,"Valore":"BV Schwerin"},{"IdCustomFieldsValue":1939,"Valore":"BV Guangzhou"},{"IdCustomFieldsValue":1940,"Valore":"BV France"},{"IdCustomFieldsValue":1941,"Valore":"No outsourcing"},{"IdCustomFieldsValue":1944,"Valore":"Coventya"},{"IdCustomFieldsValue":1945,"Valore":"Cimac- P.Biglia"},{"IdCustomFieldsValue":2290,"Valore":"Ricotest"},{"IdCustomFieldsValue":2403,"Valore":"LBS"},{"IdCustomFieldsValue":2696,"Valore":"BV Korea"},{"IdCustomFieldsValue":2998,"Valore":"BV Hong Kong"},{"IdCustomFieldsValue":3058,"Valore":"J.S. Hamilton Poland S.A."},{"IdCustomFieldsValue":3191,"Valore":"BV Schwerin - BV Turkey"},{"IdCustomFieldsValue":3341,"Valore":"BV Guangzhou, BV Shangai"},{"IdCustomFieldsValue":3350,"Valore":"BV Guangzhou, BV Honk Kong"},{"IdCustomFieldsValue":3406,"Valore":"BV Putian - Lily Li"},{"IdCustomFieldsValue":4239,"Valore":"BV India"},{"IdCustomFieldsValue":4282,"Valore":"Laboraitore Eric Beucher"},{"IdCustomFieldsValue":4420,"Valore":"HerAmbiente "},{"IdCustomFieldsValue":4679,"Valore":"Chemi-Lab"},{"IdCustomFieldsValue":5745,"Valore":"BV USA, Buffalo - NY "},{"IdCustomFieldsValue":6450,"Valore":"BV Turkey- Ahmet Korkut + BV Hong Kong- Jimmy Wong\/Tasman Tai\r\n"},{"IdCustomFieldsValue":8098,"Valore":"BV Vietnam- Joy Nguyen + BV Turkey- Ahmet Korkut"},{"IdCustomFieldsValue":8755,"Valore":"Appliance Engineering Technology France SAS"},{"IdCustomFieldsValue":9316,"Valore":"BV Vietnam- Joy Nguyen + BV Guangzhou"},{"IdCustomFieldsValue":9483,"Valore":"Neosis s.r.l"},{"IdCustomFieldsValue":9645,"Valore":"Environ Lab"},{"IdCustomFieldsValue":11325,"Valore":"Neosis s.r.l + BV Honk Kong"},{"IdCustomFieldsValue":11342,"Valore":"Beta analythics"},{"IdCustomFieldsValue":12678,"Valore":"BV Honk Kong + BV Shangai"},{"IdCustomFieldsValue":13717,"Valore":"BV Thailand"},{"IdCustomFieldsValue":13917,"Valore":"BV France, BV Shangai"},{"IdCustomFieldsValue":14877,"Valore":"BV Shangai - BV Hong Kong"}],"252":[{"IdCustomFieldsValue":1887,"Valore":"Regular"},{"IdCustomFieldsValue":1888,"Valore":"Express (1-2 Working Days)"},{"IdCustomFieldsValue":1889,"Valore":"Urgent (3 Working Days)"}],"253":[{"IdCustomFieldsValue":1891,"Valore":"Yes"},{"IdCustomFieldsValue":1892,"Valore":"No"}],"261":[{"IdCustomFieldsValue":1978,"Valore":"2C Cina"},{"IdCustomFieldsValue":2442,"Valore":"N\/A"}],"771":[{"IdCustomFieldsValue":8595,"Valore":"PASS"},{"IdCustomFieldsValue":8596,"Valore":"FAIL"},{"IdCustomFieldsValue":8598,"Valore":"N\/A"}],"772":[{"IdCustomFieldsValue":8599,"Valore":"PASS"},{"IdCustomFieldsValue":8600,"Valore":"FAIL"},{"IdCustomFieldsValue":8601,"Valore":"N\/A"}],"773":[{"IdCustomFieldsValue":8602,"Valore":"PASS"},{"IdCustomFieldsValue":8603,"Valore":"FAIL"},{"IdCustomFieldsValue":8604,"Valore":"N\/A"},{"IdCustomFieldsValue":8605,"Valore":"DATA"}],"1083":[{"IdCustomFieldsValue":13482,"Valore":"Moncler Compliance_GT"},{"IdCustomFieldsValue":13488,"Valore":"Moncler Ufficio tecnico_MC"},{"IdCustomFieldsValue":13495,"Valore":"Moncler Compliance_EM"},{"IdCustomFieldsValue":13496,"Valore":"Moncler Compliance_MB"},{"IdCustomFieldsValue":13497,"Valore":"Moncler Compliance_CB"},{"IdCustomFieldsValue":13526,"Valore":"Moncler Compliance_CS"},{"IdCustomFieldsValue":13530,"Valore":"Moncler Compliance_FZ"},{"IdCustomFieldsValue":13554,"Valore":"Moncler Ufficio tecnico_AZ"},{"IdCustomFieldsValue":13662,"Valore":"Moncler Ufficio tecnico_LL"},{"IdCustomFieldsValue":13727,"Valore":"Moncler Ufficio tecnico_AU"},{"IdCustomFieldsValue":13786,"Valore":"Moncler Compliance_AC"},{"IdCustomFieldsValue":13945,"Valore":"Moncler Compliance_BZ"},{"IdCustomFieldsValue":14006,"Valore":"Moncler Compliance_GR"},{"IdCustomFieldsValue":14818,"Valore":"Moncler Ufficio tecnico_LC"},{"IdCustomFieldsValue":14910,"Valore":"Moncler Ufficio tecnico_FV"}]}
\ No newline at end of file
diff --git a/public/userarea/delete_part.php b/public/userarea/delete_part.php
deleted file mode 100644
index fc5309a..0000000
--- a/public/userarea/delete_part.php
+++ /dev/null
@@ -1,29 +0,0 @@
-getConnection();
-
-$data = json_decode(file_get_contents('php://input'), true);
-
-$partId = $data['part_id'] ?? null;
-
-if (!$partId) {
- echo json_encode(['success' => false, 'message' => 'ID parte mancante']);
- exit;
-}
-
-try {
- $stmt = $pdo->prepare("DELETE FROM identification_parts WHERE id = :part_id");
- $stmt->execute([':part_id' => $partId]);
- $rowCount = $stmt->rowCount();
- if ($rowCount > 0) {
- echo json_encode(['success' => true, 'message' => 'Parte eliminata con successo']);
- } else {
- echo json_encode(['success' => false, 'message' => 'Nessuna parte trovata con ID ' . $partId]);
- }
-} catch (PDOException $e) {
- echo json_encode(['success' => false, 'message' => 'Errore nell\'eliminazione: ' . $e->getMessage()]);
-}
diff --git a/public/userarea/delete_part_quotation.php b/public/userarea/delete_part_quotation.php
deleted file mode 100644
index ace1700..0000000
--- a/public/userarea/delete_part_quotation.php
+++ /dev/null
@@ -1,28 +0,0 @@
-getConnection();
-
-$data = json_decode(file_get_contents('php://input'), true);
-
-$partId = $data['part_id'] ?? null;
-
-if (!$partId) {
- echo json_encode(['success' => false, 'message' => 'ID parte mancante']);
- exit;
-}
-
-try {
- $stmt = $pdo->prepare("DELETE FROM identification_parts WHERE id = :part_id");
- $stmt->execute([':part_id' => $partId]);
- $rowCount = $stmt->rowCount();
- if ($rowCount > 0) {
- echo json_encode(['success' => true, 'message' => 'Parte eliminata con successo']);
- } else {
- echo json_encode(['success' => false, 'message' => 'Nessuna parte trovata con ID ' . $partId]);
- }
-} catch (PDOException $e) {
- echo json_encode(['success' => false, 'message' => 'Errore nell\'eliminazione: ' . $e->getMessage()]);
-}
diff --git a/public/userarea/delete_photo.php b/public/userarea/delete_photo.php
deleted file mode 100644
index 8e96d30..0000000
--- a/public/userarea/delete_photo.php
+++ /dev/null
@@ -1,37 +0,0 @@
- false, 'message' => 'Richiesta non valida']);
- exit;
-}
-
-$photoId = intval($_POST['photo_id']);
-
-$db = DBHandlerSelect::getInstance();
-$pdo = $db->getConnection();
-
-// Recupera il percorso del file
-$stmt = $pdo->prepare("SELECT file_path FROM datadb_photos WHERE id = ?");
-$stmt->execute([$photoId]);
-$photo = $stmt->fetch(PDO::FETCH_ASSOC);
-
-if (!$photo) {
- echo json_encode(['success' => false, 'message' => 'Foto non trovata']);
- exit;
-}
-
-// Elimina il file dal server
-$filePath = '../photostrf/' . $photo['file_path'];
-if (file_exists($filePath)) {
- unlink($filePath);
-}
-
-// Elimina il record dal database
-$stmt = $pdo->prepare("DELETE FROM datadb_photos WHERE id = ?");
-$stmt->execute([$photoId]);
-
-echo json_encode(['success' => true, 'message' => 'Foto eliminata con successo']);
diff --git a/public/userarea/delete_record.php b/public/userarea/delete_record.php
deleted file mode 100644
index 87f0b9c..0000000
--- a/public/userarea/delete_record.php
+++ /dev/null
@@ -1,64 +0,0 @@
- false, 'message' => 'ID non valido']);
- exit;
-}
-
-// Connessione al database
-try {
- $db = DBHandlerSelect::getInstance();
- $pdo = $db->getConnection();
-} catch (Exception $e) {
- http_response_code(500);
- echo json_encode(['success' => false, 'message' => 'Errore di connessione al database: ' . $e->getMessage()]);
- error_log("Errore di connessione al database: " . $e->getMessage());
- exit;
-}
-
-// Inizia una transazione
-$pdo->beginTransaction();
-
-try {
- // Elimina i dettagli associati dal tavolo import_data_details
- $stmt = $pdo->prepare("DELETE FROM import_data_details WHERE id = ?");
- $stmt->execute([$iddatadb]);
-
- // Elimina il record principale dal tavolo datadb
- $stmt = $pdo->prepare("DELETE FROM datadb WHERE iddatadb = ?");
- $stmt->execute([$iddatadb]);
-
- // Verifica se il record è stato eliminato
- if ($stmt->rowCount() > 0) {
- $pdo->commit();
- echo json_encode(['success' => true, 'message' => 'Record eliminato con successo']);
- error_log("Record con iddatadb=$iddatadb eliminato con successo");
- } else {
- $pdo->rollBack();
- http_response_code(404);
- echo json_encode(['success' => false, 'message' => 'Record non trovato']);
- error_log("Record con iddatadb=$iddatadb non trovato");
- }
-} catch (Exception $e) {
- $pdo->rollBack();
- http_response_code(500);
- echo json_encode(['success' => false, 'message' => 'Errore durante la cancellazione: ' . $e->getMessage()]);
- error_log("Errore durante la cancellazione del record con iddatadb=$iddatadb: " . $e->getMessage());
-}
diff --git a/public/userarea/delete_template_xls.php b/public/userarea/delete_template_xls.php
deleted file mode 100644
index 13cbe68..0000000
--- a/public/userarea/delete_template_xls.php
+++ /dev/null
@@ -1,49 +0,0 @@
-getConnection();
-
- if (!$pdo) {
- throw new Exception('Database connection failed');
- }
-
- // Verifica se l'ID esiste
- $stmtCheck = $pdo->prepare("SELECT id FROM excel_templates WHERE id = ?");
- $stmtCheck->execute([$id]);
- if ($stmtCheck->rowCount() === 0) {
- throw new Exception('Template not found');
- }
-
- // Esegui l'eliminazione
- $stmt = $pdo->prepare("DELETE FROM excel_templates WHERE id = ?");
- $stmt->execute([$id]);
-
- if ($stmt->rowCount() > 0) {
- $message = "Template deleted successfully!";
- $status = "success";
- } else {
- throw new Exception('Failed to delete template');
- }
-} catch (Exception $e) {
- $message = $e->getMessage();
- $status = "error";
-}
-
-// Reindirizza con un messaggio
-header("Location: templates_dashboard.php?status=$status&message=" . urlencode($message));
-exit;
diff --git a/public/userarea/edit_template_xls.php b/public/userarea/edit_template_xls.php
deleted file mode 100644
index c3dd001..0000000
--- a/public/userarea/edit_template_xls.php
+++ /dev/null
@@ -1,434 +0,0 @@
-getConnection();
-$stmt = $pdo->prepare("SELECT * FROM excel_templates WHERE id = ?");
-$stmt->execute([$id]);
-$template = $stmt->fetch(PDO::FETCH_ASSOC);
-
-if (!$template) {
- header("Location: template_dashboard.php?status=error&message=" . urlencode("Template not found"));
- exit;
-}
-
-// Recupera tutte le routine dal database
-$stmt = $pdo->prepare("SELECT * FROM routine");
-$stmt->execute();
-$routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
-?>
-
-
-
-
-
-
-
-
-
-
-
-
- Edit Template = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
Edit the following form in order to update the selected import XLS template
-
Mandatory Fields
-
- Template Name
- Row Header and Column Header: where the title of the excel starts
- Schema
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/error_log.txt b/public/userarea/error_log.txt
deleted file mode 100644
index 5ddbde3..0000000
--- a/public/userarea/error_log.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-2025-06-10 12:21:44 - Errore nel recupero dati: HTTP 404, Risposta:
-2025-06-16 11:15:30 - Errore nel recupero dati: HTTP 404, Risposta: {"title":"Not Found","status":404,"detail":"Not Found","instance":"GET /api/odata/Rapporto(2523026)","errorCode":"d25cbd678"}
-2025-06-16 11:34:59 - Autenticazione fallita: HTTP 0, Errore cURL: Failed to connect to 93.43.5.102 port 443 after 21033 ms: Couldn't connect to server, Risposta:
-2025-06-16 11:42:03 - Errore nella richiesta: Recv failure: Connection was reset
-2025-07-04 10:42:49 - 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"}
-2025-07-04 10:44:13 - 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"}
-2025-07-04 10:48:07 - 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"}
-2025-08-19 16:29:25 - 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"}
-2025-08-26 16:47:19 - Risposta non JSON valida: {
- console.log("export_to_lims.js loaded");
-
- // Debug: verifica che i pulsanti siano trovati
- const exportButtons = document.querySelectorAll(".export-lims-btn");
- console.log(`Found ${exportButtons.length} export-lims-btn buttons`);
-
- if (exportButtons.length === 0) {
- console.warn("No .export-lims-btn buttons found in the DOM");
- return;
- }
-
- exportButtons.forEach((btn) => {
- btn.addEventListener("click", (e) => {
- e.preventDefault();
- const rowIndex = btn.dataset.row;
- const iddatadb = btn.dataset.iddatadb;
- console.log(
- `Export to LIMS clicked for row ${rowIndex}, iddatadb: ${iddatadb}`,
- );
-
- // Mostra il modale di conferma
- const confirmModalElement =
- document.getElementById("exportConfirmModal");
- if (!confirmModalElement) {
- console.error("exportConfirmModal not found in the DOM");
- alert("Errore: Modale di conferma non trovato");
- return;
- }
-
- const confirmModal = new bootstrap.Modal(confirmModalElement, {
- keyboard: false,
- });
- document.getElementById("exportIddatadb").textContent = iddatadb;
- confirmModal.show();
-
- // Gestisci il click su "Conferma"
- const confirmBtn = document.getElementById("exportConfirmBtn");
- if (!confirmBtn) {
- console.error("exportConfirmBtn not found in the DOM");
- confirmModal.hide();
- alert("Errore: Pulsante di conferma non trovato");
- return;
- }
-
- const confirmHandler = async () => {
- console.log(`Confirmed export for iddatadb: ${iddatadb}`);
- confirmModal.hide();
-
- const formData = new FormData();
- formData.append("iddatadb", iddatadb);
-
- try {
- const response = await fetch("export_to_lims.php", {
- method: "POST",
- body: formData,
- });
- if (!response.ok)
- throw new Error(
- `HTTP error! status: ${response.status}`,
- );
- const data = await response.json();
-
- console.log("Export response:", data);
-
- // Mostra il modale di risposta
- const responseModalElement = document.getElementById(
- "exportResponseModal",
- );
- if (!responseModalElement) {
- console.error(
- "exportResponseModal not found in the DOM",
- );
- alert("Errore: Modale di risposta non trovato");
- return;
- }
-
- const responseModal = new bootstrap.Modal(
- responseModalElement,
- {
- keyboard: false,
- },
- );
- const responseMessage = document.getElementById(
- "exportResponseMessage",
- );
- if (data.success) {
- responseMessage.innerHTML = `${data.message.replace(/\n/g, " ")} ID CommessaWeb: ${data.idcommessaweb}`;
- document.getElementById(
- "exportResponseModalLabel",
- ).textContent = "Esportazione Completata";
- responseModal.show();
-
- // Aggiorna la UI per riflettere lo stato 'To LIMS'
- const statusCell = btn
- .closest(".grid-row")
- .querySelector(
- '.grid-cell[data-col="status"] .status-badge',
- );
- if (statusCell) {
- statusCell.classList.remove("status-i", "status-P");
- statusCell.classList.add("status-l");
- statusCell.textContent = "To LIMS";
- }
-
- // Gestisci la chiusura del modale di risposta
- responseModalElement.addEventListener(
- "hidden.bs.modal",
- () => {
- console.log(
- "exportResponseModal closed, cleaning up",
- );
- // Rimuovi tutti i backdrop residui
- document
- .querySelectorAll(".modal-backdrop")
- .forEach((backdrop) => {
- console.log(
- "Removing backdrop:",
- backdrop,
- );
- backdrop.remove();
- });
- // Ripristina il body
- document.body.classList.remove("modal-open");
- document.body.style.paddingRight = "";
- // Nascondi l'overlay
- const overlay = document.querySelector(
- ".overlay.toggle-icon",
- );
- if (overlay) {
- overlay.style.display = "none";
- }
- },
- { once: true },
- );
- } else {
- responseMessage.textContent = `Errore durante la generazione dei payload: ${data.message}`;
- document.getElementById(
- "exportResponseModalLabel",
- ).textContent = "Errore Esportazione";
- responseModal.show();
-
- // Gestisci la chiusura del modale di risposta anche in caso di errore
- responseModalElement.addEventListener(
- "hidden.bs.modal",
- () => {
- console.log(
- "exportResponseModal closed, cleaning up",
- );
- // Rimuovi tutti i backdrop residui
- document
- .querySelectorAll(".modal-backdrop")
- .forEach((backdrop) => {
- console.log(
- "Removing backdrop:",
- backdrop,
- );
- backdrop.remove();
- });
- // Ripristina il body
- document.body.classList.remove("modal-open");
- document.body.style.paddingRight = "";
- // Nascondi l'overlay
- const overlay = document.querySelector(
- ".overlay.toggle-icon",
- );
- if (overlay) {
- overlay.style.display = "none";
- }
- },
- { once: true },
- );
- }
- } catch (error) {
- console.error("Export error:", error);
- const responseModalElement = document.getElementById(
- "exportResponseModal",
- );
- if (!responseModalElement) {
- console.error(
- "exportResponseModal not found in the DOM",
- );
- alert("Errore: Modale di risposta non trovato");
- return;
- }
- const responseModal = new bootstrap.Modal(
- responseModalElement,
- {
- keyboard: false,
- },
- );
- document.getElementById(
- "exportResponseMessage",
- ).textContent =
- `Errore durante la generazione dei payload: ${error.message}`;
- document.getElementById(
- "exportResponseModalLabel",
- ).textContent = "Errore Esportazione";
- responseModal.show();
-
- // Gestisci la chiusura del modale di risposta in caso di errore
- responseModalElement.addEventListener(
- "hidden.bs.modal",
- () => {
- console.log(
- "exportResponseModal closed, cleaning up",
- );
- // Rimuovi tutti i backdrop residui
- document
- .querySelectorAll(".modal-backdrop")
- .forEach((backdrop) => {
- console.log("Removing backdrop:", backdrop);
- backdrop.remove();
- });
- // Ripristina il body
- document.body.classList.remove("modal-open");
- document.body.style.paddingRight = "";
- // Nascondi l'overlay
- const overlay = document.querySelector(
- ".overlay.toggle-icon",
- );
- if (overlay) {
- overlay.style.display = "none";
- }
- },
- { once: true },
- );
- }
-
- // Rimuovi il listener dopo l'esecuzione
- confirmBtn.removeEventListener("click", confirmHandler);
- };
-
- // Rimuovi eventuali listener precedenti
- confirmBtn.removeEventListener("click", confirmHandler);
- confirmBtn.addEventListener("click", confirmHandler);
- });
- });
-});
diff --git a/public/userarea/export_to_lims.php b/public/userarea/export_to_lims.php
deleted file mode 100644
index e7f8dfa..0000000
--- a/public/userarea/export_to_lims.php
+++ /dev/null
@@ -1,291 +0,0 @@
-getConnection();
-
-header("Content-Type: application/json");
-
-// 🔹 Configura directory log (creala se non esiste)
-$logDir = __DIR__ . '/logs/api/';
-if (!is_dir($logDir)) {
- mkdir($logDir, 0755, true);
-}
-
-// 🔹 Base URL API
-$apiBaseUrl = 'https://93.43.5.102/limsapi/api/odata/';
-
-// 🔹 Funzione per validare e convertire date
-function validateDate($value)
-{
- // Prova a validare come data (accetta formati comuni)
- $date = DateTime::createFromFormat('Y-m-d', $value) ?: DateTime::createFromFormat('Y-m-d H:i:s', $value);
- if ($date) {
- return $date->format('Y-m-d\TH:i:sP'); // Formato ISO 8601
- }
- return null; // Imposta null se non è una data valida
-}
-
-try {
- $iddatadb = $_POST['iddatadb'] ?? null;
- if (!$iddatadb) {
- throw new Exception("Missing iddatadb");
- }
-
- // 🔹 STEP 1+2: Fetch Cliente ID from datadb and Schema ID from excel_templates
- $stmt = $pdo->prepare("
- SELECT d.idclient AS clienteId, et.idschema AS schemaId
- FROM datadb as d
- INNER JOIN excel_templates as et ON d.templateid = et.id
- WHERE d.iddatadb = :iddatadb
- LIMIT 1
-");
- $stmt->execute(['iddatadb' => $iddatadb]);
- $result = $stmt->fetch(PDO::FETCH_ASSOC);
-
- if (!$result) {
- throw new Exception("No Cliente/Schema found for iddatadb {$iddatadb}");
- }
-
- $clienteId = (int) $result['clienteId'];
- $schemaId = (int) $result['schemaId'];
-
- // 🔹 STEP 3: Fetch Parts (including idmatrice)
- $stmt = $pdo->prepare("
- SELECT part_number, part_description, material, color, mix, idmatrice
- FROM identification_parts
- WHERE iddatadb = :iddatadb
- ");
- $stmt->execute(['iddatadb' => $iddatadb]);
- $parts = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
- // 🔹 STEP 4: Fetch Field Values with Labels
- $stmt = $pdo->prepare("
- SELECT
- idd.field_value,
- m.field_label,
- m.schema_id,
- m.field_id
- FROM
- import_data_details as idd
- JOIN template_mapping m ON idd.mapping_id = m.id
- WHERE idd.id = :iddatadb
- ");
- $stmt->execute(['iddatadb' => $iddatadb]);
- $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
- $fieldValues = [];
- $valueMap = [];
- foreach ($rows as $row) {
- $fieldValues[] = [
- "IdCommesseCustomFields" => (int) $row['field_id'],
- "Valore" => $row['field_value'],
- "FieldLabel" => $row['field_label']
- ];
- $valueMap[(int) $row['field_id']] = $row['field_value'];
- }
-
- // Logga i fieldValues in error_log
- $logFieldValues = "FieldValues dal DB (iddatadb={$iddatadb}):\n" . json_encode($fieldValues, JSON_PRETTY_PRINT);
- error_log($logFieldValues);
-
- // 🔹 Initialize API client
- $api = VisualLimsApiClient::getInstance();
-
- // 🔹 STEP 5: Create CommessaWeb (NOT WebOrder)
- $commessaWebPayload = [
- "Cliente" => $clienteId,
- "SchemaCustomField" => $schemaId,
- "Richiedente" => "Test Web Import",
- "Descrizione" => "TEST CommessaWeb",
- ];
-
- // Costruisci log curl-like per STEP 5
- $jsonPayload = json_encode($commessaWebPayload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
- $logContentStep5 = "curl --location --request POST '{$apiBaseUrl}CommessaWeb' \\\n" .
- "--header 'Content-Type: application/json' \\\n" .
- "--header 'Authorization: Bearer ••••••' \\\n" .
- "--data '{$jsonPayload}'";
-
- $commessaWeb = $api->post("CommessaWeb", $commessaWebPayload);
-
- $logContentStep5 .= "\n\nRESPONSE:\n" . json_encode($commessaWeb, JSON_PRETTY_PRINT);
-
- // Salva log
- $logFileStep5 = $logDir . "commessa_create_step5_" . $iddatadb . "_" . time() . ".txt";
- file_put_contents($logFileStep5, $logContentStep5);
-
- $commessaId = $commessaWeb["IdCommessa"];
- $commessaWebCode = substr($commessaWeb["CodiceCommessa"] ?? "TEST CommessaWeb", 0, 30); // Limite a 30 caratteri
-
- // 🔹 STEP 6: Create Campioni (Samples) for each part
- $campioni = [];
- $logContentStep6 = "";
-
- foreach ($parts as $index => $part) {
- $matriceId = (int) ($part["idmatrice"] ?? 0);
-
- if ($matriceId <= 0) {
- throw new Exception("Invalid or missing idmatrice for part: " . ($part["part_number"] ?? "Unknown"));
- }
-
- $campionePayload = [
- "Commessa" => $commessaId,
- "Matrice" => $matriceId,
- "SottoMatrice" => null,
- "SchemaCustomField" => $schemaId,
- "NoteWeb" => $part["part_description"] ?? ""
- ];
-
- // Costruisci curl-like per questo campione
- $jsonPayload = json_encode($campionePayload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
- $logContentStep6 .= "CAMPIONE #{$index}\n" .
- "curl --location --request POST '{$apiBaseUrl}Campione' \\\n" .
- "--header 'Content-Type: application/json' \\\n" .
- "--header 'Authorization: Bearer ••••••' \\\n" .
- "--data '{$jsonPayload}'\n\n";
-
- $campione = $api->post("Campione", $campionePayload);
-
- $logContentStep6 .= "RESPONSE:\n" . json_encode($campione, JSON_PRETTY_PRINT) . "\n\n---\n";
-
- $campione["PartNumber"] = $part["part_number"] ?? "";
- $campione["Material"] = $part["material"] ?? "";
- $campione["Color"] = $part["color"] ?? "";
- $campione["Mix"] = $part["mix"] ?? "";
-
- $campioni[] = $campione;
- }
-
- // Salva log per STEP 6
- $logFileStep6 = $logDir . "commessa_{$commessaId}_campioni_step6_" . time() . ".txt";
- file_put_contents($logFileStep6, $logContentStep6);
-
- // 🔹 STEP 7: Update Custom Fields for CommessaWeb
- if (!empty($fieldValues)) {
- // GET con espansione per CustomField
- $expand = "CommesseCustomFields(\$expand=CustomField)";
- $commessaWithFields = $api->get("CommessaWeb(" . $commessaId . ")?\$expand=" . $expand);
-
- // Logga il GET
- $logContentGet = "curl --location --request GET '{$apiBaseUrl}CommessaWeb({$commessaId})?\$expand=CommesseCustomFields(\$expand=CustomField)' \\\n" .
- "--header 'Authorization: Bearer ••••••'\n\n" .
- "RESPONSE:\n" . json_encode($commessaWithFields, JSON_PRETTY_PRINT);
- $logFileGet = $logDir . "commessa_{$commessaId}_get_step7_" . time() . ".txt";
- file_put_contents($logFileGet, $logContentGet);
-
- // Prepara payload PATCH
- $commessaCustomFields = [];
- foreach ($commessaWithFields["CommesseCustomFields"] as $customField) {
- $definitionId = (int) ($customField["CustomField"]["IdCustomField"] ?? 0);
- $fieldId = (int) $customField["IdCommesseCustomFields"];
- $currentValue = $customField["Valore"] ?? '';
- $fieldType = $customField["CustomField"]["Tipo"] ?? '';
- $newValue = isset($valueMap[$definitionId]) ? $valueMap[$definitionId] : $currentValue;
-
- // Valida se il campo è di tipo Data
- if ($fieldType === 'Data' && $newValue !== $currentValue) {
- $newValue = validateDate($newValue);
- }
-
- $commessaCustomFields[] = [
- "IdCommesseCustomFields" => $fieldId,
- "Valore" => $newValue
- ];
- }
-
- if (!empty($commessaCustomFields)) {
- $updatePayload = ["CommesseCustomFields" => $commessaCustomFields];
-
- // Logga payload e response
- $jsonPayload = json_encode($updatePayload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
- $logContentStep7 = "curl --location --request PATCH '{$apiBaseUrl}CommessaWeb({$commessaId})' \\\n" .
- "--header 'Content-Type: application/json' \\\n" .
- "--header 'Authorization: Bearer ••••••' \\\n" .
- "--data '{$jsonPayload}'";
-
- $patchResponse = $api->patch("CommessaWeb({$commessaId})", $updatePayload);
-
- $logContentStep7 .= "\n\nRESPONSE:\n" . json_encode($patchResponse, JSON_PRETTY_PRINT);
- $logFileStep7 = $logDir . "commessa_{$commessaId}_update_step7_" . time() . ".txt";
- file_put_contents($logFileStep7, $logContentStep7);
- }
- }
-
- // 🔹 STEP 8: Update datadb with idcommessaweb, commessaweb, and status
- $stmt = $pdo->prepare("
- UPDATE datadb
- SET idcommessaweb = :idcommessaweb, commessaweb = :commessaweb, status = 'l'
- WHERE iddatadb = :iddatadb
- ");
- $stmt->execute([
- 'idcommessaweb' => $commessaId,
- 'commessaweb' => $commessaWebCode,
- 'iddatadb' => $iddatadb
- ]);
-
- // 🔹 STEP 9: Send CommessaWeb to laboratory (commentato come richiesto)
- /*
- $sendResult = $api->post("CommessaWeb({$commessaId})/InviaCommessa", []);
-
- // Logga il POST
- $logContentStep9 = "curl --location --request POST '{$apiBaseUrl}CommessaWeb({$commessaId})/InviaCommessa' \\\n" .
- "--header 'Content-Type: application/json' \\\n" .
- "--header 'Authorization: Bearer ••••••' \\\n" .
- "--data '{}'\n\n" .
- "RESPONSE:\n" . json_encode($sendResult, JSON_PRETTY_PRINT);
- $logFileStep9 = $logDir . "commessa_{$commessaId}_send_step9_" . time() . ".txt";
- file_put_contents($logFileStep9, $logContentStep9);
- */
-
- // 🔹 STEP 10: GET di controllo post-PATCH
- $expand = "CommesseCustomFields(\$expand=CustomField)";
- $commessaAfterPatch = $api->get("CommessaWeb(" . $commessaId . ")?\$expand=" . $expand);
-
- // Logga il GET di controllo
- $logContentStep10 = "curl --location --request GET '{$apiBaseUrl}CommessaWeb({$commessaId})?\$expand=CommesseCustomFields(\$expand=CustomField)' \\\n" .
- "--header 'Authorization: Bearer ••••••'\n\n" .
- "RESPONSE:\n" . json_encode($commessaAfterPatch, JSON_PRETTY_PRINT);
- $logFileStep10 = $logDir . "commessa_{$commessaId}_get_step10_" . time() . ".txt";
- file_put_contents($logFileStep10, $logContentStep10);
-
- // 🔹 STEP 11: Prepare final response
- $finalCommessa = [
- "Cliente" => $clienteId,
- "SchemaCustomField" => $schemaId,
- "Richiedente" => $commessaWeb["Richiedente"] ?? "Web Import",
- "Descrizione" => $commessaWeb["Descrizione"] ?? "",
- "CommesseCustomFields" => $commessaAfterPatch["CommesseCustomFields"] ?? [],
- "Campioni" => $campioni,
- "Inviata" => 0 // Non inviato, come richiesto
- ];
-
- echo json_encode([
- "success" => true,
- "commessaWeb" => $finalCommessa,
- "commessaWebApiResponse" => $commessaWeb, // Incluso per debug
- "totalCampioni" => count($campioni),
- "totalCustomFields" => count($commessaAfterPatch["CommesseCustomFields"] ?? []),
- "message" => "Export successful",
- "logFiles" => [
- "step5_create" => $logFileStep5,
- "step6_campioni" => $logFileStep6,
- "step7_patch" => $logFileStep7,
- "step10_get" => $logFileStep10
- ]
- ]);
-} catch (Exception $e) {
- error_log("LIMS Export Error: " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString());
-
- echo json_encode([
- "success" => false,
- "message" => "Export failed: " . $e->getMessage(),
- "logFiles" => [
- "step5_create" => $logFileStep5 ?? null,
- "step6_campioni" => $logFileStep6 ?? null,
- "step7_patch" => $logFileStep7 ?? null,
- "step10_get" => $logFileStep10 ?? null
- ]
- ]);
-}
diff --git a/public/userarea/fetch_tracking_info.php b/public/userarea/fetch_tracking_info.php
deleted file mode 100644
index 1ed680c..0000000
--- a/public/userarea/fetch_tracking_info.php
+++ /dev/null
@@ -1,150 +0,0 @@
- false, 'message' => 'Numero di tracking o corriere non fornito']);
-}
-
-$trackingNumber = $_POST['tracking_number'];
-$courierCode = $_POST['courier_code'];
-
-// Lista dei corrieri validi per validazione
-$validCarriers = ['tnt-it', 'dhl', 'gls', 'sda', 'ups'];
-if (!in_array($courierCode, $validCarriers)) {
- sendResponse(['success' => false, 'message' => 'Corriere non valido']);
-}
-
-// Imposta il nome del corriere in base al codice
-$carrierNames = [
- 'tnt-it' => 'TNT Italy',
- 'dhl' => 'DHL',
- 'gls' => 'GLS',
- 'sda' => 'SDA',
- 'ups' => 'UPS'
-];
-$courierName = $carrierNames[$courierCode];
-
-// Funzione per fare una richiesta cURL a TrackingMore
-function makeRequest($url, $data, $apiKey, $method = 'POST')
-{
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, [
- 'Tracking-Api-Key: ' . $apiKey,
- 'Content-Type: application/json'
- ]);
- if ($method === 'POST') {
- curl_setopt($ch, CURLOPT_POST, true);
- $jsonData = json_encode($data, JSON_PRETTY_PRINT);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
- file_put_contents('debug.log', "Encoded JSON Data: $jsonData\n", FILE_APPEND);
- }
- curl_setopt($ch, CURLOPT_TIMEOUT, 10);
- $response = curl_exec($ch);
- $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $error = curl_error($ch);
- curl_close($ch);
-
- file_put_contents('debug.log', "Request URL: $url\nRequest Data: " . json_encode($data) . "\nResponse: $response\nHTTP Code: $httpCode\nError: $error\n", FILE_APPEND);
-
- if ($response === false) {
- return [
- 'success' => false,
- 'code' => $httpCode,
- 'message' => 'Errore nella richiesta API: ' . $error
- ];
- }
-
- $decodedResponse = json_decode($response, true);
- if ($decodedResponse === null) {
- return [
- 'success' => false,
- 'code' => $httpCode,
- 'message' => 'Risposta API non valida (non è JSON)'
- ];
- }
-
- $decodedResponse['success'] = isset($decodedResponse['meta']['code']) && ($decodedResponse['meta']['code'] === 200 || $decodedResponse['meta']['code'] === 201);
- $decodedResponse['http_code'] = $httpCode;
- return $decodedResponse;
-}
-
-// Step 1: Prova a creare il tracking
-$createUrl = 'https://api.trackingmore.com/v4/trackings/create';
-$createData = [
- 'tracking_number' => $trackingNumber,
- 'courier_code' => $courierCode
-];
-$createResponse = makeRequest($createUrl, $createData, $apiKey);
-file_put_contents('debug.log', "Create Response: " . json_encode($createResponse) . "\n", FILE_APPEND);
-
-$trackingInfo = null;
-if ($createResponse['success']) {
- // Creazione riuscita, usa i dati restituiti
- $trackingInfo = $createResponse['data'];
-} else {
- // Controlla se l'errore è "Tracking No. already exists" (4101)
- if (isset($createResponse['meta']['code']) && $createResponse['meta']['code'] === 4101) {
- // Il tracking esiste già, usa /trackings (GET) con tracking_number e courier_code
- $getUrl = 'https://api.trackingmore.com/v4/get?tracking_numbers=' . urlencode($trackingNumber);
- $getResponse = makeRequest($getUrl, [], $apiKey, 'GET');
- file_put_contents('debug.log', "Get Response: " . json_encode($getResponse) . "\n", FILE_APPEND);
-
- if ($getResponse['success'] && !empty($getResponse['data']['items']) && !empty($getResponse['data']['items'][0])) {
- $trackingInfo = $getResponse['data']['items'][0];
- } else {
- $errorMessage = isset($getResponse['meta']['message']) ? $getResponse['meta']['message'] : 'Errore sconosciuto';
- sendResponse(['success' => false, 'message' => 'Errore nel recupero del tracking esistente: ' . $errorMessage]);
- }
- } else {
- // Altro errore nella creazione
- $errorMessage = isset($createResponse['meta']['message']) ? $createResponse['meta']['message'] : 'Errore sconosciuto';
- sendResponse(['success' => false, 'message' => 'Errore nella creazione del tracking: ' . $errorMessage]);
- }
-}
-
-if (!$trackingInfo) {
- sendResponse(['success' => false, 'message' => 'Nessuna informazione di tracking trovata']);
-}
-
-// Estrai la data di consegna e il firmatario
-$deliveryDate = 'Non disponibile';
-$signedBy = 'Non disponibile';
-if (isset($trackingInfo['origin_info']['trackinfo']) && is_array($trackingInfo['origin_info']['trackinfo'])) {
- foreach ($trackingInfo['origin_info']['trackinfo'] as $checkpoint) {
- if (isset($checkpoint['checkpoint_delivery_status']) && $checkpoint['checkpoint_delivery_status'] === 'delivered') {
- $deliveryDate = $checkpoint['checkpoint_date'] ?? 'Non disponibile';
- $signedBy = $trackingInfo['signed_by'] ?? 'Non disponibile';
- break;
- }
- }
-}
-
-// Restituisci i dati al frontend
-sendResponse([
- 'success' => true,
- 'deliveryDate' => $deliveryDate,
- 'signedBy' => $signedBy,
- 'carrierName' => $courierName
-]);
diff --git a/public/userarea/fetch_tracking_info17track.php b/public/userarea/fetch_tracking_info17track.php
deleted file mode 100644
index 381ce14..0000000
--- a/public/userarea/fetch_tracking_info17track.php
+++ /dev/null
@@ -1,166 +0,0 @@
- false, 'message' => 'Numero di tracking non fornito']);
-}
-
-$trackingNumber = $_POST['tracking_number'];
-
-// Funzione per fare una richiesta cURL a 17Track
-function makeRequest($url, $data, $apiKey, $method = 'POST')
-{
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, [
- '17token: ' . $apiKey,
- 'Content-Type: application/json'
- ]);
- if ($method === 'POST') {
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
- }
- curl_setopt($ch, CURLOPT_TIMEOUT, 10);
- $response = curl_exec($ch);
- $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $error = curl_error($ch);
- curl_close($ch);
-
- file_put_contents('debug.log', "Request URL: $url\nRequest Data: " . json_encode($data) . "\nResponse: $response\nHTTP Code: $httpCode\nError: $error\n", FILE_APPEND);
-
- if ($response === false || $httpCode !== 200) {
- return [
- 'success' => false,
- 'code' => $httpCode,
- 'message' => 'Errore nella richiesta API: HTTP ' . $httpCode . ' - ' . $error
- ];
- }
-
- $decodedResponse = json_decode($response, true);
- if ($decodedResponse === null) {
- return [
- 'success' => false,
- 'code' => $httpCode,
- 'message' => 'Risposta API non valida (non è JSON)'
- ];
- }
-
- return $decodedResponse;
-}
-
-// Step 1: Prova con auto-detection
-$trackUrl = 'https://api.17track.net/track/v2/register';
-$trackData = [
- [
- 'number' => $trackingNumber,
- 'carrier' => null,
- 'auto_detection' => true
- ]
-];
-$registerResponse = makeRequest($trackUrl, $trackData, $apiKey);
-
-file_put_contents('debug.log', "Register Response (Auto-detect): " . json_encode($registerResponse) . "\n", FILE_APPEND);
-
-if (!isset($registerResponse['data']['accepted']) || empty($registerResponse['data']['accepted'])) {
- $errorMessage = $registerResponse['data']['rejected'][0]['error']['message'] ?? 'Errore sconosciuto';
- sendResponse(['success' => false, 'message' => 'Errore nella registrazione del tracking: ' . $errorMessage]);
-}
-
-// Step 2: Recupera i dettagli con riprova
-$getUrl = 'https://api.17track.net/track/v2/gettrackinfo';
-$getData = [['number' => $trackingNumber]];
-$maxAttempts = 3;
-$delaySeconds = 5;
-
-for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
- $trackResponse = makeRequest($getUrl, $getData, $apiKey);
- file_put_contents('debug.log', "Track Response (Attempt $attempt): " . json_encode($trackResponse) . "\n", FILE_APPEND);
-
- if (isset($trackResponse['data']['accepted']) && !empty($trackResponse['data']['accepted'])) {
- break;
- }
-
- if ($attempt < $maxAttempts) {
- sleep($delaySeconds);
- }
-}
-
-// Se auto-detection ha successo, procedi
-if (isset($trackResponse['data']['accepted']) && !empty($trackResponse['data']['accepted'])) {
- $trackingInfo = $trackResponse['data']['accepted'][0]['track'] ?? null;
- if (!$trackingInfo) {
- sendResponse(['success' => false, 'message' => 'Nessuna informazione di tracking trovata']);
- }
-
- $deliveryDate = 'Non disponibile';
- $signedBy = 'Non disponibile';
- $carrierName = $trackingInfo['carrier']['name'] ?? 'Sconosciuto';
-
- if (isset($trackingInfo['z0']['e']) && $trackingInfo['z0']['e'] == 40) {
- $deliveryDate = $trackingInfo['z0']['z'] ?? 'Non disponibile';
- $signedBy = $trackingInfo['z0']['d'] ?? 'Non disponibile';
- }
-
- sendResponse([
- 'success' => true,
- 'deliveryDate' => $deliveryDate,
- 'signedBy' => $signedBy,
- 'carrierName' => $carrierName
- ]);
-}
-
-// Step 3: Se auto-detection fallisce, prova una lista di corrieri comuni
-$commonCarriers = [
- ['code' => 100003, 'name' => 'TNT'], // TNT
- ['code' => 100001, 'name' => 'DHL'], // DHL Express
- ['code' => 100065, 'name' => 'DHL eCommerce'], // DHL eCommerce
- ['code' => 100002, 'name' => 'UPS'] // UPS
-];
-
-$possibleCarriers = [];
-foreach ($commonCarriers as $carrier) {
- $trackData = [
- [
- 'number' => $trackingNumber,
- 'carrier' => $carrier['code'],
- 'auto_detection' => false
- ]
- ];
- $registerResponse = makeRequest($trackUrl, $trackData, $apiKey);
-
- if (isset($registerResponse['data']['accepted']) && !empty($registerResponse['data']['accepted'])) {
- $possibleCarriers[] = $carrier['name'];
- }
- sleep(1); // Piccolo ritardo per evitare limiti di rate
-}
-
-if (!empty($possibleCarriers)) {
- sendResponse([
- 'success' => false,
- 'message' => 'Auto-detection fallita. Seleziona un corriere tra quelli possibili.',
- 'possibleCarriers' => $possibleCarriers
- ]);
-} else {
- sendResponse(['success' => false, 'message' => 'Nessun corriere identificato per questo numero di tracking']);
-}
diff --git a/public/userarea/fetch_tracking_infotracking.php b/public/userarea/fetch_tracking_infotracking.php
deleted file mode 100644
index 08ee258..0000000
--- a/public/userarea/fetch_tracking_infotracking.php
+++ /dev/null
@@ -1,166 +0,0 @@
- false, 'message' => 'Numero di tracking non fornito']);
-}
-
-$trackingNumber = $_POST['tracking_number'];
-
-// Funzione per fare una richiesta cURL a TrackingMore
-function makeRequest($url, $data, $apiKey, $method = 'POST')
-{
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, [
- 'Tracking-Api-Key: ' . $apiKey,
- 'Content-Type: application/json'
- ]);
- if ($method === 'POST') {
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
- }
- curl_setopt($ch, CURLOPT_TIMEOUT, 10);
- $response = curl_exec($ch);
- $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $error = curl_error($ch);
- curl_close($ch);
-
- file_put_contents('debug.log', "Request URL: $url\nRequest Data: " . json_encode($data) . "\nResponse: $response\nHTTP Code: $httpCode\nError: $error\n", FILE_APPEND);
-
- if ($response === false || ($httpCode !== 200 && $httpCode !== 201)) {
- return [
- 'success' => false,
- 'code' => $httpCode,
- 'message' => 'Errore nella richiesta API: HTTP ' . $httpCode . ' - ' . $error
- ];
- }
-
- $decodedResponse = json_decode($response, true);
- if ($decodedResponse === null) {
- return [
- 'success' => false,
- 'code' => $httpCode,
- 'message' => 'Risposta API non valida (non è JSON)'
- ];
- }
-
- $decodedResponse['success'] = isset($decodedResponse['meta']['code']) && ($decodedResponse['meta']['code'] === 200 || $decodedResponse['meta']['code'] === 201);
- return $decodedResponse;
-}
-
-// Step 1: Identifica il corriere
-$detectUrl = 'https://api.trackingmore.com/v4/couriers/detect';
-$detectData = ['tracking_number' => $trackingNumber];
-$detectResponse = makeRequest($detectUrl, $detectData, $apiKey);
-file_put_contents('debug.log', "Detect Response: " . json_encode($detectResponse) . "\n", FILE_APPEND);
-
-if (!$detectResponse['success']) {
- $errorMessage = isset($detectResponse['meta']['message']) ? $detectResponse['meta']['message'] : 'Errore sconosciuto';
- sendResponse(['success' => false, 'message' => 'Errore nella rilevazione del corriere: ' . $errorMessage]);
-}
-
-$couriers = $detectResponse['data'] ?? [];
-if (empty($couriers)) {
- sendResponse(['success' => false, 'message' => 'Corriere non identificato per il numero di tracking']);
-}
-
-// Prendi il primo corriere per ora
-$courierCode = $couriers[0]['courier_code'] ?? null;
-$courierName = $couriers[0]['courier_name'] ?? 'Sconosciuto';
-if (!$courierCode) {
- sendResponse(['success' => false, 'message' => 'Corriere non identificato']);
-}
-
-// Step 2: Crea un tracking
-$createUrl = 'https://api.trackingmore.com/v4/trackings/create';
-$createData = [
- 'tracking_number' => $trackingNumber,
- 'courier_code' => $courierCode
-];
-$createResponse = makeRequest($createUrl, $createData, $apiKey);
-file_put_contents('debug.log', "Create Response: " . json_encode($createResponse) . "\n", FILE_APPEND);
-
-if (!$createResponse['success']) {
- $errorMessage = isset($createResponse['meta']['message']) ? $createResponse['meta']['message'] : 'Errore sconosciuto';
- sendResponse(['success' => false, 'message' => 'Errore nella creazione del tracking: ' . $errorMessage]);
-}
-
-// Step 3: Recupera i dettagli del tracking con riprova
-$getUrl = 'https://api.trackingmore.com/v4/trackings/get?tracking_number=' . urlencode($trackingNumber);
-$maxAttempts = 3;
-$delaySeconds = 5;
-
-for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
- $trackResponse = makeRequest($getUrl, [], $apiKey, 'GET');
- file_put_contents('debug.log', "Track Response (Attempt $attempt): " . json_encode($trackResponse) . "\n", FILE_APPEND);
-
- if ($trackResponse['success'] && !empty($trackResponse['data'])) {
- break;
- }
-
- if ($attempt < $maxAttempts) {
- sleep($delaySeconds);
- }
-}
-
-if (!$trackResponse['success']) {
- $errorMessage = isset($trackResponse['meta']['message']) ? $trackResponse['meta']['message'] : 'Errore sconosciuto';
- sendResponse(['success' => false, 'message' => 'Errore nel recupero delle informazioni: ' . $errorMessage]);
-}
-
-$trackingInfo = $trackResponse['data'] ?? null;
-if (!$trackingInfo) {
- // Se ci sono più corrieri rilevati, restituisci una lista per la tendina
- if (count($couriers) > 1) {
- $possibleCarriers = array_map(function ($courier) {
- return ['code' => $courier['courier_code'], 'name' => $courier['courier_name']];
- }, $couriers);
- sendResponse([
- 'success' => false,
- 'message' => 'Dati non trovati. Seleziona un corriere tra quelli rilevati.',
- 'possibleCarriers' => $possibleCarriers
- ]);
- }
- sendResponse(['success' => false, 'message' => 'Nessuna informazione di tracking trovata']);
-}
-
-// Estrai la data di consegna e il firmatario
-$deliveryDate = 'Non disponibile';
-$signedBy = 'Non disponibile';
-foreach ($trackingInfo['trackinfo'] as $checkpoint) {
- if ($checkpoint['status'] === 'delivered') {
- $deliveryDate = $checkpoint['Date'];
- $signedBy = $checkpoint['signed_by'] ?? 'Non disponibile';
- break;
- }
-}
-
-// Restituisci i dati al frontend
-sendResponse([
- 'success' => true,
- 'deliveryDate' => $deliveryDate,
- 'signedBy' => $signedBy,
- 'carrierName' => $courierName
-]);
diff --git a/public/userarea/get_clienti.php b/public/userarea/get_clienti.php
deleted file mode 100644
index c07c32b..0000000
--- a/public/userarea/get_clienti.php
+++ /dev/null
@@ -1,74 +0,0 @@
- 'IdCliente,Nominativo,CodiceNazioneFatturazione',
- '$orderby' => 'Nominativo asc'
- ];
-
- // Costruisce query string con encoding corretto
- $queryString = http_build_query($params);
-
- // Componi endpoint finale
- $endpoint = "Cliente?$queryString";
-
- // Funzione per eseguire la chiamata con retry
- function makeApiRequest($api, $endpoint, $maxRetries = 3)
- {
- for ($retry = 0; $retry < $maxRetries; $retry++) {
- try {
- // Tenta la chiamata API
- $data = $api->get($endpoint);
- // Salva risposta per debug
- file_put_contents(__DIR__ . '/clienti_response.json', json_encode($data, JSON_PRETTY_PRINT));
- return $data;
- } catch (Exception $e) {
- $errorMessage = $e->getMessage();
- // Controlla se l'errore è legato all'autenticazione (HTTP 400 con messaggio specifico)
- if (strpos($errorMessage, 'HTTP 400') !== false && strpos($errorMessage, 'Cannot persist the object') !== false) {
- // Forza il refresh del token
- try {
- // Assumi che VisualLimsApiClient abbia un metodo per il refresh del token
- $api->refreshToken(); // Da implementare in VisualLimsApiClient se non esiste
- error_log("Tentativo $retry: Refresh token eseguito per endpoint $endpoint");
- } catch (Exception $refreshEx) {
- error_log("Errore durante il refresh del token: " . $refreshEx->getMessage());
- throw new Exception("Impossibile eseguire il refresh del token: " . $refreshEx->getMessage());
- }
- // Ritarda leggermente prima del retry
- usleep(500000); // 500ms
- continue;
- }
- // Altri errori non gestiti dal retry
- throw $e;
- }
- }
- throw new Exception("Massimo numero di tentativi raggiunto per $endpoint");
- }
-
- // Esegui la chiamata con retry
- $data = makeApiRequest($api, $endpoint);
-
- echo json_encode($data);
-} catch (Exception $e) {
- http_response_code(500);
- $errorResponse = [
- 'error' => $e->getMessage(),
- 'file' => $e->getFile(),
- 'line' => $e->getLine(),
- 'trace' => $e->getTraceAsString()
- ];
- error_log("Errore in get_clienti.php: " . json_encode($errorResponse));
- echo json_encode($errorResponse);
-}
diff --git a/public/userarea/get_commessaweb.php b/public/userarea/get_commessaweb.php
deleted file mode 100644
index 9422528..0000000
--- a/public/userarea/get_commessaweb.php
+++ /dev/null
@@ -1,39 +0,0 @@
- 'OrderCustomFields'];
-
- // Debug: salva URL usato
- $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__ . '/commessaweb_schema_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()]);
-}
diff --git a/public/userarea/get_customfield_values.php b/public/userarea/get_customfield_values.php
deleted file mode 100644
index 5770073..0000000
--- a/public/userarea/get_customfield_values.php
+++ /dev/null
@@ -1,41 +0,0 @@
- ერთი default
- if (empty($fieldIds)) {
- $fieldIds = [156];
- }
-
- $results = [];
-
- foreach ($fieldIds as $customFieldId) {
- $endpoint = "CustomField($customFieldId)?\$expand=CustomFieldsValues";
- $data = $api->get($endpoint);
-
- $results[$customFieldId] = $data['CustomFieldsValues'] ?? [];
- }
-
- // Debug ფაილი
- file_put_contents(__DIR__ . '/customfield_values_response.json', json_encode($results));
-
- echo json_encode($results);
-} catch (Exception $e) {
- http_response_code(500);
- echo json_encode([
- 'error' => $e->getMessage()
- ]);
-}
diff --git a/public/userarea/get_macro_matrici.php b/public/userarea/get_macro_matrici.php
deleted file mode 100644
index 33b181e..0000000
--- a/public/userarea/get_macro_matrici.php
+++ /dev/null
@@ -1,59 +0,0 @@
-load();
-} catch (Exception $e) {
- file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - Errore caricamento .env: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
- echo json_encode(['success' => false, 'message' => 'Errore caricamento configurazione: ' . $e->getMessage()]);
- exit(1);
-}
-
-// Recupera le variabili d'ambiente
-$dbHost = $_ENV['DB_HOST'];
-$dbName = $_ENV['DB_DATABASE'];
-$dbUser = $_ENV['DB_USERNAME'];
-$dbPass = $_ENV['DB_PASSWORD'];
-$dbPrefix = $_ENV['DB_PREFIX'];
-
-// Debug: Log database connection details (excluding password)
-file_put_contents(__DIR__ . '/debug_log.txt', date('Y-m-d H:i:s') . " - DB Connection: host=$dbHost, dbname=$dbName, user=$dbUser, prefix=$dbPrefix" . PHP_EOL, FILE_APPEND);
-
-// Connessione al database MySQL
-try {
- $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
- $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-} catch (PDOException $e) {
- file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - Errore connessione DB: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
- echo json_encode(['success' => false, 'message' => 'Errore connessione al database: ' . $e->getMessage()]);
- exit(1);
-}
-
-try {
- // Query per recuperare i valori distinti di MacroMatrice, escludendo quelli che iniziano con '*' e ordinandoli
- $query = "SELECT DISTINCT MacroMatrice FROM {$dbPrefix}matrici WHERE MacroMatrice IS NOT NULL AND MacroMatrice NOT LIKE '*%' ORDER BY MacroMatrice ASC";
- $stmt = $pdo->prepare($query);
- $stmt->execute();
- $macroMatrici = $stmt->fetchAll(PDO::FETCH_COLUMN);
-
- // Debug: Log del numero di MacroMatrice recuperate
- file_put_contents(__DIR__ . '/debug_log.txt', date('Y-m-d H:i:s') . ' - Retrieved ' . count($macroMatrici) . ' MacroMatrice from database' . PHP_EOL, FILE_APPEND);
-
- // Restituisci risposta JSON
- echo json_encode(['success' => true, 'value' => $macroMatrici]);
-} catch (PDOException $e) {
- // Log errore e restituisci risposta di errore
- file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - Errore nel recupero delle MacroMatrice: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
- echo json_encode(['success' => false, 'message' => 'Errore nel recupero delle MacroMatrice: ' . $e->getMessage()]);
- exit(1);
-}
diff --git a/public/userarea/get_matrice.php b/public/userarea/get_matrice.php
deleted file mode 100644
index ed1be73..0000000
--- a/public/userarea/get_matrice.php
+++ /dev/null
@@ -1,36 +0,0 @@
- 100]
-
- // Debug: salva URL usato
- $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__ . '/matrici_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()]);
-}
diff --git a/public/userarea/get_matrici_db.php b/public/userarea/get_matrici_db.php
deleted file mode 100644
index 1052aac..0000000
--- a/public/userarea/get_matrici_db.php
+++ /dev/null
@@ -1,59 +0,0 @@
-load();
-} catch (Exception $e) {
- file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - Errore caricamento .env: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
- echo json_encode(['success' => false, 'message' => 'Errore caricamento configurazione: ' . $e->getMessage()]);
- exit(1);
-}
-
-// Recupera le variabili d'ambiente
-$dbHost = $_ENV['DB_HOST'];
-$dbName = $_ENV['DB_DATABASE'];
-$dbUser = $_ENV['DB_USERNAME'];
-$dbPass = $_ENV['DB_PASSWORD'];
-$dbPrefix = $_ENV['DB_PREFIX'];
-
-// Debug: Log database connection details (excluding password)
-file_put_contents(__DIR__ . '/debug_log.txt', date('Y-m-d H:i:s') . " - DB Connection: host=$dbHost, dbname=$dbName, user=$dbUser, prefix=$dbPrefix" . PHP_EOL, FILE_APPEND);
-
-// Connessione al database MySQL
-try {
- $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
- $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-} catch (PDOException $e) {
- file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - Errore connessione DB: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
- echo json_encode(['success' => false, 'message' => 'Errore connessione al database: ' . $e->getMessage()]);
- exit(1);
-}
-
-try {
- // Query per recuperare le matrici, includendo MacroMatrice, escludendo quelle che iniziano con '*' e ordinandole
- $query = "SELECT IdMatrice, NomeMatrice, MacroMatrice FROM {$dbPrefix}matrici WHERE NomeMatrice NOT LIKE '*%' ORDER BY NomeMatrice ASC";
- $stmt = $pdo->prepare($query);
- $stmt->execute();
- $matrici = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
- // Debug: Log del numero di matrici recuperate
- file_put_contents(__DIR__ . '/debug_log.txt', date('Y-m-d H:i:s') . ' - Retrieved ' . count($matrici) . ' matrices from database' . PHP_EOL, FILE_APPEND);
-
- // Restituisci risposta JSON
- echo json_encode(['success' => true, 'value' => $matrici]);
-} catch (PDOException $e) {
- // Log errore e restituisci risposta di errore
- file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - Errore nel recupero delle matrici: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
- echo json_encode(['success' => false, 'message' => 'Errore nel recupero delle matrici: ' . $e->getMessage()]);
- exit(1);
-}
diff --git a/public/userarea/get_metadata.php b/public/userarea/get_metadata.php
deleted file mode 100644
index 96ef2f7..0000000
--- a/public/userarea/get_metadata.php
+++ /dev/null
@@ -1,37 +0,0 @@
-get($endpoint, $options);
-
- // Salva il file XML in locale
- file_put_contents(__DIR__ . '/metadata_response.xml', $data);
-
- // Restituisci il contenuto XML
- echo $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 '' . htmlspecialchars($e->getMessage()) . ' ';
-}
diff --git a/public/userarea/get_rapporto_prova.php b/public/userarea/get_rapporto_prova.php
deleted file mode 100644
index 16e8020..0000000
--- a/public/userarea/get_rapporto_prova.php
+++ /dev/null
@@ -1,26 +0,0 @@
-get($endpoint);
-
- file_put_contents(__DIR__ . '/rapporto_expanded.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
- 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()]);
-}
diff --git a/public/userarea/get_schema_details.php b/public/userarea/get_schema_details.php
deleted file mode 100644
index ff645b1..0000000
--- a/public/userarea/get_schema_details.php
+++ /dev/null
@@ -1,30 +0,0 @@
-get($endpoint);
-
- // Salva la risposta per debug
- file_put_contents(__DIR__ . '/schema_dettagli_response.json', json_encode($data));
-
- echo json_encode($data);
-} catch (Exception $e) {
- http_response_code(500);
- echo json_encode([
- 'error' => $e->getMessage()
- ]);
-}
diff --git a/public/userarea/get_schemi.php b/public/userarea/get_schemi.php
deleted file mode 100644
index b788aa7..0000000
--- a/public/userarea/get_schemi.php
+++ /dev/null
@@ -1,36 +0,0 @@
- 100]
-
- // Debug: salva URL usato
- $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__ . '/schemi_base_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()]);
-}
diff --git a/public/userarea/get_schemi_custom_fields.php b/public/userarea/get_schemi_custom_fields.php
deleted file mode 100644
index 3f2533e..0000000
--- a/public/userarea/get_schemi_custom_fields.php
+++ /dev/null
@@ -1,26 +0,0 @@
-```php
-get("SchemaCustomField"); // Recupera la lista degli schemi custom fields
-
- // Salva la risposta in un file per debug
- file_put_contents(__DIR__ . '/schemi_custom_fields_response.json', json_encode($data));
-
- echo json_encode($data);
-} catch (Exception $e) {
- http_response_code(500);
- echo json_encode([
- 'error' => $e->getMessage()
- ]);
-}
-?>
\ No newline at end of file
diff --git a/public/userarea/historical_trf.php b/public/userarea/historical_trf.php
deleted file mode 100644
index 9be255d..0000000
--- a/public/userarea/historical_trf.php
+++ /dev/null
@@ -1,1324 +0,0 @@
-getConnection();
-
-// Retrieve all mappings
-$stmt = $pdo->prepare("SELECT id, excel_column, data_type, is_required, manual_default, is_manual, field_label, field_id, main_field FROM template_mapping WHERE template_id = ?");
-$stmt->execute([$template_id]);
-$allMappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-if (empty($allMappings)) {
- header("Location: xlstemplates_grid.php?status=error&message=" . urlencode("Nessun mapping trovato per il template"));
- exit;
-}
-
-// Trova il main_field
-$mainFieldMapping = null;
-foreach ($allMappings as $mapping) {
- if ($mapping['main_field'] == 1) {
- $mainFieldMapping = $mapping;
- break;
- }
-}
-if (!$mainFieldMapping) {
- $mainFieldMapping = reset(array_filter($allMappings, fn($m) => !$m['is_manual']));
-}
-
-// Retrieve data from datadb
-if ($mode === 'edit' && !empty($selected_ids)) {
- $placeholders = implode(',', array_fill(0, count($selected_ids), '?'));
- $stmt = $pdo->prepare("
- SELECT d.*, CONCAT(u.first_name, ' ', u.last_name) AS user_name
- FROM datadb d
- LEFT JOIN auth_users u ON d.user_id = u.id
- WHERE d.templateid = ? AND d.status = ? AND d.iddatadb IN ($placeholders)
- ");
- $params = array_merge([$template_id, $status], $selected_ids);
- $stmt->execute($params);
- $importedData = $stmt->fetchAll(PDO::FETCH_ASSOC);
- $total_records = count($importedData);
- $total_pages = 1;
-} else {
- $stmt = $pdo->prepare("SELECT COUNT(*) FROM datadb WHERE templateid = ? AND status = ?");
- $stmt->execute([$template_id, $status]);
- $total_records = $stmt->fetchColumn();
- $total_pages = ceil($total_records / $limit);
-
- $stmt = $pdo->prepare("
- SELECT d.*, CONCAT(u.first_name, ' ', u.last_name) AS user_name
- FROM datadb d
- LEFT JOIN auth_users u ON d.user_id = u.id
- WHERE d.templateid = ? AND d.status = ?
- LIMIT ? OFFSET ?
- ");
- $stmt->execute([$template_id, $status, $limit, $offset]);
- $importedData = $stmt->fetchAll(PDO::FETCH_ASSOC);
-}
-
-error_log("Record caricati: " . count($importedData));
-
-$insertedIds = array_column($importedData, 'iddatadb');
-
-// Retrieve manual details
-$manualDetails = [];
-if (!empty($insertedIds)) {
- $placeholders = implode(',', array_fill(0, count($insertedIds), '?'));
- $stmt = $pdo->prepare("
- SELECT d.id AS detail_id, d.id AS datadb_id, d.mapping_id, d.field_value, m.field_label, m.data_type, m.is_required, m.manual_default
- FROM import_data_details d
- JOIN template_mapping m ON d.mapping_id = m.id
- WHERE d.id IN ($placeholders)
- ");
- $stmt->execute($insertedIds);
- $manualDetails = $stmt->fetchAll(PDO::FETCH_ASSOC);
-}
-
-// Retrieve global mapping for slugs
-$stmt = $pdo->query("SELECT mysql_column_name, user_friendly_slug FROM column_mapping");
-$slugMapping = [];
-foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
- $slugMapping[$row['mysql_column_name']] = $row['user_friendly_slug'];
-}
-?>
-
-
-
-
-
-
-
-
-
-
-
- Dati Storici - = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
- Nessun dato trovato per il template e lo status selezionato.
-
-
-
-
-
-
- Visualizzazione di = min($offset + 1, $total_records) ?>-= min($offset + count($importedData), $total_records) ?> di = $total_records ?> record
-
-
-
-
Nessun risultato trovato
-
-
-
-
-
-
-
- Prosegui con Modifica Massiva
-
-
-
-
-
- Visualizzazione di = min($offset + 1, $total_records) ?>-= min($offset + count($importedData), $total_records) ?> di = $total_records ?> record
-
-
-
-
-
-
-
-
-
-
-
-
Nessun risultato trovato
-
-
-
-
-
-
- ";
- if ($mainFieldMapping['data_type'] === 'SceltaMultipla') {
- $fieldValue = $mainFieldMapping['manual_default'] ?? '';
- echo "
";
- echo "Seleziona... ";
- echo " ";
- echo "
";
- } else {
- $fieldValue = $mainFieldMapping['manual_default'] ?? '';
- if ($mainFieldMapping['data_type'] === 'DATE' && $mainFieldMapping['manual_default'] === 'today') {
- $fieldValue = date('Y-m-d');
- }
- if ($mainFieldMapping['data_type'] === 'DATE') {
- echo "
";
- } elseif ($mainFieldMapping['data_type'] === 'INT') {
- echo "
";
- } else {
- echo "
";
- }
- echo "
";
- }
- echo "
";
- } else {
- echo "
";
- }
- // Status (subito dopo main_field)
- $fixedColumnsReduced = ['status'];
- foreach ($fixedColumnsReduced as $col) {
- echo "
";
- }
- // Campi automatici (escluso main_field)
- $autoIndex = ($mainFieldMapping && !$mainFieldMapping['is_manual']) ? 1 : 0;
- foreach ($allMappings as $mapping) {
- if (!$mapping['is_manual'] && $mapping['main_field'] != 1) {
- $inputClass = 'auto-input';
- if ($mapping['is_required']) $inputClass .= ' required-input';
- echo "
";
- if ($mapping['data_type'] === 'SceltaMultipla') {
- $fieldValue = $mapping['manual_default'] ?? '';
- echo "
";
- echo "Seleziona... ";
- echo " ";
- echo "
";
- } else {
- echo "
";
- }
- echo "
";
- $autoIndex++;
- }
- }
- // Campi manuali (escluso main_field)
- $manualIndex = ($mainFieldMapping && $mainFieldMapping['is_manual']) ? 1 : 0;
- foreach ($allMappings as $mapping) {
- if ($mapping['is_manual'] && $mapping['main_field'] != 1) {
- $fieldValue = $mapping['manual_default'] ?? '';
- if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today') {
- $fieldValue = date('Y-m-d');
- }
- $inputClass = 'manual-input';
- if ($mapping['is_required']) $inputClass .= ' required-input';
- echo "
";
- if ($mapping['data_type'] === 'SceltaMultipla') {
- echo "";
- echo "Seleziona... ";
- echo " ";
- echo " ";
- } elseif ($mapping['data_type'] === 'DATE') {
- echo " ";
- echo " ";
- } elseif ($mapping['data_type'] === 'INT') {
- echo " ";
- echo " ";
- } else {
- echo " ";
- echo " ";
- }
- echo "
";
- $manualIndex++;
- }
- }
- // Colonne Import Reference Code, filename_import
- echo "
"; // Import Reference Code
- echo "
"; // filename_import
- // AWB Number e Tracking Info
- echo "
";
- echo "
";
- ?>
-
-
-
- " . htmlspecialchars($mainFieldMapping['field_label']) . "
";
- $headerIndex++;
- }
- // Header per status (subito dopo main_field)
- foreach ($fixedColumnsReduced as $col) {
- $displayName = $slugMapping[$col] ?? $col;
- echo "";
- $headerIndex++;
- }
- // Header per campi automatici (escluso main_field)
- foreach ($allMappings as $mapping) {
- if (!$mapping['is_manual'] && $mapping['main_field'] != 1) {
- echo "";
- $headerIndex++;
- }
- }
- // Header per campi manuali (escluso main_field)
- foreach ($allMappings as $mapping) {
- if ($mapping['is_manual'] && $mapping['main_field'] != 1) {
- echo "";
- $headerIndex++;
- }
- }
- // Header per Import Reference Code, filename_import
- echo "";
- $headerIndex++;
- echo "";
- $headerIndex++;
- // Header per AWB Number e Tracking Info
- echo "";
- $headerIndex++;
- echo "";
- ?>
-
- $row): ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/import_dashboard.php b/public/userarea/import_dashboard.php
deleted file mode 100644
index a35f1cb..0000000
--- a/public/userarea/import_dashboard.php
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-
-
-
-
- Template Buttons - = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/import_edit.php b/public/userarea/import_edit.php
deleted file mode 100644
index 5c4560a..0000000
--- a/public/userarea/import_edit.php
+++ /dev/null
@@ -1,1039 +0,0 @@
-getConnection();
-
-// Genera un UUID univoco per importreferencecode
-$importReferenceCode = date('YmdHis') . '-' . uniqid();
-
-// Recupera il mapping per il template
-$stmt = $pdo->prepare("SELECT excel_column, mysql_column, data_type, is_required, default_value FROM excel_column_mappings WHERE template_id = ?");
-$stmt->execute([$template_id]);
-$mappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-if (empty($mappings)) {
- header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Nessun mapping trovato per il template"));
- exit;
-}
-
-// Recupera il client_specific_fields dal template
-$stmt = $pdo->prepare("SELECT client_specific_fields FROM excel_templates WHERE id = ?");
-$stmt->execute([$template_id]);
-$template = $stmt->fetch(PDO::FETCH_ASSOC);
-$clientSpecificFields = $template && !empty($template['client_specific_fields']) ? json_decode($template['client_specific_fields'], true) : [];
-
-// Crea un array per il mapping
-$columnMapping = [];
-foreach ($mappings as $mapping) {
- $excelColumnIndex = array_search($mapping['excel_column'], $columns);
- if ($excelColumnIndex !== false) {
- $columnMapping[$excelColumnIndex] = [
- 'mysql_column' => $mapping['mysql_column'],
- 'data_type' => $mapping['data_type'],
- 'is_required' => $mapping['is_required'],
- 'default_value' => $mapping['default_value']
- ];
- }
-}
-
-// Inserisci le righe selezionate in datadb
-$insertedIds = [];
-foreach ($selected_rows as $rowIndex) {
- $row = $rows[$rowIndex];
- $values = [];
- $placeholders = [];
- $columnsToInsert = [];
-
- foreach ($columnMapping as $excelIndex => $mapping) {
- $mysqlColumn = $mapping['mysql_column'];
- $value = $row[$excelIndex] ?? $mapping['default_value'];
-
- if ($mapping['is_required'] && (is_null($value) || $value === '')) {
- $value = $mapping['default_value'];
- if (is_null($value)) {
- header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Valore richiesto mancante per la colonna $mysqlColumn"));
- exit;
- }
- }
-
- switch ($mapping['data_type']) {
- case 'INT':
- $value = is_numeric($value) ? (int)$value : ($mapping['default_value'] ?? null);
- break;
- case 'DATE':
- $value = !empty($value) ? date('Y-m-d', strtotime($value)) : ($mapping['default_value'] ?? null);
- break;
- case 'CHAR':
- $value = !empty($value) ? substr($value, 0, 1) : ($mapping['default_value'] ?? null);
- break;
- case 'VARCHAR':
- default:
- $value = !empty($value) ? htmlspecialchars($value) : ($mapping['default_value'] ?? null);
- break;
- }
-
- if (!is_null($value)) {
- $columnsToInsert[] = $mysqlColumn;
- $placeholders[] = '?';
- $values[] = $value;
- }
- }
-
- $columnsToInsert[] = 'importreferencecode';
- $placeholders[] = '?';
- $values[] = $importReferenceCode;
-
- $columnsToInsert[] = 'filename_import';
- $placeholders[] = '?';
- $values[] = $newFilename;
-
- $columnsToInsert[] = 'status';
- $placeholders[] = '?';
- $values[] = 'i';
-
- $columnsToInsert[] = 'user_id';
- $placeholders[] = '?';
- $values[] = $user_id;
-
- $columnsToInsert[] = 'limscode';
- $placeholders[] = '?';
- $values[] = null;
-
- $columnsToInsert[] = 'importdate';
- $placeholders[] = '?';
- $values[] = date('Y-m-d');
-
- $sql = "INSERT INTO datadb (" . implode(', ', $columnsToInsert) . ") VALUES (" . implode(', ', $placeholders) . ")";
- $stmt = $pdo->prepare($sql);
- $stmt->execute($values);
-
- $insertedIds[] = $pdo->lastInsertId();
-}
-
-// Recupera i dati appena inseriti con i nomi degli utenti
-$stmt = $pdo->prepare("
- SELECT d.*, CONCAT(u.first_name, ' ', u.last_name) AS user_name
- FROM datadb d
- LEFT JOIN auth_users u ON d.user_id = u.id
- WHERE d.iddatadb IN (" . implode(',', array_fill(0, count($insertedIds), '?')) . ")
-");
-$stmt->execute($insertedIds);
-$importedData = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-// Recupera il mapping globale per mostrare gli slug leggibili
-$stmt = $pdo->query("SELECT mysql_column_name, user_friendly_slug FROM column_mapping");
-$slugMapping = [];
-foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
- $slugMapping[$row['mysql_column_name']] = $row['user_friendly_slug'];
-}
-?>
-
-
-
-
-
-
-
-
-
-
-
-
-
- Edit Imported Data - = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
";
- $headerIndex++;
- }
- }
- // Aggiungi gli input per i campi aggiuntivi sopra l'header
- foreach ($clientSpecificFields as $fieldName => $fieldDetails) {
- $fieldValue = $fieldDetails['default_value'];
- if ($fieldDetails['type'] === 'date' && $fieldDetails['default_value'] === 'today') {
- $fieldValue = date('Y-m-d');
- }
- $requiredAttr = $fieldDetails['is_required'] ? 'required' : '';
- echo "
";
- if ($fieldDetails['type'] === 'date') {
- echo " ";
- } elseif ($fieldDetails['type'] === 'boolean') {
- echo "";
- echo "Yes ";
- echo "No ";
- echo " ";
- } else {
- echo " ";
- }
- echo " ";
- echo "
";
- $headerIndex++;
- }
- // Spazi vuoti per AWB Number e Tracking Info
- echo "
";
- echo "
";
- ?>
-
-
-
- ";
- $headerIndex++;
- }
- }
- // Aggiungi gli header per i campi aggiuntivi
- foreach ($clientSpecificFields as $fieldName => $fieldDetails) {
- echo "";
- $headerIndex++;
- }
- ?>
-
-
-
-
-
- $row): ?>
-
-
-
-
-
-
-
-
-
-
- $value) {
- $visible = !in_array($col, ['iddatadb', 'importreferencecode', 'limscode', 'user_name']);
- if ($visible) {
- ?>
-
-
-
= htmlspecialchars($value ?? '') ?>
-
-
-
File
-
-
-
- = htmlspecialchars($value === 'i' ? 'Imported' : ($value === 'P' ? 'Progress' : 'LIMS')) ?>
-
-
-
-
= htmlspecialchars($row['user_name'] ?? 'Utente Sconosciuto') ?>
-
-
-
-
-
-
-
- $fieldDetails) {
- ?>
-
- ";
- } elseif ($fieldDetails['type'] === 'boolean') {
- echo "";
- echo "Yes ";
- echo "No ";
- echo " ";
- } else {
- echo " ";
- }
- ?>
-
-
-
-
-
- TNT Italy
- DHL
- GLS
- SDA
- UPS
-
-
-
-
-
- Shipment Info
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/import_edit2 - bck080725.php b/public/userarea/import_edit2 - bck080725.php
deleted file mode 100644
index 91310a8..0000000
--- a/public/userarea/import_edit2 - bck080725.php
+++ /dev/null
@@ -1,1072 +0,0 @@
-getConnection();
-
-// Genera un UUID univoco per importreferencecode
-$importReferenceCode = date('YmdHis') . '-' . uniqid();
-
-// Recupera tutti i mapping dal template (automatici e manuali)
-$stmt = $pdo->prepare("SELECT id, field_id, field_id AS excel_column, field_id AS mysql_column, data_type, is_required, manual_default, is_manual, field_label FROM template_mapping WHERE template_id = ?");
-$stmt->execute([$template_id]);
-$allMappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-if (empty($allMappings)) {
- header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Nessun mapping trovato per il template"));
- exit;
-}
-
-// Separa i mapping automatici (is_manual = 0) da quelli manuali (is_manual = 1)
-$autoMappings = array_filter($allMappings, fn($m) => !$m['is_manual']);
-$manualMappings = array_filter($allMappings, fn($m) => $m['is_manual']);
-
-// Inserisci le righe selezionate in datadb
-$insertedIds = [];
-foreach ($selected_rows as $rowIndex) {
- $row = $rows[$rowIndex];
- $values = [];
- $placeholders = [];
- $columnsToInsert = [];
-
- // Aggiungi i campi mappati dall'XLS (automatici)
- foreach ($autoMappings as $mapping) {
- $excelColumnIndex = array_search(trim($mapping['excel_column']), array_map('trim', $columns));
- if ($excelColumnIndex !== false) {
- $mysqlColumn = $mapping['mysql_column'];
- $value = $row[$excelColumnIndex] ?? $mapping['manual_default'];
-
- if ($mapping['is_required'] && (is_null($value) || $value === '')) {
- $value = $mapping['manual_default'];
- if (is_null($value)) {
- header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Valore richiesto mancante per la colonna $mysqlColumn"));
- exit;
- }
- }
-
- switch ($mapping['data_type']) {
- case 'INT':
- $value = is_numeric($value) ? (int)$value : ($mapping['manual_default'] ?? 0);
- break;
- case 'DATE':
- $value = !empty($value) ? date('Y-m-d', strtotime($value)) : ($mapping['manual_default'] ?? null);
- if ($mapping['manual_default'] === 'today' && is_null($value)) {
- $value = date('Y-m-d');
- }
- break;
- case 'CHAR':
- $value = !empty($value) ? substr($value, 0, 1) : ($mapping['manual_default'] ?? '');
- break;
- case 'Testo':
- case 'VARCHAR':
- default:
- $value = !empty($value) ? htmlspecialchars($value) : ($mapping['manual_default'] ?? '');
- break;
- }
-
- if (!is_null($value)) {
- $columnsToInsert[] = $mysqlColumn;
- $placeholders[] = '?';
- $values[] = $value;
- }
- }
- }
-
- // Aggiungi i campi generici
- $columnsToInsert[] = 'importreferencecode';
- $placeholders[] = '?';
- $values[] = $importReferenceCode;
-
- $columnsToInsert[] = 'filename_import';
- $placeholders[] = '?';
- $values[] = $newFilename;
-
- $columnsToInsert[] = 'status';
- $placeholders[] = '?';
- $values[] = 'i';
-
- $columnsToInsert[] = 'user_id';
- $placeholders[] = '?';
- $values[] = $user_id;
-
- $columnsToInsert[] = 'limscode';
- $placeholders[] = '?';
- $values[] = null;
-
- $columnsToInsert[] = 'importdate';
- $placeholders[] = '?';
- $values[] = date('Y-m-d');
-
- $sql = "INSERT INTO datadb (" . implode(', ', $columnsToInsert) . ") VALUES (" . implode(', ', $placeholders) . ")";
- $stmt = $pdo->prepare($sql);
- $stmt->execute($values);
-
- $iddatadb = $pdo->lastInsertId();
- $insertedIds[] = $iddatadb;
-
- // Inserisci tutti i campi (automatici e manuali) in import_data_details
- foreach ($allMappings as $mapping) {
- $fieldValue = '';
- if (!$mapping['is_manual']) { // Campi automatici dall'XLS
- $excelColumnIndex = array_search(trim($mapping['excel_column']), array_map('trim', $columns));
- if ($excelColumnIndex !== false) {
- $fieldValue = $row[$excelColumnIndex] ?? $mapping['manual_default'];
- } else {
- $fieldValue = $mapping['manual_default'] ?? '';
- }
- switch ($mapping['data_type']) {
- case 'INT':
- $fieldValue = is_numeric($fieldValue) ? (int)$fieldValue : ($mapping['manual_default'] ?? 0);
- break;
- case 'DATE':
- $fieldValue = !empty($fieldValue) ? date('Y-m-d', strtotime($fieldValue)) : ($mapping['manual_default'] ?? '');
- if ($mapping['manual_default'] === 'today' && empty($fieldValue)) {
- $fieldValue = date('Y-m-d');
- }
- break;
- case 'CHAR':
- $fieldValue = !empty($fieldValue) ? substr($fieldValue, 0, 1) : ($mapping['manual_default'] ?? '');
- break;
- case 'Testo':
- case 'VARCHAR':
- default:
- $fieldValue = !empty($fieldValue) ? htmlspecialchars($fieldValue) : ($mapping['manual_default'] ?? '');
- break;
- }
- } else { // Campi manuali
- $fieldValue = $mapping['manual_default'] ?? '';
- if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today') {
- $fieldValue = date('Y-m-d');
- } elseif (!empty($mapping['manual_default'])) {
- $fieldValue = $mapping['manual_default'];
- }
- }
- // Log dettagliato prima dell'inserimento
- error_log("Inserting - Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true) . ", Is Manual: " . $mapping['is_manual'] . ", Excel Column: " . ($mapping['excel_column'] ?? 'N/A') . ", Manual Default: " . ($mapping['manual_default'] ?? 'N/A'));
-
- $stmt = $pdo->prepare("INSERT INTO import_data_details (id, mapping_id, field_value) VALUES (?, ?, ?)");
- $stmt->execute([$iddatadb, $mapping['id'], $fieldValue]);
- // Log della query eseguita
- error_log("Executed Query for ID $iddatadb, Mapping ID: " . $mapping['id'] . ", Field Value: " . $fieldValue);
- }
-}
-
-// Recupera i dati appena inseriti con i nomi degli utenti
-$stmt = $pdo->prepare("
- SELECT d.*, CONCAT(u.first_name, ' ', u.last_name) AS user_name
- FROM datadb d
- LEFT JOIN auth_users u ON d.user_id = u.id
- WHERE d.iddatadb IN (" . implode(',', array_fill(0, count($insertedIds), '?')) . ")
-");
-$stmt->execute($insertedIds);
-$importedData = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-// Recupera i dettagli manuali da import_data_details
-$stmt = $pdo->prepare("
- SELECT d.id AS detail_id, d.id AS datadb_id, d.mapping_id, d.field_value, m.field_id, m.data_type, m.is_required, m.manual_default
- FROM import_data_details d
- JOIN template_mapping m ON d.mapping_id = m.id
- WHERE d.id IN (" . implode(',', array_fill(0, count($insertedIds), '?')) . ")
-");
-$stmt->execute($insertedIds);
-$manualDetails = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-// Recupera il mapping globale per mostrare gli slug leggibili
-$stmt = $pdo->query("SELECT mysql_column_name, user_friendly_slug FROM column_mapping");
-$slugMapping = [];
-foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
- $slugMapping[$row['mysql_column_name']] = $row['user_friendly_slug'];
-}
-?>
-
-
-
-
-
-
-
-
-
-
-
- Edit Imported Data - = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
";
- $headerIndex++;
- }
- }
- // Aggiungi spazi vuoti per i campi automatici (senza propagate-btn)
- foreach ($autoMappings as $autoMapping) {
- echo "
";
- $headerIndex++;
- }
- // Aggiungi gli input per i campi manuali con propagate-btn
- foreach ($manualMappings as $manualMapping) {
- $fieldValue = $manualMapping['manual_default'];
- if ($manualMapping['data_type'] === 'DATE' && $manualMapping['manual_default'] === 'today') {
- $fieldValue = date('Y-m-d');
- }
- $requiredAttr = $manualMapping['is_required'] ? 'required' : '';
- echo "
";
- if ($manualMapping['data_type'] === 'DATE') {
- echo " ";
- } elseif ($manualMapping['data_type'] === 'INT') {
- echo " ";
- } else {
- echo " ";
- }
- echo " ";
- echo "
";
- $headerIndex++;
- }
- // Spazi per AWB e Tracking Info
- echo "
";
- echo "
";
- ?>
-
-
-
- ";
- $headerIndex++;
- }
- }
- // Prima i campi automatici (excel_column non vuoto)
- foreach ($autoMappings as $mapping) {
- echo "";
- $headerIndex++;
- }
- // Poi i campi manuali
- foreach ($manualMappings as $mapping) {
- echo "";
- $headerIndex++;
- }
- ?>
-
-
-
-
-
- $row): ?>
-
-
-
-
-
-
-
-
-
-
- ";
- if ($col === 'importdate') {
- echo "
" . htmlspecialchars($value) . " ";
- echo "
";
- } elseif ($col === 'filename_import') {
- echo "
File ";
- echo "
";
- } elseif ($col === 'status') {
- echo "
" . htmlspecialchars($value === 'i' ? 'Imported' : ($value === 'P' ? 'Progress' : 'LIMS')) . " ";
- echo "
";
- } elseif ($col === 'user_id') {
- echo "
" . htmlspecialchars($row['user_name'] ?? 'Utente Sconosciuto') . " ";
- echo "
";
- } else {
- echo "
";
- }
- echo "
";
- $cellIndex++;
- }
- }
- // Aggiungi i campi automatici da import_data_details
- $rowDetails = array_filter($manualDetails, fn($d) => $d['datadb_id'] == $row['iddatadb']);
- foreach ($autoMappings as $mapping) {
- $detail = array_filter($rowDetails, fn($d) => $d['mapping_id'] == $mapping['id']);
- $detail = reset($detail) ?: ['field_value' => $mapping['manual_default']];
- $fieldValue = $detail['field_value'] ?? $mapping['manual_default'];
- $requiredAttr = $mapping['is_required'] ? 'required' : '';
- echo "
";
- if ($mapping['data_type'] === 'DATE') {
- echo " ";
- } elseif ($mapping['data_type'] === 'INT') {
- echo " ";
- } else {
- echo " ";
- }
- echo "
";
- $cellIndex++;
- }
- // Aggiungi i campi manuali da import_data_details
- foreach ($manualMappings as $mapping) {
- $detail = array_filter($rowDetails, fn($d) => $d['mapping_id'] == $mapping['id']);
- $detail = reset($detail) ?: ['field_value' => $mapping['manual_default']];
- $fieldValue = $detail['field_value'] ?? $mapping['manual_default'];
- if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today' && empty($fieldValue)) {
- $fieldValue = date('Y-m-d');
- }
- $requiredAttr = $mapping['is_required'] ? 'required' : '';
- echo "
";
- if ($mapping['data_type'] === 'DATE') {
- echo " ";
- } elseif ($mapping['data_type'] === 'INT') {
- echo " ";
- } else {
- echo " ";
- }
- echo "
";
- $cellIndex++;
- }
- ?>
-
-
-
- TNT Italy
- DHL
- GLS
- SDA
- UPS
-
-
-
-
-
- Shipment Info
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/import_edit2.php b/public/userarea/import_edit2.php
deleted file mode 100644
index a47bf51..0000000
--- a/public/userarea/import_edit2.php
+++ /dev/null
@@ -1,1602 +0,0 @@
-getConnection();
-
-// Genera un UUID univoco per importreferencecode
-$importReferenceCode = date('YmdHis') . '-' . uniqid();
-
-// Recupera tutti i mapping dal template, includendo is_visible_import
-$stmt = $pdo->prepare("SELECT id, excel_column, data_type, is_required, manual_default, is_manual, field_label, field_id, main_field, is_visible_import FROM template_mapping WHERE template_id = ?");
-$stmt->execute([$template_id]);
-$allMappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-if (empty($allMappings)) {
- header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Nessun mapping trovato per il template"));
- exit;
-}
-
-// Trova il campo main_field
-$mainFieldMapping = null;
-foreach ($allMappings as $mapping) {
- if ($mapping['main_field'] == 1 && $mapping['is_visible_import'] == 1) {
- $mainFieldMapping = $mapping;
- break;
- }
-}
-
-// Recupera l'idclient di default dal template (se presente)
-$template_stmt = $pdo->prepare("SELECT idclient FROM excel_templates WHERE id = ?");
-$template_stmt->execute([$template_id]);
-$template = $template_stmt->fetch(PDO::FETCH_ASSOC);
-$default_idclient = $template['idclient'] ?? null;
-
-$insertedIds = $_POST['inserted_ids'] ?? $_SESSION['inserted_ids'];
-
-// Recupera i dati appena inseriti con i nomi degli utenti
-$stmt = $pdo->prepare("
- SELECT d.*, CONCAT(u.first_name, ' ', u.last_name) AS user_name
- FROM datadb d
- LEFT JOIN auth_users u ON d.user_id = u.id
- WHERE d.iddatadb IN (" . implode(',', array_fill(0, count($insertedIds), '?')) . ")
-");
-$stmt->execute($insertedIds);
-$importedData = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-// Recupera i dettagli manuali da import_data_details
-$stmt = $pdo->prepare("
- SELECT d.id AS detail_id, d.id AS datadb_id, d.mapping_id, d.field_value, m.field_label, m.data_type, m.is_required, m.manual_default
- FROM import_data_details d
- JOIN template_mapping m ON d.mapping_id = m.id
- WHERE d.id IN (" . implode(',', array_fill(0, count($insertedIds), '?')) . ")
-");
-$stmt->execute($insertedIds);
-$manualDetails = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-// Recupera il mapping globale per mostrare gli slug leggibili
-$stmt = $pdo->query("SELECT mysql_column_name, user_friendly_slug FROM column_mapping");
-$slugMapping = [];
-foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
- $slugMapping[$row['mysql_column_name']] = $row['user_friendly_slug'];
-}
-?>
-
-
-
-
-
-
-
-
-
-
-
-
-
- Edit Imported Data - = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Save All
-
-
-
- ";
- echo "Seleziona... ";
- echo "";
- echo " ";
- } elseif ($mainFieldMapping['data_type'] === 'Data') {
- echo " ";
- echo " ";
- } elseif ($mainFieldMapping['data_type'] === 'INT') {
- echo " ";
- echo " ";
- } else {
- echo " ";
- echo " ";
- }
- ?>
-
-
-
-
- Select a client...
-
-
- Recupero clienti in corso...
-
-
- ";
- echo "
";
- echo "Seleziona... ";
- echo " ";
- echo "
";
- echo "
";
- } else {
- echo "
";
- }
- $autoIndex++;
- }
- }
- $manualIndex = 0;
- foreach ($allMappings as $mapping) {
- if ($mapping['is_manual'] && $mapping['main_field'] != 1 && $mapping['is_visible_import'] == 1) {
- $fieldValue = $mapping['manual_default'] ?? '';
- if ($mapping['data_type'] === 'Data' && $mapping['manual_default'] === 'today') {
- $fieldValue = date('Y-m-d');
- }
- $inputClass = 'manual-input';
- if ($mapping['is_required']) $inputClass .= ' required-input';
- echo "
";
- if ($mapping['data_type'] === 'SceltaMultipla') {
- echo "";
- echo "Seleziona... ";
- echo " ";
- } elseif ($mapping['data_type'] === 'Data') {
- echo " ";
- } elseif ($mapping['data_type'] === 'INT') {
- echo " ";
- } else {
- echo " ";
- }
- echo " ";
- echo "
";
- $manualIndex++;
- }
- }
- // Aggiunta per Tested Component (senza propagate)
- echo "
";
- echo "
";
- echo "
";
- echo "
";
- echo "
";
- echo "
";
- ?>
-
-
-
-
-
-
-
-
-
- " . htmlspecialchars($mapping['field_label']) . "
";
- $headerIndex++;
- }
- }
- foreach ($allMappings as $mapping) {
- if ($mapping['is_manual'] && $mapping['main_field'] != 1 && $mapping['is_visible_import'] == 1) {
- echo "";
- $headerIndex++;
- }
- }
- // Aggiunta header per Tested Component
- echo "";
- $headerIndex++;
- echo "";
- $headerIndex++;
- echo "";
- $headerIndex++;
- echo "";
- $headerIndex++;
- echo "";
- $headerIndex++;
- echo "";
- ?>
-
-
- $row): ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Confermi l'esportazione al LIMS per iddatadb ?
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/import_insert.php b/public/userarea/import_insert.php
deleted file mode 100644
index 7f7cc0b..0000000
--- a/public/userarea/import_insert.php
+++ /dev/null
@@ -1,173 +0,0 @@
-getConnection();
-
-// Genera un UUID univoco per importreferencecode
-$importReferenceCode = date('YmdHis') . '-' . uniqid();
-
-// Recupera tutti i mapping dal template
-$stmt = $pdo->prepare("SELECT id, excel_column, data_type, is_required, manual_default, is_manual, field_label, field_id, main_field FROM template_mapping WHERE template_id = ?");
-$stmt->execute([$template_id]);
-$allMappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-if (empty($allMappings)) {
- header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Nessun mapping trovato per il template"));
- exit;
-}
-
-// Trova il campo main_field
-$mainFieldMapping = null;
-foreach ($allMappings as $mapping) {
- if ($mapping['main_field'] == 1) {
- $mainFieldMapping = $mapping;
- break;
- }
-}
-
-// Inserisci le righe selezionate in datadb
-$insertedIds = [];
-foreach ($selected_rows as $rowIndex) {
- $row = $rows[$rowIndex] ?? null;
- $excelrow = $excelrows[$rowIndex] ?? null;
-
- if ($row === null || $excelrow === null) {
- error_log("Errore: riga o excelrow mancante per rowIndex $rowIndex");
- continue;
- }
-
- // Recupera l'idclient di default dal template
- $template_stmt = $pdo->prepare("SELECT idclient FROM excel_templates WHERE id = ?");
- $template_stmt->execute([$template_id]);
- $template = $template_stmt->fetch(PDO::FETCH_ASSOC);
- $default_idclient = $template['idclient'] ?? null;
-
- $values = [
- $template_id,
- $importReferenceCode,
- $newFilename,
- 'i',
- $user_id,
- null,
- date('Y-m-d'),
- $excelrow,
- $default_idclient // Aggiungi idclient
- ];
- $sql = "INSERT INTO datadb (templateid, importreferencecode, filename_import, status, user_id, limscode, importdate, excelrow, idclient) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
- $stmt = $pdo->prepare($sql);
- $stmt->execute($values);
-
- $iddatadb = $pdo->lastInsertId();
- $insertedIds[] = $iddatadb;
-
- // Inserisci tutti i campi in import_data_details
- foreach ($allMappings as $mapping) {
- $fieldValue = null;
- if (!$mapping['is_manual']) {
- $excelColumn = trim($mapping['excel_column']);
- $excelColumnIndex = array_search($excelColumn, array_map('trim', $columns));
- if ($excelColumnIndex !== false && isset($row[$excelColumnIndex]) && $row[$excelColumnIndex] !== '') {
- $fieldValue = $row[$excelColumnIndex];
- error_log("Found Excel column '$excelColumn' at index $excelColumnIndex, value: " . var_export($fieldValue, true));
- } else {
- $fieldValue = $mapping['manual_default'] ?? '';
- error_log("Excel column '$excelColumn' not found or empty, using default: " . var_export($fieldValue, true));
- }
- switch ($mapping['data_type']) {
- case 'INT':
- $fieldValue = is_numeric($fieldValue) ? (int)$fieldValue : ($mapping['manual_default'] ?? 0);
- break;
- case 'DATE':
- $fieldValue = !empty($fieldValue) ? date('Y-m-d', strtotime($fieldValue)) : ($mapping['manual_default'] === 'today' ? date('Y-m-d') : ($mapping['manual_default'] ?? ''));
- break;
- case 'CHAR':
- $fieldValue = !empty($fieldValue) ? substr((string)$fieldValue, 0, 1) : ($mapping['manual_default'] ?? '');
- break;
- case 'Testo':
- case 'VARCHAR':
- default:
- $fieldValue = !empty($fieldValue) ? htmlspecialchars((string)$fieldValue) : ($mapping['manual_default'] ?? '');
- break;
- }
- } else {
- $fieldValue = $mapping['manual_default'] ?? '';
- if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today') {
- $fieldValue = date('Y-m-d');
- }
- }
- if ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) {
- error_log("Required field missing for mapping ID: " . $mapping['id'] . ", field: " . $mapping['field_label']);
- }
- error_log("Inserting into import_data_details - Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true) . ", Is Manual: " . $mapping['is_manual'] . ", Excel Column: " . ($mapping['excel_column'] ?? 'N/A') . ", Manual Default: " . ($mapping['manual_default'] ?? 'N/A'));
- $stmt = $pdo->prepare("INSERT INTO import_data_details (id, mapping_id, field_value) VALUES (?, ?, ?)");
- $stmt->execute([$iddatadb, $mapping['id'], $fieldValue]);
- error_log("Inserted into import_data_details for ID $iddatadb, Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true));
- }
-}
-
-$_SESSION['inserted_ids'] = $insertedIds;
-
-$params = [
- 'template_id' => $template_id,
- 'filename' => $newFilename,
-];
-
-?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/import_xls.php b/public/userarea/import_xls.php
deleted file mode 100644
index 6011827..0000000
--- a/public/userarea/import_xls.php
+++ /dev/null
@@ -1,305 +0,0 @@
-getConnection();
-$stmt = $pdo->prepare("SELECT * FROM excel_templates WHERE id = ?");
-$stmt->execute([$id]);
-$template = $stmt->fetch(PDO::FETCH_ASSOC);
-
-if (!$template) {
- header("Location: template_dashboard.php?status=error&message=" . urlencode("Template not found"));
- exit;
-}
-
-// Debug del template
-error_log("Loaded template: " . print_r($template, true));
-?>
-
-
-
-
-
-
-
-
-
-
- = htmlspecialchars($template['name']) ?> - = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Upload XLS File
-
-
- Upload
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/import_xls2.php b/public/userarea/import_xls2.php
deleted file mode 100644
index e1e3b40..0000000
--- a/public/userarea/import_xls2.php
+++ /dev/null
@@ -1,413 +0,0 @@
-getConnection();
-$stmt = $pdo->prepare("SELECT * FROM excel_templates WHERE id = ?");
-$stmt->execute([$id]);
-$template = $stmt->fetch(PDO::FETCH_ASSOC);
-
-if (!$template) {
- header("Location: template_dashboard.php?status=error&message=" . urlencode("Template not found"));
- exit;
-}
-
-// Verifica i mapping
-$stmt = $pdo->prepare("SELECT id FROM template_mapping WHERE template_id = ?");
-$stmt->execute([$id]);
-$hasMappings = $stmt->fetch(PDO::FETCH_ASSOC);
-
-// Debug del template
-error_log("Loaded template: " . print_r($template, true));
-?>
-
-
-
-
-
-
-
-
-
-
-
- = htmlspecialchars($template['name']) ?> - = htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Nessun mapping trovato per questo template. Configura i mapping prima di procedere.
-
-
-
-
- Upload XLS File
-
-
- >Upload
-
-
-
-
-
-
-
-
-
-
-
-
-
Routine:
-
Descrizione:
-
Vuoi applicare questa routine al file caricato?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/userarea/imported_trf/1-20250308144333-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250308144333-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250308144333-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250308144500-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250308144500-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250308144500-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250310151936-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250310151936-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250310151936-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250310152759-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250310152759-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250310152759-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250310153202-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250310153202-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250310153202-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250310153759-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250310153759-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250310153759-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250310154159-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250310154159-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250310154159-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250310155024-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250310155024-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250310155024-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250310155252-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250310155252-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250310155252-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250312084239-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250312084239-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250312084239-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250312102018-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250312102018-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250312102018-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250312103756-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250312103756-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250312103756-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250312104614-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250312104614-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250312104614-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250312114708-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250312114708-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250312114708-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250312135908-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250312135908-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250312135908-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250312152433-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250312152433-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250312152433-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250325111922-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250325111922-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250325111922-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250325141003-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250325141003-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250325141003-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250326091743-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250326091743-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250326091743-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250327152621-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250327152621-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250327152621-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250403142725-Trial Client 1 TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI - Copia.xlsx b/public/userarea/imported_trf/1-20250403142725-Trial Client 1 TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI - Copia.xlsx
deleted file mode 100644
index 13738ee..0000000
Binary files a/public/userarea/imported_trf/1-20250403142725-Trial Client 1 TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI - Copia.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250403143010-Trial Client 1 TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI - Copia.xlsx b/public/userarea/imported_trf/1-20250403143010-Trial Client 1 TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI - Copia.xlsx
deleted file mode 100644
index 6cc4b87..0000000
Binary files a/public/userarea/imported_trf/1-20250403143010-Trial Client 1 TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI - Copia.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250403145017-Trial Client 1 TRF.xlsx b/public/userarea/imported_trf/1-20250403145017-Trial Client 1 TRF.xlsx
deleted file mode 100644
index 93a4244..0000000
Binary files a/public/userarea/imported_trf/1-20250403145017-Trial Client 1 TRF.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250508122102-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250508122102-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250508122102-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250508140041-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250508140041-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250508140041-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250508142256-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250508142256-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250508142256-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250509084710-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250509084710-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250509084710-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250509104938-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250509104938-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250509104938-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250509132735-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250509132735-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250509132735-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250528112950-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250528112950-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250528112950-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250529101051-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250529101051-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250529101051-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707114138-2524689.xlsx b/public/userarea/imported_trf/1-20250707114138-2524689.xlsx
deleted file mode 100644
index da02f1e..0000000
Binary files a/public/userarea/imported_trf/1-20250707114138-2524689.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707114518-2524689.xlsx b/public/userarea/imported_trf/1-20250707114518-2524689.xlsx
deleted file mode 100644
index da02f1e..0000000
Binary files a/public/userarea/imported_trf/1-20250707114518-2524689.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707114735-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707114735-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707114735-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707121416-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707121416-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707121416-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707121539-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707121539-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707121539-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707121609-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707121609-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707121609-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707121639-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707121639-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707121639-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707121841-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707121841-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707121841-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707122112-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707122112-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707122112-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707122156-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707122156-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707122156-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707140102-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707140102-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707140102-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707140215-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707140215-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707140215-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707140259-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707140259-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707140259-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707142049-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707142049-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707142049-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707142311-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707142311-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707142311-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707144214-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707144214-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707144214-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707144245-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707144245-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707144245-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707144304-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707144304-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707144304-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707144525-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707144525-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707144525-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707144848-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707144848-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707144848-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707144856-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707144856-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707144856-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707144945-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707144945-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707144945-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707145025-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707145025-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707145025-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707145047-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707145047-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707145047-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707145256-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707145256-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707145256-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707145538-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707145538-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707145538-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707145917-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707145917-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707145917-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707150006-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707150006-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707150006-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707150319-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707150319-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707150319-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707150420-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707150420-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707150420-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707163449-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707163449-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707163449-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707164312-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707164312-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707164312-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707165230-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707165230-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707165230-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250707165455-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250707165455-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250707165455-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250708090114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250708090114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250708090114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250708090227-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250708090227-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250708090227-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250708102945-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250708102945-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250708102945-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250708103114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250708103114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250708103114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250708110026-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250708110026-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250708110026-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250708111642-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250708111642-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250708111642-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250708140026-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250708140026-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250708140026-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709083632-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709083632-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250709083632-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709083709-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709083709-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250709083709-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709084114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709084114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250709084114-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709084337-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709084337-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250709084337-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709084752-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709084752-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250709084752-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709085004-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709085004-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/1-20250709085004-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709085112-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709085112-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250709085112-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709090711-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709090711-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250709090711-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709104109-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709104109-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250709104109-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709124209-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709124209-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250709124209-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709124236-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709124236-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250709124236-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709141659-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709141659-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250709141659-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250709145421-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250709145421-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250709145421-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250728151302-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250728151302-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250728151302-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250728155157-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250728155157-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250728155157-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250728172910-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250728172910-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250728172910-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250728183901-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250728183901-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250728183901-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250729085602-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/1-20250729085602-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index f76b422..0000000
Binary files a/public/userarea/imported_trf/1-20250729085602-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/1-20250926110510-24_09_25 CERTEST AMM FORM CROMO PH (PL TX) SUODORE COMPOSIZIONE.xls b/public/userarea/imported_trf/1-20250926110510-24_09_25 CERTEST AMM FORM CROMO PH (PL TX) SUODORE COMPOSIZIONE.xls
deleted file mode 100644
index 12c26ad..0000000
Binary files a/public/userarea/imported_trf/1-20250926110510-24_09_25 CERTEST AMM FORM CROMO PH (PL TX) SUODORE COMPOSIZIONE.xls and /dev/null differ
diff --git a/public/userarea/imported_trf/2-20250308134022-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/2-20250308134022-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/2-20250308134022-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/2-20250308134035-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/2-20250308134035-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/2-20250308134035-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/imported_trf/2-20250308134137-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx b/public/userarea/imported_trf/2-20250308134137-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx
deleted file mode 100644
index 8c3b7e0..0000000
Binary files a/public/userarea/imported_trf/2-20250308134137-MONCLER TRF - 21.11.2024_CHIARA_SS25_2C PER PELLI.xlsx and /dev/null differ
diff --git a/public/userarea/include/navbar.php b/public/userarea/include/navbar.php
index 5df1b53..2770d64 100644
--- a/public/userarea/include/navbar.php
+++ b/public/userarea/include/navbar.php
@@ -1,10 +1,10 @@