fruit_to_lime 2.5.6 → 2.5.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/fruit_to_lime/model/rootmodel.rb +13 -13
- data/spec/rootmodel_spec.rb +33 -0
- data/templates/easy/lib/tomodel.rb +113 -58
- metadata +2 -2
@@ -62,8 +62,8 @@ module FruitToLime
|
|
62
62
|
def add_coworker(coworker)
|
63
63
|
@coworkers = [] if @coworkers == nil
|
64
64
|
|
65
|
-
if coworker
|
66
|
-
|
65
|
+
if coworker.nil?
|
66
|
+
return nil
|
67
67
|
end
|
68
68
|
|
69
69
|
coworker = Coworker.new(coworker) if !coworker.is_a?(Coworker)
|
@@ -103,7 +103,7 @@ module FruitToLime
|
|
103
103
|
@organizations = [] if @organizations.nil?
|
104
104
|
|
105
105
|
if organization.nil?
|
106
|
-
|
106
|
+
return nil
|
107
107
|
end
|
108
108
|
|
109
109
|
organization = Organization.new(organization) if !organization.is_a?(Organization)
|
@@ -143,7 +143,7 @@ module FruitToLime
|
|
143
143
|
@deals = [] if @deals.nil?
|
144
144
|
|
145
145
|
if deal.nil?
|
146
|
-
|
146
|
+
return nil
|
147
147
|
end
|
148
148
|
|
149
149
|
deal = Deal.new(deal) if !deal.is_a?(Deal)
|
@@ -187,8 +187,8 @@ module FruitToLime
|
|
187
187
|
@notes = [] if @notes == nil
|
188
188
|
|
189
189
|
if note.nil?
|
190
|
-
|
191
|
-
|
190
|
+
return nil
|
191
|
+
end
|
192
192
|
|
193
193
|
note = Note.new(note) if !note.is_a?(Note)
|
194
194
|
|
@@ -202,13 +202,13 @@ module FruitToLime
|
|
202
202
|
return note
|
203
203
|
end
|
204
204
|
|
205
|
-
def with_new_note
|
206
|
-
|
205
|
+
# def with_new_note
|
206
|
+
# @notes = [] if @notes == nil
|
207
207
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
end
|
208
|
+
# note = Note.new
|
209
|
+
# @notes.push note
|
210
|
+
# yield note
|
211
|
+
# end
|
212
212
|
|
213
213
|
def find_coworker_by_integration_id(integration_id)
|
214
214
|
return @coworkers.find do |coworker|
|
@@ -335,7 +335,7 @@ module FruitToLime
|
|
335
335
|
|
336
336
|
def with_non_empty_integration_id(objects)
|
337
337
|
return objects.select do |obj|
|
338
|
-
obj.integration_id!=nil && !obj.integration_id.empty?
|
338
|
+
obj.integration_id != nil && !obj.integration_id.empty?
|
339
339
|
end
|
340
340
|
end
|
341
341
|
end
|
data/spec/rootmodel_spec.rb
CHANGED
@@ -191,6 +191,39 @@ describe "RootModel" do
|
|
191
191
|
rootmodel.notes.length.should eq 1
|
192
192
|
end
|
193
193
|
|
194
|
+
it "will not add a nil note" do
|
195
|
+
# given, when
|
196
|
+
rootmodel.add_note(nil)
|
197
|
+
|
198
|
+
# then
|
199
|
+
rootmodel.notes.length.should eq 0
|
200
|
+
end
|
201
|
+
|
202
|
+
it "will not add a nil organization" do
|
203
|
+
# given, when
|
204
|
+
rootmodel.add_organization(nil)
|
205
|
+
|
206
|
+
# then
|
207
|
+
rootmodel.organizations.length.should eq 0
|
208
|
+
end
|
209
|
+
|
210
|
+
it "will not add a nil deal" do
|
211
|
+
# given, when
|
212
|
+
rootmodel.add_deal(nil)
|
213
|
+
|
214
|
+
# then
|
215
|
+
rootmodel.deals.length.should eq 0
|
216
|
+
end
|
217
|
+
|
218
|
+
it "will not add a nil coworker" do
|
219
|
+
# given, when
|
220
|
+
rootmodel.add_coworker(nil)
|
221
|
+
|
222
|
+
# then
|
223
|
+
# 1 since we always have the import coworker
|
224
|
+
rootmodel.coworkers.length.should eq 1
|
225
|
+
end
|
226
|
+
|
194
227
|
it "will not add a new organizations when the organizations is already added (same integration id)" do
|
195
228
|
# given
|
196
229
|
rootmodel.add_note({
|
@@ -7,7 +7,7 @@ class Exporter
|
|
7
7
|
def to_coworker(row)
|
8
8
|
coworker = FruitToLime::Coworker.new
|
9
9
|
# integration_id is typically the userId in Easy
|
10
|
-
# Must be set to be able to import the same file more
|
10
|
+
# Must be set to be able to import the same file more
|
11
11
|
# than once without creating duplicates
|
12
12
|
coworker.integration_id = row['userId']
|
13
13
|
coworker.parse_name_to_firstname_lastname_se(row['Name'])
|
@@ -15,20 +15,21 @@ class Exporter
|
|
15
15
|
return coworker
|
16
16
|
end
|
17
17
|
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
21
|
-
def to_organization(row, rootmodel, coworkers)
|
18
|
+
# Turns a row from the Easy exported Company.txt file into a
|
19
|
+
# fruit_to_lime model that is used to generate xml
|
20
|
+
def to_organization(row, coworkers)
|
22
21
|
organization = FruitToLime::Organization.new
|
23
22
|
# integration_id is typically the company Id in Easy
|
24
|
-
# Must be set to be able to import the same file more
|
23
|
+
# Must be set to be able to import the same file more
|
25
24
|
# than once without creating duplicates
|
26
|
-
|
25
|
+
|
27
26
|
# Easy standard fields
|
28
27
|
organization.integration_id = row['companyId']
|
29
28
|
organization.name = row['company name']
|
30
29
|
organization.central_phone_number = row['Telephone']
|
31
30
|
|
31
|
+
# NOTE!! if a bisnode-id is present maybe you want to
|
32
|
+
# consider not setting this.
|
32
33
|
# Addresses consists of several parts in Go.
|
33
34
|
# Lots of other systems have the address all in one
|
34
35
|
# line, to be able to match when importing it is
|
@@ -44,15 +45,16 @@ class Exporter
|
|
44
45
|
organization.email = row['e-mail']
|
45
46
|
organization.web_site = row['website']
|
46
47
|
|
48
|
+
# Same as postal address
|
47
49
|
organization.with_visit_address do |addr|
|
48
50
|
addr.street = row['visit street']
|
49
51
|
addr.zip_code = row['visit zip']
|
50
52
|
addr.city = row['visit city']
|
51
53
|
end
|
52
|
-
|
54
|
+
|
53
55
|
# Set Bisnode Id if present
|
54
56
|
bisnode_id = row['Bisnode-id']
|
55
|
-
|
57
|
+
|
56
58
|
if bisnode_id && !bisnode_id.empty?
|
57
59
|
organization.with_source do |source|
|
58
60
|
source.par_se(bisnode_id)
|
@@ -64,10 +66,10 @@ class Exporter
|
|
64
66
|
organization.organization_number = row['orgnr']
|
65
67
|
end
|
66
68
|
|
69
|
+
# Responsible coworker for the organization.
|
70
|
+
# For instance responsible sales rep.
|
67
71
|
coworker_id = coworkers[row['userIndex - our reference']]
|
68
|
-
organization.responsible_coworker = rootmodel.find_coworker_by_integration_id(coworker_id)
|
69
|
-
|
70
|
-
# relation
|
72
|
+
organization.responsible_coworker = @rootmodel.find_coworker_by_integration_id(coworker_id)
|
71
73
|
|
72
74
|
# Tags are set and defined at the same place
|
73
75
|
# Setting a tag: Imported is useful for the user
|
@@ -78,13 +80,41 @@ class Exporter
|
|
78
80
|
# has the options "A-customer", "B-customer", and "C-customer"
|
79
81
|
organization.set_tag(row['customer category'])
|
80
82
|
|
83
|
+
# Relation
|
84
|
+
# let's say that there is a option field in Easy called 'Customer relation'
|
85
|
+
# with the options '1.Customer', '2.Prospect' '3.Partner' and '4.Lost customer'
|
86
|
+
if row['Customer relation'] == '1.Customer'
|
87
|
+
# We have made a deal with this organization.
|
88
|
+
organization.relation = Relation::IsACustomer
|
89
|
+
elsif row['Customer relation'] == '3.Partner'
|
90
|
+
# We have made a deal with this organization.
|
91
|
+
organization.relation = Relation::IsACustomer
|
92
|
+
elsif row['Customer relation'] == '2.Prospect'
|
93
|
+
# Something is happening with this organization, we might have
|
94
|
+
# booked a meeting with them or created a deal, etc.
|
95
|
+
organization.relation = Relation::WorkingOnIt
|
96
|
+
elsif row['Customer relation'] == '4.Lost customer'
|
97
|
+
# We had something going with this organization but we
|
98
|
+
# couldn't close the deal and we don't think they will be a
|
99
|
+
# customer to us in the foreseeable future.
|
100
|
+
organization.relation = Relation::BeenInTouch
|
101
|
+
else
|
102
|
+
organization.relation = Relation::NoRelation
|
103
|
+
end
|
104
|
+
|
81
105
|
return organization
|
82
106
|
end
|
83
107
|
|
84
|
-
|
108
|
+
# Turns a row from the Easy exported Company-Person.txt file into
|
109
|
+
# a fruit_to_lime model that is used to generate xml
|
110
|
+
def to_person(row)
|
85
111
|
person = FruitToLime::Person.new
|
86
|
-
|
87
|
-
# Easy standard fields
|
112
|
+
|
113
|
+
# Easy standard fields created in configure method Easy
|
114
|
+
# persons don't have a globally unique Id, they are only
|
115
|
+
# unique within the scope of the company, so we combine the
|
116
|
+
# referenceId and the companyId to make a globally unique
|
117
|
+
# integration_id
|
88
118
|
person.integration_id = "#{row['referenceId']}-#{row['companyId']}"
|
89
119
|
person.first_name = row['First name']
|
90
120
|
person.last_name = row['Last name']
|
@@ -95,100 +125,122 @@ class Exporter
|
|
95
125
|
person.email = row['e-mail']
|
96
126
|
person.position = row['position']
|
97
127
|
|
98
|
-
|
128
|
+
# Populate a Go custom field
|
99
129
|
person.set_custom_value("shoe_size", row['shoe size'])
|
100
|
-
|
130
|
+
|
101
131
|
# Tags
|
102
132
|
person.set_tag("Imported")
|
103
133
|
|
134
|
+
# Checkbox fields
|
104
135
|
# Xmas card field is a checkbox in Easy
|
105
136
|
if row['Xmas card'] == "1"
|
106
137
|
person.set_tag("Xmas card")
|
107
138
|
end
|
108
139
|
|
140
|
+
# Multioption fields or "Set"- fields
|
141
|
+
intrests = row['intrests'].split(';')
|
142
|
+
intrests.each do |intrest|
|
143
|
+
person.set_tag(intrest)
|
144
|
+
end
|
145
|
+
|
109
146
|
# set employer connection
|
110
|
-
employer = rootmodel.find_organization_by_integration_id(row['companyId'])
|
147
|
+
employer = @rootmodel.find_organization_by_integration_id(row['companyId'])
|
111
148
|
if employer
|
112
149
|
employer.add_employee person
|
113
150
|
end
|
114
151
|
end
|
115
152
|
|
116
|
-
|
153
|
+
# Turns a row from the Easy exported Project.txt file into
|
154
|
+
# a fruit_to_lime model that is used to generate xml.
|
155
|
+
# Uses includes hash to lookup organizations to connect
|
156
|
+
# Uses coworkers hash to lookup coworkers to connect
|
157
|
+
def to_deal(row, includes, coworkers)
|
117
158
|
deal = FruitToLime::Deal.new
|
118
159
|
# Easy standard fields
|
119
160
|
deal.integration_id = row['projectId']
|
120
161
|
deal.name = row['Name']
|
121
162
|
deal.description = row['Description']
|
122
163
|
|
123
|
-
# Easy superfields
|
164
|
+
# Easy superfields
|
124
165
|
deal.order_date = row[' order date']
|
125
166
|
|
126
167
|
coworker_id = coworkers[row['userIndex']]
|
127
|
-
deal.responsible_coworker = rootmodel.find_coworker_by_integration_id coworker_id
|
128
|
-
|
129
|
-
#
|
130
|
-
#
|
168
|
+
deal.responsible_coworker = @rootmodel.find_coworker_by_integration_id coworker_id
|
169
|
+
|
170
|
+
# Should be integer
|
171
|
+
# The currency used in Easy should match the one used in Go
|
131
172
|
deal.value = row['value']
|
132
173
|
|
133
174
|
# should be between 0 - 100
|
134
175
|
# remove everything that is not an intiger
|
135
176
|
deal.probability = row['probability'].gsub(/[^\d]/,"").to_i
|
136
177
|
|
178
|
+
# Create a status object and set it's label to the value of the Easy field
|
137
179
|
deal.status = FruitToLime::DealStatus.new
|
138
|
-
|
139
|
-
|
180
|
+
deal.status.label = row['Status']
|
140
181
|
|
141
|
-
#
|
182
|
+
# Tags
|
142
183
|
deal.set_tag("Imported")
|
143
184
|
|
144
|
-
#
|
185
|
+
# Make the deal - organization connection
|
145
186
|
if includes
|
146
187
|
organization_id = includes[row['projectId']]
|
147
|
-
organization = rootmodel.find_organization_by_integration_id(organization_id)
|
188
|
+
organization = @rootmodel.find_organization_by_integration_id(organization_id)
|
148
189
|
if organization
|
149
190
|
deal.customer = organization
|
150
191
|
end
|
151
192
|
end
|
152
|
-
|
193
|
+
|
153
194
|
return deal
|
154
195
|
end
|
155
196
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
197
|
+
# Turns a row from the Easy exported Company-History.txt file into
|
198
|
+
# a fruit_to_lime model that is used to generate xml.
|
199
|
+
# Uses coworkers hash to lookup coworkers to connect
|
200
|
+
# Uses people hash to lookup persons to connect
|
201
|
+
def to_organization_note(row, coworkers, people)
|
202
|
+
organization = @rootmodel.find_organization_by_integration_id(row['companyId'])
|
203
|
+
|
161
204
|
coworker_id = coworkers[row['userIndex']]
|
162
|
-
coworker = rootmodel.find_coworker_by_integration_id(coworker_id)
|
205
|
+
coworker = @rootmodel.find_coworker_by_integration_id(coworker_id)
|
163
206
|
|
164
207
|
if organization && coworker
|
208
|
+
note = FruitToLime::Note.new()
|
165
209
|
note.organization = organization
|
166
210
|
note.created_by = coworker
|
167
211
|
note.person = organization.find_employee_by_integration_id(people[row['personIndex']])
|
168
212
|
note.date = row['Date']
|
169
213
|
note.text = "#{row['Category']}: #{row['History']}"
|
170
214
|
|
171
|
-
|
215
|
+
return note.text.empty? ? nil : note
|
172
216
|
end
|
173
217
|
|
174
218
|
return note
|
175
219
|
end
|
176
220
|
|
177
|
-
|
221
|
+
# Turns a row from the Easy exported Project-History.txt file into
|
222
|
+
# a fruit_to_lime model that is used to generate xml
|
223
|
+
# Uses coworkers hash to lookup coworkers to connect
|
224
|
+
def to_deal_note(row, coworkers)
|
225
|
+
# TODO: This could be improved to read a person from an
|
226
|
+
# organization connected to this deal if any, but since it is
|
227
|
+
# a many to many connection between organizations and deals
|
228
|
+
# it's not a straight forward task
|
178
229
|
note = FruitToLime::Note.new()
|
179
230
|
|
180
|
-
deal = rootmodel.find_deal_by_integration_id(row['projectId'])
|
181
|
-
|
231
|
+
deal = @rootmodel.find_deal_by_integration_id(row['projectId'])
|
232
|
+
|
182
233
|
coworker_id = coworkers[row['userIndex']]
|
183
|
-
coworker = rootmodel.find_coworker_by_integration_id(coworker_id)
|
234
|
+
coworker = @rootmodel.find_coworker_by_integration_id(coworker_id)
|
184
235
|
|
185
236
|
if deal && coworker
|
186
237
|
note.deal = deal
|
187
238
|
note.created_by = coworker
|
188
239
|
note.date = row['Date']
|
240
|
+
# Raw history looks like this <category>: <person>: <text>
|
189
241
|
note.text = row['RawHistory']
|
190
242
|
|
191
|
-
|
243
|
+
return note.text.empty? ? nil : note
|
192
244
|
end
|
193
245
|
|
194
246
|
return note
|
@@ -200,8 +252,7 @@ class Exporter
|
|
200
252
|
# :String and :Link. If no type is specified :String is used
|
201
253
|
# as default.
|
202
254
|
model.settings.with_person do |person|
|
203
|
-
person.set_custom_field( { :integration_id => '
|
204
|
-
person.set_custom_field( { :integration_id => 'shoe_size', :title => 'Shoe size'} )
|
255
|
+
person.set_custom_field( { :integration_id => 'shoe_size', :title => 'Shoe size', :type => :String} )
|
205
256
|
end
|
206
257
|
end
|
207
258
|
|
@@ -219,12 +270,12 @@ class Exporter
|
|
219
270
|
def to_model(coworkers_filename, organization_filename, persons_filename, orgnotes_filename, includes_filename, deals_filename, dealnotes_filename)
|
220
271
|
# A rootmodel is used to represent all entitite/models
|
221
272
|
# that is exported
|
222
|
-
rootmodel = FruitToLime::RootModel.new
|
273
|
+
@rootmodel = FruitToLime::RootModel.new
|
223
274
|
coworkers = Hash.new
|
224
275
|
includes = Hash.new
|
225
276
|
people = Hash.new
|
226
277
|
|
227
|
-
configure rootmodel
|
278
|
+
configure @rootmodel
|
228
279
|
|
229
280
|
# coworkers
|
230
281
|
# start with these since they are referenced
|
@@ -232,15 +283,14 @@ class Exporter
|
|
232
283
|
if coworkers_filename && !coworkers_filename.empty?
|
233
284
|
process_rows coworkers_filename do |row|
|
234
285
|
coworkers[row['userIndex']] = row['userId']
|
235
|
-
rootmodel.add_coworker(to_coworker(row))
|
236
|
-
|
286
|
+
@rootmodel.add_coworker(to_coworker(row))
|
237
287
|
end
|
238
288
|
end
|
239
289
|
|
240
290
|
# organizations
|
241
291
|
if organization_filename && !organization_filename.empty?
|
242
292
|
process_rows organization_filename do |row|
|
243
|
-
rootmodel.add_organization(to_organization(row,
|
293
|
+
@rootmodel.add_organization(to_organization(row, coworkers))
|
244
294
|
end
|
245
295
|
end
|
246
296
|
|
@@ -250,40 +300,45 @@ class Exporter
|
|
250
300
|
process_rows persons_filename do |row|
|
251
301
|
people[row['personIndex']] = "#{row['referenceId']}-#{row['companyId']}"
|
252
302
|
# adds it self to the employer
|
253
|
-
to_person(row
|
303
|
+
to_person(row)
|
254
304
|
end
|
255
305
|
end
|
256
306
|
|
307
|
+
# organization notes
|
257
308
|
if orgnotes_filename && !orgnotes_filename.empty?
|
258
309
|
process_rows orgnotes_filename do |row|
|
259
310
|
# adds itself if applicable
|
260
|
-
to_organization_note(row,
|
311
|
+
@rootmodel.add_note(to_organization_note(row, coworkers, people))
|
261
312
|
end
|
262
313
|
end
|
263
314
|
|
264
|
-
#
|
265
|
-
#
|
266
|
-
#
|
315
|
+
# Organization - Deal connection
|
316
|
+
# Reads the includes.txt and creats a hash
|
317
|
+
# that connect organizations to deals
|
267
318
|
if includes_filename && !includes_filename.empty?
|
268
319
|
process_rows includes_filename do |row|
|
269
320
|
includes[row['projectId']] = row['companyId']
|
270
321
|
end
|
271
322
|
end
|
272
|
-
|
323
|
+
|
324
|
+
# deals
|
325
|
+
# deals can reference coworkers (responsible), organizations
|
326
|
+
# and persons (contact)
|
273
327
|
if deals_filename && !deals_filename.empty?
|
274
328
|
process_rows deals_filename do |row|
|
275
|
-
rootmodel.add_deal(to_deal(row,
|
329
|
+
@rootmodel.add_deal(to_deal(row, includes, coworkers))
|
276
330
|
end
|
277
331
|
end
|
278
332
|
|
333
|
+
# deal notes
|
279
334
|
if dealnotes_filename && !dealnotes_filename.empty?
|
280
335
|
process_rows dealnotes_filename do |row|
|
281
336
|
# adds itself if applicable
|
282
|
-
to_deal_note(row,
|
337
|
+
@rootmodel.add_note(to_deal_note(row, coworkers))
|
283
338
|
end
|
284
339
|
end
|
285
340
|
|
286
|
-
return rootmodel
|
341
|
+
return @rootmodel
|
287
342
|
end
|
288
343
|
|
289
344
|
def save_xml(file)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fruit_to_lime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.7
|
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-06-
|
15
|
+
date: 2014-06-30 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: iso_country_codes
|