示例#1
0
	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)
示例#2
0
    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)
示例#3
0
	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)
示例#4
0
	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)
示例#5
0
	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)
示例#6
0
	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)
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
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.')
示例#11
0
	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.')
示例#12
0
	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)