Compare commits
	
		
			3 Commits
		
	
	
		
			Suscripcio
			...
			2e7d1e36be
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2e7d1e36be | |||
| dd2277fce2 | |||
| 9412556fa8 | 
| @@ -4,7 +4,7 @@ | |||||||
| # El separador de doble guion bajo (__) se usa para mapear la jerarquía del JSON. | # El separador de doble guion bajo (__) se usa para mapear la jerarquía del JSON. | ||||||
| # MailSettings:SmtpHost se convierte en MailSettings__SmtpHost | # MailSettings:SmtpHost se convierte en MailSettings__SmtpHost | ||||||
|  |  | ||||||
| MailSettings__SmtpHost="mail.eldia.com" | MailSettings__SmtpHost="192.168.5.201" | ||||||
| MailSettings__SmtpPort=587 | MailSettings__SmtpPort=587 | ||||||
| MailSettings__SenderName="Club - Diario El Día" | MailSettings__SenderName="Club - Diario El Día" | ||||||
| MailSettings__SenderEmail="alertas@eldia.com" | MailSettings__SenderEmail="alertas@eldia.com" | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ namespace GestionIntegral.Api.Dtos.Suscripciones | |||||||
|         public string EstadoPago { get; set; } = string.Empty; |         public string EstadoPago { get; set; } = string.Empty; | ||||||
|         public string EstadoFacturacion { get; set; } = string.Empty; |         public string EstadoFacturacion { get; set; } = string.Empty; | ||||||
|         public string? NumeroFactura { get; set; } |         public string? NumeroFactura { get; set; } | ||||||
|  |         public decimal TotalPagado { get; set; } | ||||||
|         public List<FacturaDetalleDto> Detalles { get; set; } = new List<FacturaDetalleDto>(); |         public List<FacturaDetalleDto> Detalles { get; set; } = new List<FacturaDetalleDto>(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -282,7 +282,7 @@ namespace GestionIntegral.Api.Services.Suscripciones | |||||||
|         { |         { | ||||||
|             var periodo = $"{anio}-{mes:D2}"; |             var periodo = $"{anio}-{mes:D2}"; | ||||||
|             var facturasData = await _facturaRepository.GetByPeriodoEnrichedAsync(periodo, nombreSuscriptor, estadoPago, estadoFacturacion); |             var facturasData = await _facturaRepository.GetByPeriodoEnrichedAsync(periodo, nombreSuscriptor, estadoPago, estadoFacturacion); | ||||||
|             var detallesData = await _facturaDetalleRepository.GetDetallesPorPeriodoAsync(periodo); // Necesitaremos este nuevo método en el repo |             var detallesData = await _facturaDetalleRepository.GetDetallesPorPeriodoAsync(periodo); | ||||||
|             var empresas = await _empresaRepository.GetAllAsync(null, null); |             var empresas = await _empresaRepository.GetAllAsync(null, null); | ||||||
|  |  | ||||||
|             var resumenes = facturasData |             var resumenes = facturasData | ||||||
| @@ -301,6 +301,7 @@ namespace GestionIntegral.Api.Services.Suscripciones | |||||||
|                             EstadoPago = itemFactura.Factura.EstadoPago, |                             EstadoPago = itemFactura.Factura.EstadoPago, | ||||||
|                             EstadoFacturacion = itemFactura.Factura.EstadoFacturacion, |                             EstadoFacturacion = itemFactura.Factura.EstadoFacturacion, | ||||||
|                             NumeroFactura = itemFactura.Factura.NumeroFactura, |                             NumeroFactura = itemFactura.Factura.NumeroFactura, | ||||||
|  |                             TotalPagado = itemFactura.TotalPagado, | ||||||
|                             Detalles = detallesData |                             Detalles = detallesData | ||||||
|                                 .Where(d => d.IdFactura == itemFactura.Factura.IdFactura) |                                 .Where(d => d.IdFactura == itemFactura.Factura.IdFactura) | ||||||
|                                 .Select(d => new FacturaDetalleDto { Descripcion = d.Descripcion, ImporteNeto = d.ImporteNeto }) |                                 .Select(d => new FacturaDetalleDto { Descripcion = d.Descripcion, ImporteNeto = d.ImporteNeto }) | ||||||
| @@ -314,7 +315,7 @@ namespace GestionIntegral.Api.Services.Suscripciones | |||||||
|                         NombreSuscriptor = primerItem.NombreSuscriptor, |                         NombreSuscriptor = primerItem.NombreSuscriptor, | ||||||
|                         Facturas = facturasConsolidadas, |                         Facturas = facturasConsolidadas, | ||||||
|                         ImporteTotal = facturasConsolidadas.Sum(f => f.ImporteFinal), |                         ImporteTotal = facturasConsolidadas.Sum(f => f.ImporteFinal), | ||||||
|                         SaldoPendienteTotal = facturasConsolidadas.Sum(f => f.EstadoPago == "Pagada" ? 0 : f.ImporteFinal) |                         SaldoPendienteTotal = facturasConsolidadas.Sum(f => f.ImporteFinal - f.TotalPagado) | ||||||
|                     }; |                     }; | ||||||
|                 }); |                 }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -70,14 +70,11 @@ namespace GestionIntegral.Api.Services.Suscripciones | |||||||
|             { |             { | ||||||
|                 var factura = await _facturaRepository.GetByIdAsync(createDto.IdFactura); |                 var factura = await _facturaRepository.GetByIdAsync(createDto.IdFactura); | ||||||
|                 if (factura == null) return (null, "La factura especificada no existe."); |                 if (factura == null) return (null, "La factura especificada no existe."); | ||||||
|  |  | ||||||
|                 // Usar EstadoPago para la validación |  | ||||||
|                 if (factura.EstadoPago == "Anulada") return (null, "No se puede registrar un pago sobre una factura anulada."); |                 if (factura.EstadoPago == "Anulada") return (null, "No se puede registrar un pago sobre una factura anulada."); | ||||||
|  |  | ||||||
|                 var formaPago = await _formaPagoRepository.GetByIdAsync(createDto.IdFormaPago); |                 var formaPago = await _formaPagoRepository.GetByIdAsync(createDto.IdFormaPago); | ||||||
|                 if (formaPago == null || !formaPago.Activo) return (null, "La forma de pago no es válida."); |                 if (formaPago == null || !formaPago.Activo) return (null, "La forma de pago no es válida."); | ||||||
|  |  | ||||||
|                 // Obtenemos la suma de pagos ANTERIORES |  | ||||||
|                 var totalPagadoAnteriormente = await _pagoRepository.GetTotalPagadoAprobadoAsync(createDto.IdFactura, transaction); |                 var totalPagadoAnteriormente = await _pagoRepository.GetTotalPagadoAprobadoAsync(createDto.IdFactura, transaction); | ||||||
|  |  | ||||||
|                 var nuevoPago = new Pago |                 var nuevoPago = new Pago | ||||||
| @@ -96,37 +93,31 @@ namespace GestionIntegral.Api.Services.Suscripciones | |||||||
|                 var pagoCreado = await _pagoRepository.CreateAsync(nuevoPago, transaction); |                 var pagoCreado = await _pagoRepository.CreateAsync(nuevoPago, transaction); | ||||||
|                 if (pagoCreado == null) throw new DataException("No se pudo registrar el pago."); |                 if (pagoCreado == null) throw new DataException("No se pudo registrar el pago."); | ||||||
|  |  | ||||||
|                 // Calculamos el nuevo total EN MEMORIA |  | ||||||
|                 var nuevoTotalPagado = totalPagadoAnteriormente + pagoCreado.Monto; |                 var nuevoTotalPagado = totalPagadoAnteriormente + pagoCreado.Monto; | ||||||
|  |  | ||||||
|                 // Comparamos y actualizamos el estado si es necesario |                 // Nueva lógica para manejar todos los estados de pago | ||||||
|                 // CORRECCIÓN: Usar EstadoPago y el método correcto del repositorio |                 string nuevoEstadoPago = factura.EstadoPago; | ||||||
|                 if (factura.EstadoPago != "Pagada" && nuevoTotalPagado >= factura.ImporteFinal) |                 if (nuevoTotalPagado >= factura.ImporteFinal) | ||||||
|                 { |                 { | ||||||
|                     bool actualizado = await _facturaRepository.UpdateEstadoPagoAsync(factura.IdFactura, "Pagada", transaction); |                     nuevoEstadoPago = "Pagada"; | ||||||
|                     if (!actualizado) throw new DataException("No se pudo actualizar el estado de la factura a 'Pagada'."); |                 } | ||||||
|  |                 else if (nuevoTotalPagado > 0) | ||||||
|  |                 { | ||||||
|  |                     nuevoEstadoPago = "Pagada Parcialmente"; | ||||||
|  |                 } | ||||||
|  |                 // Si nuevoTotalPagado es 0, el estado no cambia. | ||||||
|  |  | ||||||
|  |                 // Solo actualizamos si el estado calculado es diferente al actual. | ||||||
|  |                 if (nuevoEstadoPago != factura.EstadoPago) | ||||||
|  |                 { | ||||||
|  |                     bool actualizado = await _facturaRepository.UpdateEstadoPagoAsync(factura.IdFactura, nuevoEstadoPago, transaction); | ||||||
|  |                     if (!actualizado) throw new DataException($"No se pudo actualizar el estado de la factura a '{nuevoEstadoPago}'."); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 transaction.Commit(); |                 transaction.Commit(); | ||||||
|                 _logger.LogInformation("Pago manual ID {IdPago} registrado para Factura ID {IdFactura} por Usuario ID {IdUsuario}", pagoCreado.IdPago, pagoCreado.IdFactura, idUsuario); |                 _logger.LogInformation("Pago manual ID {IdPago} registrado para Factura ID {IdFactura} por Usuario ID {IdUsuario}", pagoCreado.IdPago, pagoCreado.IdFactura, idUsuario); | ||||||
|  |  | ||||||
|                 // Construimos el DTO de respuesta SIN volver a consultar la base de datos |                 var dto = await MapToDto(pagoCreado); // MapToDto ahora es más simple | ||||||
|                 var usuario = await _usuarioRepository.GetByIdAsync(idUsuario); |  | ||||||
|                 var dto = new PagoDto |  | ||||||
|                 { |  | ||||||
|                     IdPago = pagoCreado.IdPago, |  | ||||||
|                     IdFactura = pagoCreado.IdFactura, |  | ||||||
|                     FechaPago = pagoCreado.FechaPago.ToString("yyyy-MM-dd"), |  | ||||||
|                     IdFormaPago = pagoCreado.IdFormaPago, |  | ||||||
|                     NombreFormaPago = formaPago.Nombre, |  | ||||||
|                     Monto = pagoCreado.Monto, |  | ||||||
|                     Estado = pagoCreado.Estado, |  | ||||||
|                     Referencia = pagoCreado.Referencia, |  | ||||||
|                     Observaciones = pagoCreado.Observaciones, |  | ||||||
|                     IdUsuarioRegistro = pagoCreado.IdUsuarioRegistro, |  | ||||||
|                     NombreUsuarioRegistro = usuario != null ? $"{usuario.Nombre} {usuario.Apellido}" : "N/A" |  | ||||||
|                 }; |  | ||||||
|  |  | ||||||
|                 return (dto, null); |                 return (dto, null); | ||||||
|             } |             } | ||||||
|             catch (Exception ex) |             catch (Exception ex) | ||||||
|   | |||||||
| @@ -14,18 +14,18 @@ const SECCION_PERMISSIONS_PREFIX = "SS"; | |||||||
| // Mapeo de codAcc de sección a su módulo conceptual | // Mapeo de codAcc de sección a su módulo conceptual | ||||||
| const getModuloFromSeccionCodAcc = (codAcc: string): string | null => { | const getModuloFromSeccionCodAcc = (codAcc: string): string | null => { | ||||||
|     if (codAcc === "SS001") return "Distribución";     |     if (codAcc === "SS001") return "Distribución";     | ||||||
|  |     if (codAcc === "SS007") return "Suscripciones"; | ||||||
|     if (codAcc === "SS002") return "Contables"; |     if (codAcc === "SS002") return "Contables"; | ||||||
|     if (codAcc === "SS003") return "Impresión"; |     if (codAcc === "SS003") return "Impresión"; | ||||||
|     if (codAcc === "SS004") return "Reportes"; |     if (codAcc === "SS004") return "Reportes"; | ||||||
|     if (codAcc === "SS005") return "Radios"; |  | ||||||
|     if (codAcc === "SS006") return "Usuarios";     |     if (codAcc === "SS006") return "Usuarios";     | ||||||
|  |     if (codAcc === "SS005") return "Radios"; | ||||||
|     return null; |     return null; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Función para determinar el módulo conceptual de un permiso individual | // Función para determinar el módulo conceptual de un permiso individual | ||||||
| const getModuloConceptualDelPermiso = (permisoModulo: string): string => { | const getModuloConceptualDelPermiso = (permisoModulo: string): string => { | ||||||
|     const moduloLower = permisoModulo.toLowerCase();     |     const moduloLower = permisoModulo.toLowerCase();     | ||||||
|  |  | ||||||
|     if (moduloLower.includes("distribuidores") || |     if (moduloLower.includes("distribuidores") || | ||||||
|         moduloLower.includes("canillas") || // Cubre "Canillas" y "Movimientos Canillas" |         moduloLower.includes("canillas") || // Cubre "Canillas" y "Movimientos Canillas" | ||||||
|         moduloLower.includes("publicaciones distribución") || |         moduloLower.includes("publicaciones distribución") || | ||||||
| @@ -36,6 +36,9 @@ const getModuloConceptualDelPermiso = (permisoModulo: string): string => { | |||||||
|         moduloLower.includes("ctrl. devoluciones")) { |         moduloLower.includes("ctrl. devoluciones")) { | ||||||
|         return "Distribución"; |         return "Distribución"; | ||||||
|     } |     } | ||||||
|  |     if (moduloLower.includes("suscripciones")) { | ||||||
|  |         return "Suscripciones"; | ||||||
|  |     } | ||||||
|     if (moduloLower.includes("cuentas pagos") || |     if (moduloLower.includes("cuentas pagos") || | ||||||
|         moduloLower.includes("cuentas notas") || |         moduloLower.includes("cuentas notas") || | ||||||
|         moduloLower.includes("cuentas tipos pagos")) { |         moduloLower.includes("cuentas tipos pagos")) { | ||||||
| @@ -89,7 +92,7 @@ const PermisosChecklist: React.FC<PermisosChecklistProps> = ({ | |||||||
|     return acc; |     return acc; | ||||||
|   }, {} as Record<string, PermisoAsignadoDto[]>); |   }, {} as Record<string, PermisoAsignadoDto[]>); | ||||||
|  |  | ||||||
|   const ordenModulosPrincipales = ["Distribución", "Contables", "Impresión", "Radios", "Usuarios", "Reportes", "Permisos (Definición)"]; |   const ordenModulosPrincipales = ["Distribución", "Suscripciones", "Contables", "Impresión", "Usuarios", "Reportes", "Radios","Permisos (Definición)"]; | ||||||
|   // Añadir módulos que solo tienen permiso de sección (como Radios) pero no hijos (aún) |   // Añadir módulos que solo tienen permiso de sección (como Radios) pero no hijos (aún) | ||||||
|   permisosDeSeccion.forEach(ps => { |   permisosDeSeccion.forEach(ps => { | ||||||
|       const moduloConceptual = getModuloFromSeccionCodAcc(ps.codAcc); |       const moduloConceptual = getModuloFromSeccionCodAcc(ps.codAcc); | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ export interface FacturaConsolidadaDto { | |||||||
|     estadoPago: string; |     estadoPago: string; | ||||||
|     estadoFacturacion: string; |     estadoFacturacion: string; | ||||||
|     numeroFactura?: string | null; |     numeroFactura?: string | null; | ||||||
|  |     totalPagado: number; | ||||||
|     detalles: FacturaDetalleDto[]; |     detalles: FacturaDetalleDto[]; | ||||||
|     // Añadimos el id del suscriptor para que sea fácil pasarlo a los handlers |     // Añadimos el id del suscriptor para que sea fácil pasarlo a los handlers | ||||||
|     idSuscriptor: number;  |     idSuscriptor: number;  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ const meses = [ | |||||||
|     { value: 10, label: 'Octubre' }, { value: 11, label: 'Noviembre' }, { value: 12, label: 'Diciembre' } |     { value: 10, label: 'Octubre' }, { value: 11, label: 'Noviembre' }, { value: 12, label: 'Diciembre' } | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| const estadosPago = ['Pendiente', 'Pagada', 'Rechazada', 'Anulada']; | const estadosPago = ['Pendiente', 'Pagada', 'Pagada Parcialmente', 'Rechazada', 'Anulada']; | ||||||
| const estadosFacturacion = ['Pendiente de Facturar', 'Facturado']; | const estadosFacturacion = ['Pendiente de Facturar', 'Facturado']; | ||||||
|  |  | ||||||
| const SuscriptorRow: React.FC<{ | const SuscriptorRow: React.FC<{ | ||||||
| @@ -33,36 +33,68 @@ const SuscriptorRow: React.FC<{ | |||||||
|     handleOpenHistorial: (factura: FacturaConsolidadaDto) => void; |     handleOpenHistorial: (factura: FacturaConsolidadaDto) => void; | ||||||
| }> = ({ resumen, handleMenuOpen, handleOpenHistorial }) => { | }> = ({ resumen, handleMenuOpen, handleOpenHistorial }) => { | ||||||
|     const [open, setOpen] = useState(false); |     const [open, setOpen] = useState(false); | ||||||
|  |  | ||||||
|  |     // Función para formatear moneda | ||||||
|  |     const formatCurrency = (value: number) => `$${value.toFixed(2)}`; | ||||||
|  |  | ||||||
|     return ( |     return ( | ||||||
|         <React.Fragment> |         <React.Fragment> | ||||||
|             <TableRow sx={{ '& > *': { borderBottom: 'unset' } }} hover> |             <TableRow sx={{ '& > *': { borderBottom: 'unset' } }} hover> | ||||||
|                 <TableCell><IconButton size="small" onClick={() => setOpen(!open)}>{open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}</IconButton></TableCell> |                 <TableCell><IconButton size="small" onClick={() => setOpen(!open)}>{open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}</IconButton></TableCell> | ||||||
|                 <TableCell component="th" scope="row">{resumen.nombreSuscriptor}</TableCell> |                 <TableCell component="th" scope="row">{resumen.nombreSuscriptor}</TableCell> | ||||||
|                 <TableCell align="right"> |                 <TableCell align="right"> | ||||||
|                     <Typography variant="body2" sx={{ fontWeight: 'bold', color: resumen.saldoPendienteTotal > 0 ? 'error.main' : 'success.main' }}>${resumen.saldoPendienteTotal.toFixed(2)}</Typography> |                     <Typography variant="body2" sx={{ fontWeight: 'bold', color: resumen.saldoPendienteTotal > 0 ? 'error.main' : 'success.main' }}> | ||||||
|                     <Typography variant="caption" color="text.secondary">de ${resumen.importeTotal.toFixed(2)}</Typography> |                         {formatCurrency(resumen.saldoPendienteTotal)} | ||||||
|  |                     </Typography> | ||||||
|  |                     <Typography variant="caption" color="text.secondary">de {formatCurrency(resumen.importeTotal)}</Typography> | ||||||
|                 </TableCell> |                 </TableCell> | ||||||
|                 <TableCell colSpan={5}></TableCell> |                 <TableCell colSpan={7}></TableCell> | ||||||
|             </TableRow> |             </TableRow> | ||||||
|             <TableRow> |             <TableRow> | ||||||
|                 <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={8}> |                 <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={10}> | ||||||
|                     <Collapse in={open} timeout="auto" unmountOnExit> |                     <Collapse in={open} timeout="auto" unmountOnExit> | ||||||
|                         <Box sx={{ margin: 1, padding: 2, backgroundColor: 'grey.50', borderRadius: 1 }}> |                         <Box sx={{ margin: 1, padding: 2, backgroundColor: 'grey.50', borderRadius: 1 }}> | ||||||
|                             <Typography variant="h6" gutterBottom component="div" sx={{ fontSize: '1rem', fontWeight: 'bold' }}>Facturas del Período para {resumen.nombreSuscriptor}</Typography> |                             <Typography variant="h6" gutterBottom component="div" sx={{ fontSize: '1rem', fontWeight: 'bold' }}> | ||||||
|  |                                 Facturas del Período para {resumen.nombreSuscriptor} | ||||||
|  |                             </Typography> | ||||||
|                             <Table size="small"> |                             <Table size="small"> | ||||||
|                                 <TableHead> |                                 <TableHead> | ||||||
|                                     <TableRow> |                                     <TableRow> | ||||||
|                                         <TableCell>Empresa</TableCell><TableCell align="right">Importe</TableCell> |                                         <TableCell>Empresa</TableCell> | ||||||
|                                         <TableCell>Estado Pago</TableCell><TableCell>Estado Facturación</TableCell> |                                         <TableCell align="right">Importe Total</TableCell> | ||||||
|                                         <TableCell>Nro. Factura</TableCell><TableCell align="right">Acciones</TableCell> |                                         <TableCell align="right">Pagado</TableCell> | ||||||
|  |                                         <TableCell align="right">Saldo</TableCell> | ||||||
|  |                                         <TableCell>Estado Pago</TableCell> | ||||||
|  |                                         <TableCell>Estado Facturación</TableCell> | ||||||
|  |                                         <TableCell>Nro. Factura</TableCell> | ||||||
|  |                                         <TableCell align="right">Acciones</TableCell> | ||||||
|                                     </TableRow> |                                     </TableRow> | ||||||
|                                 </TableHead> |                                 </TableHead> | ||||||
|                                 <TableBody> |                                 <TableBody> | ||||||
|                                     {resumen.facturas.map((factura) => ( |                                     {resumen.facturas.map((factura) => { | ||||||
|  |                                         const saldo = factura.importeFinal - factura.totalPagado; | ||||||
|  |                                         return ( | ||||||
|                                             <TableRow key={factura.idFactura}> |                                             <TableRow key={factura.idFactura}> | ||||||
|                                                 <TableCell sx={{ fontWeight: 'medium' }}>{factura.nombreEmpresa}</TableCell> |                                                 <TableCell sx={{ fontWeight: 'medium' }}>{factura.nombreEmpresa}</TableCell> | ||||||
|                                             <TableCell align="right">${factura.importeFinal.toFixed(2)}</TableCell> |                                                 <TableCell align="right">{formatCurrency(factura.importeFinal)}</TableCell> | ||||||
|                                             <TableCell><Chip label={factura.estadoPago} size="small" color={factura.estadoPago === 'Pagada' ? 'success' : (factura.estadoPago === 'Rechazada' ? 'error' : 'default')} /></TableCell> |                                                 <TableCell align="right" sx={{ color: 'success.dark' }}> | ||||||
|  |                                                     {formatCurrency(factura.totalPagado)} | ||||||
|  |                                                 </TableCell> | ||||||
|  |                                                 <TableCell align="right" sx={{ fontWeight: 'bold', color: saldo > 0 ? 'error.main' : 'inherit' }}> | ||||||
|  |                                                     {formatCurrency(saldo)} | ||||||
|  |                                                 </TableCell> | ||||||
|  |                                                 <TableCell> | ||||||
|  |                                                     <Chip | ||||||
|  |                                                         label={factura.estadoPago} | ||||||
|  |                                                         size="small" | ||||||
|  |                                                         color={ | ||||||
|  |                                                             factura.estadoPago === 'Pagada' ? 'success' : | ||||||
|  |                                                                 factura.estadoPago === 'Pagada Parcialmente' ? 'primary' : | ||||||
|  |                                                                     factura.estadoPago === 'Rechazada' ? 'error' : | ||||||
|  |                                                                         'default' | ||||||
|  |                                                         } | ||||||
|  |                                                     /> | ||||||
|  |                                                 </TableCell> | ||||||
|                                                 <TableCell><Chip label={factura.estadoFacturacion} size="small" color={factura.estadoFacturacion === 'Facturado' ? 'info' : 'warning'} /></TableCell> |                                                 <TableCell><Chip label={factura.estadoFacturacion} size="small" color={factura.estadoFacturacion === 'Facturado' ? 'info' : 'warning'} /></TableCell> | ||||||
|                                                 <TableCell>{factura.numeroFactura || '-'}</TableCell> |                                                 <TableCell>{factura.numeroFactura || '-'}</TableCell> | ||||||
|                                                 <TableCell align="right"> |                                                 <TableCell align="right"> | ||||||
| @@ -76,7 +108,8 @@ const SuscriptorRow: React.FC<{ | |||||||
|                                                     </Tooltip> |                                                     </Tooltip> | ||||||
|                                                 </TableCell> |                                                 </TableCell> | ||||||
|                                             </TableRow> |                                             </TableRow> | ||||||
|                                     ))} |                                         ); | ||||||
|  |                                     })} | ||||||
|                                 </TableBody> |                                 </TableBody> | ||||||
|                             </Table> |                             </Table> | ||||||
|                         </Box> |                         </Box> | ||||||
| @@ -257,12 +290,12 @@ const ConsultaFacturasPage: React.FC = () => { | |||||||
|                         idFactura: selectedFactura.idFactura, |                         idFactura: selectedFactura.idFactura, | ||||||
|                         nombreSuscriptor: resumenes.find(r => r.idSuscriptor === resumenes.find(res => res.facturas.some(f => f.idFactura === selectedFactura.idFactura))?.idSuscriptor)?.nombreSuscriptor || '', |                         nombreSuscriptor: resumenes.find(r => r.idSuscriptor === resumenes.find(res => res.facturas.some(f => f.idFactura === selectedFactura.idFactura))?.idSuscriptor)?.nombreSuscriptor || '', | ||||||
|                         importeFinal: selectedFactura.importeFinal, |                         importeFinal: selectedFactura.importeFinal, | ||||||
|                         saldoPendiente: selectedFactura.estadoPago === 'Pagada' ? 0 : selectedFactura.importeFinal, |                         saldoPendiente: selectedFactura.importeFinal - selectedFactura.totalPagado, | ||||||
|  |                         totalPagado: selectedFactura.totalPagado, | ||||||
|                         idSuscriptor: resumenes.find(res => res.facturas.some(f => f.idFactura === selectedFactura.idFactura))?.idSuscriptor || 0, |                         idSuscriptor: resumenes.find(res => res.facturas.some(f => f.idFactura === selectedFactura.idFactura))?.idSuscriptor || 0, | ||||||
|                         periodo: '', |                         periodo: '', | ||||||
|                         fechaEmision: '', |                         fechaEmision: '', | ||||||
|                         fechaVencimiento: '', |                         fechaVencimiento: '', | ||||||
|                         totalPagado: selectedFactura.importeFinal - (selectedFactura.estadoPago === 'Pagada' ? 0 : selectedFactura.importeFinal), |  | ||||||
|                         estadoPago: selectedFactura.estadoPago, |                         estadoPago: selectedFactura.estadoPago, | ||||||
|                         estadoFacturacion: selectedFactura.estadoFacturacion, |                         estadoFacturacion: selectedFactura.estadoFacturacion, | ||||||
|                         numeroFactura: selectedFactura.numeroFactura, |                         numeroFactura: selectedFactura.numeroFactura, | ||||||
|   | |||||||
| @@ -16,11 +16,12 @@ const SECCION_PERMISSIONS_PREFIX = "SS"; | |||||||
|  |  | ||||||
| const getModuloFromSeccionCodAcc = (codAcc: string): string | null => { | const getModuloFromSeccionCodAcc = (codAcc: string): string | null => { | ||||||
|   if (codAcc === "SS001") return "Distribución";   |   if (codAcc === "SS001") return "Distribución";   | ||||||
|  |   if (codAcc === "SS007") return "Suscripciones";  | ||||||
|   if (codAcc === "SS002") return "Contables"; |   if (codAcc === "SS002") return "Contables"; | ||||||
|   if (codAcc === "SS003") return "Impresión"; |   if (codAcc === "SS003") return "Impresión"; | ||||||
|   if (codAcc === "SS004") return "Reportes"; |   if (codAcc === "SS004") return "Reportes"; | ||||||
|   if (codAcc === "SS005") return "Radios"; |  | ||||||
|   if (codAcc === "SS006") return "Usuarios";  |   if (codAcc === "SS006") return "Usuarios";  | ||||||
|  |   if (codAcc === "SS005") return "Radios"; | ||||||
|   return null; |   return null; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -38,6 +39,9 @@ const getModuloConceptualDelPermiso = (permisoModulo: string): string => { | |||||||
|     moduloLower.includes("salidas otros destinos")) { |     moduloLower.includes("salidas otros destinos")) { | ||||||
|     return "Distribución"; |     return "Distribución"; | ||||||
|   }   |   }   | ||||||
|  |   if (moduloLower.includes("suscripciones")) { | ||||||
|  |     return "Suscripciones"; | ||||||
|  |   } | ||||||
|   if (moduloLower.includes("cuentas pagos") || |   if (moduloLower.includes("cuentas pagos") || | ||||||
|     moduloLower.includes("cuentas notas") || |     moduloLower.includes("cuentas notas") || | ||||||
|     moduloLower.includes("cuentas tipos pagos")) { |     moduloLower.includes("cuentas tipos pagos")) { | ||||||
| @@ -50,9 +54,6 @@ const getModuloConceptualDelPermiso = (permisoModulo: string): string => { | |||||||
|     moduloLower.includes("tipos bobinas")) { |     moduloLower.includes("tipos bobinas")) { | ||||||
|     return "Impresión"; |     return "Impresión"; | ||||||
|   } |   } | ||||||
|   if (moduloLower.includes("radios")) { |  | ||||||
|     return "Radios"; |  | ||||||
|   } |  | ||||||
|   if (moduloLower.includes("usuarios") || |   if (moduloLower.includes("usuarios") || | ||||||
|     moduloLower.includes("perfiles")) { |     moduloLower.includes("perfiles")) { | ||||||
|     return "Usuarios"; |     return "Usuarios"; | ||||||
| @@ -63,6 +64,9 @@ const getModuloConceptualDelPermiso = (permisoModulo: string): string => { | |||||||
|   if (moduloLower.includes("permisos")) { |   if (moduloLower.includes("permisos")) { | ||||||
|     return "Permisos (Definición)"; |     return "Permisos (Definición)"; | ||||||
|   }   |   }   | ||||||
|  |   if (moduloLower.includes("radios")) { | ||||||
|  |     return "Radios"; | ||||||
|  |   } | ||||||
|   return permisoModulo; |   return permisoModulo; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user