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 $$$$$$$$$$$$$$$$$*/
        }
        private void btnRegistrar_Click(object sender, EventArgs e)
        {
            int cantidadDevolucion;
            DocumentoLineaBL objDocLineaBL = new DocumentoLineaBL();
            ArticuloXLocalBL objArtxLocal=new ArticuloXLocalBL();
            PackBL objPackBL=new PackBL();
            IList<DocumentoLinea> lineasNotaCredito=new List<DocumentoLinea>();
            List<NotaIngresoSalidaLinea> lineasNotaIngreso = new List<NotaIngresoSalidaLinea>();
            ArticuloXPackBL objArtxPack=new ArticuloXPackBL();
            bool crearDevolucion = false; //si al menos una de las cantidades devueltas>0 ,se procede a registrar la devolucion

            calcularDevolucion();

            for (int i = 0; i < dgvArticulos.Rows.Count; i++) //actualizando los docs lineas q son de articulos
            {
               cantidadDevolucion=Int32.Parse(dgvArticulos.Rows[i].Cells["CantidadDevolucion"].Value.ToString());

               if (cantidadDevolucion>0){

                   crearDevolucion = true;

                   //docLineaVenta
                   listaArticulos[i].CantidadDevuelta = listaArticulos[i].CantidadDevuelta + cantidadDevolucion;
                   objDocLineaBL.Grabar(listaArticulos[i]); //las lineas fueron actualizadas cada vez q se calculaban los montos de devolucion

                   //actualizamos la cantidad de articulos en EL LOCAL EN Q SE REALIZA LA DEVOLUCION
                   ArticuloXLocal artxlocal=objArtxLocal.findArticuloEnLocal(listaArticulos[i].ArticuloXLocal.Articulo.Id,empleado.Local.Id);
                   artxlocal.Cantidad=artxlocal.Cantidad+cantidadDevolucion;
                   objArtxLocal.Actualizar(artxlocal);

                   DocumentoLinea lineaNotaCredito=new DocumentoLinea();

                   lineaNotaCredito.Cantidad=cantidadDevolucion;
                   lineaNotaCredito.Impuesto=listaArticulos[i].Impuesto;
                   lineaNotaCredito.PrecioLinea=(float)(listaArticulos[i].PrecioLinea*cantidadDevolucion/listaArticulos[i].Cantidad);
                   lineaNotaCredito.ArticuloXLocal=listaArticulos[i].ArticuloXLocal;
                   lineaNotaCredito.CantidadDevuelta=0;
                   lineaNotaCredito.DescuentoXArticulo=listaArticulos[i].DescuentoXArticulo;

                   NotaIngresoSalidaLinea lineaNotaIngreso = new NotaIngresoSalidaLinea();
                   lineaNotaIngreso.Cantidad = cantidadDevolucion;
                   lineaNotaIngreso.ArticuloXLocal = artxlocal;

                   lineasNotaIngreso.Add(lineaNotaIngreso);
                   lineasNotaCredito.Add(lineaNotaCredito);
               }
            }

            for (int i = 0; i < dgvPacks.Rows.Count; i++)
            {
                cantidadDevolucion = Int32.Parse(dgvPacks.Rows[i].Cells["CantidadDev"].Value.ToString());

                if (cantidadDevolucion > 0)
                {
                    crearDevolucion = true;

                    //Pack
                    listaPacks[i].Pack.CantidadUtilizada = listaPacks[i].Pack.CantidadUtilizada - cantidadDevolucion;
                    objPackBL.Grabar(listaPacks[i].Pack);

                    //Doclinea Venta
                    listaPacks[i].CantidadDevuelta = listaPacks[i].CantidadDevuelta + cantidadDevolucion;
                    objDocLineaBL.Grabar(listaPacks[i]);

                    //ArticuloXLocal

                    IList<ArticuloXPack> articulosPack = objArtxPack.findArticulosXPack(listaPacks[i].Pack.Id);

                    foreach (ArticuloXPack artxpack in articulosPack)
                    {
                        ArticuloXLocal artxlocal = objArtxLocal.findArticuloEnLocal(artxpack.Articulo.Id, empleado.Local.Id);
                        artxlocal.Cantidad = artxlocal.Cantidad + artxpack.CantidadPack * cantidadDevolucion;
                        objArtxLocal.Actualizar(artxlocal);

                        //creamos una linea de ingreso para el producto del pack
                        NotaIngresoSalidaLinea lineaNotaIngreso = new NotaIngresoSalidaLinea();
                        lineaNotaIngreso.Cantidad = cantidadDevolucion*artxpack.CantidadPack;
                        lineaNotaIngreso.ArticuloXLocal = artxlocal;

                        lineasNotaIngreso.Add(lineaNotaIngreso);
                    }

                    DocumentoLinea lineaNotaCredito = new DocumentoLinea();

                    lineaNotaCredito.Cantidad = cantidadDevolucion;
                    lineaNotaCredito.Impuesto = listaPacks[i].Impuesto;
                    lineaNotaCredito.PrecioLinea = (float)(listaPacks[i].Pack.PrecioPack*cantidadDevolucion);
                    lineaNotaCredito.CantidadDevuelta = 0;
                    lineaNotaCredito.Pack = listaPacks[i].Pack;

                    lineasNotaCredito.Add(lineaNotaCredito);
                }
            }

            //creamos el DOCUMENTO

            if (crearDevolucion)
            {

                Documento documento = new Documento();
                documento.FechaEmision = DateTime.Today;
                documento.Estado = "Registrado";
                documento.Total = totalDevolucion;
                documento.Caja = new RegistroCajaBL().DameCaja(empleado);
                documento.NroDocumentoVenta = Int32.Parse(empleado.Local.Id + "" + empleado.Id);
                documento.Cliente = documentoVentaActual.Cliente;
                documento.FechaAnulacion = DateTime.Today;

                //creamos la NOTA DE CREDITO

                NotaCredito notaCred = new NotaCredito();
                notaCred.MontoDevolucion = totalDevolucion;
                notaCred.Motivo = richTxtMotivo.Text;
                notaCred.DocVenta = new DocVentaBL().findById(documentoVentaActual.Id.ToString());

                new NotaCreditoBL().Devolver(documento, notaCred, lineasNotaCredito, lineasNotaIngreso);
                Utils.Utils.OK(Utils.Utils.REGISTRO_OK);
            }

            else

                Utils.Utils.Error(null,"No se puede registrar la Nota de Crédito porque ningún producto fue devuelto");
        }
        private void btnRegistrar_Click(object sender, EventArgs e)
        {
            int cantidadDevolucion;
            DocumentoLineaBL objDocLineaBL = new DocumentoLineaBL();
            ArticuloXLocalBL objArtxLocal=new ArticuloXLocalBL();
            PackBL objPackBL=new PackBL();
            IList<DocumentoLinea> lineasNotaCredito=new List<DocumentoLinea>();
            List<NotaIngresoSalidaLinea> lineasNotaIngreso = new List<NotaIngresoSalidaLinea>();
            ArticuloXPackBL objArtxPack=new ArticuloXPackBL();
            bool crearDevolucion = false; //si al menos una de las cantidades devueltas>0 ,se procede a registrar la devolucion

            calcularDevolucion();

            if (dgvArticulos.Rows.Count == 0 && dgvPacks.Rows.Count == 0)
            {
                Utils.Utils.Error(null, "No se ha ingresado un documento de venta");
                return;
            }

            if (empleado.Local.Estado=="Inactivo"){
                Utils.Utils.Error(null, "No se puede registrar la devolucion ya que el local se encuentra inactivo");
                return;
            }

            for (int i = 0; i < dgvArticulos.Rows.Count; i++)
            {
                dgvArticulos.Rows[i].DefaultCellStyle.BackColor = Color.White;
            }

            for (int i = 0; i < dgvPacks.Rows.Count; i++)
            {
                dgvPacks.Rows[i].DefaultCellStyle.BackColor = Color.White;
            }

            for (int i = 0; i < dgvArticulos.Rows.Count; i++) //actualizando los docs lineas q son de articulos
            {
               cantidadDevolucion=Int32.Parse(dgvArticulos.Rows[i].Cells["CantidadDevolucion"].Value.ToString());

               if (cantidadDevolucion > 0)
               {
                   crearDevolucion = true;

                   //docLineaVenta
                   listaArticulos[i].CantidadDevuelta = listaArticulos[i].CantidadDevuelta + cantidadDevolucion;
                   objDocLineaBL.Grabar(listaArticulos[i]); //las lineas fueron actualizadas cada vez q se calculaban los montos de devolucion

                   //actualizamos la cantidad de articulos en EL LOCAL EN Q SE REALIZA LA DEVOLUCION
                   ArticuloXLocal artxlocal = objArtxLocal.findArticuloEnLocal(listaArticulos[i].ArticuloXLocal.Articulo.Id, empleado.Local.Id);
                   artxlocal.Cantidad = artxlocal.Cantidad + cantidadDevolucion;
                   objArtxLocal.Actualizar(artxlocal);

                   DocumentoLinea lineaNotaCredito = new DocumentoLinea();

                   lineaNotaCredito.Cantidad = cantidadDevolucion;
                   lineaNotaCredito.Impuesto = listaArticulos[i].Impuesto;
                   lineaNotaCredito.PrecioLinea = (float)(listaArticulos[i].PrecioLinea * cantidadDevolucion / listaArticulos[i].Cantidad);
                   lineaNotaCredito.ArticuloXLocal = listaArticulos[i].ArticuloXLocal;
                   lineaNotaCredito.CantidadDevuelta = 0;
                   lineaNotaCredito.DescuentoXArticulo = listaArticulos[i].DescuentoXArticulo;

                   NotaIngresoSalidaLinea lineaNotaIngreso = new NotaIngresoSalidaLinea();
                   lineaNotaIngreso.Cantidad = cantidadDevolucion;
                   lineaNotaIngreso.ArticuloXLocal = artxlocal;

                   lineasNotaIngreso.Add(lineaNotaIngreso);
                   lineasNotaCredito.Add(lineaNotaCredito);
               }
               else
               {
                   dgvArticulos.Rows[i].DefaultCellStyle.BackColor = Color.RosyBrown;
               }
            }

            for (int i = 0; i < dgvPacks.Rows.Count; i++)
            {
                cantidadDevolucion = Int32.Parse(dgvPacks.Rows[i].Cells["CantidadDev"].Value.ToString());

                if (cantidadDevolucion > 0)
                {
                    crearDevolucion = true;

                    //Pack
                    listaPacks[i].Pack.CantidadUtilizada = listaPacks[i].Pack.CantidadUtilizada - cantidadDevolucion;
                    objPackBL.Grabar(listaPacks[i].Pack);

                    //Doclinea Venta
                    listaPacks[i].CantidadDevuelta = listaPacks[i].CantidadDevuelta + cantidadDevolucion;
                    objDocLineaBL.Grabar(listaPacks[i]);

                    //ArticuloXLocal

                    IList<ArticuloXPack> articulosPack = objArtxPack.findArticulosXPack(listaPacks[i].Pack.Id);

                    foreach (ArticuloXPack artxpack in articulosPack)
                    {
                        ArticuloXLocal artxlocal = objArtxLocal.findArticuloEnLocal(artxpack.Articulo.Id, empleado.Local.Id);
                        artxlocal.Cantidad = artxlocal.Cantidad + artxpack.CantidadPack * cantidadDevolucion;
                        objArtxLocal.Actualizar(artxlocal);

                        //creamos una linea de ingreso para cada producto del pack
                        NotaIngresoSalidaLinea lineaNotaIngreso = new NotaIngresoSalidaLinea();
                        lineaNotaIngreso.Cantidad = cantidadDevolucion*artxpack.CantidadPack;
                        lineaNotaIngreso.ArticuloXLocal = artxlocal;

                        lineasNotaIngreso.Add(lineaNotaIngreso);
                    }

                    DocumentoLinea lineaNotaCredito = new DocumentoLinea();

                    lineaNotaCredito.Cantidad = cantidadDevolucion;
                    lineaNotaCredito.Impuesto = listaPacks[i].Impuesto;
                    lineaNotaCredito.PrecioLinea = (float)(listaPacks[i].Pack.PrecioPack*cantidadDevolucion);
                    lineaNotaCredito.CantidadDevuelta = 0;
                    lineaNotaCredito.Pack = listaPacks[i].Pack;

                    lineasNotaCredito.Add(lineaNotaCredito);
                }

                else
                {
                    dgvPacks.Rows[i].DefaultCellStyle.BackColor = Color.RosyBrown;

                }
            }

            //creamos el DOCUMENTO

            if (crearDevolucion)
            {

                Documento documento = new Documento();
                documento.FechaEmision = DateTime.Today;
                documento.FechaAnulacion = null;
                documento.TipoDocumento = "NotaCredito";
                documento.Estado = "Registrado";
                documento.Total = totalDevolucion;
                documento.Subtotal = subtotal;
                documento.Caja = new RegistroCajaBL().DameCaja(empleado);
               // documento.NroDocumentoVenta = Int32.Parse(empleado.Local.Id + "" +1710);
                documento.Cliente = documentoVentaActual.Cliente;

                //creamos la NOTA DE CREDITO

                NotaCredito notaCred = new NotaCredito();
                notaCred.MontoDevolucion = totalDevolucion;
                notaCred.Motivo = richTxtMotivo.Text;
                notaCred.DocVenta = new DocVentaBL().findById(documentoVentaActual.Id.ToString());

                new NotaCreditoBL().Devolver(documento, notaCred, lineasNotaCredito, lineasNotaIngreso);

                Utils.Utils.OK(Utils.Utils.REGISTRO_OK);

                if (Utils.Utils.ContinuarOperacion("Desea exportar el documento?"))
                {
                    NotaCreditoDatos dsNotaCredito = new NotaCreditoBL().exportarDocumento(documento.NroDocumentoVenta.ToString());//, notaCred, lineasNotaCredito);

                    new frmDocumentoNotaCredito(dsNotaCredito).ShowDialog(this);
                }

                limpiarCampos();
            }

            else

                Utils.Utils.Error(null,"Las cantidades sombreadas no son válidas");
        }