public List <LeaveBalanceReportModel> GetLeaveBalanceReport(DateTime DateFrom, DateTime DateTo, int LeaveTypeID, int?DepartmentID, int?DesignationID, int?LocationID, int?EmployementTypeID) { using (dbVisionEntities db = new dbVisionEntities()) { byte RecordStatus_Deleted = (byte)eRecordState.Deleted; DateTime TodaysDate = DateTime.Now.Date; var LeaveType = db.tblLeaveTypes.Find(LeaveTypeID); if (LeaveType == null) { return(null); } Model.Payroll.eLeaveApplicableTo LeaveApplicableTo = (Model.Payroll.eLeaveApplicableTo)LeaveType.ApplicableTo; var employee = (from e in db.tblEmployees join jsd in db.tblEmployeeServiceDetails on e.EmployeeLastServiceDetailID equals jsd.EmployeeServiceDetailID into gsd from sd in gsd.DefaultIfEmpty() where e.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && e.rstate != RecordStatus_Deleted && (sd != null && ((Model.Employee.eEmployementStatus)sd.EmployeementStatus) == Model.Employee.eEmployementStatus.Active && (((Model.Employee.eEmploymentType)sd.EmploymentType) != Model.Employee.eEmploymentType.Contract || (sd.ContractExpiryDate == null || sd.ContractExpiryDate >= TodaysDate))) && (DesignationID == null || (sd != null && sd.EmployeeDesignationID == DesignationID.Value)) && (DepartmentID == null || (sd != null && sd.EmployeeDepartmentID == DepartmentID.Value)) && (LocationID == null || (sd != null && sd.LocationID == LocationID)) && (EmployementTypeID == null || (sd != null && (sd.EmploymentType == EmployementTypeID || (EmployementTypeID == 3 && (sd.EmploymentType == 1 || sd.EmploymentType == 2))))) select new { Employee = e, ServiceDetail = sd }); if (LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Male) { int genderid = (byte)Model.Employee.eGender.Male; employee = (from e in employee where e.Employee.Gender == genderid select e); } else if (LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Female) { int genderid = (byte)Model.Employee.eGender.Female; employee = (from e in employee where e.Employee.Gender == genderid select e); } decimal AnnualEntitledDays = LeaveType.AnnualEntitledDays; int MonthFrom = Model.CommonFunctions.ParseInt(DateFrom.ToString("yyyyMM")); int MonthTo = Model.CommonFunctions.ParseInt(DateTo.ToString("yyyyMM")); int FinPerFromMonth = Model.CommonFunctions.ParseInt(CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom.ToString("yyyyMM")); //int NofOpeningMonths = 0; //int NofMonths = MonthTo - MonthFrom + // (Model.CommonProperties.LoginInfo.SoftwareSettings.Employee_CurrentMonthLeaveAccumulateOn == Model.Settings.eEmployee_LeaveAccumulateOn.MonthBeginning ? 1 : 0); //NofMonths = Math.Max(NofMonths, 1); //if (FinPerFromMonth < MonthFrom) //{ // NofOpeningMonths = MonthFrom - FinPerFromMonth; //} decimal LeaveAccured = 0; if (((Model.Payroll.eLeaveTypeDistribute)LeaveType.Distribute) == Model.Payroll.eLeaveTypeDistribute.Monthly) { LeaveAccured = 0;//Math.Round((LeaveType.AnnualEntitledDays / 12) * NofMonths, 2); } else { LeaveAccured = LeaveType.AnnualEntitledDays; } //decimal OpeningLeaveAccured = 0; //if (((Model.Payroll.eLeaveTypeDistribute)LeaveType.Distribute) == Model.Payroll.eLeaveTypeDistribute.Monthly) //{ // OpeningLeaveAccured = Math.Round((LeaveType.AnnualEntitledDays / 12) * NofOpeningMonths, 2); //} var OpeningBalance = (from r2 in (from r in db.tblEmployeeLeaveOpeningBalances join e in employee on r.EmployeeID equals e.Employee.EmployeeID where r.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && r.FinPeriodID == Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.LeaveTypeID == LeaveTypeID select new { EmployeeID = r.EmployeeID, OpeningBalance = r.LeaveOpeningBalance, OpeningBalanceDate = (e.ServiceDetail.EmploymentEffectiveDate > Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom ? e.ServiceDetail.EmploymentEffectiveDate : Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom) }) where r2.OpeningBalanceDate <= DateTo select r2); var resOpeningAdjustment = (from r in db.tblLeaveAdjustments join e in employee on r.EmployeeID equals e.Employee.EmployeeID where r.CompanyID == CommonProperties.LoginInfo.LoggedInCompany.CompanyID && r.FinPeriodID == CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.LeaveAdjustmentDate < DateFrom && r.LeaveTypeID == LeaveTypeID group r by r.EmployeeID into gr select new { EmployeeID = gr.Key, OpeningLeaveAdjustment = gr.Sum(grr => grr.NofLeaves), }); var resAdjustment = (from r in db.tblLeaveAdjustments join e in employee on r.EmployeeID equals e.Employee.EmployeeID where r.CompanyID == CommonProperties.LoginInfo.LoggedInCompany.CompanyID && r.FinPeriodID == CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.LeaveAdjustmentDate >= DateFrom && r.LeaveAdjustmentDate <= DateTo && r.LeaveTypeID == LeaveTypeID group r by r.EmployeeID into gr select new { EmployeeID = gr.Key, LeaveAdjustment = gr.Sum(grr => grr.NofLeaves), }); var resOpeningLeaveTaken = (from r in db.tblLeaveApplications join e in employee on r.EmployeeID equals e.Employee.EmployeeID where r.CompanyID == CommonProperties.LoginInfo.LoggedInCompany.CompanyID && r.FinPeriodID == CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.ToDate < DateFrom && r.LeaveTypeID == LeaveTypeID group r by r.EmployeeID into gr select new { EmployeeID = gr.Key, LeaveTaken = gr.Sum(grr => grr.NofLeaves), }); var resLeaveTaken = (from r in db.tblLeaveApplications join e in employee on r.EmployeeID equals e.Employee.EmployeeID where r.CompanyID == CommonProperties.LoginInfo.LoggedInCompany.CompanyID && r.FinPeriodID == CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.ToDate >= DateFrom && r.FromDate <= DateTo && r.LeaveTypeID == LeaveTypeID group r by r.EmployeeID into gr select new { EmployeeID = gr.Key, LeaveTaken = gr.Sum(grr => grr.NofLeaves), }); var resOpeningLeaveEncashment = (from r in db.tblLeaveEncashments join e in employee on r.EmployeeID equals e.Employee.EmployeeID where r.CompanyID == CommonProperties.LoginInfo.LoggedInCompany.CompanyID && r.FinPeriodID == CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.LeaveEncashmentDate < DateFrom && r.LeaveTypeID == LeaveTypeID group r by r.EmployeeID into gr select new { EmployeeID = gr.Key, LeaveEncashment = gr.Sum(grr => grr.NofLeaves), }); var resLeaveEncashment = (from r in db.tblLeaveEncashments join e in employee on r.EmployeeID equals e.Employee.EmployeeID where r.CompanyID == CommonProperties.LoginInfo.LoggedInCompany.CompanyID && r.FinPeriodID == CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.LeaveEncashmentDate >= DateFrom && r.LeaveEncashmentDate <= DateTo && r.LeaveTypeID == LeaveTypeID group r by r.EmployeeID into gr select new { EmployeeID = gr.Key, LeaveEncashment = gr.Sum(grr => grr.NofLeaves), }); var res = (from e in db.tblEmployees join jsd in db.tblEmployeeServiceDetails on e.EmployeeLastServiceDetailID equals jsd.EmployeeServiceDetailID into gsd from sd in gsd.DefaultIfEmpty() join jep in db.tblEmployeeNoPrefixes on e.EmployeeNoPrefixID equals jep.EmployeeNoPrefixID into gep from ep in gep.DefaultIfEmpty() join job in OpeningBalance on e.EmployeeID equals job.EmployeeID into gob from ob in gob.DefaultIfEmpty() join joadj in resOpeningAdjustment on e.EmployeeID equals joadj.EmployeeID into goadj from oadj in goadj.DefaultIfEmpty() join jadj in resAdjustment on e.EmployeeID equals jadj.EmployeeID into gadj from adj in gadj.DefaultIfEmpty() join jolt in resOpeningLeaveTaken on e.EmployeeID equals jolt.EmployeeID into golt from olt in golt.DefaultIfEmpty() join jlt in resLeaveTaken on e.EmployeeID equals jlt.EmployeeID into glt from lt in glt.DefaultIfEmpty() join joec in resOpeningLeaveEncashment on e.EmployeeID equals joec.EmployeeID into goec from oec in goec.DefaultIfEmpty() join jec in resLeaveEncashment on e.EmployeeID equals jec.EmployeeID into gec from ec in gec.DefaultIfEmpty() where e.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && e.rstate != RecordStatus_Deleted && e.rstate != RecordStatus_Deleted && (sd != null && ((Model.Employee.eEmployementStatus)sd.EmployeementStatus) == Model.Employee.eEmployementStatus.Active && (((Model.Employee.eEmploymentType)sd.EmploymentType) != Model.Employee.eEmploymentType.Contract || (sd.ContractExpiryDate == null || sd.ContractExpiryDate >= TodaysDate))) && (DesignationID == null || (sd != null && sd.EmployeeDesignationID == DesignationID.Value)) && (DepartmentID == null || (sd != null && sd.EmployeeDepartmentID == DepartmentID.Value)) && (LocationID == null || (sd != null && sd.LocationID == LocationID)) && (EmployementTypeID == null || (sd != null && sd.EmploymentType == EmployementTypeID)) && (LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Both || (LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Male && e.Gender == (byte)Model.Employee.eGender.Male) || (LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Female && e.Gender == (byte)Model.Employee.eGender.Female)) orderby e.EmployeeNo select new LeaveBalanceReportModel() { EmployeeID = e.EmployeeID, EmployeeNoPrefix = (ep != null ? ep.EmployeeNoPrefixName : null), EmployeeNo = e.EmployeeNo, EmployeeName = e.EmployeeFirstName + " " + e.EmployeeLastName, EmploymentEffectiveDate = sd.EmploymentEffectiveDate, EmployeeOpeningBalance = (ob != null ? ob.OpeningBalance : 0), //OpeningLeaveAccured = OpeningLeaveAccured, OpeningLeaveAdjustment = (oadj != null ? oadj.OpeningLeaveAdjustment : 0), OpeningLeaveTaken = (olt != null ? olt.LeaveTaken : 0), OpeningLeaveEncashment = (oec != null ? oec.LeaveEncashment : 0), //OpeningBalance = (ob != null ? ob.OpeningBalance : 0) + OpeningLeaveAccured + (oadj != null ? oadj.OpeningLeaveAdjustment : 0) - // (olt != null ? olt.LeaveTaken : 0) - (oec != null ? oec.LeaveEncashment : 0), Accured = LeaveAccured, Adjustment = (adj != null ? adj.LeaveAdjustment : 0), LeaveTaken = (lt != null ? lt.LeaveTaken : 0), LeaveEncashment = (ec != null ? ec.LeaveEncashment : 0), }).ToList(); if (((Model.Payroll.eLeaveTypeDistribute)LeaveType.Distribute) == Model.Payroll.eLeaveTypeDistribute.Monthly) { foreach (var r in res) { int EmploymentEffectiveMonth = Model.CommonFunctions.ParseInt(r.EmploymentEffectiveDate.ToString("yyyyMM")); DateTime LeaveAccureFromDate = (r.EmploymentEffectiveDate > CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom ? r.EmploymentEffectiveDate : CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom); int LeaveAccureFromMonth = Model.CommonFunctions.ParseInt(LeaveAccureFromDate.ToString("yyyyMM")); int OpeningAccureMonth = (DateFrom > LeaveAccureFromDate ? MonthFrom - LeaveAccureFromMonth : 0); int AccureMonth = (DateFrom > LeaveAccureFromDate ? MonthTo - MonthFrom : MonthTo - LeaveAccureFromMonth) + (Model.CommonProperties.LoginInfo.SoftwareSettings.Employee_CurrentMonthLeaveAccumulateOn == Model.Settings.eEmployee_LeaveAccumulateOn.MonthBeginning ? 1 : 0); AccureMonth = Math.Max(AccureMonth, 1); r.OpeningLeaveAccured = Math.Round((LeaveType.AnnualEntitledDays / 12) * OpeningAccureMonth, 2); r.Accured = Math.Round((LeaveType.AnnualEntitledDays / 12) * AccureMonth, 2); } } return(res); } }
public List <LeaveDetailReportModel> GetLeaveDetailReport(DateTime DateFrom, DateTime DateTo, int LeaveTypeID, int EmployeeID = 0) { using (dbVisionEntities db = new dbVisionEntities()) { byte RecordStatus_Deleted = (byte)eRecordState.Deleted; var LeaveType = db.tblLeaveTypes.Find(LeaveTypeID); if (LeaveType == null) { return(null); } var Employee = db.tblEmployees.Find(EmployeeID); if (Employee == null) { return(null); } Model.Payroll.eLeaveApplicableTo LeaveApplicableTo = (Model.Payroll.eLeaveApplicableTo)LeaveType.ApplicableTo; if (!(LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Both || (Employee.Gender == (byte)Model.Employee.eGender.Male && LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Male) || (Employee.Gender == (byte)Model.Employee.eGender.Female && LeaveApplicableTo == Model.Payroll.eLeaveApplicableTo.Female))) { return(null); } if (DateFrom < CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom) { DateFrom = CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom; } var OpeningLeaveTaken = (from leave in db.tblLeaveApplications where leave.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && leave.FinPeriodID == Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && leave.rstate != RecordStatus_Deleted && leave.FromDate < DateFrom && leave.EmployeeID == EmployeeID && leave.LeaveTypeID == LeaveTypeID group leave by leave.FinPeriodID into gleave select gleave.Sum(gr => gr.NofLeaves)).FirstOrDefault(); var res = (from leave in db.tblLeaveApplications join jleaveprefix in db.tblLeaveApplicationNoPrefixes on leave.LeaveApplicationNoPrefixID equals jleaveprefix.LeaveApplicationNoPrefixID into gleaveprefix from leaveprefix in gleaveprefix.DefaultIfEmpty() where leave.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && leave.FinPeriodID == Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && leave.rstate != RecordStatus_Deleted && leave.FromDate >= DateFrom && leave.FromDate <= DateTo && leave.EmployeeID == EmployeeID && leave.LeaveTypeID == LeaveTypeID select new LeaveDetailReportModel() { TransactionType = eLeaveDetailTransactionType.LeaveTaken, TransactionID = leave.LeaveApplicationID, TransactionDate = leave.FromDate, TransactionNoPrefixName = (leaveprefix != null ? leaveprefix.LeaveApplicationNoPrefixName : null), TransactionNo = leave.LeaveApplicationNo, Utilized = leave.NofLeaves, }).ToList(); decimal OpeningBalanceLeaves = 0; DateTime OpeningBalanceDate = DateFrom; if (Employee.tblEmployeeServiceDetail != null && Employee.tblEmployeeServiceDetail.EmploymentEffectiveDate > DateFrom) { OpeningBalanceDate = Employee.tblEmployeeServiceDetail.EmploymentEffectiveDate; } if (LeaveType.CanCarryForward && OpeningBalanceDate >= DateFrom && OpeningBalanceDate <= DateTo) { OpeningBalanceLeaves = (from r in db.tblEmployeeLeaveOpeningBalances where r.FinPeriodID == CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && r.LeaveTypeID == LeaveTypeID && r.EmployeeID == EmployeeID select r.LeaveOpeningBalance).FirstOrDefault(); } var OpeningEncashment = (from leave in db.tblLeaveEncashments join jleaveprefix in db.tblLeaveEncashmentNoPrefixes on leave.LeaveEncashmentNoPrefixID equals jleaveprefix.LeaveEncashmentNoPrefixID into gleaveprefix from leaveprefix in gleaveprefix.DefaultIfEmpty() where leave.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && leave.FinPeriodID == Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && leave.rstate != RecordStatus_Deleted && leave.LeaveEncashmentDate < DateFrom && leave.EmployeeID == EmployeeID && leave.LeaveTypeID == LeaveTypeID group leave by leave.FinPeriodID into gleave select gleave.Sum(gr => gr.NofLeaves)).FirstOrDefault(); res.AddRange((from leave in db.tblLeaveEncashments join jleaveprefix in db.tblLeaveEncashmentNoPrefixes on leave.LeaveEncashmentNoPrefixID equals jleaveprefix.LeaveEncashmentNoPrefixID into gleaveprefix from leaveprefix in gleaveprefix.DefaultIfEmpty() where leave.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && leave.FinPeriodID == Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && leave.rstate != RecordStatus_Deleted && leave.LeaveEncashmentDate >= DateFrom && leave.LeaveEncashmentDate <= DateTo && leave.EmployeeID == EmployeeID && leave.LeaveTypeID == LeaveTypeID select new LeaveDetailReportModel() { TransactionType = eLeaveDetailTransactionType.LeaveEncashment, TransactionID = leave.LeaveEncashmentID, TransactionDate = leave.LeaveEncashmentDate, TransactionNoPrefixName = (leaveprefix != null ? leaveprefix.LeaveEncashmentNoPrefixName : null), TransactionNo = leave.LeaveEncashmentNo, Utilized = leave.NofLeaves, }).ToList()); var OpeningAdjustment = (from leave in db.tblLeaveAdjustments join jleaveprefix in db.tblLeaveAdjustmentNoPrefixes on leave.LeaveAdjustmentNoPrefixID equals jleaveprefix.LeaveAdjustmentNoPrefixID into gleaveprefix from leaveprefix in gleaveprefix.DefaultIfEmpty() where leave.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && leave.FinPeriodID == Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && leave.rstate != RecordStatus_Deleted && leave.LeaveAdjustmentDate < DateFrom && leave.EmployeeID == EmployeeID && leave.LeaveTypeID == LeaveTypeID group leave by leave.FinPeriodID into gleave select gleave.Sum(r => r.NofLeaves)).FirstOrDefault(); res.AddRange((from leave in db.tblLeaveAdjustments join jleaveprefix in db.tblLeaveAdjustmentNoPrefixes on leave.LeaveAdjustmentNoPrefixID equals jleaveprefix.LeaveAdjustmentNoPrefixID into gleaveprefix from leaveprefix in gleaveprefix.DefaultIfEmpty() where leave.CompanyID == Model.CommonProperties.LoginInfo.LoggedInCompany.CompanyID && leave.FinPeriodID == Model.CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodID && leave.rstate != RecordStatus_Deleted && leave.LeaveAdjustmentDate >= DateFrom && leave.LeaveAdjustmentDate <= DateTo && leave.EmployeeID == EmployeeID && leave.LeaveTypeID == LeaveTypeID select new LeaveDetailReportModel() { TransactionType = eLeaveDetailTransactionType.LeaveAdjustment, TransactionID = leave.LeaveAdjustmentID, TransactionDate = leave.LeaveAdjustmentDate, TransactionNoPrefixName = (leaveprefix != null ? leaveprefix.LeaveAdjustmentNoPrefixName : null), TransactionNo = leave.LeaveAdjustmentNo, Earned = leave.NofLeaves, }).ToList()); decimal OpeningAccured = 0; //int DateFrom_YearMonth = Model.CommonFunctions.ParseInt(DateFrom.Year.ToString("0000") + DateFrom.Month.ToString("00")); if (((Model.Payroll.eLeaveTypeDistribute)LeaveType.Distribute) == Model.Payroll.eLeaveTypeDistribute.Monthly) { if (CommonProperties.LoginInfo.SoftwareSettings.Employee_CurrentMonthLeaveAccumulateOn == Model.Settings.eEmployee_LeaveAccumulateOn.MonthBeginning) { DateTime StartDate = (Employee.tblEmployeeServiceDetail != null && Employee.tblEmployeeServiceDetail.EmploymentEffectiveDate > CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom ? Employee.tblEmployeeServiceDetail.EmploymentEffectiveDate : CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom); for (var date = StartDate; date < DateTo; date = date.AddMonths(1)) { //if (Model.CommonFunctions.ParseDecimal(date.Year.ToString("0000") + date.Month.ToString("00")) < DateFrom_YearMonth) if (date < DateFrom) { OpeningAccured += Math.Round(LeaveType.AnnualEntitledDays / 12M, 2); } else { res.Add(new LeaveDetailReportModel() { TransactionType = eLeaveDetailTransactionType.Accure, TransactionID = 0, TransactionDate = date, TransactionNoPrefixName = null, TransactionNo = 0, Earned = Math.Round(LeaveType.AnnualEntitledDays / 12M, 2), }); } } } else // Month Ending { for (var date = CommonProperties.LoginInfo.LoggedInFinPeriod.FinPeriodFrom.AddMonths(1); date < DateTo; date = date.AddMonths(1)) { //if (Model.CommonFunctions.ParseDecimal(date.Year.ToString("0000") + date.Month.ToString("00")) < DateFrom_YearMonth) if (date < DateFrom) { OpeningAccured += Math.Round(LeaveType.AnnualEntitledDays / 12M, 2); } else { res.Add(new LeaveDetailReportModel() { TransactionType = eLeaveDetailTransactionType.Accure, TransactionID = 0, TransactionDate = date, TransactionNoPrefixName = null, TransactionNo = 0, Earned = Math.Round(LeaveType.AnnualEntitledDays / 12M, 2), }); } } } } else { res.Add(new LeaveDetailReportModel() { TransactionType = eLeaveDetailTransactionType.Accure, TransactionID = 0, TransactionDate = DateFrom, TransactionNoPrefixName = null, TransactionNo = 0, Earned = LeaveType.AnnualEntitledDays, }); } decimal OpeningBalance = OpeningBalanceLeaves + OpeningAccured + OpeningAdjustment - OpeningLeaveTaken - OpeningEncashment; if (OpeningBalance != 0) { res.Add(new LeaveDetailReportModel() { TransactionType = eLeaveDetailTransactionType.OpeningBalance, TransactionID = 0, TransactionDate = OpeningBalanceDate, TransactionNoPrefixName = null, TransactionNo = 0, Earned = OpeningBalance, }); } res = (from r in res orderby r.TransactionDate, r.TransactionType, r.TransactionNo select r).ToList(); decimal Balance = 0; foreach (var r in res) { Balance += r.Earned - r.Utilized; r.Balance = Balance; } return(res.ToList()); } }