e9_crm 0.1.19 → 0.1.20
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.
- data/app/controllers/e9_crm/campaigns_controller.rb +9 -1
- data/app/controllers/e9_crm/contact_merges_controller.rb +5 -10
- data/app/helpers/e9_crm/offers_helper.rb +0 -6
- data/app/models/contact.rb +46 -30
- data/app/views/e9_crm/campaigns/_header.html.haml +1 -1
- data/app/views/e9_crm/contact_merges/_field.html.haml +5 -2
- data/app/views/e9_crm/contact_merges/_form.html.haml +1 -0
- data/app/views/e9_crm/contacts/_form_inner.html.haml +3 -0
- data/app/views/e9_crm/offers/_form_inner.html.haml +6 -2
- data/app/views/e9_crm/offers/_header.html.haml +0 -5
- data/config/locales/en.yml +5 -1
- data/config/routes.rb +3 -2
- data/lib/e9_crm/rack/email_availability_checker.rb +31 -0
- data/lib/e9_crm/version.rb +1 -1
- data/lib/e9_crm.rb +9 -8
- metadata +3 -2
@@ -2,6 +2,8 @@ class E9Crm::CampaignsController < E9Crm::ResourcesController
|
|
2
2
|
defaults :resource_class => Campaign
|
3
3
|
include E9Rails::Controllers::Orderable
|
4
4
|
|
5
|
+
before_filter :redirect_new_to_subclass, :only => :new
|
6
|
+
|
5
7
|
self.should_paginate_index = false
|
6
8
|
|
7
9
|
has_scope :of_group, :as => :group, :only => :index
|
@@ -11,11 +13,17 @@ class E9Crm::CampaignsController < E9Crm::ResourcesController
|
|
11
13
|
end
|
12
14
|
|
13
15
|
has_scope :of_type, :as => :type, :only => :index do |_, scope, value|
|
14
|
-
scope.of_type("#{
|
16
|
+
scope.of_type("#{type}_campaign".classify)
|
15
17
|
end
|
16
18
|
|
17
19
|
protected
|
18
20
|
|
21
|
+
def redirect_new_to_subclass
|
22
|
+
types = %w(advertising affiliate email sales)
|
23
|
+
type = types.member?(params[:type]) ? params[:type] : types.first
|
24
|
+
redirect_to send("new_#{type}_campaign_path")
|
25
|
+
end
|
26
|
+
|
19
27
|
def collection_scope
|
20
28
|
#end_of_association_chain.typed.includes(:campaign_group)
|
21
29
|
|
@@ -2,8 +2,9 @@ class E9Crm::ContactMergesController < E9Crm::BaseController
|
|
2
2
|
before_filter :build_resources
|
3
3
|
|
4
4
|
def create
|
5
|
-
|
6
|
-
|
5
|
+
@contact_a.attributes = params[:contact]
|
6
|
+
|
7
|
+
if @contact_a.merge_and_destroy!(@contact_b)
|
7
8
|
redirect_to @contact_a
|
8
9
|
else
|
9
10
|
render :new
|
@@ -13,14 +14,8 @@ class E9Crm::ContactMergesController < E9Crm::BaseController
|
|
13
14
|
protected
|
14
15
|
|
15
16
|
def build_resources
|
16
|
-
@contact ||= Contact.new
|
17
17
|
@contact_a ||= Contact.find(params[:contact_a_id])
|
18
|
-
|
19
|
-
|
20
|
-
@contact_b ||= if params[:contact]
|
21
|
-
Contact.new(params[:contact])
|
22
|
-
else
|
23
|
-
Contact.find(params[:contact_b_id])
|
24
|
-
end
|
18
|
+
@contact_b ||= Contact.find(params[:contact_b_id])
|
19
|
+
@contact ||= Contact.new
|
25
20
|
end
|
26
21
|
end
|
@@ -12,10 +12,4 @@ module E9Crm::OffersHelper
|
|
12
12
|
retv.compact
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
16
|
-
def offer_select_options(with_all_option = true)
|
17
|
-
options = %w(contact file_download new_content_subscription newsletter_subscription video).map {|t| [t.titleize, t] }
|
18
|
-
options.unshift(['All Types', nil]) if with_all_option
|
19
|
-
options_for_select(options)
|
20
|
-
end
|
21
15
|
end
|
data/app/models/contact.rb
CHANGED
@@ -210,16 +210,32 @@ class Contact < ActiveRecord::Base
|
|
210
210
|
[first_name, last_name].join(' ').to_s.strip
|
211
211
|
end
|
212
212
|
|
213
|
-
|
214
|
-
|
213
|
+
# NOTE there's no non-destructive `merge`
|
214
|
+
def merge_and_destroy!(other)
|
215
|
+
merge_tags(other)
|
215
216
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
217
|
+
if success = save
|
218
|
+
merge_destructive_and_destroy!(other)
|
219
|
+
end
|
220
|
+
|
221
|
+
success
|
222
|
+
end
|
221
223
|
|
222
|
-
|
224
|
+
def merge_tags(other)
|
225
|
+
tags = self.tag_list_on('users__h__')
|
226
|
+
other_tags = other.tag_list_on('users__h__')
|
227
|
+
set_tag_list_on('users__h__', tags | other_tags)
|
228
|
+
end
|
229
|
+
|
230
|
+
def merge_destructive_and_destroy!(other)
|
231
|
+
other.users.clear_primary!
|
232
|
+
self.associated_deals |= other.associated_deals
|
233
|
+
self.users |= other.users
|
234
|
+
self.website_attributes |= other.website_attributes
|
235
|
+
self.address_attributes |= other.address_attributes
|
236
|
+
self.phone_number_attributes |= other.phone_number_attributes
|
237
|
+
self.instant_messaging_handle_attributes |= other.instant_messaging_handle_attributes
|
238
|
+
other.destroy
|
223
239
|
end
|
224
240
|
|
225
241
|
def valid?(context = nil)
|
@@ -248,33 +264,33 @@ class Contact < ActiveRecord::Base
|
|
248
264
|
unless errors.delete(:"users.email").blank?
|
249
265
|
users.dup.each_with_index do |user, i|
|
250
266
|
user.errors[:email].each do |error|
|
251
|
-
if error.taken? && users.select {|u| u.email == user.email }.length == 1
|
252
|
-
existing_user = User.find_by_email(user.email)
|
253
|
-
|
254
|
-
if contact = existing_user.contact
|
255
|
-
args = if new_record?
|
256
|
-
[contact, 'new', {:contact => self.attributes}]
|
257
|
-
else
|
258
|
-
[contact, self]
|
259
|
-
end
|
260
|
-
|
261
|
-
errors.add(:users, :merge_required, {
|
262
|
-
|
263
|
-
|
264
|
-
})
|
265
|
-
|
266
|
-
return false
|
267
|
-
else
|
268
|
-
self.users.delete(user)
|
269
|
-
self.users << existing_user
|
270
|
-
end
|
271
|
-
else
|
267
|
+
#if error.taken? && users.select {|u| u.email == user.email }.length == 1
|
268
|
+
#existing_user = User.find_by_email(user.email)
|
269
|
+
|
270
|
+
#if contact = existing_user.contact
|
271
|
+
#args = if new_record?
|
272
|
+
#[contact, 'new', {:contact => self.attributes}]
|
273
|
+
#else
|
274
|
+
#[contact, self]
|
275
|
+
#end
|
276
|
+
|
277
|
+
#errors.add(:users, :merge_required, {
|
278
|
+
#:email => user.email,
|
279
|
+
#:merge_path => new_contact_merge_path(*args)
|
280
|
+
#})
|
281
|
+
|
282
|
+
#return false
|
283
|
+
#else
|
284
|
+
#self.users.delete(user)
|
285
|
+
#self.users << existing_user
|
286
|
+
#end
|
287
|
+
#else
|
272
288
|
if error.label
|
273
289
|
errors.add(:users, error.label.to_sym, :email => user.email)
|
274
290
|
else
|
275
291
|
errors.add(:users, nil, :message => error, :email => user.email)
|
276
292
|
end
|
277
|
-
end
|
293
|
+
#end
|
278
294
|
end
|
279
295
|
end
|
280
296
|
|
@@ -9,7 +9,7 @@
|
|
9
9
|
= campaign_active_select_options
|
10
10
|
|
11
11
|
.toolbar-right
|
12
|
-
= form_tag
|
12
|
+
= form_tag new_campaign_path, :method => :get, :id => 'new_campaign_form' do
|
13
13
|
= label_tag 'new_campaign_type_select', t('activerecord.links.new', :model => Campaign.model_name.human)
|
14
14
|
%select{:name => 'type', :id => 'new_campaign_type_select'}
|
15
15
|
= campaign_type_select_options(false)
|
@@ -1,10 +1,13 @@
|
|
1
|
+
- val = f.object.send(column)
|
2
|
+
- a_checked = val == contact_a(column) || val.blank?
|
3
|
+
- b_checked = !a_checked
|
1
4
|
.field
|
2
5
|
= f.label column
|
3
6
|
.contact-a-value
|
4
7
|
%label{:for => "contact_a_#{column}"}
|
5
8
|
= contact_a(column).presence || e9_t(:no_value)
|
6
|
-
= f.radio_button column, contact_a(column), :checked =>
|
9
|
+
= f.radio_button column, contact_a(column), :checked => a_checked, :id => "contact_a_#{column}"
|
7
10
|
.contact-b-value
|
8
11
|
%label{:for => "contact_b_#{column}"}
|
9
12
|
= contact_b(column).presence || e9_t(:no_value)
|
10
|
-
= f.radio_button column, contact_b(column), :id => "contact_b_#{column}"
|
13
|
+
= f.radio_button column, contact_b(column), :checked => b_checked, :id => "contact_b_#{column}"
|
@@ -21,10 +21,14 @@
|
|
21
21
|
= check_box_tag "offer[mailing_list_ids][]", ml.id, resource.has_mailing_list?(ml), :id => "offer_mailing_list_ids_#{ml.id}"
|
22
22
|
= label_tag "offer_mailing_list_ids_#{ml.id}", ml.name
|
23
23
|
|
24
|
-
.field
|
25
|
-
= f
|
24
|
+
.field
|
25
|
+
= help_label(f, :template, :markdown => true)
|
26
26
|
= f.text_area :template
|
27
27
|
|
28
|
+
.field.tinymce
|
29
|
+
= f.label :success_page_text
|
30
|
+
= f.text_area :success_page_text
|
31
|
+
|
28
32
|
.field
|
29
33
|
= f.label :custom_form_html
|
30
34
|
= f.text_area :custom_form_html
|
data/config/locales/en.yml
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
en:
|
2
|
+
email_taken_title: Oops!
|
3
|
+
edit_conflict: "<p>This email is already attached to another contact and cannot be used.</p><p>Do you want to merge these contacts now?</p><p>Be careful! If you have made extensive edits you may want to save first and come back to merge.</p>"
|
4
|
+
merge_conflict: "<p>This email is already attached to another contact and cannot be used.</p><p>Do you want to edit that contact instead?</p>"
|
5
|
+
|
2
6
|
actions: Actions
|
3
7
|
clear: Clear
|
4
8
|
clear_all_filters: Clear All Filters
|
@@ -41,7 +45,7 @@ en:
|
|
41
45
|
|
42
46
|
errors:
|
43
47
|
messages:
|
44
|
-
merge_required:
|
48
|
+
merge_required:
|
45
49
|
models:
|
46
50
|
campaign:
|
47
51
|
not_a_number: "%{attribute} must be a number (maximum 2 decimal places)."
|
data/config/routes.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
crm_path = 'admin/crm'
|
3
3
|
|
4
|
-
get '/autocomplete/contacts'
|
4
|
+
get '/autocomplete/contacts' => E9Crm::Rack::ContactAutoCompleter
|
5
5
|
get '/autocomplete/companies' => E9Crm::Rack::CompanyAutoCompleter
|
6
|
+
get '/users/email_test.json' => E9Crm::Rack::EmailAvailabilityChecker
|
6
7
|
|
7
8
|
scope :module => :e9_crm do
|
8
9
|
resources :offers, :as => :public_offer, :only => :show do
|
@@ -41,7 +42,7 @@ Rails.application.routes.draw do
|
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
44
|
-
resources :campaigns, :only => [:index, :destroy] do
|
45
|
+
resources :campaigns, :only => [:index, :destroy, :new] do
|
45
46
|
# page_views currently not routed, but near working
|
46
47
|
#resources :page_views, :path => 'activity', :only => :index
|
47
48
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module E9Crm::Rack
|
2
|
+
class EmailAvailabilityChecker
|
3
|
+
def self.call(env)
|
4
|
+
@params = Rack::Request.new(env).params
|
5
|
+
@email = @params['email']
|
6
|
+
@contact = nil
|
7
|
+
@url = nil
|
8
|
+
|
9
|
+
if @user = User.find_by_email(@email)
|
10
|
+
if @contact = @user.contact
|
11
|
+
@url = if @params['id'] && c = Contact.find_by_id(@params['id'])
|
12
|
+
"/admin/crm/merge_contacts/#{@contact.id}/and/#{c.id}"
|
13
|
+
else
|
14
|
+
"/admin/crm/contacts/#{@contact.id}/edit"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
@body = {
|
19
|
+
:email => @email,
|
20
|
+
:id => @user.id,
|
21
|
+
:contact_id => @contact.try(:id),
|
22
|
+
:url => @url
|
23
|
+
}.to_json
|
24
|
+
|
25
|
+
[200, {"Content-Type" => "application/json"}, [@body]]
|
26
|
+
else
|
27
|
+
[404, {"Content-Type" => "text/html", "X-Cascade" => "pass"}, ["Not Found"]]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/e9_crm/version.rb
CHANGED
data/lib/e9_crm.rb
CHANGED
@@ -3,16 +3,17 @@ require 'money'
|
|
3
3
|
require 'e9_crm/rails_extensions'
|
4
4
|
|
5
5
|
module E9Crm
|
6
|
-
autoload :VERSION,
|
7
|
-
autoload :Controller,
|
8
|
-
autoload :Model,
|
9
|
-
autoload :Email,
|
10
|
-
autoload :TrackingController,
|
11
|
-
autoload :SystemEmailsController,
|
6
|
+
autoload :VERSION, 'e9_crm/version'
|
7
|
+
autoload :Controller, 'e9_crm/controller'
|
8
|
+
autoload :Model, 'e9_crm/model'
|
9
|
+
autoload :Email, 'e9_crm/email'
|
10
|
+
autoload :TrackingController, 'e9_crm/tracking_controller'
|
11
|
+
autoload :SystemEmailsController, 'e9_crm/system_emails_controller'
|
12
12
|
|
13
13
|
module Rack
|
14
|
-
autoload :ContactAutoCompleter,
|
15
|
-
autoload :CompanyAutoCompleter,
|
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'
|
16
17
|
end
|
17
18
|
|
18
19
|
mattr_accessor :cookie_name
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: e9_crm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.20
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Travis Cox
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-15 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -310,6 +310,7 @@ files:
|
|
310
310
|
- lib/e9_crm/model.rb
|
311
311
|
- lib/e9_crm/rack/company_auto_completer.rb
|
312
312
|
- lib/e9_crm/rack/contact_auto_completer.rb
|
313
|
+
- lib/e9_crm/rack/email_availability_checker.rb
|
313
314
|
- lib/e9_crm/rails_extensions.rb
|
314
315
|
- lib/e9_crm/system_emails_controller.rb
|
315
316
|
- lib/e9_crm/tracking_controller.rb
|