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 $$$$$$$$$$$$$$$$$*/ }