- configurar_tomas.php: almacena _tomas_config como { examName: { groupKey: [fids] } }
en vez de flat, detecta y resetea formato antiguo, valida exam_type requerido
- ver_formulario_enviado.php: rendering aplana nested→flat para filtrar secciones;
JS lee _mpTomasConfig[examName][gk] en inSaved y _mpRenderBadges; auto-open
verifica per-examen; _mpActiveConfigExam evita race entre exámenes simultáneos
- get_consentimientos.php: flatten de nested o flat para calcular allowedFids
en ambos loops de tomas progresivas
- F-LAB-08 (id=16): añade 'Grupo sanguíneo' a opciones de _m5n865g;
agrega campos condicionales '¿Qué tipo de cáncer?' y 'Especifique grupo sanguíneo'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
67 lines
2.6 KiB
PHP
67 lines
2.6 KiB
PHP
<?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;
|
|
$examType = trim($body['exam_type'] ?? '');
|
|
$otroHora = trim($body['otro_hora'] ?? '');
|
|
|
|
if (!$token) jsonError('token requerido.');
|
|
if (!is_array($cfg) || empty($cfg)) jsonError('tomas_config requerido.');
|
|
if ($examType === '') jsonError('exam_type 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;
|
|
}
|
|
|
|
// Store per-exam nested: { examName: { groupKey: [firmaIds] } }
|
|
$existing = isset($dr['_tomas_config']) && is_array($dr['_tomas_config']) ? $dr['_tomas_config'] : [];
|
|
// Reset old flat format (values were arrays of strings, not arrays of arrays)
|
|
if (!empty($existing)) {
|
|
$__first = reset($existing);
|
|
if (is_array($__first) && !empty($__first) && is_string(reset($__first))) $existing = [];
|
|
}
|
|
$existing[$examType] = $cfg;
|
|
$dr['_tomas_config'] = $existing;
|
|
// Guardar selección completa de exámenes (array) para que el reload restaure todos
|
|
$examTypes = isset($body['exam_types']) && is_array($body['exam_types']) ? array_values(array_filter($body['exam_types'])) : [];
|
|
if ($examTypes) {
|
|
$dr['_c8j2g16'] = count($examTypes) === 1 ? $examTypes[0] : $examTypes;
|
|
} elseif ($examType !== '' && !array_key_exists('_c8j2g16', $dr)) {
|
|
$dr['_c8j2g16'] = $examType;
|
|
}
|
|
if ($otroHora !== '') $dr['_otro_hora'] = $otroHora;
|
|
|
|
$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.');
|