Esempio n. 1
0
        public override void Process(ServicePipelineArgs args)
        {
            Assert.ArgumentNotNull(args, nameof(args));
            Assert.ArgumentCondition(args.Request is RemovePartiesRequest, nameof(args.Request), "args.Request is RemovePartiesRequest");
            Assert.ArgumentCondition(args.Result is CustomerResult, nameof(args.Result), "args.Result is CustomerResult");

            var request = (RemovePartiesRequest)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 partyToRemove in request.Parties)
            {
                var foundId = addressList.FirstOrDefault(x => x.Equals(partyToRemove.ExternalId, StringComparison.OrdinalIgnoreCase));
                if (foundId == null)
                {
                    continue;
                }

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

                addressList.Remove(foundId);

                if (!addressList.Any())
                {
                    customerProfile[Commerce.Constants.Profile.GeneralInfo.AddressList].Value = DBNull.Value;
                }
                else
                {
                    customerProfile[Commerce.Constants.Profile.GeneralInfo.AddressList].Value = addressList.Cast <object>().ToArray();
                }

                // Prefered address check. If the address being deleted was the preferred address we must clear it from the customer profile.
                if (!string.IsNullOrWhiteSpace(preferredAddress) && preferredAddress.Equals(partyToRemove.ExternalId, StringComparison.OrdinalIgnoreCase))
                {
                    customerProfile[Commerce.Constants.Profile.GeneralInfo.PreferredAddress].Value = DBNull.Value;
                }

                customerProfile.Update();
            }
        }