109 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using GestionIntegral.Api.Dtos.Contables;
 | |
| using GestionIntegral.Api.Services.Contables;
 | |
| using Microsoft.AspNetCore.Authorization;
 | |
| using Microsoft.AspNetCore.Mvc;
 | |
| using Microsoft.Extensions.Logging;
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Security.Claims;
 | |
| using System.Threading.Tasks;
 | |
| 
 | |
| namespace GestionIntegral.Api.Controllers.Contables
 | |
| {
 | |
|     [Route("api/saldos")]
 | |
|     [ApiController]
 | |
|     [Authorize] // Requiere autenticación para todos los endpoints
 | |
|     public class SaldosController : ControllerBase
 | |
|     {
 | |
|         private readonly ISaldoService _saldoService;
 | |
|         private readonly ILogger<SaldosController> _logger;
 | |
| 
 | |
|         // Define un permiso específico para ver saldos, y otro para ajustarlos (SuperAdmin implícito)
 | |
|         private const string PermisoVerSaldos = "CS001"; // Ejemplo: Cuentas Saldos Ver
 | |
|         private const string PermisoAjustarSaldos = "CS002"; // Ejemplo: Cuentas Saldos Ajustar (o solo SuperAdmin)
 | |
| 
 | |
| 
 | |
|         public SaldosController(ISaldoService saldoService, ILogger<SaldosController> logger)
 | |
|         {
 | |
|             _saldoService = saldoService;
 | |
|             _logger = logger;
 | |
|         }
 | |
| 
 | |
|         private bool TienePermiso(string codAccRequerido)
 | |
|         {
 | |
|             if (User.IsInRole("SuperAdmin")) return true;
 | |
|             return User.HasClaim(c => c.Type == "permission" && c.Value == codAccRequerido);
 | |
|         }
 | |
|         private int? GetCurrentUserId()
 | |
|         {
 | |
|             if (int.TryParse(User.FindFirstValue(ClaimTypes.NameIdentifier) ?? User.FindFirstValue("sub"), out int userId)) return userId;
 | |
|             _logger.LogWarning("No se pudo obtener el UserId del token JWT en SaldosController.");
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         // GET: api/saldos
 | |
|         [HttpGet]
 | |
|         [ProducesResponseType(typeof(IEnumerable<SaldoGestionDto>), StatusCodes.Status200OK)]
 | |
|         [ProducesResponseType(StatusCodes.Status403Forbidden)]
 | |
|         public async Task<IActionResult> GetSaldosGestion(
 | |
|             [FromQuery] string? destino, 
 | |
|             [FromQuery] int? idDestino, 
 | |
|             [FromQuery] int? idEmpresa)
 | |
|         {
 | |
|             if (!TienePermiso(PermisoVerSaldos)) // Usar el nuevo permiso
 | |
|             {
 | |
|                 _logger.LogWarning("Acceso denegado a GetSaldosGestion para Usuario ID {userId}", GetCurrentUserId() ?? 0);
 | |
|                 return Forbid();
 | |
|             }
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 var saldos = await _saldoService.ObtenerSaldosParaGestionAsync(destino, idDestino, idEmpresa);
 | |
|                 return Ok(saldos);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 _logger.LogError(ex, "Error al obtener saldos para gestión.");
 | |
|                 return StatusCode(StatusCodes.Status500InternalServerError, "Error interno al obtener saldos.");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // POST: api/saldos/ajustar
 | |
|         [HttpPost("ajustar")]
 | |
|         [ProducesResponseType(typeof(SaldoGestionDto), StatusCodes.Status200OK)] // Devuelve el saldo actualizado
 | |
|         [ProducesResponseType(StatusCodes.Status400BadRequest)]
 | |
|         [ProducesResponseType(StatusCodes.Status403Forbidden)] // Solo SuperAdmin o con permiso específico
 | |
|         [ProducesResponseType(StatusCodes.Status404NotFound)]
 | |
|         public async Task<IActionResult> AjustarSaldoManualmente([FromBody] AjusteSaldoRequestDto ajusteDto)
 | |
|         {
 | |
|             // Esta operación debería ser MUY restringida. Solo SuperAdmin o un permiso muy específico.
 | |
|             if (!User.IsInRole("SuperAdmin") && !TienePermiso(PermisoAjustarSaldos))
 | |
|             {
 | |
|                  _logger.LogWarning("Intento no autorizado de ajustar saldo por Usuario ID {userId}", GetCurrentUserId() ?? 0);
 | |
|                 return Forbid("No tiene permisos para realizar ajustes manuales de saldo.");
 | |
|             }
 | |
| 
 | |
|             if (!ModelState.IsValid) return BadRequest(ModelState);
 | |
| 
 | |
|             var idUsuario = GetCurrentUserId();
 | |
|             if (idUsuario == null) return Unauthorized("No se pudo identificar al usuario.");
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 var (exito, error, saldoActualizado) = await _saldoService.RealizarAjusteManualSaldoAsync(ajusteDto, idUsuario.Value);
 | |
|                 if (!exito)
 | |
|                 {
 | |
|                     if (error != null && error.Contains("No se encontró un saldo existente"))
 | |
|                         return NotFound(new { message = error });
 | |
|                     return BadRequest(new { message = error ?? "Error desconocido al ajustar el saldo." });
 | |
|                 }
 | |
|                 return Ok(saldoActualizado);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 _logger.LogError(ex, "Error crítico al ajustar saldo manualmente.");
 | |
|                 return StatusCode(StatusCodes.Status500InternalServerError, "Error interno al procesar el ajuste de saldo.");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |