feat: restricción de exámenes por género del paciente

- DB: columna genero_permitido en exam_tipos (M/F/NULL)
  GX,FV → solo femenino | PSA,FPSA → solo masculino
- recepcion.php: TomSelect muestra badge rojo y deshabilita opciones
  incompatibles al seleccionar paciente; elimina los ya agregados
- create_solicitud.php: validación backend 422 si hay conflicto género/examen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-17 16:45:39 -05:00
co-authored by Claude Sonnet 4.6
parent b280dfcb7a
commit 3eaade80ff
2 changed files with 49 additions and 5 deletions
+23
View File
@@ -63,6 +63,29 @@ if ($metodoPago && !in_array($metodoPago, $metodosValidos, true)) {
}
$pdo = db();
// Validar restricción de género antes de abrir transacción
if (!empty($examIds)) {
$stPac = $pdo->prepare("SELECT genero FROM lab_pacientes WHERE id = ? LIMIT 1");
$stPac->execute([$pacienteId]);
$genPac = strtoupper(trim((string)($stPac->fetchColumn() ?: '')));
if ($genPac) {
$ph = implode(',', array_fill(0, count($examIds), '?'));
$stGp = $pdo->prepare(
"SELECT codigo, nombre, genero_permitido FROM exam_tipos
WHERE id IN ($ph) AND genero_permitido IS NOT NULL AND genero_permitido <> ?"
);
$stGp->execute(array_merge($examIds, [$genPac]));
$incompatibles = $stGp->fetchAll(PDO::FETCH_ASSOC);
if ($incompatibles) {
$nombres = implode(', ', array_map(fn($r) => $r['codigo'], $incompatibles));
$sexo = $genPac === 'M' ? 'masculino' : 'femenino';
jsonError("Examen(es) no disponibles para paciente $sexo: $nombres", 422);
}
}
}
$pdo->beginTransaction();
try {