prepare('SELECT id, orden_id FROM exam_items WHERE id = ?'); $stmt->execute([$itemId]); $item = $stmt->fetch(PDO::FETCH_ASSOC); if (!$item) { jsonError('Ítem no encontrado', 404); } try { $pdo->beginTransaction(); // Borrar resultados anteriores del ítem (reemplazo completo) $pdo->prepare('DELETE FROM exam_resultados WHERE item_id = ?')->execute([$itemId]); $ins = $pdo->prepare(' INSERT INTO exam_resultados (item_id, campo_nombre, valor_texto, valor_numerico, unidad, referencia_min, referencia_max, referencia_texto, es_anormal, ingresado_por) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) '); $inserted = 0; foreach ($resultados as $r) { $campo = trim($r['campo_nombre'] ?? ''); if ($campo === '') { continue; } $ins->execute([ $itemId, $campo, isset($r['valor_texto']) && $r['valor_texto'] !== '' ? $r['valor_texto'] : null, isset($r['valor_numerico']) && $r['valor_numerico'] !== null ? (float) $r['valor_numerico'] : null, isset($r['unidad']) && $r['unidad'] !== '' ? $r['unidad'] : null, isset($r['referencia_min']) && $r['referencia_min'] !== null ? (float) $r['referencia_min'] : null, isset($r['referencia_max']) && $r['referencia_max'] !== null ? (float) $r['referencia_max'] : null, isset($r['referencia_texto']) && $r['referencia_texto'] !== '' ? $r['referencia_texto'] : null, empty($r['es_anormal']) ? 0 : 1, adminId(), ]); $inserted++; } if ($inserted === 0) { $pdo->rollBack(); jsonError('No se guardó ningún resultado (verifique los campos)'); } // Actualizar estado del ítem a resultado_listo $pdo->prepare( "UPDATE exam_items SET estado = 'resultado_listo' WHERE id = ?" )->execute([$itemId]); // Verificar si todos los ítems de la orden están listos para cerrarla $stmtCheck = $pdo->prepare( "SELECT COUNT(*) FROM exam_items WHERE orden_id = ? AND estado NOT IN ('resultado_listo','entregado')" ); $stmtCheck->execute([$item['orden_id']]); $pendientes = (int) $stmtCheck->fetchColumn(); if ($pendientes === 0) { $pdo->prepare( "UPDATE exam_ordenes SET estado = 'completa', updated_at = NOW() WHERE id = ?" )->execute([$item['orden_id']]); } $pdo->commit(); jsonOk(['inserted' => $inserted], 'Resultados guardados'); } catch (\Throwable $e) { $pdo->rollBack(); jsonError('Error al guardar resultados: ' . $e->getMessage(), 500); }