using System;
using System.Data;
using Ease.Core.Model;
using Ease.Core.DataAccess;
using Ease.Core;
using System.Collections.Generic;
using Ease.Core.Utility;
using System.IO;
using System.Data.SqlClient;
using HRM.BO;
using static HRM.BO.SearchManager;

namespace HRM.DA
{
    #region SearchEmployee Service

    public class SearchEmployeeService : ServiceTemplate, ISearchEmployeeService
    {
        private int _serial;

        public SearchEmployeeService()
        {
            _serial = 0;
        }

        private void MapObject(SearchEmployee oSearchEmployee, DataReader oReader)
        {
            oSearchEmployee.EmployeeID = oReader.GetInt32("EmployeeID").Value;
            _serial = _serial + 1;
            base.SetObjectID(oSearchEmployee, (oSearchEmployee.EmployeeID));
            oSearchEmployee.Name = oReader.GetString("name");
            oSearchEmployee.EmployeeNo = oReader.GetString("employeeNo");
            oSearchEmployee.LocationID = oReader.GetInt32("locationID", 0);
            oSearchEmployee.CategoryID = oReader.GetInt32("categoryID", 0);
            oSearchEmployee.DepartmentID = oReader.GetInt32("departmentID", true, 0);
            oSearchEmployee.designationID = oReader.GetInt32("designationID", true, 0);
            oSearchEmployee.designationName = oReader.GetString("DesignationName", true, string.Empty);
            oSearchEmployee.departmentName = oReader.GetString("DepartmentName", true, string.Empty);
            oSearchEmployee.gradeName = oReader.GetString("GradeName", true, string.Empty);
            oSearchEmployee.GradeID = oReader.GetInt32("GradeID", 0);
            oSearchEmployee.EmployeeEmail = oReader.GetString("Emailaddress", true, string.Empty);
            this.SetObjectState(oSearchEmployee, Ease.Core.ObjectState.Saved);
        }

        protected override T CreateObject<T>(DataReader oReader)
        {
            SearchEmployee oSearchEmployee = new SearchEmployee();
            MapObject(oSearchEmployee, oReader);
            return oSearchEmployee as T;
        }

        protected SearchEmployee CreateObject(DataReader oReader)
        {
            SearchEmployee oSearchEmployee = new SearchEmployee();
            MapObject(oSearchEmployee, oReader);
            return oSearchEmployee;
        }

        #region Service implementation
        public List<SearchEmployee> Search(string sql, bool withName)
        {
            List<SearchEmployee> searchEmployees = null;

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.Search(tc, sql, withName));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();

                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }
        public List<SearchEmployee> Search(string sql, int userid, int payrolltypeid)
        {
            List<SearchEmployee> searchEmployees = null;

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.Search(tc, sql,  userid,  payrolltypeid));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();

                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }


        public SearchEmployee get(int empid)
        {
            SearchEmployee searchEmployees = null;

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.get(tc, empid));
                if (dr.Read())
                {
                    searchEmployees = this.CreateObject<SearchEmployee>(dr);
                }

                dr.Close();

                //while (dr.Read())
                //{
                //    SearchEmployee item = new SearchEmployee();
                //    item.Name = dr.GetString("name");
                //    item.EmployeeNo = dr.GetString("employeeNo");

                //    searchEmployees.Add(item);
                //}
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }

        public SearchEmployee Get(int id, TransactionContext tc)
        {
            SearchEmployee searchEmployees = null;
            try
            {
                DataReader oreader = new DataReader(SearchEmployeeDA.get(tc, id));
                if (oreader.Read())
                {
                    searchEmployees = this.CreateObject<SearchEmployee>(oreader);
                }
                oreader.Close();
            }
            catch (Exception e)
            {
                #region Handle Exception
                //if (tc != null)
                //    tc.HandleError();
                //ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);
                #endregion
            }

            return searchEmployees;
        }


        public List<SearchEmployee> GetSelectedSearchEmployee(List<int> empids)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();
            string combinedString = string.Join(",", empids);

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                //tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.GetByEmpIDIn(tc, combinedString));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();

                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }
        public List<SearchEmployee> GetByEmpIDIn(string empids)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.GetByEmpIDIn(tc, empids));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();

                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }
        public List<SearchEmployee> FindEmpCodeName(int payrollTypeID, string code, string name)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.Search(tc, payrollTypeID, code, name));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                //while (dr.Read())
                //{
                //    SearchEmployee item = new SearchEmployee();
                //    item.Name = dr.GetString("name");
                //    item.EmployeeNo = dr.GetString("employeeNo");

                //    searchEmployees.Add(item);
                //}
                dr.Close();
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }


        public List<SearchEmployee> GetEmployeeNotYetUser(int payrollTypeID)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.GetEmployeeNotYetUser(tc, payrollTypeID));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }

        public List<SearchEmployee> GetTeam(int employeeid)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.GetTeam(tc, employeeid));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }

        public List<SearchEmployee> GetTeam(int employeeid, EnumStatus enumStatus)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.GetTeam(tc, employeeid, enumStatus));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }

        public List<SearchEmployee> GetTeamForAttnReguApprove(int employeeid, EnumStatus enumStatus)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.GetTeamForAttenReguApprove(tc, employeeid, enumStatus));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }

        public List<SearchEmployee> FindCordinator(int? id, int? payrollTypeID)
        {
            List<SearchEmployee> searchEmployees = new List<SearchEmployee>();

            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();

                DataReader dr = new DataReader(SearchEmployeeDA.FindCordinator(tc, id, payrollTypeID));
                searchEmployees = this.CreateObjects<SearchEmployee>(dr);
                dr.Close();
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);

                throw new ServiceException(e.Message, e);

                #endregion
            }

            return searchEmployees;
        }

        public List<SearchEmployee> Find(SearchManager omanager)
        {
            string sql = "";
            this.ParametersValidation(omanager);
            this.FindRootTable(omanager);

            sql = this.GetSubQuery(omanager);
            bool FromEmployee = (omanager.RootTable == "EMPLOYEE");

            string withnametempqry = @",  '                                                  ' GradeName "
                    + ",  '                                                                               ' DepartmentName "
                    + ",  '                                                                               ' DesignationName ";
            string tempTableName = "  INTO #tmpEmpSrc ";
            if (omanager.withName == false)
            {
                withnametempqry = "";
                tempTableName = "";
            }

            if (!FromEmployee)
            {
                    sql = SQLParser.MakeSQL(
                    "SELECT EmployeeID, LocationID, CategoryID, DepartmentID, GradeID, EmployeeNo, Name "
                    + " %q %q "
                    + " FROM Employee Where EmployeeID IN "
                    + " (Select %q.EmployeeID From %q) ORDER BY employeeno", withnametempqry, tempTableName, omanager.RootTable, sql);
            }
            else
            {
                if (omanager.SearchFrom == EnumSearchFrom.Attendance)
                {
                    tempTableName = "  ";
                    sql = SQLParser.MakeSQL(
                    "SELECT distinct %q.EmployeeID, %q.LocationID, %q.CategoryID, %q.DesignationID, %q.DepartmentID, %q.GradeID, EmployeeNo, Name "
                    + "  "
                    + " %q %q "
                    + "FROM Employee %q  ORDER BY employeeno",
                    omanager.RootTable, omanager.RootTable,
                    omanager.RootTable, omanager.RootTable, omanager.RootTable, omanager.RootTable, withnametempqry, tempTableName, sql);
                }
                else
                {
                    //sql = SQLParser.MakeSQL(
                    //    "SELECT %q.EmployeeID, %q.LocationID, %q.CategoryID, %q.DesignationID,  %q.DepartmentID, %q.GradeID, Employee.EmployeeNo, Employee.Name,Employee.Emailaddress "
                    //    + "FROM Employee %q  ORDER BY employeeno",
                    //    omanager.RootTable, omanager.RootTable, omanager.RootTable, omanager.RootTable, omanager.RootTable,
                    //    omanager.RootTable, sql);
                        sql = SQLParser.MakeSQL(
                        "SELECT   DISTINCT %q.EmployeeID, %q.LocationID, %q.CategoryID, %q.DesignationID,  %q.DepartmentID, %q.GradeID, Employee.EmployeeNo, Employee.Name,Employee.Emailaddress "
                        + " %q %q FROM Employee %q  ORDER BY employeeno",
                        omanager.RootTable, omanager.RootTable, omanager.RootTable, omanager.RootTable, omanager.RootTable,
                        omanager.RootTable, withnametempqry, tempTableName, sql);
                }
            }

            List<SearchEmployee> searchItems = new List<SearchEmployee>();
            if (omanager.checkDataPermission == false)
                searchItems = this.Search(sql, omanager.withName);
            else
            {
                searchItems = this.Search(sql, (int)omanager.userid, (int)omanager.payrolltypeID);
            }
            return searchItems;
        }

        private string getCCSql(SearchManager omanager)
        {
            bool FromEmployee = (omanager.RootTable == "EMPLOYEE");
            string sql = "";
            SearchManager.SearchParameter op = omanager.Parameter.GetByParamer(EnumSearchParameter.CostCenterID);
            if (op == null) return "";
            if (!FromEmployee)
            {
                string dateTimeSyntax = omanager.Parameter.GetFromAndToDateSyntax();

                sql = SQLParser.MakeSQL(
                    " %q.EmployeeID IN (select distinct SALARYMONTHLY.EMPLOYEEID  from SALARYEMPCOSTCENTER, SALARYMONTHLY   where "
                    + " SALARYEMPCOSTCENTER.SALARYMONTHLYID  =SALARYMONTHLY.SALARYMONTHLYID and SALARYMONTHLY.SalaryMonth =%q AND"
                    + " COSTCENTERID in(%q)) ", omanager.RootTable, dateTimeSyntax, op.ParameterValue.ToString());
            }
            else
            {
                sql = SQLParser.MakeSQL(
                    " %q.EmployeeID IN (select distinct empCostcenter.EMPLOYEEID  from empCostcenter where CurrentCC=1 AND COSTCENTERID in(%q))",
                    omanager.RootTable, op.ParameterValue.ToString());
            }

            return sql;
        }


        private void ParametersValidation(SearchManager omanager)
        {
            SearchManager.SearchParameter parameter = null;
            //if serach from is not Employee, From date must have in the paramer collection

            if (omanager.SearchFrom != EnumSearchFrom.Employee)
            {
                parameter = omanager.Parameter.GetByParamer(EnumSearchParameter.FromDate);
                if (parameter == null) throw new ServiceException("From date/Month not found in the parameter");
            }

            //if To-date is in the parameter collection, From-date must be in the paramer collection

            parameter = omanager.Parameter.GetByParamer(EnumSearchParameter.ToDate);
            if (parameter != null)
            {
                parameter = omanager.Parameter.GetByParamer(EnumSearchParameter.FromDate);
                if (parameter == null)
                    throw new ServiceException(
                        "To-Date/month is in the collection but From date/Month not found in the parameter");
            }
        }

        private void FindRootTable(SearchManager omanager)
        {
            omanager.RootTable = "EMPLOYEE";

            switch (omanager.SearchFrom)
            {
                case EnumSearchFrom.Employee:
                    omanager.RootTable = "EMPLOYEE";
                    break;
                case EnumSearchFrom.Salary:
                    omanager.RootTable = "SALARYMONTHLY";
                    break;
                case EnumSearchFrom.Bonus:
                    SearchManager.SearchParameter fromdateParamBonus =
                        omanager.Parameter.GetByParamer(EnumSearchParameter.FromDate);
                    if (fromdateParamBonus == null) return;
                    if (Convert.ToDateTime(fromdateParamBonus.ParameterValue) <= omanager.LastPayProcessMonth)
                        omanager.RootTable = "SALARYMONTHLY";
                    break;
                case EnumSearchFrom.OutSidePayroll:
                    SearchManager.SearchParameter fromdateParamOPI =
                        omanager.Parameter.GetByParamer(EnumSearchParameter.FromDate);
                    if (fromdateParamOPI == null) return;
                    //if ((DateTime)fromdateParamOPI.ParameterValue <= SystemInformation.CurrentSysInfo.LastPayProcessDate)
                    omanager.RootTable = "OPIProcessDetail";
                    break;

                case EnumSearchFrom.PFTran:

                case EnumSearchFrom.OverTime:

                case EnumSearchFrom.IT:
                    SearchManager.SearchParameter taxParamid =
                        omanager.Parameter.GetByParamer(EnumSearchParameter.TaxParameterID);
                    if (taxParamid == null) break;
                    ;
                    if (taxParamid.ParameterValue.ToString() == omanager.TaxParamID.ToString())
                    {
                        SearchManager.SearchParameter fromdateParamit =
                            omanager.Parameter.GetByParamer(EnumSearchParameter.FromDate);
                        if (fromdateParamit == null) return;
                        if (Convert.ToDateTime(fromdateParamit.ParameterValue) <= omanager.LastPayProcessMonth)
                            omanager.RootTable = "SALARYMONTHLY";
                    }

                    break;

                case EnumSearchFrom.Loan:
                    SearchManager.SearchParameter fromdateParam =
                        omanager.Parameter.GetByParamer(EnumSearchParameter.FromDate);
                    if (fromdateParam == null) return;
                    if (Convert.ToDateTime(fromdateParam.ParameterValue) <= omanager.LastPayProcessMonth)
                        omanager.RootTable = "SALARYMONTHLY";
                    break;

                default:
                    omanager.RootTable = "EMPLOYEE";
                    break;
            }
        }

        //private bool FromEmployee
        //{
        //    get
        //    {
        //        if (_rootTable == "EMPLOYEE") return true;
        //        else return false;
        //    }
        //}
        private string GetSubQuery(SearchManager omanager)
        {
            string subqsl = "";
            string dateTimeSyntax = "";
            dateTimeSyntax = omanager.Parameter.GetFromAndToDateSyntax();
            bool FromEmployee = (omanager.RootTable == "EMPLOYEE");
            switch (omanager.SearchFrom)
            {
                case EnumSearchFrom.Salary:
                    subqsl = SQLParser.MakeSQL("SalaryMonthly Where Employee.EmployeeID = SalaryMonthly.EmployeeID "
                                               + " AND SalaryMonth %q ", dateTimeSyntax);
                    
                    SearchManager.SearchParameter tempSearchParam = omanager.Parameter.GetByParamer(EnumSearchParameter.BankID);
                    if (tempSearchParam != null)
                    {
                        subqsl += SQLParser.MakeSQL(@" AND Employee.BRANCHID IN (SELECT BRANCHID FROM BRANCHES WHERE BANKID IN (%q)) ", tempSearchParam.ParameterValue);
                    }
                    break;
                case EnumSearchFrom.Bonus:
                    string CompanyCode =
                        ConfigurationManager.GetStringValue("system", "companycode", EnumConfigurationType.Logic);
                    string[] s = dateTimeSyntax.Split('=');
                    string[] s1 = s[1].Split('\'');
                    DateTime d = GlobalFunctions.FirstDateOfMonth(Convert.ToDateTime(s1[1]));
                    DateTime d1 = GlobalFunctions.LastDateOfMonth(Convert.ToDateTime(s1[1]));
                    SearchManager.SearchParameter param = omanager.Parameter.GetByParamer(EnumSearchParameter.BonusId);
                    if (param == null) throw new ServiceException("Bonus(Id) not found while searching from bonus");
                    SearchManager.SearchParameter paramBatch = null;
                    if (CompanyCode == "011")
                    {
                        paramBatch = omanager.Parameter.GetByParamer(EnumSearchParameter.BonusProcessID);
                        if (paramBatch == null)
                            throw new ServiceException("Batch No not found while searching from bonus");
                    }

                    if (!FromEmployee)
                        subqsl = SQLParser.MakeSQL(
                            "SalaryMonthly,BONUSPROCESSDETAIL Where SalaryMonthly.EmployeeId=Employee.EmployeeID AND "
                            + " SalaryMonthly.EmployeeID = BONUSPROCESSDETAIL.EmployeeID"
                            + " AND BonusID=%n AND SalaryMonth=%d AND disburseDate between %d and %d",
                            Convert.ToInt32(param.ParameterValue), d1, d, d1);
                    else
                    {
                        string Scode =
                            ConfigurationManager.GetStringValue("system", "companycode", EnumConfigurationType.Logic);
                        if (Scode == "011")
                        {
                            subqsl = SQLParser.MakeSQL(
                                ",BONUSPROCESSDETAIL Where Employee.EmployeeID = BONUSPROCESSDETAIL.EmployeeID "
                                + " AND BonusID=%n  AND BonusProcessID=%n AND disburseDate between %d and %d ",
                                Convert.ToInt32(param.ParameterValue), Convert.ToInt32(paramBatch.ParameterValue), d, d1);
                        }
                        else
                        {
                            subqsl = SQLParser.MakeSQL(
                                ",BONUSPROCESSDETAIL Where Employee.EmployeeID = BONUSPROCESSDETAIL.EmployeeID "
                                + " AND BonusID=%n AND disburseDate between %d and %d ", Convert.ToInt32(param.ParameterValue), d,
                                d1);
                        }
                    }

                    SearchManager.SearchParameter tempSearchParamForBonus = omanager.Parameter.GetByParamer(EnumSearchParameter.BankID);
                    if (tempSearchParamForBonus != null)
                    {
                        subqsl += SQLParser.MakeSQL(@" AND Employee.BRANCHID IN (SELECT BRANCHID FROM BRANCHES WHERE BANKID IN (%q)) ", tempSearchParamForBonus.ParameterValue);
                    }

                    break;
                case EnumSearchFrom.OutSidePayroll:
                    string opiID = "";
                    string opiBranchID = "";
                    SearchManager.SearchParameter paramOpi = omanager.Parameter.GetByParamer(EnumSearchParameter.OPIID);
                    if (!FromEmployee)
                    {
                        if (paramOpi != null)
                        {
                            subqsl = SQLParser.MakeSQL(
                                " OPIProcessDetail WHERE OPIProcessDetail.EmployeeID IN (SELECT DISTINCT opd.EmployeeID FROM OPIProcess op, OPIProcessDetail opd,  OPIProcessDetailItem odi WHERE "
                                + " OPIMonth %q AND op.OPIProcessID = opd.OPIProcessID "
                                + " AND odi.OPIProcessDetailID = opd.OPIProcessDetailID AND odi.OPIItemID = %n)",
                                dateTimeSyntax, (int)paramOpi.ParameterValue);
                        }
                        else
                        {
                            //subqsl = SQLParser.MakeSQL(" SalaryMonthly WHERE SalaryMonthly.EmployeeID IN (SELECT DISTINCT opd.EmployeeID FROM OPIProcess op, OPIProcessDetail opd WHERE "
                            //        + " OPIMonth %q AND op.OPIProcessID = opd.OPIProcessID) ",
                            //        dateTimeSyntax);

                            subqsl = SQLParser.MakeSQL(
                                " OPIProcessDetail WHERE OPIProcessDetail.EmployeeID IN (SELECT DISTINCT opd.EmployeeID FROM OPIProcess op, OPIProcessDetail opd WHERE "
                                + " OPIMonth %q AND op.OPIProcessID = opd.OPIProcessID) ",
                                dateTimeSyntax);
                        }
                    }
                    else
                        subqsl = SQLParser.MakeSQL("  ,OPIProcess op, OPIProcessDetail opd WHERE "
                                                   + " op.OPIMonth %q AND op.OPIProcessID = opd.OPIProcessID AND opd.EmployeeId=Employee.EmployeeID",
                            dateTimeSyntax);

                    break;
                case EnumSearchFrom.PFTran:

                //if (!this.FromEmployee)
                //    subqsl = SQLParser.MakeSQL(" %q WHERE %q.EmployeeID IN (SELECT DISTINCT OPIPayment.EmployeeID FROM OPIPayment WHERE "
                //            + " ForTheMonth=%d  %q  %q )", _rootTable, _rootTable, fromMonth, opiID, opiBranchID);
                //else
                //    subqsl = SQLParser.MakeSQL(" Employee.EmployeeID IN (SELECT DISTINCT PF.EmployeeID FROM PFTransaction PF WHERE  "
                //            + " TranDate BETWEEN %d AND %d )", _rootTable, fromMonth, opiID, opiBranchID);
                //break;

                case EnumSearchFrom.OverTime:
                    string termID = "";
                    if (!FromEmployee)
                        subqsl = SQLParser.MakeSQL(
                            " SalaryMonthly WHERE SalaryMonthly.EmployeeID IN (SELECT DISTINCT OTProcess.EmpID FROM OTProcess WHERE"
                            + " SalaryMonth=%q AND ProcessMonth=%q )", dateTimeSyntax, dateTimeSyntax);
                    else
                        subqsl = SQLParser.MakeSQL(
                            " Where Employee.EmployeeID IN (SELECT DISTINCT OTProcess.EmpID FROM OTProcess WHERE "
                            + "ProcessMonth=%q)", dateTimeSyntax);

                    break;
                case EnumSearchFrom.Loan:
                    if (!FromEmployee)
                        subqsl = SQLParser.MakeSQL(
                            " SalaryMonthly WHERE SalaryMonth =%q AND SalaryMonthly.EmployeeID IN (SELECT DISTINCT LOANISSUE.EmployeeID FROM LOANISSUE, LOANSCHEDULE WHERE "
                            + " LOANISSUE.LOANISSUEID= LOANSCHEDULE.LOANISSUEID AND DUEINSTALLMENTDATE=%q )",
                            dateTimeSyntax, dateTimeSyntax);
                    else
                        subqsl = SQLParser.MakeSQL(
                            " WHERE Employee.EmployeeID IN (SELECT DISTINCT LOANISSUE.EmployeeID FROM LOANISSUE, LOANSCHEDULE WHERE "
                            + " LOANISSUE.LOANISSUEID= LOANSCHEDULE.LOANISSUEID AND DUEINSTALLMENTDATE=%q)",
                            dateTimeSyntax);
                    break;
                case EnumSearchFrom.IT:
                    // if selected fiscal year is current fiscal year, get data from incometaxtemp
                    // if selected fiscal year is not current fs year, get data from incometaxyearly


                    SearchManager.SearchParameter taxParamid =
                        omanager.Parameter.GetByParamer(EnumSearchParameter.TaxParameterID);
                    if (taxParamid == null) return "";
                    //#####
                    if (taxParamid.ParameterValue.ToString() == omanager.TaxParamID.ToString())
                    {
                        subqsl = SQLParser.MakeSQL(" SalaryMonthly WHERE SalaryMonth %q AND SalaryMonthly.EmployeeID IN (SELECT DISTINCT INCOMETAXTEMP.EmployeeID FROM INCOMETAXTEMP)",
                                                 dateTimeSyntax);
                        break;

                    }
                    else
                    {
                        //subqsl = SQLParser.MakeSQL(" SalaryMonthly WHERE SalaryMonth %q AND SalaryMonthly.EmployeeID IN (SELECT DISTINCT INCOMETAXYEARLY.EmployeeID FROM INCOMETAXYEARLY WHERE "
                        //            + " INCOMETAXYEARLY.TAXPARAMID In(%q))",
                        //                         dateTimeSyntax, taxParamid.ParameterValue.ToString());

                        subqsl = SQLParser.MakeSQL(", SalaryMonthly WHERE SalaryMonth %q AND SalaryMonthly.EmployeeID IN (SELECT DISTINCT INCOMETAXYEARLY.EmployeeID FROM INCOMETAXYEARLY WHERE "
                                    + " INCOMETAXYEARLY.TAXPARAMID In(%q)) AND %q.Employeeid = SalaryMonthly.EmployeeID",
                                                 dateTimeSyntax, taxParamid.ParameterValue.ToString(), omanager.RootTable);
                        break;

                    }
                    
                case EnumSearchFrom.Attendance:
                    subqsl = SQLParser.MakeSQL(
                        ",DAILYATTNPROCESS WHERE Employee.EmployeeID = DAILYATTNPROCESS.EmployeeID "
                        + " AND ATTNDATE %q ", dateTimeSyntax);
                    break;
                default:
                    //{
                    //    SearchParameter workPlanGroupID = this.Parameter.GetByParamer(EnumSearchParameter.WorkPlanGroupID);
                    //    if (workPlanGroupID == null) return "";
                    //    else
                    //    {
                    //        subqsl = SQLParser.MakeSQL(",WorkPlanGroup, EmployeeWorkPlanSetup WHERE Employee.EmployeeID = EmployeeWorkPlanSetUp.EmployeeID AND EmployeeWorkPlanSetUp.WorkPlanGroupID=WorkPlanGroup.WorkPlanGroupID AND  "
                    //            + " WorkPlanGroup.WorkPlanGroupID= %n ", workPlanGroupID.ParameterValue);
                    //    }
                    //    break;
                    //}
                    break;
            }

            //this.Parameter.AddDefaultParameter();
            subqsl = (subqsl == "")
                ? omanager.Parameter.GetParameterSQL(omanager.RootTable, true)
                : subqsl + " " + omanager.Parameter.GetParameterSQL(omanager.RootTable, false);
            string sqlcc = getCCSql(omanager);
            if (sqlcc != "")
                subqsl = subqsl + ((subqsl == "") ? " WHERE " + getCCSql(omanager) : " AND " + getCCSql(omanager));
            if (omanager.SearchFrom == EnumSearchFrom.Salary && omanager.IsNegletWithheld)
                subqsl = subqsl + ((subqsl == "") ? " WHERE " + omanager.RootTable + ".salaryWithHeld=0" : " AND " + omanager.RootTable + ".salaryWithHeld=0");
            else if (omanager.SearchFrom == EnumSearchFrom.Salary && !omanager.IsNegletWithheld)
                subqsl = subqsl + ((subqsl == "") ? " WHERE " + omanager.RootTable + ".salaryWithHeld=1" : " AND " + omanager.RootTable + ".salaryWithHeld=1");
            return subqsl;
        }



        #endregion
    }

    #endregion
}