using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using LLNet.Tienda.MainForms.Forms;

namespace LLNet.Tienda.MainForms.Controls
{
    public partial class ctlAddSkus : LLNet.GUI.ControlBases.ctlBase
    {
        #region Properties

        private int sign = 1;
        private decimal lastLine = 0;
        private decimal cant_grid = 0;
        private string v_sku = "";
        private string vDescripSku = ""; //STEVEN ARCE 10/2018
        private string[] vCodEbox = new string[2]; //STEVEN ARCE 10/2018
        
        // Modif. Marjorie Arce 12-01-2017
        DateTime vTiempofinal;
        DateTime vTiempoinicial;
        DateTime vConteoInicialTecleo;
        public Forms.frmOrderDetail pos;

        public Model.PDV.DsPDV DataSource
        {
            get
            {
                if (!DesignMode)
                    return Program.FrmMainPos.DsPedido as Model.PDV.DsPDV;
                else
                    return null;
            }
        }

        public Model.PDV.DsPDV DataSrcRefund
        {
            get { return Program.FrmMainPos.DsDevolucion as Model.PDV.DsPDV; }
        }

        #endregion

        #region Constructor

        public ctlAddSkus()
        {
            InitializeComponent();
            if (!DesignMode)
            {
                txtSku.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.RegEx;
                txtSku.Properties.Mask.EditMask = Program.regexDefault;
            }

            GUI.CApp.TraducirForm(this);
        }

        #endregion

        #region Public Methods

        public void Clear()
        {
            txtCantidad.EditValue = "1";
            txtSku.EditValue = "";
            txtDescripcion.EditValue = "";
            txtPrecio.EditValue = "";
        }

        public void SetNegative()
        {
            sign = -1;
        }

        public void SetPositive()
        {
            sign = 1;
        }


        #endregion

        #region Properties

        private decimal? documentoPTS;

        public decimal? DocumentoPTS
        {
            get { return documentoPTS; }
            set { documentoPTS = value; }
        }

        private decimal? documento;

        public decimal? Documento
        {
            get { return documento; }
            set { documento = value; }
        }

        private decimal? linea;

        public decimal? Linea
        {
            get { return linea; }
            set { linea = value; }
        }

        private decimal? lineaPadre;

        public decimal? LineaPadre
        {
            get { return lineaPadre; }
            set { lineaPadre = value; }
        }

        private decimal? vale;

        public decimal? Vale
        {
            get { return vale; }
            set { vale = value; }
        }

        private decimal? precioUnitario;

        public decimal? PrecioUnitario
        {
            get { return precioUnitario; }
            set { precioUnitario = value; }
        }

        private decimal? impuesto;

        public decimal? Impuesto
        {
            get { return impuesto; }
            set { impuesto = value; }
        }

        private decimal? descuento;

        public decimal? Descuento
        {
            get { return descuento; }
            set { descuento = value; }
        }

        private DateTime? entrega;

        public DateTime? Entrega
        {
            get { return entrega; }
            set { entrega = value; }
        }

        private decimal? bodega;

        public decimal? Bodega
        {
            get { return bodega; }
            set { bodega = value; }
        }

        private decimal? bodega2;

        public decimal? Bodega2
        {
            get { return bodega2; }
            set { bodega2 = value; }
        }

        private string direccion;

        public string Direccion
        {
            get { return direccion; }
            set { direccion = value; }
        }

        private decimal? region;

        public decimal? Region
        {
            get { return region; }
            set { region = value; }
        }

        private string usuario;

        public string Usuario
        {
            get
            {
                if (!DesignMode)
                {
                    if (DataSource.WMS_DOCUMENTOS.Count > 0)
                        return DataSource.WMS_DOCUMENTOS[0].USUARIO1;
                    else
                        return GUI.CApp.usuario;
                }
                else
                    return null;
            }
            set { usuario = value; }
        }

        private string usuario1;

        public string Usuario1
        {
            get { return usuario1; }
            set { usuario1 = value; }
        }

        private string usuario2;
        public string Usuario2
        {
            get { return usuario2; }
            set { usuario2 = value; }
        }

        private string usuario3;
        public string Usuario3
        {
            get { return usuario3; }
            set { usuario3 = value; }
        }

        private decimal? porcentaje1;
        public decimal? Porcentaje1
        {
            get { return porcentaje1; }
            set { porcentaje1 = value; }
        }

        private decimal? porcentaje2;
        public decimal? Porcentaje2
        {
            get { return porcentaje2; }
            set { porcentaje2 = value; }
        }

        private decimal? porcentaje3;
        public decimal? Porcentaje3
        {
            get { return porcentaje3; }
            set { porcentaje3 = value; }
        }

        private decimal? motivoDevolucion;
        public decimal? MotivoDevolucion
        {
            get { return motivoDevolucion; }
            set { motivoDevolucion = value; }
        }

        private bool? donacion;
        public bool? Donacion
        {
            get { return donacion; }
            set { donacion = value; }
        }

        /// <summary>
        /// Total del pedido
        /// </summary>
        public string Total
        {
            set
            {
                if (String.IsNullOrEmpty(value))
                {
                    this.txtTotal.Text = String.Empty;
                }
                else
                {
                    this.txtTotal.Text = "TOTAL ¢" + 
                        Convert.ToDouble(value).ToString("0,0", System.Globalization.CultureInfo.InvariantCulture);
                }
            }
        }

        #endregion

        #region Events

        public event CancelEventHandler OnAdding;

        public event EventHandler OnAdded;

        #region Control Events

        private void ctlAddSkus_Load(object sender, EventArgs e)
        {
            txtSku.Focus();
        }

        #endregion

        #region Sku Events

        // Modif. Marjorie Arce 12-01-2017
        public void txtSku_KeyPress(object sender, KeyPressEventArgs e)
        {
            
            string vModo = String.Empty;

            var vTexto = Program.FrmMainPos.pos.ctlAddSkus1.txtSku.Text.Trim();


            if (vTexto.Length == 1)
            {
                 vTiempoinicial = DateTime.Now;
            }

            int existe;
            if (e.KeyChar == 13)
            {
                vTiempofinal = DateTime.Now;
                TimeSpan vDuracion = vTiempofinal - vTiempoinicial;

                if (GUI.CApp.GetParam("VLTD").ToString() == "SI")
                {
                    try
                    {
                        Utils.QueryParams qpV = new LLNet.Utils.QueryParams();
                        qpV.Clear();
                        qpV.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        qpV.AddReplaceParam("OPCION", Program.opcion.ToString());

                        existe = Convert.ToInt32(GUI.CApp.bll.GetSingleValue("ValidarLinesxTipoDocumento", qpV, "PDV").ToString());
                    }
                     catch
                    {
                        existe = 0;
                    }
                    if (existe == 0)
                    {
                        txtSku.Text = (txtSku.Text ?? string.Empty);

                            //TIEMPO QUE DURO DESDE LA PRIMERA A LA TECLA ENTER
                            int vMilliSgundos = vDuracion.Milliseconds;

                            // TAMAÑOS Y TIEMPOS

                            int vTamaño = txtSku.Text.Length;

                            if (vTamaño >= 9)
                            {
                                Utils.QueryParams pParametro = new LLNet.Utils.QueryParams();
                                var valor= "MXL";
                                pParametro.AddReplaceParam("PARAMETRO", valor);

                                int vMaximoManualRapido = Convert.ToInt32(GUI.CApp.bll.GetSingleValue("ParametroLector", pParametro, "PDV"));

                                if (vMilliSgundos <= vMaximoManualRapido)
                                {
                                    vModo = "L";
                                    vMilliSgundos = 0;
                                }
                                else
                                {
                                    vModo = "M";
                                    vMilliSgundos = 0;
                                }

                            }
                            else if (vTamaño < 9)
                            {
                                double vMaximoManualRapido = Convert.ToDouble("60");

                                if (vMilliSgundos <= vMaximoManualRapido)
                                {
                                    vModo = "L";
                                    vMilliSgundos = 0;
                                }
                                else
                                {
                                    vModo = "M";
                                    vMilliSgundos = 0;
                                }
                            }
                            InsertOrderLine(vModo);
                 //       }
               
                    }
                    else
                    {
                        txtSku.Text = (txtSku.Text ?? string.Empty);

                        if (e.KeyChar == 13)
                        {
                            vTiempofinal = DateTime.Now;
                            TimeSpan vDuracion2 = vTiempofinal - vTiempoinicial;

                            //TIEMPO QUE DURO DESDE LA PRIMERA A LA TECLA ENTER
                            int vMilliSgundos = vDuracion.Milliseconds;

                            // TAMAÑOS Y TIEMPOS

                            int vTamaño = txtSku.Text.Length;

                            if (vTamaño >= 9)
                            {
                                Utils.QueryParams pParametro = new LLNet.Utils.QueryParams();
                                var vValor = "MXL";
                                pParametro.AddReplaceParam("PARAMETRO", vValor);
                                int vMaximoManualRapido = Convert.ToInt32(GUI.CApp.bll.GetSingleValue("ParametroLector", pParametro, "PDV"));

                                if ( vMilliSgundos <= vMaximoManualRapido )
                                {
                                    vModo = "L";
                                    vMilliSgundos = 0;
                                }
                                else
                                {
                                    vModo = "M";
                                    vMilliSgundos = 0;
                                }
                            }
                            else if (vTamaño < 9)
                            {

                                double vMaximoManualRapido = Convert.ToDouble("60");

                                if ( vMilliSgundos <= vMaximoManualRapido )
                                {
                                    vModo = "L";
                                    vMilliSgundos = 0;
                                }
                                else
                                {
                                    vModo = "M";
                                    vMilliSgundos = 0;
                                }                                
                            }
                            InsertOrderLine(vModo);
                        }

                    }
                }
            }
        }

        private void InsertOrderLine(string vModo)
        {
            int valorline;
            int numlineas;
            try
            {
                Utils.QueryParams qp2 = new LLNet.Utils.QueryParams();
                qp2.Clear();
                qp2.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                string CountLine = GUI.CApp.bll.GetSingleValue("CountLine", qp2, "PDV").ToString();
                valorline = Convert.ToInt32(CountLine);
            }
            catch
            {
                valorline = 0;
            }

            string LineasDoc = GUI.CApp.GetLineasDocumento().ToString();

            if (LineasDoc == "")
                numlineas = Convert.ToInt32(GUI.CApp.GetParam("NLDP").ToString());
            else
                numlineas = Convert.ToInt32(LineasDoc);

            if (valorline <= (numlineas - 1))
            {

                txtSku.Text = txtSku.Text.Trim();
                CancelEventArgs cea = new CancelEventArgs();
                if (OnAdding != null)
                    OnAdding(txtSku, cea);
                if (cea.Cancel) return;



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

                //codigo para club bebe
                if (txtSku.Text != "")
                {
                    int n;
                    bool SkuValido = int.TryParse(txtSku.Text, out n);
                    if (SkuValido)
                    {
                        if (LLNet.Tienda.MainForms.Forms.MisPuntos.frmGestionCbb.listaSkus.IndexOf(txtSku.Text.Trim()) == -1)
                        {
                            LLNet.Tienda.MainForms.Forms.MisPuntos.frmGestionCbb.listaSkus.Add(txtSku.Text.Trim());

                            LLNet.Tienda.MainForms.Forms.MisPuntos.frmGestionCbb.listaSkusCant.Add(txtCantidad.Text.Trim());
                        }
                        else
                        {
                            int indiceUpdate = LLNet.Tienda.MainForms.Forms.MisPuntos.frmGestionCbb.listaSkus.IndexOf(txtSku.Text.Trim());
                            LLNet.Tienda.MainForms.Forms.MisPuntos.frmGestionCbb.listaSkusCant[indiceUpdate] = (long.Parse(LLNet.Tienda.MainForms.Forms.MisPuntos.frmGestionCbb.listaSkusCant[indiceUpdate]) + long.Parse(txtCantidad.Text.Trim())).ToString();
                        }
                    }

                }
                //codigo para club bebe


                //ver si es marchamo, si lo es asignar el precio de una vez

                if (InsertOrderLine(
                    txtSku.Text,
                    Decimal.Parse(txtCantidad.EditValue.ToString()) * sign,
                    (Usuario ?? GUI.CApp.usuario),
                    precioUnitario,
                    impuesto,
                    descuento,
                    documento,
                    linea, null, null, null, entrega, bodega, bodega2, direccion, region, motivoDevolucion, vModo))
                {
                    gcPicture.DataSource = DataSource.WMS_SKUS;

                    //STEVEN ARCE 08/10/2018
                    if (DataSource.WMS_SKUS[0].SKU_ALTERNO.Equals(vCodEbox[0]) || DataSource.WMS_SKUS[0].SKU_ALTERNO.Equals(vCodEbox[1]))
                    {
                        txtDescripcion.EditValue = vDescripSku;
                    }
                    else
                    {
                        txtDescripcion.EditValue = DataSource.WMS_SKUS[0].DESCRIPCION;
                    } 
                    
                    string Path = Utils.Helpers.Nvl(DataSource.WMS_SKUS[0].URL, "").ToString();
                    string ModImagenes = Utils.Helpers.Nvl(GUI.CApp.GetParam("MOIM"), "BL").ToString();
                    if (ModImagenes == "BL")//Si el parametro majena imagens por Path
                    {
                        colIMAGEN.Visible = true;
                        colIMAGEPATH1.Visible = false;
                    }
                    else if (ModImagenes == "PA")
                    {
                        colIMAGEN.Visible = false;
                        colIMAGEPATH1.Visible = true;

                        if (Path != string.Empty)
                        {
                            Image jd = Image.FromFile(Path);
                            bool Changes = false;
                            Changes = DataSource.HasChanges();
                            gridView1.SetRowCellValue(0, colIMAGEPATH1, DevExpress.XtraExport.ByteImageConverter.ToByteArray(jd, System.Drawing.Imaging.ImageFormat.Jpeg));
                            if (Changes == false) DataSource.WMS_SKUS.AcceptChanges();
                        }
                    }

                    if (sign == 1)
                    {
                        qp.AddReplaceParam("SKU", DataSource.WMS_SKUS[0].SKU.ToString());
                        qp.AddReplaceParam("SOCIO", DataSource.WMS_DOCUMENTOS[0].SOCIO.ToString());
                        object offernx1 = GUI.CApp.bll.GetSingleValue("CountNx1", qp, "PDV");

                        if (offernx1 != null)
                        {
                            object[] obj = new object[] { lastLine, Convert.ToInt64(offernx1), txtSku.Text, txtCantidad.EditValue };
                            Dialogs.Offers.dlgOfferNx1 on1 = (Dialogs.Offers.dlgOfferNx1)GUI.CApp.CreateForm(typeof(Dialogs.Offers.dlgOfferNx1), null, true, obj, true);
                        }
                    }

                    if (precioUnitario != null)
                        txtPrecio.EditValue = precioUnitario + (impuesto ?? 0) - (descuento ?? 0);
                    else
                        txtPrecio.EditValue = DataSource.WMS_SKUS[0]["PRECIO_BASE"];

                    txtSku.EditValue = "";
                    txtCantidad.EditValue = 1;
                    precioUnitario = null;
                    impuesto = null;
                    descuento = null;
                    documento = null;
                    linea = null;

                    if (OnAdded != null)
                        OnAdded(lastLine, null);

                    if (sign == 1)
                    {
                        qp.Clear();
                        qp.AddReplaceParam("SKU", DataSource.WMS_SKUS[0].SKU.ToString());

                        if (DataSource.WMS_DOCUMENTOS.Count > 0)
                            qp.AddReplaceParam("SOCIO", DataSource.WMS_DOCUMENTOS[0].SOCIO.ToString());
                        else
                            qp.AddReplaceParam("SOCIO", GUI.CApp.GetParam("NSCF").ToString());

                        qp.AddReplaceParam("USUARIO", GUI.CApp.usuario);

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

                        DataSource.SKUS_COMPLEMENTARIOS.Clear();
                        Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.SKUS_COMPLEMENTARIOS.TableName, qp), DataSource);

                        if (Utils.Helpers.ObjToStr(DataSource.WMS_SKUS[0]["ES_COMBO"]) == "X")
                        {
                            DataSource.COMBOS.Clear();
                            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.COMBOS.TableName, qp), DataSource);
                            if (DataSource.COMBOS.Count > 0)
                            {
                                Forms.frmCombos cbo = new LLNet.Tienda.MainForms.Forms.frmCombos();
                                cbo.Init(new object[] { DataSource, lastLine });
                                cbo.ShowDialog();
                            }
                        }

                        if (DataSource.SKUS_COMPLEMENTARIOS.Count > 0)
                        {
                            MainForms.Forms.frmComplementarios cmp = new LLNet.Tienda.MainForms.Forms.frmComplementarios();
                            cmp.Init(null);
                            cmp.ShowDialog();
                        }
                    }


                    // AQUI VA LO DE REDONDEO DEL DOCUMENTO
                    //qp.Clear
                    //if (qp.Count == 0)
                    //{
                    //  qp.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    //}
                    //GUI.CApp.bll.ExecuteSql("RedondearPedido", qp, "PDV");
                    if (Utils.Helpers.Nvl(GUI.CApp.GetParam("ALIP"), "NO").ToString() == "SI")
                    {
                        Utils.QueryParams Qp = new LLNet.Utils.QueryParams();
                        Qp.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        Qp.AddReplaceParam("LINEA", lastLine.ToString());
                        Qp.AddReplaceParam("USUARIO", GUI.CApp.usuario);
                        GUI.CApp.bll.ExecuteSql("AgrupaLineasPedido", Qp, "PDV");
                    }

                    if (qp.Count == 0)
                    {
                        qp.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    }
                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.TDA_DETALLE_PEDIDO.TableName, qp), DataSource);


                }
                else
                {
                    txtDescripcion.EditValue = "Código " + txtSku.Text + " no se pudo agregar o no existe";
                    txtPrecio.EditValue = "";
                    ShowFindSku();
                }

                Program.FrmMainPos.pos.ctlDetail1.gdDetail.TabStop = (Program.FrmMainPos.DsPedido.TDA_DETALLE_PEDIDO.Count > 0);
                Program.FrmMainPos.pos.ctlDetail1.TabStop = Program.FrmMainPos.pos.ctlDetail1.gdDetail.TabStop;
                Program.FrmMainPos.pos.ctlDetail1.Enabled = Program.FrmMainPos.pos.ctlDetail1.gdDetail.TabStop;

                txtTotal.Text = "TOTAL ¢" +
                    Convert.ToDouble(Program.FrmMainPos.DsPedido.TDA_DATOS_DOCUMENTO.Rows[0].ItemArray[7]).ToString("0,0", System.Globalization.CultureInfo.InvariantCulture);
                txtSku.Focus();
                txtSku.SelectAll();
            }
            else
            {
                GUI.CApp.ShowMessage("El Número de Líneas Permitido por Documento es " + numlineas.ToString(), "POS Líneas Documento", true);

            }

        }

        public bool InsertOrderLine(
            string pSkuAlterno, decimal pCantidad, string pUsuario, decimal? pLineaPadre2, decimal? pOferta)
        {
            return InsertOrderLine(pSkuAlterno, pCantidad, pUsuario, null, null, null, null, null, null, pLineaPadre2, pOferta);
        }

        /// <summary>
        /// Inserta una linea de detalle de documento
        /// </summary>
        /// <param name="pSkuAlterno">sku alterno del producto</param>
        /// <param name="pCantidad">cantidad a ingresar</param>
        /// <param name="pUsuario">usuario en sesion</param>
        /// <param name="pDocumentType">tipo de documento</param>
        public bool InsertOrderLine(
            string pSkuAlterno, decimal pCantidad, string pUsuario,
            decimal? pPrecioUnitario, decimal? pImpuesto, decimal? pDescuento,
            decimal? pDocumentoPadre3, decimal? pLineaPadre3)
        {
            return InsertOrderLine(pSkuAlterno, pCantidad, pUsuario, pPrecioUnitario, pImpuesto, pDescuento, pDocumentoPadre3, pLineaPadre3, null, null, null);
        }

        public bool InsertOrderLine(
            string pSkuAlterno, decimal pCantidad, string pUsuario,
            decimal? pPrecioUnitario, decimal? pImpuesto, decimal? pDescuento,
            decimal? pDocumentoPadre3, decimal? pLineaPadre3, decimal? pVale,
            decimal? pLineaPadre2, decimal? pOferta)
        {
            return InsertOrderLine(pSkuAlterno, pCantidad, pUsuario, pPrecioUnitario, pImpuesto, pDescuento, pDocumentoPadre3, pLineaPadre3, pVale, pLineaPadre2, pOferta, null, null, null, null, null, null, "");
        }


        public bool InsertOrderLine(
            string pSkuAlterno, decimal pCantidad, string pUsuario,
            decimal? pPrecioUnitario, decimal? pImpuesto, decimal? pDescuento,
            decimal? pDocumentoPadre3, decimal? pLineaPadre3, decimal? pVale, 
            decimal? pLineaPadre2, decimal? pOferta, DateTime? pEntrega, 
            decimal? pBodega, decimal? pBodega2, string pDireccion, decimal? pRegion, decimal? pMotivoDevolucion, string vModo)
        {
            if (!GUI.CApp.ValidateAccess("AgregarProductos", "Agregar Productos al Pedido"))
                return false;

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

            bool oldEnfCons = DataSource.EnforceConstraints;
            DataSource.EnforceConstraints = false;
            // Fila a crear
            Model.PDV.DsPDV.WMS_SKUS_X_DOCUMENTORow sdr = DataSource.WMS_SKUS_X_DOCUMENTO.NewWMS_SKUS_X_DOCUMENTORow();

            #region Verifica si hay un pedido creado, si no hay, lo crea

            // Si no existe un documento, lo crea, de lo contrario solo obtiene
            // el documento actual
            if (DataSource.WMS_DOCUMENTOS.Rows.Count == 0)
            {
                decimal orderNumber = CreateOrder(null);
                if (orderNumber == -1)
                    return false;
            }
            else
                sdr.DOCUMENTO = DataSource.WMS_DOCUMENTOS[0].DOCUMENTO;

            #endregion

            if (pSkuAlterno != null)
            {

                cant_grid = 0;
                string valor = txtSku.Text;
                Utils.QueryParams qpSKU = new LLNet.Utils.QueryParams();
                //qpSKU.AddReplaceParam("SKU_ALTERNO", txtSku.Text); //dlqg 021020
                qpSKU.AddReplaceParam("SKU_ALTERNO", txtSku.Text.ToUpper());
                v_sku = Convert.ToString(GUI.CApp.bll.GetSingleValue("GetSku", qpSKU, "PDV"));

                #region  Asociar membresia

                string v_PlusM = Convert.ToString(GUI.CApp.GetParam("MPLS")); // Artículo Membresía Ekono Plus
                string v_PlusCed = string.Empty;
                string v_PlusMeses = string.Empty;
                string v_PlusTarjeta = string.Empty;
                decimal? v_precioFinal = 0;
                bool v_ExisteCuotaMembresia = false;
                int v_esPagoContado = 0;
                int v_3Meses = 3;
                int v_6Meses = 6;
                
                if (v_sku == v_PlusM)
                {
                    LLNet.Tienda.MainForms.Forms.Membresia.FrmCobroMemb frmcobr = new LLNet.Tienda.MainForms.Forms.Membresia.FrmCobroMemb(DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString(), "M");
                    frmcobr.ShowDialog();
                    if (frmcobr.procesar == false)
                    {
                        //GUI.CApp.ShowMessage("Sin asignar" , "Validación de Existencia Membresia", true);
                        return false;
                    }
                    else
                    {
                        v_PlusCed = frmcobr.cedula; //cédula del cliente plus
                        v_PlusMeses = frmcobr.meses; // meses que se van a pagar
                        Utils.QueryParams qpPLUSCuota = new LLNet.Utils.QueryParams();
                        qpPLUSCuota.AddReplaceParam("P_C_CEDULA", v_PlusCed);



                        v_esPagoContado = Convert.ToInt32(GUI.CApp.bll.GetSingleValue("PLUS_VALIDA_PAGOCONTADO", qpPLUSCuota, "PDV"));

                        // El pago de contado
                        if (v_esPagoContado == 1)
                        {
                            if (v_PlusMeses == "3")
                            {
                                //cálculo del costo de la membresia
                                PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMM", "PDV"))) * v_3Meses;
                            }
                            else
                            {
                                if (v_PlusMeses == "6")
                                {
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMM", "PDV"))) * v_6Meses;
                                }
                                else
                                {
                                    //cálculo del costo de la membresia
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMA", "PDV")));
                                }
                               
                            }
                            pPrecioUnitario = PrecioUnitario;
                        }
                        else // El pago es a credito [Se cobra la primer mensualidad]
                        {
                            v_precioFinal = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("PLUS_CONFIGURACION_MEMBRESIA", qpPLUSCuota, "PDV"));

                            if (!v_precioFinal.HasValue)
                            {
                                if (v_PlusMeses == "6")
                                {
                                    //cálculo del costo de la membresia
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMM", "PDV")));
                                }
                                else
                                {
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMA", "PDV")));
                                }

                                pPrecioUnitario = PrecioUnitario;
                            }
                            else
                            {
                                pPrecioUnitario = v_precioFinal;
                            }

                        }





                    }

                }

                #endregion


                #region  Renovar membresia

                string v_PlusR = Convert.ToString(GUI.CApp.GetParam("RPLS")); // Artículo Renovación Membresía Ekono Plus
                //string v_PlusCed = string.Empty;
                if (v_sku == v_PlusR)
                {
                    LLNet.Tienda.MainForms.Forms.Membresia.FrmCobroMemb frmcobr = new LLNet.Tienda.MainForms.Forms.Membresia.FrmCobroMemb(DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString(), "R");
                    frmcobr.ShowDialog();
                    if (frmcobr.procesar == false)
                    {
                        //GUI.CApp.ShowMessage("Sin asignar" , "Validación de Existencia Membresia", true);
                        return false;
                    }
                    else
                    {
                        v_PlusCed = frmcobr.cedula; //cédula del cliente plus
                        v_PlusMeses = frmcobr.meses; // meses que se van a pagar
                        Utils.QueryParams qpPLUSCuota = new LLNet.Utils.QueryParams();
                        qpPLUSCuota.AddReplaceParam("P_C_CEDULA", v_PlusCed);
                        //TODO: Ajustes Melvin
                        v_esPagoContado = Convert.ToInt32(GUI.CApp.bll.GetSingleValue("PLUS_VALIDA_PAGOCONTADO", qpPLUSCuota, "PDV"));
                        v_ExisteCuotaMembresia = Convert.ToBoolean(GUI.CApp.bll.GetSingleValue("PLUS_VALIDA_EXISTE_MEMBRESIACUOTAS", qpPLUSCuota, "PDV"));

                        if (!v_ExisteCuotaMembresia)
                        {
                            GUI.CApp.ShowMessage("Debes actualizar los datos de la Afiliación Ekono Plus. ", "Información", true);
                             return false;
                        }

                        // El pago de contado
                        if (v_esPagoContado == 1)
                        {
                            if (v_PlusMeses == "3")
                            {
                                //cálculo del costo de la membresia
                                PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMM", "PDV"))) * v_3Meses;
                            }
                            else
                            {
                                if (v_PlusMeses == "6")
                                {
                                    //cálculo del costo de la membresia
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMM", "PDV"))) * v_6Meses;
                                }
                                else
                                {
                                    //cálculo del costo de la membresia
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMA", "PDV")));
                                }

                            }
                            pPrecioUnitario = PrecioUnitario;
                        }
                        else // El pago es a credito [Se cobra la primer mensualidad]
                        {
                            decimal precio_couta = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIO_RENOVACION", "PDV")));
                            v_precioFinal = precio_couta;
                            //GUI.CApp.bll.ExecuteSql("PLUS_ACTUALIZA_COUTA", qpPLUSCuota, "PDV");
                            //Utils.QueryParams qpRenovarMembresia = new Utils.QueryParams();
                            //qpRenovarMembresia.AddReplaceParam("P_C_CEDULA",v_PlusCed);
                            //qpRenovarMembresia.AddReplaceParam("P_MONTO_CUOTA", Convert.ToString(precio_couta));
                            //v_precioFinal = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("PLUS_CONFIGURACION_MEMBRESIA", qpPLUSCuota, "PDV"));

                            if (!v_precioFinal.HasValue)
                            {
                                if (v_PlusMeses == "6")
                                {
                                    //cálculo del costo de la membresia
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMM", "PDV")));
                                }
                                else
                                {
                                    PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMA", "PDV")));
                                }

                                pPrecioUnitario = PrecioUnitario;
                            }
                            else
                            {
                                pPrecioUnitario = v_precioFinal;
                            }

                        }


                        /*
                        if (v_PlusMeses == "1")
                        {
                            //cálculo del costo de la membresia
                            PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMM", "PDV")));
                        }
                        else
                        {
                            PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIOMA", "PDV")));
                        }

                        pPrecioUnitario = PrecioUnitario;*/
                    }

                }

                #endregion

                #region  Remplazo Tarjeta membresia

                string v_PlusRT = Convert.ToString(GUI.CApp.GetParam("TPLS")); // Artículo Reemplazo tarjeta Membresía Ekono Plus
                //string v_PlusCed = string.Empty;
                if (v_sku == v_PlusRT)
                {
                    LLNet.Tienda.MainForms.Forms.Membresia.FrmCobroMemb frmcobr = new LLNet.Tienda.MainForms.Forms.Membresia.FrmCobroMemb(DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString(), "RT");
                    frmcobr.ShowDialog();
                    if (frmcobr.procesar == false)
                    {
                        //GUI.CApp.ShowMessage("Sin asignar" , "Validación de Existencia Membresia", true);
                        return false;
                    }
                    else
                    {
                        v_PlusCed = frmcobr.cedula; //cédula del cliente plus
                        v_PlusMeses = frmcobr.meses; // meses que se van a pagar
                        v_PlusTarjeta = frmcobr.Tarjeta; //tarjeta de reemplazo

                        PrecioUnitario = decimal.Parse(Convert.ToString(GUI.CApp.bll.GetSingleValue("PLUS_PRECIORT", "PDV")));

                        pPrecioUnitario = PrecioUnitario;
                    }

                }

                #endregion


                for (int i = 0; i < DataSource.WMS_SKUS_X_DOCUMENTO.Rows.Count; i++)
                {
                    if ((DataSource.WMS_SKUS_X_DOCUMENTO[i].SKU.ToString() == v_sku) && (DataSource.WMS_SKUS_X_DOCUMENTO[i].USUARIO_ANULO == null))
                    {
                        String vdocumento = DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
                        Utils.QueryParams qpSKU1 = new LLNet.Utils.QueryParams();
                        qpSKU1.AddReplaceParam("DOCUMENTO", vdocumento);
                        qpSKU1.AddReplaceParam("SKU", v_sku);
                        decimal vcantidad = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("ValidarCantidad", qpSKU1, "PDV"));
                        //cant_grid = cant_grid + vcantidad;
                        cant_grid = vcantidad;
                    }
                }

                decimal? vPrecioUnitario;
                decimal? vImpuesto = null;
                // Si el valor ingresado en sku alterno pertenece a un sku, continua con la insercion
                if (FindSku(pSkuAlterno, DataSource.WMS_DOCUMENTOS[0].SOCIO, pUsuario, pOferta))
                {
                    if (DataSource.WMS_SKUS[0]["TIPO_INVENTARIO"].ToString() == "D" && Math.Truncate(pCantidad) < pCantidad)
                    {
                        GUI.CApp.ShowMessage("El producto solo puede venderse en cantidades enteras", "Tipo de Inventario", true);
                        txtSku.Focus();
                        pCantidad = Math.Truncate(pCantidad);

                    }
                    if (DataSource.WMS_SKUS[0].LLEVA_INVENTARIO == "S")
                    {
                        Utils.QueryParams qpEx = new LLNet.Utils.QueryParams();
                        decimal existencia = 0;
                        switch (Utils.Helpers.ObjToStr(GUI.CApp.GetParam("VEEP")))
                        {
                            case "V":
                                qpEx.AddReplaceParam("SKU", DataSource.WMS_SKUS[0].SKU.ToString());
                                qpEx.AddReplaceParam("CANTIDAD", pCantidad.ToString());
                                qpEx.AddReplaceParam("CANTIDADGR", cant_grid.ToString());
                                existencia = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("ValidarExistencia", qpEx, "PDV"));
                                if (existencia < 0)
                                {
                                    GUI.CApp.ShowMessage("No hay existencia suficiente para el producto,  Existencia Actual: " + (Convert.ToDecimal(pCantidad) + existencia), "Validación de Existencia", true);
                                    return false;
                                }
                                break;
                            case "A":
                                qpEx.AddReplaceParam("SKU", DataSource.WMS_SKUS[0].SKU.ToString());
                                qpEx.AddReplaceParam("CANTIDAD", pCantidad.ToString());
                                qpEx.AddReplaceParam("CANTIDADGR", cant_grid.ToString());
                                existencia = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("ValidarExistencia", qpEx, "PDV"));
                                if (existencia < 0)
                                    GUI.CApp.ShowMessage("No hay existencia suficiente para el producto,  Existencia Actual: " + (Convert.ToDecimal(pCantidad) + existencia), "Validación de Existencia", true);
                                break;
                            default:
                                // no valida
                                break;
                        }
                    }

                    vPrecioUnitario = pPrecioUnitario;
                    vDescripSku = "";

                    if (DataSource.WMS_SKUS[0]["IMPUESTO"] != DBNull.Value)
                        vImpuesto = DataSource.WMS_SKUS[0].IMPUESTO;
                    ///STEVEN ARCE 10/2018
                    ///valida para mostrar el cuadro de precio si el precio base es cero y el precio unitario es null, 
                    ///hay que hacer uno parecido para mostrar el nuevo form que también modificará la descripción del producto,
                    ///y la almacenará en el campo variables en wms_skus_x_documento, y limitar la descripción a 15 caracteres

                    vCodEbox = Convert.ToString(GUI.CApp.bll.GetSingleValue("AEROPOST", "PDV").ToString().ToLower()).Split('&');

                    //Si es AEROPOST ingresa aquí
                    if (vCodEbox[0].Equals(txtSku.Text.Trim().ToLower()) || vCodEbox[1].Equals(txtSku.Text.Trim().ToLower()))
                    {
                        if (GUI.CApp.ValidateAccess("AsignarPrecioEBOX", "Asignar Precio a Productos Precio Cero"))
                        {
                            Forms.frmAsignarDescripYPrecio ap = new LLNet.Tienda.MainForms.Forms.frmAsignarDescripYPrecio();
                            ap.Init(new object[] { 0, null });
                            ap.ShowDialog();

                            if (ap.DialogResult == DialogResult.OK)
                            {
                                Utils.QueryParams qpTaxes = new LLNet.Utils.QueryParams();
                                qpTaxes.AddReplaceParam("SKU", DataSource.WMS_SKUS[0].SKU.ToString());
                                qpTaxes.AddReplaceParam("SOCIO", DataSource.WMS_DOCUMENTOS[0].SOCIO.ToString());

                                if (Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("GetTaxes", qpTaxes, "PDV")) == 0)
                                {
                                    vPrecioUnitario = Convert.ToDecimal(ap.Precio.EditValue);
                                    vDescripSku = ap.txtDescripcion.EditValue.ToString();
                                    vImpuesto = 0;
                                }
                                else
                                {
                                    qpTaxes.Clear();
                                    qpTaxes.AddReplaceParam("pSKU", DataSource.WMS_SKUS[0].SKU.ToString());
                                    //vPrecioUnitario = (Convert.ToDecimal(ap.Precio.EditValue) / (1 + Convert.ToDecimal(GUI.CApp.GetParam("PIVA")) / 100));
                                    vPrecioUnitario = (Convert.ToDecimal(ap.Precio.EditValue) / (1 + Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("GetIVA", qpTaxes, "PDV")) / 100));
                                    vDescripSku = ap.txtDescripcion.EditValue.ToString();
                                    vImpuesto = Convert.ToDecimal(ap.Precio.EditValue) - vPrecioUnitario;
                                }
                            }
                            else 
                                return false;
                        }
                    }
                    else if (Convert.ToDecimal(DataSource.WMS_SKUS[0]["PRECIO_BASE"]) == 0 && vPrecioUnitario == null)
                    {
                        string v_express = Convert.ToString(GUI.CApp.GetParam("SEE")); //Artículo Ekono Express

                        if (( v_sku == v_express) || GUI.CApp.ValidateAccess("AsignarPrecio", "Asignar Precio a Productos Precio Cero"))
                        {
                            Forms.frmAsignarPrecio ap = new LLNet.Tienda.MainForms.Forms.frmAsignarPrecio();
                            ap.Init(new object[] { 0 });
                            ap.ShowDialog();
                            if (ap.DialogResult == DialogResult.OK)
                            {
                                Utils.QueryParams qpTaxes = new LLNet.Utils.QueryParams();
                                qpTaxes.AddReplaceParam("SKU", DataSource.WMS_SKUS[0].SKU.ToString());
                                qpTaxes.AddReplaceParam("SOCIO", DataSource.WMS_DOCUMENTOS[0].SOCIO.ToString());

                                if (Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("GetTaxes", qpTaxes, "PDV")) == 0)
                                {
                                    vPrecioUnitario = Convert.ToDecimal(ap.Precio.EditValue);
                                    vImpuesto = 0;
                                }
                                else
                                {
                                    qpTaxes.Clear();
                                    qpTaxes.AddReplaceParam("pSKU", DataSource.WMS_SKUS[0].SKU.ToString());
                                   // vPrecioUnitario = (Convert.ToDecimal(ap.Precio.EditValue) / (1 + Convert.ToDecimal(GUI.CApp.GetParam("PIVA")) / 100));
                                    vPrecioUnitario = (Convert.ToDecimal(ap.Precio.EditValue) / (1 + Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("GetIVA", qpTaxes, "PDV")) / 100));
                                    vImpuesto = Convert.ToDecimal(ap.Precio.EditValue) - vPrecioUnitario;
                                }
                            }
                            else
                                return false;
                        }
                        else
                            return false;
                    }
                    #region Asigna los valores de la fila, y actualizamos los datos

                    #region Asigna valores a las columnas del detalle del pedido

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

                    sdr.CANTIDAD = pCantidad;
                    sdr.DOCUMENTO = DataSource.WMS_DOCUMENTOS[0].DOCUMENTO;
                    sdr.SKU = DataSource.WMS_SKUS[0].SKU;
                    sdr.LINEA = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("SigDetalleDocumento", qp, "PDV"));
                    sdr.PRECIO_UNITARIO = (vPrecioUnitario ?? DataSource.WMS_SKUS[0].PRECIO_UNITARIO);
                    sdr.DESCRIPCION = (vDescripSku ?? DataSource.WMS_SKUS[0].DESCRIPCION); //STEVEN ARCE 10/2018

                    sdr["COSTO_PROMEDIO"] = DataSource.WMS_SKUS[0]["COSTO_PROMEDIO"];

                    if (sign == -1) // si es una devolucion su situacion es "Automático"
                        sdr.SITUACION_SKU = 1;
                    else
                        sdr.SITUACION_SKU = Convert.ToDecimal(GUI.CApp.GetParam("TDDF"));

                    lastLine = sdr.LINEA;

                    if (vImpuesto != null)
                    {
                        if (!Program.FrmMainPos.ExentoImpuesto)
                            sdr.IMPUESTO = (decimal)vImpuesto;
                    }

                    if (pImpuesto != null)
                    {
                        if (!Program.FrmMainPos.ExentoImpuesto)
                            sdr.IMPUESTO = (decimal)pImpuesto;
                    }

                    if (pDescuento != null)
                        sdr.DESCUENTO = (decimal)pDescuento;

                    if (pDocumentoPadre3 != null)
                        sdr.DOCUMENTO_PADRE3 = (decimal)pDocumentoPadre3;

                    if (pLineaPadre3 != null)
                        sdr.LINEA_PADRE3 = (decimal)pLineaPadre3;

                    if (vale != null)
                        sdr.VALE = (decimal)vale;

                    if (pLineaPadre2 != null)
                        sdr.LINEA_PADRE2 = (decimal)pLineaPadre2;

                    if (lineaPadre != null)
                        sdr.LINEA_PADRE = (decimal)lineaPadre;

                    lineaPadre = null;

                    if (pEntrega != null)
                        sdr.FECHA_ENTREGA = (DateTime)pEntrega;

                    if (pBodega != null)
                        sdr.BODEGA = (decimal)pBodega;

                    if (pBodega2 != null)
                        sdr.BODEGA2 = (decimal)pBodega2;

                    if (pDireccion != null)
                        sdr.DIRECCION = pDireccion;

                    if (pRegion != null)
                        sdr.REGION = (decimal)pRegion;

                    if (Usuario1 != null)
                        sdr.USUARIO = Usuario1;

                    if (Usuario2 != null)
                        sdr.USUARIO2 = Usuario2;

                    if (Usuario3 != null)
                        sdr.USUARIO3 = Usuario3;

                    if (Porcentaje1 != null)
                        sdr.PORCENTAJE1 = (decimal)Porcentaje1;

                    if (Porcentaje2 != null)
                        sdr.PORCENTAJE2 = (decimal)Porcentaje2;

                    if (Porcentaje3 != null)
                        sdr.PORCENTAJE3 = (decimal)Porcentaje3;

                    if (pMotivoDevolucion != null)
                        sdr.MOTIVO_DEVOLUCION = (decimal)pMotivoDevolucion;


                    //sdr.MOTIVO_DEVOLUCION = Convert.ToDecimal(5); ;

                    Usuario1 = null;
                    Usuario2 = null;
                    Usuario3 = null;

                    Porcentaje1 = null;
                    Porcentaje2 = null;
                    Porcentaje3 = null;

                    sdr.CREADO_POR = pUsuario;

                    #endregion

                    DataSource.WMS_SKUS_X_DOCUMENTO.AddWMS_SKUS_X_DOCUMENTORow(sdr);


                    #region  Asociar membresia

                    if (v_sku == v_PlusM)
                        //p_C_CEDULA&&',&&P_PEDIDO&&,'&&P_ACCION&&','&&P_CREADO_POR&&',&&P_LINEA&&);
                    {
                        //Almacena los datos de la membresia
                        Utils.QueryParams qpm = new LLNet.Utils.QueryParams();
                        qpm.AddReplaceParam("p_C_CEDULA", v_PlusCed);
                        qpm.AddReplaceParam("P_PEDIDO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        qpm.AddReplaceParam("P_ACCION", "M");
                        qpm.AddReplaceParam("P_CREADO_POR", GUI.CApp.usuario);
                        qpm.AddReplaceParam("P_LINEA", sdr.LINEA.ToString());
                        qpm.AddReplaceParam("P_MESES", v_PlusMeses);
                        GUI.CApp.bll.ExecuteSql("PLUS_PEDIDO_CLIENTE", qpm, "PDV");

                    }

                    #endregion


                    #region  Renovar membresia

                    if (v_sku == v_PlusR)
                    //p_C_CEDULA&&',&&P_PEDIDO&&,'&&P_ACCION&&','&&P_CREADO_POR&&',&&P_LINEA&&);
                    {
                        //Almacena los datos de la membresia
                        Utils.QueryParams qpm = new LLNet.Utils.QueryParams();
                        qpm.AddReplaceParam("p_C_CEDULA", v_PlusCed);
                        qpm.AddReplaceParam("P_PEDIDO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        qpm.AddReplaceParam("P_ACCION", "R");
                        qpm.AddReplaceParam("P_CREADO_POR", GUI.CApp.usuario);
                        qpm.AddReplaceParam("P_LINEA", sdr.LINEA.ToString());
                        qpm.AddReplaceParam("P_MESES", v_PlusMeses);
                        GUI.CApp.bll.ExecuteSql("PLUS_PEDIDO_CLIENTE", qpm, "PDV");

                    }

                    #endregion


                    #region  Renovar membresia

                    if (v_sku == v_PlusRT)
                    //'&&PCEDULA&&', '&&PC_TARJETANEW&&', &&PPEDIDO&&, '&&PCREADO_POR&&', &&PLINEA&&
                    {
                        //Almacena los datos de la membresia
                        Utils.QueryParams qpm = new LLNet.Utils.QueryParams();
                        qpm.AddReplaceParam("PCEDULA", v_PlusCed);
                        qpm.AddReplaceParam("PPEDIDO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        qpm.AddReplaceParam("PC_TARJETANEW", v_PlusTarjeta);
                        qpm.AddReplaceParam("PCREADO_POR", GUI.CApp.usuario);
                        qpm.AddReplaceParam("PLINEA", sdr.LINEA.ToString());                        
                        GUI.CApp.bll.ExecuteSql("PLUS_PEDIDO_TAR_CLIENTE", qpm, "PDV");
                    }

                    #endregion


                    try
                    {
                        GUI.CApp.bll.updateDataSet(DataSource, DataSource.WMS_SKUS_X_DOCUMENTO.TableName);

                        decimal vDocumento = sdr.DOCUMENTO;
                        decimal vLinea = sdr.LINEA;
                        string vDocLimpio = Convert.ToString(vDocumento);
                        string vLineaPd = Convert.ToString(vLinea);
                        string vModoLM = vModo;
                        string[] vDocFinal = vDocLimpio.Split('M');
                        string vDf = Convert.ToString(vDocFinal[0]);

                        Utils.QueryParams pParametro = new LLNet.Utils.QueryParams();
                        pParametro.AddReplaceParam("DOCUMENTO", vDf);
                        pParametro.AddReplaceParam("LINEA", vLineaPd);
                        pParametro.AddReplaceParam("MODO", vModoLM);
                        //CApp.bll.GetSingleValue("InsertModoSku", pParametro, "PDV").ToString();

                        GUI.CApp.bll.ExecuteSql("InsertModoSku", pParametro, "PDV");


                        if (Program.opcion == "D")
                        {
                            if (Utils.Helpers.ObjToStr(GUI.CApp.GetParam("BREE")) == "450000000")
                            {
                                v_sku = txtSku.Text.ToString();

                                if (v_sku == null || v_sku == "")
                                {
                                    v_sku = pSkuAlterno; 
                                }

                                GUI.CApp.Document = vDocumento;

                                Utils.QueryParams param = new LLNet.Utils.QueryParams();
                                param.AddReplaceParam("pSKU", v_sku);

                                if (Convert.ToBoolean(GUI.CApp.bll.GetSingleValue("ValidarSKU", param, "PDV")))
                                {
                                    using (FrmHijosEcom hjec = new FrmHijosEcom(v_sku, pCantidad, vLinea))
                                    {
                                        hjec.ShowDialog();
                                    }
                                }
                            }
                        }

                    }
                    catch (Exception ex)
                    {
                        GUI.CApp.ShowMessage(ex.Message, "POS Retail 8.0.0", true);
                    }

                    if (Utils.Helpers.ObjToStr(DataSource.WMS_SKUS[0]["TIPO_ACTUALIZACION_PEDIDO"]) == "D")
                    {
                        InsertKits(
                            sdr.DOCUMENTO,
                            sdr.LINEA,
                            DataSource.WMS_SKUS[0].SKU, sdr.CANTIDAD);
                    }

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

                    #endregion

                    if (qp.Count == 0)
                    {
                        qp.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    }
                    GUI.CApp.bll.ExecuteSql("RedondearPedido", qp, "PDV");


                    #region Actualiza los datos del pedido

                    if (DataSource.WMS_SKUS_X_DOCUMENTO.Count > 0)
                    {
                        GUI.CApp.bll.ExecuteSql("UpdateTotal", qp, "PDV");
                    }

                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.WMS_DOCUMENTOS.TableName, qp), DataSource);
                    DataSource.WMS_DOCUMENTOS.AcceptChanges();

                    DataSource.TDA_DATOS_DOCUMENTO.Clear();
                    Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.TDA_DATOS_DOCUMENTO.TableName, qp), DataSource);
                    DataSource.TDA_DATOS_DOCUMENTO.AcceptChanges();

                    #endregion

                    #region Actualiza los datos del detalle del pedido
                    //Agrupamos lineas similares de productos si el parametro este encendido
                    //PL:wms_p_agrupa_lineas_pedido solo para lineas con precios descuentos e impuesto iguales
                    //no aplica si se antes se aplicaron ofertas
                    //if (Utils.Helpers.Nvl(GUI.CApp.GetParam("ALIP"), "NO").ToString() == "SI")
                    //{
                    //    Utils.QueryParams Qp = new LLNet.Utils.QueryParams();
                    //    Qp.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    //    Qp.AddReplaceParam("LINEA", lastLine.ToString());
                    //    Qp.AddReplaceParam("USUARIO", GUI.CApp.usuario);
                    //    GUI.CApp.bll.ExecuteSql("AgrupaLineasPedido", Qp, "PDV");
                    //}

                    //Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.TDA_DETALLE_PEDIDO.TableName, qp), DataSource);

                    #endregion



                    return true;
                }
                else // si no encuentra el sku alterno retorna false
                    return false;
            }
            else // caso especial: insercion de vale
            {
                qp.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                sdr.DOCUMENTO = DataSource.WMS_DOCUMENTOS[0].DOCUMENTO;
                sdr.CANTIDAD = pCantidad;
                sdr.SKU = (decimal)pLineaPadre3;
                sdr.LINEA = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("SigDetalleDocumento", qp, "PDV"));

                //sdr.USUARIO = pUsuario;
                sdr.CREADO_POR = pUsuario;

                if (pPrecioUnitario != null)
                    sdr.PRECIO_UNITARIO = (decimal)pPrecioUnitario;

                if (pImpuesto != null)
                    sdr.IMPUESTO = (decimal)pImpuesto;

                if (pVale != null)
                    sdr.VALE = (decimal)pVale;

                DataSource.WMS_SKUS_X_DOCUMENTO.AddWMS_SKUS_X_DOCUMENTORow(sdr);

                try
                {
                    GUI.CApp.bll.updateDataSet(DataSource, DataSource.WMS_SKUS_X_DOCUMENTO.TableName);
                }
                catch (Exception ex)
                {
                    GUI.CApp.ShowMessage(ex.Message, "POS Retail 8.0.0", true);
                }
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.WMS_DOCUMENTOS.TableName, qp), DataSource);



                #region Actualiza los datos del pedido

                GUI.CApp.bll.ExecuteSql("UpdateTotal", qp, "PDV");
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.WMS_DOCUMENTOS.TableName, qp), DataSource);
                DataSource.TDA_DATOS_DOCUMENTO.Clear();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.TDA_DATOS_DOCUMENTO.TableName, qp), DataSource);

                #endregion

                #region Actualiza los datos del detalle del pedido

                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.TDA_DETALLE_PEDIDO.TableName, qp), DataSource);

                // Aceptamos los cambios en el dataset
                // dsTienda.AcceptChanges();

                #endregion

                DataSource.EnforceConstraints = oldEnfCons;
                return true;
            }
        }

        private void InsertKits(decimal pDocumento, decimal pLinea, decimal pSku, decimal pCantidad)
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            dt.Columns.Add("DOCUMENTO", typeof(decimal));
            dt.Columns.Add("LINEA", typeof(decimal));
            dt.Columns.Add("SKU", typeof(decimal));
            dt.Columns.Add("CANTIDAD", typeof(decimal));
            ds.Tables.Add(dt);

            dt.Rows.Add(pDocumento, pLinea, pSku, pCantidad);

            GUI.CApp.bll.RemoteExecute("PDV", "InsertKits", ds);
            Program.FrmMainPos.RefreshData();
        }

        /// <summary>
        /// Busca un producto y retorna true si lo encontro
        /// </summary>
        /// <param name="pSkuAlterno">Sku Alterno del producto</param>
        /// <param name="pSocio">Socio del pedido</param>
        /// <param name="pUsuario">Usuario en sesion</param>
        /// <returns></returns>
        /// 
        public bool FindSku(string pSkuAlterno, decimal pSocio, string pUsuario)
        {
            return FindSku(pSkuAlterno, pSocio, pUsuario, null);
        }

        public bool FindSku(string pSkuAlterno, decimal pSocio, string pUsuario, decimal? pOferta)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("SOCIO", pSocio.ToString());
            qp.AddReplaceParam("USUARIO", pUsuario);

            if (GUI.CApp.GetParam("HBMM").ToString() == "X")
                qp.AddReplaceParam("SKU_ALTERNO", pSkuAlterno.ToUpper());
            else
                qp.AddReplaceParam("SKU_ALTERNO", pSkuAlterno);

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

            DataSource.WMS_SKUS.Clear();
            if (pOferta == null)
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.WMS_SKUS.TableName, qp, "GetSkus"), DataSource);
            else
            {
                qp.AddReplaceParam("OFERTA", pOferta.ToString());
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.WMS_SKUS.TableName, qp, "GetSkusNx1"), DataSource);
            }

            return (DataSource.WMS_SKUS.Rows.Count > 0);
        }

        /// <summary>
        /// Crea el encabezado de un pedido
        /// </summary>
        /// <param name="pSocio">socio del pedido (si es nulo busca consumidor final)</param>
        public decimal CreateOrder(decimal? pSocio)
        {
            return CreateOrder(pSocio, GUI.CApp.usuario);
        }

        /// <summary>
        /// Crea el encabezado de un pedido
        /// </summary>
        /// <param name="pSocio">socio del pedido (si es nulo busca consumidor final)</param>
        public decimal CreateOrder(decimal? pSocio, string pUsuario)
        {
            decimal pDocument;
            DataSource.EnforceConstraints = false;

            if (Utils.Helpers.ObjToStr(GUI.CApp.GetParam("LPP")) == "1")
            {
                Utils.QueryParams qpUsr = new LLNet.Utils.QueryParams();
                qpUsr.AddReplaceParam("USUARIO", pUsuario);
                if (Utils.Helpers.ObjToStr(GUI.CApp.bll.GetSingleValue("EsUsuarioVendedor", qpUsr, "PDV")) != "S")
                {
                    GUI.CApp.ShowMessage("Ingrese el vendedor", "Datos del Documento", true);
                    Program.FrmMainPos.btnDatosCliente_Click(null, null);
                    return -1;
                }
            }

            #region Inserta los datos del pedido

            Model.PDV.DsPDV.WMS_DOCUMENTOSRow row = DataSource.WMS_DOCUMENTOS.NewWMS_DOCUMENTOSRow();
            pDocument = Convert.ToDecimal(GUI.CApp.GetSecuence("WMS_S_DOCUMENTO"));
            row.SOCIO = (pSocio ?? Convert.ToDecimal(GUI.CApp.GetParam("NSCF")));
            row.DOCUMENTO = pDocument;
            row.TIPO_DOCUMENTO = "P";
            row.SUBTIPO_DOCUMENTO = "T";
            row.SITUACION = 3;


            if (DataSource.WMS_SOCIOS.Count > 0)
            {
                if (DataSource.WMS_SOCIOS[0]["TARJETA1"] != DBNull.Value)
                    row.TARJETA1 = DataSource.WMS_SOCIOS[0].TARJETA1;
            }

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

            row.USUARIO1 = pUsuario;
            row.CREADO_POR = GUI.CApp.usuario;

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

            DataSource.WMS_DOCUMENTOS.AddWMS_DOCUMENTOSRow(row);

            try
            {
                GUI.CApp.bll.updateDataSet(DataSource, DataSource.WMS_DOCUMENTOS.TableName);
            }
            catch (Exception ex)
            {
                GUI.CApp.ShowMessage(ex.Message, "POS Retail 8.0.0", true);
            }

            #endregion

            #region Obtiene los datos del pedido

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("DOCUMENTO", DataSource.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.WMS_DOCUMENTOS.TableName, qp), DataSource);

            qp.Clear();
            qp.AddReplaceParam("SOCIO", (pSocio ?? Convert.ToDecimal(GUI.CApp.GetParam("NSCF"))).ToString());
            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.WMS_SOCIOS.TableName, qp, "FillBySocio"), DataSource);

            qp.Clear();
            qp.AddReplaceParam("DOCUMENTO", pDocument.ToString());
            DataSource.TDA_DATOS_DOCUMENTO.Clear();
            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(DataSource.GetType(), DataSource.TDA_DATOS_DOCUMENTO.TableName, qp), DataSource);

            #endregion

            DataSource.EnforceConstraints = true;

            return pDocument;
        }

        private void txtSku_Enter(object sender, EventArgs e)
        {
            txtSku.SelectAll();
        }

        #endregion

        #region Cantidad Events

        private void txtCantidad_KeyPress(object sender, KeyPressEventArgs e)
        {
            txtSku_KeyPress(sender, e);
            if (e.KeyChar == 13)
            {
                txtSku.Focus();
            }
        }

        private void txtCantidad_Leave(object sender, EventArgs e)
        {
            //txtSku.Focus();
            Program.FrmMainPos.pos.ctlDetail1.gdDetail.TabStop = (Program.FrmMainPos.DsPedido.TDA_DETALLE_PEDIDO.Count > 0);
            Program.FrmMainPos.pos.ctlDetail1.TabStop = Program.FrmMainPos.pos.ctlDetail1.gdDetail.TabStop;
            Program.FrmMainPos.pos.ctlDetail1.Enabled = Program.FrmMainPos.pos.ctlDetail1.gdDetail.TabStop;

            if (Program.FrmMainPos.pos.ctlDetail1.Enabled)
                Program.FrmMainPos.pos.ctlDetail1.Focus();
            else
                txtSku.Focus();
        }

        private void txtCantidad_Enter(object sender, EventArgs e)
        {
            txtCantidad.SelectAll();
        }

        #endregion

        public void ShowFindSku()
        {
            //Finders.frmFindSku ffs = (MainForms.Finders.frmFindSku)GUI.CApp.CreateForm(typeof(MainForms.Finders.frmFindSku), true);
            if (GUI.CApp.ValidateAccess("FindSku", "Búsqueda de Productos"))
            {
                Finders.frmFindSku ffs = new LLNet.Tienda.MainForms.Finders.frmFindSku();
                ffs.Init(null);
                ffs.ShowDialog();

                if (ffs != null)
                {
                    if (ffs.DialogResult == DialogResult.OK)
                        txtSku.EditValue = ffs.SkuAlterno;
                }
            }
            txtSku.Focus();
        }

        public void ShowCalcQty()
        {
            Forms.frmCalcQty qty = new LLNet.Tienda.MainForms.Forms.frmCalcQty();
            qty.Init(new object[] { txtSku.EditValue, 1 });
            if (qty.isValid)
            {
                qty.ShowDialog();

                if (qty.DialogResult == DialogResult.OK)
                {
                    txtCantidad.EditValue = qty.calcCantidad.Value;
                    InsertOrderLine("");
                }
            }
        }

        private void btnFindSku_Click(object sender, EventArgs e)
        {
            ShowFindSku();
        }

        private void btnCalcCantidad_Click(object sender, EventArgs e)
        {
            ShowCalcQty();
        }

        #endregion

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void txtCantidad_KeyDown(object sender, KeyEventArgs e)
        {
        }

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

        private void txtCantidad_EditValueChanged(object sender, EventArgs e)
        {

        }

        private void txtSku_EditValueChanged(object sender, EventArgs e)
        {

        }

    }
}