feat: Implementación CRUD Canillitas, Distribuidores y Precios de Publicación

Backend API:
- Canillitas (`dist_dtCanillas`):
  - Implementado CRUD completo (Modelos, DTOs, Repositorio, Servicio, Controlador).
  - Lógica para manejo de `Accionista`, `Baja`, `FechaBaja`.
  - Auditoría en `dist_dtCanillas_H`.
  - Validación de legajo único y lógica de empresa vs accionista.
- Distribuidores (`dist_dtDistribuidores`):
  - Implementado CRUD completo (Modelos, DTOs, Repositorio, Servicio, Controlador).
  - Auditoría en `dist_dtDistribuidores_H`.
  - Creación de saldos iniciales para el nuevo distribuidor en todas las empresas.
  - Verificación de NroDoc único y Nombre opcionalmente único.
- Precios de Publicación (`dist_Precios`):
  - Implementado CRUD básico (Modelos, DTOs, Repositorio, Servicio, Controlador).
  - Endpoints anidados bajo `/publicaciones/{idPublicacion}/precios`.
  - Lógica de negocio para cerrar período de precio anterior al crear uno nuevo.
  - Lógica de negocio para reabrir período de precio anterior al eliminar el último.
  - Auditoría en `dist_Precios_H`.
- Auditoría en Eliminación de Publicaciones:
  - Extendido `PublicacionService.EliminarAsync` para eliminar en cascada registros de precios, recargos, porcentajes de pago (distribuidores y canillitas) y secciones de publicación.
  - Repositorios correspondientes (`PrecioRepository`, `RecargoZonaRepository`, `PorcPagoRepository`, `PorcMonCanillaRepository`, `PubliSeccionRepository`) actualizados con métodos `DeleteByPublicacionIdAsync` que registran en sus respectivas tablas `_H` (si existen y se implementó la lógica).
  - Asegurada la correcta propagación del `idUsuario` para la auditoría en cascada.
- Correcciones de Nulabilidad:
  - Ajustados los métodos `MapToDto` y su uso en `CanillaService` y `PublicacionService` para manejar correctamente tipos anulables.

Frontend React:
- Canillitas:
  - `canillaService.ts`.
  - `CanillaFormModal.tsx` con selectores para Zona y Empresa, y lógica de Accionista.
  - `GestionarCanillitasPage.tsx` con filtros, paginación, y acciones (editar, toggle baja).
- Distribuidores:
  - `distribuidorService.ts`.
  - `DistribuidorFormModal.tsx` con múltiples campos y selector de Zona.
  - `GestionarDistribuidoresPage.tsx` con filtros, paginación, y acciones (editar, eliminar).
- Precios de Publicación:
  - `precioService.ts`.
  - `PrecioFormModal.tsx` para crear/editar períodos de precios (VigenciaD, VigenciaH opcional, precios por día).
  - `GestionarPreciosPublicacionPage.tsx` accesible desde la gestión de publicaciones, para listar y gestionar los períodos de precios de una publicación específica.
- Layout:
  - Reemplazado el uso de `Grid` por `Box` con Flexbox en `CanillaFormModal`, `GestionarCanillitasPage` (filtros), `DistribuidorFormModal` y `PrecioFormModal` para resolver problemas de tipos y mejorar la consistencia del layout de formularios.
- Navegación:
  - Actualizadas las rutas y pestañas para los nuevos módulos y sub-módulos.
This commit is contained in:
2025-05-20 12:38:55 -03:00
parent daf84d2708
commit b6ba52f074
228 changed files with 10745 additions and 178 deletions

View File

@@ -0,0 +1,14 @@
export interface CanillaDto {
idCanilla: number;
legajo?: number | null;
nomApe: string;
parada?: string | null;
idZona: number;
nombreZona: string;
accionista: boolean;
obs?: string | null;
empresa: number;
nombreEmpresa: string;
baja: boolean;
fechaBaja?: string | null; // string dd/MM/yyyy
}

View File

@@ -0,0 +1,9 @@
export interface CreateCanillaDto {
legajo?: number | null;
nomApe: string;
parada?: string | null;
idZona: number;
accionista: boolean;
obs?: string | null;
empresa: number;
}

View File

@@ -0,0 +1,13 @@
export interface CreateDistribuidorDto {
nombre: string;
contacto?: string | null;
nroDoc: string;
idZona?: number | null;
calle?: string | null;
numero?: string | null;
piso?: string | null;
depto?: string | null;
telefono?: string | null;
email?: string | null;
localidad?: string | null;
}

View File

@@ -0,0 +1,4 @@
export interface CreateOtroDestinoDto {
nombre: string;
obs?: string;
}

View File

@@ -0,0 +1,12 @@
export interface CreatePrecioDto {
idPublicacion: number; // Importante para la ruta y para el backend
vigenciaD: string; // "yyyy-MM-dd"
// VigenciaH no se envía al crear, se calcula en backend o se deja null
lunes?: number | null;
martes?: number | null;
miercoles?: number | null;
jueves?: number | null;
viernes?: number | null;
sabado?: number | null;
domingo?: number | null;
}

View File

@@ -0,0 +1,7 @@
export interface CreatePublicacionDto {
nombre: string;
observacion?: string | null;
idEmpresa: number;
ctrlDevoluciones: boolean;
habilitada: boolean;
}

View File

@@ -0,0 +1,15 @@
export interface DistribuidorDto {
idDistribuidor: number;
nombre: string;
contacto?: string | null;
nroDoc: string;
idZona?: number | null;
nombreZona?: string | null;
calle?: string | null;
numero?: string | null;
piso?: string | null;
depto?: string | null;
telefono?: string | null;
email?: string | null;
localidad?: string | null;
}

View File

@@ -0,0 +1,5 @@
export interface OtroDestinoDto {
idDestino: number;
nombre: string;
obs?: string;
}

View File

@@ -0,0 +1,13 @@
export interface PrecioDto {
idPrecio: number;
idPublicacion: number;
vigenciaD: string; // "yyyy-MM-dd"
vigenciaH?: string | null; // "yyyy-MM-dd"
lunes?: number | null;
martes?: number | null;
miercoles?: number | null;
jueves?: number | null;
viernes?: number | null;
sabado?: number | null;
domingo?: number | null;
}

View File

@@ -0,0 +1,9 @@
export interface PublicacionDto {
idPublicacion: number;
nombre: string;
observacion?: string | null;
idEmpresa: number;
nombreEmpresa: string;
ctrlDevoluciones: boolean;
habilitada: boolean;
}

View File

@@ -0,0 +1,3 @@
export interface ToggleBajaCanillaDto {
darDeBaja: boolean;
}

View File

@@ -0,0 +1,9 @@
export interface UpdateCanillaDto {
legajo?: number | null;
nomApe: string;
parada?: string | null;
idZona: number;
accionista: boolean;
obs?: string | null;
empresa: number;
}

View File

@@ -0,0 +1,13 @@
export interface UpdateDistribuidorDto {
nombre: string;
contacto?: string | null;
nroDoc: string;
idZona?: number | null;
calle?: string | null;
numero?: string | null;
piso?: string | null;
depto?: string | null;
telefono?: string | null;
email?: string | null;
localidad?: string | null;
}

View File

@@ -0,0 +1,4 @@
export interface UpdateOtroDestinoDto {
nombre: string;
obs?: string;
}

View File

@@ -0,0 +1,11 @@
// Para actualizar, principalmente se modifican los montos o se cierra un periodo con VigenciaH
export interface UpdatePrecioDto {
vigenciaH?: string | null; // "yyyy-MM-dd", para cerrar un periodo
lunes?: number | null;
martes?: number | null;
miercoles?: number | null;
jueves?: number | null;
viernes?: number | null;
sabado?: number | null;
domingo?: number | null;
}

View File

@@ -0,0 +1,7 @@
export interface UpdatePublicacionDto {
nombre: string;
observacion?: string | null;
idEmpresa: number;
ctrlDevoluciones: boolean;
habilitada: boolean;
}

View File

@@ -1,5 +0,0 @@
// src/models/dtos/LoginRequestDto.ts
export interface LoginRequestDto {
Username: string; // Coincide con las propiedades C#
Password: string;
}

View File

@@ -0,0 +1,3 @@
export interface ActualizarPermisosPerfilRequestDto {
permisosIds: number[];
}

View File

@@ -1,4 +1,3 @@
// src/models/dtos/ChangePasswordRequestDto.ts
export interface ChangePasswordRequestDto {
currentPassword: string;
newPassword: string;

View File

@@ -0,0 +1,4 @@
export interface CreatePerfilDto {
nombrePerfil: string;
descripcion?: string;
}

View File

@@ -0,0 +1,5 @@
export interface CreatePermisoDto {
modulo: string;
descPermiso: string;
codAcc: string;
}

View File

@@ -0,0 +1,11 @@
export interface CreateUsuarioRequestDto {
user: string;
password?: string; // Puede ser opcional si la clave se genera o se fuerza cambio
nombre: string;
apellido: string;
idPerfil: number;
habilitada?: boolean;
supAdmin?: boolean;
debeCambiarClave?: boolean;
verLog?: string;
}

View File

@@ -0,0 +1,4 @@
export interface LoginRequestDto {
Username: string;
Password: string;
}

View File

@@ -1,4 +1,3 @@
// src/models/dtos/LoginResponseDto.ts
export interface LoginResponseDto {
token: string;
userId: number;
@@ -6,5 +5,4 @@ export interface LoginResponseDto {
nombreCompleto: string;
esSuperAdmin: boolean;
debeCambiarClave: boolean;
// Añade otros campos si los definiste en el DTO C#
}

View File

@@ -0,0 +1,5 @@
export interface PerfilDto {
id: number;
nombrePerfil: string;
descripcion?: string;
}

View File

@@ -0,0 +1,7 @@
export interface PermisoAsignadoDto {
id: number;
modulo: string;
descPermiso: string;
codAcc: string;
asignado: boolean;
}

View File

@@ -0,0 +1,7 @@
export interface PermisoDto {
id: number;
modulo: string;
descPermiso: string;
codAcc: string;
asignado?: boolean;
}

View File

@@ -0,0 +1,4 @@
export interface SetPasswordRequestDto {
newPassword: string;
forceChangeOnNextLogin?: boolean;
}

View File

@@ -0,0 +1,4 @@
export interface UpdatePerfilDto {
nombrePerfil: string;
descripcion?: string;
}

View File

@@ -0,0 +1,5 @@
export interface UpdatePermisoDto {
modulo: string;
descPermiso: string;
codAcc: string;
}

View File

@@ -0,0 +1,9 @@
export interface UpdateUsuarioRequestDto {
nombre: string;
apellido: string;
idPerfil: number;
habilitada: boolean;
supAdmin: boolean;
debeCambiarClave: boolean;
verLog?: string;
}

View File

@@ -0,0 +1,12 @@
export interface UsuarioDto {
id: number;
user: string;
habilitada: boolean;
supAdmin: boolean;
nombre: string;
apellido: string;
idPerfil: number;
nombrePerfil: string;
debeCambiarClave: boolean;
verLog: string;
}