public int InsertCierreKardex(int Accion, int UsuarioID, string Almacen, string ProductoID, string EmpresaID, string Periodo, int Anno, bool CostoCero, decimal Cantidad2, decimal CostoUnitario) { int totalAfectados = 0; CD_Kardex ObjCD_Kardex = new CD_Kardex(AppSettings.GetConnectionString); if (Accion == 1) { DataTable dtTMP = new DataTable(); DataTable dtTMP2 = new DataTable(); if (CostoCero == false) { //aplicar la lógica del cierre en el reporte mensual if (ProductoID == "TODOS") { ProductoID = ""; } DateTime FecInicial, FecFinal; FecInicial = new DateTime(Anno, Convert.ToInt16(Periodo), 1); FecFinal = new DateTime(Anno, Convert.ToInt16(Periodo), 1).AddMonths(1); dtTMP2 = new CL_Kardex().getDTKardex_varios(ProductoID, EmpresaID, FecInicial, FecFinal, Almacen, 1); dtTMP = new CL_Kardex().ArmarReporteKardex(dtTMP2); //Seleccionamos disticnt de los productos DataTable DtProductos = new DataTable(); DtProductos = dtTMP.DefaultView.ToTable(true, "ProductoID"); //tabla apra agregar los cierres DataTable DTCierre = new DataTable("Cierre"); DTCierre.Columns.Add("ProductoID", typeof(string)); DTCierre.Columns.Add("Cantidad", typeof(decimal)); DTCierre.Columns.Add("CostoUnitario", typeof(decimal)); foreach (DataRow DRP in DtProductos.Rows) { //filtramos datos por producto DataView Dv = new DataView(dtTMP, "ProductoID='" + DRP["ProductoID"].ToString() + "'", "ID DESC", DataViewRowState.CurrentRows); DataRow DR = DTCierre.NewRow(); DR["ProductoID"] = DRP["ProductoID"]; DR["Cantidad"] = decimal.Round(Convert.ToDecimal(Dv[0]["FCantidad"]), 2); DR["CostoUnitario"] = decimal.Round(Convert.ToDecimal(Dv[0]["FCostoUnitario"]), 2); DTCierre.Rows.Add(DR); } string XML = ""; string _xml = new BaseFunctions().GetXML(DTCierre).Replace("NewDataSet", "DocumentElement"); XML = _xml.Replace("Table", "Cierre"); //insercion masiva del kardex totalAfectados = ObjCD_Kardex.InsertCierreKardex(Accion, XML, UsuarioID, null, null, EmpresaID, Periodo, Anno, false, Cantidad2, CostoUnitario); } else { string XML = ""; totalAfectados = ObjCD_Kardex.InsertCierreKardex(Accion, XML, UsuarioID, Almacen, ProductoID, EmpresaID, Periodo, Anno, CostoCero, Cantidad2, CostoUnitario); } } else if (Accion == 2) { //ingreso manual totalAfectados = ObjCD_Kardex.InsertCierreKardex(Accion, "", UsuarioID, Almacen, ProductoID, EmpresaID, Periodo, Anno, CostoCero, Cantidad2, CostoUnitario); } return(totalAfectados); }
public int InsertCierreKardex(int Accion, int UsuarioID, string Almacen, string ProductoID, string EmpresaID, string Periodo, int Anno, bool CostoCero, decimal Cantidad2, decimal CostoUnitario) { int totalAfectados = 0; CD_Kardex ObjCD_Kardex = new CD_Kardex(AppSettings.GetConnectionString); if (Accion == 1) { DataTable dtTMP = new DataTable(); if (CostoCero == false) { //aplicar la lógica del cierre en el reporte mensual if (ProductoID == "TODOS") { ProductoID = ""; } DateTime FecInicial, FecFinal; FecInicial = new DateTime(Anno, Convert.ToInt16(Periodo), 1); FecFinal = new DateTime(Anno, Convert.ToInt16(Periodo), 1).AddMonths(1); dtTMP = new CL_Kardex().getDTKardex_varios(ProductoID, EmpresaID, FecInicial, FecFinal, Almacen, 2); //buscar '0' en los valores, no deberia existir el '0' DataView DVCero = new DataView(dtTMP, "PrecioUnitario = 0", "", DataViewRowState.CurrentRows); if (DVCero.Count > 0) { throw new Exception("Hay " + DVCero.Count.ToString() + " costo(s) unitario igual a 0\n\nno se insertara ningun registro"); } decimal Cantidad = 0, CantidadAcumulada = 0, PrecioPonderado = 0, CostoAcumulado = 0; //UsuarioID //Creamos tabla para ordenar los datos DataTable DtKardex = new DataTable("GetKardex"); DtKardex.Columns.Add("ID", typeof(int)).AutoIncrement = true; DtKardex.Columns.Add("ProductoID", typeof(string)); DtKardex.Columns.Add("FCantidad", typeof(decimal)); DtKardex.Columns.Add("FCostoUnitario", typeof(decimal)); //Seleccionamos disticnt de los productos DataTable DtProductos = new DataTable(); DtProductos = dtTMP.DefaultView.ToTable(true, "ProductoID"); foreach (DataRow DRP in DtProductos.Rows) { //filtramos datos por producto DataView Dv = new DataView(dtTMP, "ProductoID='" + DRP["ProductoID"].ToString() + "'", "AudCrea ASC", DataViewRowState.CurrentRows); foreach (DataRowView Dr in Dv) { DataRow DR = DtKardex.NewRow(); DR["ProductoID"] = Dr["ProductoID"]; Cantidad = Convert.ToDecimal(Dr["Cantidad"]); //validar si es entrada o salida if (Dr["Tipo"].ToString() == "I") { PrecioPonderado = Convert.ToDecimal(Dr["PrecioUnitario"]);//temporal CantidadAcumulada += Cantidad; CostoAcumulado += Cantidad * PrecioPonderado; DR["FCantidad"] = CantidadAcumulada; PrecioPonderado = CostoAcumulado / CantidadAcumulada;//precio real nuevo DR["FCostoUnitario"] = PrecioPonderado; } else if (Dr["Tipo"].ToString() == "S" & Dr["TipoOperacion"].ToString() == "01") //salida por venta { CantidadAcumulada -= Cantidad; CostoAcumulado = CantidadAcumulada * PrecioPonderado; DR["FCantidad"] = CantidadAcumulada; PrecioPonderado = CostoAcumulado / CantidadAcumulada; DR["FCostoUnitario"] = PrecioPonderado; } else if (Dr["Tipo"].ToString() == "S") //otro tipo de salida { PrecioPonderado = Convert.ToDecimal(Dr["PrecioUnitario"]); //temporal CantidadAcumulada -= Cantidad; DR["FCantidad"] = CantidadAcumulada; CostoAcumulado -= Cantidad * PrecioPonderado; PrecioPonderado = CostoAcumulado / CantidadAcumulada; DR["FCostoUnitario"] = PrecioPonderado; } else if (Dr["Tipo"].ToString() == "A") //saldo inicial { PrecioPonderado = Convert.ToDecimal(Dr["PrecioUnitario"]); CantidadAcumulada += Cantidad; CostoAcumulado += Cantidad * PrecioPonderado; DR["FCantidad"] = Cantidad; DR["FCostoUnitario"] = PrecioPonderado; } DtKardex.Rows.Add(DR); } Cantidad = 0; CantidadAcumulada = 0; PrecioPonderado = 0; } //una ves creada la tabla, se debe capturar los totales y ordenarlos en otra tabla //Creamos tabla para ordenar los datos DataTable DTCierre = new DataTable("Cierre"); DTCierre.Columns.Add("ProductoID", typeof(string)); DTCierre.Columns.Add("Cantidad", typeof(decimal)); DTCierre.Columns.Add("CostoUnitario", typeof(decimal)); foreach (DataRow DRP in DtProductos.Rows) { //cacturar el ultimo valor agregado, ese sera el costo nuevo DataView DV = new DataView(DtKardex, "ProductoID = '" + DRP["ProductoID"].ToString() + "'", "ID DESC", DataViewRowState.CurrentRows); DataRow DR = DTCierre.NewRow(); DR["ProductoID"] = DRP["ProductoID"]; DR["Cantidad"] = DV[0]["FCantidad"]; DR["CostoUnitario"] = DV[0]["FCostoUnitario"]; DTCierre.Rows.Add(DR); } string XML = ""; string _xml = new BaseFunctions().GetXML(DTCierre).Replace("NewDataSet", "DocumentElement"); XML = _xml.Replace("Table", "Cierre"); //insercion masiva del kardex totalAfectados = ObjCD_Kardex.InsertCierreKardex(Accion, XML, UsuarioID, null, null, EmpresaID, Periodo, Anno, false, Cantidad2, CostoUnitario); } else { string XML = ""; totalAfectados = ObjCD_Kardex.InsertCierreKardex(Accion, XML, UsuarioID, Almacen, ProductoID, EmpresaID, Periodo, Anno, CostoCero, Cantidad2, CostoUnitario); } } else if (Accion == 2) { //ingreso manual totalAfectados = ObjCD_Kardex.InsertCierreKardex(Accion, "", UsuarioID, Almacen, ProductoID, EmpresaID, Periodo, Anno, CostoCero, Cantidad2, CostoUnitario); } return(totalAfectados); }