go_import 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/go-import +96 -0
- data/lib/go_import/csv_helper.rb +47 -0
- data/lib/go_import/email_helper.rb +10 -0
- data/lib/go_import/errors.rb +22 -0
- data/lib/go_import/excel_helper.rb +10 -0
- data/lib/go_import/global_phone.json +6571 -0
- data/lib/go_import/model/address.rb +61 -0
- data/lib/go_import/model/class_settings.rb +50 -0
- data/lib/go_import/model/coworker.rb +76 -0
- data/lib/go_import/model/coworker_reference.rb +33 -0
- data/lib/go_import/model/customfield.rb +87 -0
- data/lib/go_import/model/deal.rb +172 -0
- data/lib/go_import/model/deal_class_settings.rb +73 -0
- data/lib/go_import/model/deal_state.rb +15 -0
- data/lib/go_import/model/deal_status.rb +23 -0
- data/lib/go_import/model/deal_status_reference.rb +47 -0
- data/lib/go_import/model/deal_status_setting.rb +49 -0
- data/lib/go_import/model/documents.rb +51 -0
- data/lib/go_import/model/link.rb +70 -0
- data/lib/go_import/model/note.rb +97 -0
- data/lib/go_import/model/note_classification.rb +25 -0
- data/lib/go_import/model/organization.rb +219 -0
- data/lib/go_import/model/person.rb +151 -0
- data/lib/go_import/model/referencetosource.rb +46 -0
- data/lib/go_import/model/relation.rb +23 -0
- data/lib/go_import/model/rootmodel.rb +359 -0
- data/lib/go_import/model/settings.rb +61 -0
- data/lib/go_import/model/tag.rb +35 -0
- data/lib/go_import/model_helpers.rb +54 -0
- data/lib/go_import/phone_helper.rb +74 -0
- data/lib/go_import/roo_helper.rb +80 -0
- data/lib/go_import/serialize_helper.rb +186 -0
- data/lib/go_import/source.rb +87 -0
- data/lib/go_import/templating.rb +52 -0
- data/lib/go_import.rb +19 -0
- data/sources/csv/.gitignore +14 -0
- data/sources/csv/.go_import/runner.rb +62 -0
- data/sources/csv/Gemfile +5 -0
- data/sources/csv/Rakefile.rb +7 -0
- data/sources/csv/converter.rb +179 -0
- data/sources/csv/data/coworkers.csv +2 -0
- data/sources/csv/data/deals.csv +2 -0
- data/sources/csv/data/organizations.csv +2 -0
- data/sources/csv/data/persons.csv +2 -0
- data/sources/csv/spec/exporter_spec.rb +17 -0
- data/sources/csv/spec/sample_data/coworkers.csv +2 -0
- data/sources/csv/spec/sample_data/deals.csv +2 -0
- data/sources/csv/spec/sample_data/organizations.csv +2 -0
- data/sources/csv/spec/sample_data/persons.csv +2 -0
- data/sources/csv/spec/spec_helper.rb +30 -0
- data/sources/easy/.gitignore +14 -0
- data/sources/easy/.go_import/runner.rb +115 -0
- data/sources/easy/Export/readme.txt +6 -0
- data/sources/easy/Gemfile +5 -0
- data/sources/easy/Rakefile.rb +7 -0
- data/sources/easy/converter.rb +435 -0
- data/sources/easy/spec/exporter_spec.rb +10 -0
- data/sources/easy/spec/sample_data/Company.txt +649 -0
- data/sources/easy/spec/spec_helper.rb +30 -0
- data/sources/excel/.gitignore +14 -0
- data/sources/excel/.go_import/runner.rb +116 -0
- data/sources/excel/Gemfile +6 -0
- data/sources/excel/Rakefile.rb +7 -0
- data/sources/excel/converter.rb +130 -0
- data/sources/excel/spec/sample_data/sample.xlsx +0 -0
- data/sources/excel/spec/spec_helper.rb +26 -0
- data/sources/excel/spec/tomodel_spec.rb +18 -0
- data/sources/excel/template.xlsx +0 -0
- data/spec/address_spec.rb +49 -0
- data/spec/class_settings_spec.rb +37 -0
- data/spec/coworker_spec.rb +94 -0
- data/spec/custom_field_spec.rb +22 -0
- data/spec/deal_class_settings_spec.rb +104 -0
- data/spec/deal_spec.rb +182 -0
- data/spec/deal_status_reference_spec.rb +17 -0
- data/spec/documents_spec.rb +37 -0
- data/spec/helpers/csv_helper_spec.rb +29 -0
- data/spec/helpers/email_helper_spec.rb +32 -0
- data/spec/helpers/phone_helper_spec.rb +97 -0
- data/spec/helpers/roo_helper_spec.rb +10 -0
- data/spec/helpers/serialize_helper_spec.rb +249 -0
- data/spec/helpers/xsd_validate_spec.rb +55 -0
- data/spec/link_spec.rb +106 -0
- data/spec/note_spec.rb +110 -0
- data/spec/organization_spec.rb +151 -0
- data/spec/person_spec.rb +132 -0
- data/spec/rootmodel_spec.rb +371 -0
- data/spec/spec_helper.rb +30 -0
- data/spec/templating_spec.rb +12 -0
- metadata +306 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'iso_country_codes'
|
2
|
+
module GoImport
|
3
|
+
class Address
|
4
|
+
attr_accessor :street, :zip_code, :city, :country_code, :location
|
5
|
+
def serialize_variables
|
6
|
+
[ :street, :zip_code, :city, :country_code, :location].map {|p| {:id=>p,:type=>:string} }
|
7
|
+
end
|
8
|
+
include SerializeHelper
|
9
|
+
def initialize()
|
10
|
+
end
|
11
|
+
|
12
|
+
# What fields/rows on the class is supposed to be used by the Gem to generate the xml
|
13
|
+
# This method uses {#serialize_variables}. It also adds {#country_name} to be serialized
|
14
|
+
def get_import_rows
|
15
|
+
(serialize_variables+[{:id=>:country_name, :type=>:string}]).map do |p|
|
16
|
+
map_to_row p
|
17
|
+
end
|
18
|
+
end
|
19
|
+
# Used as a convenience in order to get country code from internally used {#country_code}
|
20
|
+
def country_name
|
21
|
+
if @country_code
|
22
|
+
IsoCountryCodes.find(@country_code).name
|
23
|
+
else
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Used as a convenience in order to map country name to the internal {#country_code}
|
29
|
+
def country_name=(name)
|
30
|
+
@country_code = case name
|
31
|
+
when nil
|
32
|
+
nil
|
33
|
+
when 'Sverige'
|
34
|
+
'SE'
|
35
|
+
else
|
36
|
+
IsoCountryCodes.search_by_name(name).first.alpha2
|
37
|
+
end
|
38
|
+
end
|
39
|
+
# parses a line like "226 48 LUND" into its corresponding
|
40
|
+
# zipcode and city properties on the address
|
41
|
+
def parse_zip_and_address_se(line)
|
42
|
+
Address.parse_line_to_zip_and_address_se(line, self)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
def self.parse_line_to_zip_and_address_se(line, address)
|
47
|
+
matched_zipcode = /^\d{3}\s?\d{2}/.match(line)
|
48
|
+
if matched_zipcode && matched_zipcode.length == 1
|
49
|
+
address.zip_code = matched_zipcode[0].strip()
|
50
|
+
matched_city = /\D*$/.match(line)
|
51
|
+
if matched_city && matched_city.length == 1
|
52
|
+
address.city = matched_city[0].strip()
|
53
|
+
return address
|
54
|
+
end
|
55
|
+
end
|
56
|
+
return nil
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
module GoImport
|
3
|
+
class ClassSettings
|
4
|
+
include SerializeHelper
|
5
|
+
attr_reader :custom_fields
|
6
|
+
|
7
|
+
def initialize(opt = nil)
|
8
|
+
if opt != nil
|
9
|
+
serialize_variables.each do |myattr|
|
10
|
+
val = opt[myattr[:id]]
|
11
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def serialize_variables
|
17
|
+
[{:id => :custom_fields, :type => :custom_fields} ]
|
18
|
+
end
|
19
|
+
|
20
|
+
def serialize_name
|
21
|
+
"ClassSettings"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Set custom field. If there is already an existing custom field, then it is overwritten.
|
25
|
+
def set_custom_field(obj)
|
26
|
+
@custom_fields = [] if @custom_fields.nil?
|
27
|
+
|
28
|
+
if obj.is_a?(CustomField)
|
29
|
+
field = obj
|
30
|
+
else
|
31
|
+
field = CustomField.new(obj)
|
32
|
+
end
|
33
|
+
|
34
|
+
if field.integration_id == "" && field.id == ""
|
35
|
+
raise InvalidCustomFieldError, "Custom field must have either id or integration_id"
|
36
|
+
end
|
37
|
+
|
38
|
+
index = @custom_fields.find_index do |custom_field|
|
39
|
+
custom_field.same_as?(field)
|
40
|
+
end
|
41
|
+
if index
|
42
|
+
@custom_fields.delete_at index
|
43
|
+
end
|
44
|
+
|
45
|
+
@custom_fields.push field
|
46
|
+
|
47
|
+
return field
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GoImport
|
3
|
+
class Coworker
|
4
|
+
include SerializeHelper
|
5
|
+
attr_accessor :id, :integration_id, :email, :first_name, :last_name, :direct_phone_number,
|
6
|
+
:mobile_phone_number, :home_phone_number
|
7
|
+
|
8
|
+
def initialize(opt = nil)
|
9
|
+
if opt != nil
|
10
|
+
serialize_variables.each do |myattr|
|
11
|
+
val = opt[myattr[:id]]
|
12
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def serialize_variables
|
18
|
+
[
|
19
|
+
:id, :integration_id, :email, :first_name, :last_name,
|
20
|
+
:direct_phone_number, :mobile_phone_number, :home_phone_number
|
21
|
+
].map {|p| { :id => p, :type => :string } }
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_reference
|
25
|
+
reference = CoworkerReference.new
|
26
|
+
reference.id = @id
|
27
|
+
reference.integration_id = @integration_id
|
28
|
+
reference.heading = "#{@first_name} #{@last_name}".strip
|
29
|
+
|
30
|
+
return reference
|
31
|
+
end
|
32
|
+
|
33
|
+
def serialize_name
|
34
|
+
"Coworker"
|
35
|
+
end
|
36
|
+
|
37
|
+
def ==(that)
|
38
|
+
if that.nil?
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
|
42
|
+
if that.is_a? Coworker
|
43
|
+
return @integration_id == that.integration_id
|
44
|
+
end
|
45
|
+
|
46
|
+
return false
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_name_to_firstname_lastname_se(name, when_missing = '')
|
50
|
+
if name.nil? or name.empty?
|
51
|
+
@first_name = when_missing
|
52
|
+
return
|
53
|
+
end
|
54
|
+
|
55
|
+
splitted = name.split(' ')
|
56
|
+
@first_name = splitted[0]
|
57
|
+
if splitted.length > 1
|
58
|
+
@last_name = splitted.drop(1).join(' ')
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_email_chars(s)
|
63
|
+
s.tr " åäöèé", "-aaoee"
|
64
|
+
end
|
65
|
+
|
66
|
+
def guess_email(domain)
|
67
|
+
return '' if @last_name.nil? || @last_name.empty?
|
68
|
+
return '' if @first_name.nil? || @first_name.empty?
|
69
|
+
|
70
|
+
firstname = to_email_chars @first_name.downcase
|
71
|
+
lastname = to_email_chars @last_name.downcase
|
72
|
+
return "#{firstname}.#{lastname}@#{domain}"
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module GoImport
|
2
|
+
class CoworkerReference
|
3
|
+
include SerializeHelper
|
4
|
+
attr_accessor :id, :heading, :integration_id
|
5
|
+
|
6
|
+
def initialize(opt = nil)
|
7
|
+
if opt != nil
|
8
|
+
serialize_variables.each do |myattr|
|
9
|
+
val = opt[myattr[:id]]
|
10
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def serialize_variables
|
16
|
+
[:id, :integration_id, :heading].map {|p| {:id => p, :type => :string} }
|
17
|
+
end
|
18
|
+
|
19
|
+
def serialize_name
|
20
|
+
"CoworkerReference"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.from_coworker(coworker)
|
24
|
+
if coworker.nil?
|
25
|
+
return nil
|
26
|
+
elsif coworker.is_a?(Coworker)
|
27
|
+
return coworker.to_reference
|
28
|
+
elsif coworker.is_a?(CoworkerReference)
|
29
|
+
return coworker
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module GoImport
|
2
|
+
class CustomFieldReference
|
3
|
+
include SerializeHelper, ModelWithIntegrationIdSameAs
|
4
|
+
|
5
|
+
attr_accessor :integration_id
|
6
|
+
|
7
|
+
def initialize(opt=nil)
|
8
|
+
if opt != nil
|
9
|
+
serialize_variables.each do |myattr|
|
10
|
+
val = opt[myattr[:id]]
|
11
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def serialize_variables
|
17
|
+
[:integration_id].map {|p| { :id => p, :type => :string } }
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_import_rows
|
21
|
+
serialize_variables.map do |p|
|
22
|
+
map_to_row p
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def serialize_name
|
27
|
+
"CustomFieldReference"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class CustomField
|
32
|
+
include SerializeHelper, ModelWithIntegrationIdSameAs
|
33
|
+
attr_accessor :id, :integration_id, :title, :type
|
34
|
+
|
35
|
+
def initialize(opt=nil)
|
36
|
+
if opt != nil
|
37
|
+
serialize_variables.each do |myattr|
|
38
|
+
val = opt[myattr[:id]]
|
39
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def serialize_variables
|
45
|
+
[:id, :integration_id, :title, :type].map {|p| { :id => p, :type => :string } }
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_import_rows
|
49
|
+
serialize_variables.map do |p|
|
50
|
+
map_to_row p
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def serialize_name
|
55
|
+
"CustomField"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class CustomValue
|
60
|
+
include SerializeHelper
|
61
|
+
attr_accessor :field, :value
|
62
|
+
|
63
|
+
def initialize(opt=nil)
|
64
|
+
if opt != nil
|
65
|
+
serialize_variables.each do |myattr|
|
66
|
+
val = opt[myattr[:id]]
|
67
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def serialize_variables
|
73
|
+
[ { :id =>:field, :type => :custom_field_reference },
|
74
|
+
{ :id =>:value, :type => :string }]
|
75
|
+
end
|
76
|
+
|
77
|
+
def get_import_rows
|
78
|
+
serialize_variables.map do |p|
|
79
|
+
map_to_row p
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def serialize_name
|
84
|
+
"CustomValue"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
module GoImport
|
2
|
+
class DealReference
|
3
|
+
include SerializeHelper
|
4
|
+
attr_accessor :id, :integration_id
|
5
|
+
def serialize_variables
|
6
|
+
[ :id, :integration_id ].map { |prop| {:id => prop, :type => :string} }
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(opt = nil)
|
10
|
+
if opt != nil
|
11
|
+
serialize_variables.each do |var|
|
12
|
+
value = opt[var[:id]]
|
13
|
+
instance_variable_set("@" + var[:id].to_s, value) if value != nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
return "(#{id}, #{integration_id})"
|
20
|
+
end
|
21
|
+
|
22
|
+
def empty?
|
23
|
+
return !@integration_id && !@id
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.from_deal(deal)
|
27
|
+
if deal.nil?
|
28
|
+
return nil
|
29
|
+
elsif deal.is_a?(Deal)
|
30
|
+
return deal.to_reference
|
31
|
+
elsif deal.is_a?(DealReference)
|
32
|
+
return deal
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Deal
|
38
|
+
include SerializeHelper, ModelHasCustomFields, ModelHasTags
|
39
|
+
|
40
|
+
# Get/set the deal's status. Statuses must be configured in
|
41
|
+
# LIME Go before the import.
|
42
|
+
attr_accessor :status
|
43
|
+
|
44
|
+
attr_accessor :id, :integration_id, :name, :description, :probability, :order_date
|
45
|
+
|
46
|
+
# you add custom values by using {#set_custom_value}
|
47
|
+
attr_reader :custom_values
|
48
|
+
|
49
|
+
attr_reader :customer, :responsible_coworker, :customer_contact, :value
|
50
|
+
|
51
|
+
def serialize_variables
|
52
|
+
[ :id, :integration_id, :name, :description, :probability, :value, :order_date ].map {
|
53
|
+
|p| {
|
54
|
+
:id => p,
|
55
|
+
:type => :string
|
56
|
+
}
|
57
|
+
} +
|
58
|
+
[
|
59
|
+
{ :id => :customer, :type => :organization_reference },
|
60
|
+
{ :id => :responsible_coworker, :type => :coworker_reference },
|
61
|
+
{ :id => :customer_contact, :type => :person_reference },
|
62
|
+
{ :id => :custom_values, :type => :custom_values },
|
63
|
+
{ :id => :tags, :type => :tags },
|
64
|
+
{ :id => :status, :type => :deal_status }
|
65
|
+
]
|
66
|
+
end
|
67
|
+
|
68
|
+
def serialize_name
|
69
|
+
"Deal"
|
70
|
+
end
|
71
|
+
|
72
|
+
def initialize(opt = nil)
|
73
|
+
if !opt.nil?
|
74
|
+
serialize_variables.each do |myattr|
|
75
|
+
val = opt[myattr[:id]]
|
76
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_s
|
82
|
+
return "deal[id=#{@id}, integration_id=#{@integration_id}]"
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_reference
|
86
|
+
reference = DealReference.new
|
87
|
+
reference.id = @id
|
88
|
+
reference.integration_id = @integration_id
|
89
|
+
return reference
|
90
|
+
end
|
91
|
+
|
92
|
+
def validate
|
93
|
+
error = String.new
|
94
|
+
|
95
|
+
if @name.nil? || @name.empty?
|
96
|
+
error = "A name is required for deal.\n}"
|
97
|
+
end
|
98
|
+
|
99
|
+
if !@status.nil? && @status.status_reference.nil?
|
100
|
+
error = "#{error}\nStatus must have a status reference."
|
101
|
+
end
|
102
|
+
|
103
|
+
if !@status.nil? && !@status.status_reference.nil? && @status.status_reference.validate.length > 0
|
104
|
+
error = "#{error}\n#{@status.status_reference.validate}"
|
105
|
+
end
|
106
|
+
|
107
|
+
if error.length > 0
|
108
|
+
error = "#{error}\n#{serialize()}"
|
109
|
+
end
|
110
|
+
|
111
|
+
return error
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
def with_status
|
116
|
+
@status = DealStatus.new if @status.nil?
|
117
|
+
yield @status
|
118
|
+
end
|
119
|
+
|
120
|
+
# Sets the deal's status to the specifed status. The specifed
|
121
|
+
# status could be either a DealStatusSetting, a string or an
|
122
|
+
# integer. Use DealStatusSetting if you want to create new
|
123
|
+
# statuses during import (you will probably add the
|
124
|
+
# DealStatusSettings to the settings model). If the statuses
|
125
|
+
# already exists in the application use the status label
|
126
|
+
# (String) or id (Integer) here.
|
127
|
+
def status=(status)
|
128
|
+
@status = DealStatus.new if @status.nil?
|
129
|
+
|
130
|
+
@status.status_reference = DealStatusReference.from_deal_status(status)
|
131
|
+
end
|
132
|
+
|
133
|
+
def customer=(customer)
|
134
|
+
@customer = OrganizationReference.from_organization(customer)
|
135
|
+
end
|
136
|
+
|
137
|
+
def responsible_coworker=(coworker)
|
138
|
+
@responsible_coworker = CoworkerReference.from_coworker(coworker)
|
139
|
+
end
|
140
|
+
|
141
|
+
def customer_contact=(person)
|
142
|
+
@customer_contact = PersonReference.from_person(person)
|
143
|
+
end
|
144
|
+
|
145
|
+
def value=(value)
|
146
|
+
if value.nil?
|
147
|
+
@value = 0
|
148
|
+
else
|
149
|
+
# we have had some issues with LIME Easy imports where
|
150
|
+
# the value was in the format "357 000". We need to
|
151
|
+
# remove those spaces.
|
152
|
+
fixed_value = value.gsub(" ", "")
|
153
|
+
|
154
|
+
if is_integer?(fixed_value)
|
155
|
+
@value = fixed_value
|
156
|
+
elsif is_float?(fixed_value)
|
157
|
+
@value = fixed_value
|
158
|
+
else
|
159
|
+
raise InvalidValueError, value
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def is_integer?(value)
|
165
|
+
true if Integer(value) rescue false
|
166
|
+
end
|
167
|
+
|
168
|
+
def is_float?(value)
|
169
|
+
true if Float(value) rescue false
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GoImport
|
3
|
+
class DealClassSettings < ClassSettings
|
4
|
+
attr_reader :statuses
|
5
|
+
|
6
|
+
def initialize(opt = nil)
|
7
|
+
@statuses = []
|
8
|
+
if opt != nil
|
9
|
+
serialize_variables.each do |myattr|
|
10
|
+
val = opt[myattr[:id]]
|
11
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def serialize_variables
|
17
|
+
super() + [{:id => :statuses, :type => :statuses }]
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_status(obj)
|
21
|
+
@statuses = [] if @statuses.nil?
|
22
|
+
|
23
|
+
if obj.is_a?(DealStatusSetting)
|
24
|
+
status = obj
|
25
|
+
else
|
26
|
+
status = DealStatusSetting.new(obj)
|
27
|
+
end
|
28
|
+
|
29
|
+
if status.label.nil? || status.label.empty?
|
30
|
+
raise InvalidDealStatusError, "Deal status must have a label"
|
31
|
+
end
|
32
|
+
|
33
|
+
if status.assessment.nil?
|
34
|
+
status.assessment = DealState::NotAnEndState
|
35
|
+
end
|
36
|
+
|
37
|
+
index = @statuses.find_index do |deal_status|
|
38
|
+
deal_status.same_as?(status)
|
39
|
+
end
|
40
|
+
if index
|
41
|
+
@statuses.delete_at index
|
42
|
+
end
|
43
|
+
|
44
|
+
@statuses.push status
|
45
|
+
|
46
|
+
return status
|
47
|
+
end
|
48
|
+
|
49
|
+
def find_status_by_label(label)
|
50
|
+
return nil if @statuses.nil? || label.nil?
|
51
|
+
|
52
|
+
return @statuses.find do |status|
|
53
|
+
!status.label.nil? && status.label.casecmp(label) == 0
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def find_status_by_integration_id(integration_id)
|
58
|
+
return nil if @statuses.nil? || integration_id.nil?
|
59
|
+
|
60
|
+
return @statuses.find do |status|
|
61
|
+
!status.integration_id.nil? && status.integration_id.casecmp(integration_id) == 0
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def find_status_by_id(id)
|
66
|
+
return nil if @statuses.nil?
|
67
|
+
|
68
|
+
return @statuses.find do |status|
|
69
|
+
!status.id.nil? && status.id.casecmp(integration_id) == 0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module GoImport
|
2
|
+
module DealState
|
3
|
+
# This is the default, a deal with a status with this state is
|
4
|
+
# currently being worked on.
|
5
|
+
NotAnEndState = 0
|
6
|
+
|
7
|
+
# The deal has reached a positive end state, eg we have won
|
8
|
+
# the deal.
|
9
|
+
PositiveEndState = 1
|
10
|
+
|
11
|
+
# The deal has reached a negative end state, eg we have lost
|
12
|
+
# the deal.
|
13
|
+
NegativeEndState = -1
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module GoImport
|
2
|
+
class DealStatus
|
3
|
+
include SerializeHelper
|
4
|
+
|
5
|
+
attr_accessor :id, :date, :status_reference, :note
|
6
|
+
|
7
|
+
def initialize(opt = nil)
|
8
|
+
if opt != nil
|
9
|
+
serialize_variables.each do |myattr|
|
10
|
+
val = opt[myattr[:id]]
|
11
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def serialize_variables
|
17
|
+
[ :id, :label, :note ].map{ |p| { :id => p, :type => :string } } +
|
18
|
+
[ :date ].map { |p| { :id => p, :type => :date } } +
|
19
|
+
[ :status_reference ].map { |p| { :id => p, :type => :deal_status_reference } }
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module GoImport
|
2
|
+
class DealStatusReference
|
3
|
+
include SerializeHelper
|
4
|
+
|
5
|
+
attr_accessor :label, :integration_id
|
6
|
+
|
7
|
+
def initialize(opt = nil)
|
8
|
+
if opt != nil
|
9
|
+
serialize_variables.each do |myattr|
|
10
|
+
val = opt[myattr[:id]]
|
11
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def serialize_variables
|
17
|
+
[:integration_id, :label].map {|p| {:id => p, :type => :string} }
|
18
|
+
end
|
19
|
+
|
20
|
+
def serialize_name
|
21
|
+
"StatusReference"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Converts the specifed status to a status reference.
|
25
|
+
def self.from_deal_status(deal_status)
|
26
|
+
if deal_status.nil?
|
27
|
+
return nil
|
28
|
+
elsif deal_status.is_a?(DealStatusSetting)
|
29
|
+
return deal_status.to_reference
|
30
|
+
elsif deal_status.is_a?(String)
|
31
|
+
return DealStatusReference.new({:label => deal_status, :integration_id => deal_status})
|
32
|
+
end
|
33
|
+
|
34
|
+
raise InvalidDealStatusError
|
35
|
+
end
|
36
|
+
|
37
|
+
def validate
|
38
|
+
error = ""
|
39
|
+
|
40
|
+
if (@label.nil? || @label.empty?) && (@integration_id.nil? || @integration_id.empty?)
|
41
|
+
error = "label and integration_id can't all be nil or empty"
|
42
|
+
end
|
43
|
+
|
44
|
+
return error
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GoImport
|
3
|
+
class DealStatusSetting
|
4
|
+
include SerializeHelper
|
5
|
+
|
6
|
+
attr_accessor :id, :integration_id, :label, :assessment
|
7
|
+
|
8
|
+
def initialize(opt = nil)
|
9
|
+
if opt != nil
|
10
|
+
serialize_variables.each do |myattr|
|
11
|
+
val = opt[myattr[:id]]
|
12
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def serialize_variables
|
18
|
+
[ :id, :integration_id, :label, :assessment ].map{ |p| { :id => p, :type => :string } }
|
19
|
+
end
|
20
|
+
|
21
|
+
def serialize_name
|
22
|
+
"DealStatus"
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_reference()
|
26
|
+
reference = DealStatusReference.new
|
27
|
+
reference.label = @label
|
28
|
+
reference.integration_id = @integration_id
|
29
|
+
|
30
|
+
return reference
|
31
|
+
end
|
32
|
+
|
33
|
+
def same_as?(other)
|
34
|
+
if @integration_id != nil && @integration_id == other.integration_id
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
|
38
|
+
if @id != nil && @id == other.id
|
39
|
+
return true
|
40
|
+
end
|
41
|
+
|
42
|
+
if @label != nil && @label == other.label
|
43
|
+
return true
|
44
|
+
end
|
45
|
+
|
46
|
+
return false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|