示例#1
0
        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);
            }
        }
示例#2
0
        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());
            }
        }