public IResult <ProductionTriggersReport> GetProductionTriggerReport(string jobref, string citCode)
        {
            var ptlMaster = this.masterRepository.GetRecord();

            if (ptlMaster == null)
            {
                return(new ServerFailureResult <ProductionTriggersReport>("Could not find PTL Master record"));
            }

            var reportJobref = string.IsNullOrEmpty(jobref) ? ptlMaster.LastFullRunJobref : jobref;

            // if no cit then just pick the first production one you can find
            var cit = string.IsNullOrEmpty(citCode)
                          ? this.citRepository.FilterBy(c => c.BuildGroup == "PP" && c.DateInvalid == null).ToList()
                      .OrderBy(c => c.SortOrder).FirstOrDefault()
                          : this.citRepository.FindById(citCode);

            if (cit == null)
            {
                return(new NotFoundResult <ProductionTriggersReport>($"cit {citCode} not found"));
            }

            var report = new ProductionTriggersReport(reportJobref, ptlMaster, cit, this.repository);

            return(new SuccessResult <ProductionTriggersReport>(report));
        }
        public void SetUp()
        {
            var report = new ProductionTriggersReport
            {
                Cit = new Cit {
                    Code = "A", Name = "Army of the Undead"
                },
                PtlMaster = new PtlMaster {
                    LastFullRunJobref = "CJCAIH", LastFullRunDateTime = new DateTime(2019, 1, 1)
                },
                Triggers = new List <ProductionTrigger>
                {
                    new ProductionTrigger {
                        PartNumber = "A", Description = "A product", Priority = "1"
                    },
                    new ProductionTrigger {
                        PartNumber = "B", Description = "B nice", Priority = "2"
                    },
                    new ProductionTrigger {
                        PartNumber = "C", Description = "C", Priority = "3"
                    }
                }
            };

            this.ProductionTriggersFacadeService.GetProductionTriggerReport("CJCAIH", "A")
            .Returns(new SuccessResult <ProductionTriggersReport>(report));

            this.Response = this.Browser.Get(
                "/production/reports/triggers",
                with =>
            {
                with.Header("Accept", "application/json");
                with.Query("jobref", "CJCAIH");
                with.Query("citCode", "A");
            }).Result;
        }
        public ShortageSummary ShortageSummaryByCit(string citCode, string ptlJobref)
        {
            var ptlMaster = this.masterRepository.GetRecord();

            if (ptlMaster == null)
            {
                throw new DomainException("Could not find PTL Master record");
            }

            var cit = this.citRepository.FindById(citCode);

            if (cit == null)
            {
                throw new DomainException($"Could not find CIT with code {citCode}");
            }

            var linnCompany = this.accountingCompaniesRepository.FindById("LINN");

            if (linnCompany == null)
            {
                throw new DomainException($"Could not find Linn Accounting Company");
            }

            var report     = new ProductionTriggersReport(ptlJobref, ptlMaster, cit, this.triggerRepository);
            var backOrders =
                this.backOrderRepository.FilterBy(b => b.JobId == linnCompany.LatestSosJobId && b.CitCode == citCode).ToList();
            var wswShortages        = this.shortageRepository.FilterBy(s => s.Jobref == ptlJobref && s.CitCode == citCode).ToList();
            var wswShortagesStories = this.shortageStoryRepository.FilterBy(s => s.Jobref == ptlJobref && s.CitCode == citCode).ToList();

            var summary   = new ShortageSummary();
            var shortages = new List <ShortageResult>();

            summary.CitName = cit.Name;

            foreach (var trigger in report.Triggers.Where(t => t.Priority == "1" || t.Priority == "2"))
            {
                summary.OnesTwos++;
                if (trigger.IsShortage())
                {
                    var shortage = new ShortageResult();
                    shortage.Priority   = trigger.Priority;
                    shortage.PartNumber = trigger.PartNumber;
                    shortage.Build      = trigger.ReqtForInternalAndTriggerLevelBT;
                    if (trigger.QtyBeingBuilt > 0)
                    {
                        shortage.Build += trigger.QtyBeingBuilt;
                    }

                    shortage.CanBuild = trigger.CanBuild;
                    shortage.Kanban   = trigger.KanbanSize;

                    var shortageBackOrders = backOrders.Where(o => o.ArticleNumber == shortage.PartNumber).ToList();
                    if (shortageBackOrders.Any())
                    {
                        shortage.BackOrderQty          = shortageBackOrders.Sum(o => o.BackOrderQty);
                        shortage.EarliestRequestedDate = shortageBackOrders.Min(o => o.RequestedDeliveryDate);
                    }

                    var details = wswShortages.Where(w => w.PartNumber == shortage.PartNumber).GroupBy(w => w.ShortPartNumber).Select(w => w.First());

                    foreach (var detail in details)
                    {
                        shortage.AddWswShortage(detail);

                        var stories = wswShortagesStories.Where(w => w.ShortPartNumber == detail.ShortPartNumber && w.PartNumber == detail.PartNumber);
                        foreach (var story in stories)
                        {
                            shortage.AddWswShortageStory(story);
                        }
                    }

                    shortages.Add(shortage);
                }
            }

            summary.Shortages = shortages;

            return(summary);
        }