From 4b35aa6bfdcb36d8462d5fd0128eb88b4102819c Mon Sep 17 00:00:00 2001 From: George Date: Wed, 14 Oct 2026 11:06:58 -0500 Subject: [PATCH] =?UTF-8?q?fix(web):=20el=20precio=20de=20una=20l=C3=ADnea?= =?UTF-8?q?=20nueva=20queda=20vac=C3=ADo=20para=20que=20SAP=20aplique=20la?= =?UTF-8?q?=20lista=20de=20precios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Probado contra SBODemoCL: crear y actualizar órdenes de venta y de compra, reemplazo de líneas y 412 por conflicto. Co-Authored-By: Claude Sonnet 5.5 --- CLAUDE.md | 4 ++-- apps/web/src/app/features/documents/document-model.spec.ts | 6 ++++++ apps/web/src/app/features/documents/line-columns.spec.ts | 2 +- apps/web/src/app/features/documents/line-columns.ts | 7 +++++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d8c24ff..56d140a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,7 +48,7 @@ Cada menú abre primero una **lista de los últimos documentos** (barra de filtr - Probar contra el SAP real con la extensión de Chrome (`list_connected_browsers` debe mostrar un navegador). Si no conecta, usar Chrome headless por CDP. - **No escribir contraseñas en formularios**: obtener el token con `curl` a `/api/auth/login` (la clave de prueba se lee de `EmployeesInfo` solo para eso, nunca se imprime ni se guarda) e inyectar solo el token en `localStorage` (`erp_session`). - Al terminar: cerrar la sesión de prueba (`POST /api/auth/logout`), borrar `erp_session`/`erp_theme` del navegador, cerrar la pestaña, apagar los servidores y borrar archivos temporales (token, `apps/api/data/`). No dejar páginas de demostración fuera de `/dev/componentes`. -- **Escrituras a SAP (POST/PATCH):** hasta ahora solo se probaron contra un SAP simulado. Pedir autorización al usuario antes de crear o modificar datos reales, aunque sea la base demo. +- **Escrituras a SAP (POST/PATCH):** el usuario autorizó (2026-10-14) escribir en `SBODemoCL`, su ambiente propio de pruebas; ya se probaron crear/actualizar órdenes de venta y de compra, reemplazo de líneas y el 412 por conflicto. Documentos de prueba creados: orden de venta 315 y orden de compra 2883 (comentario "PRUEBA basic-erp"). Aun así, avisar antes de escribir en cualquier otra base. - Los tests no detectan todo: el foco tras crear una línea (se pedía antes de que existiera la fila) solo falló en el navegador real. ## Estado y próximos pasos @@ -56,7 +56,7 @@ Cada menú abre primero una **lista de los últimos documentos** (barra de filtr Hecho (commits en `main`): monorepo · API (config, capa SAP con sesión compartida y cola, login, permisos SQLite, proxy `/api/sl`) · web (temas, login, layout con menú por permisos, `sbo-value-help`, campos y filas compuestas, listas con filtros, ventana/toolbar/pestañas/menús, grilla de líneas, `/dev/componentes`). Pendiente, en orden: -1. **Paso 9 — formulario de documentos:** hecho para ventas y compras (`document-form.page`, `document-model.ts`: cargar, crear, actualizar con `If-Match`/412, navegación, totales con `SalesTaxCodes` (también en compras), solo lectura), probado solo con SAP simulado y **sin verlo aún en el navegador**. Falta: probar escrituras reales (pedir autorización), "Copiar de/a", botón PDF, fila del flete, toolbar de ancho completo, formularios de inventario y solicitudes de compra. +1. **Paso 9 — formulario de documentos:** hecho para ventas y compras (`document-form.page`, `document-model.ts`: cargar, crear, actualizar con `If-Match`/412, navegación, totales con `SalesTaxCodes` (también en compras), solo lectura), probado con SAP simulado y contra `SBODemoCL` (leer, crear, actualizar, líneas, 412). Falta: resolver al salir del campo el nombre del socio y la descripción del artículo cuando se escriben a mano (hoy SAP los completa al guardar), "Copiar de/a", botón PDF, fila del flete, toolbar de ancho completo, formularios de inventario y solicitudes de compra. 2. Pantallas de maestros (`Items`, `BusinessPartners`: Clientes/Proveedores, Artículos), hoy "no disponible". 3. ~~Pantalla web de permisos~~ — hecha (`/admin/permisos`). 4. Auditoría (`audit_log` en SQLite; hoy solo líneas `AUDIT` en el log) y `nestjs-cls` para el usuario en los logs. diff --git a/apps/web/src/app/features/documents/document-model.spec.ts b/apps/web/src/app/features/documents/document-model.spec.ts index 8dffe30..cfa5281 100644 --- a/apps/web/src/app/features/documents/document-model.spec.ts +++ b/apps/web/src/app/features/documents/document-model.spec.ts @@ -1,4 +1,5 @@ import { describe, expect, it } from 'vitest'; +import { newDocumentLine } from './line-columns'; import { computeTotals, createPayload, @@ -85,6 +86,11 @@ describe('createPayload', () => { }); }); + it('un precio sin escribir no se envía: SAP aplica la lista de precios', () => { + const body = createPayload({ CardCode: 'C1' }, [{ ...newDocumentLine(), ItemCode: 'A1' }]); + expect(body['DocumentLines']).toEqual([{ ItemCode: 'A1', Quantity: 1, DiscountPercent: 0 }]); + }); + it('isBlankLine', () => { expect(isBlankLine({ ItemCode: '' })).toBe(true); expect(isBlankLine({ ItemCode: 'A1' })).toBe(false); diff --git a/apps/web/src/app/features/documents/line-columns.spec.ts b/apps/web/src/app/features/documents/line-columns.spec.ts index e72de99..9fa1336 100644 --- a/apps/web/src/app/features/documents/line-columns.spec.ts +++ b/apps/web/src/app/features/documents/line-columns.spec.ts @@ -52,7 +52,7 @@ describe('columnas estándar de línea', () => { describe('línea nueva y "catálogo completo"', () => { it('la línea nueva trae cantidad 1 y total 0', () => { - expect(newDocumentLine()).toMatchObject({ Quantity: 1, Price: 0, LineTotal: 0, ItemCode: '' }); + expect(newDocumentLine()).toMatchObject({ Quantity: 1, Price: null, LineTotal: 0, ItemCode: '' }); }); it('cada artículo elegido se convierte en una línea nueva', () => { diff --git a/apps/web/src/app/features/documents/line-columns.ts b/apps/web/src/app/features/documents/line-columns.ts index c6c13b1..aa41508 100644 --- a/apps/web/src/app/features/documents/line-columns.ts +++ b/apps/web/src/app/features/documents/line-columns.ts @@ -12,13 +12,16 @@ export function recalcLine(line: GridLine): GridLine { return { ...line, LineTotal: round2(total) }; } -/** Línea nueva con los valores por defecto de un documento. */ +/** + * Línea nueva con los valores por defecto de un documento. El precio queda vacío (no 0): si el + * usuario no lo escribe no se envía y SAP aplica la lista de precios del socio de negocio. + */ export const newDocumentLine = (): GridLine => ({ ItemCode: '', ItemDescription: '', Quantity: 1, WarehouseCode: '', - Price: 0, + Price: null, DiscountPercent: 0, TaxCode: '', LineTotal: 0,