from ledgers.serializers import OrganisationSubAccountSerializer
from loans.helpers.repayment_helper import filter_loan_repayment_reports
from mobileapp.helper import mm_generate_loan_schedules
from mobileapp.serializers import VslaLoanPaymentSerializer,AgentSavingsSerializer, VslaLoanSettingsSerializer, VslaLoansSerializer, VslaMembershipSerializer, VslaSavingsSerializer, VslaShareSettingsSerializer, VslaSharesSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from savings.savings_bal_helper import get_account_balance
from shares.shares_balance_helper import get_client_shares_balance
from savings.models import SavingAccount
from django.db.models import Q,Sum
from customers.models import GroupMembership, Customer
from shares.models import ShareHolders
from mobileapp.serializers import *
from loans.models import *
from customers.serializers import *
from mobileapp.serializers import *
from loans.serializers import *
from loans.helper import *
from rest_framework import viewsets
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from users.models import User
from loans.helper import *
import json

from users.serializers import StaffSerializer

class AppDashboardView(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        response = {}
        member_number        = request.GET.get('member_number', None)
        dashboard_type        = request.GET.get('dashboard_type', 'VLSA')

        if dashboard_type == 'VLSA' and member_number:
            customer = Customer.objects.filter(Q(member_number = member_number) | Q(old_member_number = member_number)).first()
            membership = GroupMembership.objects.filter(Q(group__member_number = member_number) | Q(group__old_member_number = member_number)).values_list('member__id', flat=True)

            # savings
            savings_response = {}
            accounts_count = SavingAccount.objects.filter(account_customer__id__in=membership, status='active').count()
            account = SavingAccount.objects.filter(Q(account_customer__member_number = member_number) | Q(account_customer__old_member_number = member_number)).first()
            if account:
                savings_response = get_account_balance(account)
                savings_response['accounts_count'] = accounts_count if accounts_count else 0

            # shares 
            shares_response = {}
            shares_response = get_client_shares_balance(customer)
            list_holders = ShareHolders.objects.filter(customer__id__in=membership ).count()
            shares_response['share_holders'] = list_holders if list_holders else 0

            # members
            members_response = {}
            members_response['members_count'] = len(membership) if membership else 0

            # loans
            loans_response = {}
            loans_count = LoanApplicationDisbursement.objects.filter(loan_application__customer__id__in=membership, loan_application__loan_group__id=customer.id, loan_application__status='disbursed').count()
            loans_disbursed = LoanApplicationDisbursement.objects.filter(loan_application__customer__id__in=membership, loan_application__loan_group__id=customer.id,  loan_application__status='disbursed').aggregate(total_amount=Sum('loan_amount'))['total_amount']
            loans_response['loans_count'] = loans_count
            loans_response['loans_disbursed_amount'] = loans_disbursed if loans_disbursed else 0
            
            response['loans'] = loans_response
            response['shares'] = shares_response
            response['members'] = members_response
            response['savings'] = savings_response

        return Response(response)

class GroupLoansView(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        response = []
        group_id        = request.GET.get('group_id', None)
        if group_id:
            membership = GroupMembership.objects.filter(group__id=group_id).values_list('member__id', flat=True)
            loans = LoanApplication.objects.filter(customer__id__in=membership, loan_group__id=group_id, status='disbursed')
            response = LoanApplicationSerializer(loans, many=True).data

        return Response({"count":len(response), "results":response})

class CustomerGroupView(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        response = []
        customer_id        = request.GET.get('customer_id', None)
        if customer_id:
            membership = GroupMembership.objects.filter(member__id=customer_id)
            for member in membership:
                response.append({"id":member.group.id, "name":member.group.name})
        return Response({"count":len(response), "results":response})

class GroupLoanApplicationView(viewsets.ModelViewSet):
    serializer_class = LoanApplicationSerializer
    queryset=LoanApplication.objects.all().order_by('-id')
    filter_backends = (SearchFilter, OrderingFilter, DjangoFilterBackend, )
    filterset_fields = ['organisation_branch', 'status', 'loan_application_product','customer']
    search_fields = ('status', )
    ordering_fields = ['status', ]

    authentication_classes = []
    permission_classes = []

    def perform_create(self, serializer):
        organisation_branch
        organisation_branch_id = self.request.data.get('organisation_branch_id')
        organisation_branch = OrganisationBranch.objects.get(pk=organisation_branch_id)
        new_application = serializer.save(loan_app_added_by=self.request.user, organisation_branch=organisation_branch)
        
        application = LoanApplication.objects.get(pk=new_application.id)
        application.auto_payments = application.loan_application_product.auto_payments
        application.auto_pay_penalty = application.loan_application_product.auto_pay_penalty
        application.save()

class GroupGenerateLoanScheduleView(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        response = []
        loan_id    = request.GET.get('loan_id', None)
        if loan_id:
            loan_details = LoanApplication.objects.get(pk=loan_id)
            if loan_details.status == 'disbursed' or loan_details.status == 'cleared_off' or loan_details.status == 'written_off':
                # get loan schedule from db
                loan_repayment_schedules = LoanRepaymentSchedule.objects.filter(loan_application = loan_details, status='active').order_by('id')
                serializer = LoanRepaymentScheduleSerializer(loan_repayment_schedules, many=True)
                response = serializer.data
                
            else:
                response = generate_loan_schedules(request, loan_id)
        return Response({"count":len(response), "results":response})

class GroupLoanScheduleWithPaymentsView(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        response = []
        loan_id    = request.GET.get('loan_id', None)
        if loan_id:
            response = loan_schedules_with_payments(loan_id)
        return Response({"count":len(response['loan_schedules']), "results":response['loan_schedules'], "schedule_due":response['schedule_due'], "next_schedule":response['next_schedule'], "reschedule":response['reschedule']})


class GroupLoanScheduleWithPaymentsView(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        response = []
        loan_id    = request.GET.get('loan_id', None)
        if loan_id:
            response = loan_schedules_with_payments(loan_id)
        return Response({"count":len(response['loan_schedules']), "results":response['loan_schedules'], "schedule_due":response['schedule_due'], "next_schedule":response['next_schedule'], "reschedule":response['reschedule']})



class LoanProductsView(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        response = []
        organisation_id = request.GET.get('organisation_id', None)
        loan_products = LoanProduct.objects.filter(organisation__id=organisation_id, is_deleted=False)
 
        if loan_products:
            response = LoanProductsSerializer(loan_products, many=True).data

        return Response({"count":len(response), "results":response})
    

#class LoanApplicationMMView(viewsets.ModelViewSet):
class LoanApplicationMMView(APIView):
    serializer_class = LoanApplicationSerializer
    filter_backends = (SearchFilter, OrderingFilter, DjangoFilterBackend, )
    filterset_fields = ['organisation_branch', 'status', 'loan_application_product','customer']
    search_fields = ('status','customer' )
    ordering_fields = ['status', ]
    lookup_field = 'id'

    def get_queryset(self):        
        if self.kwargs and "id" in self.kwargs:
            return  LoanApplication.objects.all().order_by('-id')
        organisation_branch_id = self.request.data.get('loan_group_id')
     
        return  LoanApplication.objects.filter(is_deleted=False, organisation_branch__id=organisation_branch_id ).order_by('-id')

    
class MMCustomersViewSet(viewsets.ModelViewSet):
    serializer_class = CustomerSerializer
    queryset=Customer.objects.all().order_by('-id')
    filter_backends = (SearchFilter, OrderingFilter, DjangoFilterBackend, )
    filterset_fields = ['member_number','name', 'old_member_number', 'branch_customer_type','customer_branch']
    search_fields    = ['member_number','name', 'old_member_number']
    ordering_fields  = ['name', 'member_number']

    #authentication_classes = []
    #permission_classes = []
   # Employee.objects.get(id=id) to Employee.objects.filter(id=id)

    def get_queryset(self):
        #organisation_id = get_current_user(self.request, 'organisation_id', None) 
        organisation_id = '1'
        source_customer_type_id = self.request.GET.get('source_customer_type_id', None)
        has_members = self.request.GET.get('has_members', None)
        date_added = self.request.GET.get('date_added', None)
        customer_filter = {"customer_branch__branch_organisation":Organisation.objects.filter(pk=organisation_id),"is_deleted":False}
        if source_customer_type_id:
             # get customers of customer types [groups] whose customer source is customer_type_id
            customer_filter['branch_customer_type__source_client_type'] = source_customer_type_id
        if has_members:
             # get customers of customer types [groups] whose customer source is customer_type_id
            customer_filter['branch_customer_type__has_members'] = has_members
        if date_added:
            customer_filter['date_added__lte'] = date_added
        return Customer.objects.filter(**customer_filter).order_by('member_number')
    
    
    def perform_create(self, serializer):
        request_data    = self.request.data
        savings_product = request_data.get('savings_product', None)
        send_sms        = request_data.get('send_sms',False)
        subscribe       = request_data.get('subscribe',False)

        

        organisation_branch_id = self.request.data.get('organisation_branch_id') 
        organisation_branch    = OrganisationBranch.objects.filter(pk=organisation_branch_id)
        first_user = User.objects.filter(user_organisation_branch__id=organisation_branch_id).first()

        saved_customer = serializer.save(customer_branch=organisation_branch)
        
        if saved_customer:
            
            self.update_customer_location(saved_customer,request_data)
            self.create_default_savings_account(saved_customer,savings_product,organisation_branch,self.request.user)
            if subscribe:
                self.auto_subscribe_to_sms_banking(saved_customer,organisation_branch,self.request.user)
            if send_sms:
                self.send_customer_welcome_sms(saved_customer,organisation_branch,self.request.user)
                self.send_customer_mmbanking_sms(saved_customer)

   

class MMGroupMembersViewSet11(viewsets.ModelViewSet):

    serializer_class = CustomerSerializer
    queryset=Customer.objects.all().order_by('-id')
    filter_backends = (SearchFilter, OrderingFilter, DjangoFilterBackend, )
    filterset_fields = ['member_number','name', 'old_member_number', 'branch_customer_type','customer_branch']
    search_fields    = ['member_number','name', 'old_member_number']
    ordering_fields  = ['name', 'member_number']

    authentication_classes = []
    permission_classes = []

    serializer_class = CustomerMembershipSerializer
    http_method_names = ['get', 'post', 'patch']

    def get_queryset(self):
        group_id = self.request.GET.get('group', None)
        search = self.request.GET.get('search', None)
        if group_id:
            if search:
                return GroupMembership.objects.filter(Q(member__name__icontains=search) | Q(member__member_number__icontains=search)| Q(member__old_member_number__icontains=search),group_id=group_id,active=True)
            else:
                return GroupMembership.objects.filter(group_id=group_id,active=True)
        return GroupMembership.objects.all()
    
    def perform_create(self, serializer):
        group = self.request.data.get('group')
        members = self.request.data.get('members')

        if members:
            members = json.loads(members)
            
            for member in members:
                role = member['role']
                member_id = member['id']
                exists = GroupMembership.objects.filter(group_id=group, member_id=member_id)
                if len(exists) > 0:
                    member = exists[0]
                    member.role = role
                    member.active = True
                    member.added_by_id = self.request.user.id
                else:
                    member= GroupMembership.objects.filter(member_id=member_id).first()
                    if member:
                        member.role = role
                        member.active = True
                        member.group = Customer.objects.get(pk = group)
                    else: 
                        if member_id != group:
                            member = GroupMembership(group_id=group, member_id=member_id, role=role, added_by_id=self.request.user.id)
                
                # Save membership
                member.save()



class MMGroupMembersViewSet(viewsets.ModelViewSet):
    serializer_class = VslaMembershipSerializer
    http_method_names = ['get', 'post', 'patch']

    def get_queryset(self):
        group_id = self.request.GET.get('group', None)
        search = self.request.GET.get('search', None)
        if group_id:
            if search:
                return VslaMembership.objects.filter(Q(name__icontains=search) | Q(member_number__icontains=search),group_id=group_id,active=True)
            else:
                return VslaMembership.objects.filter(group_id=group_id,active=True)
        return VslaMembership.objects.all() 
    


class MMGroupSavingsViewSet(viewsets.ModelViewSet):
    serializer_class = VslaSavingsSerializer
    http_method_names = ['get', 'post', 'patch']
   
    def get_queryset(self):
        group_id         = self.request.GET.get('group', None)
        transaction_type = self.request.GET.get('transaction_type', None)
        start            = self.request.GET.get('end', None)
        end              = self.request.GET.get('end', None)
        
        filter_records   = {}
        # yyyy-mm-dd
        if group_id:
            filter_records["group__id"] = group_id
        if transaction_type:
            filter_records["transaction_type"] = transaction_type
        if start:
            filter_records["record_date__data__gte"] = start
        if end:
            filter_records["record_date__data__lte"] = end
            
        return VslaSavings.objects.filter(**filter_records) 
    

    
  
class MMGroupSharesViewSet(viewsets.ModelViewSet):
    serializer_class = VslaSharesSerializer
    http_method_names = ['get', 'post', 'patch']
   
    def get_queryset(self):
        group_id         = self.request.GET.get('group', None)
        transaction_type = self.request.GET.get('transaction_type', None)
        start            = self.request.GET.get('end', None)
        end              = self.request.GET.get('end', None)
        
        filter_records   = {}
        # yyyy-mm-dd
        if group_id:
            filter_records["group__id"] = group_id
        if transaction_type:
            filter_records["transaction_type"] = transaction_type
        if start:
            filter_records["record_date__data__gte"] = start
        if end:
            filter_records["record_date__data__lte"] = end
            
        return VslaMemberShares.objects.filter(**filter_records) 

class VslaMMMemberBalanceView(APIView):
    def post(self, request, format=None):
        message = {
            'status': 'failed',
            'message': 'Invalid Group Details'
        }
        group_id = self.request.data.get('group', None)
        member_balances = []

        memberships = VslaMembership.objects.filter(group_id=group_id,active=True)
        if memberships:
                    for membership in memberships:
                        filter_array    = {"membership":membership}
                        group_savings = VslaSavings.objects.filter(**filter_array)
            
                        if group_savings:
                            transactons = VslaSavingsSerializer(group_savings, many=True).data
                            balance = 0
                            money_in = 0
                            money_out = 0
                            for transacton in transactons:
                                if transacton['transaction_type'] == 'cr':
                                    balance += float(transacton['amount'])
                                    money_in += float(transacton['amount'])
                                else:
                                    balance -= float(transacton['amount'])
                                    money_out += float(transacton['amount'])

                            member_balances.append({
                                "id":membership.id,
                                'name': membership.mname,
                                'old_member_number': membership.member_number,
                                'member_number': membership.member_number,
                                'money_in': money_in,
                                'money_out': money_out,
                                'balance': balance,
                                "transactons":transactons
                            })
                    
                    message = {"count":len(member_balances), "members":member_balances, 'status': 'success'}
        return Response(message, status=status.HTTP_200_OK)

    
class VslaSharesSettingsViewSet(viewsets.ModelViewSet):
 def put(self, request, format=None):
     id = self.request.data.get('id')
     settings = VslaShareSettings.objects.filter(id=id).update(**request.data)
     if settings:
            message = {
                'status': 'success',
                'customer': VslaShareSettingsSerializer(settings).data
            }
            response_status = status.HTTP_200_OK

            return Response(message, response_status)
    


class VslaLoanSettingsView(viewsets.ModelViewSet):
   # serializer_class = VslaLoanSettingsSerializer
    #http_method_names = ['get', 'post', 'patch']
   
    def get_queryset(self,request):
        group_id         = self.request.GET.get('group', None)
        id         = self.request.GET.get('id', None)

        if int(id) > 0:
            settings = VslaLoanSettings.objects.filter(Q(id=id,  active=True)).update(**request.data) 
        
        filter_records   = {}
        # yyyy-mm-dd
        if group_id:
            filter_records["group__id"] = group_id
            
        return VslaLoanSettings.objects.filter(**filter_records) 
    

class VslaLoanProductsView(APIView):

    def get(self, request, format=None):
        response = []
        group_id = request.GET.get('group', None)
        loan_products = VslaLoanSettings.objects.filter(group_id=group_id)
 
        if loan_products:
            response = VslaLoanSettingsSerializer(loan_products, many=True).data

        return Response({"count":len(response), "results":response})
    


class VslaMemberLoansView_cc(APIView):


    def get(self, request, format=None):
        response = []
        group_id        = request.GET.get('group_id', None)
        customer_id        = request.GET.get('customer_id', None)
 
        if group_id:
            membership = GroupMembership.objects.filter(group__id=group_id).values_list('member__id', flat=True)
            loans = VslaLoans.objects.filter(group_id=group_id)
            response = VslaLoansSerializer(loans, many=True).data
        else:

            loans = VslaLoans.objects.filter(membership__id=customer_id)
            response = VslaLoansSerializer(loans, many=True).data

        return Response({"count":len(response), "results":response})
    


class VslaMemberLoansView(APIView):
     def get(self, request, format=None):
        message = {
            'status': 'failed',
            'message': 'Invalid Group Details'
        }
       # group_id = self.request.data.get('group_id', None)
        group_id = request.GET.get('group_id', None)
        member_balances = []

        memberships = VslaMembership.objects.filter(group_id=group_id,active=True)
        if memberships:
                    for membership in memberships:
                        filter_array    = {"membership":membership}
                        loans = VslaLoans.objects.filter(**filter_array)
            
                        if loans:
                            transactons = VslaLoansSerializer(loans, many=True).data
                          
                            for transacton in transactons:
                                #pro = VslaLoanSettings.objects.filter(id=transacton['loan_product'])
                               # product=VslaLoanSettingsSerializer(pro, many=True).data,
                              
                               #product = VslaLoanSettings.objects.filter(id=transacton['loan_product']).values_list('name', flat=True)
                               product = VslaLoanSettings.objects.filter(id=transacton['loan_product']).first()
                            member_balances.append({
                                "id":membership.id,
                                'name': membership.name,
                                'old_member_number': membership.member_number,
                                'member_number': membership.member_number,
                                'product_name':product.name,
                                #'loan_status': transacton.loan_status,
                                'product': VslaLoanSettingsSerializer(product).data,
                                "transactons":transactons
                            })
                    
                    message = {"count":len(member_balances), "members":member_balances, 'status': 'success'}
        return Response(message, status=status.HTTP_200_OK)

class VslaLpanPaymentViewSet(viewsets.ModelViewSet):
    serializer_class = VslaLoanPaymentSerializer
    http_method_names = ['get', 'post', 'patch']
   
    def get_queryset(self):
        group_id         = self.request.GET.get('group', None)
        transaction_type = self.request.GET.get('transaction_type', None)
        
        filter_records   = {}

        if group_id:
            filter_records["group__id"] = group_id
        if transaction_type:
            filter_records["transaction_type"] = transaction_type
            
        return VslaLoanPayments.objects.filter(**filter_records) 
    

class AgentGroupSavingsViewSet(viewsets.ModelViewSet):
    serializer_class = AgentSavingsSerializer
    http_method_names = ['get', 'post', 'patch']
   
    def get_queryset(self):
        group_id         = self.request.GET.get('group', None)
        transaction_type = self.request.GET.get('transaction_type', None)
        start            = self.request.GET.get('end', None)
        end              = self.request.GET.get('end', None)
        
        filter_records   = {}
        # yyyy-mm-dd
        if group_id:
            filter_records["group__id"] = group_id
        if transaction_type:
            filter_records["transaction_type"] = transaction_type
        if start:
            filter_records["record_date__data__gte"] = start
        if end:
            filter_records["record_date__data__lte"] = end
            
        return VslaAgentSavings.objects.filter(**filter_records) 
    



 #new work
class VslaTransferView(APIView):
    authentication_classes = []
    permission_classes = []

    def post(self, request, format=None):
        message = {
            'status': 'failed',
            'message': 'Invalid Group Details'
        }
        group = self.request.data.get('group', None)
        start = self.request.data.get('from_date', None)
        end = self.request.data.get('to_date', None)
        member_balances = []

        group_savings = VslaAgentSavings.objects.filter(group_id=group,record_date__date__gte=start, record_date__date__lte=end)

        balance = 0
        money_in = 0

        transactons=0

        if group_savings:
           transactons = AgentSavingsSerializer(group_savings, many=True).data
           for transacton in transactons:
             member = VslaMembership.objects.filter(id = transacton['member_id']).first()
            # user = Staff.objects.filter(id=transacton['officer_id']).first()
             staff = Staff.objects.filter(id= transacton['officer_id']).first()

             if transacton['transaction_type'] == 'cr':
                 balance += float(transacton['amount'])
                 money_in += float(transacton['amount'])
           else:
                balance -= float(transacton['amount'])
                money_in -= float(transacton['amount'])


                member_balances.append({
                        'member': VslaMembershipSerializer(member).data,
                        'user': StaffSerializer(staff).data,
                        'money_in': money_in,
                        'balance': balance,
                        'savings':transactons


                    })
        message = {"count":len(member_balances), "members":member_balances, 'status': 'success'}
        return Response(message, status=status.HTTP_200_OK)

class MMGenerateLoanScheduleView(APIView):
    #def get(self, request, format=None):
    def post(self, request, format=None):
        response = []
        #loan_id    = request.GET.get('loan_id', None)
        loan_id    = '1'
        if loan_id:

                response = mm_generate_loan_schedules(request, loan_id)
        return Response({"count":len(response), "results":response})



class MMSystemTransactionsListView(APIView):

    def post(self, request, format=None):
        '''
        Get transactions
        '''
        end =self.request.data.get('e', None)
        start = self.request.data.get('s', None)
        account = self.request.data.get('account', None)
        transaction_type = self.request.data.get('type', None)

        organisation_id = get_current_user(self.request, 'organisation_id', None)
        branch_id = self.request.GET.get('branch', None)
        if not branch_id:
            branch_id = get_current_user(self.request, 'organisation_branch_id', None)

        if int(branch_id) == 0:
            branch_id = ',' . join(map(str, OrganisationBranch.objects.filter(branch_organisation_id=organisation_id).values_list('id', flat=True)))

        if int(account) > 0:
            transactional_charts = OrganisationSubAccount.objects.filter(parent_id_id=account)
            if len(transactional_charts) == 0:
                transactional_charts = OrganisationSubAccount.objects.filter(id=account)
        else:
            account_line = request.GET.get('line', None)
            transactional_charts = get_transactional_charts(organisation_id, account_line)

        list = OrganisationSubAccountSerializer(
            transactional_charts,
            many=True,
            context={
                'branch_id': branch_id,
                'start_date': start,
                'end_date': end,
                'type': transaction_type
            }
        )

        data = {
            'count' : len(list.data),
            'results': list.data
        }

        return Response(data, status=status.HTTP_200_OK)
    


class MMLoanApplicationView(viewsets.ModelViewSet):
    serializer_class = LoanApplicationSerializer
    filter_backends = (SearchFilter, OrderingFilter, DjangoFilterBackend, )
    filterset_fields = ['organisation_branch', 'status', 'loan_application_product','customer']
    search_fields = ('status','customer' )
    ordering_fields = ['status', ]
    lookup_field = 'id'

    def perform_create(self, serializer):       
        if self.kwargs and "id" in self.kwargs:
            return  LoanApplication.objects.all().order_by('-id')
        organisation_branch_id = get_current_user(self.request, 'organisation_branch_id', None) 

        return  LoanApplication.objects.filter(is_deleted=False, organisation_branch__id=organisation_branch_id ).order_by('-id')

    def perform_create(self, serializer):
        send_sms = self.request.data.get('send_sms')
        organisation_branch_id = get_current_user(self.request, 'organisation_branch_id', None)
        organisation_branch = OrganisationBranch.objects.get(pk=organisation_branch_id)
        new_application = serializer.save(loan_app_added_by=self.request.user, organisation_branch=organisation_branch)
        
        application = LoanApplication.objects.get(pk=new_application.id)
        application.auto_payments = application.loan_application_product.auto_payments
        application.auto_pay_penalty = application.loan_application_product.auto_pay_penalty
        application.grace_period_type = application.loan_application_product.grace_period_type
        application.save()

        if application and send_sms:
            f_amount  = f"{float(application.loan_amount):,}"
            pdt_name  = application.loan_application_product.product_name
            sms_msg   = 'Dear '+application.customer.name.capitalize() +', You have applied for a ('+pdt_name + ' loan) Amount UGX: '+ f_amount+', its awaiting approval\n'+organisation_branch.branch_organisation.short_name
            data = {"sms_key":"loan_application_sms","customer":application.customer,"user":self.request.user,"branch_id":organisation_branch_id,"sms_msg":sms_msg,"loan":application}
            send_customer_sms(data)




class getLoansTransactionsView(APIView):

    def get(self, request, format=None):

        mid        = request.GET.get('mid', None)
        
        data = {
            'myloans': [],
            'group_loans': []
        }

        if mid:
            membership = GroupMembership.objects.filter(group__id=mid).values_list('member__id', flat=True)
            group_loans = LoanApplication.objects.filter(customer__id__in=membership, loan_group__id=mid, status='disbursed')
            group_loans = LoanApplicationSerializer(group_loans, many=True).data
            myloans = LoanApplication.objects.filter( Q(status='disbursed')| Q(status='pending')| Q(status='approved'),customer__id=mid)
            myloans = LoanApplicationSerializer(myloans, many=True).data            

            data = {
                'group_loans':group_loans,
                'myloans':myloans
            }

        return Response(data, status=status.HTTP_200_OK)



          
class MMLoansRepaymentReportFiltersDataView(APIView):
    def get(self, request):
        filter_1  = []
        filter_2  = []
        page_size     = 200
        start_date         = request.GET.get('s')
        end_date         = request.GET.get('e')
        report_filter = self.request.GET.get('filter')
        organisation_id = get_current_user(self.request, 'organisation_id', None) 
        search        = self.request.GET.get("search", None)
        
        if self.request.GET.get('page_size'):
            page_size = self.request.GET.get('page_size')

        if request.GET.get('filter_1'):
            filter_1 = list(request.GET.get('filter_1').split(','))

        if request.GET.get('filter_2'):
            filter_2 = list(request.GET.get('filter_2').split(','))
        
        report_filters = {
           "report_filter":report_filter,
           "organisation_id":organisation_id,
           "page_size":page_size,
           "filter_1":filter_1,
           "filter_2":filter_2,
           "request":request,
           "start_date":start_date,
           "end_date":end_date,
           "search":search
        }
        
        return filter_loan_repayment_reports(report_filters)


class SavingsTransferViewSet(viewsets.ModelViewSet):
    serializer_class = AgentSavingsSerializer
    http_method_names = ['get', 'post', 'patch']


    def get_queryset(self):
        status = self.request.GET.get('status', None)
        start  = self.request.GET.get('start', None)
        end    = self.request.GET.get('end', None)
        trans_id = self.request.GET.get('trans_id', None)

        filter_records   = {}

        if trans_id:
            VslaAgentSavings.objects.filter(pk=trans_id).update(status='processed')
        if status:
            filter_records["status"] = status
        if start:
            filter_records["record_date__date__gte"] = start
        if end:
            filter_records["record_date__date__lte"] = end
        return VslaAgentSavings.objects.filter(**filter_records)

    
        


