feat(web): cada documento de ventas y compras puede elegir sus columnas de línea y su cabecera

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-14 15:16:22 -05:00
1 parent c5368c7ad0
commit 1f212e2b30
5 files changed
+91 -14

No files matched your search

@@ -114,10 +114,31 @@ export const DOCUMENT_LINE_COLUMNS: readonly GridColumn[] = [
{ key: 'LineTotal', title: 'Total', type: 'number', decimals: 2, width: '110px', readonly: true },
];
const columnOf = (key: string): GridColumn => DOCUMENT_LINE_COLUMNS.find((c) => c.key === key)!;
/**
* Catálogo de columnas de línea: cada documento elige cuáles muestra (y en qué orden) en su pantalla.
* Sin elegir, lleva todas (`DOCUMENT_LINE_COLUMNS`).
*/
export const LINE_COLUMNS = {
item: columnOf('ItemCode'),
description: columnOf('ItemDescription'),
quantity: columnOf('Quantity'),
warehouse: columnOf('WarehouseCode'),
price: columnOf('Price'),
discount: columnOf('DiscountPercent'),
tax: columnOf('TaxCode'),
total: columnOf('LineTotal'),
} as const;
/** Campos de línea que se envían a SAP: los de las columnas editables (el total y lo calculado lo resuelve SAP). */
export const lineFieldsOf = (columns: readonly GridColumn[]): string[] =>
columns.filter((c) => !c.format && c.readonly !== true).map((c) => c.key);
/** Columnas de línea con el maestro de impuestos que corresponde (por defecto `SalesTaxCodes`). */
export function lineColumnsFor(taxResource: string): readonly GridColumn[] {
if (taxResource === 'SalesTaxCodes') return DOCUMENT_LINE_COLUMNS;
return DOCUMENT_LINE_COLUMNS.map((c) =>
export function lineColumnsFor(taxResource: string, columns: readonly GridColumn[] = DOCUMENT_LINE_COLUMNS): readonly GridColumn[] {
if (taxResource === 'SalesTaxCodes') return columns;
return columns.map((c) =>
c.key === 'TaxCode' && c.lookup
? { ...c, lookup: { ...c.lookup, config: { ...c.lookup.config, resource: taxResource } } }
: c,