Enhance Customer model with redmine's built in searchable and event capabilities

This commit is contained in:
2026-02-22 13:31:28 -05:00
parent 3514401808
commit 4b45d24a75

View File

@@ -10,6 +10,9 @@
class Customer < ActiveRecord::Base
include Redmine::Acts::Searchable
include Redmine::Acts::Event
has_many :issues
has_many :invoices
has_many :estimates
@@ -18,6 +21,16 @@ class Customer < ActiveRecord::Base
self.primary_key = :id
acts_as_searchable columns: %w[name phone_number mobile_phone_number ],
scope: ->(_context) { left_joins(:project) },
date_column: :updated_at
acts_as_event :title => Proc.new {|o| "#{o}"},
:url => Proc.new {|o| { :controller => 'customers', :action => 'show', :id => o.id} },
:type => :to_s,
:description => Proc.new {|o| "#{I18n.t :label_primary_phone}: #{o.phone_number} #{I18n.t:label_mobile_phone}: #{o.mobile_phone_number}"},
:datetime => Proc.new {|o| o.updated_at || o.created_at}
# Convenience Method
# returns the customer's email
def email
@@ -41,22 +54,6 @@ class Customer < ActiveRecord::Base
:customer
end
def event_title
to_s
end
def event_description
"#{I18n.t :label_primary_phone}: #{primary_phone} #{I18n.t:label_mobile_phone}: #{mobile_phone}"
end
def event_url
Rails.application.routes.url_helpers.customer_path(self)
end
def event_datetime
updated_at || created_at
end
# Convenience Method
# returns the customer's primary phone
def primary_phone
@@ -79,7 +76,8 @@ class Customer < ActiveRecord::Base
update_phone_number
end
# Customers are not bound by a project.
# Customers are not bound by a project
# but we need to implement this method for the Redmine::Acts::Searchable interface
def project
nil
end
@@ -188,32 +186,7 @@ class Customer < ActiveRecord::Base
end
end
# Searchs the database for a customer by name or phone number with out special chars
def self.search(search)
search = sanitize_sql_like(search)
customers = where("name LIKE ? OR phone_number LIKE ? OR mobile_phone_number LIKE ?", "%#{search}%", "%#{search}%", "%#{search}%")
return customers.order(:name)
end
def self.searchable_columns
['name', 'phone_number', 'mobile_phone_number']
end
def self.searchable_options
{
columns: searchable_columns,
scope: self.all
}
end
def self.search_results_from_ids(ids, *args)
return [] if ids.blank?
ids = ids.map(&:to_i)
records = where(id: ids).index_by(&:id)
ids.map { |id| records[id] }.compact
end
# Override the defult redmine seach method to rank results by id
def self.search_result_ranks_and_ids(tokens, user, project = nil, options = {})
return {} if tokens.blank?