Refinamiento de permisos y ajustes en controles. Añade gestión sobre saldos y visualización. Entre otros..
This commit is contained in:
		| @@ -95,7 +95,6 @@ namespace GestionIntegral.Api.Services.Contables | ||||
|             if (await _pagoRepo.ExistsByReciboAndTipoMovimientoAsync(createDto.Recibo, createDto.TipoMovimiento)) | ||||
|                  return (null, $"Ya existe un pago '{createDto.TipoMovimiento}' con el número de recibo '{createDto.Recibo}'."); | ||||
|  | ||||
|  | ||||
|             var nuevoPago = new PagoDistribuidor | ||||
|             { | ||||
|                 IdDistribuidor = createDto.IdDistribuidor, | ||||
| @@ -109,19 +108,29 @@ namespace GestionIntegral.Api.Services.Contables | ||||
|             }; | ||||
|  | ||||
|             using var connection = _connectionFactory.CreateConnection(); | ||||
|             if (connection is System.Data.Common.DbConnection dbConn) await dbConn.OpenAsync(); else connection.Open(); | ||||
|             using var transaction = connection.BeginTransaction(); | ||||
|             IDbTransaction? transaction = null; // Declarar fuera para el finally | ||||
|             try | ||||
|             { | ||||
|                 if (connection.State != ConnectionState.Open) | ||||
|                 { | ||||
|                     if (connection is System.Data.Common.DbConnection dbConn) await dbConn.OpenAsync(); else connection.Open(); | ||||
|                 } | ||||
|                 transaction = connection.BeginTransaction(); | ||||
|                  | ||||
|                 var pagoCreado = await _pagoRepo.CreateAsync(nuevoPago, idUsuario, transaction); | ||||
|                 if (pagoCreado == null) throw new DataException("Error al registrar el pago."); | ||||
|  | ||||
|                 // Afectar Saldo | ||||
|                 // Si TipoMovimiento es "Recibido", el monto DISMINUYE la deuda del distribuidor (monto positivo para el servicio de saldo). | ||||
|                 // Si TipoMovimiento es "Realizado" (empresa paga a distribuidor), el monto AUMENTA la deuda (monto negativo para el servicio de saldo). | ||||
|                 decimal montoAjusteSaldo = createDto.TipoMovimiento == "Recibido" ? createDto.Monto : -createDto.Monto; | ||||
|                 decimal montoParaSaldo; | ||||
|                 if (createDto.TipoMovimiento == "Recibido") | ||||
|                 { | ||||
|                     montoParaSaldo = -createDto.Monto;  | ||||
|                 } | ||||
|                 else  | ||||
|                 { | ||||
|                     montoParaSaldo = createDto.Monto;  | ||||
|                 } | ||||
|  | ||||
|                 bool saldoActualizado = await _saldoRepo.ModificarSaldoAsync("Distribuidores", pagoCreado.IdDistribuidor, pagoCreado.IdEmpresa, montoAjusteSaldo, transaction); | ||||
|                 bool saldoActualizado = await _saldoRepo.ModificarSaldoAsync("Distribuidores", pagoCreado.IdDistribuidor, pagoCreado.IdEmpresa, montoParaSaldo, transaction); | ||||
|                 if (!saldoActualizado) throw new DataException("Error al actualizar el saldo del distribuidor."); | ||||
|  | ||||
|                 transaction.Commit(); | ||||
| @@ -130,37 +139,63 @@ namespace GestionIntegral.Api.Services.Contables | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 try { transaction.Rollback(); } catch { } | ||||
|                 try { transaction?.Rollback(); } catch (Exception rbEx) { _logger.LogError(rbEx, "Error en Rollback de CrearAsync PagoDistribuidor."); } | ||||
|                 _logger.LogError(ex, "Error CrearAsync PagoDistribuidor."); | ||||
|                 return (null, $"Error interno: {ex.Message}"); | ||||
|             } | ||||
|             finally  | ||||
|             { | ||||
|                 if (connection.State == ConnectionState.Open) | ||||
|                 { | ||||
|                     if (connection is System.Data.Common.DbConnection dbConn) await dbConn.CloseAsync(); else connection.Close(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public async Task<(bool Exito, string? Error)> ActualizarAsync(int idPago, UpdatePagoDistribuidorDto updateDto, int idUsuario) | ||||
|         { | ||||
|             using var connection = _connectionFactory.CreateConnection(); | ||||
|             if (connection is System.Data.Common.DbConnection dbConn) await dbConn.OpenAsync(); else connection.Open(); | ||||
|             using var transaction = connection.BeginTransaction(); | ||||
|             IDbTransaction? transaction = null; | ||||
|             try | ||||
|             { | ||||
|                 var pagoExistente = await _pagoRepo.GetByIdAsync(idPago); | ||||
|                 if (pagoExistente == null) return (false, "Pago no encontrado."); | ||||
|                 if (connection.State != ConnectionState.Open) | ||||
|                 { | ||||
|                     if (connection is System.Data.Common.DbConnection dbConn) await dbConn.OpenAsync(); else connection.Open(); | ||||
|                 } | ||||
|                 transaction = connection.BeginTransaction(); | ||||
|  | ||||
|                 var pagoExistente = await _pagoRepo.GetByIdAsync(idPago);  | ||||
|                 if (pagoExistente == null)  | ||||
|                 { | ||||
|                     transaction.Rollback(); // Rollback si no se encuentra | ||||
|                     return (false, "Pago no encontrado."); | ||||
|                 } | ||||
|  | ||||
|                 if (await _tipoPagoRepo.GetByIdAsync(updateDto.IdTipoPago) == null) | ||||
|                 { | ||||
|                     transaction.Rollback(); | ||||
|                     return (false, "Tipo de pago no válido."); | ||||
|                 } | ||||
|                  | ||||
|                 decimal impactoOriginalSaldo = pagoExistente.TipoMovimiento == "Recibido" ? -pagoExistente.Monto : pagoExistente.Monto; | ||||
|                 decimal impactoNuevoSaldo = pagoExistente.TipoMovimiento == "Recibido" ? -updateDto.Monto : updateDto.Monto; | ||||
|                 decimal diferenciaAjusteSaldo = impactoNuevoSaldo - impactoOriginalSaldo; | ||||
|  | ||||
|                 // Calcular la diferencia de monto para ajustar el saldo | ||||
|                 decimal montoOriginal = pagoExistente.TipoMovimiento == "Recibido" ? pagoExistente.Monto : -pagoExistente.Monto; | ||||
|                 decimal montoNuevo = pagoExistente.TipoMovimiento == "Recibido" ? updateDto.Monto : -updateDto.Monto; | ||||
|                 decimal diferenciaAjusteSaldo = montoNuevo - montoOriginal; | ||||
|                 var pagoParaActualizarEnRepo = new PagoDistribuidor | ||||
|                 { | ||||
|                     IdPago = pagoExistente.IdPago, | ||||
|                     IdDistribuidor = pagoExistente.IdDistribuidor,  | ||||
|                     Fecha = pagoExistente.Fecha,                    | ||||
|                     TipoMovimiento = pagoExistente.TipoMovimiento,  | ||||
|                     Recibo = pagoExistente.Recibo,                  | ||||
|                     Monto = updateDto.Monto,                        | ||||
|                     IdTipoPago = updateDto.IdTipoPago,              | ||||
|                     Detalle = updateDto.Detalle,                    | ||||
|                     IdEmpresa = pagoExistente.IdEmpresa             | ||||
|                 }; | ||||
|  | ||||
|                 // Actualizar campos permitidos | ||||
|                 pagoExistente.Monto = updateDto.Monto; | ||||
|                 pagoExistente.IdTipoPago = updateDto.IdTipoPago; | ||||
|                 pagoExistente.Detalle = updateDto.Detalle; | ||||
|  | ||||
|                 var actualizado = await _pagoRepo.UpdateAsync(pagoExistente, idUsuario, transaction); | ||||
|                 if (!actualizado) throw new DataException("Error al actualizar el pago."); | ||||
|                 var actualizado = await _pagoRepo.UpdateAsync(pagoParaActualizarEnRepo, idUsuario, transaction); | ||||
|                 if (!actualizado) throw new DataException("Error al actualizar el pago en la base de datos."); | ||||
|  | ||||
|                 if (diferenciaAjusteSaldo != 0) | ||||
|                 { | ||||
| @@ -172,32 +207,45 @@ namespace GestionIntegral.Api.Services.Contables | ||||
|                 _logger.LogInformation("PagoDistribuidor ID {Id} actualizado por Usuario ID {UserId}.", idPago, idUsuario); | ||||
|                 return (true, null); | ||||
|             } | ||||
|             catch (KeyNotFoundException) { try { transaction.Rollback(); } catch { } return (false, "Pago no encontrado."); } | ||||
|             catch (KeyNotFoundException) { try { transaction?.Rollback(); } catch (Exception rbEx) { _logger.LogError(rbEx, "Error en Rollback de ActualizarAsync PagoDistribuidor (KeyNotFound)."); } return (false, "Pago no encontrado."); } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 try { transaction.Rollback(); } catch { } | ||||
|                 try { transaction?.Rollback(); } catch (Exception rbEx) { _logger.LogError(rbEx, "Error en Rollback de ActualizarAsync PagoDistribuidor."); } | ||||
|                 _logger.LogError(ex, "Error ActualizarAsync PagoDistribuidor ID: {Id}", idPago); | ||||
|                 return (false, $"Error interno: {ex.Message}"); | ||||
|             } | ||||
|              finally | ||||
|             { | ||||
|                 if (connection.State == ConnectionState.Open) | ||||
|                 { | ||||
|                     if (connection is System.Data.Common.DbConnection dbConn) await dbConn.CloseAsync(); else connection.Close(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public async Task<(bool Exito, string? Error)> EliminarAsync(int idPago, int idUsuario) | ||||
|         { | ||||
|             using var connection = _connectionFactory.CreateConnection(); | ||||
|             if (connection is System.Data.Common.DbConnection dbConn) await dbConn.OpenAsync(); else connection.Open(); | ||||
|             using var transaction = connection.BeginTransaction(); | ||||
|             IDbTransaction? transaction = null; | ||||
|             try | ||||
|             { | ||||
|                 if (connection.State != ConnectionState.Open) | ||||
|                 { | ||||
|                      if (connection is System.Data.Common.DbConnection dbConn) await dbConn.OpenAsync(); else connection.Open(); | ||||
|                 } | ||||
|                 transaction = connection.BeginTransaction(); | ||||
|                  | ||||
|                 var pagoExistente = await _pagoRepo.GetByIdAsync(idPago); | ||||
|                 if (pagoExistente == null) return (false, "Pago no encontrado."); | ||||
|  | ||||
|                 // Revertir el efecto en el saldo | ||||
|                 // Si fue "Recibido", el saldo disminuyó (montoAjusteSaldo fue +Monto). Al eliminar, revertimos sumando -Monto (o restando +Monto). | ||||
|                 // Si fue "Realizado", el saldo aumentó (montoAjusteSaldo fue -Monto). Al eliminar, revertimos sumando +Monto (o restando -Monto). | ||||
|                 decimal montoReversion = pagoExistente.TipoMovimiento == "Recibido" ? -pagoExistente.Monto : pagoExistente.Monto; | ||||
|                 if (pagoExistente == null)  | ||||
|                 { | ||||
|                     transaction.Rollback(); | ||||
|                     return (false, "Pago no encontrado."); | ||||
|                 } | ||||
|                  | ||||
|                 decimal montoReversion = pagoExistente.TipoMovimiento == "Recibido" ? pagoExistente.Monto : -pagoExistente.Monto; | ||||
|  | ||||
|                 var eliminado = await _pagoRepo.DeleteAsync(idPago, idUsuario, transaction); | ||||
|                 if (!eliminado) throw new DataException("Error al eliminar el pago."); | ||||
|                 if (!eliminado) throw new DataException("Error al eliminar el pago de la base de datos."); | ||||
|  | ||||
|                 bool saldoActualizado = await _saldoRepo.ModificarSaldoAsync("Distribuidores", pagoExistente.IdDistribuidor, pagoExistente.IdEmpresa, montoReversion, transaction); | ||||
|                 if (!saldoActualizado) throw new DataException("Error al revertir el saldo del distribuidor tras la eliminación del pago."); | ||||
| @@ -206,13 +254,20 @@ namespace GestionIntegral.Api.Services.Contables | ||||
|                 _logger.LogInformation("PagoDistribuidor ID {Id} eliminado por Usuario ID {UserId}.", idPago, idUsuario); | ||||
|                 return (true, null); | ||||
|             } | ||||
|             catch (KeyNotFoundException) { try { transaction.Rollback(); } catch { } return (false, "Pago no encontrado."); } | ||||
|             catch (KeyNotFoundException) { try { transaction?.Rollback(); } catch (Exception rbEx) { _logger.LogError(rbEx, "Error en Rollback de EliminarAsync PagoDistribuidor (KeyNotFound)."); } return (false, "Pago no encontrado."); } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 try { transaction.Rollback(); } catch { } | ||||
|                 try { transaction?.Rollback(); } catch (Exception rbEx) { _logger.LogError(rbEx, "Error en Rollback de EliminarAsync PagoDistribuidor."); } | ||||
|                 _logger.LogError(ex, "Error EliminarAsync PagoDistribuidor ID: {Id}", idPago); | ||||
|                 return (false, $"Error interno: {ex.Message}"); | ||||
|             } | ||||
|             finally | ||||
|             { | ||||
|                 if (connection.State == ConnectionState.Open) | ||||
|                 { | ||||
|                     if (connection is System.Data.Common.DbConnection dbConn) await dbConn.CloseAsync(); else connection.Close(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user