From a6f4a4c9439df51031b8ef08f34820713c171add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leopoldo=20Rodr=C3=ADguez?= Date: Wed, 30 Sep 2026 11:10:29 -0600 Subject: [PATCH] =?UTF-8?q?actas:=20unidades=20HBOX=20completas=20seleccio?= =?UTF-8?q?nables=20(desde=20ensamble=20aprobado)=20+=20revisi=C3=B3n=20de?= =?UTF-8?q?=20da=C3=B1o=20por=20componente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/formularios/acta.js | 30 ++++++++++++++++++++++++++++-- docs/formularios/envio.html | 2 +- docs/formularios/recepcion.html | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) 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',