public String FinpayURA(string CustPRN, string EXREF, string DRACCBRANCH,
                                         string DRACCOUNTNUMBER, string DRAMOUNT, string DRACCURR, string TXNDATE,
                                         string TXNTIME)
        {
            string TINc = "";
            string TaxPayernamec = "";
            string amountduec = "";
            string ExpDatec = "";
            string RegDatec = "";
            string Remarkc = "";

            string PRNResponse = "";
            string OriginalPRN = "";
            string FCDBSetings = "";

            string FCDBINTERNALGL = "";
            string FCDBTELLERCODE = "";
            string FCDBDESC = "";
            string FCDBTILLID = "";
            string FCDBLIMIT = "";
            string FCDBMAKERy = "";
            string FCDBCHECKERy = "";
            string Subhosty = "";
            string Msgtypey = "";
            string Procodey = "";
            string Commissiony = "";
            string Trantypey = "";
            string Terminaly = "";
            string Batchy = "";
            string MessageFlagy = "";
            string Workstationy = "";
            string PosConfirmedy = "";
            string PosReversedy = "";
            string EftSourcey = "";
            string IbTxny = "";
            string Flexuseridy = "";
            string UtilityAccountY = "";
            string UtilityAccBranchY = "";
            string UtilityAccCurrencyY = "";
            string MerchantTypeY = "";

            string statuscodex = "";

            string[] FCDBSetting = null;

            bool isrepeat = false;
            bool istransacted = false;
            bool issuccess = false;
            bool isexisting = false;

            OriginalPRN = CustPRN;

            var FailureDetailsinfo = new URAFCDBResponse();
            var TaxDetailsinfo = new URAFCDBResponse();

            InterfaceUra IU = new InterfaceUra();
             //string results_= IU.PullRegistrationDetails(CustPRN);
            //***** Lets Validate this before even bothering flex.

            try
            {
                // ---------------------- Validate the Prn -------------------------
                System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
                URAGateway.UraPmtService service = new URAGateway.UraPmtService();
                eTaxPmtLibrary.UraEncryption uraEnc = new eTaxPmtLibrary.UraEncryption();
                string EnctryptionAlgorith = "rijndael";
                FinpayiSecurity.CryptoFactory CryptographyFactory = new FinpayiSecurity.CryptoFactory();
                FinpayiSecurity.ICrypto Cryptographer = CryptographyFactory.MakeCryptographer(EnctryptionAlgorith);
                MyAPIPass = fn.GetFinpayParameter("Select ItemValue from Parameters where ItemKey = 'URAWEBPASS'");
                MyAPIUserName = fn.GetFinpayParameter("Select ItemValue from Parameters where ItemKey = 'URAWEBUSER'");
                string UraPassword = Cryptographer.Decrypt(MyAPIPass);
                string s = uraEnc.EncryptedData(UraPassword, x509Cert_ura);
                URAGateway.PaymentRegEntity res = service.GetPRNDetails(MyAPIUserName, s, System.Configuration.ConfigurationManager.AppSettings["BANK_SHORT_CODE"], CustPRN);

                string remark = "";
                string TaxPayername = res.TaxpayerName;
                string amountdue = res.Amount;
                string TIN = res.Tin;
                string ExpDate = res.ExpiryDt;
                string RegDate = res.PaymentRegDt;
                string statuscode = res.StatusCode;
                if (amountdue != DRAMOUNT)
                {
                    return "UNSUCCESSFUL - INVALID AMOUNT " + DRAMOUNT + " INSTEAD OF " + amountdue;
                }
                Boolean auth = false;

                switch (statuscode)
                {
                    case "A":
                        //auth = true;
                        //remark = "Awaiting To Transact : " + res.StatusDesc;
                        break;
                    case "C":
                        //auth = false;
                        return   "Registration has been cancelled by URA! : " + res.StatusDesc;
                        //break;
                    case "X":
                        //auth = false;
                        return "Registration has expired! : " + res.StatusDesc;
                        //break;
                    case "T":
                        //auth = false;
                        return "Registration has already been transacted! : " + res.StatusDesc;
                        //break;
                    default:
                        //auth = false;
                        return "Results Unknown! : " + res.StatusDesc;
                        //break;
                }
                Datamanagement.PushRegistrationDetails(CustPRN);
                Datamanagement.UpdateURARegDetails(CustPRN, TaxPayername, amountdue, TIN, ExpDate, RegDate, remark, auth, statuscode);
                //urapt.Close();

            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            
            //*****
           

            Thread.Sleep(5000);
            //Validate PRN here
            PRNResponse = Datamanagement.getPRNDetails(CustPRN);
            string[] prndets = null;

            prndets = PRNResponse.Split('|');

            string sp_reference = "";

            TINc = prndets[0];
            TaxPayernamec = prndets[1];
            amountduec = prndets[2];
            ExpDatec = prndets[3];
            RegDatec = prndets[4];
            Remarkc = prndets[5];
            statuscodex = prndets[6];

            switch (statuscodex)
            {
                case "A":
                    //Continue
                    break;
                default:
                    //Do Zilch
                    FailureDetailsinfo.EXRef = EXREF;
                    FailureDetailsinfo.PRNNUMBER = CustPRN;
                    FailureDetailsinfo.TaxAmount = DRAMOUNT;
                    FailureDetailsinfo.FailureDetails = new List<UraFailureDetials>();
                    FailureDetailsinfo.FailureDetails.Add(new UraFailureDetials()
                                                              {
                                                                  Remark = Remarkc,
                                                                  statuscode = statuscodex,
                                                                  Responcecode = "05"
                                                              });
                    return "UNSUCCESSFUL";
                    break;
            }

            //Get FCDB details here

            FCDBSetings = Datamanagement.getFCDBSettings("TAX");
            FCDBSetting = FCDBSetings.Split('|');

            FCDBINTERNALGL = FCDBSetting[0];
            FCDBTELLERCODE = FCDBSetting[1];
            FCDBDESC = FCDBSetting[2];
            FCDBTILLID = FCDBSetting[3];
            FCDBLIMIT = FCDBSetting[4];

            FCDBMAKERy = FCDBSetting[5];
            FCDBCHECKERy = FCDBSetting[6];
            Subhosty = FCDBSetting[7];
            Msgtypey = FCDBSetting[8];
            Procodey = FCDBSetting[9];
            Commissiony = FCDBSetting[10];
            Trantypey = FCDBSetting[11];
            Terminaly = FCDBSetting[12];
            Batchy = FCDBSetting[13];
            MessageFlagy = FCDBSetting[14];
            Workstationy = FCDBSetting[15];
            PosConfirmedy = FCDBSetting[16];
            PosReversedy = FCDBSetting[17];
            EftSourcey = FCDBSetting[18];
            IbTxny = FCDBSetting[19];
            Flexuseridy = FCDBSetting[20];
            UtilityAccountY = FCDBSetting[21];
            UtilityAccBranchY = FCDBSetting[22];
            UtilityAccCurrencyY = FCDBSetting[23];
            MerchantTypeY = FCDBSetting[24];


            //Check if already transacted
            istransacted = Datamanagement.isalreadyTransacted(CustPRN);
            switch (istransacted)
            {
                case true:
                    FailureDetailsinfo.EXRef = EXREF;
                    FailureDetailsinfo.PRNNUMBER = CustPRN;
                    FailureDetailsinfo.TaxAmount = DRAMOUNT;
                    FailureDetailsinfo.FailureDetails = new List<UraFailureDetials>();
                    FailureDetailsinfo.FailureDetails.Add(new UraFailureDetials()
                                                              {
                                                                  Remark = "Registration has already been transacted",
                                                                  Responcecode = "05"
                                                              });
                    return "UNSUCCESSFUL";
                    break;
                default:
                    break;
            }

            CustPRN = CustPRN + Trantypey;

            sp_reference = CustPRN + "-" + TaxPayernamec;

            isexisting = Datamanagement.isalreadyExisting(OriginalPRN);
            switch (isexisting)
            {
                case true:
                    //update source as fcdb
                    Datamanagement.UpdatePRNSource(OriginalPRN, "FCDB");
                    break;
                case false:
                    //insert into registration
                    Datamanagement.insertnewfcdbpayment(OriginalPRN, TINc, TaxPayernamec, amountduec, RegDatec, ExpDatec,
                                                        statuscodex, "FCDB");
                    break;
            }

            //update CLEAREDSTATUS here
            //Datamanagement.UpdateRegistration(CustPRN, "CLEARING CHEQUE");
            //check whether transaction already sent to the bridge
            isrepeat = Datamanagement.isalreadyPosted(CustPRN);
            if (isrepeat == false)
            {
                //post to the bridge
                Datamanagement.InsertIntoLog(CustPRN, Subhosty,
                                             Msgtypey, Procodey, TXNDATE, TXNTIME, DRACCBRANCH, CustPRN, CustPRN,
                                             DRAMOUNT, Commissiony, DRACCOUNTNUMBER, MerchantTypeY, EXREF, Terminaly,
                                             DRACCBRANCH,
                                             Batchy, Terminaly, sp_reference, DRACCOUNTNUMBER, DRACCURR, "0",
                                             MessageFlagy, Workstationy,
                                             PosConfirmedy, PosReversedy, "0", UtilityAccountY, UtilityAccBranchY,
                                             MerchantTypeY, EftSourcey, IbTxny, "", Flexuseridy);
            }

            Thread.Sleep(5000);
            issuccess = Datamanagement.isSuccessful(CustPRN);
            EXREF = Datamanagement.Ecternalref(CustPRN);
            Datamanagement.UpdateMSGIDResponded(CustPRN);
            switch (issuccess)
            {
                case true:

                    Datamanagement.UpdateRegistration(OriginalPRN, TXNDATE, FCDBTELLERCODE, DRACCBRANCH, "",
                                                      UtilityAccountY, DRACCOUNTNUMBER, "C", "T", EXREF, false,
                                                      FCDBCHECKERy, "11",
                                                      UtilityAccBranchY, "", Trantypey, DRACCURR, MerchantTypeY,
                                                      UtilityAccCurrencyY);
                    break;

                case false:
                    FailureDetailsinfo.EXRef = EXREF;
                    FailureDetailsinfo.PRNNUMBER = CustPRN;
                    FailureDetailsinfo.TaxAmount = DRAMOUNT;
                    FailureDetailsinfo.FailureDetails = new List<UraFailureDetials>();
                    FailureDetailsinfo.FailureDetails.Add(new UraFailureDetials()
                                                              {
                                                                  Remark = "Failed To Post To Core Banking",
                                                                  Responcecode = "05"
                                                              });
                    return "UNSUCCESSFUL";
                    break;
            }

            //Notify URA - If successfully posted
            Datamanagement.InsertIntoBridgeRegistration(OriginalPRN, "C", TINc, DRAMOUNT, TXNDATE, TXNDATE, "T",
                                                        DRACCBRANCH, CustPRN, "", "");

            //joannah.....9/7/2015
            Thread.Sleep(5000);
            //Notify URA here
             NotifyURA(OriginalPRN, "C", TINc, DRAMOUNT, TXNDATE, TXNDATE, "T",
                                                       DRACCBRANCH, CustPRN, "", "");

             var strUpdate = "Update REGISTRATIONS set Sent = 1, acknowledged = 1 where PRN = prn";

             try
             {
                 using (
                     var conn =
                         new SqlConnection( WebConfigurationManager.ConnectionStrings["Bridge"].ConnectionString))
                 {
                     conn.Open();
                     using (var cmd = new SqlCommand(strUpdate, conn))
                     {
                         var dr = cmd.ExecuteReader();
                     }
                 }
             }

             catch (Exception ex)
             {
                 
             }

             //joannah.....9/7/2015
            
             

            //RESPOND HERE

            TaxDetailsinfo.EXRef = EXREF;
            TaxDetailsinfo.PRNNUMBER = CustPRN;
            TaxDetailsinfo.TaxAmount = amountduec;
            TaxDetailsinfo.TAXDetails = new List<UraDetials>();
            TaxDetailsinfo.TAXDetails.Add(new UraDetials()
                                              {
                                                  amountdue = amountduec,
                                                  TaxPayername = TaxPayernamec,
                                                  TIN = TINc,
                                                  ExpDate = ExpDatec,
                                                  RegDate = RegDatec,
                                                  Remark = Remarkc,
                                                  Responcecode = "00"
                                              });

            return   TaxDetailsinfo.EXRef.ToString();
        }
        public String FinpayURA(string CustPRN, string EXREF, string DRACCBRANCH,
                                string DRACCOUNTNUMBER, string DRAMOUNT, string DRACCURR, string TXNDATE,
                                string TXNTIME)
        {
            string TINc          = "";
            string TaxPayernamec = "";
            string amountduec    = "";
            string ExpDatec      = "";
            string RegDatec      = "";
            string Remarkc       = "";

            string PRNResponse = "";
            string OriginalPRN = "";
            string FCDBSetings = "";

            string FCDBINTERNALGL      = "";
            string FCDBTELLERCODE      = "";
            string FCDBDESC            = "";
            string FCDBTILLID          = "";
            string FCDBLIMIT           = "";
            string FCDBMAKERy          = "";
            string FCDBCHECKERy        = "";
            string Subhosty            = "";
            string Msgtypey            = "";
            string Procodey            = "";
            string Commissiony         = "";
            string Trantypey           = "";
            string Terminaly           = "";
            string Batchy              = "";
            string MessageFlagy        = "";
            string Workstationy        = "";
            string PosConfirmedy       = "";
            string PosReversedy        = "";
            string EftSourcey          = "";
            string IbTxny              = "";
            string Flexuseridy         = "";
            string UtilityAccountY     = "";
            string UtilityAccBranchY   = "";
            string UtilityAccCurrencyY = "";
            string MerchantTypeY       = "";

            string statuscodex = "";

            string[] FCDBSetting = null;

            bool isrepeat     = false;
            bool istransacted = false;
            bool issuccess    = false;
            bool isexisting   = false;

            OriginalPRN = CustPRN;

            var FailureDetailsinfo = new URAFCDBResponse();
            var TaxDetailsinfo     = new URAFCDBResponse();

            InterfaceUra IU = new InterfaceUra();

            //string results_= IU.PullRegistrationDetails(CustPRN);
            //***** Lets Validate this before even bothering flex.

            try
            {
                // ---------------------- Validate the Prn -------------------------
                System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
                URAGateway.UraPmtService     service = new URAGateway.UraPmtService();
                eTaxPmtLibrary.UraEncryption uraEnc  = new eTaxPmtLibrary.UraEncryption();
                string EnctryptionAlgorith           = "rijndael";
                FinpayiSecurity.CryptoFactory CryptographyFactory = new FinpayiSecurity.CryptoFactory();
                FinpayiSecurity.ICrypto       Cryptographer       = CryptographyFactory.MakeCryptographer(EnctryptionAlgorith);
                MyAPIPass     = fn.GetFinpayParameter("Select ItemValue from Parameters where ItemKey = 'URAWEBPASS'");
                MyAPIUserName = fn.GetFinpayParameter("Select ItemValue from Parameters where ItemKey = 'URAWEBUSER'");
                string UraPassword = Cryptographer.Decrypt(MyAPIPass);
                string s           = uraEnc.EncryptedData(UraPassword, x509Cert_ura);
                URAGateway.PaymentRegEntity res = service.GetPRNDetails(MyAPIUserName, s, System.Configuration.ConfigurationManager.AppSettings["BANK_SHORT_CODE"], CustPRN);

                string remark       = "";
                string TaxPayername = res.TaxpayerName;
                string amountdue    = res.Amount;
                string TIN          = res.Tin;
                string ExpDate      = res.ExpiryDt;
                string RegDate      = res.PaymentRegDt;
                string statuscode   = res.StatusCode;
                if (amountdue != DRAMOUNT)
                {
                    return("UNSUCCESSFUL - INVALID AMOUNT " + DRAMOUNT + " INSTEAD OF " + amountdue);
                }
                Boolean auth = false;

                switch (statuscode)
                {
                case "A":
                    //auth = true;
                    //remark = "Awaiting To Transact : " + res.StatusDesc;
                    break;

                case "C":
                    //auth = false;
                    return("Registration has been cancelled by URA! : " + res.StatusDesc);

                //break;
                case "X":
                    //auth = false;
                    return("Registration has expired! : " + res.StatusDesc);

                //break;
                case "T":
                    //auth = false;
                    return("Registration has already been transacted! : " + res.StatusDesc);

                //break;
                default:
                    //auth = false;
                    return("Results Unknown! : " + res.StatusDesc);
                    //break;
                }
                Datamanagement.PushRegistrationDetails(CustPRN);
                Datamanagement.UpdateURARegDetails(CustPRN, TaxPayername, amountdue, TIN, ExpDate, RegDate, remark, auth, statuscode);
                //urapt.Close();
            }
            catch (Exception ex)
            {
                return(ex.Message);
            }

            //*****


            Thread.Sleep(5000);
            //Validate PRN here
            PRNResponse = Datamanagement.getPRNDetails(CustPRN);
            string[] prndets = null;

            prndets = PRNResponse.Split('|');

            string sp_reference = "";

            TINc          = prndets[0];
            TaxPayernamec = prndets[1];
            amountduec    = prndets[2];
            ExpDatec      = prndets[3];
            RegDatec      = prndets[4];
            Remarkc       = prndets[5];
            statuscodex   = prndets[6];

            switch (statuscodex)
            {
            case "A":
                //Continue
                break;

            default:
                //Do Zilch
                FailureDetailsinfo.EXRef          = EXREF;
                FailureDetailsinfo.PRNNUMBER      = CustPRN;
                FailureDetailsinfo.TaxAmount      = DRAMOUNT;
                FailureDetailsinfo.FailureDetails = new List <UraFailureDetials>();
                FailureDetailsinfo.FailureDetails.Add(new UraFailureDetials()
                {
                    Remark       = Remarkc,
                    statuscode   = statuscodex,
                    Responcecode = "05"
                });
                return("UNSUCCESSFUL");

                break;
            }

            //Get FCDB details here

            FCDBSetings = Datamanagement.getFCDBSettings("TAX");
            FCDBSetting = FCDBSetings.Split('|');

            FCDBINTERNALGL = FCDBSetting[0];
            FCDBTELLERCODE = FCDBSetting[1];
            FCDBDESC       = FCDBSetting[2];
            FCDBTILLID     = FCDBSetting[3];
            FCDBLIMIT      = FCDBSetting[4];

            FCDBMAKERy          = FCDBSetting[5];
            FCDBCHECKERy        = FCDBSetting[6];
            Subhosty            = FCDBSetting[7];
            Msgtypey            = FCDBSetting[8];
            Procodey            = FCDBSetting[9];
            Commissiony         = FCDBSetting[10];
            Trantypey           = FCDBSetting[11];
            Terminaly           = FCDBSetting[12];
            Batchy              = FCDBSetting[13];
            MessageFlagy        = FCDBSetting[14];
            Workstationy        = FCDBSetting[15];
            PosConfirmedy       = FCDBSetting[16];
            PosReversedy        = FCDBSetting[17];
            EftSourcey          = FCDBSetting[18];
            IbTxny              = FCDBSetting[19];
            Flexuseridy         = FCDBSetting[20];
            UtilityAccountY     = FCDBSetting[21];
            UtilityAccBranchY   = FCDBSetting[22];
            UtilityAccCurrencyY = FCDBSetting[23];
            MerchantTypeY       = FCDBSetting[24];


            //Check if already transacted
            istransacted = Datamanagement.isalreadyTransacted(CustPRN);
            switch (istransacted)
            {
            case true:
                FailureDetailsinfo.EXRef          = EXREF;
                FailureDetailsinfo.PRNNUMBER      = CustPRN;
                FailureDetailsinfo.TaxAmount      = DRAMOUNT;
                FailureDetailsinfo.FailureDetails = new List <UraFailureDetials>();
                FailureDetailsinfo.FailureDetails.Add(new UraFailureDetials()
                {
                    Remark       = "Registration has already been transacted",
                    Responcecode = "05"
                });
                return("UNSUCCESSFUL");

                break;

            default:
                break;
            }

            CustPRN = CustPRN + Trantypey;

            sp_reference = CustPRN + "-" + TaxPayernamec;

            isexisting = Datamanagement.isalreadyExisting(OriginalPRN);
            switch (isexisting)
            {
            case true:
                //update source as fcdb
                Datamanagement.UpdatePRNSource(OriginalPRN, "FCDB");
                break;

            case false:
                //insert into registration
                Datamanagement.insertnewfcdbpayment(OriginalPRN, TINc, TaxPayernamec, amountduec, RegDatec, ExpDatec,
                                                    statuscodex, "FCDB");
                break;
            }

            //update CLEAREDSTATUS here
            //Datamanagement.UpdateRegistration(CustPRN, "CLEARING CHEQUE");
            //check whether transaction already sent to the bridge
            isrepeat = Datamanagement.isalreadyPosted(CustPRN);
            if (isrepeat == false)
            {
                //post to the bridge
                Datamanagement.InsertIntoLog(CustPRN, Subhosty,
                                             Msgtypey, Procodey, TXNDATE, TXNTIME, DRACCBRANCH, CustPRN, CustPRN,
                                             DRAMOUNT, Commissiony, DRACCOUNTNUMBER, MerchantTypeY, EXREF, Terminaly,
                                             DRACCBRANCH,
                                             Batchy, Terminaly, sp_reference, DRACCOUNTNUMBER, DRACCURR, "0",
                                             MessageFlagy, Workstationy,
                                             PosConfirmedy, PosReversedy, "0", UtilityAccountY, UtilityAccBranchY,
                                             MerchantTypeY, EftSourcey, IbTxny, "", Flexuseridy);
            }

            Thread.Sleep(5000);
            issuccess = Datamanagement.isSuccessful(CustPRN);
            EXREF     = Datamanagement.Ecternalref(CustPRN);
            Datamanagement.UpdateMSGIDResponded(CustPRN);
            switch (issuccess)
            {
            case true:

                Datamanagement.UpdateRegistration(OriginalPRN, TXNDATE, FCDBTELLERCODE, DRACCBRANCH, "",
                                                  UtilityAccountY, DRACCOUNTNUMBER, "C", "T", EXREF, false,
                                                  FCDBCHECKERy, "11",
                                                  UtilityAccBranchY, "", Trantypey, DRACCURR, MerchantTypeY,
                                                  UtilityAccCurrencyY);
                break;

            case false:
                FailureDetailsinfo.EXRef          = EXREF;
                FailureDetailsinfo.PRNNUMBER      = CustPRN;
                FailureDetailsinfo.TaxAmount      = DRAMOUNT;
                FailureDetailsinfo.FailureDetails = new List <UraFailureDetials>();
                FailureDetailsinfo.FailureDetails.Add(new UraFailureDetials()
                {
                    Remark       = "Failed To Post To Core Banking",
                    Responcecode = "05"
                });
                return("UNSUCCESSFUL");

                break;
            }

            //Notify URA - If successfully posted
            Datamanagement.InsertIntoBridgeRegistration(OriginalPRN, "C", TINc, DRAMOUNT, TXNDATE, TXNDATE, "T",
                                                        DRACCBRANCH, CustPRN, "", "");

            //joannah.....9/7/2015
            Thread.Sleep(5000);
            //Notify URA here
            NotifyURA(OriginalPRN, "C", TINc, DRAMOUNT, TXNDATE, TXNDATE, "T",
                      DRACCBRANCH, CustPRN, "", "");

            var strUpdate = "Update REGISTRATIONS set Sent = 1, acknowledged = 1 where PRN = prn";

            try
            {
                using (
                    var conn =
                        new SqlConnection(WebConfigurationManager.ConnectionStrings["Bridge"].ConnectionString))
                {
                    conn.Open();
                    using (var cmd = new SqlCommand(strUpdate, conn))
                    {
                        var dr = cmd.ExecuteReader();
                    }
                }
            }

            catch (Exception ex)
            {
            }

            //joannah.....9/7/2015



            //RESPOND HERE

            TaxDetailsinfo.EXRef      = EXREF;
            TaxDetailsinfo.PRNNUMBER  = CustPRN;
            TaxDetailsinfo.TaxAmount  = amountduec;
            TaxDetailsinfo.TAXDetails = new List <UraDetials>();
            TaxDetailsinfo.TAXDetails.Add(new UraDetials()
            {
                amountdue    = amountduec,
                TaxPayername = TaxPayernamec,
                TIN          = TINc,
                ExpDate      = ExpDatec,
                RegDate      = RegDatec,
                Remark       = Remarkc,
                Responcecode = "00"
            });

            return(TaxDetailsinfo.EXRef.ToString());
        }