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' => null, 'Descrizione' => 'example' ]; // 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); // Costruisci l'array CommesseCustomFields $commesseCustomFields = []; foreach ($customFields as $field) { $commesseCustomFields[] = [ 'IdCommesseCustomFields' => (int)$field['IdCommesseCustomFields'], 'Valore' => $field['Valore'] ?? '' ]; } // Payload per aggiornamento campi custom $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 $response = $apiClient->post('/api/odata/CommessaWeb', $payloadCommessa); if (!isset($response['success']) || !isset($response['CommessaId'])) { throw new Exception('Errore nella creazione della CommessaWeb: ' . json_encode($response)); } $idcommessaweb = (int)$response['CommessaId']; // Salva idcommessaweb in datadb $updateStmt = $pdo->prepare("UPDATE datadb SET idcommessaweb = :idcommessaweb WHERE iddatadb = :iddatadb"); $updateStmt->execute(['idcommessaweb' => $idcommessaweb, 'iddatadb' => $iddatadb]); // Logga il successo della creazione CommessaWeb file_put_contents($logDir . '/export_lims_success.log', date('Y-m-d H:i:s') . " - CommessaWeb creata: idcommessaweb {$idcommessaweb} per iddatadb {$iddatadb}\n", FILE_APPEND); // Step 2: Aggiorna CommesseCustomFields $apiClient->patch("/api/odata/CommessaWeb({$idcommessaweb})", $payloadCustomFields); // Step 3: Crea Campioni foreach ($payloadsCampioni as $index => $payloadCampione) { $payloadCampione['Commessa'] = $idcommessaweb; $apiClient->post('/api/odata/Campione', $payloadCampione); $payloadsCampioni[$index] = $payloadCampione; // Aggiorna il payload con Commessa } // Step 4: Invia Commessa $apiClient->post("/api/odata/CommessaWeb({$idcommessaweb})/InviaCommessa", $payloadInviaCommessa); // Step 5: Recupera il numero commessaweb (opzionale) $commessaData = $apiClient->get("/api/odata/CommessaWeb({$idcommessaweb})"); $commessaweb = $commessaData['Numero'] ?? ''; if ($commessaweb) { $updateStmt = $pdo->prepare("UPDATE datadb SET commessaweb = :commessaweb WHERE iddatadb = :iddatadb"); $updateStmt->execute(['commessaweb' => $commessaweb, 'iddatadb' => $iddatadb]); } // 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() ]); }