move-to-go 5.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/move-to-go/model/meeting.rb +219 -0
- data/lib/move-to-go/model/organization.rb +9 -1
- data/lib/move-to-go/model/person.rb +4 -0
- data/lib/move-to-go/model/rootmodel.rb +145 -3
- data/lib/move-to-go/model/todo.rb +172 -0
- data/lib/move-to-go/roo_helper.rb +4 -1
- data/lib/move-to-go/serialize_helper.rb +18 -0
- data/lib/move-to-go/shard_helper.rb +16 -0
- data/lib/move-to-go/source.rb +2 -0
- data/sources/excel/.move-to-go/runner.rb +34 -0
- data/sources/excel/converter.rb +45 -2
- data/sources/excel/sample-data.xlsx +0 -0
- data/sources/lime-easy/.move-to-go/runner.rb +148 -32
- data/sources/lime-easy/converter.rb +23 -7
- data/spec/meeting_spec.rb +152 -0
- data/spec/todo_spec.rb +149 -0
- metadata +8 -2
@@ -0,0 +1,172 @@
|
|
1
|
+
module MoveToGo
|
2
|
+
class Todo < CanBecomeImmutable
|
3
|
+
include SerializeHelper
|
4
|
+
##
|
5
|
+
# :attr_accessor: id
|
6
|
+
immutable_accessor :id
|
7
|
+
##
|
8
|
+
# :attr_accessor: integration_id
|
9
|
+
immutable_accessor :integration_id
|
10
|
+
|
11
|
+
attr_reader :text
|
12
|
+
attr_reader :date_start, :date_start_has_time, :date_checked
|
13
|
+
attr_reader :organization, :created_by, :assigned_coworker, :person, :deal
|
14
|
+
|
15
|
+
def initialize(opt = nil)
|
16
|
+
if !opt.nil?
|
17
|
+
serialize_variables.each do |myattr|
|
18
|
+
val = opt[myattr[:id]]
|
19
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def serialize_variables
|
25
|
+
[ :id, :text, :integration_id ].map {
|
26
|
+
|p| {
|
27
|
+
:id => p,
|
28
|
+
:type => :string
|
29
|
+
}
|
30
|
+
} +
|
31
|
+
[
|
32
|
+
{ :id => :date_start, :type => :datetime },
|
33
|
+
{ :id => :date_start_has_time, :type => :bool },
|
34
|
+
{ :id => :date_checked, :type => :datetime },
|
35
|
+
{ :id => :created_by_reference, :type => :coworker_reference, :element_name => :created_by },
|
36
|
+
{ :id => :assigned_coworker_reference, :type => :coworker_reference, :element_name => :assigned_coworker },
|
37
|
+
{ :id => :organization_reference, :type => :organization_reference, :element_name => :organization },
|
38
|
+
{ :id => :deal_reference, :type => :deal_reference, :element_name => :deal },
|
39
|
+
{ :id => :person_reference, :type => :person_reference, :element_name => :person }
|
40
|
+
]
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_import_rows
|
44
|
+
(serialize_variables + [
|
45
|
+
{ :id => :organization, :type => :organization_reference},
|
46
|
+
{ :id => :person, :type => :person_reference}
|
47
|
+
]).map do |p|
|
48
|
+
map_to_row p
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def serialize_name
|
53
|
+
"Todo"
|
54
|
+
end
|
55
|
+
|
56
|
+
def organization=(org)
|
57
|
+
raise_if_immutable
|
58
|
+
@organization_reference = OrganizationReference.from_organization(org)
|
59
|
+
|
60
|
+
if org.is_a?(Organization)
|
61
|
+
@organization = org
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def created_by=(coworker)
|
66
|
+
raise_if_immutable
|
67
|
+
@created_by_reference = CoworkerReference.from_coworker(coworker)
|
68
|
+
|
69
|
+
if coworker.is_a?(Coworker)
|
70
|
+
@created_by = coworker
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def assigned_coworker=(coworker)
|
75
|
+
raise_if_immutable
|
76
|
+
@assigned_coworker_reference = CoworkerReference.from_coworker(coworker)
|
77
|
+
|
78
|
+
if coworker.is_a?(Coworker)
|
79
|
+
@assigned_coworker = coworker
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def person=(person)
|
84
|
+
raise_if_immutable
|
85
|
+
@person_reference = PersonReference.from_person(person)
|
86
|
+
|
87
|
+
if person.is_a?(Person)
|
88
|
+
@person = person
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def deal=(deal)
|
93
|
+
raise_if_immutable
|
94
|
+
@deal_reference = DealReference.from_deal(deal)
|
95
|
+
|
96
|
+
if deal.is_a?(Deal)
|
97
|
+
@deal = deal
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def text=(text)
|
102
|
+
raise_if_immutable
|
103
|
+
@text = text
|
104
|
+
|
105
|
+
if @text.nil?
|
106
|
+
return
|
107
|
+
end
|
108
|
+
|
109
|
+
if @text.length == 0
|
110
|
+
return
|
111
|
+
end
|
112
|
+
|
113
|
+
@text.strip!
|
114
|
+
|
115
|
+
# remove form feeds
|
116
|
+
@text.gsub!("\f", "")
|
117
|
+
|
118
|
+
# remove vertical spaces
|
119
|
+
@text.gsub!("\v", "")
|
120
|
+
|
121
|
+
# remove backspace
|
122
|
+
@text.gsub!("\b", "")
|
123
|
+
end
|
124
|
+
|
125
|
+
def date_start=(datetime)
|
126
|
+
begin
|
127
|
+
@date_start = DateTime.parse(datetime)
|
128
|
+
rescue
|
129
|
+
puts "\nParsed datetime '#{datetime}' but got error"
|
130
|
+
raise
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def date_start_has_time=(bool)
|
135
|
+
@date_start_has_time = bool
|
136
|
+
end
|
137
|
+
|
138
|
+
def date_checked=(datetime)
|
139
|
+
@date_checked = DateTime.parse(datetime) if datetime != ""
|
140
|
+
end
|
141
|
+
|
142
|
+
def validate
|
143
|
+
error = String.new
|
144
|
+
|
145
|
+
if (@text.nil? || @text.empty?)
|
146
|
+
error = "Text is required for todo\n"
|
147
|
+
end
|
148
|
+
|
149
|
+
if @created_by.nil?
|
150
|
+
error = "#{error}Created_by is required for todo\n"
|
151
|
+
end
|
152
|
+
|
153
|
+
if @assigned_coworker_reference.nil?
|
154
|
+
error = "#{error}Assigned_coworker is required for todo\n"
|
155
|
+
end
|
156
|
+
|
157
|
+
if @date_start.nil?
|
158
|
+
error = "#{error}Date_start is required for todo\n"
|
159
|
+
end
|
160
|
+
|
161
|
+
if @date_start_has_time.nil?
|
162
|
+
error = "#{error}Date_start_has_time is required for todo\n"
|
163
|
+
end
|
164
|
+
|
165
|
+
if @organization.nil?
|
166
|
+
error = "#{error}Organization is required for todo\n"
|
167
|
+
end
|
168
|
+
|
169
|
+
return error
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
require "csv"
|
2
|
+
require "roo"
|
3
|
+
include Roo::Formatters::Base
|
4
|
+
|
2
5
|
module MoveToGo
|
3
6
|
# @example transform xlsx file into rows
|
4
7
|
# organizations_path = File.join(File.dirname(__FILE__), 'organizations.xlsx') # same path as this file
|
@@ -70,7 +73,7 @@ module MoveToGo
|
|
70
73
|
when :date, :datetime
|
71
74
|
onecell.to_s
|
72
75
|
when :time
|
73
|
-
|
76
|
+
integer_to_timestring(onecell)
|
74
77
|
when :formula
|
75
78
|
onecell.to_s
|
76
79
|
when :link
|
@@ -119,6 +119,20 @@ module MoveToGo
|
|
119
119
|
:type => p[:type],
|
120
120
|
:models => SerializeHelper.get_import_rows(:history)
|
121
121
|
}
|
122
|
+
when :todos then
|
123
|
+
{
|
124
|
+
:id => p[:id].to_s,
|
125
|
+
:name => symbol_to_name(p[:id]),
|
126
|
+
:type => p[:type],
|
127
|
+
:models => SerializeHelper.get_import_rows(:todo)
|
128
|
+
}
|
129
|
+
when :meetings then
|
130
|
+
{
|
131
|
+
:id => p[:id].to_s,
|
132
|
+
:name => symbol_to_name(p[:id]),
|
133
|
+
:type => p[:type],
|
134
|
+
:models => SerializeHelper.get_import_rows(:meeting)
|
135
|
+
}
|
122
136
|
when :tags then
|
123
137
|
{
|
124
138
|
:id => p[:id].to_s,
|
@@ -173,6 +187,10 @@ module MoveToGo
|
|
173
187
|
ReferenceToSource.new
|
174
188
|
when :history then
|
175
189
|
History.new
|
190
|
+
when :todo then
|
191
|
+
Todo.new
|
192
|
+
when :meeting then
|
193
|
+
Meeting.new
|
176
194
|
when :address then
|
177
195
|
Address.new
|
178
196
|
when :organization then
|
@@ -19,6 +19,8 @@ module MoveToGo
|
|
19
19
|
model.organizations.each{|key, org| add_organization(org)}
|
20
20
|
model.deals.each{|key, deal| add_deal(deal)}
|
21
21
|
model.histories.each{|key, history| add_history(history)}
|
22
|
+
model.todos.each{|key, todo| add_todo(todo)}
|
23
|
+
model.meetings.each{|key, meeting| add_meeting(meeting)}
|
22
24
|
add_documents(model.documents)
|
23
25
|
|
24
26
|
return_value = @shards
|
@@ -40,6 +42,20 @@ module MoveToGo
|
|
40
42
|
@current_shard_count += 1
|
41
43
|
end
|
42
44
|
|
45
|
+
private
|
46
|
+
def add_todo(todo)
|
47
|
+
check_or_create_new_chard()
|
48
|
+
@current_shard.add_todo(todo)
|
49
|
+
@current_shard_count += 1
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def add_meeting(meeting)
|
54
|
+
check_or_create_new_chard()
|
55
|
+
@current_shard.add_meeting(meeting)
|
56
|
+
@current_shard_count += 1
|
57
|
+
end
|
58
|
+
|
43
59
|
private
|
44
60
|
def add_deal(deal)
|
45
61
|
check_or_create_new_chard()
|
data/lib/move-to-go/source.rb
CHANGED
@@ -75,7 +75,9 @@ module MoveToGo
|
|
75
75
|
private
|
76
76
|
def copy_source_to_folder(source_name, project_name)
|
77
77
|
puts "Trying to create project '#{project_name}' from source '#{source_name}'..."
|
78
|
+
|
78
79
|
FileUtils.cp_r ::File.expand_path(source_name, @path), project_name
|
80
|
+
puts 'ok'
|
79
81
|
end
|
80
82
|
|
81
83
|
private
|
@@ -65,6 +65,22 @@ def convert_source
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
if defined?(TODO_SHEET)
|
69
|
+
if excel_workbook.has_sheet?(TODO_SHEET)
|
70
|
+
todo_rows = excel_workbook.rows_for_sheet TODO_SHEET
|
71
|
+
else
|
72
|
+
puts "WARNING: can't find sheet '#{TODO_SHEET}'"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
if defined?(MEETING_SHEET)
|
77
|
+
if excel_workbook.has_sheet?(MEETING_SHEET)
|
78
|
+
meeting_rows = excel_workbook.rows_for_sheet MEETING_SHEET
|
79
|
+
else
|
80
|
+
puts "WARNING: can't find sheet '#{MEETING_SHEET}'"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
68
84
|
if defined?(FILE_SHEET)
|
69
85
|
if excel_workbook.has_sheet?(FILE_SHEET)
|
70
86
|
file_rows = excel_workbook.rows_for_sheet FILE_SHEET
|
@@ -136,6 +152,24 @@ def convert_source
|
|
136
152
|
end
|
137
153
|
end
|
138
154
|
|
155
|
+
# Todo must be owned by a coworker and the be added to
|
156
|
+
# organizations
|
157
|
+
if defined?(todo_rows) && !todo_rows.nil?
|
158
|
+
puts "Trying to convert todos..."
|
159
|
+
todo_rows.with_progress().each do |row|
|
160
|
+
rootmodel.add_todo(converter.to_todo(row, rootmodel))
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# Meeting must be owned by a coworker and the be added to
|
165
|
+
# organizations
|
166
|
+
if defined?(meeting_rows) && !meeting_rows.nil?
|
167
|
+
puts "Trying to convert meetings..."
|
168
|
+
meeting_rows.with_progress().each do |row|
|
169
|
+
rootmodel.add_meeting(converter.to_meeting(row, rootmodel))
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
139
173
|
if defined?(file_rows) && !file_rows.nil?
|
140
174
|
puts "Trying to convert files..."
|
141
175
|
file_rows.with_progress().each do |row|
|
data/sources/excel/converter.rb
CHANGED
@@ -18,6 +18,8 @@ DEAL_SHEET = "Affär"
|
|
18
18
|
HISTORY_SHEET = "Anteckningar"
|
19
19
|
FILE_SHEET = "Dokument"
|
20
20
|
LINK_SHEET = "Links"
|
21
|
+
TODO_SHEET = "Att göra"
|
22
|
+
MEETING_SHEET = "Möten"
|
21
23
|
|
22
24
|
# Then you need to modify the script below according to the TODO
|
23
25
|
# comments.
|
@@ -141,6 +143,8 @@ class Converter
|
|
141
143
|
person.mobile_phone_number, person.direct_phone_number =
|
142
144
|
MoveToGo::PhoneHelper.parse_numbers(row['Telefon'], [",", "/", "\\"])
|
143
145
|
|
146
|
+
person.has_mail_consent = row['MailConsent'] == "Ja"
|
147
|
+
|
144
148
|
return person
|
145
149
|
end
|
146
150
|
|
@@ -161,7 +165,6 @@ class Converter
|
|
161
165
|
|
162
166
|
def to_file(row, rootmodel)
|
163
167
|
file = MoveToGo::File.new()
|
164
|
-
|
165
168
|
file.organization = rootmodel.find_organization_by_integration_id(row['Företag'])
|
166
169
|
file.person = rootmodel.find_person_by_integration_id(row['Person'])
|
167
170
|
file.deal = rootmodel.find_deal_by_integration_id(row['Affär'])
|
@@ -182,11 +185,51 @@ class Converter
|
|
182
185
|
link.created_by = rootmodel.find_coworker_by_integration_id(row['Skapad Av'])
|
183
186
|
link.name = row['Namn']
|
184
187
|
link.description = row['Kommentar']
|
185
|
-
link.
|
188
|
+
link.url = row['URL']
|
186
189
|
|
187
190
|
return link
|
188
191
|
end
|
189
192
|
|
193
|
+
def to_todo(row, rootmodel)
|
194
|
+
todo = MoveToGo::Todo.new()
|
195
|
+
|
196
|
+
todo.text = row['Text']
|
197
|
+
todo.created_by = rootmodel.find_coworker_by_integration_id(row['Skapad Av'])
|
198
|
+
todo.organization = rootmodel.find_organization_by_integration_id(row['Företag'])
|
199
|
+
todo.person = rootmodel.find_person_by_integration_id(row['Person'])
|
200
|
+
todo.deal = rootmodel.find_deal_by_integration_id(row['Affär'])
|
201
|
+
todo.assigned_coworker = rootmodel.find_coworker_by_integration_id(row['Delegerad till'])
|
202
|
+
todo.date_checked = row['Avbockad']
|
203
|
+
|
204
|
+
if (row['Tid'].nil? || row['Tid'] == "")
|
205
|
+
todo.date_start = row['Datum']
|
206
|
+
todo.date_start_has_time = false
|
207
|
+
else
|
208
|
+
todo.date_start = "#{row['Datum']} #{row['Tid']}"
|
209
|
+
todo.date_start_has_time = true
|
210
|
+
end
|
211
|
+
|
212
|
+
return todo
|
213
|
+
end
|
214
|
+
|
215
|
+
def to_meeting(row, rootmodel)
|
216
|
+
meeting = MoveToGo::Meeting.new()
|
217
|
+
|
218
|
+
meeting.heading = row['Rubrik']
|
219
|
+
meeting.text = row['Text']
|
220
|
+
meeting.created_by = rootmodel.find_coworker_by_integration_id(row['Skapad Av'])
|
221
|
+
meeting.organization = rootmodel.find_organization_by_integration_id(row['Företag'])
|
222
|
+
meeting.person = rootmodel.find_person_by_integration_id(row['Person'])
|
223
|
+
meeting.deal = rootmodel.find_deal_by_integration_id(row['Affär'])
|
224
|
+
meeting.assigned_coworker = rootmodel.find_coworker_by_integration_id(row['Delegerad till'])
|
225
|
+
|
226
|
+
meeting.date_start = "#{row['Datum']} #{row['Tid']}"
|
227
|
+
meeting.date_start_has_time = true
|
228
|
+
meeting.date_stop = "#{row['Datum']} #{row['SlutTid']}"
|
229
|
+
|
230
|
+
return meeting
|
231
|
+
end
|
232
|
+
|
190
233
|
# HOOKS
|
191
234
|
#
|
192
235
|
# Sometimes you need to add exra information to the rootmodel, this can be done
|
Binary file
|
@@ -4,15 +4,16 @@ require 'move-to-go'
|
|
4
4
|
require 'progress'
|
5
5
|
require_relative("../converter")
|
6
6
|
|
7
|
-
EXPORT_FOLDER = 'export'
|
8
7
|
COWORKER_FILE = "#{EXPORT_FOLDER}/User.txt"
|
9
8
|
ORGANIZATION_FILE = "#{EXPORT_FOLDER}/Company.txt"
|
10
9
|
ORGANIZATION_HISTORY_FILE = "#{EXPORT_FOLDER}/Company-History.txt"
|
10
|
+
ORGANIZATION_TODO_FILE = "#{EXPORT_FOLDER}/Company-To do.txt"
|
11
11
|
ORGANIZATION_DOCUMENT_FILE = "#{EXPORT_FOLDER}/Company-Document.txt"
|
12
12
|
PERSON_FILE = "#{EXPORT_FOLDER}/Company-Person.txt"
|
13
13
|
INCLUDE_FILE = "#{EXPORT_FOLDER}/Project-Included.txt"
|
14
14
|
DEAL_FILE = "#{EXPORT_FOLDER}/Project.txt"
|
15
15
|
DEAL_HISTORY_FILE = "#{EXPORT_FOLDER}/Project-History.txt"
|
16
|
+
DEAL_TODO_FILE = "#{EXPORT_FOLDER}/Project-To do.txt"
|
16
17
|
PROJECT_DOCUMENT_FILE = "#{EXPORT_FOLDER}/Project-Document.txt"
|
17
18
|
|
18
19
|
def convert_source
|
@@ -35,9 +36,12 @@ def convert_source
|
|
35
36
|
# coworkers
|
36
37
|
# start with these since they are referenced
|
37
38
|
# from everywhere....
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
if(File.exists?(COWORKER_FILE))
|
40
|
+
process_rows(" - Reading Coworkers '#{COWORKER_FILE}'", COWORKER_FILE) do |row|
|
41
|
+
rootmodel.add_coworker(to_coworker(row))
|
42
|
+
end
|
43
|
+
else
|
44
|
+
puts "WARNING: can't find coworker file '#{COWORKER_FILE}'"
|
41
45
|
end
|
42
46
|
|
43
47
|
# organizations
|
@@ -48,49 +52,99 @@ def convert_source
|
|
48
52
|
converter.organization_hook(row, organization, rootmodel) if defined? converter.organization_hook
|
49
53
|
end
|
50
54
|
|
55
|
+
# Person - Consent connection
|
56
|
+
# Reads the file and creats a hash
|
57
|
+
# that connect persons to consents
|
58
|
+
if(File.exists?(PERSON_CONSENT_FILE))
|
59
|
+
if (defined?(VALID_EMAIL_CONSENTS) && VALID_EMAIL_CONSENTS.size > 0)
|
60
|
+
consent = Hash.new
|
61
|
+
process_rows(" - Reading Person Consents '#{PERSON_CONSENT_FILE}'", PERSON_CONSENT_FILE) do |row|
|
62
|
+
consent[row['idPerson']] = VALID_EMAIL_CONSENTS.include? row['String']
|
63
|
+
end
|
64
|
+
else
|
65
|
+
puts "WARNING: Person consent file exists but VALID_EMAIL_CONSENTS is not set."
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
51
69
|
# persons
|
52
70
|
# depends on organizations
|
53
71
|
process_rows(" - Reading Persons '#{PERSON_FILE}'", PERSON_FILE) do |row|
|
54
72
|
# init method also adds the person to the employer
|
55
|
-
person = init_person(row, rootmodel)
|
73
|
+
person = init_person(row, rootmodel, consent)
|
56
74
|
converter.to_person(person, row)
|
57
75
|
end
|
58
76
|
|
59
77
|
# organization histories
|
60
|
-
|
61
|
-
#
|
62
|
-
|
78
|
+
if(File.exists?(ORGANIZATION_HISTORY_FILE))
|
79
|
+
process_rows(" - Reading Organization History '#{ORGANIZATION_HISTORY_FILE}'", ORGANIZATION_HISTORY_FILE) do |row|
|
80
|
+
# adds itself if applicable
|
81
|
+
rootmodel.add_history(to_organization_history(converter, row, rootmodel))
|
82
|
+
end
|
83
|
+
else
|
84
|
+
puts "WARNING: can't find organization history file '#{ORGANIZATION_HISTORY_FILE}'"
|
85
|
+
end
|
86
|
+
|
87
|
+
# organization todos
|
88
|
+
if(File.exists?(ORGANIZATION_TODO_FILE))
|
89
|
+
process_rows(" - Reading Organization Todos '#{ORGANIZATION_TODO_FILE}'", ORGANIZATION_TODO_FILE) do |row|
|
90
|
+
# adds itself if applicable
|
91
|
+
rootmodel.add_todo(to_organization_todo(converter, row, rootmodel))
|
92
|
+
end
|
93
|
+
else
|
94
|
+
puts "WARNING: can't find organization history file '#{ORGANIZATION_TODO_FILE}'"
|
63
95
|
end
|
64
96
|
|
65
97
|
# Organization - Deal connection
|
66
98
|
# Reads the includes.txt and creats a hash
|
67
|
-
# that connect organizations to deals
|
99
|
+
# that connect organizations to deals
|
68
100
|
process_rows(" - Reading Organization Deals '#{INCLUDE_FILE}'", INCLUDE_FILE) do |row|
|
69
101
|
includes[row['idProject']] = row['idCompany']
|
70
102
|
end
|
71
103
|
|
72
104
|
# deals
|
73
105
|
# deals can reference coworkers (responsible), organizations
|
74
|
-
# and persons (contact)
|
106
|
+
# and persons (contact)
|
75
107
|
process_rows(" - Reading Deals '#{DEAL_FILE}'", DEAL_FILE) do |row|
|
76
108
|
deal = init_deal(row, rootmodel, includes)
|
77
109
|
rootmodel.add_deal(converter.to_deal(deal, row))
|
78
110
|
end
|
79
111
|
|
80
112
|
# deal histories
|
81
|
-
|
82
|
-
#
|
83
|
-
|
113
|
+
if(File.exists?(DEAL_HISTORY_FILE))
|
114
|
+
process_rows(" - Reading Deal Histories '#{DEAL_HISTORY_FILE}'", DEAL_HISTORY_FILE) do |row|
|
115
|
+
# adds itself if applicable
|
116
|
+
rootmodel.add_history(to_deal_history(converter, row, rootmodel))
|
117
|
+
end
|
118
|
+
else
|
119
|
+
puts "WARNING: can't find deal history file '#{DEAL_HISTORY_FILE}'"
|
120
|
+
end
|
121
|
+
|
122
|
+
# deal todos
|
123
|
+
if(File.exists?(DEAL_TODO_FILE))
|
124
|
+
process_rows(" - Reading Deal Todos '#{DEAL_TODO_FILE}'", DEAL_TODO_FILE) do |row|
|
125
|
+
# adds itself if applicable
|
126
|
+
rootmodel.add_todo(to_deal_todo(converter, row, rootmodel))
|
127
|
+
end
|
128
|
+
else
|
129
|
+
puts "WARNING: can't find deal history file '#{DEAL_TODO_FILE}'"
|
84
130
|
end
|
85
131
|
|
86
132
|
# documents
|
87
133
|
if defined?(IMPORT_DOCUMENTS) && !IMPORT_DOCUMENTS.nil? && IMPORT_DOCUMENTS
|
88
|
-
|
89
|
-
|
134
|
+
if(File.exists?(ORGANIZATION_DOCUMENT_FILE))
|
135
|
+
process_rows(" - Reading Organization Documents", ORGANIZATION_DOCUMENT_FILE) do |row|
|
136
|
+
rootmodel.add_file(to_organization_document(row, rootmodel))
|
137
|
+
end
|
138
|
+
else
|
139
|
+
puts "WARNING: can't find company documents file '#{ORGANIZATION_DOCUMENT_FILE}'"
|
90
140
|
end
|
91
141
|
|
92
|
-
|
93
|
-
|
142
|
+
if(File.exists?(PROJECT_DOCUMENT_FILE))
|
143
|
+
process_rows(" - Reading Project Documents", PROJECT_DOCUMENT_FILE) do |row|
|
144
|
+
rootmodel.add_file(to_deal_document(row, rootmodel))
|
145
|
+
end
|
146
|
+
else
|
147
|
+
puts "WARNING: can't find project documents file '#{PROJECT_DOCUMENT_FILE}'"
|
94
148
|
end
|
95
149
|
end
|
96
150
|
|
@@ -99,7 +153,7 @@ end
|
|
99
153
|
|
100
154
|
def to_coworker(row)
|
101
155
|
coworker = MoveToGo::Coworker.new
|
102
|
-
|
156
|
+
|
103
157
|
# integration_id is typically the userId in Easy
|
104
158
|
# Must be set to be able to import the same file more
|
105
159
|
# than once without creating duplicates
|
@@ -129,7 +183,7 @@ def init_organization(row, rootmodel)
|
|
129
183
|
return organization
|
130
184
|
end
|
131
185
|
|
132
|
-
def init_person(row, rootmodel)
|
186
|
+
def init_person(row, rootmodel, consent)
|
133
187
|
person = MoveToGo::Person.new
|
134
188
|
|
135
189
|
# Easy standard fields created in configure method Easy
|
@@ -140,7 +194,9 @@ def init_person(row, rootmodel)
|
|
140
194
|
person.integration_id = row['idPerson']
|
141
195
|
person.first_name = row['First name']
|
142
196
|
person.last_name = row['Last name']
|
143
|
-
|
197
|
+
if (!consent.nil?)
|
198
|
+
person.has_mail_consent = !!consent[row['idPerson']]
|
199
|
+
end
|
144
200
|
# set employer connection
|
145
201
|
employer = rootmodel.find_organization_by_integration_id(row['idCompany'])
|
146
202
|
if employer
|
@@ -162,7 +218,7 @@ def to_organization_history(converter, row, rootmodel)
|
|
162
218
|
history.created_by = coworker
|
163
219
|
history.person = organization.find_employee_by_integration_id(row['idPerson'])
|
164
220
|
history.date = row['Date']
|
165
|
-
|
221
|
+
|
166
222
|
if converter.respond_to?(:get_history_classification_for_activity_on_company)
|
167
223
|
# we will get an InvalidHistoryClassificationError if we are
|
168
224
|
# setting and invalid classification. So no need to verify
|
@@ -173,7 +229,7 @@ def to_organization_history(converter, row, rootmodel)
|
|
173
229
|
if classification.nil?
|
174
230
|
classification = MoveToGo::HistoryClassification::Comment
|
175
231
|
end
|
176
|
-
|
232
|
+
|
177
233
|
history.classification = classification
|
178
234
|
|
179
235
|
history.text = row['History']
|
@@ -188,6 +244,35 @@ def to_organization_history(converter, row, rootmodel)
|
|
188
244
|
return nil
|
189
245
|
end
|
190
246
|
|
247
|
+
# Turns a row from the Easy exported Company-To do.txt file into
|
248
|
+
# a move-to-go model that is used to generate xml.
|
249
|
+
def to_organization_todo(converter, row, rootmodel)
|
250
|
+
organization = rootmodel.find_organization_by_integration_id(row['idCompany'])
|
251
|
+
coworker = rootmodel.find_coworker_by_integration_id(row['idUser'])
|
252
|
+
|
253
|
+
if organization && coworker
|
254
|
+
todo = MoveToGo::Todo.new()
|
255
|
+
todo.organization = organization
|
256
|
+
todo.created_by = coworker
|
257
|
+
todo.assigned_coworker = coworker
|
258
|
+
todo.person = organization.find_employee_by_integration_id(row['idPerson'])
|
259
|
+
if row['Start time'] != ''
|
260
|
+
todo.date_start = "#{row['Start date']} #{row['Start time']}"
|
261
|
+
todo.date_start_has_time = true
|
262
|
+
else
|
263
|
+
todo.date_start = row['Start date'] != '' ? row['Start date'] : Date.today.to_s
|
264
|
+
todo.date_start_has_time = false
|
265
|
+
end
|
266
|
+
|
267
|
+
todo.date_checked = DateTime.now if row['Done'] == 1
|
268
|
+
todo.text = row['Description']
|
269
|
+
|
270
|
+
return todo.text.empty? ? nil : todo
|
271
|
+
end
|
272
|
+
|
273
|
+
return nil
|
274
|
+
end
|
275
|
+
|
191
276
|
def to_organization_document(row, rootmodel)
|
192
277
|
file = MoveToGo::File.new()
|
193
278
|
|
@@ -284,14 +369,14 @@ def to_deal_history(converter, row, rootmodel)
|
|
284
369
|
if classification.nil?
|
285
370
|
classification = MoveToGo::HistoryClassification::Comment
|
286
371
|
end
|
287
|
-
|
372
|
+
|
288
373
|
history.classification = classification
|
289
374
|
history.text = row['RawHistory'].to_s.sub("#{row['Category']}:", "")
|
290
375
|
else
|
291
376
|
history.classification = MoveToGo::HistoryClassification::Comment
|
292
377
|
history.text = row['RawHistory']
|
293
378
|
end
|
294
|
-
|
379
|
+
|
295
380
|
|
296
381
|
return history.text.empty? ? nil : history
|
297
382
|
end
|
@@ -299,6 +384,35 @@ def to_deal_history(converter, row, rootmodel)
|
|
299
384
|
return nil
|
300
385
|
end
|
301
386
|
|
387
|
+
# Turns a row from the Easy exported Project-To do.txt file into
|
388
|
+
# a move-to-go model that is used to generate xml.
|
389
|
+
def to_deal_todo(converter, row, rootmodel)
|
390
|
+
deal = rootmodel.find_deal_by_integration_id(row['idProject'])
|
391
|
+
coworker = rootmodel.find_coworker_by_integration_id(row['idUser'])
|
392
|
+
|
393
|
+
if deal && coworker
|
394
|
+
todo = MoveToGo::Todo.new()
|
395
|
+
todo.deal = deal
|
396
|
+
todo.organization = deal.customer
|
397
|
+
todo.created_by = coworker
|
398
|
+
todo.assigned_coworker = coworker
|
399
|
+
todo.person = todo.organization.find_employee_by_integration_id(row['idPerson'])
|
400
|
+
if row['Start time'] != ''
|
401
|
+
todo.date_start = "#{row['Start date']} #{row['Start time']}"
|
402
|
+
todo.date_start_has_time = true
|
403
|
+
else
|
404
|
+
todo.date_start = row['Start date'] != '' ? row['Start date'] : Date.today.to_s
|
405
|
+
todo.date_start_has_time = false
|
406
|
+
end
|
407
|
+
|
408
|
+
todo.date_checked = DateTime.now if row['Done'] == 1
|
409
|
+
todo.text = row['Description']
|
410
|
+
|
411
|
+
return todo.text.empty? ? nil : todo
|
412
|
+
end
|
413
|
+
|
414
|
+
return nil
|
415
|
+
end
|
302
416
|
|
303
417
|
def validate_constants()
|
304
418
|
if !defined?(ORGANIZATION_RESPONSIBLE_FIELD)
|
@@ -321,6 +435,13 @@ def validate_constants()
|
|
321
435
|
Otherwise you should define 'IMPORT_DOCUMENTS' in converter.rb
|
322
436
|
with the value 'true'."
|
323
437
|
end
|
438
|
+
|
439
|
+
if !defined?(VALID_EMAIL_CONSENTS) || VALID_EMAIL_CONSENTS.empty?
|
440
|
+
puts "WARNING: You havce not defined any valid email consents.
|
441
|
+
No person will now have the 'Email consent given' set.
|
442
|
+
To set the valid email consents, define 'VALID_EMAIL_CONSENTS' with
|
443
|
+
the strings from Company-Person-Consent.txt that are valid for email."
|
444
|
+
end
|
324
445
|
end
|
325
446
|
|
326
447
|
|
@@ -336,13 +457,8 @@ def process_rows(description, file_name)
|
|
336
457
|
end
|
337
458
|
|
338
459
|
def make_sure_database_has_been_exported()
|
339
|
-
return File.exists?(
|
340
|
-
File.exists?(ORGANIZATION_FILE) &&
|
341
|
-
File.exists?(ORGANIZATION_HISTORY_FILE) &&
|
342
|
-
File.exists?(ORGANIZATION_DOCUMENT_FILE) &&
|
460
|
+
return File.exists?(ORGANIZATION_FILE) &&
|
343
461
|
File.exists?(PERSON_FILE) &&
|
344
|
-
File.exists?(INCLUDE_FILE) &&
|
345
|
-
File.exists?(DEAL_FILE)
|
346
|
-
File.exists?(DEAL_HISTORY_FILE) &&
|
347
|
-
File.exists?(PROJECT_DOCUMENT_FILE)
|
462
|
+
# File.exists?(INCLUDE_FILE) &&
|
463
|
+
File.exists?(DEAL_FILE)
|
348
464
|
end
|