fix: catch Throwable instead of Exception, add prepare() null checks

PHP's PDO in silent mode returns false on prepare() when table doesn't
exist; calling ->execute() on false throws TypeError (Error, not
Exception). Changed catch to \Throwable and added explicit checks so
the real error message is returned as JSON instead of HTTP 500 empty.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-17 10:58:13 -05:00
co-authored by Claude Sonnet 4.6
parent f5de2c90ca
commit 3d0ae95d1e
2 changed files with 65 additions and 15 deletions
+6 -2
View File
@@ -43,10 +43,14 @@ try {
VALUES (?, ?)
ON DUPLICATE KEY UPDATE concepto = VALUES(concepto)"
);
if (!$stmt) {
$info = $pdo->errorInfo();
throw new \RuntimeException("Prepare falló [{$info[0]}]: {$info[2]}");
}
$insertados = 0;
foreach ($data['rows'] as $row) {
$cod = trim($row['cod'] ?? '');
$cod = trim($row['cod'] ?? '');
$concepto = trim($row['concepto'] ?? '');
if (!$cod || !$concepto) continue;
$stmt->execute([$cod, $concepto]);
@@ -55,7 +59,7 @@ try {
ob_clean();
echo json_encode(['ok' => true, 'insertados' => $insertados]);
} catch (Exception $e) {
} catch (\Throwable $e) {
ob_clean();
http_response_code(500);
echo json_encode(['ok' => false, 'error' => $e->getMessage()]);
+59 -13
View File
@@ -132,6 +132,43 @@ if (!in_array($modo, ['insertar', 'upsert'], true)) {
$modo = 'upsert';
}
// ── Exámenes opcionales (vienen del scheduler de RIPS) ───────────────────────
$examenesRaw = $data['examenes'] ?? null;
$examenesGuardados = 0;
function guardarExamenesPendientes(string $doc, array $examenes): int {
if (!$examenes || !$doc) return 0;
$pdo = db();
$stDel = $pdo->prepare(
"DELETE FROM rips_examenes_pendientes
WHERE numero_documento = ? AND DATE(created_at) = CURDATE()"
);
if (!$stDel) {
$info = $pdo->errorInfo();
throw new \RuntimeException("rips_examenes_pendientes no existe o error: {$info[2]}");
}
$stDel->execute([$doc]);
$meta = $examenes[0] ?? [];
$stIns = $pdo->prepare(
"INSERT INTO rips_examenes_pendientes
(numero_documento, datos, recepcion_id, hora_recepcion)
VALUES (?, ?, ?, ?)"
);
if (!$stIns) {
$info = $pdo->errorInfo();
throw new \RuntimeException("INSERT rips_examenes_pendientes falló: {$info[2]}");
}
$stIns->execute([
$doc,
json_encode($examenes, JSON_UNESCAPED_UNICODE),
$meta['recepcion_id'] ?? null,
$meta['hora'] ?? null,
]);
return count($examenes);
}
// ── UPSERT / INSERT-ONLY ─────────────────────────────────────────────────────
try {
$pac = new Paciente();
@@ -144,31 +181,40 @@ try {
ob_clean();
if ($existente) {
if (!empty($examenesRaw) && is_array($examenesRaw)) {
$examenesGuardados = guardarExamenesPendientes($campos['numero_documento'], $examenesRaw);
}
if ($modo === 'insertar') {
echo json_encode([
'ok' => true,
'action' => 'skipped',
'id' => $existente['id'],
'message' => 'Paciente ya existe',
'ok' => true,
'action' => 'skipped',
'id' => $existente['id'],
'message' => 'Paciente ya existe',
'examenes_guardados' => $examenesGuardados,
]);
} else {
// Nunca pisar origen en update — conservar el que ya tiene en BD
unset($campos['origen']);
$pac->actualizar($existente['id'], $campos, null);
echo json_encode([
'ok' => true,
'action' => 'updated',
'id' => $existente['id'],
'message' => 'Paciente actualizado',
'ok' => true,
'action' => 'updated',
'id' => $existente['id'],
'message' => 'Paciente actualizado',
'examenes_guardados' => $examenesGuardados,
]);
}
} elseif (!empty($campos['nombre_completo'])) {
$id = $pac->crear($campos, null);
if (!empty($examenesRaw) && is_array($examenesRaw)) {
$examenesGuardados = guardarExamenesPendientes($campos['numero_documento'], $examenesRaw);
}
echo json_encode([
'ok' => true,
'action' => 'created',
'id' => $id,
'message' => 'Paciente creado',
'ok' => true,
'action' => 'created',
'id' => $id,
'message' => 'Paciente creado',
'examenes_guardados' => $examenesGuardados,
]);
} else {
http_response_code(422);
@@ -178,7 +224,7 @@ try {
'error' => 'Sin número de documento ni nombre: registro omitido',
]);
}
} catch (Exception $e) {
} catch (\Throwable $e) {
ob_clean();
http_response_code(500);
echo json_encode(['ok' => false, 'error' => $e->getMessage()]);