示例#1
0
        public static LotQualityStatus PreserveQualityStatus(LotQualityStatus currentStatus, LotQualityStatus determinedStatus)
        {
            switch (determinedStatus)
            {
            case LotQualityStatus.Pending:
                switch (currentStatus)
                {
                case LotQualityStatus.Released:
                case LotQualityStatus.Contaminated:
                    return(LotQualityStatus.Pending);
                }
                break;

            case LotQualityStatus.Released:
                switch (currentStatus)
                {
                case LotQualityStatus.Pending:
                case LotQualityStatus.Contaminated:
                    return(LotQualityStatus.Released);
                }
                break;

            case LotQualityStatus.Contaminated:
                switch (currentStatus)
                {
                case LotQualityStatus.Pending:
                case LotQualityStatus.Released:
                    return(LotQualityStatus.Contaminated);
                }
                break;
            }

            return(currentStatus);
        }
示例#2
0
        public static IEnumerable <LotQualityStatus> GetValidLotQualityStatuses(LotQualityStatus currentLotQualityStatus, bool productSpecComplete, bool unresolvedActionableDefects, bool unresolvedContaminationDefects)
        {
            var validStatuses = new List <LotQualityStatus>
            {
                currentLotQualityStatus,
                LotQualityStatus.Rejected
            };

            if (!unresolvedContaminationDefects)
            {
                validStatuses.Add(LotQualityStatus.Released);

                if (unresolvedActionableDefects)
                {
                    validStatuses.Add(LotQualityStatus.Contaminated);
                }

                if (unresolvedActionableDefects || !productSpecComplete)
                {
                    validStatuses.Add(LotQualityStatus.Pending);
                }
            }
            else
            {
                validStatuses.Add(LotQualityStatus.Contaminated);
            }

            return(validStatuses.Distinct().OrderBy(s => s).ToList());
        }
            public void Returns200OnSuccess()
            {
                // arrange
                MockLotService.Setup(m => m.SetLotQualityStatus(It.IsAny <ISetLotStatusParameters>()))
                .Returns(new SuccessResult <ILotStatInfoReturn>());
                const string           lotKey         = "12345";
                const LotQualityStatus expectedStatus = LotQualityStatus.Released;
                var dto = new SetLotStatusDto
                {
                    Status = expectedStatus
                };

                // act
                var response = LotsControler.SetStatus(lotKey, dto);

                // assert
                Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            }
示例#4
0
        public void Returns_PickedInventoryItems_with_Lot_status_properties_as_expected_on_success()
        {
            //Arrange
            StartStopwatch();

            const LotQualityStatus    lotStatus0        = LotQualityStatus.Contaminated;
            const bool                onHold0           = false;
            const LotProductionStatus productionStatus0 = LotProductionStatus.Batched;

            const LotQualityStatus    lotStatus1 = LotQualityStatus.Pending;
            const bool                onHold1    = true;
            const LotProductionStatus status1    = LotProductionStatus.Produced;

            var lotKey0 = new LotKey(TestHelper.CreateObjectGraphAndInsertIntoDatabase <Lot>(l => l.EmptyLot(), l => l.QualityStatus = lotStatus0, l => l.ProductionStatus = productionStatus0, l => l.Hold = null));
            var lotKey1 = new LotKey(TestHelper.CreateObjectGraphAndInsertIntoDatabase <Lot>(l => l.EmptyLot(), l => l.QualityStatus = lotStatus1, l => l.ProductionStatus = status1, l => l.Hold = LotHoldType.HoldForAdditionalTesting));

            var parentRecord    = CreateParentRecord();
            var pickedInventory = GetPickedInventoryRecordFromParent(parentRecord);
            var pickedKey0      = new PickedInventoryItemKey(TestHelper.CreateObjectGraphAndInsertIntoDatabase <PickedInventoryItem>(i => i.ConstrainByKeys(pickedInventory, lotKey0)));
            var pickedKey1      = new PickedInventoryItemKey(TestHelper.CreateObjectGraphAndInsertIntoDatabase <PickedInventoryItem>(i => i.ConstrainByKeys(pickedInventory, lotKey1)));

            StopWatchAndWriteTime("Arrange");

            //Act
            var result = TimedExecution(() => MethodUnderTest(parentRecord));

            //Assert
            result.AssertSuccess();
            var items = GetPickedInventoryItemsFromResult(result.ResultingObject);

            var inventory = items.Single(r => r.PickedInventoryItemKey == pickedKey0.KeyValue);

            Assert.AreEqual(lotStatus0, inventory.QualityStatus);
            Assert.AreEqual(onHold0, inventory.HoldType != null);
            Assert.AreEqual(productionStatus0, inventory.ProductionStatus);

            inventory = items.Single(r => r.PickedInventoryItemKey == pickedKey1.KeyValue);
            Assert.AreEqual(lotStatus1, inventory.QualityStatus);
            Assert.AreEqual(onHold1, inventory.HoldType != null);
            Assert.AreEqual(status1, inventory.ProductionStatus);
        }
            public void ParametersAreCorrectlyTransposedToDto()
            {
                // arrange
                ISetLotStatusParameters actualParameters = null;

                MockLotService.Setup(m => m.SetLotQualityStatus(It.IsAny <ISetLotStatusParameters>()))
                .Callback((ISetLotStatusParameters p) => actualParameters = p)
                .Returns(new SuccessResult <ILotStatInfoReturn>());
                const string           lotKey         = "12345";
                const LotQualityStatus expectedStatus = LotQualityStatus.Released;
                var dto = new SetLotStatusDto
                {
                    Status = expectedStatus
                };

                // act
                LotsControler.SetStatus(lotKey, dto);

                // assert
                Assert.IsNotNull(actualParameters);
                Assert.AreEqual(lotKey, actualParameters.LotKey);
                Assert.AreEqual(expectedStatus, actualParameters.QualityStatus);
            }
            public void UtilizesUserIdentityProvider()
            {
                // arrange
                const string           lotKey         = "12345";
                const LotQualityStatus expectedStatus = LotQualityStatus.Released;
                var dto = new SetLotStatusDto
                {
                    Status = expectedStatus
                };
                SetLotStatusParameter actualParameters = null;

                MockUserIdentityProvider.Setup(m => m.SetUserIdentity(It.IsAny <SetLotStatusParameter>()))
                .Callback((SetLotStatusParameter p) => actualParameters = p)
                .Returns(actualParameters);
                MockLotService.Setup(m => m.SetLotQualityStatus(It.IsAny <ISetLotStatusParameters>()))
                .Returns(new SuccessResult <ILotStatInfoReturn>());

                // act
                LotsControler.SetStatus(lotKey, dto);

                // assert
                Assert.IsNotNull(actualParameters);
                MockUserIdentityProvider.Verify(m => m.SetUserIdentity(actualParameters), Times.Once());
            }
        public IResult IsValidForPicking(IDictionary <string, PickingValidatorAttributeAndDefects> attributesAndDefects, string attributeKey, string lotKey, LotQualityStatus qualityStatus)
        {
            var applicableSpec = _customerSpec != null ? UserMessages.CustomerSpec : UserMessages.ProductSpec;
            PickingValidatorAttributeAndDefects attributeAndDefects;

            if (!attributesAndDefects.TryGetValue(attributeKey, out attributeAndDefects))
            {
                if (_looseProductSpec && qualityStatus == LotQualityStatus.Released)
                {
                    return(new SuccessResult());
                }

                return(new InvalidResult(string.Format(UserMessages.LotMissingRequiredAttribute, lotKey, attributeKey, applicableSpec)));
            }

            if (_customerSpec != null ? _customerSpec.ValueOutOfRange(attributeAndDefects.AttributeValue) : _productSpec.ValueOutOfRange(attributeAndDefects.AttributeValue))
            {
                if (!_looseProductSpec || !attributeAndDefects.DefectResolution.Any() || attributeAndDefects.DefectResolution.Any(d => !d))
                {
                    return(new InvalidResult(string.Format(UserMessages.LotAttributeOutOfRequiredRange, lotKey, attributeKey, applicableSpec)));
                }
            }
            return(new SuccessResult());
        }
        internal IResult Execute(DateTime timestamp, Employee employee, LotKey lotKey, LotQualityStatus status, bool forceResolveAllDefects = false)
        {
            var lot = _lotUnitOfWork.LotRepository.FindByKey(lotKey,
                                                             l => l.ChileLot,
                                                             l => l.Attributes.Select(a => a.AttributeName),
                                                             l => l.LotDefects.Select(d => d.Resolution));

            if (lot == null)
            {
                return(new InvalidResult(string.Format(UserMessages.LotNotFound, lotKey)));
            }

            var historyResult = new RecordLotHistoryCommand(_lotUnitOfWork).Execute(lot, timestamp);

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

            if (forceResolveAllDefects)
            {
                foreach (var defect in lot.LotDefects)
                {
                    if (defect.Resolution == null)
                    {
                        defect.Resolution = new LotDefectResolution
                        {
                            EmployeeId     = employee.EmployeeId,
                            TimeStamp      = timestamp,
                            ResolutionType = ResolutionTypeEnum.AcceptedByUser,
                            Description    = "Forced acceptance by user."
                        };
                    }
                }
            }

            if (lot.ChileLot != null)
            {
                var chileLot = _lotUnitOfWork.ChileLotRepository.FindByKey(lotKey, LotStatusHelper.ChileLotIncludePaths);
                if (chileLot == null)
                {
                    return(new InvalidResult(string.Format(UserMessages.ChileLotNotFound, lotKey)));
                }

                if (!LotStatusHelper.GetValidLotQualityStatuses(chileLot).Contains(status))
                {
                    return(new InvalidResult(string.Format(UserMessages.CannotSetLotStatus, lotKey, chileLot.Lot.QualityStatus, status)));
                }
            }

            lot.QualityStatus = status;
            lot.EmployeeId    = employee.EmployeeId;
            lot.TimeStamp     = timestamp;

            return(new SuccessResult());
        }
示例#9
0
 protected void AssertResult(LotQualityStatus expectedStatus, LotQualityStatus determinedStatus)
 {
     Assert.AreEqual(expectedStatus, LotStatusHelper.PreserveQualityStatus(CurrentStatus, determinedStatus));
 }
示例#10
0
 internal static Expression <Func <Lot, bool> > FilterByQualityStatus(LotQualityStatus lotStatus)
 {
     return(l => l.QualityStatus == lotStatus);
 }