Beispiel #1
0
        public override bool TryApply(IViewConfiguration configuration, IDataAdapterDependencies dependencies, IDictionary <string, string> customParameters, Fetch fetch)
        {
            if (!IsApplicable(configuration))
            {
                return(false);
            }

            // This should be the ID of the parent opportunity for the opportunity product. If it's
            // null, we can't do any filtering.
            if (configuration.ModalLookupFormReferenceEntityId == null)
            {
                return(false);
            }

            // Filter out non-published products,
            fetch.AddFilter(new Filter
            {
                Conditions = new List <Condition>
                {
                    new Condition("statecode", ConditionOperator.Equal, 0)
                }
            });

            // Use distinct because you can have multiple price list items per product in a price list.
            fetch.Distinct = true;

            // Add the primary ID attribute explicitly because that allows Entity.Id to be set properly
            // when doing a distinct query.
            fetch.Entity.AddAttributes("productid");

            var productPriceLevelFilter = new Filter
            {
                Type       = LogicalOperator.And,
                Conditions = new List <Condition>
                {
                    new Condition(
                        "pricelevelid",
                        ConditionOperator.Equal,
                        // If the opportunity doesn't have a price list, or we fail to get it for some reason, filter
                        // by the empty GUID so that nothing will be returned.
                        GetPriceListId(dependencies, configuration.ModalLookupFormReferenceEntityId.Value).GetValueOrDefault(Guid.Empty))
                }
            };

            // Filter by the selected unit of measure if available,
            string uomIdParameter;
            Guid   uomId;

            if (customParameters != null &&
                customParameters.TryGetValue("uomid", out uomIdParameter) &&
                Guid.TryParse(uomIdParameter, out uomId))
            {
                productPriceLevelFilter.Conditions.Add(new Condition("uomid", ConditionOperator.Equal, uomId));
            }

            // Filter by price list items in parent opporunity price list.
            fetch.AddLink(new Link
            {
                Name          = "productpricelevel",
                FromAttribute = "productid",
                ToAttribute   = "productid",
                Type          = JoinOperator.Inner,
                Filters       = new List <Filter>
                {
                    productPriceLevelFilter
                }
            });

            return(true);
        }
Beispiel #2
0
        /// <summary>
        /// Retrieves the list of Products available to the current user
        /// </summary>
        /// <returns>Product entity collection</returns>
        public List <Guid> GetProducts()
        {
            // If anonymous user, return nothing
            if (this.CurrentUserEntityReference == null)
            {
                return(Enumerable.Empty <Guid>().ToList());
            }

            var productFetch = new Fetch
            {
                Distinct = true,
                Entity   = new FetchEntity
                {
                    Name       = "product",
                    Attributes = new List <FetchAttribute>
                    {
                        new FetchAttribute("productid")
                    },
                    Filters = new List <Filter>()
                }
            };

            var associatedToAccountOrContactFilter = new Filter
            {
                Type       = LogicalOperator.Or,
                Conditions = new List <Condition>(),
                Filters    = new List <Filter>()
            };

            // Get alias generator instance to maintain alias names consistency
            // via postfix incrementation
            var linkEntityAliasGenerator = LinkEntityAliasGenerator.CreateInstance();

            // Retrieve Contact to Product relationships and build Entity Permission links
            var contactToProductRelationshipNamesCollection =
                this.GetDelimitedSiteSettingValueCollection(ContactToProductRelationshipNames, ContactToProductFallbackRelationshipName);
            var contactLink = this.BuildLinksAndFilterChain(
                contactToProductRelationshipNamesCollection, productFetch, associatedToAccountOrContactFilter,
                this.CurrentUserEntityReference, null, OwningCustomerType.Contact, linkEntityAliasGenerator);

            productFetch.AddLink(contactLink);

            if (this.ParentCustomerEntityReference != null && this.ParentCustomerEntityReference.LogicalName == "contact")
            {
                // Retrieve parent Contact to Product relationships and build Entity Permission links
                var parentContactLink = this.BuildLinksAndFilterChain(
                    contactToProductRelationshipNamesCollection, productFetch, associatedToAccountOrContactFilter,
                    this.ParentCustomerEntityReference, null, OwningCustomerType.Contact, linkEntityAliasGenerator);
                productFetch.AddLink(parentContactLink);
            }
            else if (this.ParentCustomerEntityReference != null && this.ParentCustomerEntityReference.LogicalName == "account")
            {
                // Retrieve Account to Product relationships and build Entity Permission links
                var accountToProductRelationshipNamesCollection =
                    this.GetDelimitedSiteSettingValueCollection(AccountToProductRelationshipNames, AccountToProductFallbackRelationshipName);
                var accountLink = this.BuildLinksAndFilterChain(
                    accountToProductRelationshipNamesCollection, productFetch, associatedToAccountOrContactFilter,
                    null, this.ParentCustomerEntityReference, OwningCustomerType.Account, linkEntityAliasGenerator);
                productFetch.AddLink(accountLink);
            }

            var accountOrContactNotNullFilter = new Filter
            {
                Type       = LogicalOperator.Or,
                Conditions =
                    associatedToAccountOrContactFilter.Conditions.Select(
                        condition =>
                        new Condition
                {
                    EntityName = condition.EntityName,
                    Attribute  = condition.Attribute,
                    Operator   = ConditionOperator.NotNull
                }).ToList()
            };

            // This is the AND Filter that will ensure state is Active and the Product is joined to either Contact or Account
            productFetch.AddFilter(new Filter
            {
                Type       = LogicalOperator.And,
                Conditions = new List <Condition>
                {
                    new Condition("statecode", ConditionOperator.Equal, 0)
                },
                Filters = new List <Filter>
                {
                    accountOrContactNotNullFilter,
                    associatedToAccountOrContactFilter,
                }
            });

            var productsCollection = productFetch.Execute(this.Portal.ServiceContext as IOrganizationService);

            return(productsCollection.Entities.Select(x => x.Id).ToList());
        }