diff --git a/DESPLIEGUE.md b/DESPLIEGUE.md index c54feca..80fadf1 100644 --- a/DESPLIEGUE.md +++ b/DESPLIEGUE.md @@ -54,7 +54,7 @@ El backend la deduce sola de `ACTAS_DIR`; si prefieres fijarla, agrega a Environment=ADJUNTOS_DIR=/srv/projects/drogheda/adjuntos Environment=ADJUNTO_MAX_MB=8 Environment=ARCHIVO_MAX_MB=20 -Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion +Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem ``` ### 4 · nginx — subida de fotos e identidad del técnico (una sola vez) diff --git a/backend/actas-hbox.service b/backend/actas-hbox.service index f88b683..5834112 100644 --- a/backend/actas-hbox.service +++ b/backend/actas-hbox.service @@ -10,7 +10,7 @@ Environment=ACTAS_DIR=/srv/projects/drogheda/actas Environment=ADJUNTOS_DIR=/srv/projects/drogheda/adjuntos Environment=ADJUNTO_MAX_MB=8 Environment=ARCHIVO_MAX_MB=20 -Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion +Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem Environment=ACTAS_ADMINS=leo Environment=HTPASSWD_FILE=/etc/nginx/hbox-docs.htpasswd Environment=PASS_MIN=8 diff --git a/backend/app.py b/backend/app.py index 6bc0120..b781692 100644 --- a/backend/app.py +++ b/backend/app.py @@ -36,7 +36,7 @@ ADMINS = {u.strip().lower() for u in os.environ.get("ACTAS_ADMINS", "leo").split TIPOS_UNICOS = {"ensamble"} # tipos en los que un componente solo puede usarse en un acta real # Tipos REPETIBLES: una misma serie puede tener varias actas (cada visita a campo es un evento nuevo). TIPOS_REPETIBLES = {t.strip() for t in os.environ.get( - "ACTAS_REPETIBLES", "diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion").split(",") if t.strip()} + "ACTAS_REPETIBLES", "diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem").split(",") if t.strip()} # Subida de fotos MAX_MB = int(os.environ.get("ADJUNTO_MAX_MB", "8")) diff --git a/docs/formularios/acta.css b/docs/formularios/acta.css index 732e2f4..4bbebef 100644 --- a/docs/formularios/acta.css +++ b/docs/formularios/acta.css @@ -135,3 +135,13 @@ input[type=date]{width:100%;padding:11px 12px;border:1px solid var(--linea);bord .marca.danada{display:block;background:var(--aviso-bg);border:2px solid var(--aviso);color:#7a4a00} .marca.baja{display:block;background:var(--falla-bg);border:2px solid var(--falla);color:#8a1a1a} .marca a{color:inherit;font-weight:700} + +/* tabla de registro (tipo 'tabla') */ +.tabla-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-top:6px} +.tabla{border-collapse:collapse;font-size:13px;min-width:100%} +.tabla th,.tabla td{border:1px solid #ddd;padding:4px 5px;text-align:left;vertical-align:middle;white-space:nowrap} +.tabla thead th{background:#f3f3f3;font-weight:600;font-size:12px} +.tabla tbody th{background:#fafafa;font-weight:600;font-variant-numeric:tabular-nums} +.tabla input,.tabla select{width:100%;min-width:64px;font-size:14px;padding:6px 6px;border:1px solid #ccc;border-radius:6px;box-sizing:border-box} +.tabla input[inputmode=decimal]{max-width:90px} +.enviada .tabla input,.enviada .tabla select{background:#f6f6f6} diff --git a/docs/formularios/acta.js b/docs/formularios/acta.js index a61394d..0cac5d3 100644 --- a/docs/formularios/acta.js +++ b/docs/formularios/acta.js @@ -229,6 +229,39 @@ box.append(g); } else if (it.tipo === 'nota') { box.append($('div', { class: 'nota-item', html: it.txt })); + } else if (it.tipo === 'tabla') { + // Tabla de registro: filas × columnas de entradas cortas. Cada celda es un campo propio + // (clave `____`), así que se guarda, se relee y se bloquea igual que todo lo demás. + box.classList.add('tabla-item'); + if (it.txt) box.append($('label', { html: it.txt })); + if (it.sub) box.append($('div', { class: 'nota-item', html: it.sub })); + const scroll = $('div', { class: 'tabla-scroll' }); + const t = $('table', { class: 'tabla' }); + const thead = $('thead'); const hr = $('tr'); hr.append($('th', { text: it.etiquetaFilas || '' })); + (it.columnas || []).forEach(c => { const th = $('th', { html: c.txt }); if (c.u) th.append($('small', { text: ' ' + c.u })); hr.append(th); }); + thead.append(hr); t.append(thead); + const tbody = $('tbody'); + (it.filas || []).forEach(f => { + const fk = String(f).replace(/[^A-Za-z0-9]+/g, '-'); + const tr = $('tr'); tr.append($('th', { text: f })); + (it.columnas || []).forEach(c => { + const cid = `${id}__${fk}__${c.k}`; + const lbl = `${it.txt ? String(it.txt).replace(/<[^>]+>/g, '') + ' · ' : ''}${f} · ${String(c.txt).replace(/<[^>]+>/g, '')}`; + const td = $('td'); + if (c.opciones) { + const sel = $('select', { 'data-id': cid, 'data-lbl': lbl }); + sel.append($('option', { value: '', text: '—' })); + c.opciones.forEach(o => sel.append($('option', { value: o, text: o }))); + td.append(sel); + } else { + td.append($('input', { type: 'text', inputmode: c.num ? 'decimal' : 'text', 'data-id': cid, 'data-lbl': lbl, + placeholder: c.ph || '', style: c.ancho ? `width:${c.ancho}` : '' })); + } + tr.append(td); + }); + tbody.append(tr); + }); + t.append(tbody); scroll.append(t); box.append(scroll); } else if (it.tipo === 'fecha') { box.append($('label', { html: it.txt })); const hoy = new Date(); hoy.setMinutes(hoy.getMinutes() - hoy.getTimezoneOffset()); diff --git a/docs/formularios/prueba-bateria.html b/docs/formularios/prueba-bateria.html new file mode 100644 index 0000000..a4eb081 --- /dev/null +++ b/docs/formularios/prueba-bateria.html @@ -0,0 +1,121 @@ + + + + + +Prueba de banco — módem 4G en batería + + + +
+ + + + + + diff --git a/docs/procedimientos/prueba-bateria-modem.md b/docs/procedimientos/prueba-bateria-modem.md index 2104f08..1be9745 100644 --- a/docs/procedimientos/prueba-bateria-modem.md +++ b/docs/procedimientos/prueba-bateria-modem.md @@ -1,6 +1,6 @@ # Prueba de banco — módem 4G en modo batería (fw 0.5.3) -**Versión:** 1.0 · 26-sep-2026 · **Para:** laboratorio QRO · **Dura:** ~45 min por unidad · **Registro:** [acta de banco](../formularios/banco.html) de la unidad, con la captura de consola adjunta. +**Versión:** 1.0 · 26-sep-2026 · **Para:** laboratorio QRO · **Dura:** ~45 min por unidad · **Registro:** [**▶ acta de esta prueba**](../formularios/prueba-bateria.html) — trae las tres tablas para llenar en el teléfono o la laptop, y ahí se adjunta la captura de consola. ## Qué se está buscando @@ -86,7 +86,11 @@ Si la corrida 0 no sale limpia, **detenerse**: el problema no es la batería. - **Falla igual** → el problema es la **etapa de boost** (LTC4040 / capacitancia en MAIN5V). Es hardware; no cambiar nada, reportar las lecturas. -## Tabla de registro (una por corrida) +## Registro + +Todo se llena en el **[acta de la prueba](../formularios/prueba-bateria.html)**: configuración, corrida 0, la tabla de +2 minutos de cada despertar (una por corrida), el resultado A/B y el archivo completo de la consola. Queda en el +expediente de la unidad. Si no hay señal en el laboratorio, la misma tabla en papel y se captura después: | t | MAIN5V (mín) | SW_5V (mín) | LEDs módem | LEDs UART simpleRTK2B | K1 | `vbat` / `vbatmin` | ¿Servidor recibió? | |---|---|---|---|---|---|---|---| @@ -97,10 +101,6 @@ Si la corrida 0 no sale limpia, **detenerse**: el problema no es la batería. | 1:30 | | | | | | | | | 2:00 | | | | | | | | -Al terminar: guardar el archivo de la consola completo, registrar el **acta de banco** de la unidad con el archivo -adjunto y las tres tablas en el campo de observaciones (o una foto de la hoja), y avisar a ingeniería con el -resultado de la corrida 2 (**A** o **B**). - !!! danger "Lo que NO se hace" No cambiar el firmware, no mover puentes (JP2/JP3/JP4), no tocar el trimmer del SD-15B. La prueba sirve porque la unidad está **como en campo**. Y nunca conectar la fuente de banco a la batería con la batería puesta. diff --git a/mkdocs.yml b/mkdocs.yml index da814d8..6228a33 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -52,6 +52,7 @@ nav: - "▶ Acta de diagnóstico en banco": formularios/banco.html - "⚡ Reflasheo de unidades": procedimientos/reflasheo-unidades.md - "🔋 Prueba: módem 4G en batería (0.5.3)": procedimientos/prueba-bateria-modem.md + - "▶ Acta: prueba de módem en batería": formularios/prueba-bateria.html - "▶ Acta de reflasheo y configuración": formularios/reflasheo.html - "🏭 Producción — lote v5":