Пример #1
0
        public bool InsertOrUpdate(ItemOutputStock ItemOutputStock)
        {
            if (_stockManagement.ValidItem(ItemOutputStock.StockItemId, ItemOutputStock.LocalStockId, ItemOutputStock.UnitMeasureId, ItemOutputStock.Quantity, ItemOutputStock.Id))
            {
                var stockItem = _stockItemApp.FindId(ItemOutputStock.StockItemId);

                ItemOutputStock.StandarUnitMeasureId = stockItem.UnitMeasureId;

                if (stockItem.UnitMeasureId != ItemOutputStock.UnitMeasureId)
                {
                    ItemOutputStock.StandardQuantity  = _unitMeasureConversionApp.Convert(ItemOutputStock.UnitMeasureId, stockItem.UnitMeasureId, stockItem.Id, stockItem.FamilyId, ItemOutputStock.Quantity);
                    ItemOutputStock.StandardUnitValue = ItemOutputStock.UnitaryValue / ItemOutputStock.StandardQuantity;
                    ItemOutputStock.StandardTotal     = ItemOutputStock.StandardQuantity * ItemOutputStock.StandardUnitValue;
                }
                else
                {
                    ItemOutputStock.StandardQuantity  = ItemOutputStock.Quantity;
                    ItemOutputStock.StandardUnitValue = ItemOutputStock.UnitaryValue;
                    ItemOutputStock.StandardTotal     = ItemOutputStock.Total;
                }

                return(_epr.InsertOrUpdate(ItemOutputStock));
            }
            else
            {
                return(false);
            }
        }
Пример #2
0
        /// <summary>
        /// Verifica as configurações do item para Saída.
        /// </summary>
        /// <param name="stockItemId">ID item de estoque.</param>
        /// <param name="localStockId">ID do local de estoque.</param>
        /// <param name="Qtd">Quantidade que saiara do estoque.</param>
        /// <param name="itemOutputStockId">ID do item do movimento de estoque, calculo do estoque irá desconsiderar saída existente no saldo. Parametro não obrigatório.</param>
        /// <returns></returns>
        public bool ValidItem(int stockItemId, int localStockId, int unitMeasurId, decimal qtd, int itemOutputStockId = 0)
        {
            _itemInputStockApp        = new ItemInputStockApp(connection);
            _itemOutputStockApp       = new ItemOutputStockApp(connection);
            _unitMeasureConversionApp = new UnitMeasureConversionApp(connection);
            _stockItemApp             = new StockItemApp(connection);
            _localStockApp            = new LocalStockApp(connection);

            var stockItem  = _stockItemApp.FindId(stockItemId);
            var localStock = _localStockApp.FindId(localStockId);

            var qtdOldOutput = _unitMeasureConversionApp
                               .Convert(
                stockItem.UnitMeasureId,
                unitMeasurId,
                stockItemId,
                stockItem.FamilyId,
                _itemOutputStockApp
                .FindId(itemOutputStockId)?.StandardQuantity ?? 0);

            if (stockItem.AllowsUnavaliableMovement)
            {
                return(true);
            }

            var balance = BalanceAvailable(stockItemId, localStockId, unitMeasurId) + qtdOldOutput;

            if (stockItem.EvaluateAvailability)
            {
                if (balance < qtd)
                {
                    Logs.Add(new Log
                    {
                        Description    = "Não é permitido movimentar item sem disponibilidade.",
                        ProcessStatus  = ProcessStatus.Alert,
                        Identification = stockItem.Code + " - " + stockItem.Description
                    });
                    return(false);
                }
            }

            if (stockItem.NotNegativeBalance && balance < 0)
            {
                Logs.Add(new Log
                {
                    Description    = "Não é permitido movimentar item com saldo negativo.",
                    ProcessStatus  = ProcessStatus.Alert,
                    Identification = stockItem.Code + " - " + stockItem.Description
                });
                return(false);
            }

            return(true);
        }
Пример #3
0
        /// <summary>
        /// Saldo Disponível
        /// </summary>
        /// <param name="stockItemId">ID do item de estoque.</param>
        /// <param name="localStockId">ID do local de estoque.</param>
        /// <returns></returns>
        public decimal BalanceAvailable(int stockItemId, int localStockId, int unitMeasurId)
        {
            _itemInputStockApp        = new ItemInputStockApp(connection);
            _itemOutputStockApp       = new ItemOutputStockApp(connection);
            _stockItemApp             = new StockItemApp(connection);
            _localStockApp            = new LocalStockApp(connection);
            _unitMeasureConversionApp = new UnitMeasureConversionApp(connection);

            var qtdInput  = _itemInputStockApp.GetQuantityTotal(stockItemId, localStockId);
            var qtdOutput = _itemOutputStockApp.GetQuantityTotal(stockItemId, localStockId);
            var stockItem = _stockItemApp.FindId(stockItemId);

            return(_unitMeasureConversionApp.Convert(stockItem.UnitMeasureId, unitMeasurId, stockItemId, stockItem.FamilyId, qtdInput - qtdOutput));
        }
Пример #4
0
 public StockItem FindId(int id)
 {
     return(_StockItemApp.FindId(id));
 }
Пример #5
0
        /// <summary>
        /// Conversão de unidade de medida.
        /// </summary>
        /// <param name="currentUnitOfMeasureId">Unidade de Medida base.</param>
        /// <param name="unitOfMeasureConversionId">Unidade de medida que será convertida.</param>
        /// <param name="StockItemId">ID do item de estoque, para avaliar se existe conversão específica para o item.</param>
        /// <param name="familyId">ID da familia do estoque, para avaliar se existe conversão específicoa para familia.</param>
        /// <param name="quantity">Quantidade a ser convertida.</param>
        /// <returns>Valor convertido, se retornar zero (pode ter ocorrido algum problema na conversão.)</returns>
        public decimal Convert(int currentUnitOfMeasureId, int unitOfMeasureConversionId, int?StockItemId, int?familyId, decimal quantity)
        {
            if (quantity == 0)
            {
                return(quantity);
            }

            var           currentUM     = _unitMeasureApp.FindId(currentUnitOfMeasureId);
            var           uMConversion  = _unitMeasureApp.FindId(unitOfMeasureConversionId);
            decimal       factor        = 0;
            TypeOperation typeOperation = 0;

            var conversions = _epr.Search(c => c.FirstUnitMeasureId == currentUnitOfMeasureId);

            if (conversions.Any())
            {
                if (conversions.Any(c => c.SecondUnitMeasureId == unitOfMeasureConversionId))
                {
                    #region Avalia conversões da unidade de medida para um item específico
                    if (StockItemId.HasValue)
                    {
                        var stockItem = _stockItemApp.FindId(StockItemId.Value);

                        var stockItemConversion = conversions.SingleOrDefault(c => c.StockItemId == StockItemId && c.SecondUnitMeasureId == unitOfMeasureConversionId);

                        if (stockItemConversion != null)
                        {
                            typeOperation = stockItemConversion.TypeOperation;
                            factor        = stockItemConversion.ConversionFactor;
                        }
                        else
                        {
                            Logs.Add(new Log()
                            {
                                Identification = $"Unidade de Medida '{ currentUM.Initials }'",
                                Description    = $"Unidade de Medida '{ currentUM.Initials }' não tem conversão para Unidade de Medida '{ uMConversion.Initials }', para o item '{ stockItem.Code + " - " + stockItem.Description }'",
                                ProcessStatus  = ProcessStatus.Error
                            });
                            return(0);
                        }
                    }
                    #endregion
                    #region Avalia conversões da unidade de medida para um familia específica
                    else if (familyId.HasValue)
                    {
                        var family = _familyApp.FindId(familyId.Value);

                        var familyConversion = conversions.SingleOrDefault(c => c.FamilyId == familyId && c.SecondUnitMeasureId == unitOfMeasureConversionId);

                        if (familyConversion != null)
                        {
                            typeOperation = familyConversion.TypeOperation;
                            factor        = familyConversion.ConversionFactor;
                        }
                        else
                        {
                            Logs.Add(new Log()
                            {
                                Identification = $"Unidade de Medida '{ currentUM.Initials }'",
                                Description    = $"Unidade de Medida '{ currentUM.Initials }' não tem conversão para Unidade de Medida '{ uMConversion.Initials }', para a Familia '{ family.FamilyCode + " - " + family.FamilyName }'",
                                ProcessStatus  = ProcessStatus.Error
                            });
                            return(0);
                        }
                    }
                    #endregion
                    #region Avalia converão de unidade de medida
                    else
                    {
                        var uMconversion = conversions.SingleOrDefault(c => c.SecondUnitMeasureId == unitOfMeasureConversionId && !c.StockItemId.HasValue && !c.FamilyId.HasValue);
                        typeOperation = uMconversion.TypeOperation;
                        factor        = uMconversion.ConversionFactor;
                    }
                    #endregion
                }
                else
                {
                    Logs.Add(new Log()
                    {
                        Identification = $"Unidade de Medida '{ currentUM.Initials }'",
                        Description    = $"Unidade de Medida '{ currentUM.Initials }' não tem conversão para Unidade de Medida '{ uMConversion.Initials }'",
                        ProcessStatus  = ProcessStatus.Error
                    });
                    return(0);
                }
            }
            else
            {
                Logs.Add(new Log()
                {
                    Identification = $"Unidade de Medida '{ currentUM.Initials }'",
                    Description    = $"Unidade de Medida '{ currentUM.Initials }' não tem nenhuma conversão cadastrada",
                    ProcessStatus  = ProcessStatus.Error
                });
                return(0);
            }

            switch (typeOperation)
            {
            case TypeOperation.Division:
                return(quantity / factor);

            case TypeOperation.Sum:
                return(quantity + factor);

            case TypeOperation.Subtraction:
                return(quantity - factor);

            case TypeOperation.Multiplication:
                return(quantity * factor);

            case TypeOperation.SubtractionPorcent:
                return(quantity - (quantity / 100) * factor);

            case TypeOperation.AditionalPorcent:
                return(quantity + (quantity / 100) * factor);

            case TypeOperation.PorcentValue:
                return((quantity / 100) * factor);

            case TypeOperation.SubtractionInversion:
                return(factor - quantity);

            default:
                return(0);
            }
        }