private Party ProcessCommerceParty(AddPartiesResult result, Profile customerProfile, CommerceParty partyToAdd)
        {
            Assert.ArgumentNotNull(partyToAdd, nameof(partyToAdd));
            Assert.ArgumentNotNull(partyToAdd.Name, nameof(partyToAdd.Name));
            Assert.ArgumentNotNull(partyToAdd.ExternalId, nameof(partyToAdd.ExternalId));

            Profile addressProfile = null;
            var     response       = CreateAddressProfile(partyToAdd.ExternalId, ref addressProfile);

            if (!response.Success)
            {
                result.Success = false;
                response.SystemMessages.ToList().ForEach(m => result.SystemMessages.Add(m));
                return(null);
            }

            var requestToCommerceProfile = new TranslateEntityToCommerceAddressProfileRequest(partyToAdd, addressProfile);

            PipelineUtility.RunCommerceConnectPipeline <TranslateEntityToCommerceAddressProfileRequest, CommerceResult>(Constants.Pipelines.TranslateEntityToCommerceAddressProfile, requestToCommerceProfile);

            addressProfile.Update();

            ProfilePropertyListCollection <string> addressList;
            var profileValue = customerProfile[Commerce.Constants.Profile.GeneralInfo.AddressList].Value as object[];

            if (profileValue != null)
            {
                var e = profileValue.Select(i => i.ToString());
                addressList = new ProfilePropertyListCollection <string>(e);
            }
            else
            {
                addressList = new ProfilePropertyListCollection <string>();
            }

            addressList.Add(partyToAdd.ExternalId);
            customerProfile[Commerce.Constants.Profile.GeneralInfo.AddressList].Value = addressList.Cast <object>().ToArray();

            if (partyToAdd.IsPrimary)
            {
                customerProfile[Commerce.Constants.Profile.GeneralInfo.PreferredAddress].Value = partyToAdd.ExternalId;
            }

            customerProfile.Update();

            var newParty        = EntityFactory.Create <CommerceParty>("Party");
            var requestToEntity = new TranslateCommerceAddressProfileToEntityRequest(addressProfile, newParty);

            PipelineUtility.RunCommerceConnectPipeline <TranslateCommerceAddressProfileToEntityRequest, CommerceResult>(Constants.Pipelines.TranslateCommerceAddressProfileToEntity, requestToEntity);

            return(requestToEntity.DestinationParty);
        }
Exemple #2
0
        public override void Process(ServicePipelineArgs args)
        {
            Assert.ArgumentNotNull(args, nameof(args));
            Assert.ArgumentCondition(args.Request is UpdatePartiesRequest, nameof(args.Request), "args.Request is UpdatePartiesRequest");
            Assert.ArgumentCondition(args.Result is CustomerResult, nameof(args.Result), "args.Result is CustomerResult");

            var request = (UpdatePartiesRequest)args.Request;
            var result  = (CustomerResult)args.Result;

            Profile customerProfile = null;
            var     response        = GetCommerceUserProfile(request.CommerceCustomer.ExternalId, ref customerProfile);

            if (!response.Success)
            {
                result.Success = false;
                response.SystemMessages.ToList().ForEach(m => result.SystemMessages.Add(m));
                return;
            }

            var preferredAddress = customerProfile[Commerce.Constants.Profile.GeneralInfo.PreferredAddress].Value as string;

            var profileValue = customerProfile[Commerce.Constants.Profile.GeneralInfo.AddressList].Value as object[];

            if (profileValue == null)
            {
                return;
            }

            var e           = profileValue.Select(i => i.ToString());
            var addressList = new ProfilePropertyListCollection <string>(e);

            foreach (var partyToUpdate in request.Parties)
            {
                Assert.IsTrue(partyToUpdate is CommerceParty, "partyToUpdate is CommerceParty");

                var foundId = addressList.FirstOrDefault(x => x.Equals(partyToUpdate.ExternalId, StringComparison.OrdinalIgnoreCase));
                if (foundId == null)
                {
                    continue;
                }
                Profile commerceAddress = null;
                response = GetCommerceAddressProfile(foundId, ref commerceAddress);
                if (!response.Success)
                {
                    result.Success = false;
                    response.SystemMessages.ToList().ForEach(m => result.SystemMessages.Add(m));
                    return;
                }

                // Check if the IsPrimary address flag has been flipped.
                if (((CommerceParty)partyToUpdate).IsPrimary)
                {
                    customerProfile[Commerce.Constants.Profile.GeneralInfo.PreferredAddress].Value = partyToUpdate.ExternalId;
                    customerProfile.Update();
                }
                else if (!string.IsNullOrWhiteSpace(preferredAddress) && preferredAddress.Equals(partyToUpdate.ExternalId, StringComparison.OrdinalIgnoreCase))
                {
                    customerProfile[Commerce.Constants.Profile.GeneralInfo.PreferredAddress].Value = DBNull.Value;
                    customerProfile.Update();
                }

                var translateToEntityRequest = new TranslateEntityToCommerceAddressProfileRequest((CommerceParty)partyToUpdate, commerceAddress);
                PipelineUtility.RunCommerceConnectPipeline <TranslateEntityToCommerceAddressProfileRequest, CommerceResult>(Constants.Pipelines.TranslateEntityToCommerceAddressProfile, translateToEntityRequest);

                commerceAddress.Update();
            }
        }