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,359 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GoImport
|
3
|
+
# The root model for Go import. This class is the container for everything else.
|
4
|
+
class RootModel
|
5
|
+
# the import_coworker is a special coworker that is set as
|
6
|
+
# responsible for objects that requires a coworker, eg a note.
|
7
|
+
attr_accessor :import_coworker
|
8
|
+
|
9
|
+
attr_accessor :settings, :organizations, :coworkers, :deals, :notes
|
10
|
+
|
11
|
+
attr_reader :documents
|
12
|
+
|
13
|
+
def serialize_variables
|
14
|
+
[
|
15
|
+
{:id => :settings, :type => :settings},
|
16
|
+
{:id => :coworkers, :type => :coworkers},
|
17
|
+
{:id => :organizations, :type => :organizations},
|
18
|
+
{:id => :deals, :type => :deals},
|
19
|
+
{:id => :notes, :type => :notes},
|
20
|
+
{:id => :documents, :type => :documents},
|
21
|
+
]
|
22
|
+
end
|
23
|
+
|
24
|
+
def serialize_name
|
25
|
+
"GoImport"
|
26
|
+
end
|
27
|
+
|
28
|
+
include SerializeHelper
|
29
|
+
|
30
|
+
def initialize()
|
31
|
+
@settings = Settings.new
|
32
|
+
@organizations = []
|
33
|
+
@coworkers = []
|
34
|
+
@import_coworker = Coworker.new
|
35
|
+
@import_coworker.integration_id = "import"
|
36
|
+
@import_coworker.first_name = "Import"
|
37
|
+
@coworkers.push @import_coworker
|
38
|
+
@deals = []
|
39
|
+
@notes = []
|
40
|
+
@documents = Documents.new
|
41
|
+
end
|
42
|
+
|
43
|
+
# Adds the specifed coworker object to the model.
|
44
|
+
# @example Add a coworker from a hash
|
45
|
+
# rootmodel.add_coworker({
|
46
|
+
# :integration_id=>"123",
|
47
|
+
# :first_name=>"Kalle",
|
48
|
+
# :last_name=>"Anka",
|
49
|
+
# :email=>"kalle.anka@vonanka.com"
|
50
|
+
# })
|
51
|
+
#
|
52
|
+
# @example Add a coworker from a new coworker
|
53
|
+
# coworker = GoImport::Coworker.new
|
54
|
+
# coworker.integration_id = "123"
|
55
|
+
# coworker.first_name="Kalle"
|
56
|
+
# coworker.last_name="Anka"
|
57
|
+
# coworker.email = "kalle.anka@vonanka.com"
|
58
|
+
# rootmodel.add_coworker(coworker)
|
59
|
+
#
|
60
|
+
# @example If you want to keep adding coworkers and dont care about duplicates not being added
|
61
|
+
# begin
|
62
|
+
# rootmodel.add_coworker(coworker)
|
63
|
+
# rescue GoImport::AlreadyAddedError
|
64
|
+
# puts "Warning: already added coworker"
|
65
|
+
# end
|
66
|
+
# @see Coworker
|
67
|
+
def add_coworker(coworker)
|
68
|
+
@coworkers = [] if @coworkers == nil
|
69
|
+
|
70
|
+
if coworker.nil?
|
71
|
+
return nil
|
72
|
+
end
|
73
|
+
|
74
|
+
coworker = Coworker.new(coworker) if !coworker.is_a?(Coworker)
|
75
|
+
|
76
|
+
if find_coworker_by_integration_id(coworker.integration_id) != nil
|
77
|
+
raise AlreadyAddedError, "Already added a coworker with integration_id #{coworker.integration_id}"
|
78
|
+
end
|
79
|
+
|
80
|
+
@coworkers.push(coworker)
|
81
|
+
|
82
|
+
return coworker
|
83
|
+
end
|
84
|
+
|
85
|
+
# Adds the specifed organization object to the model.
|
86
|
+
# @example Add an organization from a hash
|
87
|
+
# rootmodel.add_organization({
|
88
|
+
# :integration_id => "123",
|
89
|
+
# :name => "Beagle Boys",
|
90
|
+
# })
|
91
|
+
#
|
92
|
+
# @example Add an organization from a new organization
|
93
|
+
# organization = GoImport::Organization.new
|
94
|
+
# organization.integration_id = "123"
|
95
|
+
# organization.name = "Beagle Boys"
|
96
|
+
# rootmodel.add_organization(organization)
|
97
|
+
#
|
98
|
+
# @example If you want to keep adding organizations and dont
|
99
|
+
# care about duplicates not being added. Your model might not
|
100
|
+
# be saved due to duplicate integration_ids.
|
101
|
+
# begin
|
102
|
+
# rootmodel.add_organization(organization)
|
103
|
+
# rescue GoImport::AlreadyAddedError
|
104
|
+
# puts "Warning: already added organization"
|
105
|
+
# end
|
106
|
+
# @see Coworker
|
107
|
+
def add_organization(organization)
|
108
|
+
@organizations = [] if @organizations.nil?
|
109
|
+
|
110
|
+
if organization.nil?
|
111
|
+
return nil
|
112
|
+
end
|
113
|
+
|
114
|
+
organization = Organization.new(organization) if !organization.is_a?(Organization)
|
115
|
+
|
116
|
+
if find_organization_by_integration_id(organization.integration_id) != nil
|
117
|
+
raise AlreadyAddedError, "Already added an organization with integration_id #(organization.integration_id)"
|
118
|
+
end
|
119
|
+
|
120
|
+
@organizations.push(organization)
|
121
|
+
|
122
|
+
return organization
|
123
|
+
end
|
124
|
+
|
125
|
+
# Adds the specifed deal object to the model.
|
126
|
+
# @example Add an deal from a hash
|
127
|
+
# rootmodel.add_deal({
|
128
|
+
# :integration_id => "123",
|
129
|
+
# :name => "Big deal",
|
130
|
+
# })
|
131
|
+
#
|
132
|
+
# @example Add a deal from a new deal
|
133
|
+
# deal = GoImport::Deal.new
|
134
|
+
# deal.integration_id = "123"
|
135
|
+
# deal.name = "Big deal"
|
136
|
+
# rootmodel.add_deal(deal)
|
137
|
+
#
|
138
|
+
# @example If you want to keep adding deals and dont
|
139
|
+
# care about duplicates not being added. Your model might not
|
140
|
+
# be saved due to duplicate integration_ids.
|
141
|
+
# begin
|
142
|
+
# rootmodel.add_deal(deal)
|
143
|
+
# rescue GoImport::AlreadyAddedError
|
144
|
+
# puts "Warning: already added deal"
|
145
|
+
# end
|
146
|
+
# @see Coworker
|
147
|
+
def add_deal(deal)
|
148
|
+
@deals = [] if @deals.nil?
|
149
|
+
|
150
|
+
if deal.nil?
|
151
|
+
return nil
|
152
|
+
end
|
153
|
+
|
154
|
+
deal = Deal.new(deal) if !deal.is_a?(Deal)
|
155
|
+
|
156
|
+
if find_deal_by_integration_id(deal.integration_id) != nil
|
157
|
+
raise AlreadyAddedError, "Already added a deal with integration_id #{deal.integration_id}"
|
158
|
+
end
|
159
|
+
|
160
|
+
if deal.responsible_coworker.nil?
|
161
|
+
deal.responsible_coworker = @import_coworker
|
162
|
+
end
|
163
|
+
|
164
|
+
@deals.push(deal)
|
165
|
+
|
166
|
+
return deal
|
167
|
+
end
|
168
|
+
|
169
|
+
# Adds the specifed note object to the model.
|
170
|
+
# @example Add an deal from a hash
|
171
|
+
# rootmodel.add_note({
|
172
|
+
# :integration_id => "123",
|
173
|
+
# :text => "This is a note",
|
174
|
+
# })
|
175
|
+
#
|
176
|
+
# @example Add a note from a new note
|
177
|
+
# note = GoImport::Note.new
|
178
|
+
# note.integration_id = "123"
|
179
|
+
# note.text = "Big deal"
|
180
|
+
# rootmodel.add_note(note)
|
181
|
+
#
|
182
|
+
# @example If you want to keep adding deals and dont
|
183
|
+
# care about duplicates not being added. Your model might not
|
184
|
+
# be saved due to duplicate integration_ids.
|
185
|
+
# begin
|
186
|
+
# rootmodel.add_deal(deal)
|
187
|
+
# rescue GoImport::AlreadyAddedError
|
188
|
+
# puts "Warning: already added deal"
|
189
|
+
# end
|
190
|
+
# @see Coworker
|
191
|
+
def add_note(note)
|
192
|
+
@notes = [] if @notes == nil
|
193
|
+
|
194
|
+
if note.nil?
|
195
|
+
return nil
|
196
|
+
end
|
197
|
+
|
198
|
+
note = Note.new(note) if !note.is_a?(Note)
|
199
|
+
|
200
|
+
if (!note.integration_id.nil? && note.integration_id.length > 0) &&
|
201
|
+
find_note_by_integration_id(note.integration_id) != nil
|
202
|
+
raise AlreadyAddedError, "Already added a note with integration_id #{note.integration_id}"
|
203
|
+
end
|
204
|
+
|
205
|
+
@notes.push(note)
|
206
|
+
|
207
|
+
return note
|
208
|
+
end
|
209
|
+
|
210
|
+
def add_link(link)
|
211
|
+
@documents = Documents.new if @documents == nil
|
212
|
+
|
213
|
+
return @documents.add_link(link)
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
def find_coworker_by_integration_id(integration_id)
|
218
|
+
return @coworkers.find do |coworker|
|
219
|
+
coworker.integration_id == integration_id
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def find_organization_by_integration_id(integration_id)
|
224
|
+
return @organizations.find do |organization|
|
225
|
+
organization.integration_id == integration_id
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def find_person_by_integration_id(integration_id)
|
230
|
+
return nil if @organizations.nil?
|
231
|
+
@organizations.each do |organization|
|
232
|
+
person = organization.find_employee_by_integration_id(integration_id)
|
233
|
+
return person if person
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def find_note_by_integration_id(integration_id)
|
238
|
+
return @notes.find do |note|
|
239
|
+
note.integration_id == integration_id
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
# find deals for organization using {Organization#integration_id}
|
244
|
+
def find_deals_for_organization(organization)
|
245
|
+
deals = []
|
246
|
+
|
247
|
+
deals = @deals.select do |deal|
|
248
|
+
!deal.customer.nil? && deal.customer.integration_id == organization.integration_id
|
249
|
+
end
|
250
|
+
|
251
|
+
return deals
|
252
|
+
end
|
253
|
+
|
254
|
+
def find_deal_by_integration_id(integration_id)
|
255
|
+
return @deals.find do |deal|
|
256
|
+
deal.integration_id == integration_id
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
# Returns a string describing problems with the data. For instance if integration_id for any entity is not unique.
|
261
|
+
def sanity_check
|
262
|
+
error = String.new
|
263
|
+
|
264
|
+
dups = get_integration_id_duplicates(with_non_empty_integration_id(@coworkers))
|
265
|
+
dups_error_items = (dups.collect{|coworker| coworker.integration_id}).compact
|
266
|
+
if dups.length > 0
|
267
|
+
error = "#{error}\nDuplicate coworker integration_id: #{dups_error_items.join(", ")}."
|
268
|
+
end
|
269
|
+
|
270
|
+
dups = get_integration_id_duplicates(with_non_empty_integration_id(@organizations))
|
271
|
+
dups_error_items = (dups.collect{|org| org.integration_id}).compact
|
272
|
+
if dups.length > 0
|
273
|
+
error = "#{error}\nDuplicate organization integration_id: #{dups_error_items.join(", ")}."
|
274
|
+
end
|
275
|
+
|
276
|
+
dups = get_integration_id_duplicates(with_non_empty_integration_id(@deals))
|
277
|
+
dups_error_items = (dups.collect{|deal| deal.integration_id}).compact
|
278
|
+
if dups_error_items.length > 0
|
279
|
+
error = "#{error}\nDuplicate deal integration_id: #{dups_error_items.join(", ")}."
|
280
|
+
end
|
281
|
+
|
282
|
+
persons = @organizations.collect{|o| o.employees}.flatten.compact
|
283
|
+
dups = get_integration_id_duplicates(with_non_empty_integration_id(persons))
|
284
|
+
dups_error_items = (dups.collect{|person| person.integration_id}).compact
|
285
|
+
if dups_error_items.length > 0
|
286
|
+
error = "#{error}\nDuplicate person integration_id: #{dups_error_items.join(", ")}."
|
287
|
+
end
|
288
|
+
|
289
|
+
dups = get_integration_id_duplicates(with_non_empty_integration_id(@documents.links))
|
290
|
+
dups_error_items = (dups.collect{|l| l.integration_id}).compact
|
291
|
+
if dups_error_items.length > 0
|
292
|
+
error = "#{error}\nDuplicate link integration_id: #{dups_error_items.join(", ")}."
|
293
|
+
end
|
294
|
+
|
295
|
+
return error.strip
|
296
|
+
end
|
297
|
+
|
298
|
+
def validate()
|
299
|
+
error = String.new
|
300
|
+
|
301
|
+
@organizations.each do |o|
|
302
|
+
validation_message = o.validate()
|
303
|
+
|
304
|
+
if !validation_message.empty?
|
305
|
+
error = "#{error}\n#{validation_message}"
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
@deals.each do |deal|
|
310
|
+
validation_message = deal.validate
|
311
|
+
|
312
|
+
if !validation_message.empty?
|
313
|
+
error = "#{error}\n#{validation_message}"
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
@notes.each do |note|
|
318
|
+
validation_message = note.validate
|
319
|
+
|
320
|
+
if !validation_message.empty?
|
321
|
+
error = "#{error}\n#{validation_message}"
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
@documents.links.each do |link|
|
326
|
+
validation_message = link.validate
|
327
|
+
if !validation_message.empty?
|
328
|
+
error = "#{error}\n#{validation_message}"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
return error.strip
|
333
|
+
end
|
334
|
+
|
335
|
+
# @!visibility private
|
336
|
+
def to_rexml(doc)
|
337
|
+
element_name = serialize_name
|
338
|
+
elem = doc.add_element(element_name,{"Version"=>"v2_0"})
|
339
|
+
SerializeHelper::serialize_variables_rexml(elem, self)
|
340
|
+
end
|
341
|
+
|
342
|
+
private
|
343
|
+
# returns all items from the object array with duplicate integration ids.
|
344
|
+
# To get all organizations with the same integration_id use
|
345
|
+
# @example Get all the organization duplicates with the same integration id
|
346
|
+
# rm.get_integration_id_duplicates(rm.organizations)
|
347
|
+
def get_integration_id_duplicates(objects)
|
348
|
+
uniq_items = objects.uniq {|item| item.integration_id}.compact
|
349
|
+
|
350
|
+
return (objects - uniq_items).compact
|
351
|
+
end
|
352
|
+
|
353
|
+
def with_non_empty_integration_id(objects)
|
354
|
+
return objects.select do |obj|
|
355
|
+
obj.integration_id != nil && !obj.integration_id.empty?
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GoImport
|
3
|
+
class Settings
|
4
|
+
include SerializeHelper
|
5
|
+
attr_reader :organization, :person, :deal
|
6
|
+
|
7
|
+
# @example Add custom fields available for organization
|
8
|
+
# rootmodel.settings.with_organization do |organization_settings|
|
9
|
+
# organization_settings.set_custom_field({:integration_id=>"link_to_bi_system", :title=>"Link to BI system"})
|
10
|
+
# organization_settings.set_custom_field({:integration_id=>"yield_quota", :title=>"Yield quota"})
|
11
|
+
# end
|
12
|
+
# @see ClassSettings
|
13
|
+
# @see CustomField
|
14
|
+
# @see RootModel
|
15
|
+
def with_organization
|
16
|
+
@organization = ClassSettings.new if @organization ==nil
|
17
|
+
yield @organization
|
18
|
+
end
|
19
|
+
|
20
|
+
# @example Add custom fields available for person
|
21
|
+
# rootmodel.settings.with_person do |person_settings|
|
22
|
+
# person_settings.set_custom_field({:integration_id=>"link_to_bi_system", :title=>"Link to BI system"})
|
23
|
+
# end
|
24
|
+
# @see ClassSettings
|
25
|
+
# @see CustomField
|
26
|
+
# @see RootModel
|
27
|
+
def with_person
|
28
|
+
@person = ClassSettings.new if @person ==nil
|
29
|
+
yield @person
|
30
|
+
end
|
31
|
+
|
32
|
+
# @example Add custom fields available for deal
|
33
|
+
# rootmodel.settings.with_deal do |deal_settings|
|
34
|
+
# deal_settings.set_custom_field({:integration_id=>"link_to_bi_system", :title=>"Link to BI system"})
|
35
|
+
# end
|
36
|
+
# @see ClassSettings
|
37
|
+
# @see CustomField
|
38
|
+
# @see RootModel
|
39
|
+
def with_deal
|
40
|
+
@deal = DealClassSettings.new if @deal ==nil
|
41
|
+
yield @deal
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(opt = nil)
|
45
|
+
if opt != nil
|
46
|
+
serialize_variables.each do |myattr|
|
47
|
+
val = opt[myattr[:id]]
|
48
|
+
instance_variable_set("@" + myattr[:id].to_s, val) if val != nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def serialize_variables
|
54
|
+
[:organization, :person, :deal].map {|p| {:id => p, :type => :class_settings} }
|
55
|
+
end
|
56
|
+
|
57
|
+
def serialize_name
|
58
|
+
"Settings"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module GoImport
|
4
|
+
class Tag
|
5
|
+
def serialize_name
|
6
|
+
"Tag"
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_accessor :value
|
10
|
+
|
11
|
+
def initialize(val=nil)
|
12
|
+
if val
|
13
|
+
@value = val
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# @!visibility private
|
18
|
+
def to_rexml(elem)
|
19
|
+
element_name = serialize_name
|
20
|
+
elem.add_element(element_name).text = @value.to_s.encode('utf-8')
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
return "tag: '#{@value}'"
|
25
|
+
end
|
26
|
+
|
27
|
+
def ==(other)
|
28
|
+
if other.respond_to?(:value)
|
29
|
+
return @value == other.value
|
30
|
+
else
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module GoImport
|
2
|
+
module ModelHasCustomFields
|
3
|
+
# @example
|
4
|
+
# value = row['business_value_partner_info']
|
5
|
+
# obj.set_custom_value("partner_info", value)
|
6
|
+
def set_custom_value(integration_id, value)
|
7
|
+
return set_custom_field({integration_id: integration_id, value: value})
|
8
|
+
end
|
9
|
+
# @example
|
10
|
+
# value = row['business_value_partner_info']
|
11
|
+
# obj.set_custom_field({:integration_id=>"partner_info", :value=>value})
|
12
|
+
def set_custom_field(obj)
|
13
|
+
@custom_values = [] if @custom_values == nil
|
14
|
+
value = obj[:value]
|
15
|
+
field = CustomFieldReference.new(obj)
|
16
|
+
custom_value = CustomValue.new
|
17
|
+
custom_value.value = value
|
18
|
+
custom_value.field = field
|
19
|
+
index = @custom_values.find_index do |custom_value|
|
20
|
+
custom_value.field.same_as?(field)
|
21
|
+
end
|
22
|
+
if index
|
23
|
+
@custom_values.delete_at index
|
24
|
+
end
|
25
|
+
|
26
|
+
@custom_values.push custom_value
|
27
|
+
return custom_value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module ModelWithIntegrationIdSameAs
|
32
|
+
# check if other is same as regarding integration_id or id
|
33
|
+
def same_as?(other)
|
34
|
+
if @integration_id != nil && @integration_id == other.integration_id
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
if @id != nil && @id == other.id
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module ModelHasTags
|
45
|
+
# @example
|
46
|
+
# obj.set_tag("partner")
|
47
|
+
def set_tag(str)
|
48
|
+
@tags = [] if @tags == nil
|
49
|
+
if ! @tags.any? {|tag| tag.value == str }
|
50
|
+
@tags.push(Tag.new(str))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'global_phone'
|
2
|
+
|
3
|
+
module GoImport
|
4
|
+
# The PhoneHelper helps you parse and format phone number strings
|
5
|
+
# into pretty looking numbers.
|
6
|
+
class PhoneHelper
|
7
|
+
GlobalPhone.db_path = File.join(File.dirname(__FILE__), 'global_phone.json')
|
8
|
+
GlobalPhone.default_territory_name = :se
|
9
|
+
|
10
|
+
# Sets the country code used during parsning. The default is
|
11
|
+
# swedish (:se) and if you are parsing swedish numbers you
|
12
|
+
# dont need to set the country code.
|
13
|
+
def self.set_country_code(country_code)
|
14
|
+
GlobalPhone.default_territory_name = country_code
|
15
|
+
end
|
16
|
+
|
17
|
+
# Parses the specifed number_string and returns only valid
|
18
|
+
# numbers.
|
19
|
+
# @see parse_numbers
|
20
|
+
def self.parse_numbers_strict(number_string, delimiters = ',')
|
21
|
+
parse_numbers number_string, delimiters, true
|
22
|
+
end
|
23
|
+
|
24
|
+
# Parses the specified number_string into one or more phone
|
25
|
+
# numbers using the specified delimiters. If strict_mode is
|
26
|
+
# true only valid numbers are returned, otherwise are invalid
|
27
|
+
# numbers returned as found in the number_string.
|
28
|
+
#
|
29
|
+
# @example Parse a number
|
30
|
+
# number = GoImport::PhoneHelper.parse_numbers("046 - 270 48 00")
|
31
|
+
#
|
32
|
+
# @example Parses a string with two numbers and a custom delimiter
|
33
|
+
# source = "046 - 270 48 00/ 031-712 44 00"
|
34
|
+
# number1, number2 = GoImport::PhoneHelper.parse_numbers(source, '/')
|
35
|
+
def self.parse_numbers(number_string, delimiters = ',', strict_mode = false)
|
36
|
+
numbers = []
|
37
|
+
|
38
|
+
if delimiters.is_a?(Array)
|
39
|
+
# we have several delimiters, replace all delimiters
|
40
|
+
# in the number_string with the first delimiter
|
41
|
+
delimiters.each do |del|
|
42
|
+
number_string = number_string.sub(del, delimiters[0])
|
43
|
+
end
|
44
|
+
delimiter = delimiters[0]
|
45
|
+
elsif delimiters.is_a?(String)
|
46
|
+
delimiter = delimiters
|
47
|
+
else
|
48
|
+
raise "delimiters should be either a string or and array of strings"
|
49
|
+
end
|
50
|
+
|
51
|
+
number_string.split(delimiter).each do |possible_number|
|
52
|
+
if !possible_number.empty?
|
53
|
+
number = GlobalPhone.parse([possible_number])
|
54
|
+
|
55
|
+
if !number.nil? && number.valid?
|
56
|
+
numbers.push number.to_s
|
57
|
+
else
|
58
|
+
if !strict_mode
|
59
|
+
numbers.push possible_number
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
if numbers.length == 0
|
66
|
+
return ""
|
67
|
+
elsif numbers.length == 1
|
68
|
+
return numbers[0]
|
69
|
+
else
|
70
|
+
return numbers
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require "csv"
|
2
|
+
module GoImport
|
3
|
+
# @example transform xlsx file into rows
|
4
|
+
# organizations_path = File.join(File.dirname(__FILE__), 'organizations.xlsx') # same path as this file
|
5
|
+
# rows = GoImport::RooHelper.new(Roo::Excelx.new(organizations_path)).rows
|
6
|
+
class RooHelper
|
7
|
+
|
8
|
+
def initialize(data)
|
9
|
+
@data = data
|
10
|
+
@default_sheet = data.sheets.first
|
11
|
+
end
|
12
|
+
|
13
|
+
# Get rows for the first sheet.
|
14
|
+
# The rows are hashes of the first row of cells as header cells and the rest as content.
|
15
|
+
# @example If the header 'Name' and the second column contains 'Johan'.
|
16
|
+
# GoImport::RooHelper.new(Roo::Excelx.new(file_path)).rows
|
17
|
+
# # returns:
|
18
|
+
# [{'Name'=>'Johan'}]
|
19
|
+
def rows
|
20
|
+
return rows_for_sheet(@default_sheet)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns true if the current workbook has a sheet with the
|
24
|
+
# specifed name. This is case sensitive.
|
25
|
+
def has_sheet?(name)
|
26
|
+
sheet = @data.sheets.find { |s| s.to_s == name}
|
27
|
+
|
28
|
+
return !sheet.nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
# @example transform xlsx file into rows for the second sheet
|
32
|
+
# data = Roo::Excelx.new(organizations_path)
|
33
|
+
# rows = GoImport::RooHelper.new(data).rows_for_sheet(data.sheets[1])
|
34
|
+
def rows_for_sheet(sheet)
|
35
|
+
column_headers = {}
|
36
|
+
1.upto(@data.last_column(sheet)) do |col|
|
37
|
+
column_headers[col] = @data.cell(1, col, sheet).encode('UTF-8')
|
38
|
+
end
|
39
|
+
|
40
|
+
rs = []
|
41
|
+
2.upto(@data.last_row(sheet)) do |row|
|
42
|
+
r = {}
|
43
|
+
1.upto(@data.last_column(sheet)) do |col|
|
44
|
+
val = cell_to_csv(row, col, sheet)
|
45
|
+
r[column_headers[col]] = val
|
46
|
+
end
|
47
|
+
rs.push(r)
|
48
|
+
end
|
49
|
+
return rs
|
50
|
+
end
|
51
|
+
|
52
|
+
def cell_to_csv(row, col, sheet)
|
53
|
+
if @data.empty?(row,col,sheet)
|
54
|
+
''
|
55
|
+
else
|
56
|
+
onecell = @data.cell(row,col,sheet)
|
57
|
+
case @data.celltype(row,col,sheet)
|
58
|
+
when :string
|
59
|
+
unless onecell.empty?
|
60
|
+
onecell.encode('UTF-8').strip
|
61
|
+
end
|
62
|
+
when :float, :percentage
|
63
|
+
if onecell == onecell.to_i
|
64
|
+
onecell.to_i.to_s
|
65
|
+
else
|
66
|
+
onecell.to_s
|
67
|
+
end
|
68
|
+
when :date, :datetime
|
69
|
+
onecell.to_s
|
70
|
+
when :time
|
71
|
+
Roo::Base.integer_to_timestring(onecell)
|
72
|
+
when :formula
|
73
|
+
onecell.to_s
|
74
|
+
else
|
75
|
+
raise "unhandled celltype #{@data.celltype(row,col,sheet)} for cell at row: #{row}, col: #{col} in sheet #{sheet}"
|
76
|
+
end || ""
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|