private void btnCalcularTotal_Click(object sender, EventArgs e)
        {
            double subtotal = 0;
            double totalIGV = 0;
            Single DescDescuentos = (Single)0.0;
            Single DescPack = (Single)0.0;
            Single DesCategoria = (Single)0.0;
            Single DescuentoTotal = (Single)0.0;
            foreach (DocumentoLinea linea in lineasDocumento)
            {
                subtotal += linea.PrecioLinea;
                totalIGV += linea.PrecioLinea * linea.Impuesto;
            }
            txtSubtotal.Text = subtotal.ToString("0.00");
            txtTotalIGV.Text = totalIGV.ToString("0.00");

            if (cliente != null)
            {
                /*$$$$$$$$$$ INICIO DESCUENTOS $$$$$$$$$$$$$$$$$*/

                //obtengo la linea de documento para analizarla
                IList<DocumentoLinea> lineasDocumentoCopy = new List<DocumentoLinea>();
                //lineasDocumentoCopy = lineasDocumento;
                foreach (DocumentoLinea doclin in lineasDocumento)
                {
                    DocumentoLinea objdoc = new DocumentoLinea();
                    objdoc.Cantidad = doclin.Cantidad;
                    objdoc.PrecioLinea = doclin.PrecioLinea;
                    objdoc.ArticuloXLocal = new ArticuloXLocal();
                    objdoc.ArticuloXLocal.Articulo = new Articulo();
                    objdoc.ArticuloXLocal.Articulo.Id = doclin.ArticuloXLocal.Articulo.Id;
                    objdoc.ArticuloXLocal.Articulo.PrecioVenta = doclin.ArticuloXLocal.Articulo.PrecioVenta;
                    lineasDocumentoCopy.Add(objdoc);
                }
                /*########### ANALISIS DE PACKSS ###############*/

                //Obtengo todos los Packs de la categoria de mi cliente
                IList<PackXCategoriaCliente> PacksActualesCategoria = new List<PackXCategoriaCliente>();
                //le paso el id de categoria del cliente
                PackXCategoriaClienteBL objPacksCategoria = new PackXCategoriaClienteBL();
                PacksActualesCategoria = objPacksCategoria.FindByIdCliente(cliente.CategoriaCliente.Id);

                IList<ArticuloXPack> ArticulosPack = new List<ArticuloXPack>();

                foreach (PackXCategoriaCliente objPack in PacksActualesCategoria)
                {

                    ArticuloXPackBL objArPack = new ArticuloXPackBL();
                    ArticulosPack = objArPack.findArticulosXPack(objPack.Pack.Id);
                    //obtengo todos los articulos de ese
                    //para la lista de articulos verifica si estan todas las cantidades en mi linea actual
                    bool cumple = true;
                    int cantidadPacks = -1;
                    foreach (ArticuloXPack objArtpack in ArticulosPack)
                    {

                        bool esArt = false;

                        foreach (DocumentoLinea lineaDoc in lineasDocumentoCopy)
                        {

                            if (lineaDoc.ArticuloXLocal.Articulo.Id == objArtpack.Articulo.Id && lineaDoc.Cantidad > 0
                                && lineaDoc.Cantidad >= objArtpack.CantidadPack && objArtpack.Pack.CantidadPacks > 0 && objArtpack.CantidadPack > 0)
                            {
                                int dif = (int)lineaDoc.Cantidad - (int)objArtpack.CantidadPack;

                                if (cantidadPacks != -1)
                                    cantidadPacks = Math.Min(cantidadPacks, dif / (int)objArtpack.CantidadPack);
                                else
                                    cantidadPacks = dif / (int)objArtpack.CantidadPack;

                                esArt = true;
                            }
                            if (esArt)
                                break;
                        }
                        if (!esArt)
                            cumple = false;

                        if (!cumple)
                            break;
                    }

                    if (cumple)
                    {//ese pack se puede extraer de la linea actual
                        //extraemos todos los productos
                        cantidadPacks = Math.Min(cantidadPacks, (int)objPack.Pack.CantidadPacks);
                        foreach (ArticuloXPack objArtpack in ArticulosPack)
                        {
                            if (cantidadPacks <= 0)
                                break;
                            foreach (DocumentoLinea lineaDoc in lineasDocumentoCopy)
                            {

                                if (lineaDoc.ArticuloXLocal.Articulo.Id == objArtpack.Articulo.Id && lineaDoc.Cantidad > 0
                                    && lineaDoc.Cantidad >= objArtpack.CantidadPack && objArtpack.Pack.CantidadPacks > 0)
                                {
                                    lineaDoc.Cantidad -= objArtpack.CantidadPack * cantidadPacks;
                                    //para guardar que se uso ese pack
                                }
                            }

                        }
                        Single PrecioOriginal = (Single)0.0;

                        foreach (ArticuloXPack objArtpack in ArticulosPack)
                            PrecioOriginal += (Single)objArtpack.CantidadPack * (Single)cantidadPacks * objArtpack.Articulo.PrecioVenta;

                        if (cantidadPacks > 0)
                        {
                            objPack.Pack.CantidadPacks -= cantidadPacks;
                            objPack.Pack.CantidadUtilizada += cantidadPacks;
                            DescPack += (PrecioOriginal - objPack.Pack.PrecioPack * cantidadPacks);
                        }
                        // se actualizo la linea auxiliars
                    }
                    //fin de iteracion de un PACK
                }

                /*########### FIN DE ANALISIS DE PACKSS ###############*/

                /*########### ANALISIS DE DESCUENTOS ###############*/
                IList<DescuentoXCategoriaCliente> DescuentosActualesCategoria = new List<DescuentoXCategoriaCliente>();
                //obtiene todos los descuentos de la categoria cliente
                DescuentoXCategoriaClienteBL objDescuentoXCategoriaClienteBL = new DescuentoXCategoriaClienteBL();
                DescuentosActualesCategoria = objDescuentoXCategoriaClienteBL.FindById(cliente.CategoriaCliente.Id);

                IList<DescuentoXArticulo> ArticulosDescuento = new List<DescuentoXArticulo>();

                //itero sobre cada articulo para que descuente solo una vez
                foreach (DocumentoLinea lineaDoc in lineasDocumentoCopy)
                {
                    bool desconto = false;
                    foreach (DescuentoXCategoriaCliente objDescuentos in DescuentosActualesCategoria)
                    {
                        //obtengo todos los articulos de ese descuento
                        if (desconto)
                            break;
                        DescuentoXArticuloBL objDeArt = new DescuentoXArticuloBL();
                        ArticulosDescuento = objDeArt.Find(objDescuentos.Descuento);

                        foreach (DescuentoXArticulo objArticulo in ArticulosDescuento)
                        {
                            if (desconto)
                                break;
                            if (objArticulo.Articulo.Id == lineaDoc.ArticuloXLocal.Articulo.Id &&
                                lineaDoc.Cantidad > 0)
                            {
                                Single porce = objArticulo.PorcentajeDescuento / (Single)100.0;
                                DescDescuentos += (Single)porce * (Single)lineaDoc.Cantidad * (Single)lineaDoc.ArticuloXLocal.Articulo.PrecioVenta;
                                desconto = true;
                            }
                        }
                    }
                }
            }
            /*########### ANALISIS DE DESCUENTOS ###############*/
            DescDescuentos = DescDescuentos + (Single)0.0;
            DescPack = DescPack + (Single)0.0;
            DescuentoTotal = DescDescuentos + DescPack;

            txtPromo.Text = DescDescuentos.ToString("0.00");
            txtDescuento.Text = DescuentoTotal.ToString("0.00");
            txtDesPac.Text = DescPack.ToString("0.00");
            /*SOLO POR AHORA*/
            Single total2 = (Single)totalIGV - DescuentoTotal;
            txtTotal.Text = total2.ToString("0.00");
            /*$$$$$$$$$$ FIN DESCUENTOS $$$$$$$$$$$$$$$$$*/
        }
        private void btnCalcularTotal_Click(object sender, EventArgs e)
        {
            double TotalFin = 0;
            double subtotal = 0;
            double totalIGV = 0;
            Single DescDescuentos = (Single)0.0;
            Single DescPack = (Single)0.0;
            Single DesCategoria = (Single)0.0;
            Single DescuentoTotal = (Single)0.0;

            foreach (DocumentoLinea linea in lineasDocumento)
            {
                subtotal += linea.PrecioLinea;
                if (linea.Impuesto >= 0.012)
                    totalIGV += linea.PrecioLinea * 0.19;
            }
            TotalFin = subtotal + totalIGV;

            if (cliente != null)
            {
                /*$$$$$$$$$$ INICIO DESCUENTOS $$$$$$$$$$$$$$$$$*/

                //obtengo la linea de documento para analizarla
                IList<DocumentoLinea> lineasDocumentoCopy;

                lineasDocumentoCopy = lineasDocumento;
                /*########### ANALISIS DE PACKSS ###############*/

                //Obtengo todos los Packs de la categoria de mi cliente
                IList<PackXCategoriaCliente> PacksActualesCategoria = new List<PackXCategoriaCliente>();
                //le paso el id de categoria del cliente
                PackXCategoriaClienteBL objPacksCategoria = new PackXCategoriaClienteBL();
                PacksActualesCategoria = objPacksCategoria.FindByIdCliente(cliente.CategoriaCliente.Id);

                IList<ArticuloXPack> ArticulosPack = new List<ArticuloXPack>();
                lineasPack = new List<DocumentoLinea>();
                //recorro todos los packs
                foreach (PackXCategoriaCliente objPack in PacksActualesCategoria)
                {
                    ArticuloXPackBL objArPack = new ArticuloXPackBL();
                    //obtengo todos los articulos de ese
                    ArticulosPack = objArPack.findArticulosXPack(objPack.Pack.Id);

                    //para la lista de articulos verifica si estan todas las cantidades en mis lineas actual
                    bool cumple = true;
                    int cantidadPacks = -1;

                    foreach (ArticuloXPack objArtpack in ArticulosPack)
                    {

                        bool esArt = false;

                        foreach (DocumentoLinea lineaDoc in lineasDocumentoCopy)
                        {

                            if (lineaDoc.ArticuloXLocal.Articulo.Id == objArtpack.Articulo.Id && lineaDoc.Cantidad > 0
                                && lineaDoc.Cantidad >= objArtpack.CantidadPack && objArtpack.Pack.CantidadPacks > 0 && objArtpack.CantidadPack > 0)
                            {
                                int dif = (int)lineaDoc.Cantidad;

                                if (cantidadPacks != -1)
                                    cantidadPacks = Math.Min(cantidadPacks, dif / (int)objArtpack.CantidadPack);
                                else
                                    cantidadPacks = dif / (int)objArtpack.CantidadPack;

                                esArt = true;
                            }
                            if (esArt)
                                break;
                        }
                        //si el articulo de ese pack no se encuentra en mi linea
                        if (!esArt)
                            cumple = false;

                        // este pack ya no cumple
                        if (!cumple)
                            break;
                    }

                    //despues de recorrer todos mis articulos del pack
                    if (cumple)
                    {   //ese pack se puede extraer de la linea actual
                        //extraemos todos los productos
                        cantidadPacks = Math.Min(cantidadPacks, (int)objPack.Pack.CantidadPacks);

                        foreach (ArticuloXPack objArtpack in ArticulosPack)
                        {
                            if (cantidadPacks <= 0)
                                break;
                            foreach (DocumentoLinea lineaDoc in lineasDocumentoCopy)
                            {

                                if (lineaDoc.ArticuloXLocal.Articulo.Id == objArtpack.Articulo.Id && lineaDoc.Cantidad > 0
                                    && lineaDoc.Cantidad >= objArtpack.CantidadPack && objArtpack.Pack.CantidadPacks > 0)
                                {
                                    lineaDoc.Cantidad -= objArtpack.CantidadPack * cantidadPacks;

                                    //para guardar que se uso ese pack

                                }
                            }
                        }

                        DocumentoLinea lineaPack = new DocumentoLinea();
                        lineaPack.ArticuloXLocal = null;
                        lineaPack.Cantidad = cantidadPacks;
                        lineaPack.CantidadDevuelta = 0;
                        lineaPack.DescuentoXArticulo = null;
                        lineaPack.Documento = documento;
                        lineaPack.Impuesto = 0;
                        lineaPack.Pack = objPack.Pack;
                        lineaPack.PrecioLinea = cantidadPacks * objPack.Pack.PrecioPack;
                        lineasPack.Add(lineaPack);

                        Single PrecioOriginal = (Single)0.0;

                        foreach (ArticuloXPack objArtpack in ArticulosPack)
                            PrecioOriginal += objArtpack.Articulo.PrecioVenta * (Single)objArtpack.CantidadPack;
                        PrecioOriginal *= cantidadPacks;

                        if (cantidadPacks > 0)
                        {
                            objPack.Pack.CantidadPacks -= cantidadPacks;
                            objPack.Pack.CantidadUtilizada += cantidadPacks;
                            DescPack += (PrecioOriginal - objPack.Pack.PrecioPack * cantidadPacks);
                            new PackBL().Grabar(objPack.Pack);
                        }
                        // se actualizo la linea auxiliars
                    }
                    //fin de iteracion de un PACK
                }

                /*########### FIN DE ANALISIS DE PACKSS ###############*/

                /*########### ANALISIS DE DESCUENTOS ###############*/
                IList<DescuentoXCategoriaCliente> DescuentosActualesCategoria = new List<DescuentoXCategoriaCliente>();
                //obtiene todos los descuentos de la categoria cliente
                DescuentoXCategoriaClienteBL objDescuentoXCategoriaClienteBL = new DescuentoXCategoriaClienteBL();
                DescuentosActualesCategoria = objDescuentoXCategoriaClienteBL.FindById(cliente.CategoriaCliente.Id);

                IList<DescuentoXArticulo> ArticulosDescuento = new List<DescuentoXArticulo>();

                //itero sobre cada articulo para que descuente solo una vez
                foreach (DocumentoLinea lineaDoc in lineasDocumentoCopy)
                {
                    bool desconto = false;
                    foreach (DescuentoXCategoriaCliente objDescuentos in DescuentosActualesCategoria)
                    {
                        //obtengo todos los articulos de ese descuento
                        if (desconto)
                            break;
                        DescuentoXArticuloBL objDeArt = new DescuentoXArticuloBL();
                        ArticulosDescuento = objDeArt.Find(objDescuentos.Descuento);

                        foreach (DescuentoXArticulo objArticulo in ArticulosDescuento)
                        {
                            if (desconto)
                                break;
                            if (objArticulo.Articulo.Id == lineaDoc.ArticuloXLocal.Articulo.Id &&
                                lineaDoc.Cantidad > 0)
                            {
                                Single porce = objArticulo.PorcentajeDescuento / (Single)100.0;
                                Single Desunico = (Single)porce * (Single)lineaDoc.Cantidad * (Single)lineaDoc.ArticuloXLocal.Articulo.PrecioVenta;
                                DescDescuentos += Desunico;
                                desconto = true;
                                lineaDoc.DescuentoXArticulo = objArticulo;
                                //tenemos q crear otro
                                DocumentoLinea lineaPack = new DocumentoLinea();
                                lineaPack.ArticuloXLocal = lineaDoc.ArticuloXLocal;
                                lineaPack.Cantidad = lineaDoc.Cantidad;
                                lineaPack.CantidadDevuelta = 0;
                                lineaPack.Documento = documento;
                                lineaPack.DescuentoXArticulo = objArticulo;
                                //lineaPack.Impuesto = lineaDoc.ArticuloXLocal.Articulo.IndIGV[0] == 'S' ? (float)0.19 * (lineaDoc.ArticuloXLocal.Articulo.PrecioVenta - lineaDoc.ArticuloXLocal.Articulo.PrecioVenta * (lineaPack.DescuentoXArticulo.PorcentajeDescuento)/(float)100) : 0;
                                lineaPack.Impuesto = lineaDoc.Impuesto;
                                lineaPack.Pack = null;
                                lineaPack.PrecioLinea = (float)lineaDoc.Cantidad * lineaDoc.ArticuloXLocal.Articulo.PrecioVenta;
                                lineasPack.Add(lineaPack);
                                lineaDoc.Cantidad = 0;
                                objDescuentos.Descuento.CantidadUtilizada++;
                                new DescuentoBL().Grabar(objDescuentos.Descuento);
                            }
                        }
                    }
                }

                foreach (DocumentoLinea linea in lineasDocumentoCopy)
                {
                    if (linea.Cantidad > 0)
                    {
                        lineasPack.Add(linea);
                    }
                }
            }
            else{
                lineasPack = lineasDocumento;
            }
            double TotalFin2 = 0;
            double subtotal2 = 0;
            double totalIGV2 = 0;
            foreach (DocumentoLinea linea in lineasPack)
            {
                subtotal2 += linea.PrecioLinea;
                if (linea.Impuesto >= 0.012)
                    totalIGV2 += linea.PrecioLinea * 0.19;
            }
            TotalFin2 = subtotal2 + totalIGV2;

            txtSubtotal.Text = subtotal.ToString("0.00");
            txtTotalIGV.Text = totalIGV.ToString("0.00");

            /*########### ANALISIS DE DESCUENTOS ###############*/
            DescDescuentos = DescDescuentos + (Single)0.0;
            DescPack = DescPack + (Single)0.0;
            DescuentoTotal = DescDescuentos + DescPack;

            txtPromo.Text = DescDescuentos.ToString("0.00");
            txtDescuento.Text = DescuentoTotal.ToString("0.00");
            txtDesPac.Text = DescPack.ToString("0.00");
            /*SOLO POR AHORA*/
            Single total2 = (Single)TotalFin2 - DescDescuentos;
            txtTotal.Text = total2.ToString("0.00");
            /*$$$$$$$$$$ FIN DESCUENTOS $$$$$$$$$$$$$$$$$*/
        }