feat: Implementación módulos Empresas, Plantas, Tipos y Estados Bobina

Backend API:
- Implementado CRUD completo para Empresas (DE001-DE004):
  - EmpresaRepository, EmpresaService, EmpresasController.
  - Lógica de creación/eliminación de saldos iniciales en EmpresaService.
  - Transacciones y registro en tablas _H.
  - Verificación de permisos específicos.
- Implementado CRUD completo para Plantas de Impresión (IP001-IP004):
  - PlantaRepository, PlantaService, PlantasController.
  - Transacciones y registro en tablas _H.
  - Verificación de permisos.
- Implementado CRUD completo para Tipos de Bobina (IB006-IB009):
  - TipoBobinaRepository, TipoBobinaService, TiposBobinaController.
  - Transacciones y registro en tablas _H.
  - Verificación de permisos.
- Implementado CRUD completo para Estados de Bobina (IB010-IB013):
  - EstadoBobinaRepository, EstadoBobinaService, EstadosBobinaController.
  - Transacciones y registro en tablas _H.
  - Verificación de permisos.

Frontend React:
- Módulo Empresas:
  - empresaService.ts para interactuar con la API.
  - EmpresaFormModal.tsx para crear/editar empresas.
  - GestionarEmpresasPage.tsx con tabla, filtro, paginación y menú de acciones.
  - Integración con el hook usePermissions para control de acceso.
- Módulo Plantas de Impresión:
  - plantaService.ts.
  - PlantaFormModal.tsx.
  - GestionarPlantasPage.tsx con tabla, filtro, paginación y acciones.
  - Integración con usePermissions.
- Módulo Tipos de Bobina:
  - tipoBobinaService.ts.
  - TipoBobinaFormModal.tsx.
  - GestionarTiposBobinaPage.tsx con tabla, filtro, paginación y acciones.
  - Integración con usePermissions.
- Módulo Estados de Bobina:
  - estadoBobinaService.ts.
  - EstadoBobinaFormModal.tsx.
  - GestionarEstadosBobinaPage.tsx con tabla, filtro, paginación y acciones.
  - Integración con usePermissions.
- Navegación:
  - Añadidas sub-pestañas y rutas para los nuevos módulos dentro de "Distribución" (Empresas) e "Impresión" (Plantas, Tipos Bobina, Estados Bobina).
  - Creado ImpresionIndexPage.tsx para la navegación interna del módulo de Impresión.

Correcciones:
- Corregido el uso de CommitAsync/RollbackAsync a Commit/Rollback síncronos en PlantaService.cs debido a que IDbTransaction no los soporta asíncronamente.
This commit is contained in:
2025-05-09 10:08:53 -03:00
parent 5c4b961073
commit daf84d2708
98 changed files with 6059 additions and 71 deletions

View File

@@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Empresas
{
public class CreateEmpresaDto
{
[Required(ErrorMessage = "El nombre de la empresa es obligatorio.")]
[StringLength(100)]
public string Nombre { get; set; } = string.Empty;
[StringLength(250)]
public string? Detalle { get; set; }
}
}

View File

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

View File

@@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Empresas
{
public class UpdateEmpresaDto
{
[Required(ErrorMessage = "El nombre de la empresa es obligatorio.")]
[StringLength(100)]
public string Nombre { get; set; } = string.Empty;
[StringLength(250)]
public string? Detalle { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Impresion
{
public class CreateEstadoBobinaDto
{
[Required(ErrorMessage = "La denominación del estado de bobina es obligatoria.")]
[StringLength(50, ErrorMessage = "La denominación no puede exceder los 50 caracteres.")]
public string Denominacion { get; set; } = string.Empty;
[StringLength(150, ErrorMessage = "La observación no puede exceder los 150 caracteres.")]
public string? Obs { get; set; } // Observación es opcional
}
}

View File

@@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Impresion
{
public class CreatePlantaDto
{
[Required(ErrorMessage = "El nombre de la planta es obligatorio.")]
[StringLength(50, ErrorMessage = "El nombre no puede exceder los 50 caracteres.")]
public string Nombre { get; set; } = string.Empty;
[Required(ErrorMessage = "El detalle de la planta es obligatorio.")] // Basado en que la tabla no permite NULL
[StringLength(200, ErrorMessage = "El detalle no puede exceder los 200 caracteres.")]
public string Detalle { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Impresion
{
public class CreateTipoBobinaDto
{
[Required(ErrorMessage = "La denominación del tipo de bobina es obligatoria.")]
[StringLength(150, ErrorMessage = "La denominación no puede exceder los 150 caracteres.")]
public string Denominacion { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,9 @@
namespace GestionIntegral.Api.Dtos.Impresion
{
public class EstadoBobinaDto
{
public int IdEstadoBobina { get; set; }
public string Denominacion { get; set; } = string.Empty;
public string? Obs { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace GestionIntegral.Api.Dtos.Impresion
{
public class PlantaDto
{
public int IdPlanta { get; set; }
public string Nombre { get; set; } = string.Empty;
public string Detalle { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,8 @@
namespace GestionIntegral.Api.Dtos.Impresion
{
public class TipoBobinaDto
{
public int IdTipoBobina { get; set; }
public string Denominacion { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Impresion
{
public class UpdateEstadoBobinaDto
{
[Required(ErrorMessage = "La denominación del estado de bobina es obligatoria.")]
[StringLength(50, ErrorMessage = "La denominación no puede exceder los 50 caracteres.")]
public string Denominacion { get; set; } = string.Empty;
[StringLength(150, ErrorMessage = "La observación no puede exceder los 150 caracteres.")]
public string? Obs { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Impresion
{
public class UpdatePlantaDto
{
[Required(ErrorMessage = "El nombre de la planta es obligatorio.")]
[StringLength(50, ErrorMessage = "El nombre no puede exceder los 50 caracteres.")]
public string Nombre { get; set; } = string.Empty;
[Required(ErrorMessage = "El detalle de la planta es obligatorio.")]
[StringLength(200, ErrorMessage = "El detalle no puede exceder los 200 caracteres.")]
public string Detalle { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Impresion
{
public class UpdateTipoBobinaDto
{
// El ID se pasa por la ruta, no en el body para PUT
[Required(ErrorMessage = "La denominación del tipo de bobina es obligatoria.")]
[StringLength(150, ErrorMessage = "La denominación no puede exceder los 150 caracteres.")]
public string Denominacion { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Zonas
{
public class CreateZonaDto
{
[Required(ErrorMessage = "El nombre de la zona es obligatorio.")]
[StringLength(50, ErrorMessage = "El nombre no puede exceder los 50 caracteres.")]
public string Nombre { get; set; } = string.Empty;
[StringLength(150, ErrorMessage = "La descripción no puede exceder los 150 caracteres.")]
public string? Descripcion { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations;
namespace GestionIntegral.Api.Dtos.Zonas
{
public class UpdateZonaDto
{
[Required(ErrorMessage = "El nombre de la zona es obligatorio.")]
[StringLength(50, ErrorMessage = "El nombre no puede exceder los 50 caracteres.")]
public string Nombre { get; set; } = string.Empty;
[StringLength(150, ErrorMessage = "La descripción no puede exceder los 150 caracteres.")]
public string? Descripcion { get; set; }
// No incluimos Estado aquí, ya que el borrado lógico es una operación separada (DELETE)
}
}

View File

@@ -0,0 +1,10 @@
namespace GestionIntegral.Api.Dtos.Zonas
{
public class ZonaDto
{
public int IdZona { get; set; }
public string Nombre { get; set; } = string.Empty;
public string? Descripcion { get; set; }
// No incluimos 'Estado' porque generalmente solo mostraremos las activas
}
}