module Constituents def get_constituent_snapshot(id, options = {}) options.merge!(basic_auth: @auth, headers: @headers) response = self.class.get(base_api_endpoint("CRM/Constituents/#{id}/Snapshot"), options) JSON.parse(response.body) end def create_constituent_by_snapshot(first_name, last_name, email, phone, constituent_type, source, street1, street2, city, state, zip, country, options = {}) parameters = { 'ConstituentType': { 'Id': constituent_type, 'Inactive': false, }, 'FirstName': first_name, 'LastName': last_name, 'ElectronicAddress': { 'Address': email, 'ElectronicAddressType': { 'Id': 1, }, 'AllowHtmlFormat': true, 'Inactive': false, 'AllowMarketing': false, 'Months': 'YYYYYYYYYYYY', 'PrimaryIndicator': true, }, 'PrimaryPhoneNumbers': [ { 'PhoneNumber': phone, 'PhoneType': { 'Id': 5, }, }, ], 'OriginalSource': { 'Id': source, }, 'Address': { 'AddressType': { 'Id': 3, }, 'City': city, 'PostalCode': zip, 'State': { 'Id': state, }, 'Street1': street1, 'Street2': street2, 'Country': { 'Id': country, }, }, } parameters.delete(:PrimaryPhoneNumbers) unless phone.present? options.merge!(basic_auth: @auth, headers: @headers) options.merge!(:body => parameters.to_json) self.class.post(base_api_endpoint('CRM/Constituents/Snapshot'), options) end def create_constituent_by_snapshot_v16(first_name, last_name, email, phone, constituent_type, source, street1, street2, city, state, zip, country, options = {}) parameters = { 'ConstituentType': { 'Id': constituent_type, }, 'FirstName': first_name, 'LastName': last_name, 'OriginalSource': { 'Id': source, }, 'PrimaryAddress': { 'AddressType': { 'Id': 3, }, 'City': city, 'PostalCode': zip, 'State': { 'Id': state, }, 'Street1': street1, 'Street2': street2, 'Country': { 'Id': country, }, }, 'PrimaryElectronicAddress': { 'Address': email, 'ElectronicAddressType': { 'Id': 1, }, 'AllowHtmlFormat': true, 'Inactive': false, 'AllowMarketing': false, 'Months': 'YYYYYYYYYYYY', 'PrimaryIndicator': true, 'PrimaryPhone': { 'PhoneNumber': phone, 'PhoneType': { 'Id': 5, }, }, }, } options.merge!(basic_auth: @auth, headers: @headers) options.merge!(:body => parameters.to_json) self.class.post(base_api_endpoint('CRM/Constituents/Snapshot'), options) end def update_constituent(constituent_id, params, options = {}) current = get_constituent_snapshot(constituent_id) if is_household?(current) update_household(params, current) else parameters = { 'ConstituentType': { 'Id': current['ConstituentType']['Id'], 'Inactive': false, }, 'Id': constituent_id, 'UpdatedDateTime': current['UpdatedDateTime'], 'FirstName': params[:first_name], 'LastName': params[:last_name], 'MiddleName': params[:middle_name], 'SortName': current['SortName'], 'Prefix': { 'Id': params[:prefix], 'Inactive': false, }, 'Suffix': { 'Id': params[:suffix], 'Inactive': false, }, 'OriginalSource': { 'Id': current['OriginalSource']['Id'], 'Inactive': false, }, } parameters.delete(:Prefix) unless params[:prefix].present? parameters.delete(:Suffix) unless params[:suffix].present? options.merge!(basic_auth: @auth, headers: @headers) options.merge!(:body => parameters.to_json) self.class.put(base_api_endpoint("CRM/Constituents/#{constituent_id}"), options) end end def is_household?(snapshot) snapshot['ConstituentType']['Id'] == 9 end def update_household(params, current, options = {}) constituents = current['Affiliates'].map { |c| c['RelatedConstituentId'] } update = [] constituents.each_with_index do |constituent, i| snapshot = get_constituent_snapshot(constituent) parameters = { 'ConstituentType': { 'Id': snapshot['ConstituentType']['Id'], 'Inactive': false, }, 'Id': constituent, 'FirstName': i == 0 ? params[:first_name] : params[:first_name_2], 'UpdatedDateTime': snapshot['UpdatedDateTime'], 'LastName': i == 0 ? params[:last_name] : params[:last_name_2], 'MiddleName': i == 0 ? params[:middle_name] : params[:middle_name_2], 'Prefix': { 'Id': i == 0 ? params[:prefix] : params[:prefix_2], 'Inactive': false, }, 'Suffix': { 'Id': i == 0 ? params[:suffix] : params[:suffix_2], 'Inactive': false, }, 'OriginalSource': { 'Id': snapshot['OriginalSource']['Id'], 'Inactive': false, }, } options.merge!(basic_auth: @auth, headers: @headers) options.merge!(:body => parameters.to_json) update << self.class.put(base_api_endpoint("CRM/Constituents/#{constituent}"), options) end update.last if update.present? end end