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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#annotationsModal .modal-body").prepend(errorMsg); - setTimeout(function () { - errorMsg.fadeOut(500, function () { - $(this).remove(); - }); - }, 5000); - } - } else { - const errorMsg = $( - '", - ); - $("#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 = $( - '", - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '", - ); - $("#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 = $( - '", - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#annotationsModal .modal-body").prepend(errorMsg); - setTimeout(function () { - errorMsg.fadeOut(500, function () { - $(this).remove(); - }); - }, 5000); - return; - } - - if (!fabricCanvas) { - const errorMsg = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '', - ); - $("#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 = $( - '", - ); - $( - "#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 = $( - '", - ); - $( - "#annotationsModal .modal-body", - ).prepend(errorMsg); - setTimeout(function () { - errorMsg.fadeOut( - 500, - function () { - $(this).remove(); - }, - ); - }, 5000); - } - }, - error: function (xhr, status, error) { - const errorMsg = $( - '", - ); - $( - "#annotationsModal .modal-body", - ).prepend(errorMsg); - setTimeout(function () { - errorMsg.fadeOut(500, function () { - $(this).remove(); - }); - }, 5000); - }, - }); - }, "image/png"); - }); - }; - } catch (e) { - const errorMsg = $( - '", - ); - $("#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

    - -
    - - -

    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'); ?> - - - -
    - - -
    -
    -
    -
    -
    Update XLS Template
    -
    -
    -

    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
    • -
    -
    -
    - -
    -
    -
    -
    -
    Edit Template:
    -
    -
    -
    -
    -
    -
    - - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - - -
    - -
    - - Cancel -
    -
    -
    -
    -
    -
    -
    - - -
    - - - - - \ 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'); ?> - - - -
    - - -
    -
    -
    -
    -
    -
    -
    Dati Storici
    -
    -
    - - -
    -
    -
    -
    - -
    - Nessun dato trovato per il template e lo status selezionato. -
    - - -
    -
    -
    - Visualizzazione di - di record -
    -
    - - -
    -
    - - - - - - - - - - - - - prepare("SELECT field_value FROM import_data_details WHERE id = ? AND mapping_id = ?"); - $stmt->execute([$row['iddatadb'], $mainFieldMapping['id']]); - $mainValue = $stmt->fetchColumn() ?? ''; - } - ?> - - - - - - - - - -
    FileAzioni
    File - -
    - -
    - -
    -
    - -
    -
    - Visualizzazione di - di record -
    -
    - - - -
    -
    - -
    - -
    -
    -
    -
    - "; - if ($mainFieldMapping['data_type'] === 'SceltaMultipla') { - $fieldValue = $mainFieldMapping['manual_default'] ?? ''; - 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 ""; - } 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 ""; - } 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 "
    "; - ?> -
    -
    -
    Azioni
    -
    - " . htmlspecialchars($mainFieldMapping['field_label']) . "
    "; - $headerIndex++; - } - // Header per status (subito dopo main_field) - foreach ($fixedColumnsReduced as $col) { - $displayName = $slugMapping[$col] ?? $col; - echo "
    $displayName
    "; - $headerIndex++; - } - // Header per campi automatici (escluso main_field) - foreach ($allMappings as $mapping) { - if (!$mapping['is_manual'] && $mapping['main_field'] != 1) { - echo "
    " . htmlspecialchars($mapping['field_label']) . "
    "; - $headerIndex++; - } - } - // Header per campi manuali (escluso main_field) - foreach ($allMappings as $mapping) { - if ($mapping['is_manual'] && $mapping['main_field'] != 1) { - echo "
    " . htmlspecialchars($mapping['field_label']) . "
    "; - $headerIndex++; - } - } - // Header per Import Reference Code, filename_import - echo "
    Import Reference Code
    "; - $headerIndex++; - echo "
    File
    "; - $headerIndex++; - // Header per AWB Number e Tracking Info - echo "
    AWB Number
    "; - $headerIndex++; - echo "
    Tracking Info
    "; - ?> -
    - $row): ?> -
    -
    -
    - - - - - - - -
    -
    - $d['datadb_id'] == $row['iddatadb']); - // Campo con main_field = 1 - if ($mainFieldMapping) { - $detail = array_filter($rowDetails, fn($d) => $d['mapping_id'] == $mainFieldMapping['id']); - $detail = reset($detail) ?: ['field_value' => $mainFieldMapping['manual_default']]; - $fieldValue = $detail['field_value'] ?? $mainFieldMapping['manual_default'] ?? ''; - $requiredClass = ($mainFieldMapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) ? 'missing-required' : ''; - $inputClass = $mainFieldMapping['is_manual'] ? 'manual-input' : 'auto-input'; - if ($mainFieldMapping['is_required']) $inputClass .= ' required-input'; - $indexField = $mainFieldMapping['is_manual'] ? "manual_0" : "auto_0"; - echo "
    "; - if ($mainFieldMapping['data_type'] === 'SceltaMultipla') { - echo ""; - } elseif ($mainFieldMapping['data_type'] === 'DATE') { - echo ""; - } elseif ($mainFieldMapping['data_type'] === 'INT') { - echo ""; - } else { - echo ""; - } - echo "
    "; - $cellIndex++; - } - // Status (subito dopo main_field) - $fixedColumnsReduced = ['status']; - foreach ($fixedColumnsReduced as $col) { - $value = $row[$col] ?? ''; - echo "
    "; - if ($col === 'status') { - $badgeClass = $value === 'i' ? 'status-i' : ($value === 'P' ? 'status-P' : 'status-l'); - $badgeText = $value === 'i' ? 'Imported' : ($value === 'P' ? 'Progress' : 'LIMS'); - // Aggiungi il numero di commessaweb se lo status è 'l' - if ($value === 'l') { - $commessaWeb = isset($row['commessaweb']) ? htmlspecialchars($row['commessaweb']) : ''; - $badgeText .= " ($commessaWeb)"; - } - echo "" . htmlspecialchars($badgeText) . ""; - echo ""; - } - echo "
    "; - $cellIndex++; - } - // Campi automatici (escluso main_field) - $autoIndex = ($mainFieldMapping && !$mainFieldMapping['is_manual']) ? 1 : 0; - foreach ($allMappings as $mapping) { - if (!$mapping['is_manual'] && $mapping['main_field'] != 1) { - $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'] ?? ''; - $requiredClass = ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) ? 'missing-required' : ''; - $inputClass = 'auto-input'; - if ($mapping['is_required']) $inputClass .= ' required-input'; - echo "
    "; - if ($mapping['data_type'] === 'SceltaMultipla') { - echo ""; - } elseif ($mapping['data_type'] === 'DATE') { - echo ""; - } elseif ($mapping['data_type'] === 'INT') { - echo ""; - } else { - echo ""; - } - echo "
    "; - $cellIndex++; - $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) { - $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'); - } - $requiredClass = ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) ? 'missing-required' : ''; - $inputClass = 'manual-input'; - if ($mapping['is_required']) $inputClass .= ' required-input'; - echo "
    "; - if ($mapping['data_type'] === 'SceltaMultipla') { - echo ""; - } elseif ($mapping['data_type'] === 'DATE') { - echo ""; - } elseif ($mapping['data_type'] === 'INT') { - echo ""; - } else { - echo ""; - } - echo "
    "; - $cellIndex++; - $manualIndex++; - } - } - // Colonne Import Reference Code e filename_import - echo "
    "; - echo "" . htmlspecialchars($row['importreferencecode']) . ""; - echo ""; - echo "
    "; - $cellIndex++; - echo "
    "; - echo "File"; - echo ""; - echo "
    "; - $cellIndex++; - // Colonne AWB Number e Tracking Info - ?> -
    - - > - -
    -
    - Shipment Info - -
    -
    - -
    - - - - - - -
    -
    -
    -
    - - - - - - - - - - - - - \ 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'); ?> - - - - - -
    - - - -
    -
    - - -
    -
    -
    Active Templates
    -
    -
    - - -
    -
    -
    - -
    -
    -
    - - -
    - - - - - - - - \ 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'); ?> - - - -
    - - -
    -
    - - -
    -
    -
    -
    -
    Modifica Dati Importati
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    "; - $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 ""; - } else { - echo ""; - } - echo ""; - echo "
    "; - $headerIndex++; - } - // Spazi vuoti per AWB Number e Tracking Info - echo "
    "; - echo "
    "; - ?> -
    - - -
    -
    Save
    -
    Photos
    -
    Parts
    - $displayName
    "; - $headerIndex++; - } - } - // Aggiungi gli header per i campi aggiuntivi - foreach ($clientSpecificFields as $fieldName => $fieldDetails) { - echo "
    $fieldName
    "; - $headerIndex++; - } - ?> -
    AWB Number
    -
    -
    Tracking Info
    -
    -
    - - - $row): ?> -
    -
    - -
    -
    - -
    -
    - -
    - $value) { - $visible = !in_array($col, ['iddatadb', 'importreferencecode', 'limscode', 'user_name']); - if ($visible) { - ?> -
    - - - - - File - - - - - - - - - - - - -
    - - - $fieldDetails) { - ?> -
    - "; - } elseif ($fieldDetails['type'] === 'boolean') { - echo ""; - } else { - echo ""; - } - ?> -
    - - -
    - - - -
    -
    - 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'); ?> - - - -
    - - -
    -
    - -
    -
    -
    -
    -
    Modifica Dati Importati
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    "; - $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 "
    "; - ?> -
    - - -
    -
    Save
    -
    Photos
    -
    Parts
    - $displayName
    "; - $headerIndex++; - } - } - // Prima i campi automatici (excel_column non vuoto) - foreach ($autoMappings as $mapping) { - echo "
    " . htmlspecialchars($mapping['field_label']) . "
    "; - $headerIndex++; - } - // Poi i campi manuali - foreach ($manualMappings as $mapping) { - echo "
    " . htmlspecialchars($mapping['field_label']) . "
    "; - $headerIndex++; - } - ?> -
    AWB Number
    -
    -
    Tracking Info
    -
    -
    - - - $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++; - } - ?> - -
    - - - -
    -
    - 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'); ?> - - - -
    - - -
    -
    - -
    -
    -
    -
    -
    Modifica Dati Importati
    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    - -
    - "; - echo ""; - echo ""; - echo ""; - } elseif ($mainFieldMapping['data_type'] === 'Data') { - echo ""; - echo ""; - } elseif ($mainFieldMapping['data_type'] === 'INT') { - echo ""; - echo ""; - } else { - echo ""; - echo ""; - } - ?> -
    - -
    - - - -
    -
    - "; - 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 ""; - } 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 "
    "; - ?> -
    - -
    -
    Actions
    - -
    - -
    -
    - -
    Client
    -
    -
    Status
    -
    - " . htmlspecialchars($mapping['field_label']) . "
    "; - $headerIndex++; - } - } - foreach ($allMappings as $mapping) { - if ($mapping['is_manual'] && $mapping['main_field'] != 1 && $mapping['is_visible_import'] == 1) { - echo "
    " . htmlspecialchars($mapping['field_label']) . "
    "; - $headerIndex++; - } - } - // Aggiunta header per Tested Component - echo "
    Tested Component
    "; - $headerIndex++; - echo "
    AWB Number
    "; - $headerIndex++; - echo "
    Tracking Info
    "; - $headerIndex++; - echo "
    Import Reference Code
    "; - $headerIndex++; - echo "
    " . ($slugMapping['filename_import'] ?? 'filename_import') . "
    "; - $headerIndex++; - echo "
    " . ($slugMapping['importdate'] ?? 'importdate') . "
    "; - ?> -
    - - $row): ?> -
    -
    - - hasRole('Admin'))) : ?> - - - - - - -
    - - $d['mapping_id'] == $mainFieldMapping['id'] && $d['datadb_id'] == $row['iddatadb']); - $detail = reset($detail) ?: ['field_value' => $mainFieldMapping['manual_default']]; - $fieldValue = $detail['field_value'] ?? $mainFieldMapping['manual_default'] ?? ''; - if ($mainFieldMapping['data_type'] === 'Data' && $mainFieldMapping['manual_default'] === 'today' && empty($fieldValue)) { - $fieldValue = date('Y-m-d'); - } - $requiredClass = ($mainFieldMapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) ? 'missing-required' : ''; - $inputClass = $mainFieldMapping['is_manual'] ? 'manual-input' : 'auto-input'; - if ($mainFieldMapping['is_required']) $inputClass .= ' required-input'; - ?> -
    - - - - > - - > - - > - -
    - -
    - -
    -
    - - - - -
    - $d['datadb_id'] == $row['iddatadb']); - $autoIndex = 0; - foreach ($allMappings as $mapping) { - if (!$mapping['is_manual'] && $mapping['main_field'] != 1 && $mapping['is_visible_import'] == 1) { - $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'] ?? ''; - $requiredClass = ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) ? 'missing-required' : ''; - $inputClass = 'auto-input'; - if ($mapping['is_required']) $inputClass .= ' required-input'; - echo "
    "; - if ($mapping['data_type'] === 'SceltaMultipla') { - echo ""; - } elseif ($mapping['data_type'] === 'Data') { - echo ""; - } elseif ($mapping['data_type'] === 'INT') { - echo ""; - } else { - echo ""; - } - echo "
    "; - $cellIndex++; - $autoIndex++; - } - } - $manualIndex = 0; - foreach ($allMappings as $mapping) { - if ($mapping['is_manual'] && $mapping['main_field'] != 1 && $mapping['is_visible_import'] == 1) { - $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'] === 'Data' && $mapping['manual_default'] === 'today' && empty($fieldValue)) { - $fieldValue = date('Y-m-d'); - } - $requiredClass = ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) ? 'missing-required' : ''; - $inputClass = 'manual-input'; - if ($mapping['is_required']) $inputClass .= ' required-input'; - echo "
    "; - if ($mapping['data_type'] === 'SceltaMultipla') { - echo ""; - } elseif ($mapping['data_type'] === 'Data') { - echo ""; - } elseif ($mapping['data_type'] === 'INT') { - echo ""; - } else { - echo ""; - } - echo "
    "; - $cellIndex++; - $manualIndex++; - } - } - // Aggiunta cella per Tested Component - echo "
    "; - echo ""; - echo ""; - echo "
    "; - $cellIndex++; - ?> -
    - - - -
    -
    - Shipment Info - -
    -
    - - -
    - -
    - File - -
    - -
    - - -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - \ 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'); ?> - - - -
    - - -
    -
    - - -
    -
    -
    -
    -
    - Template ID: , Start Row: , Start Column: -
    -
    -
    -
    - -
    -
    - - -
    - -
    -
    - - - - - -
    -
    -
    -
    -
    - -
    - - -
    - - - - - - - - - - - - - - \ 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'); ?> - - - -
    - - -
    -
    - - -
    -
    -
    -
    -
    - Template ID: , Start Row: , Start Column: -
    -
    -
    -
    - - - -
    -
    - - -
    - -
    -
    - - - -
    - - -
    -
    -
    -
    -
    - - -
    - - - - - - - - \ 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 @@