feat: implementar jornadas y validar aliases

This commit is contained in:
mono
2026-10-25 17:20:48 -05:00
parent 89390b5bed
commit 4ffce3e3cd
27 changed files with 537 additions and 29 deletions

View File

@@ -0,0 +1,27 @@
import { describe, it, expect } from 'vitest';
import { puedeAbrirJornada, puedeCerrarJornada, validarApertura, calcularSaldoJornada } from '../rules/jornadaRules';
describe('jornadaRules', () => {
it('no permite abrir si ya hay jornada abierta', () => {
expect(puedeAbrirJornada(1)).toBe(false);
});
it('permite abrir si no hay jornada abierta', () => {
expect(puedeAbrirJornada(0)).toBe(true);
});
it('permite cerrar solo si está abierta', () => {
expect(puedeCerrarJornada('ABIERTA')).toBe(true);
expect(puedeCerrarJornada('CERRADA')).toBe(false);
});
it('valida apertura requiere responsables y base >=0', () => {
expect(validarApertura([], 100)).toBe('Debe haber al menos un responsable');
expect(validarApertura(['Ana'], -1)).toBe('Base inicial no puede ser negativa');
expect(validarApertura(['Ana'], 0)).toBe(null);
});
it('calcula saldo de jornada', () => {
expect(calcularSaldoJornada(100000, 500000, 50000)).toBe(550000);
});
});

View File

@@ -0,0 +1,19 @@
export type EstadoJornada = 'ABIERTA' | 'CERRADA';
export interface JornadaToldo {
id: string;
fecha: Date;
estado: EstadoJornada;
responsables: string[];
baseInicial: number;
fechaApertura: Date;
fechaCierre?: Date;
inventarioInicialIds?: string[];
inventarioFinalIds?: string[];
ventaIds: string[];
gastoIds: string[];
ajusteIds: string[];
cuadreId?: string;
createdAt: Date;
updatedAt?: Date;
}

View File

@@ -5,3 +5,4 @@ export * from './Venta';
export * from './Gasto';
export * from './Ajuste';
export * from './CuadreCaja';
export * from './JornadaToldo';

View File

@@ -1,2 +1,4 @@
export * from './entities';
export * from './rules/cuadreRules';
export * from './rules/jornadaRules';
export * from './entities/JornadaToldo';

View File

@@ -0,0 +1,21 @@
export function puedeAbrirJornada(jornadasAbiertas: number): boolean {
return jornadasAbiertas === 0;
}
export function puedeCerrarJornada(estado: string): boolean {
return estado === 'ABIERTA';
}
export function validarApertura(responsables: string[], baseInicial: number): string | null {
if (!responsables || responsables.length === 0) return 'Debe haber al menos un responsable';
if (baseInicial < 0) return 'Base inicial no puede ser negativa';
return null;
}
export function calcularSaldoJornada(
baseInicial: number,
totalVentas: number,
totalGastos: number
): number {
return baseInicial + totalVentas - totalGastos;
}