load(); // Leggi la variabile SIMULATE_EXPORT_LIMS $simulate = filter_var($_ENV['SIMULATE_EXPORT_LIMS'] ?? true, FILTER_VALIDATE_BOOLEAN); header('Content-Type: application/json'); try { // Verifica che la richiesta sia POST e contenga iddatadb if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['iddatadb'])) { throw new Exception('Richiesta non valida: iddatadb mancante'); } $iddatadb = (int)$_POST['iddatadb']; // Crea la cartella logsapi se non esiste $logDir = __DIR__ . '/logsapi'; if (!is_dir($logDir)) { mkdir($logDir, 0755, true); } // Ottieni connessione al database $db = DBHandlerSelect::getInstance(); $pdo = $db->getConnection(); // Step 1: Creazione payload per CommessaWeb $queryCommessa = " SELECT d.iddatadb, e.idclient AS Cliente, e.idschema AS SchemaCustomField FROM datadb d LEFT JOIN excel_templates e ON d.templateid = e.id WHERE d.iddatadb = :iddatadb "; $stmtCommessa = $pdo->prepare($queryCommessa); $stmtCommessa->execute(['iddatadb' => $iddatadb]); $recordCommessa = $stmtCommessa->fetch(PDO::FETCH_ASSOC); if (!$recordCommessa) { throw new Exception("Nessun record trovato per iddatadb: {$iddatadb}"); } // Validazione payload if (empty($recordCommessa['Cliente']) || empty($recordCommessa['SchemaCustomField'])) { throw new Exception("Dati mancanti per CommessaWeb: Cliente o SchemaCustomField non validi"); } // Payload per creazione CommessaWeb $payloadCommessa = [ 'Cliente' => (int)$recordCommessa['Cliente'], 'SchemaCustomField' => (int)$recordCommessa['SchemaCustomField'], 'Richiedente' => 'Richiedente test', 'Descrizione' => 'esempio Claudio' ]; // Step 2: Creazione payload per campi custom (CommesseCustomFields) $queryCustomFields = " SELECT tm.field_id AS IdCommesseCustomFields, idd.field_value AS Valore FROM import_data_details idd JOIN template_mapping tm ON idd.mapping_id = tm.id WHERE idd.id = :iddatadb "; $stmtCustomFields = $pdo->prepare($queryCustomFields); $stmtCustomFields->execute(['iddatadb' => $iddatadb]); $customFields = $stmtCustomFields->fetchAll(PDO::FETCH_ASSOC); $commesseCustomFields = []; foreach ($customFields as $field) { $commesseCustomFields[] = [ 'IdCommesseCustomFields' => (int)$field['IdCommesseCustomFields'], 'Valore' => $field['Valore'] ?? '' ]; } $payloadCustomFields = [ 'CommesseCustomFields' => $commesseCustomFields ]; // Step 3: Creazione payload per Campioni (da identification_parts) $queryCampioni = " SELECT part_number, idmatrice AS Matrice, part_description AS NoteWeb FROM identification_parts WHERE iddatadb = :iddatadb "; $stmtCampioni = $pdo->prepare($queryCampioni); $stmtCampioni->execute(['iddatadb' => $iddatadb]); $campioni = $stmtCampioni->fetchAll(PDO::FETCH_ASSOC); $payloadsCampioni = []; foreach ($campioni as $campione) { if (empty($campione['Matrice'])) { throw new Exception("Matrice non valida per campione: {$campione['part_number']}"); } $payloadCampione = [ 'Commessa' => null, // SarĂ  impostato dopo 'Matrice' => (int)$campione['Matrice'], 'SottoMatrice' => null, 'SchemaCustomField' => 1, 'NoteWeb' => $campione['NoteWeb'] ?? '' ]; $payloadsCampioni[] = $payloadCampione; } // Step 4: Creazione payload per InviaCommessa $payloadInviaCommessa = []; // Variabile per idcommessaweb $idcommessaweb = null; $commessaweb = ''; if ($simulate) { // Flusso simulato $idcommessaweb = 10176; // Fittizio per il test // Salva idcommessaweb in datadb $updateStmt = $pdo->prepare("UPDATE datadb SET idcommessaweb = :idcommessaweb WHERE iddatadb = :iddatadb"); $updateStmt->execute(['idcommessaweb' => $idcommessaweb, 'iddatadb' => $iddatadb]); // Salva i payload in file JSON $outputFileCommessa = $logDir . "/commessaweb_create_{$iddatadb}.json"; file_put_contents($outputFileCommessa, json_encode($payloadCommessa, JSON_PRETTY_PRINT)); $outputFileCustomFields = $logDir . "/commessaweb_customfields_{$iddatadb}.json"; file_put_contents($outputFileCustomFields, json_encode($payloadCustomFields, JSON_PRETTY_PRINT)); foreach ($payloadsCampioni as $index => $payloadCampione) { $payloadCampione['Commessa'] = $idcommessaweb; $outputFileCampione = $logDir . "/campione_{$iddatadb}_{$campioni[$index]['part_number']}.json"; file_put_contents($outputFileCampione, json_encode($payloadCampione, JSON_PRETTY_PRINT)); } $outputFileInviaCommessa = $logDir . "/commessaweb_invia_{$iddatadb}.json"; file_put_contents($outputFileInviaCommessa, json_encode($payloadInviaCommessa, JSON_PRETTY_PRINT)); // Aggiorna lo status a 'l' (To LIMS) $updateStmt = $pdo->prepare("UPDATE datadb SET status = 'l' WHERE iddatadb = :iddatadb"); $updateStmt->execute(['iddatadb' => $iddatadb]); // Risposta di successo (simulazione) echo json_encode([ 'success' => true, 'mode' => 'simulated', 'message' => "Payload generati e salvati in {$outputFileCommessa}, {$outputFileCustomFields}, file campioni e {$outputFileInviaCommessa}", 'idcommessaweb' => $idcommessaweb, 'commessaweb' => $commessaweb, 'payload_commessa' => $payloadCommessa, 'payload_customfields' => $payloadCustomFields, 'payload_campioni' => $payloadsCampioni, 'payload_invia_commessa' => $payloadInviaCommessa ]); } else { // Flusso reale $apiClient = VisualLimsApiClient::getInstance(); // Step 1: Crea CommessaWeb try { $response = $apiClient->post('CommessaWeb', $payloadCommessa); if (!isset($response['IdCommessa']) || !isset($response['CodiceCommessa'])) { throw new Exception("Risposta API non valida: IdCommessa o CodiceCommessa mancanti: " . json_encode($response)); } $idcommessaweb = (int)$response['IdCommessa']; $commessaweb = $response['CodiceCommessa']; error_log(date('Y-m-d H:i:s') . " - CommessaWeb creata: idcommessaweb {$idcommessaweb}, codice {$commessaweb} per iddatadb {$iddatadb}\n", 3, $logDir . '/export_lims_success.log'); // Salva payload CommessaWeb $outputFileCommessa = $logDir . "/commessaweb_create_{$iddatadb}_{$idcommessaweb}.json"; file_put_contents($outputFileCommessa, json_encode($payloadCommessa, JSON_PRETTY_PRINT)); error_log(date('Y-m-d H:i:s') . " - Payload CommessaWeb salvato in {$outputFileCommessa}\n", 3, $logDir . '/export_lims_success.log'); } catch (Exception $e) { error_log(date('Y-m-d H:i:s') . " - Errore nella creazione della CommessaWeb: " . $e->getMessage() . "\n", 3, $logDir . '/export_lims_error.log'); throw new Exception("Errore nella creazione della CommessaWeb: " . $e->getMessage()); } // Salva idcommessaweb e commessaweb in datadb $updateStmt = $pdo->prepare("UPDATE datadb SET idcommessaweb = :idcommessaweb, commessaweb = :commessaweb WHERE iddatadb = :iddatadb"); $updateStmt->execute([ 'idcommessaweb' => $idcommessaweb, 'commessaweb' => $commessaweb, 'iddatadb' => $iddatadb ]); // Step 2: Crea Campioni try { foreach ($payloadsCampioni as $index => $payloadCampione) { $payloadCampione['Commessa'] = $idcommessaweb; // Salva payload Campione $outputFileCampione = $logDir . "/campione_{$iddatadb}_{$idcommessaweb}_{$campioni[$index]['part_number']}.json"; file_put_contents($outputFileCampione, json_encode($payloadCampione, JSON_PRETTY_PRINT)); error_log(date('Y-m-d H:i:s') . " - Payload Campione salvato in {$outputFileCampione}\n", 3, $logDir . '/export_lims_success.log'); $apiClient->post('Campione', $payloadCampione); $payloadsCampioni[$index] = $payloadCampione; // Aggiorna il payload con Commessa error_log(date('Y-m-d H:i:s') . " - Campione creato: part_number {$campioni[$index]['part_number']} per idcommessaweb {$idcommessaweb}\n", 3, $logDir . '/export_lims_success.log'); } } catch (Exception $e) { error_log(date('Y-m-d H:i:s') . " - Errore nella creazione dei Campioni: " . $e->getMessage() . "\n", 3, $logDir . '/export_lims_error.log'); throw new Exception("Errore nella creazione dei Campioni: " . $e->getMessage()); } // Step 3: Aggiorna CommesseCustomFields try { // Salva payload CustomFields $outputFileCustomFields = $logDir . "/commessaweb_customfields_{$iddatadb}_{$idcommessaweb}.json"; file_put_contents($outputFileCustomFields, json_encode($payloadCustomFields, JSON_PRETTY_PRINT)); error_log(date('Y-m-d H:i:s') . " - PayloadCustomFields per idcommessaweb {$idcommessaweb}: " . json_encode($payloadCustomFields, JSON_PRETTY_PRINT) . "\n", 3, $logDir . '/export_lims_success.log'); error_log(date('Y-m-d H:i:s') . " - Payload CustomFields salvato in {$outputFileCustomFields}\n", 3, $logDir . '/export_lims_success.log'); $apiClient->patch("CommessaWeb({$idcommessaweb})", $payloadCustomFields); error_log(date('Y-m-d H:i:s') . " - CommesseCustomFields aggiornati per idcommessaweb {$idcommessaweb}\n", 3, $logDir . '/export_lims_success.log'); } catch (Exception $e) { error_log(date('Y-m-d H:i:s') . " - Errore nell'aggiornamento CommesseCustomFields: " . $e->getMessage() . "\n", 3, $logDir . '/export_lims_error.log'); throw new Exception("Errore nell'aggiornamento CommesseCustomFields: " . $e->getMessage()); } // Step 4: Invia Commessa try { // Salva payload InviaCommessa $outputFileInviaCommessa = $logDir . "/commessaweb_invia_{$iddatadb}_{$idcommessaweb}.json"; file_put_contents($outputFileInviaCommessa, json_encode($payloadInviaCommessa, JSON_PRETTY_PRINT)); error_log(date('Y-m-d H:i:s') . " - Payload InviaCommessa salvato in {$outputFileInviaCommessa}\n", 3, $logDir . '/export_lims_success.log'); $apiClient->post("CommessaWeb({$idcommessaweb})/InviaCommessa", $payloadInviaCommessa); error_log(date('Y-m-d H:i:s') . " - Commessa inviata: idcommessaweb {$idcommessaweb}\n", 3, $logDir . '/export_lims_success.log'); } catch (Exception $e) { error_log(date('Y-m-d H:i:s') . " - Errore nell'invio della Commessa: " . $e->getMessage() . "\n", 3, $logDir . '/export_lims_error.log'); throw new Exception("Errore nell'invio della Commessa: " . $e->getMessage()); } // Step 5: Recupera il numero commessaweb try { $commessaData = $apiClient->get("CommessaWeb({$idcommessaweb})"); $commessaweb = $commessaData['CodiceCommessaWeb'] ?? $commessaweb; // Usa CodiceCommessaWeb o fallback if ($commessaweb) { $updateStmt = $pdo->prepare("UPDATE datadb SET commessaweb = :commessaweb WHERE iddatadb = :iddatadb"); $updateStmt->execute(['commessaweb' => $commessaweb, 'iddatadb' => $iddatadb]); } error_log(date('Y-m-d H:i:s') . " - CommessaWeb recuperata: codice {$commessaweb} per idcommessaweb {$idcommessaweb}\n", 3, $logDir . '/export_lims_success.log'); } catch (Exception $e) { error_log(date('Y-m-d H:i:s') . " - Errore nel recupero della CommessaWeb: " . $e->getMessage() . "\n", 3, $logDir . '/export_lims_error.log'); throw new Exception("Errore nel recupero della CommessaWeb: " . $e->getMessage()); } // Aggiorna lo status a 'l' (To LIMS) $updateStmt = $pdo->prepare("UPDATE datadb SET status = 'l' WHERE iddatadb = :iddatadb"); $updateStmt->execute(['iddatadb' => $iddatadb]); // Risposta di successo (flusso reale) echo json_encode([ 'success' => true, 'mode' => 'real', 'message' => "Dati inviati al LIMS con successo", 'idcommessaweb' => $idcommessaweb, 'commessaweb' => $commessaweb, 'payload_commessa' => $payloadCommessa, 'payload_customfields' => $payloadCustomFields, 'payload_campioni' => $payloadsCampioni, 'payload_invia_commessa' => $payloadInviaCommessa ]); } } catch (Exception $e) { // Log dell'errore file_put_contents($logDir . '/export_lims_error.log', date('Y-m-d H:i:s') . ' - Flusso ' . ($simulate ? 'simulato' : 'reale') . ' fallito: ' . $e->getMessage() . PHP_EOL, FILE_APPEND); http_response_code(500); echo json_encode([ 'success' => false, 'mode' => $simulate ? 'simulated' : 'real', 'message' => 'Errore: ' . $e->getMessage() ]); }