feat(contables): cierre mensual de cuenta corriente de distribuidor

Permite congelar el saldo de un distribuidor por empresa a una fecha de
corte y bloquear modificaciones retroactivas sobre el período cerrado.
El saldo se calcula sumando movimientos en rango (sin tocar cue_Saldos).
Incluye reapertura controlada exclusivamente por SuperAdmin, reporte con
saldo inicial, atajo "Desde último cierre", y auditoría del ciclo de
vida _H. Permisos CC001/CC002/CC003. Middleware global mapea bloqueos
por período cerrado a HTTP 409.
This commit is contained in:
2026-05-07 12:03:26 -03:00
parent 7e274ef114
commit 24eaf18fd9
62 changed files with 2813 additions and 162 deletions

View File

@@ -51,6 +51,7 @@ namespace GestionIntegral.Api.Controllers
private readonly IPerfilService _perfilService;
private readonly IPermisoService _permisoService;
private readonly ICambioParadaService _cambioParadaService;
private readonly ICierreCuentaCorrienteService _cierreCcService;
private readonly ILogger<AuditoriaController> _logger;
// Permiso general para ver cualquier auditoría.
@@ -86,6 +87,7 @@ namespace GestionIntegral.Api.Controllers
IPerfilService perfilService,
IPermisoService permisoService,
ICambioParadaService cambioParadaService,
ICierreCuentaCorrienteService cierreCcService,
ILogger<AuditoriaController> logger)
{
_usuarioService = usuarioService;
@@ -116,6 +118,7 @@ namespace GestionIntegral.Api.Controllers
_perfilService = perfilService;
_cambioParadaService = cambioParadaService;
_permisoService = permisoService;
_cierreCcService = cierreCcService;
_logger = logger;
}
@@ -692,6 +695,26 @@ namespace GestionIntegral.Api.Controllers
}
}
[HttpGet("cierres-cuenta-corriente")]
[ProducesResponseType(typeof(IEnumerable<CierreCuentaCorrienteHistorialDto>), StatusCodes.Status200OK)]
public async Task<IActionResult> GetHistorialCierresCuentaCorriente(
[FromQuery] DateTime? fechaDesde, [FromQuery] DateTime? fechaHasta,
[FromQuery] int? idUsuarioModifico, [FromQuery] string? tipoModificacion,
[FromQuery] int? idCierreAfectado)
{
if (!TienePermiso(PermisoVerAuditoria)) return Forbid();
try
{
var historial = await _cierreCcService.ObtenerHistorialAsync(fechaDesde, fechaHasta, idUsuarioModifico, tipoModificacion, idCierreAfectado);
return Ok(historial ?? Enumerable.Empty<CierreCuentaCorrienteHistorialDto>());
}
catch (Exception ex)
{
_logger.LogError(ex, "Error obteniendo historial de Cierres de Cuenta Corriente.");
return StatusCode(500, "Error interno al obtener historial de Cierres de Cuenta Corriente.");
}
}
[HttpGet("cambios-parada-canilla")]
[ProducesResponseType(typeof(IEnumerable<CambioParadaHistorialDto>), StatusCodes.Status200OK)]
public async Task<IActionResult> GetHistorialCambiosParada(