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.
Files changed (90) hide show
  1. data/bin/go-import +96 -0
  2. data/lib/go_import/csv_helper.rb +47 -0
  3. data/lib/go_import/email_helper.rb +10 -0
  4. data/lib/go_import/errors.rb +22 -0
  5. data/lib/go_import/excel_helper.rb +10 -0
  6. data/lib/go_import/global_phone.json +6571 -0
  7. data/lib/go_import/model/address.rb +61 -0
  8. data/lib/go_import/model/class_settings.rb +50 -0
  9. data/lib/go_import/model/coworker.rb +76 -0
  10. data/lib/go_import/model/coworker_reference.rb +33 -0
  11. data/lib/go_import/model/customfield.rb +87 -0
  12. data/lib/go_import/model/deal.rb +172 -0
  13. data/lib/go_import/model/deal_class_settings.rb +73 -0
  14. data/lib/go_import/model/deal_state.rb +15 -0
  15. data/lib/go_import/model/deal_status.rb +23 -0
  16. data/lib/go_import/model/deal_status_reference.rb +47 -0
  17. data/lib/go_import/model/deal_status_setting.rb +49 -0
  18. data/lib/go_import/model/documents.rb +51 -0
  19. data/lib/go_import/model/link.rb +70 -0
  20. data/lib/go_import/model/note.rb +97 -0
  21. data/lib/go_import/model/note_classification.rb +25 -0
  22. data/lib/go_import/model/organization.rb +219 -0
  23. data/lib/go_import/model/person.rb +151 -0
  24. data/lib/go_import/model/referencetosource.rb +46 -0
  25. data/lib/go_import/model/relation.rb +23 -0
  26. data/lib/go_import/model/rootmodel.rb +359 -0
  27. data/lib/go_import/model/settings.rb +61 -0
  28. data/lib/go_import/model/tag.rb +35 -0
  29. data/lib/go_import/model_helpers.rb +54 -0
  30. data/lib/go_import/phone_helper.rb +74 -0
  31. data/lib/go_import/roo_helper.rb +80 -0
  32. data/lib/go_import/serialize_helper.rb +186 -0
  33. data/lib/go_import/source.rb +87 -0
  34. data/lib/go_import/templating.rb +52 -0
  35. data/lib/go_import.rb +19 -0
  36. data/sources/csv/.gitignore +14 -0
  37. data/sources/csv/.go_import/runner.rb +62 -0
  38. data/sources/csv/Gemfile +5 -0
  39. data/sources/csv/Rakefile.rb +7 -0
  40. data/sources/csv/converter.rb +179 -0
  41. data/sources/csv/data/coworkers.csv +2 -0
  42. data/sources/csv/data/deals.csv +2 -0
  43. data/sources/csv/data/organizations.csv +2 -0
  44. data/sources/csv/data/persons.csv +2 -0
  45. data/sources/csv/spec/exporter_spec.rb +17 -0
  46. data/sources/csv/spec/sample_data/coworkers.csv +2 -0
  47. data/sources/csv/spec/sample_data/deals.csv +2 -0
  48. data/sources/csv/spec/sample_data/organizations.csv +2 -0
  49. data/sources/csv/spec/sample_data/persons.csv +2 -0
  50. data/sources/csv/spec/spec_helper.rb +30 -0
  51. data/sources/easy/.gitignore +14 -0
  52. data/sources/easy/.go_import/runner.rb +115 -0
  53. data/sources/easy/Export/readme.txt +6 -0
  54. data/sources/easy/Gemfile +5 -0
  55. data/sources/easy/Rakefile.rb +7 -0
  56. data/sources/easy/converter.rb +435 -0
  57. data/sources/easy/spec/exporter_spec.rb +10 -0
  58. data/sources/easy/spec/sample_data/Company.txt +649 -0
  59. data/sources/easy/spec/spec_helper.rb +30 -0
  60. data/sources/excel/.gitignore +14 -0
  61. data/sources/excel/.go_import/runner.rb +116 -0
  62. data/sources/excel/Gemfile +6 -0
  63. data/sources/excel/Rakefile.rb +7 -0
  64. data/sources/excel/converter.rb +130 -0
  65. data/sources/excel/spec/sample_data/sample.xlsx +0 -0
  66. data/sources/excel/spec/spec_helper.rb +26 -0
  67. data/sources/excel/spec/tomodel_spec.rb +18 -0
  68. data/sources/excel/template.xlsx +0 -0
  69. data/spec/address_spec.rb +49 -0
  70. data/spec/class_settings_spec.rb +37 -0
  71. data/spec/coworker_spec.rb +94 -0
  72. data/spec/custom_field_spec.rb +22 -0
  73. data/spec/deal_class_settings_spec.rb +104 -0
  74. data/spec/deal_spec.rb +182 -0
  75. data/spec/deal_status_reference_spec.rb +17 -0
  76. data/spec/documents_spec.rb +37 -0
  77. data/spec/helpers/csv_helper_spec.rb +29 -0
  78. data/spec/helpers/email_helper_spec.rb +32 -0
  79. data/spec/helpers/phone_helper_spec.rb +97 -0
  80. data/spec/helpers/roo_helper_spec.rb +10 -0
  81. data/spec/helpers/serialize_helper_spec.rb +249 -0
  82. data/spec/helpers/xsd_validate_spec.rb +55 -0
  83. data/spec/link_spec.rb +106 -0
  84. data/spec/note_spec.rb +110 -0
  85. data/spec/organization_spec.rb +151 -0
  86. data/spec/person_spec.rb +132 -0
  87. data/spec/rootmodel_spec.rb +371 -0
  88. data/spec/spec_helper.rb +30 -0
  89. data/spec/templating_spec.rb +12 -0
  90. metadata +306 -0
@@ -0,0 +1,186 @@
1
+ # encoding: utf-8
2
+ require "rexml/document"
3
+
4
+ module GoImport
5
+ module SerializeHelper
6
+ def serialize()
7
+ SerializeHelper::serialize(self)
8
+ end
9
+
10
+ def serialize_to_file(file)
11
+ SerializeHelper::serialize_to_file(file, self)
12
+ end
13
+
14
+ # @!visibility private
15
+ def self.serialize_variables_rexml(elem, obj)
16
+ if (obj.respond_to?(:serialize_variables))
17
+ obj.serialize_variables.each do |serialize_variable|
18
+ element_name = serialize_variable[:id].to_s.gsub(/^\@/,'').split('_').map do |m|
19
+ m.capitalize
20
+ end.join('')
21
+
22
+ raw_var = obj.instance_variable_get("@#{serialize_variable[:id].to_s}")
23
+ if raw_var != nil
24
+ element = elem.add_element(element_name)
25
+ if (raw_var.respond_to?(:serialize_variables))
26
+ SerializeHelper::serialize_variables_rexml(element, raw_var)
27
+ elsif (raw_var.is_a?(Array))
28
+ raw_var.each do |raw_var_elem|
29
+ SerializeHelper::serialize_rexml(element, raw_var_elem)
30
+ end
31
+ else
32
+ element.text = raw_var.to_s.encode('UTF-8')
33
+ end
34
+ end
35
+ end
36
+ return
37
+ end
38
+ raise "Do not know how to handle #{obj.class} !!"
39
+ end
40
+
41
+ # @!visibility private
42
+ def self.serialize_rexml(elem, obj)
43
+ if obj.respond_to?(:to_rexml)
44
+ obj.to_rexml(elem)
45
+ elsif (obj.respond_to?(:serialize_variables))
46
+ element_name = obj.serialize_name
47
+ SerializeHelper::serialize_variables_rexml(elem.add_element(element_name), obj)
48
+ else
49
+ elem.text = obj.to_s
50
+ end
51
+ end
52
+
53
+ # @!visibility private
54
+ def self.serialize(obj, indent= 2)
55
+ # indent -1 to avoid indent
56
+ if obj.respond_to?(:to_rexml)
57
+ doc = REXML::Document.new()
58
+ SerializeHelper::serialize_rexml(doc, obj)
59
+ doc.write( xml_str = "" , indent, true)
60
+ xml_str
61
+ elsif (obj.respond_to?(:serialize_variables))
62
+ element_name = obj.serialize_name
63
+ doc = REXML::Document.new()
64
+ SerializeHelper::serialize_variables_rexml(doc.add_element(element_name), obj)
65
+ doc.write( xml_str = "", indent, true)
66
+ xml_str
67
+ else
68
+ obj.to_s.encode(:xml => :text)
69
+ end
70
+ end
71
+
72
+ # @!visibility private
73
+ def self.serialize_to_file(file, obj)
74
+ File.open(file, 'w') do |f|
75
+ f.write(SerializeHelper::serialize(obj))
76
+ end
77
+ end
78
+
79
+ # @!visibility private
80
+ def symbol_to_name(symbol)
81
+ symbol.to_s.split('_').join(' ').capitalize
82
+ end
83
+
84
+ # @!visibility private
85
+ def map_symbol_to_row(symbol,type)
86
+ {
87
+ :id => symbol.to_s,
88
+ :name => symbol == :id ? 'Go id' : symbol_to_name(symbol),
89
+ :type =>type
90
+ }
91
+ end
92
+
93
+ # @!visibility private
94
+ def map_to_row(p)
95
+ case p[:type]
96
+ when :string then
97
+ map_symbol_to_row(p[:id],p[:type])
98
+ when :bool then
99
+ map_symbol_to_row(p[:id],p[:type])
100
+ when :date then
101
+ map_symbol_to_row(p[:id],p[:type])
102
+ when :notes then
103
+ {
104
+ :id => p[:id].to_s,
105
+ :name => symbol_to_name(p[:id]),
106
+ :type => p[:type],
107
+ :models => SerializeHelper.get_import_rows(:note)
108
+ }
109
+ when :tags then
110
+ {
111
+ :id => p[:id].to_s,
112
+ :type => p[:type],
113
+ :name => symbol_to_name(p[:id]),
114
+ }
115
+ when :persons then
116
+ {
117
+ :id => p[:id].to_s,
118
+ :type => p[:type],
119
+ :name => symbol_to_name(p[:id]),
120
+ :models => SerializeHelper.get_import_rows(:person)
121
+ }
122
+ when :custom_fields then
123
+ {
124
+ :id => p[:id].to_s,
125
+ :type => p[:type],
126
+ :name => symbol_to_name(p[:id]),
127
+ :models => SerializeHelper.get_import_rows(:custom_field)
128
+ }
129
+ when :custom_values then
130
+ {
131
+ :id => p[:id].to_s,
132
+ :type => p[:type],
133
+ :name => symbol_to_name(p[:id]),
134
+ :models => SerializeHelper.get_import_rows(:custom_value)
135
+ }
136
+ else
137
+ {
138
+ :id => p[:id].to_s,
139
+ :name => symbol_to_name(p[:id]),
140
+ :type => p[:type],
141
+ :model => SerializeHelper.get_import_rows(p[:type])
142
+ }
143
+ end
144
+ end
145
+
146
+ # What fields/rows on the class is supposed to be used by the Gem to generate the xml
147
+ # This method uses #serialize_variables.
148
+ def get_import_rows
149
+ serialize_variables.map do |p|
150
+ map_to_row p
151
+ end
152
+ end
153
+
154
+ # @!visibility private
155
+ def self.get_import_rows(type)
156
+ case type
157
+ when :person then
158
+ Person.new
159
+ when :source_ref then
160
+ ReferenceToSource.new
161
+ when :note then
162
+ Note.new
163
+ when :address then
164
+ Address.new
165
+ when :organization then
166
+ Organization.new
167
+ when :coworker_reference then
168
+ CoworkerReference.new
169
+ when :organization_reference then
170
+ OrganizationReference.new
171
+ when :custom_field then
172
+ CustomField.new
173
+ when :custom_value then
174
+ CustomValue.new
175
+ when :custom_field_reference then
176
+ CustomFieldReference.new
177
+ when :settings then
178
+ Settings.new
179
+ when :class_settings then
180
+ ClassSettings.new
181
+ else
182
+ raise "Unknown type: #{type}"
183
+ end.get_import_rows
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,87 @@
1
+ require 'fileutils'
2
+ require 'open3'
3
+
4
+ module GoImport
5
+ class Sources
6
+ def initialize(path)
7
+ @path = path
8
+ end
9
+
10
+ def list()
11
+ Dir.entries(@path).select {
12
+ |f| f != '.' && f != '..'
13
+ }
14
+ end
15
+
16
+ def create_project_from_source(project_name, source_name)
17
+ if !source_exists?(source_name)
18
+ puts "The source '#{source_name}' doesnt exist."
19
+ return false
20
+ end
21
+
22
+ if project_exists?(project_name)
23
+ puts "A project named '#{project_name}' already exists"
24
+ return false
25
+ end
26
+
27
+ begin
28
+ copy_source_to_folder(source_name, project_name)
29
+
30
+ install_gems_for_project(project_name)
31
+ return true
32
+ rescue
33
+ puts "Something when wrong (errors should have been printed above)..."
34
+ FileUtils.remove_dir(project_name, true)
35
+ return false
36
+ end
37
+ end
38
+
39
+ private
40
+ def source_exists?(name)
41
+ source = list.find { |s| s.downcase == name.downcase }
42
+
43
+ return !source.nil?
44
+ end
45
+
46
+ private
47
+ def project_exists?(name)
48
+ # do we have a folder named 'name' in the current folder?
49
+ project = Dir.entries(Dir.pwd).find { |f| f.downcase == name.downcase}
50
+
51
+ return !project.nil?
52
+ end
53
+
54
+ private
55
+ def copy_source_to_folder(source_name, project_name)
56
+ puts "Trying to create project '#{project_name}' from source '#{source_name}'..."
57
+ FileUtils.cp_r File.expand_path(source_name, @path), project_name
58
+ end
59
+
60
+ private
61
+ def install_gems_for_project(project_name)
62
+ puts "Trying to verify that all required gems are installed..."
63
+ Dir.chdir(File.expand_path(project_name, Dir.pwd)) do
64
+ exec_but_dont_show_unless_error('bundle install --verbose')
65
+ end
66
+ end
67
+
68
+ private
69
+ def exec_but_dont_show_unless_error(cmd)
70
+ std_out_value = []
71
+ Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
72
+ while std_line = stdout.gets
73
+ std_out_value << std_line
74
+ end
75
+
76
+ exit_status = wait_thr.value
77
+ if !exit_status.success?
78
+ puts "Command '#{cmd}' failed with #{exit_status}"
79
+ puts "Output from command:"
80
+ puts std_out_value
81
+
82
+ raise "failed exec #{cmd}"
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,52 @@
1
+ require "fileutils"
2
+ require 'open3'
3
+ module GoImport
4
+ class Templating
5
+ def initialize(path)
6
+ @path = path
7
+ end
8
+
9
+ def list()
10
+ Dir.entries(@path).select { |d| d != '.' && d != '..' }
11
+ end
12
+
13
+ def unpack(name, path)
14
+ template = list.find { |t| t == name }
15
+ if template
16
+ unpackedname = name
17
+
18
+ puts "Unpacking template #{name} to #{path}"
19
+ FileUtils.cp_r File.expand_path(name, @path), path
20
+
21
+ # Now make sure all gems in template are installed
22
+ puts "Making sure all needed gems are present"
23
+ Dir.chdir(File.expand_path(unpackedname, path)) do
24
+ exec_but_dont_show_unless_error('bundle install --verbose')
25
+ end
26
+ true
27
+ else
28
+ puts "Unable to find template #{name}"
29
+ false
30
+ end
31
+ end
32
+
33
+ private
34
+ def exec_but_dont_show_unless_error(cmd)
35
+ std_out_value = []
36
+ Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
37
+ while std_line = stdout.gets
38
+ std_out_value << std_line
39
+ end
40
+
41
+ exit_status = wait_thr.value
42
+ if !exit_status.success?
43
+ puts "Failed with #{exit_status}"
44
+ puts "std_out_value"
45
+ puts std_out_value
46
+
47
+ raise "failed exec #{cmd}"
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
data/lib/go_import.rb ADDED
@@ -0,0 +1,19 @@
1
+ module GoImport
2
+ private
3
+ def self.require_all_in(folder)
4
+ Dir.glob(File.join( File.dirname(File.absolute_path(__FILE__)),folder), &method(:require))
5
+ end
6
+
7
+ require 'go_import/errors'
8
+ require 'go_import/serialize_helper'
9
+ require 'go_import/model_helpers'
10
+ #FruitToLime::require_all_in 'go_import/model/*.rb'
11
+ GoImport::require_all_in 'go_import/model/*.rb'
12
+ require 'go_import/csv_helper'
13
+ require 'go_import/roo_helper'
14
+ require 'go_import/phone_helper'
15
+ require 'go_import/email_helper'
16
+ require 'go_import/excel_helper'
17
+ require 'go_import/templating'
18
+ require 'go_import/source'
19
+ end
@@ -0,0 +1,14 @@
1
+ # See http://help.github.com/ignore-files/ for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile ~/.gitignore_global
6
+
7
+ # Ignore bundler config
8
+ /.bundle
9
+ # Ignore built gems
10
+ /*.gem
11
+ # Ignore all logfiles and tempfiles.
12
+ /tmp
13
+ /spec/tmp
14
+ pkg
@@ -0,0 +1,62 @@
1
+
2
+ require 'go_import'
3
+ require_relative("../converter")
4
+
5
+ # COWORKER_FILE and other file names should be defined ../converter.rb
6
+
7
+ def process_rows(file_name)
8
+ data = File.open(file_name, 'r').read.encode('UTF-8',"ISO-8859-1")
9
+ rows = GoImport::CsvHelper::text_to_hashes(data)
10
+ rows.each do |row|
11
+ yield row
12
+ end
13
+ end
14
+
15
+ def convert_source
16
+ puts "Trying to convert CSV source to LIME Go..."
17
+
18
+ converter = Converter.new
19
+
20
+ # A rootmodel is used to represent all entitite/models that is
21
+ # exported
22
+ rootmodel = GoImport::RootModel.new
23
+
24
+ converter.configure(rootmodel)
25
+
26
+ # coworkers
27
+ # start with these since they are referenced
28
+ # from everywhere....
29
+ if defined?(COWORKER_FILE) && !COWORKER_FILE.nil? && !COWORKER_FILE.empty?
30
+ process_rows COWORKER_FILE do |row|
31
+ rootmodel.add_coworker(converter.to_coworker(row))
32
+ end
33
+ end
34
+
35
+ # organizations
36
+ if defined?(ORGANIZATION_FILE) && !ORGANIZATION_FILE.nil? && !ORGANIZATION_FILE.empty?
37
+ process_rows ORGANIZATION_FILE do |row|
38
+ rootmodel.add_organization(converter.to_organization(row, rootmodel))
39
+ end
40
+ end
41
+
42
+ # persons
43
+ # depends on organizations
44
+ if defined?(PERSON_FILE) && !PERSON_FILE.nil? && !PERSON_FILE.empty?
45
+ process_rows PERSON_FILE do |row|
46
+ # adds it self to the employer
47
+ converter.to_person(row, rootmodel)
48
+ end
49
+ end
50
+
51
+ # deals
52
+ # deals can reference coworkers (responsible), organizations
53
+ # and persons (contact)
54
+ if defined?(DEAL_FILE) && !DEAL_FILE.nil? && !DEAL_FILE.empty?
55
+ process_rows DEAL_FILE do |row|
56
+ rootmodel.add_deal(converter.to_deal(row, rootmodel))
57
+ end
58
+ end
59
+
60
+ return rootmodel
61
+ end
62
+
@@ -0,0 +1,5 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'thor'
4
+ #gem 'go_import'
5
+ gem 'rspec'
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,179 @@
1
+ require 'go_import'
2
+
3
+ # This converter will convert one or more CVS files into a LIME Go XML
4
+ # file.
5
+
6
+ # You need to customize this script to suit your CVS file(s).
7
+
8
+ # First we set the file names of your CVS files. If you dont need to
9
+ # import all kind of objects, just leave the filename empty or remove
10
+ # the line.
11
+ COWORKER_FILE = "data/coworkers.csv"
12
+ ORGANIZATION_FILE = "data/organizations.csv"
13
+ PERSON_FILE = "data/persons.csv"
14
+ DEAL_FILE = "data/deals.csv"
15
+
16
+ # Ie if you dont want to import deals, set DEAL_FILE = ""
17
+
18
+ class Converter
19
+ # Configure your root model, add custom fields and deal statuses.
20
+ def configure(rootmodel)
21
+ # add custom field to your model here. Custom fields can be
22
+ # added to organization, deal and person. Valid types are
23
+ # :String and :Link. If no type is specified :String is used
24
+ # as default.
25
+ rootmodel.settings.with_organization do |organization|
26
+ organization.set_custom_field( { :integrationid => 'external_url', :title => 'Link to external system', :type => :Link } )
27
+ end
28
+
29
+ rootmodel.settings.with_deal do |deal|
30
+ deal.add_status({:label => "1. Kvalificering", :integration_id => "qualification"})
31
+ deal.add_status({:label => "Vunnen", :integration_id => "won",
32
+ :assessment => GoImport::DealState::PositiveEndState })
33
+ deal.add_status({:label => "Lost", :integration_id => "Lost",
34
+ :assessment => GoImport::DealState::NegativeEndState })
35
+ end
36
+ end
37
+
38
+ # Turns a row from the organization csv file into a
39
+ # GoImport::Organization.
40
+ # Use rootmodel to locate other related stuff such coworker
41
+ def to_organization(row, rootmodel)
42
+ organization = GoImport::Organization.new
43
+ # Integrationid is typically the id in the system that
44
+ # we are getting the csv from. Must be set to be able
45
+ # to import the same file more than once without
46
+ # creating duplicates
47
+ organization.integration_id = row['id']
48
+ organization.name = row['name']
49
+
50
+ # Just setting all basic properties to show whats available
51
+ # Remove or fix...
52
+ organization.organization_number = 'a number' # needs clean up, should have helpers for that in lib. Swedish format.
53
+ organization.email = 'email to organizaiton, not the person'
54
+ organization.web_site = 'www.whatever.com'
55
+ organization.central_phone_number = '0000' # needs clean up, should have helpers for that in lib. Default swedish format, convert to global format
56
+
57
+ # Addresses consists of several parts in Go.
58
+ # Lots of other systems have the address all in one
59
+ # line, to be able to match when importing it is
60
+ # way better to split the addresses
61
+ organization.with_visit_address do |address|
62
+ address.street = 'visit street'
63
+ address.zip_code = 'visit zip'
64
+ address.city = 'visit city'
65
+ end
66
+
67
+ # Another example of setting address using
68
+ # helper to split '226 48 LUND' into zip and city
69
+ organization.with_postal_address do |address|
70
+ address.street = 'postal street'
71
+ address.parse_zip_and_address_se '226 48 LUND'
72
+ end
73
+
74
+ # Responsible coworker is set by first locating
75
+ # it in the root model and then setting a reference
76
+ # to him/her
77
+ # We need to be able handle missing coworkers here
78
+ coworker = rootmodel.find_coworker_by_integration_id row['responsible_id']
79
+ organization.responsible_coworker = coworker.to_reference
80
+
81
+ # Tags are set and defined at the same place
82
+ # Setting a tag: Imported is useful for the user
83
+ organization.set_tag("Imported")
84
+
85
+ # When imported from web based ERP or similair that
86
+ # client will continue to use it can be useful to be
87
+ # able to link from Go to the same record in the ERP
88
+ # FOr instance Lime links
89
+ organization.set_custom_value("external_url", "http://something.com?key=#{row['id']}")
90
+
91
+ return organization
92
+ end
93
+
94
+ # Turns a row from the coworker csv file into a GoImport::Coworker.
95
+ def to_coworker(row)
96
+ coworker = GoImport::Coworker.new
97
+ coworker.integration_id = row['id']
98
+ coworker.first_name = row['first_name']
99
+ coworker.last_name = row['last_name']
100
+
101
+ # Other optional attributes
102
+ coworker.email = 't@e.com'
103
+ coworker.direct_phone_number = '+46121212'
104
+ coworker.mobile_phone_number = '+46324234'
105
+ coworker.home_phone_number = '+46234234'
106
+
107
+ # Tags and custom fields are set the same
108
+ # way as on organizations
109
+
110
+ return coworker
111
+ end
112
+
113
+ # Turns a row from the person csv file into a GoImport::Person.
114
+ #
115
+ # You MUST add the new person to an existing organization. Use the
116
+ # rootmodel to find the organization and then add the person with
117
+ # organization.add_employee
118
+ def to_person(row, rootmodel)
119
+ person = GoImport::Person.new
120
+ person.integration_id = row['id']
121
+ # Note that Go has separate first and last names
122
+ # Some splitting might be necessary
123
+ person.first_name = row['first_name']
124
+ person.last_name = row['last_name']
125
+ # other optional attributes
126
+ person.direct_phone_number = '+4611111'
127
+ person.fax_phone_number = '+4623234234234'
128
+ person.mobile_phone_number = '+462321212'
129
+ person.email = 'x@y.com'
130
+ person.alternative_email = 'y@x.com'
131
+ person.with_postal_address do |address|
132
+ address.street = 'postal street'
133
+ address.parse_zip_and_address_se '226 48 LUND'
134
+ end
135
+
136
+ # Tags and custom fields are set the same
137
+ # way as on organizations
138
+
139
+ # set employer connection
140
+ employer_id = row['employer_id']
141
+ employer = rootmodel.find_organization_by_integration_id employer_id
142
+ employer.add_employee person
143
+ end
144
+
145
+ # Turns a row form the deal csv file into a GoImport::Deal. Use
146
+ # the rootmodel to find objects that should be linked to the new
147
+ # deal.
148
+ def to_deal(row, rootmodel)
149
+ deal = GoImport::Deal.new
150
+ deal.integration_id = row['id']
151
+ deal.name = row['name']
152
+ # should be integer, same currency should be used in
153
+ # the system
154
+ deal.value = row['value']
155
+
156
+ # find stuff connected to deal
157
+ responsible = rootmodel.find_coworker_by_integration_id row['responsible_id']
158
+ organization = rootmodel.find_organization_by_integration_id row['customer_id']
159
+ person = organization.find_employee_by_integration_id row['customer_contact_id']
160
+ # connect the deal by references
161
+ deal.responsible_coworker = responsible.to_reference
162
+ deal.customer = organization.to_reference
163
+ deal.customer_contact = person.to_reference
164
+
165
+ # other optional attributes
166
+ deal.probability = 50 # should be between 0 - 100
167
+ deal.order_date = '2014-01-05' # Format ?
168
+
169
+ # status, set this by either label, id or integration_id (use
170
+ # appropriate method to find status)
171
+ deal.status = rootmodel.settings.deal.find_status_by_label row['status']
172
+
173
+ # or set by existing status, search by label, integration_id
174
+ # (if string) or id (if integer).
175
+ # deal.status = "Won"
176
+
177
+ return deal
178
+ end
179
+ end
@@ -0,0 +1,2 @@
1
+ id;first_name;last_name
2
+ 666;Evil;Elvis
@@ -0,0 +1,2 @@
1
+ id;name;value;responsible_id;customer_id;customer_contact_id;status
2
+ 333;Feta affären;10000;666;6;123;Vunnen
@@ -0,0 +1,2 @@
1
+ id;name;responsible_id
2
+ 6;Alfs Mjukvaruutveckling;666
@@ -0,0 +1,2 @@
1
+ id;employer_id;first_name;last_name
2
+ 123;6;Rune;Rebellion
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ require 'tomodel'
3
+
4
+ describe 'Exporter' do
5
+ before(:all) do
6
+ exporter = Exporter.new
7
+ organizations_file = File.join(File.dirname(__FILE__), 'sample_data', 'organizations.csv')
8
+ coworkers_file = File.join(File.dirname(__FILE__), 'sample_data', 'coworkers.csv')
9
+ persons_file = File.join(File.dirname(__FILE__), 'sample_data', 'persons.csv')
10
+ deals_file = File.join(File.dirname(__FILE__), 'sample_data', 'deals.csv')
11
+ @model = exporter.to_model(coworkers_file, organizations_file, persons_file, deals_file)
12
+ end
13
+ it "will find something with a name" do
14
+ organization = @model.organizations[0]
15
+ organization.name.length.should > 0
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ id;first_name;last_name
2
+ 666;Evil;Elvis
@@ -0,0 +1,2 @@
1
+ id;name;value;responsible_id;customer_id;customer_contact_id;status
2
+ 333;Feta affären;10000;666;6;123;Vunnen
@@ -0,0 +1,2 @@
1
+ id;name;responsible_id
2
+ 6;Alfs Mjukvaruutveckling;666
@@ -0,0 +1,2 @@
1
+ id;employer_id;first_name;last_name
2
+ 123;6;Rune;Rebellion