feat: ciclos configurables + gestión de exámenes en Tomas Prolongadas
Feature 1 — Ciclos configurables por paciente: - ver_formulario_enviado.php: pantalla de configuración aparece la primera vez que el profesional abre el formulario (antes de firmar); permite seleccionar qué tomas realizar para cada protocolo. $_mpSkippedSepIds oculta las secciones no seleccionadas en render. $_mpMap se reconstruye desde los grupos filtrados para que next_firma_id salte tomas omitidas. - configurar_tomas.php (nuevo): guarda _tomas_config en datos_respuestas del consentimiento; valida que cada grupo tenga al menos una toma. - guardar_toma.php: aplica el filtro _tomas_config al array firmasCampos para que el conteo de tomas firmadas/pendientes sea correcto. Feature 2 — Gestión de tipos de examen (admin): - lab_tomas_config.php (nuevo): página admin que muestra los exámenes actuales con sus tomas y permite añadir nuevos tipos con su esquema completo (separador + hora + resultado + firma_profesional por toma). - api/lab/save_tomas_config.php (nuevo): modifica el esquema JSON del formulario id=15; add_exam agrega opción al selector y los campos de cada toma; delete_exam elimina la opción y los separadores exclusivos. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
3e110324a8
commit
2eefe3f5c8
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* POST /modules/turnero/api/configurar_tomas.php
|
||||
* Guarda la configuración de ciclos (tomas_config) para un consentimiento de toma progresiva.
|
||||
* Se llama desde la pantalla de configuración antes de iniciar las firmas.
|
||||
*
|
||||
* Body JSON:
|
||||
* token string requerido UUID del consentimiento
|
||||
* tomas_config object requerido {grupoKey: [firmaId, ...], ...}
|
||||
*/
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
requireMethod('POST');
|
||||
|
||||
$body = inputJson();
|
||||
$token = trim($body['token'] ?? '');
|
||||
$cfg = $body['tomas_config'] ?? null;
|
||||
|
||||
if (!$token) jsonError('token requerido.');
|
||||
if (!is_array($cfg) || empty($cfg)) jsonError('tomas_config requerido.');
|
||||
|
||||
foreach ($cfg as $grupo => $ids) {
|
||||
if (!is_array($ids) || empty($ids)) jsonError("El grupo '$grupo' no tiene tomas seleccionadas.");
|
||||
foreach ($ids as $id) {
|
||||
if (!preg_match('/^[a-zA-Z0-9_]+$/', $id)) jsonError("ID de firma inválido: $id");
|
||||
}
|
||||
}
|
||||
|
||||
$pdo = db();
|
||||
$stmt = $pdo->prepare(
|
||||
"SELECT id, datos_respuestas FROM turnero_consentimientos WHERE token = ? LIMIT 1"
|
||||
);
|
||||
$stmt->execute([$token]);
|
||||
$tc = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!$tc) jsonError('Consentimiento no encontrado.', 404);
|
||||
|
||||
$dr = [];
|
||||
if ($tc['datos_respuestas']) {
|
||||
$d = json_decode($tc['datos_respuestas'], true);
|
||||
if (is_array($d)) $dr = $d;
|
||||
}
|
||||
|
||||
$dr['_tomas_config'] = $cfg;
|
||||
|
||||
$pdo->prepare("UPDATE turnero_consentimientos SET datos_respuestas = ? WHERE id = ?")
|
||||
->execute([json_encode($dr, JSON_UNESCAPED_UNICODE), $tc['id']]);
|
||||
|
||||
jsonOk([], 'Configuración de tomas guardada.');
|
||||
@@ -101,6 +101,16 @@ foreach ($esquema as $campo) {
|
||||
}
|
||||
}
|
||||
|
||||
// ── Aplicar filtro de ciclos configurados (tomas_config) ────
|
||||
$__tcFirmas = $datosMerge['_tomas_config'] ?? null;
|
||||
if (is_array($__tcFirmas)) {
|
||||
$__allowed = [];
|
||||
foreach ($__tcFirmas as $__g => $__ids) {
|
||||
if (is_array($__ids)) foreach ($__ids as $__id) $__allowed[$__id] = true;
|
||||
}
|
||||
$firmasCampos = array_values(array_filter($firmasCampos, fn($f) => isset($__allowed[$f['id']])));
|
||||
}
|
||||
|
||||
// ── Determinar estado y siguiente_toma_at ────────────────────
|
||||
// Acepta firma guardada con clave campo_id O campo_id_svg (compatibilidad registros históricos)
|
||||
$hasFirma = fn($f) => (isset($datosMerge[$f['id']]) && strlen($datosMerge[$f['id']]) > 10)
|
||||
|
||||
Reference in New Issue
Block a user