示例#1
0
        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);
        }
示例#2
0
        public override void ActualizarElemento()
        {
            Lbl.Comprobantes.ComprobanteDeCompra Comprob = this.Elemento as Lbl.Comprobantes.ComprobanteDeCompra;

            Comprob.Compra = true;
            Comprob.Fecha  = Lfx.Types.Parsing.ParseDate(EntradaFecha.Text);
            if (EntradaFormaPago.TextKey != "0")
            {
                Comprob.FormaDePago = new Lbl.Pagos.FormaDePago(Comprob.Connection, Lfx.Types.Parsing.ParseInt(EntradaFormaPago.TextKey));
            }
            else
            {
                Comprob.FormaDePago = null;
            }

            Comprob.Vendedor = Lbl.Sys.Config.Actual.UsuarioConectado.Persona;
            Comprob.Cliente  = EntradaProveedor.Elemento as Lbl.Personas.Persona;
            Comprob.Tipo     = Lbl.Comprobantes.Tipo.TodosPorLetra[EntradaTipo.TextKey];
            Comprob.PV       = EntradaPV.ValueInt;
            if (EntradaNumero.Enabled)
            {
                Comprob.Numero = EntradaNumero.ValueInt;
            }
            else
            {
                Comprob.Numero = UltimoNumero();
            }
            Comprob.SituacionDestino = EntradaHaciaSituacion.Elemento as Lbl.Articulos.Situacion;
            Comprob.GastosDeEnvio    = EntradaGastosEnvio.ValueDecimal;
            Comprob.OtrosGastos      = EntradaOtrosGastos.ValueDecimal;
            Comprob.Obs       = EntradaObs.Text;
            Comprob.Descuento = EntradaDescuento.ValueDecimal;

            Comprob.PercepcionIIBB = EntradaPercepcionIIBB.ValueDecimal;
            Comprob.PercepcionIVA  = EntradaPercepcionIVA.ValueDecimal;
            Comprob.Localidad      = EntradaLocalidad.Elemento as Lbl.Entidades.Localidad;

            if (EntradaEstado.Enabled && EntradaEstado.Visible)
            {
                Comprob.Estado = EntradaEstado.ValueInt;
            }
            else
            {
                Comprob.Estado = 0;
            }

            Comprob.Afecta = EntradaAfecta.ValueInt;

            if (EntradaMoneda.Elemento != null)
            {
                Comprob.Moneda = EntradaMoneda.Elemento.Id;
                Comprob.Cotiza = EntradaCotiza.ValueDecimal;
                Lfx.Data.FacCompraTag factag = new Lfx.Data.FacCompraTag();
                factag.Afecta    = EntradaAfecta.ValueInt;
                factag.id_moneda = EntradaMoneda.Elemento.Id;
                factag.cotiza    = EntradaCotiza.ValueDecimal;

                Comprob.Tag = factag;
            }

            if (EntradaRemito.Elemento != null)
            {
                Comprob.IdRemito = EntradaRemito.Elemento.Id;
            }

            Comprob.Articulos = EntradaProductos.ObtenerArticulos(Comprob);

            base.ActualizarControl();
        }