fruit_to_lime 2.5.7 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/fruit_to_lime/model/deal.rb +14 -10
- data/spec/deal_spec.rb +11 -0
- data/templates/easy/Export/readme.txt +6 -0
- data/templates/easy/easy-to-go.bat +8 -0
- data/templates/easy/lib/tomodel.rb +97 -56
- metadata +4 -2
@@ -116,17 +116,21 @@ module FruitToLime
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def value=(value)
|
119
|
-
|
120
|
-
|
121
|
-
# those spaces.
|
122
|
-
fixed_value = value.gsub(" ", "")
|
123
|
-
|
124
|
-
if is_integer?(fixed_value)
|
125
|
-
@value = fixed_value
|
126
|
-
elsif is_float?(fixed_value)
|
127
|
-
@value = fixed_value
|
119
|
+
if value.nil?
|
120
|
+
@value = 0
|
128
121
|
else
|
129
|
-
|
122
|
+
# we have had some issues with LIME Easy imports where
|
123
|
+
# the value was in the format "357 000". We need to
|
124
|
+
# remove those spaces.
|
125
|
+
fixed_value = value.gsub(" ", "")
|
126
|
+
|
127
|
+
if is_integer?(fixed_value)
|
128
|
+
@value = fixed_value
|
129
|
+
elsif is_float?(fixed_value)
|
130
|
+
@value = fixed_value
|
131
|
+
else
|
132
|
+
raise InvalidValueError, value
|
133
|
+
end
|
130
134
|
end
|
131
135
|
end
|
132
136
|
|
data/spec/deal_spec.rb
CHANGED
@@ -98,4 +98,15 @@ describe "Deal" do
|
|
98
98
|
# then
|
99
99
|
deal.value.should eq "100.10"
|
100
100
|
end
|
101
|
+
|
102
|
+
it "should set value to 0 if value is nil" do
|
103
|
+
# given
|
104
|
+
deal.name = "The new deal"
|
105
|
+
|
106
|
+
# when
|
107
|
+
deal.value = nil
|
108
|
+
|
109
|
+
# then
|
110
|
+
deal.value.should eq 0
|
111
|
+
end
|
101
112
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
:: This script will convert an exported KONTAKT.mdb in the folder
|
2
|
+
:: Export to a file that can be imported into LIME Go.
|
3
|
+
:: The file will be named go.xml
|
4
|
+
|
5
|
+
@echo off
|
6
|
+
ruby convert.rb to_go --coworkers=Export\User.txt --organizations=Export\Company.txt --persons=Export\Company-Person.txt --orgnotes=Export\Company-History.txt --includes=Export\Project-Included.txt --deals=Export\Project.txt --dealnotes=Export\Project-History.txt --output=go.xml
|
7
|
+
|
8
|
+
|
@@ -1,22 +1,54 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'fruit_to_lime'
|
3
3
|
|
4
|
+
# Customize this file to suit your input files.
|
5
|
+
#
|
6
|
+
# Documentation fruit_to_lime can be found at
|
7
|
+
# http://rubygems.org/gems/fruit_to_lime
|
8
|
+
#
|
9
|
+
# Fruit_to_lime contains all objects in LIME Go such as organization,
|
10
|
+
# people, deals, etc. What properties each object has is described in
|
11
|
+
# the documentation.
|
12
|
+
|
13
|
+
# *** TODO:
|
14
|
+
#
|
15
|
+
# You must customize this template so it works with your LIME Easy
|
16
|
+
# database. Modify each to_* method and set properties on the LIME Go
|
17
|
+
# objects.
|
18
|
+
#
|
19
|
+
# Follow these steps:
|
20
|
+
#
|
21
|
+
# 1) Export all data from KONTAKT.mdb to a folder named Export located
|
22
|
+
# in the folder created by fruit_to_lime unpack_template. Export data
|
23
|
+
# using the magical tool called PowerSellMigrationExport.exe that can
|
24
|
+
# be found in K:\Lundalogik\LIME Easy\Tillbeh�r\Migrationsexport.
|
25
|
+
#
|
26
|
+
# 2) Modify this file (the to_* methods) according to your customer's
|
27
|
+
# KONTAKT.mdb and wishes.
|
28
|
+
#
|
29
|
+
# 3) Run easy-to-go.bat in a command prompt.
|
30
|
+
#
|
31
|
+
# 4) Upload go.xml to LIME Go. First test your import on staging and
|
32
|
+
# when your customer has approved the import, run it on production.
|
4
33
|
class Exporter
|
5
34
|
# Turns a user from the User.txt Easy Export file into
|
6
|
-
# a fruit_to_lime coworker
|
35
|
+
# a fruit_to_lime coworker.
|
7
36
|
def to_coworker(row)
|
8
37
|
coworker = FruitToLime::Coworker.new
|
9
38
|
# integration_id is typically the userId in Easy
|
10
39
|
# Must be set to be able to import the same file more
|
11
40
|
# than once without creating duplicates
|
12
|
-
|
41
|
+
|
42
|
+
# NOTE: You shouldn't have to modify this method
|
43
|
+
|
44
|
+
coworker.integration_id = row['PowerSellUserID']
|
13
45
|
coworker.parse_name_to_firstname_lastname_se(row['Name'])
|
14
46
|
|
15
47
|
return coworker
|
16
48
|
end
|
17
49
|
|
18
50
|
# Turns a row from the Easy exported Company.txt file into a
|
19
|
-
# fruit_to_lime
|
51
|
+
# fruit_to_lime organization.
|
20
52
|
def to_organization(row, coworkers)
|
21
53
|
organization = FruitToLime::Organization.new
|
22
54
|
# integration_id is typically the company Id in Easy
|
@@ -24,16 +56,19 @@ class Exporter
|
|
24
56
|
# than once without creating duplicates
|
25
57
|
|
26
58
|
# Easy standard fields
|
27
|
-
organization.integration_id = row['
|
28
|
-
organization.name = row['
|
59
|
+
organization.integration_id = row['PowerSellCompanyID']
|
60
|
+
organization.name = row['Company name']
|
29
61
|
organization.central_phone_number = row['Telephone']
|
30
62
|
|
31
|
-
#
|
32
|
-
#
|
33
|
-
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
63
|
+
# *** TODO: Customize below this line (address, superfield,
|
64
|
+
# relation, etc)
|
65
|
+
|
66
|
+
# NOTE!! if a bisnode-id is present maybe you want to consider
|
67
|
+
# not setting this (because if you set the address LIME Go
|
68
|
+
# will NOT automagically update the address from PAR)
|
69
|
+
# Addresses consists of several parts in Go. Lots of other
|
70
|
+
# systems have the address all in one line, to be able to
|
71
|
+
# match when importing it is way better to split the addresses
|
37
72
|
organization.with_postal_address do |address|
|
38
73
|
address.street = row['street']
|
39
74
|
address.zip_code = row['zip']
|
@@ -42,8 +77,6 @@ class Exporter
|
|
42
77
|
end
|
43
78
|
|
44
79
|
# Easy superfields
|
45
|
-
organization.email = row['e-mail']
|
46
|
-
organization.web_site = row['website']
|
47
80
|
|
48
81
|
# Same as postal address
|
49
82
|
organization.with_visit_address do |addr|
|
@@ -52,6 +85,9 @@ class Exporter
|
|
52
85
|
addr.city = row['visit city']
|
53
86
|
end
|
54
87
|
|
88
|
+
organization.email = row['e-mail']
|
89
|
+
organization.organization_number = row['orgnr']
|
90
|
+
|
55
91
|
# Set Bisnode Id if present
|
56
92
|
bisnode_id = row['Bisnode-id']
|
57
93
|
|
@@ -63,12 +99,12 @@ class Exporter
|
|
63
99
|
|
64
100
|
# Only set other Bisnode fields if the Bisnode Id is empty
|
65
101
|
if bisnode_id.empty?
|
66
|
-
organization.
|
102
|
+
organization.web_site = row['website']
|
67
103
|
end
|
68
104
|
|
69
105
|
# Responsible coworker for the organization.
|
70
106
|
# For instance responsible sales rep.
|
71
|
-
coworker_id = coworkers[row['
|
107
|
+
coworker_id = coworkers[row['idUser-Responsible']]
|
72
108
|
organization.responsible_coworker = @rootmodel.find_coworker_by_integration_id(coworker_id)
|
73
109
|
|
74
110
|
# Tags are set and defined at the same place
|
@@ -85,21 +121,21 @@ class Exporter
|
|
85
121
|
# with the options '1.Customer', '2.Prospect' '3.Partner' and '4.Lost customer'
|
86
122
|
if row['Customer relation'] == '1.Customer'
|
87
123
|
# We have made a deal with this organization.
|
88
|
-
organization.relation = Relation::IsACustomer
|
124
|
+
organization.relation = FruitToLime::Relation::IsACustomer
|
89
125
|
elsif row['Customer relation'] == '3.Partner'
|
90
126
|
# We have made a deal with this organization.
|
91
|
-
organization.relation = Relation::IsACustomer
|
127
|
+
organization.relation = FruitToLime::Relation::IsACustomer
|
92
128
|
elsif row['Customer relation'] == '2.Prospect'
|
93
129
|
# Something is happening with this organization, we might have
|
94
130
|
# booked a meeting with them or created a deal, etc.
|
95
|
-
organization.relation = Relation::WorkingOnIt
|
131
|
+
organization.relation = FruitToLime::Relation::WorkingOnIt
|
96
132
|
elsif row['Customer relation'] == '4.Lost customer'
|
97
133
|
# We had something going with this organization but we
|
98
134
|
# couldn't close the deal and we don't think they will be a
|
99
135
|
# customer to us in the foreseeable future.
|
100
|
-
organization.relation = Relation::BeenInTouch
|
136
|
+
organization.relation = FruitToLime::Relation::BeenInTouch
|
101
137
|
else
|
102
|
-
organization.relation = Relation::NoRelation
|
138
|
+
organization.relation = FruitToLime::Relation::NoRelation
|
103
139
|
end
|
104
140
|
|
105
141
|
return organization
|
@@ -115,10 +151,18 @@ class Exporter
|
|
115
151
|
# unique within the scope of the company, so we combine the
|
116
152
|
# referenceId and the companyId to make a globally unique
|
117
153
|
# integration_id
|
118
|
-
person.integration_id = "#{row['
|
154
|
+
person.integration_id = "#{row['PowerSellReferenceID']}-#{row['PowerSellCompanyID']}"
|
119
155
|
person.first_name = row['First name']
|
120
156
|
person.last_name = row['Last name']
|
121
157
|
|
158
|
+
# set employer connection
|
159
|
+
employer = @rootmodel.find_organization_by_integration_id(row['PowerSellCompanyID'])
|
160
|
+
if employer
|
161
|
+
employer.add_employee person
|
162
|
+
end
|
163
|
+
|
164
|
+
# *** TODO: Customize below this line (superfields, tags, etc)
|
165
|
+
|
122
166
|
# Easy superfields
|
123
167
|
person.direct_phone_number = row['Direktnummer']
|
124
168
|
person.mobile_phone_number = row['Mobil']
|
@@ -138,15 +182,11 @@ class Exporter
|
|
138
182
|
end
|
139
183
|
|
140
184
|
# Multioption fields or "Set"- fields
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
# set employer connection
|
147
|
-
employer = @rootmodel.find_organization_by_integration_id(row['companyId'])
|
148
|
-
if employer
|
149
|
-
employer.add_employee person
|
185
|
+
if row['intrests']
|
186
|
+
intrests = row['intrests'].split(';')
|
187
|
+
intrests.each do |intrest|
|
188
|
+
person.set_tag(intrest)
|
189
|
+
end
|
150
190
|
end
|
151
191
|
end
|
152
192
|
|
@@ -157,15 +197,15 @@ class Exporter
|
|
157
197
|
def to_deal(row, includes, coworkers)
|
158
198
|
deal = FruitToLime::Deal.new
|
159
199
|
# Easy standard fields
|
160
|
-
deal.integration_id = row['
|
200
|
+
deal.integration_id = row['PowerSellProjectID']
|
161
201
|
deal.name = row['Name']
|
162
202
|
deal.description = row['Description']
|
163
203
|
|
164
204
|
# Easy superfields
|
165
|
-
deal.order_date = row['
|
205
|
+
deal.order_date = row['order date']
|
166
206
|
|
167
|
-
coworker_id = coworkers[row['
|
168
|
-
deal.responsible_coworker = @rootmodel.find_coworker_by_integration_id
|
207
|
+
coworker_id = coworkers[row['isUser-Ansvarig']]
|
208
|
+
deal.responsible_coworker = @rootmodel.find_coworker_by_integration_id(coworker_id)
|
169
209
|
|
170
210
|
# Should be integer
|
171
211
|
# The currency used in Easy should match the one used in Go
|
@@ -173,18 +213,20 @@ class Exporter
|
|
173
213
|
|
174
214
|
# should be between 0 - 100
|
175
215
|
# remove everything that is not an intiger
|
176
|
-
deal.probability = row['probability'].gsub(/[^\d]/,"").to_i
|
216
|
+
deal.probability = row['probability'].gsub(/[^\d]/,"").to_i unless row['probability'].nil?
|
177
217
|
|
178
218
|
# Create a status object and set it's label to the value of the Easy field
|
179
|
-
|
180
|
-
|
219
|
+
if !row['Status'].empty?
|
220
|
+
deal.status = FruitToLime::DealStatus.new
|
221
|
+
deal.status.label = row['Status']
|
222
|
+
end
|
181
223
|
|
182
224
|
# Tags
|
183
225
|
deal.set_tag("Imported")
|
184
226
|
|
185
227
|
# Make the deal - organization connection
|
186
228
|
if includes
|
187
|
-
organization_id = includes[row['
|
229
|
+
organization_id = includes[row['PowerSellProjectID']]
|
188
230
|
organization = @rootmodel.find_organization_by_integration_id(organization_id)
|
189
231
|
if organization
|
190
232
|
deal.customer = organization
|
@@ -199,23 +241,23 @@ class Exporter
|
|
199
241
|
# Uses coworkers hash to lookup coworkers to connect
|
200
242
|
# Uses people hash to lookup persons to connect
|
201
243
|
def to_organization_note(row, coworkers, people)
|
202
|
-
organization = @rootmodel.find_organization_by_integration_id(row['
|
244
|
+
organization = @rootmodel.find_organization_by_integration_id(row['PowerSellCompanyID'])
|
203
245
|
|
204
|
-
coworker_id = coworkers[row['
|
246
|
+
coworker_id = coworkers[row['idUser']]
|
205
247
|
coworker = @rootmodel.find_coworker_by_integration_id(coworker_id)
|
206
248
|
|
207
249
|
if organization && coworker
|
208
250
|
note = FruitToLime::Note.new()
|
209
251
|
note.organization = organization
|
210
252
|
note.created_by = coworker
|
211
|
-
note.person = organization.find_employee_by_integration_id(people[row['
|
253
|
+
note.person = organization.find_employee_by_integration_id(people[row['idPerson']])
|
212
254
|
note.date = row['Date']
|
213
255
|
note.text = "#{row['Category']}: #{row['History']}"
|
214
256
|
|
215
257
|
return note.text.empty? ? nil : note
|
216
258
|
end
|
217
259
|
|
218
|
-
return
|
260
|
+
return nil
|
219
261
|
end
|
220
262
|
|
221
263
|
# Turns a row from the Easy exported Project-History.txt file into
|
@@ -226,14 +268,13 @@ class Exporter
|
|
226
268
|
# organization connected to this deal if any, but since it is
|
227
269
|
# a many to many connection between organizations and deals
|
228
270
|
# it's not a straight forward task
|
229
|
-
|
271
|
+
deal = @rootmodel.find_deal_by_integration_id(row['PowerSellProjectID'])
|
230
272
|
|
231
|
-
|
232
|
-
|
233
|
-
coworker_id = coworkers[row['userIndex']]
|
273
|
+
coworker_id = coworkers[row['idUser']]
|
234
274
|
coworker = @rootmodel.find_coworker_by_integration_id(coworker_id)
|
235
275
|
|
236
276
|
if deal && coworker
|
277
|
+
note = FruitToLime::Note.new()
|
237
278
|
note.deal = deal
|
238
279
|
note.created_by = coworker
|
239
280
|
note.date = row['Date']
|
@@ -243,7 +284,7 @@ class Exporter
|
|
243
284
|
return note.text.empty? ? nil : note
|
244
285
|
end
|
245
286
|
|
246
|
-
return
|
287
|
+
return nil
|
247
288
|
end
|
248
289
|
|
249
290
|
def configure(model)
|
@@ -317,7 +358,7 @@ class Exporter
|
|
317
358
|
# that connect organizations to deals
|
318
359
|
if includes_filename && !includes_filename.empty?
|
319
360
|
process_rows includes_filename do |row|
|
320
|
-
includes[row['
|
361
|
+
includes[row['PowerSellProjectID']] = row['PowerSellCompanyID']
|
321
362
|
end
|
322
363
|
end
|
323
364
|
|
@@ -354,14 +395,14 @@ require 'pathname'
|
|
354
395
|
|
355
396
|
class Cli < Thor
|
356
397
|
desc "to_go", "Generates a Go XML file"
|
357
|
-
method_option :output, :desc => "Path to file where xml will be output", :default => "export.xml", :type => :string
|
358
|
-
method_option :coworkers, :desc => "Path to coworkers csv file", :type => :string
|
359
|
-
method_option :organizations, :desc => "Path to organization csv file", :type => :string
|
360
|
-
method_option :persons, :desc => "Path to persons csv file", :type => :string
|
361
|
-
method_option :orgnotes, :desc => "Path to organization notes file", :type => :string
|
362
|
-
method_option :includes, :desc => "Path to include file", :type => :string
|
363
|
-
method_option :deals, :desc => "Path to deals csv file", :type => :string
|
364
|
-
method_option :dealnotes, :desc => "Path to deal notes file", :type => :string
|
398
|
+
method_option :output, :desc => "Path to file where xml will be output", :default => "export.xml", :type => :string, :required => true
|
399
|
+
method_option :coworkers, :desc => "Path to coworkers csv file", :type => :string, :required => true
|
400
|
+
method_option :organizations, :desc => "Path to organization csv file", :type => :string, :required => true
|
401
|
+
method_option :persons, :desc => "Path to persons csv file", :type => :string, :required => true
|
402
|
+
method_option :orgnotes, :desc => "Path to organization notes file", :type => :string, :required => true
|
403
|
+
method_option :includes, :desc => "Path to include file", :type => :string, :required => true
|
404
|
+
method_option :deals, :desc => "Path to deals csv file", :type => :string, :required => true
|
405
|
+
method_option :dealnotes, :desc => "Path to deal notes file", :type => :string, :required => true
|
365
406
|
def to_go
|
366
407
|
output = options.output
|
367
408
|
exporter = Exporter.new()
|
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.
|
4
|
+
version: 2.6.0
|
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-07-01 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: iso_country_codes
|
@@ -205,6 +205,8 @@ files:
|
|
205
205
|
- templates/csv/spec/sample_data/persons.csv
|
206
206
|
- templates/csv/spec/spec_helper.rb
|
207
207
|
- templates/easy/convert.rb
|
208
|
+
- templates/easy/easy-to-go.bat
|
209
|
+
- templates/easy/Export/readme.txt
|
208
210
|
- templates/easy/Gemfile
|
209
211
|
- templates/easy/lib/tomodel.rb
|
210
212
|
- templates/easy/Rakefile.rb
|