app/models/customer.rb
#encoding: utf-8
class Customer < ActiveRecord::Base
attr_accessible :doc, :doc_rg, :name, :birthday, :name_sec, :address, :state_id, :city_id, :district_id,
:is_customer, :person, :postal, :emails, :complete, :state, :city, :district, :phone,
:fax, :social_link, :site, :enabled, :other_contacts, :notes, :emails_attributes,
:external_key
#attr_protected
before_validation :before_validation_completed
include ActiveDisablable
include StringHelper
default_scope order: "name"
#=========================== associations <--------------------------------------------
belongs_to :person, :polymorphic => true, dependent: :destroy
has_many :tasks, dependent: :destroy, :as => :interested
has_many :emails, :as => :emailable, dependent: :destroy
has_many :contacts, dependent: :destroy
belongs_to :state
belongs_to :city
belongs_to :district
#============================
accepts_nested_attributes_for :emails, :reject_if => lambda { |a| a[:email].blank? }, :allow_destroy => true
#=========================== VALIDATE <------------------------------------------------
VALID_NAME_REGEX = /\A([[[:alpha:]]0-9.,;\s\'\"\-–\/&\*\(\)`´%!\+])+\z/i
validates :doc, :customer_cnpj => true
validates :doc, :presence => true, :uniqueness => true, :if => :doc_needs?
validates :name, :presence => true, length: { maximum: 120 }, format: { with: VALID_NAME_REGEX }, uniqueness: true
validates :address, :presence => true, length: { maximum: 150 }, :if => :complete?
validates :state_id, :presence => true, :if => :complete?
validates :city_id, :presence => true, :if => :complete?
validates :district_id, :presence => true, :if => :complete?
validates :phone, :presence => true, :if => :complete?
# ---> public ----------------------------------------------------------------------
public
##
# The bussinesses done at the time
#
# @return [OpenStruct] The struct containing CompanyBusiness as :business and Last Time of Business Deal as business_at
def businesses
resolution = SystemTaskResolution.RESOLVED_WITH_BUSINESS
businesses = self.tasks.unscoped.joins(:type).select("company_business_id, max(finish_time) AS business_at").where({resolution_id: 4, interested_id: self}).group(:company_business_id)
businesses.collect { |b| OpenStruct.new(business: CompanyBusiness.find(b.company_business_id), business_at: b.business_at) }
end
# -------------------------------------------------------------------------> validates
def self.search_by_name(customers, name)
conditions = []
conditions_and = []
conditions_params = []
if name
name = name.upcase
conditions_and << 'upper(name) LIKE ?'
conditions_params << "%#{name}%"
end
conditions << conditions_and.join(" and ")
conditions_params.each { |p| conditions << p }
if conditions.count>0
logger.debug customers
ret = customers.where(conditions)
else
[]
end
end
def format_address
(self.address ? self.address : "") + ", " + name_or_empty(self.district) + ", " + name_or_empty(self.city) + ", " + name_or_empty(self.state)
end
def doc_needs?
self.complete? || (doc !="" && doc != "0"*11 && doc != "0"*14)
end
def complete?
self.complete
end
def can_complete?
raise "erros not empty" if self.errors.count>0
old_complete = self.complete
self.complete = true;
ret = self.valid?
self.complete = old_complete
self.errors.clear
ret
end
def a_customer?
self.is_customer || (self.businesses.count>0)
end
private
def before_validation_completed
(self.complete = self.can_complete?) if not self.complete
true
end
end