public UnitMeasure FindId(int id) { return(_UnitMeasureApp.FindId(id)); }
/// <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); } }