diff --git a/docs/formularios/acta.js b/docs/formularios/acta.js
index 8be0866..f050f7d 100644
--- a/docs/formularios/acta.js
+++ b/docs/formularios/acta.js
@@ -96,6 +96,7 @@
grupos[g].forEach(u => og.append($('option', { value: u.serie, text: u.etiqueta || (u.serie + (u.maquina ? ' · ' + u.maquina : '')) })));
serieSel.append(og);
});
+ if (!cfg.sinEnsambladas) cargarEnsambladas();
serieSel.append($('option', { value: '__OTRA__', text: '➕ Otra unidad (no está en la lista)' }));
serieSel.append($('option', { value: 'CAMPO-PRUEBA', text: '⚙ PRUEBA (no cuenta)' }));
const dS = $('div'); dS.append($('label', { text: cfg.etiquetaSerie || 'Unidad' }), serieSel, serieOtra, fichaUnidad);
@@ -140,7 +141,10 @@
if (cfg.tipo === 'dano') return;
// En un acta compuesta (ensamble, integración) se revisa CADA módulo elegido, no solo
// la unidad calculada: una tarjeta con corto no debe poder entrar a un ensamble.
- const series = compuesta ? Object.values(seleccion()).filter(v => v) : [serieActual()];
+ // Una unidad HBOX completa también se revisa pieza por pieza (tarjeta, ArduSimple, módem).
+ const u = compuesta ? null : unidadSel();
+ const series = compuesta ? Object.values(seleccion()).filter(v => v)
+ : [serieActual()].concat(u && u.componentes ? Object.values(u.componentes) : []);
const aRevisar = series.filter(v => v && !esPrueba(v));
if (!aRevisar.length) return;
const avisos = [];
@@ -163,6 +167,28 @@
}).join('
');
}
+ // Unidades HBOX completas: salen de las actas de ensamble aprobadas y van primero en la lista,
+ // para que envío, recepción, daño, banco… puedan elegir la unidad entera y no solo sus piezas.
+ async function cargarEnsambladas() {
+ let j = null;
+ try { j = await (await fetch('/api/actas', { cache: 'no-store' })).json(); } catch (e) { return; }
+ const vistas = new Set(cfg.unidades.map(u => u.serie));
+ const us = (j && j.actas || []).filter(a => a.tipo === 'ensamble' && a.resultado === 'OK' && a.serie
+ && !esPrueba(a.serie) && !vistas.has(a.serie) && vistas.add(a.serie));
+ if (!us.length) return;
+ const og = $('optgroup', { label: 'Unidades HBOX completas' });
+ us.sort((x, y) => x.serie < y.serie ? -1 : 1).forEach(a => {
+ const c = a.componentes || {};
+ const piezas = Object.values(c).filter(Boolean).join(' · ');
+ const u = { serie: a.serie, terminal: 'Unidades HBOX completas', componentes: c,
+ etiqueta: a.serie + (piezas ? ' (' + piezas + ')' : ''),
+ nota: 'Unidad completa' + (piezas ? ': ' + piezas : '') + '.' };
+ cfg.unidades.push(u);
+ og.append($('option', { value: u.serie, text: u.etiqueta }));
+ });
+ serieSel.insertBefore(og, serieSel.children[1] || null);
+ }
+
// selección actual de componentes -> {clave: valor}
function seleccion() { const s = {}; for (const k in compSel) s[k] = compSel[k].value; return s; }
function unidadSel() {
@@ -645,7 +671,7 @@
if (flota) {
serieOtra.style.display = serieSel.value === '__OTRA__' ? '' : 'none';
const u = unidadSel();
- fichaUnidad.innerHTML = u
+ fichaUnidad.innerHTML = u && u.componentes ? u.nota : u
? '' + (u.maquina || '—') + ' · ' + (u.terminal || '—') + (u.nota ? '
' + u.nota : '')
: '';
}
diff --git a/docs/formularios/envio.html b/docs/formularios/envio.html
index 12c4ab2..95fc21f 100644
--- a/docs/formularios/envio.html
+++ b/docs/formularios/envio.html
@@ -21,7 +21,7 @@ Acta.render({
tecnicoDesdeUsuario: true,
nombres: { alan: 'Alán Basurto', daniel: 'Daniel Martínez', leo: 'Leo Rodríguez' },
unidades: window.SERIES,
- etiquetaSerie: 'Unidad que se envía',
+ etiquetaSerie: 'Unidad HBOX o componente que se envía',
titulo: 'Acta de envío',
subtitulo: 'Se llena al cerrar la caja. Procedimiento: Ciclo de vida §6.',
intro: 'Fija cómo salió la unidad (firmware, SIM, contenido, fotos). La recepción se compara contra esta acta.',
diff --git a/docs/formularios/recepcion.html b/docs/formularios/recepcion.html
index ba88ad2..9394ecc 100644
--- a/docs/formularios/recepcion.html
+++ b/docs/formularios/recepcion.html
@@ -24,7 +24,7 @@ Acta.render({
tecnicoDesdeUsuario: true,
nombres: { alan: 'Alán Basurto', daniel: 'Daniel Martínez', leo: 'Leo Rodríguez' },
unidades: window.SERIES,
- etiquetaSerie: 'Unidad que se recibe',
+ etiquetaSerie: 'Unidad HBOX o componente que se recibe',
titulo: 'Acta de recepción e inspección',
subtitulo: 'Una por unidad, al abrir la caja y antes de entrar al puerto. Procedimiento: Ciclo de vida §7.',
textoOK: 'LISTA PARA ENTRAR',