private IResult SetupChileLots(IEnumerable <LabReportChileLotReturn> chileLots)
        {
            var lotToteReturns = new Dictionary <int, DehydratedInputReturn>();

            var dehydratedItems = _lotUnitOfWork.ChileMaterialsReceivedItemRepository.All().AsNoTracking();
            var selectInput     = ChileMaterialsReceivedItemProjectors.SelectInput().Expand();

            foreach (var chileLot in chileLots)
            {
                Initialize(chileLot);

                var dehydratedInputs = new List <DehydratedInputReturn>();
                foreach (var pickedLot in chileLot.PickedLots.ToList())
                {
                    DehydratedInputReturn dehydratedInput;
                    var lotToteHash = pickedLot.GetHashCode();
                    if (!lotToteReturns.TryGetValue(lotToteHash, out dehydratedInput))
                    {
                        dehydratedInput = dehydratedItems.Where(ChileMaterialsReceivedItemPredicates.FilterByLotToteReturn(pickedLot).Expand()).Select(selectInput).FirstOrDefault();
                        lotToteReturns.Add(lotToteHash, dehydratedInput);
                    }

                    if (dehydratedInput != null)
                    {
                        dehydratedInputs.Add(dehydratedInput);
                    }
                }

                chileLot.DehydratedInputs = dehydratedInputs;

                var weightedAveragesResult = CalculateAttributeWeightedAveragesCommand.CalculateWeightedAverages(chileLot.PickedLots);
                if (!weightedAveragesResult.Success)
                {
                    return(weightedAveragesResult);
                }

                var weightedAverages = weightedAveragesResult.ResultingObject.ToDictionary(a => a.Key.AttributeNameKey.KeyValue, a => a.Value);
                foreach (var lotAttribute in chileLot.WeightedAttributes)
                {
                    double average;
                    lotAttribute.WeightedAverage = weightedAverages.TryGetValue(lotAttribute.Key, out average) ? average : 0.0f;
                }

                SetValidToPick(chileLot);
            }

            return(new SuccessResult());
        }
Beispiel #2
0
        private static IResult <IProductionPacketReturn> Process(IProductionPacketReturn packet)
        {
            foreach (var batch in packet.Batches.OfType <ProductionPacketBatchReturn>())
            {
                var averages = CalculateAttributeWeightedAveragesCommand.CalculateWeightedAverages(batch.PickedItems);
                if (!averages.Success)
                {
                    return(averages.ConvertTo <IProductionPacketReturn>(null));
                }

                batch.CalculatedParameters = new ProductionBatchTargetParameters
                {
                    BatchTargetWeight   = batch.PickedItems.Any() ? batch.PickedItems.Sum(i => i.QuantityPicked * i.PackagingProduct.Weight) : 0.0f,
                    BatchTargetAsta     = averages.ResultingObject.Where(a => a.Key.AttributeNameKey.AttributeNameKey_ShortName == Constants.ChileAttributeKeys.Asta).Select(a => a.Value).FirstOrDefault(),
                    BatchTargetScan     = averages.ResultingObject.Where(a => a.Key.AttributeNameKey.AttributeNameKey_ShortName == Constants.ChileAttributeKeys.Scan).Select(a => a.Value).FirstOrDefault(),
                    BatchTargetScoville = averages.ResultingObject.Where(a => a.Key.AttributeNameKey.AttributeNameKey_ShortName == Constants.ChileAttributeKeys.Scov).Select(a => a.Value).FirstOrDefault(),
                };
            }

            return(new SuccessResult <IProductionPacketReturn>(packet));
        }
        public IResult Execute(ChileLot chileLot, List <PickedInventoryItem> pickedItems, DateTime timestamp)
        {
            if (chileLot == null)
            {
                throw new ArgumentNullException("chileLot");
            }
            if (pickedItems == null)
            {
                throw new ArgumentNullException("pickedItems");
            }

            var actualsRequired = new HashSet <AttributeNameKey>(_lotUnitOfWork.AttributeNameRepository
                                                                 .All().Where(a => a.ActualValueRequired)
                                                                 .ToList()
                                                                 .Select(a => a.ToAttributeNameKey()));

            foreach (var item in pickedItems)
            {
                item.PackagingProduct = _lotUnitOfWork.PackagingProductRepository.FindByKey(item.ToPackagingProductKey());
                item.Lot = _lotUnitOfWork.LotRepository.FindByKey(item.ToLotKey(), i => i.Attributes.Select(a => a.AttributeName));
            }

            var weightedAverages = CalculateAttributeWeightedAveragesCommand.Execute(pickedItems);

            if (!weightedAverages.Success)
            {
                return(weightedAverages);
            }

            var attributesToRemove = chileLot.Lot.Attributes.ToList();
            var attributesToSet    = weightedAverages.ResultingObject.Where(a => !actualsRequired.Contains(a.Key.Attribute.ToAttributeNameKey())).ToList();

            foreach (var weightedAttribute in attributesToSet)
            {
                var namePredicate = weightedAttribute.Key.AttributeNameKey.FindByPredicate.Compile();
                var lotAttribute  = attributesToRemove.FirstOrDefault(a => namePredicate(a.AttributeName));
                if (lotAttribute != null)
                {
                    attributesToRemove.Remove(lotAttribute);
                }
                else
                {
                    lotAttribute = new LotAttribute
                    {
                        LotDateCreated     = chileLot.LotDateCreated,
                        LotDateSequence    = chileLot.LotDateSequence,
                        LotTypeId          = chileLot.LotTypeId,
                        AttributeShortName = weightedAttribute.Key.AttributeNameKey.AttributeNameKey_ShortName,
                        Computed           = true
                    };
                    chileLot.Lot.Attributes.Add(lotAttribute);
                }

                if (lotAttribute.Computed)
                {
                    lotAttribute.AttributeValue = weightedAttribute.Value;
                    lotAttribute.EmployeeId     = chileLot.Production.PickedInventory.EmployeeId;
                    lotAttribute.AttributeDate  = (lotAttribute.TimeStamp = timestamp).Date;
                }
            }

            foreach (var attribute in attributesToRemove.Where(a => a.Computed))
            {
                _lotUnitOfWork.LotAttributeRepository.Remove(attribute);
            }

            return(new SuccessResult());
        }