fruit_to_lime 2.5.3 → 2.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/lib/fruit_to_lime.rb +17 -17
  2. data/lib/fruit_to_lime/csv_helper.rb +47 -47
  3. data/lib/fruit_to_lime/email_helper.rb +10 -10
  4. data/lib/fruit_to_lime/errors.rb +16 -16
  5. data/lib/fruit_to_lime/excel_helper.rb +10 -10
  6. data/lib/fruit_to_lime/global_phone.json +6571 -6571
  7. data/lib/fruit_to_lime/model/address.rb +60 -60
  8. data/lib/fruit_to_lime/model/class_settings.rb +50 -50
  9. data/lib/fruit_to_lime/model/coworker.rb +76 -76
  10. data/lib/fruit_to_lime/model/coworker_reference.rb +33 -33
  11. data/lib/fruit_to_lime/model/customfield.rb +87 -87
  12. data/lib/fruit_to_lime/model/deal.rb +141 -145
  13. data/lib/fruit_to_lime/model/deal_status.rb +12 -12
  14. data/lib/fruit_to_lime/model/note.rb +79 -79
  15. data/lib/fruit_to_lime/model/organization.rb +203 -197
  16. data/lib/fruit_to_lime/model/person.rb +151 -151
  17. data/lib/fruit_to_lime/model/referencetosource.rb +45 -45
  18. data/lib/fruit_to_lime/model/relation.rb +23 -23
  19. data/lib/fruit_to_lime/model/rootmodel.rb +338 -330
  20. data/lib/fruit_to_lime/model/settings.rb +60 -60
  21. data/lib/fruit_to_lime/model/tag.rb +35 -35
  22. data/lib/fruit_to_lime/model_helpers.rb +54 -54
  23. data/lib/fruit_to_lime/phone_helper.rb +74 -74
  24. data/lib/fruit_to_lime/roo_helper.rb +72 -72
  25. data/lib/fruit_to_lime/serialize_helper.rb +186 -186
  26. data/lib/fruit_to_lime/templating.rb +52 -52
  27. data/spec/address_spec.rb +48 -48
  28. data/spec/class_settings_spec.rb +37 -37
  29. data/spec/coworker_spec.rb +94 -94
  30. data/spec/custom_field_spec.rb +22 -22
  31. data/spec/deal_spec.rb +101 -102
  32. data/spec/helpers/csv_helper_spec.rb +29 -29
  33. data/spec/helpers/email_helper_spec.rb +32 -32
  34. data/spec/helpers/phone_helper_spec.rb +97 -97
  35. data/spec/helpers/serialize_helper_spec.rb +249 -249
  36. data/spec/helpers/xsd_validate_spec.rb +58 -58
  37. data/spec/note_spec.rb +98 -67
  38. data/spec/organization_spec.rb +103 -89
  39. data/spec/person_spec.rb +134 -134
  40. data/spec/rootmodel_spec.rb +277 -230
  41. data/spec/templating_spec.rb +11 -11
  42. data/templates/csv/lib/tomodel.rb +230 -230
  43. data/templates/csv/spec/exporter_spec.rb +17 -17
  44. data/templates/csv/spec/sample_data/coworkers.csv +2 -2
  45. data/templates/csv/spec/sample_data/deals.csv +2 -2
  46. data/templates/csv/spec/sample_data/organizations.csv +2 -2
  47. data/templates/csv/spec/sample_data/persons.csv +2 -2
  48. data/templates/easy/Gemfile +5 -0
  49. data/templates/easy/Rakefile.rb +7 -0
  50. data/templates/easy/convert.rb +3 -0
  51. data/templates/easy/lib/tomodel.rb +330 -0
  52. data/templates/easy/spec/exporter_spec.rb +10 -0
  53. data/templates/easy/spec/sample_data/Company.txt +649 -0
  54. data/templates/easy/spec/spec_helper.rb +24 -0
  55. data/templates/excel/lib/tomodel.rb +207 -207
  56. data/templates/sqlserver/lib/tomodel.rb +79 -79
  57. metadata +10 -3
@@ -1,12 +1,12 @@
1
- require 'fileutils'
2
- require 'tmpdir'
3
-
4
- describe 'Templating' do
5
- let(:templating) { FruitToLime::Templating.new(File.expand_path("../templates", File.dirname(__FILE__))) }
6
-
7
- describe 'list' do
8
- it 'can find some templates' do
9
- templating.list().length.should > 0
10
- end
11
- end
1
+ require 'fileutils'
2
+ require 'tmpdir'
3
+
4
+ describe 'Templating' do
5
+ let(:templating) { FruitToLime::Templating.new(File.expand_path("../templates", File.dirname(__FILE__))) }
6
+
7
+ describe 'list' do
8
+ it 'can find some templates' do
9
+ templating.list().length.should > 0
10
+ end
11
+ end
12
12
  end
@@ -1,230 +1,230 @@
1
- require 'fruit_to_lime'
2
-
3
- class Exporter
4
- # turns a row from the organization cssv file into
5
- # a fruit_to_lime model that is used to generate xml
6
- # Uses rootmodel to locate other related stuff such
7
- # coworker
8
- def to_organization(row, rootmodel)
9
- organization = FruitToLime::Organization.new
10
- # Integrationid is typically the id in the system that
11
- # we are getting the csv from. Must be set to be able
12
- # to import the same file more than once without
13
- # creating duplicates
14
- organization.integration_id = row['id']
15
- organization.name = row['name']
16
- # Just setting all basic properties to show whats available
17
- # Remove or fix...
18
- organization.organization_number = 'a number' # needs clean up, should have helpers for that in lib. Swedish format.
19
- organization.email = 'email to organizaiton, not the person'
20
- organization.web_site = 'www.whatever.com'
21
- organization.central_phone_number = '0000' # needs clean up, should have helpers for that in lib. Default swedish format, convert to global format
22
-
23
- # Addresses consists of several parts in Go.
24
- # Lots of other systems have the address all in one
25
- # line, to be able to match when importing it is
26
- # way better to split the addresses
27
- organization.with_visit_address do |address|
28
- address.street = 'visit street'
29
- address.zip_code = 'visit zip'
30
- address.city = 'visit city'
31
- end
32
-
33
- # Another example of setting address using
34
- # helper to split '226 48 LUND' into zip and city
35
- organization.with_postal_address do |address|
36
- address.street = 'postal street'
37
- address.parse_zip_and_address_se '226 48 LUND'
38
- end
39
-
40
- # Responsible coworker is set by first locating
41
- # it in the root model and then setting a reference
42
- # to him/her
43
- # We need to be able handle missing coworkers here
44
- coworker = rootmodel.find_coworker_by_integration_id row['responsible_id']
45
- organization.responsible_coworker = coworker.to_reference
46
-
47
- # Tags are set and defined at the same place
48
- # Setting a tag: Imported is useful for the user
49
- organization.set_tag("Imported")
50
-
51
- # When imported from web based ERP or similair that
52
- # client will continue to use it can be useful to be
53
- # able to link from Go to the same record in the ERP
54
- # FOr instance Lime links
55
- organization.set_custom_value("external_url", "http://something.com?key=#{row['id']}")
56
-
57
- return organization
58
- end
59
-
60
- def to_coworker(row)
61
- coworker = FruitToLime::Coworker.new
62
- coworker.integration_id = row['id']
63
- coworker.first_name = row['first_name']
64
- coworker.last_name = row['last_name']
65
- # Other optional attributes
66
- coworker.email = 't@e.com'
67
- coworker.direct_phone_number = '+46121212'
68
- coworker.mobile_phone_number = '+46324234'
69
- coworker.home_phone_number = '+46234234'
70
-
71
- # Tags and custom fields are set the same
72
- # way as on organizations
73
-
74
- return coworker
75
- end
76
-
77
- def to_person(row, rootmodel)
78
- person = FruitToLime::Person.new
79
- person.integration_id = row['id']
80
- # Note that Go has separate first and last names
81
- # Some splitting might be necessary
82
- person.first_name = row['first_name']
83
- person.last_name = row['last_name']
84
- # other optional attributes
85
- person.direct_phone_number = '+4611111'
86
- person.fax_phone_number = '+4623234234234'
87
- person.mobile_phone_number = '+462321212'
88
- person.email = 'x@y.com'
89
- person.alternative_email = 'y@x.com'
90
- person.with_postal_address do |address|
91
- address.street = 'postal street'
92
- address.parse_zip_and_address_se '226 48 LUND'
93
- end
94
-
95
- # Tags and custom fields are set the same
96
- # way as on organizations
97
-
98
- # set employer connection
99
- employer_id = row['employer_id']
100
- employer = rootmodel.find_organization_by_integration_id employer_id
101
- employer.add_employee person
102
- end
103
-
104
- def to_deal(row, rootmodel)
105
- deal = FruitToLime::Deal.new
106
- deal.integration_id = row['id']
107
- deal.name = row['name']
108
- # should be integer, same currency should be used in
109
- # the system
110
- deal.value = row['value']
111
-
112
- # find stuff connected to deal
113
- responsible = rootmodel.find_coworker_by_integration_id row['responsible_id']
114
- organization = rootmodel.find_organization_by_integration_id row['customer_id']
115
- person = organization.find_employee_by_integration_id row['customer_contact_id']
116
- # connect the deal by references
117
- deal.responsible_coworker = responsible.to_reference
118
- deal.customer = organization.to_reference
119
- deal.customer_contact = person.to_reference
120
-
121
- # other optional attributes
122
- deal.probability = 50 # should be between 0 - 100
123
- deal.order_date = '2014-01-05' # Format ?
124
-
125
- # status, how do we set this ?
126
-
127
- return deal
128
- end
129
-
130
- def configure(model)
131
- # add custom field to your model here. Custom fields can be
132
- # added to organization, deal and person. Valid types are
133
- # :String and :Link. If no type is specified :String is used
134
- # as default.
135
- model.settings.with_organization do |organization|
136
- organization.set_custom_field( { :integrationid => 'external_url', :title => 'Link to external system', :type => :Link } )
137
- end
138
- end
139
-
140
- def process_rows(file_name)
141
- data = File.open(file_name, 'r').read.encode('UTF-8',"ISO-8859-1")
142
- rows = FruitToLime::CsvHelper::text_to_hashes(data)
143
- rows.each do |row|
144
- yield row
145
- end
146
- end
147
-
148
- def to_model(coworkers_filename, organization_filename, persons_filename, deals_filename)
149
- # A rootmodel is used to represent all entitite/models
150
- # that is exported
151
- rootmodel = FruitToLime::RootModel.new
152
-
153
- configure rootmodel
154
-
155
- # coworkers
156
- # start with these since they are referenced
157
- # from everywhere....
158
- if coworkers_filename != nil
159
- process_rows coworkers_filename do |row|
160
- rootmodel.add_coworker(to_coworker(row))
161
- end
162
- end
163
-
164
- # organizations
165
- if organization_filename != nil
166
- process_rows organization_filename do |row|
167
- rootmodel.organizations.push(to_organization(row, rootmodel))
168
- end
169
- end
170
-
171
- # persons
172
- # depends on organizations
173
- if persons_filename != nil
174
- process_rows persons_filename do |row|
175
- # adds it self to the employer
176
- to_person(row, rootmodel)
177
- end
178
- end
179
-
180
- # deals
181
- # deals can reference coworkers (responsible), organizations
182
- # and persons (contact)
183
- if deals_filename != nil
184
- process_rows deals_filename do |row|
185
- rootmodel.deals.push(to_deal(row, rootmodel))
186
- end
187
- end
188
-
189
- return rootmodel
190
- end
191
-
192
- def save_xml(file)
193
- File.open(file,'w') do |f|
194
- f.write(FruitToLime::SerializeHelper::serialize(to_xml_model))
195
- end
196
- end
197
- end
198
-
199
- require "thor"
200
- require "fileutils"
201
- require 'pathname'
202
-
203
- class Cli < Thor
204
- desc "to_go", "Generates a Go XML file"
205
- method_option :output, :desc => "Path to file where xml will be output", :default => "export.xml", :type => :string
206
- method_option :organizations, :desc => "Path to organization csv file", :type => :string
207
- method_option :persons, :desc => "Path to persons csv file", :type => :string
208
- method_option :coworkers, :desc => "Path to coworkers csv file", :type => :string
209
- method_option :deals, :desc => "Path to deals csv file", :type => :string
210
- def to_go
211
- output = options.output
212
- exporter = Exporter.new()
213
- model = exporter.to_model(options.coworkers, options.organizations, options.persons, options.deals)
214
- error = model.sanity_check
215
- if error.empty?
216
- validation_errors = model.validate
217
-
218
- if validation_errors.empty?
219
- model.serialize_to_file(output)
220
- puts "Generated Go XML file: '#{output}'."
221
- else
222
- puts "Could not generate file due to"
223
- puts validation_errors
224
- end
225
- else
226
- puts "Could not generate file due to"
227
- puts error
228
- end
229
- end
230
- end
1
+ require 'fruit_to_lime'
2
+
3
+ class Exporter
4
+ # turns a row from the organization cssv file into
5
+ # a fruit_to_lime model that is used to generate xml
6
+ # Uses rootmodel to locate other related stuff such
7
+ # coworker
8
+ def to_organization(row, rootmodel)
9
+ organization = FruitToLime::Organization.new
10
+ # Integrationid is typically the id in the system that
11
+ # we are getting the csv from. Must be set to be able
12
+ # to import the same file more than once without
13
+ # creating duplicates
14
+ organization.integration_id = row['id']
15
+ organization.name = row['name']
16
+ # Just setting all basic properties to show whats available
17
+ # Remove or fix...
18
+ organization.organization_number = 'a number' # needs clean up, should have helpers for that in lib. Swedish format.
19
+ organization.email = 'email to organizaiton, not the person'
20
+ organization.web_site = 'www.whatever.com'
21
+ organization.central_phone_number = '0000' # needs clean up, should have helpers for that in lib. Default swedish format, convert to global format
22
+
23
+ # Addresses consists of several parts in Go.
24
+ # Lots of other systems have the address all in one
25
+ # line, to be able to match when importing it is
26
+ # way better to split the addresses
27
+ organization.with_visit_address do |address|
28
+ address.street = 'visit street'
29
+ address.zip_code = 'visit zip'
30
+ address.city = 'visit city'
31
+ end
32
+
33
+ # Another example of setting address using
34
+ # helper to split '226 48 LUND' into zip and city
35
+ organization.with_postal_address do |address|
36
+ address.street = 'postal street'
37
+ address.parse_zip_and_address_se '226 48 LUND'
38
+ end
39
+
40
+ # Responsible coworker is set by first locating
41
+ # it in the root model and then setting a reference
42
+ # to him/her
43
+ # We need to be able handle missing coworkers here
44
+ coworker = rootmodel.find_coworker_by_integration_id row['responsible_id']
45
+ organization.responsible_coworker = coworker.to_reference
46
+
47
+ # Tags are set and defined at the same place
48
+ # Setting a tag: Imported is useful for the user
49
+ organization.set_tag("Imported")
50
+
51
+ # When imported from web based ERP or similair that
52
+ # client will continue to use it can be useful to be
53
+ # able to link from Go to the same record in the ERP
54
+ # FOr instance Lime links
55
+ organization.set_custom_value("external_url", "http://something.com?key=#{row['id']}")
56
+
57
+ return organization
58
+ end
59
+
60
+ def to_coworker(row)
61
+ coworker = FruitToLime::Coworker.new
62
+ coworker.integration_id = row['id']
63
+ coworker.first_name = row['first_name']
64
+ coworker.last_name = row['last_name']
65
+ # Other optional attributes
66
+ coworker.email = 't@e.com'
67
+ coworker.direct_phone_number = '+46121212'
68
+ coworker.mobile_phone_number = '+46324234'
69
+ coworker.home_phone_number = '+46234234'
70
+
71
+ # Tags and custom fields are set the same
72
+ # way as on organizations
73
+
74
+ return coworker
75
+ end
76
+
77
+ def to_person(row, rootmodel)
78
+ person = FruitToLime::Person.new
79
+ person.integration_id = row['id']
80
+ # Note that Go has separate first and last names
81
+ # Some splitting might be necessary
82
+ person.first_name = row['first_name']
83
+ person.last_name = row['last_name']
84
+ # other optional attributes
85
+ person.direct_phone_number = '+4611111'
86
+ person.fax_phone_number = '+4623234234234'
87
+ person.mobile_phone_number = '+462321212'
88
+ person.email = 'x@y.com'
89
+ person.alternative_email = 'y@x.com'
90
+ person.with_postal_address do |address|
91
+ address.street = 'postal street'
92
+ address.parse_zip_and_address_se '226 48 LUND'
93
+ end
94
+
95
+ # Tags and custom fields are set the same
96
+ # way as on organizations
97
+
98
+ # set employer connection
99
+ employer_id = row['employer_id']
100
+ employer = rootmodel.find_organization_by_integration_id employer_id
101
+ employer.add_employee person
102
+ end
103
+
104
+ def to_deal(row, rootmodel)
105
+ deal = FruitToLime::Deal.new
106
+ deal.integration_id = row['id']
107
+ deal.name = row['name']
108
+ # should be integer, same currency should be used in
109
+ # the system
110
+ deal.value = row['value']
111
+
112
+ # find stuff connected to deal
113
+ responsible = rootmodel.find_coworker_by_integration_id row['responsible_id']
114
+ organization = rootmodel.find_organization_by_integration_id row['customer_id']
115
+ person = organization.find_employee_by_integration_id row['customer_contact_id']
116
+ # connect the deal by references
117
+ deal.responsible_coworker = responsible.to_reference
118
+ deal.customer = organization.to_reference
119
+ deal.customer_contact = person.to_reference
120
+
121
+ # other optional attributes
122
+ deal.probability = 50 # should be between 0 - 100
123
+ deal.order_date = '2014-01-05' # Format ?
124
+
125
+ # status, how do we set this ?
126
+
127
+ return deal
128
+ end
129
+
130
+ def configure(model)
131
+ # add custom field to your model here. Custom fields can be
132
+ # added to organization, deal and person. Valid types are
133
+ # :String and :Link. If no type is specified :String is used
134
+ # as default.
135
+ model.settings.with_organization do |organization|
136
+ organization.set_custom_field( { :integrationid => 'external_url', :title => 'Link to external system', :type => :Link } )
137
+ end
138
+ end
139
+
140
+ def process_rows(file_name)
141
+ data = File.open(file_name, 'r').read.encode('UTF-8',"ISO-8859-1")
142
+ rows = FruitToLime::CsvHelper::text_to_hashes(data)
143
+ rows.each do |row|
144
+ yield row
145
+ end
146
+ end
147
+
148
+ def to_model(coworkers_filename, organization_filename, persons_filename, deals_filename)
149
+ # A rootmodel is used to represent all entitite/models
150
+ # that is exported
151
+ rootmodel = FruitToLime::RootModel.new
152
+
153
+ configure rootmodel
154
+
155
+ # coworkers
156
+ # start with these since they are referenced
157
+ # from everywhere....
158
+ if coworkers_filename != nil
159
+ process_rows coworkers_filename do |row|
160
+ rootmodel.add_coworker(to_coworker(row))
161
+ end
162
+ end
163
+
164
+ # organizations
165
+ if organization_filename != nil
166
+ process_rows organization_filename do |row|
167
+ rootmodel.organizations.push(to_organization(row, rootmodel))
168
+ end
169
+ end
170
+
171
+ # persons
172
+ # depends on organizations
173
+ if persons_filename != nil
174
+ process_rows persons_filename do |row|
175
+ # adds it self to the employer
176
+ to_person(row, rootmodel)
177
+ end
178
+ end
179
+
180
+ # deals
181
+ # deals can reference coworkers (responsible), organizations
182
+ # and persons (contact)
183
+ if deals_filename != nil
184
+ process_rows deals_filename do |row|
185
+ rootmodel.deals.push(to_deal(row, rootmodel))
186
+ end
187
+ end
188
+
189
+ return rootmodel
190
+ end
191
+
192
+ def save_xml(file)
193
+ File.open(file,'w') do |f|
194
+ f.write(FruitToLime::SerializeHelper::serialize(to_xml_model))
195
+ end
196
+ end
197
+ end
198
+
199
+ require "thor"
200
+ require "fileutils"
201
+ require 'pathname'
202
+
203
+ class Cli < Thor
204
+ desc "to_go", "Generates a Go XML file"
205
+ method_option :output, :desc => "Path to file where xml will be output", :default => "export.xml", :type => :string
206
+ method_option :organizations, :desc => "Path to organization csv file", :type => :string
207
+ method_option :persons, :desc => "Path to persons csv file", :type => :string
208
+ method_option :coworkers, :desc => "Path to coworkers csv file", :type => :string
209
+ method_option :deals, :desc => "Path to deals csv file", :type => :string
210
+ def to_go
211
+ output = options.output
212
+ exporter = Exporter.new()
213
+ model = exporter.to_model(options.coworkers, options.organizations, options.persons, options.deals)
214
+ error = model.sanity_check
215
+ if error.empty?
216
+ validation_errors = model.validate
217
+
218
+ if validation_errors.empty?
219
+ model.serialize_to_file(output)
220
+ puts "Generated Go XML file: '#{output}'."
221
+ else
222
+ puts "Could not generate file due to"
223
+ puts validation_errors
224
+ end
225
+ else
226
+ puts "Could not generate file due to"
227
+ puts error
228
+ end
229
+ end
230
+ end