go_import 3.0.0
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/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
|