Ejemplo n.º 1
0
        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");
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
 public void Process(ProductionRequestContext context)
 {
     foreach (var component in context.Request.Components)
     {
         component.HasBatchChangeWarning =
             (component.IsValid && component.Resolutions.Count(r => r.Amount > 0) > 1);
     }
 }
Ejemplo n.º 4
0
        public void Process(ProductionRequestContext context)
        {
            if (context.Request.SourceSegmentId == null)
            {
                return;
            }

            //TODO check invoicing
        }
Ejemplo n.º 5
0
        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();
            }
        }
Ejemplo n.º 6
0
        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();
            }
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 9
0
        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)));
        }
Ejemplo n.º 10
0
        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");
            }
        }