From dda0d65b9c5f5d52dbbf5400b1bc6839f8de221a Mon Sep 17 00:00:00 2001
From: sks444 <krishnasingh.ss30@gmail.com>
Date: Mon, 14 Jun 2021 09:16:10 +0530
Subject: [PATCH] Fix file upload and last step

---
 hypha/apply/projects/forms/vendor.py          | 35 +++++------
 .../projects/migrations/0037_add_vendor.py    | 22 +++++++
 hypha/apply/projects/models/vendor.py         | 12 ++--
 .../application_projects/vendor_form.html     |  7 +--
 .../application_projects/vendor_success.html  |  3 +-
 hypha/apply/projects/urls.py                  |  2 -
 hypha/apply/projects/views/__init__.py        |  2 -
 hypha/apply/projects/views/vendor.py          | 62 ++++++++++++-------
 .../src/javascript/apply/file-uploads.js      | 18 ++++++
 9 files changed, 105 insertions(+), 58 deletions(-)
 create mode 100644 hypha/apply/projects/migrations/0037_add_vendor.py

diff --git a/hypha/apply/projects/forms/vendor.py b/hypha/apply/projects/forms/vendor.py
index 23fbf74ec..86319a0dc 100644
--- a/hypha/apply/projects/forms/vendor.py
+++ b/hypha/apply/projects/forms/vendor.py
@@ -1,9 +1,11 @@
+from addressfield.fields import AddressField
 from django import forms
-from django.db import models
 
 from babel.numbers import list_currencies, get_currency_name
+from hypha.apply.stream_forms.fields import MultiFileField
+from django_file_form.forms import FileFormMixin
 
-from addressfield.fields import AddressField
+# from addressfield.fields import AddressField
 from ..models.vendor import Vendor, VendorFormSettings
 
 
@@ -44,25 +46,21 @@ class CreateVendorFormStep1(BaseVendorForm, forms.ModelForm):
         self.fields['type'].choices = self.fields['type'].choices[1:]
 
 
-class CreateVendorFormStep2(BaseVendorForm, forms.ModelForm):
-    required_to_pay_taxes = forms.ChoiceField(
+class CreateVendorFormStep2(BaseVendorForm, forms.Form):
+    required_to_pay_taxes = forms.TypedChoiceField(
         choices=((False, 'No'), (True, 'Yes')),
-        widget=forms.RadioSelect
+        coerce=lambda x: x == 'True',
+        widget=forms.RadioSelect,
+        required=True
     )
 
-    class Meta:
-        fields = [
-            'required_to_pay_taxes',
-        ]
-        model = Vendor
-
     def __init__(self, *args, **kwargs):
         super(CreateVendorFormStep2, self).__init__(*args, **kwargs)
         self.fields = self.apply_form_settings(self.fields)
 
 
-class CreateVendorFormStep3(BaseVendorForm, forms.Form):
-    due_diligence_documents = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
+class CreateVendorFormStep3(FileFormMixin, BaseVendorForm, forms.Form):
+    due_diligence_documents = MultiFileField(required=False)
 
     def __init__(self, *args, **kwargs):
         super(CreateVendorFormStep3, self).__init__(*args, **kwargs)
@@ -90,9 +88,11 @@ class CreateVendorFormStep4(BaseVendorForm, forms.Form):
 
 
 class CreateVendorFormStep5(BaseVendorForm, forms.Form):
-    need_extra_info = forms.ChoiceField(
+    need_extra_info = forms.TypedChoiceField(
         choices=((False, 'No'), (True, 'Yes')),
-        widget=forms.RadioSelect
+        coerce=lambda x: x == 'True',
+        widget=forms.RadioSelect,
+        required=True
     )
 
     def __init__(self, *args, **kwargs):
@@ -105,8 +105,7 @@ class CreateVendorFormStep6(BaseVendorForm, forms.Form):
         (currency, f'{get_currency_name(currency)} - {currency}')
         for currency in list_currencies()
     ]
-
-    branch_address = AddressField(required=False)
+    branch_address = AddressField()
     ib_account_routing_number = forms.CharField(required=False)
     ib_account_number = forms.CharField(required=False)
     ib_account_currency = forms.ChoiceField(
@@ -114,7 +113,7 @@ class CreateVendorFormStep6(BaseVendorForm, forms.Form):
         required=False,
         initial='USD'
     )
-    ib_branch_address = AddressField(required=False)
+    # ib_branch_address = AddressField()
     nid_type = forms.CharField(required=False)
     nid_number = forms.CharField(required=False)
     other_info = forms.CharField(required=False)
diff --git a/hypha/apply/projects/migrations/0037_add_vendor.py b/hypha/apply/projects/migrations/0037_add_vendor.py
new file mode 100644
index 000000000..02162eedc
--- /dev/null
+++ b/hypha/apply/projects/migrations/0037_add_vendor.py
@@ -0,0 +1,22 @@
+# Generated by Django 2.2.23 on 2021-06-10 10:45
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('application_projects', '0036_add_vendor'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='vendorformsettings',
+            name='account_currency',
+        ),
+        migrations.AddField(
+            model_name='vendorformsettings',
+            name='account_currency_label',
+            field=models.TextField(default='Bank Account Currency', verbose_name='label'),
+        ),
+    ]
diff --git a/hypha/apply/projects/models/vendor.py b/hypha/apply/projects/models/vendor.py
index e93f80360..1d2e3375c 100644
--- a/hypha/apply/projects/models/vendor.py
+++ b/hypha/apply/projects/models/vendor.py
@@ -84,7 +84,7 @@ class DueDiligenceDocument(models.Model):
     )
 
     def __str__(self):
-        return self.vendor.full_name + ' -> ' + self.document.name
+        return self.vendor.name + ' -> ' + self.document.name
 
 
 @register_setting
@@ -154,7 +154,7 @@ class VendorFormSettings(BaseSetting):
         'help_text',
         default='Depending on your country, this might be called the account number, IBAN, or BBAN number.'
     )
-    account_currency = models.TextField(
+    account_currency_label = models.TextField(
         'label',
         default='Bank Account Currency'
     )
@@ -239,12 +239,12 @@ class VendorFormSettings(BaseSetting):
 
     panels = [
         MultiFieldPanel([
-            FieldPanel('full_name_label'),
-            FieldPanel('full_name_help_text'),
+            FieldPanel('name_label'),
+            FieldPanel('name_help_text'),
         ], 'Name'),
         MultiFieldPanel([
-            FieldPanel('full_name_label'),
-            FieldPanel('full_name_help_text'),
+            FieldPanel('contractor_name_label'),
+            FieldPanel('contractor_name_help_text'),
         ], 'Contractor Name'),
         MultiFieldPanel([
             FieldPanel('type_label'),
diff --git a/hypha/apply/projects/templates/application_projects/vendor_form.html b/hypha/apply/projects/templates/application_projects/vendor_form.html
index 42913439f..fc44c29f1 100644
--- a/hypha/apply/projects/templates/application_projects/vendor_form.html
+++ b/hypha/apply/projects/templates/application_projects/vendor_form.html
@@ -1,11 +1,11 @@
 {% extends "base-apply.html" %}
 {% load static %}
 
-{% block title %}{% if object %}Edit{% else %}Create{% endif %} Payment Request: {% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %}
+{% block title %}{% if object %}Edit{% else %}Setup{% endif %} Contractor{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %}
 {% block content %}
 <div class="admin-bar">
     <div class="admin-bar__inner">
-        <h2 class="heading heading--no-margin">{% if object %}Editing{% else %}Create{% endif %} Payment Request</h2>
+        <h2 class="heading heading--no-margin">{% if object %}Editing{% else %}Setup{% endif %} Contractor Information</h2>
         <h5 class="heading heading--no-margin">{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}</h5>
     </div>
 </div>
@@ -18,7 +18,6 @@
             {{ wizard.management_form }}
             {% csrf_token %}
             {{ form.media }}
-
             {% for field in form %}
                 {% if field.field %}
                     {% include "forms/includes/field.html" %}
@@ -26,7 +25,7 @@
                     {{ field }}
                 {% endif %}
             {% endfor %}
-            <button class="button button--submit button--top-space button--primary" type="submit" name="save">Save</button>
+            <button class="button button--submit button--top-space button--primary" type="submit" name="save">{% if wizard.steps.step1 == 6 %}Submit{% else %}Save and continue{% endif %}</button>
         </form>
     </div>
 </div>
diff --git a/hypha/apply/projects/templates/application_projects/vendor_success.html b/hypha/apply/projects/templates/application_projects/vendor_success.html
index b080f97e8..eaa9d124a 100644
--- a/hypha/apply/projects/templates/application_projects/vendor_success.html
+++ b/hypha/apply/projects/templates/application_projects/vendor_success.html
@@ -1,12 +1,11 @@
 {% extends "base-apply.html" %}
 {% load static %}
 
-{% block title %}{% if object %}Edit{% else %}Create{% endif %} Payment Request: {% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %}
+{% block title %}Contractor Setup Completed{% endblock %}
 {% block content %}
 <div class="admin-bar">
     <div class="admin-bar__inner">
         <h2 class="heading heading--no-margin">Contractor Setup Completed</h2>
-        <!-- <h5 class="heading heading--no-margin">{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}</h5> -->
     </div>
 </div>
 <div class="wrapper wrapper--small">
diff --git a/hypha/apply/projects/urls.py b/hypha/apply/projects/urls.py
index e23499768..8d7775569 100644
--- a/hypha/apply/projects/urls.py
+++ b/hypha/apply/projects/urls.py
@@ -22,7 +22,6 @@ from .views import (
     ReportSkipView,
     ReportUpdateView,
     CreateVendorView,
-    VendorFormSuccess,
 )
 
 app_name = 'projects'
@@ -39,7 +38,6 @@ urlpatterns = [
         path('simplified/', ProjectDetailSimplifiedView.as_view(), name='simplified'),
         path('request/', CreatePaymentRequestView.as_view(), name='request'),
         path('vendor/', CreateVendorView.as_view(), name='vendor'),
-        path('vendor/success/', VendorFormSuccess.as_view(), name='vendor-success'),
     ])),
     path('payment-requests/', include(([
         path('', PaymentRequestListView.as_view(), name='all'),
diff --git a/hypha/apply/projects/views/__init__.py b/hypha/apply/projects/views/__init__.py
index 1d920db3d..fecd26b3b 100644
--- a/hypha/apply/projects/views/__init__.py
+++ b/hypha/apply/projects/views/__init__.py
@@ -43,7 +43,6 @@ from .report import (
 )
 from .vendor import (
     CreateVendorView,
-    VendorFormSuccess,
 )
 
 __all__ = [
@@ -85,5 +84,4 @@ __all__ = [
     'ReportFrequencyUpdate',
     'ReportListView',
     'CreateVendorView',
-    'VendorFormSuccess',
 ]
diff --git a/hypha/apply/projects/views/vendor.py b/hypha/apply/projects/views/vendor.py
index 8ed4ecacb..91a396c73 100644
--- a/hypha/apply/projects/views/vendor.py
+++ b/hypha/apply/projects/views/vendor.py
@@ -1,8 +1,4 @@
-from hypha.apply.projects.models.vendor import BankInformation
-from django.views.generic import CreateView, TemplateView
-from django.shortcuts import redirect
-from django.urls import reverse
-from django.shortcuts import get_object_or_404
+from django.shortcuts import get_object_or_404, render
 
 from wagtail.core.models import Site
 from formtools.wizard.views import SessionWizardView
@@ -19,51 +15,69 @@ from ..forms import (
 )
 
 
+def show_extra_info_form(wizard):
+    # try to get the cleaned data of step where we ask if extra info is needed
+    cleaned_data = wizard.get_cleaned_data_for_step('extra') or {}
+    # check if the field ``extra_info`` box was checked.
+    return cleaned_data.get('need_extra_info', True)
+
+
 class CreateVendorView(SessionWizardView):
     model = Vendor
     file_storage = PrivateStorage()
     form_list = [
-        CreateVendorFormStep1,
-        CreateVendorFormStep2,
-        CreateVendorFormStep3,
-        CreateVendorFormStep4,
-        CreateVendorFormStep5,
-        CreateVendorFormStep6,
+        ('basic', CreateVendorFormStep1),
+        ('taxes', CreateVendorFormStep2),
+        ('documents', CreateVendorFormStep3),
+        ('bank', CreateVendorFormStep4),
+        ('extra', CreateVendorFormStep5),
+        ('other', CreateVendorFormStep6),
     ]
+    condition_dict = {'other': show_extra_info_form}
     template_name = 'application_projects/vendor_form.html'
 
     def done(self, form_list, **kwargs):
         project = get_object_or_404(Project, pk=self.kwargs['pk'])
         cleaned_data = self.get_all_cleaned_data()
         vendor = project.vendor
-        intermediary_bank_information = BankInformation.objects.create(
-            account_routing_number=cleaned_data['ib_account_routing_number'],
-            account_number=cleaned_data['ib_account_number'],
-            account_currency=cleaned_data['ib_account_currency'],
-            branch_address=cleaned_data['ib_branch_address']
+        vendor, _ = Vendor.objects.get_or_create(
+            user=project.user
         )
+        need_extra_info = cleaned_data['need_extra_info']
         bank_information = BankInformation.objects.create(
             account_holder_name=cleaned_data['account_holder_name'],
             account_routing_number=cleaned_data['account_routing_number'],
             account_number=cleaned_data['account_number'],
             account_currency=cleaned_data['account_currency'],
-            need_extra_info=cleaned_data['need_extra_info'],
-            branch_address=cleaned_data['branch_address'],
-            iba_info=intermediary_bank_information
+            need_extra_info=need_extra_info,
         )
+        if need_extra_info:
+            intermediary_bank_information = BankInformation.objects.create(
+                account_routing_number=cleaned_data['ib_account_routing_number'],
+                account_number=cleaned_data['ib_account_number'],
+                account_currency=cleaned_data['ib_account_currency'],
+                # branch_address=cleaned_data['ib_branch_address']
+            )
+            bank_information.branch_address = cleaned_data['branch_address']
+            bank_information.iba_info = intermediary_bank_information
+            bank_information.save()
+
         vendor.bank_info = bank_information
         vendor.full_name = cleaned_data['name']
         vendor.contractor_name = cleaned_data['contractor_name']
         vendor.type = cleaned_data['type']
         vendor.required_to_pay_taxes = cleaned_data['required_to_pay_taxes']
         vendor.save()
-        return redirect(reverse('/vendor/success/', args=[project.id]))
+        for f in cleaned_data["due_diligence_documents"]:
+            try:
+                DueDiligenceDocument.objects.create(vendor=vendor, document=f)
+            finally:
+                f.close()
+        form = self.get_form(step='documents')
+        form.delete_temporary_files()
+        return render(self.request, 'application_projects/vendor_success.html')
 
     def get_form_kwargs(self, step):
         kwargs = super(CreateVendorView, self).get_form_kwargs(step)
         kwargs['site'] = Site.find_for_request(self.request)
         return kwargs
-
-
-class VendorFormSuccess(TemplateView):
-    template_name = "application_projects/vendor_success.html"
diff --git a/hypha/static_src/src/javascript/apply/file-uploads.js b/hypha/static_src/src/javascript/apply/file-uploads.js
index 0f2257198..5e3826a16 100644
--- a/hypha/static_src/src/javascript/apply/file-uploads.js
+++ b/hypha/static_src/src/javascript/apply/file-uploads.js
@@ -9,6 +9,10 @@ jQuery(function ($) {
             init(form);
             form.initUploadFieldsDone = true;
         }
+        if (!form.initUploadFieldsDone && form.querySelector('[name=create_vendor_view-current_step]')) {
+            initWizard(form);
+            form.initUploadFieldsDone = true;
+        }
     });
 
     function init(form) {
@@ -18,4 +22,18 @@ jQuery(function ($) {
         $('input[type=hidden]').closest('.form__group').hide();
     }
 
+    // Initilise multi-step wizard forms
+    function initWizard(form) {
+        const step = form.querySelector('[name=create_vendor_view-current_step]').value
+        if (step === "documents"){
+            window.initUploadFields(
+                form,
+                {
+                    prefix: 'documents'
+                }
+            );
+            // Hide wrapper elements for hidden inputs added by django-file-form
+            $('input[type=hidden]').closest('.form__group').hide();
+        }
+    }
 });
-- 
GitLab