Exemplo n.º 1
0
        public bool Insertar(Transaccion transaccion)
        {
            using (var conection = Database.CreateConnection())
            {
                conection.Open();
                using (var transaction = conection.BeginTransaction())
                {
                    try
                    {
                        #region Transaccion

                        transaccion.IdTransaccion = transaccionRepository.InsertTransaccion(transaccion, transaction);

                        #endregion

                        #region Movimiento Producto

                        if (transaccion.IdTransaccionReferencia == null)
                        {
                            foreach (var movimientoProducto in transaccion.MovimientoProducto)
                            {
                                movimientoProducto.IdTransaccion = transaccion.IdTransaccion;

                                var productos  = productoStockRepository.GetByAlmacenPresentacion(movimientoProducto.IdAlmacen.Value, movimientoProducto.IdPresentacion, transaction);
                                var stockTotal = productos.Sum(p => p.StockFisico);

                                if (stockTotal < movimientoProducto.Cantidad)
                                {
                                    throw new Exception(string.Format("No existe Stock suficiente para el producto {0}.", movimientoProducto.CodigoProducto));
                                }

                                var costo = productoPrecioRepository.GetCostoByPresentacion(transaccion.IdEmpresa, transaccion.IdSucursal, movimientoProducto.IdPresentacion);
                                movimientoProducto.Costo = costo;

                                var cantidad  = movimientoProducto.Cantidad;
                                var secuencia = 0;

                                foreach (var productoStock in productos)
                                {
                                    cantidad -= productoStock.StockLogico;

                                    var movimientoProductoStock = new MovimientoProductoStock
                                    {
                                        Secuencia        = ++secuencia,
                                        LoteSerie        = productoStock.Lote,
                                        Cantidad         = productoStock.StockLogico,
                                        IdAlmacen        = movimientoProducto.IdAlmacen.Value,
                                        FechaVencimiento = productoStock.FechaVencimiento
                                    };
                                    if (cantidad > 0)
                                    {
                                        movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock);
                                    }
                                    else if (cantidad == 0)
                                    {
                                        movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock);
                                        break;
                                    }
                                    else
                                    {
                                        cantidad = cantidad + productoStock.StockLogico;
                                        movimientoProductoStock.Cantidad = cantidad;
                                        movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock);
                                        break;
                                    }
                                }
                            }

                            movimientoProductoRepository.InsertMovimientos(transaccion.MovimientoProducto, transaction);
                        }
                        else
                        {
                            foreach (var movimientoProducto in transaccion.MovimientoProducto)
                            {
                                movimientoProducto.IdTransaccion = transaccion.IdTransaccion;

                                foreach (var movimientoProductoStock in movimientoProducto.MovimientoProductoStock)
                                {
                                    var productoStock = productoStockRepository.GetByPresentacionAlmacenLote(
                                        movimientoProducto.IdPresentacion,
                                        movimientoProductoStock.IdAlmacen,
                                        movimientoProductoStock.LoteSerie);

                                    if (productoStock.StockFisico < movimientoProductoStock.Cantidad)
                                    {
                                        throw new Exception(string.Format("No existe Stock suficiente para el lote {0} del producto {1}.", movimientoProductoStock.LoteSerie, movimientoProducto.CodigoProducto));
                                    }
                                }
                            }

                            movimientoProductoRepository.InsertMovimientosFisico(transaccion.MovimientoProducto, transaction);
                        }

                        #endregion

                        #region Impuestos

                        foreach (var transaccionImpuesto in transaccion.TransaccionImpuesto)
                        {
                            transaccionImpuesto.IdTransaccion = transaccion.IdTransaccion;
                        }

                        transaccionImpuestoRepository.InsertImpuestos(transaccion.TransaccionImpuesto, transaction);

                        #endregion

                        #region Actualizar Serie Documento

                        serieDocumentoRepository.UpdateSerieDocumento(transaccion.IdSerieDocumento, transaccion.IdSucursal, transaccion.UsuarioModificacion, transaction);

                        #endregion

                        #region Actualizar Orden de Pedido

                        if (transaccion.IdTransaccionReferencia != null)
                        {
                            transaccion.Estado = (int)TipoEstadoDocumento.Aprobado;
                            transaccionRepository.UpdateReferenciaTransaccion(transaccion, transaction);
                        }

                        #endregion

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw new Exception(ex.Message, ex);
                    }
                }
            }
            return(true);
        }
        public JsonResult CrearDetalle(int idMovimientoProducto, string lote, int idAlmacen, int cantidad)
        {
            var jsonResponse = new JsonResponse();

            try
            {
                foreach (var movimientoProducto in CompraSeleccionada.MovimientoProducto)
                {
                    if (movimientoProducto.IdMovimientoProducto == idMovimientoProducto)
                    {
                        var movimientoProductoStock = movimientoProducto.MovimientoProductoStock.FirstOrDefault(p => p.LoteSerie == lote);
                        if (movimientoProductoStock != null)
                        {
                            movimientoProductoStock.Cantidad -= cantidad;
                            movimientoProducto.Cantidad      -= cantidad;

                            var detalle = DetalleTransferencia.FirstOrDefault(p => p.IdMovimientoProducto == idMovimientoProducto);

                            if (detalle == null)
                            {
                                detalle = new MovimientoProducto
                                {
                                    IdMovimientoProducto    = movimientoProducto.IdMovimientoProducto,
                                    Secuencia               = DetalleTransferencia.Count + 1,
                                    IdProducto              = movimientoProducto.IdProducto,
                                    IdPresentacion          = movimientoProducto.IdPresentacion,
                                    TipoClasificacion       = movimientoProducto.TipoClasificacion,
                                    TipoProducto            = movimientoProducto.TipoProducto,
                                    SignoStock              = -1 * movimientoProducto.SignoStock,
                                    CodigoProducto          = movimientoProducto.CodigoProducto,
                                    NombreProducto          = movimientoProducto.NombreProducto,
                                    MovimientoProductoStock = new List <MovimientoProductoStock>(),
                                    IdAlmacen               = idAlmacen
                                };
                                DetalleTransferencia.Add(detalle);
                            }
                            detalle.Cantidad += cantidad;

                            var detalleLote = detalle.MovimientoProductoStock.FirstOrDefault(p => p.LoteSerie == lote);

                            if (detalleLote == null)
                            {
                                var almacen = AlmacenBL.Instancia.Single(idAlmacen);
                                detalleLote = new MovimientoProductoStock
                                {
                                    LoteSerie               = lote,
                                    Cantidad                = cantidad,
                                    IdAlmacen               = idAlmacen,
                                    NombreAlmacen           = almacen.Nombre,
                                    FechaVencimiento        = movimientoProductoStock.FechaVencimiento,
                                    FechaVencimientoFormato = movimientoProductoStock.FechaVencimientoFormato
                                };
                                detalle.MovimientoProductoStock.Add(detalleLote);
                            }
                            else
                            {
                                if (detalleLote.IdAlmacen == idAlmacen)
                                {
                                    detalleLote.Cantidad += cantidad;
                                }
                                else
                                {
                                    var almacen = AlmacenBL.Instancia.Single(idAlmacen);
                                    detalleLote = new MovimientoProductoStock
                                    {
                                        LoteSerie               = lote,
                                        Cantidad                = cantidad,
                                        IdAlmacen               = idAlmacen,
                                        NombreAlmacen           = almacen.Nombre,
                                        FechaVencimiento        = movimientoProductoStock.FechaVencimiento,
                                        FechaVencimientoFormato = movimientoProductoStock.FechaVencimientoFormato
                                    };
                                    detalle.MovimientoProductoStock.Add(detalleLote);
                                }
                            }
                        }
                        break;
                    }
                }

                jsonResponse.Data    = DetalleTransferencia;
                jsonResponse.Success = true;
                jsonResponse.Message = "Se Proceso con exito.";
            }
            catch (Exception ex)
            {
                jsonResponse.Message = ex.Message;
            }

            return(Json(jsonResponse, JsonRequestBehavior.AllowGet));
        }
Exemplo n.º 3
0
        public bool Actualizar(Transaccion transaccion)
        {
            using (var conection = Database.CreateConnection())
            {
                conection.Open();
                using (var transaction = conection.BeginTransaction())
                {
                    try
                    {
                        #region Obtener Movimiento de Productos

                        var movimientosModificados = movimientoProductoRepository.GetByTransaccion(transaccion.IdTransaccion, transaction);

                        #endregion

                        #region Revertir ProductoStock

                        foreach (var movimientoProducto in movimientosModificados)
                        {
                            foreach (var movimientoProductoStock in movimientoProducto.MovimientoProductoStock)
                            {
                                movimientoProductoStock.SignoStock        = -1 * movimientoProducto.SignoStock;
                                movimientoProductoStock.IdPresentacion    = movimientoProducto.IdPresentacion;
                                movimientoProductoStock.UsuarioCreacion   = movimientoProducto.UsuarioCreacion;
                                movimientoProductoStock.TipoClasificacion = movimientoProducto.TipoClasificacion;
                            }
                        }

                        if (transaccion.IdTransaccionReferencia.HasValue)
                        {
                            productoStockRepository.UpdateProductoStockFisico(movimientosModificados, transaction);
                        }
                        else
                        {
                            productoStockRepository.UpdateProductoStock(movimientosModificados, transaction);
                        }

                        #endregion

                        #region Eliminar MovimientoProducto

                        movimientoProductoRepository.DeleteByTransaccion(transaccion.IdTransaccion, transaction);

                        #endregion

                        #region Eliminar Impuesto

                        transaccionImpuestoRepository.DeleteByTransaccion(transaccion.IdTransaccion, transaction);

                        #endregion

                        #region Actualizar Transaccion

                        transaccionRepository.UpdateTransaccion(transaccion, transaction);

                        #endregion

                        #region Movimiento Producto

                        if (transaccion.IdTransaccionReferencia == null)
                        {
                            foreach (var movimientoProducto in transaccion.MovimientoProducto)
                            {
                                movimientoProducto.IdTransaccion = transaccion.IdTransaccion;

                                var productos = productoStockRepository.GetByAlmacenPresentacion(movimientoProducto.IdAlmacen.Value, movimientoProducto.IdPresentacion, transaction);
                                var cantidad  = movimientoProducto.Cantidad;
                                var secuencia = 0;

                                foreach (var productoStock in productos)
                                {
                                    cantidad -= productoStock.StockLogico;

                                    var movimientoProductoStock = new MovimientoProductoStock
                                    {
                                        Secuencia        = ++secuencia,
                                        LoteSerie        = productoStock.Lote,
                                        Cantidad         = productoStock.StockLogico,
                                        IdAlmacen        = movimientoProducto.IdAlmacen.Value,
                                        FechaVencimiento = productoStock.FechaVencimiento
                                    };
                                    if (cantidad > 0)
                                    {
                                        movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock);
                                    }
                                    else if (cantidad == 0)
                                    {
                                        movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock);
                                        break;
                                    }
                                    else
                                    {
                                        movimientoProductoStock.Cantidad = cantidad + productoStock.StockLogico;
                                        movimientoProducto.MovimientoProductoStock.Add(movimientoProductoStock);
                                        break;
                                    }
                                }
                            }

                            movimientoProductoRepository.InsertMovimientos(transaccion.MovimientoProducto, transaction);
                        }
                        else
                        {
                            foreach (var movimientoProducto in transaccion.MovimientoProducto)
                            {
                                movimientoProducto.IdTransaccion = transaccion.IdTransaccion;

                                foreach (var movimientoProductoStock in movimientoProducto.MovimientoProductoStock)
                                {
                                    var productoStock = productoStockRepository.GetByPresentacionAlmacenLote(
                                        movimientoProducto.IdPresentacion,
                                        movimientoProductoStock.IdAlmacen,
                                        movimientoProductoStock.LoteSerie);

                                    if (productoStock.StockFisico < movimientoProductoStock.Cantidad)
                                    {
                                        throw new Exception(string.Format("No existe Stock suficiente para el lote {0} del producto {1}.", movimientoProductoStock.LoteSerie, movimientoProducto.CodigoProducto));
                                    }
                                }
                            }

                            movimientoProductoRepository.InsertMovimientosFisico(transaccion.MovimientoProducto, transaction);
                        }

                        #endregion

                        #region Impuestos

                        foreach (var transaccionImpuesto in transaccion.TransaccionImpuesto)
                        {
                            transaccionImpuesto.IdTransaccion = transaccion.IdTransaccion;
                        }

                        transaccionImpuestoRepository.InsertImpuestos(transaccion.TransaccionImpuesto, transaction);

                        #endregion

                        #region Actualizar Orden de Pedido

                        if (transaccion.IdTransaccionReferencia != null)
                        {
                            transaccion.Estado = (int)TipoEstadoDocumento.Aprobado;
                            transaccionRepository.UpdateReferenciaTransaccion(transaccion, transaction);
                        }

                        #endregion

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw new Exception(ex.Message, ex);
                    }
                }
            }
            return(true);
        }