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:
		
							
								
								
									
										46
									
								
								Frontend/src/services/empresaService.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Frontend/src/services/empresaService.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| import apiClient from './apiClient'; | ||||
| import type { EmpresaDto } from '../models/dtos/Empresas/EmpresaDto'; | ||||
| import type { CreateEmpresaDto } from '../models/dtos/Empresas/CreateEmpresaDto'; | ||||
| import type { UpdateEmpresaDto } from '../models/dtos/Empresas/UpdateEmpresaDto'; | ||||
|  | ||||
| const getAllEmpresas = async (nombreFilter?: string, detalleFilter?: string): Promise<EmpresaDto[]> => { | ||||
|     const params: Record<string, string> = {}; | ||||
|     if (nombreFilter) params.nombre = nombreFilter; | ||||
|     if (detalleFilter) params.detalle = detalleFilter; // Asegúrate que la API soporte esto | ||||
|  | ||||
|     // Llama a GET /api/empresas | ||||
|     const response = await apiClient.get<EmpresaDto[]>('/empresas', { params }); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const getEmpresaById = async (id: number): Promise<EmpresaDto> => { | ||||
|      // Llama a GET /api/empresas/{id} | ||||
|     const response = await apiClient.get<EmpresaDto>(`/empresas/${id}`); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const createEmpresa = async (data: CreateEmpresaDto): Promise<EmpresaDto> => { | ||||
|     // Llama a POST /api/empresas | ||||
|     const response = await apiClient.post<EmpresaDto>('/empresas', data); | ||||
|     return response.data; // La API devuelve el objeto creado (201 Created) | ||||
| }; | ||||
|  | ||||
| const updateEmpresa = async (id: number, data: UpdateEmpresaDto): Promise<void> => { | ||||
|     // Llama a PUT /api/empresas/{id} (204 No Content en éxito) | ||||
|     await apiClient.put(`/empresas/${id}`, data); | ||||
| }; | ||||
|  | ||||
| const deleteEmpresa = async (id: number): Promise<void> => { | ||||
|     // Llama a DELETE /api/empresas/{id} (204 No Content en éxito) | ||||
|     await apiClient.delete(`/empresas/${id}`); | ||||
| }; | ||||
|  | ||||
| const empresaService = { | ||||
|     getAllEmpresas, | ||||
|     getEmpresaById, | ||||
|     createEmpresa, | ||||
|     updateEmpresa, | ||||
|     deleteEmpresa, | ||||
| }; | ||||
|  | ||||
| export default empresaService; | ||||
							
								
								
									
										40
									
								
								Frontend/src/services/estadoBobinaService.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								Frontend/src/services/estadoBobinaService.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| import apiClient from './apiClient'; | ||||
| import type { EstadoBobinaDto } from '../models/dtos/Impresion/EstadoBobinaDto'; | ||||
| import type { CreateEstadoBobinaDto } from '../models/dtos/Impresion/CreateEstadoBobinaDto'; | ||||
| import type { UpdateEstadoBobinaDto } from '../models/dtos/Impresion/UpdateEstadoBobinaDto'; | ||||
|  | ||||
| const getAllEstadosBobina = async (denominacionFilter?: string): Promise<EstadoBobinaDto[]> => { | ||||
|     const params: Record<string, string> = {}; | ||||
|     if (denominacionFilter) params.denominacion = denominacionFilter; | ||||
|  | ||||
|     const response = await apiClient.get<EstadoBobinaDto[]>('/estadosbobina', { params }); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const getEstadoBobinaById = async (id: number): Promise<EstadoBobinaDto> => { | ||||
|     const response = await apiClient.get<EstadoBobinaDto>(`/estadosbobina/${id}`); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const createEstadoBobina = async (data: CreateEstadoBobinaDto): Promise<EstadoBobinaDto> => { | ||||
|     const response = await apiClient.post<EstadoBobinaDto>('/estadosbobina', data); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const updateEstadoBobina = async (id: number, data: UpdateEstadoBobinaDto): Promise<void> => { | ||||
|     await apiClient.put(`/estadosbobina/${id}`, data); | ||||
| }; | ||||
|  | ||||
| const deleteEstadoBobina = async (id: number): Promise<void> => { | ||||
|     await apiClient.delete(`/estadosbobina/${id}`); | ||||
| }; | ||||
|  | ||||
| const estadoBobinaService = { | ||||
|     getAllEstadosBobina, | ||||
|     getEstadoBobinaById, | ||||
|     createEstadoBobina, | ||||
|     updateEstadoBobina, | ||||
|     deleteEstadoBobina, | ||||
| }; | ||||
|  | ||||
| export default estadoBobinaService; | ||||
							
								
								
									
										46
									
								
								Frontend/src/services/plantaService.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Frontend/src/services/plantaService.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| import apiClient from './apiClient'; | ||||
| import type { PlantaDto } from '../models/dtos/Impresion/PlantaDto'; | ||||
| import type { CreatePlantaDto } from '../models/dtos/Impresion/CreatePlantaDto';  | ||||
| import type { UpdatePlantaDto } from '../models/dtos/Impresion/UpdatePlantaDto'; | ||||
|  | ||||
| const getAllPlantas = async (nombreFilter?: string, detalleFilter?: string): Promise<PlantaDto[]> => { | ||||
|     const params: Record<string, string> = {}; | ||||
|     if (nombreFilter) params.nombre = nombreFilter; | ||||
|     if (detalleFilter) params.detalle = detalleFilter; // La API debe soportar esto | ||||
|  | ||||
|     // Llama a GET /api/plantas | ||||
|     const response = await apiClient.get<PlantaDto[]>('/plantas', { params }); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const getPlantaById = async (id: number): Promise<PlantaDto> => { | ||||
|      // Llama a GET /api/plantas/{id} | ||||
|     const response = await apiClient.get<PlantaDto>(`/plantas/${id}`); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const createPlanta = async (data: CreatePlantaDto): Promise<PlantaDto> => { | ||||
|     // Llama a POST /api/plantas | ||||
|     const response = await apiClient.post<PlantaDto>('/plantas', data); | ||||
|     return response.data; // La API devuelve el objeto creado (201 Created) | ||||
| }; | ||||
|  | ||||
| const updatePlanta = async (id: number, data: UpdatePlantaDto): Promise<void> => { | ||||
|     // Llama a PUT /api/plantas/{id} (204 No Content en éxito) | ||||
|     await apiClient.put(`/plantas/${id}`, data); | ||||
| }; | ||||
|  | ||||
| const deletePlanta = async (id: number): Promise<void> => { | ||||
|     // Llama a DELETE /api/plantas/{id} (204 No Content en éxito) | ||||
|     await apiClient.delete(`/plantas/${id}`); | ||||
| }; | ||||
|  | ||||
| const plantaService = { | ||||
|     getAllPlantas, | ||||
|     getPlantaById, | ||||
|     createPlanta, | ||||
|     updatePlanta, | ||||
|     deletePlanta, | ||||
| }; | ||||
|  | ||||
| export default plantaService; | ||||
							
								
								
									
										45
									
								
								Frontend/src/services/tipoBobinaService.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								Frontend/src/services/tipoBobinaService.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| import apiClient from './apiClient'; | ||||
| import type { TipoBobinaDto } from '../models/dtos/Impresion/TipoBobinaDto'; | ||||
| import type { CreateTipoBobinaDto } from '../models/dtos/Impresion/CreateTipoBobinaDto'; | ||||
| import type { UpdateTipoBobinaDto } from '../models/dtos/Impresion/UpdateTipoBobinaDto'; | ||||
|  | ||||
| const getAllTiposBobina = async (denominacionFilter?: string): Promise<TipoBobinaDto[]> => { | ||||
|     const params: Record<string, string> = {}; | ||||
|     if (denominacionFilter) params.denominacion = denominacionFilter; | ||||
|  | ||||
|     // Llama a GET /api/tiposbobina | ||||
|     const response = await apiClient.get<TipoBobinaDto[]>('/tiposbobina', { params }); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const getTipoBobinaById = async (id: number): Promise<TipoBobinaDto> => { | ||||
|      // Llama a GET /api/tiposbobina/{id} | ||||
|     const response = await apiClient.get<TipoBobinaDto>(`/tiposbobina/${id}`); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const createTipoBobina = async (data: CreateTipoBobinaDto): Promise<TipoBobinaDto> => { | ||||
|     // Llama a POST /api/tiposbobina | ||||
|     const response = await apiClient.post<TipoBobinaDto>('/tiposbobina', data); | ||||
|     return response.data; // La API devuelve el objeto creado (201 Created) | ||||
| }; | ||||
|  | ||||
| const updateTipoBobina = async (id: number, data: UpdateTipoBobinaDto): Promise<void> => { | ||||
|     // Llama a PUT /api/tiposbobina/{id} (204 No Content en éxito) | ||||
|     await apiClient.put(`/tiposbobina/${id}`, data); | ||||
| }; | ||||
|  | ||||
| const deleteTipoBobina = async (id: number): Promise<void> => { | ||||
|     // Llama a DELETE /api/tiposbobina/{id} (204 No Content en éxito) | ||||
|     await apiClient.delete(`/tiposbobina/${id}`); | ||||
| }; | ||||
|  | ||||
| const tipoBobinaService = { | ||||
|     getAllTiposBobina, | ||||
|     getTipoBobinaById, | ||||
|     createTipoBobina, | ||||
|     updateTipoBobina, | ||||
|     deleteTipoBobina, | ||||
| }; | ||||
|  | ||||
| export default tipoBobinaService; | ||||
							
								
								
									
										46
									
								
								Frontend/src/services/zonaService.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Frontend/src/services/zonaService.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| import apiClient from './apiClient'; | ||||
| import type { ZonaDto } from '../models/dtos/Zonas/ZonaDto'; // DTO para recibir listas | ||||
| import type { CreateZonaDto } from '../models/dtos/Zonas/CreateZonaDto'; | ||||
| import type { UpdateZonaDto } from '../models/dtos/Zonas/UpdateZonaDto'; | ||||
|  | ||||
| const getAllZonas = async (nombreFilter?: string, descripcionFilter?: string): Promise<ZonaDto[]> => { | ||||
|     const params: Record<string, string> = {}; | ||||
|     if (nombreFilter) params.nombre = nombreFilter; | ||||
|     if (descripcionFilter) params.descripcion = descripcionFilter; // Asegúrate que la API soporte este filtro si lo necesitas | ||||
|  | ||||
|     // Llama al GET /api/zonas (que por defecto devuelve solo activas según el servicio) | ||||
|     const response = await apiClient.get<ZonaDto[]>('/zonas', { params }); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const getZonaById = async (id: number): Promise<ZonaDto> => { | ||||
|      // Llama al GET /api/zonas/{id} (que por defecto devuelve solo activas según el servicio) | ||||
|     const response = await apiClient.get<ZonaDto>(`/zonas/${id}`); | ||||
|     return response.data; | ||||
| }; | ||||
|  | ||||
| const createZona = async (data: CreateZonaDto): Promise<ZonaDto> => { | ||||
|     // Llama a POST /api/zonas | ||||
|     const response = await apiClient.post<ZonaDto>('/zonas', data); | ||||
|     return response.data; // La API devuelve el objeto creado | ||||
| }; | ||||
|  | ||||
| const updateZona = async (id: number, data: UpdateZonaDto): Promise<void> => { | ||||
|     // Llama a PUT /api/zonas/{id} | ||||
|     await apiClient.put(`/zonas/${id}`, data); | ||||
| }; | ||||
|  | ||||
| const deleteZona = async (id: number): Promise<void> => { | ||||
|     // Llama a DELETE /api/zonas/{id} (que hará el soft delete) | ||||
|     await apiClient.delete(`/zonas/${id}`); | ||||
| }; | ||||
|  | ||||
| const zonaService = { | ||||
|     getAllZonas, | ||||
|     getZonaById, | ||||
|     createZona, | ||||
|     updateZona, | ||||
|     deleteZona, | ||||
| }; | ||||
|  | ||||
| export default zonaService; | ||||
		Reference in New Issue
	
	Block a user