e9_crm 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. data/app/controllers/e9_crm/advertising_campaigns_controller.rb +1 -0
  2. data/app/controllers/e9_crm/affiliate_campaigns_controller.rb +1 -0
  3. data/app/controllers/e9_crm/campaign_groups_controller.rb +8 -0
  4. data/app/controllers/e9_crm/campaigns_controller.rb +38 -1
  5. data/app/controllers/e9_crm/companies_controller.rb +1 -0
  6. data/app/controllers/e9_crm/contact_emails_controller.rb +3 -7
  7. data/app/controllers/e9_crm/contacts_controller.rb +6 -4
  8. data/app/controllers/e9_crm/dated_costs_controller.rb +1 -0
  9. data/app/controllers/e9_crm/deals_controller.rb +66 -2
  10. data/app/controllers/e9_crm/email_campaigns_controller.rb +1 -0
  11. data/app/controllers/e9_crm/email_templates.controller.rb +1 -0
  12. data/app/controllers/e9_crm/offers_controller.rb +1 -0
  13. data/app/controllers/e9_crm/page_views_controller.rb +1 -0
  14. data/app/controllers/e9_crm/resources_controller.rb +2 -1
  15. data/app/controllers/e9_crm/sales_campaigns_controller.rb +1 -0
  16. data/app/helpers/e9_crm/campaign_groups_helper.rb +8 -0
  17. data/app/helpers/e9_crm/campaigns_helper.rb +42 -11
  18. data/app/helpers/e9_crm/contacts_helper.rb +1 -1
  19. data/app/helpers/e9_crm/deals_helper.rb +25 -0
  20. data/app/models/advertising_campaign.rb +0 -1
  21. data/app/models/campaign.rb +40 -8
  22. data/app/models/campaign_group.rb +6 -0
  23. data/app/models/contact.rb +22 -0
  24. data/app/models/contact_email.rb +29 -18
  25. data/app/models/deal.rb +93 -14
  26. data/app/models/no_campaign.rb +5 -0
  27. data/app/models/page_view.rb +13 -44
  28. data/app/models/tracking_cookie.rb +0 -6
  29. data/app/observers/deal_observer.rb +3 -0
  30. data/app/views/e9_crm/advertising_campaigns/_form_inner.html.haml +1 -0
  31. data/app/views/e9_crm/affiliate_campaigns/_form_inner.html.haml +10 -0
  32. data/app/views/e9_crm/campaign_groups/_footer.html.haml +0 -0
  33. data/app/views/e9_crm/campaign_groups/_header.html.haml +3 -0
  34. data/app/views/e9_crm/campaigns/_footer.html.haml +0 -0
  35. data/app/views/e9_crm/campaigns/_form_inner.html.haml +20 -4
  36. data/app/views/e9_crm/campaigns/_header.html.haml +16 -0
  37. data/app/views/e9_crm/campaigns/_reports_table.html.haml +31 -0
  38. data/app/views/e9_crm/campaigns/_table.html.haml +31 -0
  39. data/app/views/e9_crm/campaigns/reports.html.haml +13 -0
  40. data/app/views/e9_crm/contact_emails/_form_inner.html.haml +1 -1
  41. data/app/views/e9_crm/contacts/_header.html.haml +5 -4
  42. data/app/views/e9_crm/deals/_reports_table.html.haml +86 -0
  43. data/app/views/e9_crm/deals/reports.html.haml +19 -0
  44. data/app/views/e9_crm/deals/reports.js.erb +1 -0
  45. data/app/views/e9_crm/email_campaigns/_form_inner.html.haml +1 -0
  46. data/app/views/e9_crm/page_views/_table.html.haml +7 -7
  47. data/app/views/e9_crm/resources/_table.html.haml +1 -1
  48. data/app/views/e9_crm/sales_campaigns/_form_inner.html.haml +11 -0
  49. data/config/locales/e9.en.yml +11 -1
  50. data/config/locales/en.yml +16 -5
  51. data/config/routes.rb +15 -12
  52. data/e9_crm.gemspec +1 -1
  53. data/lib/e9_crm/rails_extensions.rb +7 -0
  54. data/lib/e9_crm/tracking_controller.rb +69 -52
  55. data/lib/e9_crm/version.rb +1 -1
  56. data/lib/generators/e9_crm/install_generator.rb +1 -1
  57. data/lib/generators/e9_crm/templates/{create_e9_crm_tables.rb → migration.rb} +6 -7
  58. metadata +20 -6
  59. data/app/controllers/e9_crm/record_attributes_controller.rb +0 -3
  60. data/app/controllers/e9_crm/reports_controller.rb +0 -2
@@ -0,0 +1,31 @@
1
+ %table.records
2
+ %thead
3
+ %tr
4
+ %th= orderable_column_link(:type)
5
+ %th= orderable_column_link(:name)
6
+ %th= orderable_column_link('campaign_group.name', :campaign_group)
7
+ %th= orderable_column_link(:new_visits)
8
+ %th= orderable_column_link(:repeat_visits)
9
+ %th= orderable_column_link(:deals_count)
10
+ %th= orderable_column_link(:won_deals_count)
11
+ %tbody
12
+ - if collection.empty?
13
+ %tr
14
+ %td{:colspan => 5}= e9_t(:no_records_text)
15
+ - else
16
+ - collection.each do |record|
17
+ %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
18
+ %td.record-type
19
+ = record.type[/(.*)Campaign/, 1]
20
+ %td.record-name
21
+ = record.name
22
+ %td.record-campaign-group
23
+ = record.campaign_group || e9_t(:no_group, :scope => 'e9_crm.campaigns')
24
+ %td.record-new-visits
25
+ = record.new_visits
26
+ %td.record-repeat-visits
27
+ = record.repeat_visits
28
+ %td.record-deals-count
29
+ = record.deals_count
30
+ %td.record-won-deals-count
31
+ = record.won_deals_count
@@ -0,0 +1,31 @@
1
+ %table.records
2
+ %thead
3
+ %tr
4
+ %th= orderable_column_link(:type)
5
+ %th= orderable_column_link(:name)
6
+ %th= orderable_column_link('campaign_group.name', :campaign_group)
7
+ %th= orderable_column_link(:code)
8
+ %th= orderable_column_link(:affiliate_fee)
9
+ %th= orderable_column_link(:sales_fee)
10
+ %th= e9_t(:actions)
11
+ %tbody
12
+ - if collection.empty?
13
+ %tr
14
+ %td{:colspan => 7}= e9_t(:no_records_text)
15
+ - else
16
+ - collection.each do |record|
17
+ %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
18
+ %td.record-type
19
+ = record.type[/(.*)Campaign/, 1]
20
+ %td.record-name
21
+ = record.name
22
+ %td.record-campaign-group
23
+ = record.campaign_group || e9_t(:no_group, :scope => 'e9_crm.campaigns')
24
+ %td.record-code
25
+ = display_campaign_code(record.code)
26
+ %td.record-affiliate-fee
27
+ = display_campaign_fee(record.affiliate_fee)
28
+ %td.record-sales-fee
29
+ = display_campaign_fee(record.sales_fee)
30
+ %td.links
31
+ = link_to_edit_campaign(record)
@@ -0,0 +1,13 @@
1
+ = title (@index_title || e9_t(:reports_title))
2
+
3
+ = render 'header'
4
+
5
+ - if sortable_controller?
6
+ = form_tag polymorphic_path([:update_order, resource_class]) do
7
+ %div#records_table
8
+ = render 'table', :resources => collection
9
+ - else
10
+ %div#records_table
11
+ = render 'table', :resources => collection
12
+
13
+ = render 'footer'
@@ -1,5 +1,5 @@
1
1
  = f.hidden_field :name
2
- = f.hidden_field :user_ids
2
+ = f.hidden_field :contact_ids
3
3
  .field
4
4
  = f.label :from_email, nil, :class => :req
5
5
  = f.text_field :from_email
@@ -1,3 +1,4 @@
1
+ - contact_ids = collection.map(&:id)
1
2
  .toolbar
2
3
  .toolbar-left
3
4
  = form_tag(resource_class, :method => :get, :id => 'contact_search_form') do
@@ -6,13 +7,13 @@
6
7
  = submit_tag t(:go), :name => nil
7
8
  = submit_tag t(:clear), :name => nil, :id => 'contact_search_clear'
8
9
  .toolbar-middle
9
- = form_tag new_contact_email_path, :method => :get, :id => 'contact_email_form', 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @user_ids.length do
10
+ = form_tag new_contact_email_path, :method => :get, :id => 'contact_email_form', 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @contact_ids.length do
10
11
  = select_tag 'etid', contact_email_template_select_options
11
- = hidden_field_tag 'uids', @user_ids.join(','), :id => 'contact_email_uids'
12
+ = hidden_field_tag 'uids', @contact_ids.join(','), :id => 'contact_email_uids'
12
13
  = submit_tag e9_t(:send_email_template), :name => nil
13
- = form_tag send_email_admin_user_email_path('__ID__'), :method => :put, :id => 'contact_newsletter_form', 'data-confirm' => e9_t(:contact_newsletter_confirmation, :count => collection.length), 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @user_ids.length do
14
+ = form_tag send_email_admin_user_email_path('__ID__'), :method => :put, :id => 'contact_newsletter_form', 'data-confirm' => e9_t(:contact_newsletter_confirmation, :count => collection.length), 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @contact_ids.length do
14
15
  = select_tag 'eid', contact_newsletter_select_options
15
- = hidden_field_tag 'uids', @user_ids.join(','), :id => 'contact_newsletter_uids'
16
+ = hidden_field_tag 'uids', @contact_ids.join(','), :id => 'contact_newsletter_uids'
16
17
  = submit_tag e9_t(:send_email_newsletter), :name => nil
17
18
  .toolbar-right
18
19
  = link_to_new_resource(Contact)
@@ -0,0 +1,86 @@
1
+ %table.records
2
+ %thead
3
+ %tr
4
+ %th= orderable_column_link(:campaign_type)
5
+ %th= orderable_column_link(:campaign_name)
6
+ %th= orderable_column_link(:campaign_group)
7
+ %th= orderable_column_link(:new_visits)
8
+ %th= orderable_column_link(:repeat_visits)
9
+ %th= orderable_column_link(:lead_count)
10
+ %th= orderable_column_link(:deal_count)
11
+ %th= orderable_column_link(:won_deal_count)
12
+ %th= orderable_column_link(:total_value)
13
+ %th= orderable_column_link(:average_value)
14
+ %th= orderable_column_link(:total_cost)
15
+ %th= orderable_column_link(:average_cost)
16
+ %th= orderable_column_link(:average_elapsed)
17
+ %tbody
18
+ -# prepare a hash to store the accumulated row data for calculations
19
+ - dat = Hash.new {|k,v| k[v] = [] }
20
+
21
+ - if collection.empty?
22
+ %tr
23
+ %td{:colspan => 13}= e9_t(:no_records_text, :scope => 'e9_crm.reports')
24
+ - else
25
+ - collection.each do |record|
26
+ %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
27
+ %td.record-campaign-type
28
+ = record.campaign_type[/(.*)Campaign/, 1]
29
+ %td.record-campaign-name
30
+ = record.campaign_name
31
+ %td.record-campaign-group
32
+ = record.campaign_group
33
+ %td.record-new-visits
34
+ - dat[:new_visits] << record.new_visits
35
+ = record.new_visits
36
+ %td.record-repeat-visits
37
+ - dat[:repeat_visits] << record.repeat_visits
38
+ = record.repeat_visits
39
+ %td.record-lead-count
40
+ - dat[:lead_count] << record.lead_count
41
+ = record.lead_count.to_i
42
+ %td.record-deal-count
43
+ - dat[:deal_count] << record.deal_count
44
+ = record.deal_count.to_i
45
+ %td.record-won-deal-count
46
+ - dat[:won_deal_count] << record.won_deal_count
47
+ = record.won_deal_count.to_i
48
+ %td.record-total-value
49
+ - dat[:total_value] << record.total_value
50
+ = record.total_value
51
+ %td.record-averate-value
52
+ - dat[:average_value] << record.average_value
53
+ = record.average_value
54
+ %td.record-total-cost
55
+ - dat[:total_cost] << record.total_cost
56
+ = record.total_cost
57
+ %td.record-average-cost
58
+ - dat[:average_cost] << record.average_cost
59
+ = record.average_cost
60
+ %td.record-average-elapsed
61
+ - dat[:average_elapsed] << record.average_elapsed
62
+ = record.average_elapsed && "%s days" % record.average_elapsed || 'n/a'
63
+ %tfooter
64
+ %tr{:class => 'record-totals'}
65
+ %td.record-totals-label{:colspan => 3}
66
+ #{t(:totals)}:
67
+ %td.record-new-visits
68
+ = dat[:new_visits].sum
69
+ %td.record-repeat-visits
70
+ = dat[:repeat_visits].sum
71
+ %td.record-lead-count
72
+ = dat[:lead_count].sum
73
+ %td.record-deal-count
74
+ = dat[:deal_count].sum.to_i
75
+ %td.record-won-deal-count
76
+ = dat[:won_deal_count].sum.to_i
77
+ %td.record-total-value
78
+ = dat[:total_value].average
79
+ %td.record-averate-value
80
+ = dat[:average_value].average
81
+ %td.record-total-cost
82
+ = dat[:total_cost].compact.sum
83
+ %td.record-average-cost
84
+ = dat[:average_cost].compact.average
85
+ %td.record-average-elapsed
86
+ = "%s days" % dat[:average_elapsed].compact.average
@@ -0,0 +1,19 @@
1
+ = title (@index_title || e9_t(:index_title, :scope => 'e9_crm.reports'))
2
+
3
+ .toolbar
4
+ .toolbar-left
5
+ = form_tag(resource_class, :method => :get, :id => 'campaign_search_form') do
6
+ %select{:name => 'type'}
7
+ = campaign_type_select_options
8
+ %select{:name => 'group'}
9
+ = campaign_group_select_options
10
+ %select{:name => 'from'}
11
+ = deal_date_select_options
12
+ %select{:name => 'until'}
13
+ = deal_date_select_options(true)
14
+
15
+ .toolbar-right
16
+ = link_to_collection(Campaign)
17
+
18
+ %div#records_table
19
+ = render 'reports_table'
@@ -0,0 +1 @@
1
+ $("table.records").replaceWith("<%= escape_javascript(render('reports_table', :collection => collection)) %>");
@@ -0,0 +1 @@
1
+ = render 'e9_crm/campaigns/form_inner', :f => f
@@ -1,8 +1,8 @@
1
1
  %table.records
2
2
  %thead
3
3
  %tr
4
- %th= orderable_column_link('campaign.name', :campaign)
5
4
  %th= orderable_column_link(:created_at)
5
+ %th= orderable_column_link('campaign.name', :campaign)
6
6
  %th= orderable_column_link(:request_path)
7
7
  %th= orderable_column_link(:referer)
8
8
  %th= orderable_column_link(:remote_ip)
@@ -13,13 +13,13 @@
13
13
  - else
14
14
  - collection.each do |record|
15
15
  %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
16
- %td.contact-campaign-name
17
- = record.campaign_name || 'n/a'
18
- %td.contact-created-at
16
+ %td.record-created-at
19
17
  = I18n.l(record.created_at)
20
- %td.contact-request-path
18
+ %td.record-campaign-name
19
+ = record.campaign_name || e9_t(:no_campaign)
20
+ %td.record-request-path
21
21
  = record.request_path
22
- %td.contact-referer
22
+ %td.record-referer
23
23
  = record.referer
24
- %td.contact-remote-ip
24
+ %td.record-remote-ip
25
25
  = record.remote_ip
@@ -14,7 +14,7 @@
14
14
  - collection.each do |record|
15
15
  %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
16
16
  - field_map[:fields].each do |key, value|
17
- %td{:class => "contact-#{key}"}
17
+ %td{:class => "record-#{key.to_s.dasherize}"}
18
18
  = value.respond_to?(:call) ? value.call(record) : record.send(key)
19
19
  %td.links
20
20
  - field_map[:links][record].each do |link|
@@ -0,0 +1,11 @@
1
+ = render 'e9_crm/campaigns/form_inner', :f => f
2
+
3
+ %fieldset
4
+ %legend= e9_t(:salesperson_information_legend, :scope => 'e9_crm.campaigns')
5
+ .field
6
+ = f.label :sales_person_id
7
+ = f.collection_select :sales_person_id, Contact.sales_persons.all, :id, :name, :prompt => true
8
+ .field
9
+ = f.label :sales_fee
10
+ = f.text_field :sales_fee
11
+
@@ -17,7 +17,7 @@ en:
17
17
  send_email_template: Send Email
18
18
  send_email_newsletter: Send Newsletter
19
19
  contact_newsletter_confirmation: "The system will send the newsletter to all of the selected contacts (%{count}) if they are subscribed to receieve email. Are you sure you want to proceed?"
20
- no_contacts_notification: "Either no contacts are selected, or none of those selected have configured primary emails."
20
+ no_contacts_notification: "You cannot send an email with no recipients!"
21
21
  contact_merges:
22
22
  new_title: Merge Contacts
23
23
  no_value: (No Value)
@@ -26,3 +26,13 @@ en:
26
26
  send_email: Send Email
27
27
  leads:
28
28
  index_title: Leads
29
+ reports:
30
+ index_title: Marketing Report
31
+ no_records_text: No data exists for those query parameters.
32
+ campaigns:
33
+ no_campaign: No Campaign
34
+ no_group: No Group
35
+ campaign_information_legend: Campaign Information
36
+ salesperson_information_legend: Salesperson Information
37
+ affiliate_information_legend: Affiliate Information
38
+ code_help: "Be careful when creating tracking codes. They are NOT EDITABLE after you save them.&#10;&#10;To track the success of this campaign, you can append ?%{code}={Your Code} to the end of any and all URLs on your website.&#10;&#10;It might look something like this: http://www.example.com/about-us?%{code}=alpha, where \"alpha\" represents the code you created.&#10;&#10;You can provide this tracking URL to a salesperson or an affiliate or it can be placed at the end of a link in any of your advertisements."
@@ -3,6 +3,9 @@ en:
3
3
  go: Go
4
4
  search: Search
5
5
  view: View
6
+ none: None
7
+ totals: Totals
8
+ inline_help_link: '[?]'
6
9
 
7
10
  e9_crm:
8
11
  add_record_attribute: Add
@@ -10,10 +13,13 @@ en:
10
13
 
11
14
  activerecord:
12
15
  links:
13
- new: "New %{model}"
14
- edit: "Edit %{model}"
15
- destroy: "Delete %{model}"
16
- show: "View %{model}"
16
+ edit: "Edit"
17
+ destroy: "Delete"
18
+ show: "View"
19
+ index: "Manage %{models}"
20
+
21
+ campaign_group:
22
+ confirm_destroy: Are you sure? This cannot be undone. Any campaigns which are associated with this group will become groupless.
17
23
 
18
24
  errors:
19
25
  messages:
@@ -27,8 +33,10 @@ en:
27
33
  invalid: "One or more of the emails you entered is invalid."
28
34
  contact_email:
29
35
  attributes:
36
+ contact_ids:
37
+ blank: "You cannot send an emailwith no recipients!"
30
38
  user_ids:
31
- blank: "You cannot send an email with no recipients!"
39
+ blank: "None of the contacts selected are configured with primary emails. Please correct this and try again."
32
40
  deal:
33
41
  attributes:
34
42
  status:
@@ -53,6 +61,9 @@ en:
53
61
  attributes:
54
62
  campaign:
55
63
  name: Name
64
+ code_hint: Append to URL
65
+ no_campaign:
66
+ name: No Campaign
56
67
  offer:
57
68
  alert_email_instructions: (Enter an email if you want to be notified of conversions)
58
69
  submit_button_text: Submit Button Text
data/config/routes.rb CHANGED
@@ -4,7 +4,7 @@ Rails.application.routes.draw do
4
4
  scope :path => crm_path, :module => :e9_crm do
5
5
  resources :companies, :except => :show
6
6
  resources :contacts, :except => :show do
7
- resources :page_views, :path => 'activity', :only => :index
7
+ #resources :page_views, :path => 'activity', :only => :index
8
8
  collection { get :templates }
9
9
  end
10
10
  resources :deals, :except => :show
@@ -18,26 +18,28 @@ Rails.application.routes.draw do
18
18
  collection { post :update_order }
19
19
  end
20
20
 
21
- # campaigns_controller only handles index, the individual controllers all support
22
- # specific index views and manage create/edit/destroy
23
- resources :campaigns, :only => :index do
24
- resources :page_views, :path => 'activity', :only => :index
21
+ resources :campaigns, :only => [:index, :destroy] do
22
+ #resources :page_views, :path => 'activity', :only => :index
25
23
  end
26
24
  scope :path => :campaigns do
27
- get '/activity', :to => redirect("/#{crm_path}/campaigns/all/activity")
28
-
25
+ #get '/activity', :to => redirect("/#{crm_path}/campaigns/all/activity")
29
26
  resources :campaign_groups, :path => 'groups', :except => [:show]
30
- resources :sales_campaigns, :path => 'sales', :except => [:show]
31
- resources :advertising_campaigns, :path => 'advertising', :except => [:show] do
27
+
28
+ resources :sales_campaigns, :path => 'sales', :except => [:show, :index]
29
+ resources :affiliate_campaigns, :path => 'affiliate', :except => [:show, :index]
30
+ resources :email_campaigns, :path => 'email', :except => [:show, :index]
31
+ resources :advertising_campaigns, :path => 'advertising', :except => [:show, :index] do
32
32
  resources :dated_costs, :path => 'costs'
33
33
  end
34
- resources :affiliate_campaigns, :path => 'affiliate', :except => [:show]
35
- resources :email_campaigns, :path => 'email', :except => [:show]
34
+
35
+ %w( advertising affiliate email sales ).each do |path|
36
+ get "/#{path}", :to => redirect("/#{crm_path}/campaigns?type=#{path}")
37
+ end
36
38
  end
37
39
 
38
40
  # leads are simply a scoped view of offers (only index)
39
41
  get :leads, :as => :leads, :to => 'deals#leads'
40
- get :marketing_report, :to => 'campaigns#reports', :only => :index
42
+ get :marketing_report, :to => 'deals#reports', :only => :index
41
43
 
42
44
  get '/merge_contacts/:contact_a_id/and/:contact_b_id', :as => :new_contact_merge, :to => 'contact_merges#new'
43
45
  post '/merge_contacts', :as => :contact_merges, :to => 'contact_merges#create'
@@ -57,5 +59,6 @@ Rails.application.routes.draw do
57
59
  ).each do |path|
58
60
  get "/#{path}/:id", :to => redirect("/#{crm_path}/#{path}/%{id}/edit"), :constraints => { :id => /\d+/ }
59
61
  end
62
+
60
63
  end
61
64
  end
data/e9_crm.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency("inherited_resources", "~> 1.1.2")
24
24
  s.add_dependency("has_scope")
25
25
  s.add_dependency("money")
26
- s.add_dependency("e9_rails", "~> 0.0.11")
26
+ s.add_dependency("e9_rails", "~> 0.0.13")
27
27
  s.add_dependency("e9_tags", "~> 0.0.11")
28
28
  s.add_dependency("will_paginate")
29
29
  end
@@ -1,6 +1,13 @@
1
1
  require 'active_record/base'
2
2
  require 'action_view/base'
3
3
 
4
+ class Array
5
+ def average
6
+ return 0 unless length > 0 && all? {|n| n && n.respond_to?(:to_f) }
7
+ sum / length
8
+ end
9
+ end
10
+
4
11
  class ActiveRecord::Base
5
12
  #
6
13
  # Basic conversion for "money" columns using the Money class and Rails composed_of
@@ -2,77 +2,94 @@ module E9Crm
2
2
  module TrackingController
3
3
  extend ActiveSupport::Concern
4
4
 
5
- included { before_filter :track_page_view }
5
+ included do
6
+ before_filter :check_for_new_session
7
+ after_filter :track_page_view
8
+ end
6
9
 
7
10
  protected
11
+ def check_for_new_session
12
+ if request.session_options[:id].blank?
13
+ E9Crm.log("No session found, page view will increment campaign counter cache")
14
+ @_should_cache = true
15
+ end
16
+ end
8
17
 
9
- def track_page_view
10
- @_page_view ||= tracking_cookie.page_views.create({
11
- :request_path => request.fullpath,
12
- :user_agent => request.user_agent,
13
- :referer => request.referer,
14
- :remote_ip => request.remote_ip,
15
- :session => request.session_options[:id],
16
- :campaign => tracking_cookie.code.presence && Campaign.find_by_code(tracking_cookie.code),
17
- :new_visit => tracking_cookie.new_visit?
18
- })
19
- end
18
+ def track_page_view
19
+ @_page_view ||= tracking_cookie.page_views.create({
20
+ :request_path => request.fullpath,
21
+ :user_agent => request.user_agent,
22
+ :referer => request.referer,
23
+ :remote_ip => request.remote_ip,
24
+ :session => request.session_options[:id],
25
+ :campaign => tracking_campaign,
26
+ :new_visit => session[:new_visit].present?,
27
+ :should_cache => !!@_should_cache
28
+ })
29
+ end
20
30
 
21
- def tracking_cookie
22
- @_tracking_cookie ||= begin
23
- E9Crm.log "Begin load or install cookie: cookie_name[#{E9Crm.cookie_name}] query_param[#{E9Crm.query_param}]"
31
+ def tracking_cookie
32
+ @_tracking_cookie ||= begin
33
+ E9Crm.log "Begin load or install cookie: cookie_name[#{E9Crm.cookie_name}] query_param[#{E9Crm.query_param}]"
24
34
 
25
- code = params.delete(E9Crm.query_param)
35
+ code = params.delete(E9Crm.query_param)
26
36
 
27
- if hid = cookies[E9Crm.cookie_name]
28
- E9Crm.log("Installed cookie found: hid(#{hid})")
29
- @_tracking_cookie = TrackingCookie.find_by_hid(hid)
37
+ if hid = cookies[E9Crm.cookie_name]
38
+ E9Crm.log("Installed cookie found: hid(#{hid})")
39
+ @_tracking_cookie = TrackingCookie.find_by_hid(hid)
30
40
 
31
- unless @_tracking_cookie
32
- # This should only happen in developemnt, as it means the cookie has been
33
- # installed then removed from the database.
34
- E9Crm.log("Installed cookie's hash id does not match any stored cookies!")
41
+ unless @_tracking_cookie
42
+ # This should only happen in developemnt, as it means the cookie has been
43
+ # installed then removed from the database.
44
+ E9Crm.log("Installed cookie's hash id does not match any stored cookies!")
45
+ end
35
46
  end
36
- end
37
47
 
38
- E9Crm.log(@_tracking_cookie ? "Cookie loaded: (#{E9Crm.cookie_name} : #{@_tracking_cookie.hid})" : "Cookie not found")
48
+ E9Crm.log(@_tracking_cookie ? "Cookie loaded: (#{E9Crm.cookie_name} : #{@_tracking_cookie.hid})" : "Cookie not found")
39
49
 
40
- if @_tracking_cookie
41
- if current_user && @_tracking_cookie.user_id? && @_tracking_cookie.user_id != current_user.id
42
- E9Crm.log "Tracking user_id not matched: found(#{@_tracking_cookie.user_id}), current(#{current_user.id}"
43
- @_tracking_cookie = nil
44
- else
45
- attrs = {}
50
+ if @_tracking_cookie
51
+ if current_user && @_tracking_cookie.user_id? && @_tracking_cookie.user_id != current_user.id
52
+ E9Crm.log "Tracking user_id not matched: found(#{@_tracking_cookie.user_id}), current(#{current_user.id}"
53
+ @_tracking_cookie = nil
54
+ else
55
+ attrs = {}
46
56
 
47
- if current_user && !@_tracking_cookie.user_id?
48
- E9Crm.log("Cookie user (#{@_tracking_cookie.user_id}) not current_user (#{current_user.id}), changing...")
49
- attrs[:user] = current_user
50
- end
57
+ if current_user && !@_tracking_cookie.user_id?
58
+ E9Crm.log("Cookie user (#{@_tracking_cookie.user_id}) not current_user (#{current_user.id}), changing...")
59
+ attrs[:user] = current_user
60
+ end
51
61
 
52
- if code.present? && code != @_tracking_cookie.code
53
- E9Crm.log "Code present and cookie code(#{@_tracking_cookie.code}) does not match (#{code}), changing..."
54
- attrs[:code] = code
62
+ if code.present? && code != @_tracking_cookie.code && Campaign.find_by_code(code)
63
+ E9Crm.log "Code present and cookie code(#{@_tracking_cookie.code}) does not match (#{code}), changing..."
64
+ attrs[:code] = code
55
65
 
56
- E9Crm.log "Cookie marked as new"
57
- attrs[:new_visit] = true
58
- end
66
+ E9Crm.log "Cookie marked as new"
67
+ session[:new_visit] = true
68
+ end
59
69
 
60
- E9Crm.log(attrs.blank? ? "Cookie unchanged, no update" : "Cookie changed, new attrs: #{attrs.inspect}")
61
- @_tracking_cookie.update_attributes(attrs) unless attrs.blank?
70
+ E9Crm.log(attrs.blank? ? "Cookie unchanged, no update" : "Cookie changed, new attrs: #{attrs.inspect}")
71
+ @_tracking_cookie.update_attributes(attrs) unless attrs.blank?
72
+ end
62
73
  end
63
- end
64
74
 
65
- @_tracking_cookie ||= begin
66
- TrackingCookie.create(:code => code, :user => current_user, :new_visit => true).tap do |cookie|
67
- E9Crm.log "Installing new cookie (#{E9Crm.cookie_name} : #{cookie.hid})"
68
- cookies.permanent[E9Crm.cookie_name] = cookie.hid
75
+ @_tracking_cookie ||= begin
76
+ session[:new_visit] = true
77
+
78
+ TrackingCookie.create(:code => code, :user => current_user).tap do |cookie|
79
+ E9Crm.log "Installing new cookie (#{E9Crm.cookie_name} : #{cookie.hid})"
80
+ cookies.permanent[E9Crm.cookie_name] = cookie.hid
81
+ end
69
82
  end
70
- end
71
83
 
72
- E9Crm.log("Final Cookie : #{@_tracking_cookie.inspect}")
84
+ E9Crm.log("Final Cookie : #{@_tracking_cookie.inspect}")
73
85
 
74
- @_tracking_cookie
86
+ @_tracking_cookie
87
+ end
75
88
  end
76
- end
89
+
90
+ def tracking_campaign
91
+ @_tracking_campaign ||= tracking_cookie.code.presence && Campaign.find_by_code(tracking_cookie.code) || Campaign.default
92
+ end
93
+
77
94
  end
78
95
  end