feat(turnero): múltiples consentimientos por tipo de examen

- save_ex_tipo.php: GET devuelve form_ids[], POST acepta form_ids[] y
  hace DELETE+INSERT por cada uno (la tabla ya soportaba muchos a muchos)
- configuracion.php: reemplaza select único por checkboxes en formulario
  Agregar y modal Editar; JS lee los checks y envía form_ids[]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-08 08:10:57 -05:00
co-authored by Claude Sonnet 4.6
parent b6179574c3
commit b2bc0f950a
2 changed files with 62 additions and 45 deletions
+18 -21
View File
@@ -1,10 +1,10 @@
<?php
/**
* modules/turnero/api/save_ex_tipo.php
* GET ?id=X → devuelve datos de un tipo de examen (incluyendo formulario_id vinculado)
* POST {codigo, nombre, categoria, formulario_id, activo} → crear
* POST {id, codigo, nombre, categoria, formulario_id, activo} → actualizar
* POST {id, _delete: true} → eliminar
* GET ?id=X → devuelve datos de un tipo de examen (incluyendo form_ids[])
* POST {codigo, nombre, categoria, form_ids:[], activo} → crear
* POST {id, codigo, nombre, categoria, form_ids:[], activo} → actualizar
* POST {id, _delete: true} → eliminar
*/
require_once __DIR__ . '/_helpers.php';
@@ -15,16 +15,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$id = (int)($_GET['id'] ?? 0);
if (!$id) jsonError('ID requerido');
$stmt = db()->prepare(
'SELECT et.*,
(SELECT formulario_id FROM exam_tipo_consentimientos
WHERE exam_tipo_id = et.id LIMIT 1) AS formulario_id
FROM exam_tipos et
WHERE et.id = ?'
);
$stmt = db()->prepare('SELECT * FROM exam_tipos WHERE id = ?');
$stmt->execute([$id]);
$data = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$data) jsonError('Examen no encontrado', 404);
$fStmt = db()->prepare('SELECT formulario_id FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?');
$fStmt->execute([$id]);
$data['form_ids'] = $fStmt->fetchAll(PDO::FETCH_COLUMN);
jsonOk(['data' => $data]);
}
@@ -52,11 +50,11 @@ if ($delete) {
}
// ── CREAR / ACTUALIZAR ───────────────────────────────────────
$codigo = strtoupper(trim($input['codigo'] ?? ''));
$nombre = trim($input['nombre'] ?? '');
$categoria = trim($input['categoria'] ?? '');
$formId = (int)($input['formulario_id'] ?? 0) ?: null;
$activo = (int)($input['activo'] ?? 1);
$codigo = strtoupper(trim($input['codigo'] ?? ''));
$nombre = trim($input['nombre'] ?? '');
$categoria = trim($input['categoria'] ?? '');
$formIds = array_values(array_unique(array_filter(array_map('intval', (array)($input['form_ids'] ?? [])))));
$activo = (int)($input['activo'] ?? 1);
if ($codigo === '') jsonError('El código es requerido');
if ($nombre === '') jsonError('El nombre es requerido');
@@ -80,12 +78,11 @@ try {
$examId = (int)$pdo->lastInsertId();
}
// Actualizar relación formulario ↔ examen
// Actualizar relaciones formulario ↔ examen (muchos a muchos)
$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]);
$ins = $pdo->prepare('INSERT INTO exam_tipo_consentimientos (exam_tipo_id, formulario_id) VALUES (?, ?)');
foreach ($formIds as $fid) {
$ins->execute([$examId, $fid]);
}
$pdo->commit();