From 67fbcdcfbfbcb9a541dc0916081d622995923018 Mon Sep 17 00:00:00 2001 From: George Date: Tue, 20 Oct 2026 16:57:46 -0500 Subject: [PATCH] =?UTF-8?q?feat(tagumedica):=20el=20par=C3=A1metro=20Papel?= =?UTF-8?q?=20de=20las=20etiquetas=20se=20muestra=20como=20Carta=20y=20no?= =?UTF-8?q?=20se=20puede=20cambiar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- CLAUDE.md | 2 +- apps/api/src/htmlreports/etiquetas-bultos.spec.ts | 9 ++++++--- apps/api/src/htmlreports/etiquetas-bultos.ts | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index a4773c3..1775938 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -64,7 +64,7 @@ Menú **Reportes HTML** (`/reportes-html/ejecutar`): reportes que cada cliente d ## TAGUMEDICA: etiquetas de bultos (solo en `cliente/tagumedica`) -Primer reporte HTML del cliente (`/reportes-html/ejecutar` → «Etiquetas de bultos»), migrado de `mini-erp` (`templates/reports/stickers.html`, Jinja2 + WeasyPrint): plantilla `apps/api/templates/tagumedica/etiquetas-bultos.njk` (la misma, con `line-height: 1.2` y la fuente Orbitron incrustada con `asset()`), definición en `htmlreports/etiquetas-bultos.ts` y consulta `delivery-labels` (HANA: `ODLN`/`DLN12`/`OCST`, reducida a los 4 datos que usa la plantilla: cliente, dirección, lugar —departamento, provincia y distrito— y documento: el `NumAtCard` o el folio). **Parámetros:** la entrega (ventana de selección de documentos, valor = `DocEntry`) y la cantidad de etiquetas (entero de 1 a 500). **El papel es siempre Carta precortado** (no hay parámetro de papel): los márgenes de la plantilla (`1.6cm 1.5cm 1.8cm 2.7cm`) y la rejilla están ajustados a los recortes de la hoja, así que no se tocan sin probar con papel; la salida buena es el **PDF** (botón «Generar PDF»), que se imprime en **«Tamaño real / 100 %»**. Sale en hojas horizontales de 4 etiquetas (2 × 2) numeradas `1/6`… Verificado con la entrega 144153 contra `SBO_TAGUMEDICA_21` (consulta + plantilla + `HtmlPdfService`: PDF de 2 páginas Carta de 792 × 612 pt en 0,6 s; la primera etiqueta cae a 76,5 pt del borde izquierdo y 45,4 pt del superior, más el relleno). La vista HTML lleva los mismos márgenes en pantalla (`@media screen`). Los usuarios necesitan el permiso de menú `/reportes-html/*` (o `/reportes-html/ejecutar`). Pendiente: ofrecerlo también en el botón PDF de Entregas. +Primer reporte HTML del cliente (`/reportes-html/ejecutar` → «Etiquetas de bultos»), migrado de `mini-erp` (`templates/reports/stickers.html`, Jinja2 + WeasyPrint): plantilla `apps/api/templates/tagumedica/etiquetas-bultos.njk` (la misma, con `line-height: 1.2` y la fuente Orbitron incrustada con `asset()`), definición en `htmlreports/etiquetas-bultos.ts` y consulta `delivery-labels` (HANA: `ODLN`/`DLN12`/`OCST`, reducida a los 4 datos que usa la plantilla: cliente, dirección, lugar —departamento, provincia y distrito— y documento: el `NumAtCard` o el folio). **Parámetros:** la entrega (ventana de selección de documentos, valor = `DocEntry`) y la cantidad de etiquetas (entero de 1 a 500). **El papel es siempre Carta precortado**: el parámetro «Papel» se muestra con «Carta» pero es de solo lectura (`readOnly`, el servidor ignora lo que llegue): los márgenes de la plantilla (`1.6cm 1.5cm 1.8cm 2.7cm`) y la rejilla están ajustados a los recortes de la hoja, así que no se tocan sin probar con papel; la salida buena es el **PDF** (botón «Generar PDF»), que se imprime en **«Tamaño real / 100 %»**. Sale en hojas horizontales de 4 etiquetas (2 × 2) numeradas `1/6`… Verificado con la entrega 144153 contra `SBO_TAGUMEDICA_21` (consulta + plantilla + `HtmlPdfService`: PDF de 2 páginas Carta de 792 × 612 pt en 0,6 s; la primera etiqueta cae a 76,5 pt del borde izquierdo y 45,4 pt del superior, más el relleno). La vista HTML lleva los mismos márgenes en pantalla (`@media screen`). Los usuarios necesitan el permiso de menú `/reportes-html/*` (o `/reportes-html/ejecutar`). Pendiente: ofrecerlo también en el botón PDF de Entregas. ## Ver el nombre del campo de SAP («Campos») diff --git a/apps/api/src/htmlreports/etiquetas-bultos.spec.ts b/apps/api/src/htmlreports/etiquetas-bultos.spec.ts index 463be68..3f39006 100644 --- a/apps/api/src/htmlreports/etiquetas-bultos.spec.ts +++ b/apps/api/src/htmlreports/etiquetas-bultos.spec.ts @@ -13,11 +13,14 @@ const html = (n: number) => render(ETIQUETAS_BULTOS.template, labelsData(ROW, n) const count = (s: string, re: RegExp) => (s.match(re) ?? []).length; describe('etiquetas de bultos', () => { - it('está registrado con la entrega y la cantidad como parámetros (el papel es siempre Carta precortado)', () => { + it('pide la entrega y la cantidad; el papel se muestra como Carta (precortado) pero no se puede cambiar', () => { expect(HTML_REPORTS.get('etiquetas-bultos')).toBe(ETIQUETAS_BULTOS); - expect(ETIQUETAS_BULTOS.params.map((p) => [p.name, p.kind, p.required])).toEqual([['docEntry', 'lookup', true], ['cantidad', 'number', true]]); + expect(ETIQUETAS_BULTOS.params.map((p) => [p.name, p.kind, p.required])).toEqual([['docEntry', 'lookup', true], ['cantidad', 'number', true], ['papel', 'select', true]]); expect(ETIQUETAS_BULTOS.params[0].lookup).toBe('doc:DeliveryNotes'); - expect(parseHtmlValues(ETIQUETAS_BULTOS, { docEntry: '144153', cantidad: '6' })).toEqual({ docEntry: '144153', cantidad: '6' }); + expect(ETIQUETAS_BULTOS.params[2]).toMatchObject({ defaultValue: 'Carta', readOnly: true }); + expect(parseHtmlValues(ETIQUETAS_BULTOS, { docEntry: '144153', cantidad: '6' })).toEqual({ docEntry: '144153', cantidad: '6', papel: 'Carta' }); + // aunque el cliente mande otro papel, el servidor usa Carta + expect(parseHtmlValues(ETIQUETAS_BULTOS, { docEntry: '144153', cantidad: '6', papel: 'A4' })).toMatchObject({ papel: 'Carta' }); }); it('reparte las etiquetas de a 4 por hoja y las numera 1/6… 6/6', () => { diff --git a/apps/api/src/htmlreports/etiquetas-bultos.ts b/apps/api/src/htmlreports/etiquetas-bultos.ts index 7a1930c..4bdca46 100644 --- a/apps/api/src/htmlreports/etiquetas-bultos.ts +++ b/apps/api/src/htmlreports/etiquetas-bultos.ts @@ -46,6 +46,8 @@ export const ETIQUETAS_BULTOS: HtmlReportDef = { params: [ param({ name: 'docEntry', label: 'Entrega', kind: 'lookup', required: true, lookup: 'doc:DeliveryNotes', type: 'xsd:decimal' }), param({ name: 'cantidad', label: 'Cantidad de etiquetas', kind: 'number', required: true, type: 'xsd:decimal' }), + // el papel es siempre Carta precortado: se muestra pero no se edita + param({ name: 'papel', label: 'Papel', kind: 'select', required: true, defaultValue: 'Carta', readOnly: true, options: [{ value: 'Carta', label: 'Carta' }] }), ], async data(values, ctx) { const quantity = Number(values['cantidad']);