summaryrefslogtreecommitdiff
path: root/app/controllers/phone_book_entries_controller.rb
blob: 823d50ee8b44031ab2f1f87e90d9b344e9d8c9d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
class PhoneBookEntriesController < ApplicationController
  load_and_authorize_resource :phone_book
  load_and_authorize_resource :phone_book_entry, :through => :phone_book, :shallow => true

  before_filter :spread_breadcrumbs
    
  def index
    # In case this is a search params[:q] or params[:name] will contain the query.
    #
    @query = params[:q]
    @query ||= params[:name]
    @query = @query.strip if @query
    
    if !@query.blank?
      if @query.match(/^\+?\d+$/) != nil
        # Find by phone number
        phone_book_entries_ids = @phone_book_entries.map{|entry| entry.id}
        @found_phone_numbers = PhoneNumber.
                where(:phone_numberable_type => 'PhoneBookEntry', :phone_numberable_id => phone_book_entries_ids).
                where('number LIKE ?', "#{@query}%")
        @search_result = @phone_book_entries.where(:id => @found_phone_numbers.map{|entry| entry.phone_numberable_id})
      elsif @query.match(/^[\"\'](.*)[\"\']$/) != nil
        # The User searched for =>'example'<= so he wants an EXACT search for that.
        # This is the fasted and most accurate way of searching.
        # The order to search is: last_name, first_name and organization.
        # It stops searching as soon as it finds results.
        #
        @query = $1
        @search_result = @phone_book_entries.where(:last_name => @query)
        @search_result = @phone_book_entries.where(:first_name => @query) if @search_result.count == 0
        @search_result = @phone_book_entries.where(:organization => @query) if @search_result.count == 0
        
        @exact_search = true
      else
        # Search with SQL LIKE
        #
        @search_result = @phone_book_entries.
                              where( '( ( last_name LIKE ? ) OR ( first_name LIKE ? ) OR ( organization LIKE ? ) )',
                              "#{@query}%", "#{@query}%", "#{@query}%" )
                              
        @exact_search = false
      end

      # Let's have a run with our phonetic search.
      #
      phonetic_query = PhoneBookEntry.koelner_phonetik(@query)
      @phonetic_search_result = @phone_book_entries.where(:last_name_phonetic => phonetic_query)
      @phonetic_search_result = @phone_book_entries.where(:first_name_phonetic => phonetic_query) if @phonetic_search_result.count == 0
      @phonetic_search_result = @phone_book_entries.where(:organization_phonetic => phonetic_query) if @phonetic_search_result.count == 0

      if @phonetic_search_result.count == 0
        # Let's try the search with SQL LIKE. Just in case.
        #
        @phonetic_search_result = @phone_book_entries.where( 'last_name_phonetic LIKE ?', "#{phonetic_query}%" )
        @phonetic_search_result = @phone_book_entries.where( 'first_name_phonetic LIKE ?', "#{phonetic_query}%" ) if @phonetic_search_result.count == 0
        @phonetic_search_result = @phone_book_entries.where( 'organization_phonetic LIKE ?', "#{phonetic_query}%" ) if @phonetic_search_result.count == 0
      end
      
      @phonetic_search = true if @phonetic_search_result.count > 0

      @phone_book_entries = @search_result
      
      if @phone_book_entries.count == 0 && @exact_search == false && @phonetic_search
        @phone_book_entries = @phonetic_search_result
      end
    end
    
    # Let's sort the results and do pagination.
    #
    @phone_book_entries = @phone_book_entries.
                          order([ :last_name, :first_name, :organization ]).
                          paginate(
                            :page => @pagination_page_number,
                            :per_page => DEFAULT_PAGINATION_ENTRIES_PER_PAGE
                          )
  end

  def show
  end

  def new
    @phone_book_entry = @phone_book.phone_book_entries.build
    @phone_book_entry.is_male = true
  end

  def create
    @phone_book_entry = @phone_book.phone_book_entries.build( params[:phone_book_entry] )
    if @phone_book_entry.save
      redirect_to phone_book_phone_book_entry_path( @phone_book, @phone_book_entry ), :notice => t('phone_book_entries.controller.successfuly_created', :resource => @phone_book_entry)
    else
      render :new
    end
  end

  def edit
  end

  def update
    if @phone_book_entry.update_attributes(params[:phone_book_entry])
      redirect_to @phone_book_entry, :notice  => t('phone_book_entries.controller.successfuly_updated', :resource => @phone_book_entry)
    else
      render :edit
    end
  end

  def destroy
    @phone_book_entry.destroy
    redirect_to phone_book_entries_url, :notice => t('phone_book_entries.controller.successfuly_destroyed')
  end

  private

  def spread_breadcrumbs
    if @phone_book
      if @phone_book.phone_bookable.class == Tenant
        add_breadcrumb t("phone_books.index.page_title"), tenant_phone_books_path(@phone_book.phone_bookable)
        add_breadcrumb @phone_book, tenant_phone_book_path(@phone_book.phone_bookable, @phone_book)
        add_breadcrumb t("phone_book_entries.index.page_title"), phone_book_phone_book_entries_path(@phone_book)
      end

      if @phone_book.phone_bookable.class == User
        add_breadcrumb t("users.index.page_title"), tenant_users_path(@phone_book.phone_bookable.current_tenant)
        add_breadcrumb @phone_book.phone_bookable, tenant_user_path(@phone_book.phone_bookable.current_tenant, @phone_book.phone_bookable)
        add_breadcrumb t("phone_books.index.page_title"), user_phone_books_path(@phone_book.phone_bookable)
        add_breadcrumb @phone_book, user_phone_book_path(@phone_book.phone_bookable, @phone_book)
        add_breadcrumb t("phone_book_entries.index.page_title"), phone_book_phone_book_entries_path(@phone_book)
      end

      if @phone_book_entry && !@phone_book_entry.new_record?
        add_breadcrumb @phone_book_entry, phone_book_phone_book_entry_path(@phone_book, @phone_book_entry)
      end
    end
  end

end