refactor(web): el formulario base recibe de cada pantalla los campos de cabecera, pie y línea

Todas las pantallas declaran su DocumentLayout (catálogo FIELDS): ventas y compras dejan de tener la
cabecera escrita en el HTML; el folio solo lo llevan los documentos tributarios.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-14 15:10:40 -05:00
1 parent c734dcbd0a
commit 8b0b8afc87
9 files changed
+320 -257

No files matched your search

@@ -8,7 +8,7 @@ import {
navigationQuery,
taxRateMap,
updatePayload,
validateDocument,
validateLayout,
} from './document-model';
const line = (over: Record<string, unknown> = {}) => ({
@@ -52,15 +52,19 @@ describe('computeTotals', () => {
});
});
describe('validateDocument', () => {
describe('validateLayout', () => {
const header = { CardCode: 'C1', DocDate: '2026-01-05' };
const required = [
{ key: 'CardCode', label: 'el cliente' },
{ key: 'DocDate', label: 'la fecha de contabilización' },
];
it('documento correcto no tiene errores', () => {
expect(validateDocument(header, [line()], 'Cliente')).toEqual([]);
expect(validateLayout(header, [line()], required, [])).toEqual([]);
});
it('exige socio, fecha y al menos una línea con artículo', () => {
expect(validateDocument({}, [line({ ItemCode: '' })], 'Cliente')).toEqual([
it('exige los campos obligatorios y al menos una línea con artículo', () => {
expect(validateLayout({}, [line({ ItemCode: '' })], required, [])).toEqual([
'Indique el cliente.',
'Indique la fecha de contabilización.',
'Agregue al menos una línea con artículo.',
@@ -68,7 +72,7 @@ describe('validateDocument', () => {
});
it('exige cantidad mayor que cero (numerando solo las líneas reales)', () => {
expect(validateDocument(header, [line({ ItemCode: '' }), line({ Quantity: 0 })], 'Cliente')).toEqual([
expect(validateLayout(header, [line({ ItemCode: '' }), line({ Quantity: 0 })], required, [])).toEqual([
'Línea 1: la cantidad debe ser mayor que cero.',
]);
});