private static SaveUpdateResponseModel createContactResponseModel(CreateCrmContactResponse contactBase, InvoiceCRMConatactModel contact)
        {
            var response = new SaveUpdateResponseModel();

            response.Data = contact;
            if (contactBase.ContactID != null && contactBase.Contact != null)
            {
                var crmContact = contactBase.Contact as CrmContact;
                if (crmContact != null)
                {
                    response.Data.ContactId = string.IsNullOrEmpty(crmContact.ContactId) ? 0 : int.Parse(crmContact.ContactId);

                    if (crmContact.Addresses != null && crmContact.Addresses.Count > 0)
                    {
                        response.Data.Address.Id = string.IsNullOrEmpty((crmContact.Addresses.First() as ContactAddress).AddressId) ? 0 : int.Parse((crmContact.Addresses.First() as ContactAddress).AddressId);
                    }
                    if (crmContact.EmailAddresses != null && crmContact.EmailAddresses.Count > 0)
                    {
                        response.Data.EmailDetail.Id = string.IsNullOrEmpty((crmContact.EmailAddresses.First() as ContactEmailAddress).EmailId) ? 0 : int.Parse((crmContact.EmailAddresses.First() as ContactEmailAddress).EmailId);
                    }
                    if (crmContact.Phones != null && crmContact.Phones.Count > 0)
                    {
                        response.Data.PhoneDetail.Id = string.IsNullOrEmpty((crmContact.Phones.First() as CrmContactPhone).Id) ? 0 : int.Parse((crmContact.Phones.First() as CrmContactPhone).Id);
                    }
                }
            }
            else
            {
                response.DuplicatedContacts = (from c in contactBase.DuplicateContacts
                                               select new InvoiceCRMConatactModel
                {
                    ContactId = c.ContactId != null ? int.Parse(c.ContactId) : 0,
                    FirstName = (c as CrmContact).Name != null ? (c as CrmContact).Name.First : "",
                    LastName = (c as CrmContact).Name != null ? (c as CrmContact).Name.Last : "",
                    Address = ConvertToAddressViewModel((c as CrmContact).Addresses != null ? (c as CrmContact).Addresses.FirstOrDefault() : new Address_V03()) == null ? new InvoiceAddressModel() : ConvertToAddressViewModel((c as CrmContact).Addresses != null ? (c as CrmContact).Addresses.FirstOrDefault() : new Address_V03()),
                    PhoneDetail = new InvoicePhoneDetail()
                    {
                        Id = (c as CrmContact).Phones != null ? int.Parse((c as CrmContact).Phones.FirstOrDefault().Id) : 0,
                    },
                }).ToList();
            }
            return(response);
        }
        private static SaveUpdateResponseModel Create(InvoiceCRMConatactModel contact, string memberId)
        {
            var proxy = ServiceClientProvider.GetCRMContactServiceProxy();

            try
            {
                var createCrmContactRequest = new CreateCrmContactRequest();
                createCrmContactRequest.OwnerId = memberId;
                createCrmContactRequest.IsContactInformationRequired = true;

                CrmContact crmContact = new CrmContact();
                crmContact.ContactId       = null;
                crmContact.ContactType     = CrmContactType.Customer;
                crmContact.ContactPriority = ContactPriorityType.None;
                crmContact.ContactSource   = ContactSourceType.ECommerce;
                crmContact.ContactStatus   = ContactStatusType.None;
                crmContact.OwnerMemberId   = memberId;

                crmContact.IsDuplicateNameCheckRequired = contact.IsDuplicateCheckRequire;

                crmContact.EmailAddresses = contact.EmailDetail != null && string.IsNullOrEmpty(contact.EmailDetail.EmailAddress) ? null : new List <EmailAddress_V01> {
                    new ContactEmailAddress {
                        EmailId = string.Empty, Address = contact.EmailDetail.EmailAddress, IsPrimary = true
                    }
                };

                crmContact.FollowupAppointments = new List <FollowupAppointment>()
                ;
                crmContact.Addresses = contact.Address == null
                    ? null
                    : new List <Address_V03>()
                {
                    new ContactAddress
                    {
                        AddressId = null,
                        Line1     = contact.Address.Address1,
                        City      = contact.Address.City,
                        Line2     = contact.Address.Address2,
                        StateProvinceTerritory = contact.Address.State,
                        PostalCode             = contact.Address.PostalCode,
                        Country       = contact.Address.Country,
                        IsPrimary     = true,
                        TypeOfAddress = AddressType.ShipTo
                    }
                };

                crmContact.Name = new Name_V01
                {
                    First = contact.FirstName,
                    Last  = contact.LastName,
                };

                crmContact.Phones = contact.PhoneDetail == null || string.IsNullOrEmpty(contact.PhoneDetail.PhoneNumber)
                    ? null
                    : new List <CrmContactPhone>()
                {
                    new CrmContactPhone
                    {
                        Id        = string.Empty,
                        IsPrimary = true,
                        Number    = contact.PhoneDetail.PhoneNumber,
                        PhoneType = CrmContactPhoneType.Mobile
                    }
                };
                createCrmContactRequest.Value = crmContact;

                var circuitBreaker =
                    CircuitBreakerFactory.GetFactory().GetCircuitBreaker <CreateCrmContactResponse>();
                var response = circuitBreaker.Execute(() => proxy.CreateContact(new CreateContactRequest(createCrmContactRequest)).CreateContactResult as CreateCrmContactResponse);


                if (response == null)
                {
                    LoggerHelper.Warn($"Create customer for ds {memberId} failed: response is null.");
                    return(null);
                }
                return(createContactResponseModel(response, contact));
            }
            catch (Exception ex)
            {
                LoggerHelper.Info($"ContactSaver:Create Failed. message: {ex.Message}, exception: {ex}");
                SaveUpdateResponseModel errorModel = new SaveUpdateResponseModel();
                return(errorModel);
            }
            finally
            {
                proxy.Close();
            }
        }