using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CredixCnx = LLNet.Tienda.com.credix.qaconectividad;
using System.Net;
using OposMSR_1_9_Lib;
using OPOSCONSTANTSLib;
using Microsoft.Win32;
using LLNet.Utils;
using LLNet.GUI;
using System.IO.Ports;
using System.Threading;

namespace LLNet.Tienda.MainForms.Forms.Credix
{
    public partial class FrmCredix : Form
    {
        #region variables

        private string varUsrC, varPwdC, varFV, varTHab, varCVV, varMont, varMoned, varMontoR, varDoc, vCuotCdx1, vCuotCdx2;
        
        OPOSMSRClass omsr = new OPOSMSRClass();
        string track2 = "";
        static LLNet.Controls.LLEventLog EventLog;

        public bool exito = false;//Indica si la transacción se realizó


        public string NumAutoriz = "";//Número de autorización
        public string NumTarj = "";//Número de tarjeta enmascarado
        public bool reversada = false;//Indica si la transacción de la venta, fue reversada
        public string NumRef = "";//Número de referencia de la transacción
        public string Motivo = "";//Indica si la transacción fue cancelada o denegada
        string vUrl = String.Empty;//URL PARA CREDIX
        string Id_tr_tarj = "";//Id log transacciones
        string Tarjeta = "";//Número de tarjeta sin enmascarar
        string url = "";//Dirección web del wcf EVERTEC
        string MACValue = "";//Valor de verificación o firma que se debe enviar
        string SystemTrace = "";
        bool anulacion = false;//Indica si se va hacer una anulación o una venta
        bool serial = false;//Indica si se está trabajando con cardreader serial
        SerialPort sp = new SerialPort();//Puerto serial
        
        #endregion

        public FrmCredix(string monto, string moneda, decimal montoReal,string doc)
        {
            varMont = monto;
            varMoned = moneda;
            varMontoR = montoReal.ToString();
            varDoc = doc;
            
            InitializeComponent();
            LlenarParametros();
            LlenarCuotas();
        }

        //Llena el comboBox con las cuotas permitidas 
        private void LlenarCuotas()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();

            Utils.QueryParams vQp = new LLNet.Utils.QueryParams();

            vQp.AddReplaceParam("pDocumento", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

            string vValidaAlgunTecno = (GUI.CApp.bll.GetSingleValue("WMS_F_CHEQUEA_SI_E_TECNOCDX", vQp, "PDV").ToString());

            string[] arrcuotas = vValidaAlgunTecno.Split('-');

            cBCuotsT.DataSource = arrcuotas;
            cBCuotsP.DataSource = arrcuotas;

          /*
           * Se comenta ya que solo va aplicar 3 y 12 cuotas siempre
           * if (vValidaAlgunTecno.Equals("0"))
            {
                qp.AddReplaceParam("pCantCuotas", vCuotCdx1);
            }
            else
            {
                qp.AddReplaceParam("pCantCuotas", vCuotCdx2);
            }
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_CUOTAS_CONDIC", qp);

            //CONSULTA LOS PARÁMETROS DE LA BD
            //DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_CUOTAS", qp);

            cBCuotsT.DataSource = dsB.Tables[0];
            cBCuotsT.DisplayMember = "RV_MEANING";
            cBCuotsT.ValueMember = "RV_LOW_VALUE";

            cBCuotsP.DataSource = dsB.Tables[0];
            cBCuotsP.DisplayMember = "RV_MEANING";
            cBCuotsP.ValueMember = "RV_LOW_VALUE";*/
        }

        /// <summary>Obtiene los parámetros necesarios de cada tienda </summary>
        private void LlenarParametros()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            //qp.AddReplaceParam("pUsuario", GUI.CApp.usuario);// pUsuario
            //CONSULTA LOS PARÁMETROS DE LA BD
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_PC", qp);

            object[] datos = new object[4];
            datos = dsB.Tables[0].Rows[0].ItemArray;

            varUsrC = datos[0].ToString();
            varPwdC = datos[1].ToString();
            vCuotCdx1 = datos[2].ToString();
            vCuotCdx2 = datos[3].ToString();
        }

        #region Cardreader
        #region SerialDataReceived
        void SerialDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp1 = (SerialPort)sender;
            string linea = sp1.ReadExisting();

            if (linea.Contains("%"))
            {
                bool caret = linea.Contains("^");
                if (caret)
                {
                    string[] datos = linea.Split('^');

                    if (datos[2].Contains(";"))
                    {
                        string[] daTrack = datos[2].Split(';');
                        this.track2 = daTrack[1];
                        this.track2 = this.track2.Remove(this.track2.IndexOf('?'), 1);
                        //this.track2 = this.track2.Replace('=', 'D');
                        int ntj = track2.IndexOf('=');
                        varFV = track2.Substring(ntj+3, 2) + track2.Substring(ntj+1, 2);                       
                        txttarj.Text = track2.Substring(0, ntj);

                        string nomb = "";
                        if (datos[1].Contains("/"))
                        {
                            string[] n = datos[1].Split('/');
                            nomb = n[1].Trim() + " " + n[0].Trim();
                            //string[] ap1 = datos[1].Split(' ');
                            //nomb += " " + ap1[0];
                        }
                        else
                            nomb = datos[1];
                        this.lblTrjHabient.Text = nomb.Trim();
                        varTHab = nomb.Trim();
                    }

                    //////Nombre con apellidos
                    ////string nomb = "";
                    ////if (datos[1].Contains("/"))
                    ////{
                    ////    string[] n = datos[1].Split('/');
                    ////    nomb = n[1].Trim();
                    ////    string[] ap1 = datos[1].Split(' ');
                    ////    nomb += " " + ap1[0];
                    ////}
                    ////else
                    ////    nomb = datos[1];
                    ////this.lblTarjetaH.Text = nomb.Trim();

                    //////Número tarjeta
                    ////string numt = Regex.Replace(datos[0], "[^0-9]", String.Empty);
                    ////this.Tarjeta = numt;

                    ////this.NumTarj = this.Tarjeta.Substring(0, 6);//Obtiene los primeros 6 dígitos del número de tarjeta
                    ////for (int i = 0; i < (this.Tarjeta.Length - 10); i++)
                    ////    this.NumTarj += "*";
                    ////this.NumTarj += this.Tarjeta.Substring(this.Tarjeta.Length - 4, 4);//Obtiene los últimos 4 dígitos del número de tarjeta
                    ////this.lblNTarjeta.Text = this.NumTarj;

                    //////Fecha vencimiento
                    ////string fecv = datos[2].Substring(0, 4);
                    ////this.lblFechaE.Text = fecv;

                    ////if (this.lblNTarjeta.Text != String.Empty && this.lblFechaE.Text != String.Empty && this.lblMonto.Text != String.Empty && this.lblTarjetaH.Text != String.Empty && this.track2 != "")
                    ////{
                    ////    sbtnAceptar.Enabled = true;
                    ////}
                }
            }
            else if (linea.Contains(";"))
            {
                string[] daTrack = linea.Split(';');
                this.track2 = daTrack[1];
                this.track2 = this.track2.Remove(this.track2.IndexOf('?'), 1);
                int ntj = track2.IndexOf('=');
                varTHab = daTrack[0].ToString().Trim();
                varFV = track2.Substring(ntj + 3, 2) + track2.Substring(ntj + 1, 2);
                txttarj.Text = track2.Substring(0, ntj);

                ////if (this.lblNTarjeta.Text != String.Empty && this.lblFechaE.Text != String.Empty && this.lblMonto.Text != String.Empty && this.lblTarjetaH.Text != String.Empty && this.track2 != "")
                ////{
                ////    if (this.track2.Contains(this.Tarjeta))
                ////        sbtnAceptar.Enabled = true;
                ////    else
                ////        sbtnAceptar.Enabled = false;
                ////}
            }
        }
        #endregion

        #region GetDirByAppConfig
        private string GetDirByAppConfig()
        {
            string result;
            try
            {
                result = System.Configuration.ConfigurationManager.AppSettings.Get("DalPath");
            }
            catch
            {
                result = "";
            }
            return result;
        }
        #endregion

        #region statusUpdateOccurred
        private void statusUpdateOccurred(int e)
        {
            string ExeDir = GetDirByAppConfig();
            EventLog = new LLNet.Controls.LLEventLog(ExeDir);

            int status = e;
            string statusMsg = "StatusUpdateOccurred = ";
            switch (status)
            {
                case (int)OPOS_Constants.OPOS_SUE_POWER_ONLINE:
                    statusMsg += "OPOS_SUE_POWER_ONLINE";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, statusMsg);
                    break;
                case (int)OPOS_Constants.OPOS_SUE_POWER_OFFLINE:
                    statusMsg += "OPOS_SUE_POWER_OFFLINE";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, statusMsg);
                    break;
            }
        }
        #endregion

        #region dataOccurred
        private void dataOccurred(int e)
        {
            Datos();

            ////if (this.lblNTarjeta.Text != String.Empty && this.lblFechaE.Text != String.Empty && this.lblMonto.Text != String.Empty && this.lblTarjetaH.Text != String.Empty)
            ////{
            ////    sbtnAceptar.Enabled = true;
            ////}
            try
            {
                omsr.DataEventEnabled = true;
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Credix", false);
            }
        }
        #endregion

        #region Datos
        /// <summary>
        /// Obtiene los datos del track1 y track2
        /// </summary>
        private void Datos()
        {
            try
            {
                bool bandera = true;//Indica si la tarjeta está vencida o no

                track2 = omsr.Track2Data;//Obtiene los datos del track2

                string track1 = omsr.Track1Data;//Obtiene los datos del track1               
                if (track2.IndexOf('=') >= 0)
                {
                    txttarj.Text = omsr.AccountNumber;
                    string fv = omsr.ExpirationDate;
                    varTHab = omsr.FirstName + " " + omsr.Surname;
                    varFV = fv.Substring(2,2) + fv.Substring(0,2);
                }                
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Credix", true);
            }
        }
        #endregion

        #region errorOccurred
        private void errorOccurred(int e, int e1, int e2, ref int e3)
        {
            string ExeDir = GetDirByAppConfig();
            EventLog = new LLNet.Controls.LLEventLog(ExeDir);

            string errorCode = "" + e.ToString();
            switch (e)
            {
                case (int)OPOS_Constants.OPOS_E_EXTENDED:
                    errorCode += "=OPOS_E_EXTENDED";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, errorCode);
                    break;
                case (int)OPOS_Constants.OPOS_E_FAILURE:
                    errorCode += "=OPOS_E_FAILURE";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, errorCode);
                    break;
            }

            string errorCodeExtended = "" + e1;
            switch (e1)
            {
                case (int)OPOSMSRConstants.OPOS_EMSR_START:
                    errorCodeExtended += "=OPOS_EMSR_START";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, errorCodeExtended);
                    break;
                case (int)OPOSMSRConstants.OPOS_EMSR_END:
                    errorCodeExtended += "=OPOS_EMSR_END";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, errorCodeExtended);
                    break;
                case (int)OPOSMSRConstants.OPOS_EMSR_PARITY:
                    errorCodeExtended += "=OPOS_EMSR_PARITY";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, errorCodeExtended);
                    break;
                case (int)OPOSMSRConstants.OPOS_EMSR_LRC:
                    errorCodeExtended += "=OPOS_EMSR_LRC";
                    EventLog.WriteLog(LLNet.Utils.Types.ErrorTypes.MESSAGES, errorCodeExtended);
                    break;
            }

            throw new Exception(errorCode + " " + errorCodeExtended);
            omsr.ClearInput();
        }
        #endregion
        #endregion

        private string Sec_Credix() 
        {
            string seccrdx = "";
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            seccrdx = Convert.ToString(GUI.CApp.bll.GetSingleValue("SEC_CREDIX", qp, "PDV"));
            return seccrdx;
        }

        private void ErrorLECDATOSCredix(string error, string id_credix)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
           
            qp.AddReplaceParam("ERROR", error);           
            //Jornada
            qp.AddReplaceParam("ID_CREDIX", id_credix);
            //Jornada
            qp.AddReplaceParam("JORNADA", Program.Jornada.ToString());

            // Llama el procedimiento que almacena los datos dl pago en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_ERRORLDCREDIX", qp, "PDV");
        }

        private void btnAcptr_Click(object sender, EventArgs e)
        {
            try
            { 
                if (rbtntarj.Checked)
                {//Con plastico presente
                   //LeerTarjeta();
                    if (conexion())
                    {
                        string sec_credx = Sec_Credix();
                        if (sec_credx != "")
                        {
                            //validar datos completos log
                            if (txttarj.Text == String.Empty || varFV.Trim() == String.Empty || varTHab.Trim() == String.Empty || cBCuotsT.SelectedValue.ToString() == String.Empty)
                            {
                                string dts = "Tarjeta: " + txttarj.Text + "/FechaVencimiento: " + varFV + "/TarjetaHabiente: " + varTHab + "/Cuotas: " + cBCuotsT.SelectedValue.ToString();
                                ErrorLECDATOSCredix(dts,sec_credx);
                            }

                            if (varTHab.Trim() == String.Empty)
                            {                               
                                varTHab = "CLIENTE_CREDIX";
                            }
                            //VALIDA LECTURA CORRECTA DE LOS DATOS
                            if (txttarj.Text != String.Empty && varFV.Trim() != String.Empty && varTHab.Trim() != String.Empty && cBCuotsT.SelectedValue.ToString() != String.Empty)
                            {
                                if (txtCvv.Text != "")
                                {
                                    if (varMont != "" && varMontoR != "")
                                    {
                                        varCVV = txtCvv.Text;
                                        RegistroBDPagoTarj(txttarj.Text.Trim(), varFV.Trim(), varTHab.Trim(), varCVV.Trim(), varMont.Trim(), varMoned.Trim(), cBCuotsT.SelectedValue.ToString().Trim(), sec_credx, "S", varMontoR.Trim());
                                        Crear_Pago_Tarj(varFV.Trim(), varCVV.Trim(), varMont.Trim(), varMoned.Trim(), cBCuotsT.SelectedValue.ToString().Trim(), sec_credx);
                                        if (exito)
                                        {
                                            imprimir(sec_credx, true);
                                        }
                                    }
                                    else
                                    {
                                        GUI.CApp.ShowMessage("Faltan digitar el Monto", "Credix", false);
                                    }
                                }
                                else
                                {
                                    GUI.CApp.ShowMessage("Favor digitar el CVV", "Credix", false);
                                }
                            }
                            else
                            {
                                GUI.CApp.ShowMessage("Faltan datos de la tarjeta por leer", "Credix", false);
                            }
                        }
                        else
                        {
                            GUI.CApp.ShowMessage("No se pudo obtener el número de ref secuencia", "Credix", false);
                        }
                    }
                }
                else
                {//Con Pin                
                    if (conexion())
                    {
                        string sec_credx = Sec_Credix();
                        if (sec_credx != "")
                        {
                            if (txtPin.Text.Trim() != string.Empty)
                            {
                                RegistroBDPagoPin(txtPin.Text.Trim(), varMont.Trim(), varMoned.Trim(), cBCuotsP.SelectedValue.ToString().Trim(), sec_credx, "S", varMontoR.Trim());
                                Crear_Pago_Pin(varMont.Trim(), varMoned.Trim(), cBCuotsP.SelectedValue.ToString().Trim(), sec_credx);
                                if (exito)
                                {
                                    imprimir(sec_credx, false);
                                }
                            }
                            else
                            {
                                GUI.CApp.ShowMessage("Ingrese el Pin", "Credix", false);
                            }
                        }
                        else
                        {
                            GUI.CApp.ShowMessage("No se pudo obtener el número de ref secuencia", "Credix", false);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Credix", false);
                if (serial)
                {
                    sp.Close();
                    sp = new SerialPort();
                }
                else
                {
                    if (omsr.Claimed)
                    {
                        omsr.Close();
                        omsr = new OPOSMSRClass();
                    }
                }
                this.Dispose();
            }
        }

        //Registrar en BD la transaccion Pago con tarjeta
        private void RegistroBDPagoTarj(string tarj, string fven,string thab, string cvv, string imprt, string moned, string cuots, string refer, string tip, string montor)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            if (tarj == "")
            {
                qp.AddReplaceParam("ptarj", DBNull.Value.ToString().ToString());
            }
            else
            {
                //qp.AddReplaceParam("ptarj", tarj);
                //Almacena los últimos 4 digitos
                string tarjU4dig = tarj.Substring(tarj.Length - 4, 4);
                qp.AddReplaceParam("ptarj", tarjU4dig);
            }
            if (fven == "")
            {
                qp.AddReplaceParam("pfven", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pfven", fven);
            }
            if (thab == "")
            {
                qp.AddReplaceParam("pthab", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pthab", thab);
            }
            if (cvv == "")
            {
                qp.AddReplaceParam("pcvv", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pcvv", cvv);
            }
            if (imprt == "")
            {
                qp.AddReplaceParam("pimprt", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pimprt", imprt);
            }
            if (montor == "")
            {
                qp.AddReplaceParam("pmonto", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pmonto", montor);
            }
            if (moned == "")
            {
                qp.AddReplaceParam("pmoned", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pmoned", moned);
            }
            if (cuots == "")
            {
                qp.AddReplaceParam("pcuots", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pcuots", cuots);
            }
            if (refer == "")
            {
                qp.AddReplaceParam("prefer", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("prefer", refer);
            }
            if (tip == "")
            {
                qp.AddReplaceParam("ptip", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("ptip", tip);
            }
            //Jornada
            qp.AddReplaceParam("pjornada", Program.Jornada.ToString());
            
            //Pedido
            qp.AddReplaceParam("pdoc", varDoc);

            // Llama el procedimiento que almacena los datos dl pago en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_ITRACREDIX", qp, "PDV");
        }

        //Registrar en BD la transaccion Pago con pin
        private void RegistroBDPagoPin(string pin, string imprt, string moned, string cuots, string refer, string tip, string montor)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            if (pin == "")
            {
                qp.AddReplaceParam("ppin", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("ppin", pin);
            }
            if (imprt == "")
            {
                qp.AddReplaceParam("pimprt", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pimprt", imprt);
            }
            if (montor == "")
            {
                qp.AddReplaceParam("pmonto", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pmonto", montor);
            }
            if (moned == "")
            {
                qp.AddReplaceParam("pmoned", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pmoned", moned);
            }
            if (cuots == "")
            {
                qp.AddReplaceParam("pcuots", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pcuots", cuots);
            }
            if (refer == "")
            {
                qp.AddReplaceParam("prefer", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("prefer", refer);
            }
            if (tip == "")
            {
                qp.AddReplaceParam("ptip", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("ptip", tip);
            }
            //Jornada
            qp.AddReplaceParam("pjornada", Program.Jornada.ToString());

            //Pedido           
            qp.AddReplaceParam("pdoc", varDoc);

            // Llama el procedimiento que almacena los datos dl pago en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_ITRAPCREDIX", qp, "PDV");
        }

        //Registrar en BD la respuesta de la transaccion
        private void RegistroBDResp(string refer, string resp, string estado, bool pin)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            if (refer == "")
            {// EKO_P_IRESPCREDIX('&&prefer&&','&&presp&&','&&pestado&&','&&pauto&&');
                qp.AddReplaceParam("prefer", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("prefer", refer);
            }
            if (resp == "")
            {
                qp.AddReplaceParam("presp", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("presp", resp);
            }
            if (estado == "")
            {
                qp.AddReplaceParam("pestado", DBNull.Value.ToString().ToString());
            }
            else
            {
                qp.AddReplaceParam("pestado", estado);
            }
            if (resp.Length >= 8)
            {
                if (resp.Substring(2, 6) == "")
                {
                    qp.AddReplaceParam("pauto", DBNull.Value.ToString().ToString());
                }
                else
                {
                    qp.AddReplaceParam("pauto", resp.Substring(2, 6));
                }
                if (resp.Length == 14)
                {
                    if (resp.Substring(8, 6) == "")
                    {
                        qp.AddReplaceParam("pnumcrdx", DBNull.Value.ToString().ToString());
                    }
                    else
                    {
                        qp.AddReplaceParam("pnumcrdx", resp.Substring(8, 6));
                    }
                }
                else
                {
                    qp.AddReplaceParam("pnumcrdx", DBNull.Value.ToString().ToString());
                }
            }
            else
            {
                qp.AddReplaceParam("pauto", DBNull.Value.ToString().ToString());
                qp.AddReplaceParam("pnumcrdx", DBNull.Value.ToString().ToString());
            }
            // Llama el procedimiento que almacena los datos dl pago en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_IRESPCREDIX", qp, "PDV");
        }
        
        //Captura los datos de la Tarjeta
        private void LeerTarjeta()
        {
            txttarj.Text = "5022862340070131";
            varCVV = "602";
            varFV = "09/24";
            varTHab = "Cliente Credix Prueba";
        }

        //Revisa si existe una transacción
        private bool conexion()
        {
            bool cnx = false;

            vUrl = Helpers.Nvl(CApp.GetParam("URLX"), "").ToString();

            //WEB SERVICE CON SUS MÉTODOS
            CredixCnx.Webservices_Model_WsService WSCredix = new CredixCnx.Webservices_Model_WsService();
            WSCredix.Url = vUrl;
            WSCredix.Credentials = new NetworkCredential(varUsrC, varPwdC);
            string resp = WSCredix.servicioDisponible(varUsrC,varPwdC);
            string codresp =  resp.Substring(0,2);
            if (codresp == "00")
            {
                cnx = true;
            }
            else
            {
                GUI.CApp.ShowMessage("No se puede establecer conexión con Credix, Error:" + resp, "Credix",false);
            }


            return cnx;
        }

        #region imprimirVoucher

        private void imprimir(string id, bool tarj)
        {
            try
            {
                if (tarj)
                {//pago con tarjeta
                    object FormatoTipoImpresion = null;
                    QueryParams qparams = new LLNet.Utils.QueryParams();
                    qparams = new LLNet.Utils.QueryParams();
                    qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VCX");
                    Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qparams), dsDocTienda);
                    string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                    imprimirVoucher(Convert.ToInt64(id), "", Convert.ToInt64(format));
                }
                else
                {//pago con pin
                    object FormatoTipoImpresion = null;
                    QueryParams qparams = new LLNet.Utils.QueryParams();
                    qparams = new LLNet.Utils.QueryParams();
                    qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VCXP");
                    Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qparams), dsDocTienda);
                    string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                    imprimirVoucher(Convert.ToInt64(id), "", Convert.ToInt64(format));

                }

            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Vouchers Credix", false);
            }
        }


        /// <summary> Imprime el voucher</summary>
        /// <param name="voucher">Id voucher</param>
        /// <param name="Impresora"></param>
        /// <param name="formato">Formato impresión</param>
        private void imprimirVoucher(long voucher, string Impresora, long formato)
        {
            string Ruta = Application.StartupPath;
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            if (Ruta != string.Empty)
            {
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(Ruta + "\\" + "imprimir.bat ");
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

                string Args = "";
                string varTipoTxt = Utils.Helpers.ObjToStr(GUI.CApp.GetParam("TTXT"));

                if (varTipoTxt == "U") // SI EL TIPO DE GENERACION DE ARCHIVO ES POR USUARIO O DOCUMENTO
                {
                    Args = GUI.CApp.usuario + ".txt ";
                }
                else
                {
                    long pDocumento = voucher;
                    Args = pDocumento + ".txt ";
                }

                startInfo.Arguments = Args;
                try
                {
                    qp.AddReplaceParam("ID_TR_TARJ", voucher.ToString());
                    qp.AddReplaceParam("FORMATO", formato.ToString());
                    qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                    GUI.CApp.bll.ExecuteSql("WMS_P_GENERAR_IMPRVO", qp, "PDV");
                    Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                    System.Diagnostics.Process.Start(startInfo);

                    #region Imprimir copia voucher
                    string valor = Helpers.Nvl(CApp.GetParam("HCV"), "").ToString();
                    if (valor == "1")//Si valor es 1, se imprime la copia del voucher
                    {
                        qp.AddReplaceParam("ID_TR_TARJ", voucher.ToString());
                        qp.AddReplaceParam("FORMATO", formato.ToString());
                        qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                        GUI.CApp.bll.ExecuteSql("WMS_P_GENERAR_IMPRVO", qp, "PDV");
                        Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                        System.Diagnostics.Process.Start(startInfo);
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    GUI.CApp.ShowMessage(ex.Message, "Impresion de Documentos", false);
                }
            }
            else
            {
                throw new Exception("No esta Definido el Parametro UATI");
            }
        }
        #endregion
        
        //Crea una transaccion de pago por Credix con Tarjeta
        private void Crear_Pago_Tarj(string fven,string cvv, string imprt, string moned, string cuots, string refer)
        {  
            //Transaccion := S = Consumo (Adquirencia).P = Pago (Recaudación).C = Adelantos de Efectivos (Solo para casos donde exista lectura de banda).
            vUrl = Helpers.Nvl(CApp.GetParam("URLX"), "").ToString();
            //WEB SERVICE CON SUS MÉTODOS
            CredixCnx.Webservices_Model_WsService WSCredix = new CredixCnx.Webservices_Model_WsService();
            WSCredix.Url = vUrl;
            WSCredix.Credentials = new NetworkCredential(varUsrC, varPwdC);
            string resp = WSCredix.auth_transaction(varUsrC,varPwdC,txttarj.Text,fven,cvv,imprt,moned,cuots,refer,"S","");
            string estad = "P";
            if(resp.Substring(0,2) == "00")
            {
                estad = "C";
                exito = true;
            }
            else{
                estad = "E";
                CApp.ShowMessage("Error al realizar el pago con Credix " + resp, "Credix", false);
            }
            //Almacena la respuesta
            RegistroBDResp(refer, resp,estad,false);            
            if (serial)
            {
                sp.Close();
                sp = new SerialPort();
            }
            else
            {
                if (omsr.Claimed)
                {
                    omsr.Close();
                    omsr = new OPOSMSRClass();
                }
            }
            this.Dispose();
        }

        //Crea una transaccion de pago por Credix con Pin
        private void Crear_Pago_Pin(string imprt, string moned, string cuots, string refer)
        {
            vUrl = Helpers.Nvl(CApp.GetParam("URLX"), "").ToString();
            //WEB SERVICE CON SUS MÉTODOS
            CredixCnx.Webservices_Model_WsService WSCredix = new CredixCnx.Webservices_Model_WsService();
            WSCredix.Url = vUrl;
            WSCredix.Credentials = new NetworkCredential(varUsrC, varPwdC);
            string resp = WSCredix.auth_transaction_pin(varUsrC,varPwdC,txtPin.Text.Trim(),imprt,moned,cuots,refer,"S");
            //Almacena la respuesta
            string estad = "P";
            if (resp.Substring(0, 2) == "00")
            {
                estad = "C";
                exito = true;
            }
            else
            {
                estad = "E";
                CApp.ShowMessage("Error al realizar el pago con Credix " + resp, "Credix", false);
            }
            //Almacena la respuesta
            RegistroBDResp(refer, resp, estad,true);            
            if (serial)
            {
                sp.Close();
                sp = new SerialPort();
            }
            else
            {
                if (omsr.Claimed)
                {
                    omsr.Close();
                    omsr = new OPOSMSRClass();
                }
            }
            this.Dispose();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            exito = false;
            if (serial)
            {
                sp.Close();
                sp = new SerialPort();
            }
            else
            {
                if (omsr.Claimed)
                {
                    omsr.Close();
                    omsr = new OPOSMSRClass();
                }
            }
            this.Dispose();
        }

        private void FrmCredix_Load(object sender, EventArgs e)
        {
            try
            {
                exito = false;
                RegistryKey llave = Registry.CurrentUser;
                llave = llave.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0");

                if (llave != null)
                {
                    string tipoLec = llave.GetValue("TipoLector", "").ToString();//Tipo Card Reader

                    if (tipoLec != "")
                    {
                        string msr = llave.GetValue("NombreLector", "").ToString();

                        if (msr != "")
                        {
                            if (tipoLec.ToUpper() == "UPOS")
                            {
                                int res = omsr.Open(msr);
                                if (res == (int)OPOS_Constants.OPOS_SUCCESS)//Si res es distinto a OPOS_Constants.OPOS_SUCCESS
                                {
                                    #region msr upos
                                    omsr.ClaimDevice(1000);

                                    _IOPOSMSREvents_StatusUpdateEventEventHandler sue = new _IOPOSMSREvents_StatusUpdateEventEventHandler(statusUpdateOccurred);
                                    omsr.StatusUpdateEvent += sue;
                                    _IOPOSMSREvents_DataEventEventHandler de = new _IOPOSMSREvents_DataEventEventHandler(dataOccurred);
                                    omsr.DataEvent += de;
                                    _IOPOSMSREvents_ErrorEventEventHandler ee = new _IOPOSMSREvents_ErrorEventEventHandler(errorOccurred);
                                    omsr.ErrorEvent += ee;

                                    omsr.DeviceEnabled = true;
                                    omsr.DataEventEnabled = true;
                                    omsr.ErrorReportingType = (int)OPOSMSRConstants.MSR_ERT_TRACK;

                                    if (omsr.CapJISTwo == true)
                                    {
                                        //DBCS
                                        omsr.TracksToRead = (int)OPOSMSRConstants.MSR_TR_2_4;
                                    }
                                    else
                                    {
                                        //ISO
                                        omsr.TracksToRead = (int)OPOSMSRConstants.MSR_TR_1_2_3_4;
                                    }
                                    #endregion
                                }// if (res != (int)OPOS_Constants.OPOS_SUCCESS)
                                else
                                {
                                    CApp.ShowMessage("No se puede acceder al cardreader", "Credix", false);
                                    this.Dispose();
                                }//else de if (res != (int)OPOS_Constants.OPOS_SUCCESS)
                            }//if (tipoLec.ToUpper() == "UPOS")
                            else if (tipoLec.ToUpper() == "SERIAL")
                            {
                                CheckForIllegalCrossThreadCalls = false;
                                sp = new SerialPort(msr);
                                sp.BaudRate = 9600;
                                sp.DataBits = 8;
                                sp.Parity = Parity.None;
                                sp.StopBits = StopBits.One;
                                sp.Handshake = Handshake.None;
                                try
                                {
                                    sp.Open();
                                    sp.DataReceived += new SerialDataReceivedEventHandler(SerialDataReceived);
                                    this.serial = true;
                                }
                                catch (System.IO.IOException) { }
                            }//else if (tipoLec.ToUpper() == "SERIAL")
                            else
                            {
                                CApp.ShowMessage("El valor de TipoLector no es válido", "Credix", false);
                                this.Dispose();
                            }
                        }//if (msr != "")
                        else
                        {
                            CApp.ShowMessage("No se encuentra el puerto/nombre del card reader", "Credix", false);
                            this.Dispose();
                        }//else de if (msr != "")
                    }//if (tipoLec != "")
                    else
                    {
                        CApp.ShowMessage("No se encuentra el tipo de card reader", "Credix", false);
                        this.Dispose();
                    }//else de if (tipoLec != "")
                }//if (llave != null)
                else
                {
                    CApp.ShowMessage("No se encuentra la configuración del card reader", "Credix", false);
                    this.Dispose();
                }//else de if (llave != null)
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Credix", false);
            }
        }

        private void rbtntarj_CheckedChanged(object sender, EventArgs e)
        {
            if (rbtntarj.Checked)
            {
                pnlpin.Visible = false;
                pnltarj.Visible = true;
            }
            else
            {
                pnlpin.Visible = true;
                pnltarj.Visible = false;
            }
        }

        private void FrmCredix_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F5:                    
                        btnAcptr_Click(null, null);
                    break;              
                case Keys.Escape:
                    btnSalir_Click(null, null);
                    break;
            }
        }

    }
}