/* Motor de actas HBOX — renderiza el formulario, sincroniza con el servidor y firma. - Un acta real se envía UNA vez: al elegir una serie ya enviada, se carga llena y bloqueada. - Solo el administrador (leo) ve el botón "Borrar acta (reabrir)". - La serie PRUEBA no se bloquea (para practicar). Tipos de ítem: check | medida | texto | radio | nota · Envío: POST /api/actas Modos de serie: (a) simple: cfg.prefijo + cfg.series (cantidad) [+ cfg.desde, cfg.pad] → "RTK-005" (b) compuesta: cfg.componentes = [{clave, etiqueta, prefijo, desde, hasta, pad, tipoActa}] cfg.serie(sel) → número de serie calculado, p.ej. "HBOX5-E07-R010-M006" cfg.prerequisitos = [{etiqueta, tipo, serie(sel)}] → otras actas que deben existir y estar OK cfg.exigirAprobados = true → no se puede enviar si algún componente/prerrequisito no está aprobado cfg.unicoPorComponente = true → un componente no puede estar en dos actas de este tipo */ (function () { const $ = (t, a, ...k) => { const e = document.createElement(t); if (a) for (const p in a){ if(p==='html')e.innerHTML=a[p]; else if(p==='text')e.textContent=a[p]; else e.setAttribute(p,a[p]); } k.forEach(c=>e.append(c)); return e; }; const num = s => (String(s || '').match(/(\d+)\s*$/) || [,''])[1]; const esPrueba = s => String(s || '').toUpperCase().indexOf('PRUEBA') >= 0; function opciones(sel, prefijo, desde, hasta, pad) { sel.append($('option', { value: '', text: '— elegir —' })); sel.append($('option', { value: prefijo + '-PRUEBA', text: '⚙ PRUEBA (no cuenta)' })); for (let i = desde; i <= hasta; i++) { const s = prefijo + '-' + String(i).padStart(pad, '0'); sel.append($('option', { value: s, text: s })); } } function render(cfg) { const root = document.getElementById('acta'); const compuesta = Array.isArray(cfg.componentes) && cfg.componentes.length > 0; let admin = false; const wrap = $('div', { class: 'wrap' }); const head = $('header', { class: 'top' }); head.append($('h1', { text: cfg.titulo })); head.append($('p', { text: cfg.subtitulo || 'Helgen Technologies · llena mientras pruebas la tarjeta' })); wrap.append(head); const nav = $('div', { style: 'display:flex;justify-content:space-between;margin:2px 0 8px' }); nav.append($('a', { class: 'volver', href: '../actas/', text: '← Volver a Actas' })); nav.append($('a', { class: 'volver', href: '../salir.html', text: 'Cerrar sesión' })); wrap.append(nav); if (cfg.borrador) wrap.append($('div', { class: 'borrador', html: '⚠ BORRADOR — este formulario aún debe revisarse con ingeniería antes de usarlo como registro oficial.' })); if (cfg.intro) wrap.append($('div', { class: 'nota-item', style: 'margin:0 0 10px', html: cfg.intro })); // ---------------- cabecera: serie (simple o compuesta) + técnico ---------------- const datos = $('div', { class: 'datos' }); const serieSel = $('select', { id: 'f_serie' }); // modo simple const serieCalc = $('input', { type: 'text', id: 'f_serie_calc', readonly: 'readonly', placeholder: 'se calcula al elegir los módulos' }); // modo compuesto const compSel = {}; // clave ->