#region using
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using DevExpress.XtraPrinting.Drawing;
using DevExpress.XtraReports;
using System.Threading;
using LLNet.Utils;
using LLNet.GUI;
using DevExpress.XtraEditors;
using PoswareRMS;
using System.Net;
using System.IO;
using Microsoft.Win32;
using System.Xml;
using GenesisCnx = LLNet.Tienda.wsGenesis;
using LLNet.Tienda.MainForms.Forms.MisPuntos;
using RestSharp;
using Newtonsoft.Json;
#endregion

namespace LLNet.Tienda.MainForms.Forms
{
    /// <summary>
    /// Forma de cobros
    /// </summary>
    ///
    public partial class frmPayments : GUI.FormBases.frmBase
    {
        #region Constructor

        public frmPayments()
        {
            InitializeComponent();

            //GUI.CApp.TraducirForm(this);
        }

        #endregion

        public string docecom;
        public List<decimal> ValesGenerados = new List<decimal>();
        public decimal cliente;
        private string formatoGarantia;
        private decimal montoTotal;
        private decimal monedaBase;
        private bool esPagoAnticipado;
        private bool esPagoCredito;
        public bool exencionEfectuada = false;
        public bool prontoPagoEfectuado = false;
        private decimal sesion;
        private string p_documentos = null;
        private string observacion;
        private static long documentoPreimpreso;
        private static string subTipoDocumentoPreimpreso;
        private decimal Puntos = 0;
        private decimal GiftCardSaldo = 0;
        private string TarjPagarGiftCard = "0";
        private string TarjPagarMPts = "0";
        public string GiftCard = "0";//IGF
        private string varUrlPts, varCodemprPts, varCodsucPts, varArtCDesc, id, varUSRG, varPWDG, varURLE;
        private decimal PuntosDisp = 0;
        private decimal PuntosPaga = 0;
        private decimal MontoGCDisp = 0;
        private decimal MontoGCPaga = 0;
        public static int mostrar = 0;
        //Alexis 04/2019
        public bool relacionFEClienteAsocicion;
        public bool esAsociacion;
        public string SocioAsociacionFE = "";
        public string SocioClienteFE = "";
        private string vTokenSinpe = "";

        public string Id_March;

        private static bool error = false;
        private static string factura = "";

        private ArrayList lTransacciones = new ArrayList();////Almacena número tarjeta, autorización y referencia
        private static ArrayList lId_tr_tarj = new ArrayList();//Lista id transacciones tarjetas BCR

        private FrmOpcGrupoPago.eTipoPago vTipoPagoAsociacion = FrmOpcGrupoPago.eTipoPago.Ninguno; //29/06/2016 IMGF

        //     private void ActualizaImpresiones(long pDocumento)
        //     {
        //        Utils.QueryParams qp = new LLNet.Utils.QueryParams();
        //        qp.AddReplaceParam("ActImpresiones", pDocumento);
        //   }  

        //29/06/2016 IMGF
        #region TipoPagoAsociacion
        public FrmOpcGrupoPago.eTipoPago TipoPagoAsociacion
        {
            set
            {
                this.vTipoPagoAsociacion = value;
            }
        }
        #endregion

        private static void ActualizaImpresiones(long pDocumento)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("DOCUMENTO", Convert.ToString(pDocumento));
            CApp.bll.ExecuteSql("ActImpresiones", qp, "PDV");
        }

        private static int EsDeCredito(long pDocumento)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("DOCUMENTO", Convert.ToString(pDocumento));
            int Credito = Convert.ToInt16(CApp.bll.GetSingleValue("ImpresionesCredito", qp, "PDV"));
            return Credito;
        }

        public override void Init(object[] pArgs)
        {
            lId_tr_tarj.Clear();
            lTransacciones.Clear();

            this.btnCancelar.Enabled = true;

            monedaBase = Convert.ToDecimal(CApp.bll.GetSingleValue("MonedaBase", "General"));
            exencionEfectuada = false;
            prontoPagoEfectuado = false;
            esPagoCredito = false;
            observacion = "";
            documentoPreimpreso = 0;
            subTipoDocumentoPreimpreso = "";

            base.Init(pArgs);
            if (pArgs == null)
            {
                DsPedido = Program.FrmMainPos.DsPedido;
                ctlMaster1.DataSource = DsPedido;
            }
            else
            {
                montoTotal = 0;
                ctlMaster1.DataSource = DsPedido;
                cliente = Convert.ToDecimal(pArgs[0]);
                montoTotal = Convert.ToDecimal(pArgs[1]);

                if (pArgs.Length == 3)
                    esPagoAnticipado = Convert.ToBoolean(pArgs[2]);
                else
                    esPagoCredito = false;

                if (pArgs.Length == 4)
                    sesion = Convert.ToDecimal(pArgs[3]);
                if (pArgs.Length == 5)
                {
                    sesion = Convert.ToDecimal(pArgs[3]);  //AGREGADO POR RANDALL, NECESITA GUARDAR LA SESION
                    esPagoCredito = true; //AGREGADO POR RANDALL, ES PAGO A REALIZAR ES DE CREDITO
                    p_documentos = pArgs[4].ToString();
                    //DLQG, NO SE PERMITEN ABONOS CON PTS
                    btnPoints.Visible = false;
                }

                QueryParams qp = new QueryParams();
                qp.AddReplaceParam("SOCIO", cliente.ToString());
                DsPedido.WMS_SOCIOS.Clear();
                Helpers.Merge(CApp.bll.getTypedDataSet(DsPedido.GetType(), DsPedido.WMS_SOCIOS.TableName, qp, "FillBySocio"), DsPedido);
                qp.AddReplaceParam("MONTO", montoTotal.ToString());
                DsPedido.TDA_DATOS_DOCUMENTO.Clear();

                Helpers.Merge(CApp.bll.getTypedDataSet(DsPedido.GetType(), DsPedido.TDA_DATOS_DOCUMENTO.TableName, qp, "PagoFacturasCredito"), DsPedido);
            }
            gridControl1.DataSource = DsRecibo.WMS_PAGO_DOCUMENTOS;

            //IGF
            int deshabilitar = Convert.ToInt32(Helpers.Nvl(CApp.GetParam("DBOP"), 0).ToString());
            if (deshabilitar == 1)
            {
                try
                {
                    if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0)
                    {
                        if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].TARJETA1.ToString() != "")
                            this.btnObservacion.Enabled = false;
                    }
                }
                catch (StrongTypingException) { this.btnObservacion.Enabled = true; }
                catch (NullReferenceException) { this.btnObservacion.Enabled = true; }
            }

            frmPayments_Load(null, null);

            if (Id_March != null && Id_March != String.Empty)
            {
                this.btnCancelar.Enabled = false;
            }
            else
            {
                #region Registrar Cliente - Cupones

                /**************DLQG-IGF********************/
                //Registrar cliente
                decimal regC = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("RegCliente", null, "PDV").ToString());
                decimal montoCpn = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("MontoCpn", null, "PDV").ToString());
                //
                if (DsPedido.TDA_DETALLE_PEDIDO.Count > 0 && regC > 0 && DsPedido.WMS_DOCUMENTOS[0].TOTAL >= montoCpn)
                {
                    DialogResult result = GUI.CApp.ShowMessage("¿Desea registrar los datos del cliente?", "Facturación", true, false);
                    if (result == DialogResult.OK)
                    {
                        LLNet.Tienda.MainForms.Forms.FrmRegCliente rc = new LLNet.Tienda.MainForms.Forms.FrmRegCliente(DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO, DsPedido.WMS_DOCUMENTOS[0].TOTAL);
                        rc.ShowDialog();
                    }
                }

                #endregion

                this.btnCancelar.Enabled = true;
            }

            CApp.TraducirForm(this);
        }

        #region Metodos

        /// <summary>
        /// Inicializa los controles de tipos de pago
        /// </summary>
        /// <param name="ctrl"></param>
        private void InitializeControl(Control ctrl, DevExpress.XtraVerticalGrid.VGridControl Vgc, ref decimal? originalValue)
        {
            panelControl3.Controls.Clear();
            ctrl.Parent = panelControl3;
            ctrl.Dock = DockStyle.Fill;
            ctrl.BringToFront();
            ctrl.Focus();
            ctrl.Show();

            foreach (DevExpress.XtraVerticalGrid.Rows.BaseRow br in ((DevExpress.XtraVerticalGrid.Rows.CategoryRow)Vgc.Rows[0]).ChildRows)
            {
                if (br.Index > 0)
                    br.Properties.Value = DBNull.Value;
                else
                {
                    if (br.Name.ToUpper() == "ROWMONEDA")
                        br.Properties.Value = monedaBase;
                }
            }

            updateAmount(Vgc.Rows[0].ChildRows["rowMONTO"]);
            Vgc.Refresh();
            Vgc.Update();
            Vgc.UpdateFocusedRecord();
            Vgc.FocusedRow = Vgc.Rows[0].ChildRows["rowMONTO"];

            if (Vgc.Rows[0].ChildRows["rowMONTO"].Properties.Value != null)
                originalValue = Convert.ToDecimal(Vgc.Rows[0].ChildRows["rowMONTO"].Properties.Value);
        }

        #region mReceptor
        /// <summary>
        /// Despliega el formulario para crear o seleccionar el receptor electrónico
        /// </summary>
        private void mReceptor()
        {
            string vIdentificacion = String.Empty;
            string vLimiteC = String.Empty;
            QueryParams vParametros = new QueryParams();
            bool vSocioAsoc = false;

            vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
            vLimiteC = Convert.ToString(GUI.CApp.bll.GetSingleValue("WMS_F_LIMITE_CREDITO", vParametros, "PDV"));

            // Verifica si el socio, es un cliente de asociación, es decir, con límite de crédito
            if (!String.IsNullOrEmpty(vLimiteC) && Convert.ToInt64(vLimiteC) > 0)
            {
                vSocioAsoc = true;
            }

        CrearCliente:
            using (FacturaElect.FrmClienteFE vForm = new FacturaElect.FrmClienteFE())
            {
                vForm.ShowDialog();

                if (!vForm.mCon_Datos)
                {
                    Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2 = null;
                    this.chkFacturaElect.Checked = true;
                    //
                    vParametros = new QueryParams();
                    vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
                    vParametros.AddReplaceParam("pIDENTIFICACION", DBNull.Value.ToString());
                    //
                    vIdentificacion = Convert.ToString(GUI.CApp.bll.GetSingleValue("FE_F_IDENTIFICACION_INST", vParametros, "PDV"));
                    //
                    if (vSocioAsoc && vIdentificacion != Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString())
                    {
                        CApp.ShowMessage("Por favor cree/seleccione el cliente", "Cliente - Factura Electrónica", true);
                        //
                        goto CrearCliente;
                    }
                }
                else
                {
                    Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2 = vForm.mIdentificacion;
                    //
                    vParametros = new QueryParams();
                    vParametros.AddReplaceParam("pSOCIO", "NULL");
                    vParametros.AddReplaceParam("pIDENTIFICACION", vForm.mIdentificacion);
                    //
                    vIdentificacion = Convert.ToString(GUI.CApp.bll.GetSingleValue("FE_F_IDENTIFICACION_INST", vParametros, "PDV"));
                    //
                    if (vSocioAsoc && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString() != vIdentificacion)
                    {
                        CApp.ShowMessage("El código del cliente de hacienda, no coincide con el cliente del pedido, por favor seleccione el cliente correcto",
                            "Cliente - Factura Electrónica", true);

                        if (GUI.CApp.ValidateAccess("Customer", "Datos del Documento"))
                        {
                            FrmDatosProducto vFormC = new FrmDatosProducto();
                            vFormC.Init(null);

                            vFormC.MdiParent = null;
                            vFormC.Parent = null;
                            vFormC.ShowDialog(this);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// Analiza datos del cliente receptor de la factura de una asociacion
        /// </summary>
        private void mReceptorClienteFacturaAsociacion(string pIdent_Cliente, long pSocio)
        {
            string vIdentificacion = String.Empty;
            string vLimiteC = String.Empty;
            QueryParams vParametros = new QueryParams();
            bool vSocioAsoc = false;

        /*
        vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
        vLimiteC = Convert.ToString(GUI.CApp.bll.GetSingleValue("WMS_F_LIMITE_CREDITO", vParametros, "PDV"));

        // Verifica si el socio, es un cliente de asociación, es decir, con límite de crédito
        if (!String.IsNullOrEmpty(vLimiteC) && Convert.ToInt64(vLimiteC) > 0)
        {
            vSocioAsoc = true;
        }
        */

        CrearCliente:
            using (FacturaElect.FrmClienteFE vForm = new FacturaElect.FrmClienteFE(pIdent_Cliente))
            {
                vForm.ShowDialog();

                if (!vForm.mCon_Datos)
                {
                    //Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2 = null;
                    this.chkFacturaElect.Checked = true;
                    //
                    vParametros = new QueryParams();
                    //vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
                    vParametros.AddReplaceParam("pSOCIO", pSocio.ToString());
                    vParametros.AddReplaceParam("pIDENTIFICACION", DBNull.Value.ToString());
                    //
                    vIdentificacion = Convert.ToString(GUI.CApp.bll.GetSingleValue("FE_F_IDENTIFICACION_INST", vParametros, "PDV"));
                    //
                    if (vIdentificacion != Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString())
                    {
                        CApp.ShowMessage("Por favor cree/seleccione el cliente", "Cliente - Factura Electrónica", true);
                        //
                        goto CrearCliente;
                    }
                }
                else
                {
                    //Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2 = vForm.mIdentificacion;
                    //
                    vParametros = new QueryParams();
                    vParametros.AddReplaceParam("pSOCIO", "NULL");
                    vParametros.AddReplaceParam("pIDENTIFICACION", vForm.mIdentificacion);
                    //
                    vIdentificacion = Convert.ToString(GUI.CApp.bll.GetSingleValue("FE_F_IDENTIFICACION_INST", vParametros, "PDV"));
                    //
                    if (vSocioAsoc && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString() != vIdentificacion)
                    {
                        CApp.ShowMessage("El código del cliente de hacienda, no coincide con el cliente del pedido, por favor seleccione el cliente correcto",
                            "Cliente - Factura Electrónica", true);

                        if (GUI.CApp.ValidateAccess("Customer", "Datos del Documento"))
                        {
                            FrmDatosProducto vFormC = new FrmDatosProducto();
                            vFormC.Init(null);

                            vFormC.MdiParent = null;
                            vFormC.Parent = null;
                            vFormC.ShowDialog(this);
                        }
                    }
                }
            }
        }
        #endregion


        #region validaciones
        private bool mValidarEsAsociacion()
        {

            string vLimiteC = String.Empty;
            QueryParams vParametros = new QueryParams();
            bool vSocioAsoc = false;

            try
            {

                vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
                vLimiteC = Convert.ToString(GUI.CApp.bll.GetSingleValue("WMS_F_LIMITE_CREDITO", vParametros, "PDV"));

                // Verifica si el socio, es un cliente de asociación, es decir, con límite de crédito
                if (!String.IsNullOrEmpty(vLimiteC) && Convert.ToInt64(vLimiteC) > 0)
                {
                    vSocioAsoc = true;
                    this.esAsociacion = true;
                }
            }
            catch (Exception)
            {

            }


            return vSocioAsoc;
        }
        #endregion

        //Inicio el cambio Alexis
        /// <summary>
        /// Asocia o des-asocia el documento de la asociacion con el cliente.
        /// </summary>
        /// <param name="pDocumento">N° del documento.</param>
        /// <param name="pAsociar">True si debe asociar, de lo contrario false.</param>
        public void mAsociarDocAsociacionConCliente(long pDocumento,
                                                     string pSocioAsociacion,
                                                     string pTipo,
                                                     bool pAsociacion,
                                                     string pSocioCliente = "")
        {
            QueryParams vParametros = new QueryParams();
            string socio = String.Empty;

            if (pAsociacion)
            {
                //consulta si se debe escoger un cliente para enviar FE
                frmConsultasSiNo frmConsulta = new frmConsultasSiNo(
                    "¿Se debe enviar la factura electrónica a nombre del cliente en lugar de a la asociación?");
                frmConsulta.ShowDialog(this);
                /*DialogResult dialogResult =
                    MessageBox.Show("¿Se debe enviar la factura electrónica al cliente en lugar de a la asociación?",
                                    "Cliente Factura Electónica", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (dialogResult == DialogResult.Yes)*/
                if (frmConsulta.Respuesta)
                {
                    //Busca el cliente
                    LLNet.Tienda.MainForms.Forms.frmAsignarClienteFEAsociaciones dat = new LLNet.Tienda.MainForms.Forms.frmAsignarClienteFEAsociaciones();

                    dat.Init(null);

                    dat.MdiParent = null;
                    dat.Parent = null;
                    dat.ShowDialog(this);

                    try
                    {
                        if (dat.DsPedido.WMS_SOCIOS[0].SOCIO != 0)
                        {
                            mReceptorClienteFacturaAsociacion(dat.DsPedido.WMS_SOCIOS[0].NIT.ToString(), (long)dat.DsPedido.WMS_SOCIOS[0].SOCIO);

                            socio = dat.DsPedido.WMS_SOCIOS[0].SOCIO.ToString();

                            //registra la asociacion 
                            vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                            vParametros.AddReplaceParam("pNCLIENTE", socio.Replace("-", ""));
                            vParametros.AddReplaceParam("pNASOCIACION", pSocioAsociacion);
                            vParametros.AddReplaceParam("pCTIPO", pTipo);

                            GUI.CApp.bll.ExecuteSql("FE_P_CREAR_CLIENTE_ASOCIACION", vParametros, "PDV");
                            relacionFEClienteAsocicion = true;
                        }
                    }
                    catch
                    { //ENTRA AL CATCH PORQUE EL CLIENTE cuenta con datos
                        //devolver a la insercion del cliente
                    }

                }


            }
            else
            {
                if (!string.IsNullOrEmpty(pSocioCliente))
                {
                    //registra la asociacion 
                    vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                    vParametros.AddReplaceParam("pNCLIENTE", pSocioCliente);
                    vParametros.AddReplaceParam("pNASOCIACION", pSocioAsociacion);
                    vParametros.AddReplaceParam("pCTIPO", pTipo);

                    GUI.CApp.bll.ExecuteSql("FE_P_CREAR_CLIENTE_ASOCIACION", vParametros, "PDV");
                    relacionFEClienteAsocicion = true;
                }

            }// fin if (pAsociar)

        }

        public void mDeleteRelacionDocAsociacionConCliente(long pDocumento, bool pCierre = false)
        {
            bool vBorrar = true;

            //si no se está cancelando el pago 
            if (!pCierre)
            {
                Forms.frmPayments payment = ((Forms.frmPayments)FindForm());
                string datos = payment.DsRecibo.WMS_PAGO_DOCUMENTOS.Where(pagos =>
                    pagos.TIPO_PAGO == 31
                    ).Select(pagos => pagos.TIPO_PAGO).FirstOrDefault().ToString();
                //valida que no tenga un pago de asocicion
                if (!string.IsNullOrEmpty(datos) && !datos.Equals("0"))
                {
                    //no debe de borrar la relacion
                    vBorrar = false;
                }
            }

            if (this.relacionFEClienteAsocicion && vBorrar)
            {
                QueryParams vParametros = new QueryParams();
                //Elimina la relacion 
                vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                GUI.CApp.bll.ExecuteSql("DELETE_CLIENTE_FE_ASOCIACION", vParametros, "PDV");
                this.relacionFEClienteAsocicion = false;
                this.esAsociacion = false;
            }
        }
        //fin cambio Alexis

        #region mTrama
        /// <summary>
        /// Este método genera la trama y la envía al proveedor
        /// </summary>
        /// <param name="pDocumento"></param>
        private void mTrama(long pDocumento)
        {
            string vClave = String.Empty, vCodigo = String.Empty;
            string vEnvio_Trama = String.Empty;
            QueryParams vParametros = new QueryParams();
            string vRespuesta = String.Empty;
            string vRespuesta_Xml = String.Empty;
            string vUrl = String.Empty;

            try
            {
                vEnvio_Trama = Helpers.Nvl(CApp.GetParam("ETFE"), "N").ToString();

                if (vEnvio_Trama == "S")
                {

                    vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());

                    // Se crea la trama
                    GUI.CApp.bll.ExecuteSql("FE_P_CREAR_TRAMA", vParametros, "PDV");

                    //
                    // Obtiene la trama
                    using (DataSet vDatos = GUI.CApp.bll.getDataSet("PDV", "OBTENER_TRAMAS", vParametros))
                    {
                        if (vDatos.Tables.Count > 0 && vDatos.Tables[0].Rows.Count > 0)
                        {
                            vUrl = Helpers.Nvl(CApp.GetParam("URLF"), "").ToString();

                            WSAVD.WSFEBuilderSoapClient vFact_Elect = new WSAVD.WSFEBuilderSoapClient();
                            //
                            // Actualiza la dirección del web services
                            vFact_Elect.Endpoint.Address = new System.ServiceModel.EndpointAddress(vUrl);
                            //
                            // Envía la trama
                            vRespuesta_Xml = vFact_Elect.procesarTextoPlano(vDatos.Tables[0].Rows[0].ItemArray[2].ToString(),
                                vDatos.Tables[0].Rows[0].ItemArray[3].ToString(), vDatos.Tables[0].Rows[0].ItemArray[4].ToString(),
                                vDatos.Tables[0].Rows[0].ItemArray[1].ToString(), vDatos.Tables[0].Rows[0].ItemArray[0].ToString());
                            //
                            //restaura el valor por defecto
                            this.relacionFEClienteAsocicion = false;
                            this.esAsociacion = false;
                            chkAsociarCorreo.Checked = false;
                            chkAsociarCorreo.Visible = false;

                            if (!String.IsNullOrEmpty(vRespuesta_Xml))
                            {
                                XmlDocument vXml_Doc = new XmlDocument();
                                vXml_Doc.LoadXml(vRespuesta_Xml);
                                //
                                using (DataSet vDatosXML = new DataSet())
                                {
                                    vDatosXML.ReadXml(new XmlNodeReader(vXml_Doc));

                                    if (vDatosXML.Tables.Count > 0 && vDatosXML.Tables[0].Rows.Count > 0)
                                    {
                                        // Código respuesta del proveedor
                                        vCodigo = vDatosXML.Tables[0].Rows[0].ItemArray[0].ToString();
                                        vRespuesta = vDatosXML.Tables[0].Rows[0].ItemArray[2].ToString();

                                        if (vCodigo.Replace("'", "") == "S0001")
                                        {
                                            vClave = vDatosXML.Tables[0].Rows[0].ItemArray[3].ToString();
                                        }
                                        else
                                        {
                                            vClave = String.Empty;
                                        }
                                    }
                                }
                            }
                            //
                            // Almacena la respuesta
                            vParametros.AddReplaceParam("pCCODIGO", vCodigo.Replace("'", ""));
                            vParametros.AddReplaceParam("pCRESPUESTA", vRespuesta.Replace("'", ""));
                            vParametros.AddReplaceParam("pCRESPUESTA_XML", vRespuesta_Xml.Replace("'", ""));
                            vParametros.AddReplaceParam("pCCLAVE", vClave);

                            GUI.CApp.bll.ExecuteSql("FE_P_ALM_RESPUESTA", vParametros, "PDV");
                        }
                    }
                }
            }
            catch (TimeoutException vErrorTime)
            {
                vParametros = new QueryParams();
                // Error envío AVD
                vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                vParametros.AddReplaceParam("pCERROR", vErrorTime.Message.Replace("'", ""));
                //
                GUI.CApp.bll.ExecuteSql("FE_P_REGISTRO_ERROR", vParametros, "PDV");
            }
            catch (Exception vError)
            {
                vParametros = new QueryParams();
                // Error envío AVD
                vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                vParametros.AddReplaceParam("pCERROR", vError.Message.Replace("'", ""));
                //
                GUI.CApp.bll.ExecuteSql("FE_P_REGISTRO_ERROR", vParametros, "PDV");
            }
        }
        #endregion

        /// <summary>
        /// Actualiza los datos de resumen de pago
        /// </summary>
        private void updateData()
        {
            try
            {
                if (montoTotal != 0)
                    rowTotal.Properties.Value = montoTotal;
                else
                    rowTotal.Properties.Value = DsPedido.WMS_DOCUMENTOS[0].TOTAL;

                decimal decAbonado = 0;
                rowAbonado.Properties.Value = 0;

                foreach (DataRow dr in DsRecibo.WMS_PAGO_DOCUMENTOS.Rows)
                {
                    decAbonado += Convert.ToDecimal(dr["PAGADO"]);
                    rowAbonado.Properties.Value = decAbonado;
                }

                foreach (DataRow dr in DsRecibo.PAGO_ANTICIPADO.Rows)
                {
                    decAbonado += Convert.ToDecimal(dr["MONTO"]);
                    rowAbonado.Properties.Value = decAbonado;
                }

                rowVuelto.Properties.Value = (decAbonado - Convert.ToDecimal(rowTotal.Properties.Value) < 0 ? 0 : decAbonado - Convert.ToDecimal(rowTotal.Properties.Value));

                if (DsPedido.WMS_DOCUMENTOS.Count > 0)
                {
                    montoTotal = 0;
                }
            }
            catch (Exception ex)
            {
                rowTotal.Properties.Value = 0;
                rowAbonado.Properties.Value = 0;
                rowVuelto.Properties.Value = 0;
                Console.WriteLine(ex.Message);
            }
        }

        /// <summary>
        /// Actualiza el total a pagar restante
        /// </summary>
        /// <param name="erow"></param>
        private void updateAmount(DevExpress.XtraVerticalGrid.Rows.BaseRow erow)
        {
            erow.Properties.Value = calcTotal();
        }

        private decimal calcTotal()
        {
            decimal returnValue;

            if (rowTotal.Properties.Value != null)
            {
                if (rowAbonado.Properties.Value != null)
                    returnValue = Convert.ToDecimal(rowTotal.Properties.Value) - Convert.ToDecimal(rowAbonado.Properties.Value);
                else
                    returnValue = Convert.ToDecimal(rowTotal.Properties.Value);
            }
            else
                returnValue = 0;

            if (Convert.ToDecimal(returnValue) < 0)
                returnValue = 0;

            return returnValue;
        }

        private void updateAmount(DevExpress.XtraVerticalGrid.Rows.MultiEditorRow erow)
        {
            erow.Properties.Value = calcTotal();
        }

        private void printReceipt(long documento)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'RP");

            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
            Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

            if (dsDocTienda.DOMAINS.Count > 0)
            {
                switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                {
                    case 1:
                        imprimirReciboPreimpreso(documento, dsDocTienda.DOMAINS[0].RV_MPCC03);
                        break;
                    case 3:
                        RegistryKey Printer = Registry.CurrentUser;
                        Printer = Printer.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                        string printerFactura = "";

                        if (Printer != null)
                            printerFactura = Helpers.ObjToStr(Printer.GetValue("Factura", ""));
                        if (printerFactura == "")
                            printerFactura = dsDocTienda.DOMAINS[0].RV_MPCC00;
                        imprimirDocumentoPreimpresaDOS(documento, printerFactura, dsDocTienda.DOMAINS[0].RV_MPCC03, dsDocTienda.DOMAINS[0].RV_MPCC02.ToString());
                        break;
                    default:
                        imprimirReciboTicket(documento, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                        break;
                }
            }
        }
        private static void imprimirReciboTicket(long documento, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();
            RegistryKey key = Registry.CurrentUser;

            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);

            string printerRecibo = "";

            if (key != null)
                printerRecibo = Helpers.ObjToStr(key.GetValue("Recibo", ""));

            if (printerRecibo != string.Empty)
                prntMess.Impresora = printerRecibo;
            else
                prntMess.Impresora = impresora;

            prntMess.TipoFormato = Impresion.TipoFormato.Documentos;
            prntMess.Llave1 = documento;
            prntMess.Copias = copias;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);
            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }
        private static void imprimirReciboPreimpreso(long documento, string codigoReporte)
        {
            Hashtable ht = new Hashtable();
            QueryParams QueryParams = new QueryParams();
            QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
            ht.Add("TDA_DATOS_DOCUMENTO", QueryParams);
            ht.Add("TDA_DETALLE_PEDIDO", QueryParams);

            LLNet.Reports.BaseReports.XRInfo Info;
            Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

            string printerRecibo = "";

            if (key != null)
                printerRecibo = Helpers.ObjToStr(key.GetValue("Recibo", ""));


            if (printerRecibo != string.Empty)
                Info.PrinterName = printerRecibo;

            LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
            xrBase.Parametros = Info;
            xrBase.BllInstance = CApp.bll;
            xrBase.ExePath = CApp.ExeDir;
            xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
        }
        /// <summary>
        /// Imprime la factura
        /// </summary>
        /// <param name="documento"></param>
        public static void printInvoice(long documento, string subtipodocumento)
        {
            int Formato = 2;
            int numImpresiones = 1;
            object FormatoTipoImpresion = null;
            // int EsCredito = 0;
            QueryParams qp = new QueryParams();
            switch (Helpers.ObjToStr(subtipodocumento))
            {
                case "C":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'CF");
                    break;
                case "T":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'TKT");
                    break;
                case "E":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'EX");
                    break;
                case "L":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'LI");
                    break;
                case "S":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'SI");
                    break;
                default:
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'FA");
                    break;
            }


            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
            Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);



            RegistryKey key = Registry.CurrentUser; // GUSTAVO MIRANDA
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
            if (key != null)
            {
                if (Convert.ToString(key.GetValue("FormatoImpresion", null)) != "")
                {
                    Formato = Convert.ToInt16(key.GetValue("FormatoImpresion", 2));
                }
            }

            RegistryKey keyImp = Registry.CurrentUser;

            keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
            if (keyImp != null)
            {
                if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                {
                    FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                }
            }
            if (Formato != 1)
            {
                if (Formato != 0)
                {
                    Formato = Convert.ToInt16(dsDocTienda.DOMAINS[0]["RV_MPNC03"]);
                }
            }

            // POR ALGUNA RAZON EL CODIGO NO SE EJECUTA BIEN POR ESO DE DEJAN LOS 2 IF ANIDADOS ARRIBA
            //  if (Formato != 0 || Formato != 1)
            //  {
            //     Formato = Convert.ToInt16(dsDocTienda.DOMAINS[0]["RV_MPNC03"]);
            // }

            if (dsDocTienda.DOMAINS.Count > 0)
            {
                // GUSTAVO MIRANDA  switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                numImpresiones = EsDeCredito(documento);

                switch (Formato)
                {
                    case 1:
                        for (int i = 0; i < numImpresiones; i++)
                        {
                            imprimirFacturaPreimpresa(documento, dsDocTienda.DOMAINS[0].RV_MPCC03);
                            ActualizaImpresiones(documento);
                        }

                        break;
                    case 3:
                        RegistryKey Printer = Registry.CurrentUser;
                        Printer = Printer.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                        string printerFactura = "";

                        if (Printer != null)
                            printerFactura = Helpers.ObjToStr(Printer.GetValue("Factura", ""));
                        if (printerFactura == "")
                            printerFactura = dsDocTienda.DOMAINS[0].RV_MPCC00;
                        for (int i = 0; i < numImpresiones; i++)
                        {
                            imprimirDocumentoPreimpresaDOS(documento, printerFactura, dsDocTienda.DOMAINS[0].RV_MPCC03, Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString());
                            if (numImpresiones > 1)
                            {
                                Thread.Sleep(4000);  // SE DEJA ESTE TIEMPO PARA QUE NO SE LEA EL TXT ADECUADO
                            }
                            ActualizaImpresiones(documento);
                        }

                        break;

                    default:
                        for (int i = 0; i < numImpresiones; i++)
                        {
                            imprimirTicket(documento, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                        }
                        break;

                }
            }
        }


        private static void imprimirTicketPreimpresa(long documento, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();
            RegistryKey key = Registry.CurrentUser;

            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

            string printerFactura = "";

            if (key != null)
                printerFactura = Helpers.ObjToStr(key.GetValue("Factura", ""));

            if (printerFactura != string.Empty)
                prntMess.Impresora = printerFactura;
            else
                prntMess.Impresora = impresora;

            prntMess.TipoFormato = Impresion.TipoFormato.Documentos;
            prntMess.Llave1 = documento;
            prntMess.Copias = copias;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);

            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }
        private static void imprimirTicket(long documento, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();
            RegistryKey key = Registry.CurrentUser;

            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);

            string printerFactura = "";

            if (key != null)
                printerFactura = Helpers.ObjToStr(key.GetValue("Factura", ""));

            if (printerFactura != string.Empty)
                prntMess.Impresora = printerFactura;
            else
                prntMess.Impresora = impresora;

            prntMess.TipoFormato = Impresion.TipoFormato.Documentos;
            prntMess.Llave1 = documento;
            prntMess.Copias = copias;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);

            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }
        private static void imprimirFacturaPreimpresa(long documento, string codigoReporte)
        {
            //System.Diagnostics.Process.Start("START", "/min notepad /P" + " C:\\" + GUI.CApp.usuario + ".txt");            
            string PreimpresaXvariables = Helpers.ObjToStr(CApp.GetParam("PIXV"));

            if (PreimpresaXvariables == "NO")
            {
                Hashtable ht = new Hashtable();
                QueryParams QueryParams = new QueryParams();
                QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
                ht.Add("TDA_V_REP_DOCUMENTOS", QueryParams);
                ht.Add("TDA_V_REP_DET_DOCUMENTOS", QueryParams);

                LLNet.Reports.BaseReports.XRInfo Info;
                Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);

                RegistryKey key = Registry.CurrentUser;
                key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                string printerFactura = "";

                if (key != null)
                    printerFactura = Helpers.ObjToStr(key.GetValue("Factura", ""));


                if (printerFactura != string.Empty)
                    Info.PrinterName = printerFactura;

                LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                xrBase.Parametros = Info;
                xrBase.BllInstance = CApp.bll;
                xrBase.ExePath = CApp.ExeDir;

                xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);

                //xrBase.Report.ExportToText("c:/logistika/factura.txt");
            }
            else
            {
                //Impresion.Impresion imp = new Impresion.Impresion();
                //imp.ImprimirFacturaMedianteVariables();
                int Formato = 2;
                int numImpresiones = 1;
                // int EsCredito = 0;
                QueryParams qp = new QueryParams();
                switch (subTipoDocumentoPreimpreso)
                {
                    case "C":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'CF");
                        break;
                    case "T":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'TKT");
                        break;
                    case "E":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'EX");
                        break;
                    case "L":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'LI");
                        break;
                    case "S":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'SI");
                        break;
                    default:
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'FAP");
                        break;
                }


                Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

                if (dsDocTienda.DOMAINS.Count > 0)
                {
                    imprimirTicketPreimpresa(documentoPreimpreso, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                }
            }
        }
        private static void imprimirDocumentoPreimpresaDOS(long documento, string Impresora, string codigoReporte, string formato)
        {
            imprimirDocumentoPreimpresaDOS(documento, Impresora, codigoReporte, formato, "", "");
        }
        private static void imprimirDocumentoPreimpresaDOS(long documento, string Impresora, string codigoReporte, string batName, string formato)
        {
            imprimirDocumentoPreimpresaDOS(documento, Impresora, codigoReporte, formato, batName, "");
        }
        private static void imprimirDocumentoPreimpresaDOS(long documento, string Impresora, string codigoReporte, string formato, string batName, string prefijo)
        {
            //System.Diagnostics.Process.Start("START", "/min notepad /P" + " C:\\" + GUI.CApp.usuario + ".txt");            
            string PreimpresaXvariables = Helpers.ObjToStr(CApp.GetParam("PIXV"));

            if (PreimpresaXvariables == "NO")
            {
                Hashtable ht = new Hashtable();
                QueryParams QueryParams = new QueryParams();
                QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
                ht.Add("TDA_V_REP_DOCUMENTOS", QueryParams);
                ht.Add("TDA_V_REP_DET_DOCUMENTOS", QueryParams);

                LLNet.Reports.BaseReports.XRInfo Info;
                Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);

                RegistryKey key = Registry.CurrentUser;
                key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                string printerFactura = "";

                if (key != null)
                    printerFactura = Helpers.ObjToStr(key.GetValue("Factura", ""));


                if (printerFactura != string.Empty)
                    Info.PrinterName = printerFactura;

                LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                xrBase.Parametros = Info;
                xrBase.BllInstance = CApp.bll;
                xrBase.ExePath = CApp.ExeDir;

                xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);

                //xrBase.Report.ExportToText("c:/logistika/factura.txt");
            }
            else
            {
                //Impresion.Impresion imp = new Impresion.Impresion();
                //imp.ImprimirFacturaMedianteVariables();                
                int numImpresiones = 1;
                // int EsCredito = 0;
                QueryParams qp = new QueryParams();
                switch (subTipoDocumentoPreimpreso)
                {
                    case "C":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'CF");
                        break;
                    case "T":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'TKT");
                        break;
                    case "E":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'EX");
                        break;
                    case "L":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'LI");
                        break;
                    case "S":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'SI");
                        break;
                    default:
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'FAP");
                        break;
                }

                Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

                if (dsDocTienda.DOMAINS.Count > 0)
                {

                    imprimirDocumentoDOS(documento, Impresora, Convert.ToInt32(formato), prefijo, batName);
                }
            }
        }

        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato, string prefijo, string BatName)
        {
            if (BatName == "")
                BatName = "imprimir.bat";
            string Ruta = Application.StartupPath;
            QueryParams qp = new QueryParams();
            if (Ruta != string.Empty)
            {
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(Ruta + "\\" + BatName);
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                string Args = "";

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

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


                try
                {
                    qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                    object factTmp = GUI.CApp.bll.GetSingleValue("ObtenerFact", qp, "PDV");
                    if (factTmp != null && factTmp.ToString() != "")
                        factura = factTmp.ToString();
                    qp.Clear();

                    int vTiempo = Convert.ToInt32(Helpers.Nvl(CApp.GetParam("TEID"), "3000"));

                    if (lId_tr_tarj.Count == 0)
                    {
                        #region Factura/recibo
                        qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                        qp.AddReplaceParam("FORMATO", formato.ToString());
                        qp.AddReplaceParam("USUARIO", CApp.usuario.ToString());
                        CApp.bll.ExecuteSql("GENERAR_IMPRESION_POS", qp, "PDV");
                        //Thread.Sleep(3000); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                        Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                        System.Diagnostics.Process.Start(startInfo);
                        #endregion
                    }
                    else if (lId_tr_tarj.Count == 1)
                    {
                        #region Factura/voucher
                        qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                        qp.AddReplaceParam("FORMATO", formato.ToString());
                        qp.AddReplaceParam("USUARIO", CApp.usuario.ToString());
                        qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[0].ToString());
                        CApp.bll.ExecuteSql("GENERAR_IMPRESION_POSV", qp, "PDV");
                        //Thread.Sleep(2000); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                        Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO

                        #region Voucher
                        object FormatoTipoImpresion = null;
                        RegistryKey keyImp = Registry.CurrentUser;

                        keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
                        if (keyImp != null)
                        {
                            if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                            {
                                FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                            }
                        }

                        string valor = Helpers.Nvl(CApp.GetParam("HCV"), "").ToString();
                        if (valor == "1")//Si valor es 1, se imprime la copia del voucher
                        {
                            #region Voucher - Copia
                            if (prefijo != "")
                                Args = prefijo + lId_tr_tarj[0].ToString() + ".txt ";
                            else
                                Args = lId_tr_tarj[0].ToString() + ".txt ";

                            startInfo.Arguments = Args;

                            qp = new LLNet.Utils.QueryParams();
                            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOO");
                            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                            string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                            qp = new QueryParams();
                            qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[0].ToString());
                            qp.AddReplaceParam("FORMATO", format.ToString());
                            qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                            GUI.CApp.bll.ExecuteSql("WMS_P_GENERAR_IMPRVO", qp, "PDV");
                            //Thread.Sleep(3000);  // se deja un delay para esperar a que la base contruya el archivo
                            Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                            System.Diagnostics.Process.Start(startInfo);

                            if (prefijo != "")
                                Args = prefijo + documento.ToString() + ".txt ";
                            else
                                Args = documento.ToString() + ".txt ";

                            startInfo.Arguments = Args;
                            FormatoTipoImpresion = null;
                            keyImp = Registry.CurrentUser;

                            keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
                            if (keyImp != null)
                            {
                                if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                                {
                                    FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                                }
                            }

                            #region Copia cliente
                            qp = new LLNet.Utils.QueryParams();
                            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOC");
                            dsDocTienda = new LLNet.Model.General.CgRefCodes();
                            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                            format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                            qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[0].ToString());
                            qp.AddReplaceParam("FORMATO", format.ToString());
                            qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                            qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                            GUI.CApp.bll.ExecuteSql("GENERAR_IMPRESIONVOF", qp, "PDV");
                            //Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                            Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                            System.Diagnostics.Process.Start(startInfo);
                            //Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                            #endregion
                            #endregion
                        }
                        else
                        {
                            #region Voucher - Sin copia
                            qp = new LLNet.Utils.QueryParams();
                            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOO");
                            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                            string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                            qp = new QueryParams();
                            qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[0].ToString());
                            qp.AddReplaceParam("FORMATO", format.ToString());
                            qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                            qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                            GUI.CApp.bll.ExecuteSql("GENERAR_IMPRESIONVOF", qp, "PDV");
                            //Thread.Sleep(3000);  // se deja un delay para esperar a que la base contruya el archivo
                            Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                            System.Diagnostics.Process.Start(startInfo);
                            #endregion
                        }
                        #endregion
                        #endregion
                    }
                    else if (lId_tr_tarj.Count > 1)
                    {
                        #region Factura/vouchers
                        qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                        qp.AddReplaceParam("FORMATO", formato.ToString());
                        qp.AddReplaceParam("USUARIO", CApp.usuario.ToString());
                        qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[0].ToString());
                        CApp.bll.ExecuteSql("GENERAR_IMPRESION_POSV", qp, "PDV");
                        //Thread.Sleep(2000); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                        Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO

                        qp = new QueryParams();

                        for (int i = 0; i < lId_tr_tarj.Count; i++)
                        {
                            object FormatoTipoImpresion = null;
                            RegistryKey keyImp = Registry.CurrentUser;

                            keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
                            if (keyImp != null)
                            {
                                if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                                {
                                    FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                                }
                            }

                            qp = new LLNet.Utils.QueryParams();
                            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOO");
                            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                            string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();

                            string valor = Helpers.Nvl(CApp.GetParam("HCV"), "").ToString();

                            if (valor == "1")//Si valor es 1, se imprime la copia del voucher
                            {
                                #region Voucher
                                if (prefijo != "")
                                    Args = prefijo + lId_tr_tarj[i].ToString() + ".txt ";
                                else
                                    Args = lId_tr_tarj[i].ToString() + ".txt ";

                                startInfo.Arguments = Args;

                                qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[i].ToString());
                                qp.AddReplaceParam("FORMATO", format.ToString());
                                qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                                GUI.CApp.bll.ExecuteSql("WMS_P_GENERAR_IMPRVO", qp, "PDV");
                                //Thread.Sleep(3000);  // se deja un delay para esperar a que la base contruya el archivo
                                Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                                System.Diagnostics.Process.Start(startInfo);
                                #endregion

                                if (i == 0)
                                {
                                    #region Copia voucher
                                    if (prefijo != "")
                                        Args = prefijo + documento.ToString() + ".txt ";
                                    else
                                        Args = documento.ToString() + ".txt ";

                                    startInfo.Arguments = Args;


                                    FormatoTipoImpresion = null;
                                    keyImp = Registry.CurrentUser;

                                    keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
                                    if (keyImp != null)
                                    {
                                        if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                                        {
                                            FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                                        }
                                    }

                                    qp = new LLNet.Utils.QueryParams();
                                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOC");
                                    dsDocTienda = new LLNet.Model.General.CgRefCodes();
                                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                                    format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                                    qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[i].ToString());
                                    qp.AddReplaceParam("FORMATO", format.ToString());
                                    qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                                    qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                                    Thread.Sleep(3000);  // se deja un delay para esperar a que la base contruya el archivo
                                    GUI.CApp.bll.ExecuteSql("GENERAR_IMPRESIONVOF", qp, "PDV");
                                    //Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                                    Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                                    System.Diagnostics.Process.Start(startInfo);
                                    #endregion
                                }
                                else
                                {
                                    #region Copia voucher
                                    if (prefijo != "")
                                        Args = prefijo + lId_tr_tarj[i].ToString() + ".txt ";
                                    else
                                        Args = lId_tr_tarj[i].ToString() + ".txt ";

                                    startInfo.Arguments = Args;

                                    FormatoTipoImpresion = null;
                                    keyImp = Registry.CurrentUser;

                                    keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
                                    if (keyImp != null)
                                    {
                                        if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                                        {
                                            FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                                        }
                                    }

                                    qp = new LLNet.Utils.QueryParams();
                                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VOC");
                                    dsDocTienda = new LLNet.Model.General.CgRefCodes();
                                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                                    format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();
                                    qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[i].ToString());
                                    qp.AddReplaceParam("FORMATO", format.ToString());
                                    qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                                    Thread.Sleep(3000);  // se deja un delay para esperar a que la base contruya el archivo
                                    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
                                    Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                                    System.Diagnostics.Process.Start(startInfo);
                                    #endregion
                                }
                            }
                            else
                            {
                                if (i == 0)
                                {
                                    #region Voucher
                                    qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[i].ToString());
                                    qp.AddReplaceParam("FORMATO", format.ToString());
                                    qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                                    qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                                    GUI.CApp.bll.ExecuteSql("GENERAR_IMPRESIONVOF", qp, "PDV");
                                    //Thread.Sleep(3000);  // se deja un delay para esperar a que la base contruya el archivo
                                    Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                                    System.Diagnostics.Process.Start(startInfo);
                                    #endregion
                                }
                                else
                                {
                                    #region Voucher
                                    if (prefijo != "")
                                        Args = prefijo + lId_tr_tarj[i].ToString() + ".txt ";
                                    else
                                        Args = lId_tr_tarj[i].ToString() + ".txt ";

                                    startInfo.Arguments = Args;

                                    qp.AddReplaceParam("ID_TR_TARJ", lId_tr_tarj[i].ToString());
                                    qp.AddReplaceParam("FORMATO", format.ToString());
                                    qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                                    Thread.Sleep(2000);  // se deja un delay para esperar a que la base contruya el archivo
                                    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
                                    Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                                    System.Diagnostics.Process.Start(startInfo);
                                    #endregion
                                }
                            }
                        }
                        #endregion
                    }
                }
                catch (Exception ex)
                {
                    CApp.ShowMessage(ex.Message + "\rREIMPRIMA LA FACTURA/RECIBO " + factura, "Impresion de Documentos", true);
                }

                lId_tr_tarj.Clear();
            }
            else
            {
                throw new Exception("No esta Definido el Parametro UATI");
            }
            //startInfo.UseShellExecute = false; 
        }

        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato)
        {
            imprimirDocumentoDOS(documento, Impresora, formato, "", "");
        }

        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato, string batName)
        {
            imprimirDocumentoDOS(documento, Impresora, formato, "", batName);
        }

        public void printDocuments(long documento)
        {

        startPrinting03:
            try
            {
                ImprimirPagare(documento);
            }
            catch (Exception ex)
            {
                if (CApp.ShowMessage("Error en la impresión de pagaré, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                {
                    goto startPrinting03;
                }
            }

        startPrinting04:
            try
            {
                object result = GUI.CApp.bll.GetSingleValue("ObtenerMP", null, "PDV");
                if (result != null)
                    mostrar = int.Parse(result.ToString());

                ImprimirVales(documento);
            }
            catch (Exception ex)
            {
                if (mostrar > 0)//Indica si se muestra o no la pantalla de reintento de impresión de vales/certificados
                {
                    if (CApp.ShowMessage("Error en la impresión de vales y certificados, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                    {
                        goto startPrinting04;
                    }
                }
            }

        startPrinting05:
            try
            {
                ImprimirGarantia(documento);
            }
            catch (Exception ex)
            {
                if (CApp.ShowMessage("Error en la impresión de garantía, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                    goto startPrinting05;
            }

        startPrinting06:
            try
            {
                ImprimirNotasCredito(documento);
            }
            catch (Exception ex)
            {
                if (CApp.ShowMessage("Error en la impresión de nota de crédito, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                    goto startPrinting05;
            }

            if (Helpers.Nvl(CApp.GetParam("ICAF"), String.Empty).ToString() == "X")
            {
                ImprimirComanda(documento);
            }

        }
        //private void ImprimirComanda(long documento)
        //{
        //    Utils.QueryParams qp = new LLNet.Utils.QueryParams();
        //    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'PAL");

        //    Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
        //    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

        //    if (dsDocTienda.DOMAINS.Count > 0)
        //    {
        //        switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
        //        {
        //            case 1:
        //                ImprimirComandaPreimpresa(documento, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPCC02));
        //                break;
        //            case 3:
        //                RegistryKey Printer = Registry.CurrentUser;
        //                Printer = Printer.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

        //                string printerFactura = "";

        //                if (Printer != null)
        //                    printerFactura = Utils.Helpers.ObjToStr(Printer.GetValue("Factura", ""));
        //                if (printerFactura == "")
        //                    printerFactura = dsDocTienda.DOMAINS[0].RV_MPCC00;
        //                imprimirDocumentoPreimpresaDOS(documento, printerFactura, dsDocTienda.DOMAINS[0].RV_MPCC03, dsDocTienda.DOMAINS[0].RV_MPCC02.ToString(), "PACK_imprimir.bat", "PK_");
        //                break;
        //            default:
        //                ImprimirComandaPreimpresa(documento, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPCC03));
        //                break;
        //        }

        //    }
        //}

        private void ImprimirComanda(long documento)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'PAL");

            using (Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes())
            {
                Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);
                if (dsDocTienda.DOMAINS.Count > 0)
                    switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                    {
                        case 1:
                            ImprimirComandaPreimpresa(documento, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPCC02));
                            break;
                        case 3:
                            ImprimirCommandaRepx(documento, dsDocTienda.DOMAINS[0].RV_MPCC03.ToString());
                            break;
                        default:
                            ImprimirComandaPreimpresa(documento, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPCC03));
                            break;
                    }
            }
        }

        private void ImprimirCommandaRepx(long documento, string codigoReporte)
        {
            Hashtable hst = new Hashtable();
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("DOCUMENTO", documento.ToString());
            // Ordenamiento
            string v_ordenamiento = Helpers.Nvl(CApp.bll.GetSingleValue("OrdenamientoDespacho", "Reports"), "").ToString();
            qp.AddReplaceParam(QueryParams.PredefinedTags.OrderByToolbarTag, v_ordenamiento);
            hst.Add(dsDespachos1.RET_V_DESPACHOS.TableName, qp);
            LLNet.Reports.BaseReports.XRInfo Info;
            Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);
            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

            string printerFactura = "";

            if (key != null)
                printerFactura = Helpers.ObjToStr(key.GetValue("PickingList", ""));

            if (printerFactura != string.Empty)
                Info.PrinterName = printerFactura;
            LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
            xrBase.Parametros = Info;
            xrBase.BllInstance = CApp.bll;
            xrBase.ExePath = CApp.ExeDir;
            xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, hst);
            //GUI.CApp.CreateForm(typeof(GUI.Bases.frmPreviewReport), "Despacho Traslado", new object[] { xrBase.Report });

        }

        private void ImprimirComandaPreimpresa(long pDocumento, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();
            RegistryKey key = Registry.CurrentUser;

            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);


            string printerFactura = "";

            if (key != null)
                printerFactura = Helpers.ObjToStr(key.GetValue("Factura", ""));

            prntMess.TipoFormato = Impresion.TipoFormato.Comanda;
            prntMess.Llave1 = pDocumento;
            prntMess.Copias = 1;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);

            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }

        }
        //private void ImprimirComandaPreimpresa(long pDocumento, long formato)
        //{
        //    Impresion.Impresion imp = new Impresion.Impresion();
        //    imp.Conexion = GUI.CApp.bll.ConnectionString;

        //    Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();
        //    RegistryKey key = Registry.CurrentUser;

        //    key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);


        //    string printerFactura = "";

        //    if (key != null)
        //        printerFactura = Utils.Helpers.ObjToStr(key.GetValue("Factura", ""));

        //    prntMess.TipoFormato = Impresion.TipoFormato.Comanda;
        //    prntMess.Llave1 = pDocumento;
        //    prntMess.Copias = 1;
        //    prntMess.Formato = formato;
        //    imp.SetMensajeImpresion(prntMess);

        //    try
        //    {
        //        imp.ImprimirDocumento();
        //    }
        //    catch (Exception ex)
        //    {
        //        GUI.CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
        //    }

        //}

        private void ImprimirNotasCredito(long documento)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'NC");

            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
            Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

            if (dsDocTienda.DOMAINS.Count > 0)
            {
                qp.Clear();
                qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                DataSet ds = CApp.bll.getDataSet("PDV", "NotasCreditoxFactura", qp);
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                    {
                        case 1:
                            imprimirNCPreimpresa(Convert.ToInt64(dr["DOCUMENTO"]), dsDocTienda.DOMAINS[0].RV_MPCC03);
                            break;
                        case 3:
                            RegistryKey Printer = Registry.CurrentUser;
                            Printer = Printer.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                            string printerFactura = "";

                            if (Printer != null)
                                printerFactura = Helpers.ObjToStr(Printer.GetValue("Factura", ""));
                            if (printerFactura == "")
                                printerFactura = dsDocTienda.DOMAINS[0].RV_MPCC00;
                            imprimirDocumentoPreimpresaDOS(documento, printerFactura, dsDocTienda.DOMAINS[0].RV_MPCC03, dsDocTienda.DOMAINS[0].RV_MPCC02.ToString());
                            break;
                        default:
                            imprimirNCTicket(Convert.ToInt64(dr["DOCUMENTO"]), dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                            break;
                    }
                }

            }
        }

        private static void imprimirNCTicket(long documento, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);

            string printerFactura = "";

            if (key != null)
                printerFactura = Helpers.ObjToStr(key.GetValue("Nota de Credito", ""));

            if (printerFactura != string.Empty)
                prntMess.Impresora = printerFactura;
            else
                prntMess.Impresora = impresora;

            prntMess.TipoFormato = Impresion.TipoFormato.Documentos;
            prntMess.Llave1 = documento;
            prntMess.Copias = copias;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);
            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }

        private static void imprimirNCPreimpresa(long documento, string codigoReporte)
        {
            Hashtable ht = new Hashtable();
            QueryParams QueryParams = new QueryParams();
            QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
            ht.Add("TDA_V_REP_DOCUMENTOS", QueryParams);
            ht.Add("TDA_V_REP_DET_DOCUMENTOS", QueryParams);

            LLNet.Reports.BaseReports.XRInfo Info;
            Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

            string printerNC = "";

            if (key != null)
                printerNC = Helpers.ObjToStr(key.GetValue("Nota de Credito", ""));

            if (printerNC != string.Empty)
                Info.PrinterName = printerNC;

            LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
            xrBase.Parametros = Info;
            xrBase.BllInstance = CApp.bll;
            xrBase.ExePath = CApp.ExeDir;
            CApp.ShowMessage("Asegúrese que la impresora tenga lista la nota de crédito a imprimir para continuar", "Impresión de Notas de Crédito", true);
            xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
        }

        private void ImprimirPagare(long documento)
        {
            if (DsPedido.WMS_DOCUMENTOS[0]["CUOTAS"] != DBNull.Value)
            {
                Hashtable ht = new Hashtable();
                QueryParams QueryParams = new QueryParams();
                QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
                dsRepPreimpresos1.Clear();
                Helpers.Merge(CApp.bll.getTypedDataSet(dsRepPreimpresos1.GetType(), dsRepPreimpresos1.TDA_V_REP_PREIMPRESOS.TableName, QueryParams), dsRepPreimpresos1.TDA_V_REP_PREIMPRESOS.DataSet);
                ht.Add(dsRepPreimpresos1.TDA_V_REP_PREIMPRESOS.TableName, QueryParams);
                LLNet.Reports.BaseReports.XRInfo Info;
                Info = Reports.BaseReports.XRBase.SetInfo("PAGARE");

                RegistryKey key = Registry.CurrentUser;
                key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                string printerPagare = "";

                if (key != null)
                    printerPagare = Helpers.ObjToStr(key.GetValue("Pagare", ""));

                if (printerPagare != string.Empty)
                    Info.PrinterName = printerPagare;

                LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                xrBase.BeforeLoadInfo += new LLNet.Reports.BaseReports.BeforeLoadInfoEvent(xrBase_BeforeLoadInfo);
                xrBase.Parametros = Info;
                xrBase.BllInstance = CApp.bll;
                xrBase.ExePath = CApp.ExeDir;
                CApp.ShowMessage("Asegúrese que la impresora tenga listo el pagaré a imprimir para continuar", "Impresión de Pagaré", true);
                xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
            }
        }

        public void ImprimirVales(long documento)
        {
            string vUCRT = Helpers.ObjToStr(CApp.GetParam("UCRT"));

            foreach (Model.PDV.DsPDV.DOC_VALESRow dvr in Program.FrmMainPos.DsVale.DOC_VALES)
            {
                // si es vale por devolucion o si es un certificado de regalo y no es una tarjeta plastica y esta emitido se imprime
                if ((dvr.TIPO == "D" || (dvr.TIPO == "A" && vUCRT != "X")) && (dvr.ESTADO == "E" || dvr.ESTADO == "P"))
                    ImprimirVale(dvr);
            }

            foreach (Model.PDV.DsPDV.DOC_VALESRow dvr in DsVale.DOC_VALES)
            {
                // si es vale por devolucion o si es un certificado de regalo y no es una tarjeta plastica y esta emitido se imprime
                if ((dvr.TIPO == "D" || (dvr.TIPO == "A" && vUCRT != "X")) && (dvr.ESTADO == "E" || dvr.ESTADO == "P"))
                    ImprimirVale(dvr);
            }
        }

        private static void ImprimirVale(Model.PDV.DsPDV.DOC_VALESRow dvr)
        {
            Hashtable ht = new Hashtable();
            QueryParams QueryParams = new QueryParams();
            QueryParams.AddReplaceParam("VALE", dvr.VALE.ToString());
            ht.Add("TDA_V_VALES", QueryParams);

            LLNet.Reports.BaseReports.XRInfo Info;
            Info = Reports.BaseReports.XRBase.SetInfo("VALE");

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

            string printerVale = "";

            if (key != null)
                printerVale = Helpers.ObjToStr(key.GetValue("Certificado", ""));

            if (printerVale != string.Empty)
                Info.PrinterName = printerVale;

            LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
            xrBase.Parametros = Info;
            xrBase.BllInstance = CApp.bll;
            xrBase.ExePath = CApp.ExeDir;
            CApp.ShowMessage("Asegúrese que la impresora tenga listo el vale o certificado a imprimir para continuar", "Impresión de Vales y Certificados", true);
            xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
        }

        public void ImprimirGarantia(long documento)
        {
            #region WRLG. DESARROLLO DE GARANTIAS

            if (CApp.GetParam("UMDG").ToString() == "X")
            {
                ImprimirGarantiasGeneradas(documento);
            }
            else
            {

                #endregion

                Model.Reports.DsRepGarantia dsRepG = new LLNet.Model.Reports.DsRepGarantia();

                object[] Params = new object[] { dsRepG, documento, null };
                CApp.bll.RemoteExecute("Reports", "ImpresionGarantias", Params);
                dsRepG = Params[0] as Model.Reports.DsRepGarantia;
                dsRepGarantia1.TDA_V_IMPRESION_GARANTIAS.Clear();
                Helpers.Merge(dsRepG, dsRepGarantia1);

                if (dsRepGarantia1.TDA_V_IMPRESION_GARANTIAS.Rows.Count > 0)
                {
                    Hashtable ht = new Hashtable();
                    QueryParams QueryParams = new QueryParams();
                    QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
                    QueryParams.AddReplaceParam("SKU", "SKU");
                    //Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsRepGarantia1.GetType(), dsRepGarantia1.TDA_V_REP_PREIMPRESOS.TableName, QueryParams), dsRepGarantia1.TDA_V_REP_PREIMPRESOS.DataSet);
                    ht.Add(dsRepGarantia1.TDA_V_IMPRESION_GARANTIAS.TableName, QueryParams);
                    LLNet.Reports.BaseReports.XRInfo Info;
                    Info = Reports.BaseReports.XRBase.SetInfo("CERG");

                    RegistryKey key = Registry.CurrentUser;
                    key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                    string printerGarantia = "";

                    if (key != null)
                        printerGarantia = Helpers.ObjToStr(key.GetValue("Garantia", ""));

                    if (printerGarantia != string.Empty)
                        Info.PrinterName = printerGarantia;

                    LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                    xrBase.BeforeLoadInfo += new LLNet.Reports.BaseReports.BeforeLoadInfoEvent(xrBase_BeforeLoadInfo);
                    xrBase.Parametros = Info;
                    xrBase.BllInstance = CApp.bll;
                    xrBase.ExePath = CApp.ExeDir;
                    CApp.ShowMessage("Asegúrese que la impresora tenga lista la garantía a imprimir para continuar", "Impresión de Garantías", true);
                    xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
                }
            }
        }

        #region WRLG. DESARROLLO DE GARANTIAS

        private void ImprimirGarantiasGeneradas(long documento)
        {
            using (Model.PDV.DsGarantias dsGarantias = new LLNet.Model.PDV.DsGarantias())
            {
                dsGarantias.Merge(CApp.bll.getTypedDataSet(dsGarantias.GetType(), dsGarantias.WMS_GARANTIAS_X_CLASIFICACION.TableName));
                QueryParams qp = new QueryParams();
                qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                dsGarantias.Merge(CApp.bll.getTypedDataSet(dsGarantias.GetType(), dsGarantias.WMS_GARANTIAS.TableName, qp));

                foreach (Model.PDV.DsGarantias.WMS_GARANTIASRow gRow in dsGarantias.WMS_GARANTIAS.Rows)
                {
                    DataRow[] dRow = dsGarantias.WMS_GARANTIAS_X_CLASIFICACION.Select("clasificacion = " + gRow["CLASIFICACION"].ToString());
                    string tipoImpresion = dRow[0]["TIPO_IMPRESION"].ToString();
                    string formato = dRow[0]["FORMATO"].ToString();
                    string impresion = (formatoGarantia == "Garantía Impresa" ? dRow[0]["IMPRESION"].ToString() : dRow[0]["IMPRESION_FORMULARIO"].ToString());
                    string impresora = dRow[0]["IMPRESORA"].ToString();

                    if (tipoImpresion == "0")
                    {
                        ImprimirGarantiaTicket(Convert.ToInt64(gRow.DOCUMENTO), gRow.GARANTIA, impresion, impresora);
                    }
                    else
                    {
                        ImprimirGarantiaPreimpresa(Convert.ToInt64(gRow.DOCUMENTO), gRow.GARANTIA, formato, impresora);
                    }
                }
            }
        }

        private void ImprimirGarantiaPreimpresa(long documento, decimal garantia, string formato, string impresora)
        {

        }

        private void ImprimirGarantiaTicket(long documento, decimal garantia, string impresion, string impresora)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();
            RegistryKey key = Registry.CurrentUser;

            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);

            prntMess.Impresora = impresora;

            prntMess.TipoFormato = Impresion.TipoFormato.Vales;
            prntMess.Llave1 = documento;
            prntMess.Llave2 = Convert.ToInt64(garantia);
            prntMess.Copias = 1;
            prntMess.Formato = Convert.ToInt32(impresion);
            imp.SetMensajeImpresion(prntMess);
            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }

        }

        #endregion


        void xrBase_BeforeLoadInfo(QueryParams qParams, string TableName, DataSet Ds, ref bool bHandle)
        {
            LLNet.Model.Reports.DsRepGarantia dsRepGarantias = new LLNet.Model.Reports.DsRepGarantia();
            LLNet.Model.Reports.DsRepPreimpresos dsRepPagare = new LLNet.Model.Reports.DsRepPreimpresos();

            switch (TableName)
            {
                case "TDA_V_IMPRESION_GARANTIAS":
                    Helpers.Merge(dsRepGarantia1, Ds);
                    break;
                case "TDA_V_REP_PREIMPRESOS":
                    Helpers.Merge(dsRepPreimpresos1, Ds);
                    break;

            }
            bHandle = true;

        }


        /// <summary>
        /// Prepara el PDV para captar un nuevo pedido
        /// </summary>
        public void newOrder()
        {
            montoTotal = 0;

            Program.FrmMainPos.LimpiarDatosCredie();
            Program.FrmMainPos.mReseteoAsociacion();

            Program.FrmMainPos.DsPedido.Clear();
            Program.FrmMainPos.DsPedido.AcceptChanges();

            Program.FrmMainPos.DsVale.Clear();
            Program.FrmMainPos.DsVale.AcceptChanges();

            updateData();

            Program.FrmMainPos.xtraTabbedMdiManager1.SelectedPage = Program.FrmMainPos.xtraTabbedMdiManager1.Pages[0];
            Program.FrmMainPos.pos.ctlAddSkus1.Clear();

            if (Program.FrmMainPos.btnRefunds.ButtonStyle != DevExpress.XtraEditors.Controls.BorderStyles.Default)
            {
                Program.FrmMainPos.btnRefunds.ButtonStyle = DevExpress.XtraEditors.Controls.BorderStyles.Default;
                Program.FrmMainPos.pos.ctlAddSkus1.SetPositive();
            }
            checkClientDialog();
        }

        #endregion

        private int paymentType;
        private decimal efectivoEmpresa;

        #region Eventos

        private void frmPayments_Load(object sender, EventArgs e)
        {

            try
            {
                //Valida si es un pedido de FrmMainPos
                if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0)
                {
                    if (!mValidarEsAsociacion())
                    {
                        chkAsociarCorreo.Visible = true;
                    }
                }

            }
            catch { }

            btnPoints.Enabled = true;
            btnCredCuotsEk.Enabled = true;
            if (Program.FrmMainPos == null)
            {
                this.btnGiftCard.Visible = false;
                //this.btnGiftCard.Enabled = false;
            }

            LlenarParametros();
            LlenarParametrosGenesis();
            if (Program.Caja == null)
            {
                CApp.ShowMessage("No puede efectuar el cobro porque no tiene una caja asignada", "Cobros y Facturación", true);
                Hide();
                Close();
                return;
            }

            if (Program.Jornada == null)
            {
                CApp.ShowMessage("No puede efectuar el cobro porque no tiene una jornada abierta", "Cobros y Facturación", true);
                Hide();
                Close();
                return;
            }

            QueryParams qp = new QueryParams();

            df = null;

            chkDonarVuelto.Checked = false;
            chkDonarVuelto.Visible = Helpers.ObjToStr(CApp.GetParam("MODV")) == "X";

            qp.Clear();

            qp.AddReplaceParam("CAJA", Program.Caja.ToString());

            if (Helpers.ObjToStr(CApp.bll.GetSingleValue("TalonarioValido", qp, "PDV")) != "1")
            {
                long facturasRestantes = Convert.ToInt64(CApp.bll.GetSingleValue("FacturasRestantes", qp, "PDV"));

                if (facturasRestantes >= 0)
                    CApp.ShowMessage(string.Format(CApp.TraducirPalabra("Quedan {0} facturas disponibles en el talonario"), facturasRestantes), CApp.TraducirPalabra("Cobros y Facturación"), false);
                else
                {
                    CApp.ShowMessage("Ya no hay màs facturas disponibles en el talonario vigente", "Cobros y Facturación", true);
                    Hide();
                    Close();
                    return;
                }
            }

            qp.Clear();

            if (DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                String aocf = Helpers.ObjToStr(CApp.GetParam("AOCF"));
                qp.AddReplaceParam("DOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                int ofertas = 0;
                switch (aocf)
                {
                    case "SIEMPRE":
                        CApp.bll.ExecuteSql("ApplyOfferToDocument", qp, "PDV");
                        Program.FrmMainPos.RefreshData();

                        ofertas = Convert.ToInt32(CApp.bll.GetSingleValue("OfertasDocCount", qp, "PDV"));

                        if (ofertas > 0)
                        {
                            if (Helpers.ObjToStr(CApp.GetParam("MAAO")) == "X")
                                CApp.ShowMessage("Se han aplicado ofertas, modificando el precio de algunos o todos los artículos", "Cobros y Facturación", true);


                            if (Convert.ToDecimal(CApp.bll.GetSingleValue("TotalRecargo", qp, "PDV")) > 0)
                            {
                                if (Convert.ToDecimal(CApp.bll.GetSingleValue("OfertasxPrecio", qp, "PDV")) > 0)
                                    CApp.ShowMessage("Se han aplicado ofertas que pudieron afectar los recargos efectuados", "Cobros y Facturación", true);
                            }
                        }

                        break;
                    case "SI":
                        ofertas = Convert.ToInt32(CApp.bll.GetSingleValue("OfertasDocCount", qp, "PDV"));
                        if (ofertas == 0)
                        {
                            CApp.bll.ExecuteSql("ApplyOfferToDocument", qp, "PDV");
                            Program.FrmMainPos.RefreshData();
                            ofertas = Convert.ToInt32(CApp.bll.GetSingleValue("OfertasDocCount", qp, "PDV"));

                            if (ofertas > 0)
                            {
                                if (Helpers.ObjToStr(CApp.GetParam("MAAO")) == "X")
                                    CApp.ShowMessage("Se han aplicado ofertas, modificando el precio de algunos o todos los artículos", "Cobros y Facturación", true);


                                if (Convert.ToDecimal(CApp.bll.GetSingleValue("TotalRecargo", qp, "PDV")) > 0)
                                {
                                    if (Convert.ToDecimal(CApp.bll.GetSingleValue("OfertasxPrecio", qp, "PDV")) > 0)
                                        CApp.ShowMessage("Se han aplicado ofertas que pudieron afectar los recargos efectuados", "Cobros y Facturación", true);
                                }
                            }
                        }
                        break;
                }


                CApp.bll.ExecuteSql("RedondearPedido", qp, "PDV");
                CApp.bll.ExecuteSql("RedondearMontoTotal", qp, "PDV"); //  AGRUPA CENTAVOS CON DESCUENTO
                CApp.bll.ExecuteSql("UpdateTotal", qp, "PDV");
                Program.FrmMainPos.RefreshData();

                decimal cnt = Convert.ToDecimal(CApp.bll.GetSingleValue("GetCntSeriesLeft", qp, "PDV"));
                if (cnt > 0)
                {
                    CApp.ShowMessage(CApp.TraducirPalabra("Hace falta ingresar la(s) serie(s) del producto ") + Helpers.ObjToStr(CApp.bll.GetSingleValue("DescriptionSeriesLeft", qp, "PDV")), CApp.TraducirPalabra("Facturación"), false);
                    Hide();
                    Close();
                    return;
                }

            }

            DsRecibo.Clear();
            DsFactura.Clear();
            DsVale.Clear();
            dsNotaCredito.Clear();
            ValesGenerados.Clear();

            efectivoEmpresa = 0;
            updateData();

            //#region Registrar Cliente - Cupones

            ///**************DLQG-IGF********************/
            ////Registrar cliente
            //decimal regC = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("RegCliente", null, "PDV").ToString());
            //decimal montoCpn = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("MontoCpn", null, "PDV").ToString());
            ////
            //if (DsPedido.TDA_DETALLE_PEDIDO.Count > 0 && regC > 0 && DsPedido.WMS_DOCUMENTOS[0].TOTAL >= montoCpn)
            //{
            //    DialogResult result = GUI.CApp.ShowMessage("¿Desea registrar los datos del cliente?", "Facturación", true, false);
            //    if (result == DialogResult.OK)
            //    {
            //        LLNet.Tienda.MainForms.Forms.FrmRegCliente rc = new LLNet.Tienda.MainForms.Forms.FrmRegCliente(DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO, DsPedido.WMS_DOCUMENTOS[0].TOTAL);
            //        rc.ShowDialog();
            //    }
            //}

            //#endregion

            if (DsPedido.WMS_DOCUMENTOS.Count > 0 && DsPedido.WMS_DOCUMENTOS[0].TOTAL == 0)
            {
                decimal inv = CreateInvoice();
                if (inv == -1)
                    return;

                //Guarda los datos en BDD y prepara la aplicacion para un nuevo pedido
                object[] objFac = new object[] { DsPedido, DsFactura, DsRecibo, Program.Jornada, dsNotaCredito, DsVale, Program.FrmMainPos.DsVale };

                #region WRLG. DESARROLLO DE GARANTIAS

                if (!IngresarGarantias(qp))
                {
                    CApp.ShowMessage("No es posible facturar sin tener los datos de garantías a generar", "Cobros y Facturación", true);
                    return;
                }

                #endregion

                try
                {
                    CApp.bll.RemoteExecute("PDV", "Facturacion", objFac);
                }
                catch (Exception ex)
                {
                    if (ex.Message.IndexOf("DOCU_UK01") > 0)
                        CApp.ShowMessage("Uno de los documentos a generar ya existe, verifique las secuencias de documentos", "Facturación", true);
                    else
                        CApp.ShowMessage(ex.Message, "Facturación", true);
                    return;
                }

                DsPedido = objFac[0] as Model.PDV.DsPDV;
                DsFactura = objFac[1] as Model.PDV.DsPDV;
                DsRecibo = objFac[2] as Model.PDV.DsPDV;
                DsVale = objFac[5] as Model.PDV.DsPDV;

            startPrinting01:

                long documento = (long)DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                string sdocumento = DsFactura.WMS_DOCUMENTOS[0]["SUBTIPO_DOCUMENTO"].ToString();

                documentoPreimpreso = documento;
                subTipoDocumentoPreimpreso = sdocumento;

                try
                {
                    printInvoice(documento, sdocumento);
                }
                catch (Exception ex)
                {
                    if (CApp.ShowMessage("Error en la impresión de facturas, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                        goto startPrinting01;
                }

                printDocuments(documento);

                this.Hide();
                this.Close();
                newOrder();

                return;
            }

            if (DsPedido.WMS_DOCUMENTOS.Count == 0)
            {
                qp.Clear();
                qp.AddReplaceParam("SOCIO", cliente.ToString());
                qp.AddReplaceParam("SESION", sesion.ToString());
                Helpers.Merge(CApp.bll.getTypedDataSet(DsFactura.GetType(), DsFactura.WMS_DOCUMENTOS.TableName, qp, "FacturasAlCredito"), DsFactura);
            }

            //vGridControl1.FocusedRow = rowVuelto;
            qp.Clear();
            qp.AddReplaceParam("RV_DOMAIN", "TIPO PAGO");
            Helpers.Merge(CApp.bll.getTypedDataSet(dsGeneral1.GetType(), dsGeneral1.CG_REF_CODES.TableName, qp), dsGeneral1);
            Helpers.Merge(CApp.bll.getTypedDataSet(DsRecibo.GetType(), DsRecibo.TDA_V_MONEDAS.TableName), DsRecibo);

            enabledButtons();
            if (p_documentos == "36")
            {
                btnCreditCard.Visible = false;
                btnAnticipos.Visible = false;
                btnCredit.Visible = false;
                btnCheck.Visible = false;
                btnExencion.Visible = false;
                btnVale.Visible = false;
                btnGiftCard.Visible = false;
                btnDepositos.Visible = false;
                btnCredix.Visible = false;
                btnMonederoAlo.Visible = false;
                btnApartado.Visible = false;
                btnAsociaciones.Visible = false;
                btnPoints.Visible = false;
                btnCredCuotsEk.Visible = false;
                btnTransferencia.Visible = false;
                btnFlexi.Visible = false;
                btnProntoPago.Visible = false;
            }

            if (DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                qp.Clear();
                qp.AddReplaceParam("SOCIO", DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());

                if (!customerStateValidate(qp))
                {
                    Hide();
                    Close();
                    return;
                }
            }

            //GUI.CApp.TraducirForm(this);
            //Utils.QueryParams q = new LLNet.Utils.QueryParams();

            /*COMENTADO PARA METER LO DE MISPUNTOS DLQG
             * if (DsPedido.WMS_DOCUMENTOS.Rows.Count > 0)
            {
                qp.AddReplaceParam("SOCIO", DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
                Puntos = Convert.ToDecimal(CApp.bll.GetSingleValue("PuntosSocio", qp, "PDV"));
            }
             */

            //29/06/2016 IMGF
            if (btnCash.Visible == true)
            {
                btnCobrar_Click(null, null);
            }
            else
            {
                panelControl3.Controls.Clear();
            }

            #region Factura Electrónica
            // Cambio para factura electrónica

            chkFacturaElect.Enabled = true;

            if (Program.FrmMainPos == null)
            {
                chkFacturaElect.Visible = false;
            }
            else if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count == 0 || (Id_March != null && Id_March != String.Empty))
            {
                chkFacturaElect.Visible = false;
            }
            else
            {
                chkFacturaElect.Visible = true;

                if (Program.exonerado == "S" && Utils.Helpers.Nvl(CApp.GetParam("FEEH"), "N").ToString() == "S")
                {
                    chkFacturaElect.CheckedChanged -= chkFacturaElect_CheckedChanged;

                    chkFacturaElect.Enabled = false;
                    chkFacturaElect.Checked = false;
                    this.chkFacturaElect.Properties.Caption = "[Alt + R]                                     Factura Electrónica";

                    chkFacturaElect.CheckedChanged += chkFacturaElect_CheckedChanged;
                }
                else
                {
                    try
                    {
                        QueryParams vParametros = new QueryParams();
                        vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
                        vParametros.AddReplaceParam("pIDENTIFICACION", DBNull.Value.ToString());
                        //
                        string vIdentificacion = Convert.ToString(GUI.CApp.bll.GetSingleValue("FE_F_IDENTIFICACION_INST", vParametros, "PDV"));
                        //
                        if (!String.IsNullOrEmpty(Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2))
                        {
                            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2.ToString() == vIdentificacion)
                            {
                                chkFacturaElect.Enabled = false;
                            }

                            chkFacturaElect.CheckedChanged -= chkFacturaElect_CheckedChanged;
                            chkFacturaElect.Checked = false;
                            this.chkFacturaElect.Properties.Caption = "[Alt + R]                                     Factura Electrónica";
                            chkFacturaElect.CheckedChanged += chkFacturaElect_CheckedChanged;
                        }
                        else
                        {
                            chkFacturaElect.Checked = true;
                        }
                    }
                    catch (StrongTypingException)
                    {
                        chkFacturaElect.Checked = true;
                    }
                }
            }
            #endregion
        }


        private void deshabilitarBotonesCrediE(bool pHabilitar)
        {

            btnExencion.Enabled = pHabilitar;
            btnVale.Enabled = pHabilitar;
            btnCreditCard.Enabled = pHabilitar;
            btnCash.Enabled = pHabilitar;
            btnCheck.Enabled = pHabilitar;
            btnCredit.Enabled = pHabilitar;
            btnAnticipos.Enabled = pHabilitar;
            btnProntoPago.Enabled = pHabilitar;
            btnDepositos.Enabled = pHabilitar;
            btnExencion.Enabled = pHabilitar;
            btnVale.Enabled = pHabilitar;
            btnTransferencia.Enabled = pHabilitar;
            btnApartado.Enabled = pHabilitar;
            btnPoints.Enabled = pHabilitar;
            btnAsociaciones.Enabled = pHabilitar;
            btnCredix.Enabled = pHabilitar;
            btnMonederoAlo.Enabled = pHabilitar;
            btnFactManual.Enabled = pHabilitar;
            btnEnganche.Enabled = pHabilitar;
            btnGiftCard.Enabled = pHabilitar;
            btnExencion.Visible = pHabilitar;
            btnVale.Visible = pHabilitar;
            btnCreditCard.Visible = pHabilitar;
            btnCash.Visible = pHabilitar;
            btnCheck.Visible = pHabilitar;
            btnCredit.Visible = pHabilitar;
            btnAnticipos.Visible = pHabilitar;
            btnProntoPago.Visible = pHabilitar;
            btnDepositos.Visible = pHabilitar;
            btnExencion.Visible = pHabilitar;
            btnVale.Visible = pHabilitar;
            btnTransferencia.Visible = pHabilitar;
            btnApartado.Visible = pHabilitar;
            btnPoints.Visible = pHabilitar;
            btnAsociaciones.Visible = pHabilitar;
            btnCredix.Visible = pHabilitar;
            btnMonederoAlo.Visible = pHabilitar;
            btnFactManual.Visible = pHabilitar;
            btnEnganche.Visible = pHabilitar;
            btnGiftCard.Visible = pHabilitar;
        }

        //29/06/2016 IMGF
        #region enabledButtons
        private void enabledButtons()
        {
            //codigo del socio cliente CrediE
            //decimal sociocredie = decimal.Parse(GUI.CApp.bll.GetSingleValue("C_CliCrediE", "PDV").ToString());

            //Documento pagado con credie
            //string pagacredie = string.Empty ;
            //if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
            //{
            //    QueryParams qp2 = new QueryParams();
            //    qp2.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
            //    pagacredie = GUI.CApp.bll.GetSingleValue("C_PagaCrediE", qp2,"PDV").ToString();
            //}

            //if ((Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null
            //  //  && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO == sociocredie) && pagacredie != string.Empty  )
            //      ) && pagacredie != string.Empty)
            //{//es un cliente credie con el socio de credie que cancelará con tipo de pago credie
            //    //Helpers.Merge(CApp.bll.getTypedDataSet(DsRecibo.GetType(), DsRecibo.TDA_V_TIPOS_PAGO.TableName), DsRecibo);
            //    //foreach (Model.PDV.DsPDV.TDA_V_TIPOS_PAGORow tp in DsRecibo.TDA_V_TIPOS_PAGO)
            //    //{
            //    //    switch (tp.TIPO)
            //    //    {
            //    //        case "34":
            //    //            enableButton(btnCredCuotsEk, "Alt + E", tp);
            //    //            break;
            //    //    }
            //    //}
            //    deshabilitarBotonesCrediE(false);
            //    btnCredCuotsEk.PerformClick() ;
            //}
            //else
            //{//no es un cliente que cancela con credie
            //    //deshabilitarBotonesCrediE(true);

            //}

            btnExencion.Visible = (Program.FOEI == "P");
            btnVale.Visible = (Program.FOVC == "P");

            //      deshabilitarBotonesCrediE(true);

            Helpers.Merge(CApp.bll.getTypedDataSet(DsRecibo.GetType(), DsRecibo.TDA_V_TIPOS_PAGO.TableName), DsRecibo);
            foreach (Model.PDV.DsPDV.TDA_V_TIPOS_PAGORow tp in DsRecibo.TDA_V_TIPOS_PAGO)
            {
                switch (tp.TIPO)
                {
                    case "0": // Enganche
                        enableButton(btnEnganche, "0");
                        break;
                    case "1": // tarjeta de credito
                        //enableButton(btnCreditCard, "F2", tp);
                        enableButton(btnCreditCard, "1");
                        break;
                    case "3": // efectivo
                        enableButton(btnCash, "3");
                        break;
                    case "4": // cheque
                        if (DsPedido.WMS_SOCIOS[0]["ACEPTAR_CHEQUE"] != DBNull.Value)
                        {
                            if (DsPedido.WMS_SOCIOS[0].ACEPTAR_CHEQUE == "S")
                            {
                                enableButton(btnCheck, "4");
                            }
                            else
                                btnCheck.Visible = false;
                        }
                        else
                            btnCheck.Visible = false;
                        break;
                    case "5": // credito
                        if (DsPedido.WMS_SOCIOS[0]["CREDITO"] != DBNull.Value)
                        {
                            if (DsPedido.WMS_SOCIOS[0].CREDITO == "S")
                            {
                                enableButton(btnCredit, "5");
                            }
                            else
                                btnCredit.Visible = false;
                        }
                        else
                            btnCredit.Visible = false;
                        break;
                    case "14": // GiftCard
                        //enableButton(btnGiftCard, "Alt + G", tp);
                        enableButton(btnGiftCard, "14");
                        break;
                    case "15": // pagos anticipados
                        enableButton(btnAnticipos, "15");
                        break;
                    case "8":
                        enableButton(btnProntoPago, "8");
                        break;
                    case "10":
                        enableButton(btnDepositos, "10");
                        break;
                    case "12": // exencion impuesto
                        enableButton(btnExencion, "12");
                        break;
                    case "6": // vale 
                        enableButton(btnVale, "6");
                        break;
                    case "25":
                        enableButton(btnTransferencia, "25");
                        break;
                    case "30":
                        enableButton(btnApartado, "30");
                        break;
                    case "16":
                        enableButton(btnPoints, "16");
                        break;
                    case "31":
                        enableButton(btnAsociaciones, "31");
                        break;
                    case "32":
                        enableButton(btnCredix, "32");
                        break;
                    case "33":
                        enableButton(btnMonederoAlo, "33");
                        break;
                    case "34":
                        enableButton(btnCredCuotsEk, "34");
                        break;
                    case "35":
                        enableButton(btnFlexi, "35");
                        break;
                    case "37":
                        enableButton(btnSINPE, "37");
                        break;
                    case "40":
                        enableButton(btnZunify, "40");
                        break;
                }
            }

            if (esPagoAnticipado)
            {
                btnFactManual.Visible = false;
                btnCredit.Visible = false;
                btnAnticipos.Visible = false;
                btnEnganche.Visible = false;
                btnApartado.Visible = false;
            }

            if (esPagoCredito)
            {
                btnCredit.Visible = false;
                btnProntoPago.Visible = true;
                btnApartado.Visible = false;
            }
            else
            {
                btnProntoPago.Visible = false;
            }

            /*if (btnCash.Visible)
            {
                btnCobrar_Click(null, null); 
            }
            else
            {
                panelControl3.Controls.Clear();
            }*/
        }
        #endregion

        /*private void enableButton(DevExpress.XtraEditors.SimpleButton btn, string functionKey, Model.PDV.DsPDV.TDA_V_TIPOS_PAGORow tp)
        {
            //btn.Text = "[{0}]                                                                    ";
            //btn.Text = String.Format(btn.Text, functionKey);
            //btn.Text += tp.DESCRIPCION;
            btn.Visible = (tp["DESHABILITADO"] == DBNull.Value);

        }*/

        #region enableButton
        private void enableButton(DevExpress.XtraEditors.SimpleButton btn, string vTipoPago)
        {
            decimal vDocumento = 0;
            bool vResultado = false;

            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 &&
                Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != 0)
            {
                vDocumento = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO;
            }
            else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != 0)
            {
                vDocumento = DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO;
            }

            QueryParams vParametros = new QueryParams();
            //
            vParametros.AddReplaceParam("TIPO_PAGO", vTipoPago);
            vParametros.AddReplaceParam("DOCUMENTO", vDocumento.ToString());
            if (this.vTipoPagoAsociacion == FrmOpcGrupoPago.eTipoPago.Ninguno)
            {
                vParametros.AddReplaceParam("GRUPO_PAGO", DBNull.Value.ToString());
            }
            else
            {
                vParametros.AddReplaceParam("GRUPO_PAGO", this.vTipoPagoAsociacion.ToString());
            }

            vResultado = Convert.ToBoolean(GUI.CApp.bll.GetSingleValue("POS_F_BOTON_HABILITADO",
                vParametros, "PDV"));

            btn.Visible = vResultado;
        }
        #endregion

        private Controls.ctlCash csh;
        private Controls.ctlBankTransfer cBanktranfer;
        private Controls.ctlPoints cPoints;
        private Controls.ctlGiftCard cGiftCard;
        private Controls.ctlAsociaciones cAsociaciones;
        private Controls.ctlCredix cCredix;
        private Controls.ctlFlexi cFlexi;
        private Controls.ctlMonederoAlo cMonederoAlo;
        private Controls.ctlCredicuotsEk cCredCuotsEk;
        private Controls.ctlSinpeMovil cSinpeMovil;
        private Controls.ctlZunify cZunify;

        private void btnCobrar_Click(object sender, EventArgs e)
        {
            paymentType = 1;
            if (csh == null)
            {
                //csh = new LLNet.Tienda.MainForms.Controls.ctlCash(DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                if (DsPedido.WMS_DOCUMENTOS.Count() > 0)
                {
                    csh = new LLNet.Tienda.MainForms.Controls.ctlCash(DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                }
                else
                { //no tiene pedido
                    csh = new LLNet.Tienda.MainForms.Controls.ctlCash(String.Empty);
                }
                csh.PayWithCash += new EventHandler(csh_PayWithCash);
            }

            csh.Currency = monedaBase;
            csh.Rate = 1;
            csh.BeforePayWithCash += new CancelEventHandler(event_BeforePay);

            InitializeControl(csh, csh.Vgc, ref csh.OriginalValue);

        }

        void csh_PayWithCash(object sender, EventArgs e)
        {
            updateData();
            btnCobrar_Click(sender, e);
        }

        void tranfer_PayWithTransfer(object sender, EventArgs e)
        {
            updateData();
            btnTransferencia_Click(sender, e);
        }

        private Controls.ctlCreditCard crd;
        private void simpleButton2_Click(object sender, EventArgs e)
        {
            paymentType = 2;
            /**************IGF******************/
            panelControl3.Controls.Clear();
            //
            decimal total = calcTotal();
            if (total > 0)
            {
                string emisor = Helpers.Nvl(CApp.GetParam("EMI"), "").ToString();

                if (emisor == "2")
                {
                    #region Emisor
                    FrmEmisor emi = new FrmEmisor(total);

                    if (emi.ShowDialog() == DialogResult.Cancel)
                    {
                        this.btnCobrar_Click(null, null);
                    }
                    else
                    {
                        if (emi.ingManual)
                        {
                            if (GUI.CApp.ValidateAccess("IngresoMTrans", "Ingreso manual de transacciones"))
                            {
                                crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                                crd.Currency = monedaBase;
                                crd.Rate = 1;
                                crd.BeginInit();

                                InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                                crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                                if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                    crd.Init();
                            }
                        }
                        else if (emi.Emisor == "Banco Nacional de Costa Rica")
                        {
                            if (emi.NumTarj != "" && emi.NumRef != "" && emi.NumAutoriz != "" && emi.NumTarj != null && emi.NumRef != null && emi.NumAutoriz != null && emi.realizado)
                            {
                                #region Emisor Banco Nacional de Costa Rica
                                if (crd == null)
                                {
                                    crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                    crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                                }
                                crd.Currency = monedaBase;
                                crd.Rate = 1;
                                crd.BeginInit();

                                InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                                crd.Visible = false;
                                crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                                if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                    crd.Init();
                                //
                                //Llena las columnas con los datos generados de la transacción
                                crd.rowMONEDA.Properties.Value = 1;//1 -> Colon
                                crd.rowMONTO.Properties.Value = emi.Monto;
                                crd.rowEMISOR.Properties.Value = emi.NumEmisor;
                                crd.rowTARJETA.Properties.Value = emi.NumTarj;
                                crd.rowAUTORIZACION.Properties.Value = emi.NumAutoriz;

                                btnAgregarPago_Click(null, null);
                                this.btnCancelar.Enabled = false;
                                //
                                //Agrega los datos para hacer una anulación de transacciones
                                string[] datos = new string[3];
                                datos[0] = emi.NumAutoriz;
                                datos[1] = emi.NumRef;
                                datos[2] = emi.NumTarj;

                                Utils.QueryParams qp = new QueryParams();
                                qp.AddReplaceParam("ID_TR_TARJ", emi.Id_tr_tarj);
                                if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                    qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                    qp.AddReplaceParam("DOCUMENTO", DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                qp.AddReplaceParam("TIPO", "Venta");
                                qp.AddReplaceParam("TARJETA", emi.NumTarj);
                                qp.AddReplaceParam("AUTORIZACION", emi.NumAutoriz);
                                qp.AddReplaceParam("REFERENCIA", emi.NumRef);
                                GUI.CApp.bll.ExecuteSql("Act_Log_Tarjetas", qp, "PDV");

                                this.lTransacciones.Add(datos);
                                #endregion
                            }
                        }/******************IGF************************/
                        else if (emi.Emisor == "Banco de Costa Rica")
                        {
                            #region Banco de Costa Rica
                            if (emi.realizado)
                            {
                                if (!emi.reversada)
                                {
                                    if (crd == null)
                                    {
                                        crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                        crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                                    }
                                    crd.Currency = monedaBase;
                                    crd.Rate = 1;
                                    crd.BeginInit();

                                    InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                                    crd.Visible = false;
                                    crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                                    if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                        crd.Init();
                                    //
                                    //Llena las columnas con los datos generados de la transacción
                                    crd.rowMONEDA.Properties.Value = 1;//1 -> Colon
                                    crd.rowMONTO.Properties.Value = emi.Monto;
                                    crd.rowEMISOR.Properties.Value = emi.NumEmisor;
                                    crd.rowTARJETA.Properties.Value = emi.NumTarj;
                                    crd.rowAUTORIZACION.Properties.Value = emi.NumAutoriz;

                                    btnAgregarPago_Click(null, null);
                                    this.btnCancelar.Enabled = false;

                                    #region
                                    Utils.QueryParams qp = new QueryParams();
                                    qp.AddReplaceParam("ID_TR_TARJ", emi.Id_tr_tarj);
                                    if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                        qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                        qp.AddReplaceParam("DOCUMENTO", DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    qp.AddReplaceParam("TIPO", "Venta");
                                    qp.AddReplaceParam("TARJETA", emi.NumTarj);
                                    qp.AddReplaceParam("AUTORIZACION", emi.NumAutoriz);
                                    qp.AddReplaceParam("REFERENCIA", emi.NumRef);
                                    GUI.CApp.bll.ExecuteSql("Act_Log_Tarjetas", qp, "PDV");
                                    #endregion

                                    lId_tr_tarj.Add(emi.Id_tr_tarj);
                                }
                            }
                            #endregion
                        }/******************IGF************************/
                        else
                        {
                            /*if (crd == null)
                            {
                                crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                            }*/
                            crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                            crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                            crd.Currency = monedaBase;
                            crd.Rate = 1;
                            crd.BeginInit();

                            InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                            crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                            if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                crd.Init();
                        }
                    }
                    #endregion
                }
                else
                {
                    #region Emisor
                    FrmEmisor2 emi = new FrmEmisor2(total);

                    if (emi.ShowDialog() == DialogResult.Cancel)
                    {
                        //CApp.ShowMessage("BTNCOBRAR", "LOG TEMPORAL", true);
                        this.btnCobrar_Click(null, null);
                    }
                    else
                    {
                        if (emi.ingManual)
                        {
                            if (GUI.CApp.ValidateAccess("IngresoMTrans", "Ingreso manual de transacciones"))
                            {
                                crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                                crd.Currency = monedaBase;
                                crd.Rate = 1;
                                crd.BeginInit();

                                InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                                crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                                if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                    crd.Init();
                            }
                        }
                        else if (emi.Emisor == "Banco Nacional de Costa Rica")
                        {
                            //CApp.ShowMessage("emi.Emisor == Banco Nacional de Costa Rica", "LOG TEMPORAL", true);
                            if (emi.NumTarj != "" && emi.NumRef != "" && emi.NumAutoriz != "" && emi.NumTarj != null && emi.NumRef != null && emi.NumAutoriz != null && emi.realizado)
                            {
                                #region Emisor Banco Nacional de Costa Rica
                                if (crd == null)
                                {
                                    crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                    crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                                }
                                crd.Currency = monedaBase;
                                crd.Rate = 1;
                                crd.BeginInit();

                                InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                                crd.Visible = false;
                                crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                                if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                    crd.Init();
                                //
                                //Llena las columnas con los datos generados de la transacción
                                crd.rowMONEDA.Properties.Value = 1;//1 -> Colon
                                crd.rowMONTO.Properties.Value = emi.Monto;
                                crd.rowEMISOR.Properties.Value = emi.NumEmisor;
                                crd.rowTARJETA.Properties.Value = emi.NumTarj;
                                crd.rowAUTORIZACION.Properties.Value = emi.NumAutoriz;

                                //  CApp.ShowMessage("btnAgregarPago_Click(null, null)", "LOG TEMPORAL", true);

                                btnAgregarPago_Click(null, null);
                                this.btnCancelar.Enabled = false;
                                //
                                //Agrega los datos para hacer una anulación de transacciones
                                string[] datos = new string[3];
                                datos[0] = emi.NumAutoriz;
                                datos[1] = emi.NumRef;
                                datos[2] = emi.NumTarj;

                                Utils.QueryParams qp = new QueryParams();
                                qp.AddReplaceParam("ID_TR_TARJ", emi.Id_tr_tarj);
                                if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                    qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                    qp.AddReplaceParam("DOCUMENTO", DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                qp.AddReplaceParam("TIPO", "Venta");
                                qp.AddReplaceParam("TARJETA", emi.NumTarj);
                                qp.AddReplaceParam("AUTORIZACION", emi.NumAutoriz);
                                qp.AddReplaceParam("REFERENCIA", emi.NumRef);
                                GUI.CApp.bll.ExecuteSql("Act_Log_Tarjetas", qp, "PDV");

                                this.lTransacciones.Add(datos);
                                #endregion
                            }
                        }/******************IGF************************/
                        else if (emi.Emisor == "Banco de Costa Rica")
                        {
                            #region Banco de Costa Rica
                            if (emi.realizado)
                            {
                                if (!emi.reversada)
                                {
                                    if (crd == null)
                                    {
                                        crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                        crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                                    }
                                    crd.Currency = monedaBase;
                                    crd.Rate = 1;
                                    crd.BeginInit();

                                    InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                                    crd.Visible = false;
                                    crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                                    if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                        crd.Init();
                                    //
                                    //Llena las columnas con los datos generados de la transacción
                                    crd.rowMONEDA.Properties.Value = 1;//1 -> Colon
                                    crd.rowMONTO.Properties.Value = emi.Monto;
                                    crd.rowEMISOR.Properties.Value = emi.NumEmisor;
                                    crd.rowTARJETA.Properties.Value = emi.NumTarj;
                                    crd.rowAUTORIZACION.Properties.Value = emi.NumAutoriz;

                                    btnAgregarPago_Click(null, null);
                                    this.btnCancelar.Enabled = false;

                                    #region
                                    Utils.QueryParams qp = new QueryParams();
                                    qp.AddReplaceParam("ID_TR_TARJ", emi.Id_tr_tarj);
                                    if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                        qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                        qp.AddReplaceParam("DOCUMENTO", DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    qp.AddReplaceParam("TIPO", "Venta");
                                    qp.AddReplaceParam("TARJETA", emi.NumTarj);
                                    qp.AddReplaceParam("AUTORIZACION", emi.NumAutoriz);
                                    qp.AddReplaceParam("REFERENCIA", emi.NumRef);
                                    GUI.CApp.bll.ExecuteSql("Act_Log_Tarjetas", qp, "PDV");
                                    #endregion

                                    lId_tr_tarj.Add(emi.Id_tr_tarj);
                                }
                            }
                            #endregion
                        }/******************IGF************************/
                        else
                        {
                            /*if (crd == null)
                            {
                                crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                                crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                            }*/
                            crd = new LLNet.Tienda.MainForms.Controls.ctlCreditCard(emi.ingManual);
                            crd.PayWithCreditCard += new EventHandler(crd_PayWithCreditCard);
                            crd.Currency = monedaBase;
                            crd.Rate = 1;
                            crd.BeginInit();

                            InitializeControl(crd, crd.Vgc, ref crd.OriginalValue);
                            crd.BeforePayWithCreditCard += new CancelEventHandler(event_BeforePay);
                            if (DsRecibo.WMS_PAGO_DOCUMENTOS.Count == 0)
                                crd.Init();
                        }
                    }
                    #endregion
                }
            }
        }

        void crd_PayWithCreditCard(object sender, EventArgs e)
        {
            updateData();
            simpleButton2_Click(sender, e);
        }

        private Controls.ctlCheck chk;

        private void btnCheck_Click(object sender, EventArgs e)
        {
            paymentType = 3;
            if (chk == null)
            {
                chk = new LLNet.Tienda.MainForms.Controls.ctlCheck();
                chk.PayWithCheck += new EventHandler(chk_PayWithCheck);
            }
            chk.Currency = monedaBase;
            chk.Rate = 1;
            chk.BeforePayWithCheck += new CancelEventHandler(event_BeforePay);

            InitializeControl(chk, chk.Vgc, ref chk.OriginalValue);
        }

        void chk_PayWithCheck(object sender, EventArgs e)
        {
            updateData();
            btnCheck_Click(sender, e);
        }

        public void btnFacturar_Click(object sender, EventArgs e)
        {
            LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
            EventLogManuales.WriteLog("", Convert.ToString("Log_presiono el boton Facturar"));

            //Si se paga con puntos -> si hay conexion ???
            //
            //valida la cantidad de puntos por el factor
            decimal ValFactPts = decimal.Parse(GUI.CApp.bll.GetSingleValue("C_Factor", "PDV").ToString());
            if ((PuntosPaga * ValFactPts) > PuntosDisp)
            {
                CApp.ShowMessage("No tienes los puntos necesarios para pagar", "Puntos Insuficientes", true);
                return;
            }

            /**************Valida Donaciones**********************
            QueryParams qpd = new QueryParams();
            decimal donac = 0;
            qpd.Clear();
            qpd.AddReplaceParam("pDocumento", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
            donac = Convert.ToDecimal(CApp.bll.GetSingleValue("DocDonacion", qpd, "PDV"));
            if (donac > 0)
            {// si tiene Donaciones
                decimal vmontEfe = 0;
                Forms.frmPayments payment = ((Forms.frmPayments)FindForm());
                //Program.FrmMainPos.DsPedido.WMS_PAGO_DOCUMENTOS[0];
                Model.PDV.DsPDV.WMS_PAGO_DOCUMENTOSDataTable tpagos = DsRecibo.WMS_PAGO_DOCUMENTOS;
                foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                {
                    string t_pag = fil[2].ToString();
                    if (t_pag == "3")
                        //cantidad pagada en efectivo
                        vmontEfe = decimal.Parse(fil[3].ToString());
                }
                if (donac > vmontEfe)
                {
                    CApp.ShowMessage("Las Donaciones se deben Pagar en Efectivo", "Efectivo Insuficiente Donaciones", true);               
                    return;
                }                
            }
            /******************************************************/

            bool error = false;

            QueryParams qp = new QueryParams();
            bool credito = false;
            decimal MontoMaximo = Convert.ToDecimal(Helpers.Nvl(CApp.GetParam("MMEC"), 0));
            decimal DocProcesado = 0;
            try
            {
                qp.Clear();
                qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                DocProcesado = Convert.ToDecimal(CApp.bll.GetSingleValue("DocumentoProcesado", qp, "PDV"));

                //Valida si es marchamo para ponerlo como recibo y no factura DLQG
                if (Id_March == String.Empty)
                    DocProcesado = 0;

                if (DocProcesado > 0)
                {
                    CApp.ShowMessage("Este pedido ya fue facturado, por favor revise su Jornada", "Documento Procesado", true);

                    #region Anular Transacciones IGF
                    //Anular Transacciones
                    if (this.lTransacciones.Count > 0)
                    {
                        CApp.ShowMessage(@"Este pedido realizó transacciones con el Banco Nacional (pagos con tarjeta de crédito/débito) 
                                            que ya fueron cobradas. Proceda a anular las transacciones o tendrá un faltante de caja", "Cobros y Facturación", true);

                        if (GUI.CApp.ValidateAccess("AnulacionTrans", "Anulación de pagos con tarjeta"))
                        {
                            string documento = "";
                            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                documento = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
                            else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                documento = DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();

                            string supervisor = "";
                            if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
                                supervisor = GUI.CApp.Sup;
                            RealizarTransaccion(supervisor, documento);
                        }
                    }

                    this.lTransacciones.Clear();
                    #endregion

                    Hide();
                    Close();
                    return;
                }
            }
            catch // SINO ES RECIBO
            {
                DocProcesado = 0;
            }
            try
            {

                if (Helpers.Nvl(CApp.GetParam("CMBA"), "NO").ToString() == "SI")
                {
                    ConvertirMontoAMonedaBase();
                }

                if ((DsPedido.WMS_DOCUMENTOS.Count > 0) || (p_documentos != null))
                {

                    qp.AddReplaceParam("DOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                    if (Helpers.ObjToStr(CApp.bll.GetSingleValue("SituacionDocumento", qp, "PDV")) != "3")
                    {
                        CApp.ShowMessage("El pedido no puede ser facturado porque está anulado", "Cobros y Facturación", true);

                        #region Anular Transacciones IGF
                        //Anular Transacciones
                        if (this.lTransacciones.Count > 0)
                        {
                            CApp.ShowMessage(@"Este pedido realizó transacciones con el Banco Nacional (pagos con tarjeta de crédito/débito) 
que ya fueron cobradas. Proceda a anular las transacciones o tendrá un faltante de caja", "Cobros y Facturación", true);

                            if (GUI.CApp.ValidateAccess("AnulacionTrans", "Anulación de pagos con tarjeta"))
                            {
                                string documento = "";
                                if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                    documento = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
                                else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                                    documento = DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();

                                string supervisor = "";
                                if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
                                    supervisor = GUI.CApp.Sup;
                                RealizarTransaccion(supervisor, documento);
                            }
                        }

                        this.lTransacciones.Clear();
                        #endregion

                        Hide();
                        Close();
                        return;
                    }
                }
            }
            catch
            {

                qp.AddReplaceParam("DOCUMENTO", p_documentos);
                credito = true;

                /*            if (Utils.Helpers.ObjToStr(GUI.CApp.bll.GetSingleValue("SituacionDocumento", qp, "PDV")) != "3")
                            {
                                GUI.CApp.ShowMessage("El pedido no puede ser facturado porque está anulado", "Cobros y Facturación");
                                Hide();
                                Close();
                                return;
                            }*/

            }

            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
            {
                QueryParams qp2 = new QueryParams();
                qp2.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                object resul = CApp.bll.GetSingleValue("WMS_F_CANTNEGATIVO", qp2, "PDV");
                if (resul != null)
                    if (int.Parse(resul.ToString()) > 0)
                    {
                        GUI.CApp.ShowMessage("En el pedido, hay artículos con cantidad negativa", "Cobros y Facturación", true);
                        return;
                    }
            }

            if (Helpers.Nvl(CApp.GetParam("FFMC"), "").ToString() == "X" && df == null)
            {
                df = new LLNet.Tienda.MainForms.Controls.ctlDatosFactura();
                df.rowEmision.Properties.Value = DateTime.Today;
            }

            if (beforePay(0) == -1) return;

            decimal vuelto = Convert.ToDecimal(rowVuelto.Properties.Value);
            if (chkDonarVuelto.Checked && vuelto > 0)
            {
                Model.PDV.DsPDV.WMS_PAGO_DOCUMENTOSRow pdr = DsRecibo.WMS_PAGO_DOCUMENTOS[DsRecibo.WMS_PAGO_DOCUMENTOS.Count - 1];

                using (dlgDonaciones donacion = new dlgDonaciones())
                {
                    donacion.ShowDialog();
                    if (donacion.DialogResult == DialogResult.OK)
                    {
                        pdr.BENEFICIARIO_DONACION = donacion.Beneficiario;
                        pdr.DONADO = pdr.PAGADO - pdr.VALOR;
                    }
                }

            }
            Decimal ABONO = Convert.ToDecimal(rowAbonado.Properties.Value);

            // Verifica que se haya pagado la totalidad de la factura
            if (Decimal.Round(Convert.ToDecimal(rowAbonado.Properties.Value)) - Convert.ToDecimal(rowTotal.Properties.Value) >= 0)
            {
                #region marchamos
                //Valida si es marchamo para crear un recibo DLQG
                if (Id_March != null && Id_March != String.Empty)
                {
                    // sE ELIMINA PORQUE SE CREA EL VOUCHER EN LA PANTALLA ANTERIOR DE AGREGAR PAGO
                    //Envia el pago a Credie
                    foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                    {
                        //si paga con Credicuotas Ekono
                        if (fil[2].ToString() == "34")
                        {//si es tipo de Pago GiftCard
                            bool est = false;
                            EventLogManuales.WriteLog("", Convert.ToString("Log_valor de cCredCuotsEk.ref_sec" + cCredCuotsEk.ref_sec));
                            est = Crear_Pago_CREDICUOTSEK(cCredCuotsEk.ref_sec);

                            if (est == false)
                            {
                                return;
                            }
                        }
                    }


                    //almacena los datos en la BD del recibo 

                    // Obtiene la secuencia del recibo
                    Utils.QueryParams qpm = new LLNet.Utils.QueryParams();
                    qpm.AddReplaceParam("SECUENCIA", "WMS_S_DOCUMENTO");

                    string mdoc = Convert.ToString(GUI.CApp.bll.GetSingleValue("SECUENCIA", qpm, "General"));
                    string mdocpadre = DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
                    string msocio = DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString();
                    string mTotal = DsPedido.WMS_DOCUMENTOS[0].TOTAL.ToString();

                    qpm = new LLNet.Utils.QueryParams();
                    qpm.AddReplaceParam("pDocumento", mdoc);
                    qpm.AddReplaceParam("pDoc_padre", mdocpadre);
                    qpm.AddReplaceParam("pCaja", Program.Caja.Value.ToString());
                    qpm.AddReplaceParam("pSocio", msocio);

                    if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
                    {
                        qpm.AddReplaceParam("pUsuario", GUI.CApp.Sup);
                    }
                    else
                    {
                        qpm.AddReplaceParam("pUsuario", GUI.CApp.usuario);
                    }

                    qpm.AddReplaceParam("pTotal", mTotal);
                    qpm.AddReplaceParam("pJornada", Program.Jornada.Value.ToString());

                    GUI.CApp.bll.ExecuteSql("AM_P_RECIBO", qpm, "PDV");


                    //almacena los datos en la BD de los tipos de pago en recibo 

                    foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                    {
                        qpm.Clear();
                        qpm.AddReplaceParam("pDOCUMENTO", mdoc);

                        #region Campos

                        if (fil["LINEA"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pLINEA", DBNull.Value.ToString().ToString());
                        }
                        else
                        {
                            qpm.AddReplaceParam("pLINEA", fil["LINEA"].ToString());
                        }

                        if (fil["TIPO_PAGO"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pTIPO_PAGO", "NULL");
                        }
                        else
                        {
                            qpm.AddReplaceParam("pTIPO_PAGO", fil["TIPO_PAGO"].ToString());
                        }

                        if (fil["VALOR"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pVALOR", "NULL");
                        }
                        else
                        {
                            qpm.AddReplaceParam("pVALOR", fil["VALOR"].ToString());
                        }

                        if (fil["EMISOR"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pEMISOR", "NULL");
                        }
                        else
                        {
                            qpm.AddReplaceParam("pEMISOR", fil["EMISOR"].ToString());
                        }

                        if (fil["TARJETA"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pTARJETA", DBNull.Value.ToString().ToString());
                        }
                        else
                        {
                            qpm.AddReplaceParam("pTARJETA", fil["TARJETA"].ToString());
                        }

                        if (fil["AUTORIZACION"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pAUTORIZACION", DBNull.Value.ToString().ToString());
                        }
                        else
                        {
                            qpm.AddReplaceParam("pAUTORIZACION", fil["AUTORIZACION"].ToString());
                        }

                        if (fil["PAGADO"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pPAGADO", "NULL");
                        }
                        else
                        {
                            qpm.AddReplaceParam("pPAGADO", fil["PAGADO"].ToString());
                        }

                        if (fil["MONEDA"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pMONEDA", "NULL");
                        }
                        else
                        {
                            qpm.AddReplaceParam("pMONEDA", fil["MONEDA"].ToString());
                        }

                        if (fil["TASA_CAMBIO"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pTASA_CAMBIO", "NULL");
                        }
                        else
                        {
                            qpm.AddReplaceParam("pTASA_CAMBIO", fil["TASA_CAMBIO"].ToString());
                        }

                        if (fil["VALOR_MONEDA"].ToString() == string.Empty)
                        {
                            qpm.AddReplaceParam("pVALOR_MONEDA", "NULL");
                        }
                        else
                        {
                            qpm.AddReplaceParam("pVALOR_MONEDA", fil["VALOR_MONEDA"].ToString());
                        }

                        #endregion

                        GUI.CApp.bll.ExecuteSql("AM_P_RECIBO_TIPO_PAGO", qpm, "PDV");
                    }

                    // Cambia el estado
                    qpm = new QueryParams();
                    qpm.AddReplaceParam("pID", Id_March);
                    qpm.AddReplaceParam("pESTADO", "C");
                    qpm.AddReplaceParam("pDOCUMENTO", mdocpadre);
                    //
                    GUI.CApp.bll.ExecuteSql("AM_P_REC_CAMBIO_ESTADO", qpm, "PDV");

                //imprime el recibo
                startPrinting02:

                    try
                    {
                        imprimirDocumentoDOS(Convert.ToInt64(mdoc), "", 5025, "", "");
                    }
                    catch
                    {
                        if (CApp.ShowMessage("Error en la impresión de facturas, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                        {
                            goto startPrinting02;
                        }
                    }

                    Id_March = String.Empty;
                    this.Hide();
                    this.Close();
                    newOrder();
                }
                #endregion
                else
                {

                    if (DsRecibo.WMS_DOCUMENTOS.Count > 0 || DsRecibo.PAGO_ANTICIPADO.Count > 0)
                    {
                        if (credito == true)
                        {
                            if (DsPedido.WMS_DOCUMENTOS.Count == 0) // PARA Q SOLO APLIQUE A RECIBOS DE CREDITO 
                            {
                                DsRecibo.WMS_DOCUMENTOS[0].IMPRESIONES = 0; //CON ESTO EL TRIGGER DOCU_TR01 LO VE COMO RECIBO DE CREDITO Y GENERA OTRO CONSECUTIVO
                            }
                        }
                        //Guarda los datos en BDD y prepara la aplicacion para un nuevo pedido
                        //PostData();

                        //Guardamos la observacion de la factura O al recibo
                        if (DsFactura.WMS_DOCUMENTOS.Count > 0)
                        {
                            DsFactura.WMS_DOCUMENTOS[0].OBSERVACIONES = observacion;
                        }
                        else
                        {
                            DsRecibo.WMS_DOCUMENTOS[0].OBSERVACIONES = observacion;
                        }

                        object[] objFac = new object[] { DsPedido, DsFactura, DsRecibo, Program.Jornada, dsNotaCredito, DsVale, (Program.FrmMainPos == null ? new Model.PDV.DsPDV() : Program.FrmMainPos.DsVale) };

                        try
                        {
                            #region WRLG. DESARROLLO DE GARANTIAS
                            if (!credito)
                            {
                                if (!IngresarGarantias(qp))
                                {
                                    CApp.ShowMessage("No es posible facturar sin tener los datos de garantías a generar", "Cobros y Facturación", true);
                                    return;
                                }
                            }

                            #endregion

                            if (DsPedido.WMS_DOCUMENTOS.Count > 0 && DsPedido.WMS_DOCUMENTOS.Rows.Count > 0 && DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                            {
                                Utils.QueryParams qpEx = new LLNet.Utils.QueryParams();
                                string existenciaInsuf = "";

                                switch (Utils.Helpers.ObjToStr(GUI.CApp.GetParam("VEPF")))
                                {
                                    case "V":
                                        qpEx.AddReplaceParam("DOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                        existenciaInsuf = (GUI.CApp.bll.GetSingleValue("ValidarExistenciaFacturar", qpEx, "PDV").ToString());

                                        if (existenciaInsuf != "")
                                        {
                                            GUI.CApp.ShowMessage("No hay existencia suficiente para el producto " + existenciaInsuf, "Validación de Existencia", true);
                                            return;
                                        }

                                        existenciaInsuf = (GUI.CApp.bll.GetSingleValue("ValidarExistInsumos", qpEx, "PDV").ToString());
                                        if (existenciaInsuf != "")
                                        {
                                            GUI.CApp.ShowMessage("No hay existencia suficiente para el producto " + existenciaInsuf, "Validación de Existencia", true);
                                            return;
                                        }
                                        break;
                                    case "A":
                                        qpEx.AddReplaceParam("DOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                        existenciaInsuf = (GUI.CApp.bll.GetSingleValue("ValidarExistenciaFacturar", qpEx, "PDV").ToString());
                                        if (existenciaInsuf != "")
                                            GUI.CApp.ShowMessage("No hay existencia suficiente para el producto " + existenciaInsuf, "Validación de Existencia", true);

                                        existenciaInsuf = (GUI.CApp.bll.GetSingleValue("ValidarExistInsumos", qpEx, "PDV").ToString());
                                        if (existenciaInsuf != "")
                                            GUI.CApp.ShowMessage("No hay existencia suficiente para el producto " + existenciaInsuf, "Validación de Existencia", true);
                                        break;
                                }
                            }


                            #region Envia los pagos de CrediCuotas al Proveedor
                            try
                            {
                                foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                                {
                                    //si paga con Credicuotas Ekono
                                    if (fil[2].ToString() == "34")
                                    {//si es tipo de Pago GiftCard
                                        bool est = false;
                                        EventLogManuales.WriteLog("", Convert.ToString("Log_valor de cCredCuotsEk.ref_sec" + cCredCuotsEk.ref_sec));

                                        if (DsPedido.WMS_DOCUMENTOS.Count > 0)
                                        {
                                            est = Crear_Pago_CREDICUOTSEK(cCredCuotsEk.ref_sec, true);
                                        }
                                        else
                                        {
                                            est = Crear_Pago_CREDICUOTSEK(cCredCuotsEk.ref_sec);
                                        }

                                        if (est == false)
                                            return;
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                GUI.CApp.ShowMessage(ex.Message, "Error Credie Ekono", true);
                                return;
                            }

                            #endregion


                            #region Enviar datos al proveedor GiftCards
                            //if (Helpers.Nvl(CApp.GetParam("DPTS"), "N").ToString() != "S")
                            //{
                            try
                            {
                                //Envia los GiftCards al Proveedor para que los active
                                ActGiftCardsPTS();
                            }
                            catch (Exception ex)
                            {
                                string msjErr = ex.Message.ToUpper();
                                msjErr = msjErr.Replace("'", " ");

                                CApp.ShowMessage(msjErr, "GiftCard", true);
                                if (msjErr.Contains("TIEMPO DE ESP") || msjErr.Contains("GATEWA") || msjErr.Contains("UNDERLYING CONNECTION") || msjErr.Contains("HAS TIMED OUT"))
                                {
                                    if (msjErr.Length > 50)
                                    {
                                        BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                    else
                                    {
                                        BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                }
                                else
                                {
                                    if (msjErr.Length > 50)
                                    {
                                        BitacoraErrorWS(varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                    else
                                    {
                                        BitacoraErrorWS(varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                    return;
                                }
                            }

                            try
                            {
                                //Envia los GiftCards al Proveedor para realice la recarga                           
                                RecGiftCardsPTS();
                            }
                            catch (Exception ex)
                            {
                                string msjErr = ex.Message.ToUpper();
                                msjErr = msjErr.Replace("'", " ");

                                CApp.ShowMessage(msjErr, "GiftCard", true);
                                if (msjErr.Contains("TIEMPO DE ESP") || msjErr.Contains("GATEWA") || msjErr.Contains("UNDERLYING CONNECTION") || msjErr.Contains("HAS TIMED OUT"))
                                {
                                    if (msjErr.Length > 50)
                                    {
                                        BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                    else
                                    {
                                        BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                }
                                else
                                {
                                    if (msjErr.Length > 50)
                                    {
                                        BitacoraErrorWS(varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                    else
                                    {
                                        BitacoraErrorWS(varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                    }
                                    return;
                                }
                            }
                            // }
                            #endregion

                            #region Sinpe Movil

                            try
                            {

                                foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                                {
                                    //si paga con Sinpe Movil
                                    if (fil[2].ToString() == "37")
                                    {//si es tipo de Pago Sinpe_Movil

                                        Utils.QueryParams param = new QueryParams();
                                        DataSet ds_datos = null;

                                        if (p_documentos == null)
                                        {
                                            param.AddReplaceParam("pDOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                             ds_datos = CApp.bll.getDataSet("PDV", "ObtCliente", param);
                                        }
                                        else
                                        {
                                            param.AddReplaceParam("pDOCUMENTO", p_documentos);
                                            ds_datos = CApp.bll.getDataSet("PDV", "ObtCliente", param );
                                        }
                               

                                        bool est = false;


                                        if (DsPedido.WMS_DOCUMENTOS.Count > 0 || ds_datos.Tables[0].Rows.Count > 0)
                                        {

                                            est = mObtenerTokenSinpe(fil[0].ToString());

                                            if (vTokenSinpe != "" && est == true)
                                            {
                                                est = mVincular_Pago_Sinpe(int.Parse(ds_datos.Tables[0].Rows[0]["ID"].ToString()), vTokenSinpe, ds_datos.Tables[0].Rows[0]["CEDULA"].ToString(),
                                                                           Convert.ToDecimal(ds_datos.Tables[0].Rows[0]["MONTO"].ToString()),
                                                                           ds_datos.Tables[0].Rows[0]["DOCUMENTO"].ToString());
                                            }
                                            else
                                            {
                                                return;
                                            }

                                        }


                                        if (est == false)
                                            return;
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                GUI.CApp.ShowMessage(ex.Message, "Error SINPE MOVIL", true);
                                return;
                            }


                            #endregion

                            /****************Cambio Factura Electrónica*******************/
                            try
                            {
                                if (DsPedido.WMS_DOCUMENTOS.Count > 0 && Convert.ToString(DsPedido.WMS_DOCUMENTOS[0].DIRECCION2) != "")
                                {
                                    DsFactura.WMS_DOCUMENTOS[0].DIRECCION2 = DsPedido.WMS_DOCUMENTOS[0].DIRECCION2;
                                }
                            }
                            catch (StrongTypingException) { }
                            /****************Cambio Factura Electrónica*******************/

                            CApp.bll.RemoteExecute("PDV", "Facturacion", objFac);

                            //STEVEN ARCE AERO 10/2018
                            if (DsPedido.WMS_DOCUMENTOS.Count > 0 && DsFactura.WMS_DOCUMENTOS.Count > 0)
                            {
                                QueryParams vQp = new QueryParams();
                                vQp.AddReplaceParam("DOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                CApp.bll.ExecuteSql("ActualizarDescripFact", vQp, "PDV");
                            }

                            qp.Clear();
                            if (DsFactura.WMS_DOCUMENTOS.Count > 0)
                            {
                                qp.AddReplaceParam("DOCUMENTO", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                                string MarcarFact = CApp.GetParam("MDSE").ToString();
                                if (MarcarFact.ToUpper() == "SI")
                                {
                                    qp.AddReplaceParam("SOCIO", DsFactura.WMS_DOCUMENTOS[0].SOCIO.ToString());
                                    string SocioNoExento = CApp.bll.GetSingleValue("SocioNoExcento", qp, "PDV").ToString();

                                    if (Convert.ToInt32(SocioNoExento) > 0)
                                        CApp.bll.ExecuteSql("MarcaFactura", qp, "PDV");
                                }
                                string facturaExenta = CApp.bll.GetSingleValue("TieneExencionImpuestos", qp, "PDV").ToString();
                                if (facturaExenta != "0")
                                    CApp.bll.ExecuteSql("UpdateImpuestos", qp, "PDV");
                            }

                            if (p_documentos != null)
                            {
                                // MODIFICADO POR RANDALL, SIEMPRE QUE ENTRABA AQUI DABA ERROR, PORQUE INSERTA DATOS
                                // REPETIDOS, ENTONCES DA ERROR DE LLAVES

                                //Utils.QueryParams qpDocs = new LLNet.Utils.QueryParams();
                                //qpDocs.AddReplaceParam("DOCS", p_documentos);
                                //qpDocs.AddReplaceParam("MONTO", DsRecibo.WMS_DOCUMENTOS[0].TOTAL.ToString());
                                //GUI.CApp.bll.ExecuteSql("CancelaFactura",qpDocs,"PDV");
                            }
                        }
                        catch (Exception ex)
                        {
                            if (ex.Message.IndexOf("DOCU_UK01") > 0)
                                CApp.ShowMessage("Uno de los documentos a generar ya existe, verifique las secuencias de documentos\rFACTURA/RECIBO NO CREADA(O)", "Facturación", true);
                            else
                            {
                                CApp.ShowMessage(ex.Message + "\rFACTURA/RECIBO NO CREADA(0)", "Facturación", true);
                            }
                            return;
                        }

                        #region Tiempo Facturación IGF
                        //Almacenar fin cobro
                        if (DsPedido.WMS_DOCUMENTOS.Count > 0 && DsPedido.WMS_DOCUMENTOS.Rows.Count > 0 && DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString() != "")
                        {
                            Utils.QueryParams param = new LLNet.Utils.QueryParams();
                            param.AddReplaceParam("Documento", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                            GUI.CApp.bll.ExecuteSql("AlmTiempoF", param, "PDV");
                        }
                        #endregion

                        DsPedido = objFac[0] as Model.PDV.DsPDV;
                        DsFactura = objFac[1] as Model.PDV.DsPDV;
                        DsRecibo = objFac[2] as Model.PDV.DsPDV;
                        DsVale = objFac[5] as Model.PDV.DsPDV;

                        if (DsPedido.WMS_DOCUMENTOS.Count > 0)
                        {
                            long documento = documentoPreimpreso = (long)DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                            string sdocumento = subTipoDocumentoPreimpreso = DsFactura.WMS_DOCUMENTOS[0]["SUBTIPO_DOCUMENTO"].ToString();
                            object cedulaMiembroPlus = string.Empty;
                            //Ya se creo la factura

                            #region Actualiza si hay membresia
                            //Almacena el ID_Maestro del proceso de redimir
                            Utils.QueryParams qpm = new LLNet.Utils.QueryParams();
                            qpm.AddReplaceParam("P_FACTURA", documento.ToString());
                            qpm.AddReplaceParam("P_CREADO_POR", GUI.CApp.usuario);
                            qpm.AddReplaceParam("P_PEDIDO", DsFactura.WMS_DOCUMENTOS[0]["DOCUMENTO_PADRE"].ToString());

                            GUI.CApp.bll.ExecuteSql("PLUS_FACTURA_CLIENTE", qpm, "PDV");

                            GUI.CApp.bll.ExecuteSql("PLUS_FACTURA_TAR_CLIENTE", qpm, "PDV");

                            //Actualizar el n_monto_couta 
                            QueryParams qpActMonto = new QueryParams();
                            qpActMonto.AddReplaceParam("P_PEDIDO", DsFactura.WMS_DOCUMENTOS[0]["DOCUMENTO_PADRE"].ToString());
                            GUI.CApp.bll.ExecuteSql("PLUS_ACTUALIZA_COUTA", qpActMonto, "PDV");

                            //Se obtiene la cedula del miembro para poder activar el registro en la tabla  PLUS_MENBRESIA_CUOTAS
                            Utils.QueryParams qpPLUSCMiembro = new LLNet.Utils.QueryParams();
                            qpPLUSCMiembro.AddReplaceParam("P_C_PEDIDO", DsFactura.WMS_DOCUMENTOS[0]["DOCUMENTO_PADRE"].ToString());
                            qpPLUSCMiembro.AddReplaceParam("P_C_FACTURA", documento.ToString());

                            cedulaMiembroPlus = GUI.CApp.bll.GetSingleValue("PLUS_OBTIENE_CEDULA_MIEMBRO", qpPLUSCMiembro, "PDV");
                            if (cedulaMiembroPlus != null)
                            {
                                Utils.QueryParams qpm2 = new LLNet.Utils.QueryParams();
                                qpm2.AddReplaceParam("P_C_CEDULA", cedulaMiembroPlus.ToString());
                                GUI.CApp.bll.ExecuteSql("PLUS_I_ACTUALIZA_MEMB_ACTIVA", qpm2, "PDV");
                            }

                            #endregion

                            //SI HAY UNA LISTA CBB SE VAN A DESCONTAR LOS ARTICULOS
                            List<String> listaSkus = new List<String>();
                            List<String> listaSkusCant = new List<String>();
                            if (frmGestionCbb.Validate(frmGestionCbb._idListaClubBebe))
                            {
                                String respuesta = frmGestionCbb.DocumentoFacturado(documento.ToString());
                                if (respuesta.Trim().Equals("1"))
                                {
                                    listaSkus = frmGestionCbb.listaSkus;
                                    listaSkusCant = frmGestionCbb.listaSkusCant;

                                    frmGestionCbb.DescontarArticulosCBB(listaSkus, documento.ToString(), listaSkusCant, frmGestionCbb._idListaClubBebe, CApp.usuario);
                                    frmGestionCbb.listaSkus.Clear();
                                    frmGestionCbb.listaSkusCant.Clear();
                                    frmGestionCbb._idListaClubBebe = "";
                                }

                            }
                            //FIN SI HAY UNA LISTA CBB SE VAN A DESCONTAR LOS ARTICULOS

                            if (Helpers.Nvl(CApp.GetParam("DPTS"), "N").ToString() != "S")
                            {
                                #region Envia lo de los MisPuntos

                                //tarjeta del pedido
                                string TARJE = TarjetaPedido(documento.ToString());

                                //Pagar con Pts 
                                try
                                {
                                    Utils.QueryParams qp2 = new LLNet.Utils.QueryParams();
                                    qp2.AddReplaceParam("pDocumento", documento.ToString());
                                    DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "PagosPts", qp2);
                                    foreach (DataRow fila in dsB.Tables[0].Rows)
                                    {
                                        BitacoraTiempo(documento.ToString(), "redimir_puntos.php");
                                        decimal ValRealPts = decimal.Parse(Convert.ToString(fila[0])) * ValFactPts;
                                        //Envia los datos de la compra al proveedor para que descuente los puntos
                                        string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + Convert.ToString(fila[1]) + "&tipo_transaccion=1";
                                        // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=" + Convert.ToString(fila[0]) + "&nombre_cajero=" + CApp.usuario;
                                        PData += "&numero_factura=" + documento.ToString() + "&puntos=" + ValRealPts + "&monto_factura=&nombre_cajero=" + CApp.usuario;
                                        string info = RequestPOST(varUrlPts + "redimir_puntos.php", PData);
                                        BitacoraTiempoF(id);
                                        info = info.Trim();
                                        string[] datos = info.Split(' ');
                                        if (datos[0].ToString() != "10")
                                        {
                                            CApp.ShowMessage(info, "RedimirPuntos", true);
                                            BitacoraErrorWS("WS=" + varUrlPts + "redimir_puntos.php " + info, PData);
                                        }
                                        else
                                        {
                                            //almacena la factura en la que se redimieron los puntos
                                            string PData2 = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&id_maestro=" + datos[3].ToString() + "&numero_factura=" + documento.ToString();
                                            // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=" + Convert.ToString(fila[0]) + "&nombre_cajero=" + CApp.usuario;
                                            // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=&nombre_cajero=" + CApp.usuario;
                                            string info2 = RequestPOST(varUrlPts + "redimir_puntos_update.php", PData2);
                                            info2 = info2.Trim();
                                            string[] datos2 = info2.Split(' ');
                                            if (datos2[0].ToString() != "10")
                                            {
                                                CApp.ShowMessage(info2, "RedimirPuntosUpDate", true);
                                                BitacoraErrorWS("WS=" + varUrlPts + "redimir_puntos_update.php " + info2, PData2);
                                            }

                                            //Almacena el ID_Maestro del proceso de redimir
                                            Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                                            qp3.AddReplaceParam("pDOCUMENTO", documento.ToString());
                                            qp3.AddReplaceParam("pIDMAESTRO", datos[3].ToString());
                                            GUI.CApp.bll.ExecuteSql("WMS_IIDMAESTRO", qp3, "PDV");

                                            if (TARJE == string.Empty)
                                            {
                                                TARJE = Convert.ToString(fila[1]);
                                                //almacena la tarjeta con la que pago para que gane puntos
                                                qp3.Clear();
                                                qp3.AddReplaceParam("pTARJETA", Convert.ToString(fila[1]));
                                                qp3.AddReplaceParam("pDOCUMENTO", documento.ToString());
                                                // Llama el procedimiento que almacena la tarjeta 
                                                GUI.CApp.bll.ExecuteSql("WMS_ADocTarMisPts", qp3, "PDV");
                                                qp3.Clear();
                                                qp3.AddReplaceParam("pTARJETA", TARJE);
                                                string CUMPLE = CApp.bll.GetSingleValue("CUMPLEPTS", qp3, "PDV").ToString();
                                                if (CUMPLE != "0" && CUMPLE != "")
                                                {
                                                    GUI.CApp.ShowMessage("Felicidades " + CUMPLE + " portador(a) de esta tarjeta esta cumpliendo años", "Mis Puntos", true);
                                                }
                                            }
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    string msjErr = ex.Message.ToUpper();
                                    CApp.ShowMessage(msjErr, "RedimirPuntos", true);
                                    if (msjErr.Contains("TIEMPO DE ESP") || msjErr.Contains("GATEWA") || msjErr.Contains("UNDERLYING CONNECTION") || msjErr.Contains("HAS TIMED OUT"))
                                    {
                                        if (msjErr.Length > 50)
                                        {
                                            BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "redimir_puntos.php" + msjErr.Substring(0, 49), "numero_factura: " + documento.ToString());
                                        }
                                        else
                                        {
                                            BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "redimir_puntos.php" + msjErr, "numero_factura: " + documento.ToString());
                                        }
                                    }
                                    else
                                    {
                                        if (msjErr.Length > 50)
                                        {
                                            BitacoraErrorWS(varUrlPts + "redimir_puntos.php" + msjErr.Substring(0, 49), "numero_factura: " + documento.ToString());
                                        }
                                        else
                                        {
                                            BitacoraErrorWS(varUrlPts + "redimir_puntos.php" + msjErr, "numero_factura: " + documento.ToString());
                                        }
                                        return;
                                    }
                                }


                                //monto minimo de puntos                        
                                Utils.QueryParams qp5 = new LLNet.Utils.QueryParams();
                                DataSet dsB5 = GUI.CApp.bll.getDataSet("PDV", "MinPts", qp5);

                                DataRow filas = dsB5.Tables[0].Rows[0];

                                if (DsFactura.WMS_DOCUMENTOS[0].TOTAL >= decimal.Parse(filas[0].ToString()))
                                {
                                    //Acumular Pts  
                                    try
                                    {
                                        if (TARJE != string.Empty)
                                        { //si el pedido de la fatura tiene una tarjeta asociada

                                            //Valida si el cliente pago con CrediE  
                                            Model.PDV.DsPDV.WMS_PAGO_DOCUMENTOSDataTable tpagos = DsRecibo.WMS_PAGO_DOCUMENTOS;
                                            foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                                            {
                                                string t_pag = fil[2].ToString();
                                                if (t_pag == "34")
                                                {
                                                    //Almacena el tipo de pago credie en el documento
                                                    Utils.QueryParams qpd = new LLNet.Utils.QueryParams();
                                                    qpd.AddReplaceParam("pDOCUMENTO", documento.ToString());
                                                    GUI.CApp.bll.ExecuteSql("WMS_APCrediE", qpd, "PDV");
                                                }
                                            }

                                            Utils.QueryParams qp7 = new LLNet.Utils.QueryParams();
                                            qp7.AddReplaceParam("P_DOCUMENTO", documento.ToString());

                                            string prod = "";

                                            //cantidad de productos de viaje en el documento
                                            string validaPaqViajs = (GUI.CApp.bll.GetSingleValue("CANTVIAJESPEDIDO", qp7, "PDV").ToString());
                                            if (validaPaqViajs != "0")
                                            {//SI TIENE productos de Paquetes de Viajes
                                                prod = "";
                                            }
                                            else //STEVEN ARCE MODIFICACION 03/10/2018
                                            {
                                                Utils.QueryParams qp8 = new LLNet.Utils.QueryParams();
                                                qp8.AddReplaceParam("P_DOCUMENTO", documento.ToString());
                                                qp8.AddReplaceParam("P_TIPO", "1");
                                                string vValidaAeropost = (GUI.CApp.bll.GetSingleValue("VALIDAAEROPOSTPEDIDO", qp8, "PDV").ToString());

                                                if (vValidaAeropost.Equals("0"))
                                                {//SI TIENE productos de AEROPOST
                                                    prod = "";
                                                }
                                                else
                                                {
                                                    //NO TIENE productos de Paquetes de Viajes ni de AEROPOST
                                                    prod = MisPuntos(documento.ToString(), TARJE);
                                                }
                                            }

                                            //string prod = MisPuntos(documento.ToString(), TARJE);
                                            if (prod != "")
                                            {//Si el pedido tiene productos que ganen puntos mayores al costo mínimo del producto
                                                BitacoraTiempo(documento.ToString(), "ws_carga_transaccion_detalle.php");
                                                //Envia los datos de la compra al proveedor para que acumule los puntos    ws_prueba_resp_carga_transaccion_detalle.php
                                                string PData = "url_respuesta=" + varUrlPts + "ws_carga_transaccion_detalle.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + TARJE + "&numero_factura=" + documento + "&monto_factura=" + DsFactura.WMS_DOCUMENTOS[0].TOTAL;
                                                PData += "&nombre_cajero=" + CApp.usuario + prod + "&Total_factura=" + DsFactura.WMS_DOCUMENTOS[0].TOTAL;
                                                string info = RequestPOST(varUrlPts + "ws_carga_transaccion_detalle.php", PData);
                                                BitacoraTiempoF(id);
                                                info = info.Trim();
                                                string[] datos = info.Split('=');
                                                if (datos.Length == 2)
                                                {
                                                    if (datos[0].ToString().StartsWith("10"))
                                                    {
                                                        //Almacena los puntos en nuestra Base d Datos
                                                        Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                                                        qp3.AddReplaceParam("pDOCUMENTO", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                                        qp3.AddReplaceParam("pPTSGANA", datos[1].ToString().Trim());
                                                        GUI.CApp.bll.ExecuteSql("WMS_IPtsFACTURA", qp3, "PDV");
                                                    }
                                                    else
                                                    {
                                                        CApp.ShowMessage(info, "Acumular Puntos", true);
                                                        BitacoraErrorWS("WS=" + varUrlPts + "ws_carga_transaccion_detalle.php " + info, PData);
                                                    }
                                                }
                                                else
                                                {
                                                    CApp.ShowMessage(info, "Acumular Puntos", true);
                                                    BitacoraErrorWS("WS=" + varUrlPts + "ws_carga_transaccion_detalle.php " + info, PData);
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        CApp.ShowMessage(ex.Message, "Acumular Puntos", true);
                                        if (ex.Message.Length > 50)
                                        {
                                            BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_carga_transaccion_detalle.php" + ex.Message.Substring(0, 49), "numero_factura: " + documento.ToString());
                                        }
                                        else
                                        {
                                            BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_carga_transaccion_detalle.php" + ex.Message, "numero_factura: " + documento.ToString());
                                        }
                                    }
                                }

                                #endregion

                                #region Descuento por Puntos

                                //Convierte los puntos que pago de forma de pago a descuento
                                Utils.QueryParams qp4 = new LLNet.Utils.QueryParams();
                                qp4.AddReplaceParam("p_documento", documento.ToString());
                                qp4.AddReplaceParam("p_linea", "null");
                                GUI.CApp.bll.ExecuteSql("DescuentoPTS", qp4, "PDV");

                                #endregion

                                #region Paga con GiftCard al proveedor

                                //Pagar con GiftCard
                                string tarjgift = "";
                                try
                                {
                                    foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                                    {
                                        //string t_pag = fil[2].ToString();
                                        if (fil[2].ToString() == "14")
                                        {//si es tipo de Pago GiftCard
                                            tarjgift = Convert.ToString(fil[5]);
                                            //}
                                            //if (vpagotarj)
                                            //{
                                            // Utils.QueryParams qp2 = new LLNet.Utils.QueryParams();
                                            // qp2.AddReplaceParam("pDocumento", documento.ToString());
                                            // DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "PagosPts", qp2);
                                            // foreach (DataRow fila in dsB.Tables[0].Rows)
                                            // {
                                            //BitacoraTiempo(documento.ToString(), "redimir_monto_tarjeta_regalo.inc.php");
                                            //Envia los datos de la compra al proveedor para que descuente los puntos
                                            string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + Convert.ToString(fil[5]) + "&monto=" + Convert.ToString(fil[3]);
                                            string info = RequestPOST(varUrlPts + "redimir_monto_tarjeta_regalo.inc.php", PData);
                                            //BitacoraTiempoF(id);
                                            //info = "T:" + tarjgift + "," + info.Trim(); //COMENTADO X DLQG 
                                            info = info.Trim(); //COMENTADO X DLQG 
                                            string[] datos = info.Split(' ');
                                            if (datos[0].ToString() != "10")
                                            {
                                                info = "T:" + tarjgift + "," + info.Trim(); //DLQG 
                                                CApp.ShowMessage(info, "RedimirMontoGiftCard", true);
                                                BitacoraErrorWS("WS=" + varUrlPts + "redimir_monto_tarjeta_regalo.inc.php " + info, PData);
                                            }
                                            else
                                            {
                                                //almacena la factura en la que se redimieron los puntos
                                                string PData2 = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&id_maestro=" + datos[3].ToString() + "&numero_factura=" + documento.ToString();
                                                // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=" + Convert.ToString(fila[0]) + "&nombre_cajero=" + CApp.usuario;
                                                // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=&nombre_cajero=" + CApp.usuario;
                                                string info2 = RequestPOST(varUrlPts + "redimir_monto_tarjeta_regalo_update.php", PData2);
                                                //info2 = "T:" + tarjgift + "," + info2.Trim(); //COMENTADO X DLQG
                                                info2 = info2.Trim();
                                                string[] datos2 = info2.Split(' ');
                                                if (datos2[0].ToString() != "10")
                                                {
                                                    info2 = "T:" + tarjgift + "," + info2.Trim();
                                                    CApp.ShowMessage(info2, "redimir_monto_tarjeta_regalo_update", true);
                                                    BitacoraErrorWS("WS=" + varUrlPts + "redimir_monto_tarjeta_regalo_update.php " + info2, PData2);
                                                }

                                                //Almacena el ID_Maestro del proceso de redimir
                                                Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                                                qp3.AddReplaceParam("pDOCUMENTO", fil[0].ToString());
                                                qp3.AddReplaceParam("pTARJETA", fil[5].ToString());
                                                qp3.AddReplaceParam("pVALOR", fil[3].ToString());
                                                qp3.AddReplaceParam("pIDMAESTRO", datos[3].ToString());
                                                GUI.CApp.bll.ExecuteSql("WMS_AIDGIFTCARD", qp3, "PDV");
                                            }
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    string msjErr = "T:" + tarjgift + "," + ex.Message.ToUpper();
                                    CApp.ShowMessage(msjErr, "RedimirPuntos", true);
                                    if (msjErr.Contains("TIEMPO DE ESP") || msjErr.Contains("GATEWA") || msjErr.Contains("UNDERLYING CONNECTION") || msjErr.Contains("HAS TIMED OUT"))
                                    {
                                        if (msjErr.Length > 50)
                                        {
                                            BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "redimir_monto_tarjeta_regalo_update.php" + msjErr.Substring(0, 49), "numero_factura: " + documento.ToString());
                                        }
                                        else
                                        {
                                            BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "redimir_monto_tarjeta_regalo_update.php" + msjErr, "numero_factura: " + documento.ToString());
                                        }
                                        return;
                                    }
                                    else
                                    {
                                        if (msjErr.Length > 50)
                                        {
                                            BitacoraErrorWS(varUrlPts + "redimir_monto_tarjeta_regalo_update.php" + msjErr.Substring(0, 49), "numero_factura: " + documento.ToString());
                                        }
                                        else
                                        {
                                            BitacoraErrorWS(varUrlPts + "redimir_monto_tarjeta_regalo_update.php" + msjErr, "numero_factura: " + documento.ToString());
                                        }
                                        return;
                                    }
                                }


                                #endregion
                            }

                            if (DsFactura.WMS_DOCUMENTOS.Count > 0)
                            {
                                ActGiftCardsFact();
                            }
                            else
                                CApp.ShowMessage("No se encuentra la factura para activar las GiftCards", "Cobros y Facturación", true);

                            if (DsFactura.WMS_DOCUMENTOS.Count > 0)
                            {
                                RecGiftCardsFact();
                            }
                            else
                                CApp.ShowMessage("No se encuentra la factura para recargar las GiftCards", "Cobros y Facturación", true);


                            startPrinting02:

                            try
                            {
                                /****************Cambio Factura Electrónica*******************/
                                mTrama(documento);

                                printInvoice(documento, sdocumento);
                                /****************Cambio Factura Electrónica*******************/
                            }
                            catch
                            {
                                if (CApp.ShowMessage("Error en la impresión de facturas, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                                {
                                    goto startPrinting02;
                                }
                            }

                            #region GMH RIFAS Y VALES

                            string GaneRifa = CApp.bll.GetSingleValue("GanarRifa", qp, "PDV").ToString();
                            if (GaneRifa != "0")
                            {
                                CApp.bll.ExecuteSql("AsignaRifa", qp, "PDV");
                                CApp.ShowMessage("FELICIDADES ESTA COMPRA ES GANADORA", "Ganador", true);
                                /************************DLQG CAppP basada en CApp************************/
                                if (GUI.CAppP.ValidateAccess("EntregarRifa", "IMPRIMIR BONIFICACION"))
                                {//ACEPTAR -> GENERA EL VALE
                                    string vValeR = CApp.bll.GetSingleValue("NextVale", qp, "PDV").ToString();
                                    qp.AddReplaceParam("NUMVALE", vValeR);
                                    CApp.bll.ExecuteSql("CrearValeRifa", qp, "PDV");
                                    printCoupon(Convert.ToDecimal(vValeR));
                                }
                                else
                                {//CANCELAR ->Vuelve A consultar
                                    DialogResult DRresult = CApp.ShowMessage("Ha seleccionado no bonificar al cliente una bitacora a su nombre será enviada a Sistemas", "Ganador", true, false);
                                    if (DRresult == DialogResult.OK)
                                    {//ACEPTAR -> DESASIGNA LA RIFA Y GENERA BITACORA
                                        CApp.bll.ExecuteSql("DesAsignaRifa", qp, "PDV");
                                        qp.AddReplaceParam("pCaja", Program.Caja.ToString());
                                        qp.AddReplaceParam("pUsuario", GUI.CApp.usuario);
                                        // Llama el procedimiento que almacena los datos de la bitacora en la BD                                        
                                        CApp.bll.ExecuteSql("WMS_P_RIFA_BITAC_CANC", qp, "PDV");
                                    }
                                    else
                                    {//CANCELAR ->GENERA EL VALE
                                        string vValeR = CApp.bll.GetSingleValue("NextVale", qp, "PDV").ToString();
                                        qp.AddReplaceParam("NUMVALE", vValeR);
                                        CApp.bll.ExecuteSql("CrearValeRifa", qp, "PDV");
                                        printCoupon(Convert.ToDecimal(vValeR));
                                    }
                                }
                            }
                            #endregion

                            #region CuponCredie
                            //actualiza el cupon credie como cobrado
                            qp.Clear();
                            qp.AddReplaceParam("pDOCUMENTO", documento.ToString());
                            // Llama el procedimiento que almacena los datos de la bitacora en la BD                                        
                            CApp.bll.ExecuteSql("EKO_P_CANJE_CUPON_CREDIE", qp, "PDV");
                            #endregion

                            #region VALIDA SI DEBE SUBIR DE NIVEL EL CLIENTE PTS
                            //tarjeta del pedido
                            string TARJPTS = TarjetaFactura(documento.ToString());
                            if (TARJPTS != string.Empty)
                            {

                                string cambio = string.Empty;

                                //Consulta la central a ver si puede subir
                                Utils.QueryParams qp1 = new LLNet.Utils.QueryParams();
                                qp1.AddReplaceParam("pTARJETA", TARJPTS.Trim());
                                // Llama el procedimiento que almacena el error de la recarga en la BD
                                GUI.CApp.bll.ExecuteSql("PTS_P_SUBIR_CLI_CAT", qp1, "PDV");

                                DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "PTS_F_ACTTIPO", qp1);
                                if (dsB.Tables.Count > 0)
                                {
                                    if (dsB.Tables[0].Rows.Count > 0)
                                    {
                                        object[] datos = new object[1];
                                        datos = dsB.Tables[0].Rows[0].ItemArray;
                                        cambio = datos[0].ToString();
                                        if (cambio != "-1")
                                        {
                                            //muestra la pantalla para hacer el cambio
                                            if (Helpers.Nvl(CApp.GetParam("DPTS"), "N").ToString() != "S")
                                            {
                                                LLNet.Tienda.MainForms.Forms.MisPuntos.FrmCambCatTarj frmtrj = new LLNet.Tienda.MainForms.Forms.MisPuntos.FrmCambCatTarj(TARJPTS.Trim());
                                                frmtrj.ShowDialog();
                                            }
                                            /*else
                                            {
                                                GUI.CApp.ShowMessage("Sistema de Puntos fuera de Servicio", "Sistema de Puntos", true);
                                            }*/
                                            //YA ESTE MENSAJE LO MOSTRO ARRIBA
                                        }
                                    }
                                }
                            }
                            #endregion

                            this.lTransacciones.Clear();
                            printDocuments(documento);
                            this.Hide();
                            this.Close();
                            newOrder();
                        }
                        else
                        {
                            if (DsRecibo.WMS_DOCUMENTOS.Count > 0)
                            {
                                long recibo = (long)DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO;
                                docecom = Convert.ToString(recibo);
                                // Pagar con Pts 
                                Utils.QueryParams qp2 = new LLNet.Utils.QueryParams();
                                qp2.AddReplaceParam("pDocumento", recibo.ToString());
                                DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "PagosAPts", qp2);
                                foreach (DataRow fila in dsB.Tables[0].Rows)
                                {
                                    //Envia los datos de la compra al proveedor para que descuente los puntos
                                    string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + Convert.ToString(fila[1]) + "&tipo_transaccion=1";
                                    // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=" + Convert.ToString(fila[0]) + "&nombre_cajero=" + CApp.usuario;
                                    PData += "&numero_factura=" + recibo.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=&nombre_cajero=" + CApp.usuario;
                                    string info = RequestPOST(varUrlPts + "redimir_puntos.php", PData);
                                    string[] datos = info.Split(' ');
                                    if (datos[0].ToString() != "10")
                                    {
                                        CApp.ShowMessage(info, "RedimirPuntos", true);
                                    }
                                    else
                                    {
                                        //Almacena el ID_Maestro del proceso de redimir
                                        Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                                        qp3.AddReplaceParam("pDOCUMENTO", recibo.ToString());
                                        qp3.AddReplaceParam("pIDMAESTRO", datos[3].ToString());
                                        GUI.CApp.bll.ExecuteSql("WMS_IIDMAESTRO", qp3, "PDV");
                                    }
                                }


                                printReceipt(recibo);
                            }
                            this.Hide();
                            this.Close();
                        }
                    }
                    else
                        CApp.ShowMessage("No ha ingresado abonos para la factura", "Cobros y Facturación", true);

                    //Vuelve al estado original el boton de Exonerar
                    try
                    {
                        Program.FrmMainPos.exentEnabled = false;
                        Program.exonerado = "N";
                        Program.FrmMainPos.btnExonerar.ButtonStyle = DevExpress.XtraEditors.Controls.BorderStyles.Default;
                    }
                    catch
                    {
                        //  Program.FrmMainPos.exentEnabled = false;
                        // SI ES PAGO DE CREDITO NO DEBE HABILITAR EL BOTON PQ NO ESTA CARGADO
                    }
                }
            }
            else // Alerta sobre el faltante de pago
                CApp.ShowMessage("El total de la factura es mayor al total abonado", "Cobros y Facturación", true);

            if (MontoMaximo > 0)
            {
                qp.AddReplaceParam("JORNADA", Program.Jornada.ToString());
                qp.AddReplaceParam("CAJA", Program.Caja.ToString());
                decimal MontoCaja = Convert.ToDecimal(Helpers.Nvl(CApp.bll.GetSingleValue("MontoenCaja", qp, "PDV"), 0));
                decimal MontoRetiros = Convert.ToDecimal(Helpers.Nvl(CApp.bll.GetSingleValue("MontoRetiros", qp, "PDV"), 0));
                if ((MontoCaja - MontoRetiros) > MontoMaximo)
                {
                    CApp.ShowMessage("Se ha llegado al Monto máximo establecido para Retiros de caja. Comuniquese con su Supervisor", "Cobros y Facturación", true);

                    string vHabilitar_Contador = Helpers.Nvl(CApp.GetParam("HCPR"), "N").ToString();

                    if (vHabilitar_Contador == "S")// Verifica si se habilita el contador para bloquear los movimientos hasta que el cajero haga el retiro de efectivo
                    {
                        qp = new QueryParams();
                        qp.AddReplaceParam("JORNADA", Program.Jornada.ToString());
                        GUI.CApp.bll.ExecuteSql("EKO_P_CONTADOR_BLOQUEO", qp, "PDV");
                    }
                }
            }
        }

        #endregion

        #region Mis Puntos

        /// <summary>Ejecuta por medio de post un llamado al Web Service utilizando HTTP POST</summary>
        /// <param name="URL"></param>
        /// <param name="PostData"></param>
        /// <returns></returns>
        private string RequestPOST(string URL, string PostData)
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create(URL);
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            //string postData = "";
            byte[] byteArray = Encoding.UTF8.GetBytes(PostData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            //            MessageBox.Show(((HttpWebResponse)response).StatusDescription, "DESCRIPCION");
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            //      MessageBox.Show(responseFromServer, "Respuesta del Server");
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
            return responseFromServer;
        }

        private string MisPuntos(string doc, string tarj)
        {
            string matrizP = ""; //Matriz de Productos
            Utils.QueryParams qp1 = new LLNet.Utils.QueryParams();
            qp1.AddReplaceParam("pTarj", tarj);
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pDocumento", doc);
            short tdesc = Convert.ToInt16(GUI.CApp.bll.GetSingleValue("TarjetaDPts", qp1, "PDV"));
            DataSet dsB;
            if ((varArtCDesc == "S") || (tdesc > 0))
            {
                dsB = GUI.CApp.bll.getDataSet("PDV", "FacturaDMisPuntos", qp);
            }
            else
            {
                dsB = GUI.CApp.bll.getDataSet("PDV", "FacturaMisPuntos", qp);
            }
            //DataRow fila;

            if (dsB.Tables.Count > 0)
            {
                int cont = 0;
                foreach (DataRow Fila in dsB.Tables[0].Rows)
                {//Productos

                    //Fila = dsB.Tables[0].Rows[cont];                                                          
                    matrizP += "&producto[" + cont + "][codigo]=" + Convert.ToString(Fila[0]); //codigo
                    matrizP += "&producto[" + cont + "][descripcion]=" + Convert.ToString(Fila[1]); //descripcion
                    matrizP += "&producto[" + cont + "][categoria]=" + Convert.ToString(Fila[2]); //categoria
                    matrizP += "&producto[" + cont + "][monto]=" + Convert.ToString(Fila[3]); //monto

                    //&producto[0][codigo]=JW&producto[0][descripcion]=Jonny+Walker&producto[0][categoria]=Botella&producto[0][monto]=25000

                    cont += 1;
                }
            }
            return matrizP;
        }


        private string TarjetaPedido(string doc)
        {
            string tarjeta = ""; //Matriz de Productos
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pDocumento", doc);

            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "TarjetaPedido", qp);
            //DataRow fila;

            if (dsB.Tables.Count > 0)
            {
                int cont = 0;
                foreach (DataRow Fila in dsB.Tables[0].Rows)
                {
                    tarjeta = Convert.ToString(Fila[0]); //Tarjeta del Pedido                    
                }
            }
            return tarjeta;
        }


        private string TarjetaFactura(string doc)
        {
            string tarjeta = ""; //Matriz de Productos
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pDocumento", doc);

            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "TarjetaDOC", qp);
            //DataRow fila;

            if (dsB.Tables.Count > 0)
            {
                int cont = 0;
                foreach (DataRow Fila in dsB.Tables[0].Rows)
                {
                    tarjeta = Convert.ToString(Fila[0]); //Tarjeta del Pedido                    
                }
            }
            return tarjeta;
        }

        private string Consultar_Puntos(string ptarjeta)
        {
            string info = RequestPOST(varUrlPts + "consultar_puntos.php", "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + ptarjeta);
            string[] datos = info.Split(' ');
            if (datos.Length == 6)
            {
                string pts = datos[2].ToString();

                if (pts.LastIndexOf('.') > 0)
                {
                    pts = pts.Substring(0, pts.LastIndexOf('.'));
                }
                return pts;
            }
            else
            {
                return "0";
            }
        }

        //almacena el error en el WS
        private void BitacoraErrorWS(string pError, string pWServ)
        {
            if (pWServ.Length > 300)
                pWServ = pWServ.Substring(0, 300);
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pError", pError);
            qp.AddReplaceParam("pWServ", pWServ);
            // Llama el procedimiento que almacena el error del WS en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_BITAC_E_AFIL", qp, "PDV");
        }

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

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

            varUrlPts = datos[0].ToString();
            varCodemprPts = datos[1].ToString();
            varCodsucPts = datos[2].ToString();
            varArtCDesc = datos[3].ToString();
        }

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

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

            varUSRG = datos[0].ToString();
            varPWDG = datos[1].ToString();
            varURLE = datos[2].ToString();
        }

        //Almacena cada tiempo inicial de consulta de MisPuntos
        private void BitacoraTiempo(string documento, string ws)
        {
            id = "";
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            id = Convert.ToString(GUI.CApp.bll.GetSingleValue("C_SEC_LOG_BIT_TIEMPO", qp, "PDV"));

            qp.AddReplaceParam("pDocumento", documento);
            qp.AddReplaceParam("pWs", ws);
            qp.AddReplaceParam("pID_INT", id);
            // Llama el procedimiento que almacena los datos del intento de recarga en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_BITAC_TIEMP", qp, "PDV");
        }

        //Actualiza el tiempo final de la consulta de MisPuntos
        private void BitacoraTiempoF(string ID)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pID_INT", ID);
            // Llama el procedimiento que almacena el estado de correcto de la recarga en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_BITAC_TIEMP_C", qp, "PDV");
        }

        /// <summary>Activa la Giftcard con el proveedor </summary>
        /// <param name="Tarj"></param>/// <param name="monto"></param>
        private void ActGiftCardPTS(string Tarj, string Monto)
        {
            //Envia los datos al proveedor
            string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&tipo_carga_monto=2&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + Tarj;
            PData += "&monto=" + Monto;
            string info = RequestPOST(varUrlPts + "activar_tarjeta_regalo.inc.php", PData);
            info = "T:" + Tarj + ", " + info.Trim();
            string[] datos = info.Split(' ');

            if (datos.Length > 2)
            {
                //tarjetas activas
                if (datos[1].ToString() != "10")
                {
                    //CApp.ShowMessage(info, "GiftCard - activar_tarjeta_regalo.inc.php", true);
                    //BitacoraErrorWS("WS=" + varUrlPts + "activar_tarjeta_regalo.inc.php " + info, PData);
                    throw new System.InvalidOperationException(info + "GiftCard - activar_tarjeta_regalo.inc.php");
                }
                //else
                //{
                //Activa la tarjeta en nuestra Base d Datos
                //Utils.QueryParams qp = new QueryParams();
                //qp.AddReplaceParam("TARJETA", this.txtTarjeta.Text);                    
                //qp.AddReplaceParam("DOCPEDIDO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                //GUI.CApp.bll.ExecuteSql("WMS_P_ACTGIFTCARD", qp, "PDV");
                //CApp.ShowMessage("Tarjeta activada exitosamente", "GiftCard - activar_tarjeta_regalo.inc.php", true);
                //}
            }
            else
            {
                //CApp.ShowMessage(info, "GiftCard - activar_tarjeta_regalo.inc.php", true);
                //BitacoraErrorWS("WS=" + varUrlPts + "activar_tarjeta_regalo.inc.php " + info, PData);
                throw new System.InvalidOperationException(info + "GiftCard - activar_tarjeta_regalo.inc.php");
            }
        }

        /// <summary>Recarga la Giftcard con el proveedor </summary>
        /// <param name="Tarj"></param>/// <param name="monto"></param>
        private void RecGiftCardPTS(string Tarj, string Monto)
        {
            //Envia los datos al proveedor
            string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + Tarj;
            PData += "&monto_recarga=" + Monto;
            string info = RequestPOST(varUrlPts + "ws_recarga_tarjeta_regalo.php", PData);
            info = "T:" + Tarj + ", " + info.Trim();
            string[] datos = info.Split(' ');

            if (datos.Length > 2)
            {
                //tarjetas activas
                if (datos[1].ToString() != "10")
                {
                    // CApp.ShowMessage(info, "GiftCard - ws_recarga_tarjeta_regalo.php", true);
                    //BitacoraErrorWS("WS=" + varUrlPts + "ws_recarga_tarjeta_regalo.php " + info, PData);
                    throw new System.InvalidOperationException(info + "GiftCard - ws_recarga_tarjeta_regalo.php");
                }
                //else
                //{
                //Activa la tarjeta en nuestra Base d Datos
                //Utils.QueryParams qp = new QueryParams();
                //qp.AddReplaceParam("TARJETA", this.txtTarjeta.Text);                    
                //qp.AddReplaceParam("DOCPEDIDO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                //GUI.CApp.bll.ExecuteSql("WMS_P_ACTGIFTCARD", qp, "PDV");
                //CApp.ShowMessage("Tarjeta activada exitosamente", "GiftCard - activar_tarjeta_regalo.inc.php", true);
                //}
            }
            else
            {
                //CApp.ShowMessage(info, "GiftCard - ws_recarga_tarjeta_regalo.php", true);
                //BitacoraErrorWS("WS=" + varUrlPts + "ws_recarga_tarjeta_regalo.php " + info, PData);
                throw new System.InvalidOperationException(info + "GiftCard - ws_recarga_tarjeta_regalo.php");
            }
        }

        /// <summary>Consulta el saldo de la GiftCard</summary>
        /// <param name="ptarjeta"></param>
        /// <returns></returns>
        private string Consultar_SALDO(string ptarjeta)
        {

            string info = RequestPOST(varUrlPts + "consultar_tarjeta_regalo.inc.php", "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&numero_tarjeta=" + ptarjeta);
            string[] datos = info.Split(' ');
            if (datos.Length > 4)
            {
                if (datos[3] == "10")
                {
                    string saldo = datos[2].ToString();

                    if (saldo.LastIndexOf('.') > 0)
                    {
                        saldo = saldo.Substring(0, saldo.LastIndexOf('.'));
                    }
                    return saldo;
                }
                else
                {//se puede almacenar el error --falta
                    return "";
                }
            }
            else
            {
                return "";
            }
        }

        #endregion

        #region Activar GiftCards

        /// <summary>Recorre el pedido y envia los giftcards al proveedor para que los active </summary>
        private void ActGiftCardsPTS()
        {
            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
            {
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("pDOCPEDIDO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                //Selecciona las GiftCards del pedido
                DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "GiftCards", qp);
                foreach (DataRow fila in dsB.Tables[0].Rows)
                {
                    if (fila[2].ToString() != string.Empty && fila[3].ToString() != string.Empty)
                    {
                        fila.Delete();
                    }
                    else
                    {
                        ActGiftCardPTS(fila[0].ToString(), fila[1].ToString());
                    }
                }
            }
        }

        /// <summary>Recorre el pedido y envia los giftcards al proveedor para que los recargue </summary>
        private void RecGiftCardsPTS()
        {
            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
            {
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("pDOCPEDIDO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                //Selecciona las GiftCards del pedido
                DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "GiftCardsRec", qp);
                foreach (DataRow fila in dsB.Tables[0].Rows)
                {
                    if (fila[2].ToString() != string.Empty && fila[3].ToString() != string.Empty)
                    {
                        fila.Delete();
                    }
                    else
                    {
                        RecGiftCardPTS(fila[0].ToString(), fila[1].ToString());
                    }
                }
            }
        }

        /// <summary>Recorre el pedido y actualiza el numero de factura para activar los giftcards</summary>
        private void ActGiftCardsFact()
        {
            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
            {
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("pDOCPEDIDO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                //Selecciona las GiftCards del pedido
                DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "GiftCards", qp);
                foreach (DataRow fila in dsB.Tables[0].Rows)
                {
                    //TARJETA&&', &&DOCPEDIDO&&, &&DOCFACTURA
                    QueryParams qp1 = new QueryParams();
                    qp1.AddReplaceParam("pTARJETA", fila[0].ToString());
                    qp1.AddReplaceParam("pDOCPEDIDO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    qp1.AddReplaceParam("pDOCFACTURA", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    GUI.CApp.bll.ExecuteSql("WMS_P_FACTGIFTCARD", qp1, "PDV");
                }
            }
        }

        /// <summary>Recorre el pedido y actualiza el numero de factura para recargar y el saldo de los giftcards</summary>
        private void RecGiftCardsFact()
        {
            if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
            {
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("pDOCPEDIDO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                //Selecciona las GiftCards del pedido
                DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "GiftCardsRec", qp);
                foreach (DataRow fila in dsB.Tables[0].Rows)
                {
                    string saldo = Consultar_SALDO(fila[0].ToString());
                    if (saldo == "")
                        saldo = "-1";
                    //'&&pTARJETA&&', &&pDOCUMENTO&&,&&pFACTURA&&, &&pSALDO&&, '&&pUSUARIO&&'
                    QueryParams qp1 = new QueryParams();
                    qp1.AddReplaceParam("pTARJETA", fila[0].ToString());
                    qp1.AddReplaceParam("pDOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    qp1.AddReplaceParam("pFACTURA", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    qp1.AddReplaceParam("pSALDO", saldo);
                    qp1.AddReplaceParam("pUSUARIO", GUI.CApp.usuario);
                    GUI.CApp.bll.ExecuteSql("WMS_P_ACTRECGIFTCARD", qp1, "PDV");
                }
            }
        }

        #endregion

        #region CrediCuotas Ekono

        //Crea una transaccion de pago por CrediCUOTAS
        private bool Crear_Pago_CREDICUOTSEK(string REFER, bool pEs_factura = false)
        {
            LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
            bool estad = false;
            string vImprimir_Voucher = Helpers.Nvl(CApp.GetParam("GVCF"), "S").ToString();

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pREFERENCIA", this.cCredCuotsEk.ref_sec);
            //Selecciona lOS DATOS DEL LAS CREDICUOTAS EKONO
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "CCREDCUOTSEK", qp);
            foreach (DataRow fila in dsB.Tables[0].Rows)
            {
                estad = Crear_Pago_CREDICUOTSEK(Convert.ToString(fila[0]), Convert.ToString(fila[1]), Convert.ToString(fila[2]), REFER, Convert.ToString(fila[3]), Convert.ToString(fila[4]));
                //   estad = Crear_Pago_CREDICUOTSEK("2", Convert.ToString(fila[1]), Convert.ToString(fila[2]), REFER, Convert.ToString(fila[3]), Convert.ToString(fila[4]));
                EventLogManuales.WriteLog("", Convert.ToString("Log_valor de  estad = Crear_Pago_CREDICUOTSEK " + estad.ToString()));

                if (pEs_factura)
                {
                    if (vImprimir_Voucher == "S")
                    {
                        if (estad)
                        {
                            imprimirVCREDITOEK(Convert.ToString(fila[4]));
                        }
                    }
                }
                else
                {
                    if (estad)
                    {
                        imprimirVCREDITOEK(Convert.ToString(fila[4]));
                    }
                }
            }
            return estad;
        }

        //Crea una transaccion de pago por CrediCUOTAS
        private bool Crear_Pago_CREDICUOTSEK(string sucursal, string strid, string strvkrCompr, string id, string fecha, string refe)
        {
            bool corecto = false;
            try
            {
                //WEB SERVICE CON SUS MÉTODOS
                GenesisCnx.Service wsGenesis = new GenesisCnx.Service();
                wsGenesis.Url = varURLE;
                RegBDCONSPAGO(sucursal, CApp.usuario, Program.Caja.ToString(), Program.Jornada.ToString(), strid, strvkrCompr, id, refe);
                XmlNode nod = wsGenesis.RealizaCompra(sucursal, CApp.usuario, Program.Caja.ToString(), Program.Jornada.ToString(), strid, strvkrCompr, fecha, varUSRG, varPWDG);
                XmlNodeList list = nod.SelectNodes("/datos");
                foreach (XmlNode DATO in list)
                {
                    //   MessageBox.Show(DATO.InnerXml);
                    if (DATO.HasChildNodes)
                    {
                        XmlNode id_trans = DATO.SelectSingleNode("id_trans");
                        XmlNode tran_cedula = DATO.SelectSingleNode("tran_cedula");
                        XmlNode tran_nombre = DATO.SelectSingleNode("tran_nombre");
                        XmlNode tran_monto = DATO.SelectSingleNode("tran_monto");
                        XmlNode tran_fecha = DATO.SelectSingleNode("tran_fecha");
                        XmlNode err_cod_estado = DATO.SelectSingleNode("err_cod_estado");
                        XmlNode err_descripcion = DATO.SelectSingleNode("err_descripcion");
                        XmlNode cod_estado = DATO.SelectSingleNode("cod_estado");
                        XmlNode desc_estado = DATO.SelectSingleNode("desc_estado");


                        string pid_trans = "", ptran_cedula = "", ptran_nombre = "", ptran_monto = "", ptran_fecha = "",
                            perr_cod_estado = "", perr_descripcion = "", pcod_estado = "", pdesc_estado = "";

                        if (id_trans != null)
                            pid_trans = id_trans.InnerText;
                        if (tran_cedula != null)
                            ptran_cedula = tran_cedula.InnerText;
                        if (tran_nombre != null)
                            ptran_nombre = tran_nombre.InnerText;
                        if (tran_monto != null)
                            ptran_monto = tran_monto.InnerText;
                        if (tran_fecha != null)
                            ptran_fecha = tran_fecha.InnerText;
                        if (err_cod_estado != null)
                            perr_cod_estado = err_cod_estado.InnerText;
                        if (err_descripcion != null)
                            perr_descripcion = err_descripcion.InnerText;
                        if (cod_estado != null)
                            pcod_estado = cod_estado.InnerText;
                        if (desc_estado != null)
                            pdesc_estado = desc_estado.InnerText;

                        //                        if (err_cod_estado.InnerText == "1")
                        if (perr_cod_estado == "1" || perr_cod_estado == "")
                        {//CONSULTA CORRECTA 
                            if (pcod_estado == "1" || pcod_estado == "")
                            {//CONSULTA CORRECTA                               
                                corecto = true;
                                RegBDRESPPAGO(id, pcod_estado, pdesc_estado, perr_cod_estado, perr_descripcion, pid_trans, ptran_cedula,
                                ptran_nombre, ptran_fecha, ptran_monto, "", "C", refe);
                            }
                            else
                            { //ERROR CONSULTA  cod_estado 
                                corecto = false;
                                CApp.ShowMessage(pdesc_estado, "Error Credie", false);
                                RegBDRESPPAGO(id, pcod_estado, pdesc_estado, perr_cod_estado, perr_descripcion, pid_trans, ptran_cedula,
                                ptran_nombre, ptran_fecha, ptran_monto, "", "E", refe);
                            }
                        }
                        else
                        { //ERROR CONSULTA  errcodestado
                            corecto = false;
                            CApp.ShowMessage(perr_descripcion, "Error Credie", false);
                            RegBDRESPPAGO(id, pcod_estado, pdesc_estado, perr_cod_estado, perr_descripcion, pid_trans, ptran_cedula,
                                ptran_nombre, ptran_fecha, ptran_monto, "", "E", refe);
                        }
                    }
                    else
                    {
                        corecto = false;
                        CApp.ShowMessage("No se obtiene datos", "Error Credie", false);
                        RegBDERRORCREDEK("", "", "", "", refe, "No se obtiene datos del XML", "PAGO");
                        //RegistroBDERRORCONSULTA(refer, txtId.Text, strvkrCompr, "No se obtiene datos en el XML");                        
                    }
                }
            }
            catch (Exception ex)
            {
                corecto = false;
                //RegistroBDERRORCONSULTA(refer, txtId.Text, strvkrCompr, ex.Message);
                RegBDERRORCREDEK("", "", "", "", refe, ex.Message, "PAGO");
            }
            return corecto;
        }

        //Registrar en BD la consulta de un crédito
        private void RegBDCONSPAGO(string sucursal, string usuario, string Caja, string Jornada, string strid, string strvlrCompr, string ID, string referencia)
        { /*
           &&pSUCURSAL&& , '&&pUSUARIO&&', &&pJORNADA&&, 
                    &&pCAJA&&, '&&pIDCLIENTE&&' , &&pVALORCOMPRA&&, &&pID
           * 
           *   EKO_P_CREDITOEK_ICPAGS(&&pSUCURSAL&& , '&&pUSUARIO&&', &&pJORNADA&&, 
                    &&pCAJA&&, '&&pIDCLIENTE&&' , &&pVALORCOMPRA&&, &&pID&&);
           */
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();

            if (sucursal == "")
            {
                qp.AddReplaceParam("pSUCURSAL", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pSUCURSAL", sucursal);
            }
            if (usuario == "")
            {
                qp.AddReplaceParam("pUSUARIO", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pUSUARIO", usuario);
            }
            if (Jornada == "")
            {
                qp.AddReplaceParam("pJORNADA", "0");
            }
            else
            {
                qp.AddReplaceParam("pJORNADA", Jornada);
            }
            if (Caja == "")
            {
                qp.AddReplaceParam("pCAJA", "0");
            }
            else
            {
                qp.AddReplaceParam("pCAJA", Caja);
            }
            if (strid == "")
            {
                qp.AddReplaceParam("pIDCLIENTE", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pIDCLIENTE", strid);
            }
            if (strvlrCompr == "")
            {
                qp.AddReplaceParam("pVALORCOMPRA", "0");
            }
            else
            {
                qp.AddReplaceParam("pVALORCOMPRA", strvlrCompr);
            }
            if (ID == "")
            {
                qp.AddReplaceParam("pID", "0");
            }
            else
            {
                qp.AddReplaceParam("pID", ID);
            }
            if (referencia == "")
            {
                qp.AddReplaceParam("pREFERENCIA", "0");
            }
            else
            {
                qp.AddReplaceParam("pREFERENCIA", referencia);
            }

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

        //Registrar en BD la consulta de un crédito
        private void RegBDRESPPAGO(string pID, string pCOD_COMPRA, string pDESC_COMPR, string pCOD_ERROR, string pDESC_ERROR, string pID_TRANS_PROV,
                   string pNIT_CLIENTE, string pNOMBRE, string pFECHA_TRANS, string pVALORCOMPRA, string pLEYENDA, string pESTADO, string pREFERENCIA)
        { /*
           (&&pID&&, &&pCOD_COMPRA&&, '&&pDESC_COMPR&&', 
                    &&pCOD_ERROR&& , '&&pDESC_ERROR&&' , '&&pID_TRANS_PROV&&', 
                    '&&pNIT_CLIENTE&&', '&&pNOMBRE&&', '&&pFECHA_TRANS&&', 
                    &&pVALORCOMPRA&&, '&&pLEYENDA&&');
           */
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();

            if (pID == "")
            {
                qp.AddReplaceParam("pID", "0");
            }
            else
            {
                qp.AddReplaceParam("pID", pID);
            }
            if (pCOD_COMPRA == "")
            {
                qp.AddReplaceParam("pCOD_COMPRA", "0");
            }
            else
            {
                qp.AddReplaceParam("pCOD_COMPRA", pCOD_COMPRA);
            }
            if (pDESC_COMPR == "")
            {
                qp.AddReplaceParam("pDESC_COMPR", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pDESC_COMPR", pDESC_COMPR);
            }
            if (pCOD_ERROR == "")
            {
                qp.AddReplaceParam("pCOD_ERROR", "0");
            }
            else
            {
                qp.AddReplaceParam("pCOD_ERROR", pCOD_ERROR);
            }
            if (pDESC_ERROR == "")
            {
                qp.AddReplaceParam("pDESC_ERROR", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pDESC_ERROR", pDESC_ERROR);
            }
            if (pID_TRANS_PROV == "")
            {
                qp.AddReplaceParam("pID_TRANS_PROV", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pID_TRANS_PROV", pID_TRANS_PROV);
            }
            if (pNIT_CLIENTE == "")
            {
                qp.AddReplaceParam("pNIT_CLIENTE", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pNIT_CLIENTE", pNIT_CLIENTE);
            }
            if (pNOMBRE == "")
            {
                qp.AddReplaceParam("pNOMBRE", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pNOMBRE", pNOMBRE);
            }
            if (pFECHA_TRANS == "")
            {
                qp.AddReplaceParam("pFECHA_TRANS", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pFECHA_TRANS", pFECHA_TRANS);
            }
            if (pVALORCOMPRA == "")
            {
                qp.AddReplaceParam("pVALORCOMPRA", "0");
            }
            else
            {
                qp.AddReplaceParam("pVALORCOMPRA", pVALORCOMPRA);
            }
            if (pLEYENDA == "")
            {
                qp.AddReplaceParam("pLEYENDA", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pLEYENDA", pLEYENDA);
            }
            if (pESTADO == "")
            {
                qp.AddReplaceParam("pESTADO", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pESTADO", pESTADO);
            }
            if (pREFERENCIA == "")
            {
                qp.AddReplaceParam("pREFERENCIA", "0");
            }
            else
            {
                qp.AddReplaceParam("pREFERENCIA", pREFERENCIA);
            }
            //Jornada
            qp.AddReplaceParam("pJORNADA", Program.Jornada.ToString());
            //DOCUMENTO
            if (DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                qp.AddReplaceParam("pDOC", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
            }
            else
            {
                //qp.AddReplaceParam("pDOC", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());//FACTURA
                qp.AddReplaceParam("pDOC", DsRecibo.DOC_ABONO_DOCUMENTOS[0].RECIBO.ToString());//RECIBO
            }

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

        //Registrar en BD UN ERROR DE CREDITO EKONO
        private void RegBDERRORCREDEK(string pERR_COD_ESTADO, string pERR_DESC, string pCOD_ESTADO,
            string pDESC_ESTADO, string pREFERENCIA, string pERROR, string pWS)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();

            if (pERR_COD_ESTADO == "")
            {
                qp.AddReplaceParam("pERR_COD_EST", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pERR_COD_EST", pERR_COD_ESTADO);
            }
            if (pERR_DESC == "")
            {
                qp.AddReplaceParam("pERR_DESC", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pERR_DESC", pERR_DESC);
            }
            if (pCOD_ESTADO == "")
            {
                qp.AddReplaceParam("pCOD_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pCOD_ESTADO", pCOD_ESTADO);
            }
            if (pDESC_ESTADO == "")
            {
                qp.AddReplaceParam("pDESC_ESTADO", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pDESC_ESTADO", pDESC_ESTADO);
            }
            if (pERROR == "")
            {
                qp.AddReplaceParam("pERROR", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pERROR", pERROR);
            }
            if (pWS == "")
            {
                qp.AddReplaceParam("pWS", DBNull.Value.ToString());
            }
            else
            {
                qp.AddReplaceParam("pWS", pWS);
            }
            if (pREFERENCIA == "")
            {
                qp.AddReplaceParam("pREFERENCIA", "0");
            }
            else
            {
                qp.AddReplaceParam("pREFERENCIA", pREFERENCIA);
            }
            //Jornada
            qp.AddReplaceParam("pJORNADA", Program.Jornada.ToString());


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

        #region imprimirVoucher
        private void imprimirVCREDITOEK(string id)
        {
            LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
            EventLogManuales.WriteLog("", Convert.ToString("Log_valor de id cada ves q pasa por imprimirVCREDITOEK" + id));

            try
            {
                object FormatoTipoImpresion = null;
                QueryParams qparams = new LLNet.Utils.QueryParams();
                qparams = new LLNet.Utils.QueryParams();
                qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VFCE");
                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 Pago con Credie Ekono", 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
                {
                    int vTiempo = Convert.ToInt32(Helpers.Nvl(CApp.GetParam("TEID"), "3000"));

                    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
                    Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                    System.Diagnostics.Process.Start(startInfo);

                    #region Imprimir copia voucher
                    string valor = Helpers.Nvl(CApp.GetParam("HCV"), "").ToString();

                    LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
                    EventLogManuales.WriteLog("", Convert.ToString("Log_valor de valor Hcv " + valor));

                    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
                        Thread.Sleep(vTiempo); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                        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

        #endregion

        #region Impresion de Vales para RIFA

        private void printCoupon(decimal vVale)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VAT");

            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();

            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

            if (dsDocTienda.DOMAINS.Count > 0)
            {
                switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                {
                    case 1:
                        printCouponPreimpreso(vVale, dsDocTienda.DOMAINS[0].RV_MPCC03);
                        break;
                    default:
                        printCouponTicket(vVale, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                        break;
                }
            }
        }

        private static void printCouponPreimpreso(decimal vVale, string codigoReporte)
        {
            Hashtable ht = new Hashtable();
            Utils.QueryParams QueryParams = new LLNet.Utils.QueryParams();
            QueryParams.AddReplaceParam("VALE", vVale.ToString());
            ht.Add("TDA_V_VALES", QueryParams);

            try
            {
                LLNet.Reports.BaseReports.XRInfo Info;
                Info = Reports.BaseReports.XRBase.SetInfo("VALE");

                RegistryKey key = Registry.CurrentUser;
                key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Printers\Preimpresos", true);

                string printerVale = "";

                if (key != null)
                    printerVale = Utils.Helpers.ObjToStr(key.GetValue("Vale", ""));

                if (printerVale != string.Empty)
                    Info.PrinterName = printerVale;

                LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                xrBase.Parametros = Info;
                xrBase.BllInstance = GUI.CApp.bll;
                xrBase.ExePath = GUI.CApp.ExeDir;
                xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
            }
            catch
            { }
        }

        private static void printCouponTicket(decimal vVale, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = GUI.CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);

            string printerFactura = "";

            if (key != null)
                printerFactura = Utils.Helpers.ObjToStr(key.GetValue("Vale", ""));

            if (printerFactura != string.Empty)
                prntMess.Impresora = printerFactura;
            else
                prntMess.Impresora = impresora;
            prntMess.TipoFormato = Impresion.TipoFormato.Vales;
            prntMess.Llave1 = Convert.ToInt64(vVale);
            prntMess.Copias = copias;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);
            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                GUI.CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }

        #endregion

        #region WRLG. DESARROLLO DE GARANTIAS

        private bool IngresarGarantias(QueryParams qp)
        {
            formatoGarantia = string.Empty;

            if (qp.Count == 0) return true;
            Int32 cntProductos = Convert.ToInt32(CApp.bll.GetSingleValue("ProductosConGarantia", qp, "PDV"));

            if (cntProductos == 0)
                return true;
            else
            {
                CApp.bll.ExecuteSql("GenerarGarantiasdeProducto", qp, "PDV");
                using (frmGarantias fGar = new frmGarantias())
                {
                    fGar.Init(new object[] { qp });
                    fGar.ShowDialog();
                    if (fGar.DialogResult == DialogResult.OK)
                    {
                        formatoGarantia = fGar.comboBoxEdit1.SelectedItem.ToString();
                    }

                    return (fGar.DialogResult == DialogResult.OK);
                }
            }
        }

        #endregion


        private void ConvertirMontoAMonedaBase()
        {
            long MBase = Helpers.ObjToInt64(CApp.bll.GetSingleValue("MonedaBase", "PDV"));
            for (int cont = 0; cont < DsRecibo.WMS_PAGO_DOCUMENTOS.Count; cont++)
            {
                DsRecibo.WMS_PAGO_DOCUMENTOS[cont].MBASE = DsRecibo.WMS_PAGO_DOCUMENTOS[cont].MONEDA;
                DsRecibo.WMS_PAGO_DOCUMENTOS[cont].MONEDA = MBase;
            }

        }

        private void frmPayments_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Alt && e.KeyCode == Keys.F4)
                e.Handled = true;

            if (e.Modifiers == Keys.Alt)
            {
                switch (e.KeyCode)
                {
                    case Keys.F6:
                        if (btnDepositos.Visible)
                            btnDepositos_Click(null, null);
                        e.Handled = true;
                        break;
                    case Keys.F7:
                        if (btnEnganche.Visible)
                            btnEnganche_Click(null, null);
                        break;
                    case Keys.F8:
                        if (btnProntoPago.Visible)
                            btnProntoPago_Click(null, null);
                        break;
                    case Keys.F10:
                        if (btnObservacion.Visible)
                            if (this.btnObservacion.Enabled)//IGF
                                btnObservacion_Click(null, null);
                        break;
                    case Keys.V:
                        chkDonarVuelto.Checked = !chkDonarVuelto.Checked && chkDonarVuelto.Visible;
                        break;
                    case Keys.O:
                        if (btnPoints.Visible)
                            btnPoints_Click(null, null);
                        break;
                    case Keys.P:
                        if (btnApartado.Visible)
                            btnApartado_Click(null, null);
                        break;
                    case Keys.A:
                        if (btnAsociaciones.Visible)
                            btnAsociaciones_Click(null, null);
                        break;
                    case Keys.G://IGF
                        if (btnGiftCard.Visible)
                            btnGiftCard_Click(null, null);
                        break;
                    case Keys.C:
                        if (btnCredix.Visible)
                            btnCredix_Click(null, null);
                        break;
                    case Keys.M:
                        if (btnMonederoAlo.Visible)
                            btnMonederoAlo_Click(null, null);
                        break;
                    case Keys.E:
                        if (btnCredCuotsEk.Visible)
                            btnCredCuotsEk_Click(null, null);
                        break;
                    case Keys.F:
                        if (btnFlexi.Visible)
                            btnFlexi_Click(null, null);
                        break;
                    case Keys.R:
                        if (chkFacturaElect.Enabled && chkFacturaElect.Visible)
                        {
                            if (chkFacturaElect.Checked)
                            {
                                chkFacturaElect.Checked = false;
                            }
                            else
                            {
                                chkFacturaElect.Checked = true;
                            }
                        }
                        break;
                    case Keys.S:
                        if (chkAsociarCorreo.Checked)
                            chkAsociarCorreo.Checked = false;
                        else
                            chkAsociarCorreo.Checked = true;
                        break;
                    case Keys.I:
                        if (btnSINPE.Visible)
                            btnSINPE_Click(null, null);
                        break;
                    case Keys.Z:
                        if (btnZunify.Visible)
                            btnZunify_Click(null, null);
                        break;

                }
            }
            else
            {
                switch (e.KeyCode)
                {
                    case Keys.F2: // tarjeta de credito
                        if (btnCreditCard.Visible)
                        {
                            decimal total = calcTotal();
                            if (total > 0)
                                simpleButton2_Click(null, null);
                            else
                                CApp.ShowMessage("No se pueden agregar más pagos porque el total a pagar ya ha sido abonado", "Cobros y Facturación", true);
                        }
                        break;
                    case Keys.F3: // efectivo
                        if (btnCash.Visible)
                            btnCobrar_Click(null, null);
                        break;
                    case Keys.F4: // anticipos
                        if (btnAnticipos.Visible)
                            btnAnticipos_Click(null, null);
                        break;
                    case Keys.F5: // credito
                        if (btnCredit.Visible)
                            btnCredit_Click(null, null);
                        break;
                    case Keys.F6: // cheque
                        if (btnCheck.Visible)
                            btnCheck_Click(null, null);
                        break;
                    case Keys.F7: // exencion impuesto
                        if (btnExencion.Visible)
                            btnExencion_Click(null, null);
                        break;
                    case Keys.F8: // vale de tercero
                        if (btnVale.Visible)
                            btnValeTercero_Click(null, null);
                        break;
                    case Keys.F9:
                        btnTasaCambio_Click(null, null);
                        break;
                    case Keys.F10: // Datos de la Factura
                        if (btnFactManual.Visible)
                            simpleButton1_Click(null, null);
                        break;
                    case Keys.F11: // agregar pago desde cualquier tipo
                        btnAgregarPago_Click(null, null);
                        break;
                    case Keys.F12: // facturar
                        btnFacturar_Click(null, null);
                        break;
                    case Keys.Escape:
                        if (this.btnCancelar.Enabled)
                        {
                            btnCancelar_Click(null, null);
                        }
                        break;
                }
            }
        }

        private static void checkClientDialog()
        {
            // Si es obligatorio pedir datos del cliente al crear un pedido
            if (CApp.GetParam("PCCP").ToString() == "X")
                Program.FrmMainPos.btnDatosCliente_Click(null, null);
        }

        private void btnCredit_Click(object sender, EventArgs e)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("SOCIO", DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());

            decimal disponible = Convert.ToDecimal(CApp.bll.GetSingleValue("AvailableCredit", qp, "PDV"));

            if (DsPedido.WMS_DOCUMENTOS[0].TOTAL - Convert.ToDecimal(rowAbonado.Properties.Value) > disponible)
            {
                CApp.ShowMessage("El total de la factura excede al crédito disponible para el cliente", "Cobros y Facturación", true);

                if (!CApp.ValidateAccess("AutFacSLimite", "Autorización de Facturas Sobre Límite de Crédito"))
                    return;
            }

            if (DsPedido.WMS_DOCUMENTOS[0].TOTAL == Convert.ToDecimal(rowAbonado.Properties.Value))
            {
                CApp.ShowMessage("La factura ya fue abonada en su totalidad, por lo que no puede dejarse a crédito", "Cobros y Facturación", true);
            }
            else
            {
                if (CApp.ShowMessage("Esta seguro de dejar la factura a crédito?", "Cobros y Facturación", true, true) == DialogResult.OK)
                {
                    if (DsFactura.WMS_DOCUMENTOS.Count == 0)
                    {
                        QueryParams qpX = new QueryParams();
                        decimal DocProcesado = 0;
                        qpX.Clear();
                        qpX.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        DocProcesado = Convert.ToDecimal(CApp.bll.GetSingleValue("DocumentoProcesado", qpX, "PDV"));

                        if (DocProcesado > 0)
                        {
                            CApp.ShowMessage("Este Pedido ya fue Facturado, porfavor revise su Jornada", "Documento Procesado", true);
                            return;
                        }

                        decimal inv = CreateInvoice();
                        if (inv == -1)
                            return;
                    }

                    DsFactura.WMS_DOCUMENTOS[0].SALDO = DsPedido.WMS_DOCUMENTOS[0].TOTAL - Convert.ToDecimal(rowAbonado.Properties.Value);
                    DsFactura.WMS_DOCUMENTOS[0].FECHA_VENCIMIENTO = DateTime.Today.AddDays(Convert.ToDouble(Helpers.Nvl(DsPedido.WMS_SOCIOS[0]["PLAZO_PAGO"], 0)));


                    object[] objFac = new object[] { DsPedido, DsFactura, DsRecibo, Program.Jornada, dsNotaCredito, DsVale, Program.FrmMainPos.DsVale };

                    try
                    {
                        #region WRLG. DESARROLLO DE GARANTIAS

                        qp.Clear();
                        qp.AddReplaceParam("DOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                        if (!IngresarGarantias(qp))
                        {
                            CApp.ShowMessage("No es posible facturar sin tener los datos de garantías a generar", "Cobros y Facturación", true);
                            return;
                        }

                        #endregion


                        #region Envia los pagos de CrediCuotas al Proveedor
                        /*
                        try
                        {
                            foreach (DataRow fil in DsRecibo.WMS_PAGO_DOCUMENTOS)
                            {
                                //si paga con Credicuotas Ekono
                                if (fil[2].ToString() == "34")
                                {//si es tipo de Pago GiftCard
                                    bool est = false;
                                    est = Crear_Pago_CREDICUOTSEK(cCredCuotsEk.ref_sec);
                                    if (est == false)
                                        return;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            GUI.CApp.ShowMessage(ex.Message, "Error Credie Ekono", true);
                            return;
                        }
                        */
                        #endregion



                        #region Enviar datos al proveedor GiftCards
                        //if (Helpers.Nvl(CApp.GetParam("DPTS"), "N").ToString() != "S")
                        //{
                        try
                        {
                            //Envia los GiftCards al Proveedor para que los active
                            ActGiftCardsPTS();
                        }
                        catch (Exception ex)
                        {
                            string msjErr = ex.Message.ToUpper();
                            msjErr = msjErr.Replace("'", " ");

                            CApp.ShowMessage(msjErr, "GiftCard", true);
                            if (msjErr.Contains("TIEMPO DE ESP") || msjErr.Contains("GATEWA") || msjErr.Contains("UNDERLYING CONNECTION") || msjErr.Contains("HAS TIMED OUT"))
                            {
                                if (msjErr.Length > 50)
                                {
                                    BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                                else
                                {
                                    BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                            }
                            else
                            {
                                if (msjErr.Length > 50)
                                {
                                    BitacoraErrorWS(varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                                else
                                {
                                    BitacoraErrorWS(varUrlPts + "activar_tarjeta_regalo.inc.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                                return;
                            }
                        }

                        try
                        {
                            //Envia los GiftCards al Proveedor para realice la recarga                           
                            RecGiftCardsPTS();
                        }
                        catch (Exception ex)
                        {
                            string msjErr = ex.Message.ToUpper();
                            msjErr = msjErr.Replace("'", " ");

                            CApp.ShowMessage(msjErr, "GiftCard", true);
                            if (msjErr.Contains("TIEMPO DE ESP") || msjErr.Contains("GATEWA") || msjErr.Contains("UNDERLYING CONNECTION") || msjErr.Contains("HAS TIMED OUT"))
                            {
                                if (msjErr.Length > 50)
                                {
                                    BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                                else
                                {
                                    BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                            }
                            else
                            {
                                if (msjErr.Length > 50)
                                {
                                    BitacoraErrorWS(varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr.Substring(0, 49), "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                                else
                                {
                                    BitacoraErrorWS(varUrlPts + "ws_recarga_tarjeta_regalo.php" + msjErr, "Pedido: " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                                }
                                return;
                            }
                        }
                        // }
                        #endregion

                        /****************Cambio Factura Electrónica*******************/
                        try
                        {
                            if (Convert.ToString(DsPedido.WMS_DOCUMENTOS[0].DIRECCION2) != "")
                            {
                                DsFactura.WMS_DOCUMENTOS[0].DIRECCION2 = DsPedido.WMS_DOCUMENTOS[0].DIRECCION2;
                            }
                        }
                        catch (StrongTypingException) { }
                        /****************Cambio Factura Electrónica*******************/

                        CApp.bll.RemoteExecute("PDV", "Facturacion", objFac);

                        qp.Clear();
                        qp.AddReplaceParam("DOCUMENTO", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                        string MarcarFact = CApp.GetParam("MDSE").ToString();

                        if (MarcarFact.ToUpper() == "SI")
                        {
                            qp.AddReplaceParam("SOCIO", DsFactura.WMS_DOCUMENTOS[0].SOCIO.ToString());
                            string SocioNoExento = CApp.bll.GetSingleValue("SocioNoExcento", qp, "PDV").ToString();

                            if (Convert.ToInt32(SocioNoExento) > 0)
                                CApp.bll.ExecuteSql("MarcaFactura", qp, "PDV");


                        }

                        string facturaExenta = CApp.bll.GetSingleValue("TieneExencionImpuestos", qp, "PDV").ToString();
                        if (facturaExenta == "1")
                        {
                            CApp.bll.ExecuteSql("UpdateImpuestos", qp, "PDV");
                        }

                    }
                    catch (Exception ex)
                    {
                        if (ex.Message.IndexOf("DOCU_UK01") > 0)
                            CApp.ShowMessage("Uno de los documentos a generar ya existe, verifique las secuencias de documentos", "Facturación", true);
                        else
                            CApp.ShowMessage(ex.Message, "Facturación", true);
                        return;
                    }

                    DsPedido = objFac[0] as Model.PDV.DsPDV;
                    DsFactura = objFac[1] as Model.PDV.DsPDV;
                    DsRecibo = objFac[2] as Model.PDV.DsPDV;
                    DsVale = objFac[5] as Model.PDV.DsPDV;

                    long documento = (long)DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                    string sdocumento = DsFactura.WMS_DOCUMENTOS[0]["SUBTIPO_DOCUMENTO"].ToString();

                    if (DsFactura.WMS_DOCUMENTOS.Count > 0)
                    {
                        ActGiftCardsFact();
                    }
                    else
                        CApp.ShowMessage("No se encuentra la factura para activar las GiftCards", "Cobros y Facturación", true);

                    if (DsFactura.WMS_DOCUMENTOS.Count > 0)
                    {
                        RecGiftCardsFact();
                    }
                    else
                        CApp.ShowMessage("No se encuentra la factura para recargar las GiftCards", "Cobros y Facturación", true);

                    startPrinting001:
                    try
                    {
                        /****************Cambio Factura Electrónica*******************/
                        mTrama(documento);

                        printInvoice(documento, sdocumento);
                        /****************Cambio Factura Electrónica*******************/
                    }
                    catch (Exception ex)
                    {
                        if (CApp.ShowMessage("Error en la impresión de facturas, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                            goto startPrinting001;
                    }

                    printDocuments(documento);

                    this.Hide();
                    this.Close();
                    newOrder();
                }
            }//else de if (DsPedido.WMS_DOCUMENTOS[0].TOTAL == Convert.ToDecimal(rowAbonado.Properties.Value))
        }

        private static bool customerStateValidate(QueryParams qp)
        {
            if (Helpers.ObjToStr(CApp.GetParam("VFAC")) == "SI")
            {
                DataSet valFacturas = CApp.bll.getDataSet("PDV", "FacturasVencidas", qp);
                decimal facturasVencidas = Convert.ToDecimal(Helpers.Nvl(valFacturas.Tables[0].Rows[0]["FACTURAS_VENCIDAS"], 0));
                decimal montoFacturasVencidas = Convert.ToDecimal(Helpers.Nvl(valFacturas.Tables[0].Rows[0]["MONTO_FACTURAS_VENCIDAS"], 0));
                decimal chequesRechazados = Convert.ToDecimal(Helpers.Nvl(valFacturas.Tables[0].Rows[0]["CHEQUES_RECHAZADOS"], 0));
                decimal montoChequesRechazados = Convert.ToDecimal(Helpers.Nvl(valFacturas.Tables[0].Rows[0]["MONTO_CHEQUES_RECHAZADOS"], 0));

                if (!customerDataValidate(facturasVencidas, "CMFV", "El cliente tiene un total de {0} facturas vencidas"))
                    return false;

                if (!customerDataValidate(montoFacturasVencidas, "MMFV", "El cliente tiene un total de {0} en facturas vencidas"))
                    return false;

                if (!customerDataValidate(chequesRechazados, "CMCR", "El cliente tiene un total de {0} cheques rechazados"))
                    return false;

                if (!customerDataValidate(montoChequesRechazados, "MMCR", "El cliente tiene un total de {0} en cheques rechazados"))
                    return false;

            }
            return true;
        }

        private static bool customerDataValidate(decimal currAmount, string ceilAmoutParam, string message)
        {
            if (currAmount > Convert.ToDecimal(CApp.GetParam(ceilAmoutParam)))
            {
                CApp.ShowMessage(String.Format(CApp.TraducirPalabra(message), currAmount), CApp.TraducirPalabra("Cobros y Facturación"), false);
                return CApp.ValidateAccess("AutFactCliente", "Autorización de Facturas Cliente", true);
            }
            return true;
        }

        #region Invoices

        /// <summary>
        /// Crea una factura en base al pedido
        /// </summary>
        /// <returns></returns>
        public decimal CreateInvoice()
        {
            decimal pInvoice;

            // primero valida si se han ingresado datos de la factura
            if (df != null)
            {
                df.Vgc.PostEditor();
                df.Vgc.UpdateFocusedRecord();
                df.Vgc.FocusFirst();

                if ((Helpers.ObjToStr(df.rowFactura.Properties.Value).Trim() == string.Empty)
                    && (Helpers.ObjToStr(df.rowSerie.Properties.Value).Trim() == string.Empty)
                    && (Helpers.ObjToStr(df.rowEmision.Properties.Value).Trim() == string.Empty))
                {
                }
                else
                {
                    if (Helpers.ObjToStr(df.rowFactura.Properties.Value).Trim() == string.Empty)
                    {
                        CApp.ShowMessage("Ingrese el número de la factura", "Datos de Factura", true);
                        simpleButton1_Click(null, null);
                        return -1;
                    }
                    if (Helpers.ObjToStr(df.rowEmision.Properties.Value).Trim() == string.Empty)
                    {
                        CApp.ShowMessage("Ingrese la fecha de emisión de la factura", "Datos de Factura", true);
                        simpleButton1_Click(null, null);
                        return -1;
                    }
                }

            }

            #region Inserta los datos de la factura
            DsPedido.WMS_DOCUMENTOS[0].SetGRID_POSNull();

            DsFactura.Clear();
            DsFactura.AcceptChanges();

            Model.PDV.DsPDV.WMS_DOCUMENTOSRow row = DsFactura.WMS_DOCUMENTOS.NewWMS_DOCUMENTOSRow();
            pInvoice = Convert.ToDecimal(CApp.GetSecuence("WMS_S_DOCUMENTO"));
            if (DsPedido.WMS_DOCUMENTOS[0]["SOCIO_FACTURA"] != DBNull.Value)
                row.SOCIO = DsPedido.WMS_DOCUMENTOS[0].SOCIO_FACTURA;
            else
                row.SOCIO = DsPedido.WMS_DOCUMENTOS[0].SOCIO;

            row.DOCUMENTO = pInvoice;
            row.DOCUMENTO_PADRE = DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO;


            if (DsPedido.WMS_DOCUMENTOS[0]["TARJETA1"] != DBNull.Value)
                row.TARJETA1 = DsPedido.WMS_DOCUMENTOS[0].TARJETA1;

            if (DsPedido.WMS_DOCUMENTOS[0]["TRANSPORTISTA"] != DBNull.Value)
                row.TRANSPORTISTA = DsPedido.WMS_DOCUMENTOS[0].TRANSPORTISTA;

            if (df != null)
            {
                if ((Helpers.ObjToStr(df.rowFactura.Properties.Value).Trim() == string.Empty)
                    && (Helpers.ObjToStr(df.rowSerie.Properties.Value).Trim() == string.Empty)
                    && (Helpers.ObjToStr(df.rowEmision.Properties.Value).Trim() == string.Empty))
                {
                    row.FECHA_EMISION = Convert.ToDateTime(DateTime.Now);
                }
                else
                {
                    System.Globalization.CultureInfo arSA = new System.Globalization.CultureInfo("es-ES");
                    row.SERIE = Helpers.ObjToStr(df.rowSerie.Properties.Value);
                    row.NO_DOCUMENTO = df.rowFactura.Properties.Value.ToString();
                    row.FECHA_EMISION = Convert.ToDateTime(df.rowEmision.Properties.Value, arSA);
                }
            }
            else
                row.FECHA_EMISION = Convert.ToDateTime(DateTime.Now);

            row.TIPO_DOCUMENTO = "F";
            row.SITUACION = 3;

            row.TOTAL = DsPedido.WMS_DOCUMENTOS[0].TOTAL;
            row.CREADO_POR = CApp.usuario;

            if (DsPedido.WMS_SOCIOS[0]["TIPO_FACTURA"] != DBNull.Value)
                row.SUBTIPO_DOCUMENTO = DsPedido.WMS_SOCIOS[0].TIPO_FACTURA;

            if (DsPedido.WMS_SOCIOS[0]["FORMATO_NOTA_CREDITO"] != DBNull.Value)
                row.FORMATO_NOTA_CREDITO = DsPedido.WMS_SOCIOS[0].FORMATO_NOTA_CREDITO;

            if (DsPedido.WMS_DOCUMENTOS[0]["APROBACION2"] != DBNull.Value)
                row.APROBACION2 = DsPedido.WMS_DOCUMENTOS[0].APROBACION2;

            if (DsPedido.WMS_DOCUMENTOS[0]["ENGANCHE"] != DBNull.Value)
                row.ENGANCHE = DsPedido.WMS_DOCUMENTOS[0].ENGANCHE;

            if (DsPedido.WMS_DOCUMENTOS[0]["CUOTAS"] != DBNull.Value)
                row.CUOTAS = DsPedido.WMS_DOCUMENTOS[0].CUOTAS;

            if (DsPedido.WMS_DOCUMENTOS[0]["ULTIMA_CUOTA"] != DBNull.Value)
                row.ULTIMA_CUOTA = DsPedido.WMS_DOCUMENTOS[0].ULTIMA_CUOTA;

            if (DsPedido.WMS_DOCUMENTOS[0]["FECHA_PRIMERA_CUOTA"] != DBNull.Value)
                row.FECHA_PRIMERA_CUOTA = DsPedido.WMS_DOCUMENTOS[0].FECHA_PRIMERA_CUOTA;

            if (DsPedido.WMS_DOCUMENTOS[0]["CANTIDAD_PAGOS"] != DBNull.Value)
                row.CANTIDAD_PAGOS = DsPedido.WMS_DOCUMENTOS[0].CANTIDAD_PAGOS;

            if (DsPedido.WMS_DOCUMENTOS[0]["SUBTIPO_PAGO"] != DBNull.Value)
                row.SUBTIPO_PAGO = DsPedido.WMS_DOCUMENTOS[0].SUBTIPO_PAGO;

            if (DsPedido.WMS_DOCUMENTOS[0]["PORCENTAJE_INTERES"] != DBNull.Value)
                row.PORCENTAJE_INTERES = DsPedido.WMS_DOCUMENTOS[0].PORCENTAJE_INTERES;

            if (DsPedido.WMS_DOCUMENTOS[0]["ULTIMA_CUOTA"] != DBNull.Value)
                row.ULTIMA_CUOTA = DsPedido.WMS_DOCUMENTOS[0].ULTIMA_CUOTA;

            if (DsPedido.WMS_DOCUMENTOS[0]["ESCENARIO_FINANCIERA"] != DBNull.Value)
                row.ESCENARIO_FINANCIERA = DsPedido.WMS_DOCUMENTOS[0].ESCENARIO_FINANCIERA;

            if (DsPedido.WMS_DOCUMENTOS[0]["SOCIO_AVALISTA"] != DBNull.Value)
                row.SOCIO_AVALISTA = DsPedido.WMS_DOCUMENTOS[0].SOCIO_AVALISTA;

            if (DsPedido.WMS_DOCUMENTOS[0]["FECHA_VENCIMIENTO"] != DBNull.Value)
                row.FECHA_VENCIMIENTO = DsPedido.WMS_DOCUMENTOS[0].FECHA_VENCIMIENTO;

            row.USUARIO1 = DsPedido.WMS_DOCUMENTOS[0].USUARIO1;

            if (Program.Caja != null)
                row.CAJA = (decimal)Program.Caja;

            if (Program.Jornada != null)
                row.JORNADA = (decimal)Program.Jornada;

            if (DsPedido.WMS_DOCUMENTOS[0]["SALDO"] != DBNull.Value)
                row.SALDO = DsPedido.WMS_DOCUMENTOS[0].SALDO;
            else
                row.SetSALDONull();

            DsFactura.WMS_DOCUMENTOS.AddWMS_DOCUMENTOSRow(row);

            #endregion

            #region Inserta el detalle de la factura

            foreach (Model.PDV.DsPDV.WMS_SKUS_X_DOCUMENTORow sdrOrder in DsPedido.WMS_SKUS_X_DOCUMENTO.Select("documento = " + DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString() + " and usuario_anulo is null "))
            {
                // Solo facturar lineas no anuladas
                if (sdrOrder["USUARIO_ANULO"] == System.DBNull.Value)
                {
                    Model.PDV.DsPDV.WMS_SKUS_X_DOCUMENTORow sdrInvoice = DsFactura.WMS_SKUS_X_DOCUMENTO.NewWMS_SKUS_X_DOCUMENTORow();
                    sdrInvoice.DOCUMENTO = pInvoice;
                    sdrInvoice.LINEA = sdrOrder.LINEA;
                    sdrInvoice.SKU = sdrOrder.SKU;
                    sdrInvoice.CANTIDAD = sdrOrder.CANTIDAD;
                    sdrInvoice.PRECIO_UNITARIO = sdrOrder.PRECIO_UNITARIO;

                    sdrInvoice.CREADO_POR = CApp.usuario;

                    if (sdrOrder["LINEA_PADRE"] != DBNull.Value)
                        sdrInvoice.LINEA_PADRE = sdrOrder.LINEA_PADRE;

                    if (sdrOrder["LINEA_PADRE2"] != DBNull.Value)
                        sdrInvoice.LINEA_PADRE2 = sdrOrder.LINEA_PADRE2;

                    if (sdrOrder["NO_INTERFAZAR"] != DBNull.Value)
                        sdrInvoice.NO_INTERFAZAR = sdrOrder.NO_INTERFAZAR;

                    if (sdrOrder["DOCUMENTO_PADRE3"] != DBNull.Value)
                        sdrInvoice.DOCUMENTO_PADRE3 = sdrOrder.DOCUMENTO_PADRE3;

                    if (sdrOrder["LINEA_PADRE3"] != DBNull.Value)
                        sdrInvoice.LINEA_PADRE3 = sdrOrder.LINEA_PADRE3;

                    if (sdrOrder["VALE"] != DBNull.Value)
                        sdrInvoice.VALE = sdrOrder.VALE;

                    if (sdrOrder["IMPUESTO"] == System.DBNull.Value)
                        sdrInvoice.SetIMPUESTONull();
                    else
                        sdrInvoice.IMPUESTO = sdrOrder.IMPUESTO;

                    if (sdrOrder["DESCUENTO"] == System.DBNull.Value)
                        sdrInvoice.SetDESCUENTONull();
                    else
                        sdrInvoice.DESCUENTO = sdrOrder.DESCUENTO;

                    if (sdrOrder["BODEGA"] == System.DBNull.Value)
                        sdrInvoice.SetBODEGANull();
                    else
                        sdrInvoice.BODEGA = sdrOrder.BODEGA;

                    if (sdrOrder["BODEGA2"] == System.DBNull.Value)
                        sdrInvoice.SetBODEGA2Null();
                    else
                        sdrInvoice.BODEGA2 = sdrOrder.BODEGA2;

                    if (sdrOrder["BODEGA3"] == System.DBNull.Value)
                        sdrInvoice.SetBODEGA3Null();
                    else
                        sdrInvoice.BODEGA3 = sdrOrder.BODEGA3;

                    if (sdrOrder["A_DOMICILIO"] == System.DBNull.Value)
                        sdrInvoice.SetA_DOMICILIONull();
                    else
                        sdrInvoice.A_DOMICILIO = sdrOrder.A_DOMICILIO;

                    if (sdrOrder["DIRECCION"] == System.DBNull.Value)
                        sdrInvoice.SetDIRECCIONNull();
                    else
                        sdrInvoice.DIRECCION = sdrOrder.DIRECCION;

                    if (sdrOrder["REGION"] == System.DBNull.Value)
                        sdrInvoice.SetREGIONNull();
                    else
                        sdrInvoice.REGION = sdrOrder.REGION;

                    if (sdrOrder["SITUACION_SKU"] == System.DBNull.Value)
                        sdrInvoice.SetSITUACION_SKUNull();
                    else
                        sdrInvoice.SITUACION_SKU = sdrOrder.SITUACION_SKU;

                    if (sdrOrder["PORCENTAJE1"] == System.DBNull.Value)
                        sdrInvoice.SetPORCENTAJE1Null();
                    else
                        sdrInvoice.PORCENTAJE1 = sdrOrder.PORCENTAJE1;

                    if (sdrOrder["PORCENTAJE2"] == System.DBNull.Value)
                        sdrInvoice.SetPORCENTAJE2Null();
                    else
                        sdrInvoice.PORCENTAJE2 = sdrOrder.PORCENTAJE2;

                    if (sdrOrder["PORCENTAJE3"] == System.DBNull.Value)
                        sdrInvoice.SetPORCENTAJE3Null();
                    else
                        sdrInvoice.PORCENTAJE3 = sdrOrder.PORCENTAJE3;

                    if (sdrOrder["USUARIO"] == System.DBNull.Value)
                        sdrInvoice.SetUSUARIONull();
                    else
                        sdrInvoice.USUARIO = sdrOrder.USUARIO;

                    if (sdrOrder["USUARIO2"] == System.DBNull.Value)
                        sdrInvoice.SetUSUARIO2Null();
                    else
                        sdrInvoice.USUARIO2 = sdrOrder.USUARIO2;

                    if (sdrOrder["USUARIO3"] == System.DBNull.Value)
                        sdrInvoice.SetUSUARIO3Null();
                    else
                        sdrInvoice.USUARIO3 = sdrOrder.USUARIO3;

                    if (sdrOrder["FECHA_ENTREGA"] == System.DBNull.Value)
                        sdrInvoice.SetFECHA_ENTREGANull();
                    else
                        sdrInvoice.FECHA_ENTREGA = sdrOrder.FECHA_ENTREGA;

                    if (sdrOrder["COSTO_PROMEDIO"] == System.DBNull.Value)
                        sdrInvoice.SetCOSTO_PROMEDIONull();
                    else
                        sdrInvoice.COSTO_PROMEDIO = sdrOrder.COSTO_PROMEDIO;

                    if (sdrOrder["OBSERVACIONES"] == System.DBNull.Value)
                        sdrInvoice.SetOBSERVACIONESNull();
                    else
                        sdrInvoice.OBSERVACIONES = sdrOrder.OBSERVACIONES;

                    if (sdrOrder["BENEFICIARIO"] == System.DBNull.Value)
                        sdrInvoice.SetBENEFICIARIONull();
                    else
                        sdrInvoice.BENEFICIARIO = sdrOrder.BENEFICIARIO;

                    if (sdrOrder["SKU_GARANTIA"] == System.DBNull.Value)
                        sdrInvoice.SetSKU_GARANTIANull();
                    else
                        sdrInvoice.SKU_GARANTIA = sdrOrder.SKU_GARANTIA;

                    if (sdrOrder["VENCIMIENTO_GARANTIA"] == System.DBNull.Value)
                        sdrInvoice.SetVENCIMIENTO_GARANTIANull();
                    else
                        sdrInvoice.VENCIMIENTO_GARANTIA = sdrOrder.VENCIMIENTO_GARANTIA;

                    if (sdrOrder["DOCUMENTO_PADRE4"] != DBNull.Value)
                        sdrInvoice.DOCUMENTO_PADRE4 = sdrOrder.DOCUMENTO_PADRE4;

                    if (sdrOrder["LINEA_PADRE4"] != DBNull.Value)
                        sdrInvoice.LINEA_PADRE4 = sdrOrder.LINEA_PADRE4;

                    sdrOrder.FACTURADO = sdrInvoice.CANTIDAD;

                    DsFactura.WMS_SKUS_X_DOCUMENTO.AddWMS_SKUS_X_DOCUMENTORow(sdrInvoice);
                }
            }

            #endregion

            //if (DsVale.DOC_VALES.Count > 0)
            //{
            //    foreach (Model.PDV.DsPDV.DOC_VALESRow dvr in DsVale.DOC_VALES)
            //    {
            //        dvr.FACTURA_PAGO = DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
            //    }
            //}

            return pInvoice;
        }

        #endregion

        /// <summary>
        /// Ejecuta los procesos necesarios antes de pagar una factura
        /// </summary>
        public decimal beforePay(decimal pValue)
        {
            if (DsRecibo.WMS_DOCUMENTOS.Count < 1)
                return CreateReceipt(pValue);
            else
                return UpdateReceipt(pValue);

            return 0;
        }

        /// <summary>
        /// Crear un recibo de pago
        /// </summary>
        /// <param name="pValue">monto a recibir</param>
        /// <returns></returns>
        public decimal CreateReceipt(decimal pValue)
        {
            decimal pReceipt;

            if (!esPagoAnticipado)
            {
                #region Si existe un pedido y no existe una factura la crea

                if (DsPedido.WMS_DOCUMENTOS.Count > 0 && DsFactura.WMS_DOCUMENTOS.Count < 1)
                {
                    decimal inv = CreateInvoice();
                    if (inv == -1)
                        return inv;
                }

                if (pValue == 0) return 0;
                #endregion
            }

            #region Crea el documento de recibo

            // valores para crear el recibo
            decimal vSocio;
            string vUsuario;
            string vCreadoPor;
            decimal? vCaja = null;
            decimal? vJornada = null;

            // asignando valores dependiendo de la forma del cobro
            if (DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                vSocio = DsFactura.WMS_DOCUMENTOS[0].SOCIO;
                vUsuario = DsFactura.WMS_DOCUMENTOS[0].USUARIO1;
            }
            else
            {
                vSocio = DsPedido.WMS_SOCIOS[0].SOCIO;
                vUsuario = CApp.usuario;
            }

            vCreadoPor = CApp.usuario;
            vCaja = Program.Caja;
            vJornada = Program.Jornada;


            Model.PDV.DsPDV.WMS_DOCUMENTOSRow row = DsRecibo.WMS_DOCUMENTOS.NewWMS_DOCUMENTOSRow();
            pReceipt = Convert.ToDecimal(CApp.GetSequence("WMS_S_DOCUMENTO"));
            row.DOCUMENTO = pReceipt;
            row.SOCIO = vSocio;
            row.TIPO_DOCUMENTO = "R";
            row.TOTAL = pValue;

            if (!esPagoAnticipado)
            {
                if (DsPedido.WMS_DOCUMENTOS.Count > 0)
                    row.DOCUMENTO_PADRE = DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
            }
            else
                row.SALDO = pValue;


            if (df != null)
            {
                df.Vgc.PostEditor();
                df.Vgc.UpdateFocusedRecord();
                df.Vgc.FocusFirst();

                if (Helpers.ObjToStr(df.rowEmision.Properties.Value).Trim() == string.Empty)
                    row.SetFECHA_EMISIONNull();
                else
                    row.FECHA_EMISION = Convert.ToDateTime(df.rowEmision.Properties.Value);
            }
            else
                row.SetFECHA_EMISIONNull();

            row.USUARIO1 = vUsuario;
            row.CREADO_POR = vCreadoPor;

            if (vCaja != null)
                row.CAJA = (decimal)vCaja;

            if (vJornada != null)
                row.JORNADA = (decimal)vJornada;

            DsRecibo.WMS_DOCUMENTOS.AddWMS_DOCUMENTOSRow(row);

            #endregion


            if (!esPagoAnticipado)
            {
                #region Crea el abono a la factura

                if (DsPedido.WMS_DOCUMENTOS.Count > 0)
                {
                    Model.PDV.DsPDV.DOC_ABONO_DOCUMENTOSRow adr = DsRecibo.DOC_ABONO_DOCUMENTOS.NewDOC_ABONO_DOCUMENTOSRow();
                    adr.DOCUMENTO = DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                    adr.RECIBO = DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO;
                    adr.VALOR = DsRecibo.WMS_DOCUMENTOS[0].TOTAL;
                    adr.TIPO_DOCUMENTO = DsFactura.WMS_DOCUMENTOS[0].TIPO_DOCUMENTO;
                    DsRecibo.DOC_ABONO_DOCUMENTOS.AddDOC_ABONO_DOCUMENTOSRow(adr);
                }
                else
                {
                    decimal vPago = pValue;

                    foreach (Model.PDV.DsPDV.WMS_DOCUMENTOSRow fdr in DsFactura.WMS_DOCUMENTOS)
                    {
                        if (vPago > 0)
                        {
                            decimal vAbono = Math.Min(fdr.SALDO, vPago);
                            Model.PDV.DsPDV.DOC_ABONO_DOCUMENTOSRow adr = DsRecibo.DOC_ABONO_DOCUMENTOS.NewDOC_ABONO_DOCUMENTOSRow();
                            adr.DOCUMENTO = fdr.DOCUMENTO;
                            adr.RECIBO = DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO;
                            adr.VALOR = vAbono;
                            adr.TIPO_DOCUMENTO = fdr.TIPO_DOCUMENTO;
                            DsRecibo.DOC_ABONO_DOCUMENTOS.AddDOC_ABONO_DOCUMENTOSRow(adr);
                            fdr.SALDO -= vAbono;
                            vPago -= vAbono;
                        }
                    }
                }

                #endregion
            }

            return pReceipt;
        }

        /// <summary>
        /// Actualiza el saldo de la factura, en caso de cancelar con pago Anticipado
        /// </summary>
        /// <param name="pValue">monto a incrementar en la columna total del recibo</param>
        public decimal CrearPagoAnticipado(decimal pValue)
        {
            //Se crea el abono de la factura
            if (DsPedido.WMS_DOCUMENTOS.Count == 0)
            {
                decimal vPago = pValue;

                foreach (Model.PDV.DsPDV.WMS_DOCUMENTOSRow fdr in DsFactura.WMS_DOCUMENTOS)
                {
                    if (vPago > 0)
                    {
                        decimal vAbono = Math.Min(fdr.SALDO, vPago);
                        fdr.SALDO -= vAbono;
                        vPago -= vAbono;
                    }
                }
            }
            return 0;
        }


        /// <summary>
        /// Actualiza el monto del recibo
        /// </summary>
        /// <param name="pValue">monto a incrementar en la columna total del recibo</param>
        public decimal UpdateReceipt(decimal pValue)
        {
            DsRecibo.WMS_DOCUMENTOS[0].TOTAL = DsRecibo.WMS_DOCUMENTOS[0].TOTAL + pValue;

            if (esPagoAnticipado)
                DsRecibo.WMS_DOCUMENTOS[0].SALDO = DsRecibo.WMS_DOCUMENTOS[0].SALDO + pValue;

            if (DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                DsRecibo.DOC_ABONO_DOCUMENTOS[0].VALOR = DsRecibo.WMS_DOCUMENTOS[0].TOTAL;
            }
            else
            {
                decimal vPago = pValue;
                foreach (Model.PDV.DsPDV.WMS_DOCUMENTOSRow fdr in DsFactura.WMS_DOCUMENTOS)
                {
                    decimal vAbono = Math.Min(fdr.SALDO, vPago);
                    if (vPago > 0 && vAbono > 0)
                    {
                        Model.PDV.DsPDV.DOC_ABONO_DOCUMENTOSRow abonoDoctosRow = null;
                        bool existsDoctosRow = false;

                        foreach (Model.PDV.DsPDV.DOC_ABONO_DOCUMENTOSRow adr in DsRecibo.DOC_ABONO_DOCUMENTOS)
                        {
                            if (adr.DOCUMENTO == fdr.DOCUMENTO)
                            {
                                abonoDoctosRow = adr;
                                existsDoctosRow = true;
                            }
                        }

                        if (abonoDoctosRow == null)
                            abonoDoctosRow = DsRecibo.DOC_ABONO_DOCUMENTOS.NewDOC_ABONO_DOCUMENTOSRow();

                        if (existsDoctosRow)
                        {
                            abonoDoctosRow.VALOR += vAbono;
                        }
                        else
                        {
                            abonoDoctosRow.DOCUMENTO = fdr.DOCUMENTO;
                            abonoDoctosRow.RECIBO = DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO;
                            abonoDoctosRow.VALOR = vAbono;
                            abonoDoctosRow.TIPO_DOCUMENTO = fdr.TIPO_DOCUMENTO;
                            DsRecibo.DOC_ABONO_DOCUMENTOS.AddDOC_ABONO_DOCUMENTOSRow(abonoDoctosRow);
                        }
                        fdr.SALDO -= vAbono;
                        vPago -= vAbono;
                    }
                }

            }

            if (df != null)
            {
                df.Vgc.PostEditor();
                df.Vgc.UpdateFocusedRecord();
                df.Vgc.FocusFirst();

                if ((Helpers.ObjToStr(df.rowFactura.Properties.Value).Trim() == string.Empty)
                    && (Helpers.ObjToStr(df.rowSerie.Properties.Value).Trim() == string.Empty)
                    && (Helpers.ObjToStr(df.rowEmision.Properties.Value).Trim() == string.Empty))
                {
                }
                else
                {
                    if (Helpers.ObjToStr(df.rowFactura.Properties.Value).Trim() == string.Empty)
                    {
                        CApp.ShowMessage("Ingrese el número de la factura", "Datos de Factura", true);
                        simpleButton1_Click(null, null);
                        return -1;
                    }
                    if (Helpers.ObjToStr(df.rowEmision.Properties.Value).Trim() == string.Empty)
                    {
                        CApp.ShowMessage("Ingrese la fecha de emisión de la factura", "Datos de Factura", true);
                        simpleButton1_Click(null, null);
                        return -1;
                    }
                    try
                    {

                        DsFactura.WMS_DOCUMENTOS[0].SERIE = Helpers.ObjToStr(df.rowSerie.Properties.Value);
                        DsFactura.WMS_DOCUMENTOS[0].NO_DOCUMENTO = Helpers.ObjToStr(df.rowFactura.Properties.Value);
                        DsFactura.WMS_DOCUMENTOS[0].FECHA_EMISION = Convert.ToDateTime(df.rowEmision.Properties.Value);
                    }
                    catch
                    {
                    }

                }

            }

            return 0;

        }

        private void btnAgregarPago_Click(object sender, EventArgs e)
        {
            if (Convert.ToDecimal(rowAbonado.Properties.Value) >= Convert.ToDecimal(rowTotal.Properties.Value))
            {
                CApp.ShowMessage("No se pueden agregar mas pagos porque el total a pagar ya ha sido abonado", "Cobros y Facturación", true);
                return;
            }

            //si el tipo de pago No es asociacion y el cliente es Asociacion
            if (paymentType != 31 && this.esAsociacion)
            {
                mDeleteRelacionDocAsociacionConCliente((long)Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO);
            }

            switch (paymentType)
            {
                case 1:
                    Controls.ctlCash cc = ((Controls.ctlCash)panelControl3.Controls["ctlCash"]);
                    cc.Vgc.PostEditor();
                    cc.Vgc.UpdateFocusedRecord();
                    cc.Vgc.FocusFirst();
                    cc.AgregarPago(null, Convert.ToDecimal(cc.rowMONTO.Properties.Value));
                    break;
                case 2:
                    Controls.ctlCreditCard ccd = ((Controls.ctlCreditCard)panelControl3.Controls["ctlCreditCard"]);
                    ccd.Vgc.PostEditor();
                    ccd.Vgc.UpdateFocusedRecord();
                    ccd.Vgc.FocusFirst();
                    ccd.AgregarPago(Helpers.ObjToStr(ccd.rowAUTORIZACION.Properties.Value));
                    break;
                case 3:
                    Controls.ctlCheck cck = ((Controls.ctlCheck)panelControl3.Controls["ctlCheck"]);
                    cck.Vgc.PostEditor();
                    cck.Vgc.UpdateFocusedRecord();
                    cck.Vgc.FocusFirst();
                    cck.AgregarPago(Helpers.ObjToStr(cck.rowAUTORIZACION.Properties.Value));
                    break;
                case 8:
                    Controls.ctlProntoPago dpp = ((Controls.ctlProntoPago)panelControl3.Controls["ctlProntoPago"]);
                    dpp.Vgc.PostEditor();
                    dpp.Vgc.UpdateFocusedRecord();
                    dpp.Vgc.FocusFirst();
                    dpp.AgregarPago(Helpers.ObjToStr(dpp.rowMONTO.Properties.Value));
                    break;
                case 9:
                    Controls.ctlBankTransfer tra = ((Controls.ctlBankTransfer)panelControl3.Controls["ctlBankTransfer"]);
                    tra.Vgc.PostEditor();
                    tra.Vgc.UpdateFocusedRecord();
                    tra.Vgc.FocusFirst();
                    //tra.AgregarPago(null, Convert.ToDecimal(tra.rowMONTO.Properties.Value));
                    tra.AgregarPago(tra.rowAUTORIZACION.Properties.Value.ToString());
                    break;
                case 10:
                    Controls.ctlDeposito dep = ((Controls.ctlDeposito)panelControl3.Controls["ctlDeposito"]);
                    dep.Vgc.PostEditor();
                    dep.Vgc.UpdateFocusedRecord();
                    dep.Vgc.FocusFirst();
                    dep.AgregarPago(Helpers.ObjToStr(dep.rowAUTORIZACION.Properties.Value));
                    break;
                case 15:
                    Controls.ctlPagosAnticipados paa = ((Controls.ctlPagosAnticipados)panelControl3.Controls["ctlPagosAnticipados"]);
                    paa.Vgc.PostEditor();
                    paa.Vgc.UpdateFocusedRecord();
                    paa.Vgc.FocusFirst();
                    paa.AgregarPago(null, Convert.ToDecimal(paa.rowMONTO.Properties.Value));
                    break;
                case 21:
                    Controls.ctlValesyCR cvt = ((Controls.ctlValesyCR)panelControl3.Controls["ctlValesyCR"]);
                    cvt.Vgc.PostEditor();
                    cvt.Vgc.UpdateFocusedRecord();
                    cvt.Vgc.FocusFirst();
                    cvt.AgregarPago(cvt.rowMONTO.Properties.Value);
                    break;
                case 22:
                    Controls.ctlExencionImpuesto cfn = ((Controls.ctlExencionImpuesto)panelControl3.Controls["ctlExencionImpuesto"]);
                    cfn.Vgc.PostEditor();
                    cfn.Vgc.UpdateFocusedRecord();
                    cfn.Vgc.FocusFirst();
                    cfn.AgregarPago(cfn.rowConstancia.Properties.Value);
                    break;
                case 14:
                    Controls.ctlGiftCard cgc = ((Controls.ctlGiftCard)panelControl3.Controls["ctlGiftCard"]);
                    cgc.Vgc.PostEditor();
                    cgc.Vgc.UpdateFocusedRecord();
                    cgc.Vgc.FocusFirst();
                    cgc.AgregarPago(null, Convert.ToDecimal(cgc.rowMONTO.Properties.Value), GiftCardSaldo, TarjPagarGiftCard);
                    break;
                case 16:
                    Controls.ctlPoints cpn = ((Controls.ctlPoints)panelControl3.Controls["ctlPoints"]);

                    QueryParams vParametros = new QueryParams();

                    if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0)
                    {
                        vParametros.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    }
                    else if (DsRecibo.WMS_DOCUMENTOS.Count > 0)
                    {
                        vParametros.AddReplaceParam("pDOCUMENTO", DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    }
                    vParametros.AddReplaceParam("pTOTAL_X_ABONAR", rowAbonado.Properties.Value.ToString());
                    vParametros.AddReplaceParam("pTOTAL_PTS", cpn.rowMONTO.Properties.Value.ToString());

                    string vResultado = Helpers.Nvl(CApp.bll.GetSingleValue("POS_F_APROBACION_PTS", vParametros, "PDV"), "").ToString();

                    if (vResultado == "1")
                    {
                        cpn.Vgc.PostEditor();
                        cpn.Vgc.UpdateFocusedRecord();
                        cpn.Vgc.FocusFirst();
                        cpn.AgregarPago(null, Convert.ToDecimal(cpn.rowMONTO.Properties.Value), Puntos, TarjPagarMPts);
                        btnCredCuotsEk.Visible = false;
                    }
                    else
                    {
                        CApp.ShowMessage(vResultado, "Pago con puntos", true);
                    }

                    break;
                case 31:
                    Controls.ctlAsociaciones can = ((Controls.ctlAsociaciones)panelControl3.Controls["ctlAsociaciones"]);
                    can.Vgc.PostEditor();
                    can.Vgc.UpdateFocusedRecord();
                    can.Vgc.FocusFirst();
                    can.AgregarPago(can.rowBoleta.Properties.Value.ToString());
                    break;
                case 32:
                    //
                    Controls.ctlCredix cdx = ((Controls.ctlCredix)panelControl3.Controls["ctlCredix"]);
                    cdx.Vgc.PostEditor();
                    cdx.Vgc.UpdateFocusedRecord();
                    cdx.Vgc.FocusFirst();
                    cdx.AgregarPago(null, Convert.ToDecimal(cdx.rowMONTO.Properties.Value));
                    break;
                case 33:
                    //
                    Controls.ctlMonederoAlo moalo = ((Controls.ctlMonederoAlo)panelControl3.Controls["ctlMonederoAlo"]);
                    moalo.Vgc.PostEditor();
                    moalo.Vgc.UpdateFocusedRecord();
                    moalo.Vgc.FocusFirst();
                    moalo.AgregarPago(null, Convert.ToDecimal(moalo.rowMONTO.Properties.Value));
                    break;
                case 34:
                    //
                    Controls.ctlCredicuotsEk ccutsek = ((Controls.ctlCredicuotsEk)panelControl3.Controls["ctlCredicuotsEk"]);
                    ccutsek.Vgc.PostEditor();
                    ccutsek.Vgc.UpdateFocusedRecord();
                    ccutsek.Vgc.FocusFirst();
                    ccutsek.AgregarPago(null, Convert.ToDecimal(ccutsek.rowMONTO.Properties.Value));
                    btnPoints.Visible = false;
                    break;
                case 35:
                    Controls.ctlFlexi flexi = ((Controls.ctlFlexi)panelControl3.Controls["ctlFlexi"]);
                    flexi.vGridControl.PostEditor();
                    flexi.vGridControl.UpdateFocusedRecord();
                    flexi.vGridControl.FocusFirst();
                    flexi.AgregarPago(null, Convert.ToDecimal(cFlexi.rowMONTO.Properties.Value), Convert.ToString(cFlexi.rowVoucher.Properties.Value));
                    break;
                case 37:
                    Controls.ctlSinpeMovil Sinpe = ((Controls.ctlSinpeMovil)panelControl3.Controls["ctlSinpeMovil"]);
                    Sinpe.Vgc.PostEditor();
                    Sinpe.Vgc.UpdateFocusedRecord();
                    Sinpe.Vgc.FocusFirst();
                    Sinpe.AgregarPago(null, Convert.ToDecimal(cSinpeMovil.rowMONTO.Properties.Value), Convert.ToString(cSinpeMovil.rowCedula.Properties.Value),p_documentos);
                    break;
                case 40:
                    Controls.ctlZunify zuni = ((Controls.ctlZunify)panelControl3.Controls["ctlZunify"]);
                    zuni.Vgc.PostEditor();
                    zuni.Vgc.UpdateFocusedRecord();
                    zuni.Vgc.FocusFirst();
                    Zunify.frmZunify zu = new Zunify.frmZunify(zuni, DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    if (zu.TestAPI())
                    {
                        zu.Show();
                    }
                    break;
            }
        }

        void event_BeforePay(object sender, CancelEventArgs e)
        {
            if (Convert.ToDecimal(rowAbonado.Properties.Value) >= Convert.ToDecimal(rowTotal.Properties.Value))
            {
                CApp.ShowMessage("No se pueden agregar mas pagos porque el total a pagar ya ha sido abonado", "Cobros y Facturación", true);
                e.Cancel = true;
            }

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (CApp.messageBoxForm != null)
            {
                if (CApp.messageBoxForm.IsAccessible)
                {
                    CApp.messageBoxForm.Activate();
                    return;
                }
            }

            #region Anular Transacciones IGF
            //Anular Transacciones
            if (this.lTransacciones.Count > 0)
            {
                CApp.ShowMessage(@"Este pedido realizó transacciones con el Banco Nacional (pagos con tarjeta de crédito/débito) 
que ya fueron cobradas. Proceda a anular las transacciones o tendrá un faltante de caja", "Cobros y Facturación", true);

                if (GUI.CApp.ValidateAccess("AnulacionTrans", "Anulación de pagos con tarjeta"))
                {
                    string documento = "";
                    if (Program.FrmMainPos != null && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0 && Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                        documento = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
                    else if (DsRecibo.WMS_DOCUMENTOS.Count > 0 && DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO != null)
                        documento = DsRecibo.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();

                    string supervisor = "";
                    if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
                        supervisor = GUI.CApp.Sup;
                    RealizarTransaccion(supervisor, documento);
                }
            }

            this.lTransacciones.Clear();
            #endregion

            // TODO: optimizar para enviar una sola instruccion a bdd
            foreach (decimal valegen in ValesGenerados)
            {
                QueryParams qp = new QueryParams();
                qp.AddReplaceParam("VALE", valegen.ToString());
                CApp.bll.ExecuteSql("AnulaVale", qp, "PDV");
                DataRow[] dvrows = Program.FrmMainPos.DsVale.DOC_VALES.Select("VALE = " + valegen.ToString());
                foreach (DataRow dr in dvrows)
                {
                    dr.Delete();
                }
            }

            #region Tiempo Cobro IGF
            //Eliminar tiempo cobro
            if (DsPedido.WMS_DOCUMENTOS.Count > 0 && DsPedido.WMS_DOCUMENTOS.Rows.Count > 0 && DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString() != "")
            {
                Utils.QueryParams param = new LLNet.Utils.QueryParams();
                param.AddReplaceParam("Documento", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                GUI.CApp.bll.ExecuteSql("ElimTiempo", param, "PDV");
                //Eliminar relacion factura electronica
                mDeleteRelacionDocAsociacionConCliente((long)DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO, true);
            }
            #endregion


            this.esAsociacion = false;
            chkAsociarCorreo.Checked = false;
            chkAsociarCorreo.Visible = false;

            DsFactura.Clear();
            DsRecibo.Clear();
            DsVale.Clear();
            dsNotaCredito.Clear();
            ValesGenerados.Clear();
            Close();
        }

        #region RealizarTransaccion IGF
        /// <summary>
        /// Realiza la anulación de un pago con tarjeta
        /// </summary>
        private void RealizarTransaccion(string Supervisor, string Documento)
        {
            string TipoTrans = "W";//Tipo transacción
            bool Aprobado = false;//Indica si la transacción fue aprobada o no
            double ResponseAmount = 0;//Disponible de la tarjeta en consulta de saldos
            string nombTarj = "";//Nombre del tarjeta habiente
            string Merchant = "", MerchantNumber = "", TerminalNumber = "";

            Utils.QueryParams qp = new QueryParams();
            qp.AddReplaceParam("CAJA", Program.Caja.ToString());

            //Verifica que la caja tenga en la base de datos, los datos de merchant, merchantnumber, terminalnumber
            if (GUI.CApp.bll.GetSingleValue("HayDatos", qp, "PDV").ToString() != "0")
            {
                //Obtiene el merchant, el merchant number y el terminal number
                DataSet ds_datos = GUI.CApp.bll.getDataSet("PDV", "ObtDatosBNCR", qp);

                if (ds_datos.Tables.Count > 0 && ds_datos.Tables[0].Rows.Count > 0)
                {
                    Merchant = ds_datos.Tables[0].Rows[0].ItemArray[0].ToString();
                    MerchantNumber = ds_datos.Tables[0].Rows[0].ItemArray[1].ToString();
                    TerminalNumber = ds_datos.Tables[0].Rows[0].ItemArray[2].ToString();
                    //
                    //
                    foreach (string[] datos in this.lTransacciones)
                    {
                        string NumAutoriz = datos[0];//Número de autorización
                        string NumTarj = datos[2];//Número de tarjeta enmascarado
                        string NumRef = datos[1];//Número de referencia de la transacción

                        Utils.QueryParams qparams = new QueryParams();

                        qparams.AddReplaceParam("TARJETA", NumTarj);
                        qparams.AddReplaceParam("AUTORIZACION", NumAutoriz);
                        qparams.AddReplaceParam("REFERENCIA", NumRef);
                        //Obtiene el monto de la transacción
                        object monto = GUI.CApp.bll.GetSingleValue("MontoTrans", qparams, "PDV");
                        if (monto == null)
                            monto = "0";

                        #region
                        string id_tr_tarj = GUI.CApp.bll.GetSingleValue("Sig_Id_tr_tarj", "PDV").ToString();
                        qparams.AddReplaceParam("ID_TR_TARJ", id_tr_tarj);
                        qparams.AddReplaceParam("DOCUMENTO", Documento);
                        qparams.AddReplaceParam("CAJA", Program.Caja.ToString());
                        qparams.AddReplaceParam("TIPO", "Anulación");
                        if (Supervisor != null && Supervisor != "")
                            qparams.AddReplaceParam("USUARIO", Supervisor);
                        else
                            qparams.AddReplaceParam("USUARIO", GUI.CApp.usuario);
                        qparams.AddReplaceParam("MONTO", monto.ToString());
                        qparams.AddReplaceParam("ESTADO", "Pendiente");
                        qparams.AddReplaceParam("EMISOR", "2");
                        qparams.AddReplaceParam("JORNADA", Program.Jornada.ToString());
                        //
                        GUI.CApp.bll.ExecuteSql("Ini_Log_Tarjetas_Anul", qparams, "PDV");
                        #endregion
                        //
                        //Realiza el proceso de anulación de la transacción
                        BNCRGL.BNCR bn = new BNCRGL.BNCR();
                        bn.GenerarTransaccion(Merchant, MerchantNumber, TerminalNumber, TipoTrans,
                        0, 0, 0, 0, 0, ref NumTarj, ref nombTarj, ref Aprobado, ref NumRef,
                        ref NumAutoriz, ref ResponseAmount);
                        //
                        #region (NO)Aprobado
                        if (Aprobado)
                        {
                            qparams = new QueryParams();
                            //Datos fin del proceso de pago con tarjeta de crédito
                            qparams.AddReplaceParam("ID_TR_TARJ", id_tr_tarj);
                            qparams.AddReplaceParam("TARJETA", NumTarj);
                            qparams.AddReplaceParam("AUTORIZACION", NumAutoriz);
                            qparams.AddReplaceParam("REFERENCIA", NumRef);
                            qparams.AddReplaceParam("ESTADO", "Aprobada");
                            qparams.AddReplaceParam("ERRORES", "");
                            //
                            GUI.CApp.bll.ExecuteSql("Fin_Log_Tarjetas", qparams, "PDV");
                        }
                        else
                        {
                            qparams = new QueryParams();
                            qparams.AddReplaceParam("ID_TR_TARJ", id_tr_tarj);
                            qparams.AddReplaceParam("TARJETA", NumTarj);
                            qparams.AddReplaceParam("AUTORIZACION", NumAutoriz);
                            qparams.AddReplaceParam("REFERENCIA", NumRef);
                            qparams.AddReplaceParam("ESTADO", "Denegada");
                            qparams.AddReplaceParam("ERRORES", "Anulación denegada/cancelada");
                            //
                            GUI.CApp.bll.ExecuteSql("Fin_Log_Tarjetas", qparams, "PDV");

                            XtraMessageBox.Show("Transacción denegada");
                        }
                        #endregion
                    }
                }
            }
            else
                CApp.ShowMessage("Para esta caja, no existe el merchant, merchantnumber y terminalnumber", "Cobros y Facturación", true);

        }
        #endregion

        private Controls.ctlValesyCR vtr;

        private void btnValeTercero_Click(object sender, EventArgs e)
        {
            paymentType = 21;
            if (vtr == null)
            {
                vtr = new LLNet.Tienda.MainForms.Controls.ctlValesyCR();
                vtr.PayWithNote += new EventHandler(vtr_PayWithNote);
            }

            vtr.BeforePayWithNote += new CancelEventHandler(event_BeforePay);

            panelControl3.Controls.Clear();
            vtr.Parent = panelControl3;
            vtr.Dock = DockStyle.Fill;
            vtr.BringToFront();
            vtr.Focus();
            vtr.Show();

            foreach (DevExpress.XtraVerticalGrid.Rows.BaseRow br in ((DevExpress.XtraVerticalGrid.Rows.CategoryRow)vtr.Vgc.Rows[0]).ChildRows)
            {
                if (br.Index > 0)
                    br.Properties.Value = DBNull.Value;
            }

            vtr.Vgc.FocusedRow = vtr.Vgc.Rows[0].ChildRows["rowVALE"];
            vtr.OriginalValue = calcTotal();

        }

        void vtr_PayWithNote(object sender, EventArgs e)
        {
            updateData();
            btnValeTercero_Click(sender, e);
        }

        private Controls.ctlExencionImpuesto exImp;
        private decimal amountValue;

        private void btnExencion_Click(object sender, EventArgs e)
        {

            paymentType = 22;
            if (exImp == null)
            {
                exImp = new LLNet.Tienda.MainForms.Controls.ctlExencionImpuesto();
                exImp.PayWithExImp += new EventHandler(exImp_PayWithFinan);
            }
            exImp.Currency = monedaBase;
            exImp.Rate = 1;
            exImp.BeforePayWithExImp += new CancelEventHandler(event_BeforePay);

            InitializeControl(exImp, exImp.Vgc, ref exImp.OriginalValue);

            if (exImp.rowMONTO.Properties.Value != null)
            {
                amountValue = Convert.ToDecimal(exImp.rowMONTO.Properties.Value);
                QueryParams qp = new QueryParams();
                try
                {
                    qp.Clear();
                    qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());
                    qp.AddReplaceParam("DOCUMENTOS", "-1");

                }
                catch
                {
                    qp.Clear();
                    qp.AddReplaceParam("DOCUMENTO", "-1");
                    qp.AddReplaceParam("DOCUMENTOS", p_documentos);


                }

                decimal maxEfectivo = Convert.ToDecimal(CApp.bll.GetSingleValue("TotalImpuesto", qp, "PDV"));

                if (exencionEfectuada) maxEfectivo = 0;

                exImp.OriginalValue = maxEfectivo;
                exImp.rowMONTO.Properties.Value = exImp.OriginalValue;
            }
        }

        void exImp_PayWithFinan(object sender, EventArgs e)
        {
            updateData();
            btnExencion_Click(sender, e);
        }

        private MainForms.Controls.ctlPagosAnticipados pga;

        private void btnAnticipos_Click(object sender, EventArgs e)
        {
            paymentType = 15;
            if (pga == null)
            {
                pga = new LLNet.Tienda.MainForms.Controls.ctlPagosAnticipados();
                pga.PayWithPrepaid += new EventHandler(pga_PayWithPrepaid);
            }
            pga.BeforePayWithPrepaid += new CancelEventHandler(event_BeforePay);

            panelControl3.Controls.Clear();
            pga.Parent = panelControl3;
            pga.Dock = DockStyle.Fill;
            pga.BringToFront();
            pga.Focus();

            updateAmount(pga.Vgc.Rows[0].ChildRows["rowMONTO"]);
            pga.Vgc.Refresh();
            pga.Vgc.Update();
            pga.Vgc.UpdateFocusedRecord();
            pga.Vgc.FocusedRow = pga.Vgc.Rows[0].ChildRows["rowMONTO"];

            if (pga.Vgc.Rows[0].ChildRows["rowMONTO"].Properties.Value != null)
                pga.OriginalValue = Convert.ToDecimal(pga.Vgc.Rows[0].ChildRows["rowMONTO"].Properties.Value);

            if (DsPedido.WMS_DOCUMENTOS.Count > 0)
                pga.Init(new object[] { DsPedido.WMS_DOCUMENTOS[0].SOCIO });
            else
                pga.Init(new object[] { cliente });

            pga.Show();
        }

        void pga_PayWithPrepaid(object sender, EventArgs e)
        {
            updateData();
            btnAnticipos_Click(sender, e);
        }

        private void btnNotaCredito_Click(object sender, EventArgs e)
        {
        }

        private void btnDeposito_Click(object sender, EventArgs e)
        {
        }

        MainForms.Controls.ctlDatosFactura df;
        private void simpleButton1_Click(object sender, EventArgs e)
        {
            paymentType = -1;
            if (df == null)
            {
                df = new LLNet.Tienda.MainForms.Controls.ctlDatosFactura();
            }
            panelControl3.Controls.Clear();
            df.Parent = panelControl3;
            df.Dock = DockStyle.Fill;
            df.BringToFront();
            df.Focus();
            df.Show();
        }

        private void btnTasaCambio_Click(object sender, EventArgs e)
        {
            frmCambiarTasa ct = new frmCambiarTasa();
            Control selCtl = panelControl3.Controls[0];
            switch (selCtl.Name)
            {
                case "ctlCreditCard":
                    if (crd.Currency == monedaBase) return;
                    ct.Init(new object[] { crd.Rate });
                    break;
                case "ctlCash":
                    if (csh.Currency == monedaBase) return;
                    ct.Init(new object[] { csh.Rate });
                    break;
                case "ctlCheck":
                    if (chk.Currency == monedaBase) return;
                    ct.Init(new object[] { chk.Rate });
                    break;
            }

            if (CApp.ValidateAccess("CambiarTasaCambio", "Cambiar Tasa de Cambio en pago específico"))
            {
                ct.ShowDialog();

                if (ct.DialogResult == DialogResult.OK)
                {
                    switch (selCtl.Name)
                    {
                        case "ctlCreditCard":
                            crd.Rate = ct.NuevaTasa.Value;
                            crd.RecalcularMonto();
                            break;
                        case "ctlCash":
                            csh.Rate = ct.NuevaTasa.Value;
                            csh.RecalcularMonto();
                            break;
                        case "ctlCheck":
                            chk.Rate = ct.NuevaTasa.Value;
                            chk.RecalcularMonto();
                            break;
                    }
                }
            }
        }

        private Controls.ctlDeposito dep;

        private void btnDepositos_Click(object sender, EventArgs e)
        {
            paymentType = 10;
            if (dep == null)
            {
                dep = new LLNet.Tienda.MainForms.Controls.ctlDeposito();
                dep.PayWithDeposit += new EventHandler(dep_PayWithDeposit);
            }
            dep.Currency = monedaBase;
            dep.Rate = 1;
            dep.BeforePayWithDeposit += new CancelEventHandler(event_BeforePay);

            InitializeControl(dep, dep.Vgc, ref dep.OriginalValue);

        }

        void dep_PayWithDeposit(object sender, EventArgs e)
        {
            updateData();
            btnDeposito_Click(sender, e);
        }

        private void frmPayments_Activated(object sender, EventArgs e)
        {
            if (CApp.messageBoxForm != null)
            {
                if (CApp.messageBoxForm.IsAccessible)
                    CApp.messageBoxForm.Activate();
            }
        }

        private void btnEnganche_Click(object sender, EventArgs e)
        {
            frmEnganche eng = new frmEnganche();
            eng.Init(new object[] { DsPedido.WMS_DOCUMENTOS[0].TOTAL });
            eng.ShowDialog();

            if (eng.DialogResult == DialogResult.OK)
            {
                montoTotal = Convert.ToDecimal(eng.txtEnganche.EditValue);
                DsPedido.WMS_DOCUMENTOS[0].ENGANCHE = montoTotal;
                updateData();
                simpleButton2_Click(null, null);
            }
        }

        private Controls.ctlProntoPago dpp;

        void dpp_PayWithPP(object sender, EventArgs e)
        {
            updateData();
            btnProntoPago_Click(sender, e);
        }

        private void panelControl3_Paint(object sender, PaintEventArgs e)
        {

        }

        private void simpleButton1_Click_1(object sender, EventArgs e)
        {
            paymentType = 8;
            if (dpp == null)
            {
                dpp = new LLNet.Tienda.MainForms.Controls.ctlProntoPago();
                dpp.PayWithPP += new EventHandler(dpp_PayWithPP);
            }
            dpp.Currency = monedaBase;
            dpp.Rate = 1;
            dpp.BeforePayWithPP += new CancelEventHandler(event_BeforePay);

            InitializeControl(dpp, dpp.Vgc, ref dpp.OriginalValue);

            if (dpp.rowMONTO.Properties.Value != null)
            {
                amountValue = Convert.ToDecimal(dpp.rowMONTO.Properties.Value);
                QueryParams qp = new QueryParams();
                qp.AddReplaceParam("SOCIO", cliente.ToString());
                qp.AddReplaceParam("MONTO", montoTotal.ToString());
                qp.AddReplaceParam("SESION", sesion.ToString());

                decimal maxEfectivo = Convert.ToDecimal(CApp.bll.GetSingleValue("TotalProntoPago", qp, "PDV"));

                if (prontoPagoEfectuado) maxEfectivo = 0;

                dpp.OriginalValue = maxEfectivo;
                dpp.rowMONTO.Properties.Value = dpp.OriginalValue;
            }
        }

        private void btnProntoPago_Click(object sender, EventArgs e)
        {
            paymentType = 8;
            if (dpp == null)
            {
                dpp = new LLNet.Tienda.MainForms.Controls.ctlProntoPago();
                dpp.PayWithPP += new EventHandler(dpp_PayWithPP);
            }
            dpp.Currency = monedaBase;
            dpp.Rate = 1;
            dpp.BeforePayWithPP += new CancelEventHandler(event_BeforePay);

            InitializeControl(dpp, dpp.Vgc, ref dpp.OriginalValue);

            if (dpp.rowMONTO.Properties.Value != null)
            {
                amountValue = Convert.ToDecimal(dpp.rowMONTO.Properties.Value);
                QueryParams qp = new QueryParams();
                qp.AddReplaceParam("SOCIO", cliente.ToString());
                qp.AddReplaceParam("MONTO", montoTotal.ToString());
                qp.AddReplaceParam("SESION", sesion.ToString());

                decimal maxEfectivo = Convert.ToDecimal(CApp.bll.GetSingleValue("TotalProntoPago", qp, "PDV"));

                if (prontoPagoEfectuado) maxEfectivo = 0;

                dpp.OriginalValue = maxEfectivo;
                dpp.rowMONTO.Properties.Value = dpp.OriginalValue;
            }
        }


        #region GMH. FORMA DE PAGO APARTADO
        private void btnApartado_Click(object sender, EventArgs e)
        {
            //SAM 02/12/2019 Validación para evitar error en creación de apartados
            if (gridView1.RowCount > 0)
            {
                GUI.CApp.ShowMessage("Error, no puede realizar un apartado si ya tiene asociada al menos una forma de pago la factura, elimine todas las formas de pago!!", "Error - Apartados", true);
                return;
            }

            paymentType = 10;
            string vIdentificacion = String.Empty;

            if (CApp.ShowMessage("Esta seguro que desea Generar un Apartado?", "Cobros y Facturación", true, true) == DialogResult.OK)
            {

                string varELOA = Helpers.ObjToStr(CApp.GetParam("ELOA")); // ELIMINAMOS OFERTAS CUANDO HAY APARTADOS

                /****************Cambio Factura Electrónica*******************/
                try
                {
                    if (Convert.ToString(DsPedido.WMS_DOCUMENTOS[0].DIRECCION2) != "")
                    {
                        vIdentificacion = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2.ToString();
                    }
                }
                catch (StrongTypingException) { }
                /****************Cambio Factura Electrónica*******************/

                if (varELOA == "S" || varELOA == "A")
                {

                    if (varELOA == "A")
                    {
                        if (CApp.ShowMessage("Este Proceso Eliminara todas las ofertas aplicadas a este documento", "Ofertas", true, true) != DialogResult.OK)
                        {
                            return;
                        }
                    }
                    QueryParams qpOF = new QueryParams();
                    qpOF.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());
                    CApp.bll.ExecuteSql("DeleteOfferToDocument", qpOF, "PDV");
                    Program.FrmMainPos.RefreshData();
                }



                string varELDA = Helpers.ObjToStr(CApp.GetParam("ELDA")); // ELIMINAMOS OFERTAS CUANDO HAY APARTADOS



                if (varELDA == "S" || varELDA == "A")
                {

                    if (varELDA == "A")
                    {
                        if (CApp.ShowMessage("Este Proceso Eliminara todas los descuentos aplicados a este documento", "Descuentos", true, true) != DialogResult.OK)
                        {
                            return;
                        }
                    }
                    QueryParams qpOF = new QueryParams();
                    qpOF.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());
                    CApp.bll.ExecuteSql("DeleteDiscountToDocument", qpOF, "PDV");
                    Program.FrmMainPos.RefreshData();
                }

                // Edited by ECM 11/11/10 - SLA_004: Pregunta si desea aplicar los descuentos en apartados Cliente/Empleado.  
                string tipo_descuento = null;
                frmDesc_Apartados frm = new frmDesc_Apartados();

            R_POINT:

                if (frm.ShowDialog(this) == DialogResult.OK)
                {
                    tipo_descuento = "C";

                }
                else if (frm.empleado == true)
                {
                    tipo_descuento = "E";
                }
                else if (frm.cancelar == true)
                {
                    tipo_descuento = "S";
                    goto R_POINT_2;

                }

                if (tipo_descuento == null)
                {
                    GUI.CApp.ShowMessage("Debe de seleccionar alguna de las opciones anteriores!!", "Error - Descuentos en Apartados", true);
                    goto R_POINT;
                }
                else
                {


                    QueryParams ParamsApart = new QueryParams();
                    ParamsApart.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());
                    ParamsApart.AddReplaceParam("tipo_descuento", tipo_descuento);


                    CApp.bll.ExecuteSql("DescuentosApartados", ParamsApart, "PDV");
                    Program.FrmMainPos.RefreshData();
                    // end of - SLA_004
                }

            R_POINT_2:
                QueryParams qp = new QueryParams();
                if (DsFactura.WMS_DOCUMENTOS.Count == 0)
                {
                    QueryParams qpX = new QueryParams();
                    decimal DocProcesado = 0;
                    qpX.Clear();
                    qpX.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    DocProcesado = Convert.ToDecimal(CApp.bll.GetSingleValue("DocumentoProcesado", qpX, "PDV"));

                    if (DocProcesado > 0)
                    {
                        CApp.ShowMessage("Este Pedido ya fue Facturado, porfavor revise su Jornada", "Documento Procesado", true);
                        return;
                    }



                    decimal inv = CreateInvoice();
                    if (inv == -1)
                        return;
                }

                DsFactura.WMS_DOCUMENTOS[0].SALDO = DsPedido.WMS_DOCUMENTOS[0].TOTAL - Convert.ToDecimal(rowAbonado.Properties.Value);
                //string varPLAP = Utils.Helpers.ObjToStr(GUI.CApp.GetParam("PLAP"));  // OBTENEMOS LOS DIAS DE VIGENCIA DE LOS APARTADOS
                DsFactura.WMS_DOCUMENTOS[0].FECHA_VENCIMIENTO = DateTime.Today.AddDays(Convert.ToDouble(Helpers.ObjToStr(CApp.GetParam("PLAP"))));
                DsFactura.WMS_DOCUMENTOS[0].APARTADO = "S";// MARCAMOS LA FACTURA COMO DE APARTADO


                object[] objFac = new object[] { DsPedido, DsFactura, DsRecibo, Program.Jornada, dsNotaCredito, DsVale, Program.FrmMainPos.DsVale };

                try
                {
                    #region WRLG. DESARROLLO DE GARANTIAS

                    qp.Clear();
                    qp.AddReplaceParam("DOCUMENTO", DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                    if (!IngresarGarantias(qp))
                    {
                        CApp.ShowMessage("No es posible facturar sin tener los datos de garantías a generar", "Cobros y Facturación", true);
                        return;
                    }

                    #endregion

                    /****************Cambio Factura Electrónica*******************/
                    try
                    {
                        if (Convert.ToString(DsPedido.WMS_DOCUMENTOS[0].DIRECCION2) != "")
                        {
                            DsFactura.WMS_DOCUMENTOS[0].DIRECCION2 = DsPedido.WMS_DOCUMENTOS[0].DIRECCION2;
                        }
                    }
                    catch (StrongTypingException) { }
                    /****************Cambio Factura Electrónica*******************/

                    CApp.bll.RemoteExecute("PDV", "Facturacion", objFac);

                    qp.Clear();
                    qp.AddReplaceParam("DOCUMENTO", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());

                    string MarcarFact = CApp.GetParam("MDSE").ToString();

                    if (MarcarFact.ToUpper() == "SI")
                    {
                        qp.AddReplaceParam("SOCIO", DsFactura.WMS_DOCUMENTOS[0].SOCIO.ToString());
                        string SocioNoExento = CApp.bll.GetSingleValue("SocioNoExcento", qp, "PDV").ToString();

                        if (Convert.ToInt32(SocioNoExento) > 0)
                            CApp.bll.ExecuteSql("MarcaFactura", qp, "PDV");


                    }

                    string facturaExenta = CApp.bll.GetSingleValue("TieneExencionImpuestos", qp, "PDV").ToString();
                    if (facturaExenta == "1")
                    {
                        CApp.bll.ExecuteSql("UpdateImpuestos", qp, "PDV");
                    }

                }
                catch (Exception ex)
                {
                    if (ex.Message.IndexOf("DOCU_UK01") > 0)
                        CApp.ShowMessage("Uno de los documentos a generar ya existe, verifique las secuencias de documentos", "Facturación", true);
                    else
                        CApp.ShowMessage(ex.Message, "Facturación", true);
                    return;
                }

                DsPedido = objFac[0] as Model.PDV.DsPDV;
                DsFactura = objFac[1] as Model.PDV.DsPDV;
                DsRecibo = objFac[2] as Model.PDV.DsPDV;
                DsVale = objFac[5] as Model.PDV.DsPDV;

                long documento = (long)DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                string sdocumento = DsFactura.WMS_DOCUMENTOS[0]["SUBTIPO_DOCUMENTO"].ToString();

            startPrinting001:
                try
                {
                    /****************Cambio Factura Electrónica*******************/
                    mTrama(documento);

                    printInvoice(documento, sdocumento);
                    /****************Cambio Factura Electrónica*******************/
                }
                catch (Exception ex)
                {
                    if (CApp.ShowMessage("Error en la impresión de facturas, verifique que la impresora esté lista, ¿desea intentar de nuevo?", "Impresión de Facturas", true, true) == DialogResult.OK)
                        goto startPrinting001;
                }

                printDocuments(documento);

                this.Hide();
                this.Close();
                newOrder();
            }

        }
        #endregion

        private void btnTransferencia_Click(object sender, EventArgs e)
        {
            paymentType = 9;
            if (cBanktranfer == null)
            {
                cBanktranfer = new LLNet.Tienda.MainForms.Controls.ctlBankTransfer();
                cBanktranfer.PayWithTransfer += new EventHandler(tranfer_PayWithTransfer);
            }
            cBanktranfer.Currency = monedaBase;
            cBanktranfer.Rate = 1;
            cBanktranfer.BeforePayWithTransfer += new CancelEventHandler(event_BeforePay);

            InitializeControl(cBanktranfer, cBanktranfer.Vgc, ref cBanktranfer.OriginalValue);
        }

        private void btnObservacion_Click(object sender, EventArgs e)
        {
            Helpers.pdocumento = DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
            try
            {
                QueryParams qp = new QueryParams();
                qp.Clear();
                string documento = Helpers.pdocumento.ToString();
                qp.AddReplaceParam("DOCUMENTO", documento.ToString());

                string Observ = (CApp.bll.GetSingleValue("GetComments", qp, "PDV").ToString());
                observacion = Observ.ToString();
            }
            catch { }

            LLNet.Tienda.Dialogs.Observations.dlgEfectivoEmpresa obs = new LLNet.Tienda.Dialogs.Observations.dlgEfectivoEmpresa(observacion);
            observacion = obs.Observacion();
            obs.ShowDialog();

            if (obs.DialogResult == DialogResult.OK)
                observacion = obs.Observacion();
        }

        private void btnPoints_Click(object sender, EventArgs e)
        {
            if (Helpers.Nvl(CApp.GetParam("DPTS"), "N").ToString() != "S")
            {
                if (GUI.CApp.ValidateAccess("PagarconPTS", "Pagar con Puntos"))
                {
                    //Verificación, si al menos un artículo es de la UEN Tecnología, se desactiva
                    //el uso de pago con puntos
                    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_TECNO", vQp, "PDV").ToString());

                    if (vValidaAlgunTecno.Equals("1"))
                    {
                        CApp.ShowMessage("NO es permitido el uso de puntos para compra de productos tecnológicos", "Error", true);
                    }
                    else
                    {
                        LLNet.Tienda.MainForms.Forms.MisPuntos.frmNumTarjeta frmtrj = new LLNet.Tienda.MainForms.Forms.MisPuntos.frmNumTarjeta(DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        frmtrj.ShowDialog();
                        //Puntos = Convert.ToDecimal(Consultar_Puntos(frmtrj.tarjeta));
                        Puntos = Convert.ToDecimal(frmtrj.pts);
                        PuntosDisp = Puntos;
                        TarjPagarMPts = frmtrj.tarjeta;
                        paymentType = 16;
                        if (cPoints == null)
                        {
                            cPoints = new LLNet.Tienda.MainForms.Controls.ctlPoints();
                            cPoints.PayWithPoints += new EventHandler(cPoints_PayWithPoints);
                        }
                        cPoints.Currency = monedaBase;
                        cPoints.Rate = 1;
                        cPoints.BeforePayWithPoints += new CancelEventHandler(event_BeforePay);

                        InitializeControl(cPoints, cPoints.Vgc, ref cPoints.OriginalValue);

                        //Evitar que valide los puntos por cliente DLQG
                        //cPoints.OriginalValue = Puntos;
                        cPoints.rowSaldo.Properties.Value = cPoints.OriginalValue;
                    }
                }
                else
                {
                    GUI.CApp.ShowMessage("Sistema de Puntos fuera de Servicio", "Sistema de Puntos", true);
                }
            }
        }



        void cPoints_PayWithPoints(object sender, EventArgs e)
        {
            cPoints.rowSaldo.Properties.Value = Math.Round(Convert.ToDecimal(cPoints.rowSaldo.Properties.Value) - Convert.ToDecimal(cPoints.rowMONTO.Properties.Value), 2);
            Puntos = Convert.ToDecimal(cPoints.rowSaldo.Properties.Value);
            PuntosPaga = Convert.ToDecimal(cPoints.rowMONTO.Properties.Value);
            /*DLQG QUITAR POR LO DE MIS PUNTOS
            DsPedido.WMS_SOCIOS[0].PUNTOS = Puntos;
            */
            updateData();
            btnCobrar_Click(sender, e);
        }

        private void btnAsociaciones_Click(object sender, EventArgs e)
        {
            QueryParams qp = new QueryParams();
            long vDocumento = 0;

            qp.AddReplaceParam("SOCIO", DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());

            decimal disponible = Convert.ToDecimal(CApp.bll.GetSingleValue("AvailableCredit", qp, "PDV"));

            if (DsPedido.WMS_DOCUMENTOS[0].TOTAL - Convert.ToDecimal(rowAbonado.Properties.Value) > disponible)
            {
                CApp.ShowMessage("El total de la factura excede al crédito disponible para el cliente", "Cobros y Facturación", true);

                if (!CApp.ValidateAccess("AutFacSLimite", "Autorización de Facturas Sobre Límite de Crédito"))
                    return;
            }
            else
            {
                vDocumento = (long)Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO;
                this.SocioAsociacionFE = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString();

                if (DsFactura.WMS_DOCUMENTOS.Count == 0)
                {
                    QueryParams qpX = new QueryParams();
                    decimal DocProcesado = 0;
                    qpX.Clear();
                    qpX.AddReplaceParam("DOCUMENTO", vDocumento.ToString());
                    DocProcesado = Convert.ToDecimal(CApp.bll.GetSingleValue("DocumentoProcesado", qpX, "PDV"));

                    if (DocProcesado > 0)
                    {
                        CApp.ShowMessage("Este Pedido ya fue Facturado, por favor revise su Jornada", "Documento Procesado", true);
                        return;
                    }

                    decimal inv = CreateInvoice();
                    if (inv == -1)
                        return;
                }

                //DsFactura.WMS_DOCUMENTOS[0].SALDO = DsPedido.WMS_DOCUMENTOS[0].TOTAL - Convert.ToDecimal(rowAbonado.Properties.Value);
                DsFactura.WMS_DOCUMENTOS[0].FECHA_VENCIMIENTO = DateTime.Today.AddDays(Convert.ToDouble(Helpers.Nvl(DsPedido.WMS_SOCIOS[0]["PLAZO_PAGO"], 0)));

                paymentType = 31;
                if (cAsociaciones == null)
                {
                    cAsociaciones = new LLNet.Tienda.MainForms.Controls.ctlAsociaciones();
                    cAsociaciones.PayWithAsociaciones += new EventHandler(cAsociaciones_PayWithAsociaciones);
                }
                cAsociaciones.Currency = monedaBase;
                cAsociaciones.Rate = 1;
                cAsociaciones.BeforePayWithAsociaciones += new CancelEventHandler(event_BeforePay);

                InitializeControl(cAsociaciones, cAsociaciones.Vgc, ref cAsociaciones.OriginalValue);


                mAsociarDocAsociacionConCliente(vDocumento, this.SocioAsociacionFE, "FE", pAsociacion: true);
            }
        }

        void cAsociaciones_PayWithAsociaciones(object sender, EventArgs e)
        {
            updateData();
            btnCobrar_Click(sender, e);
        }

        private void frmPayments_FormClosing(object sender, FormClosingEventArgs e)
        {
            PuntosPaga = 0;
            PuntosDisp = 0;
        }

        #region btnGiftCard_Click
        private void btnGiftCard_Click(object sender, EventArgs e)
        {
            try
            {
                if (Helpers.Nvl(CApp.GetParam("DPTS"), "N").ToString() != "S")
                {
                    LLNet.Tienda.MainForms.Forms.GiftCard.FrmNumGiftCard frmtrj = new LLNet.Tienda.MainForms.Forms.GiftCard.FrmNumGiftCard();
                    frmtrj.ShowDialog();
                    //Saldo de la GiftCard
                    GiftCardSaldo = Convert.ToDecimal(frmtrj.saldo);
                    MontoGCDisp = GiftCardSaldo;
                    TarjPagarGiftCard = frmtrj.tarj;
                    paymentType = 14;
                    if (cGiftCard == null)
                    {
                        cGiftCard = new LLNet.Tienda.MainForms.Controls.ctlGiftCard();
                        cGiftCard.PayWithGiftCard += new EventHandler(cGiftCard_PayWithGiftCard);
                    }
                    cGiftCard.Currency = monedaBase;
                    cGiftCard.Rate = 1;
                    cGiftCard.BeforePayWithGiftCard += new CancelEventHandler(event_BeforePay);

                    InitializeControl(cGiftCard, cGiftCard.Vgc, ref cGiftCard.OriginalValue);

                    //Evitar que valide los puntos por cliente DLQG
                    //cPoints.OriginalValue = Puntos;
                    cGiftCard.rowSaldo.Properties.Value = cGiftCard.OriginalValue;
                }
                else
                {
                    GUI.CApp.ShowMessage("Sistema de GiftCard fuera de Servicio", "Sistema de GiftCard", true);
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Gift Card", true);
            }
        }

        void cGiftCard_PayWithGiftCard(object sender, EventArgs e)
        {
            cGiftCard.rowSaldo.Properties.Value = Math.Round(Convert.ToDecimal(cGiftCard.rowSaldo.Properties.Value) - Convert.ToDecimal(cGiftCard.rowMONTO.Properties.Value), 2);
            GiftCardSaldo = Convert.ToDecimal(cGiftCard.rowSaldo.Properties.Value);
            MontoGCPaga = Convert.ToDecimal(cGiftCard.rowMONTO.Properties.Value);
            /*DLQG QUITAR POR LO DE MIS PUNTOS
            DsPedido.WMS_SOCIOS[0].PUNTOS = Puntos;
            */
            updateData();
            btnCobrar_Click(sender, e);
        }
        #endregion

        private void btnMonederoAlo_Click(object sender, EventArgs e)
        {
            if (GUI.CApp.ValidateAccess("Monedero", "Monedero Electronico Alo"))
            {
                paymentType = 33;
                if (cMonederoAlo == null)
                {
                    cMonederoAlo = new LLNet.Tienda.MainForms.Controls.ctlMonederoAlo();
                    cMonederoAlo.PayWithMonederoAlo += new EventHandler(cMonederoAlo_PayWithMonederoAlo);
                }

                cMonederoAlo.Currency = monedaBase;
                cMonederoAlo.Rate = 1;
                cMonederoAlo.BeforePayWithMonederoAlo += new CancelEventHandler(event_BeforePay);

                InitializeControl(cMonederoAlo, cMonederoAlo.Vgc, ref cMonederoAlo.OriginalValue);
            }
            else
            {
                GUI.CApp.ShowMessage("No tienes permiso para utilizar el monedero", "Monedero Electronico Alo", true);
            }
        }

        private void btnCredix_Click(object sender, EventArgs e)
        {
            if (GUI.CApp.ValidateAccess("Credix", "Pago con Credix"))
            {
                paymentType = 32;
                if (cCredix == null)
                {
                    cCredix = new LLNet.Tienda.MainForms.Controls.ctlCredix();
                    cCredix.PayWithCredix += new EventHandler(cCredix_PayWithCredix);
                }

                cCredix.Currency = monedaBase;
                cCredix.Rate = 1;
                cCredix.BeforePayWithCredix += new CancelEventHandler(event_BeforePay);

                InitializeControl(cCredix, cCredix.Vgc, ref cCredix.OriginalValue);
            }
            else
            {
                GUI.CApp.ShowMessage("No tienes permiso para utilizar Credix", "Pago con Credix", true);
            }
        }

        void cCredix_PayWithCredix(object sender, EventArgs e)
        {
            updateData();
            //btnCredix_Click(sender, e);
            btnCobrar_Click(sender, e);
        }
        void cFlexi_PayWithFlexi(object sender, EventArgs e)
        {
            updateData();
            btnFlexi_Click(sender, e);

        }

        void cSINPE_PayWithSINPE(object sender, EventArgs e)
        {
            updateData();
            btnSINPE_Click(sender, e);

        }

        void cZunify_PayWithZunify(object sender, EventArgs e)
        {
            updateData();
            btnZunify_Click(sender, e);

        }


        void cMonederoAlo_PayWithMonederoAlo(object sender, EventArgs e)
        {
            updateData();
            //btnMonederoAlo_Click(sender, e);            
            btnCobrar_Click(sender, e);
        }

        void cCredCuotsEk_PayWithCredCuotsEk(object sender, EventArgs e)
        {
            updateData();
            //btnMonederoAlo_Click(sender, e);            
            btnCobrar_Click(sender, e);
        }

        private void btnZunify_Click(object sender, EventArgs e)
        {
            paymentType = 40;
            decimal total = calcTotal();            
            if (total > 0)
            {
                panelControl3.Controls.Clear();
                if (cZunify == null)
                {
                    //cZunify = new LLNet.Tienda.MainForms.Controls.ctlZunify(DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    if (DsPedido.WMS_DOCUMENTOS.Count() > 0)
                    {
                        cZunify = new LLNet.Tienda.MainForms.Controls.ctlZunify(DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    }
                    else
                    { //no tiene pedido
                        cZunify = new LLNet.Tienda.MainForms.Controls.ctlZunify(String.Empty);
                    }
                    cZunify.PayWithZunify += new EventHandler(cZunify_PayWithZunify);
                }


                cZunify.Currency = monedaBase;
                cZunify.Rate = 1;
                cZunify.BeforePayWithZunify += new CancelEventHandler(event_BeforePay);

                InitializeControl(cZunify, cZunify.Vgc, ref cZunify.OriginalValue);
                

            }
        }

        private void btnCredCuotsEk_Click(object sender, EventArgs e)
        {
            if (GUI.CApp.ValidateAccess("CredicuotasEk", "Pago con Credicuotas Ekono"))
            {
                /*
                //Almacena el pago con crediE
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                // Llama el procedimiento que almacena la tarjeta 
                GUI.CApp.bll.ExecuteSql("WMS_ASocioCrediE", qp, "PDV");
                */

                paymentType = 34;
                if (cCredCuotsEk == null)
                {
                    cCredCuotsEk = new LLNet.Tienda.MainForms.Controls.ctlCredicuotsEk();
                    cCredCuotsEk.PayWithCredicuotasEk += new EventHandler(cCredCuotsEk_PayWithCredCuotsEk);
                }

                cCredCuotsEk.Currency = monedaBase;
                cCredCuotsEk.Rate = 1;
                cCredCuotsEk.BeforePayWithCredicuotasEk += new CancelEventHandler(event_BeforePay);

                InitializeControl(cCredCuotsEk, cCredCuotsEk.Vgc, ref cCredCuotsEk.OriginalValue);
            }
            else
            {
                GUI.CApp.ShowMessage("No tienes permiso para utilizar Credie Ekono", "Pago con Credie", true);
            }
        }

        #region chkFacturaElect_CheckedChanged
        private void chkFacturaElect_CheckedChanged(object sender, EventArgs e)
        {
            string vTipo = string.Empty;
            try
            {
                if (chkFacturaElect.Checked)
                {
                    QueryParams vParametros = new QueryParams();
                    vParametros.AddReplaceParam("pSOCIO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString());
                    vParametros.AddReplaceParam("pIDENTIFICACION", DBNull.Value.ToString());
                    vTipo = "TEC";//tiquete electronico del cliente
                    //
                    string vIdentificacion = Convert.ToString(GUI.CApp.bll.GetSingleValue("FE_F_IDENTIFICACION_INST", vParametros, "PDV"));

                    try
                    {
                        if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2.ToString() == vIdentificacion)
                        {
                            chkFacturaElect.CheckedChanged -= chkFacturaElect_CheckedChanged;

                            chkFacturaElect.Checked = false;
                            this.chkFacturaElect.Properties.Caption = "[Alt + R]                                     Factura Electrónica";

                            chkFacturaElect.CheckedChanged += chkFacturaElect_CheckedChanged;

                            CApp.ShowMessage("La opción de tiquete electrónico no está disponible con el pedido, si necesita dejar la factura como tiquete electrónico, seleccione en datos documento, consumidor final", "Cobros y Facturación", true);
                        }
                        else
                        {
                            this.chkFacturaElect.Properties.Caption = "[Alt + R]                                     Tiquete Electrónico";
                            Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2 = null;
                            this.chkFacturaElect.Checked = true;
                        }
                    }
                    catch (StrongTypingException)
                    {
                        this.chkFacturaElect.Properties.Caption = "[Alt + R]                                     Tiquete Electrónico";
                        Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DIRECCION2 = null;
                        this.chkFacturaElect.Checked = true;
                    }

                }
                else
                {
                    vTipo = "FEC";//factura electronica del cliente
                    this.chkFacturaElect.Properties.Caption = "[Alt + R]                                     Factura Electrónica";
                    mReceptor();
                }
                //si hay relacion entre cliente y asociacion 
                if (this.relacionFEClienteAsocicion)
                {
                    //actualiza la relacion cliente asociacion
                    mAsociarDocAsociacionConCliente((long)Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO,
                                                    this.SocioAsociacionFE,
                                                    vTipo,
                                                    false,
                                                    pSocioCliente: this.SocioClienteFE);
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage("Ocurrió un Error en la Aplicación: \r\n" + ex.Message + "\r\nRepórtelo a su Departamento de Soporte", "", true);
            }
        }
        #endregion

        private void btnFlexi_Click(object sender, EventArgs e)
        {
            //if (GUI.CApp.ValidateAccess("Flexi", "Pago con Flexi"))
            //{
            paymentType = 35;

            if (cFlexi == null)
            {
                cFlexi = new LLNet.Tienda.MainForms.Controls.ctlFlexi();
                cFlexi.PayWithFlexi += new EventHandler(cFlexi_PayWithFlexi);
            }

            cFlexi.Currency = monedaBase;
            cFlexi.Rate = 1;
            cFlexi.BeforePaywithFlexi += new CancelEventHandler(event_BeforePay);

            InitializeControl(cFlexi, cFlexi.vGridControl, ref cFlexi.OriginalValue);
            cFlexi.vGridControl.FocusedRow = cFlexi.vGridControl.Rows[0].ChildRows["rowVoucher"];
            //}
            //else
            //{
            //    GUI.CApp.ShowMessage("No tienes permiso para utilizar Flexi", "Pago con Flexi", true);
            //}
        }

        private void chkAsociarCorreo_CheckedChanged(object sender, EventArgs e)
        {

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.Count > 0)
            {
                long vDocumento = (long)Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO;

                //si se debe relacionar la asociacion y si no se a relacionado 
                if (chkAsociarCorreo.Checked && !this.relacionFEClienteAsocicion)
                {
                    if (!this.esAsociacion)
                    {
                        string vTipo = "FEC";
                        //Busca el ASOCIACION
                        LLNet.Tienda.MainForms.Finders.frmFindCustomerFEAssociation dat = new LLNet.Tienda.MainForms.Finders.frmFindCustomerFEAssociation();

                        dat.Init(null);
                        dat.ShowDialog(this);

                        try
                        {
                            if (!string.IsNullOrEmpty(dat.Socio))
                            {

                                if (chkFacturaElect.Checked)
                                    vTipo = "TEC";

                                this.SocioAsociacionFE = dat.Socio;
                                this.SocioClienteFE = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO.ToString();
                                mAsociarDocAsociacionConCliente(vDocumento,
                                                                 this.SocioAsociacionFE,
                                                                 vTipo,
                                                                 false,
                                                                 pSocioCliente: this.SocioClienteFE);
                            }
                        }
                        catch
                        { //ENTRA AL CATCH PORQUE EL CLIENTE no cuenta con datos

                        }
                    }

                }
                else
                {
                    mDeleteRelacionDocAsociacionConCliente(vDocumento, true);
                }
            }

        }

        #region Metodos SINPE MOVIL

        private void btnSINPE_Click(object sender, EventArgs e)
        {
            paymentType = 37;
            /**************IGF******************/
            panelControl3.Controls.Clear();
            //
            decimal total = calcTotal();
            if (total > 0)
            {
                // string emisor = Helpers.Nvl(CApp.GetParam("EMI"), "").ToString();


                //#region Emisor
                //  FrmSINPE_Movil emi = new FrmSINPE_Movil(total);

                if (cSinpeMovil == null)
                {
                    cSinpeMovil = new LLNet.Tienda.MainForms.Controls.ctlSinpeMovil();
                    cSinpeMovil.PayWithSinpe += new EventHandler(cSINPE_PayWithSINPE);
                }

                cSinpeMovil.Currency = monedaBase;
                cSinpeMovil.Rate = 1;
                cSinpeMovil.BeforePaywithSinpe += new CancelEventHandler(event_BeforePay);

                InitializeControl(cSinpeMovil, cSinpeMovil.Vgc, ref cSinpeMovil.OriginalValue);


            }
        }


        public bool mObtenerTokenSinpe(string pDocumento)
        {

            QueryParams param = new QueryParams();

            try
            {

                DataSet ds_datos = CApp.bll.getDataSet("PDV", "ObtTokenSM");


                if (ds_datos.Tables[0].Rows[0]["URL_TOKEN"].ToString() != "")
                {

                    var client = new RestClient(ds_datos.Tables[0].Rows[0]["URL_TOKEN"].ToString());
                    client.Timeout = -1;
                    var request = new RestRequest(Method.POST);
                    request.AddHeader("Content-Type", "application/json");
                    request.AddParameter("application/json", "{" +
                                                         "\r\n \"username\" : \"" + ds_datos.Tables[0].Rows[0]["USUARIO"].ToString() + "\"," +
                                                         "\r\n  \"password\" : \"" + ds_datos.Tables[0].Rows[0]["PASSWORD"].ToString() + "\"" +
                                                         "\r\n}", ParameterType.RequestBody);

                    IRestResponse response = client.Execute(request);

                    Token objToken = JsonConvert.DeserializeObject<Token>(response.Content);

                    if (objToken.mensaje == null)
                    {

                        param.AddReplaceParam("pDOCUMENTO", pDocumento.ToString());
                        param.AddReplaceParam("pTOKEN", objToken.access_token);
                        param.AddReplaceParam("pEXPIRA_EN", objToken.expires_in);
                        param.AddReplaceParam("pTOKEN_REFRES", objToken.expires_in);
                        param.AddReplaceParam("pCAJA", objToken.caja_id);
                        param.AddReplaceParam("pCambContra", objToken.codigoCambiaContrasena);

                        GUI.CApp.bll.ExecuteSql("InsertToken", param, "PDV");

                        vTokenSinpe = objToken.access_token;


                        return true;
                    }
                    else
                    {
                        GUI.CApp.ShowMessage(objToken.mensaje, "ERROR SINPE MOVIL", true);
                        return false;
                    }
                }
                else
                {
                    GUI.CApp.ShowMessage("No esta configurada la URL del TOKEN", "Pago con SINPE MOVIL", true);
                    return false;
                }



            }
            catch (Exception Ex)
            {
                GUI.CApp.ShowMessage(Ex.Message, "Pago con SINPE MOVIL", true);

                return false;
            }

        }

        public bool mVincular_Pago_Sinpe(int pID, string pToken, string pCedula, decimal pMonto, string pDocumento)
        {
            bool v_resp = true;

            try
            {

                Utils.QueryParams param = new QueryParams();


                param.AddReplaceParam("pCAJA", Program.Caja.ToString());

                DataSet ds_caja = CApp.bll.getDataSet("PDV", "ObtCaja", param);
                DataSet ds_datos = CApp.bll.getDataSet("PDV", "ObtTokenSM");



                if (ds_datos.Tables[0].Rows[0]["URL_PAGO"].ToString() != "")
                {

                    if (ds_caja.Tables[0].Rows.Count > 0)
                    {

                        var client = new RestClient(ds_datos.Tables[0].Rows[0]["URL_PAGO"].ToString());
                        client.Timeout = -1;
                        var request = new RestRequest(Method.POST);
                        request.AddHeader("Authorization", "Bearer " + pToken);
                        request.AddHeader("Content-Type", "application/json");
                        request.AddParameter("application/json",
                                                     "{\r\n  \"IdClienteOrigen\" : \"" + pCedula + "\"," +
                                                      "\r\n  \"Moneda\" : \"1\"," +
                                                      "\r\n  \"Monto\" : " + pMonto + "," +
                                                      "\r\n  \"IdCaja\" : \"" + ds_caja.Tables[0].Rows[0]["KEY"].ToString() + "\"," +
                                                      "\r\n  \"IdCajero\" : \"" + ds_caja.Tables[0].Rows[0]["USERNAME"].ToString() + "\"," +
                                                      "\r\n  \"DatosAdicionales\": [{ \r\n  \"Llave\": \"Documento\"," +
                                                      "\r\n  \"Valor\": \"" + pDocumento + "\"" +
                                                      "\r\n}] \r\n \r\n}", ParameterType.RequestBody);

                        IRestResponse response = client.Execute(request);
                        Sinpe_Movil objSinpe_Movil = JsonConvert.DeserializeObject<Sinpe_Movil>(response.Content);


                        if (request.Parameters[2].ToString() != string.Empty || response.Content != string.Empty)
                        {
                            param = new QueryParams();

                            param.AddReplaceParam("pID", pID.ToString());
                            param.AddReplaceParam("pDOCUMENTO", pDocumento.ToString());
                            param.AddReplaceParam("pREQUEST", request.Parameters[2].ToString());
                            param.AddReplaceParam("pRESPONSE", response.Content.ToString());
                            param.AddReplaceParam("pJORNADA", Program.Jornada.ToString());
                            param.AddReplaceParam("pUSUARIO", GUI.CApp.usuario);

                            GUI.CApp.bll.ExecuteSql("InsertTrans", param, "PDV");


                        }



                        if (objSinpe_Movil.codRespuesta != null)
                        {
                            Utils.QueryParams pq = new QueryParams();

                            pq.AddReplaceParam("pID", pID.ToString());
                            pq.AddReplaceParam("pDOCUMENTO", pDocumento);
                            pq.AddReplaceParam("pCODIGO", objSinpe_Movil.codRespuesta);
                            pq.AddReplaceParam("pDESCRIPCION", objSinpe_Movil.descripcion);

                            GUI.CApp.bll.ExecuteSql("InsertRespPago", pq, "PDV");


                            if (int.Parse(objSinpe_Movil.codRespuesta) != 0)
                            {
                                v_resp = false;
                                GUI.CApp.ShowMessage(objSinpe_Movil.descripcion, "ERROR SINPE MOVIL", true);

                            }
                        }
                        else
                        {
                            v_resp = false;
                            GUI.CApp.ShowMessage("No hay respuesta del BANCO en vincular el pago", "ERROR SINPE MOVIL", true);
                        }


                    }
                    else
                    {
                        v_resp = false;
                        GUI.CApp.ShowMessage("La caja no se encuentra configurada para realizar pagos de SINPE MOVIN", "ERROR SINPE MOVIL", true);
                    }

                }
                else
                {
                    v_resp = false;
                    GUI.CApp.ShowMessage("No esta configurada la URL de la vinculacion del pago", "ERROR SINPE MOVIL", true);
                }




            }
            catch (Exception vEx)
            {
                v_resp = false;
                GUI.CApp.ShowMessage(vEx.Message, "Pago con SINPE MOVIL", true);

            }

            return v_resp;

        }

        #endregion


    }

    public class Token
    {
        public string access_token { get; set; }
        public string expires_in { get; set; }
        public string refresh_token { get; set; }
        public string caja_id { get; set; }
        public string codigoCambiaContrasena { get; set; }
        public string mensaje { get; set; }

    }

    public class Sinpe_Movil
    {
        public string codRespuesta { get; set; }
        public string descripcion { get; set; }
    }

}