diff --git a/.gitignore b/.gitignore index 38634bf..9513359 100644 --- a/.gitignore +++ b/.gitignore @@ -40,10 +40,13 @@ yarn-error.log /public/userarea/logaspi/ /public/userarea/logs/api/ /public/userarea/logs/api/** +/public/userarea/logs/ +/public/userarea/logs/** /public/userarea/photostrf/ /public/userarea/class/*.log /public/userarea/class/curl_auth_debug.log /public/userarea/class/curl_request_debug.log +/public/userarea/schema_dettagli_response.json # File XLSX temporanei importati /public/userarea/imported_trf/*.xlsx diff --git a/public/userarea/class/VisualLimsApiClient.class.php b/public/userarea/class/VisualLimsApiClient.class.php index 61bd945..369d585 100644 --- a/public/userarea/class/VisualLimsApiClient.class.php +++ b/public/userarea/class/VisualLimsApiClient.class.php @@ -255,4 +255,39 @@ class VisualLimsApiClient { return $this->baseUrl; } + + /** + * Recupera contenuto binario - Adattato per https://bvcpsitaly-elims.com/limsapi + */ + public function getRaw($endpoint) + { + $token = $this->getToken(); + + // IMPORTANTE: usa /odata/ e NON /api/odata/ + $url = "{$this->baseUrl}/odata/{$endpoint}"; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Authorization: Bearer {$token}", + "Accept: */*" + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curl_error = curl_error($ch); + curl_close($ch); + + if ($response === false) { + throw new Exception("Errore cURL: " . $curl_error); + } + + if ($http_code !== 200) { + throw new Exception("HTTP {$http_code} su endpoint: " . $url); + } + + return $response; + } } diff --git a/public/userarea/download_rapporto_file.php b/public/userarea/download_rapporto_file.php new file mode 100644 index 0000000..14ea0ae --- /dev/null +++ b/public/userarea/download_rapporto_file.php @@ -0,0 +1,112 @@ +get("RapportoFile({$id})", []); + + file_put_contents( + $debugDir . "rapporto_file_{$id}.json", + json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) + ); + + /** + * Provo vari nomi campo possibili per il contenuto PDF. + * Dopo il primo test potremo adattarlo al nome esatto. + */ + $possibleContentFields = [ + 'File', + 'file', + 'Content', + 'content', + 'FileContent', + 'fileContent', + 'Contenuto', + 'contenuto', + 'Bytes', + 'bytes' + ]; + + $base64 = null; + + foreach ($possibleContentFields as $field) { + if (!empty($data[$field])) { + $base64 = $data[$field]; + break; + } + } + + if (!$base64) { + header('Content-Type: application/json; charset=utf-8'); + echo json_encode([ + 'success' => false, + 'message' => 'Record RapportoFile recuperato, ma non ho trovato un campo base64 del PDF.', + 'hint' => 'Apri logs/lims_get_commessa/rapporto_file_' . $id . '.json e controlla il nome reale del campo file.', + 'data' => $data + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + exit; + } + + /** + * Se il contenuto ha prefisso data URI, lo pulisco. + */ + if (strpos($base64, 'base64,') !== false) { + $parts = explode('base64,', $base64); + $base64 = end($parts); + } + + $pdfBinary = base64_decode($base64, true); + + if ($pdfBinary === false) { + throw new Exception("Il contenuto trovato non è un base64 valido"); + } + + $filename = $data['NomeFile'] + ?? $data['nomeFile'] + ?? $data['FileName'] + ?? $data['fileName'] + ?? "rapporto_{$id}.pdf"; + + if (!str_ends_with(strtolower($filename), '.pdf')) { + $filename .= '.pdf'; + } + + header('Content-Type: application/pdf'); + header('Content-Disposition: inline; filename="' . basename($filename) . '"'); + header('Content-Length: ' . strlen($pdfBinary)); + + echo $pdfBinary; +} catch (Exception $e) { + http_response_code(500); + header('Content-Type: application/json; charset=utf-8'); + + echo json_encode([ + 'success' => false, + 'error' => $e->getMessage() + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); +} diff --git a/public/userarea/edit_template_xls.php b/public/userarea/edit_template_xls.php index ef817d2..7915132 100644 --- a/public/userarea/edit_template_xls.php +++ b/public/userarea/edit_template_xls.php @@ -25,6 +25,41 @@ if (!$template) { $stmt = $pdo->prepare("SELECT * FROM routine"); $stmt->execute(); $routines = $stmt->fetchAll(PDO::FETCH_ASSOC); + +$buttonBgPalette = [ + '#0d6efd' => 'Blue', + '#6610f2' => 'Indigo', + '#6f42c1' => 'Purple', + '#d63384' => 'Pink', + '#dc3545' => 'Red', + '#fd7e14' => 'Orange', + '#ffc107' => 'Yellow', + '#198754' => 'Green', + '#20c997' => 'Teal', + '#0dcaf0' => 'Cyan', + '#212529' => 'Dark', + '#6c757d' => 'Gray', + '#495057' => 'Slate', + '#795548' => 'Brown', + '#2f5d50' => 'Sage Green', +]; + +$buttonTextPalette = [ + '#ffffff' => 'White', + '#6c757d' => 'Gray', + '#000000' => 'Black', +]; + +$currentButtonBgColor = strtolower($template['button_bg_color'] ?? '#007bff'); +$currentButtonTextColor = strtolower($template['button_text_color'] ?? '#ffffff'); + +if (!array_key_exists($currentButtonBgColor, array_change_key_case($buttonBgPalette, CASE_LOWER))) { + $currentButtonBgColor = '#0d6efd'; +} + +if (!array_key_exists($currentButtonTextColor, array_change_key_case($buttonTextPalette, CASE_LOWER))) { + $currentButtonTextColor = '#ffffff'; +} ?> @@ -35,6 +70,64 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC); + Edit Template <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?> @@ -123,12 +216,46 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC);
- + +
+ $colorLabel): ?> + + + + +
- + +
+ $colorLabel): ?> + + + + +
@@ -258,6 +385,16 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC); sourceType.addEventListener('change', updateSourceFields); updateSourceFields(); + function formatClientLabel(client) { + const nome = client.Nominativo || "Name not available"; + const id = client.IdCliente || ""; + const codiceCliente = (client.CodiceCliente ?? client.codiceCliente ?? "").toString().trim(); + const suffix = (codiceCliente.split("_")[1] || "").trim(); + const shortCode = suffix || (codiceCliente ? codiceCliente.charAt(0) : "--"); + + return `${nome.trim()} - ${shortCode} (ID: ${id})`; + } + async function loadClients() { try { clientLoadingStatus.style.display = 'inline'; @@ -280,9 +417,8 @@ $routines = $stmt->fetchAll(PDO::FETCH_ASSOC); select.innerHTML = ''; data.value.forEach(client => { - const nome = client.Nominativo || "Name not available"; const id = client.IdCliente || ""; - const option = new Option(`${nome.trim()} (ID: ${id})`, id); + const option = new Option(formatClientLabel(client), id); if (parseInt(id) === parseInt(selectedClientId)) { option.selected = true; diff --git a/public/userarea/error_log.txt b/public/userarea/error_log.txt index 4c5140a..9d43509 100644 --- a/public/userarea/error_log.txt +++ b/public/userarea/error_log.txt @@ -328,3 +328,6 @@ 2026-03-26 10:57:41 [MoltiplicatorePrezzo] Autenticazione fallita: HTTP 500, Errore cURL: , Risposta: {"title":"Internal Server Error","status":500,"detail":"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.","instance":"POST /api/authentication/authenticate","errorCode":"63ab532c6"} 2026-03-26 10:57:56 [AnagraficaCertestObject] Autenticazione fallita: HTTP 500, Errore cURL: , Risposta: {"title":"Internal Server Error","status":500,"detail":"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.","instance":"POST /api/authentication/authenticate","errorCode":"63ab532c6"} 2026-03-26 10:58:11 [AnagraficaCertestService] Autenticazione fallita: HTTP 500, Errore cURL: , Risposta: {"title":"Internal Server Error","status":500,"detail":"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.","instance":"POST /api/authentication/authenticate","errorCode":"63ab532c6"} +2026-04-30 15:01:25 - Errore nel recupero dati: HTTP 404, Risposta: {"title":"Not Found","status":404,"detail":"Not Found","instance":"GET /api/odata/Rapporto(2621521)","errorCode":"d25cbd678"} +2026-04-30 15:02:04 - Errore nel recupero dati: HTTP 404, Risposta: +2026-04-30 15:03:19 - Errore nella richiesta: URL rejected: Malformed input to a URL function diff --git a/public/userarea/get_rapporto_full_by_codice.php b/public/userarea/get_rapporto_full_by_codice.php new file mode 100644 index 0000000..9d311e0 --- /dev/null +++ b/public/userarea/get_rapporto_full_by_codice.php @@ -0,0 +1,256 @@ + "CodiceRapporto eq '{$codiceRapportoSafe}'", + '$select' => 'IdRapporto,CodiceRapporto,Data,Versione,Firmato,DataStampa', + '$top' => 1 + ]; + + $searchEndpoint = "Rapporto?" . http_build_query($searchParams); + $searchData = $api->get($searchEndpoint); + + $rapporti = $searchData['value'] ?? []; + + if (empty($rapporti)) { + echo json_encode([ + 'success' => false, + 'message' => 'Nessun rapporto trovato per questo CodiceRapporto.', + 'codice_rapporto' => $codiceRapporto + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + exit; + } + + $rapportoBase = $rapporti[0]; + $idRapporto = intval($rapportoBase['IdRapporto'] ?? 0); + + if (!$idRapporto) { + throw new Exception("IdRapporto non trovato nella risposta."); + } + + /** + * STEP 2 - Dettaglio Rapporto + */ + $clienteExpandError = null; + $detailEndpoint = "Rapporto({$idRapporto})?\$expand=Cliente,RapportiFiles,CampioniDatiRapporto"; + + try { + $detailData = $api->get($detailEndpoint); + } catch (Exception $e) { + $clienteExpandError = $e->getMessage(); + $detailEndpoint = "Rapporto({$idRapporto})?\$expand=RapportiFiles,CampioniDatiRapporto"; + $detailData = $api->get($detailEndpoint); + } + + file_put_contents( + $debugDir . "rapporto_{$codiceRapportoSafe}_light.json", + json_encode($detailData, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) + ); + + $cliente = $detailData['Cliente'] ?? null; + $rapportiFiles = $detailData['RapportiFiles'] ?? []; + $campioniDatiRapporto = $detailData['CampioniDatiRapporto'] ?? []; + + // ====================== CLIENTE ====================== + $clienteInfo = [ + 'found' => is_array($cliente), + 'id_cliente' => $cliente['IdCliente'] ?? $cliente['Id'] ?? null, + 'codice_cliente' => $cliente['CodiceCliente'] ?? $cliente['Codice'] ?? null, + 'nome_cliente' => $cliente['Nominativo'] ?? $cliente['RagioneSociale'] ?? $cliente['Nome'] ?? $cliente['Descrizione'] ?? null, + 'partita_iva' => $cliente['PartitaIva'] ?? null, + 'codice_fiscale' => $cliente['CodiceFiscale'] ?? null + ]; + + // ====================== FILE PDF ====================== + $selectedRapportoFile = null; + $idRapportoFile = null; + $pdfFileName = $codiceRapporto . '.pdf'; + $pdfFullPath = $pdfDir . $pdfFileName; + + if (is_array($rapportiFiles) && count($rapportiFiles) > 0) { + foreach ($rapportiFiles as $file) { + $fileName = $file['FileName'] ?? ''; + $tipoRapporto = $file['TipoRapporto'] ?? ''; + $categoria = $file['Categoria'] ?? ''; + + if ( + stripos($fileName, '.pdf') !== false || + stripos($tipoRapporto, 'Rapporto') !== false || + stripos($categoria, 'Rapporti') !== false + ) { + $selectedRapportoFile = $file; + $idRapportoFile = $file['IdRapportoFile'] ?? null; + break; + } + } + + if (!$selectedRapportoFile && count($rapportiFiles) > 0) { + $selectedRapportoFile = $rapportiFiles[0]; + $idRapportoFile = $rapportiFiles[0]['IdRapportoFile'] ?? null; + } + } + + // ====================== DOWNLOAD PDF - DEBUG AVANZATO ====================== + $pdfDownloaded = false; + $pdfError = null; + $endpointUsato = null; + + if ($downloadPdf && $idRapportoFile) { + + $tentativi = [ + "RapportoFile({$idRapportoFile})/\$value", + "RapportoFile({$idRapportoFile})/Contenuto/\$value", + "RapportoFile({$idRapportoFile})/File/\$value", + "Rapporto({$idRapporto})/RapportiFiles({$idRapportoFile})/\$value", + "Rapporto({$idRapporto})/RapportoFile/\$value", + "GetRapportoFile?IdRapportoFile={$idRapportoFile}", + "RapportoFile/Download?Id={$idRapportoFile}", + "Rapporto/DownloadFile?IdRapporto={$idRapporto}" + ]; + + foreach ($tentativi as $ep) { + try { + $pdfContent = $api->getRaw($ep); + + if (strlen($pdfContent) > 2000) { // PDF decente deve essere più grande + file_put_contents($pdfFullPath, $pdfContent); + $pdfDownloaded = true; + $endpointUsato = $ep; + $pdfError = "SUCCESSO con: " . $ep; + break; + } else { + $pdfError = "Contenuto troppo piccolo con: " . $ep; + } + } catch (Exception $e) { + $pdfError = "Fallito con " . $ep . " → " . $e->getMessage(); + } + } + } + + // ====================== CAMPIONI + RATING (ripristinato dal tuo originale) ====================== + $campioniSintesi = []; + $ratingFinale = null; + $ratingSource = null; + $hasIrregolare = false; + $hasPositiveResults = false; + + if (is_array($campioniDatiRapporto)) { + foreach ($campioniDatiRapporto as $campione) { + $giudizioRapporto = $campione['GiudizioRapporto'] ?? null; + $giudizioCertificato = $campione['GiudizioCertificato'] ?? null; + $esitoGiudizioLMR = $campione['EsitoGiudizioLMR'] ?? null; + $esitoGiudizioImpiego = $campione['EsitoGiudizioImpiego'] ?? null; + $risultatiIrregolari = ($campione['RisultatiIrregolari'] ?? false) === true; + $risultatiPositivi = ($campione['RisultatiPositivi'] ?? false) === true; + + $campioniSintesi[] = [ + 'id_campione_dati_rapporto' => $campione['IdCampioneDatiRapporto'] ?? null, + 'codice_campione' => $campione['CodiceCampione'] ?? null, + 'stato_campione' => $campione['StatoCampione'] ?? null, + 'stato_campione_web' => $campione['StatoCampioneWeb'] ?? null, + 'matrice' => $campione['Matrice'] ?? null, + 'macro_matrice' => $campione['MacroMatrice'] ?? null, + 'giudizio_rapporto' => $giudizioRapporto, + 'giudizio_certificato' => $giudizioCertificato, + 'esito_giudizio_lmr' => $esitoGiudizioLMR, + 'esito_giudizio_impiego' => $esitoGiudizioImpiego, + 'risultati_positivi' => $risultatiPositivi, + 'risultati_irregolari' => $risultatiIrregolari + ]; + + if (!$ratingFinale && !empty($giudizioRapporto)) { + $ratingFinale = $giudizioRapporto; + $ratingSource = 'CampioniDatiRapporto.GiudizioRapporto'; + } + + if (!$ratingFinale && !empty($giudizioCertificato)) { + $ratingFinale = $giudizioCertificato; + $ratingSource = 'CampioniDatiRapporto.GiudizioCertificato'; + } + + if ($risultatiIrregolari) $hasIrregolare = true; + if ($risultatiPositivi) $hasPositiveResults = true; + } + } + + // Fallback rating + if (!$ratingFinale) { + if ($hasIrregolare) { + $ratingFinale = 'Irregolare'; + $ratingSource = 'RisultatiIrregolari'; + } elseif ($hasPositiveResults || count($campioniSintesi) > 0) { + $ratingFinale = 'Regolare'; + $ratingSource = 'fallback'; + } + } + + // ====================== RISPOSTA FINALE ====================== + echo json_encode([ + 'success' => true, + + 'codice_rapporto' => $codiceRapporto, + 'id_rapporto' => $idRapporto, + + 'search_endpoint' => $searchEndpoint, + 'detail_endpoint' => $detailEndpoint, + 'cliente_expand_error' => $clienteExpandError, + + 'rapporto_base' => $rapportoBase, + 'cliente' => $clienteInfo, + + 'rating_finale' => $ratingFinale, + 'rating_source' => $ratingSource, + + 'rapporti_files_count' => count($rapportiFiles), + 'selected_rapporto_file' => $selectedRapportoFile, + + 'pdf_file_name' => $pdfFileName, + 'pdf_path' => $pdfDownloaded ? $pdfFullPath : null, + 'pdf_downloaded' => $pdfDownloaded, + 'pdf_error' => $pdfError, + + 'campioni_count' => count($campioniSintesi), + 'campioni_sintesi' => $campioniSintesi, + + 'download_requested' => $downloadPdf + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); +} catch (Exception $e) { + http_response_code(500); + echo json_encode([ + 'success' => false, + 'error' => $e->getMessage() + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); +} diff --git a/public/userarea/get_rapporto_lims.php b/public/userarea/get_rapporto_lims.php new file mode 100644 index 0000000..a3eff2e --- /dev/null +++ b/public/userarea/get_rapporto_lims.php @@ -0,0 +1,118 @@ + "CodiceCommessa eq '{$commessa}'", + 'Commessa_CodiceCommessa' => "Commessa/CodiceCommessa eq '{$commessa}'", + 'Commessa_IdCommessa' => is_numeric($commessa) ? "Commessa/IdCommessa eq {$commessa}" : null, + 'Codice' => "Codice eq '{$commessa}'" + ]; + + foreach ($filters as $label => $filter) { + if (!$filter) { + continue; + } + + try { + $options = [ + '$filter' => $filter, + '$top' => 10 + ]; + + $data = $api->get('Rapporto', $options); + + $attempts[$label] = [ + 'success' => true, + 'filter' => $filter, + 'records' => isset($data['value']) && is_array($data['value']) ? count($data['value']) : null, + 'data' => $data + ]; + + file_put_contents( + $debugDir . "rapporto_{$commessa}_{$label}.json", + json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) + ); + } catch (Exception $e) { + $attempts[$label] = [ + 'success' => false, + 'filter' => $filter, + 'error' => $e->getMessage() + ]; + } + } + + /** + * STEP 2 + * Prendo solo eventuali rapporti trovati. + */ + $rapportiFound = []; + + foreach ($attempts as $label => $attempt) { + if (!$attempt['success']) { + continue; + } + + $items = $attempt['data']['value'] ?? []; + + if (!is_array($items)) { + continue; + } + + foreach ($items as $item) { + $rapportiFound[] = [ + 'matched_by' => $label, + 'rapporto' => $item + ]; + } + } + + echo json_encode([ + 'success' => true, + 'input_commessa' => $commessa, + 'message' => 'Ricerca leggera su Rapporto completata. Se trovi un rapporto, poi recuperiamo RapportiFiles solo per quello.', + 'rapporti_found_count' => count($rapportiFound), + 'rapporti_found' => $rapportiFound, + 'attempts_summary' => array_map(function ($a) { + return [ + 'success' => $a['success'], + 'filter' => $a['filter'], + 'records' => $a['records'] ?? null, + 'error' => $a['error'] ?? null + ]; + }, $attempts) + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); +} catch (Exception $e) { + http_response_code(500); + + echo json_encode([ + 'success' => false, + 'error' => $e->getMessage() + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); +} diff --git a/public/userarea/get_rapporto_prova.php b/public/userarea/get_rapporto_prova.php index 16e8020..0ae0cd9 100644 --- a/public/userarea/get_rapporto_prova.php +++ b/public/userarea/get_rapporto_prova.php @@ -2,25 +2,140 @@ require_once dirname(__DIR__, 2) . '/vendor/autoload.php'; require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php'; -header('Content-Type: application/json'); +header('Content-Type: application/json; charset=utf-8'); ini_set('display_errors', '0'); error_reporting(E_ALL); try { $api = VisualLimsApiClient::getInstance(); - $rapporto_id = 533329; - // Costruzione manuale dell'endpoint con espansione annidata - $endpoint = "Rapporto($rapporto_id)?\$expand=CampioniDatiRapporto(\$expand=AnalisiDatiRapporto,CustomFieldsDatiRapporto)"; + // Esempi: + // rapporto_by_codice_expand_step.php?codice=2541111&step=base + // rapporto_by_codice_expand_step.php?codice=2541111&step=files + // rapporto_by_codice_expand_step.php?codice=2541111&step=campioni + // rapporto_by_codice_expand_step.php?codice=2541111&step=files_campioni - // Non passiamo options, già incluso nell'endpoint - $data = $api->get($endpoint); + $codiceRapporto = trim($_GET['codice'] ?? ''); + $step = trim($_GET['step'] ?? 'base'); - file_put_contents(__DIR__ . '/rapporto_expanded.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); - echo json_encode($data); + if ($codiceRapporto === '') { + throw new Exception("Parametro codice mancante. Usa ?codice=2541111"); + } + + $allowedSteps = [ + 'base' => '', + 'files' => 'RapportiFiles', + 'allegati' => 'RapportiAllegati', + 'campioni' => 'CampioniDatiRapporto', + 'files_campioni' => 'RapportiFiles,CampioniDatiRapporto' + ]; + + if (!array_key_exists($step, $allowedSteps)) { + throw new Exception("Step non valido. Usa: " . implode(', ', array_keys($allowedSteps))); + } + + // Escape OData per eventuali apostrofi + $codiceRapportoSafe = str_replace("'", "''", $codiceRapporto); + + /* + * STEP 1 - Trova IdRapporto partendo da CodiceRapporto. + * Query leggera, con $select e $top=1. + */ + $searchParams = [ + '$filter' => "CodiceRapporto eq '{$codiceRapportoSafe}'", + '$select' => 'IdRapporto,CodiceRapporto,Data,Versione,Firmato,DataStampa', + '$top' => 1 + ]; + + $searchEndpoint = "Rapporto?" . http_build_query($searchParams); + + $searchData = $api->get($searchEndpoint); + + $items = $searchData['value'] ?? []; + + if (!is_array($items) || count($items) === 0) { + echo json_encode([ + 'success' => false, + 'message' => 'Nessun rapporto trovato per questo CodiceRapporto.', + 'codice_rapporto' => $codiceRapporto, + 'search_endpoint' => $searchEndpoint, + 'search_data' => $searchData + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + exit; + } + + $rapportoBase = $items[0]; + $rapportoId = intval($rapportoBase['IdRapporto'] ?? 0); + + if (!$rapportoId) { + throw new Exception("IdRapporto non trovato nella risposta."); + } + + /* + * STEP 2 - Se step=base, restituisco solo la ricerca base. + */ + if ($step === 'base') { + echo json_encode([ + 'success' => true, + 'codice_rapporto' => $codiceRapporto, + 'id_rapporto' => $rapportoId, + 'step' => $step, + 'search_endpoint' => $searchEndpoint, + 'rapporto_base' => $rapportoBase + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + exit; + } + + /* + * STEP 3 - Espande SOLO il rapporto trovato. + */ + $expandValue = $allowedSteps[$step]; + + $detailParams = [ + '$expand' => $expandValue + ]; + + $detailEndpoint = "Rapporto({$rapportoId})?" . http_build_query($detailParams); + + file_put_contents( + __DIR__ . '/last_rapporto_by_codice_expand_endpoint.txt', + '[' . date('Y-m-d H:i:s') . '] SEARCH: ' . $searchEndpoint . PHP_EOL . + '[' . date('Y-m-d H:i:s') . '] DETAIL: ' . $detailEndpoint . PHP_EOL, + FILE_APPEND + ); + + $detailData = $api->get($detailEndpoint); + + file_put_contents( + __DIR__ . "/rapporto_codice_{$codiceRapportoSafe}_{$step}.json", + json_encode([ + 'search' => $searchData, + 'detail' => $detailData + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) + ); + + echo json_encode([ + 'success' => true, + 'codice_rapporto' => $codiceRapporto, + 'id_rapporto' => $rapportoId, + 'step' => $step, + 'search_endpoint' => $searchEndpoint, + 'detail_endpoint' => $detailEndpoint, + 'rapporto_base' => $rapportoBase, + 'data' => $detailData + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } catch (Exception $e) { - file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - ' . $e->getMessage() . PHP_EOL, FILE_APPEND); + 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()]); + + echo json_encode([ + 'success' => false, + 'error' => $e->getMessage() + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } diff --git a/public/userarea/gridRenderer.js b/public/userarea/gridRenderer.js index bf762e0..a1d0149 100644 --- a/public/userarea/gridRenderer.js +++ b/public/userarea/gridRenderer.js @@ -57,7 +57,20 @@ // ── Client data (AJAX Select2, no bulk loading) ────────────────────── function formatClientLabel(client) { - return (client.Nominativo || "").trim(); + const nome = client.Nominativo || client.text || "Nome non disponibile"; + const id = client.IdCliente || client.id || ""; + const codiceCliente = ( + client.CodiceCliente ?? + client.codiceCliente ?? + "" + ) + .toString() + .trim(); + const suffix = (codiceCliente.split("_")[1] || "").trim(); + const shortCode = + suffix || (codiceCliente ? codiceCliente.charAt(0) : "--"); + + return `${nome.trim()} - ${shortCode} (ID: ${id})`; } // Cache of resolved client names: id → name @@ -102,7 +115,9 @@ ); const json = await resp.json(); const item = (json.results || [])[0]; - if (item) clientNameCache[id] = item.text; + if (item) { + clientNameCache[id] = formatClientLabel(item); + } } catch (e) { /* ignore */ } @@ -125,7 +140,12 @@ return { q: params.term || "", limit: 20 }; }, processResults: function (data) { - return { results: data.results || [] }; + const results = (data.results || []).map((item) => ({ + ...item, + text: formatClientLabel(item), + })); + + return { results: results }; }, cache: true, }, diff --git a/public/userarea/mapping_template_xls_scheme2.php b/public/userarea/mapping_template_xls_scheme2.php index c298501..a9f8d92 100644 --- a/public/userarea/mapping_template_xls_scheme2.php +++ b/public/userarea/mapping_template_xls_scheme2.php @@ -7,7 +7,26 @@ if (!isset($_GET['id']) || !is_numeric($_GET['id'])) { $id = intval($_GET['id']); $db = DBHandlerSelect::getInstance(); $pdo = $db->getConnection(); -$stmt = $pdo->prepare("SELECT name, header_row, start_column, target_table, sample_xlsx, idclient, clientname, idschema, schemaname, schemajson, xls_headers FROM excel_templates WHERE id = ?"); + +$stmt = $pdo->prepare(" + SELECT + name, + header_row, + start_column, + target_table, + source_type, + sample_xlsx, + idclient, + clientname, + idschema, + schemaname, + schemajson, + xls_headers, + api_sample_json, + json_nodes + FROM excel_templates + WHERE id = ? +"); $stmt->execute([$id]); $template = $stmt->fetch(PDO::FETCH_ASSOC); @@ -15,13 +34,43 @@ if (!$template) { die("Template not found"); } +$sourceType = strtoupper($template['source_type'] ?? 'XLS'); +if (!in_array($sourceType, ['XLS', 'API', 'PDF'], true)) { + $sourceType = 'XLS'; +} + $clientName = $template['clientname'] ?: ''; $schemaName = $template['schemaname'] ?: ''; $schemajson = $template['schemajson'] ? json_decode($template['schemajson'], true) : []; -$isSchemajsonEmpty = empty(trim($template['schemajson'])); +$isSchemajsonEmpty = empty(trim($template['schemajson'] ?? '')); // Recupera i campi dalla tabella template_mapping -$stmt = $pdo->prepare("SELECT id, field_id, excel_column, is_manual, manual_default, auto_value, data_type, is_required, default_value, has_list, length, decimals, min_value, max_value, default_curr_date, tablename, field_label, main_field, is_visible_import, is_visible_parts FROM template_mapping WHERE template_id = ?"); +$stmt = $pdo->prepare(" + SELECT + id, + field_id, + excel_column, + json_node, + is_manual, + manual_default, + auto_value, + data_type, + is_required, + default_value, + has_list, + length, + decimals, + min_value, + max_value, + default_curr_date, + tablename, + field_label, + main_field, + is_visible_import, + is_visible_parts + FROM template_mapping + WHERE template_id = ? +"); $stmt->execute([$id]); $mappings = $stmt->fetchAll(PDO::FETCH_ASSOC); @@ -37,11 +86,25 @@ $fixedMappings = $stmt->fetchAll(PDO::FETCH_ASSOC); $hasFixedMappings = !empty($fixedMappings); -// Recupera le colonne già associate nel database +// Recupera le colonne XLS già associate nel database $usedColumnsFromDB = array_filter(array_column($mappings, 'excel_column')); +// Recupera i nodi JSON già associati nel database +$usedJsonNodesFromDB = array_filter(array_column($mappings, 'json_node')); + // Decodifica l'header XLS salvato, se presente $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], true) : []; +if (!is_array($xlsHeaders)) { + $xlsHeaders = []; +} + +// Decodifica nodi JSON API salvati, se presenti +$jsonNodes = $template['json_nodes'] ? json_decode($template['json_nodes'], true) : []; +if (!is_array($jsonNodes)) { + $jsonNodes = []; +} + +$apiSampleJson = $template['api_sample_json'] ?? ''; ?> @@ -163,7 +226,8 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t width: 100% !important; } - .xls-columns option.used-option { + .xls-columns option.used-option, + .json-nodes option.used-option { background-color: #fff3cd; color: #856404; font-weight: 600; @@ -176,6 +240,11 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t overflow: hidden; text-overflow: ellipsis; } + + #apiJsonExample { + font-family: Consolas, Monaco, monospace; + font-size: 13px; + } @@ -195,30 +264,63 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t

Client: | Schema: | - Header Row: | - Start Column: + Source: + + | + Header Row: | + Start Column: +

-
- -
- - + + +
+ +
+ + +
+ + + ✅ Current file: + + No file uploaded yet. + +
- - - ✅ Current file: - - No file uploaded yet. - - -
+ +
+ + + +
+ + + + + ✅ JSON nodes already loaded: + + No JSON nodes loaded yet. + + +
+
+ +
+ PDF source type is not implemented yet. +
+
@@ -236,15 +338,11 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t Parts Title Type - Mapping + Default Value - - - - @@ -268,7 +366,6 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t > - @@ -276,7 +373,6 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t - @@ -286,9 +382,19 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t $autoValue = $mapping['auto_value'] ?? 'none'; $hasAuto = ($autoValue && $autoValue !== 'none'); - $mappingValue = $isSceltaMultipla - ? 'manual' - : ($hasAuto ? 'auto' : ($mapping['excel_column'] ? 'xls' : ((int)$mapping['is_manual'] === 1 ? 'manual' : ''))); + if ($isSceltaMultipla) { + $mappingValue = 'manual'; + } elseif ($hasAuto) { + $mappingValue = 'auto'; + } elseif ($sourceType === 'XLS' && !empty($mapping['excel_column'])) { + $mappingValue = 'xls'; + } elseif ($sourceType === 'API' && !empty($mapping['json_node'])) { + $mappingValue = 'json'; + } elseif ((int)$mapping['is_manual'] === 1) { + $mappingValue = 'manual'; + } else { + $mappingValue = ''; + } ?> - + + + + + + + - + () @@ -330,6 +452,15 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t style="margin-left:5px;"> X + + + () + + @@ -412,7 +543,6 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t - @@ -461,8 +591,6 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t
- - @@ -479,38 +607,47 @@ $xlsHeaders = $template['xls_headers'] ? json_decode($template['xls_headers'], t - - + \ No newline at end of file diff --git a/public/userarea/ping_lims_api.php b/public/userarea/ping_lims_api.php new file mode 100644 index 0000000..ab020b0 --- /dev/null +++ b/public/userarea/ping_lims_api.php @@ -0,0 +1,36 @@ +get('Rapporto', [ + '$top' => 1, + '$select' => 'IdRapporto' + ]); + + $elapsed = round(microtime(true) - $start, 3); + + echo json_encode([ + 'success' => true, + 'elapsed_seconds' => $elapsed, + 'data' => $data + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); +} catch (Exception $e) { + http_response_code(500); + + echo json_encode([ + 'success' => false, + 'error' => $e->getMessage() + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); +} diff --git a/public/userarea/save_mapping_json.php b/public/userarea/save_mapping_json.php index 3139e02..d907c78 100644 --- a/public/userarea/save_mapping_json.php +++ b/public/userarea/save_mapping_json.php @@ -16,9 +16,11 @@ if (!$data || !isset($data['id'])) { exit; } -$mappingId = $data['id']; +$mappingId = (int)$data['id']; $mappingType = $data['mapping_type'] ?? ''; + $excelColumn = $data['excel_column'] ?? null; +$jsonNode = $data['json_node'] ?? null; $manualDefault = $data['manual_default'] ?? null; $autoValue = $data['auto_value'] ?? 'none'; @@ -26,7 +28,7 @@ $tablename = $data['tablename'] ?? ''; try { // Normalize mapping type - $allowedTypes = ['', 'xls', 'manual', 'auto']; + $allowedTypes = ['', 'xls', 'json', 'manual', 'auto']; if (!in_array($mappingType, $allowedTypes, true)) { echo json_encode(["success" => false, "message" => "Invalid mapping_type"]); exit; @@ -41,43 +43,67 @@ try { // Decide what to persist based on mapping_type $isManual = 0; $excelToSave = null; + $jsonNodeToSave = null; $manualToSave = null; $autoToSave = 'none'; if ($mappingType === 'xls') { + $isManual = 0; $excelToSave = $excelColumn ?: null; + $jsonNodeToSave = null; + $manualToSave = null; + $autoToSave = 'none'; + } elseif ($mappingType === 'json') { + + $isManual = 0; + $excelToSave = null; + $jsonNodeToSave = $jsonNode ?: null; $manualToSave = null; $autoToSave = 'none'; } elseif ($mappingType === 'manual') { + $isManual = 1; $excelToSave = null; + $jsonNodeToSave = null; $manualToSave = $manualDefault; $autoToSave = 'none'; } elseif ($mappingType === 'auto') { + $isManual = 0; $excelToSave = null; + $jsonNodeToSave = null; $manualToSave = null; $autoToSave = $autoValue ?: 'none'; } else { - // reset + + // Reset mapping $isManual = 0; $excelToSave = null; + $jsonNodeToSave = null; $manualToSave = null; $autoToSave = 'none'; } $stmt = $pdo->prepare(" - UPDATE template_mapping - SET - is_manual = ?, - excel_column = ?, - manual_default = ?, - auto_value = ? - WHERE id = ? -"); + UPDATE template_mapping + SET + is_manual = ?, + excel_column = ?, + json_node = ?, + manual_default = ?, + auto_value = ? + WHERE id = ? + "); - $result = $stmt->execute([$isManual, $excelToSave, $manualToSave, $autoToSave, $mappingId]); + $result = $stmt->execute([ + $isManual, + $excelToSave, + $jsonNodeToSave, + $manualToSave, + $autoToSave, + $mappingId + ]); if (!$result) { echo json_encode(["success" => false, "message" => "Database update failed"]); @@ -88,15 +114,17 @@ try { "success" => true, "message" => "Mapping updated successfully", "saved" => [ - "id" => (int)$mappingId, + "id" => $mappingId, "mapping_type" => $mappingType, "is_manual" => $isManual, "excel_column" => $excelToSave, + "json_node" => $jsonNodeToSave, "manual_default" => $manualToSave, "auto_value" => $autoToSave ] ]); -} catch (Exception $e) { +} catch (Throwable $e) { echo json_encode(["success" => false, "message" => "Error: " . $e->getMessage()]); } + exit; diff --git a/public/userarea/schema_dettagli_response.json b/public/userarea/schema_dettagli_response.json index ae042f3..436382f 100644 --- a/public/userarea/schema_dettagli_response.json +++ b/public/userarea/schema_dettagli_response.json @@ -1 +1 @@ -{"@odata.context":"https:\/\/bvcpsitaly-elims.com\/limsapi\/api\/odata\/$metadata#SchemaCustomField(SchemiCustomFieldsDettagli(CustomField()))\/$entity","IdSchemaCustomFields":82,"ConteggioClienti":0,"Nome":"MONCLER Brand","Descrizione":"Da utilizzare solo per il Brand Diretto\r\nGR 19\/03\/2024","SchemiCustomFieldsDettagli":[{"IdSchemaCustomFieldsDettaglio":2124,"Ordine":1,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":1083,"TitoloTraduzione":"MONCLER_Analisi Commissionate da: ","Titolo":"MONCLER_Analisi Commissionate da: ","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2125,"Ordine":2,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":214,"TitoloTraduzione":"Season","Titolo":"Season","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2126,"Ordine":3,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":467,"TitoloTraduzione":"Sample Code:","Titolo":"Sample Code:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2127,"Ordine":4,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":210,"TitoloTraduzione":"Sample Description ","Titolo":"Sample Description ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2128,"Ordine":5,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":264,"TitoloTraduzione":"Color Code:","Titolo":"Color Code:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2129,"Ordine":6,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":263,"TitoloTraduzione":"Style Code:","Titolo":"Style Code:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2130,"Ordine":9,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":468,"TitoloTraduzione":"Style Description:","Titolo":"Style Description:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":5787,"Ordine":12,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":1014,"TitoloTraduzione":"CDC","Titolo":"CDC","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":4259,"Ordine":13,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":207,"TitoloTraduzione":"Composition Claimed","Titolo":"Composition Claimed","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":6544,"Ordine":14,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":543,"TitoloTraduzione":"Collezione:","Titolo":"Collezione:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2132,"Ordine":15,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":167,"TitoloTraduzione":"Capitolato di riferimento","Titolo":"Capitolato di riferimento","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2133,"Ordine":16,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":161,"TitoloTraduzione":"Categoria:","Titolo":"Categoria:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2134,"Ordine":17,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":150,"TitoloTraduzione":"Destinazione d'uso: ","Titolo":"Destinazione d'uso: ","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2135,"Ordine":18,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":156,"TitoloTraduzione":"Tipologia di Materiale:","Titolo":"Tipologia di Materiale:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2136,"Ordine":19,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":146,"TitoloTraduzione":"Tipologia di Trattamento Superficiale:","Titolo":"Tipologia di Trattamento Superficiale:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2137,"Ordine":20,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":147,"TitoloTraduzione":"Tipologia di concia: ","Titolo":"Tipologia di concia: ","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2155,"Ordine":21,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":142,"TitoloTraduzione":"Fornitore:","Titolo":"Fornitore:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2156,"Ordine":22,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":194,"TitoloTraduzione":"Fabbricante:","Titolo":"Fabbricante:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":4022,"Ordine":23,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":595,"TitoloTraduzione":"Final Customer: ","Titolo":"Final Customer: ","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":"MONCLER","Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":4021,"Ordine":24,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":748,"TitoloTraduzione":"Analisi Richieste:","Titolo":"Analisi Richieste:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2473,"Ordine":25,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":189,"TitoloTraduzione":"Tested Component:","Titolo":"Tested Component:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2176,"Ordine":26,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":166,"TitoloTraduzione":"Note:","Titolo":"Note:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2503,"Ordine":27,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":555,"TitoloTraduzione":"Additional Info:","Titolo":"Additional Info:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2138,"Ordine":28,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":362,"TitoloTraduzione":"Tracciante materiale","Titolo":"Tracciante materiale","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2146,"Ordine":29,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":193,"TitoloTraduzione":"DDT N. ","Titolo":"DDT N. ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2145,"Ordine":30,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":370,"TitoloTraduzione":"DDT del","Titolo":"DDT del","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2480,"Ordine":31,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":371,"TitoloTraduzione":"Mittente (se diverso da Committente)","Titolo":"Mittente (se diverso da Committente)","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2476,"Ordine":32,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":372,"TitoloTraduzione":"Quantit\u00e0","Titolo":"Quantit\u00e0","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2149,"Ordine":33,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":259,"TitoloTraduzione":"Sample Arrival Date:","Titolo":"Sample Arrival Date:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2150,"Ordine":34,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":348,"TitoloTraduzione":"Sample Arrival Time:","Titolo":"Sample Arrival Time:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2151,"Ordine":35,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":260,"TitoloTraduzione":"Sample Unlock Date:","Titolo":"Sample Unlock Date:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2152,"Ordine":36,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":349,"TitoloTraduzione":"Sample Unlock Time:","Titolo":"Sample Unlock Time:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2153,"Ordine":37,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":361,"TitoloTraduzione":"Presa in carico, Data:","Titolo":"Presa in carico, Data:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2154,"Ordine":38,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":360,"TitoloTraduzione":"Presa in carico, Orario:","Titolo":"Presa in carico, Orario:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2157,"Ordine":39,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":163,"TitoloTraduzione":"Campionamento:","Titolo":"Campionamento:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2158,"Ordine":40,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":165,"TitoloTraduzione":"Condizionamento prima e durante il Test: ","Titolo":"Condizionamento prima e durante il Test: ","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2159,"Ordine":41,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":181,"TitoloTraduzione":"Preparazione del campione ai test chimici: ","Titolo":"Preparazione del campione ai test chimici: ","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2161,"Ordine":42,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":169,"TitoloTraduzione":"(*Restituzione Materiale Residuo:","Titolo":"(*Restituzione Materiale Residuo:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":"","Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2163,"Ordine":43,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":170,"TitoloTraduzione":"(*Originali:","Titolo":"(*Originali:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":"","Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2164,"Ordine":44,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":171,"TitoloTraduzione":"(*Corriere:","Titolo":"(*Corriere:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":"","Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2165,"Ordine":45,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":241,"TitoloTraduzione":"N. di Prove:","Titolo":"N. di Prove:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2166,"Ordine":46,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":244,"TitoloTraduzione":"Accettatore:","Titolo":"Accettatore:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2167,"Ordine":47,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":258,"TitoloTraduzione":"Login Date:","Titolo":"Login Date:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2168,"Ordine":48,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":350,"TitoloTraduzione":"Login Time:","Titolo":"Login Time:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2169,"Ordine":49,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":236,"TitoloTraduzione":"Consegna campione:","Titolo":"Consegna campione:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2170,"Ordine":50,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":246,"TitoloTraduzione":"Lab outsourcing:","Titolo":"Lab outsourcing:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2171,"Ordine":51,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":254,"TitoloTraduzione":"AWB: ","Titolo":"AWB: ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2172,"Ordine":52,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":255,"TitoloTraduzione":"Data ricezione risultati test:","Titolo":"Data ricezione risultati test:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2173,"Ordine":53,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":253,"TitoloTraduzione":"Sample return:","Titolo":"Sample return:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2174,"Ordine":54,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":252,"TitoloTraduzione":"Service required:","Titolo":"Service required:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":2175,"Ordine":55,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":261,"TitoloTraduzione":"Tipologia report (solo per Cina)","Titolo":"Tipologia report (solo per Cina)","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":4150,"Ordine":56,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":772,"TitoloTraduzione":"RATING CHINA MONCLER","Titolo":"RATING CHINA MONCLER","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":4151,"Ordine":57,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":773,"TitoloTraduzione":"RATING MANUAL MONCLER","Titolo":"RATING MANUAL MONCLER","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":4149,"Ordine":58,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":771,"TitoloTraduzione":"RATING RSL MONCLER","Titolo":"RATING RSL MONCLER","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}}]} \ No newline at end of file +{"@odata.context":"https:\/\/bvcpsitaly-elims.com\/limsapi\/api\/odata\/$metadata#SchemaCustomField(SchemiCustomFieldsDettagli(CustomField()))\/$entity","IdSchemaCustomFields":49,"ConteggioClienti":0,"Nome":"Accessori Metallici \/ Metallic Accessories","Descrizione":"Schema per tutti gli Accessori Metallici\r\n\r\n\r\n","SchemiCustomFieldsDettagli":[{"IdSchemaCustomFieldsDettaglio":576,"Ordine":1,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":183,"TitoloTraduzione":"Analisi Commissionate da: ","Titolo":"Analisi Commissionate da: ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":true}},{"IdSchemaCustomFieldsDettaglio":577,"Ordine":2,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":184,"TitoloTraduzione":"Ordine d'Acquisto: ","Titolo":"Ordine d'Acquisto: ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":495,"Ordine":3,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":148,"TitoloTraduzione":"Articolo: ","Titolo":"Articolo: ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":true}},{"IdSchemaCustomFieldsDettaglio":510,"Ordine":4,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":172,"TitoloTraduzione":"Finitura:","Titolo":"Finitura:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":8863,"Ordine":5,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":1405,"TitoloTraduzione":"Composizione galvanica","Titolo":"Composizione galvanica","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":496,"Ordine":6,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":149,"TitoloTraduzione":"Colore: ","Titolo":"Colore: ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":497,"Ordine":7,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":150,"TitoloTraduzione":"Destinazione d'uso: ","Titolo":"Destinazione d'uso: ","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":505,"Ordine":8,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":156,"TitoloTraduzione":"Tipologia di Materiale:","Titolo":"Tipologia di Materiale:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1567,"Ordine":9,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":362,"TitoloTraduzione":"Tracciante materiale","Titolo":"Tracciante materiale","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":504,"Ordine":10,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":161,"TitoloTraduzione":"Categoria:","Titolo":"Categoria:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":512,"Ordine":11,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":162,"TitoloTraduzione":"Stagione:","Titolo":"Stagione:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":500,"Ordine":12,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":166,"TitoloTraduzione":"Note:","Titolo":"Note:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":630,"Ordine":13,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":193,"TitoloTraduzione":"DDT N. ","Titolo":"DDT N. ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1594,"Ordine":14,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":370,"TitoloTraduzione":"DDT del","Titolo":"DDT del","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1595,"Ordine":15,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":371,"TitoloTraduzione":"Mittente (se diverso da Committente)","Titolo":"Mittente (se diverso da Committente)","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1596,"Ordine":16,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":372,"TitoloTraduzione":"Quantit\u00e0","Titolo":"Quantit\u00e0","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":5640,"Ordine":17,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":189,"TitoloTraduzione":"Tested Component:","Titolo":"Tested Component:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":498,"Ordine":18,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":142,"TitoloTraduzione":"Fornitore:","Titolo":"Fornitore:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":499,"Ordine":19,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":143,"TitoloTraduzione":"Destinatario:","Titolo":"Destinatario:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":506,"Ordine":20,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":167,"TitoloTraduzione":"Capitolato di riferimento","Titolo":"Capitolato di riferimento","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":962,"Ordine":21,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":259,"TitoloTraduzione":"Sample Arrival Date:","Titolo":"Sample Arrival Date:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1429,"Ordine":22,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":348,"TitoloTraduzione":"Sample Arrival Time:","Titolo":"Sample Arrival Time:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":963,"Ordine":23,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":260,"TitoloTraduzione":"Sample Unlock Date:","Titolo":"Sample Unlock Date:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1428,"Ordine":24,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":349,"TitoloTraduzione":"Sample Unlock Time:","Titolo":"Sample Unlock Time:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1491,"Ordine":25,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":361,"TitoloTraduzione":"Presa in carico, Data:","Titolo":"Presa in carico, Data:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1492,"Ordine":26,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":360,"TitoloTraduzione":"Presa in carico, Orario:","Titolo":"Presa in carico, Orario:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":501,"Ordine":27,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":163,"TitoloTraduzione":"Campionamento:","Titolo":"Campionamento:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":556,"Ordine":28,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":169,"TitoloTraduzione":"(*Restituzione Materiale Residuo:","Titolo":"(*Restituzione Materiale Residuo:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":"","Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":557,"Ordine":29,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":170,"TitoloTraduzione":"(*Originali:","Titolo":"(*Originali:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":"","Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":558,"Ordine":30,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":171,"TitoloTraduzione":"(*Corriere:","Titolo":"(*Corriere:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":"","Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":818,"Ordine":31,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":241,"TitoloTraduzione":"N. di Prove:","Titolo":"N. di Prove:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":851,"Ordine":32,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":244,"TitoloTraduzione":"Accettatore:","Titolo":"Accettatore:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":937,"Ordine":33,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":258,"TitoloTraduzione":"Login Date:","Titolo":"Login Date:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1427,"Ordine":34,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":350,"TitoloTraduzione":"Login Time:","Titolo":"Login Time:","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1102,"Ordine":35,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":236,"TitoloTraduzione":"Consegna campione:","Titolo":"Consegna campione:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":896,"Ordine":36,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":254,"TitoloTraduzione":"AWB: ","Titolo":"AWB: ","Descrizione":null,"Tipo":"Testo","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":897,"Ordine":37,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":253,"TitoloTraduzione":"Sample return:","Titolo":"Sample return:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":898,"Ordine":38,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":255,"TitoloTraduzione":"Data ricezione risultati test:","Titolo":"Data ricezione risultati test:","Descrizione":null,"Tipo":"Data","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":899,"Ordine":39,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":252,"TitoloTraduzione":"Service required:","Titolo":"Service required:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":true,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":950,"Ordine":40,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":246,"TitoloTraduzione":"Lab outsourcing:","Titolo":"Lab outsourcing:","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}},{"IdSchemaCustomFieldsDettaglio":1362,"Ordine":41,"ObbligatorioWeb":"Predefinito","RaggruppamentoWeb":null,"CustomField":{"IdCustomField":261,"TitoloTraduzione":"Tipologia report (solo per Cina)","Titolo":"Tipologia report (solo per Cina)","Descrizione":null,"Tipo":"SceltaMultipla","Decimali":0,"Lunghezza":0,"Minimo":null,"Massimo":null,"ValoreDefault":null,"Elenco":false,"DefaultCurrDate":false,"ObbligatorioWeb":false}}]} \ No newline at end of file diff --git a/public/userarea/search_clienti.php b/public/userarea/search_clienti.php index f624c6e..5f00884 100644 --- a/public/userarea/search_clienti.php +++ b/public/userarea/search_clienti.php @@ -2,7 +2,12 @@ require_once dirname(__DIR__, 2) . '/vendor/autoload.php'; require_once __DIR__ . '/class/db-functions.php'; include dirname(__DIR__) . '/../extra/auth.php'; -if (!Auth::check()) { http_response_code(401); echo json_encode(['error' => 'Unauthorized']); exit; } + +if (!Auth::check()) { + http_response_code(401); + echo json_encode(['error' => 'Unauthorized']); + exit; +} require_once __DIR__ . '/class/VisualLimsApiClient.class.php'; @@ -14,44 +19,95 @@ $q = mb_strtolower(trim($_GET['q'] ?? '')); $limit = max(1, min(50, intval($_GET['limit'] ?? 20))); $id = isset($_GET['id']) ? intval($_GET['id']) : null; +function formatClientLabel(array $client): string +{ + $name = trim($client['Nominativo'] ?? ''); + $id = trim((string)($client['IdCliente'] ?? '')); + $code = trim((string)($client['CodiceCliente'] ?? '')); + + $parts = explode('_', $code); + $suffix = trim($parts[1] ?? ''); + + if ($suffix === '' && $code !== '') { + $suffix = substr($code, 0, 1); + } + + if ($suffix === '') { + $suffix = '--'; + } + + return $name . ' - ' . $suffix . ' (ID: ' . $id . ')'; +} + try { // Load from cache or API $cacheFile = __DIR__ . '/cache/clienti.json'; + if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) { $data = json_decode(file_get_contents($cacheFile), true); } else { $api = VisualLimsApiClient::getInstance(); + $params = [ '$select' => 'IdCliente,Nominativo,CodiceCliente', '$orderby' => 'Nominativo asc' ]; + $data = $api->get("Cliente?" . http_build_query($params)); - if (!is_dir(__DIR__ . '/cache')) mkdir(__DIR__ . '/cache', 0777, true); + + if (!is_dir(__DIR__ . '/cache')) { + mkdir(__DIR__ . '/cache', 0777, true); + } + file_put_contents($cacheFile, json_encode($data)); } $clients = $data['value'] ?? []; - // If requesting by specific ID (for loading selected value) + // If requesting by specific ID, used for loading selected value if ($id !== null) { foreach ($clients as $c) { if ((int)$c['IdCliente'] === $id) { - echo json_encode(['results' => [['id' => $c['IdCliente'], 'text' => trim($c['Nominativo'] ?? '')]]]); + echo json_encode([ + 'results' => [[ + 'id' => $c['IdCliente'], + 'text' => formatClientLabel($c), + 'IdCliente' => $c['IdCliente'], + 'Nominativo' => trim($c['Nominativo'] ?? ''), + 'CodiceCliente' => trim($c['CodiceCliente'] ?? '') + ]] + ]); exit; } } + echo json_encode(['results' => []]); exit; } // Search by query $results = []; + foreach ($clients as $c) { $name = trim($c['Nominativo'] ?? ''); $code = trim($c['CodiceCliente'] ?? ''); - if ($q === '' || mb_strpos(mb_strtolower($name), $q) !== false || mb_strpos(mb_strtolower($code), $q) !== false) { - $results[] = ['id' => $c['IdCliente'], 'text' => $name]; - if (count($results) >= $limit) break; + + if ( + $q === '' || + mb_strpos(mb_strtolower($name), $q) !== false || + mb_strpos(mb_strtolower($code), $q) !== false + ) { + $results[] = [ + 'id' => $c['IdCliente'], + 'text' => formatClientLabel($c), + 'IdCliente' => $c['IdCliente'], + 'Nominativo' => $name, + 'CodiceCliente' => $code + ]; + + if (count($results) >= $limit) { + break; + } } } diff --git a/public/userarea/search_rapporto_min.php b/public/userarea/search_rapporto_min.php new file mode 100644 index 0000000..1f8487c --- /dev/null +++ b/public/userarea/search_rapporto_min.php @@ -0,0 +1,73 @@ + "Codice eq '{$codice}'", + 'CodiceRapporto' => "CodiceRapporto eq '{$codice}'", + 'Numero' => "Numero eq '{$codice}'" + ]; + + foreach ($filters as $label => $filter) { + try { + $data = $api->get('Rapporto', [ + '$filter' => $filter, + '$top' => 5, + '$select' => 'IdRapporto,Codice,CodiceRapporto,Numero,Data,Versione,Cliente' + ]); + + $attempts[$label] = [ + 'success' => true, + 'filter' => $filter, + 'records' => isset($data['value']) && is_array($data['value']) ? count($data['value']) : null, + 'data' => $data + ]; + + } catch (Exception $e) { + $attempts[$label] = [ + 'success' => false, + 'filter' => $filter, + 'error' => $e->getMessage() + ]; + } + } + + echo json_encode([ + 'success' => true, + 'input_codice' => $codice, + 'attempts' => $attempts + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + +} catch (Exception $e) { + http_response_code(500); + + echo json_encode([ + 'success' => false, + 'error' => $e->getMessage() + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); +} \ No newline at end of file diff --git a/public/userarea/test_pdf_value.php b/public/userarea/test_pdf_value.php new file mode 100644 index 0000000..3025c84 --- /dev/null +++ b/public/userarea/test_pdf_value.php @@ -0,0 +1,117 @@ +get("RapportoFile(" . $idRapportoFile . ")"); + + $pdfBody = null; + $strategyUsed = null; + $debugLog = array(); + + // Strategia A - campo FileContent base64 + if (!empty($entityData['FileContent'])) { + $decoded = base64_decode($entityData['FileContent'], true); + if ($decoded !== false && substr($decoded, 0, 4) === '%PDF') { + $pdfBody = $decoded; + $strategyUsed = 'A: FileContent base64'; + } + } + + // Strategia B - campo Contenuto base64 + if (!$pdfBody && !empty($entityData['Contenuto'])) { + $decoded = base64_decode($entityData['Contenuto'], true); + if ($decoded !== false && substr($decoded, 0, 4) === '%PDF') { + $pdfBody = $decoded; + $strategyUsed = 'B: Contenuto base64'; + } + } + + // Recupera token e baseUrl dalla classe + $token = $api->getToken(); + $baseUrl = rtrim($api->getBaseUrl(), '/'); + + $rawEndpoints = array( + 'C: $value' => $baseUrl . '/api/odata/RapportoFile(' . $idRapportoFile . ')/$value', + 'D: FileContent/$value' => $baseUrl . '/api/odata/RapportoFile(' . $idRapportoFile . ')/FileContent/$value', + 'E: Contenuto/$value' => $baseUrl . '/api/odata/RapportoFile(' . $idRapportoFile . ')/Contenuto/$value', + ); + + foreach ($rawEndpoints as $label => $url) { + if ($pdfBody) break; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + 'Authorization: Bearer ' . $token, + 'Accept: application/pdf, application/octet-stream, */*', + )); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + + $body = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ct = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); + curl_close($ch); + + $debugLog[$label] = array( + 'url' => $url, + 'http_code' => $httpCode, + 'content_type' => $ct, + 'body_start' => substr((string)$body, 0, 300), + ); + + if ($httpCode === 200 && is_string($body) && substr($body, 0, 4) === '%PDF') { + $pdfBody = $body; + $strategyUsed = $label; + } + } + + // RISPOSTA + if ($pdfBody) { + $fileName = isset($entityData['FileName']) ? $entityData['FileName'] : 'rapporto_' . $idRapportoFile . '.pdf'; + header('Content-Type: application/pdf'); + header('Content-Disposition: inline; filename="' . $fileName . '"'); + header('Content-Length: ' . strlen($pdfBody)); + header('Cache-Control: private, max-age=0, must-revalidate'); + echo $pdfBody; + exit; + } + + // Nessuna strategia ha funzionato + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(array( + 'success' => false, + 'message' => 'Nessuna strategia ha restituito un PDF valido.', + 'id_rapporto_file' => $idRapportoFile, + 'entity_fields' => array_keys($entityData ? $entityData : array()), + 'entity_data' => $entityData, + 'strategies_debug' => $debugLog, + ), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); +} catch (Exception $e) { + http_response_code(500); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(array( + 'success' => false, + 'error' => $e->getMessage(), + ), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); +} diff --git a/public/userarea/update_api_json_nodes.php b/public/userarea/update_api_json_nodes.php new file mode 100644 index 0000000..4b42ad9 --- /dev/null +++ b/public/userarea/update_api_json_nodes.php @@ -0,0 +1,63 @@ +getConnection(); + + $stmt = $pdo->prepare(" + UPDATE excel_templates + SET + api_sample_json = ?, + json_nodes = ? + WHERE id = ? + "); + + $stmt->execute([ + $apiSampleJson, + json_encode($decodedNodes, JSON_UNESCAPED_UNICODE), + $templateId + ]); + + echo json_encode([ + 'success' => true, + 'nodes_count' => count($decodedNodes) + ]); +} catch (Throwable $e) { + echo json_encode([ + 'success' => false, + 'message' => $e->getMessage() + ]); +}