- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
This commit is contained in:
2025-05-07 13:41:18 -03:00
parent da7b544372
commit 5c4b961073
49 changed files with 2552 additions and 491 deletions

View File

@@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos
{
public class ChangePasswordRequestDto
{
[Required]
public string CurrentPassword { get; set; } = string.Empty;
[Required]
[StringLength(50, MinimumLength = 6)] // Validaciones
public string NewPassword { get; set; } = string.Empty;
[Required]
[Compare("NewPassword", ErrorMessage = "La nueva contraseña y la confirmación no coinciden.")] // Validación de confirmación
public string ConfirmNewPassword { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Contables
{
public class CreateTipoPagoDto
{
[Required(ErrorMessage = "El nombre del tipo de pago es obligatorio.")]
[StringLength(50, ErrorMessage = "El nombre no puede exceder los 50 caracteres.")]
public string Nombre { get; set; } = string.Empty;
[StringLength(150, ErrorMessage = "El detalle no puede exceder los 150 caracteres.")]
public string? Detalle { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace GestionIntegral.Api.Dtos.Contables
{
public class TipoPagoDto
{
public int IdTipoPago { get; set; }
public string Nombre { get; set; } = string.Empty;
public string? Detalle { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Contables
{
public class UpdateTipoPagoDto
{
[Required(ErrorMessage = "El nombre del tipo de pago es obligatorio.")]
[StringLength(50, ErrorMessage = "El nombre no puede exceder los 50 caracteres.")]
public string Nombre { get; set; } = string.Empty;
[StringLength(150, ErrorMessage = "El detalle no puede exceder los 150 caracteres.")]
public string? Detalle { get; set; }
}
}