feat: config anidada por examen en tomas prolongadas + F-LAB-08 mejoras

- 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>
This commit is contained in:
Lizandro Guarnizo
2026-07-28 00:21:24 -05:00
co-authored by Claude Sonnet 4.6
parent 0ea411ce62
commit 915fa3ba5c
3 changed files with 59 additions and 18 deletions
+10 -3
View File
@@ -19,6 +19,7 @@ $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.");
@@ -41,9 +42,15 @@ if ($tc['datos_respuestas']) {
if (is_array($d)) $dr = $d;
}
// Merge: preserve config from other exams already saved
if (!isset($dr['_tomas_config']) || !is_array($dr['_tomas_config'])) $dr['_tomas_config'] = [];
foreach ($cfg as $k => $v) $dr['_tomas_config'][$k] = $v;
// 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) {