/// <summary>
        /// Almacena el registro de una ENTIDAD de registro de Tipo ProductoPrecio
        /// En la BASE de DATO la Tabla : [GestionComercial.ProductoPrecio]
        /// <summary>
        /// <param name="productoPrecio"></param>
        /// <returns></returns>
        public int Insert(ProductoPrecio productoPrecio)
        {
            int?codigoRetorno = productoPrecio.codProductoPrecio;

            try
            {
                using (_GestionComercialDataContext SQLDC = new _GestionComercialDataContext(conexion))
                {
                    SQLDC.omgc_mnt_Insert_ProductoPrecio(
                        ref codigoRetorno,
                        productoPrecio.codProducto,
                        productoPrecio.CodigoArguMoneda,
                        productoPrecio.CodigoListaPrecio,
                        productoPrecio.CodigoPuntoVenta,
                        productoPrecio.ValorCosto,
                        productoPrecio.ValorVenta,
                        productoPrecio.MargenUtilidad / 100,
                        productoPrecio.MediaPorcentaje / 100,
                        productoPrecio.PorcenComision / 100,
                        productoPrecio.PorcenComisionMax / 100,
                        productoPrecio.DescuentoMaximo / 100,
                        productoPrecio.Estado,
                        productoPrecio.SegUsuarioCrea);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(codigoRetorno == null ? 0 : codigoRetorno.Value);
        }
        // POST api/<controller>
        //public void Post([FromBody]string value)
        //{
        //}

        // PUT api/<controller>/5
        //public void Put(int id, [FromBody]string value)
        //{
        //}

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
            Compra c = this.db.Compra.Find(id);

            c.FechaBaja       = DateTime.Today;
            c.UsuarioBaja     = 1;
            c.Estado          = "D";
            db.Entry(c).State = EntityState.Modified;
            this.save();
            List <CompraDetalle> cd = this.db.CompraDetalle.Where(cd1 => cd1.idCompra == id).ToList();

            //recuperar el stock
            foreach (CompraDetalle _cd in cd)
            {
                _cd.FechaBaja       = DateTime.Today;
                _cd.UsuarioBaja     = 1;
                _cd.Estado          = "D";
                db.Entry(_cd).State = EntityState.Modified;
                this.save();
                Stock s = this.db.Stock.Where(s1 => s1.idProducto == _cd.idProducto).FirstOrDefault();
                s.Cantidad = s.Cantidad - _cd.Cantidad;
                //Eliminar el precio de Costo
                ProductoPrecio pp = this.db.ProductoPrecio.Where(pp1 => pp1.idProducto == _cd.idProducto && pp1.idProveedor == c.idProveedor).FirstOrDefault();
                pp.FechaBaja       = DateTime.Today;
                pp.UsuarioBaja     = 1;
                pp.Estado          = "D";
                db.Entry(pp).State = EntityState.Modified;
                this.save();
            }

            // sumar nuevamente el stock

            this.save();
        }
        public void RegistrarCompra(RegistrarComprar r)
        {
            Compra c = new Compra();

            c.idCompra    = 0;
            c.idProveedor = r.idProveedor;
            c.Total       = r.Total;
            c.UsuarioAlta = 1;
            c.FechaAlta   = DateTime.Today;
            c.Fecha       = r.Fecha;
            c.NroFactura  = r.NroFactura;
            c.idMedioPago = r.idMedioPago;
            c.Estado      = "A";

            c = this.db.Compra.Add(c);
            //this.save();
            ///registrar los productos
            foreach (CompraDetalle1 cd in r.CompraDetalle)
            {
                Producto p = new Producto();
                if (cd.idProducto > 0)
                {
                    //por ahora hard
                    Parametrizacion param  = this.db.Parametrizacion.Where(param11 => param11.Descripcion == "PorcentajeMarcador").FirstOrDefault();
                    Parametrizacion param1 = this.db.Parametrizacion.Where(param12 => param12.Descripcion == "PorcentajeContado").FirstOrDefault();
                    Parametrizacion param2 = this.db.Parametrizacion.Where(param13 => param13.Descripcion == "PorcentajeGremio").FirstOrDefault();
                    if (param != null)
                    {
                        decimal porcentaje_lista   = (decimal)param.Valor;
                        decimal porcentaje_contado = (decimal)param1.Valor;
                        decimal porcentaje_gremio  = (decimal)param2.Valor;
                        decimal PrecioLista        = cd.PrecioUnitario * (1 + (porcentaje_lista / 100));
                        decimal PrecioContado      = PrecioLista - (PrecioLista * porcentaje_contado) / 100;
                        decimal PrecioGremio       = cd.PrecioUnitario * (1 + (porcentaje_gremio / 100));
                        p                 = this.db.Producto.Find(cd.idProducto);
                        p.PrecioLista     = PrecioLista;
                        p.PrecioContado   = PrecioContado;
                        p.PrecioGremio    = PrecioGremio;
                        p.CodigoBarras    = cd.CodigoBarras;
                        db.Entry(p).State = EntityState.Modified;
                        //          this.save();
                    }



                    Stock s = this.db.Stock.Where(s1 => s1.idProducto == cd.idProducto)
                              .FirstOrDefault();

                    if (s != null)
                    {
                        s.Cantidad       += cd.Cantidad;
                        db.Entry(s).State = EntityState.Modified;
                        //    this.save();
                    }
                    else
                    {
                        Stock s1 = new Stock();
                        s1.idProducto  = cd.idProducto;
                        s1.Cantidad    = cd.Cantidad;
                        s1.Estado      = "A";
                        s1.FechaAlta   = DateTime.Today;
                        s1.UsuarioAlta = 1;
                        s1.idStock     = 0;
                        db.Stock.Add(s1);
                        //      this.save();
                    }

                    ProductoPrecio pp = this.db.ProductoPrecio.Where(pp1 => pp1.idProducto == cd.idProducto && pp1.idProveedor == r.idProveedor).FirstOrDefault();
                    if (pp != null)
                    {
                        pp.PrecioCosto     = cd.PrecioUnitario;
                        pp.FechaAlta       = DateTime.Today;
                        db.Entry(pp).State = EntityState.Modified;
                        //      this.save();
                    }
                    else
                    {
                        ProductoPrecio pp1 = new ProductoPrecio();
                        pp1.idProducto  = cd.idProducto;
                        pp1.idProveedor = r.idProveedor;
                        pp1.PrecioCosto = cd.PrecioUnitario;
                        pp1.Estado      = "A";
                        pp1.UsuarioAlta = 1;
                        pp1.FechaAlta   = DateTime.Today;
                        db.ProductoPrecio.Add(pp1);
                        //  this.save();
                    }
                }
                else
                {
                    p.idProducto   = cd.idProducto;
                    p.Nombre       = cd.NombreProducto;
                    p.CodigoBarras = cd.CodigoBarras;
                    p.UsuarioAlta  = 1;
                    p.FechaAlta    = DateTime.Today;
                    p.Estado       = "A";
                    //por ahora hard
                    Parametrizacion param = new Parametrizacion();
                    param = this.db.Parametrizacion.Where(param11 => param11.Descripcion == "PorcentajeMarcador").FirstOrDefault();
                    Parametrizacion param1 = this.db.Parametrizacion.Where(param12 => param12.Descripcion == "PorcentajeContado").FirstOrDefault();
                    Parametrizacion param2 = this.db.Parametrizacion.Where(param13 => param13.Descripcion == "PorcentajeGremio").FirstOrDefault();
                    if (param != null)
                    {
                        decimal porcentaje_contado = (decimal)param1.Valor;
                        decimal porcentaje_lista   = (decimal)param.Valor;
                        decimal porcentaje_gremio  = (decimal)param2.Valor;

                        decimal PrecioLista   = cd.PrecioUnitario * (1 + (porcentaje_lista / 100));
                        decimal PrecioContado = PrecioLista - (PrecioLista * porcentaje_contado) / 100;
                        decimal PrecioGremio  = cd.PrecioUnitario * (1 + (porcentaje_gremio / 100));
                        p.PrecioLista   = PrecioLista;
                        p.PrecioContado = PrecioContado;
                        p.PrecioGremio  = PrecioGremio;
                    }
                    p = this.db.Producto.Add(p);
                    //this.save();

                    Stock s = new Stock();
                    s.Cantidad    = cd.Cantidad;
                    s.idProducto  = p.idProducto;
                    s.FechaAlta   = DateTime.Today;
                    s.UsuarioAlta = 1;
                    s.Estado      = "A";
                    s             = this.db.Stock.Add(s);
                    //this.save();

                    ProductoPrecio pp = new ProductoPrecio();
                    pp.idProducto  = p.idProducto;
                    pp.idProveedor = r.idProveedor;
                    pp.Estado      = "A";
                    pp.FechaAlta   = DateTime.Today;
                    pp.UsuarioAlta = 1;
                    pp.PrecioCosto = cd.PrecioUnitario;
                    pp             = this.db.ProductoPrecio.Add(pp);
                    //this.save();

                    if (r.idGrupo > 0)
                    {
                        GrupoXProducto gxp = new GrupoXProducto();
                        gxp.idGrupo     = r.idGrupo;
                        gxp.idProducto  = pp.idProducto;
                        gxp.Estado      = "A";
                        gxp.FechaAlta   = DateTime.Today;
                        gxp.UsuarioAlta = 1;
                        this.db.GrupoXProducto.Add(gxp);
                        //  this.save();
                    }
                }

                CompraDetalle cp = new CompraDetalle();
                cp.idCompraDetalle = 0;
                cp.idProducto      = cd.idProducto == 0?p.idProducto:cd.idProducto;
                cp.idCompra        = c.idCompra;
                cp.PrecioUnitario  = cd.PrecioUnitario;
                cp.PrecioTotal     = cd.PrecioTotal;
                cp.UsuarioAlta     = 1;
                cp.FechaAlta       = DateTime.Today;
                cp = this.db.CompraDetalle.Add(cp);
                //this.save();
            }

            //Registrar Movimiento
            if (r.idMedioPago == 1)
            {
                Caja c3 = new Caja();
                c3.idCaja         = 0;
                c3.idConcepto     = 2; //Compra
                c3.TipoMovimiento = "E";
                c3.Monto          = r.Total;
                c3.Descripcion    = "Compra Correspondiente a Nro. Factura: " + r.NroFactura;
                c3.Estado         = "A";
                c3.UsuarioAlta    = 1;
                c3.FechaAlta      = DateTime.Today;
                c3 = this.db.Caja.Add(c3);
                //this.save();
            }

            this.save();
        }
Example #4
0
        public void Costear(Transaccion transaccion, DbTransaction transaction)
        {
            try
            {
                var igv          = impuestoRepository.Single((int)TipoImpuesto.IGV);
                var listasPrecio = listaPrecioRepository.GetByEmpresa(transaccion.IdEmpresa);

                foreach (var movimientoProducto in transaccion.MovimientoProducto)
                {
                    var producto           = productoRepository.Single(movimientoProducto.IdProducto);
                    var presentacionActual = presentacionRepository.Single(movimientoProducto.IdPresentacion);

                    var cantidadCompra = movimientoProducto.Cantidad.Redondear();
                    var costoCompra    = movimientoProducto.Costo.Redondear();
                    var equivalencia   = presentacionActual.Equivalencia.Redondear();

                    var costoActual = productoPrecioRepository.GetCostoByPresentacion(transaccion.IdEmpresa, transaccion.IdSucursal, presentacionActual.IdPresentacion, transaction);
                    var stockActual = productoStockRepository.GetStockByPresentacion(transaccion.IdSucursal, presentacionActual.IdPresentacion, transaction);

                    if (costoActual <= 0 || stockActual <= 0)
                    {
                        costoActual = costoCompra;
                        stockActual = cantidadCompra;
                    }

                    var costoPonderadoMovimiento = (((stockActual * costoActual) + (costoCompra * cantidadCompra)) / (stockActual + cantidadCompra)).Redondear();
                    var costoPonderado           = (costoPonderadoMovimiento / equivalencia).Redondear();

                    var presentaciones = presentacionRepository.GetByIdProducto(movimientoProducto.IdProducto);
                    var precios        = productoPrecioRepository.GetPreciosBySucursalAndProducto(transaccion.IdSucursal, movimientoProducto.IdProducto, transaction);

                    foreach (var presentacion in presentaciones)
                    {
                        var costo = (costoPonderado * presentacion.Equivalencia).Redondear();

                        foreach (var listaPrecio in listasPrecio)
                        {
                            costo = tipoCambioRepository.GetMontoEnMonedaLocal(listaPrecio.IdMoneda, costo, transaccion.FechaDocumento, transaccion.IdEmpresa, true);
                            var productoPrecio = precios.FirstOrDefault(p => p.IdListaPrecio == listaPrecio.IdListaPrecio && p.IdPresentacion == presentacion.IdPresentacion);

                            if (productoPrecio == null)
                            {
                                #region Insertar en ProductoPrecio

                                var precioVenta = producto.EsExonerado ? costo : (costo * (1 + (igv.Monto / 100))).Redondear();

                                productoPrecio = new ProductoPrecio
                                {
                                    IdSucursal         = transaccion.IdSucursal,
                                    IdPresentacion     = presentacion.IdPresentacion,
                                    IdListaPrecio      = listaPrecio.IdListaPrecio,
                                    Costo              = costo,
                                    PorcentajeGanancia = 0m,
                                    Ganancia           = 0m,
                                    Valor              = costo,
                                    PrecioVenta        = precioVenta,
                                    UsuarioCreacion    = transaccion.UsuarioCreacion
                                };

                                productoPrecioRepository.Add(productoPrecio);

                                #endregion
                            }
                            else
                            {
                                if (listaPrecio.AutoActualizar)
                                {
                                    var ganancia    = costo * productoPrecio.PorcentajeGanancia.Redondear();
                                    var valor       = costo + ganancia;
                                    var precioVenta = producto.EsExonerado ? valor : (valor * (1 + (igv.Monto / 100m))).Redondear();

                                    #region Actualizar Costo, Ganancia, Valor y Precio de Venta

                                    productoPrecio.Costo = costo;
                                    productoPrecio.PorcentajeGanancia = 0;
                                    productoPrecio.Ganancia           = ganancia;
                                    productoPrecio.Valor               = valor;
                                    productoPrecio.PrecioVenta         = precioVenta;
                                    productoPrecio.UsuarioModificacion = transaccion.UsuarioModificacion;

                                    productoPrecioRepository.UpdateCostoGananciaValorPrecioVenta(productoPrecio, transaction);

                                    #endregion
                                }
                                else
                                {
                                    #region Actualizar sólo Costo

                                    productoPrecio.Costo           = costo;
                                    productoPrecio.UsuarioCreacion = transaccion.UsuarioCreacion;

                                    productoPrecioRepository.UpdateCostoProductoPrecio(productoPrecio, transaction);

                                    #endregion
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error mientras se realizaba el Costeo, detalles: " + ex.Message);
            }
        }