diff --git a/Frontend/src/pages/Distribucion/GestionarEntradasSalidasCanillaPage.tsx b/Frontend/src/pages/Distribucion/GestionarEntradasSalidasCanillaPage.tsx index d464fe1..ba70fa2 100644 --- a/Frontend/src/pages/Distribucion/GestionarEntradasSalidasCanillaPage.tsx +++ b/Frontend/src/pages/Distribucion/GestionarEntradasSalidasCanillaPage.tsx @@ -88,7 +88,7 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { setLoadingFiltersDropdown(false); // Detiene el spinner de los filtros return; } - + setLoadingFiltersDropdown(true); setError(null); try { @@ -130,14 +130,14 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { const cargarMovimientos = useCallback(async () => { if (!puedeVer) { - setError("No tiene permiso para ver esta sección."); - setLoading(false); - return; + setError("No tiene permiso para ver esta sección."); + setLoading(false); + return; } if (!filtroFecha || !filtroIdCanillitaSeleccionado) { - if (loading) setLoading(false); - setMovimientos([]); - return; + if (loading) setLoading(false); + setMovimientos([]); + return; } setLoading(true); setError(null); setApiErrorMessage(null); try { @@ -164,37 +164,37 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { useEffect(() => { if (filtroFecha && filtroIdCanillitaSeleccionado) { - cargarMovimientos(); + cargarMovimientos(); } else { - setMovimientos([]); - if (loading) setLoading(false); + setMovimientos([]); + if (loading) setLoading(false); } }, [cargarMovimientos, filtroFecha, filtroIdCanillitaSeleccionado]); - + const handleOpenModal = (item?: EntradaSalidaCanillaDto) => { if (!puedeCrear && !item) { - setApiErrorMessage("No tiene permiso para registrar nuevos movimientos."); - return; + setApiErrorMessage("No tiene permiso para registrar nuevos movimientos."); + return; } if (item && !puedeModificar) { - setApiErrorMessage("No tiene permiso para modificar movimientos."); - return; + setApiErrorMessage("No tiene permiso para modificar movimientos."); + return; } if (item) { - setEditingMovimiento(item); - setPrefillModalData(null); + setEditingMovimiento(item); + setPrefillModalData(null); } else { - const canillitaSeleccionado = destinatariosDropdown.find( - c => c.idCanilla === Number(filtroIdCanillitaSeleccionado) - ); - setEditingMovimiento(null); - setPrefillModalData({ - fecha: filtroFecha, - idCanilla: filtroIdCanillitaSeleccionado, - nombreCanilla: canillitaSeleccionado?.nomApe, - idPublicacion: filtroIdPublicacion - }); + const canillitaSeleccionado = destinatariosDropdown.find( + c => c.idCanilla === Number(filtroIdCanillitaSeleccionado) + ); + setEditingMovimiento(null); + setPrefillModalData({ + fecha: filtroFecha, + idCanilla: filtroIdCanillitaSeleccionado, + nombreCanilla: canillitaSeleccionado?.nomApe, + idPublicacion: filtroIdPublicacion + }); } setApiErrorMessage(null); setModalOpen(true); @@ -224,7 +224,7 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { }); }; const handleSelectAllForLiquidar = (event: React.ChangeEvent) => { - if (event.target.checked) { + if (event.target.checked) { const newSelectedIds = new Set(movimientos.filter(m => !m.liquidado).map(m => m.idParte)); setSelectedIdsParaLiquidar(newSelectedIds); } else { @@ -248,17 +248,17 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { const fechaLiquidacionDate = new Date(fechaLiquidacionDialog + 'T00:00:00Z'); let fechaMovimientoMasReciente: Date | null = null; selectedIdsParaLiquidar.forEach(idParte => { - const movimiento = movimientos.find(m => m.idParte === idParte); - if (movimiento && movimiento.fecha) { - const movFecha = new Date(movimiento.fecha.split('T')[0] + 'T00:00:00Z'); - if (fechaMovimientoMasReciente === null || movFecha.getTime() > (fechaMovimientoMasReciente as Date).getTime()) { - fechaMovimientoMasReciente = movFecha; - } + const movimiento = movimientos.find(m => m.idParte === idParte); + if (movimiento && movimiento.fecha) { + const movFecha = new Date(movimiento.fecha.split('T')[0] + 'T00:00:00Z'); + if (fechaMovimientoMasReciente === null || movFecha.getTime() > (fechaMovimientoMasReciente as Date).getTime()) { + fechaMovimientoMasReciente = movFecha; } + } }); if (fechaMovimientoMasReciente !== null && fechaLiquidacionDate.getTime() < (fechaMovimientoMasReciente as Date).getTime()) { - setApiErrorMessage(`La fecha de liquidación (${fechaLiquidacionDate.toLocaleDateString('es-AR', {timeZone: 'UTC'})}) no puede ser inferior a la fecha del movimiento más reciente a liquidar (${(fechaMovimientoMasReciente as Date).toLocaleDateString('es-AR', {timeZone: 'UTC'})}).`); - return; + setApiErrorMessage(`La fecha de liquidación (${fechaLiquidacionDate.toLocaleDateString('es-AR', { timeZone: 'UTC' })}) no puede ser inferior a la fecha del movimiento más reciente a liquidar (${(fechaMovimientoMasReciente as Date).toLocaleDateString('es-AR', { timeZone: 'UTC' })}).`); + return; } setApiErrorMessage(null); setLoading(true); @@ -277,9 +277,9 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { if (movimientoParaTicket && !movimientoParaTicket.canillaEsAccionista) { console.log("Liquidación exitosa, generando ticket para canillita NO accionista:", movimientoParaTicket.idCanilla); await handleImprimirTicketLiquidacion( - movimientoParaTicket.idCanilla, - movimientoParaTicket.fecha, - false + movimientoParaTicket.idCanilla, + movimientoParaTicket.fecha, + false ); } else if (movimientoParaTicket && movimientoParaTicket.canillaEsAccionista) { console.log("Liquidación exitosa para accionista. No se genera ticket automáticamente."); @@ -344,9 +344,13 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { }; const displayData = movimientos.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage); - const totalARendirVisible = useMemo(() => + const totalARendirVisible = useMemo(() => displayData.filter(m => !m.liquidado).reduce((sum, item) => sum + item.montoARendir, 0) - , [displayData]); + , [displayData]); + + const montoARendirAll = useMemo(() => + movimientos.reduce((sum, item) => sum + item.montoARendir, 0) + , [movimientos]); if (!puedeVer) { return ( @@ -367,7 +371,7 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { Filtros - setFiltroFecha(e.target.value)} InputLabelProps={{ shrink: true }} sx={{ minWidth: 170 }} required @@ -398,9 +402,9 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { onChange={(e) => setFiltroIdCanillitaSeleccionado(e.target.value as number | string)} > Seleccione uno - {destinatariosDropdown.map(c => {c.nomApe} {c.legajo ? `(Leg: ${c.legajo})`: ''})} + {destinatariosDropdown.map(c => {c.nomApe} {c.legajo ? `(Leg: ${c.legajo})` : ''})} - {!filtroIdCanillitaSeleccionado && Selección obligatoria} + {!filtroIdCanillitaSeleccionado && Selección obligatoria} @@ -411,15 +415,15 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { - + {puedeCrear && ( - )} {puedeLiquidar && numSelectedToLiquidate > 0 && movimientos.some(m => selectedIdsParaLiquidar.has(m.idParte) && !m.liquidado) && ( @@ -429,32 +433,39 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { )} - - {!filtroFecha && Por favor, seleccione una fecha.} - {filtroFecha && !filtroIdCanillitaSeleccionado && Por favor, seleccione un {filtroTipoDestinatario === 'canillitas' ? 'canillita' : 'accionista'}.} + + {!filtroFecha && Por favor, seleccione una fecha.} + {filtroFecha && !filtroIdCanillitaSeleccionado && Por favor, seleccione un {filtroTipoDestinatario === 'canillitas' ? 'canillita' : 'accionista'}.} {loading && } {error && !loading && !apiErrorMessage && {error}} {apiErrorMessage && {apiErrorMessage}} - {loadingTicketPdf && ( Cargando ticket... )} + {loadingTicketPdf && ( Cargando ticket... )} {!loading && movimientos.length > 0 && ( - - - - Total a Liquidar: - - - {totalARendirVisible.toLocaleString('es-AR', { style: 'currency', currency: 'ARS' })} - - + + + + Total: + + + {montoARendirAll.toLocaleString('es-AR', { style: 'currency', currency: 'ARS' })} + + - + + Total a Liquidar: + + 0 ? 'error.main' : 'green' }}> + {totalARendirVisible.toLocaleString('es-AR', { style: 'currency', currency: 'ARS' })} + + )} {!loading && !error && puedeVer && filtroFecha && filtroIdCanillitaSeleccionado && ( - +
{puedeLiquidar && ( @@ -545,10 +556,10 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { )} - + {puedeModificar && selectedRow && !selectedRow.liquidado && ( { handleOpenModal(selectedRow); handleMenuClose(); }}> Modificar)} - + {selectedRow && selectedRow.liquidado && puedeLiquidar && ( { @@ -560,7 +571,7 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { selectedRow.canillaEsAccionista ); } - handleMenuClose(); + handleMenuClose(); }} disabled={loadingTicketPdf} > @@ -572,9 +583,9 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { {selectedRow && ( ((!selectedRow.liquidado && puedeEliminar) || (selectedRow.liquidado && puedeEliminarLiquidados)) ) && ( - {if (selectedRow) handleDelete(selectedRow.idParte);}}> - - Eliminar + { if (selectedRow) handleDelete(selectedRow.idParte); }}> + + Eliminar )} @@ -589,7 +600,7 @@ const GestionarEntradasSalidasCanillaPage: React.FC = () => { clearErrorMessage={() => setApiErrorMessage(null)} /> - + Confirmar Liquidación