go_import 3.0.5 → 3.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/go_import/model/rootmodel.rb +24 -1
- data/sources/VISMA/converter.rb +16 -0
- data/sources/csv/converter.rb +16 -0
- data/sources/custom/converter.rb +16 -0
- data/sources/easy/.go_import/runner.rb +45 -41
- data/sources/easy/converter.rb +15 -0
- data/sources/excel/converter.rb +15 -2
- data/spec/file_spec.rb +2 -2
- metadata +2 -2
@@ -380,18 +380,41 @@ module GoImport
|
|
380
380
|
root_folder = Dir.pwd
|
381
381
|
end
|
382
382
|
|
383
|
+
# If a file's path is absolute, then we probably dont
|
384
|
+
# have the files in the same location here. For
|
385
|
+
# example, the customer might have stored their files
|
386
|
+
# at f:\lime-easy\documents. We must replace this part
|
387
|
+
# of each file with the root_folder from above.
|
388
|
+
if defined?(FILES_FOLDER_AT_CUSTOMER) && !FILES_FOLDER_AT_CUSTOMER.empty?()
|
389
|
+
files_folder_at_customer = FILES_FOLDER_AT_CUSTOMER
|
390
|
+
puts "Files with absolute paths will have the part '#{files_folder_at_customer}' replaced with '#{root_folder}'."
|
391
|
+
else
|
392
|
+
files_folder_at_customer = ""
|
393
|
+
puts "Files with absolute paths will be imported from their origial location."
|
394
|
+
end
|
395
|
+
|
383
396
|
# 1) files/ - a folder with all files referenced from
|
384
397
|
# the source.
|
385
398
|
documents.files.each do |file|
|
386
399
|
# we dont need to check that the file exists since
|
387
400
|
# we assume that rootmodel.validate has been
|
388
401
|
# called before save_to_zip.
|
402
|
+
puts "file.path: #{file.path}, relative: #{file.has_relative_path?}"
|
389
403
|
if file.has_relative_path?
|
390
404
|
file.location_in_zip_file = "files/#{file.path}"
|
391
405
|
zip_file.add(file.location_in_zip_file, "#{root_folder}/#{file.path}")
|
392
406
|
else
|
407
|
+
puts "ABS!"
|
408
|
+
puts files_folder_at_customer
|
393
409
|
file.location_in_zip_file = "files/__abs/#{SecureRandom.uuid}/#{::File.basename(file.path).to_s}"
|
394
|
-
|
410
|
+
if files_folder_at_customer.empty?
|
411
|
+
zip_file.add(file.location_in_zip_file, file.path)
|
412
|
+
else
|
413
|
+
puts "file.path.downcase.sub(files_folder_at_customer.downcase, root_folder): "
|
414
|
+
puts file.path.downcase.sub(files_folder_at_customer.downcase, root_folder)
|
415
|
+
zip_file.add(file.location_in_zip_file,
|
416
|
+
file.path.downcase.sub(files_folder_at_customer.downcase, root_folder))
|
417
|
+
end
|
395
418
|
end
|
396
419
|
end
|
397
420
|
|
data/sources/VISMA/converter.rb
CHANGED
@@ -15,6 +15,22 @@ require 'dbf'
|
|
15
15
|
# Generate the xml-file that should be sent to LIME Go with the command:
|
16
16
|
# go-import run
|
17
17
|
|
18
|
+
# If you are importing files then you must set the FILES_FOLDER
|
19
|
+
# constant. FILES_FOLDER should point to the folder where the files
|
20
|
+
# are stored. FILES_FOLDER can be relative to the project directory
|
21
|
+
# or absolute. Note that you need to escape \ with a \ so in order to
|
22
|
+
# write \ use \\.
|
23
|
+
FILES_FOLDER = "./files"
|
24
|
+
|
25
|
+
# If you are importing files with an absolute path (eg
|
26
|
+
# m:\documents\readme.doc) then you probably wont have files at that
|
27
|
+
# location on the computer where "go-import run" is executed. Set
|
28
|
+
# FILES_FOLDER_AT_CUSTOMER to the folder where documents are stored at
|
29
|
+
# the customers site. Ie, in this example m:\documents.
|
30
|
+
# Note that you need to escape \ with a \ so in order to write \ use
|
31
|
+
# \\.
|
32
|
+
FILES_FOLDER_AT_CUSTOMER = "m:\\documents\\"
|
33
|
+
|
18
34
|
class Converter
|
19
35
|
def configure(rootmodel)
|
20
36
|
# Add custom field to your model here. Custom fields can be
|
data/sources/csv/converter.rb
CHANGED
@@ -15,6 +15,22 @@ DEAL_FILE = "data/deals.csv"
|
|
15
15
|
|
16
16
|
# Ie if you dont want to import deals, set DEAL_FILE = ""
|
17
17
|
|
18
|
+
# If you are importing files then you must set the FILES_FOLDER
|
19
|
+
# constant. FILES_FOLDER should point to the folder where the files
|
20
|
+
# are stored. FILES_FOLDER can be relative to the project directory
|
21
|
+
# or absolute. Note that you need to escape \ with a \ so in order to
|
22
|
+
# write \ use \\.
|
23
|
+
FILES_FOLDER = "./files"
|
24
|
+
|
25
|
+
# If you are importing files with an absolute path (eg
|
26
|
+
# m:\documents\readme.doc) then you probably wont have files at that
|
27
|
+
# location on the computer where "go-import run" is executed. Set
|
28
|
+
# FILES_FOLDER_AT_CUSTOMER to the folder where documents are stored at
|
29
|
+
# the customers site. Ie, in this example m:\documents.
|
30
|
+
# Note that you need to escape \ with a \ so in order to write \ use
|
31
|
+
# \\.
|
32
|
+
FILES_FOLDER_AT_CUSTOMER = "m:\\documents\\"
|
33
|
+
|
18
34
|
class Converter
|
19
35
|
# Configure your root model, add custom fields and deal statuses.
|
20
36
|
def configure(rootmodel)
|
data/sources/custom/converter.rb
CHANGED
@@ -16,6 +16,22 @@ require 'go_import'
|
|
16
16
|
#
|
17
17
|
# Good luck.
|
18
18
|
|
19
|
+
# If you are importing files then you must set the FILES_FOLDER
|
20
|
+
# constant. FILES_FOLDER should point to the folder where the files
|
21
|
+
# are stored. FILES_FOLDER can be relative to the project directory
|
22
|
+
# or absolute. Note that you need to escape \ with a \ so in order to
|
23
|
+
# write \ use \\.
|
24
|
+
FILES_FOLDER = "./files"
|
25
|
+
|
26
|
+
# If you are importing files with an absolute path (eg
|
27
|
+
# m:\documents\readme.doc) then you probably wont have files at that
|
28
|
+
# location on the computer where "go-import run" is executed. Set
|
29
|
+
# FILES_FOLDER_AT_CUSTOMER to the folder where documents are stored at
|
30
|
+
# the customers site. Ie, in this example m:\documents.
|
31
|
+
# Note that you need to escape \ with a \ so in order to write \ use
|
32
|
+
# \\.
|
33
|
+
FILES_FOLDER_AT_CUSTOMER = "m:\\documents\\"
|
34
|
+
|
19
35
|
class Converter
|
20
36
|
def to_go()
|
21
37
|
rootmodel = GoImport::RootModel.new
|
@@ -12,6 +12,7 @@ PERSON_FILE = "#{EXPORT_FOLDER}/Company-Person.txt"
|
|
12
12
|
INCLUDE_FILE = "#{EXPORT_FOLDER}/Project-Included.txt"
|
13
13
|
DEAL_FILE = "#{EXPORT_FOLDER}/Project.txt"
|
14
14
|
DEAL_NOTE_FILE = "#{EXPORT_FOLDER}/Project-History.txt"
|
15
|
+
PROJECT_DOCUMENT_FILE = "#{EXPORT_FOLDER}/Project-Document.txt"
|
15
16
|
|
16
17
|
def convert_source
|
17
18
|
puts "Trying to convert LIME Easy source to LIME Go..."
|
@@ -28,22 +29,18 @@ def convert_source
|
|
28
29
|
|
29
30
|
converter.configure rootmodel
|
30
31
|
|
31
|
-
coworkers = Hash.new
|
32
32
|
includes = Hash.new
|
33
|
-
people = Hash.new
|
34
33
|
|
35
34
|
# coworkers
|
36
35
|
# start with these since they are referenced
|
37
36
|
# from everywhere....
|
38
37
|
process_rows COWORKER_FILE do |row|
|
39
|
-
coworkers[row['idUser']] = row['PowerSellUserID']
|
40
|
-
|
41
38
|
rootmodel.add_coworker(to_coworker(row))
|
42
39
|
end
|
43
40
|
|
44
41
|
# organizations
|
45
42
|
process_rows ORGANIZATION_FILE do |row|
|
46
|
-
organization = init_organization(row)
|
43
|
+
organization = init_organization(row, rootmodel)
|
47
44
|
rootmodel.add_organization(
|
48
45
|
converter.to_organization(organization, row))
|
49
46
|
end
|
@@ -51,7 +48,6 @@ def convert_source
|
|
51
48
|
# persons
|
52
49
|
# depends on organizations
|
53
50
|
process_rows PERSON_FILE do |row|
|
54
|
-
people[row['personIndex']] = "#{row['PowerSellReferenceID']}-#{row['PowerSellCompanyID']}"
|
55
51
|
# init method also adds the person to the employer
|
56
52
|
person = init_person(row, rootmodel)
|
57
53
|
converter.to_person(person, row)
|
@@ -60,14 +56,14 @@ def convert_source
|
|
60
56
|
# organization notes
|
61
57
|
process_rows ORGANIZATION_NOTE_FILE do |row|
|
62
58
|
# adds itself if applicable
|
63
|
-
rootmodel.add_note(to_organization_note(row,
|
59
|
+
rootmodel.add_note(to_organization_note(row, rootmodel))
|
64
60
|
end
|
65
61
|
|
66
62
|
# Organization - Deal connection
|
67
63
|
# Reads the includes.txt and creats a hash
|
68
64
|
# that connect organizations to deals
|
69
65
|
process_rows INCLUDE_FILE do |row|
|
70
|
-
includes[row['
|
66
|
+
includes[row['idProject']] = row['idCompany']
|
71
67
|
end
|
72
68
|
|
73
69
|
# deals
|
@@ -81,17 +77,19 @@ def convert_source
|
|
81
77
|
# deal notes
|
82
78
|
process_rows DEAL_NOTE_FILE do |row|
|
83
79
|
# adds itself if applicable
|
84
|
-
rootmodel.add_note(to_deal_note(row,
|
80
|
+
rootmodel.add_note(to_deal_note(row, rootmodel))
|
85
81
|
end
|
86
82
|
|
87
83
|
# company documents
|
88
84
|
if defined?(IMPORT_DOCUMENTS) && !IMPORT_DOCUMENTS.nil? && IMPORT_DOCUMENTS
|
89
85
|
process_rows ORGANIZATION_DOCUMENT_FILE do |row|
|
90
|
-
rootmodel.add_file(to_organization_document(row,
|
86
|
+
rootmodel.add_file(to_organization_document(row, rootmodel))
|
91
87
|
end
|
92
|
-
end
|
93
|
-
|
94
88
|
|
89
|
+
process_rows PROJECT_DOCUMENT_FILE do |row|
|
90
|
+
rootmodel.add_file(from_project_document_to_organization_document(row, rootmodel))
|
91
|
+
end
|
92
|
+
end
|
95
93
|
return rootmodel
|
96
94
|
end
|
97
95
|
|
@@ -100,17 +98,17 @@ def to_coworker(row)
|
|
100
98
|
# integration_id is typically the userId in Easy
|
101
99
|
# Must be set to be able to import the same file more
|
102
100
|
# than once without creating duplicates
|
103
|
-
coworker.integration_id = row['
|
101
|
+
coworker.integration_id = row['idUser']
|
104
102
|
coworker.parse_name_to_firstname_lastname_se(row['Name'])
|
105
103
|
return coworker
|
106
104
|
end
|
107
105
|
|
108
|
-
def init_organization(row)
|
106
|
+
def init_organization(row, rootmodel)
|
109
107
|
organization = GoImport::Organization.new
|
110
108
|
# integration_id is typically the company Id in Easy
|
111
109
|
# Must be set to be able to import the same file more
|
112
110
|
# than once without creating duplicates
|
113
|
-
organization.integration_id = row['
|
111
|
+
organization.integration_id = row['idCompany']
|
114
112
|
|
115
113
|
# Easy standard fields
|
116
114
|
organization.name = row['Company name']
|
@@ -119,7 +117,7 @@ def init_organization(row)
|
|
119
117
|
if defined?(ORGANIZATION_RESPONSIBLE_FIELD) && !ORGANIZATION_RESPONSIBLE_FIELD.nil? && !ORGANIZATION_RESPONSIBLE_FIELD.empty?
|
120
118
|
# Responsible coworker for the organization.
|
121
119
|
# For instance responsible sales rep.
|
122
|
-
coworker_id =
|
120
|
+
coworker_id = row["idUser-#{ORGANIZATION_RESPONSIBLE_FIELD}"]
|
123
121
|
organization.responsible_coworker = rootmodel.find_coworker_by_integration_id(coworker_id)
|
124
122
|
end
|
125
123
|
|
@@ -134,12 +132,12 @@ def init_person(row, rootmodel)
|
|
134
132
|
# unique within the scope of the company, so we combine the
|
135
133
|
# referenceId and the companyId to make a globally unique
|
136
134
|
# integration_id
|
137
|
-
person.integration_id =
|
135
|
+
person.integration_id = row['idPerson']
|
138
136
|
person.first_name = row['First name']
|
139
137
|
person.last_name = row['Last name']
|
140
138
|
|
141
139
|
# set employer connection
|
142
|
-
employer = rootmodel.find_organization_by_integration_id(row['
|
140
|
+
employer = rootmodel.find_organization_by_integration_id(row['idCompany'])
|
143
141
|
if employer
|
144
142
|
employer.add_employee person
|
145
143
|
end
|
@@ -149,19 +147,15 @@ end
|
|
149
147
|
|
150
148
|
# Turns a row from the Easy exported Company-History.txt file into
|
151
149
|
# a go_import model that is used to generate xml.
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
organization = rootmodel.find_organization_by_integration_id(row['PowerSellCompanyID'])
|
156
|
-
|
157
|
-
coworker_id = coworkers[row['idUser']]
|
158
|
-
coworker = rootmodel.find_coworker_by_integration_id(coworker_id)
|
150
|
+
def to_organization_note(row, rootmodel)
|
151
|
+
organization = rootmodel.find_organization_by_integration_id(row['idCompany'])
|
152
|
+
coworker = rootmodel.find_coworker_by_integration_id(row['idUser'])
|
159
153
|
|
160
154
|
if organization && coworker
|
161
155
|
note = GoImport::Note.new()
|
162
156
|
note.organization = organization
|
163
157
|
note.created_by = coworker
|
164
|
-
note.person = organization.find_employee_by_integration_id(
|
158
|
+
note.person = organization.find_employee_by_integration_id(row['idPerson'])
|
165
159
|
note.date = row['Date']
|
166
160
|
note.text = "#{row['Category']}: #{row['History']}"
|
167
161
|
|
@@ -171,35 +165,47 @@ def to_organization_note(row, coworkers, people, rootmodel)
|
|
171
165
|
return nil
|
172
166
|
end
|
173
167
|
|
174
|
-
def to_organization_document(row,
|
168
|
+
def to_organization_document(row, rootmodel)
|
175
169
|
file = GoImport::File.new()
|
176
170
|
|
177
|
-
file.integration_id = row['
|
171
|
+
file.integration_id = "o-#{row['idDocument']}"
|
178
172
|
file.path = row['Path']
|
179
173
|
file.name = row['Comment']
|
180
174
|
|
181
|
-
|
182
|
-
file.
|
183
|
-
file.organization = rootmodel.find_organization_by_integration_id(row['PowerSellCompanyID'])
|
175
|
+
file.created_by = rootmodel.find_coworker_by_integration_id(row['idUser-Created'])
|
176
|
+
file.organization = rootmodel.find_organization_by_integration_id(row['idCompany'])
|
184
177
|
|
185
178
|
return file
|
186
179
|
end
|
187
180
|
|
181
|
+
def from_project_document_to_organization_document(row, includes, rootmodel)
|
182
|
+
file = GoImport::File.new()
|
183
|
+
|
184
|
+
file.integration_id = "d-#{row['idDocument']}"
|
185
|
+
file.path = row['Path']
|
186
|
+
file.name = row['Comment']
|
187
|
+
|
188
|
+
file.created_by = rootmodel.find_coworker_by_integration_id(row['idUser-Created'])
|
189
|
+
|
190
|
+
organization_id = includes[row['idProject']]
|
191
|
+
file.organization = rootmodel.find_organization_by_integration_id(organization_id)
|
192
|
+
end
|
193
|
+
|
188
194
|
def init_deal(row, rootmodel, includes)
|
189
195
|
deal = GoImport::Deal.new
|
190
196
|
|
191
|
-
deal.integration_id = row['
|
197
|
+
deal.integration_id = row['idProject']
|
192
198
|
deal.name = row['Name']
|
193
199
|
deal.description = row['Description']
|
194
200
|
|
195
201
|
if defined?(DEAL_RESPONSIBLE_FIELD) && !DEAL_RESPONSIBLE_FIELD.nil? && !DEAL_RESPONSIBLE_FIELD.empty?
|
196
|
-
coworker_id =
|
202
|
+
coworker_id = row["isUser-#{DEAL_RESPONSIBLE_FIELD}"]
|
197
203
|
deal.responsible_coworker = rootmodel.find_coworker_by_integration_id(coworker_id)
|
198
204
|
end
|
199
205
|
|
200
206
|
# Make the deal - organization connection
|
201
207
|
if includes
|
202
|
-
organization_id = includes[row['
|
208
|
+
organization_id = includes[row['idProject']]
|
203
209
|
organization = rootmodel.find_organization_by_integration_id(organization_id)
|
204
210
|
if organization
|
205
211
|
deal.customer = organization
|
@@ -211,16 +217,13 @@ end
|
|
211
217
|
|
212
218
|
# Turns a row from the Easy exported Project-History.txt file into
|
213
219
|
# a go_import model that is used to generate xml
|
214
|
-
|
215
|
-
def to_deal_note(row, coworkers, rootmodel)
|
220
|
+
def to_deal_note(row, rootmodel)
|
216
221
|
# TODO: This could be improved to read a person from an
|
217
222
|
# organization connected to this deal if any, but since it is
|
218
223
|
# a many to many connection between organizations and deals
|
219
224
|
# it's not a straight forward task
|
220
|
-
deal = rootmodel.find_deal_by_integration_id(row['
|
221
|
-
|
222
|
-
coworker_id = coworkers[row['idUser']]
|
223
|
-
coworker = rootmodel.find_coworker_by_integration_id(coworker_id)
|
225
|
+
deal = rootmodel.find_deal_by_integration_id(row['idProject'])
|
226
|
+
coworker = rootmodel.find_coworker_by_integration_id(row['idUser'])
|
224
227
|
|
225
228
|
if deal && coworker
|
226
229
|
note = GoImport::Note.new()
|
@@ -280,5 +283,6 @@ def make_sure_database_has_been_exported()
|
|
280
283
|
File.exists?(PERSON_FILE) &&
|
281
284
|
File.exists?(INCLUDE_FILE) &&
|
282
285
|
File.exists?(DEAL_FILE) &&
|
283
|
-
File.exists?(DEAL_NOTE_FILE)
|
286
|
+
File.exists?(DEAL_NOTE_FILE) &&
|
287
|
+
File.exists?(PROJECT_DOCUMENT_FILE)
|
284
288
|
end
|
data/sources/easy/converter.rb
CHANGED
@@ -48,6 +48,21 @@ require 'go_import'
|
|
48
48
|
# set the name of the deal-responsible field.
|
49
49
|
# DEAL_RESPONSIBLE_FIELD = "Responsible"
|
50
50
|
|
51
|
+
# If you are importing files then you must set the FILES_FOLDER
|
52
|
+
# constant. FILES_FOLDER should point to the folder where the files
|
53
|
+
# are stored. FILES_FOLDER can be relative to the project directory
|
54
|
+
# or absolute. Note that you need to escape \ with a \ so in order to
|
55
|
+
# write \ use \\.
|
56
|
+
FILES_FOLDER = "./files"
|
57
|
+
|
58
|
+
# If you are importing files with an absolute path (eg
|
59
|
+
# m:\documents\readme.doc) then you probably wont have files at that
|
60
|
+
# location on the computer where "go-import run" is executed. Set
|
61
|
+
# FILES_FOLDER_AT_CUSTOMER to the folder where documents are stored at
|
62
|
+
# the customers site. Ie, in this example m:\documents.
|
63
|
+
# Note that you need to escape \ with a \ so in order to write \ use
|
64
|
+
# \\.
|
65
|
+
FILES_FOLDER_AT_CUSTOMER = "m:\\documents\\"
|
51
66
|
|
52
67
|
class Converter
|
53
68
|
# Reads a row from the Easy exported Company.txt
|
data/sources/excel/converter.rb
CHANGED
@@ -25,8 +25,21 @@ FILE_SHEET = "Dokument"
|
|
25
25
|
# command:
|
26
26
|
# go-import run
|
27
27
|
|
28
|
-
# If you
|
29
|
-
FILES_FOLDER
|
28
|
+
# If you are importing files then you must set the FILES_FOLDER
|
29
|
+
# constant. FILES_FOLDER should point to the folder where the files
|
30
|
+
# are stored. FILES_FOLDER can be relative to the project directory
|
31
|
+
# or absolute. Note that you need to escape \ with a \ so in order to
|
32
|
+
# write \ use \\.
|
33
|
+
FILES_FOLDER = "./files"
|
34
|
+
|
35
|
+
# If you are importing files with an absolute path (eg
|
36
|
+
# m:\documents\readme.doc) then you probably wont have files at that
|
37
|
+
# location on the computer where "go-import run" is executed. Set
|
38
|
+
# FILES_FOLDER_AT_CUSTOMER to the folder where documents are stored at
|
39
|
+
# the customers site. Ie, in this example m:\documents.
|
40
|
+
# Note that you need to escape \ with a \ so in order to write \ use
|
41
|
+
# \\.
|
42
|
+
FILES_FOLDER_AT_CUSTOMER = "m:\\documents\\"
|
30
43
|
|
31
44
|
class Converter
|
32
45
|
def configure(rootmodel)
|
data/spec/file_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe "File" do
|
|
8
8
|
|
9
9
|
it "is valid when it has path, created_by and organization" do
|
10
10
|
# given
|
11
|
-
file.path = "spec
|
11
|
+
file.path = "spec/sample_data/offert.docx"
|
12
12
|
file.created_by = GoImport::CoworkerReference.new( { :integration_id => "123" } )
|
13
13
|
file.organization = GoImport::OrganizationReference.new( { :integration_id => "456" } )
|
14
14
|
|
@@ -19,7 +19,7 @@ describe "File" do
|
|
19
19
|
it "is valid when it has name, path, created_by and deal" do
|
20
20
|
# given
|
21
21
|
file.name = "Offert"
|
22
|
-
file.path = "spec
|
22
|
+
file.path = "spec/sample_data/offert.docx"
|
23
23
|
file.created_by = GoImport::CoworkerReference.new( { :integration_id => "123" } )
|
24
24
|
file.deal = GoImport::DealReference.new( { :integration_id => "456" } )
|
25
25
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: go_import
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-
|
15
|
+
date: 2014-10-02 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: iso_country_codes
|