| | | 1 | | using FAU.DataAccess.Repositories; |
| | | 2 | | using FAU.Entidades; |
| | | 3 | | using FAU.Logica.DTOs; |
| | | 4 | | |
| | | 5 | | namespace FAU.Logica.Services; |
| | | 6 | | |
| | | 7 | | public class SituacionService : ISituacionService |
| | | 8 | | { |
| | | 9 | | private readonly ISituacionRepository _situacionRepository; |
| | | 10 | | private readonly IAuditoriaService _auditoriaService; |
| | | 11 | | private readonly ICurrentUserContext _currentUser; |
| | | 12 | | |
| | 7 | 13 | | public SituacionService(ISituacionRepository situacionRepository, IAuditoriaService auditoriaService, ICurrentUserCo |
| | | 14 | | { |
| | 7 | 15 | | _situacionRepository = situacionRepository; |
| | 7 | 16 | | _auditoriaService = auditoriaService; |
| | 7 | 17 | | _currentUser = currentUser; |
| | 7 | 18 | | } |
| | | 19 | | |
| | | 20 | | public async Task<IEnumerable<SituacionDto>> ObtenerTodosAsync() |
| | | 21 | | { |
| | 0 | 22 | | var situaciones = await _situacionRepository.ObtenerTodosAsync(); |
| | 0 | 23 | | return situaciones.Select(s => new SituacionDto { Id = s.Id, Codigo = s.Codigo, Denominacion = s.Denominacion }) |
| | 0 | 24 | | } |
| | | 25 | | |
| | | 26 | | public async Task<(bool Exito, SituacionDto? Resultado, string? Error)> CrearAsync(CrearSituacionRequest request) |
| | | 27 | | { |
| | | 28 | | try |
| | | 29 | | { |
| | 4 | 30 | | if (string.IsNullOrWhiteSpace(request.Codigo)) |
| | 1 | 31 | | return (false, null, "El código es requerido"); |
| | | 32 | | |
| | 3 | 33 | | if (string.IsNullOrWhiteSpace(request.Denominacion)) |
| | 1 | 34 | | return (false, null, "La denominación es requerida"); |
| | | 35 | | |
| | 2 | 36 | | if (await _situacionRepository.ExisteCodigoAsync(request.Codigo.Trim())) |
| | 1 | 37 | | return (false, null, "Ya existe una situación con ese código"); |
| | | 38 | | |
| | 1 | 39 | | var nueva = new Situacion |
| | 1 | 40 | | { |
| | 1 | 41 | | Codigo = request.Codigo.Trim(), |
| | 1 | 42 | | Denominacion = request.Denominacion.Trim(), |
| | 1 | 43 | | Descripcion = request.Descripcion?.Trim(), |
| | 1 | 44 | | SistemaSalud = request.SistemaSalud, |
| | 1 | 45 | | Calculador = request.Calculador?.Trim(), |
| | 1 | 46 | | AfectaCobro = request.AfectaCobro, |
| | 1 | 47 | | Vigente = request.Vigente |
| | 1 | 48 | | }; |
| | | 49 | | |
| | 1 | 50 | | var creada = await _situacionRepository.CrearAsync(nueva); |
| | | 51 | | |
| | 1 | 52 | | await _auditoriaService.LogAuditoriaAsync( |
| | 1 | 53 | | usuarioId: _currentUser.UserId ?? 0, |
| | 1 | 54 | | AccionEnum.CrearPersonal, |
| | 1 | 55 | | ContextoEnum.Personal, |
| | 1 | 56 | | host: _currentUser.Host, |
| | 1 | 57 | | entidad: nameof(Situacion), |
| | 1 | 58 | | entidadId: creada.Id, |
| | 1 | 59 | | detalle: new { operacion = "crear", id = creada.Id, codigo = creada.Codigo }); |
| | | 60 | | |
| | 1 | 61 | | return (true, new SituacionDto { Id = creada.Id, Codigo = creada.Codigo, Denominacion = creada.Denominacion |
| | | 62 | | } |
| | 0 | 63 | | catch (Exception ex) |
| | | 64 | | { |
| | 0 | 65 | | return (false, null, $"Error al crear situación: {ex.Message}"); |
| | | 66 | | } |
| | 4 | 67 | | } |
| | | 68 | | |
| | | 69 | | public async Task<(bool Exito, SituacionDto? Resultado, string? Error)> ActualizarAsync(long id, ActualizarSituacion |
| | | 70 | | { |
| | | 71 | | try |
| | | 72 | | { |
| | 3 | 73 | | var situacion = await _situacionRepository.ObtenerPorIdAsync(id); |
| | 3 | 74 | | if (situacion == null) |
| | 1 | 75 | | return (false, null, "Situación no encontrada"); |
| | | 76 | | |
| | 2 | 77 | | var snapshotAntes = new { id = situacion.Id, codigo = situacion.Codigo }; |
| | | 78 | | |
| | 2 | 79 | | if (!string.IsNullOrWhiteSpace(request.Codigo)) |
| | | 80 | | { |
| | 1 | 81 | | var codigoNormalizado = request.Codigo.Trim(); |
| | 1 | 82 | | if (!string.Equals(situacion.Codigo, codigoNormalizado, StringComparison.Ordinal) && await _situacionRep |
| | 1 | 83 | | return (false, null, "Ya existe una situación con ese código"); |
| | 0 | 84 | | situacion.Codigo = codigoNormalizado; |
| | 0 | 85 | | } |
| | | 86 | | |
| | 1 | 87 | | if (!string.IsNullOrWhiteSpace(request.Denominacion)) |
| | 1 | 88 | | situacion.Denominacion = request.Denominacion.Trim(); |
| | | 89 | | |
| | 1 | 90 | | if (request.Descripcion != null) |
| | 0 | 91 | | situacion.Descripcion = request.Descripcion.Trim(); |
| | | 92 | | |
| | 1 | 93 | | if (!string.IsNullOrWhiteSpace(request.SistemaSalud)) |
| | 0 | 94 | | situacion.SistemaSalud = request.SistemaSalud; |
| | | 95 | | |
| | 1 | 96 | | if (request.Calculador != null) |
| | 0 | 97 | | situacion.Calculador = request.Calculador.Trim(); |
| | | 98 | | |
| | 1 | 99 | | if (request.AfectaCobro.HasValue) |
| | 0 | 100 | | situacion.AfectaCobro = request.AfectaCobro.Value; |
| | | 101 | | |
| | 1 | 102 | | if (request.Vigente.HasValue) |
| | 0 | 103 | | situacion.Vigente = request.Vigente.Value; |
| | | 104 | | |
| | 1 | 105 | | var actualizada = await _situacionRepository.ActualizarAsync(situacion); |
| | | 106 | | |
| | 1 | 107 | | await _auditoriaService.LogAuditoriaAsync( |
| | 1 | 108 | | usuarioId: _currentUser.UserId ?? 0, |
| | 1 | 109 | | AccionEnum.ActualizarPersonal, |
| | 1 | 110 | | ContextoEnum.Personal, |
| | 1 | 111 | | host: _currentUser.Host, |
| | 1 | 112 | | entidad: nameof(Situacion), |
| | 1 | 113 | | entidadId: actualizada.Id, |
| | 1 | 114 | | detalle: new { operacion = "actualizar", antes = snapshotAntes, despues = new { id = actualizada.Id, cod |
| | | 115 | | |
| | 1 | 116 | | return (true, new SituacionDto { Id = actualizada.Id, Codigo = actualizada.Codigo, Denominacion = actualizad |
| | | 117 | | } |
| | 0 | 118 | | catch (Exception ex) |
| | | 119 | | { |
| | 0 | 120 | | return (false, null, $"Error al actualizar situación: {ex.Message}"); |
| | | 121 | | } |
| | 3 | 122 | | } |
| | | 123 | | } |