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