move-to-go 5.0.4 → 5.0.6
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.
- checksums.yaml +4 -4
- data/bin/move-to-go +4 -0
- data/lib/move-to-go/model/deal.rb +17 -10
- data/lib/move-to-go/model/organization.rb +76 -0
- data/lib/move-to-go/model/organizations.rb +71 -0
- data/lib/move-to-go/model/rootmodel.rb +60 -1
- data/spec/organizations_spec.rb +208 -0
- data/spec/rootmodel_spec.rb +93 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91b6f9abf8f63efa4c4a49c64fa0ef214200fa78
|
4
|
+
data.tar.gz: 2842fa80a9fa1719c421924aae7e0250ea48bfe6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72b34f0e942fd720e85eebe9e9ff0cc6bf72d1396524e489e76812387405d98ec6f3174034ca6ce739be4527a357edeffa7e5664f30f2dcc55feec5ff1f9c60c
|
7
|
+
data.tar.gz: adde6e214d1941b7299592517258d55a9bea6db8015b6020cc9ddbbb2ee78790e565f78b631c96acb714fd405d1159665f760cadebfee5e882f07efe47fde5d5
|
data/bin/move-to-go
CHANGED
@@ -106,6 +106,10 @@ class MoveToGoCommandLine < Thor
|
|
106
106
|
end
|
107
107
|
model.report_rootmodel_status()
|
108
108
|
|
109
|
+
puts "Checking for duplicate organizations..."
|
110
|
+
possible_duplicates = model.organizations.find_duplicates_by(:name, :organization_number)
|
111
|
+
puts "Found #{possible_duplicates.length} organization duplicate sets in rootmodel, based on name and organization number"
|
112
|
+
|
109
113
|
puts "Starting sharding of model..."
|
110
114
|
sharder = MoveToGo::ShardHelper.new(options.shard_size)
|
111
115
|
models_to_serialize = sharder.shard_model(model)
|
@@ -114,34 +114,41 @@ module MoveToGo
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def validate(labels = nil)
|
117
|
-
|
118
|
-
warnings =
|
117
|
+
errors = []
|
118
|
+
warnings = []
|
119
119
|
|
120
120
|
if @name.nil? || @name.empty?
|
121
|
-
|
121
|
+
errors.push("A name is required for deal.")
|
122
122
|
end
|
123
123
|
|
124
124
|
if is_integer?(@value) && @value.to_i < 0
|
125
|
-
|
125
|
+
errors.push("The value must be positive for deal.")
|
126
126
|
end
|
127
127
|
|
128
128
|
if !@status.nil? && @status.status_reference.nil?
|
129
|
-
|
129
|
+
errors.push("Status must have a status reference.")
|
130
130
|
end
|
131
131
|
|
132
132
|
if !@status.nil? && !@status.status_reference.nil? && @status.status_reference.validate.length > 0
|
133
|
-
|
133
|
+
val = @status.status_reference.validate
|
134
|
+
if val.length > 0
|
135
|
+
errors.push(val)
|
136
|
+
end
|
134
137
|
end
|
135
138
|
|
136
139
|
if !@status.nil? && !@status.status_reference.nil? && (labels.nil? || (!labels.nil? && !labels.include?(@status.status_reference.label)))
|
137
|
-
warnings
|
140
|
+
warnings.push("Deal status '#{@status.status_reference.label}' missing, add to settings")
|
141
|
+
end
|
142
|
+
|
143
|
+
if @status == nil
|
144
|
+
warnings.push("No status set on deal (#{@integration_id}) '#{@name}', will be set to default status at import")
|
138
145
|
end
|
139
146
|
|
140
|
-
if
|
141
|
-
|
147
|
+
if errors.length > 0
|
148
|
+
errors.push(serialize())
|
142
149
|
end
|
143
150
|
|
144
|
-
return [
|
151
|
+
return [errors.join('\n'), warnings.join('\n')]
|
145
152
|
end
|
146
153
|
|
147
154
|
def with_status
|
@@ -71,6 +71,7 @@ module MoveToGo
|
|
71
71
|
##
|
72
72
|
# :attr_accessor: source_data
|
73
73
|
immutable_accessor :source_data
|
74
|
+
attr_accessor :rootmodel
|
74
75
|
|
75
76
|
# Sets/gets the date when this organization's relation was
|
76
77
|
# changed. Default is Now.
|
@@ -80,7 +81,11 @@ module MoveToGo
|
|
80
81
|
# you add custom values by using {#set_custom_value}
|
81
82
|
attr_reader :custom_values
|
82
83
|
|
84
|
+
# You can read linked objects
|
85
|
+
attr_reader :deals, :histories, :documents
|
86
|
+
|
83
87
|
def initialize(opt = nil)
|
88
|
+
@employees = []
|
84
89
|
if !opt.nil?
|
85
90
|
serialize_variables.each do |myattr|
|
86
91
|
val = opt[myattr[:id]]
|
@@ -180,6 +185,18 @@ module MoveToGo
|
|
180
185
|
end
|
181
186
|
end
|
182
187
|
|
188
|
+
def deals
|
189
|
+
@rootmodel.find_deals_for_organization(self)
|
190
|
+
end
|
191
|
+
|
192
|
+
def histories
|
193
|
+
@rootmodel.select_histories{|history| history.organization == self}
|
194
|
+
end
|
195
|
+
|
196
|
+
def documents(type)
|
197
|
+
@rootmodel.select_documents(type){|doc| doc.organization == self}
|
198
|
+
end
|
199
|
+
|
183
200
|
# Sets the organization's relation to the specified value. The
|
184
201
|
# relation must be a valid value from the Relation module
|
185
202
|
# otherwise an InvalidRelationError error will be thrown.
|
@@ -266,5 +283,64 @@ module MoveToGo
|
|
266
283
|
|
267
284
|
return error
|
268
285
|
end
|
286
|
+
|
287
|
+
# Moves all data from an organization to this organization. The pillaged
|
288
|
+
# org is still kept as a empty shell of itself in the rootmodel
|
289
|
+
def move_data_from(org)
|
290
|
+
flat_instance_variables_to_copy = [:@name, :@organization_number, :@email, :@web_site, :@central_phone_number]
|
291
|
+
class_instance_variables_to_copy = [:@visiting_address, :@postal_address, :@source_data]
|
292
|
+
org.instance_variables.each{ |variable|
|
293
|
+
|
294
|
+
# Only change the value if it is empty
|
295
|
+
if flat_instance_variables_to_copy.include? variable
|
296
|
+
if !self.instance_variable_get(variable)
|
297
|
+
self.instance_variable_set(variable, org.instance_variable_get(variable))
|
298
|
+
end
|
299
|
+
|
300
|
+
# Some of the instances variabels are classes
|
301
|
+
|
302
|
+
elsif class_instance_variables_to_copy.include? variable
|
303
|
+
|
304
|
+
class_instance = org.instance_variable_get(variable)
|
305
|
+
class_instance.instance_variables.each { |sub_variable|
|
306
|
+
|
307
|
+
#If there is no class, create one
|
308
|
+
if !self.instance_variable_get(variable)
|
309
|
+
case variable
|
310
|
+
when :@visit_address, :@postal_address
|
311
|
+
klass = MoveToGo::Address.new
|
312
|
+
when :@source_data
|
313
|
+
klass = MoveToGo::SourceData.new
|
314
|
+
end
|
315
|
+
self.instance_variable_set(variable, klass)
|
316
|
+
end
|
317
|
+
if !self.instance_variable_get(variable).instance_variable_get(sub_variable)
|
318
|
+
self.instance_variable_get(variable).instance_variable_set(
|
319
|
+
sub_variable, class_instance.instance_variable_get(sub_variable)
|
320
|
+
)
|
321
|
+
end
|
322
|
+
}
|
323
|
+
elsif variable == :@custom_values
|
324
|
+
org.custom_values.each{ |custom_value|
|
325
|
+
self.set_custom_value(custom_value.field, custom_value.value)
|
326
|
+
}
|
327
|
+
end
|
328
|
+
}
|
329
|
+
|
330
|
+
self.with_postal_address do
|
331
|
+
|
332
|
+
end
|
333
|
+
|
334
|
+
org.employees.each{ |person| self.add_employee(person)}
|
335
|
+
|
336
|
+
org.deals.each{ |deal| deal.instance_variable_set("@customer", self)} # Object is "immutable" if using "="
|
337
|
+
|
338
|
+
org.histories.each{|history| history.instance_variable_set("@organization", self)}
|
339
|
+
|
340
|
+
org.documents(:file).each{|file| file.instance_variable_set("@organization", self)}
|
341
|
+
|
342
|
+
org.documents(:link).each{|history| history.instance_variable_set("@organization", self)}
|
343
|
+
|
344
|
+
end
|
269
345
|
end
|
270
346
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module MoveToGo
|
2
|
+
class Organizations < Hash
|
3
|
+
|
4
|
+
def initialize(rootmodel)
|
5
|
+
@rootmodel = rootmodel
|
6
|
+
end
|
7
|
+
|
8
|
+
class DuplicateSet < Array
|
9
|
+
# Moves all data to the first organization and returns the remaining orgs
|
10
|
+
def merge_all!()
|
11
|
+
return self.map{ |org|
|
12
|
+
if org != self.first
|
13
|
+
self.first.move_data_from(org)
|
14
|
+
org
|
15
|
+
end
|
16
|
+
}
|
17
|
+
.flatten
|
18
|
+
.compact
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class DuplicateSetArray < Array
|
23
|
+
|
24
|
+
def initialize(rootmodel, array)
|
25
|
+
@rootmodel = rootmodel
|
26
|
+
super(array)
|
27
|
+
end
|
28
|
+
|
29
|
+
def map_duplicates(&block)
|
30
|
+
|
31
|
+
# Send the sets to the function that will decide to keep or remove them
|
32
|
+
# Can return Nil, a single org, empty array or an array of orgs. Compact and flatten to fix
|
33
|
+
self
|
34
|
+
.map{ |duplicate_set| yield DuplicateSet.new duplicate_set}
|
35
|
+
.flatten
|
36
|
+
.compact
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
#Finds duplicates based on supplied fields. Returns an DuplicateSetArray
|
42
|
+
def find_duplicates_by(*raw_fields_to_check)
|
43
|
+
# map fields to instance variable name or to class. For example :name
|
44
|
+
# or "visiting_address.city" => [:visiting_address, :city]
|
45
|
+
fields_to_check = raw_fields_to_check.map{ |field|
|
46
|
+
fields = field.to_s.split(".")
|
47
|
+
case fields.length
|
48
|
+
when 1 then :"@#{field}"
|
49
|
+
when 2 then [:"@#{fields[0]}",:"@#{fields[1]}"]
|
50
|
+
else raise
|
51
|
+
end
|
52
|
+
}
|
53
|
+
# Find all posible duplicates and collect them to sets.
|
54
|
+
possible_duplicate_sets = self
|
55
|
+
.values
|
56
|
+
.group_by{ |org|
|
57
|
+
fields_to_check.map{ |field|
|
58
|
+
case field # Some fields (Address) are accually class objects, check what we are dealing with
|
59
|
+
when Symbol then val = org.instance_variable_get(field)
|
60
|
+
when Array then val = org.instance_variable_get(field[0]).instance_variable_get(field[1])
|
61
|
+
end
|
62
|
+
val.downcase.strip
|
63
|
+
}
|
64
|
+
}
|
65
|
+
.select { |k, v| v.size > 1 }
|
66
|
+
.values
|
67
|
+
|
68
|
+
return DuplicateSetArray.new(@rootmodel, possible_duplicate_sets)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -43,7 +43,7 @@ module MoveToGo
|
|
43
43
|
|
44
44
|
def initialize()
|
45
45
|
@settings = Settings.new
|
46
|
-
@organizations =
|
46
|
+
@organizations = Organizations.new self
|
47
47
|
@coworkers = {}
|
48
48
|
@migrator_coworker = Coworker.new
|
49
49
|
@migrator_coworker.integration_id = "migrator"
|
@@ -118,11 +118,41 @@ module MoveToGo
|
|
118
118
|
end
|
119
119
|
|
120
120
|
@organizations[organization.integration_id] = organization
|
121
|
+
organization.rootmodel = self
|
121
122
|
organization.set_is_immutable
|
122
123
|
|
123
124
|
return organization
|
124
125
|
end
|
125
126
|
|
127
|
+
def remove_organization(organization)
|
128
|
+
if organization.nil?
|
129
|
+
return nil
|
130
|
+
end
|
131
|
+
|
132
|
+
if !organization.is_a?(Organization)
|
133
|
+
raise ArgumentError.new("Expected an organization")
|
134
|
+
end
|
135
|
+
|
136
|
+
if organization.integration_id.nil? || organization.integration_id.length == 0
|
137
|
+
raise IntegrationIdIsRequiredError, "An integration id is required to remove an organization"
|
138
|
+
end
|
139
|
+
|
140
|
+
find_deals_for_organization(organization)
|
141
|
+
.each{|deal| @deals.delete(deal.integration_id)}
|
142
|
+
|
143
|
+
select_histories{|history| history.organization == organization}
|
144
|
+
.each{|history| @histories.delete(history.integration_id)}
|
145
|
+
|
146
|
+
select_documents(:file){|file| file.organization == organization}
|
147
|
+
.each{|file| @documents.files.delete(file.integration_id)}
|
148
|
+
|
149
|
+
select_documents(:link){|history| history.organization == organization}
|
150
|
+
.each{|history| @documents.links.delete(history.integration_id)}
|
151
|
+
|
152
|
+
@organizations.delete(organization.integration_id)
|
153
|
+
|
154
|
+
end
|
155
|
+
|
126
156
|
# Adds the specifed deal object to the model.
|
127
157
|
# @example Add a deal from a new deal
|
128
158
|
# deal = MoveToGo::Deal.new
|
@@ -421,6 +451,16 @@ module MoveToGo
|
|
421
451
|
return result
|
422
452
|
end
|
423
453
|
|
454
|
+
# Finds a history based on one of its property.
|
455
|
+
# Returns all found matching history
|
456
|
+
# @example Finds a history on its name
|
457
|
+
# rm.select_history {|history| history.text == "hello!" }
|
458
|
+
def select_histories(report_result=!!configuration[:report_result], &block)
|
459
|
+
result = select(@histories.values.flatten, &block)
|
460
|
+
report_failed_to_find_object("history") if result.nil? and report_result
|
461
|
+
return result
|
462
|
+
end
|
463
|
+
|
424
464
|
# Finds a document based on one of its property.
|
425
465
|
# Returns the first found matching document
|
426
466
|
# @example Finds a document on its name
|
@@ -432,6 +472,17 @@ module MoveToGo
|
|
432
472
|
return result
|
433
473
|
end
|
434
474
|
|
475
|
+
# Finds a document based on one of its property.
|
476
|
+
# Returns all found matching document
|
477
|
+
# @example Finds a document on its name
|
478
|
+
# rm.find_document(:file) {|document| document.name == "Important Tender" }
|
479
|
+
def select_documents(type, report_result=!!configuration[:report_result], &block)
|
480
|
+
result = select(@documents.files, &block) if type == :file
|
481
|
+
result = select(@documents.links, &block) if type == :link
|
482
|
+
report_failed_to_find_object("document") if result.nil? and report_result
|
483
|
+
return result
|
484
|
+
end
|
485
|
+
|
435
486
|
# Returns a string describing problems with the data. For
|
436
487
|
# instance if integration_id for any entity is not unique.
|
437
488
|
def sanity_check
|
@@ -624,6 +675,14 @@ module MoveToGo
|
|
624
675
|
" Documents: #{nbr_of_documents}"
|
625
676
|
end
|
626
677
|
|
678
|
+
# Maps organization duplicates from the rootmodel, only returned
|
679
|
+
def map_organization_duplicates!(fields_to_check=[:name], &block)
|
680
|
+
dc = MoveToGo::DuplicateChecker.new(fields_to_check, self)
|
681
|
+
dc.map_organization_duplicates! do |duplicate_set|
|
682
|
+
yield duplicate_set
|
683
|
+
end
|
684
|
+
end
|
685
|
+
|
627
686
|
private
|
628
687
|
# returns all items from the object array with duplicate integration ids.
|
629
688
|
# To get all organizations with the same integration_id use
|
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'move-to-go'
|
3
|
+
|
4
|
+
describe MoveToGo::Organizations do
|
5
|
+
it "should find duplicates based on name of the organizations" do
|
6
|
+
# given
|
7
|
+
model = MoveToGo::RootModel.new
|
8
|
+
|
9
|
+
organization = MoveToGo::Organization.new
|
10
|
+
organization.name = "Lundalogik AB"
|
11
|
+
organization.integration_id = "1337"
|
12
|
+
model.add_organization(organization)
|
13
|
+
|
14
|
+
(1..3).each do |n|
|
15
|
+
organization = MoveToGo::Organization.new
|
16
|
+
organization.name = "Ankeborgs bibliotek"
|
17
|
+
organization.integration_id = n.to_s
|
18
|
+
model.add_organization(organization)
|
19
|
+
end
|
20
|
+
|
21
|
+
set_to_check = []
|
22
|
+
model.organizations
|
23
|
+
.find_duplicates_by(:name)
|
24
|
+
.each do |duplicate_set|
|
25
|
+
set_to_check = duplicate_set
|
26
|
+
end
|
27
|
+
# when, the
|
28
|
+
set_to_check.length.should eq 3
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should not find duplicates based on name and integration id of the organizations" do
|
32
|
+
# given
|
33
|
+
model = MoveToGo::RootModel.new
|
34
|
+
|
35
|
+
(1..3).each do |n|
|
36
|
+
organization = MoveToGo::Organization.new
|
37
|
+
organization.name = "Ankeborgs bibliotek"
|
38
|
+
organization.integration_id = n.to_s
|
39
|
+
model.add_organization(organization)
|
40
|
+
end
|
41
|
+
|
42
|
+
set_to_check = []
|
43
|
+
model.organizations
|
44
|
+
.find_duplicates_by(:name, :integration_id)
|
45
|
+
.each do |duplicate_set|
|
46
|
+
set_to_check = duplicate_set
|
47
|
+
end
|
48
|
+
# when, the
|
49
|
+
set_to_check.length.should eq 0
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should work with address" do
|
53
|
+
# given
|
54
|
+
model = MoveToGo::RootModel.new
|
55
|
+
|
56
|
+
(1..3).each do |n|
|
57
|
+
organization = MoveToGo::Organization.new
|
58
|
+
organization.name = "Ankeborgs bibliotek"
|
59
|
+
organization.integration_id = n.to_s
|
60
|
+
organization.with_postal_address do |address|
|
61
|
+
address.city = "Lund"
|
62
|
+
end
|
63
|
+
model.add_organization(organization)
|
64
|
+
end
|
65
|
+
|
66
|
+
set_to_check = []
|
67
|
+
model.organizations
|
68
|
+
.find_duplicates_by("name", "postal_address.city")
|
69
|
+
.map do |duplicate_set|
|
70
|
+
set_to_check = duplicate_set
|
71
|
+
end
|
72
|
+
# when, the
|
73
|
+
set_to_check.length.should eq 3
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should find duplicates based on name of the organizations" do
|
77
|
+
# given
|
78
|
+
model = MoveToGo::RootModel.new
|
79
|
+
|
80
|
+
organization = MoveToGo::Organization.new
|
81
|
+
organization.name = "Lundalogik AB"
|
82
|
+
organization.integration_id = "1337"
|
83
|
+
model.add_organization(organization)
|
84
|
+
|
85
|
+
(1..3).each do |n|
|
86
|
+
organization = MoveToGo::Organization.new
|
87
|
+
organization.name = "Ankeborgs bibliotek"
|
88
|
+
organization.integration_id = n.to_s
|
89
|
+
model.add_organization(organization)
|
90
|
+
end
|
91
|
+
|
92
|
+
set_to_check = []
|
93
|
+
model.organizations
|
94
|
+
.find_duplicates_by(:name)
|
95
|
+
.map do |duplicate_set|
|
96
|
+
set_to_check = duplicate_set
|
97
|
+
end
|
98
|
+
# when, the
|
99
|
+
set_to_check.length.should eq 3
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should work with a single organization in rootmodel" do
|
103
|
+
# given
|
104
|
+
model = MoveToGo::RootModel.new
|
105
|
+
|
106
|
+
organization = MoveToGo::Organization.new
|
107
|
+
organization.name = "Lundalogik AB"
|
108
|
+
organization.integration_id = "1337"
|
109
|
+
model.add_organization(organization)
|
110
|
+
|
111
|
+
set_to_check = []
|
112
|
+
model.organizations
|
113
|
+
.find_duplicates_by(:name)
|
114
|
+
.map do |duplicate_set|
|
115
|
+
set_to_check = duplicate_set
|
116
|
+
end
|
117
|
+
# when, the
|
118
|
+
set_to_check.length.should eq 0
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should be able to merge duplicates" do
|
122
|
+
# given
|
123
|
+
model = MoveToGo::RootModel.new
|
124
|
+
|
125
|
+
(1..3).each do |n|
|
126
|
+
organization = MoveToGo::Organization.new
|
127
|
+
organization.name = "Ankeborgs bibliotek"
|
128
|
+
organization.integration_id = n.to_s
|
129
|
+
model.add_organization(organization)
|
130
|
+
|
131
|
+
person = MoveToGo::Person.new
|
132
|
+
person.first_name = "Kalle"
|
133
|
+
organization.add_employee(person)
|
134
|
+
|
135
|
+
deal = MoveToGo::Deal.new
|
136
|
+
deal.name = "Big deal"
|
137
|
+
deal.integration_id = n.to_s
|
138
|
+
deal.customer = organization
|
139
|
+
model.add_deal(deal)
|
140
|
+
|
141
|
+
note = MoveToGo::History.new
|
142
|
+
note.text = "Hello"
|
143
|
+
note.organization = organization
|
144
|
+
model.add_history(note)
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
model.organizations
|
149
|
+
.find_duplicates_by(:name)
|
150
|
+
.map_duplicates{ |duplicate_set|
|
151
|
+
duplicate_set.merge_all!
|
152
|
+
}
|
153
|
+
.each{ |duplicate_org|
|
154
|
+
model.remove_organization(duplicate_org)
|
155
|
+
}
|
156
|
+
|
157
|
+
# when, the
|
158
|
+
model.organizations.values.length.should eq 1
|
159
|
+
model.organizations.values.first.employees.length.should eq 3
|
160
|
+
model.organizations.values.first.deals.length.should eq 3
|
161
|
+
model.organizations.values.first.histories.length.should eq 3
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should be able to merge fields of an organizations to empty fields on another organization" do
|
165
|
+
# given
|
166
|
+
model = MoveToGo::RootModel.new
|
167
|
+
|
168
|
+
model.settings.with_organization do |setting|
|
169
|
+
setting.set_custom_field({:integration_id=>"link_to_bi_system", :title=>"Link to BI system"})
|
170
|
+
end
|
171
|
+
|
172
|
+
org1 = MoveToGo::Organization.new
|
173
|
+
org1.name = "Lundalogik AB"
|
174
|
+
org1.integration_id = "1337"
|
175
|
+
org1.email = "info@lundalogik.se"
|
176
|
+
model.add_organization(org1)
|
177
|
+
|
178
|
+
org2 = MoveToGo::Organization.new
|
179
|
+
org2.name = "Lundalogik AB"
|
180
|
+
org2.organization_number = "123"
|
181
|
+
org2.integration_id = "123"
|
182
|
+
org2.email = "inbox@lundalogik.com"
|
183
|
+
org2.with_postal_address do |address|
|
184
|
+
address.city = "Lund"
|
185
|
+
address.street = "Sankt Lars"
|
186
|
+
end
|
187
|
+
org2.set_custom_value("link_to_bi_system", "https")
|
188
|
+
|
189
|
+
model.add_organization(org2)
|
190
|
+
|
191
|
+
model.organizations
|
192
|
+
.find_duplicates_by(:name)
|
193
|
+
.map_duplicates do |duplicate_set|
|
194
|
+
master_org = duplicate_set.find {|org| org.integration_id == "1337"}
|
195
|
+
org_to_be_merged = duplicate_set.find {|org| org.integration_id == "123"}
|
196
|
+
master_org.move_data_from(org_to_be_merged)
|
197
|
+
end
|
198
|
+
|
199
|
+
org = model.find_organization_by_integration_id("1337")
|
200
|
+
# when, the
|
201
|
+
org.organization_number.should eq "123"
|
202
|
+
org.email.should eq "info@lundalogik.se"
|
203
|
+
org.postal_address.city.should eq "Lund"
|
204
|
+
org.postal_address.street.should eq "Sankt Lars"
|
205
|
+
org.custom_values.first.value.should eq "https"
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
data/spec/rootmodel_spec.rb
CHANGED
@@ -994,4 +994,97 @@ describe "RootModel" do
|
|
994
994
|
# then
|
995
995
|
result.should eq []
|
996
996
|
end
|
997
|
+
|
998
|
+
it "should delete an organization and its linked objects" do
|
999
|
+
# given
|
1000
|
+
org = MoveToGo::Organization.new
|
1001
|
+
org.name = "Lundalogik"
|
1002
|
+
org.integration_id = "1"
|
1003
|
+
person = MoveToGo::Person.new
|
1004
|
+
person.first_name = "Kalle"
|
1005
|
+
person.email = "kalle@kula.se"
|
1006
|
+
person.position = "Chief"
|
1007
|
+
org.add_employee(person)
|
1008
|
+
rootmodel.add_organization(org)
|
1009
|
+
|
1010
|
+
|
1011
|
+
deal = MoveToGo::Deal.new
|
1012
|
+
deal.name = "Bigger Deal"
|
1013
|
+
deal.value = 1234
|
1014
|
+
deal.integration_id = "2"
|
1015
|
+
deal.customer = org
|
1016
|
+
rootmodel.add_deal deal
|
1017
|
+
|
1018
|
+
|
1019
|
+
note = MoveToGo::History.new
|
1020
|
+
note.text = "Hello"
|
1021
|
+
note.organization = org
|
1022
|
+
note.deal = deal
|
1023
|
+
rootmodel.add_history(note)
|
1024
|
+
|
1025
|
+
rootmodel.remove_organization(org)
|
1026
|
+
|
1027
|
+
# when
|
1028
|
+
result = rootmodel.organizations.length + rootmodel.deals.length + rootmodel.histories.length
|
1029
|
+
|
1030
|
+
# then
|
1031
|
+
result.should eq 0
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
it "should only delete what it needs to delete when deleting an organization and its linked objects" do
|
1035
|
+
# given
|
1036
|
+
org = MoveToGo::Organization.new
|
1037
|
+
org.name = "Lundalogik"
|
1038
|
+
org.integration_id = "1"
|
1039
|
+
person = MoveToGo::Person.new
|
1040
|
+
person.first_name = "Kalle"
|
1041
|
+
person.email = "kalle@kula.se"
|
1042
|
+
person.position = "Chief"
|
1043
|
+
org.add_employee(person)
|
1044
|
+
rootmodel.add_organization(org)
|
1045
|
+
|
1046
|
+
deal = MoveToGo::Deal.new
|
1047
|
+
deal.name = "Bigger Deal"
|
1048
|
+
deal.value = 1234
|
1049
|
+
deal.integration_id = "1"
|
1050
|
+
deal.customer = org
|
1051
|
+
rootmodel.add_deal deal
|
1052
|
+
|
1053
|
+
note = MoveToGo::History.new
|
1054
|
+
note.text = "Hello"
|
1055
|
+
note.organization = org
|
1056
|
+
note.deal = deal
|
1057
|
+
rootmodel.add_history(note)
|
1058
|
+
|
1059
|
+
org = MoveToGo::Organization.new
|
1060
|
+
org.name = "Lundalogik Stockholm"
|
1061
|
+
org.integration_id = "2"
|
1062
|
+
person = MoveToGo::Person.new
|
1063
|
+
person.first_name = "Kalle"
|
1064
|
+
person.email = "kalle@kula.se"
|
1065
|
+
person.position = "Chief"
|
1066
|
+
org.add_employee(person)
|
1067
|
+
rootmodel.add_organization(org)
|
1068
|
+
|
1069
|
+
deal = MoveToGo::Deal.new
|
1070
|
+
deal.name = "Bigger Deal"
|
1071
|
+
deal.value = 1234
|
1072
|
+
deal.integration_id = "2"
|
1073
|
+
deal.customer = org
|
1074
|
+
rootmodel.add_deal deal
|
1075
|
+
|
1076
|
+
note = MoveToGo::History.new
|
1077
|
+
note.text = "Hello"
|
1078
|
+
note.organization = org
|
1079
|
+
note.deal = deal
|
1080
|
+
rootmodel.add_history(note)
|
1081
|
+
|
1082
|
+
rootmodel.remove_organization(org)
|
1083
|
+
|
1084
|
+
# when
|
1085
|
+
result = rootmodel.organizations.length + rootmodel.deals.length + rootmodel.histories.length
|
1086
|
+
|
1087
|
+
# then
|
1088
|
+
result.should eq 3
|
1089
|
+
end
|
997
1090
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: move-to-go
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Petter Sandholdt
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date:
|
16
|
+
date: 2017-01-03 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: iso_country_codes
|
@@ -205,6 +205,7 @@ files:
|
|
205
205
|
- lib/move-to-go/model/history_classification.rb
|
206
206
|
- lib/move-to-go/model/link.rb
|
207
207
|
- lib/move-to-go/model/organization.rb
|
208
|
+
- lib/move-to-go/model/organizations.rb
|
208
209
|
- lib/move-to-go/model/person.rb
|
209
210
|
- lib/move-to-go/model/referencetosource.rb
|
210
211
|
- lib/move-to-go/model/relation.rb
|
@@ -311,6 +312,7 @@ files:
|
|
311
312
|
- spec/history_spec.rb
|
312
313
|
- spec/link_spec.rb
|
313
314
|
- spec/organization_spec.rb
|
315
|
+
- spec/organizations_spec.rb
|
314
316
|
- spec/person_spec.rb
|
315
317
|
- spec/rootmodel_spec.rb
|
316
318
|
- spec/spec_helper.rb
|
@@ -356,6 +358,7 @@ test_files:
|
|
356
358
|
- spec/helpers/xsd_validate_spec.rb
|
357
359
|
- spec/history_spec.rb
|
358
360
|
- spec/link_spec.rb
|
361
|
+
- spec/organizations_spec.rb
|
359
362
|
- spec/organization_spec.rb
|
360
363
|
- spec/person_spec.rb
|
361
364
|
- spec/rootmodel_spec.rb
|