fruit_to_lime 2.5.7 → 2.6.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/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
|