e9_crm 0.1.26 → 0.1.27

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/app/controllers/e9_crm/base_controller.rb +1 -1
  2. data/app/controllers/e9_crm/campaigns_controller.rb +1 -1
  3. data/app/controllers/e9_crm/leads_controller.rb +0 -1
  4. data/app/controllers/e9_crm/page_views_controller.rb +57 -8
  5. data/app/controllers/e9_crm/resources_controller.rb +1 -0
  6. data/app/controllers/e9_crm/visits_controller.rb +60 -0
  7. data/app/helpers/e9_crm/contacts_helper.rb +2 -9
  8. data/app/helpers/e9_crm/page_views_helper.rb +45 -0
  9. data/app/models/campaign.rb +23 -23
  10. data/app/models/contact.rb +17 -4
  11. data/app/models/page_view.rb +3 -20
  12. data/app/models/tracking_cookie.rb +16 -0
  13. data/app/views/e9_crm/affiliate_campaigns/_form_inner.html.haml +2 -1
  14. data/app/views/e9_crm/campaigns/_reports_table.html.haml +3 -3
  15. data/app/views/e9_crm/campaigns/_table.html.haml +1 -1
  16. data/app/views/e9_crm/campaigns/reports.js.erb +1 -1
  17. data/app/views/e9_crm/contacts/_sidebar_email_form.html.haml +7 -5
  18. data/app/views/e9_crm/contacts/index.html.haml +1 -1
  19. data/app/views/e9_crm/contacts/show.html.haml +1 -0
  20. data/app/views/e9_crm/dated_costs/index.html.haml +1 -3
  21. data/app/views/e9_crm/deals/_leads_table.html.haml +3 -0
  22. data/app/views/e9_crm/deals/_table.html.haml +3 -0
  23. data/app/views/e9_crm/deals/leads.js.erb +1 -1
  24. data/app/views/e9_crm/deals/show.html.haml +14 -5
  25. data/app/views/e9_crm/page_views/_header.html.haml +15 -0
  26. data/app/views/e9_crm/page_views/_table.html.haml +6 -6
  27. data/app/views/e9_crm/resources/index.html.haml +0 -3
  28. data/app/views/e9_crm/resources/index.js.erb +1 -1
  29. data/app/views/e9_crm/sales_campaigns/_form_inner.html.haml +2 -1
  30. data/app/views/e9_crm/visits/_header.html.haml +3 -0
  31. data/app/views/e9_crm/visits/_table.html.haml +27 -0
  32. data/config/locales/e9.en.yml +19 -12
  33. data/config/routes.rb +8 -16
  34. data/e9_crm.gemspec +0 -8
  35. data/lib/e9_crm/controller.rb +27 -12
  36. data/lib/e9_crm/model.rb +6 -5
  37. data/lib/e9_crm/rack/email_campaign_auto_completer.rb +29 -0
  38. data/lib/e9_crm/rails_extensions.rb +0 -33
  39. data/lib/e9_crm/tracking_controller.rb +3 -5
  40. data/lib/e9_crm/version.rb +1 -1
  41. data/lib/e9_crm.rb +7 -5
  42. metadata +48 -165
  43. data/app/controllers/e9_crm/email_templates.controller.rb +0 -46
  44. data/app/models/email_template.rb +0 -27
  45. data/app/views/e9_crm/email_templates/_form_inner.html.haml +0 -12
  46. data/app/views/e9_crm/email_templates/_header.html.haml +0 -7
  47. data/app/views/e9_crm/email_templates/select.html.haml +0 -5
  48. data/lib/e9_crm/email.rb +0 -18
@@ -9,6 +9,3 @@
9
9
  - else
10
10
  %div#records_table
11
11
  = render 'table', :resources => collection
12
-
13
- - if controller.send(:should_paginate_index)
14
- = will_paginate collection
@@ -1 +1 @@
1
- $("table.records").replaceWith("<%= escape_javascript(render('table', :collection => collection)) %>");
1
+ $("#records_table").html("<%= escape_javascript(render('table', :collection => collection)) %>");
@@ -4,8 +4,9 @@
4
4
  %legend= e9_t(:salesperson_information_legend, :scope => 'e9_crm.campaigns')
5
5
  .field
6
6
  = f.label :sales_person, :class => :req, :for => 'campaign_sales_person_id'
7
- %input.contact-autocomplete{:type => 'text'}
7
+
8
8
  - contact = f.object.sales_person
9
+ %input.contact-autocomplete{:type => 'text', :style => contact.blank? && '' || 'display:none'}
9
10
  .contact-select{:style => contact.blank? && 'display:none' || ''}
10
11
  %span.content= contact.try(:name)
11
12
  %input{:type => :hidden, :name => "#{resource_instance_name}[sales_person_id]", :value => contact.try(:id)}
@@ -0,0 +1,3 @@
1
+ .toolbar
2
+ .toolbar-right
3
+ = link_to 'View All Activity', page_views_url(:campaign => parent.id)
@@ -0,0 +1,27 @@
1
+ %table.records
2
+ %thead
3
+ %tr
4
+ %th= orderable_column_link(:contact_name, :contact)
5
+ %th= orderable_column_link(:new_visits)
6
+ %th= orderable_column_link(:repeat_visits)
7
+ %th= t(:actions)
8
+ %tbody
9
+ - if collection.empty?
10
+ %tr
11
+ %td{:colspan => 5}= e9_t(:no_records_text)
12
+ - else
13
+ - collection.each do |record|
14
+ %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
15
+ %td.record-contact-name
16
+ = record.contact_name
17
+ %td.record-new-visits.num
18
+ = record.new_visits.to_i
19
+ %td.record-repeat-visits.num
20
+ = record.repeat_visits.to_i
21
+ %td.links
22
+ - if record.contact_id
23
+ = link_to "View Contact", contact_url(record.contact_id)
24
+ = link_to "View Contact's Activity", page_views_url(:contact => record.contact_id, :campaign => parent.id)
25
+
26
+ - if controller.send(:should_paginate_index)
27
+ = will_paginate collection
@@ -7,6 +7,18 @@ en:
7
7
  new_title: "New %{model}"
8
8
  actions: Actions
9
9
 
10
+ campaigns:
11
+ no_campaign: No Campaign
12
+ no_group: No Group
13
+ campaign_information_legend: Campaign Information
14
+ salesperson_information_legend: Salesperson Information
15
+ affiliate_information_legend: Affiliate Information
16
+ contact_emails:
17
+ prepare_title: Edit Your Template
18
+ send_email: Send Email
19
+ contact_merges:
20
+ new_title: Merge Contacts
21
+ no_value: (No Value)
10
22
  contacts:
11
23
  index_title_with_search: "%{models} matching \"%{search}\""
12
24
  index_title_with_tags: "%{models} tagged \"%{tagged}\""
@@ -22,12 +34,6 @@ en:
22
34
  email_actions_legend: Email Actions
23
35
  search_options_legend: Search Filters
24
36
  edit_title_with_name: "Edit %{contact}"
25
- contact_merges:
26
- new_title: Merge Contacts
27
- no_value: (No Value)
28
- contact_emails:
29
- prepare_title: Edit Your Template
30
- send_email: Send Email
31
37
  deals:
32
38
  new_title: Create Deal
33
39
  email_templates:
@@ -35,12 +41,13 @@ en:
35
41
  leads:
36
42
  index_title: Leads
37
43
  no_records_text: No leads exist.
44
+ page_views:
45
+ no_records_text: No activity exists.
46
+ visits:
47
+ no_records_text: No activity exists.
38
48
  reports:
39
49
  index_title: Marketing Report
40
50
  no_records_text: No data exists for those query parameters.
41
- campaigns:
42
- no_campaign: No Campaign
43
- no_group: No Group
44
- campaign_information_legend: Campaign Information
45
- salesperson_information_legend: Salesperson Information
46
- affiliate_information_legend: Affiliate Information
51
+ visits:
52
+ breadcrumb_title: Campaign Activity
53
+ index_title: "Campaign: %{parent}"
data/config/routes.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  Rails.application.routes.draw do
2
2
  crm_path = 'admin/crm'
3
3
 
4
- get '/autocomplete/contacts' => E9Crm::Rack::ContactAutoCompleter
5
- get '/autocomplete/companies' => E9Crm::Rack::CompanyAutoCompleter
6
- get '/users/email_test.json' => E9Crm::Rack::EmailAvailabilityChecker
4
+ get '/autocomplete/contacts' => E9Crm::Rack::ContactAutoCompleter
5
+ get '/autocomplete/companies' => E9Crm::Rack::CompanyAutoCompleter
6
+ get '/autocomplete/email_campaigns' => E9Crm::Rack::EmailCampaignAutoCompleter
7
+ get '/users/email_test.json' => E9Crm::Rack::EmailAvailabilityChecker
7
8
 
8
9
  scope :module => :e9_crm do
9
10
  resources :offers, :as => :public_offer, :only => :show do
@@ -18,9 +19,6 @@ Rails.application.routes.draw do
18
19
 
19
20
  resources :companies, :except => :show
20
21
  resources :contacts do
21
- # page_views currently not routed, but near working
22
- #resources :page_views, :path => 'activity', :only => :index
23
-
24
22
  collection { get :templates }
25
23
  member do
26
24
  post :upload_avatar
@@ -28,13 +26,9 @@ Rails.application.routes.draw do
28
26
  end
29
27
  end
30
28
 
31
- resources :deals
29
+ resources :page_views, :path => 'activity', :only => :index
32
30
 
33
- # contact_emails are generated by email templates, and end up in the sent emails list
34
- resources :contact_emails, :except => [:index, :show]
35
- resources :email_templates do
36
- collection { get :select }
37
- end
31
+ resources :deals
38
32
 
39
33
  resources :dated_costs, :path => 'advertising_costs', :only => [:index] do
40
34
  collection do
@@ -43,11 +37,10 @@ Rails.application.routes.draw do
43
37
  end
44
38
 
45
39
  resources :campaigns, :only => [:index, :destroy, :new] do
46
- # page_views currently not routed, but near working
47
- #resources :page_views, :path => 'activity', :only => :index
40
+ resources :visits, :path => 'activity', :only => :index
48
41
  end
49
42
  scope :path => :campaigns do
50
- #get '/activity', :to => redirect("/#{crm_path}/campaigns/all/activity")
43
+
51
44
  resources :campaign_groups, :path => 'groups', :except => [:show]
52
45
 
53
46
  resources :sales_campaigns, :path => 'sales', :except => [:show, :index]
@@ -79,7 +72,6 @@ Rails.application.routes.draw do
79
72
  campaigns/sales
80
73
  campaigns/groups
81
74
  deals
82
- email_templates
83
75
  menu_options
84
76
  offers
85
77
  ).each do |path|
data/e9_crm.gemspec CHANGED
@@ -19,14 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency("rails", "~> 3.0.0")
23
- s.add_dependency("inherited_resources", "~> 1.1.2")
24
- s.add_dependency("has_scope")
25
22
  s.add_dependency("money")
26
- s.add_dependency("e9_rails")
27
- s.add_dependency("e9_tags")
28
- s.add_dependency("e9_attributes")
29
- s.add_dependency("will_paginate")
30
23
  s.add_dependency("kramdown", "~> 0.13")
31
- s.add_dependency("state_machine", "~> 1.0")
32
24
  end
@@ -9,12 +9,10 @@ module E9Crm
9
9
  included do
10
10
  helper_method :tracking_cookie, :tracking_campaign
11
11
 
12
- prepend_before_filter do
13
- E9Crm.log("E9Crm controller request")
14
- end
15
-
12
+ #
13
+ # monkey patch liquid_env to insert campaign
14
+ #
16
15
  alias :liquid_env_without_crm :liquid_env
17
-
18
16
  def liquid_env
19
17
  liquid_env_without_crm.tap do |env|
20
18
  env[:campaign] = tracking_campaign
@@ -37,6 +35,14 @@ module E9Crm
37
35
  end
38
36
  end
39
37
 
38
+ def _user_from_params
39
+ if user_id = params.delete(E9Crm.query_user_id)
40
+ @_user_from_params = User.find_by_id(user_id)
41
+ end
42
+
43
+ @_user_from_params
44
+ end
45
+
40
46
  #
41
47
  # Loads or installs the tracking cookie
42
48
  #
@@ -44,7 +50,7 @@ module E9Crm
44
50
  @_tracking_cookie ||= begin
45
51
  E9Crm.log "Begin load or install cookie: cookie_name[#{E9Crm.cookie_name}] query_param[#{E9Crm.query_param}]"
46
52
 
47
- code = params.delete(E9Crm.query_param)
53
+ code = params.delete(E9Crm.query_param)
48
54
 
49
55
  if hid = cookies[E9Crm.cookie_name]
50
56
  E9Crm.log("Installed cookie found: hid(#{hid})")
@@ -66,9 +72,14 @@ module E9Crm
66
72
  else
67
73
  attrs = {}
68
74
 
69
- if current_user && @_tracking_cookie.user_id.nil?
70
- E9Crm.log("Cookie has no user, setting as current_user (#{current_user.id})")
71
- attrs[:user] = current_user
75
+ if @_tracking_cookie.user_id.nil?
76
+ if current_user
77
+ E9Crm.log("Cookie has no user, setting as current_user (#{current_user.id})")
78
+ attrs[:user] = current_user
79
+ elsif _user_from_params
80
+ E9Crm.log("Cookie has no user, setting as user from params (#{_user_from_params.id})")
81
+ attrs[:user] = _user_from_params
82
+ end
72
83
  end
73
84
 
74
85
  if code.present? && code != @_tracking_cookie.code && Campaign.find_by_code(code)
@@ -79,15 +90,19 @@ module E9Crm
79
90
  session[:new_visit] = true
80
91
  end
81
92
 
82
- E9Crm.log(attrs.blank? ? "Cookie unchanged, no update" : "Cookie changed, new attrs: #{attrs.inspect}")
83
- @_tracking_cookie.update_attributes(attrs) unless attrs.blank?
93
+ if attrs.blank?
94
+ E9Crm.log "Cookie unchanged, no update"
95
+ else
96
+ E9Crm.log "Cookie changed, new attrs: #{attrs.inspect}"
97
+ @_tracking_cookie.update_attributes(attrs)
98
+ end
84
99
  end
85
100
  end
86
101
 
87
102
  @_tracking_cookie ||= begin
88
103
  session[:new_visit] = true
89
104
 
90
- TrackingCookie.create(:code => code, :user => current_user).tap do |cookie|
105
+ TrackingCookie.create(:code => code, :user => current_user || _user_from_params).tap do |cookie|
91
106
  E9Crm.log "Installing new cookie (#{E9Crm.cookie_name} : #{cookie.hid})"
92
107
  cookies.permanent[E9Crm.cookie_name] = cookie.hid
93
108
  end
data/lib/e9_crm/model.rb CHANGED
@@ -35,11 +35,12 @@ module E9Crm
35
35
  end
36
36
 
37
37
  def create_contact_if_missing!
38
- if contact.blank?
39
- # when creating a contact we should assume we're primary
40
- self.options.primary = true
41
- create_contact(create_contact_parameters)
42
- end
38
+ return true unless contact.blank?
39
+
40
+ # when creating a contact we should assume we're primary
41
+ self.options.primary = true
42
+ build_contact(create_contact_parameters)
43
+ save
43
44
  end
44
45
 
45
46
  protected
@@ -0,0 +1,29 @@
1
+ module E9Crm::Rack
2
+ #
3
+ # Returns contacts and joins their primary user for their email if it exists,
4
+ # and will return a string like "firstname lastname (email)". If for whatever
5
+ # reason the contact has no primary user, it will drop the email.
6
+ #
7
+ class EmailCampaignAutoCompleter
8
+ DEFAULT_LIMIT = 10
9
+
10
+ def self.call(env)
11
+ params = Rack::Request.new(env).params
12
+
13
+ if term = params['term']
14
+ relation = EmailCampaign.
15
+ select('name, code').
16
+ limit(params['limit'] || DEFAULT_LIMIT).
17
+ attr_like(:code, term, :matcher => '%s%%')
18
+
19
+ json = ::ActiveRecord::Base.connection.send(:select, relation.to_sql, 'Email Campaign Autocomplete').map do |row|
20
+ { :label => "#{row['code']} - #{row['name']}", :value => row['code'] }
21
+ end.to_json
22
+ else
23
+ json = []
24
+ end
25
+
26
+ [200, {"Content-Type" => "application/json", "Cache-Control" => "no-cache"}, [json]]
27
+ end
28
+ end
29
+ end
@@ -110,36 +110,3 @@ module ActiveModel
110
110
  end
111
111
  end
112
112
  end
113
-
114
- module E9Crm
115
- #
116
- # Fairly straightforward hack to allow e9_crm views to inherit from resources.
117
- # If a missing template error is raised by a view looking for a template prefixed with
118
- # "e9_crm", redirect the lookup to "e9_crm/resources"
119
- #
120
- # This would be worth looking into further but inherited templates are a feature coming
121
- # up in Rails anyway.
122
- #
123
-
124
- module ActionView
125
- extend ActiveSupport::Concern
126
-
127
- included do
128
- def self.process_view_paths(value)
129
- value.is_a?(::E9Crm::ActionView::PathSet) ?
130
- value.dup : ::E9Crm::ActionView::PathSet.new(Array.wrap(value))
131
- end
132
- end
133
-
134
- class PathSet < ::ActionView::PathSet
135
- def find(path, prefix = nil, partial = false, details = {}, key = nil)
136
- super
137
- rescue ::ActionView::MissingTemplate
138
- raise $! unless prefix =~ /^e9_crm/
139
- super(path, "e9_crm/resources", partial, details, key)
140
- end
141
- end
142
- end
143
- end
144
-
145
- ActionView::Base.send(:include, E9Crm::ActionView)
@@ -3,11 +3,7 @@ module E9Crm
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- before_filter :track_page_view
7
-
8
- prepend_before_filter do
9
- E9Crm.log("E9Crm tracking controller request")
10
- end
6
+ after_filter :track_page_view
11
7
  end
12
8
 
13
9
  protected
@@ -35,6 +31,8 @@ module E9Crm
35
31
  :campaign => tracking_campaign,
36
32
  :new_visit => session[:new_visit].present?
37
33
  })
34
+
35
+ E9Crm.log("Page View: #{@_page_view.inspect}")
38
36
  end
39
37
  end
40
38
  end
@@ -1,3 +1,3 @@
1
1
  module E9Crm
2
- VERSION = '0.1.26'
2
+ VERSION = '0.1.27'
3
3
  end
data/lib/e9_crm.rb CHANGED
@@ -6,14 +6,14 @@ module E9Crm
6
6
  autoload :VERSION, 'e9_crm/version'
7
7
  autoload :Controller, 'e9_crm/controller'
8
8
  autoload :Model, 'e9_crm/model'
9
- autoload :Email, 'e9_crm/email'
10
9
  autoload :TrackingController, 'e9_crm/tracking_controller'
11
10
  autoload :SystemEmailsController, 'e9_crm/system_emails_controller'
12
11
 
13
12
  module Rack
14
- autoload :ContactAutoCompleter, 'e9_crm/rack/contact_auto_completer'
15
- autoload :CompanyAutoCompleter, 'e9_crm/rack/company_auto_completer'
16
- autoload :EmailAvailabilityChecker, 'e9_crm/rack/email_availability_checker'
13
+ autoload :ContactAutoCompleter, 'e9_crm/rack/contact_auto_completer'
14
+ autoload :CompanyAutoCompleter, 'e9_crm/rack/company_auto_completer'
15
+ autoload :EmailCampaignAutoCompleter, 'e9_crm/rack/email_campaign_auto_completer'
16
+ autoload :EmailAvailabilityChecker, 'e9_crm/rack/email_availability_checker'
17
17
  end
18
18
 
19
19
  mattr_accessor :cookie_name
@@ -22,6 +22,9 @@ module E9Crm
22
22
  mattr_accessor :query_param
23
23
  @@query_param = 'code'
24
24
 
25
+ mattr_accessor :query_user_id
26
+ @@query_user_id = 'cuid'
27
+
25
28
  mattr_accessor :log_level
26
29
  @@log_level = :debug
27
30
 
@@ -54,7 +57,6 @@ module E9Crm
54
57
 
55
58
  ApplicationController.send(:include, E9Crm::Controller)
56
59
 
57
- ::Email.send(:include, E9Crm::Email)
58
60
  ::Admin::SystemEmailsController.send(:include, E9Crm::SystemEmailsController)
59
61
 
60
62
  E9Crm.tracking_controllers.each do |controller|