public string PayKCCA(string PRN, string data, string UTILITYACCOUNT, string Amount, string debitmobilenumber, string TXNDATE, string TXNTIME, string alertcontact, string EXREF)
        {
            var FailureDetailsinfo = new KCCAADAPAYResponse();
            var KCCADetailsinfo    = new KCCAADAPAYResponse();

            string HashKey = MD5Hash(KCCASession_key + KCCAVendorCode + KCCAVendorPassword + KCCAHash);

            KCCAGateway.BankPaymentService x = new KCCAGateway.BankPaymentService();

            // ----------------------- Get Session Key --------------------------
            var Sessionkey = new object();

            try
            {
                Sessionkey = x.authenticate(KCCASession_key, KCCAVendorCode, KCCAVendorPassword, HashKey, "");
            }
            catch (Exception ex)
            {
                //result = ex.Message;
            }
            string skey = "";
            //DataRow rw = null;
            DataSet      ds     = new DataSet();
            DataTable    dt     = new DataTable();
            StringReader strRdr = new StringReader(Sessionkey.ToString());

            try
            {
                ds.ReadXml(strRdr);
            }
            catch (Exception ex)
            {
                //result = ex.Message;
            }
            dt   = ds.Tables[0];
            skey = dt.Rows[0][1].ToString();


            // ------------------- Validate against prn --------------------------
            string validateresponse = "";

            try
            {
                validateresponse = x.verifyReference(skey, PRN, "", "");
            }
            catch (Exception ex)
            {
                // result = ex.Message;
            }
            dt     = new DataTable();
            ds     = new DataSet();
            strRdr = new StringReader(validateresponse);
            try
            {
                ds.ReadXml(strRdr);
            }
            catch (Exception ex)
            {
                //result = ex.Message;
            }
            dt = ds.Tables[0];
            string COIN, CUSTOMERNAME, PHONENUMBER, PRNDATE, EXPIRYDATE, AMOUNTDUE, PAYMENTCURRENCY, STATUS, StatusDescriptionx, balance, CustomerTypex;

            COIN               = dt.Rows[0][1].ToString();
            CUSTOMERNAME       = dt.Rows[0][2].ToString();
            PHONENUMBER        = dt.Rows[0][3].ToString();
            PRNDATE            = dt.Rows[0][5].ToString();
            EXPIRYDATE         = dt.Rows[0][6].ToString();
            AMOUNTDUE          = dt.Rows[0][7].ToString();
            StatusDescriptionx = "UNSUCCCESSFUL";
            balance            = "";
            CustomerTypex      = "POST PAID";

            PAYMENTCURRENCY = "";
            STATUS          = dt.Rows[0][0].ToString();
            Datamanagement.PushKCCACustReferenceDetails(PRN, COIN, CUSTOMERNAME, PHONENUMBER, PRNDATE, EXPIRYDATE, AMOUNTDUE, PAYMENTCURRENCY, STATUS);
            Thread.Sleep(5000);

            switch (STATUS)
            {
            case "A":
                break;

            default:

                FailureDetailsinfo.EXRef          = EXREF;
                FailureDetailsinfo.CustReference  = PRN;
                FailureDetailsinfo.PaymentAmount  = Amount;
                FailureDetailsinfo.FailureDetails = new List <KCCAFailureDetials>();
                FailureDetailsinfo.FailureDetails.Add(new KCCAFailureDetials()
                {
                    Remark       = StatusDescriptionx,
                    Responcecode = "05"
                });
                if (STATUS == "T")
                {
                    return("Transaction Already Transacted");
                }
                else if (STATUS == "X")
                {
                    return("Transaction Has Expired ");
                }
                else
                {
                    return("UNSUCCESSFULL");
                }
                break;
            }

            string sp_reference = PRN + "-" + CUSTOMERNAME;
            bool   istransacted = Datamanagement.isalreadyTransactedKCCA(PRN);

            switch (istransacted)
            {
            case true:
                FailureDetailsinfo.EXRef          = EXREF;
                FailureDetailsinfo.CustReference  = PRN;
                FailureDetailsinfo.PaymentAmount  = Amount;
                FailureDetailsinfo.FailureDetails = new List <KCCAFailureDetials>();
                FailureDetailsinfo.FailureDetails.Add(new KCCAFailureDetials()
                {
                    Remark =
                        "Payment reference has already been transacted",
                    Responcecode = "05"
                });
                return("UNSUCCESSFULL");

                break;

            default:
                break;
            }

            string Trantypey = "FCDB";

            PRN = PRN + Trantypey;
            string MyRef = (PRN.ToString()).Trim().Replace(" ", "").ToUpper() +
                           System.DateTime.Today.ToString("yyMMdd") + System.DateTime.Now.ToString("hhmmss") + "UTIL";

            Thread.Sleep(5000);

            //DEBIT CUSTOMER MOBILE MONEY ACCOUNT

            bool   issuccess = true;
            string coin      = Datamanagement.coin_(PRN);

            EXREF = "exref";

            switch (issuccess)
            {
            case true:
                Datamanagement.IsertintoKCCAPayments(MyRef, "KCCA Payment",
                                                     UTILITYACCOUNT, CUSTOMERNAME, balance, Amount,
                                                     "mobile money payment",
                                                     debitmobilenumber, PRN,
                                                     CustomerTypex,
                                                     alertcontact, "", TXNDATE,
                                                     STATUS, StatusDescriptionx, "KCCA Payment", "0", "2",
                                                     "", coin);


                break;

            case false:
                FailureDetailsinfo.EXRef          = EXREF;
                FailureDetailsinfo.CustReference  = PRN;
                FailureDetailsinfo.PaymentAmount  = AMOUNTDUE;
                FailureDetailsinfo.FailureDetails = new List <KCCAFailureDetials>();
                FailureDetailsinfo.FailureDetails.Add(new KCCAFailureDetials()
                {
                    Remark       = "Failed To Post To Core Banking",
                    Responcecode = "05"
                });
                return("UNSUCCESSFULL");

                break;
            }

            //Notify KCCA

            Thread.Sleep(5000);
            notifyKCCA(PRN);


            //RESPOND HERE
            KCCADetailsinfo.EXRef         = EXREF;
            KCCADetailsinfo.CustReference = PRN;
            KCCADetailsinfo.PaymentAmount = AMOUNTDUE;
            KCCADetailsinfo.KCCADetails   = new List <KCCADetails>();
            KCCADetailsinfo.KCCADetails.Add(new KCCADetails()
            {
                AmountPaid        = AMOUNTDUE,
                Balance           = AMOUNTDUE,
                CustomerName      = CUSTOMERNAME,
                CustomerType      = "",
                Remark            = "",
                Responcecode      = "00",
                StatusCode        = STATUS,
                StatusDescription = StatusDescriptionx,
                FlexResponse      = EXREF
            });
            return(KCCADetailsinfo.EXRef.ToString());
        }