from django.db import models
from django.utils import timezone
from organisations.models import Organisation
from django.conf import settings
from customers.models import *
from ledgers.models import OrganisationSubAccount, SystemTransactions
from savings.models import SavingAccount
from users.models import Staff
from django.contrib.auth import get_user_model
from organisations.models import Organisation


User = get_user_model()

class LoanProduct(models.Model):
    INT_METHOD = (('flat', 'Flat'),
        ('declining', 'Declining Balance'),
        ('amortization', 'Amortization'),
        )
    GRACE_PERIOD_TYPE = (('pay_i', 'Pay Only Interest'),
        ('pay_p', 'Pay Only Principal'),
        ('pay_none', 'Pay None'),
        )
    ARREARS_PERIOD = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    PENALTY_TYPE = (('both', 'Both'),
        ('principal', 'Principal in arrears'),
        ('interest', 'Interest in arrears'),
        )
    PENALTY_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    LOAN_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    product_name =  models.CharField(max_length=555)
    int_rate =  models.FloatField(default=0.0)
    int_method =  models.CharField(max_length=50, choices=INT_METHOD)
    grace_period =  models.IntegerField(default=0)
    grace_period_type = models.CharField(max_length=50, choices=GRACE_PERIOD_TYPE)
    arrears_period = models.IntegerField(default=0)
    arrears_period_type = models.CharField(max_length=10, choices=ARREARS_PERIOD)
    penalty_type = models.CharField(max_length=10, choices=PENALTY_TYPE)
    penalty_period_type = models.CharField(max_length=10, choices=PENALTY_PERIOD_TYPE)
    loan_period =  models.IntegerField(default=0)
    write_off_period =  models.IntegerField(default=0)
    write_off_period_type = models.CharField(max_length=10, choices=PENALTY_PERIOD_TYPE)
    max_loan_amt =  models.BigIntegerField(default=0)
    based_on = models.CharField(max_length=50)
    period_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    frequency_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    frequency =  models.IntegerField(default=0)
    auto_payments =  models.BooleanField(default=False)
    auto_clear_off =  models.BooleanField(default=False)
    auto_pay_penalty =  models.BooleanField(default=False)
    penalty_rate =  models.FloatField(default=0.0)
    penalty_grace_period = models.IntegerField(default=0)
    penalty_grace_period_type = models.CharField(max_length=10, choices=PENALTY_PERIOD_TYPE, default='d')
    organisation =  models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='organisation_loan_product')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    loan_product_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_product_added_by')
    chart =  models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='loan_product_chart')
    write_off_chart =  models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='write_off_chart',blank=True,
    null=True)
    is_deleted =  models.BooleanField(default=False)
    interest_accrued_account = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='interest_accrued_account', null=True, blank=True)
    penalty_accrued_account = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='penalty_accrued_account', null=True, blank=True)
    interest_receivable_account = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='interest_receivable_account', null=True, blank=True)
    penalty_receivable_account = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='penalty_receivable_account', null=True, blank=True)
    expenses_from_interest_account = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='expenses_from_interest_account', null=True, blank=True)
    expenses_from_penality_account = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='expenses_from_penality_account', null=True, blank=True)
    interest_income_chart = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='interest_income_chart', null=True, blank=True)
    penalty_income_chart = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='penalty_income_chart', null=True, blank=True)
    interest_installment_waive_off = models.IntegerField(default=0)

    class Meta:
        db_table = 'public\".\"loan_products'
    
    def __str__(self):
        return self.product_name

class LoanProductCharges(models.Model):
    APPLY_TYPE = (('percent', "Percentage"),
        ('flat', 'Flat'),
        )
    LIMIT_TYPE = (('below', "Below"),
        ('range', 'Range'),
        ('above', 'Above'),
        )
    name =  models.CharField(max_length=555)
    apply_type = models.CharField(max_length=100, choices=APPLY_TYPE)
    amount =  models.FloatField(default=0.0)
    below_limit_amount =  models.FloatField(default=0.0)
    above_limit_amount =  models.FloatField(default=0.0)
    range_min_amount =  models.FloatField(default=0.0)
    range_max_amount =  models.FloatField(default=0.0)
    limit_type = models.CharField(max_length=50, choices=LIMIT_TYPE, default='above')
    max_charge_cap = models.FloatField(null=True, blank=True)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    loan_product =  models.ForeignKey(LoanProduct, on_delete=models.CASCADE, related_name='loan_product_charges')
    loan_charge_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_charge_added_by')
    chart =  models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='loan_product_charge_chart')
    is_deleted =  models.BooleanField(default=False)

    class Meta:
        db_table = 'public\".\"loan_product_charge'

class LoanSectors(models.Model):
    name = models.CharField(max_length=1555)
    loan_sector_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_sector_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    organisation =  models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='organisation_loan_sector')
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_1')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_sectors'

class LoanSubSectors(models.Model):
    name = models.CharField(max_length=1555)
    loan_sector = models.ForeignKey(LoanSectors, on_delete=models.CASCADE, related_name='loan_sub_sectors')
    loan_sub_sector_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_sub_sector_added_by')
    date_added = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_loan_sub_sectors')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_sub_sectors'

class LoanApplication(models.Model):
    STATUS = (('pending', "Pending"),
        ('disbursed', 'Disbursed'),
        ('cleared_off', 'Cleared Off'),
        ('written_off', 'Written Off'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
        )
    INT_METHOD = (('flat', 'Flat'),
        ('declining', 'Declining Balance'),
        ('amortization', 'Amortization'),
        )
        
    LOAN_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    
    GRACE_PERIOD_TYPE = (('pay_i', 'Pay Only Interest'),
        ('pay_p', 'Pay Only Principal'),
        ('pay_none', 'Pay None'),
        )

    LOAN_TYPE = (('standard', 'Standard'),
        ('external', 'External (Finwise)'),
        )
    loan_type = models.CharField(
        max_length=20,
        choices=LOAN_TYPE,
        default='standard'
    )
    loan_amount =  models.FloatField(default=0.0)
    loan_application_product =  models.ForeignKey(LoanProduct, on_delete=models.CASCADE, related_name='loan_application_product')
    loan_app_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_app_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    loan_officer = models.ForeignKey(Staff, on_delete=models.CASCADE, related_name='loan_officer')
    reason = models.CharField(max_length=1555, null=True, blank=True)
    app_grace_period = models.IntegerField(default=0)
    grace_period_type = models.CharField(max_length=50, choices=GRACE_PERIOD_TYPE, default='pay_none')
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='loan_customer')
    organisation_branch =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='loan_app_organisation_branch')
    loan_date = models.DateTimeField(default = timezone.now)
    status = models.CharField(max_length=100, choices=STATUS)
    int_rate =  models.FloatField(default=0.0)
    int_method =  models.CharField(max_length=50, choices=INT_METHOD)
    cancel_clear_off_reason = models.CharField(max_length=1555, null=True, blank=True)
    is_deleted =  models.BooleanField(default=False)
    reason_for_delete = models.CharField(max_length=1555, null=True, blank=True)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_loan_applications')
    deleted_at = models.DateTimeField(null=True, blank=True)
    auto_payments =  models.BooleanField(default=False)
    auto_pay_penalty =  models.BooleanField(default=False)
    auto_payments_saving_account = models.ForeignKey(SavingAccount, on_delete=models.CASCADE, related_name='auto_payments_saving_account', null=True, blank=True)
    loan_sector = models.ForeignKey(LoanSectors, on_delete=models.CASCADE, related_name='loan_sector', null=True, blank=True)
    loan_sub_sector = models.ForeignKey('LoanSubSectors', on_delete=models.SET_NULL, related_name='loan_sub_sector', null=True, blank=True)
    loan_period =  models.IntegerField(default=0)
    period_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    clear_off_date = models.DateTimeField(null=True, blank=True)
    loan_group =  models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='loan_group', null=True, blank=True)
    loan_number = models.CharField(max_length=200, null=True, blank=True)
    value_chain = models.ForeignKey(
        "GreenFinanceValueChain",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='green_finance_value_chain'
    )
    value_chain_node = models.ForeignKey(
        "GreenFinanceValueChainNode",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='green_finance_value_chain_node'
    )

    class Meta:
        db_table = 'public\".\"loan_applications'

class LoanMigrationHistory(models.Model):
    loan =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_application_history')
    loan_number = models.CharField(max_length=200, default=0)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)

    class Meta:
        db_table = 'public\".\"loan_migration_history'

class LoanApplicationSecurity(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_application_security')
    description = models.CharField(max_length=555)
    value =  models.FloatField(default=0.0)
    buying_date = models.DateTimeField(null=True, blank=True)
    depreciation_rate =  models.FloatField(default=0.0)
    pledge_file = models.CharField(null=True, blank=True, max_length=11555)
    loan_app_sec_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_app_security_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_2')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_application_security'

class LoanGuarantors(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_application_guarantors')
    guarantor_customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='loan_customer_guarantor')
    contract_file = models.CharField(null=True, blank=True, max_length=11555)
    loan_guarantor_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_guarantor_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_3')
    deleted_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        unique_together = ('loan_application', 'guarantor_customer',)
        db_table = 'public\".\"loan_guarantors'

class LoanGuarantorsSecurity(models.Model):
    loan_guarantor =  models.ForeignKey(LoanGuarantors, on_delete=models.CASCADE, related_name='loan_app_guarantor')
    descr = models.CharField(max_length=555)
    value =  models.FloatField(default=0.0)
    buying_date = models.DateTimeField(null=True, blank=True)
    depreciation_rate =  models.FloatField(default=0.0)
    pledge_file = models.CharField(null=True, blank=True, max_length=11555)
    loan_guarantor_security_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_guarantor_security_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_loan_guarantors_security')
    deleted_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        db_table = 'public\".\"loan_guarantors_security'

class LoanIncomeSource(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_income_source')
    source_name = models.CharField(max_length=555)
    estimated_value =  models.FloatField(default=0.0)
    description = models.CharField(max_length=555)
    loan_income_source_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_income_source_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_4')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_income_source'

class LoanApplicationWithHold(models.Model):
    STATUS = (('held', "Held"),
        ('released', 'Released'),
        )
    HOLD_TYPE = (('savings', "Savings"),
        ('shares', 'Shares'),
        )
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_app_withhold')
    hold_type = models.CharField(max_length=100, choices=HOLD_TYPE)
    account = models.ForeignKey(SavingAccount, on_delete=models.CASCADE,related_name='loan_app_withhold_account', null=True, blank=True)
    amount =  models.FloatField(default=0.0)
    loan_withhold_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_withhold_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    status = models.CharField(max_length=100, default="held", choices=STATUS)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_5')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        unique_together = ('loan_application', 'hold_type',)
        db_table = 'public\".\"loan_application_withhold'

class LoanApplicationApproval(models.Model):
    LOAN_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    GRACE_PERIOD_TYPE = (('pay_i', 'Pay Only Interest'),
        ('pay_p', 'Pay Only Principal'),
        ('pay_none', 'Pay None'),
        )
    loan_application = models.OneToOneField(LoanApplication, on_delete=models.CASCADE, related_name='loan_application_approval')
    int_rate = models.FloatField(default=0.0)
    loan_amount = models.FloatField(default=0.0)
    loan_approval_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_approval_added_by')
    loan_period = models.IntegerField(default=0)
    period_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    frequency_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    frequency =  models.IntegerField(default=0)
    automatic_savings_pay = models.BooleanField(default=False)
    reason = models.CharField(max_length=1555, null=True, blank=True)
    app_grace_period = models.IntegerField(default=0)
    grace_period_type = models.CharField(max_length=50, choices=GRACE_PERIOD_TYPE, default='pay_none')
    approval_date = models.DateTimeField(default = timezone.now)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_6')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_application_approval'

class LoanApplicationDisbursement(models.Model):
    LOAN_DISBURSE_METHOD = (('bank', 'Bank'),
        ('cash', 'Cash'),
        ('credit', 'Credit'),
        )
    ARREARS_PERIOD = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    PENALTY_TYPE = (('both', 'Both'),
        ('principal', 'Principal in arrears'),
        ('interest', 'Interest in arrears'),
        )
    PENALTY_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    WRITE_OFF_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    loan_application = models.OneToOneField(LoanApplication, on_delete=models.CASCADE, related_name='loan_application_disbursement')
    loan_amount = models.FloatField(default=0.0)
    loan_disburse_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_disburse_added_by')
    disburse_method = models.CharField(max_length=10, choices=LOAN_DISBURSE_METHOD)
    ref_no = models.CharField(max_length=1555, null=True, blank=True)
    voucher_no =  models.CharField(max_length=1555, null=True, blank=True)
    total_interest_expected = models.FloatField(default=0.0)
    total_principal_expected = models.FloatField(default=0.0)
    total_expected = models.FloatField(default=0.0)
    loan_start_date = models.DateTimeField(default = timezone.now)
    loan_disbursement_date = models.DateTimeField(default = timezone.now)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    heading = models.CharField(max_length=1555, null=True, blank=True)
    arrear_grace_period    = models.IntegerField(default=0)
    write_off_grace_period = models.IntegerField(default=0)
    system_transaction  = models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='main_system_transaction')
    arrears_period_type = models.CharField(max_length=10, choices=ARREARS_PERIOD, null=True, blank=True)
    penalty_type = models.CharField(max_length=10, choices=PENALTY_TYPE, null=True, blank=True)
    penalty_period_type = models.CharField(max_length=10, choices=PENALTY_PERIOD_TYPE, null=True, blank=True)
    penalty_rate =  models.FloatField(default=0.0)
    penalty_grace_period = models.IntegerField(default=0)
    penalty_grace_period_type = models.CharField(max_length=10, choices=PENALTY_PERIOD_TYPE, null=True, blank=True)
    write_off_period_type = models.CharField(max_length=10, choices=WRITE_OFF_PERIOD_TYPE, null=True, blank=True)
    disbursement_account_id    = models.IntegerField(null=True, blank=True)
    comment = models.CharField(max_length=1555, null=True, blank=True)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_7')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_application_disbursement'

class OrganisationClientNonMembers(models.Model):
    client_name = models.CharField(max_length=155)
    organisation_branch =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='organisation_branch_client_non_member')
    customer =  models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='linked_customer', null=True, blank=True)
    phone = models.CharField(max_length=155)
    identity_no = models.CharField(max_length=155, null=True, blank=True)
    physical_address = models.CharField(max_length=1555)
    nationality = models.CharField(max_length=155)
    dob = models.DateTimeField(null=True, blank=True)
    gender =  models.CharField(max_length=15)
    occupation = models.CharField(max_length=155, null=True, blank=True)
    identity_type = models.CharField(max_length=15, null=True, blank=True)
    cust_sign = models.CharField(max_length=11555, null=True, blank=True)
    image = models.CharField(max_length=11555, null=True, blank=True)
    organisation_non_member_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='organisation_non_member_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    
    class Meta:
        db_table = 'public\".\"organisation_client_non_members'

class NonMemberLoanGuarantors(models.Model):
    STATUS = (('active', "active"),
        ('released', 'released'),
        )
    organisation_client_non_member =  models.ForeignKey(OrganisationClientNonMembers, on_delete=models.CASCADE, related_name='organ_client_non_member')
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_application_non_client_member')
    status = models.CharField(max_length=100, choices=STATUS)
    organ_non_member_guarantor_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='organ_non_member_guarantor_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_non_member_loan_guarantors')
    deleted_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        db_table = 'public\".\"non_member_loan_guarantors'

class LoanRepaymentSchedule(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_application')
    principal_expected =  models.FloatField(default=0.0)
    interest_expected =  models.FloatField(default=0.0)
    total_payment =  models.FloatField(default=0.0)
    expected_date = models.DateTimeField( null=True, blank=True)
    ending_balance =  models.FloatField(default=0.0)
    starting_balance =  models.FloatField(default=0.0)
    payment_number = models.IntegerField(default=0)
    ref_no = models.CharField(max_length=555, null=True, blank=True)
    loan_schedule_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_schedule_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    status = models.CharField(max_length=50, default='active') # rescheduled
    reschedule_id = models.IntegerField(default=0)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_8')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        unique_together = ('loan_application', 'payment_number', 'status')
        db_table = 'public\".\"loan_repayments_schedule'

class LoanMainTransactions(models.Model):
    TRANSACTION_TYPES = (('LoanDisbursement', 'Loan Disbursement'),
        ('LoanPayment', 'Loan Payment'),
        ('InterestPayment', 'Interest Payment'),
        ('PenaltyPayment', 'Penalty Payment'),
        ('LoanPrincipalPayment', 'Loan Principal Payment'),
        ('LoanWriteOff', 'Loan Write Off'),
        ('LoanPenaltyWaivered', 'Loan Penalty Waivered'),
        ('LoanInterestWaivered', 'Loan Interest Waivered'),
        ('LoanCustomCharge', 'Loan custom charge'),
        ('LoanRecovery', 'Loan Recovered')
    )
    TRANSACTION_STATUS = (('normal', 'Normal'),
        ('reversed', 'Reversed')
    )
    heading = models.CharField(max_length=1555)
    amount = models.FloatField(default=0.0)
    payment_method = models.CharField(max_length=100)
    cheque = models.CharField(max_length=555, null=True, blank=True)
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='main_trans_loan_application')
    ref_no = models.CharField(max_length=555, null=True, blank=True)
    voucher_no = models.CharField(max_length=555, null=True, blank=True)
    transaction_type = models.CharField(max_length=50, choices=TRANSACTION_TYPES, default='LoanPayment')
    loan_main_transaction_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_main_transaction_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    payment_date = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    system_transaction  = models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='main_loan_transaction',null=True)
    transaction_status = models.CharField(max_length=50, choices=TRANSACTION_STATUS, default='normal')
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_9')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_main_transactions'

class LoanPaymentTransaction(models.Model):
    TRANSACTION_STATUS = (('normal', 'Normal'),
        ('reversed', 'Reversed')
    )
    amount = models.FloatField(default=0.0)
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='payment_trans_loan_application')
    loan_payment_transaction_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_payment_transaction_added_by', null=True, blank=True)
    date_added = models.DateTimeField(default = timezone.now)
    payment_date = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    transaction_type = models.CharField(max_length=55, default='manual')
    transaction_status = models.CharField(max_length=50, choices=TRANSACTION_STATUS, default='normal')
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_10')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_paymet_transaction'

class LoanPayments(models.Model):
    TRANSACTION_STATUS = (('normal', 'Normal'),
        ('reversed', 'Reversed')
    )
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='payments_loan_application')
    loan_repayment_schedule =  models.ForeignKey(LoanRepaymentSchedule, on_delete=models.CASCADE, related_name='payments_loan_repayment_schedule', null=True, blank=True)
    loan_payments_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_payments_added_by', null=True, blank=True)
    loan_main_transaction =  models.ForeignKey(LoanMainTransactions, on_delete=models.CASCADE, related_name='payment_main_transaction')
    int_paid = models.FloatField(default=0.0)
    princ_paid = models.FloatField(default=0.0)
    penalty_paid = models.FloatField(default=0.0)
    payment_date = models.DateTimeField(default = timezone.now)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    loan_payment_transaction =  models.ForeignKey(LoanPaymentTransaction, on_delete=models.CASCADE, related_name='loan_all_payment_transaction', null=True, blank=True)
    payment_status = models.CharField(max_length=50, choices=TRANSACTION_STATUS, default='normal')
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_11')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_payments'

class LoanPenalty(models.Model):
    comment = models.CharField(max_length=1555, null=True, blank=True)
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='penalty_loan_application')
    ref_no = models.CharField(max_length=555, null=True, blank=True)
    voucher_no = models.CharField(max_length=555, null=True, blank=True)
    loan_penality_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_penality_added_by', null=True, blank=True)
    loan_repayment_schedule =  models.ForeignKey(LoanRepaymentSchedule, on_delete=models.CASCADE, related_name='loan_repayment_schedule_penalty')
    amount = models.FloatField(default=0.0)
    status = models.CharField(max_length=50, default='auto') #or manual
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    date_from = models.DateTimeField(null=True, blank=True)
    date_to = models.DateTimeField(null=True, blank=True)
    principal_arrears = models.FloatField(default=0.0)
    interest_arrears = models.FloatField(default=0.0)
    penalty_rate = models.FloatField(default=0.0)
    penalty_period_type = models.CharField(max_length=10, null=True, blank=True)
    expected_pay_date = models.DateTimeField(null=True, blank=True)
    arrear_days = models.IntegerField(default=0)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_12')
    deleted_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        db_table = 'public\".\"loan_penalty'

class GreenFinanceValueChainNode(models.Model):
    NODE_CHOICES = [
        ('production', 'Production'),
        ('processing', 'Processing'),
        ('marketing', 'Marketing'),
    ]
    
    value_chain_node = models.CharField(max_length=50, choices=NODE_CHOICES)
    description = models.TextField(blank=True, null=True)
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = 'green_finance_value_chain_nodes'
        ordering = ['value_chain_node']

    def __str__(self):
        return self.get_value_chain_node_display()


class GreenFinanceValueChain(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='created_value_chains')
    updated_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='updated_value_chains')
    organisation = models.ForeignKey(
        Organisation,
        on_delete=models.CASCADE,
        related_name='value_chains'
    )

    # LINK to the three fixed nodes
    nodes = models.ManyToManyField(GreenFinanceValueChainNode, related_name='value_chains')

    class Meta:
        db_table = 'green_finance_value_chains'
        ordering = ['name']
        unique_together = ['name', 'organisation']

    def __str__(self):
        return f"{self.name} ({self.organisation.name})"

class LoanPenaltyWaivered(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_penalty_waivered_loan_application')
    loan_penalty_waivered_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_penalty_waivered_added_by')
    loan_main_transaction   =  models.ForeignKey(LoanMainTransactions, on_delete=models.CASCADE, related_name='loan_penalty_waivered_main_transaction',null=True, blank=True)
    loan_repayment_schedule =  models.ForeignKey(LoanRepaymentSchedule, on_delete=models.CASCADE, related_name='repayment_schedule_penalty_waiver')
    amount = models.FloatField(default=0.0)
    comment = models.CharField(max_length=1555, null=True, blank=True)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_13')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:   
        db_table = 'public\".\"loan_penalty_waivered'

class LoanInterestWaivered(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_interest_waivered_loan_application')
    loan_interest_waivered_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_interest_waivered_added_by')
    loan_main_transaction =  models.ForeignKey(LoanMainTransactions, on_delete=models.CASCADE, related_name='loan_interest_waivered_main_transaction',null=True, blank=True)
    loan_repayment_schedule =  models.ForeignKey(LoanRepaymentSchedule, on_delete=models.CASCADE, related_name='repayment_schedule_interest_waiver')
    amount = models.FloatField(default=0.0)
    comment = models.CharField(max_length=1555, null=True, blank=True)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_14')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_interest_waivered'

class LoanWrittenOff(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_writeoff_loan_application')
    loan_writeoff_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_writeoff_added_by')
    loan_system_transaction =  models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='loan_writeoff_system_transaction')
    loan_writeoff_ammount = models.FloatField(default=0.0)
    interest_at_write_off = models.FloatField(default=0.0)
    write_off_date = models.DateTimeField(default = timezone.now)
    description = models.CharField(max_length=1555, null=True, blank=True,default ='Failed to pay')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_15')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_written_off'

class LoanRecovery(models.Model):
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_recovery_loan_application')
    recovery_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_recovery_added_by')
    loan_main_transaction =  models.ForeignKey(LoanMainTransactions, on_delete=models.CASCADE, related_name='loan_recovery_main_transaction')
    recovered_ammount = models.FloatField(default=0.0)
    recovery_date = models.DateTimeField(default = timezone.now)
    income_account  =  models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='loan_recovery_account', null=True, blank=True)
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_16')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loan_recovery'
        
class LoanApplicationsView(models.Model):
    id = models.IntegerField(primary_key=True)
    loan_amount = models.FloatField(default=0.0)
    date_added =  models.DateTimeField()
    reason = models.CharField(max_length=1555)
    app_grace_period =  models.FloatField(default=0.0)
    loan_date =  models.DateTimeField()
    status = models.CharField(max_length=50)
    int_rate =  models.FloatField(default=0.0)
    int_method = models.CharField(max_length=50)
    customer_id = models.IntegerField()
    name = models.CharField(max_length=155)
    member_number =  models.CharField(max_length=155)
    old_member_number =  models.CharField(max_length=155)
    customer_status = models.CharField(max_length=50)
    loan_product_id = models.IntegerField()
    product_name =  models.CharField(max_length=155)
    customer_branch_id = models.IntegerField()
    customer_branch_name = models.CharField(max_length=155)
    loan_branch_name = models.CharField(max_length=155)
    loan_branch_id = models.IntegerField()
    is_deleted =  models.BooleanField(default=False)
    organisation_id = models.IntegerField()

    class Meta:
        managed = False
        db_table = "public\".\"loanapplicationsview"

class RescheduledLoans(models.Model):
    LOAN_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    INT_METHOD = (('flat', 'Flat'),
        ('declining', 'Declining Balance'),
        ('amortization', 'Amortization'),
        )
        
    GRACE_PERIOD_TYPE = (('pay_i', 'Pay Only Interest'),
        ('pay_p', 'Pay Only Principal'),
        ('pay_none', 'Pay None'),
        )

    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loans_rescheduled_application')
    loan_reschedule_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_reschedule_added_by')
    principal_amount = models.FloatField(default=0.0)
    interest_expected = models.FloatField(default=0.0)
    total_payment = models.FloatField(default=0.0)
    loan_period = models.IntegerField()
    period_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    frequency_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    frequency =  models.IntegerField(default=0)
    grace_period = models.IntegerField(default=0)
    grace_period_type = models.CharField(max_length=50, choices=GRACE_PERIOD_TYPE)
    int_rate =  models.FloatField(default=0.0)
    int_method =  models.CharField(max_length=50, choices=INT_METHOD)
    reschedule_date = models.DateTimeField(default = timezone.now)
    comment =  models.CharField(max_length=1555, null=True, blank=True )
    status = models.CharField(max_length=50, default='active') #or rescheduled
    organisation_branch =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='loan_reschedule_organisation_branch')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_loans_17')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"rescheduled_loans'

class LoanTopUp(models.Model):
    LOAN_DISBURSE_METHOD = (('bank', 'Bank'),
        ('cash', 'Cash'),
        ('credit', 'Credit'),
        )
    LOAN_PERIOD_TYPE = (('d', 'Days'),
        ('m', 'Months'),
        ('w', 'Weeks'),
        ('bw', 'Bi-Weeks'),
        ('q', 'Quarterly'),
        ('y', 'Years'),
        )
    GRACE_PERIOD_TYPE = (('pay_i', 'Pay Only Interest'),
        ('pay_p', 'Pay Only Principal'),
        ('pay_none', 'Pay None'),
        )
    loan_application =  models.ForeignKey(LoanApplication, on_delete=models.CASCADE, related_name='loan_application_topup')
    loan_topup_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='loan_topup_added_by')
    topup_amount = models.FloatField(default=0.0)
    organisation_branch =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='loan_topup_organisation_branch')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    disburse_method =  models.CharField(max_length=10, choices=LOAN_DISBURSE_METHOD)
    disbursement_account_id    = models.IntegerField(null=True, blank=True)
    auto_payment = models.BooleanField(default=False)
    loan_period = models.IntegerField(default=0)
    period_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    frequency = models.IntegerField(default=0)
    frequency_type = models.CharField(max_length=10, choices=LOAN_PERIOD_TYPE)
    int_rate =  models.FloatField(default=0.0)
    approval_disb_date = models.DateTimeField(default = timezone.now)
    grace_period =  models.IntegerField(default=0)
    grace_period_type = models.CharField(max_length=10, choices=GRACE_PERIOD_TYPE)
    comment = models.CharField(max_length=1555, null=True, blank=True)
    principal_bal =  models.FloatField(default=0.0)
    total_balance =  models.FloatField(default=0.0)
    interest_due = models.FloatField(default=0.0)
    penality =  models.FloatField(default=0.0)
    interest_waived = models.FloatField(default=0.0)
    send_sms = models.BooleanField(default=False)
    voucher_no = models.CharField(max_length=155, null=True, blank=True)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_loan_topups')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"loans_toppedup'

class LoanLossProvision(models.Model):
    from_value      =  models.IntegerField(null=False, blank=False)
    to_value        =  models.IntegerField(null=False, blank=False)
    percentage      =  models.IntegerField(null=False, blank=False)
    date_added      = models.DateTimeField(default = timezone.now)
    last_updated    = models.DateTimeField(default = timezone.now)
    added_by        = models.BigIntegerField(null=True, blank=True)
    last_updated_by = models.BigIntegerField(null=True, blank=True)
    organisation    =  models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='organisation_loan_loss_provision')
    
    class Meta:
        db_table = 'public\".\"loan_loss_provision'
    
    
class LoansView(models.Model):
    id = models.IntegerField(primary_key=True)
    customer_type_id = models.IntegerField()
    customer_type = models.CharField(max_length=155)
    organisation_id =  models.IntegerField()
    has_members = models.BooleanField(default=False)
    customer_type_date_added = models.DateTimeField()
    customer_id = models.IntegerField()
    name = models.CharField(max_length=255)
    member_number =  models.CharField(max_length=1555)
    old_member_number =  models.CharField(max_length=1555)
    customer_status = models.CharField(max_length=55)
    branch_id =  models.IntegerField()
    branch_name = models.CharField(max_length=155)
    branch_short_name =  models.CharField(max_length=55)
    loan_amount = models.FloatField(default=0.0)
    loan_date_added = models.DateTimeField()
    clear_off_date  = models.DateTimeField()
    reason = models.CharField(max_length=1555)
    status = models.CharField(max_length=55)
    int_rate = models.FloatField(default=0.0)
    loan_date = models.DateTimeField()
    app_grace_period = models.IntegerField()
    int_method = models.CharField(max_length=155)
    is_deleted = models.BooleanField(default=False)
    loan_product_id = models.IntegerField()
    product_name = models.CharField(max_length=155)
    product_int_rate = models.FloatField(default=0.0)
    product_int_method = models.CharField(max_length=155)
    loan_officer_id = models.IntegerField()
    loan_officer_full_name = models.CharField(max_length=255)
    gender = models.CharField(max_length=15)
    telephone = models.CharField(max_length=15)
    loan_sector_name = models.CharField(max_length=150)
    loan_sector_id = models.IntegerField()

    class Meta:
        managed = False
        db_table = "public\".\"loanview"

class LoansRepaymentView(models.Model):
    customer_type_id =  models.BigIntegerField()
    customer_type = models.CharField(max_length=155)
    organisation_id  = models.BigIntegerField()
    has_members = models.BooleanField(default=False)
    customer_type_date_added = models.DateTimeField()
    customer_id  = models.BigIntegerField()
    name = models.CharField(max_length=155)
    member_number = models.CharField(max_length=155)
    old_member_number = models.CharField(max_length=155)
    customer_status = models.CharField(max_length=155)
    branch_id  = models.BigIntegerField()
    branch_name = models.CharField(max_length=155)
    branch_short_name = models.CharField(max_length=155)
    id = models.BigIntegerField(primary_key=True)
    loan_amount = models.FloatField(default=0.0)
    loan_date_added = models.DateTimeField()
    reason = models.CharField(max_length=5000)
    status = models.CharField(max_length=155)
    int_rate = models.FloatField(default=0.0)
    loan_date = models.DateTimeField()
    app_grace_period  = models.BigIntegerField()
    int_method = models.CharField(max_length=155)
    is_deleted = models.BooleanField(default=False)
    loan_sector_id  = models.BigIntegerField()
    loan_product_id  = models.BigIntegerField()
    product_name = models.CharField(max_length=155)
    product_int_rate = models.FloatField(default=0.0)
    product_int_method = models.CharField(max_length=155)
    approval_amount = models.FloatField(default=0.0)
    approval_date = models.DateTimeField()
    disbursed_amount = models.FloatField(default=0.0)
    loan_start_date = models.DateTimeField()
    loan_disbursement_date = models.DateTimeField()
    total_interest_expected = models.FloatField(default=0.0)
    total_principal_expected = models.FloatField(default=0.0)
    total_expected = models.FloatField(default=0.0)
    arrear_grace_period  = models.BigIntegerField()
    write_off_grace_period  = models.BigIntegerField()
    arrears_period_type = models.CharField(max_length=155)
    write_off_period_type = models.CharField(max_length=155)
    write_off_days = models.BigIntegerField()
    loan_officer_id  = models.BigIntegerField()
    loan_officer_full_name = models.CharField(max_length=155)
    gender = models.CharField(max_length=155)
    telephone = models.CharField(max_length=155)
    princ_paid = models.FloatField(default=0.0)
    int_paid = models.FloatField(default=0.0)
    penalty_paid = models.FloatField(default=0.0)
    total_penalty = models.FloatField(default=0.0)
    penalty_waivered = models.FloatField(default=0.0)
    interest_waivered = models.FloatField(default=0.0)
    arrear_days  = models.BigIntegerField()
    written_off_date = models.DateTimeField()
    write_off_comment = models.TextField()
    loan_writen_off_ammount = models.FloatField(default=0.0)

    class Meta:
        managed = False
        db_table = "public\".\"loans_repayment_view"


# to be removed
class LoanInstallmentRepaymentview(models.Model):
    id =  models.BigIntegerField(primary_key=True)
    customer_type_id =  models.BigIntegerField()
    customer_type    = models.CharField(max_length=155)
    organisation_id  = models.IntegerField()
    has_members   = models.BooleanField(default=False)
    customer_type_date_added  = models.DateTimeField()
    customer_id =  models.BigIntegerField()
    name = models.CharField(max_length=155)
    member_number  = models.CharField(max_length=155)
    old_member_number  = models.CharField(max_length=155)
    customer_status = models.BooleanField(default=False)
    branch_id = models.IntegerField()
    branch_name = models.CharField(max_length=155)
    branch_short_name = models.CharField(max_length=155)
    loan_amount = models.FloatField(default=0.0)
    loan_date_added = models.DateTimeField()
    reason = models.CharField(max_length=1555)
    status = models.CharField(max_length=155)
    int_rate = models.FloatField(default=0.0)
    loan_date = models.DateTimeField()
    app_grace_period = models.IntegerField()
    int_method  = models.CharField(max_length=155)
    is_deleted = models.BooleanField(default=False)
    loan_product_id  = models.IntegerField()
    product_name = models.CharField(max_length=155)
    product_int_rate = models.FloatField(default=0.0),
    product_int_method = models.CharField(max_length=155)
    approval_ammount = models.FloatField(default=0.0)
    approval_date = models.DateTimeField()
    disbursed_amount = models.FloatField(default=0.0)
    loan_start_date  = models.DateTimeField()
    loan_disbursement_date = models.DateTimeField()
    arrear_grace_period  = models.IntegerField()
    write_off_date = models.DateTimeField()
    write_off_grace_period  = models.IntegerField()
    loan_officer_id =  models.BigIntegerField()
    customer_id     =  models.BigIntegerField()
    loan_officer_full_name = models.CharField(max_length=155)
    gender = models.CharField(max_length=15)
    telephone = models.CharField(max_length=15)
    schedule_id =  models.BigIntegerField()
    schedule_principal_expected = models.FloatField(default=0.0)
    schedule_interest_expected = models.FloatField(default=0.0)
    schedule_expected_date = models.DateTimeField()
    schedule_status = models.CharField(max_length=155)
    int_waivered_amount = models.FloatField(default=0.0)
    int_waivered_comment = models.FloatField(default=0.0),
    penalty_id =  models.BigIntegerField()
    penalty_amount  = models.FloatField(default=0.0)
    penalty_comment = models.CharField(max_length=155)
    penalty_waivered_id =  models.BigIntegerField()
    penalty_waivered_amount = models.FloatField(default=0.0)
    pen_waivered_comment = models.CharField(max_length=155)
    paid_amount = models.FloatField(default=0.0)
    voucher_no  = models.CharField(max_length=155)
    payment_method  = models.CharField(max_length=155)
    transaction_type  = models.CharField(max_length=155)

    class Meta:
        managed = False
        db_table = "public\".\"loan_installment_repayment_view"

# to be removed
class LoanRepaymentview(models.Model):
    id =  models.BigIntegerField(primary_key=True)
    customer_type_id = models.BigIntegerField()
    organisation_id =  models.BigIntegerField()
    branch_id =  models.BigIntegerField()
    name = models.CharField(max_length=155)
    member_number = models.CharField(max_length=155)
    old_member_number = models.CharField(max_length=155)
    telephone     = models.CharField(max_length=155)
    gender = models.CharField(max_length=15)
    loan_product_id =  models.BigIntegerField()
    loan_sector_id  =  models.BigIntegerField()
    loan_officer_id =  models.BigIntegerField()
    customer_id     =  models.BigIntegerField()
    status     = models.CharField(max_length=155)
    is_deleted = models.BooleanField(default=False)
    schedule_id =  models.BigIntegerField()
    schedule_principal_expected  = models.FloatField(default=0.0)
    schedule_interest_expected   = models.FloatField(default=0.0)
    loan_amount  = models.FloatField(default=0.0)
    penalty_amount       = models.FloatField(default=0.0)
    int_waivered_amount  = models.FloatField(default=0.0)
    penalty_waivered_amount  = models.FloatField(default=0.0)
    paid_amount  = models.FloatField(default=0.0)
    princ_paid  = models.FloatField(default=0.0)
    int_paid  = models.FloatField(default=0.0)
    penalty_paid  = models.FloatField(default=0.0)
    principal_balance  = models.FloatField(default=0.0)
    interest_balance  = models.FloatField(default=0.0)
    penalty_balance  = models.FloatField(default=0.0)
    loan_balance  = models.FloatField(default=0.0)
    total_expected  = models.FloatField(default=0.0)
    loan_start_date = models.DateTimeField()
    loan_end_date = models.DateTimeField()
    loan_disbursement_date = models.DateTimeField()
    schedule_expected_date = models.DateTimeField()
    loan_write_off_date = models.DateTimeField()
    loan_arrear_date = models.DateTimeField()
    written_off_date   = models.DateTimeField()
    write_off_comment  = models.CharField(max_length=1555)
    clear_off_date  = models.DateTimeField()
    
    class Meta:
        managed = False
        db_table = "public\".\"loan_repayment_view"
