public decimal ObtenerExistencias(Situacion situacion) { switch (this.TipoDeArticulo) { case Articulos.TiposDeArticulo.Servicio: return(0); case Articulos.TiposDeArticulo.ProductoSimple: return(this.Connection.FieldDecimal("SELECT cantidad FROM articulos_stock WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacion.Id.ToString())); case Articulos.TiposDeArticulo.ProductoCompuesto: // Calculo el stock según el elemento de la receta que se acabe primero decimal CantMin = decimal.MaxValue; foreach (ItemReceta Itm in this.Receta) { decimal Cant = Itm.Articulo.ObtenerExistencias(situacion) / Itm.Cantidad; if (Cant < CantMin) { CantMin = Cant; } } if (CantMin == decimal.MaxValue) { return(0); } else { return(CantMin); } default: throw new Lfx.Types.DomainException("ObtenerExistencias(Situacion): No se pueden calcular las existencias para " + this.TipoDeArticulo.ToString()); } }
public bool Contains(string serie, Situacion situacion) { foreach (Item Itm in this) { if (Itm.Situacion.Id == situacion.Id && Itm.Serie == serie) { return(true); } } return(false); }
public void MoverExistencias(Lbl.Comprobantes.ComprobanteConArticulos comprob, decimal cantidad, string obs, Situacion situacionOrigen, Situacion situacionDestino, Lbl.Articulos.ColeccionDatosSeguimiento seguimiento) { decimal Saldo; if (this.TipoDeArticulo != Articulos.TiposDeArticulo.Servicio) { decimal CantidadEntranteOSaliente = 0; // stock saliente (situación de origen) if (situacionOrigen != null && situacionOrigen.CuentaExistencias) { int Existe = this.Connection.FieldInt("SELECT COUNT(id_articulo) FROM articulos_stock WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacionOrigen.Id.ToString()); if (Existe == 0) { // No existen datos de stock para esta situación... la creo qGen.Insert InsertarCantidadSituacion = new qGen.Insert("articulos_stock"); InsertarCantidadSituacion.ColumnValues.AddWithValue("id_articulo", this.Id); InsertarCantidadSituacion.ColumnValues.AddWithValue("id_situacion", situacionOrigen.Id); InsertarCantidadSituacion.ColumnValues.AddWithValue("cantidad", -cantidad); this.Connection.ExecuteNonQuery(InsertarCantidadSituacion); } else { // Actualizo el stock en la nueva situación qGen.Update ActualizarCantidadSituacion = new qGen.Update("articulos_stock"); ActualizarCantidadSituacion.ColumnValues.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""-" + Lfx.Types.Formatting.FormatStockSql(cantidad))); ActualizarCantidadSituacion.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionOrigen.Id)); this.Connection.ExecuteNonQuery(ActualizarCantidadSituacion); } if (seguimiento != null) { // Resto las cantidades de la situación de origen foreach (Lbl.Articulos.DatosSeguimiento Dat in seguimiento) { qGen.Update ActualizarSeries = new qGen.Update("articulos_series"); if (Dat.Cantidad > 0) { ActualizarSeries.ColumnValues.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""-" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); } else { ActualizarSeries.ColumnValues.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); } ActualizarSeries.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionOrigen.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("serie", Dat.Variacion)); this.Connection.ExecuteNonQuery(ActualizarSeries); } } CantidadEntranteOSaliente -= cantidad; } // stock entrante (situación de destino) if (situacionDestino != null && situacionDestino.CuentaExistencias) { int ExisteSituacion = this.Connection.FieldInt("SELECT COUNT(id_articulo) FROM articulos_stock WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacionDestino.Id.ToString()); if (ExisteSituacion == 0) { // No existen datos de stock para esta situación... la creo qGen.Insert InsertarCantidadSituacion = new qGen.Insert("articulos_stock"); InsertarCantidadSituacion.ColumnValues.AddWithValue("id_articulo", this.Id); InsertarCantidadSituacion.ColumnValues.AddWithValue("id_situacion", situacionDestino.Id); InsertarCantidadSituacion.ColumnValues.AddWithValue("cantidad", cantidad); this.Connection.ExecuteNonQuery(InsertarCantidadSituacion); } else { // Actualizo el stock en la nueva situación qGen.Update ActualizarCantidadSituacion = new qGen.Update("articulos_stock"); ActualizarCantidadSituacion.ColumnValues.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(cantidad))); ActualizarCantidadSituacion.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionDestino.Id)); this.Connection.ExecuteNonQuery(ActualizarCantidadSituacion); } if (seguimiento != null) { // Agrego las cantidades en la situación de destino foreach (Lbl.Articulos.DatosSeguimiento Dat in seguimiento) { int ExisteVariacion = this.Connection.FieldInt("SELECT COUNT(id_articulo) FROM articulos_series WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacionDestino.Id.ToString() + " AND serie='" + Dat.Variacion + "'"); if (ExisteVariacion > 0) { qGen.Update ActualizarSeries = new qGen.Update("articulos_series"); if (Dat.Cantidad > 0) { ActualizarSeries.ColumnValues.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); } else { ActualizarSeries.ColumnValues.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); } ActualizarSeries.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionDestino.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("serie", Dat.Variacion)); this.Connection.ExecuteNonQuery(ActualizarSeries); } else { qGen.Insert InsertarSerie = new qGen.Insert("articulos_series"); InsertarSerie.ColumnValues.AddWithValue("id_articulo", this.Id); InsertarSerie.ColumnValues.AddWithValue("id_situacion", situacionDestino.Id); InsertarSerie.ColumnValues.AddWithValue("serie", Dat.Variacion); InsertarSerie.ColumnValues.AddWithValue("cantidad", Dat.Cantidad); this.Connection.ExecuteNonQuery(InsertarSerie); } } } CantidadEntranteOSaliente += cantidad; } // Actualizo el stock actual if (CantidadEntranteOSaliente != 0) { qGen.Update ActualizarCantidad = new qGen.Update("articulos"); ActualizarCantidad.ColumnValues.AddWithValue("stock_actual", new qGen.SqlExpression(@"""stock_actual""+" + Lfx.Types.Formatting.FormatStockSql(CantidadEntranteOSaliente))); string tablaAfecta = "articulos_cotiza"; Lfx.Data.FacCompraTag facCom = null; //Cambia la forma de cotizar el producto. if (comprob != null && comprob.Compra && comprob.Tag != null) { try { facCom = (Lfx.Data.FacCompraTag)comprob.Tag; if (facCom.Afecta != 0) { ActualizarCantidad.ColumnValues.AddWithValue("conotramoneda", facCom.Afecta); ActualizarCantidad.ColumnValues.AddWithValue("cotiza", facCom.cotiza); ActualizarCantidad.ColumnValues.AddWithValue("id_moneda", facCom.id_moneda); //tablaAfecta = facCom.Afecta == 1 ? "articulos_cotiza" : "personas_cotiza"; //No } } catch { // } } ActualizarCantidad.WhereClause = new qGen.Where("id_articulo", this.Id); this.Connection.ExecuteNonQuery(ActualizarCantidad); if (tablaAfecta != "" && facCom != null) { qGen.IStatement cot_ins_Comando = new qGen.Insert(tablaAfecta); if (tablaAfecta == "articulos_cotiza") { cot_ins_Comando.ColumnValues.AddWithValue("id_articulo", this.Id); } else { cot_ins_Comando.ColumnValues.AddWithValue("id_persona", comprob.Cliente.Id); } cot_ins_Comando.ColumnValues.AddWithValue("id_moneda", facCom.id_moneda); cot_ins_Comando.ColumnValues.AddWithValue("cotiza", facCom.cotiza); cot_ins_Comando.ColumnValues.AddWithValue("estado", 1); cot_ins_Comando.ColumnValues.AddWithValue("fecha", DateTime.Now); this.Connection.ExecuteNonQuery(cot_ins_Comando); } // Si ees un artículo compuesto // Propagar los cambios de stock hacia abajo. // Es decir, hacer movimientos de stock de los ingredientes (sub artículos) if (this.TipoDeArticulo == Articulos.TiposDeArticulo.ProductoCompuesto) { string ObsSubItems = "Movim. s/salida de " + this.ToString(); foreach (ItemReceta Itm in this.Receta) { Itm.Articulo.MoverExistencias(comprob, Itm.Cantidad * cantidad, ObsSubItems, situacionOrigen, situacionDestino, seguimiento); } } // Propagar los cambios de stock hacia arriba. // Es decir, si este artículo es ingrediente en la receta de otros artículos, actualizar los artículos padre para que reflejen el cambio de stock de este ingrediente. ColeccionGenerica <Articulo> SuperArts = this.SuperArticulos(); if (SuperArts != null) { foreach (Articulo SuperArt in SuperArts) { qGen.Update UpdateSuperArt = new qGen.Update("articulos"); UpdateSuperArt.ColumnValues.AddWithValue("stock_actual", SuperArt.ObtenerExistencias()); UpdateSuperArt.WhereClause = new qGen.Where("id_articulo", SuperArt.Id); this.Connection.ExecuteNonQuery(UpdateSuperArt); } } } if (this.Caja != null && this.Caja.Existe) { this.Caja.Movimiento(true, Lbl.Cajas.Concepto.AjustesYMovimientos, "Movimiento de stock de artículo " + this.ToString(), new Lbl.Personas.Persona(this.Connection, Lbl.Sys.Config.Actual.UsuarioConectado.Id), this.Pvp * cantidad, Obs, null, null, null); } Saldo = this.Connection.FieldDecimal("SELECT stock_actual FROM articulos WHERE id_articulo=" + this.Id.ToString()); } else { // No controla stock Saldo = 0; } qGen.IStatement Comando = new qGen.Insert("articulos_movim"); Comando.ColumnValues.AddWithValue("fecha", new qGen.SqlExpression("NOW()")); Comando.ColumnValues.AddWithValue("id_articulo", this.Id); Comando.ColumnValues.AddWithValue("cantidad", cantidad); if (situacionOrigen == null) { Comando.ColumnValues.AddWithValue("desdesituacion", null); } else { Comando.ColumnValues.AddWithValue("desdesituacion", situacionOrigen.Id); } if (situacionDestino == null) { Comando.ColumnValues.AddWithValue("haciasituacion", null); } else { Comando.ColumnValues.AddWithValue("haciasituacion", situacionDestino.Id); } Comando.ColumnValues.AddWithValue("saldo", Saldo); Comando.ColumnValues.AddWithValue("obs", obs); Comando.ColumnValues.AddWithValue("series", seguimiento); if (comprob == null) { Comando.ColumnValues.AddWithValue("id_comprob", null); } else { Comando.ColumnValues.AddWithValue("id_comprob", comprob.Id); } this.Connection.ExecuteNonQuery(Comando); }
public Item(string serie, Situacion situacion) { this.Serie = serie; this.Situacion = situacion; }
public void MoverExistencias(Lbl.Comprobantes.ComprobanteConArticulos comprob, decimal cantidad, string obs, Situacion situacionOrigen, Situacion situacionDestino, Lbl.Articulos.ColeccionDatosSeguimiento seguimiento) { decimal Saldo; if (this.TipoDeArticulo != Articulos.TiposDeArticulo.Servicio) { decimal CantidadEntranteOSaliente = 0; // stock saliente (situación de origen) if (situacionOrigen != null && situacionOrigen.CuentaExistencias) { int Existe = this.Connection.FieldInt("SELECT COUNT(id_articulo) FROM articulos_stock WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacionOrigen.Id.ToString()); if (Existe == 0) { // No existen datos de stock para esta situación... la creo qGen.Insert InsertarCantidadSituacion = new qGen.Insert("articulos_stock"); InsertarCantidadSituacion.Fields.AddWithValue("id_articulo", this.Id); InsertarCantidadSituacion.Fields.AddWithValue("id_situacion", situacionOrigen.Id); InsertarCantidadSituacion.Fields.AddWithValue("cantidad", -cantidad); this.Connection.Execute(InsertarCantidadSituacion); } else { // Actualizo el stock en la nueva situación qGen.Update ActualizarCantidadSituacion = new qGen.Update("articulos_stock"); ActualizarCantidadSituacion.Fields.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""-" + Lfx.Types.Formatting.FormatStockSql(cantidad))); ActualizarCantidadSituacion.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionOrigen.Id)); this.Connection.Execute(ActualizarCantidadSituacion); } if (seguimiento != null) { // Resto las cantidades de la situación de origen foreach (Lbl.Articulos.DatosSeguimiento Dat in seguimiento) { qGen.Update ActualizarSeries = new qGen.Update("articulos_series"); if (Dat.Cantidad > 0) ActualizarSeries.Fields.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""-" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); else ActualizarSeries.Fields.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); ActualizarSeries.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionOrigen.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("serie", Dat.Variacion)); this.Connection.Execute(ActualizarSeries); } } CantidadEntranteOSaliente -= cantidad; } // stock entrante (situación de destino) if (situacionDestino != null && situacionDestino.CuentaExistencias) { int ExisteSituacion = this.Connection.FieldInt("SELECT COUNT(id_articulo) FROM articulos_stock WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacionDestino.Id.ToString()); if (ExisteSituacion == 0) { // No existen datos de stock para esta situación... la creo qGen.Insert InsertarCantidadSituacion = new qGen.Insert("articulos_stock"); InsertarCantidadSituacion.Fields.AddWithValue("id_articulo", this.Id); InsertarCantidadSituacion.Fields.AddWithValue("id_situacion", situacionDestino.Id); InsertarCantidadSituacion.Fields.AddWithValue("cantidad", cantidad); this.Connection.Execute(InsertarCantidadSituacion); } else { // Actualizo el stock en la nueva situación qGen.Update ActualizarCantidadSituacion = new qGen.Update("articulos_stock"); ActualizarCantidadSituacion.Fields.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(cantidad))); ActualizarCantidadSituacion.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarCantidadSituacion.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionDestino.Id)); this.Connection.Execute(ActualizarCantidadSituacion); } if (seguimiento != null) { // Agrego las cantidades en la situación de destino foreach (Lbl.Articulos.DatosSeguimiento Dat in seguimiento) { int ExisteVariacion = this.Connection.FieldInt("SELECT COUNT(id_articulo) FROM articulos_series WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacionDestino.Id.ToString() + " AND serie='" + Dat.Variacion + "'"); if (ExisteVariacion > 0) { qGen.Update ActualizarSeries = new qGen.Update("articulos_series"); if (Dat.Cantidad > 0) ActualizarSeries.Fields.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); else ActualizarSeries.Fields.AddWithValue("cantidad", new qGen.SqlExpression(@"""cantidad""+" + Lfx.Types.Formatting.FormatStockSql(Dat.Cantidad))); ActualizarSeries.WhereClause = new qGen.Where(qGen.AndOr.And); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_articulo", this.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("id_situacion", situacionDestino.Id)); ActualizarSeries.WhereClause.Add(new qGen.ComparisonCondition("serie", Dat.Variacion)); this.Connection.Execute(ActualizarSeries); } else { qGen.Insert InsertarSerie = new qGen.Insert("articulos_series"); InsertarSerie.Fields.AddWithValue("id_articulo", this.Id); InsertarSerie.Fields.AddWithValue("id_situacion", situacionDestino.Id); InsertarSerie.Fields.AddWithValue("serie", Dat.Variacion); InsertarSerie.Fields.AddWithValue("cantidad", Dat.Cantidad); this.Connection.Execute(InsertarSerie); } } } CantidadEntranteOSaliente += cantidad; } // Actualizo el stock actual if (CantidadEntranteOSaliente != 0) { qGen.Update ActualizarCantidad = new qGen.Update("articulos"); ActualizarCantidad.Fields.AddWithValue("stock_actual", new qGen.SqlExpression(@"""stock_actual""+" + Lfx.Types.Formatting.FormatStockSql(CantidadEntranteOSaliente))); ActualizarCantidad.WhereClause = new qGen.Where("id_articulo", this.Id); this.Connection.Execute(ActualizarCantidad); // Si ees un artículo compuesto // Propagar los cambios de stock hacia abajo. // Es decir, hacer movimientos de stock de los ingredientes (sub artículos) if (this.TipoDeArticulo == Articulos.TiposDeArticulo.ProductoCompuesto) { string ObsSubItems = "Movim. s/salida de " + this.ToString(); foreach (ItemReceta Itm in this.Receta) { Itm.Articulo.MoverExistencias(comprob, Itm.Cantidad * cantidad, ObsSubItems, situacionOrigen, situacionDestino, seguimiento); } } // Propagar los cambios de stock hacia arriba. // Es decir, si este artículo es ingrediente en la receta de otros artículos, actualizar los artículos padre para que reflejen el cambio de stock de este ingrediente. ColeccionGenerica<Articulo> SuperArts = this.SuperArticulos(); if (SuperArts != null) { foreach (Articulo SuperArt in SuperArts) { qGen.Update UpdateSuperArt = new qGen.Update("articulos"); UpdateSuperArt.Fields.AddWithValue("stock_actual", SuperArt.ObtenerExistencias()); UpdateSuperArt.WhereClause = new qGen.Where("id_articulo", SuperArt.Id); this.Connection.Execute(UpdateSuperArt); } } } if (this.Caja != null && this.Caja.Existe) this.Caja.Movimiento(true, Lbl.Cajas.Concepto.AjustesYMovimientos, "Movimiento de stock de artículo " + this.ToString(), new Lbl.Personas.Persona(this.Connection, Lbl.Sys.Config.Actual.UsuarioConectado.Id), this.Pvp * cantidad, Obs, null, null, null); Saldo = this.Connection.FieldDecimal("SELECT stock_actual FROM articulos WHERE id_articulo=" + this.Id.ToString()); } else { // No controla stock Saldo = 0; } qGen.TableCommand Comando; Comando = new qGen.Insert(this.Connection, "articulos_movim"); Comando.Fields.AddWithValue("fecha", qGen.SqlFunctions.Now); Comando.Fields.AddWithValue("id_articulo", this.Id); Comando.Fields.AddWithValue("cantidad", cantidad); if(situacionOrigen == null) Comando.Fields.AddWithValue("desdesituacion", null); else Comando.Fields.AddWithValue("desdesituacion", situacionOrigen.Id); if(situacionDestino == null) Comando.Fields.AddWithValue("haciasituacion", null); else Comando.Fields.AddWithValue("haciasituacion", situacionDestino.Id); Comando.Fields.AddWithValue("saldo", Saldo); Comando.Fields.AddWithValue("obs", obs); Comando.Fields.AddWithValue("series", seguimiento); if (comprob == null) Comando.Fields.AddWithValue("id_comprob", null); else Comando.Fields.AddWithValue("id_comprob", comprob.Id); this.Connection.Execute(Comando); }
public decimal ObtenerExistencias(Situacion situacion) { switch (this.TipoDeArticulo) { case Articulos.TiposDeArticulo.Servicio: return 0; case Articulos.TiposDeArticulo.ProductoSimple: return this.Connection.FieldDecimal("SELECT cantidad FROM articulos_stock WHERE id_articulo=" + this.Id.ToString() + " AND id_situacion=" + situacion.Id.ToString()); case Articulos.TiposDeArticulo.ProductoCompuesto: // Calculo el stock según el elemento de la receta que se acabe primero decimal CantMin = decimal.MaxValue; foreach (ItemReceta Itm in this.Receta) { decimal Cant = Itm.Articulo.ObtenerExistencias(situacion) / Itm.Cantidad; if (Cant < CantMin) CantMin = Cant; } if (CantMin == decimal.MaxValue) return 0; else return CantMin; default: throw new Lfx.Types.DomainException("ObtenerExistencias(Situacion): No se pueden calcular las existencias para " + this.TipoDeArticulo.ToString()); } }