netsuite_rails 0.3.4 → 0.3.5
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/lib/netsuite_rails/record_sync/push_manager.rb +1 -1
- data/lib/netsuite_rails/record_sync.rb +2 -2
- data/lib/netsuite_rails/routines/company_contact_match.rb +41 -29
- data/lib/netsuite_rails/transformations.rb +5 -0
- data/netsuite_rails.gemspec +1 -1
- data/spec/models/record_sync_spec.rb +21 -1
- data/spec/models/routines_spec.rb +23 -0
- data/spec/models/transformations_spec.rb +6 -0
- data/spec/support/example_models.rb +5 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4bc78784fc838d1ba5ca38b3d83ce0f0007bde4
|
4
|
+
data.tar.gz: dbdf80d06619156e86871566b1b4e7e728d8571b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b246f111c66ac0c86d53c4b7164ace112a2fc22fe15ba664efd13063d59d149ba01824e484664995c28431e14fc0133c451b3389550fe0a9a7c1541cf962b08e
|
7
|
+
data.tar.gz: 60923ddc839b756f3a563e00e65138d5b4bd9003b200edc30111289f8ed75150b5164bdc9bbc00e5c6897c09195d19257ff5a521f52e4317ecb5c39b9a5bbc3f
|
@@ -252,7 +252,7 @@ module NetSuiteRails
|
|
252
252
|
end
|
253
253
|
|
254
254
|
def is_active_record_model?(local_record)
|
255
|
-
local_record.class.ancestors.include?(ActiveRecord::Base)
|
255
|
+
defined?(::ActiveRecord::Base) && local_record.class.ancestors.include?(ActiveRecord::Base)
|
256
256
|
end
|
257
257
|
|
258
258
|
end
|
@@ -200,7 +200,7 @@ module NetSuiteRails
|
|
200
200
|
netsuite_record.send(netsuite_field)
|
201
201
|
end
|
202
202
|
|
203
|
-
if field_value.
|
203
|
+
if field_value.nil?
|
204
204
|
# TODO possibly nil out the local value?
|
205
205
|
next
|
206
206
|
end
|
@@ -218,7 +218,7 @@ module NetSuiteRails
|
|
218
218
|
|
219
219
|
# TODO should we just check for nil? vs present?
|
220
220
|
|
221
|
-
if field_hints.has_key?(local_field) && field_value.
|
221
|
+
if field_hints.has_key?(local_field) && !field_value.nil?
|
222
222
|
field_value = NetSuiteRails::Transformations.transform(field_hints[local_field], field_value, :pull)
|
223
223
|
end
|
224
224
|
|
@@ -3,8 +3,7 @@ module NetSuiteRails
|
|
3
3
|
module CompanyContactMatch
|
4
4
|
extend self
|
5
5
|
|
6
|
-
def match(company_customer, contact_data)
|
7
|
-
# TODO set page size to a large number for this search
|
6
|
+
def match(company_customer, contact_data, update_contact_name: false, update_contact_email: false)
|
8
7
|
search = NetSuite::Records::Contact.search({
|
9
8
|
customerJoin: [
|
10
9
|
{
|
@@ -14,13 +13,17 @@ module NetSuiteRails
|
|
14
13
|
NetSuite::Records::Customer.new(internal_id: company_customer.internal_id)
|
15
14
|
]
|
16
15
|
}
|
17
|
-
]
|
16
|
+
],
|
17
|
+
|
18
|
+
preferences: {
|
19
|
+
page_size: 1_000
|
20
|
+
}
|
18
21
|
})
|
19
22
|
|
20
23
|
match_data = {
|
21
|
-
email: contact_data[:email].dup,
|
22
|
-
first_name: contact_data[:first_name].dup,
|
23
|
-
last_name: contact_data[:last_name].dup
|
24
|
+
email: (contact_data[:email] || '').dup,
|
25
|
+
first_name: (contact_data[:first_name] || '').dup,
|
26
|
+
last_name: (contact_data[:last_name] || '').dup
|
24
27
|
}
|
25
28
|
|
26
29
|
match_data.
|
@@ -38,6 +41,13 @@ module NetSuiteRails
|
|
38
41
|
# if no email match & name data is present try fuzzy matching
|
39
42
|
if match_data[:first_name] && match_data[:last_name] && !contact_first_name.empty? && !contact_last_name.empty?
|
40
43
|
|
44
|
+
# TODO add logging for these interactions with NetSuite
|
45
|
+
if update_contact_email && order_payload[:email].present? && contact.email != order_payload[:email]
|
46
|
+
if !result.update(email: order_payload[:email])
|
47
|
+
raise "error updating email on contact"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
41
51
|
# TODO consider `self.fuzzy_name_matches?(contact_first_name, contact_last_name, match_data[:first_name], match_data[:last_name])`
|
42
52
|
if contact_first_name == match_data[:first_name] && contact_last_name == match_data[:last_name]
|
43
53
|
return contact
|
@@ -46,29 +56,31 @@ module NetSuiteRails
|
|
46
56
|
end
|
47
57
|
|
48
58
|
# try email match second
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
59
|
+
search.results.each do |contact|
|
60
|
+
contact_first_name = contact.first_name.downcase.strip rescue ''
|
61
|
+
contact_last_name = contact.last_name.downcase.strip rescue ''
|
62
|
+
|
63
|
+
# match on email
|
64
|
+
if match_data[:email] && contact.email && contact.email.downcase.strip == match_data[:email]
|
65
|
+
if match_data[:first_name] != contact_first_name || match_data[:last_name] != contact_last_name
|
66
|
+
# first name and/or last name did not match the input, update contact information
|
67
|
+
|
68
|
+
if update_contact_name
|
69
|
+
result = contact.update(
|
70
|
+
# use the first & last name from the payload; the match_data versions have been transformed
|
71
|
+
first_name: order_payload[:shipping_address][:firstname],
|
72
|
+
last_name: order_payload[:shipping_address][:lastname]
|
73
|
+
)
|
74
|
+
|
75
|
+
unless result
|
76
|
+
raise 'error updating name on contact placing order'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
return contact
|
82
|
+
end
|
83
|
+
end
|
72
84
|
|
73
85
|
nil
|
74
86
|
end
|
@@ -30,6 +30,11 @@ module NetSuiteRails
|
|
30
30
|
# eliminate the extension if the number is still too long
|
31
31
|
formatted_phone.gsub!(/x.*$/, '') if formatted_phone.size > 22
|
32
32
|
|
33
|
+
# phone numbers less than 7 digits throw a fatal error
|
34
|
+
if formatted_phone.size < 7
|
35
|
+
return nil
|
36
|
+
end
|
37
|
+
|
33
38
|
formatted_phone
|
34
39
|
else
|
35
40
|
phone
|
data/netsuite_rails.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "netsuite_rails"
|
7
|
-
s.version = "0.3.
|
7
|
+
s.version = "0.3.5"
|
8
8
|
s.authors = ["Michael Bianco"]
|
9
9
|
s.email = ["mike@cliffsidemedia.com"]
|
10
10
|
s.summary = %q{Write Rails applications that integrate with NetSuite}
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe NetSuiteRails::RecordSync do
|
4
4
|
include ExampleModels
|
5
|
-
|
5
|
+
|
6
6
|
context 'custom records' do
|
7
7
|
it "should properly pull the NS rep" do
|
8
8
|
allow(NetSuite::Records::CustomRecord).to receive(:get).with(hash_including(:internal_id => 234, type_id: 123))
|
@@ -13,4 +13,24 @@ describe NetSuiteRails::RecordSync do
|
|
13
13
|
expect(NetSuite::Records::CustomRecord).to have_received(:get)
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
it 'properly extracts common record types' do
|
18
|
+
fake_customer_data = {
|
19
|
+
:is_inactive => false,
|
20
|
+
:phone => "123 456 7891",
|
21
|
+
:company_name => "Great Company",
|
22
|
+
:email => nil
|
23
|
+
}
|
24
|
+
|
25
|
+
expect(NetSuite::Records::Customer).to receive(:get)
|
26
|
+
.and_return(NetSuite::Records::Customer.new(fake_customer_data))
|
27
|
+
|
28
|
+
standard_record = StandardRecord.new netsuite_id: 123
|
29
|
+
standard_record.netsuite_pull
|
30
|
+
|
31
|
+
expect(standard_record.is_deleted).to eq(false)
|
32
|
+
expect(standard_record.phone).to eq(fake_customer_data[:phone])
|
33
|
+
expect(standard_record.company).to eq(fake_customer_data[:company_name])
|
34
|
+
expect(standard_record.email).to eq(fake_customer_data[:email])
|
35
|
+
end
|
16
36
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# TODO https://github.com/NetSweet/netsuite_rails/issues/16
|
4
|
+
# there are still some unresolved issues with NS datetime/date conversions
|
5
|
+
# the tests + implementation may still not be correct.
|
6
|
+
|
7
|
+
describe NetSuiteRails::Routines do
|
8
|
+
describe '#company_contact_match' do
|
9
|
+
it "matches on first and last name first" do
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
it "matches on email if no name match is found" do
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns nil if no match is found" do
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
# TODO also handle updating contact information
|
22
|
+
end
|
23
|
+
end
|
@@ -13,6 +13,12 @@ describe NetSuiteRails::Transformations do
|
|
13
13
|
NetSuiteRails::Configuration.netsuite_instance_time_zone_offset -6
|
14
14
|
end
|
15
15
|
|
16
|
+
it 'nils out short phone numbers' do
|
17
|
+
short_phone_number = ' 301908 '
|
18
|
+
|
19
|
+
expect(NetSuiteRails::Transformations.phone(short_phone_number)).to be_nil
|
20
|
+
end
|
21
|
+
|
16
22
|
it 'handles very long phone numbers' do
|
17
23
|
long_phone_number = '+1 (549)-880-4834 ext. 51077'
|
18
24
|
|
@@ -4,18 +4,20 @@ module ExampleModels
|
|
4
4
|
example_group.class_eval do
|
5
5
|
before do
|
6
6
|
|
7
|
-
define_model :standard_record, phone: :string, netsuite_id: :integer do
|
7
|
+
define_model :standard_record, email: :string, company: :string, phone: :string, netsuite_id: :integer, is_deleted: :boolean do
|
8
8
|
include NetSuiteRails::RecordSync
|
9
9
|
|
10
10
|
netsuite_record_class NetSuite::Records::Customer
|
11
11
|
netsuite_sync :read_write
|
12
12
|
netsuite_field_map({
|
13
|
+
:is_deleted => :is_inactive,
|
13
14
|
:phone => :phone,
|
14
15
|
:company => Proc.new do |local, netsuite, direction|
|
16
|
+
# NOTE this could be done by a simple mapping!
|
15
17
|
if direction == :push
|
16
|
-
|
18
|
+
netsuite.company_name = local.company
|
17
19
|
else
|
18
|
-
|
20
|
+
local.company = netsuite.company_name
|
19
21
|
end
|
20
22
|
end
|
21
23
|
})
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netsuite_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Bianco
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: netsuite
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- spec/models/poll_trigger_spec.rb
|
123
123
|
- spec/models/record_sync/push_manager_spec.rb
|
124
124
|
- spec/models/record_sync_spec.rb
|
125
|
+
- spec/models/routines_spec.rb
|
125
126
|
- spec/models/spec_helper_spec.rb
|
126
127
|
- spec/models/sync_trigger_spec.rb
|
127
128
|
- spec/models/transformations_spec.rb
|
@@ -162,6 +163,7 @@ test_files:
|
|
162
163
|
- spec/models/poll_trigger_spec.rb
|
163
164
|
- spec/models/record_sync/push_manager_spec.rb
|
164
165
|
- spec/models/record_sync_spec.rb
|
166
|
+
- spec/models/routines_spec.rb
|
165
167
|
- spec/models/spec_helper_spec.rb
|
166
168
|
- spec/models/sync_trigger_spec.rb
|
167
169
|
- spec/models/transformations_spec.rb
|