public ActionResult ImportCapitalCall(FormCollection collection)
        {
            Models.Entity.CapitalCall capitalCall=new Models.Entity.CapitalCall();
            ResultModel resultModel=new ResultModel();
            this.TryUpdateModel(capitalCall,collection);
            capitalCall.CreatedBy=Authentication.CurrentUser.UserID;
            capitalCall.CreatedDate=DateTime.Now;
            capitalCall.LastUpdatedBy=Authentication.CurrentUser.UserID;
            capitalCall.LastUpdatedDate=DateTime.Now;
            capitalCall.CapitalCallTypeID=(int)Models.CapitalCall.Enums.CapitalCallType.Manual;
            capitalCall.CapitalCallNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallNumber(capitalCall.FundID));
            IEnumerable<ErrorInfo> errorInfo=CapitalCallRepository.SaveCapitalCall(capitalCall);
            if(errorInfo==null) {
                resultModel.Result+="True||"+capitalCall.CapitalCallID;
            } else {
                resultModel.Result=ValidationHelper.GetErrorInfo(errorInfo);
            }

            return View("Result",resultModel);
        }
        public ActionResult ImportCapitalCallExcel(FormCollection collection)
        {
            ImportManualCapitalCallExcelModel model=new ImportManualCapitalCallExcelModel();
            ResultModel resultModel=new ResultModel();
            MemoryCacheManager cacheManager=new MemoryCacheManager();
            int totalPages=0;
            int totalRows=0;
            int completedRows=0;
            int? succssRows=0;
            int? errorRows=0;
            this.TryUpdateModel(model);
            if(ModelState.IsValid) {
                string key=string.Format(EXCELCAPITALCALLERROR_BY_KEY,model.SessionKey);
                List<DeepBlue.Models.Deal.ImportExcelError> errors=cacheManager.Get(key,() => {
                    return new List<DeepBlue.Models.Deal.ImportExcelError>();
                });
                DataSet ds=ExcelConnection.ImportExcelDataset(model.SessionKey);
                if(ds!=null) {
                    PagingDataTable importExcelTable=null;
                    if(ds.Tables[model.ManualCapitalCallTableName]!=null) {
                        importExcelTable=(PagingDataTable)ds.Tables[model.ManualCapitalCallTableName];
                    }
                    if(importExcelTable!=null) {
                        importExcelTable.PageSize=model.PageSize;
                        PagingDataTable table=importExcelTable.Skip(model.PageIndex);
                        totalPages=importExcelTable.TotalPages;
                        totalRows=importExcelTable.TotalRows;
                        if(totalPages>model.PageIndex) {
                            completedRows=(model.PageIndex*importExcelTable.PageSize);
                        } else {
                            completedRows=totalRows;
                        }

                        int rowNumber=0;

                        string investorName=string.Empty;
                        string fundName=string.Empty;
                        decimal capitalCallAmount=0;
                        decimal managementFeesInterest=0;
                        decimal investedAmountInterest=0;
                        decimal managementFees=0;
                        decimal fundExpenses=0;
                        DateTime capitalCallDate;
                        DateTime capitalCallDueDate;

                        DeepBlue.Models.Deal.ImportExcelError error;
                        DeepBlue.Models.Entity.Investor investor;
                        DeepBlue.Models.Entity.Fund fund;
                        DeepBlue.Models.Entity.InvestorFund investorFund;

                        EmailAttribute emailValidation=new EmailAttribute();
                        ZipAttribute zipAttribute=new ZipAttribute();
                        WebAddressAttribute webAttribute=new WebAddressAttribute();
                        IEnumerable<ErrorInfo> errorInfo;

                        StringBuilder rowErrors;
                        foreach(DataRow row in table.Rows) {
                            int.TryParse(row.GetValue("RowNumber"),out rowNumber);

                            error=new DeepBlue.Models.Deal.ImportExcelError { RowNumber=rowNumber };
                            rowErrors=new StringBuilder();

                            investorName=row.GetValue(model.InvestorName);
                            fundName=row.GetValue(model.FundName);
                            decimal.TryParse(row.GetValue(model.CapitalCallAmount),out capitalCallAmount);
                            decimal.TryParse(row.GetValue(model.ManagementFeesInterest),out managementFeesInterest);
                            decimal.TryParse(row.GetValue(model.InvestedAmountInterest),out investedAmountInterest);
                            decimal.TryParse(row.GetValue(model.ManagementFees),out managementFees);
                            decimal.TryParse(row.GetValue(model.FundExpenses),out fundExpenses);
                            DateTime.TryParse(row.GetValue(model.CapitalCallDate),out capitalCallDate);
                            DateTime.TryParse(row.GetValue(model.CapitalCallDueDate),out capitalCallDueDate);

                            investor=null;
                            fund=null;
                            investorFund=null;

                            if(string.IsNullOrEmpty(investorName)==false) {
                                investor=InvestorRepository.FindInvestor(investorName);
                            } else {
                                error.Errors.Add(new ErrorInfo(model.InvestorName,"Investor is required"));
                            }

                            if(string.IsNullOrEmpty(fundName)==false) {
                                fund=FundRepository.FindFund(fundName);
                            } else {
                                error.Errors.Add(new ErrorInfo(model.InvestorName,"Fund is required"));
                            }

                            if(investor!=null&&fund!=null) {
                                investorFund=InvestorRepository.FindInvestorFund(investor.InvestorID,fund.FundID);
                            }

                            if(error.Errors.Count()==0) {
                                if(investorFund==null) {
                                    error.Errors.Add(new ErrorInfo(model.InvestorName,"Investror Commitment does not exist"));
                                }
                            }

                            if(error.Errors.Count()==0) {

                                Models.Entity.CapitalCall capitalCall=CapitalCallRepository.FindCapitalCall(
                                    (fund!=null?fund.FundID:0),
                                           capitalCallDate,
                                           capitalCallDueDate,
                                           (int)Models.CapitalCall.Enums.CapitalCallType.Manual);

                                if(capitalCall==null) {
                                    capitalCall=new Models.Entity.CapitalCall();
                                    capitalCall.CreatedBy=Authentication.CurrentUser.UserID;
                                    capitalCall.CreatedDate=DateTime.Now;
                                }

                                capitalCall.CapitalCallDate=capitalCallDate;
                                capitalCall.CapitalCallDueDate=capitalCallDueDate;
                                capitalCall.CapitalCallTypeID=(int)Models.CapitalCall.Enums.CapitalCallType.Manual;
                                capitalCall.LastUpdatedBy=Authentication.CurrentUser.UserID;
                                capitalCall.LastUpdatedDate=DateTime.Now;
                                capitalCall.FundID=(fund!=null?fund.FundID:0);

                                capitalCall.InvestedAmountInterest=0;
                                capitalCall.CapitalAmountCalled+=capitalCallAmount;
                                capitalCall.InvestedAmountInterest=(capitalCall.ExistingInvestmentAmount??0)+investedAmountInterest;
                                capitalCall.FundExpenses=(capitalCall.FundExpenses??0)+fundExpenses;
                                capitalCall.ManagementFees=(capitalCall.ManagementFees??0)+managementFees;
                                capitalCall.ManagementFeeInterest=(capitalCall.ManagementFeeInterest??0)+managementFeesInterest;

                                capitalCall.CapitalCallNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallNumber((fund!=null?fund.FundID:0)));

                                if(error.Errors.Count()==0) {
                                    errorInfo=CapitalCallRepository.SaveCapitalCall(capitalCall);
                                    if(errorInfo!=null) {
                                        error.Errors.Add(new ErrorInfo(model.InvestorName,ValidationHelper.GetErrorInfo(errorInfo)));
                                    }
                                }

                                if(error.Errors.Count()==0) {
                                    bool isNewItem=false;
                                    CapitalCallLineItem item=CapitalCallRepository.FindCapitalCallLineItem(capitalCall.CapitalCallID,investor.InvestorID);
                                    if(item==null) {
                                        item=new CapitalCallLineItem();
                                        item.CreatedBy=Authentication.CurrentUser.UserID;
                                        item.CreatedDate=DateTime.Now;
                                        isNewItem=true;
                                    }
                                    item.LastUpdatedBy=Authentication.CurrentUser.UserID;
                                    item.LastUpdatedDate=DateTime.Now;
                                    item.CapitalAmountCalled=capitalCallAmount;
                                    item.ManagementFeeInterest=managementFeesInterest;
                                    item.InvestedAmountInterest=investedAmountInterest;
                                    item.ManagementFees=managementFees;
                                    item.FundExpenses=fundExpenses;
                                    item.InvestorID=investor.InvestorID;
                                    item.CapitalCallID=capitalCall.CapitalCallID;
                                    errorInfo=CapitalCallRepository.SaveCapitalCallLineItem(item);
                                    if(errorInfo!=null) {
                                        error.Errors.Add(new ErrorInfo(model.InvestorName,ValidationHelper.GetErrorInfo(errorInfo)));
                                    } else {
                                        if(isNewItem) {
                                            if(item.InvestorID>0) {
                                                if(investorFund!=null) {
                                                    // Reduce investor unfunded amount = investor unfunded amount – capital call amount for investor.
                                                    investorFund.UnfundedAmount=investorFund.UnfundedAmount-item.CapitalAmountCalled;
                                                    errorInfo=InvestorRepository.SaveInvestorFund(investorFund);
                                                    if(errorInfo!=null) {
                                                        error.Errors.Add(new ErrorInfo(model.InvestorName,ValidationHelper.GetErrorInfo(errorInfo)));
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }

                            }

                            StringBuilder sberror=new StringBuilder();
                            foreach(var e in error.Errors) {
                                sberror.AppendFormat("{0},",e.ErrorMessage);
                            }
                            importExcelTable.AddError(rowNumber-1,sberror.ToString());
                            errors.Add(error);
                        }
                    }
                }
                if(errors!=null) {
                    succssRows=errors.Where(e => e.Errors.Count==0).Count();
                    errorRows=errors.Where(e => e.Errors.Count>0).Count();
                }
            } else {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return Json(new {
                Result=resultModel.Result,
                TotalRows=totalRows,
                CompletedRows=completedRows,
                TotalPages=totalPages,
                PageIndex=model.PageIndex,
                SuccessRows=succssRows,
                ErrorRows=errorRows
            });
        }
        public ActionResult CreateManualDistribution(FormCollection collection)
        {
            CreateDistributionModel model=new CreateDistributionModel();
            ResultModel resultModel=new ResultModel();
            this.TryUpdateModel(model,collection);

            CheckDistributionAmount(model);

            if(ModelState.IsValid) {

                // Attempt to create cash distribution.

                CapitalDistribution distribution=new CapitalDistribution();
                CapitalDistributionLineItem item;
                distribution.CapitalDistributionDate=model.CapitalDistributionDate;
                distribution.CapitalDistributionDueDate=model.CapitalDistributionDueDate;

                distribution.PreferredReturn=model.PreferredReturn;
                distribution.ReturnManagementFees=model.ReturnManagementFees;
                distribution.ReturnFundExpenses=model.ReturnFundExpenses;
                distribution.PreferredCatchUp=model.PreferredCatchUp;
                distribution.Profits=model.GPProfits;
                distribution.LPProfits=model.LPProfits;

                distribution.CreatedBy=Authentication.CurrentUser.UserID;
                distribution.CreatedDate=DateTime.Now;
                distribution.LastUpdatedBy=Authentication.CurrentUser.UserID;
                distribution.LastUpdatedDate=DateTime.Now;
                distribution.DistributionAmount=model.DistributionAmount;
                distribution.DistributionNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallDistributionNumber(model.FundId));
                distribution.FundID=model.FundId;
                distribution.CapitalReturn=model.CapitalReturn;
                distribution.IsManual=true;

                int index;

                for(index=1;index<model.InvestorCount+1;index++) {
                    // Attempt to create cash distribution of each investor.

                    item=new CapitalDistributionLineItem();
                    item.CapitalReturn=0;
                    item.CreatedBy=Authentication.CurrentUser.UserID;
                    item.CreatedDate=DateTime.Now;
                    item.LastUpdatedBy=Authentication.CurrentUser.UserID;
                    item.LastUpdatedDate=DateTime.Now;
                    item.InvestorID=DataTypeHelper.ToInt32(collection[index.ToString()+"_"+"InvestorId"]);
                    item.DistributionAmount=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"DistributionAmount"]);
                    item.ReturnManagementFees=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"ReturnManagementFees"]);
                    item.ReturnFundExpenses=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"ReturnFundExpenses"]);
                    item.Profits=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"GPProfits"]);
                    item.PreferredReturn=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"PreferredReturn"]);
                    if(item.InvestorID>0) {
                        distribution.CapitalDistributionLineItems.Add(item);
                    }
                }
                if(distribution.CapitalDistributionLineItems.Count==0) {
                    ModelState.AddModelError("InvestorCount","Select any one investor");
                } else {
                    IEnumerable<ErrorInfo> errorInfo=CapitalCallRepository.SaveCapitalDistribution(distribution);
                    resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                    if(string.IsNullOrEmpty(resultModel.Result)) {
                        resultModel.Result+="True||"+(CapitalCallRepository.FindCapitalCallDistributionNumber(model.FundId));
                    }
                }
            }
            if(ModelState.IsValid==false) {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return View("Result",resultModel);
        }
        public ActionResult CreateReceiveCapitalCall(FormCollection collection)
        {
            CreateReceiveModel model=new CreateReceiveModel();
            ResultModel resultModel=new ResultModel();
            this.TryUpdateModel(model);
            if(ModelState.IsValid) {

                // Attempt to create receive capital call.

                Models.Entity.CapitalCall capitalCall=CapitalCallRepository.FindCapitalCall(model.CapitalCallId);
                if(capitalCall!=null) {
                    CapitalCallLineItem item;
                    capitalCall.CapitalAmountCalled=model.CapitalAmountCalled;
                    capitalCall.CapitalCallDate=model.CapitalCallDate;
                    capitalCall.CapitalCallDueDate=model.CapitalCallDueDate;
                    capitalCall.LastUpdatedBy=Authentication.CurrentUser.UserID;
                    capitalCall.LastUpdatedDate=DateTime.Now;
                    int index;
                    for(index=1;index<model.ItemCount+1;index++) {
                        item=capitalCall.CapitalCallLineItems.SingleOrDefault(capitalCallItem => capitalCallItem.CapitalCallLineItemID==Convert.ToInt32(collection[index.ToString()+"_"+"CapitalCallLineItemId"]));
                        if(item!=null) {
                            item.LastUpdatedBy=Authentication.CurrentUser.UserID;
                            item.LastUpdatedDate=DateTime.Now;
                            if(string.IsNullOrEmpty(collection[index.ToString()+"_"+"CapitalAmountCalled"])==false) {
                                item.CapitalAmountCalled=Convert.ToDecimal(collection[index.ToString()+"_"+"CapitalAmountCalled"]);
                            }
                            if(string.IsNullOrEmpty(collection[index.ToString()+"_"+"ManagementFees"])==false) {
                                item.ManagementFees=Convert.ToDecimal(collection[index.ToString()+"_"+"ManagementFees"]);
                            }
                            if(string.IsNullOrEmpty(collection[index.ToString()+"_"+"InvestmentAmount"])==false) {
                                item.InvestmentAmount=Convert.ToDecimal(collection[index.ToString()+"_"+"InvestmentAmount"]);
                            }
                            if(string.IsNullOrEmpty(collection[index.ToString()+"_"+"InvestedAmountInterest"])==false) {
                                item.InvestedAmountInterest=Convert.ToDecimal(collection[index.ToString()+"_"+"InvestedAmountInterest"]);
                            }
                            if(string.IsNullOrEmpty(collection[index.ToString()+"_"+"ManagementFeeInterest"])==false) {
                                item.ManagementFeeInterest=Convert.ToDecimal(collection[index.ToString()+"_"+"ManagementFeeInterest"]);
                            }
                            if(string.IsNullOrEmpty(collection[index.ToString()+"_"+"Received"])==false) {
                                if(collection[index.ToString()+"_"+"Received"].Contains("true")) {
                                    if(string.IsNullOrEmpty(collection[index.ToString()+"_"+"ReceivedDate"])==false) {
                                        item.ReceivedDate=Convert.ToDateTime(collection[index.ToString()+"_"+"ReceivedDate"]);
                                    }
                                } else {
                                    item.ReceivedDate=null;
                                }
                            }
                            if((item.ReceivedDate??Convert.ToDateTime("01/01/1900")).Year<=1900) {
                                item.ReceivedDate=null;
                            }
                        }
                    }
                    IEnumerable<ErrorInfo> errorInfo=CapitalCallRepository.SaveCapitalCall(capitalCall);
                    resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                }
            }
            if(ModelState.IsValid==false) {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return View("Result",resultModel);
        }
        public ActionResult CreateDistribution(FormCollection collection)
        {
            CreateDistributionModel model=new CreateDistributionModel();
            ResultModel resultModel=new ResultModel();
            this.TryUpdateModel(model,collection);

            CheckDistributionAmount(model);

            if(ModelState.IsValid) {

                // Attempt to create cash distribution.

                CapitalDistribution distribution=new CapitalDistribution();
                CapitalDistributionLineItem item;
                distribution.CapitalDistributionDate=model.CapitalDistributionDate;
                distribution.CapitalDistributionDueDate=model.CapitalDistributionDueDate;

                distribution.CapitalReturn=model.CapitalReturn;
                distribution.PreferredReturn=model.PreferredReturn;
                distribution.ReturnManagementFees=model.ReturnManagementFees;
                distribution.ReturnFundExpenses=model.ReturnFundExpenses;
                distribution.PreferredCatchUp=model.PreferredCatchUp;
                distribution.Profits=model.GPProfits;
                distribution.LPProfits=model.LPProfits;

                distribution.CreatedBy=Authentication.CurrentUser.UserID;
                distribution.CreatedDate=DateTime.Now;
                distribution.LastUpdatedBy=Authentication.CurrentUser.UserID;
                distribution.LastUpdatedDate=DateTime.Now;
                distribution.DistributionAmount=model.DistributionAmount;
                distribution.DistributionNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallDistributionNumber(model.FundId));
                distribution.FundID=model.FundId;
                distribution.IsManual=false;

                // Get all investor funds.
                List<InvestorFund> investorFunds=CapitalCallRepository.GetAllInvestorFunds(distribution.FundID);

                if(investorFunds!=null) {

                    // Find non managing member total commitment.
                    decimal nonManagingMemberTotalCommitment=investorFunds.Where(fund => fund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.NonManagingMember).Sum(fund => fund.TotalCommitment);
                    // Find managing member total commitment.
                    decimal managingMemberTotalCommitment=investorFunds.Where(fund => fund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.ManagingMember).Sum(fund => fund.TotalCommitment);
                    // Find total commitment.
                    decimal totalCommitment=nonManagingMemberTotalCommitment+managingMemberTotalCommitment;

                    foreach(var investorFund in investorFunds) {

                        // Attempt to create cash distribution of each investor.

                        item=new CapitalDistributionLineItem();

                        item.CreatedBy=Authentication.CurrentUser.UserID;
                        item.CreatedDate=DateTime.Now;
                        item.LastUpdatedBy=Authentication.CurrentUser.UserID;
                        item.LastUpdatedDate=DateTime.Now;
                        item.InvestorID=investorFund.InvestorID;

                        item.CapitalReturn=decimal.Multiply((distribution.CapitalReturn??0),
                                                                decimal.Divide(investorFund.TotalCommitment,totalCommitment)
                                                                );

                        item.PreferredReturn=decimal.Multiply((distribution.PreferredReturn??0),
                                                                decimal.Divide(investorFund.TotalCommitment,totalCommitment)
                                                                );

                        // Non ManagingMember investor type only
                        if(investorFund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.NonManagingMember) {
                            item.ReturnManagementFees=decimal.Multiply((distribution.ReturnManagementFees??0),
                                                                         decimal.Divide(investorFund.TotalCommitment,nonManagingMemberTotalCommitment)
                                                                        );
                        }

                        item.ReturnFundExpenses=decimal.Multiply((distribution.ReturnFundExpenses??0),
                                                                decimal.Divide(investorFund.TotalCommitment,totalCommitment)
                                                                );

                        // ManagingMember investor type only
                        if(investorFund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.ManagingMember) {
                            item.PreferredCatchUp=distribution.PreferredCatchUp;
                        }

                        // ManagingMember investor type only
                        if(investorFund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.ManagingMember) {
                            item.Profits=distribution.Profits;
                        }

                        item.LPProfits=decimal.Multiply((distribution.LPProfits??0),
                                                        decimal.Divide(investorFund.TotalCommitment,totalCommitment)
                                                        );

                        // Calculate distribution amount of each investor.
                        item.DistributionAmount=(item.CapitalReturn??0)
                                                    +(item.PreferredReturn??0)
                                                    +(item.ReturnManagementFees??0)
                                                    +(item.ReturnFundExpenses??0)
                                                    +(item.PreferredCatchUp??0)
                                                    +(item.Profits??0)
                                                    +(item.LPProfits??0)
                                                    ;
                        distribution.CapitalDistributionLineItems.Add(item);
                    }
                }
                IEnumerable<ErrorInfo> errorInfo=CapitalCallRepository.SaveCapitalDistribution(distribution);
                resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                if(string.IsNullOrEmpty(resultModel.Result)) {
                    resultModel.Result+="True||"+(CapitalCallRepository.FindCapitalCallDistributionNumber(model.FundId))+"||"+distribution.CapitalDistributionID;
                }
            }
            if(ModelState.IsValid==false) {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return View("Result",resultModel);
        }
        public ActionResult CreateManualCapitalCall(FormCollection collection)
        {
            CreateCapitalCallModel model=new CreateCapitalCallModel();
            ResultModel resultModel=new ResultModel();
            List<InvestorFund> investorFunds=new List<InvestorFund>();
            this.TryUpdateModel(model,collection);
            if(ModelState.IsValid) {

                // Attempt to create manual capital call.

                Models.Entity.CapitalCall capitalCall=new Models.Entity.CapitalCall();
                CapitalCallLineItem item;

                capitalCall.CapitalAmountCalled=model.CapitalAmountCalled;
                capitalCall.CapitalCallDate=model.CapitalCallDate;
                capitalCall.CapitalCallDueDate=model.CapitalCallDueDate;
                capitalCall.CapitalCallTypeID=(int)Models.CapitalCall.Enums.CapitalCallType.Manual;
                capitalCall.CreatedBy=Authentication.CurrentUser.UserID;
                capitalCall.CreatedDate=DateTime.Now;
                capitalCall.LastUpdatedBy=Authentication.CurrentUser.UserID;
                capitalCall.LastUpdatedDate=DateTime.Now;
                capitalCall.ExistingInvestmentAmount=model.ExistingInvestmentAmount??0;
                capitalCall.NewInvestmentAmount=model.NewInvestmentAmount;
                capitalCall.FundID=model.FundId;
                capitalCall.InvestmentAmount=model.InvestedAmount??0;
                capitalCall.InvestedAmountInterest=model.InvestedAmountInterest??0;
                capitalCall.FundExpenses=model.FundExpenses??0;
                capitalCall.ManagementFees=model.ManagementFees??0;
                capitalCall.ManagementFeeInterest=model.ManagementFeeInterest??0;
                capitalCall.CapitalCallNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallNumber(model.FundId));
                int index;
                for(index=1;index<model.InvestorCount+1;index++) {
                    item=new CapitalCallLineItem();
                    item.CreatedBy=Authentication.CurrentUser.UserID;
                    item.CreatedDate=DateTime.Now;
                    item.LastUpdatedBy=Authentication.CurrentUser.UserID;
                    item.LastUpdatedDate=DateTime.Now;
                    item.CapitalAmountCalled=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"CapitalAmountCalled"]);
                    item.ManagementFeeInterest=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"ManagementFeeInterest"]);
                    item.InvestedAmountInterest=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"InvestedAmountInterest"]);
                    item.ManagementFees=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"ManagementFees"]);
                    item.FundExpenses=DataTypeHelper.ToDecimal(collection[index.ToString()+"_"+"FundExpenses"]);
                    item.InvestorID=DataTypeHelper.ToInt32(collection[index.ToString()+"_"+"InvestorId"]);
                    if(item.InvestorID>0) {
                        InvestorFund investorFund=InvestorRepository.FindInvestorFund(item.InvestorID,capitalCall.FundID);
                        if(investorFund!=null) {
                            // Reduce investor unfunded amount = investor unfunded amount – capital call amount for investor.
                            investorFund.UnfundedAmount=investorFund.UnfundedAmount-item.CapitalAmountCalled;
                            investorFunds.Add(investorFund);
                        }
                        capitalCall.CapitalCallLineItems.Add(item);
                    }
                }
                if(capitalCall.CapitalCallLineItems.Count==0) {
                    ModelState.AddModelError("InvestorCount","Select any one investor");
                } else {
                    IEnumerable<ErrorInfo> errorInfo=CapitalCallRepository.SaveCapitalCall(capitalCall);
                    if(errorInfo!=null) {
                        resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                    } else {
                        foreach(var investorFund in investorFunds) {
                            errorInfo=InvestorRepository.SaveInvestorFund(investorFund);
                            resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                        }
                    }
                    if(string.IsNullOrEmpty(resultModel.Result)) {
                        resultModel.Result+="True||"+(CapitalCallRepository.FindCapitalCallNumber(model.FundId));
                    }
                }
            }
            if(ModelState.IsValid==false) {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return View("Result",resultModel);
        }
        public ActionResult UpdateCapitalCall(FormCollection collection)
        {
            CreateCapitalCallModel model=new CreateCapitalCallModel();
            ResultModel resultModel=new ResultModel();
            IEnumerable<ErrorInfo> errorInfo=null;
            this.TryUpdateModel(model,collection);
            if((model.CapitalCallID??0)==0) {
                ModelState.AddModelError("CapitalCallID","CapitalCallID is required");
            }
            if((model.AddManagementFees??false)==true) {
                DateTime fromDate=(model.FromDate??Convert.ToDateTime("01/01/1900"));
                DateTime toDate=(model.ToDate??Convert.ToDateTime("01/01/1900"));
                if(fromDate.Year<=1900)
                    ModelState.AddModelError("FromDate","From Date is required");
                if(toDate.Year<=1900)
                    ModelState.AddModelError("ToDate","To Date is required");
                if(fromDate.Year>1900&&toDate.Year>1900) {
                    if(fromDate.Subtract(toDate).Days>=0) {
                        ModelState.AddModelError("ToDate","To Date must be greater than From Date");
                    }
                }
                if((model.ManagementFees??0)<=1) {
                    ModelState.AddModelError("ManagementFees","Fee Amount is required");
                }
            }
            if(ModelState.IsValid) {

                // Attempt to update capital call.

                Models.Entity.CapitalCall capitalCall=CapitalCallRepository.FindCapitalCall((model.CapitalCallID??0));

                if(capitalCall!=null) {

                    capitalCall.CapitalAmountCalled=model.CapitalAmountCalled;
                    capitalCall.CapitalCallDate=model.CapitalCallDate;
                    capitalCall.CapitalCallDueDate=model.CapitalCallDueDate;
                    capitalCall.CapitalCallTypeID=(int)Models.CapitalCall.Enums.CapitalCallType.Reqular;
                    capitalCall.LastUpdatedBy=Authentication.CurrentUser.UserID;
                    capitalCall.LastUpdatedDate=DateTime.Now;
                    capitalCall.NewInvestmentAmount=model.NewInvestmentAmount;
                    capitalCall.FundID=model.FundId;

                    if((model.AddFundExpenses??false)==true) {
                        capitalCall.FundExpenses=model.FundExpenseAmount??0;
                    } else {
                        capitalCall.FundExpenses=0;
                    }

                    if((model.AddManagementFees??false)==true) {
                        capitalCall.ManagementFeeStartDate=model.FromDate;
                        capitalCall.ManagementFeeEndDate=model.ToDate;
                        capitalCall.ManagementFees=model.ManagementFees;
                    } else {
                        capitalCall.ManagementFees=0;
                    }

                    // Check new investment amount and existing investment amount.

                    decimal investmentAmount=(capitalCall.NewInvestmentAmount??0)+(capitalCall.ExistingInvestmentAmount??0);
                    decimal capitalAmount=(capitalCall.CapitalAmountCalled)-(capitalCall.ManagementFees??0)-(capitalCall.FundExpenses??0);

                    if(((decimal.Round(investmentAmount)==decimal.Round(capitalAmount))==false)) {
                        ModelState.AddModelError("NewInvestmentAmount","(New Investment Amount + Existing Investment Amount) should be equal to (Capital Amount - Management Fees - Fund Expenses).");
                    } else {

                        errorInfo=CapitalCallRepository.SaveCapitalCall(capitalCall);
                        resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);

                        // Attempt to update capital call line item for each investor fund.
                        int rowIndex;
                        FormCollection rowCollection;
                        CapitalCallLineItemModel itemModel=null;

                        if(string.IsNullOrEmpty(resultModel.Result)) {
                            for(rowIndex=0;rowIndex<model.CapitalCallLineItemsCount;rowIndex++) {
                                rowCollection=FormCollectionHelper.GetFormCollection(collection,rowIndex,typeof(CapitalCallLineItemModel),"_");
                                itemModel=new CapitalCallLineItemModel();
                                this.TryUpdateModel(itemModel,rowCollection);
                                errorInfo=ValidationHelper.Validate(itemModel);
                                resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                                if(string.IsNullOrEmpty(resultModel.Result)) {
                                    CapitalCallLineItem capitalCallLineItem=CapitalCallRepository.FindCapitalCallLineItem(itemModel.CapitalCallLineItemID);
                                    if(capitalCallLineItem!=null) {
                                        capitalCallLineItem.LastUpdatedBy=Authentication.CurrentUser.UserID;
                                        capitalCallLineItem.LastUpdatedDate=DateTime.Now;

                                        capitalCallLineItem.CapitalAmountCalled=itemModel.CapitalAmountCalled;
                                        capitalCallLineItem.FundExpenses=itemModel.FundExpenses;
                                        capitalCallLineItem.ManagementFees=itemModel.ManagementFees;
                                        capitalCallLineItem.NewInvestmentAmount=itemModel.NewInvestmentAmount;

                                        errorInfo=CapitalCallRepository.SaveCapitalCallLineItem(capitalCallLineItem);

                                        resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                                    }
                                } else {
                                    break;
                                }
                            }

                        }

                        if(string.IsNullOrEmpty(resultModel.Result)) {
                            resultModel.Result+="True";
                        }
                    }
                }
            }
            if(ModelState.IsValid==false) {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return View("Result",resultModel);
        }
        public ActionResult UpdateDistribution(FormCollection collection)
        {
            CreateDistributionModel model=new CreateDistributionModel();
            ResultModel resultModel=new ResultModel();
            IEnumerable<ErrorInfo> errorInfo=null;
            this.TryUpdateModel(model,collection);
            if((model.CapitalDistributionID??0)==0) {
                ModelState.AddModelError("CapitalDistributionID","CapitalDistributionID is required");
            }
            CheckDistributionAmount(model);
            if(ModelState.IsValid) {

                // Attempt to create cash distribution.

                CapitalDistribution distribution=CapitalCallRepository.FindCapitalDistribution((model.CapitalDistributionID??0));

                if(distribution!=null) {
                    distribution.CapitalDistributionDate=model.CapitalDistributionDate;
                    distribution.CapitalDistributionDueDate=model.CapitalDistributionDueDate;

                    distribution.CapitalReturn=model.CapitalReturn;
                    distribution.PreferredReturn=model.PreferredReturn;
                    distribution.ReturnManagementFees=model.ReturnManagementFees;
                    distribution.ReturnFundExpenses=model.ReturnFundExpenses;
                    distribution.PreferredCatchUp=model.PreferredCatchUp;
                    distribution.Profits=model.GPProfits;
                    distribution.LPProfits=model.LPProfits;
                    distribution.LastUpdatedBy=Authentication.CurrentUser.UserID;
                    distribution.LastUpdatedDate=DateTime.Now;
                    distribution.DistributionAmount=model.DistributionAmount;

                    errorInfo=CapitalCallRepository.SaveCapitalDistribution(distribution);
                    resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);

                    // Attempt to update capital call line item for each investor fund.
                    int rowIndex;
                    FormCollection rowCollection;
                    CapitalDistributionLineItemModel itemModel=null;

                    if(string.IsNullOrEmpty(resultModel.Result)) {
                        for(rowIndex=0;rowIndex<model.CapitalDistributionLineItemsCount;rowIndex++) {
                            rowCollection=FormCollectionHelper.GetFormCollection(collection,rowIndex,typeof(CapitalDistributionLineItemModel),"_");
                            itemModel=new CapitalDistributionLineItemModel();
                            this.TryUpdateModel(itemModel,rowCollection);
                            errorInfo=ValidationHelper.Validate(itemModel);
                            resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                            if(string.IsNullOrEmpty(resultModel.Result)) {

                                // Attempt to create cash distribution of each investor.

                                CapitalDistributionLineItem capitalDistributionLineItem=CapitalCallRepository.FindCapitalDistributionLineItem(itemModel.CapitalDistributionLineItemID);
                                if(capitalDistributionLineItem!=null) {

                                    capitalDistributionLineItem.LastUpdatedBy=Authentication.CurrentUser.UserID;
                                    capitalDistributionLineItem.LastUpdatedDate=DateTime.Now;

                                    capitalDistributionLineItem.CapitalReturn=itemModel.CapitalReturn;
                                    capitalDistributionLineItem.PreferredReturn=itemModel.PreferredReturn;
                                    capitalDistributionLineItem.ReturnManagementFees=itemModel.ReturnManagementFees;
                                    capitalDistributionLineItem.ReturnFundExpenses=itemModel.ReturnFundExpenses;
                                    capitalDistributionLineItem.PreferredCatchUp=itemModel.PreferredCatchUp;
                                    capitalDistributionLineItem.Profits=itemModel.Profits;
                                    capitalDistributionLineItem.LPProfits=itemModel.LPProfits;
                                    capitalDistributionLineItem.DistributionAmount=itemModel.DistributionAmount;

                                    errorInfo=CapitalCallRepository.SaveCapitalDistributionLineItem(capitalDistributionLineItem);
                                    resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                                } else {
                                    break;
                                }
                            }

                        }

                        if(string.IsNullOrEmpty(resultModel.Result)) {
                            resultModel.Result+="True";
                        }
                    }

                }
            }
            if(ModelState.IsValid==false) {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return View("Result",resultModel);
        }
 public ActionResult ImportManualDistributionLineItem(FormCollection collection)
 {
     CapitalDistributionLineItem item=new CapitalDistributionLineItem();
     ResultModel resultModel=new ResultModel();
     this.TryUpdateModel(item,collection);
     item.CreatedBy=Authentication.CurrentUser.UserID;
     item.CreatedDate=DateTime.Now;
     item.LastUpdatedBy=Authentication.CurrentUser.UserID;
     item.LastUpdatedDate=DateTime.Now;
     IEnumerable<ErrorInfo> errorInfo=ValidationHelper.Validate(item);
     if(errorInfo.Any()==false) {
         // Attempt to create cash distribution of each investor.
         errorInfo=CapitalCallRepository.SaveCapitalDistributionLineItem(item);
         resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
         if(string.IsNullOrEmpty(resultModel.Result)) {
             resultModel.Result+="True||"+item.CapitalDistributionLineItemID;
         }
     } else {
         resultModel.Result=ValidationHelper.GetErrorInfo(errorInfo);
     }
     return View("Result",resultModel);
 }
 public ActionResult ImportManualDistribution(FormCollection collection)
 {
     CapitalDistribution distribution=new CapitalDistribution();
     ResultModel resultModel=new ResultModel();
     this.TryUpdateModel(distribution,collection);
     distribution.DistributionNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallDistributionNumber(distribution.FundID));
     distribution.CreatedBy=Authentication.CurrentUser.UserID;
     distribution.CreatedDate=DateTime.Now;
     distribution.LastUpdatedBy=Authentication.CurrentUser.UserID;
     distribution.LastUpdatedDate=DateTime.Now;
     IEnumerable<ErrorInfo> errorInfo=ValidationHelper.Validate(distribution);
     if(errorInfo.Any()==false) {
         // Attempt to create cash distribution.
         errorInfo=CapitalCallRepository.SaveCapitalDistribution(distribution);
         resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
         if(string.IsNullOrEmpty(resultModel.Result)) {
             resultModel.Result+="True||"+distribution.CapitalDistributionID;
         }
     } else {
         resultModel.Result=ValidationHelper.GetErrorInfo(errorInfo);
     }
     return View("Result",resultModel);
 }
        public ActionResult Create(FormCollection collection)
        {
            CreateCapitalCallModel model=new CreateCapitalCallModel();
            ResultModel resultModel=new ResultModel();
            this.TryUpdateModel(model,collection);
            if((model.AddManagementFees??false)==true) {
                DateTime fromDate=(model.FromDate??Convert.ToDateTime("01/01/1900"));
                DateTime toDate=(model.ToDate??Convert.ToDateTime("01/01/1900"));
                if(fromDate.Year<=1900)
                    ModelState.AddModelError("FromDate","From Date is required");
                if(toDate.Year<=1900)
                    ModelState.AddModelError("ToDate","To Date is required");
                if(fromDate.Year>1900&&toDate.Year>1900) {
                    if(fromDate.Subtract(toDate).Days>=0) {
                        ModelState.AddModelError("ToDate","To Date must be greater than From Date");
                    }
                }
                if((model.ManagementFees??0)<=1) {
                    ModelState.AddModelError("ManagementFees","Fee Amount is required");
                }
            }
            if(ModelState.IsValid) {

                // Attempt to create capital call.

                Models.Entity.CapitalCall capitalCall=new Models.Entity.CapitalCall();
                CapitalCallLineItem item;

                capitalCall.CapitalAmountCalled=model.CapitalAmountCalled;
                capitalCall.CapitalCallDate=model.CapitalCallDate;
                capitalCall.CapitalCallDueDate=model.CapitalCallDueDate;
                capitalCall.CapitalCallNumber=string.Empty;
                capitalCall.CapitalCallTypeID=(int)Models.CapitalCall.Enums.CapitalCallType.Reqular;
                capitalCall.CreatedBy=Authentication.CurrentUser.UserID;
                capitalCall.CreatedDate=DateTime.Now;
                capitalCall.LastUpdatedBy=Authentication.CurrentUser.UserID;
                capitalCall.LastUpdatedDate=DateTime.Now;
                capitalCall.ExistingInvestmentAmount=model.ExistingInvestmentAmount??0;
                capitalCall.NewInvestmentAmount=model.NewInvestmentAmount;
                capitalCall.FundID=model.FundId;
                capitalCall.CapitalCallNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallNumber(model.FundId));
                capitalCall.InvestmentAmount=(capitalCall.NewInvestmentAmount??0)+(capitalCall.ExistingInvestmentAmount??0);

                List<InvestorFund> investorFunds=CapitalCallRepository.GetAllInvestorFunds(capitalCall.FundID);

                if(investorFunds!=null) {

                    // Find non managing total commitment.
                    decimal nonManagingMemberTotalCommitment=investorFunds.Where(fund => fund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.NonManagingMember).Sum(fund => fund.TotalCommitment);
                    // Find managing total commitment.
                    decimal managingMemberTotalCommitment=investorFunds.Where(fund => fund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.ManagingMember).Sum(fund => fund.TotalCommitment);
                    // Calculate managing total commitment.
                    decimal totalCommitment=nonManagingMemberTotalCommitment+managingMemberTotalCommitment;

                    if((model.AddFundExpenses??false)==true) {
                        capitalCall.FundExpenses=model.FundExpenseAmount??0;
                    } else {
                        capitalCall.FundExpenses=0;
                    }

                    if((model.AddManagementFees??false)==true) {
                        capitalCall.ManagementFeeStartDate=model.FromDate;
                        capitalCall.ManagementFeeEndDate=model.ToDate;
                        capitalCall.ManagementFees=model.ManagementFees;
                    } else {
                        capitalCall.ManagementFees=0;
                    }

                    // Check new investment amount and existing investment amount.

                    decimal investmentAmount=(capitalCall.NewInvestmentAmount??0)+(capitalCall.ExistingInvestmentAmount??0);
                    decimal capitalAmount=capitalCall.CapitalAmountCalled-(capitalCall.ManagementFees??0)-(capitalCall.FundExpenses??0);

                    if(((decimal.Round(investmentAmount)==decimal.Round(capitalAmount))==false)) {
                        ModelState.AddModelError("NewInvestmentAmount","(New Investment Amount + Existing Investment Amount) should be equal to (Capital Amount - Management Fees - Fund Expenses).");
                    } else {
                        foreach(var investorFund in investorFunds) {

                            // Attempt to create capital call line item for each investor fund.

                            item=new CapitalCallLineItem();

                            item.CreatedBy=Authentication.CurrentUser.UserID;
                            item.CreatedDate=DateTime.Now;
                            item.LastUpdatedBy=Authentication.CurrentUser.UserID;
                            item.LastUpdatedDate=DateTime.Now;

                            // Calculate Management Fees investor fund

                            if((model.AddManagementFees??false)==true) {
                                if(investorFund.InvestorTypeID==(int)DeepBlue.Models.Investor.Enums.InvestorType.NonManagingMember) {
                                    item.ManagementFees=decimal.Multiply(
                                                            decimal.Divide(investorFund.TotalCommitment,nonManagingMemberTotalCommitment)
                                                            ,(capitalCall.ManagementFees??0));
                                }
                            }

                            // Calculate Fund Expense for investor fund

                            if((model.AddFundExpenses??false)==true) {
                                item.FundExpenses=decimal.Multiply(
                                                    decimal.Divide(investorFund.TotalCommitment,totalCommitment)
                                                    ,(capitalCall.FundExpenses??0));
                            }

                            // Calculate Capital Amount for investor fund

                            item.CapitalAmountCalled=CalculateCapitalAmountCalled(investorFund.TotalCommitment,
                                totalCommitment,
                                nonManagingMemberTotalCommitment,
                                capitalCall.CapitalAmountCalled,
                                (capitalCall.ManagementFees??0),
                                (DeepBlue.Models.Investor.Enums.InvestorType)investorFund.InvestorTypeID);

                            item.ExistingInvestmentAmount=(investorFund.TotalCommitment/totalCommitment)*capitalCall.ExistingInvestmentAmount;
                            item.NewInvestmentAmount=(investorFund.TotalCommitment/totalCommitment)*capitalCall.NewInvestmentAmount;
                            item.InvestmentAmount=(investorFund.TotalCommitment/totalCommitment)*capitalCall.InvestmentAmount;
                            item.InvestorID=investorFund.InvestorID;

                            // Reduce investor unfunded amount = investor unfunded amount - (capital call amount + management fees + fund expenses).

                            investorFund.UnfundedAmount=decimal.Subtract((investorFund.UnfundedAmount??0)
                                                                           ,
                                                                           decimal.Add(item.CapitalAmountCalled,
                                                                                       decimal.Add(
                                                                                                    (item.ManagementFees??0)
                                                                                                    ,(item.FundExpenses??0))
                                                                                                    )
                                                                           );

                            capitalCall.CapitalCallLineItems.Add(item);
                        }
                        IEnumerable<ErrorInfo> errorInfo=CapitalCallRepository.SaveCapitalCall(capitalCall);
                        if(errorInfo!=null) {
                            resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                        } else {
                            foreach(var investorFund in investorFunds) {
                                errorInfo=InvestorRepository.SaveInvestorFund(investorFund);
                                resultModel.Result+=ValidationHelper.GetErrorInfo(errorInfo);
                            }
                        }
                        if(string.IsNullOrEmpty(resultModel.Result)) {
                            resultModel.Result+="True||"+(CapitalCallRepository.FindCapitalCallNumber(model.FundId))+"||"+capitalCall.CapitalCallID;
                        }
                    }
                }
            }
            if(ModelState.IsValid==false) {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return View("Result",resultModel);
        }
        public ActionResult ImportCapitalDistributionExcel(FormCollection collection)
        {
            ImportManualCapitalDistributionExcelModel model=new ImportManualCapitalDistributionExcelModel();
            ResultModel resultModel=new ResultModel();
            MemoryCacheManager cacheManager=new MemoryCacheManager();
            int totalPages=0;
            int totalRows=0;
            int completedRows=0;
            int? succssRows=0;
            int? errorRows=0;
            this.TryUpdateModel(model);
            if(ModelState.IsValid) {
                string key=string.Format(EXCELCAPITALCALLERROR_BY_KEY,model.SessionKey);
                List<DeepBlue.Models.Deal.ImportExcelError> errors=cacheManager.Get(key,() => {
                    return new List<DeepBlue.Models.Deal.ImportExcelError>();
                });
                DataSet ds=ExcelConnection.ImportExcelDataset(model.SessionKey);
                if(ds!=null) {
                    PagingDataTable importExcelTable=null;
                    if(ds.Tables[model.ManualCapitalDistributionTableName]!=null) {
                        importExcelTable=(PagingDataTable)ds.Tables[model.ManualCapitalDistributionTableName];
                    }
                    if(importExcelTable!=null) {
                        importExcelTable.PageSize=model.PageSize;
                        PagingDataTable table=importExcelTable.Skip(model.PageIndex);
                        totalPages=importExcelTable.TotalPages;
                        totalRows=importExcelTable.TotalRows;
                        if(totalPages>model.PageIndex) {
                            completedRows=(model.PageIndex*importExcelTable.PageSize);
                        } else {
                            completedRows=totalRows;
                        }

                        int rowNumber=0;

                        string investorName=string.Empty;
                        string fundName=string.Empty;
                        decimal capitalDistributionAmount=0;
                        decimal returnManagementFees=0;
                        decimal returnFundExpenses=0;
                        decimal costReturned=0;
                        decimal profits=0;
                        decimal profitsReturned=0;
                        DateTime distributionDate;
                        DateTime distributionDueDate;

                        DeepBlue.Models.Deal.ImportExcelError error;
                        DeepBlue.Models.Entity.Investor investor;
                        DeepBlue.Models.Entity.Fund fund;
                        DeepBlue.Models.Entity.InvestorFund investorFund;

                        EmailAttribute emailValidation=new EmailAttribute();
                        ZipAttribute zipAttribute=new ZipAttribute();
                        WebAddressAttribute webAttribute=new WebAddressAttribute();
                        IEnumerable<ErrorInfo> errorInfo;

                        StringBuilder rowErrors;
                        foreach(DataRow row in table.Rows) {
                            int.TryParse(row.GetValue("RowNumber"),out rowNumber);

                            error=new DeepBlue.Models.Deal.ImportExcelError { RowNumber=rowNumber };
                            rowErrors=new StringBuilder();

                            investorName=row.GetValue(model.InvestorName);
                            fundName=row.GetValue(model.FundName);
                            decimal.TryParse(row.GetValue(model.CapitalDistributionAmount),out capitalDistributionAmount);
                            decimal.TryParse(row.GetValue(model.ReturnManagementFees),out returnManagementFees);
                            decimal.TryParse(row.GetValue(model.ReturnFundExpenses),out returnFundExpenses);
                            decimal.TryParse(row.GetValue(model.CostReturned),out costReturned);
                            decimal.TryParse(row.GetValue(model.Profits),out profits);
                            decimal.TryParse(row.GetValue(model.ProfitsReturned),out profitsReturned);
                            DateTime.TryParse(row.GetValue(model.DistributionDate),out distributionDate);
                            DateTime.TryParse(row.GetValue(model.DistributionDueDate),out distributionDueDate);

                            investor=null;
                            fund=null;
                            investorFund=null;

                            if(string.IsNullOrEmpty(investorName)==false) {
                                investor=InvestorRepository.FindInvestor(investorName);
                            } else {
                                error.Errors.Add(new ErrorInfo(model.InvestorName,"Investor is required"));
                            }

                            if(string.IsNullOrEmpty(fundName)==false) {
                                fund=FundRepository.FindFund(fundName);
                            } else {
                                error.Errors.Add(new ErrorInfo(model.InvestorName,"Fund is required"));
                            }

                            if(investor!=null&&fund!=null) {
                                investorFund=InvestorRepository.FindInvestorFund(investor.InvestorID,fund.FundID);
                            }

                            if(error.Errors.Count()==0) {
                                if(investorFund==null) {
                                    error.Errors.Add(new ErrorInfo(model.InvestorName,"Investror Commitment does not exist"));
                                }
                            }

                            if(error.Errors.Count()==0) {

                                Models.Entity.CapitalDistribution distribution=CapitalCallRepository.FindCapitalDistribution(
                                    (fund!=null?fund.FundID:0),
                                           distributionDate,
                                           distributionDueDate,
                                           true);

                                if(distribution==null) {
                                    distribution=new Models.Entity.CapitalDistribution();
                                    distribution.CreatedBy=Authentication.CurrentUser.UserID;
                                    distribution.CreatedDate=DateTime.Now;
                                }

                                distribution.CapitalDistributionDate=distributionDate;
                                distribution.CapitalDistributionDueDate=distributionDueDate;

                                distribution.PreferredReturn=(distribution.PreferredReturn??0)+profitsReturned;
                                distribution.ReturnManagementFees=(distribution.ReturnManagementFees??0)+returnManagementFees;
                                distribution.ReturnFundExpenses=(distribution.ReturnFundExpenses??0)+returnFundExpenses;
                                distribution.Profits=(distribution.Profits??0)+profits;
                                distribution.DistributionAmount=distribution.DistributionAmount+capitalDistributionAmount;

                                distribution.LastUpdatedBy=Authentication.CurrentUser.UserID;
                                distribution.LastUpdatedDate=DateTime.Now;

                                distribution.DistributionNumber=Convert.ToString(CapitalCallRepository.FindCapitalCallDistributionNumber((fund!=null?fund.FundID:0)));
                                distribution.FundID=(fund!=null?fund.FundID:0);
                                distribution.CapitalReturn=(distribution.CapitalReturn??0)+costReturned;
                                distribution.IsManual=true;

                                if(error.Errors.Count()==0) {
                                    errorInfo=CapitalCallRepository.SaveCapitalDistribution(distribution);
                                    if(errorInfo!=null) {
                                        error.Errors.Add(new ErrorInfo(model.InvestorName,ValidationHelper.GetErrorInfo(errorInfo)));
                                    }
                                }

                                if(error.Errors.Count()==0) {
                                    CapitalDistributionLineItem item=CapitalCallRepository.FindCapitalDistributionLineItem(distribution.CapitalDistributionID,investor.InvestorID);
                                    if(item==null) {
                                        item=new CapitalDistributionLineItem();
                                        item.CreatedBy=Authentication.CurrentUser.UserID;
                                        item.CreatedDate=DateTime.Now;
                                    }
                                    item.CapitalReturn=0;
                                    item.CreatedBy=Authentication.CurrentUser.UserID;
                                    item.CreatedDate=DateTime.Now;
                                    item.LastUpdatedBy=Authentication.CurrentUser.UserID;
                                    item.LastUpdatedDate=DateTime.Now;
                                    item.InvestorID=(investor!=null?investor.InvestorID:0);
                                    item.DistributionAmount=capitalDistributionAmount;
                                    item.ReturnManagementFees=returnManagementFees;
                                    item.ReturnFundExpenses=returnFundExpenses;
                                    item.Profits=profits;
                                    item.PreferredReturn=profitsReturned;
                                    item.CapitalReturn=costReturned;
                                    item.CapitalDistributionID=distribution.CapitalDistributionID;
                                    errorInfo=CapitalCallRepository.SaveCapitalDistributionLineItem(item);
                                    if(errorInfo!=null) {
                                        error.Errors.Add(new ErrorInfo(model.InvestorName,ValidationHelper.GetErrorInfo(errorInfo)));
                                    }
                                }

                            }

                            StringBuilder sberror=new StringBuilder();
                            foreach(var e in error.Errors) {
                                sberror.AppendFormat("{0},",e.ErrorMessage);
                            }
                            importExcelTable.AddError(rowNumber-1,sberror.ToString());
                            errors.Add(error);
                        }
                    }
                }
                if(errors!=null) {
                    succssRows=errors.Where(e => e.Errors.Count==0).Count();
                    errorRows=errors.Where(e => e.Errors.Count>0).Count();
                }
            } else {
                foreach(var values in ModelState.Values.ToList()) {
                    foreach(var err in values.Errors.ToList()) {
                        if(string.IsNullOrEmpty(err.ErrorMessage)==false) {
                            resultModel.Result+=err.ErrorMessage+"\n";
                        }
                    }
                }
            }
            return Json(new {
                Result=resultModel.Result,
                TotalRows=totalRows,
                CompletedRows=completedRows,
                TotalPages=totalPages,
                PageIndex=model.PageIndex,
                SuccessRows=succssRows,
                ErrorRows=errorRows
            });
        }
 public ActionResult ImportCapitalCallLineItem(FormCollection collection)
 {
     CapitalCallLineItem item=new CapitalCallLineItem();
     ResultModel resultModel=new ResultModel();
     this.TryUpdateModel(item,collection);
     item.CreatedBy=Authentication.CurrentUser.UserID;
     item.CreatedDate=DateTime.Now;
     item.LastUpdatedBy=Authentication.CurrentUser.UserID;
     item.LastUpdatedDate=DateTime.Now;
     IEnumerable<ErrorInfo> errorInfo=CapitalCallRepository.SaveCapitalCallLineItem(item);
     if(errorInfo==null) {
         resultModel.Result+="True||"+item.CapitalCallLineItemID;
     } else {
         resultModel.Result=ValidationHelper.GetErrorInfo(errorInfo);
     }
     return View("Result",resultModel);
 }