Ejemplo n.º 1
0
 public Family FindId(int id)
 {
     return(_FamilyApp.FindId(id));
 }
Ejemplo n.º 2
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);
            }
        }