import json,sys,os,copy;from datetime import datetime def loadJ(p): f=open(p,'r');d=json.load(f);f.close();return d def saveJ(p,d): f=open(p,'w');json.dump(d,f,indent=2);f.close() def proc(accs,txns): ok=[];bad=[] for t in txns: tp=t['type'];aid=t['account_id'];amt=t['amount'];tid=t['id'] # find account a=None for x in accs: if x['account_id']==aid:a=x if a==None: t['reason']='account not found';bad.append(t);continue if a['status']!='active': t['reason']='account not active';bad.append(t);continue if amt<=0 and tp!='withdrawal': if tp=='deposit':t['reason']='invalid amount';bad.append(t);continue if tp=='transfer':t['reason']='invalid amount';bad.append(t);continue if amt<=0 and tp=='withdrawal': t['reason']='invalid amount';bad.append(t);continue if tp=='deposit': a['balance']=a['balance']+amt;t['status']='accepted';ok.append(t) elif tp=='withdrawal': if a['balance']>=amt: a['balance']=a['balance']-amt;t['status']='accepted';ok.append(t) else: t['reason']='insufficient funds';t['status']='rejected';bad.append(t) elif tp=='transfer': ta=None for x in accs: if x['account_id']==t.get('to_account_id',''):ta=x if ta==None:t['reason']='target account not found';bad.append(t);continue if ta['status']!='active':t['reason']='target account not active';bad.append(t);continue if a['balance']>=amt: a['balance']=a['balance']-amt;ta['balance']=ta['balance']+amt t['status']='accepted';ok.append(t) else: t['reason']='insufficient funds';t['status']='rejected';bad.append(t) else: t['reason']='unknown type';bad.append(t) return accs,ok,bad def main(): D=loadJ('accounts.json');T=loadJ('transactions.json') accs=D['accounts'];txns=T['transactions'] accs,ok,bad=proc(accs,txns) # print results print("=== UPDATED ACCOUNTS ===") for a in accs:print(" "+a['account_id']+" "+a['holder']+": "+str(a['balance'])+" "+a['currency']+" ("+a['status']+")") print("\n=== ACCEPTED ("+str(len(ok))+") ===") for t in ok:print(" "+t['id']+" "+t['type']+" "+str(t['amount'])+" -> "+t.get('description','')) print("\n=== REJECTED ("+str(len(bad))+") ===") for t in bad:print(" "+t['id']+" "+t['type']+" "+str(t['amount'])+" -> "+t.get('reason','unknown')) saveJ('accounts_updated_bad.json',{"accounts":accs}) saveJ('transaction_log_bad.json',{"accepted":ok,"rejected":bad}) main()