From c5f798dc06f7710bd02972b80c1ca1aa59e16dc8 Mon Sep 17 00:00:00 2001 From: Abubakar Muhammad Sadiq Date: Fri, 2 Sep 2022 09:22:36 +0100 Subject: [PATCH 1/5] style fix fifth wave --- Loans/forms.py | 8 +- Loans/models.py | 25 ++-- Loans/urls.py | 5 +- Loans/views.py | 181 ++++++++++++++------------ Users/views.py | 41 +++--- templates/fsp/beneficiary_data.html | 27 ++++ templates/fsp/create_loan.html | 6 + templates/fsp/fsp-base.html | 12 +- templates/fsp/fsp-home.html | 2 +- templates/fsp/fsp_profile.html | 8 +- templates/fsp/loan.html | 41 +----- templates/fsp/loan_beneficiaries.html | 10 +- templates/user/profile.html | 16 ++- templates/user/user_loan.html | 5 +- 14 files changed, 208 insertions(+), 179 deletions(-) create mode 100644 templates/fsp/beneficiary_data.html diff --git a/Loans/forms.py b/Loans/forms.py index f5b42d2..30e0318 100644 --- a/Loans/forms.py +++ b/Loans/forms.py @@ -19,9 +19,13 @@ class CreateLoanForm(ModelForm): class Meta: model = Loan - fields = ["program_title", "size", "sectors", "amount", "amount", + fields = ["program_title", "size", "sectors", "amount", "paying_days", "grace_period", - "collateral", "requirements"] + "collateral", "requirements", "intrest"] + + def __init__(self, *args, **kwargs): + super(CreateLoanForm, self).__init__(*args, **kwargs) + self.fields["intrest"].widget.attrs['class'] = 'form-input' class AddRecordForm(ModelForm): diff --git a/Loans/models.py b/Loans/models.py index dacda42..ec9f55a 100644 --- a/Loans/models.py +++ b/Loans/models.py @@ -107,17 +107,18 @@ def number_of_approved(self): return count def get_sector_data(self): - beneficiaries = self.beneficiaries.all() - data = {} - for beneficiary in beneficiaries: - sector = beneficiary.user.sector - print("sectors", sector) - it_exist = data.get(sector.name, 0) - if it_exist == 0: - data[sector.name] = 1 - else: - data[sector.name] += 1 - return data + pass + # beneficiaries = self.beneficiaries.all() + # data = {} + # for beneficiary in beneficiaries: + # sector = beneficiary.user.sector.all() + # print("sectors", sector) + # it_exist = data.get(sector.name, 0) + # if it_exist == 0: + # data[sector.name] = 1 + # else: + # data[sector.name] += 1 + # return data # number_of_approved = loan.beneficiaries.filter(is_given=True).count() @@ -146,7 +147,7 @@ def grant_loan(self, user): application = get_object_or_404(Beneficiaries, id=the_id) application.is_given = True application.is_denied = False - application.time_to_pay = timezone.localtime() + timedelta(days=self.paying_days) + application.time_to_pay = datetime.today() + timedelta(days=self.paying_days) application.save() return True return False diff --git a/Loans/urls.py b/Loans/urls.py index e3f3144..a8f7b62 100644 --- a/Loans/urls.py +++ b/Loans/urls.py @@ -2,7 +2,7 @@ from .views import create_loan, loan_details, dashboard, loans_list, fsp_profile, \ loan_beneficiaries, add_record, add_sales_record, fs, fr, user_loan_details, \ list_loans, apply_loan, users_credentials, grant_loan, deny_loan, generate_income_statement, \ - request_financial_statements, verify_transfer + request_financial_statements, verify_transfer, beneficiary_data app_name = 'loans' @@ -20,6 +20,7 @@ path('loans/', loans_list, name='loans_list'), path('fsp/profile/', fsp_profile, name='profile'), path('loans//beneficiaries/', loan_beneficiaries, name='beneficiaries'), + path('loans//beneficiaries/', beneficiary_data, name='beneficiary_data'), path('list-loans', list_loans, name="list_loans"), path('apply-loan//', apply_loan, name="apply_loan"), path('users-credential///', users_credentials, name="users_loan_requirements"), @@ -27,5 +28,5 @@ path('deny-loan///', deny_loan, name="deny_loan"), path('request-financial-statement/', request_financial_statements, name="request-statement"), path('transfer/verify', verify_transfer, name="verify_transfer"), - path("recommended-loans/", recommended_loans, name="recommended_loans") + # path("recommended-loans/", recommended_loans, name="recommended_loans") ] diff --git a/Loans/views.py b/Loans/views.py index 2a2e073..a447215 100644 --- a/Loans/views.py +++ b/Loans/views.py @@ -21,7 +21,6 @@ from django.conf import settings - # Create your views here. def create_loan(request): @@ -63,6 +62,7 @@ def get_stats_all(loans): } return data + def loan_details(request, pk): loan = get_object_or_404(Loan, id=pk) data = get_stats(loan) @@ -82,8 +82,11 @@ def dashboard(request): loans = Loan.objects.filter(fsp=user) return render(request, 'fsp/fsp-home.html', {"loans": loans}) else: + + # recommended = Loan.objects.filter(Q(sector=user.sectors, size=user.size) | + # Q(size=user.size) | Q(sector=user.sectorsx)) loans = Loan.objects.all() - return render(request, 'user/user_loan.html', {"loans": loans}) + return render(request, 'user/user_loan.html', {"user": user, "loans": loans}) @login_required @@ -111,9 +114,23 @@ def loan_beneficiaries(request, pk): user = request.user loan = get_object_or_404(Loan, id=pk) beneficiaries = loan.beneficiaries.all() + recommended = True + # if beneficiaries: + # for beneficiary in beneficiaries: + # if beneficiary.is_recommended(pk): + # recommended = True + print(beneficiaries) - return render(request, 'fsp/loan_beneficiaries.html', {"user": user, "beneficiaries": beneficiaries, "loans": loan}) + return render(request, 'fsp/loan_beneficiaries.html', {"user": user, "beneficiaries": beneficiaries, "loan": loan, \ + "recommended": recommended}) + +def beneficiary_data(request, loan_pk, beneficiary_pk): + loan = get_object_or_404(Loan, id=loan_pk) + beneficiaries = loan.beneficiaries.all() + beneficiary = beneficiaries.get(user=beneficiary_pk) + return render(request, 'fsp/beneficiary_data.html', {"loan": loan, "beneficiaries": beneficiaries, \ + "beneficiary": beneficiary}) def grant_loan(request, loan_id, username): @@ -129,7 +146,6 @@ def grant_loan(request, loan_id, username): # and will never apply to this specific loan program again - def deny_loan(request, loan_id, username): # TODO: deny loan tomorow test user = get_object_or_404(User, username=username) @@ -160,8 +176,8 @@ def apply_loan(request, id): form.cleaned_data["number_of_employee"]) if not \ (user.number_of_employee) else user.number_of_employee) loan.beneficiaries.add(beneficiary) - generate_balance_sheet(request.user, True) - generate_income_statement(request,user, True) + generate_balance_sheet(user, True) + generate_income_statement(user, True) return render(request, "apply_message.html", {"message": \ "successfully applied!, you'll hear from us sonn"}) return render(request, "apply_message.html", {"user": user, "message": \ @@ -176,6 +192,7 @@ def apply_loan(request, id): # add him to the beneficiaries list # with all his documents and things + def users_credentials(request, loan_id, username): """This will query all the requirements of a user of the particular loan""" user = get_object_or_404(User, username=username) @@ -187,18 +204,17 @@ def users_credentials(request, loan_id, username): print(output) return render(request, "user/users_credentials.html", {"credentials": output}) + def recommended_loans(request): # TODO: recommend loan # check the loans that target the bussiness size and sector to be top - user = request.user - recommended = Loan.objects.filter(Q(sector=user.sector, size=user.size) | - Q(size=user.size) | Q(sector=user.sector)) - return render(request, "recommended_loans.html", {"loans": recommended}) + + return render(request, "list_of_loans.html") def search(request): - recommended = Loan.objects.filter(Q(sector=user.sector, size=user.size) | - Q(size=user.size) | Q(sector=user.sector)) + recommended = Loan.objects.filter(Q(sector=user.sector, size=user.size) | + Q(size=user.size) | Q(sector=user.sector)) return render(request, "recommended_loans.html", {"loans": recommended}) # call a fake machine learning recomendation algorithm @@ -379,7 +395,7 @@ def generate_balance_sheet(user, is_apply_loan): stock_dividend = b_sheet.stock_dividend liabilities = b_sheet.liabilities assets = b_sheet.assets - + # b_sheet.save() name = user.username + " " + " Company" @@ -479,7 +495,6 @@ def request_financial_statements(request): def verify_transfer(request): - """Webhook to verify any transfer made to Flutterwave and send the two pdf files to the user. This is an automatic process""" @@ -511,75 +526,75 @@ def verify_transfer(request): email_2.send(fail_silently=True) return HttpResponse(status=200) -======= - f_record = get_object_or_404(FinancialRecord, user=user) - records = f_record.records - other_income = f_record.get_other_incomes - total_sales = f_record.total_sales - total_income = f_record.get_total_incomes - expenses = f_record.get_expenses - total_expenses = f_record.get_total_expenses - - start_date = datetime.today() - end_date = start_date - timedelta(days=30) - revenues = f_record.total_sales - prev_revenues = f_record.total_prev_sales - net_profit = f_record.get_net_profit - prev_net_profit = f_record.get_prev_net_profit - ideal_profit = f_record.get_ideal_profit() - print(str(ideal_profit)) - - gross_profit = f_record.get_gross_profit - prev_gross_profit = f_record.get_prev_gross_profit - - depreciation = f_record.get_appreciation - - f_record.revenue = revenues - f_record.net_profit = net_profit - f_record.profit = gross_profit - f_record.save() - - try: - depreciation_percent = (net_profit / prev_net_profit) * 100 - - except ZeroDivisionError: - - depreciation_percent = 0 - - name = user.username + " " + " Company" - - open('templates/temp.html', "w").write(render_to_string('income-statement.html', - {'f_record': f_record, - 'records': records, - 'name': name, - 'from_date': end_date, - 'to_date': start_date, - 'revenues': revenues, - 'net_profit': net_profit, - 'gross_profit': gross_profit, - 'depreciation': depreciation, - 'prev_revenues': prev_revenues, - 'prev_net_profit': prev_net_profit, - 'prev_gross_profit': prev_gross_profit, - 'depreciation_percent': depreciation_percent, - 'other_incomes': other_income, - 'total_sales': total_sales, - 'total_income': total_income, - 'expenses': expenses, - 'total_expenses': total_expenses, })) - - # getting the template - pdf = html_to_pdf('temp.html') - - # file_name = user.first_name + " income statement " + month + " " + year + ".pdf" - file_name = user.username + " income statement" + ".pdf" - - receipt_file = BytesIO(pdf.content) - - user.financial_record = File(receipt_file, file_name) - user.save() - # rendering the template - return HttpResponse(pdf, content_type='application/pdf') + # + # f_record = get_object_or_404(FinancialRecord, user=user) + # records = f_record.records + # other_income = f_record.get_other_incomes + # total_sales = f_record.total_sales + # total_income = f_record.get_total_incomes + # expenses = f_record.get_expenses + # total_expenses = f_record.get_total_expenses + # + # start_date = datetime.today() + # end_date = start_date - timedelta(days=30) + # revenues = f_record.total_sales + # prev_revenues = f_record.total_prev_sales + # net_profit = f_record.get_net_profit + # prev_net_profit = f_record.get_prev_net_profit + # ideal_profit = f_record.get_ideal_profit() + # print(str(ideal_profit)) + # + # gross_profit = f_record.get_gross_profit + # prev_gross_profit = f_record.get_prev_gross_profit + # + # depreciation = f_record.get_appreciation + # + # f_record.revenue = revenues + # f_record.net_profit = net_profit + # f_record.profit = gross_profit + # f_record.save() + # + # try: + # depreciation_percent = (net_profit / prev_net_profit) * 100 + # + # except ZeroDivisionError: + # + # depreciation_percent = 0 + # + # name = user.username + " " + " Company" + # + # open('templates/temp.html', "w").write(render_to_string('income-statement.html', + # {'f_record': f_record, + # 'records': records, + # 'name': name, + # 'from_date': end_date, + # 'to_date': start_date, + # 'revenues': revenues, + # 'net_profit': net_profit, + # 'gross_profit': gross_profit, + # 'depreciation': depreciation, + # 'prev_revenues': prev_revenues, + # 'prev_net_profit': prev_net_profit, + # 'prev_gross_profit': prev_gross_profit, + # 'depreciation_percent': depreciation_percent, + # 'other_incomes': other_income, + # 'total_sales': total_sales, + # 'total_income': total_income, + # 'expenses': expenses, + # 'total_expenses': total_expenses, })) + # + # # getting the template + # pdf = html_to_pdf('temp.html') + # + # # file_name = user.first_name + " income statement " + month + " " + year + ".pdf" + # file_name = user.username + " income statement" + ".pdf" + # + # receipt_file = BytesIO(pdf.content) + # + # user.financial_record = File(receipt_file, file_name) + # user.save() + # # rendering the template + # return HttpResponse(pdf, content_type='application/pdf') @method_decorator(login_required, name='dispatch') diff --git a/Users/views.py b/Users/views.py index 60b72d4..6434dcb 100644 --- a/Users/views.py +++ b/Users/views.py @@ -163,8 +163,13 @@ def user_profile(request): loans_applied = Beneficiaries.objects.filter(user=user) number_of_loan_applied = Beneficiaries.objects.filter(user=user).count() + is_given = 0 + if loans_applied: + for loan in loans_applied: + if loan.is_given: + is_given += 1 context = {'user': user, 'wallet': wallet, 'transactions': transactions, - "loans_applied": loans_applied, "number_of_loan_applied": number_of_loan_applied} + "is_given": is_given, "number_of_loan_applied": number_of_loan_applied} return render(request, 'user/profile.html', context) @@ -188,16 +193,16 @@ def financial_statement(request): return render(request, "financial-statement.html") -def credit_score(request): +def credit_score(request): user = request.user - #give a credit score between 0 - 100% - #based on this creterias - #knowledge - #does he have unpaid credit that exceeds limit - #how manay times does he exceeeds and how manay days - #his credit score will be frozen if he have an outstanding balance - #faninacial record - #and have a mini statement and a valid balance sheet + # give a credit score between 0 - 100% + # based on this creterias + # knowledge + # does he have unpaid credit that exceeds limit + # how manay times does he exceeeds and how manay days + # his credit score will be frozen if he have an outstanding balance + # faninacial record + # and have a mini statement and a valid balance sheet @login_required @@ -210,13 +215,13 @@ def verification(request): print(form.errors) if form.is_valid(): User.objects.filter(username=request.user.username).update( - address = form.cleaned_data["address"], - bvn = form.cleaned_data["bvn"], - nin = form.cleaned_data["nin"], - time_in_business = form.cleaned_data["time_in_business"], - sector = form.cleaned_data["sector"], - size = form.cleaned_data["size"], - number_of_employee = form.cleaned_data["number_of_employee"] + address=form.cleaned_data["address"], + bvn=form.cleaned_data["bvn"], + nin=form.cleaned_data["nin"], + time_in_business=form.cleaned_data["time_in_business"], + sector=form.cleaned_data["sector"], + size=form.cleaned_data["size"], + number_of_employee=form.cleaned_data["number_of_employee"] ) request.user.is_kyc_verified = True request.user.save() @@ -224,4 +229,4 @@ def verification(request): else: return render(request, "verify.html", {"form": form}) else: - return render(request, "verification_success.html", {"message": "Already Verified"}) \ No newline at end of file + return render(request, "verification_success.html", {"message": "Already Verified"}) diff --git a/templates/fsp/beneficiary_data.html b/templates/fsp/beneficiary_data.html new file mode 100644 index 0000000..8aecb54 --- /dev/null +++ b/templates/fsp/beneficiary_data.html @@ -0,0 +1,27 @@ +{% extends 'fsp/fsp-base.html' %} +{% block title %}Lamuni:Loans{% endblock %} + +{% block content %} +
+
+
+ +
+ +

Applicats Details

+
+

First name: Ibrahim Muhammad Sadiq

+

Middle name: Muhammad

+

Last name: Sadiq

+ +

Phone: +2348128543654

+

Address: No. 234 Hotoro nasarawa LGA Kano Nigeria

+

Financial Statement:

+

Balance Sheet:

+
+ +
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/fsp/create_loan.html b/templates/fsp/create_loan.html index e627a02..00d3080 100644 --- a/templates/fsp/create_loan.html +++ b/templates/fsp/create_loan.html @@ -100,7 +100,13 @@

Create Loan

+ + {{ form.intrest }} + {{ form.intrest.errors }} + + +

diff --git a/templates/fsp/fsp-base.html b/templates/fsp/fsp-base.html index d12bdc1..4092fa4 100644 --- a/templates/fsp/fsp-base.html +++ b/templates/fsp/fsp-base.html @@ -152,12 +152,12 @@ Loans - - - - - Wallet - +{# #} +{# #} +{# #} +{# #} +{# Wallet#} +{# #}
diff --git a/templates/fsp/fsp-home.html b/templates/fsp/fsp-home.html index a88bba4..2ce2925 100644 --- a/templates/fsp/fsp-home.html +++ b/templates/fsp/fsp-home.html @@ -30,7 +30,7 @@

{{ data.number_of_approved }}

Money Given

last 30 days

-

{{ data. }}

+

5,000,000

diff --git a/templates/fsp/fsp_profile.html b/templates/fsp/fsp_profile.html index af0dbf1..17358db 100644 --- a/templates/fsp/fsp_profile.html +++ b/templates/fsp/fsp_profile.html @@ -62,19 +62,19 @@

Comapany Description
First Name :
-
{{ user.first_name }}
+
{{ user.first_name }} Abubakar
Middle Name:
-
{{ user.middle_name }}
+
{{ user.middle_name }}Muhammad
Last Name:
-
{{ user.last_name }}
+
{{ user.last_name }}Sadiq
Gender:
-
{{ user.gender }}
+
{{ user.gender }}Male
Contact No:
diff --git a/templates/fsp/loan.html b/templates/fsp/loan.html index 5db950a..5f38850 100644 --- a/templates/fsp/loan.html +++ b/templates/fsp/loan.html @@ -56,7 +56,7 @@

List of Loans

Amount - Beneficiaries + Applicants Active @@ -88,7 +88,9 @@

List of Loans

medium
- {{ loan.sectors }} + {% for sector in loan.sectors.all %} + {{ sectors.name }} + {% endfor %} {{ loan.amount }} @@ -120,40 +122,7 @@

List of Loans

- - - 1 - - -
- tallafin Noma -
- - -
medium
- - - Agric - - - 20,000 - - - 30,000 - - - Yes - - - 30 days - - - 20 days - - - HHh don't pay - - + {% endfor %} diff --git a/templates/fsp/loan_beneficiaries.html b/templates/fsp/loan_beneficiaries.html index a13d78e..82219a1 100644 --- a/templates/fsp/loan_beneficiaries.html +++ b/templates/fsp/loan_beneficiaries.html @@ -96,7 +96,7 @@ - +

diff --git a/templates/user/profile.html b/templates/user/profile.html index 7357eb0..cb86510 100644 --- a/templates/user/profile.html +++ b/templates/user/profile.html @@ -62,7 +62,7 @@
Add Sales Record
-
  • +
  • Request Record
    @@ -158,30 +158,32 @@

    Biograph

    -

    Loans Applied

    +

    Loans Approved

    - {{ loans_applied.all }} + + {{ is_given }} +
    -

    Loans Applied

    +

    Total Amount Given

    - 35 + 500,000
    -

    Loans Applied

    +

    Total Amount Owe

    - 35 + 350,000
    diff --git a/templates/user/user_loan.html b/templates/user/user_loan.html index b956b37..53d9709 100644 --- a/templates/user/user_loan.html +++ b/templates/user/user_loan.html @@ -42,9 +42,8 @@

    {{ loan.program_tit {% for loan in loans %}
    - {% with loan.fsp as user %} - - {% endwith %} + +

    {{ loan.date_created | date }}

    {{ loan.program_title }}

    Amount: {{ loan.amount }}

    From 11f4fc265cc46742fef5b60fe3624976c5d582d5 Mon Sep 17 00:00:00 2001 From: Abubakar Muhammad Sadiq Date: Fri, 2 Sep 2022 22:37:20 +0100 Subject: [PATCH 2/5] refactor files --- Loans/views.py | 12 +- Users/forms.py | 24 ++- Users/views.py | 6 +- Wallet/views.py | 4 +- static/css/index.css | 176 ++++++++++------------ templates/components/footer.html | 5 +- templates/components/header.html | 2 +- templates/{ => loans}/apply_for_loan.html | 0 templates/{ => loans}/apply_message.html | 0 templates/{ => loans}/list_of_loans.html | 0 templates/registration/logout.html | 17 ++- templates/{ => user}/recharge_form.html | 0 templates/{ => user}/transfer_form.html | 0 templates/user/verification_success.html | 13 ++ templates/user/verify.html | 32 ++++ templates/verification_success.html | 3 - templates/verify.html | 7 - 17 files changed, 168 insertions(+), 133 deletions(-) rename templates/{ => loans}/apply_for_loan.html (100%) rename templates/{ => loans}/apply_message.html (100%) rename templates/{ => loans}/list_of_loans.html (100%) rename templates/{ => user}/recharge_form.html (100%) rename templates/{ => user}/transfer_form.html (100%) create mode 100644 templates/user/verification_success.html create mode 100644 templates/user/verify.html delete mode 100644 templates/verification_success.html delete mode 100644 templates/verify.html diff --git a/Loans/views.py b/Loans/views.py index a447215..566f4e1 100644 --- a/Loans/views.py +++ b/Loans/views.py @@ -101,7 +101,7 @@ def list_loans(request): """All the list of loans from all financial service providers""" loans = Loan.objects.all() print(loans) - return render(request, "list_of_loans.html", {"loans": loans}) + return render(request, "loans/list_of_loans.html", {"loans": loans}) def fsp_profile(request): @@ -178,14 +178,14 @@ def apply_loan(request, id): loan.beneficiaries.add(beneficiary) generate_balance_sheet(user, True) generate_income_statement(user, True) - return render(request, "apply_message.html", {"message": \ + return render(request, "loans/apply_message.html", {"message": \ "successfully applied!, you'll hear from us sonn"}) - return render(request, "apply_message.html", {"user": user, "message": \ + return render(request, "loans/apply_message.html", {"user": user, "message": \ "Sorry we cannot offer you Credit!, Try Again"}) - return render(request, "apply_message.html", {"message": "You Have Already Applied to this program!"}) + return render(request, "loans/apply_message.html", {"message": "You Have Already Applied to this program!"}) else: print(form.as_p()) - return render(request, "apply_for_loan.html", {"form": form}) + return render(request, "loans/apply_for_loan.html", {"form": form}) # if the user credit score is below 50% dont give him # if the user has no problem @@ -209,7 +209,7 @@ def recommended_loans(request): # TODO: recommend loan # check the loans that target the bussiness size and sector to be top - return render(request, "list_of_loans.html") + return render(request, "loans/list_of_loans.html") def search(request): diff --git a/Users/forms.py b/Users/forms.py index 9a628b8..a86dc23 100644 --- a/Users/forms.py +++ b/Users/forms.py @@ -25,11 +25,13 @@ class Meta: class UserEditForm(forms.ModelForm): class Meta: model = User - fields = ('image', 'first_name', 'middle_name', 'last_name', 'email', 'date_of_birth', 'phone', 'state', 'occupation') + fields = ( + 'image', 'first_name', 'middle_name', 'last_name', 'email', 'date_of_birth', 'phone', 'state', 'occupation') def __init__(self, *args, **kwargs): super(UserEditForm, self).__init__(*args, **kwargs) - self.fields['date_of_birth'].widget = SelectDateWidget(empty_label=("Choose Year", "Choose Month", "Choose Day")) + self.fields['date_of_birth'].widget = SelectDateWidget( + empty_label=("Choose Year", "Choose Month", "Choose Day")) self.fields['image'].widget.attrs['class'] = 'form-input' self.fields['first_name'].widget.attrs['class'] = 'form-input' self.fields['middle_name'].widget.attrs['class'] = 'form-input' @@ -41,7 +43,6 @@ def __init__(self, *args, **kwargs): self.fields['occupation'].widget.attrs['class'] = 'form-input' - # class ProfileForm(forms.ModelForm): # class Meta: # model = Profile @@ -59,10 +60,19 @@ class ResetPawsswordForm(forms.Form): password1 = forms.CharField(max_length=128) password2 = forms.CharField(max_length=128) -class KYCVerifyForm(ModelForm): +class KYCVerifyForm(ModelForm): class Meta: model = User - fields = ["address", "bvn", "nin", \ - "time_in_business", "sector", "size", "number_of_employee"] - + fields = ("address", "bvn", "nin", + "time_in_business", "sector", "size", "number_of_employee") + + def __init__(self, *args, **kwargs): + super(KYCVerifyForm, self).__init__(*args, **kwargs) + self.fields['address'].widget.attrs['class'] = 'form-input' + self.fields['bvn'].widget.attrs['class'] = 'form-input' + self.fields['nin'].widget.attrs['class'] = 'form-input' + self.fields['time_in_business'].widget.attrs['class'] = 'form-input' + self.fields['sector'].widget.attrs['class'] = 'form-input' + self.fields['size'].widget.attrs['class'] = 'form-input' + self.fields['number_of_employee'].widget.attrs['class'] = 'form-input' \ No newline at end of file diff --git a/Users/views.py b/Users/views.py index 6434dcb..785edba 100644 --- a/Users/views.py +++ b/Users/views.py @@ -225,8 +225,8 @@ def verification(request): ) request.user.is_kyc_verified = True request.user.save() - return render(request, "verification_success.html", {"message": "Verification is Successfull"}) + return render(request, "loans/../templates/user/verification_success.html", {"message": "Verification is Successfull"}) else: - return render(request, "verify.html", {"form": form}) + return render(request, "loans/../templates/user/verify.html", {"form": form}) else: - return render(request, "verification_success.html", {"message": "Already Verified"}) + return render(request, "loans/../templates/user/verification_success.html", {"message": "Already Verified"}) diff --git a/Wallet/views.py b/Wallet/views.py index f03f8e0..5131cc7 100644 --- a/Wallet/views.py +++ b/Wallet/views.py @@ -94,7 +94,7 @@ def recharge(request, *args, **kwargs): context = { 'recharge_form': recharge_form } - return render(request, 'recharge_form.html', context) + return render(request, 'user/recharge_form.html', context) def withdraw(request, *args, **kwargs): @@ -135,4 +135,4 @@ def transfer(request, *args, **kwargs): context = { "transfer_form": transfer_form, } - return render(request, "transfer_form.html", context) + return render(request, "user/transfer_form.html", context) diff --git a/static/css/index.css b/static/css/index.css index f3af188..8748713 100644 --- a/static/css/index.css +++ b/static/css/index.css @@ -683,16 +683,21 @@ Ensure the default browser behavior of the `hidden` attribute. margin-bottom: 1rem; } -.my-10 { - margin-top: 2.5rem; - margin-bottom: 2.5rem; -} - .my-2 { margin-top: 0.5rem; margin-bottom: 0.5rem; } +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + +.my-10 { + margin-top: 2.5rem; + margin-bottom: 2.5rem; +} + .mx-2 { margin-left: 0.5rem; margin-right: 0.5rem; @@ -703,16 +708,16 @@ Ensure the default browser behavior of the `hidden` attribute. margin-bottom: 0.25rem; } -.mx-6 { - margin-left: 1.5rem; - margin-right: 1.5rem; -} - .-my-2 { margin-top: -0.5rem; margin-bottom: -0.5rem; } +.mx-6 { + margin-left: 1.5rem; + margin-right: 1.5rem; +} + .my-20 { margin-top: 5rem; margin-bottom: 5rem; @@ -728,11 +733,6 @@ Ensure the default browser behavior of the `hidden` attribute. margin-right: 0.75rem; } -.mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} - .mb-6 { margin-bottom: 1.5rem; } @@ -761,10 +761,6 @@ Ensure the default browser behavior of the `hidden` attribute. margin-top: 2rem; } -.mb-1 { - margin-bottom: 0.25rem; -} - .mt-2 { margin-top: 0.5rem; } @@ -805,6 +801,10 @@ Ensure the default browser behavior of the `hidden` attribute. margin-top: 1.25rem; } +.mb-1 { + margin-bottom: 0.25rem; +} + .mb-5 { margin-bottom: 1.25rem; } @@ -925,14 +925,14 @@ Ensure the default browser behavior of the `hidden` attribute. display: none; } -.h-5 { - height: 1.25rem; -} - .h-8 { height: 2rem; } +.h-5 { + height: 1.25rem; +} + .h-full { height: 100%; } @@ -989,18 +989,10 @@ Ensure the default browser behavior of the `hidden` attribute. height: calc(100% - 0.25rem); } -.min-h-\[300px\] { - min-height: 300px; -} - .min-h-\[400px\] { min-height: 400px; } -.w-5 { - width: 1.25rem; -} - .w-full { width: 100%; } @@ -1009,6 +1001,10 @@ Ensure the default browser behavior of the `hidden` attribute. width: 2rem; } +.w-5 { + width: 1.25rem; +} + .w-6 { width: 1.5rem; } @@ -1073,6 +1069,10 @@ Ensure the default browser behavior of the `hidden` attribute. max-width: 1280px; } +.max-w-3xl { + max-width: 48rem; +} + .max-w-xs { max-width: 20rem; } @@ -1097,10 +1097,6 @@ Ensure the default browser behavior of the `hidden` attribute. max-width: 56rem; } -.max-w-3xl { - max-width: 48rem; -} - .flex-none { flex: none; } @@ -2087,6 +2083,10 @@ Ensure the default browser behavior of the `hidden` attribute. border-top-width: 8px; } +.border-b-2 { + border-bottom-width: 2px; +} + .border-t-4 { border-top-width: 4px; } @@ -2131,11 +2131,6 @@ Ensure the default browser behavior of the `hidden` attribute. border-style: none; } -.border-light-gray { - --tw-border-opacity: 1; - border-color: rgb(199 195 192 / var(--tw-border-opacity)); -} - .border-gray-200 { --tw-border-opacity: 1; border-color: rgb(229 231 235 / var(--tw-border-opacity)); @@ -2146,6 +2141,11 @@ Ensure the default browser behavior of the `hidden` attribute. border-color: rgb(22 163 74 / var(--tw-border-opacity)); } +.border-light-gray { + --tw-border-opacity: 1; + border-color: rgb(199 195 192 / var(--tw-border-opacity)); +} + .border-light-orange { --tw-border-opacity: 1; border-color: rgb(251 248 243 / var(--tw-border-opacity)); @@ -2385,8 +2385,8 @@ Ensure the default browser behavior of the `hidden` attribute. object-position: center; } -.p-6 { - padding: 1.5rem; +.p-8 { + padding: 2rem; } .p-0 { @@ -2401,10 +2401,6 @@ Ensure the default browser behavior of the `hidden` attribute. padding: 0.25rem; } -.p-8 { - padding: 2rem; -} - .p-5 { padding: 1.25rem; } @@ -2621,11 +2617,6 @@ Ensure the default browser behavior of the `hidden` attribute. font-family: "some font",sans-serif; } -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - .text-3xl { font-size: 1.875rem; line-height: 2.25rem; @@ -2636,6 +2627,11 @@ Ensure the default browser behavior of the `hidden` attribute. line-height: 1rem; } +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + .text-lg { font-size: 1.125rem; line-height: 1.75rem; @@ -2764,11 +2760,6 @@ Ensure the default browser behavior of the `hidden` attribute. letter-spacing: 0.05em; } -.text-dark-orange { - --tw-text-opacity: 1; - color: rgb(255 150 42 / var(--tw-text-opacity)); -} - .text-light-gray { --tw-text-opacity: 1; color: rgb(199 195 192 / var(--tw-text-opacity)); @@ -2799,9 +2790,9 @@ Ensure the default browser behavior of the `hidden` attribute. color: rgb(22 163 74 / var(--tw-text-opacity)); } -.text-gray-700 { +.text-dark-orange { --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); + color: rgb(255 150 42 / var(--tw-text-opacity)); } .text-gray-500 { @@ -2829,6 +2820,11 @@ Ensure the default browser behavior of the `hidden` attribute. color: rgb(161 161 170 / var(--tw-text-opacity)); } +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + .text-gray-600 { --tw-text-opacity: 1; color: rgb(75 85 99 / var(--tw-text-opacity)); @@ -3462,12 +3458,6 @@ body { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } -.hover\:scale-110:hover { - --tw-scale-x: 1.1; - --tw-scale-y: 1.1; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - .hover\:border-l-4:hover { border-left-width: 4px; } @@ -3743,31 +3733,31 @@ body { margin-bottom: 2.5rem; } + .sm\:mx-8 { + margin-left: 2rem; + margin-right: 2rem; + } + .sm\:mx-4 { margin-left: 1rem; margin-right: 1rem; } - .sm\:mx-2 { - margin-left: 0.5rem; - margin-right: 0.5rem; - } - .sm\:-mx-6 { margin-left: -1.5rem; margin-right: -1.5rem; } + .sm\:mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; + } + .sm\:mx-6 { margin-left: 1.5rem; margin-right: 1.5rem; } - .sm\:mx-8 { - margin-left: 2rem; - margin-right: 2rem; - } - .sm\:mt-16 { margin-top: 4rem; } @@ -3884,12 +3874,6 @@ body { gap: 2rem; } - .sm\:space-x-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); - } - .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1rem * var(--tw-space-x-reverse)); @@ -3934,6 +3918,10 @@ body { border-width: 0px; } + .sm\:p-16 { + padding: 4rem; + } + .sm\:p-6 { padding: 1.5rem; } @@ -3954,10 +3942,6 @@ body { padding: 1rem; } - .sm\:p-16 { - padding: 4rem; - } - .sm\:px-4 { padding-left: 1rem; padding-right: 1rem; @@ -3968,11 +3952,6 @@ body { padding-bottom: 0.75rem; } - .sm\:px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } - .sm\:px-8 { padding-left: 2rem; padding-right: 2rem; @@ -3983,6 +3962,11 @@ body { padding-right: 2.5rem; } + .sm\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + .sm\:py-4 { padding-top: 1rem; padding-bottom: 1rem; @@ -4161,10 +4145,6 @@ body { flex-direction: row; } - .md\:gap-12 { - gap: 3rem; - } - .md\:space-x-12 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(3rem * var(--tw-space-x-reverse)); @@ -4308,15 +4288,15 @@ body { line-height: 1; } - .lg\:text-base { - font-size: 1rem; - line-height: 1.5rem; - } - .lg\:text-4xl { font-size: 2.25rem; line-height: 2.5rem; } + + .lg\:text-base { + font-size: 1rem; + line-height: 1.5rem; + } } @media (prefers-color-scheme: dark) { diff --git a/templates/components/footer.html b/templates/components/footer.html index 28e55d8..05bffbb 100644 --- a/templates/components/footer.html +++ b/templates/components/footer.html @@ -5,9 +5,8 @@

    Lamuni

    -

    - With fiber you can setup your personal portfolio in minutes with - dozen of premade, beautiful templates +

    + With Lamuni Fsp Can Create Credit Programs For MSME's setting custom requirements and having ability to access applicants data statistically and make smart decisions

    diff --git a/templates/components/header.html b/templates/components/header.html index ee0ec33..57c7422 100644 --- a/templates/components/header.html +++ b/templates/components/header.html @@ -5,7 +5,7 @@

    Lamuni

    - + />
    - +
    {% if form.errors %}

    - username or password not correct + {{ form.errors }}

    {% endif %}
    -

    Remember me

    +

    Remember Me

    Forgot Password ? Change

    - -
    + +

    Don't have an account? +