move-to-go 5.1.0 → 5.2.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.
- 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
|