예제 #1
0
        public IHttpActionResult GetCampaignFilterGroup([FromUri] CampaignFilterGroupQueryModel queryModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var campaigns = _campaignRepository.GetAllFlat();

            return(Ok(GenerateCampaignFilterGroup(campaigns, queryModel)));
        }
        public CampaignFilterGroupModel GenerateCampaignFilterGroup(IEnumerable <CampaignReducedModel> campaigns, CampaignFilterGroupQueryModel query)
        {
            var campaignFilterGroupModel = new CampaignFilterGroupModel();

            if (campaigns is null || !campaigns.Any() || query is null)
            {
                return(campaignFilterGroupModel);
            }

            var businessTypes       = new List <string>();
            var clashExternalRefs   = new List <string>();
            var productExternalIds  = new List <string>();
            var reportingCategories = new List <string>();
            var campaignsOutput     = new List <CampaignFilterGroupDataModel>();
            var clashCodes          = new List <CampaignFilterGroupDataModel>();
            var productBasicModels  = new List <CampaignFilterGroupDataModel>();
            var mediaSalesGroups    = new List <CampaignFilterGroupDataModel>();
            var productAssignees    = new List <CampaignFilterGroupDataModel>();
            var agencies            = new List <CampaignFilterGroupDataModel>();
            var advertisers         = new List <CampaignFilterGroupDataModel>();

            foreach (var campaign in campaigns)
            {
                businessTypes.Add(campaign.BusinessType);
                campaignsOutput.Add(new CampaignFilterGroupDataModel {
                    Identifier = campaign.ExternalId, Text = campaign.Name
                });
                productExternalIds.Add(campaign.Product);
            }

            var productDictionary = _productRepository
                                    .FindByExternal(productExternalIds)
                                    .ToDictionary(r => r.Externalidentifier);

            foreach (var productExternalId in productExternalIds)
            {
                if (productDictionary.TryGetValue(productExternalId, out Product product))
                {
                    productBasicModels.Add(new CampaignFilterGroupDataModel
                    {
                        Identifier = productExternalId,
                        Text       = product.Name
                    });

                    if (!string.IsNullOrEmpty(product.ClashCode))
                    {
                        clashExternalRefs.Add(product.ClashCode);
                    }

                    if (!string.IsNullOrEmpty(product.ReportingCategory))
                    {
                        reportingCategories.Add(product.ReportingCategory);
                    }

                    if (product.AgencyGroup != null && !string.IsNullOrEmpty(product.AgencyGroup.Code))
                    {
                        mediaSalesGroups.Add(new CampaignFilterGroupDataModel
                        {
                            Identifier = product.AgencyGroup.Code,
                            Text       = string.IsNullOrEmpty(product.AgencyGroup.ShortName) ? product.AgencyGroup.Code : product.AgencyGroup.ShortName
                        });
                    }

                    if (product.SalesExecutive != null)
                    {
                        productAssignees.Add(new CampaignFilterGroupDataModel
                        {
                            Identifier = product.SalesExecutive.Identifier.ToString(),
                            Text       = string.IsNullOrEmpty(product.SalesExecutive.Name) ? product.SalesExecutive.Identifier.ToString() : product.SalesExecutive.Name
                        });
                    }

                    if (!string.IsNullOrEmpty(product.AgencyIdentifier))
                    {
                        agencies.Add(new CampaignFilterGroupDataModel
                        {
                            Identifier = product.AgencyIdentifier,
                            Text       = string.IsNullOrEmpty(product.AgencyName) ? product.AgencyIdentifier : product.AgencyName
                        });
                    }

                    if (!string.IsNullOrEmpty(product.AdvertiserIdentifier))
                    {
                        advertisers.Add(new CampaignFilterGroupDataModel
                        {
                            Identifier = product.AdvertiserIdentifier,
                            Text       = string.IsNullOrEmpty(product.AdvertiserName) ? product.AdvertiserIdentifier : product.AdvertiserName
                        });
                    }
                }
            }

            if (query.IsProductFiltered)
            {
                campaignFilterGroupModel.Products = productBasicModels
                                                    .DistinctBy(o => new { o.Identifier, o.Text })
                                                    .OrderBy(o => o.Text);;
            }

            if (query.IsClashCodeFiltered)
            {
                var clashes = _clashRepository.FindByExternal(clashExternalRefs.Distinct().ToList());
                foreach (var clash in clashes)
                {
                    clashCodes.Add(new CampaignFilterGroupDataModel {
                        Identifier = clash.Externalref, Text = clash.Description
                    });
                }

                campaignFilterGroupModel.ClashCodes = clashCodes
                                                      .DistinctBy(o => new { o.Identifier, o.Text })
                                                      .OrderBy(o => o.Text);
            }

            if (query.IsBusinessTypeFiltered)
            {
                campaignFilterGroupModel.BusinessTypes = businessTypes.Distinct().OrderBy(o => o);
            }

            if (query.IsCampaignIdentifierFiltered)
            {
                campaignFilterGroupModel.Campaigns = campaignsOutput
                                                     .DistinctBy(o => new { o.Identifier, o.Text })
                                                     .OrderBy(o => o.Text);
            }

            if (query.IsReportingCategoryFiltered)
            {
                campaignFilterGroupModel.ReportingCategories = reportingCategories.Distinct().OrderBy(o => o);
            }

            if (query.IsMediaSalesGroupFiltered)
            {
                campaignFilterGroupModel.MediaSalesGroups = mediaSalesGroups
                                                            .DistinctBy(o => new { o.Identifier, o.Text })
                                                            .OrderBy(o => o.Text);
            }

            if (query.IsProductAssigneeFiltered)
            {
                campaignFilterGroupModel.ProductAssignees = productAssignees
                                                            .DistinctBy(o => new { o.Identifier, o.Text })
                                                            .OrderBy(o => o.Text);
            }

            if (query.IsAgencyFiltered)
            {
                campaignFilterGroupModel.Agencies = agencies
                                                    .DistinctBy(o => new { o.Identifier, o.Text })
                                                    .OrderBy(o => o.Text);
            }

            if (query.IsAdvertiserFiltered)
            {
                campaignFilterGroupModel.Advertisers = advertisers
                                                       .DistinctBy(o => new { o.Identifier, o.Text })
                                                       .OrderBy(o => o.Text);
            }

            return(campaignFilterGroupModel);
        }