From d926519f1b74e39320b326ca19a7f779fc06e6df Mon Sep 17 00:00:00 2001 From: George Date: Wed, 14 Oct 2026 16:09:41 -0500 Subject: [PATCH] =?UTF-8?q?feat(web):=20referencia=20y=20RUT=20en=20las=20?= =?UTF-8?q?listas=20de=20ofertas=20y=20=C3=B3rdenes=20de=20venta=20y=20de?= =?UTF-8?q?=20compra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../documents/compras/compras.screens.ts | 6 +++--- .../documents/document-screens.spec.ts | 18 +++++++++++++++++- .../src/app/features/documents/screen-kit.ts | 9 +++++++-- .../documents/ventas/ventas.screens.ts | 6 +++--- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/apps/web/src/app/features/documents/compras/compras.screens.ts b/apps/web/src/app/features/documents/compras/compras.screens.ts index 78959fc..04b93d0 100644 --- a/apps/web/src/app/features/documents/compras/compras.screens.ts +++ b/apps/web/src/app/features/documents/compras/compras.screens.ts @@ -1,4 +1,4 @@ -import { TAX_DOCUMENT, type DocumentScreen, docDate, docNum, invoiceColumns, marketing, statusColumn, statusFilter, dateFilter } from '../screen-kit'; +import { TAX_DOCUMENT, type DocumentScreen, docDate, docNum, invoiceColumns, marketing, referenceColumns, statusColumn, statusFilter, dateFilter } from '../screen-kit'; import { purchaseRequestLayout } from './compras.layouts'; /** Compras: solicitudes de compra y documentos de proveedor. */ @@ -19,8 +19,8 @@ export const COMPRAS_SCREENS: readonly DocumentScreen[] = [ ], filters: [statusFilter, dateFilter], }, - marketing('/compras/ofertas', 'PurchaseQuotations', 'Nueva oferta', 'Proveedor'), - marketing('/compras/ordenes', 'PurchaseOrders', 'Nueva orden', 'Proveedor'), + marketing('/compras/ofertas', 'PurchaseQuotations', 'Nueva oferta', 'Proveedor', { columns: referenceColumns }), + marketing('/compras/ordenes', 'PurchaseOrders', 'Nueva orden', 'Proveedor', { columns: referenceColumns }), marketing('/compras/recepcion', 'PurchaseDeliveryNotes', 'Nueva recepción', 'Proveedor', TAX_DOCUMENT), marketing('/compras/facturas', 'PurchaseInvoices', 'Nueva factura', 'Proveedor', { ...TAX_DOCUMENT, columns: invoiceColumns }), marketing('/compras/devoluciones', 'PurchaseReturns', 'Nueva devolución', 'Proveedor'), diff --git a/apps/web/src/app/features/documents/document-screens.spec.ts b/apps/web/src/app/features/documents/document-screens.spec.ts index a46980b..eb3047f 100644 --- a/apps/web/src/app/features/documents/document-screens.spec.ts +++ b/apps/web/src/app/features/documents/document-screens.spec.ts @@ -47,7 +47,7 @@ describe('DOCUMENT_SCREENS', () => { it('las columnas con texto calculado (estado, total) no son buscables', () => { const orders = DOCUMENT_SCREENS.find((s) => s.resource === 'Orders')!; - expect(orders.columns.filter((c) => isSearchable(c)).map((c) => c.key)).toEqual(['DocNum', 'CardCode', 'CardName']); + expect(orders.columns.filter((c) => isSearchable(c)).map((c) => c.key)).toEqual(['DocNum', 'NumAtCard', 'FederalTaxID', 'CardCode', 'CardName']); }); }); @@ -102,3 +102,19 @@ describe('columnas de las facturas', () => { expect(col.format!({ FolioNumber: 198837 })).toBe('198837'); }); }); + +describe('referencia y RUT en las listas de ofertas y órdenes', () => { + const keys = (r: string) => DOCUMENT_SCREENS.find((s) => s.resource === r)!.columns.map((c) => c.key); + + it('las ofertas y órdenes de venta y de compra los muestran, sin folio', () => { + for (const r of ['Quotations', 'Orders', 'PurchaseQuotations', 'PurchaseOrders']) { + expect(keys(r), r).toEqual(expect.arrayContaining(['NumAtCard', 'FederalTaxID'])); + expect(keys(r), r).not.toContain('FolioNumber'); + } + }); + + it('las facturas conservan sus columnas y las entregas no cambian', () => { + expect(keys('Invoices')).toEqual(expect.arrayContaining(['FolioPrefixString', 'FolioNumber', 'NumAtCard', 'FederalTaxID'])); + expect(keys('DeliveryNotes')).not.toContain('NumAtCard'); + }); +}); diff --git a/apps/web/src/app/features/documents/screen-kit.ts b/apps/web/src/app/features/documents/screen-kit.ts index 8fe2692..43abfa7 100644 --- a/apps/web/src/app/features/documents/screen-kit.ts +++ b/apps/web/src/app/features/documents/screen-kit.ts @@ -70,6 +70,12 @@ export const docNum: ListColumn = { searchable: true, format: (r) => String(r['DocNum'] ?? ''), }; +/** Referencia del documento y RUT del socio (ofertas y órdenes). */ +export const referenceColumns: readonly ListColumn[] = [ + { key: 'NumAtCard', title: 'Nº referencia', width: '130px', searchable: true }, + { key: 'FederalTaxID', title: 'RUT', width: '110px', mono: true, searchable: true }, +]; + /** Facturas: folio tributario (en el Service Layer `FolioPrefixString` y `FolioNumber`), referencia y RUT. */ export const invoiceColumns: readonly ListColumn[] = [ { key: 'FolioPrefixString', title: 'Folio pref.', width: '90px', mono: true, searchable: true }, @@ -83,8 +89,7 @@ export const invoiceColumns: readonly ListColumn[] = [ searchable: true, format: (r) => String(r['FolioNumber'] ?? ''), }, - { key: 'NumAtCard', title: 'Nº referencia', width: '130px', searchable: true }, - { key: 'FederalTaxID', title: 'RUT', width: '110px', mono: true, searchable: true }, + ...referenceColumns, ]; export const docDate: ListColumn = { key: 'DocDate', title: 'Fecha contab.', type: 'date', align: 'center', width: '115px' }; diff --git a/apps/web/src/app/features/documents/ventas/ventas.screens.ts b/apps/web/src/app/features/documents/ventas/ventas.screens.ts index 4d01146..7788e02 100644 --- a/apps/web/src/app/features/documents/ventas/ventas.screens.ts +++ b/apps/web/src/app/features/documents/ventas/ventas.screens.ts @@ -1,11 +1,11 @@ -import { TAX_DOCUMENT, type DocumentScreen, invoiceColumns, marketing } from '../screen-kit'; +import { TAX_DOCUMENT, type DocumentScreen, invoiceColumns, marketing, referenceColumns } from '../screen-kit'; /** Ventas: ofertas, órdenes, entregas, facturas, devoluciones y notas de crédito de cliente. */ export const VENTAS_SCREENS: readonly DocumentScreen[] = [ ] = [ // Ventas - marketing('/ventas/ofertas', 'Quotations', 'Nueva oferta', 'Cliente'), - marketing('/ventas/ordenes', 'Orders', 'Nueva orden', 'Cliente'), + marketing('/ventas/ofertas', 'Quotations', 'Nueva oferta', 'Cliente', { columns: referenceColumns }), + marketing('/ventas/ordenes', 'Orders', 'Nueva orden', 'Cliente', { columns: referenceColumns }), marketing('/ventas/entrega', 'DeliveryNotes', 'Nueva entrega', 'Cliente', TAX_DOCUMENT), marketing('/ventas/facturas', 'Invoices', 'Nueva factura', 'Cliente', { ...TAX_DOCUMENT, columns: invoiceColumns }), marketing('/ventas/devoluciones', 'Returns', 'Nueva devolución', 'Cliente'),