def request_loan(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') customer_id = int(parameter_dict['customer_id']) # print(parameter_dict['customer_id']) payment = float(parameter_dict['payment']) # print(parameter_dict['payment']) repay_cycle = int(parameter_dict['repay_cycle']) # print(parameter_dict['repay_cycle']) created_time = datetime.strptime(parameter_dict['created_time'], DATE_TIME_FORMAT).date() # print(parameter_dict['created_time']) except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) if payment <= 0: return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: customer = Customer.objects.get(customer_id=customer_id) except Customer.DoesNotExist: raise Http404(EM_NO_SUCH_CUSTOMER) new_loan_record = LoanRecord(customer=customer, payment=payment, current_deposit=customer.deposit, repay_cycle=repay_cycle, due_date=created_time + timedelta(days=repay_cycle), next_overdue_date=created_time + timedelta(days=repay_cycle), left_payment=payment, left_fine=0.0, created_time=created_time) new_loan_record.save() response_data = {'msg': 'loan request success', 'loan_record_id': new_loan_record.loan_record_id} return HttpResponse(json.dumps(response_data))
def customer_deposit(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') customer_id = int(parameter_dict['customer_id']) new_deposit = float(parameter_dict['new_deposit']) deposit_date = datetime.strptime(parameter_dict['deposit_date'], DATE_TIME_FORMAT).date() except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) if new_deposit <= 0: return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: customer = Customer.objects.get(customer_id=customer_id) customer.deposit += new_deposit DepositRecord(customer=customer, payment=new_deposit, current_deposit=customer.deposit, created_time=deposit_date).save() customer.save() response_data = {'msg': 'customer deposit success'} return HttpResponse(json.dumps(response_data)) except Customer.DoesNotExist: raise Http404(EM_NO_SUCH_CUSTOMER)
def add_customer(request): bank_teller = fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]) if not bank_teller: return HttpResponse(content='Unauthorized', status=401) # TODO: 未做参数校验 try: parameter_dict = fetch_parameter_dict(request, 'POST') name = parameter_dict['name'] phone = parameter_dict['phone'] id_number = parameter_dict['id_number'] deposit = float(parameter_dict['deposit']) except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: Customer.objects.get(id_number=id_number) return HttpResponseBadRequest('id number conflict') except Customer.DoesNotExist: new_customer = Customer(name=name, phone=phone, id_number=id_number, deposit=deposit, bank_teller=bank_teller) new_customer.save() response_data = { 'msg': 'add new customer success', 'customer_id': new_customer.customer_id } return HttpResponse(json.dumps(response_data))
def issue_regular_deposit(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') regular_deposit_name = parameter_dict['regular_deposit_name'] issue_date = datetime.strptime(parameter_dict['issue_date'], DATE_TIME_FORMAT).date() return_cycle = int(parameter_dict['return_cycle']) return_rate = float(parameter_dict['return_rate']) except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) if return_rate <= 0 or return_rate > 0.2 or return_cycle < 7: return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: RegularDeposit.objects.get(regular_deposit_name=regular_deposit_name) return HttpResponseBadRequest(EM_PRODUCT_NAME_USED) except RegularDeposit.DoesNotExist: new_regular_deposit = RegularDeposit( regular_deposit_name=regular_deposit_name, issue_date=issue_date, return_cycle=return_cycle, return_rate=return_rate) new_regular_deposit.save() response_data = { 'msg': 'issue regular deposit success', 'regular_deposit_id': new_regular_deposit.regular_deposit_id } return HttpResponse(json.dumps(response_data))
def issue_stock(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') stock_name = parameter_dict['stock_name'] issue_date = datetime.strptime(parameter_dict['issue_date'], DATE_TIME_FORMAT).date() issue_price = float(parameter_dict['issue_price']) except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) if issue_price <= 0: return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: Stock.objects.get(stock_name=stock_name) return HttpResponseBadRequest(EM_PRODUCT_NAME_USED) except Stock.DoesNotExist: new_stock = Stock(stock_name=stock_name, issue_date=issue_date, issue_price=issue_price) new_stock.save() StockPriceRecord(stock_id=new_stock.stock_id, record_date=issue_date, price=issue_price).save() response_data = { 'msg': 'issue stock success', 'stock_id': new_stock.stock_id } return HttpResponse(json.dumps(response_data))
def buy_regular_deposit(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') customer_id = int(parameter_dict['customer_id']) regular_deposit_id = int(parameter_dict['regular_deposit_id']) purchase_amount = float(parameter_dict['purchase_amount']) purchase_date = datetime.strptime(parameter_dict['purchase_date'], DATE_TIME_FORMAT).date() except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: customer = Customer.objects.get(customer_id=customer_id) regular_deposit = RegularDeposit.objects.get(regular_deposit_id=regular_deposit_id) except Customer.DoesNotExist: raise Http404(EM_NO_SUCH_CUSTOMER) except RegularDeposit.DoesNotExist: raise Http404('No such regular deposit') if not _fine_repay(customer): return HttpResponseForbidden(EM_CANNOT_PAY_FINE) if customer.deposit < purchase_amount: return HttpResponseForbidden(EM_DEPOSIT_NOT_ENOUGH) customer.deposit -= purchase_amount customer.save() RegularDepositInvestment(customer=customer, regular_deposit=regular_deposit, purchase_date=purchase_date, due_date=purchase_date + timedelta(days=regular_deposit.return_cycle), purchase_amount=purchase_amount, current_deposit=customer.deposit).save() response_data = {'msg': 'purchase success'} return HttpResponse(json.dumps(response_data))
def buy_stock(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') customer_id = int(parameter_dict['customer_id']) stock_id = int(parameter_dict['stock_id']) new_position_share = int(parameter_dict['new_position_share']) # 新买入的股数 purchase_date = datetime.strptime(parameter_dict['purchase_date'], DATE_TIME_FORMAT).date() except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: customer = Customer.objects.get(customer_id=customer_id) stock = Stock.objects.get(stock_id=stock_id) except Customer.DoesNotExist: raise Http404(EM_NO_SUCH_CUSTOMER) except Stock.DoesNotExist: raise Http404('No such stock') if not _fine_repay(customer): return HttpResponseForbidden(EM_CANNOT_PAY_FINE) stock_price = get_stock_price_from_market(stock, purchase_date) if not stock_price: return HttpResponseForbidden('invalid purchase') purchase_amount = stock_price * new_position_share if customer.deposit < purchase_amount: return HttpResponseForbidden(EM_DEPOSIT_NOT_ENOUGH) if _get_customer_credit(customer)['credit_level'] > Credit.CREDIT_PRIMARY_ACCOUNT: return HttpResponseForbidden('credit level forbidden') customer.deposit -= purchase_amount try: stock_investment = StockInvestment.objects.get(customer=customer, stock=stock) stock_investment.cumulative_purchase_amount += purchase_amount stock_investment.position_share += new_position_share stock_investment.current_deposit = customer.deposit except StockInvestment.DoesNotExist: stock_investment = StockInvestment(customer=customer, stock=stock, position_share=new_position_share, purchase_date=purchase_date, cumulative_purchase_amount=purchase_amount, current_deposit=customer.deposit) StockInvestmentRecord(customer=customer, stock=stock, position_share=new_position_share, purchase_date=purchase_date, purchase_amount=purchase_amount, current_deposit=customer.deposit).save() customer.save() stock_investment.save() response_data = {'msg': 'stock purchase success'} return HttpResponse(json.dumps(response_data))
def buy_fund(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') customer_id = int(parameter_dict['customer_id']) fund_id = int(parameter_dict['fund_id']) purchase_amount = float(parameter_dict['purchase_amount']) purchase_date = datetime.strptime(parameter_dict['purchase_date'], DATE_TIME_FORMAT).date() return_cycle = int(parameter_dict['return_cycle']) except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: customer = Customer.objects.get(customer_id=customer_id) fund = Fund.objects.get(fund_id=fund_id) except Customer.DoesNotExist: raise Http404(EM_NO_SUCH_CUSTOMER) except Fund.DoesNotExist: raise Http404('No such fund') if not _fine_repay(customer): return HttpResponseForbidden(EM_CANNOT_PAY_FINE) if customer.deposit < purchase_amount: return HttpResponseForbidden(EM_DEPOSIT_NOT_ENOUGH) if _get_customer_credit(customer)['credit_level'] > Credit.CREDIT_SECONDARY_ACCOUNT: return HttpResponseForbidden('credit level forbidden') fund_price = get_fund_price_from_market(fund, purchase_date) if not fund_price: return HttpResponseForbidden('invalid purchase') customer.deposit -= purchase_amount customer.save() fund_investment = FundInvestment(customer=customer, fund=fund, position_share=purchase_amount / fund_price, purchase_amount=purchase_amount, purchase_date=purchase_date, due_date=purchase_date + timedelta(days=return_cycle), current_deposit=customer.deposit) fund_investment.save() response_data = {'msg': 'fund purchase success'} return HttpResponse(json.dumps(response_data))
def bank_teller_login(request): # print('INFO: got request: [%s]' % str(request)) try: parameter_dict = fetch_parameter_dict(request, 'POST') bank_teller = BankTeller.objects.get(account=parameter_dict['account']) password = parameter_dict['password'] except KeyError: return HttpResponseBadRequest("parameter missing or invalid parameter") except BankTeller.DoesNotExist: # print("INFO: account doesn't exist") return HttpResponseForbidden("account doesn't exist") if password != bank_teller.password: # print("INFO: wrong password: [%s] doesn't match [%s]" % (parameter_dict['password'], bank_teller.password)) return HttpResponseForbidden("wrong password") new_token, new_expire_time = update_token(bank_teller) response_data = {'token': new_token, 'expire_time:': new_expire_time} # print('INFO: build response data [%s] success' % str(response_data)) return HttpResponse(json.dumps(response_data))
def loan_repay(request): if not fetch_bank_teller_by_token(request.META[TOKEN_HEADER_KEY]): return HttpResponse(content='Unauthorized', status=401) try: parameter_dict = fetch_parameter_dict(request, 'POST') loan_record_id = int(parameter_dict['loan_record_id']) repay = float(parameter_dict['repay']) except (KeyError, ValueError, TypeError): return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) if repay <= 0: return HttpResponseBadRequest(EM_INVALID_OR_MISSING_PARAMETERS) try: loan_record = LoanRecord.objects.get(loan_record_id=loan_record_id) except LoanRecord.DoesNotExist: raise Http404('No such loan record') _calculate_fine(loan_record) if _loan_repay(loan_record, repay, False): response_data = {'msg': 'loan repay success'} return HttpResponse(json.dumps(response_data)) return HttpResponseBadRequest('too much repay')
def bank_teller_register(request): try: parameter_dict = fetch_parameter_dict(request, 'POST') account = parameter_dict['account'] password = parameter_dict['password'] name = parameter_dict['name'] phone = parameter_dict['phone'] except KeyError: return HttpResponseBadRequest("parameter missing or invalid parameter") try: validate_password(password=password) except ValidationError: return HttpResponseForbidden("password not accepted, too simple") # TODO: 参数校验 try: BankTeller.objects.get(account=account) return HttpResponseForbidden("account already exist") except BankTeller.DoesNotExist: BankTeller(account=account, password=password, name=name, phone=phone).save() response_data = {'msg': 'register bank teller success'} return HttpResponse(json.dumps(response_data))