From a59c597452179d778377f30b2606932c75e82bd8 Mon Sep 17 00:00:00 2001 From: sks444 <krishnasingh.ss30@gmail.com> Date: Mon, 31 May 2021 15:38:28 +0530 Subject: [PATCH] Add vendor --- hypha/apply/projects/models/__init__.py | 3 + hypha/apply/projects/models/vendor.py | 81 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 hypha/apply/projects/models/vendor.py diff --git a/hypha/apply/projects/models/__init__.py b/hypha/apply/projects/models/__init__.py index dc9e75f77..b100248d2 100644 --- a/hypha/apply/projects/models/__init__.py +++ b/hypha/apply/projects/models/__init__.py @@ -9,6 +9,7 @@ from .project import ( ProjectSettings, ) from .report import Report, ReportConfig, ReportPrivateFiles, ReportVersion +from .vendor import Vendor, BankInformation __all__ = [ 'Project', @@ -25,4 +26,6 @@ __all__ = [ 'ReportVersion', 'ReportPrivateFiles', 'ReportConfig', + 'Vendor', + 'BankInformation', ] diff --git a/hypha/apply/projects/models/vendor.py b/hypha/apply/projects/models/vendor.py new file mode 100644 index 000000000..45828e1d7 --- /dev/null +++ b/hypha/apply/projects/models/vendor.py @@ -0,0 +1,81 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ +from babel.numbers import list_currencies, get_currency_name + +from hypha.apply.utils.storage import PrivateStorage +from hypha.apply.users.models import User + + +def due_diligence_documents(instance, filename): + return f'vendor/{instance.vendor_id}/due_diligence_documents/{filename}' + + +class BankInformation(models.Model): + CURRENCY_CHOICES = [ + (currency, f'{get_currency_name(currency)} - {currency}') + for currency in list_currencies() + ] + + account_holder_name = models.CharField(max_length=150) + account_routing_number = models.CharField(max_length=10) + account_number = models.CharField(max_length=20) + account_currency = models.CharField( + choices=CURRENCY_CHOICES, + max_length=10 + ) + need_extra_info = models.BooleanField(default=False) + branch_address = models.TextField(_('Address'), blank=True) + iba_info = models.OneToOneField( + 'self', + null=True, blank=True, + on_delete=models.SET_NULL, + related_name='bank_info', + verbose_name='Intermediary Bank Account Information' + ) + nid_type = models.CharField( + max_length=25, + verbose_name='National Identity Document Type', + blank=True + ) + nid_number = models.CharField( + max_length=20, + blank=True + ) + + def __str__(self): + return self.account_holder_name + + +class Vendor(User): + + TYPE_CHOICES = [ + ('organization', 'Organization'), + ('personal', 'Personal'), + ] + + contractor_name = models.CharField(max_length=150, blank=True) + address = models.TextField(_('Address'), blank=True) + type = models.CharField(max_length=15, choices=TYPE_CHOICES, blank=True) + required_to_pay_taxes = models.BooleanField(default=False) + bank_info = models.OneToOneField( + BankInformation, + on_delete=models.SET_NULL, + null=True, blank=True, + ) + other_info = models.TextField(blank=True) + + def __str__(self): + return self.full_name + + +class DueDiligenceDocument(models.Model): + document = models.FileField( + upload_to=due_diligence_documents, storage=PrivateStorage() + ) + vendor = models.ForeignKey( + Vendor, + on_delete=models.CASCADE + ) + + def __str__(self): + return self.vendor.full_name + ' -> ' + self.document.name -- GitLab