private static List<PaymentModel> GetATMPayments(Payment loanPayment)
        {
            var atmReceiptPayments = from p in Context.Payments
                                     join rpa in Context.ReceiptPaymentAssocs on p.Id equals rpa.PaymentId
                                     where p.ParentPaymentId == loanPayment.Id
                                     && (p.PaymentMethodTypeId == PaymentMethodType.ATMType.Id)
                                     && p.PaymentTypeId == PaymentType.LoanPayment.Id
                                     select rpa;

            var customerAtmPayments = from crp in atmReceiptPayments
                                      join rpa in Context.ReceiptPaymentAssocs on crp.ReceiptId equals rpa.ReceiptId
                                      join p in Context.Payments on rpa.PaymentId equals p.Id
                                      where p.PaymentTypeId == PaymentType.Receipt.Id
                                      select new { ActualPayment = crp.Payment, ReceivePayment = p};

            var models = new List<PaymentModel>();
            foreach (var atmPayment in customerAtmPayments)
            {
                var amountTendered = atmReceiptPayments.FirstOrDefault(entity => entity.PaymentId == atmPayment.ActualPayment.Id);
                PaymentModel model = new PaymentModel();
                model.PaymentMethod = atmPayment.ActualPayment.PaymentMethodType.Name;
                model.BankName = "NA";
                model.BankBranch = "NA";
                model.CheckNumber = atmPayment.ReceivePayment.PaymentReferenceNumber;
                model.TransactionDate = atmPayment.ReceivePayment.TransactionDate;
                model.AmountTendered = amountTendered.Amount;
                model.AmountApplied = atmPayment.ActualPayment.TotalAmount;
                models.Add(model);
            }

            return models;
        }
        private static List<PaymentModel> GetListOfCheques(Payment loanPayment)
        {
            var chequeReceiptPayments = from p in Context.Payments
                                 join rpa in Context.ReceiptPaymentAssocs on p.Id equals rpa.PaymentId
                                 where p.ParentPaymentId == loanPayment.Id
                                 && (p.PaymentMethodTypeId == PaymentMethodType.PayCheckType.Id
                                 || p.PaymentMethodTypeId == PaymentMethodType.PersonalCheckType.Id)
                                 && p.PaymentTypeId == PaymentType.LoanPayment.Id
                                 select rpa;

            var customerChequePayments = from crp in chequeReceiptPayments
                                         join rpa in Context.ReceiptPaymentAssocs on crp.ReceiptId equals rpa.ReceiptId
                                         join p in Context.Payments on rpa.PaymentId equals p.Id
                                         join c in Context.Cheques on p.Id equals c.PaymentId
                                         where p.PaymentTypeId == PaymentType.Receipt.Id
                                         select new {ActualPayment = crp.Payment, ReceivePayment = p, Cheque = c};

            var models = new List<PaymentModel>();
            foreach (var chequePayment in customerChequePayments)
            {
                var amountTendered = chequeReceiptPayments.FirstOrDefault(entity => entity.PaymentId == chequePayment.ActualPayment.Id);
                var bankPartyRole = PartyRole.GetById(chequePayment.Cheque.BankPartyRoleId);
                Bank bank = Bank.GetById(bankPartyRole.Id);
                PaymentModel model = new PaymentModel();
                model.PaymentMethod = "Cheque";
                model.BankName = bankPartyRole.Party.Name;
                model.BankBranch = bank.Branch;
                model.CheckNumber = chequePayment.ReceivePayment.PaymentReferenceNumber;
                model.TransactionDate = chequePayment.Cheque.CheckDate;
                model.AmountTendered = amountTendered.Amount;
                model.AmountApplied = chequePayment.ActualPayment.TotalAmount;
                models.Add(model);
            }

            return models;
        }
        private static void FillListOfCashReceiptsUsed(Payment loanPayment, PrintLoanPayment loanPaymentModel)
        {
            var cashPayments = from p in Context.Payments
                               join rpa in Context.ReceiptPaymentAssocs on p.Id equals rpa.PaymentId
                               where p.ParentPaymentId == loanPayment.Id
                               && p.PaymentMethodTypeId == PaymentMethodType.CashType.Id
                               && p.PaymentTypeId == PaymentType.LoanPayment.Id
                               select rpa;

            var customerCashPayments = from crp in cashPayments
                                       join rpa in Context.ReceiptPaymentAssocs on crp.ReceiptId equals rpa.ReceiptId
                                       join p in Context.Payments on rpa.PaymentId equals p.Id
                                       where p.PaymentTypeId == PaymentType.Receipt.Id
                                       && p.TransactionDate < loanPayment.TransactionDate
                                       select new { ActualPayment = crp.Payment, ReceivePayment = p};

            var customerCashPaymentsToday = from crp in cashPayments
                                            join rpa in Context.ReceiptPaymentAssocs on crp.ReceiptId equals rpa.ReceiptId
                                            join p in Context.Payments on rpa.PaymentId equals p.Id
                                       where p.PaymentTypeId == PaymentType.Receipt.Id
                                       && p.TransactionDate == loanPayment.TransactionDate
                                            select new { ActualPayment = crp.Payment, ReceivePayment = p };

            var modelsFromPreviousReceipts = new List<PaymentModel>();
            foreach (var cashPayment in customerCashPayments)
            {
                var amountTendered = cashPayments.FirstOrDefault(entity => entity.PaymentId == cashPayment.ActualPayment.Id);

                PaymentModel paymentCash = new PaymentModel();
                paymentCash.PaymentMethod = "Cash Previous Receipt";
                paymentCash.BankName = "NA";
                paymentCash.BankBranch = "NA";
                paymentCash.CheckNumber = "NA";
                paymentCash.TransactionDate = cashPayment.ReceivePayment.TransactionDate;
                paymentCash.AmountTendered = amountTendered.Amount;
                paymentCash.AmountApplied = cashPayment.ActualPayment.TotalAmount;
                modelsFromPreviousReceipts.Add(paymentCash);
            }

            loanPaymentModel.CashReceiptsFromPreviousTransaction = modelsFromPreviousReceipts;

            var models = new List<PaymentModel>();
            foreach (var cashPayment in customerCashPaymentsToday)
            {
                var amountTendered = cashPayments.FirstOrDefault(entity => entity.PaymentId == cashPayment.ActualPayment.Id);
                PaymentModel paymentCash = new PaymentModel();
                paymentCash.PaymentMethod = "Cash";
                paymentCash.BankName = "NA";
                paymentCash.BankBranch = "NA";
                paymentCash.CheckNumber = "NA";
                paymentCash.TransactionDate = cashPayment.ReceivePayment.TransactionDate;
                paymentCash.AmountTendered = amountTendered.Amount;
                paymentCash.AmountApplied = cashPayment.ActualPayment.TotalAmount;
                models.Add(paymentCash);
            }

            loanPaymentModel.CashPayments = models;
        }