import React, { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Box, Typography, Button, Paper, IconButton, Menu, MenuItem, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, CircularProgress, Alert, Chip } from '@mui/material'; import AddIcon from '@mui/icons-material/Add'; import MoreVertIcon from '@mui/icons-material/MoreVert'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import EditIcon from '@mui/icons-material/Edit'; import DeleteIcon from '@mui/icons-material/Delete'; import porcMonCanillaService from '../../services/Distribucion/porcMonCanillaService'; import publicacionService from '../../services/Distribucion/publicacionService'; import type { PorcMonCanillaDto } from '../../models/dtos/Distribucion/PorcMonCanillaDto'; import type { CreatePorcMonCanillaDto } from '../../models/dtos/Distribucion/CreatePorcMonCanillaDto'; import type { UpdatePorcMonCanillaDto } from '../../models/dtos/Distribucion/UpdatePorcMonCanillaDto'; import type { PublicacionDto } from '../../models/dtos/Distribucion/PublicacionDto'; import PorcMonCanillaFormModal from '../../components/Modals/Distribucion/PorcMonCanillaFormModal'; import { usePermissions } from '../../hooks/usePermissions'; import axios from 'axios'; const GestionarPorcMonCanillaPage: React.FC = () => { const { idPublicacion: idPublicacionStr } = useParams<{ idPublicacion: string }>(); const navigate = useNavigate(); const idPublicacion = Number(idPublicacionStr); const [publicacion, setPublicacion] = useState(null); const [items, setItems] = useState([]); // Renombrado de 'porcentajes' a 'items' const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [modalOpen, setModalOpen] = useState(false); const [editingItem, setEditingItem] = useState(null); const [apiErrorMessage, setApiErrorMessage] = useState(null); const [anchorEl, setAnchorEl] = useState(null); const [selectedRow, setSelectedRow] = useState(null); const { tienePermiso, isSuperAdmin } = usePermissions(); // Permiso CG004 para porcentajes/montos de pago de canillitas const puedeGestionar = isSuperAdmin || tienePermiso("CG004"); const cargarDatos = useCallback(async () => { if (isNaN(idPublicacion)) { setError("ID de Publicación inválido."); setLoading(false); return; } if (!puedeGestionar) { setError("No tiene permiso para gestionar esta configuración."); setLoading(false); return; } setLoading(true); setError(null); setApiErrorMessage(null); try { const [pubData, data] = await Promise.all([ publicacionService.getPublicacionById(idPublicacion), porcMonCanillaService.getPorcMonCanillaPorPublicacion(idPublicacion) ]); setPublicacion(pubData); setItems(data); } catch (err: any) { console.error(err); if (axios.isAxiosError(err) && err.response?.status === 404) { setError(`Publicación ID ${idPublicacion} no encontrada.`); } else { setError('Error al cargar los datos.'); } } finally { setLoading(false); } }, [idPublicacion, puedeGestionar]); useEffect(() => { cargarDatos(); }, [cargarDatos]); const handleOpenModal = (item?: PorcMonCanillaDto) => { setEditingItem(item || null); setApiErrorMessage(null); setModalOpen(true); }; const handleCloseModal = () => { setModalOpen(false); setEditingItem(null); }; const handleSubmitModal = async (data: CreatePorcMonCanillaDto | UpdatePorcMonCanillaDto, idPorcMon?: number) => { setApiErrorMessage(null); try { if (editingItem && idPorcMon) { await porcMonCanillaService.updatePorcMonCanilla(idPublicacion, idPorcMon, data as UpdatePorcMonCanillaDto); } else { await porcMonCanillaService.createPorcMonCanilla(idPublicacion, data as CreatePorcMonCanillaDto); } cargarDatos(); } catch (err: any) { const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al guardar.'; setApiErrorMessage(message); throw err; } }; const handleDelete = async (idPorcMonDelRow: number) => { if (window.confirm(`¿Seguro de eliminar este registro (ID: ${idPorcMonDelRow})?`)) { setApiErrorMessage(null); try { await porcMonCanillaService.deletePorcMonCanilla(idPublicacion, idPorcMonDelRow); cargarDatos(); } catch (err: any) { const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al eliminar.'; setApiErrorMessage(message); } } handleMenuClose(); }; const handleMenuOpen = (event: React.MouseEvent, item: PorcMonCanillaDto) => { setAnchorEl(event.currentTarget); setSelectedRow(item); }; const handleMenuClose = () => { setAnchorEl(null); setSelectedRow(null); }; const formatDate = (dateString?: string | null) => dateString ? new Date(dateString + 'T00:00:00').toLocaleDateString('es-AR') : '-'; if (loading) return ; if (error) return {error}; if (!puedeGestionar) return Acceso denegado.; return ( Porcentajes/Montos Pago Canillita: {publicacion?.nombre || 'Cargando...'} Empresa: {publicacion?.nombreEmpresa || '-'} {puedeGestionar && ( )} {apiErrorMessage && {apiErrorMessage}} Canillita Vig. Desde Vig. Hasta Valor Tipo Estado Acciones {items.length === 0 ? ( No hay configuraciones definidas. ) : ( items.sort((a,b) => new Date(b.vigenciaD).getTime() - new Date(a.vigenciaD).getTime() || a.nomApeCanilla.localeCompare(b.nomApeCanilla)) .map((item) => ( {item.nomApeCanilla}{formatDate(item.vigenciaD)} {formatDate(item.vigenciaH)} {item.esPorcentaje ? `${item.porcMon.toFixed(2)}%` : `$${item.porcMon.toFixed(2)}`} {item.esPorcentaje ? : } {!item.vigenciaH ? : } handleMenuOpen(e, item)} disabled={!puedeGestionar}> )))}
{puedeGestionar && selectedRow && ( { handleOpenModal(selectedRow); handleMenuClose(); }}> Editar/Cerrar)} {puedeGestionar && selectedRow && ( handleDelete(selectedRow.idPorcMon)}> Eliminar)} {idPublicacion && setApiErrorMessage(null)} /> }
); }; export default GestionarPorcMonCanillaPage;