private void GetFee()
        {
            string outputTrigger = "error";

            // Reset respective transaction context fields.

            try
            {
                if (Boolean.Parse(ConfigurationManager.AppSettings["StandAloneMode"]))
                {
                    Thread.Sleep(1000);
                    this.Transaction.AppliedFee = 2.35;

                }
                else
                {

                    using (MBMEMawaqifServiceClient client = new MBMEMawaqifServiceClient())
                    {
                        this.Transaction.AppliedFee = client.GetAppliedFee(Convert.ToInt32(this.Transaction.MachineId));
                    }

                }

                switch (this.Transaction.ServiceType)
                {
                    case MawaqifServiceType.AccountTopUp:
                        outputTrigger = "topupsubmit";
                        break;
                    case MawaqifServiceType.PermitRenewal:
                        outputTrigger = "rpsubmit";
                        break;
                    case MawaqifServiceType.ViolationPayment:
                        outputTrigger = "pvtsubmit";
                        break;
                }

                if (this.Transaction.AppliedFee == 0)
                {
                    outputTrigger = ERRORACTION;
                }
            }
            catch (Exception ex)
            {
                if (log.IsErrorEnabled) log.Error("DU,caught exception GetAppliedFee try  block for Transactionid:" + this.Transaction.Id + "." + ex.Message);
            }
            finally
            {
                ViewGrid.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new DGetBalanceProcessed(ChangeState), outputTrigger);
            }
        }
        /// <summary>
        /// Mawaqif Account Top Up Call
        /// </summary>
        /// <param name="outputTrigger"></param>
        /// <returns>eg error or submit</returns>
        private string TopUpRequest(string outputTrigger)
        {
            if (log.IsInfoEnabled) log.Info("mawaqif,TopUpRequest started..");
            TopUpPaymentRequest request = new TopUpPaymentRequest
            {
                TransactionTime = DateTime.Now,
                TransactionId = this.Transaction.Id,
                AccountNumber = this.Transaction.AccountNumber,
                PaymentMode = (this.Transaction.CardPayment) ? MBMEPaymentMode.CARD : MBMEPaymentMode.CASH,
                LastBalance = this.Transaction.BalanceDue,
                NewBalance = this.Transaction.AmountDue,
                Amount = this.Transaction.AmountPaid,
                MachineId = long.Parse(this.Transaction.MachineId),
                StimulateResponse = this.Transaction.StimulateBackend,
                ClientTxnId = this.Transaction.Id,
                Language = (Transaction.SelectedLanguageKey == "english") ? KioskLanguage.English:
                KioskLanguage.Arabic,
                ServiceType = MawaqifBackendProxy.MawaqifServiceType.AccountTopUp,
                AppliedFee = this.Transaction.AppliedFeeAmount

            };

            if (log.IsInfoEnabled) log.Info("mawaqif,TopUpPaymentRequest initialized..");

            TopUpPaymentResponse response = new TopUpPaymentResponse { ResponseCode = "-2" };

            try
            {
                if (this.Transaction.AmountPaid != "0.00")
                {
                    ValidateCertificate.RegisterCallback();
                    if (log.IsInfoEnabled) log.Info("mawaqif,before TopUpPostPayment call..");
                    using (MBMEMawaqifServiceClient client = new MBMEMawaqifServiceClient())
                    {
                        response = client.TopUpPostPayment(request);
                        trnsLoggedLocaly = true;
                        if (log.IsInfoEnabled) log.Info("mawaqif,TopUpPostPayment success.." + response.ResponseMessage);
                    }
                }
                else
                {
                    trnsLoggedLocaly = true;
                }
            }
            catch (TimeoutException ex)
            {
                Trace.WriteLine("mawaqif,caught TimeoutException exception..");
                if (log.IsErrorEnabled) log.Error("mawaqif,caught TimeoutException exception.." + ex.Message.ToString());
                outputTrigger = "error";
                this.TransactionContext.PostingFailed = true;
                Trace.WriteLine(ex.Message);

            }
            catch (EndpointNotFoundException ex)
            {
                if (log.IsErrorEnabled) log.Error("mawaqif,found EndpointNotFoundException in TopUpRequest " + ex.Message);
                outputTrigger = "error";

                this.Transaction.PostingFailed = true;

                Trace.WriteLine(ex.Message);
            }
            catch (CommunicationException ex)
            {
                if (log.IsErrorEnabled) log.Error("mawaqif,found CommunicationException in TopUpRequest " + ex.Message);

                outputTrigger = "error";

                this.Transaction.PostingFailed = true;

            }
            catch (Exception ex)
            {

                if (log.IsErrorEnabled) log.Error("mawaqif,found general exception in TopUpRequest " + ex.Message);

                this.Transaction.PostingFailed = true;

                Trace.WriteLine(ex.Message);
            }
            finally
            {
                if (log.IsInfoEnabled) log.Info("mawaqif,certificate deregistered..");
                ValidateCertificate.DeregisterCallback();

                if (response.TxnId > 0)
                {
                    this.Transaction.TxnId = response.TxnId;
                    this.Transaction.ReceiptNumber = response.TxnId.ToString();
                }

                if (!trnsLoggedLocaly)
                {
                    bool trans = this.LogTransactionToLocalDb();
                    trnsLoggedLocaly = true;
                }
            }

            if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.Success).ToString())
            {
                outputTrigger = SUBMITACTION;

            }
            else
            {
                if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.BillerError).ToString())
                {
                    this.Transaction.Message = response.ResponseMessage;
                    outputTrigger = BILLERERRORACTION;
                    this.Transaction.TransactionFailed = true;
                }
                else
                {
                    outputTrigger = SUBMITACTION;
                    this.Transaction.TransactionFailed = true;
                }
            }

            outputTrigger = SUBMITACTION;
            if (log.IsInfoEnabled) log.Info("mawaqif,TopUpRequest ended ..And outputTrigger=" + outputTrigger);
            return outputTrigger;
        }
        ///// <summary>
        ///// Violation Payment Request
        ///// </summary>
        ///// <param name="outputTrigger"></param>
        ///// <returns></returns>
        //private string vpayRequest(string outputTrigger)
        //{
        //    PVTPaymentRequest request = new PVTPaymentRequest
        //    {
        //        TransactionTime = DateTime.Now,
        //        TransactionId = this.Transaction.Id,
        //        AccountNumber = this.Transaction.AccountNumber,
        //        LastBalance = this.Transaction.BalanceDue,
        //        NewBalance = this.Transaction.AmountDue,
        //        Amount = this.Transaction.AmountPaid,
        //        MachineId = long.Parse(this.Transaction.MachineId),
        //        ReceiptNo = this.Transaction.Id,
        //        StimulateResponse = this.Transaction.StimulateBackend,
        //        Language = (Transaction.SelectedLanguageKey == "english") ? KioskLanguage.English :
        //        KioskLanguage.Arabic,
        //        ServiceType = MawaqifBackendProxy.MawaqifServiceType.ViolationPayment,
        //        PaymentMode = (this.Transaction.CardPayment) ? MBMEPaymentMode.CARD : MBMEPaymentMode.CASH,
        //        AppliedFee = this.Transaction.AppliedFeeAmount
        //    };
        //    PVTPaymentResponse response = new PVTPaymentResponse { ResponseCode = "-2" };
        //         //Kiosk Stimulate Response
        //    if (Boolean.Parse(ConfigurationManager.AppSettings["StandAloneMode"]))
        //    {
        //        if (log.IsInfoEnabled) log.Info("mawaqif, Checking standalone configuration" + Boolean.Parse(ConfigurationManager.AppSettings["StandAloneMode"]).ToString());
        //        outputTrigger = SUBMITACTION;
        //        Thread.Sleep(1000);
        //    }
        //    else
        //    {
        //        try
        //        {
        //            ValidateCertificate.RegisterCallback();
        //            using (MBMEMawaqifServiceClient client = new MBMEMawaqifServiceClient())
        //            {
        //                response = client.PVTPostPayment(request);
        //                trnsLoggedLocaly = true;
        //            }
        //        }
        //        catch (EndpointNotFoundException ex)
        //        {
        //            this.Transaction.PostingFailed = true;
        //            Trace.WriteLine(ex.Message);
        //        }
        //        catch (CommunicationException ex)
        //        {
        //            this.Transaction.PostingFailed = true;
        //            Trace.WriteLine(ex.Message);
        //        }
        //        catch (Exception ex)
        //        {
        //            this.Transaction.PostingFailed = true;
        //            Trace.WriteLine(ex.Message);
        //        }
        //        finally
        //        {
        //            ValidateCertificate.DeregisterCallback();
        //            this.Transaction.TxnId = response.TxnId;
        //            if (response.TxnId > 0)
        //            {
        //                this.Transaction.TxnId = response.TxnId;
        //                this.Transaction.ReceiptNumber = response.TxnId.ToString();
        //            }
        //            if (!trnsLoggedLocaly)
        //            {
        //                bool trans = this.LogTransactionToLocalDb();
        //                trnsLoggedLocaly = true;
        //            }
        //            outputTrigger = SUBMITACTION;
        //        }
        //        //Check for Biller Response
        //        if (response.ResponseCode == ((int)MBMEServiceResponse.Success).ToString())
        //        {
        //            outputTrigger = SUBMITACTION;
        //        }
        //        else
        //        {
        //            if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.BillerError).ToString())
        //            {
        //                this.Transaction.Message = response.ResponseMessage;
        //                outputTrigger = BILLERERRORACTION;
        //                this.Transaction.TransactionFailed = true;
        //            }
        //            else
        //            {
        //                outputTrigger = SUBMITACTION;
        //                this.Transaction.TransactionFailed = false;
        //            }
        //        }
        //    }
        //    return outputTrigger;
        //}
        /// <summary>
        /// Renewal Permit Request
        /// </summary>
        /// <param name="outputTrigger"></param>
        /// <returns></returns>
        private string rpRequest(string outputTrigger)
        {
            RPPaymentRequest request = new RPPaymentRequest
            {
                TransactionTime = DateTime.Now,
                TransactionId = this.Transaction.Id,
                AccountNumber = this.Transaction.AccountNumber,
                LastBalance = this.Transaction.BalanceDue,
                NewBalance = this.Transaction.AmountDue,
                Amount = this.Transaction.AmountPaid,
                MachineId = long.Parse(this.Transaction.MachineId),
                StimulateResponse = this.Transaction.StimulateBackend,
                Language = (Transaction.SelectedLanguageKey == "english") ? KioskLanguage.English :
                KioskLanguage.Arabic,
                ServiceType = MawaqifBackendProxy.MawaqifServiceType.PermitRenewal,
                PaymentMode = (this.Transaction.CardPayment) ? MBMEPaymentMode.CARD : MBMEPaymentMode.CASH,
                AppliedFee = this.Transaction.AppliedFeeAmount
            };

            RPPaymentResponse response = new RPPaymentResponse { ResponseCode = "-2" };

            try
            {
                ValidateCertificate.RegisterCallback();
                using (MBMEMawaqifServiceClient client = new MBMEMawaqifServiceClient())
                {
                    response = client.RPPostPayment(request);
                    trnsLoggedLocaly = true;
                    this.Transaction.TxnId = response.TxnId;
                }
            }
            catch (EndpointNotFoundException ex)
            {
                Transaction.PostingFailed = true;
                outputTrigger = ERRORACTION;
                Trace.WriteLine(ex.Message);
            }
            catch (CommunicationException ex)
            {
                Transaction.PostingFailed = true;
                outputTrigger = ERRORACTION;
                Trace.WriteLine(ex.Message);
            }
            catch (Exception ex)
            {
                Transaction.PostingFailed = true;
                Trace.WriteLine(ex.Message);
            }
            finally
            {
                ValidateCertificate.DeregisterCallback();

                if (response.TxnId > 0)
                {
                    this.Transaction.TxnId = response.TxnId;
                    this.Transaction.ReceiptNumber = response.TxnId.ToString();
                }

                if (!trnsLoggedLocaly)
                {
                    bool trans = this.LogTransactionToLocalDb();
                    trnsLoggedLocaly = true;
                }
            }

            if (response.ResponseCode == "0")
            {
                outputTrigger = SUBMITACTION;
            }
            else
            {
                if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.BillerError).ToString())
                {
                    this.Transaction.Message = response.ResponseMessage;
                    outputTrigger = BILLERERRORACTION;
                    //outputTrigger = SUBMITACTION;
                    this.Transaction.TransactionFailed = true;
                }
                else
                {
                    outputTrigger = ERRORACTION;
                    this.Transaction.TransactionFailed = false;
                }
            }

            return outputTrigger;
        }
        private void TopupRequest(ref string outputTrigger)
        {
            outputTrigger = ERRORACTION;
            TopUpBalanceRequest request = new TopUpBalanceRequest
            {

                AccountNumber = this.TransactionContext.AccountNumber,
                TransactionTime = Transaction.Date,
                TransactionId = this.Transaction.Id,
                MachineId = long.Parse(this.Transaction.MachineId),
                //StimulateResponse = this.Transaction.StimulateBackend,
                PIN = "000",
                ServiceType = MawaqifBackendProxy.MawaqifServiceType.AccountTopUp,
                Language = (Transaction.SelectedLanguageKey == "english") ? MawaqifBackendProxy.KioskLanguage.English : MawaqifBackendProxy.KioskLanguage.Arabic,
            };

            TopUpBalanceResponse response = new TopUpBalanceResponse
            {
                BalanceAmount = "0.00",
                ResponseCode = Convert.ToInt16(MBMEServiceResponse.Failed).ToString()
            };

            ValidateCertificate.RegisterCallback();
            using (MBMEMawaqifServiceClient client = new MBMEMawaqifServiceClient())
            {
                try
                {
                    response = client.TopUpGetBalance(request);
                }
                catch (TimeoutException ex)
                {
                    outputTrigger = TIMEOUTACTION;
                    if (log.IsInfoEnabled) log.Info("caught timeout exception in mawaqif." + ex.Message);
                }
                catch (Exception ex)
                {
                    outputTrigger = ERRORACTION;
                    //Trace.WriteLine(ex.Message.ToString());
                    if (log.IsInfoEnabled) log.Info("caught exception in mawaqif."+ex.Message);
                    // KS TODO: Logging.
                }
                finally
                {
                    this.Transaction.TxnId = response.TxnId;
                    this.Transaction.ReceiptNumber = response.TxnId.ToString();
                    ValidateCertificate.DeregisterCallback();
                }
            }

            //KS TODO : Logging.
            if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.Success).ToString())
            {
                //this.Transaction.AccountNumber = response.AccountNumber;
                this.Transaction.BalanceDue = string.Format("{0:0.00}", (Math.Ceiling(Convert.ToDecimal(response.BalanceAmount))).ToString());
                this.Transaction.AmountDue = string.Format("{0:0.00}", (Math.Ceiling(Convert.ToDecimal(response.BalanceAmount))).ToString());
                //this.Transaction.AmountPaid = response.BalanceAmount;
                outputTrigger = SUBMITACTION;
            }

            else
            {
                this.Transaction.AccountNumber = string.Empty;
                if (this.Transaction.InvalidCount < this.State.RetryCount)
                {
                    if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.BillerError).ToString())
                    {
                        Transaction.InvalidCount++;
                        Transaction.Message = response.ResponseMessage;
                        outputTrigger = BILLERERRORACTION;
                    }

                }
                else
                    outputTrigger = ERRORACTION;

            }
        }
        //private void vpayRequest(ref string outputTrigger)
        //{
        //    outputTrigger = ERRORACTION;
        //    PVTBalanceRequest request = new PVTBalanceRequest
        //    {
        //        TransactionTime = Transaction.Date,
        //        AccountNumber = this.TransactionContext.AccountNumber,
        //        TransactionId = this.Transaction.Id,
        //        MachineId = long.Parse(this.Transaction.MachineId),
        //        StimulateResponse = this.Transaction.StimulateBackend,
        //        Locale = this.Transaction.LocaleId,
        //        ServiceType= MawaqifBackendProxy.MawaqifServiceType.ViolationPayment,
        //        Language = (Transaction.SelectedLanguageKey == "english") ? MawaqifBackendProxy.KioskLanguage.English : MawaqifBackendProxy.KioskLanguage.Arabic,
        //    };
        //    PVTBalanceResponse response = new PVTBalanceResponse
        //    {
        //        ResponseCode = Convert.ToInt16(MBMEServiceResponse.Failed).ToString(),
        //    };
        //    ValidateCertificate.RegisterCallback();
        //    using (MBMEMawaqifServiceClient client = new MBMEMawaqifServiceClient())
        //    {
        //        try
        //        {
        //            response = client.PVTGetBalance(request);
        //        }
        //        catch (Exception ex)
        //        {
        //            outputTrigger = ERRORACTION;
        //            //Trace.WriteLine(ex.Message);
        //            if (log.IsInfoEnabled) log.Info("caught exception in PVTGetBalance." + ex.Message);
        //        }
        //        finally
        //        {
        //            this.Transaction.TxnId = response.TxnId;
        //            this.Transaction.ReceiptNumber = response.TxnId.ToString();
        //            ValidateCertificate.DeregisterCallback();
        //        }
        //    }
        //    //KS TODO : Logging.
        //    if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.Success).ToString())
        //    {
        //        this.Transaction.AccountNumber = response.AccountNumber;
        //        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
        //        this.Transaction.IssueDate = response.IssueDate.ToString((this.Transaction.LocaleId == "en") ?
        //            "dd/MM/yyyy HH:mm:ss" : "HH:mm:ss yyyy/MM/dd");
        //        //this.Transaction.IssueDate = response.IssueDate.ToString("dd/MM/yyyy HH:mm:ss");
        //        this.Transaction.PlateNumber = response.PlateNumber;
        //        this.Transaction.BalanceDue = Convert.ToDouble(response.Amount).ToString("0.00");
        //        this.Transaction.AmountDue = Convert.ToDouble(response.Amount).ToString("0.00");
        //        this.Transaction.Country = response.Country;
        //        this.Transaction.Category = response.Category;
        //        this.Transaction.PVTType = response.Type;
        //        this.Transaction.StageMessage = response.ResponseMessage;
        //        outputTrigger = SUBMITACTION;
        //    }
        //    else
        //    {
        //        this.Transaction.AccountNumber = string.Empty;
        //        if (this.Transaction.InvalidCount < this.State.RetryCount)
        //        {
        //            if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.BillerError).ToString())
        //            {
        //                Transaction.InvalidCount++;
        //                Transaction.Message = response.ResponseMessage;
        //                outputTrigger = BILLERERRORACTION;
        //            }
        //            else
        //            {
        //                outputTrigger = ERRORACTION;
        //            }
        //        }
        //        else
        //            outputTrigger = ERRORACTION;
        //    }
        //}
        private void rpRequest(ref string outputTrigger)
        {
            outputTrigger = ERRORACTION;
            RPBalanceRequest request = new RPBalanceRequest
            {
                TransactionTime = Transaction.Date,
                AccountNumber = this.TransactionContext.AccountNumber,
                TransactionId = this.Transaction.Id,
                StimulateResponse = this.Transaction.StimulateBackend,
                MachineId = long.Parse(this.Transaction.MachineId),
                LocaleId = this.Transaction.LocaleId,
                ServiceType = MawaqifBackendProxy.MawaqifServiceType.PermitRenewal,
                Language = (Transaction.SelectedLanguageKey=="english")?MawaqifBackendProxy.KioskLanguage.English: MawaqifBackendProxy.KioskLanguage.Arabic,
            };

            RPBalanceResponse response = new RPBalanceResponse
            {
                ResponseCode = Convert.ToInt16(MBMEServiceResponse.Failed).ToString()
            };

            ValidateCertificate.RegisterCallback();
            using (MBMEMawaqifServiceClient client = new MBMEMawaqifServiceClient())
            {
                try
                {
                    response = client.RPGetBalance(request);
                }

                catch (Exception ex)
                {
                    outputTrigger = ERRORACTION;
                    if (log.IsErrorEnabled) log.Error(ex.Message);
                    //Trace.WriteLine(ex.Message);
                    // KS TODO: Logging.
                }
                finally
                {
                    this.Transaction.TxnId = response.TxnId;
                    this.Transaction.ReceiptNumber = response.TxnId.ToString();
                    ValidateCertificate.DeregisterCallback();
                }
            }

            //KS TODO : Logging.
            if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.Success).ToString())
            {
                this.Transaction.AccountNumber = response.AccountNumber;

                this.Transaction.IssueDate =  response.IssuedDate.ToString((this.Transaction.LocaleId=="en")?
                    "dd/MM/yyyy" : "yyyy/MM/dd");
                    this.Transaction.ExpiryDate = response.ExpiryDate.ToString((this.Transaction.LocaleId == "en")?
                    "dd/MM/yyyy" : "yyyy/MM/dd");

                this.Transaction.BalanceDue = Convert.ToDouble(response.PermitCost).ToString("0.00");
                this.Transaction.AmountDue = Convert.ToDouble(response.PermitCost).ToString("0.00");

                //this.Transaction.AmountPaid = response.BalanceAmount;
                outputTrigger = SUBMITACTION;
            }
            else
            {
                this.Transaction.AccountNumber = string.Empty;
                if (this.Transaction.InvalidCount < this.State.RetryCount)
                {
                    if (response.ResponseCode == Convert.ToInt16(MBMEServiceResponse.BillerError).ToString())
                    {
                        Transaction.InvalidCount++;
                        //split the message into two lines
                        if ((string.IsNullOrEmpty(response.PermitStage) ? "" : response.PermitStage.ToLower()) == "permit issued")
                        {
                            Transaction.Message = response.ResponseMessage.Replace("-n","\n");
                        }
                        else
                        {
                            Transaction.Message = response.ResponseMessage;
                        }
                        outputTrigger = BILLERERRORACTION;

                    }
                    else
                    {
                        outputTrigger = ERRORACTION;
                    }
                }
                else
                    outputTrigger = ERRORACTION;
            }
        }