using HRM.BO;
using Ease.Core.DataAccess;
using System;
using System.Data;
using System.Configuration;
using Microsoft.Data.SqlClient;
using static iTextSharp.text.pdf.AcroFields;
using NPOI.SS.Formula.Functions;
using static NPOI.HSSF.Util.HSSFColor;
using iTextSharp.text.pdf.parser.clipper;

namespace HRM.DA.Fund
{
    #region class MembersTransactionDetailsDA

    internal class MembersTransactionDetailsDA
    {
        #region Constructor

        public MembersTransactionDetailsDA()
        {
        }

        #endregion

        #region Insert function

        internal static void Insert(TransactionContext tc, MembersTransactionDetails oItem)
        {
            string sql = string.Empty;
            sql = SQLParser.MakeSQL(
                "INSERT INTO MembersTransactionDetails(TranID,MemberID,TranTypeID,TranDate,ProjectID,FundTypeID,Amount,Effect,ActivityID,VoucherNo,CreatedBy,CreatedDate)" +
                " VALUES(%n,%n,%n,%d,%n,%n,%n,%n,%n,%s,%n,%D)", oItem.ID, oItem.MemberID, oItem.TranTypeID,
                oItem.TranDate, oItem.ID,
                oItem.FundTypeID, oItem.Amount, oItem.Effect, DataReader.GetNullValue(oItem.ActivityID),
                DataReader.GetNullValue(oItem.VoucherNo),
                oItem.CreatedBy, oItem.CreatedDate);
            tc.ExecuteNonQuery(sql);
        }

        #endregion

        #region Update function

        internal static void Update(TransactionContext tc, MembersTransactionDetails oItem)
        {
            tc.ExecuteNonQuery(
                "UPDATE MembersTransactionDetails SET  MemberID=%n, TranTypeID=%n, TranDate=%d, ProjectID=%n, FundTypeID = %n, Amount=%n, Effect=%n, ActivityID=%n, VoucherNo=%s, ModifiedBy = %n, ModifiedDate = %D" +
                "where TranID=%n", oItem.MemberID, oItem.TranTypeID, oItem.TranDate, oItem.ID, oItem.FundTypeID,
                oItem.Amount,
                oItem.Effect, oItem.ActivityID, oItem.VoucherNo, oItem.ModifiedBy, oItem.ModifiedDate, oItem.ID);
        }

        #endregion

        #region int Generation function

        internal static int GetNewID(TransactionContext tc)
        {
            return tc.GenerateID("MembersTransactionDetails", "TranID");
        }

        #endregion

        #region Get Function

        internal static IDataReader Get(TransactionContext tc, EnumMemberTranType type, int fundtypeid)
        {
            return tc.ExecuteReader("SELECT * FROM MembersTransactionDetails Where ProjectID=%n and TranTypeID=%n",
                fundtypeid, type);
        }

        internal static IDataReader GetbyFundType(TransactionContext tc, int fundtypeid)
        {
            return tc.ExecuteReader("SELECT * FROM MembersTransactionDetails Where ProjectID=%n ", fundtypeid);
        }

        internal static IDataReader Get(TransactionContext tc, int TranID)
        {
            return tc.ExecuteReader("SELECT * FROM MembersTransactionDetails WHERE TranID=%n", TranID);
        }

        internal static IDataReader GetMemberContribution(TransactionContext tc, int memberID, DateTime beforeConOfDate,
            int fundtypeid)
        {
            string sqlString = string.Empty;
            sqlString = SQLParser.MakeSQL(
                "SELECT * FROM MembersTransactionDetails WHERE MemberID = %n AND TranDate < %d AND ProjectID=%n",
                memberID, beforeConOfDate, fundtypeid);
            return tc.ExecuteReader(sqlString);
        }

        internal static IDataReader GetMemberContribution(TransactionContext tc, int memberID, string searchCondition,
            int fundtypeid)
        {
            string sqlString = string.Empty;
            sqlString = SQLParser.MakeSQL(
                "SELECT * FROM MembersTransactionDetails WHERE MemberID = %n AND ProjectID=%n %q order by TranDate,TranTypeID asc",
                memberID, fundtypeid, searchCondition);
            //sqlString = sqlString + searchCondition;
            return tc.ExecuteReader(sqlString);
        }

        internal static IDataReader GetMemberContribution(TransactionContext tc, int memberID, string searchCondition)
        {
            string sqlString = string.Empty;

            sqlString = SQLParser.MakeSQL(
                "SELECT * FROM MembersTransactionDetails WHERE MemberID = %n %q order by TranDate,TranTypeID asc",
                memberID, searchCondition);
            //sqlString = sqlString + searchCondition;
            return tc.ExecuteReader(sqlString);
        }

        internal static IDataReader GetMemberContribution( int memberID, string searchCondition, string FMConn)
        {
            string sqlString = string.Empty;

            sqlString = SQLParser.MakeSQL(
                "SELECT * FROM MembersTransactionDetails WHERE MemberID = %n %q order by TranDate,TranTypeID asc",
                memberID, searchCondition);

            try
            {
                SqlConnection connection = new SqlConnection(FMConn);
                connection.Open();
                SqlCommand cmd = new SqlCommand(sqlString, connection);

                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                throw new Exception("An error occurred while fetching the member contribution: " + ex.Message);
            }
        }




        //internal static DataSet GetTransactionMembers(TransactionContext tc, DateTime uploadMonth)
        //{
        //    DataSet ds = new DataSet();
        //    string sql = string.Empty;
        //    sql = SQLParser.MakeSQL("SELECT * from %q WHERE TranDate = %d", ConfigurationSettings.AppSettings["vwMembersContribution"], PayrollGlobalFunctions.PayrollLastDateOfMonth(uploadMonth));
        //    ds = tc.ExecuteDataSet(sql);
        //    ds.Tables[0].TableName = "MembersTransactions";
        //    return ds;
        //}

        //internal static DataSet GetTransactionIAMembers(TransactionContext tc)
        //{
        //    DataSet ds = new DataSet();
        //    string sql = string.Empty;
        //    sql = SQLParser.MakeSQL("SELECT * from %q", ConfigurationSettings.AppSettings["vwIAMemberPFTransaction"]);
        //    ds = tc.ExecuteDataSet(sql);
        //    ds.Tables[0].TableName = "MembersTransactions";
        //    return ds;
        //}

        //internal static DataSet GetTransactionMembers(TransactionContext tc, string queryString)
        //{
        //    DataSet ds = new DataSet();
        //    string sql = string.Empty;
        //    sql = SQLParser.MakeSQL("SELECT * from %q WHERE %q", ConfigurationSettings.AppSettings["vwMembersContribution"], queryString);
        //    ds = tc.ExecuteDataSet(sql);
        //    ds.Tables[0].TableName = "MembersTransactions";
        //    return ds;
        //}

        internal static void DeleteYearEndInterestTran(TransactionContext tc, DateTime yearEndDate)
        {
            tc.ExecuteNonQuery(
                "DELETE FROM MembersTransactionDetails WHERE TranDate BETWEEN %d AND %d AND TranTypeID in (%n,%n) ",
                PayrollGlobalFunctions.PayrollFirstDateOfMonth(yearEndDate),
                yearEndDate, EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest,
                EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest);
        }

        internal static DataSet GetGFProvissionMember(TransactionContext tc, DateTime month)
        {
            DataSet ds = new DataSet();
            string sql = string.Empty;
            sql = SQLParser.MakeSQL("SELECT * from vw_MonthlyGFProvision WHERE MonthYearDate = %d", month);
            ds = tc.ExecuteDataSet(sql);
            //ds.Tables[0].TableName = "MembersMonthlyGFProvision";
            return ds;
        }

        #endregion

        #region Delete function

        internal static void Delete(TransactionContext tc, int TranID)
        {
            tc.ExecuteNonQuery("DELETE FROM MembersTransactionDetails WHERE TranID=%n", TranID);
        }

        internal static void DeleteMemberSettlement(TransactionContext tc, int TranID, int memberID)
        {
            tc.ExecuteNonQuery("DELETE FROM MembersTransactionDetails WHERE TranID=%n and MemberID =%n", TranID,
                memberID);
        }

        internal static void DeleteGFMemberSettlement(TransactionContext tc, int memberID, DateTime tranDate,
            decimal amount, int projectID)
        {
            tc.ExecuteNonQuery(
                "DELETE FROM MembersTransactionDetails WHERE MemberID =%n AND TranDate=%d AND Amount=%n and ProjectID=%n",
                memberID, tranDate, amount, projectID);
        }

        #endregion

        internal static bool ISExistMonth(TransactionContext tc, DateTime month, int fundID, int tranID, int fundtypeid)
        {
            string sSQL = SQLParser.MakeSQL(@"SELECT COUNT(*) FROM MembersTransactionDetails WHERE TranDate = %d 
            and FundTypeID = %n AND TranTypeID = %n AND ProjectID=%n", month, fundID, tranID, fundtypeid);
            object ob = tc.ExecuteScalar(sSQL);
            return Convert.ToInt32(ob) > 0;
        }

        internal static bool IsExistMemberContribution(TransactionContext tc, int memberID, DateTime month, int fundID,
            int tranID, int fundtypeid)
        {
            object ob = tc.ExecuteScalar(@"SELECT COUNT(*) FROM MembersTransactionDetails WHERE MemberID =%n AND 
            TranDate = %d and FundTypeID = %n AND TranTypeID = %n AND ProjectID=%n", memberID, month, fundID, tranID,
                fundtypeid);
            return Convert.ToInt32(ob) > 0;
        }

        internal static bool ISExist(TransactionContext tc, string tableName, int fundtypeid)
        {
            string sql = string.Empty;
            sql = SQLParser.MakeSQL("SELECT COUNT(*) FROM %q WHERE ProjectID=%n", tableName, fundtypeid);
            object ob = tc.ExecuteScalar(sql);
            return Convert.ToInt32(ob) > 0;
        }

        internal static bool IsExist(TransactionContext tc, int projectID)
        {
            string sql = string.Empty;
            //DateTime dt = Convert.ToDateTime("28 Feb 2007"); //("2/28/2007");
            //sql = SQLParser.MakeSQL("SELECT Count(*) FROM MembersTransactionDetails WHERE ProjectID = %n AND TranTypeID = %n and TranDate = %d ", projectID, 3, Convert.ToDateTime("28 Feb 2007"));
            sql = SQLParser.MakeSQL(
                "SELECT Count(*) FROM MembersTransactionDetails WHERE ProjectID = %n AND TranTypeID = %n and TranDate = %d ",
                projectID, 3,
                Convert.ToDateTime("31 Dec 2011"));
            object ob = tc.ExecuteScalar(sql);
            return Convert.ToInt32(ob) > 0;
        }


        internal static DataSet GetTranAmount(TransactionContext tc, int EmpID, DateTime dtYearEnd)
        {
            DataSet oBonusPaySlip = new DataSet();
            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund);
            string trantypeOpeC = Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
            string opeInterestEPF = Convert.ToString((int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest);
            string opeInterestCPF = Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest);


            string sSQL = SQLParser.MakeSQL(
                @"Select  (aa.EPF - aa.EPFWithdrawal) EPF,(aa.CPF - aa.CPFWithdrawal) CPF,EPFINTEREST,CPFINTEREST,(aa.CUREPF - aa.CUREPFWithdrawal) CUREPF,
                                              (aa.CURCPF - aa.CURCPFWithdrawal) CURCPF,CUREPFInterest,CURCPFInterest From
                                              (SELECT
                                              SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) and TranDate <= %d THEN Amount ELSE 0 END)  EPF,
                                              SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) and TranDate <= %d THEN Amount ELSE 0 END)  CPF,
                                              SUM(CASE WHEN   FundTypeId= %n and TranTypeId = %n and TranDate <= %d THEN Amount ELSE 0 END)  EPFWithdrawal,
                                              SUM(CASE WHEN   FundTypeId= %n and TranTypeId = %n and TranDate <= %d THEN Amount ELSE 0 END)  CPFWithdrawal,
                                              SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) and TranDate <= %d THEN Amount ELSE 0 END)  EPFINTEREST,
                                              SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) and TranDate <= %d THEN Amount ELSE 0 END)  CPFINTEREST,
                                              SUM(CASE WHEN   FundTypeID =%n AND TranTypeID in (%q) AND TranDate >  %d THEN Amount ELSE 0 END)  CUREPF,
                                              SUM(CASE WHEN   FundTypeID =%n AND TranTypeID in (%q) AND TranDate >  %d THEN Amount ELSE 0 END)  CURCPF,
                                              SUM(CASE WHEN   FundTypeID =%n AND TranTypeID =%n AND TranDate >  %d THEN Amount ELSE 0 END)  CUREPFWithdrawal,
                                              SUM(CASE WHEN   FundTypeID =%n AND TranTypeID =%n AND TranDate >  %d THEN Amount ELSE 0 END)  CURCPFWithdrawal,
                                              SUM(CASE WHEN   FundTypeID =%n AND TranTypeID in (%q) AND TranDate >  %d THEN Amount ELSE 0 END)  CUREPFInterest,
                                              SUM(CASE WHEN   FundTypeID =%n AND TranTypeID in (%q) AND TranDate >  %d THEN Amount ELSE 0 END)  CURCPFInterest
                                              from MembersTransactionDetails where MemberID=%n) aa",
                (int)EnumFundType.PF_EPF, tranTypeOpeE,
                dtYearEnd, (int)EnumFundType.PF_CPF, trantypeOpeC, dtYearEnd, (int)EnumFundType.PF_EPF,
                (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund,
                dtYearEnd, (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund, dtYearEnd,
                (int)EnumFundType.PF_EPF,
                opeInterestEPF, dtYearEnd, (int)EnumFundType.PF_CPF, opeInterestCPF, dtYearEnd,
                (int)EnumFundType.PF_EPF,
                tranTypeOpeE, dtYearEnd, (int)EnumFundType.PF_CPF,
                trantypeOpeC, dtYearEnd, (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund,
                dtYearEnd, (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund, dtYearEnd,
                (int)EnumFundType.PF_EPF, opeInterestEPF, dtYearEnd,
                (int)EnumFundType.PF_CPF, opeInterestCPF, dtYearEnd, EmpID);
            oBonusPaySlip = tc.ExecuteDataSet(sSQL);
            return oBonusPaySlip;
        }

        internal static DataSet GetTranAmount(TransactionContext tc, string memberID, DateTime dtFirst, DateTime dtLast)
        {
            DataSet rootDataset = new DataSet();
            DataSet tempdataset = new DataSet();
            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund);
            string trantypeOpeC = Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
            string sSQLLive = SQLParser.MakeSQL(@"
                                                        Select * from 
                            (SELECT mem.EmpCode,mem.Name,memTran.memberID ,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPF,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPF,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n      and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFINTEREST,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFINTEREST,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate > %d THEN memTran.Amount ELSE 0 END) AS EPFINTERESTMon,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate > %d THEN memTran.Amount ELSE 0 END) AS CPFINTERESTMon,
                            SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CUREPF,
                            SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CURCPF,
                            SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CUREPFINTEREST,
                            SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CURCPFINTEREST,
                            SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n      AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLEPF,
                            SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n      AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLCPF
                            from MemberDetail mem 
                            inner join  MembersTransactionDetails memTran on mem.MemberID = memTran.MemberID
                            where memTran.MemberID in(%q) 
                            group by memTran.MemberID,mem.EmpCode,mem.Name)A
                            ", (int)EnumFundType.PF_EPF, tranTypeOpeE, dtFirst, (int)EnumFundType.PF_CPF, trantypeOpeC,
                dtFirst, (int)EnumFundType.PF_EPF,
                (int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest, dtFirst, (int)EnumFundType.PF_CPF,
                (int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest,
                dtFirst, (int)EnumFundType.PF_EPF, EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest, dtFirst,
                (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest,
                dtFirst, (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund, dtFirst,
                (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund,
                dtFirst, (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest, dtFirst,
                (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest,
                dtFirst, (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund, dtFirst,
                (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund,
                dtFirst, memberID);
            tempdataset = tc.ExecuteDataSet(sSQLLive);
            tempdataset.Tables[0].TableName = "Member";
            rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

            #region Old Code

            //            memberID = "";
            //            var Resigningmember = (from mem in members
            //                                  where mem.Status == EnumEmpStatus.Setteled
            //                                  select mem);

            //            foreach (var mem in Resigningmember)
            //            {
            //                if (memberID == "")
            //                {
            //                    memberID = mem.ID.ToString();
            //                }
            //                else if (memberID != "")
            //                {
            //                    memberID = memberID + "," + mem.ID.ToString();
            //                }
            //            }
            //            if (memberID != "")
            //            {
            //            string sSQLResigning = SQLParser.MakeSQL(@"
            //                            SELECT FS.EmpCode,mem.Name,memTran.memberID ,
            //                            SUM(CASE WHEN   memTran.FundTypeId= 1 and memTran.TranTypeId in (3,1) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPF,
            //                            SUM(CASE WHEN   memTran.FundTypeId= 2 and memTran.TranTypeId in (4,2) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPF,
            //                            SUM(CASE WHEN   memTran.FundTypeId= 1 and memTran.TranTypeId =5       and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFINTEREST,
            //                            SUM(CASE WHEN   memTran.FundTypeId= 2 and memTran.TranTypeId =6       and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFINTEREST,
            //                            SUM(CASE WHEN   memTran.FundTypeID =1 AND memTran.TranTypeID =1       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CUREPF,
            //                            SUM(CASE WHEN   memTran.FundTypeID =2 AND memTran.TranTypeID =2       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CURCPF,
            //                            SUM(CASE WHEN   memTran.FundTypeID =1 AND memTran.TranTypeID =5       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CUREPFINTEREST,
            //                            SUM(CASE WHEN   memTran.FundTypeID =2 AND memTran.TranTypeID =6       AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS CURCPFINTEREST,
            //                            SUM(CASE WHEN   memTran.FundTypeID =1 AND memTran.TranTypeID =22      AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLEPF,
            //                            SUM(CASE WHEN   memTran.FundTypeID =2 AND memTran.TranTypeID =23      AND memTran.TranDate >  %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLCPF
            //                            from MemberDetail mem 
            //                            inner join  MembersTransactionDetails memTran on mem.MemberID = memTran.MemberID
            //                            inner join FinalSettlement FS on mem.MemberID = FS.MemberID
            //                            where FS.MemberID in(%q) and FS.SettlementDate between %d and %d group by memTran.MemberID,mem.EmpCode,mem.Name", 
            //                            dtFirst, dtFirst, dtFirst, dtFirst, dtFirst, dtFirst, dtFirst, dtFirst, dtFirst,
            //                            dtFirst, memberID,dtFirst,dtLast);
            //            tempdataset = tc.ExecuteDataSet(sSQLResigning);
            //            tempdataset.Tables[0].TableName = "ResigningMember";
            //            rootDataset.Tables.Add(tempdataset.Tables[0].Copy());
            //            }

            #endregion

            return rootDataset;
        }

        internal static IDataReader GetMembersAccount(TransactionContext tc, string smemberId, DateTime fromMonth,
            DateTime toMonth, EnumMemberDvdntDuration divDuration)
        {
            int firstMonth = fromMonth.Month;
            string sSQL = string.Empty;
            int ntoMonth = 0;

            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund);
            string trantypeOpeC = Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
            string fundtype =
                Convert.ToString((int)EnumMemberTranType
                    .Contribution_Of_Employee_Provident_Fund); // +"," + Convert.ToString((int)EnumMemberTranType.Contribution_Of_CPF);
            string withdrawal = Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund) + "," +
                                Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund);
            string opeWithdrawalInterest = Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest) + "," +
                                           Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest);

            if (divDuration == EnumMemberDvdntDuration.Half_Yearly)
            {
                ntoMonth = firstMonth + 5;

                sSQL = SQLParser.MakeSQL(@"SELECT mem.EmpCode,mem.Name,memTran.memberID ,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS EPF,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS CPF,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS EPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS CPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS firstCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SecondCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS thiredCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FourthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FifthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SixthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%q)AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLPrin,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFInterestWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFInterestWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate = %d THEN memTran.Amount ELSE 0 END )AS EPFYearEndInterest,
                            SUM(CASE WHEN memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate = %d THEN memTran.Amount ELSE 0 END )AS CPFYearEndInterest
                            from MemberDetail mem 
                            inner join  MembersTransactionDetails memTran on mem.MemberID = memTran.MemberID
                            where memTran.MemberID in(%q)  group by memTran.MemberID,mem.EmpCode,mem.Name
                            order by memTran.MemberID", (int)EnumFundType.PF_EPF, tranTypeOpeE,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth), (int)EnumFundType.PF_CPF, trantypeOpeC,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(1)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(1)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(2)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(2)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(3)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(3)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(4)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(4)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(toMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), fundtype, withdrawal,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), smemberId);
            }
            else if (divDuration == EnumMemberDvdntDuration.Yearly)
            {
                sSQL = SQLParser.MakeSQL(@"SELECT mem.EmpCode,mem.Name,memTran.memberID ,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS EPF,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS CPF,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS EPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate <%d THEN memTran.Amount ELSE 0 END) AS CPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS firstCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SecondCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS thiredCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FourthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FifthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SixthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SeventhCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS EigthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS NinthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS TenthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS EleventhCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS TwelvthCUREPFCPF,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFINTEREST,
                            SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%q)AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLPrin,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFInterestWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFInterestWithdrawal,
                            SUM(CASE WHEN memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate = %d THEN memTran.Amount ELSE 0 END )AS EPFYearEndInterest,
                            SUM(CASE WHEN memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate = %d THEN memTran.Amount ELSE 0 END )AS CPFYearEndInterest
                            from MemberDetail mem 
                            inner join  MembersTransactionDetails memTran on mem.MemberID = memTran.MemberID
                            where memTran.MemberID in(%q)  group by memTran.MemberID,mem.EmpCode,mem.Name
                            order by memTran.MemberID", (int)EnumFundType.PF_EPF, tranTypeOpeE,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth), (int)EnumFundType.PF_CPF, trantypeOpeC,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(1)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(1)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(2)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(2)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(3)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(3)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(4)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(4)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(5)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(5)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(6)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(6)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(7)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(7)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(8)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(8)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(9)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(9)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth.AddMonths(10)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(fromMonth.AddMonths(10)),
                    fundtype, (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(toMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), fundtype, withdrawal,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(fromMonth),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(toMonth), smemberId);
            }

            return tc.ExecuteReader(sSQL);
        }

        internal static IDataReader GetMembersEPFCPF(TransactionContext tc, int EmpID, DateTime dateTime)
        {
            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund);
            string trantypeOpeC = Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
            string EPFInterest = Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest) + "," +
                                 Convert.ToString((int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest) + "," +
                                 Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest);
            string CPFInterest = Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest) + "," +
                                 Convert.ToString((int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest) + "," +
                                 Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest);

            string sSQL = SQLParser.MakeSQL(
                @" Select (a.EPF - IsNUll(a.EPFWithdrawal,0))as EPF,(a.CPF - IsNull(a.CPFWithdrawal,0)) as CPF,
                            (a.EPFInterest - a.EPFInterestWithdrawal)as EPFInterest,(a.CPFInterest - a.CPFInterestWithdrawal)as CPFInterest 
                            From (SELECT 
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPF,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPF,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%n) and memTran.TranDate <= %d THEN memTran.Amount ELSE 0 END) AS EPFWithdrawal,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%n) and memTran.TranDate <= %d THEN memTran.Amount ELSE 0 END) AS CPFWithdrawal,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFInterest,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFInterest,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%n) and memTran.TranDate <= %d THEN memTran.Amount ELSE 0 END) AS EPFInterestWithdrawal,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%n) and memTran.TranDate <= %d THEN memTran.Amount ELSE 0 END) AS CPFInterestWithdrawal
                            from   MembersTransactionDetails memTran where memTran.MemberID in(%q)) a",
                (int)EnumFundType.PF_EPF, tranTypeOpeE, PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime),
                (int)EnumFundType.PF_CPF, trantypeOpeC, PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime),
                (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund,
                PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime), (int)EnumFundType.PF_CPF,
                (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund, PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime),
                (int)EnumFundType.PF_EPF, EPFInterest, PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime),
                (int)EnumFundType.PF_CPF, CPFInterest,
                PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime), (int)EnumFundType.PF_EPF,
                (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest, PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime),
                (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest,
                PayrollGlobalFunctions.PayrollLastDateOfMonth(dateTime), EmpID);

            return tc.ExecuteReader(sSQL);
        }

        internal static IDataReader GetMembersAccountBeforeAfterAudit(TransactionContext tc, string smemberId,
            DateTime Fromdate, DateTime Todate, EnumMemberDvdntDuration divDuration)
        {
            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund);
            string trantypeOpeC = Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
            string fundtype = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund) + "," +
                              Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
            string withdrawal = Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund) + "," +
                                Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund);
            string sSQL = string.Empty;

            if (divDuration == EnumMemberDvdntDuration.Yearly)
            {
                sSQL = SQLParser.MakeSQL(
                    @"Select FS.EmpCode,mem.Name,memTran.memberID ,FS.SettlementDate as ResignationDate,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPF,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPF,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n      and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS firstCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SecondCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS thiredCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FourthCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FifthCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SixthCUREPFCPF,
                        SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SeventhCUREPFCPF,
                        SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS EigthCUREPFCPF,
                        SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS NinthCUREPFCPF,
                        SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS TenthCUREPFCPF,
                        SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS EleventhCUREPFCPF,
                        SUM(CASE WHEN memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS TwelvthCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate  between %d  and %d THEN memTran.Amount ELSE 0 END) AS CurEPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLEPFPrin,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLCPFPrin,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLEPFInterestPrin,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLCPFInterestPrin
                        from MemberDetail mem 
                        inner join  MembersTransactionDetails memTran on mem.MemberID = memTran.MemberID
                        inner join FinalSettlement FS on mem.MemberID = FS.MemberID
                        where FS.MemberID in(%q) AND FS.SettlementDate between %d and %d 
                        group by memTran.MemberID,FS.EmpCode,mem.Name,FS.SettlementDate
                        order by memTran.MemberID", (int)EnumFundType.PF_EPF, tranTypeOpeE,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate), (int)EnumFundType.PF_CPF, trantypeOpeC,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(1)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(1)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(2)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(2)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(3)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(3)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(4)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(4)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(5)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(5)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(6)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(6)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(7)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(7)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(8)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(8)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(9)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(9)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(10)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(10)),
                    fundtype, (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Todate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), smemberId,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate));
            }
            else if (divDuration == EnumMemberDvdntDuration.Half_Yearly)
            {
                sSQL = SQLParser.MakeSQL(
                    @"Select FS.EmpCode,mem.Name,memTran.memberID ,FS.SettlementDate as ResignationDate,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPF,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPF,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n      and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS firstCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SecondCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS thiredCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FourthCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS FifthCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeID in(%q) AND memTran.TranTypeID in(%n) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS SixthCUREPFCPF,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate  between %d  and %d THEN memTran.Amount ELSE 0 END) AS CurEPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n       and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFINTEREST,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLEPFPrin,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLCPFPrin,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLEPFInterestPrin,
                        SUM(CASE WHEN   memTran.FundTypeID =%n AND memTran.TranTypeID =%n  AND memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS WITHDRAWLCPFInterestPrin
                        from MemberDetail mem 
                        inner join  MembersTransactionDetails memTran on mem.MemberID = memTran.MemberID
                        inner join FinalSettlement FS on mem.MemberID = FS.MemberID
                        where FS.MemberID in(%q) AND FS.SettlementDate between %d and %d 
                        group by memTran.MemberID,FS.EmpCode,mem.Name,FS.SettlementDate
                        order by memTran.MemberID", (int)EnumFundType.PF_EPF, tranTypeOpeE,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate), (int)EnumFundType.PF_CPF, trantypeOpeC,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(1)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(1)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(2)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(2)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(3)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(3)), fundtype,
                    (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate.AddMonths(4)),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Fromdate.AddMonths(4)),
                    fundtype, (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Todate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate), smemberId,
                    PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate),
                    PayrollGlobalFunctions.PayrollLastDateOfMonth(Todate));
            }

            return tc.ExecuteReader(sSQL);
        }

        internal static double GetOpeningBalance(TransactionContext tc, int memberID, int fundType, DateTime FromDate)
        {
            string sql = string.Empty;
            sql = SQLParser.MakeSQL(@"SELECT SUM(Amount) AS OpeningBalance
                                    FROM MembersTransactionDetails
                                    WHERE MemberID = %n AND FundTypeID = %n AND TranDate< %d;", memberID, fundType,
                 PayrollGlobalFunctions.PayrollFirstDateOfMonth(FromDate));



            object ob = tc.ExecuteScalar(sql);

            double amount = 0;
            if (ob != DBNull.Value)
            {
                amount = Convert.ToDouble(ob);
            }

            return amount;
        }

        internal static double GetOpeningBalance(int memberID, int fundType, DateTime FromDate, string FMConn)
        {
            object ob =  new object();
            double amount = 0;

            try
            {
                using (SqlConnection connection = new SqlConnection(FMConn))
                {
                    connection.Open();
                    string commandText = @"SELECT SUM(Amount) AS OpeningBalance
                                    FROM MembersTransactionDetails
                                    WHERE MemberID = @memberid AND FundTypeID = @fundtype AND TranDate< @trandate; ";

                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandText = commandText;
                    cmd.Connection = connection;


                    //cmd.Parameters.Add("memberid", SqlDbType.Int);
                    //cmd.Parameters["memberid"].Value = memberID;

                    //cmd.Parameters.Add("fundtype", SqlDbType.Int);
                    //cmd.Parameters["fundtype"].Value = fundType;

                    //cmd.Parameters.Add("trandate", SqlDbType.DateTime);
                    //cmd.Parameters["trandate"].Value = PayrollGlobalFunctions.PayrollFirstDateOfMonth(FromDate);

                    cmd.Parameters.AddWithValue("@memberid", memberID);
                    cmd.Parameters.AddWithValue("@fundtype", fundType);
                    cmd.Parameters.AddWithValue("@trandate", PayrollGlobalFunctions.PayrollFirstDateOfMonth(FromDate));


                    cmd.Connection = connection;

                    ob = cmd.ExecuteScalar();
                    cmd.Dispose();
                    connection.Close();

                    if (ob != DBNull.Value && ob != null)
                    {
                        amount = Convert.ToDouble(ob);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            return amount;
        }

        internal static double GetSettledInterest(TransactionContext tc, int memberID)
        {
            string sql = string.Empty;
            sql = SQLParser.MakeSQL(@"select SUM(Amount)as OpeningBalance from dbo.MembersTransactionDetails 
                                        where MemberID = %n and TranTypeID (%n, %n)", memberID,
                EnumMemberTranType.Settlement_Interest_Employee_Provident_Fund, EnumMemberTranType.Settlement_Interest_Company_Provident_Fund);
            object ob = tc.ExecuteScalar(sql);

            double amount = 0;
            if (ob != DBNull.Value)
            {
                amount = Convert.ToDouble(ob);
            }

            return amount;
        }

        internal static DataSet GetOpeningBalance(TransactionContext tc, string memberID, int fundType,
            DateTime FromDate)
        {
            DataSet oOpeningBalance = new DataSet();
            string sSQL = SQLParser.MakeSQL(
                @"select memD.MemberID,mem.EmpCode,mem.Name,SUM(memD.Amount)as OpeningBalance from dbo.MemberDetail mem
                                                inner join dbo.MembersTransactionDetails memD on mem.MemberID = memD.MemberID
                                                where mem.MemberID in(%q) and memD.FundTypeID = %n And memD.TranDate < %d
                                                Group by memD.MemberID,mem.EmpCode,mem.Name order by memD.MemberID",
                memberID, fundType, PayrollGlobalFunctions.PayrollFirstDateOfMonth(FromDate));

            oOpeningBalance = tc.ExecuteDataSet(sSQL);
            return oOpeningBalance;
        }

        internal static DataSet GetMembersYearlyBalance(TransactionContext tc, DateTime FromDate, DateTime ToDate)
        {
            DataSet rootDataset = new DataSet();
            DataSet tempdataset = new DataSet();
            try
            {
                string opeEPFInterest = Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest) + "," +
                                        Convert.ToString((int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest) + "," +
                                        Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest)
                                        + "," + Convert.ToString((int)EnumMemberTranType.Settlement_Interest_Employee_Provident_Fund);
                string opeCPFInterest = Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest) + "," +
                                        Convert.ToString((int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest) + "," +
                                        Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest)
                                        + "," + Convert.ToString((int)EnumMemberTranType.Settlement_Interest_Company_Provident_Fund);
                string opeEPFQuery = Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                                     Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund);
                string OpeCPFQuery = Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                                     Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
                string sSQLOpe = SQLParser.MakeSQL(
                    @"Select aa.MemberID,(aa.EPF - aa.EPFWithdrawal) EPF,(aa.CPF - aa.CPFWithdrawal) CPF From 
                            (Select memTran.MemberID,
                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPF,
                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId in (%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPF,
                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFWithdrawal,
                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFWithdrawal
                            from MembersTransactionDetails memTran 
                            inner join MemberDetail md on memTran.MemberID = md.MemberID
                            WHERE memTran.TranDate < %d
                            group by memTran.MemberID,md.EmpCode)aa order by aa.MemberID",
                    (int)EnumFundType.PF_EPF, opeEPFQuery, FromDate, (int)EnumFundType.PF_CPF, OpeCPFQuery, FromDate,
                    (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund, FromDate,
                    (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund, FromDate, FromDate);

                tempdataset = tc.ExecuteDataSet(sSQLOpe);
                tempdataset.Tables[0].TableName = "OpeningBalance";
                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

                string OpeEPFInterestQuery = SQLParser.MakeSQL(
                    @"Select aa.MemberID,(aa.EPFINTEREST - aa.EPFInterestWithdrawal) EPFINTEREST,(aa.CPFINTEREST - aa.CPFInterestWithdrawal) CPFINTEREST From 
                            (Select memTran.MemberID,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in(%q) and memTran.TranDate < %d  THEN memTran.Amount ELSE 0 END) AS EPFINTEREST,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in(%q) and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFINTEREST,
                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFInterestWithdrawal,
                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFInterestWithdrawal
                            from MembersTransactionDetails memTran 
                            inner join MemberDetail md on memTran.MemberID = md.MemberID
                            WHERE memTran.TranDate < %d
                            group by memTran.MemberID,md.EmpCode )aa order by aa.MemberID",
                    (int)EnumFundType.PF_EPF, opeEPFInterest, FromDate, (int)EnumFundType.PF_CPF, opeCPFInterest,
                    FromDate, (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest, FromDate, (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest, FromDate, FromDate);

                tempdataset = tc.ExecuteDataSet(OpeEPFInterestQuery);
                tempdataset.Tables[0].TableName = "OpeningBalanceInterest";
                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

                string sqlCurEPF = SQLParser.MakeSQL(@"Select memTran.MemberID,
                            SUM(CASE WHEN   memTran.FundTypeID = %n AND memTran.TranTypeID in (%q) AND memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPF,
                            SUM(CASE WHEN   memTran.FundTypeID = %n AND memTran.TranTypeID in (%q) AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS CurCPF
                            from MembersTransactionDetails memTran 
                            inner join MemberDetail md on memTran.MemberID = md.MemberID
                            WHERE memTran.TranDate between %d and %d
                            group by memTran.MemberID,md.EmpCode order by md.EmpCode",
                    (int)EnumFundType.PF_EPF, opeEPFQuery, FromDate, ToDate, (int)EnumFundType.PF_CPF, OpeCPFQuery,
                    FromDate, ToDate, FromDate, ToDate);

                tempdataset = tc.ExecuteDataSet(sqlCurEPF);
                tempdataset.Tables[0].TableName = "CurBalanceEPF";
                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

                string sqlCurInterest = SQLParser.MakeSQL(@"Select memTran.MemberID,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in(%q) and memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFINTEREST,
                            SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in(%q) and memTran.TranDate between %d And %d THEN memTran.Amount ELSE 0 END) AS CurCPFINTEREST
                            from MembersTransactionDetails memTran 
                            inner join MemberDetail md on memTran.MemberID = md.MemberID
                            WHERE memTran.TranDate between %d and %d
                            group by memTran.MemberID,md.EmpCode order by md.EmpCode",
                    (int)EnumFundType.PF_EPF, opeEPFInterest, FromDate, ToDate, (int)EnumFundType.PF_CPF,
                    opeCPFInterest, FromDate, ToDate
                    , FromDate, ToDate);

                tempdataset = tc.ExecuteDataSet(sqlCurInterest);
                tempdataset.Tables[0].TableName = "CurBalanceInterest";
                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

                //                string sqlOpeningWithdrawal = SQLParser.MakeSQL(@"Select memTran.MemberID,
                //                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFWithdrawal,
                //                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFWithdrawal
                //                            from MembersTransactionDetails memTran 
                //                            inner join dbo.MemberDetail md on memTran.MemberID = md.MemberID
                //                            group by memTran.MemberID,md.EmpCode order by md.EmpCode",
                //                            (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.WithdrawlOfEPF, FromDate, (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.WithdrawlOfCPF, FromDate);

                //                tempdataset = tc.ExecuteDataSet(sqlOpeningWithdrawal);
                //                tempdataset.Tables[0].TableName = "BalancePFWithdrawal";
                //                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

                string sqlCurPFWithdrawal = SQLParser.MakeSQL(@"Select memTran.MemberID,
                            SUM(CASE WHEN   memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate  between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFWithdrawal,
                            SUM(CASE WHEN   memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS CurCPFWithdrawal
                            from MembersTransactionDetails memTran 
                            inner join MemberDetail md on memTran.MemberID = md.MemberID
                            WHERE memTran.TranDate between %d and %d
                            group by memTran.MemberID,md.EmpCode order by md.EmpCode",
                    (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund, FromDate, ToDate,
                    (int)EnumFundType.PF_CPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund, FromDate, ToDate, FromDate, ToDate);

                tempdataset = tc.ExecuteDataSet(sqlCurPFWithdrawal);
                tempdataset.Tables[0].TableName = "CurBalanceWithdrawal";
                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

                //                string sqlOpeningInterestWithdrawal = SQLParser.MakeSQL(@"Select memTran.MemberID,
                //                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS EPFInterestWithdrawal,
                //                            SUM(CASE WHEN   memTran.FundTypeId = %n and memTran.TranTypeId = %n and memTran.TranDate < %d THEN memTran.Amount ELSE 0 END) AS CPFInterestWithdrawal
                //                            from MembersTransactionDetails memTran 
                //                            inner join dbo.MemberDetail md on memTran.MemberID = md.MemberID 
                //                            group by memTran.MemberID,md.EmpCode order by md.EmpCode",(int)EnumFundType.PF_EPF,
                //                            (int)EnumMemberTranType.WithdrawlOfEPFInterest, FromDate, (int)EnumFundType.PF_CPF, 
                //                            (int)EnumMemberTranType.WithdrawlOfCPFInterest, FromDate);

                //                tempdataset = tc.ExecuteDataSet(sqlOpeningInterestWithdrawal);
                //                tempdataset.Tables[0].TableName = "OpeningInterestBalanceWithdrawal";
                //                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());

                string sqlcurpfInterestWithdrawal = SQLParser.MakeSQL(@"Select memTran.MemberID,
                        SUM(CASE WHEN   memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS CurEPFInterestWithdrawal,
                        SUM(CASE WHEN   memTran.FundTypeID = %n AND memTran.TranTypeID = %n AND memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) AS CurCPFInterestWithdrawal
                        from MembersTransactionDetails memTran 
                        inner join MemberDetail md on memTran.MemberID = md.MemberID
                        WHERE memTran.TranDate between %d and %d
                        group by memTran.MemberID,md.EmpCode order by md.EmpCode", (int)EnumFundType.PF_EPF,
                    (int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest,
                    FromDate, ToDate, (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest,
                    FromDate, ToDate
                    , FromDate, ToDate);

                tempdataset = tc.ExecuteDataSet(sqlcurpfInterestWithdrawal);
                tempdataset.Tables[0].TableName = "curpfInterestBalanceWithdrawal";
                rootDataset.Tables.Add(tempdataset.Tables[0].Copy());
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            return rootDataset;
        }

        internal static DataSet GetTranAmountForCalculate(TransactionContext tc, int memberID, DateTime dtYearEnd)
        {
            DataSet oBonusPaySlip = new DataSet();
            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);

            string sSQL = SQLParser.MakeSQL(@"Select sum(Amount)  TranAmount,TranDate from MembersTransactionDetails
                                            where  TranDate > %d And MemberID = %n And TranTypeID in(%q)
                                            group by TranDate ", dtYearEnd, memberID, tranTypeOpeE);

            oBonusPaySlip = tc.ExecuteDataSet(sSQL);
            return oBonusPaySlip;
        }

        internal static DataSet GetTranAmountForCalculate(TransactionContext tc, int memberID, DateTime dtYearEnd,
            DateTime dtMonthEnd)
        {
            DataSet oBonusPaySlip = new DataSet();
            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);

            string sSQL = SQLParser.MakeSQL(@"Select sum(Amount)  TranAmount,TranDate from MembersTransactionDetails
                                            where  TranDate Between %d And %d And MemberID = %n And TranTypeID in(%q)
                                            group by TranDate ", dtYearEnd, dtMonthEnd, memberID, tranTypeOpeE);

            oBonusPaySlip = tc.ExecuteDataSet(sSQL);
            return oBonusPaySlip;
        }

        internal static IDataReader GetSettledInterest(TransactionContext tc, DateTime Trandate, string tranType,
            int memberID)
        {
            string sqlString = string.Empty;
            sqlString = SQLParser.MakeSQL(
                "SELECT * FROM MembersTransactionDetails WHERE TranDate = %d AND TranTypeID in(%q) AND MemberID = %n ",
                Trandate, tranType, memberID);
            return tc.ExecuteReader(sqlString);
        }

        internal static DataSet GetIndividualPFBalance(TransactionContext tc, DateTime Fromdate, DateTime dtYearEnd,
            DateTime tillDate, string sEmpID)
        {
            DateTime dtFrom = PayrollGlobalFunctions.PayrollFirstDateOfMonth(dtYearEnd.AddMonths(1));
            DataSet oIndividualPFBalance = new DataSet();
            string tranTypeOpeE = Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund);
            string trantypeOpeC = Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund);
            Fromdate = PayrollGlobalFunctions.PayrollFirstDateOfMonth(Fromdate);
            string sSQL = SQLParser.MakeSQL(
                @"SELECT mem.EmpCode,mem.Name,memTran.memberID ,mem.CurrentDesig,mem.DOJ,Max(memTran.TranDate)as Trandate,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) EPF,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId in (%q) and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) CPF,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) EPFINTEREST,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) CPFINTEREST,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) CurEPF,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) CurCPF,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) CurEPFINTEREST,
                SUM(CASE WHEN   memTran.FundTypeId= %n and memTran.TranTypeId =%n and memTran.TranDate between %d and %d THEN memTran.Amount ELSE 0 END) CurCPFINTEREST
                from MemberDetail mem 
                inner join  MembersTransactionDetails memTran on mem.MemberID = memTran.MemberID
                where memTran.MemberID in(%q)  
                group by memTran.MemberID,mem.EmpCode,mem.Name,mem.CurrentDesig,mem.DOJ
                order by memTran.MemberID", (int)EnumFundType.PF_EPF, tranTypeOpeE, Fromdate, dtYearEnd,
                (int)EnumFundType.PF_CPF, trantypeOpeC, Fromdate, dtYearEnd, (int)EnumFundType.PF_EPF,
                (int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest, Fromdate, dtYearEnd, (int)EnumFundType.PF_CPF,
                (int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest,
                Fromdate, dtYearEnd, (int)EnumFundType.PF_EPF, (int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund, dtFrom,
                tillDate, (int)EnumFundType.PF_CPF,
                (int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund, dtFrom, tillDate, (int)EnumFundType.PF_EPF,
                (int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest,
                dtFrom, tillDate, (int)EnumFundType.PF_CPF, (int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest, dtFrom,
                tillDate, sEmpID);

            oIndividualPFBalance = tc.ExecuteDataSet(sSQL);
            return oIndividualPFBalance;
        }

        internal static DataSet GetFunds(TransactionContext tc, int MembersID)
        {
            string ssql = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund) + "," +
                          Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund) + "," +
                          Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                          Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                          Convert.ToString((int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest) + "," +
                          Convert.ToString((int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest);
            string sSQL =
                SQLParser.MakeSQL("SELECT * FROM MembersTransactionDetails WHERE MemberID=%n And TranTypeID in(%q)",
                    MembersID, ssql);
            DataSet ds = tc.ExecuteDataSet(sSQL);
            return ds;
        }

        internal static DataSet GetMemberContribution2(TransactionContext tc, int memberID, string Date)
        {
            DataSet oIndividualPFBalance = new DataSet();

            string sEpf = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund) + "," +
                          Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund);
            string sCpf = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund) + "," +
                          Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund);
            string sEpfInterest = Convert.ToString((int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest)
                                  + "," + Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest + "," +
                                                           Convert.ToString((int)EnumMemberTranType
                                                               .Settlement_Interest_Employee_Provident_Fund));
            string sCpfInterest = Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest) + "," +
                                  Convert.ToString((int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest)
                                  + "," + Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest + "," +
                                                           Convert.ToString((int)EnumMemberTranType
                                                               .Settlement_Interest_Company_Provident_Fund));

            string sSQL = SQLParser.MakeSQL(@"SELECT
                                SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) %q THEN Amount ELSE 0 END) AS EPF,
                                SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) %q THEN Amount ELSE 0 END) AS CPF,
                                SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) %q THEN Amount ELSE 0 END) AS EPFINTEREST,
                                SUM(CASE WHEN   FundTypeId= %n and TranTypeId in (%q) %q THEN Amount ELSE 0 END) AS CPFINTEREST
                                from MembersTransactionDetails where MemberID=%n",
                (int)EnumFundType.PF_EPF, sEpf, Date, (int)EnumFundType.PF_CPF, sCpf, Date, (int)EnumFundType.PF_EPF,
                sEpfInterest,
                Date, (int)EnumFundType.PF_CPF, sCpfInterest, Date, memberID);

            oIndividualPFBalance = tc.ExecuteDataSet(sSQL);
            return oIndividualPFBalance;
        }

        internal static DateTime GetMonth(TransactionContext tc, int memberID)
        {
            string sql = string.Empty;
            sql = SQLParser.MakeSQL(@"Select Max(TranDate)as TranDate from MembersTransactionDetails where MemberID=%n",
                memberID);

            object ob = tc.ExecuteScalar(sql);
            DateTime dt = DateTime.MinValue;
            if (ob != DBNull.Value)
            {
                dt = Convert.ToDateTime(ob);
            }

            return dt;
        }

        internal static double GetCurBalance(TransactionContext tc, int memberID, DateTime balanceMonth)
        {
            string sql = string.Empty;
            string sBalance = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund) + "," +
                              Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund) +
                              "," + Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                              Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                              Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest) + "," +
                              Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest) +
                              "," + Convert.ToString((int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest) + "," +
                              Convert.ToString((int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest);
            //+"," + Convert.ToString((int)EnumMemberTranType.Yearly_Actual_EPF_Interest) + "," + Convert.ToString((int)EnumMemberTranType.Yearly_Actual_CPF_Interest);

            string sDeductBalance = Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund) +
                                    "," + Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest) +
                                    "," + Convert.ToString((int)EnumMemberTranType.Settlement_Interest_Employee_Provident_Fund) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Settlement_Interest_Company_Provident_Fund);

            sql = SQLParser.MakeSQL(@"SELECT (Balance - DeductBalance)AS OpeningBalance from
                            (select 
                            SUM(Case when   TranTypeID in(%q) AND TranDate between %d And %d THEN  Amount ELSE 0 End)as Balance ,
                            SUM(CASE WHEN TranTypeID IN(%q) AND  TranDate between %d And %d THEN  Amount ELSE 0 End)AS DeductBalance
                            from dbo.MembersTransactionDetails 
                            where MemberID = %n)AS tab1", sBalance,
                PayrollGlobalFunctions.PayrollFirstDateOfMonth(balanceMonth),
                PayrollGlobalFunctions.PayrollLastDateOfMonth(balanceMonth),
                sDeductBalance, PayrollGlobalFunctions.PayrollFirstDateOfMonth(balanceMonth),
                PayrollGlobalFunctions.PayrollLastDateOfMonth(balanceMonth),
                memberID);
            object ob = tc.ExecuteScalar(sql);

            double amount = 0;
            if (ob != DBNull.Value)
            {
                amount = Convert.ToDouble(ob);
            }

            return amount;
        }

        internal static double GetOpeningBalance(TransactionContext tc, int memberID, DateTime balanceMonth)
        {
            string sql = string.Empty;
            string sBalance = Convert.ToString((int)EnumMemberTranType.Contribution_Of_Employee_Provident_Fund) + "," +
                              Convert.ToString((int)EnumMemberTranType.Contribution_Of_Company_Provident_Fund) +
                              "," + Convert.ToString((int)EnumMemberTranType.Opening_Employee_Provident_Fund) + "," +
                              Convert.ToString((int)EnumMemberTranType.Opening_Company_Provident_Fund) + "," +
                              Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Employee_Provident_Fund_Interest) + "," +
                              Convert.ToString((int)EnumMemberTranType.Monthly_Actual_Company_Provident_Fund_Interest) +
                              "," + Convert.ToString((int)EnumMemberTranType.Opening_Actual_Employee_Provident_Fund_Interest) + "," +
                              Convert.ToString((int)EnumMemberTranType.Opening_Actual_Company_Provident_Fund_Interest) +
                              "," + Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Employee_Provident_Fund_Interest) + "," +
                              Convert.ToString((int)EnumMemberTranType.Yearly_Actual_Company_Provident_Fund_Interest);

            string sDeductBalance = Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund) +
                                    "," + Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Employee_Provident_Fund_Interest) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Withdrawl_Of_Company_Provident_Fund_Interest) +
                                    "," + Convert.ToString((int)EnumMemberTranType.Settlement_Interest_Employee_Provident_Fund) + "," +
                                    Convert.ToString((int)EnumMemberTranType.Settlement_Interest_Company_Provident_Fund);

            sql = SQLParser.MakeSQL(@"SELECT (Balance - DeductBalance)AS OpeningBalance from
                            (select 
                            SUM(Case when   TranTypeID in(%q) AND TranDate <=%d THEN  Amount ELSE 0 End)as Balance ,
                            SUM(CASE WHEN TranTypeID IN(%q) AND  TranDate <=%d THEN  Amount ELSE 0 End)AS DeductBalance
                            from dbo.MembersTransactionDetails 
                            where MemberID = %n)AS tab1", sBalance,
                PayrollGlobalFunctions.PayrollLastDateOfMonth(balanceMonth), sDeductBalance,
                PayrollGlobalFunctions.PayrollLastDateOfMonth(balanceMonth),
                memberID);
            object ob = tc.ExecuteScalar(sql);

            double amount = 0;
            if (ob != DBNull.Value)
            {
                amount = Convert.ToDouble(ob);
            }

            return amount;
        }
    }

    #endregion
}