feat: módulo lab_examenes — CRUD catálogo de exámenes, items y tarifas
- Nuevo módulo lab_examenes con lista paginada, buscador y filtro por categoría - Vista de detalle/edición con campos completos de exam_tipos (CUPS, protocolo, tipo muestra, nivel, abreviatura, seremite, ayuno, instrucciones) - Sub-tabla inline de items de resultado (lab_items_resultado) con edición por fila - Sub-tabla de precios por tarifa (lab_tarifas) con modal de edición - APIs: list, get, save, save_item, save_tarifa, get_tarifas - Script ETL Firebird→MySQL (scripts/etl_examenes.php) para la migración inicial Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
229977785b
commit
fb0e77523c
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
requireAdmin();
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') jsonError('Método no permitido', 405);
|
||||
|
||||
$d = inputJson();
|
||||
$id = (int)($d['id'] ?? 0);
|
||||
|
||||
if (!empty($d['_delete'])) {
|
||||
if (!$id) jsonError('ID requerido');
|
||||
$pdo = db();
|
||||
$s = $pdo->prepare('SELECT COUNT(*) FROM turnero_examen_items WHERE exam_tipo_id = ?');
|
||||
$s->execute([$id]);
|
||||
if ($s->fetchColumn() > 0) jsonError('Hay solicitudes con este examen. Desactívelo en su lugar.');
|
||||
$pdo->prepare('DELETE FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?')->execute([$id]);
|
||||
$pdo->prepare('DELETE FROM exam_tipos WHERE id = ?')->execute([$id]);
|
||||
jsonOk([], 'Examen eliminado');
|
||||
}
|
||||
|
||||
$codigo = strtoupper(trim($d['codigo'] ?? ''));
|
||||
$nombre = trim($d['nombre'] ?? '');
|
||||
$categoria = trim($d['categoria'] ?? '') ?: null;
|
||||
$cups = trim($d['cups'] ?? '') ?: null;
|
||||
$cod_prot = trim($d['cod_protocolo'] ?? '') ?: null;
|
||||
$tipo_m = trim($d['tipo_muestra'] ?? '') ?: null;
|
||||
$nivel = isset($d['nivel']) && $d['nivel'] !== '' ? (int)$d['nivel'] : null;
|
||||
$abrev = trim($d['abreviatura'] ?? '') ?: null;
|
||||
$seremite = (int)($d['seremite'] ?? 0);
|
||||
$serecibe = trim($d['serecibe'] ?? '') ?: null;
|
||||
$activo = (int)($d['activo'] ?? 1);
|
||||
$req_ayuno = (int)($d['requiere_ayuno'] ?? 0);
|
||||
$horas_ayuno = isset($d['horas_ayuno']) && $d['horas_ayuno'] !== '' ? (int)$d['horas_ayuno'] : null;
|
||||
$instruc = trim($d['instrucciones'] ?? '') ?: null;
|
||||
$formId = (int)($d['formulario_id'] ?? 0) ?: null;
|
||||
|
||||
if ($codigo === '') jsonError('El código es requerido');
|
||||
if ($nombre === '') jsonError('El nombre es requerido');
|
||||
if (strlen($codigo) > 20) jsonError('Código máximo 20 caracteres');
|
||||
|
||||
$pdo = db();
|
||||
$pdo->beginTransaction();
|
||||
try {
|
||||
if ($id) {
|
||||
$pdo->prepare(
|
||||
'UPDATE exam_tipos SET codigo=?,nombre=?,categoria=?,cups=?,cod_protocolo=?,tipo_muestra=?,
|
||||
nivel=?,abreviatura=?,seremite=?,serecibe=?,activo=?,requiere_ayuno=?,horas_ayuno=?,instrucciones=?
|
||||
WHERE id=?'
|
||||
)->execute([$codigo,$nombre,$categoria,$cups,$cod_prot,$tipo_m,
|
||||
$nivel,$abrev,$seremite,$serecibe,$activo,$req_ayuno,$horas_ayuno,$instruc,$id]);
|
||||
$examId = $id;
|
||||
} else {
|
||||
$pdo->prepare(
|
||||
'INSERT INTO exam_tipos (codigo,nombre,categoria,cups,cod_protocolo,tipo_muestra,
|
||||
nivel,abreviatura,seremite,serecibe,activo,codigo_legacy,requiere_ayuno,horas_ayuno,instrucciones)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'
|
||||
)->execute([$codigo,$nombre,$categoria,$cups,$cod_prot,$tipo_m,
|
||||
$nivel,$abrev,$seremite,$serecibe,$activo,$codigo,$req_ayuno,$horas_ayuno,$instruc]);
|
||||
$examId = (int)$pdo->lastInsertId();
|
||||
}
|
||||
|
||||
$pdo->prepare('DELETE FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?')->execute([$examId]);
|
||||
if ($formId) {
|
||||
$pdo->prepare('INSERT INTO exam_tipo_consentimientos (exam_tipo_id, formulario_id) VALUES (?,?)')
|
||||
->execute([$examId, $formId]);
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
jsonOk(['id' => $examId], $id ? 'Examen actualizado' : 'Examen creado');
|
||||
} catch (\Throwable $e) {
|
||||
$pdo->rollBack();
|
||||
if ($e->getCode() === '23000') jsonError('Ya existe un examen con ese código');
|
||||
jsonError('Error: ' . $e->getMessage(), 500);
|
||||
}
|
||||
Reference in New Issue
Block a user