Coverage for classes/account_manager.py: 97%

68 statements  

« prev     ^ index     » next       coverage.py v7.6.8, created at 2024-11-30 23:18 +0000

1from config.database import Database 

2from decimal import Decimal 

3 

4class AccountManager: 

5 def get_account_balances(user_id): 

6 conn = None 

7 cursor = None 

8 try: 

9 conn = Database.get_connection() 

10 cursor = conn.cursor() 

11 cursor.execute( 

12 "SELECT BalanceUSD, BalanceEUR, BalancePEN FROM Accounts WHERE UserId = ?", 

13 (user_id,) 

14 ) 

15 return cursor.fetchone() 

16 except Exception as e: 

17 print(f"Error al obtener los balances: {e}") 

18 return None 

19 finally: 

20 if cursor is not None: 

21 cursor.close() 

22 if conn is not None: 

23 conn.close() 

24 

25 

26 @staticmethod 

27 def update_balances(user_id, divisa_origen, divisa_destino, monto, monto_convertido): 

28 try: 

29 print(f"Iniciando actualización de balances para UserId: {user_id}") 

30 print(f"Divisa origen: {divisa_origen}, Divisa destino: {divisa_destino}, Monto: {monto}, Monto convertido: {monto_convertido}") 

31 

32 conn = Database.get_connection() 

33 cursor = conn.cursor() 

34 print("Conexión a la base de datos establecida correctamente.") 

35 

36 # Obtener el balance de la divisa de origen 

37 print(f"Obteniendo balance de {divisa_origen}...") 

38 cursor.execute(f"SELECT Balance{divisa_origen} FROM Accounts WHERE UserId = ?", (user_id,)) 

39 balance_origen = cursor.fetchone() 

40 print(f"Resultado de balance de {divisa_origen}: {balance_origen}") 

41 

42 if balance_origen is None: 

43 print("No se encontró el balance de la divisa de origen.") 

44 raise ValueError("No se encontró la cuenta del usuario.") 

45 

46 balance_origen = Decimal(balance_origen[0]) 

47 print(f"Balance de origen convertido a Decimal: {balance_origen}") 

48 

49 if balance_origen >= monto: 

50 nuevo_balance_origen = balance_origen - monto 

51 print(f"Nuevo balance de {divisa_origen}: {nuevo_balance_origen}") 

52 

53 # Actualiza el balance de la divisa de origen 

54 cursor.execute(f"UPDATE Accounts SET Balance{divisa_origen} = ? WHERE UserId = ?", 

55 (nuevo_balance_origen, user_id)) 

56 print(f"Balance de {divisa_origen} actualizado en la base de datos.") 

57 

58 # Obtener el balance de la divisa de destino 

59 print(f"Obteniendo balance de {divisa_destino}...") 

60 cursor.execute(f"SELECT Balance{divisa_destino} FROM Accounts WHERE UserId = ?", (user_id,)) 

61 balance_destino = cursor.fetchone() 

62 print(f"Resultado de balance de {divisa_destino}: {balance_destino}") 

63 

64 if balance_destino is None: 

65 print("No se encontró el balance de la divisa de destino.") 

66 raise ValueError("No se encontró la cuenta de destino.") 

67 

68 balance_destino = Decimal(balance_destino[0]) 

69 print(f"Balance de destino convertido a Decimal: {balance_destino}") 

70 

71 nuevo_balance_destino = balance_destino + monto_convertido 

72 print(f"Nuevo balance de {divisa_destino}: {nuevo_balance_destino}") 

73 

74 # Actualiza el balance de la divisa de destino 

75 cursor.execute(f"UPDATE Accounts SET Balance{divisa_destino} = ? WHERE UserId = ?", 

76 (nuevo_balance_destino, user_id)) 

77 print(f"Balance de {divisa_destino} actualizado en la base de datos.") 

78 

79 conn.commit() 

80 print("Transacción confirmada (commit).") 

81 return True 

82 

83 print("El balance de origen no es suficiente para realizar la transacción.") 

84 return False 

85 

86 except Exception as e: 

87 print(f"Error encontrado: {e}") 

88 return {"error": str(e)} 

89 

90 finally: 

91 print("Cerrando recursos...") 

92 if 'cursor' in locals() and cursor is not None: 

93 cursor.close() 

94 print("Cursor cerrado.") 

95 if 'conn' in locals() and conn is not None: 

96 conn.close() 

97 print("Conexión cerrada.")