public void Process(ProductionRequestContext context) { if ((context.Request.ProducingAmount ?? 0m) < 0.00001m) { context.Request.ProducingAmount = 0; context.InvalidateRequest("Je třeba zadat množství"); } else { if (context.Request.PriceCalcAmount != (context.Request.ProducingAmount ?? 0m)) { if (context.Recipe.ProductionPricePerUnit != null) { context.Request.ProducingPrice = context.Recipe.ProductionPricePerUnit * (context.Request.ProducingAmount ?? 0); } context.Request.PriceCalcAmount = (context.Request.ProducingAmount ?? 0m); } } if ((context.Request.ProducingPrice ?? 0m) < 0.001m) { if (context.TargetMaterial.RequiresProductionPrice != true) { context.Request.ProducingPrice = 0m; } else { context.InvalidateRequest("Je třeba zadat cenu práce"); } } }
public void Process(ProductionRequestContext context) { if (context.Request.SourceSegmentId == null) { return; } var request = context.Request; var sourceSegment = m_batchRepository.GetBatchById(context.Request.SourceSegmentId.Value).Ensure(); request.OriginalBatchNumber = sourceSegment.Batch.BatchNumber; request.RecipeId = sourceSegment.Batch.RecipeId.Ensure("Šarže nevznikla z existující receptury"); request.ProducingBatchNumber = request.ProducingBatchNumber ?? sourceSegment.Batch.BatchNumber; if (request.ProducingAmount == null) { request.ProducingAmount = sourceSegment.Batch.Volume; } request.ProducingPrice = sourceSegment.Batch.ProductionWorkPrice; var batchAmount = new Amount(sourceSegment.Batch.Volume, sourceSegment.Batch.Unit); var available = m_batchFacade.GetAvailableAmount(sourceSegment.Batch.Id); context.MinimalAmount = m_amountProcessor.Subtract(batchAmount, available); if (!context.Request.Components.Any()) { ApplyComponents(sourceSegment, context); } }
public void Process(ProductionRequestContext context) { foreach (var component in context.Request.Components) { component.HasBatchChangeWarning = (component.IsValid && component.Resolutions.Count(r => r.Amount > 0) > 1); } }
public void Process(ProductionRequestContext context) { if (context.Request.SourceSegmentId == null) { return; } //TODO check invoicing }
public void ApplyComponents(MaterialBatchComponent sourceSegment, ProductionRequestContext context) { var recipeComponents = m_recipeRepository.GetRecipe(sourceSegment.Batch.RecipeId.Ensure("Segment nevznikl z existující receptury, nelze změnit")).Components.OrderBy(c => c.SortOrder); var requestComponents = context.Request.Components; foreach (var recipeComponent in recipeComponents) { var compo = new ProductionComponent { MaterialId = recipeComponent.MaterialId, MaterialName = m_materialRepository.GetMaterialById(recipeComponent.MaterialId).Ensure().Name, SortOrder = recipeComponent.SortOrder }; requestComponents.Add(compo); var resolutions = sourceSegment.Components.Where(c => c.Batch.MaterialId == recipeComponent.MaterialId); var resIndex = new Dictionary <string, ProductionComponentResolution>(); var componentUnit = m_unitRepository.GetUnit(recipeComponent.UnitId); foreach (var r in resolutions) { var resolutionAmount = m_amountProcessor.Convert(new Amount(r.ComponentAmount, r.ComponentUnit), componentUnit); var batchAvailability = m_amountProcessor.Convert(m_batchFacade.GetAvailableAmount(r.Batch.Id), componentUnit); if (!resIndex.TryGetValue(r.Batch.BatchNumber, out var resolution)) { resolution = new ProductionComponentResolution { Amount = resolutionAmount.Value, BatchAvailableAmount = batchAvailability.Value, BatchAvailableAmountText = batchAvailability.ToString(), BatchCreationDt = StringUtil.FormatDate(r.Batch.Created), BatchNumber = r.Batch.BatchNumber, Key = Guid.NewGuid().ToString(), Sorter = r.Batch.Created.Ticks, UnitSymbol = componentUnit.Symbol }; compo.Resolutions.Add(resolution); resIndex.Add(r.Batch.BatchNumber, resolution); } else { resolution.Amount += resolutionAmount.Value; } } compo.LastClientAmount = m_amountProcessor .Sum(compo.Resolutions.Select(r => r.GetAmount(m_unitRepository)))?.ToString(); } }
public void Process(ProductionRequestContext context) { context.ComponentMultiplier = 0; context.Request.IsValid = true; context.Request.Messages.Clear(); context.Request.ProducingBatchNumber = context.Request.ProducingBatchNumber?.Trim(); foreach (var component in context.Request.Components) { component.IsValid = true; component.Messages.Clear(); } }
private ProductionRequestContext Validate(ProductionRequest request) { var context = new ProductionRequestContext(m_session, request); foreach (var step in GetSteps()) { step.Process(context); } request.IsFirstRound = false; request.IsValid = request.IsValid && request.Components.All(c => c.IsValid); return(context); }
public void Process(ProductionRequestContext context) { var recipe = m_recipeRepository.GetRecipe(context.Request.RecipeId).Ensure(); if (recipe.DeleteUser != null || recipe.DeleteDateTime != null) { throw new InvalidOperationException($"Receptura {recipe.RecipeName} není aktivní"); } context.Request.ProdPricePerUnit = recipe.ProductionPricePerUnit; context.Request.RecipeNote = recipe.Note; context.Recipe = recipe; context.Request.RecipeName = recipe.RecipeName; context.TargetMaterial = m_materialRepository.GetMaterialById(recipe.ProducedMaterialId)?.Adaptee; }
public void Process(ProductionRequestContext context) { var recipeComponentList = context.Recipe.Components.OrderBy(c => c.SortOrder).ToList(); for (var i = context.Request.Components.Count - 1; i >= 0; i--) { // kick out components not required by the recipe if (recipeComponentList.All(m => m.MaterialId != context.Request.Components[i].MaterialId)) { context.Request.Components.RemoveAt(i); } } var before = DateTime.Now; if (context.Request.SourceSegmentId != null) { var batch = m_batchRepository.GetBatchById(context.Request.SourceSegmentId.Value).Ensure(); before = batch.Batch.Created; } foreach (var recipeComponent in recipeComponentList) { var requestComponent = context.Request.Components.SingleOrDefault(c => c.MaterialId == recipeComponent.MaterialId); if (requestComponent == null) { requestComponent = new ProductionComponent { IsValid = true, MaterialId = recipeComponent.MaterialId, MaterialName = m_materialRepository.GetMaterialById(recipeComponent.MaterialId).Name }; context.Request.Components.Add(requestComponent); } requestComponent.RequiredAmount = recipeComponent.Amount * context.ComponentMultiplier; requestComponent.UnitSymbol = m_unitRepository.GetUnit(recipeComponent.UnitId).Symbol; requestComponent.SortOrder = recipeComponent.SortOrder; ProcessResolutions(context.Request, recipeComponent, requestComponent, context.ComponentMultiplier, before); } context.Request.Components.Sort( new Comparison <ProductionComponent>((a, b) => a.SortOrder.CompareTo(b.SortOrder))); }
public void Process(ProductionRequestContext context) { var material = m_materialFacade.GetMaterialInfo(context.Recipe.ProducedMaterialId); context.Request.MaterialName = material.MaterialName; // Batch number if (string.IsNullOrWhiteSpace(context.Request.ProducingBatchNumber)) { if (material.AutomaticBatches) { context.Request.ProducingBatchNumber = material.AutoBatchNr; } else { context.InvalidateRequest("Nutno vyplnit číslo šarže"); } } // Unit while (true) { if (string.IsNullOrWhiteSpace(context.Request.ProducingUnitSymbol)) { context.Request.ProducingUnitSymbol = material.PreferredUnitSymbol; break; } if (!context.Request.ProducingUnitSymbol.Equals(material.PreferredUnitSymbol, StringComparison.InvariantCultureIgnoreCase)) { var usedUnit = m_unitRepository.GetUnitBySymbol(context.Request.ProducingUnitSymbol.Trim()); if (usedUnit == null) { context.Request.ProducingUnitSymbol = null; continue; } var mainUnit = m_unitRepository.GetUnitBySymbol(material.PreferredUnitSymbol); if (!m_conversionHelper.AreCompatible(usedUnit.Id, mainUnit.Id)) { context.Request.ProducingUnitSymbol = null; continue; } } break; } context.RequestedAmount = new Amount(context.Request.ProducingAmount ?? 0m, m_unitRepository.GetUnitBySymbol(context.Request.ProducingUnitSymbol)); context.NominalRecipeAmount = new Amount(context.Recipe.RecipeProducedAmount, m_unitRepository.GetUnit(context.Recipe.ProducedAmountUnitId)); var commonUnit = m_conversionHelper.GetSmallestCompatibleUnit(context.RequestedAmount.Unit); var convertedRequestedAmount = m_conversionHelper.ConvertAmount(context.RequestedAmount, commonUnit.Id); var convertedNominalAmount = m_conversionHelper.ConvertAmount(context.NominalRecipeAmount, commonUnit.Id); context.ComponentMultiplier = convertedRequestedAmount.Value / convertedNominalAmount.Value; if (context.MinimalAmount != null && m_amountProcessor.GreaterThan(context.MinimalAmount, context.RequestedAmount)) { context.InvalidateRequest($"Nové množství nesmí být méně než {context.MinimalAmount}, protože tolik již bylo spotřebováno"); } }