11import uuid
22
3- from flask import jsonify , request , session
3+ from flask import jsonify , request
44
55from bank_lib .database import execute_query
6- from bank_lib .decorator import admin_required , login_required
7- from bank_lib .form_validators import TransferForm , BankTransferForm
6+ from bank_lib .decorator import admin_required
7+ from bank_lib .form_validators import BankTransferForm
88from bank_lib .get_data import get_settings , get_client_ip , get_total_currency , get_user_by_wallet_name , \
99 update_admin_balance
1010from bank_lib .log_module import create_log
1111
1212
1313def register_transfer_api_routes (app ):
14- @app .route ('/api/transfer/toWallet' , methods = ['POST' ])
15- @login_required
16- def api_transfer_to_wallet ():
17- data = request .json
18- form = TransferForm (data = data )
19-
20- if not form .validate ():
21- errors = {field : errors [0 ] for field , errors in form .errors .items ()}
22- return jsonify (
23- {"error" : errors .get (next (iter (errors ), "error" ), "Validation failed" ), "details" : errors }), 400
24-
25- from_wallet = session ['wallet_name' ]
26- to_wallet = data .get ('to_wallet' )
27- category = data .get ('category' )
28- reason = data .get ('reason' )
29- amount = float (data .get ('amount' , 0 ))
30-
31- # Additional validation
32- if from_wallet == to_wallet :
33- return jsonify ({"error" : "Cannot transfer to your own wallet" }), 400
34-
35- # Get users
36- from_user = get_user_by_wallet_name (from_wallet )
37- to_user = get_user_by_wallet_name (to_wallet )
38-
39- if not to_user :
40- return jsonify ({"error" : "Recipient wallet not found" }), 404
41-
42- if from_user ['is_frozen' ]:
43- return jsonify ({"error" : "Your wallet is frozen" }), 403
44-
45- if to_user ['is_frozen' ]:
46- return jsonify ({"error" : "Recipient wallet is frozen" }), 403
47-
48- settings = get_settings ()
49-
50- if from_user ['current_currency' ] < amount and not settings ['allow_debts' ]:
51- return jsonify ({"error" : "Insufficient funds and debts are not allowed" }), 400
52-
53- # For Penalty or Invoice categories, create a request instead of direct transfer
54- if category in ["Penalty" , "Invoice" ]:
55- try :
56- ticket_uuid = str (uuid .uuid4 ())
57-
58- # Create request record
59- execute_query (
60- """
61- INSERT INTO requests
62- (request_type, ticket_uuid, wallet_name, category, status, reason, ip_address)
63- VALUES (%s, %s, %s, %s, %s, %s, %s)
64- """ ,
65- ("Transfer" , ticket_uuid , from_wallet , category , "Pending" , reason , get_client_ip ()),
66- commit = True
67- )
68-
69- create_log ("Transfer Request" ,
70- f"{ from_wallet } requested a transfer of { amount } { settings ['currency_name' ]} to { to_wallet } for { category } : { reason } " ,
71- "Private" )
72-
73- return jsonify ({
74- "message" : "Transfer request submitted for approval" ,
75- "transfer_ticket_uuid" : ticket_uuid
76- })
77- except Exception as e :
78- print (f"Error creating transfer request: { e } " )
79- return jsonify ({"error" : f"Transfer request failed: { str (e )} " }), 500
80- else :
81- try :
82- # Update balances
83- execute_query (
84- "UPDATE users SET current_currency = current_currency - %s WHERE wallet_name = %s" ,
85- (amount , from_wallet ),
86- commit = True
87- )
88-
89- execute_query (
90- "UPDATE users SET current_currency = current_currency + %s WHERE wallet_name = %s" ,
91- (amount , to_wallet ),
92- commit = True
93- )
94-
95- # Update admin balance
96- update_admin_balance ()
97-
98- ticket_uuid = str (uuid .uuid4 ())
99-
100- # Create request record
101- execute_query (
102- """
103- INSERT INTO requests
104- (request_type, ticket_uuid, wallet_name, category, status, reason, ip_address)
105- VALUES (%s, %s, %s, %s, %s, %s, %s)
106- """ ,
107- ("Transfer" , ticket_uuid , from_wallet , category , "Complete" , reason , get_client_ip ()),
108- commit = True
109- )
110-
111- create_log ("Transfer" ,
112- f"{ from_wallet } transferred { amount } { settings ['currency_name' ]} to { to_wallet } for { category } : { reason } (transfer ticket uuid: { ticket_uuid } )" ,
113- "Private" )
114-
115- # Add public log for large transfers
116- if amount >= 100 :
117- create_log ("Large Transfer" ,
118- f"User { from_wallet } transferred { amount } { settings ['currency_name' ]} to { to_wallet } " ,
119- "Global" )
120-
121- return jsonify ({
122- "message" : "Transfer completed successfully" ,
123- "transfer_ticket_uuid" : ticket_uuid
124- })
125- except Exception as e :
126- print (f"Error during transfer: { e } " )
127- return jsonify ({"error" : f"Transfer failed: { str (e )} " }), 500
128-
12914 # noinspection DuplicatedCode
13015 @app .route ('/api/transfer/bank' , methods = ['POST' ])
13116 @admin_required
@@ -145,7 +30,6 @@ def api_transfer_bank():
14530
14631 # Get user
14732 user = get_user_by_wallet_name (wallet_name )
148-
14933 if not user :
15034 return jsonify ({"error" : "Wallet not found" }), 404
15135
0 commit comments