257 lines
9.4 KiB
PHP
257 lines
9.4 KiB
PHP
<?php
|
|
require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
|
|
require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php';
|
|
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
|
|
ini_set('display_errors', '0');
|
|
error_reporting(E_ALL);
|
|
|
|
/**
|
|
* Uso:
|
|
* rapporto_full_by_codice.php?codice=2621521
|
|
* rapporto_full_by_codice.php?codice=2621521&download=1
|
|
*/
|
|
|
|
try {
|
|
$api = VisualLimsApiClient::getInstance();
|
|
|
|
$codiceRapporto = trim($_GET['codice'] ?? '');
|
|
$downloadPdf = isset($_GET['download']) && $_GET['download'] == '1';
|
|
|
|
if ($codiceRapporto === '') {
|
|
throw new Exception("Parametro codice mancante. Usa ?codice=2621521");
|
|
}
|
|
|
|
$debugDir = __DIR__ . '/logs/lims_rapporti/';
|
|
$pdfDir = __DIR__ . '/pdf/rapporti/';
|
|
|
|
if (!is_dir($debugDir)) mkdir($debugDir, 0755, true);
|
|
if (!is_dir($pdfDir)) mkdir($pdfDir, 0755, true);
|
|
|
|
$codiceRapportoSafe = str_replace("'", "''", $codiceRapporto);
|
|
|
|
/**
|
|
* STEP 1 - Search IdRapporto
|
|
*/
|
|
$searchParams = [
|
|
'$filter' => "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);
|
|
}
|