def get(self, request, format=None): usr = sup_fn.get_user(request) bor_id = request.GET.get('bor_id') # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') if bor_id == 'all': bor_list = BorrowRequest.objects.filter(usr_id = usr.id) bor_list = [bor for bor in bor_list if bor.status == 'DISBURSED' or 'PAYBACK' in bor.status] else: bor_list = BorrowRequest.objects.filter(id = bor_id) schedule_list = [] min_start_date = None max_end_date = None for bor in bor_list: loan_list = Loan.objects.filter(bor_id = bor.id) prod = Product.objects.get(id = bor.prod_id) bor.draw_down_date = timezone.localtime(bor.draw_down_date) start_date_day = bor.draw_down_date.day start_date_month = bor.draw_down_date.month + 1 start_date_year = bor.draw_down_date.year amount_per_month = prod.total_amount / prod.repayment_period interest_per_month = prod.total_amount * prod.APR_borrower * 0.01 * (prod.repayment_period / 12) / prod.repayment_period for i in range(prod.repayment_period): day = start_date_day month = (start_date_month + i-1) % 12 + 1 year = start_date_year + ((start_date_month+i-1) / 12) try: date = datetime.strptime(str(day)+'/'+str(month)+'/'+str(year), '%d/%m/%Y') except ValueError: date = datetime.strptime('1/'+str((month%12)+1)+'/'+str(year), '%d/%m/%Y') - dt.timedelta(days=1) today = datetime.strptime(timezone.localtime(timezone.now()).strftime('%d/%m/%Y'), '%d/%m/%Y') if date < today and bor.repaid_month >= (i+1): status = 'PAID' elif date < today and bor.repaid_month < (i+1): status = 'OVERDUE' elif date >= today: status = 'OPEN' schedule = { 'date': timezone.localtime(date).strftime('%d/%m/%Y'), 'os_principal': round(prod.total_amount - amount_per_month * (i+1),1), 'os_interest': round(prod.total_amount * prod.APR_borrower * 0.01 * (prod.repayment_period / 12) - interest_per_month * (i+1),1), 'os_balance': round(prod.total_amount - amount_per_month * (i+1),1)+round(prod.total_amount * prod.APR_borrower * 0.01 * (prod.repayment_period / 12) - interest_per_month * (i+1),1), 'paid_principal': round(amount_per_month, 1) if status == 'PAID' else 0, 'paid_interest': round(interest_per_month, 1) if status == 'PAID' else 0, 'ref_num': bor.ref_num, 'prod_name': prod.name_en, 'installment': round(amount_per_month+interest_per_month, 1), 'status': status, } schedule_list.append(schedule) serialized_table_list = RepayTableSerializer(schedule_list, many=True) content = {'data': serialized_table_list.data} return Response(content)
def get(self, request, format=None): # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') usr_id = request.GET.get('usr_id') bor_id = request.GET.get('bor_id') bor_ref_num = request.GET.get('bor_ref_num') from_ = request.GET.get('from') to = request.GET.get('to') if usr_id != None: if int(usr_id) != 0: usr = User.objects.get(id=usr_id) led_list = Ledger.objects.filter(usr_id=usr_id).order_by('id') if bor_id != None: led_list = Ledger.objects.filter(bor_id=bor_id).order_by('id') if bor_ref_num != None: led_list = Ledger.objects.filter( reference=bor_ref_num).order_by('id') led_list = [ led for led in led_list if led.description not in ['Begin Balance', 'Loan Disbursement'] ] if from_ == '' or to == '': from_ = 'all' to = 'all' if from_ != 'all' and to != 'all': from_ = datetime.strptime(from_, '%Y-%m-%d') from_ = pytz.timezone('Asia/Hong_Kong').localize(from_) to = datetime.strptime(to, '%Y-%m-%d') to = pytz.timezone('Asia/Hong_Kong').localize(to) led_list = [ led for led in led_list if led.create_timestamp >= from_ and led.create_timestamp <= to ] data_list = [] for led in led_list: data_list.append({ 'date': datetime.strftime(led.create_timestamp, '%Y/%m/%d %H:%M'), 'description': led.description, 'reference': led.reference, 'debit': led.debit, 'credit': led.credit, 'balance': led.balance }) content = {'data': data_list} return Response(content)
def get(self, request, format=None): usr = sup_fn.get_user(request) bor_id = request.GET.get('bor_id') # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') data_list = [] if bor_id == 'all': bor_list = BorrowRequest.objects.filter(usr_id = usr.id) bor_list = [bor for bor in bor_list if bor.status == 'DISBURSED' or 'PAYBACK' in bor.status] else: bor_list = BorrowRequest.objects.filter(id = bor_id) total_principal = 0 paid_principal = 0 paid_interest = 0 outstanding_principal = 0 outstanding_interest = 0 overdue_principal = 0 overdue_amount = 0 for bor in bor_list: prod = Product.objects.get(id = bor.prod_id) loan_list = Loan.objects.filter(bor_id = bor.id) total_principal += sum([loan.initial_amount for loan in loan_list]) paid_principal += sum([loan.initial_amount - loan.remain_principal for loan in loan_list]) paid_interest += sum([loan.initial_amount for loan in loan_list]) * prod.APR_borrower * 0.01 * (prod.repayment_period /12) - sum([loan.remain_interest_borrower for loan in loan_list]) outstanding_principal += sum([loan.remain_principal for loan in loan_list]) outstanding_interest += sum([loan.remain_interest_borrower for loan in loan_list]) overdue_principal += sum([loan.overdue_principal for loan in loan_list]) overdue_amount += sum([loan.overdue_principal+loan.overdue_interest for loan in loan_list]) total_principal = round(total_principal, 1) paid_principal = round(paid_principal, 1) paid_interest = round(paid_interest, 1) outstanding_principal = round(outstanding_principal, 1) outstanding_interest = round(outstanding_interest, 1) overdue_principal = round(overdue_principal, 1) overdue_amount = round(overdue_amount, 1) data_list.append({'key': 'Total Principal', 'value':'$'+str(total_principal)}) data_list.append({'key': 'Paid Principal', 'value':'$'+str(paid_principal)}) data_list.append({'key': 'Paid Interest', 'value':'$'+str(paid_interest)}) data_list.append({'key': 'Outstanding Principal', 'value':'$'+str(outstanding_principal)}) data_list.append({'key': 'Outstanding Interest', 'value':'$'+str(outstanding_interest)}) data_list.append({'key': 'Overdue Principal', 'value':'$'+str(overdue_principal)}) data_list.append({'key': 'Overdue Amount (included interest)', 'value':'$'+str(overdue_amount)}) serialized_data_list = KeyValueSerializer(data_list, many=True) content = {'data': serialized_data_list.data} return Response(content)
def get(self, request, format=None): usr = sup_fn.get_user(request) prod_id = request.GET.get('prod_id') # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') if prod_id == 'all': inv_list = Investment.objects.filter(usr_id=usr.id) else: inv_list = Investment.objects.filter(usr_id=usr.id, prod_id=prod_id) data_list = [] total_principal = 0 returned_principal = 0 returned_interest = 0 returning_principal = 0 returning_interest = 0 overdue_principal = 0 overdue_amount = 0 for inv in inv_list: loan_list = Loan.objects.filter(inv_id=inv.id) total_principal += sum([loan.initial_amount for loan in loan_list]) returned_principal += sum([loan.initial_amount - loan.remain_principal for loan in loan_list]) prod = Product.objects.get(id=inv.prod_id) returned_interest += sum([loan.initial_amount * prod.APR_lender * 0.01 * (prod.repayment_period/12) - loan.remain_interest_lender for loan in loan_list]) returning_principal += sum([loan.remain_principal for loan in loan_list]) returning_interest += sum([loan.remain_interest_lender for loan in loan_list]) overdue_principal += sum([loan.overdue_principal for loan in loan_list]) overdue_amount += sum([loan.overdue_principal+loan.overdue_interest for loan in loan_list]) returned_principal = round(returned_principal, 1) returned_interest = round(returned_interest, 1) returning_principal = round(returning_principal, 1) returning_interest = round(returning_interest, 1) overdue_principal = round(overdue_principal, 1) overdue_amount = round(overdue_amount, 1) data_list.append({'key': 'Total Principal', 'value':'$'+str(total_principal)}) data_list.append({'key': 'Returned Principal', 'value':'$'+str(returned_principal)}) data_list.append({'key': 'Returned Interest', 'value':'$'+str(returned_interest)}) data_list.append({'key': 'Returning Principal', 'value':'$'+str(returning_principal)}) data_list.append({'key': 'Returning Interest', 'value':'$'+str(returning_interest)}) data_list.append({'key': 'Overdue Principal', 'value':'$'+str(overdue_principal)}) data_list.append({'key': 'Overdue Amount (included interest)', 'value':'$'+str(overdue_amount)}) serialized_data_list = KeyValueSerializer(data_list, many=True) content = {'data': serialized_data_list.data} return Response(content)
def get(self, request, format=None): usr = sup_fn.get_user(request) prod_id = request.GET.get('prod_id') # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') if prod_id == 'all': prod_list = Product.objects.filter(status='ACTIVE') else: prod_list = Product.objects.filter(id=prod_id) rd_loan_list = [] for prod in prod_list: try: inv = Investment.objects.get(prod_id=prod.id, usr_id= usr.id) except ObjectDoesNotExist: continue loan_list = Loan.objects.filter(inv_id=inv.id) loan_list = [loan for loan in loan_list if loan.status=='DISBURSED' or 'PAYBACK' in loan.status] for loan in loan_list: try: bor = BorrowRequest.objects.get(id = loan.bor_id) except: continue rd_loan = { 'shadow_datetime': timezone.localtime(bor.draw_down_date), 'date': datetime.strftime(timezone.localtime(loan.update_timestamp), '%Y/%m/%d'), 'ref_num': bor.ref_num, 'amount': FLOAT_DATA_FORMAT.format(loan.initial_amount), 'interest': FLOAT_DATA_FORMAT.format(loan.total_repay_amount_lender - loan.initial_amount), 'installment': FLOAT_DATA_FORMAT.format(loan.instalment_lender), 'draw_down_date': datetime.strftime(timezone.localtime(bor.draw_down_date), '%Y/%m/%d'), 'expected_end_date': datetime.strftime(timezone.localtime(bor.expected_end_date), '%Y/%m/%d'), 'overdue_loan_receivable': FLOAT_DATA_FORMAT.format(loan.overdue_principal + loan.overdue_interest), 'loan_id': loan.id, } rd_loan_list.append(rd_loan) #serialized_data_list = ActiveInvSerializer(rd_loan_list, many=True) content = {'data': rd_loan_list} return Response(content)
def get(self, request, format=None): usr = sup_fn.get_user(request) bor_id = request.GET.get('bor_id') # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') if bor_id == 'all': bor_list = BorrowRequest.objects.filter(usr_id = usr.id) bor_list = [bor for bor in bor_list if bor.status == 'DISBURSED' or 'PAYBACK' in bor.status] else: bor_list = BorrowRequest.objects.filter(id = bor_id) # assume user applies not more than 3 loans color_lib = {'red':['#E08283','#E7505A','#D91E18'],'green':['#36D7B7','#4DB3A2','#26C281'],'yellow':['#F4D03F','#F7CA18','#F3C200']} data_list = [] i = 0 for bor in bor_list: loan_list = Loan.objects.filter(bor_id = bor.id) prod = Product.objects.get(id = bor.prod_id) paid_principal = sum([loan.initial_amount - loan.remain_principal for loan in loan_list]) outstanding_principal = sum([loan.remain_principal for loan in loan_list]) overdue_principal = sum([loan.overdue_principal for loan in loan_list]) if paid_principal != 0: data_list.append({'name':'Paid Principal ('+prod.name_en+')','amount':paid_principal,'color':color_lib['green'][i]}) if outstanding_principal != 0: data_list.append({'name':'Outstanding Principal ('+prod.name_en+')','amount':outstanding_principal,'color':color_lib['yellow'][i]}) if overdue_principal != 0: data_list.append({'name':'Overdue Principal ('+prod.name_en+')','amount':overdue_principal,'color':color_lib['red'][i]}) i += 1 serialized_data_list = RepayPieSerializer(data_list, many=True) content = {'data': serialized_data_list.data} return Response(content)
def get(self, request, format=None): # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') usr_id = request.GET.get('usr_id') ref_id = request.GET.get('ref_id') model = request.GET.get('model') range = request.GET.get('range') data_list = [] if range == 'bor_only': aut_list = AuditTrail.objects.all() aut_list = [ aut for aut in aut_list if User.objects.get( id=aut.usr_id).type == request.session['handling_side'] ] for aut in aut_list: if aut.model == 'UserOperationRequest': try: uor = UserOperationRequest.objects.get(id=aut.ref_id) except: continue if uor.type == 'Apply To Be Investor': continue res = sup_fn.find_ref_num(id=aut.ref_id, model=aut.model) data_list.append({ 'date': datetime.strftime(aut.create_timestamp, '%Y/%m/%d %H:%M'), 'description': aut.description, 'reference': res['ref_num'], 'by': aut.by }) elif range == 'ldr_only': aut_list = AuditTrail.objects.all() #aut_list = [aut for aut in aut_list if User.objects.get(id=aut.usr_id).type == request.session['handling_side']] for aut in aut_list: aut_usr = User.objects.get(id=aut.usr_id) if aut_usr == 'B' and aut.model != 'UserOperationRequest': # not Apply To Be Investor case continue if aut_usr == 'B' and aut.model == 'UserOperationRequest': try: uor = UserOperationRequest.objects.get(id=aut.ref_id) except: # Apply To Be Investor request deleted continue if uor.type != 'Apply To Be Investor': continue res = sup_fn.find_ref_num(id=aut.ref_id, model=aut.model) data_list.append({ 'date': datetime.strftime(aut.create_timestamp, '%Y/%m/%d %H:%M'), 'description': aut.description, 'reference': res['ref_num'], 'by': aut.by }) else: aut_list = AuditTrail.objects.filter(usr_id=usr_id, ref_id=int(ref_id), model=model) for aut in aut_list: res = sup_fn.find_ref_num(id=aut.ref_id, model=aut.model) if res['type'] != request.GET.get('type'): continue data_list.append({ 'date': datetime.strftime(aut.create_timestamp, '%Y/%m/%d %H:%M'), 'description': aut.description, 'by': aut.by }) content = {'data': data_list} return Response(content)
def get(self, request, format=None): # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') prod_id = request.GET.get('prod_id') status = request.GET.get('status') due_on = request.GET.get('due_on') bor_list = BorrowRequest.objects.all() bor_list = [ bor for bor in bor_list if 'DISBURSED' in bor.status or 'PAYBACK' in bor.status ] if prod_id != 'all': bor_list = [ bor for bor in bor_list if int(bor.prod_id) == int(prod_id) ] if status != 'all': bor_list = [bor for bor in bor_list if status in bor.status] if due_on != 'All': due_on = datetime.strptime(due_on, '%m/%d/%Y') bor_list = [ bor for bor in bor_list if datetime.strptime( timezone.localtime(bor.create_timestamp).strftime( '%m/%d/%Y'), '%m/%d/%Y') >= due_on ] data_list = [] for bor in bor_list: detail = json.loads(bor.detail_info) try: borrower_name = detail['Surname'] + ' ' + detail['Given Name'] except KeyError: borrower_name = '--' prod = Product.objects.get(id=bor.prod_id) loan_list = Loan.objects.filter(bor_id=bor.id) loan_amount = sum([loan.initial_amount for loan in loan_list]) outstanding_principal = sum( [loan.remain_principal for loan in loan_list]) # check is pending task or not try: ptn = PendingTaskNotification.objects.get( ref_id=bor.id, model='BorrowRequest') except ObjectDoesNotExist: ptn_status = 'READ' else: ptn_status = ptn.status data_list.append({ 'loan_no': bor.ref_num, 'name': borrower_name, 'initial_amount': loan_amount, 'loan_amount': loan_amount, 'outstanding_principal': outstanding_principal, 'instalment_tenor': prod.repayment_period, 'overpay_amount': FLOAT_DATA_FORMAT.format(bor.overpay_amount), 'product': prod.name_en, 'last_updated_time': bor.update_timestamp.strftime('%d/%m/%Y'), 'last_updated_by': '--', 'state': bor.status, 'bor_id': bor.id, 'ptn_status': ptn_status }) #serialized_data_list = AdminRepaymentSerializer(data_list, many=True) content = {'data': data_list} return Response(content)
def get(self, request, format=None): # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') data_src = request.GET.get('data_src') prod_id = request.GET.get('prod_id') status = request.GET.get('status') cate = request.GET.get('cate') bor_list = BorrowRequest.objects.all() if data_src == 'fund_matching_bor': bor_list = [ bor for bor in bor_list if bor.status in ['VALIDATED', 'FUND MATCHING', 'FUND MATCHING COMPLETED'] ] if prod_id != 'all': bor_list = [ bor for bor in bor_list if int(bor.prod_id) == int(prod_id) ] data_list = [] for bor in bor_list: details = json.loads(bor.detail_info) prod = Product.objects.get(id=bor.prod_id) loan_list = Loan.objects.filter(bor_id=bor.id) matched_percentage = float( sum([loan.initial_amount for loan in loan_list])) / float(bor.amount) data_list.append({ 'loan_no': bor.ref_num, 'amount_to_collect': bor.amount, 'matched_percentage': str(round(matched_percentage * 100, 2)) + '%', 'prod_name': prod.name_en, 'application_date': datetime.strftime(timezone.localtime(bor.create_timestamp), '%Y/%m/%d %H:%M'), 'agreement_date': details['Confirm Loan Agreement Date'], 'no_of_investors': len(loan_list), }) serialized_data_list = FundMatchBorSerializer(data_list, many=True) content = {'data': serialized_data_list.data} return Response(content) if cate == 'application': apply_state_list = [ 'AUTO APPROVED', 'DOC UPLOADED', 'AGREEMENT CONFIRMED', 'PENDING DOC/IV', 'VALIDATED', 'CANCELLED', 'REJECTED' ] bor_list = [ bor for bor in bor_list if bor.status in apply_state_list ] elif cate == 'disbursement': disburse_state_list = [ 'FUND MATCHING', 'FUND MATCHING COMPLETED', 'MEMORANDUM CONFIRMED' ] bor_list = [ bor for bor in bor_list if bor.status in disburse_state_list ] if prod_id != 'all': bor_list = [ bor for bor in bor_list if int(bor.prod_id) == int(prod_id) ] if status != 'all': bor_list = [bor for bor in bor_list if status in bor.status] data_list = [] for bor in bor_list: details = json.loads(bor.detail_info) name = details['Surname'] + ' ' + details['Given Name'] # check is pending task or not try: ptn = PendingTaskNotification.objects.get( ref_id=bor.id, model='BorrowRequest') except ObjectDoesNotExist: ptn_status = 'READ' else: ptn_status = ptn.status data_list.append({ 'application_no': bor.ref_num, 'name': name, 'application_time': datetime.strftime(timezone.localtime(bor.create_timestamp), '%Y/%m/%d %H:%M'), 'amount': bor.amount, 'prod_type': Product.objects.get(id=bor.prod_id).name_en, 'follow_by': '--', 'confirmed_identity': 'Y' if sup_fn.try_KeyError(details, 'Confirmed Identity') == 'Y' else 'N', 'last_updated_time': datetime.strftime(timezone.localtime(bor.update_timestamp), '%Y/%m/%d %H:%M'), 'last_updated_by': '--', 'disbursement_method': sup_fn.try_KeyError(details, 'Disbursement Method'), 'state': bor.status, 'bor_id': bor.id, 'hkid': details['HKID'], 'mobile_no': details['Mobile'], 'ptn_status': ptn_status }) #serialized_data_list = AdminApplicationSerializer(data_list, many=True) content = {'data': data_list} return Response(content)
def sign_up(request): lang = sup_fn.get_lang(request) if request.method == 'POST': email = request.POST.get('email') password = request.POST.get('register_password') receive_promotion = 'False' if request.POST.get( 'receive_promotion') == None else 'True' # check XSS if sup_fn.checkHTMLtags([v for k, v in request.POST.iteritems()]): return HttpResponse('Invalid input.') if len(User.objects.filter(email=email, status='ACTIVE')) == 0: # create new usr model new_usr = User(email=email, password=hashlib.md5(password).hexdigest(), receive_promotion=receive_promotion, detail_info='{}', type='B', status='WAIT FOR ACTIVATION', create_timestamp=timezone.localtime(timezone.now()), update_timestamp=timezone.localtime(timezone.now())) new_usr.save() # create new uor and send activation email # generate token def generate_unique_sequence64(size=64, chars=string.ascii_uppercase + string.digits): uor_list = UserOperationRequest.objects.filter( type='activate_account') token_list = [ json.loads(uor.details)['token'] for uor in uor_list ] while 1: rand_seq = ''.join( random.choice(chars) for _ in range(size)) if rand_seq not in token_list: return rand_seq new_token = generate_unique_sequence64() details = {"token": new_token, "email": email} new_uor = UserOperationRequest( usr_id=new_usr.id, type='activate_account', details=json.dumps(details), status='ACTIVE', create_timestamp=timezone.localtime(timezone.now()), update_timestamp=timezone.localtime(timezone.now())) new_uor.save() usr_emailing = emailing.GeneralEmail(email_addr=email) usr_emailing.account_activate(token=new_token) # avoid email too long and out of box email_arr = [] for i in range(int(len(email) / 15)): email_arr.append(email[i * 15:(i + 1) * 15]) email_arr.append(email[int(len(email) / 15) * 15:]) email = '<br>'.join(email_arr) if lang == 'en': content = { 'status': 'Success!', 'header': 'Congratulation! You have signed up as <strong>%s</strong>.' % email, 'content': 'An email with activation link has sent to your email address. Please activate your account before login.', } if lang == 'zh': content = { 'status': '註冊成功!', 'header': '恭喜!你已經註冊成為<strong>%s</strong>' % email.encode("utf8"), 'content': '系統已發出一封附有啟用鏈接的郵件至你的郵箱。請先啟用你的賬戶再嘗試登入。', } content['lang'] = lang else: if lang == 'en': content = { 'status': 'Failed!', 'header': 'Your request to signed up as <strong>%s</strong> is failed.' % email, 'content': 'Our system has detected that this email is already registered in the platform.', } if lang == 'zh': content = { 'status': '註冊失敗!', 'header': '你使用<strong>%s</strong>來註冊賬號已經失敗。' % email.encode("utf8"), 'content': '我們系統檢測到該電郵地址已在平台被註冊。', } content['lang'] = lang return render(request, 'peerloan/general/general_ack.html', content) else: return HttpResponse('Invalid request method.')
def get(self, request, format=None): if request.method == 'GET': usr = sup_fn.get_user(request) lang = sup_fn.get_lang(request) status = request.GET.get('status') start_date = request.GET.get('start_date') # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') if usr.type == 'B': bor_list = BorrowRequest.objects.filter(usr_id=usr.id) if status != 'All': if status == 'AGREEMENT CONFIRMED': bor_list = [bor for bor in bor_list if 'AGREEMENT CONFIRMED' in bor.status or 'VALIDATED' in bor.status or 'FUND MATCHING' in bor.status] else: bor_list = [bor for bor in bor_list if status.upper() in bor.status] if start_date != 'All': start_date = datetime.strptime(start_date, '%m/%d/%Y') bor_list = [bor for bor in bor_list if datetime.strptime(timezone.localtime(bor.create_timestamp).strftime('%m/%d/%Y'), '%m/%d/%Y')>= start_date] data_list = [] for bor in bor_list: details = {} prod = Product.objects.get(id=bor.prod_id) details['shadow_datetime'] = timezone.localtime(bor.update_timestamp) details['updated_date'] = datetime.strftime(timezone.localtime(bor.update_timestamp), '%Y/%m/%d') details['prod_name'] = prod.name_en if lang == 'zh': details['prod_name'] = prod.name_zh details['ref_num'] = bor.ref_num details['amount'] = FLOAT_DATA_FORMAT.format(bor.amount) details['APR'] = FLOAT_DATA_FORMAT.format(bor.getBorAPR(prod.APR_borrower if prod.fake_APR_borrower == None else prod.fake_APR_borrower)) details['apply_date'] = datetime.strftime(timezone.localtime(bor.create_timestamp), '%Y/%m/%d') details['repayment_progress'] = str(bor.repaid_month)+'/'+str(prod.repayment_period) details['status'] = ''.join([i for i in bor.status if (not i.isdigit())]) details['bor_id'] = bor.id if bor.status == 'AUTO APPROVED': details['href'] = '/product/upload_docs/?prod_id='+str(prod.id) elif bor.status == 'DOC UPLOADED': details['href'] = '/product/confirm_agreement/?prod_id='+str(prod.id) elif bor.status == 'AGREEMENT CONFIRMED' or bor.status == 'VALIDATED' or bor.status == 'FUND MATCHING': details['href'] = '/ack_page/?action=confirm_agreement' elif bor.status == 'DISBURSED' or 'PAYBACK' in bor.status: details['href'] = '/my_account/all_application_listing/detail/?bor_id='+str(bor.id) elif bor.status == 'FUND MATCHING COMPLETED': details['href'] = '/product/confirm_memorandum/?prod_id='+str(prod.id) else: details['href'] = 'javascript:;' data_list.append(details) #serialized_data_list = LaasSerializer(data_list, many=True) content = {'data': data_list} return Response(content) if usr.type == 'L': inv_list = Investment.objects.filter(usr_id = usr.id) loan_list = [] for inv in inv_list: loans = Loan.objects.filter(inv_id = inv.id) for loan in loans: loan_list.append(loan) if status != 'All': loan_list = [loan for loan in loan_list if status.upper() in loan.status] if start_date != 'All': start_date = datetime.strptime(start_date, '%m/%d/%Y') loan_list = [loan for loan in loan_list if datetime.strptime(timezone.localtime(loan.create_timestamp).strftime('%m/%d/%Y'), '%m/%d/%Y')>= start_date] data_list = [] for loan in loan_list: details = {} bor = BorrowRequest.objects.get(id=loan.bor_id) prod = Product.objects.get(id=bor.prod_id) details['updated_date'] = datetime.strftime(timezone.localtime(loan.update_timestamp), '%d/%m/%Y') details['prod_name'] = prod.name_en details['ref_num'] = bor.ref_num details['amount'] = loan.initial_amount details['APR'] = prod.APR_lender details['draw_down_date'] = datetime.strftime(timezone.localtime(loan.draw_down_date), '%d/%m/%Y') details['status'] = bor.status data_list.append(details) serialized_data_list = LoanLenderSerializer(data_list, many=True) content = {'data': serialized_data_list.data} return Response(content) else: return HttpResponse('Wrong request method.')
def get(self, request, format=None): usr = sup_fn.get_user(request) prod_id = request.GET.get('prod_id') # check XSS if sup_fn.checkHTMLtags([v for k, v in request.GET.iteritems()]): return HttpResponse('Invalid input.') if prod_id == 'all': inv_list = Investment.objects.filter(usr_id=usr.id) else: inv_list = Investment.objects.filter(usr_id=usr.id, prod_id=prod_id) schedule_list = [] schedule2_list = [] min_start_date = None max_end_date = None for inv in inv_list: loan_list = Loan.objects.filter(inv_id = inv.id) loan_list = [loan for loan in loan_list if 'DISBURSED' in loan.status or 'PAYBACK' in loan.status] prod = Product.objects.get(id = inv.prod_id) rate_per_month = prod.APR_lender * 0.01 / 12 for loan in loan_list: try: bor = BorrowRequest.objects.get(id=loan.bor_id) except: continue bor.draw_down_date = timezone.localtime(bor.draw_down_date) start_date_day = bor.draw_down_date.day start_date_month = bor.draw_down_date.month + 1 start_date_year = bor.draw_down_date.year remain_principal = loan.initial_amount #remain_interest = loan.total_repay_amount_lender - loan.initial_amount ratio = prod.APR_lender / bor.getBorAPR(prod.APR_borrower) remain_interest = (loan.total_repay_amount_lender - loan.initial_amount) * ratio for i in range(prod.repayment_period): day = start_date_day month = (start_date_month + i-1) % 12 + 1 year = start_date_year + ((start_date_month+i-1) / 12) interest = remain_principal * rate_per_month interest_ldr = interest * ratio principal = loan.instalment_lender - interest remain_interest -= interest_ldr remain_principal -= principal try: date = datetime.strptime(str(day)+'/'+str(month)+'/'+str(year), '%d/%m/%Y') except ValueError: date = datetime.strptime('1/'+str((month%12)+1)+'/'+str(year), '%d/%m/%Y') - dt.timedelta(days=1) today = datetime.strptime(timezone.localtime(timezone.now()).strftime('%d/%m/%Y'), '%d/%m/%Y') if date < today and bor.repaid_month >= (i+1): status = 'PAID' elif date < today and bor.repaid_month < (i+1): status = 'OVERDUE' elif date >= today: status = 'OPEN' schedule = { #'date': timezone.localtime(date).strftime('%d/%m/%Y'), 'date': date, 'initial_principal': loan.initial_amount, 'os_principal': remain_principal, 'os_interest': remain_interest, 'os_balance': remain_principal + remain_interest, 'paid_principal': principal if status == 'PAID' else 0, 'paid_interest': interest if status == 'PAID' else 0, 'ref_num': loan.ref_num, 'prod_name': prod.name_en, 'installment': loan.instalment_lender, 'status': status, } schedule_list.append(schedule) # month base view date_set = set() for schedule in schedule_list: date = datetime.strptime(datetime.strftime(schedule['date'], '%m/%Y'), '%m/%Y') date_set.add(date) for date in date_set: schedule_sub_list = [schedule for schedule in schedule_list if schedule['date'].month == date.month and schedule['date'].year == date.year] schedule = { 'shadow_datetime': date, 'date': datetime.strftime(date, '%Y/%m'), 'initial_principal': FLOAT_DATA_FORMAT.format(sum([s['initial_principal'] for s in schedule_sub_list])), 'os_principal': FLOAT_DATA_FORMAT.format(abs(sum([s['os_principal'] for s in schedule_sub_list]))), 'os_interest': FLOAT_DATA_FORMAT.format(abs(sum([s['os_interest'] for s in schedule_sub_list]))), 'os_balance': FLOAT_DATA_FORMAT.format(abs(sum([s['os_balance'] for s in schedule_sub_list]))), 'paid_principal': FLOAT_DATA_FORMAT.format(sum([s['paid_principal'] for s in schedule_sub_list])), 'paid_interest': FLOAT_DATA_FORMAT.format(sum([s['paid_interest'] for s in schedule_sub_list])), 'ref_num': '', 'prod_name': '', 'installment': FLOAT_DATA_FORMAT.format(sum([s['installment'] for s in schedule_sub_list])), 'status': '', } schedule2_list.append(schedule) serialized_table_list = schedule2_list content = {'data': serialized_table_list} return Response(content)