Feat: Solicitudes Contaduría
All checks were successful
Optimized Build and Deploy / remote-build-and-deploy (push) Successful in 6m57s

- Siglas Días en Reporte Dist. General
- Mostrar Publicaciones Deshabilitadas en Selectores de Reportes
This commit is contained in:
2025-07-21 12:44:21 -03:00
parent 3e1ac6f742
commit c251a0adf4
9 changed files with 26 additions and 15 deletions

View File

@@ -42,7 +42,7 @@ namespace GestionIntegral.Api.Controllers.Distribucion
[HttpGet] [HttpGet]
[ProducesResponseType(typeof(IEnumerable<PublicacionDto>), StatusCodes.Status200OK)] [ProducesResponseType(typeof(IEnumerable<PublicacionDto>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status403Forbidden)]
public async Task<IActionResult> GetAllPublicaciones([FromQuery] string? nombre, [FromQuery] int? idEmpresa, [FromQuery] bool? soloHabilitadas = true) public async Task<IActionResult> GetAllPublicaciones([FromQuery] string? nombre, [FromQuery] int? idEmpresa, [FromQuery] bool? soloHabilitadas)
{ {
if (!TienePermiso(PermisoVer)) return Forbid(); if (!TienePermiso(PermisoVer)) return Forbid();
var publicaciones = await _publicacionService.ObtenerTodasAsync(nombre, idEmpresa, soloHabilitadas); var publicaciones = await _publicacionService.ObtenerTodasAsync(nombre, idEmpresa, soloHabilitadas);
@@ -54,7 +54,7 @@ namespace GestionIntegral.Api.Controllers.Distribucion
[ProducesResponseType(typeof(IEnumerable<PublicacionDropdownDto>), StatusCodes.Status200OK)] [ProducesResponseType(typeof(IEnumerable<PublicacionDropdownDto>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status500InternalServerError)]
// No se verifica permiso DP001, solo requiere autenticación general ([Authorize] del controlador) // No se verifica permiso DP001, solo requiere autenticación general ([Authorize] del controlador)
public async Task<IActionResult> GetPublicacionesForDropdown([FromQuery] bool soloHabilitadas = true) public async Task<IActionResult> GetPublicacionesForDropdown([FromQuery] bool? soloHabilitadas)
{ {
try try
{ {

View File

@@ -69,7 +69,7 @@ namespace GestionIntegral.Api.Controllers.Reportes.PdfTemplates
{ {
table.ColumnsDefinition(columns => table.ColumnsDefinition(columns =>
{ {
columns.ConstantColumn(40); columns.ConstantColumn(60);
columns.RelativeColumn(); columns.RelativeColumn();
columns.RelativeColumn(); columns.RelativeColumn();
columns.RelativeColumn(); columns.RelativeColumn();
@@ -89,9 +89,20 @@ namespace GestionIntegral.Api.Controllers.Reportes.PdfTemplates
header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).AlignRight().Text("Vendidos"); header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).AlignRight().Text("Vendidos");
}); });
var dayAbbreviations = new Dictionary<System.DayOfWeek, string>
{
{ System.DayOfWeek.Sunday, "Dom" },
{ System.DayOfWeek.Monday, "Lun" },
{ System.DayOfWeek.Tuesday, "Mar" },
{ System.DayOfWeek.Wednesday, "Mie" },
{ System.DayOfWeek.Thursday, "Jue" },
{ System.DayOfWeek.Friday, "Vie" },
{ System.DayOfWeek.Saturday, "Sab" }
};
foreach (var item in Model.ResumenMensual.OrderBy(x => x.Fecha)) foreach (var item in Model.ResumenMensual.OrderBy(x => x.Fecha))
{ {
table.Cell().Border(1).Padding(3).Text(item.Fecha.Day.ToString()); table.Cell().Border(1).Padding(3).Text($"{dayAbbreviations[item.Fecha.DayOfWeek]} {item.Fecha.Day}");
table.Cell().Border(1).Padding(3).AlignRight().Text(item.CantidadTirada.ToString("N0")); table.Cell().Border(1).Padding(3).AlignRight().Text(item.CantidadTirada.ToString("N0"));
table.Cell().Border(1).Padding(3).AlignRight().Text(item.SinCargo.ToString("N0")); table.Cell().Border(1).Padding(3).AlignRight().Text(item.SinCargo.ToString("N0"));
table.Cell().Border(1).Padding(3).AlignRight().Text(item.Perdidos.ToString("N0")); table.Cell().Border(1).Padding(3).AlignRight().Text(item.Perdidos.ToString("N0"));

View File

@@ -15,7 +15,7 @@ namespace GestionIntegral.Api.Services.Distribucion
Task<IEnumerable<PublicacionDiaSemanaDto>> ObtenerConfiguracionDiasAsync(int idPublicacion); Task<IEnumerable<PublicacionDiaSemanaDto>> ObtenerConfiguracionDiasAsync(int idPublicacion);
Task<IEnumerable<PublicacionDto>> ObtenerPublicacionesPorDiaSemanaAsync(byte diaSemana); // Devolvemos el DTO completo Task<IEnumerable<PublicacionDto>> ObtenerPublicacionesPorDiaSemanaAsync(byte diaSemana); // Devolvemos el DTO completo
Task<(bool Exito, string? Error)> ActualizarConfiguracionDiasAsync(int idPublicacion, UpdatePublicacionDiasSemanaRequestDto requestDto, int idUsuario); Task<(bool Exito, string? Error)> ActualizarConfiguracionDiasAsync(int idPublicacion, UpdatePublicacionDiasSemanaRequestDto requestDto, int idUsuario);
Task<IEnumerable<PublicacionDropdownDto>> ObtenerParaDropdownAsync(bool soloHabilitadas); Task<IEnumerable<PublicacionDropdownDto>> ObtenerParaDropdownAsync(bool? soloHabilitadas);
Task<IEnumerable<PublicacionHistorialDto>> ObtenerHistorialAsync( Task<IEnumerable<PublicacionHistorialDto>> ObtenerHistorialAsync(
DateTime? fechaDesde, DateTime? fechaHasta, DateTime? fechaDesde, DateTime? fechaHasta,
int? idUsuarioModifico, string? tipoModificacion, int? idUsuarioModifico, string? tipoModificacion,

View File

@@ -76,7 +76,7 @@ namespace GestionIntegral.Api.Services.Distribucion
return MapToDto(data); return MapToDto(data);
} }
public async Task<IEnumerable<PublicacionDropdownDto>> ObtenerParaDropdownAsync(bool soloHabilitadas) public async Task<IEnumerable<PublicacionDropdownDto>> ObtenerParaDropdownAsync(bool? soloHabilitadas)
{ {
var data = await _publicacionRepository.GetAllAsync(null, null, soloHabilitadas); var data = await _publicacionRepository.GetAllAsync(null, null, soloHabilitadas);

View File

@@ -41,7 +41,7 @@ const SeleccionaReporteListadoDistribucion: React.FC<SeleccionaReporteListadoDis
try { try {
const [distData, pubData] = await Promise.all([ const [distData, pubData] = await Promise.all([
distribuidorService.getAllDistribuidoresDropdown(), distribuidorService.getAllDistribuidoresDropdown(),
publicacionService.getPublicacionesForDropdown(true) // Solo habilitadas publicacionService.getPublicacionesForDropdown()
]); ]);
setDistribuidores(distData.map(d => d)); setDistribuidores(distData.map(d => d));
setPublicaciones(pubData.map(p => p)); setPublicaciones(pubData.map(p => p));

View File

@@ -5,7 +5,7 @@ import {
ToggleButtonGroup, ToggleButtonGroup,
ToggleButton ToggleButton
} from '@mui/material'; } from '@mui/material';
import type { PublicacionDto } from '../../models/dtos/Distribucion/PublicacionDto'; import type { PublicacionDropdownDto } from '../../models/dtos/Distribucion/PublicacionDropdownDto';
import publicacionService from '../../services/Distribucion/publicacionService'; import publicacionService from '../../services/Distribucion/publicacionService';
interface SeleccionaReporteListadoDistribucionCanillasImporteProps { interface SeleccionaReporteListadoDistribucionCanillasImporteProps {
@@ -30,7 +30,7 @@ const SeleccionaReporteListadoDistribucionCanillasImporte: React.FC<SeleccionaRe
const [fechaHasta, setFechaHasta] = useState<string>(new Date().toISOString().split('T')[0]); const [fechaHasta, setFechaHasta] = useState<string>(new Date().toISOString().split('T')[0]);
const [esAccionista, setEsAccionista] = useState<boolean>(false); const [esAccionista, setEsAccionista] = useState<boolean>(false);
const [publicaciones, setPublicaciones] = useState<PublicacionDto[]>([]); const [publicaciones, setPublicaciones] = useState<PublicacionDropdownDto[]>([]);
const [loadingDropdowns, setLoadingDropdowns] = useState(false); const [loadingDropdowns, setLoadingDropdowns] = useState(false);
const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({});
@@ -38,7 +38,7 @@ const SeleccionaReporteListadoDistribucionCanillasImporte: React.FC<SeleccionaRe
const fetchPublicaciones = async () => { const fetchPublicaciones = async () => {
setLoadingDropdowns(true); setLoadingDropdowns(true);
try { try {
const data = await publicacionService.getAllPublicaciones(undefined, undefined); const data = await publicacionService.getPublicacionesForDropdown();
setPublicaciones(data.map(p => p)); setPublicaciones(data.map(p => p));
} catch (error) { } catch (error) {
console.error("Error al cargar publicaciones:", error); console.error("Error al cargar publicaciones:", error);

View File

@@ -3,7 +3,7 @@ import {
Box, Typography, Button, CircularProgress, Alert, Box, Typography, Button, CircularProgress, Alert,
FormControl, InputLabel, Select, MenuItem, TextField FormControl, InputLabel, Select, MenuItem, TextField
} from '@mui/material'; } from '@mui/material';
import type { PublicacionDto } from '../../models/dtos/Distribucion/PublicacionDto'; import type { PublicacionDropdownDto } from '../../models/dtos/Distribucion/PublicacionDropdownDto';
import publicacionService from '../../services/Distribucion/publicacionService'; import publicacionService from '../../services/Distribucion/publicacionService';
interface SeleccionaReporteListadoDistribucionGeneralProps { interface SeleccionaReporteListadoDistribucionGeneralProps {
@@ -26,7 +26,7 @@ const SeleccionaReporteListadoDistribucionGeneral: React.FC<SeleccionaReporteLis
// Para el selector de mes/año, usamos un input type="month" // Para el selector de mes/año, usamos un input type="month"
const [mesAnio, setMesAnio] = useState<string>(new Date().toISOString().substring(0, 7)); // Formato "YYYY-MM" const [mesAnio, setMesAnio] = useState<string>(new Date().toISOString().substring(0, 7)); // Formato "YYYY-MM"
const [publicaciones, setPublicaciones] = useState<PublicacionDto[]>([]); const [publicaciones, setPublicaciones] = useState<PublicacionDropdownDto[]>([]);
const [loadingDropdowns, setLoadingDropdowns] = useState(false); const [loadingDropdowns, setLoadingDropdowns] = useState(false);
const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({});
@@ -35,7 +35,7 @@ const SeleccionaReporteListadoDistribucionGeneral: React.FC<SeleccionaReporteLis
setLoadingDropdowns(true); setLoadingDropdowns(true);
try { try {
// Asumiendo que quieres solo publicaciones habilitadas // Asumiendo que quieres solo publicaciones habilitadas
const data = await publicacionService.getAllPublicaciones(undefined, undefined, true); const data = await publicacionService.getPublicacionesForDropdown();
setPublicaciones(data.map(p => p)); // El servicio devuelve tupla setPublicaciones(data.map(p => p)); // El servicio devuelve tupla
} catch (error) { } catch (error) {
console.error("Error al cargar publicaciones:", error); console.error("Error al cargar publicaciones:", error);

View File

@@ -41,7 +41,7 @@ const SeleccionaReporteTiradasPublicacionesSecciones: React.FC<SeleccionaReporte
setLoadingDropdowns(true); setLoadingDropdowns(true);
try { try {
const [pubData, plantaData] = await Promise.all([ const [pubData, plantaData] = await Promise.all([
publicacionService.getPublicacionesForDropdown(true), publicacionService.getPublicacionesForDropdown(),
plantaService.getPlantasForDropdown() plantaService.getPlantasForDropdown()
]); ]);
setPublicaciones(pubData.map(p => p)); setPublicaciones(pubData.map(p => p));

View File

@@ -52,7 +52,7 @@ const getPublicacionesPorDiaSemana = async (diaSemana: number): Promise<Publicac
return response.data; return response.data;
}; };
const getPublicacionesForDropdown = async (soloHabilitadas: boolean): Promise<PublicacionDropdownDto[]> => { const getPublicacionesForDropdown = async (soloHabilitadas?: boolean): Promise<PublicacionDropdownDto[]> => {
const response = await apiClient.get<PublicacionDropdownDto[]>('/publicaciones/dropdown', { params: { soloHabilitadas } }); const response = await apiClient.get<PublicacionDropdownDto[]>('/publicaciones/dropdown', { params: { soloHabilitadas } });
return response.data; return response.data;
}; };