Class: Spree::Address
- Inherits:
-
Object
- Object
- Spree::Address
- Includes:
- Metadata, Security::Addresses, Webhooks::HasWebhooks
- Defined in:
- app/models/spree/address.rb
Constant Summary collapse
- STATES_REQUIRED =
The required states listed below match those used by PayPal and Shopify.
[ 'AU', 'AE', 'BR', 'CA', 'CN', 'ES', 'HK', 'IE', 'IN', 'IT', 'MY', 'MX', 'NZ', 'PT', 'RO', 'TH', 'US', 'ZA' ].freeze
- ADDRESS_FIELDS =
we’re not freezing this on purpose so developers can extend and manage those attributes depending of the logic of their applications
%w(firstname lastname company address1 address2 city state zipcode country phone)
- EXCLUDED_KEYS_FOR_COMPARISON =
%w(id updated_at created_at deleted_at label user_id public_metadata private_metadata)
- FIELDS_TO_NORMALIZE =
%w(firstname lastname phone alternative_phone company address1 address2 city zipcode)
Class Method Summary collapse
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#active_merchant_hash ⇒ Object
Generates an ActiveMerchant compatible address hash.
- #address_validators ⇒ Object
- #async_geocode ⇒ Object
- #can_be_deleted? ⇒ Boolean
- #check ⇒ Object
- #clone ⇒ Object
- #destroy ⇒ Object
- #editable? ⇒ Boolean
- #empty? ⇒ Boolean
- #first_name ⇒ Object
- #first_name=(value) ⇒ Object
- #full_name ⇒ Object
- #geocoder_address ⇒ Object
- #last_name ⇒ Object
- #last_name=(value) ⇒ Object
- #require_company? ⇒ Boolean
- #require_name? ⇒ Boolean
- #require_phone? ⇒ Boolean
- #require_street? ⇒ Boolean
- #require_zipcode? ⇒ Boolean
- #show_company_address_field? ⇒ Boolean
- #state_name_text ⇒ Object
- #state_text ⇒ Object
- #street ⇒ Object
- #to_s ⇒ Object
- #user_default_billing? ⇒ Boolean
- #user_default_shipping? ⇒ Boolean
- #value_attributes ⇒ Object
Class Method Details
Instance Method Details
#==(other) ⇒ Object
151 152 153 154 155 |
# File 'app/models/spree/address.rb', line 151 def ==(other) return false unless other&.respond_to?(:value_attributes) value_attributes == other.value_attributes end |
#active_merchant_hash ⇒ Object
Generates an ActiveMerchant compatible address hash
166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'app/models/spree/address.rb', line 166 def active_merchant_hash { name: full_name, address1: address1, address2: address2, city: city, state: state_text, zip: zipcode, country: country.try(:iso), phone: phone } end |
#address_validators ⇒ Object
76 77 78 79 80 |
# File 'app/models/spree/address.rb', line 76 def address_validators Rails.application.config.spree.validators.addresses.each do |validator| validates_with validator end end |
#async_geocode ⇒ Object
227 228 229 |
# File 'app/models/spree/address.rb', line 227 def async_geocode Spree::Addresses::GeocodeAddressJob.perform_later(id) if should_geocode? end |
#can_be_deleted? ⇒ Boolean
207 208 209 |
# File 'app/models/spree/address.rb', line 207 def can_be_deleted? shipments.empty? && Order.complete.where('bill_address_id = ? OR ship_address_id = ?', id, id).none? end |
#check ⇒ Object
211 212 213 214 215 |
# File 'app/models/spree/address.rb', line 211 def check attrs = attributes.except('id', 'updated_at', 'created_at') the_same_address = user&.addresses&.find_by(attrs) the_same_address || self end |
#clone ⇒ Object
147 148 149 |
# File 'app/models/spree/address.rb', line 147 def clone self.class.new(value_attributes) end |
#destroy ⇒ Object
217 218 219 220 221 222 223 224 225 |
# File 'app/models/spree/address.rb', line 217 def destroy assign_new_default_address_to_user if can_be_deleted? super else update_column :deleted_at, Time.current end end |
#editable? ⇒ Boolean
203 204 205 |
# File 'app/models/spree/address.rb', line 203 def editable? new_record? || Order.complete.where('bill_address_id = ? OR ship_address_id = ?', id, id).none? end |
#empty? ⇒ Boolean
161 162 163 |
# File 'app/models/spree/address.rb', line 161 def empty? attributes.except('id', 'created_at', 'updated_at', 'country_id').all? { |_, v| v.nil? } end |
#first_name ⇒ Object
104 105 106 |
# File 'app/models/spree/address.rb', line 104 def first_name firstname end |
#first_name=(value) ⇒ Object
108 109 110 |
# File 'app/models/spree/address.rb', line 108 def first_name=(value) self.firstname = value end |
#full_name ⇒ Object
120 121 122 |
# File 'app/models/spree/address.rb', line 120 def full_name "#{firstname} #{lastname}".strip end |
#geocoder_address ⇒ Object
231 232 233 |
# File 'app/models/spree/address.rb', line 231 def geocoder_address @geocoder_address ||= [street, city, state_text, country.to_s].compact.map(&:strip).join(', ') end |
#last_name ⇒ Object
112 113 114 |
# File 'app/models/spree/address.rb', line 112 def last_name lastname end |
#last_name=(value) ⇒ Object
116 117 118 |
# File 'app/models/spree/address.rb', line 116 def last_name=(value) self.lastname = value end |
#require_company? ⇒ Boolean
191 192 193 |
# File 'app/models/spree/address.rb', line 191 def require_company? false end |
#require_name? ⇒ Boolean
187 188 189 |
# File 'app/models/spree/address.rb', line 187 def require_name? !quick_checkout end |
#require_phone? ⇒ Boolean
179 180 181 |
# File 'app/models/spree/address.rb', line 179 def require_phone? Spree::Config[:address_requires_phone] end |
#require_street? ⇒ Boolean
195 196 197 |
# File 'app/models/spree/address.rb', line 195 def require_street? !quick_checkout end |
#require_zipcode? ⇒ Boolean
183 184 185 |
# File 'app/models/spree/address.rb', line 183 def require_zipcode? !quick_checkout && (country ? country.zipcode_required? : true) end |
#show_company_address_field? ⇒ Boolean
199 200 201 |
# File 'app/models/spree/address.rb', line 199 def show_company_address_field? Spree::Store.current.prefers_company_field_enabled? end |
#state_name_text ⇒ Object
128 129 130 |
# File 'app/models/spree/address.rb', line 128 def state_name_text state_name.present? ? state_name : state&.name end |
#state_text ⇒ Object
124 125 126 |
# File 'app/models/spree/address.rb', line 124 def state_text state.try(:abbr) || state.try(:name) || state_name end |
#street ⇒ Object
132 133 134 |
# File 'app/models/spree/address.rb', line 132 def street [address1, address2].join(' ') end |
#to_s ⇒ Object
136 137 138 139 140 141 142 143 144 145 |
# File 'app/models/spree/address.rb', line 136 def to_s [ full_name, company, address1, address2, "#{city}, #{state_text} #{zipcode}", country.to_s ].reject(&:blank?).map { |attribute| ERB::Util.html_escape(attribute) }.join('<br/>') end |
#user_default_billing? ⇒ Boolean
96 97 98 |
# File 'app/models/spree/address.rb', line 96 def user_default_billing? user.present? && id == user.bill_address_id end |
#user_default_shipping? ⇒ Boolean
100 101 102 |
# File 'app/models/spree/address.rb', line 100 def user_default_shipping? user.present? && id == user.ship_address_id end |
#value_attributes ⇒ Object
157 158 159 |
# File 'app/models/spree/address.rb', line 157 def value_attributes attributes.except(*EXCLUDED_KEYS_FOR_COMPARISON) end |