public string PullKCCADetails(string PRN)
        {
            string result = "";

            try
            {
                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];

                // ---------------------- Return Xml Response -------------------------
                string        PaymentDetails = "";
                MemoryStream  XmlMs          = new MemoryStream();
                XmlTextWriter XmlTxtWtr      = new XmlTextWriter(XmlMs, System.Text.Encoding.UTF8);
                XmlTxtWtr.Formatting  = Formatting.Indented;
                XmlTxtWtr.Indentation = 4;
                XmlTxtWtr.WriteStartDocument();
                XmlTxtWtr.WriteStartElement("KCCA PAYMENT DETAILS");
                XmlTxtWtr.WriteElementString("PRN", dt.Rows[0][4].ToString());
                XmlTxtWtr.WriteElementString("COIN", dt.Rows[0][1].ToString());
                XmlTxtWtr.WriteElementString("CUSTNAME", dt.Rows[0][2].ToString());
                XmlTxtWtr.WriteElementString("PHONENUMBER", dt.Rows[0][3].ToString());
                XmlTxtWtr.WriteElementString("AMOUNT", dt.Rows[0][7].ToString());
                XmlTxtWtr.WriteElementString("STATUS", dt.Rows[0][0].ToString());
                XmlTxtWtr.WriteEndElement();
                XmlTxtWtr.WriteEndDocument();
                XmlTxtWtr.Flush();
                StreamReader strmrdr = new StreamReader(XmlMs);
                XmlMs.Seek(0, SeekOrigin.Begin);
                PaymentDetails = strmrdr.ReadToEnd();
                return(PaymentDetails);
            }
            catch (Exception ex)
            {
                result = ex.Message;
            }
            return(result);
        }
        public string PullKCCADetails(string PRN)
        {
            string result = "";
            try
            {
                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];

                // ---------------------- Return Xml Response -------------------------
                string PaymentDetails = "";
                MemoryStream XmlMs = new MemoryStream();
                XmlTextWriter XmlTxtWtr = new XmlTextWriter(XmlMs, System.Text.Encoding.UTF8);
                XmlTxtWtr.Formatting = Formatting.Indented;
                XmlTxtWtr.Indentation = 4;
                XmlTxtWtr.WriteStartDocument();
                XmlTxtWtr.WriteStartElement("KCCA PAYMENT DETAILS");
                XmlTxtWtr.WriteElementString("PRN",dt.Rows[0][4].ToString());
                XmlTxtWtr.WriteElementString("COIN", dt.Rows[0][1].ToString());
                XmlTxtWtr.WriteElementString("CUSTNAME", dt.Rows[0][2].ToString());
                XmlTxtWtr.WriteElementString("PHONENUMBER", dt.Rows[0][3].ToString());
                XmlTxtWtr.WriteElementString("AMOUNT", dt.Rows[0][7].ToString());
                XmlTxtWtr.WriteElementString("STATUS", dt.Rows[0][0].ToString());
                XmlTxtWtr.WriteEndElement();
                XmlTxtWtr.WriteEndDocument();
                XmlTxtWtr.Flush();
                StreamReader strmrdr = new StreamReader(XmlMs);
                XmlMs.Seek(0, SeekOrigin.Begin);
                PaymentDetails = strmrdr.ReadToEnd();
                return PaymentDetails;              
            }
            catch (Exception ex)
            {
                result= ex.Message;
            }
            return result;
        }
        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());
        }
        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();
            }