fairmondo/fairmondo

View on GitHub
app/models/address.rb

Summary

Maintainability
A
25 mins
Test Coverage
#   Copyright (c) 2012-2017, Fairmondo eG.  This file is
#   licensed under the GNU Affero General Public License version 3 or later.
#   See the COPYRIGHT file for details.

class Address < ApplicationRecord
  belongs_to :user
  has_one :connected_user, class_name: 'User', foreign_key: :standard_address_id, inverse_of: :standard_address

  has_many :payment_address_references, class_name: 'LineItemGroup', foreign_key: :payment_address_id, inverse_of: :payment_address
  has_many :transport_address_references, class_name: 'LineItemGroup', foreign_key: :transport_address_id, inverse_of: :transport_address

  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :address_line_1, presence: true, format: /\A.+\d+.*\z/ # format: ensure digit for house number
  validates :address_line_2, length: { maximum: 150 }
  validates :zip, presence: true, zip: true, length: { maximum: 5 }
  validates :city, presence: true, length: { maximum: 150 }
  validates :country, presence: true, length: { maximum: 150 }

  extend Sanitization

  auto_sanitize :title, :first_name, :last_name, :address_line_1, :address_line_2, :zip, :city, :country

  amoeba do
    enable
    exclude_association :payment_address_references
    exclude_association :transport_address_references
    exclude_association :connected_user
  end

  attr_accessor :set_as_standard_address

  # if the record is referenced somewhere we need to
  # duplicate and stash it
  def duplicate_if_referenced!
    if self.changed_attributes.any? && self.is_referenced?
      new_address = self.amoeba_dup
      new_address.set_as_standard_address = true if self.is_standard_address?
      self.stash!
      return new_address
    end
    return self
  end

  def stash!
    self.update_column(:stashed, true)
  end

  def is_referenced?
    self.payment_address_references.any? || self.transport_address_references.any?
  end

  def is_standard_address?
    connected_user.present?
  end

  def to_s
    company_part = company_name.present? ? "#{company_name}, " : ''
    title_part = title.present? ? "#{title} " : ''
    address_line_2_part = address_line_2.present? ? "#{address_line_2}, " : ''

    "#{company_part}#{title_part}#{first_name} #{last_name}, #{address_line_1}, "\
    "#{address_line_2_part}#{zip} #{city}, #{country}"
  end
end