netsuite 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/netsuite.rb +1 -1
- data/lib/netsuite/actions/search.rb +3 -7
- data/lib/netsuite/records/custom_field_list.rb +14 -12
- data/lib/netsuite/records/employee.rb +4 -0
- data/lib/netsuite/records/invoice.rb +1 -1
- data/lib/netsuite/records/location.rb +1 -0
- data/lib/netsuite/support/search_result.rb +3 -4
- data/lib/netsuite/version.rb +1 -1
- data/spec/netsuite/records/custom_field_list_spec.rb +68 -22
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YjY3MzQ4ZTcwOTU2YjM1YzE1YmFkMWVjMGI3YmE0NWMzNWFmYzE2Zg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzgzZTEyNjNhYTVmNjMwZjIyNDc2YmU2ZjhjZTRlNGVmYzk4NmI1Mw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Mzc1ZDMwMzFjMzhkNzQxMmIyZmYzNmY5ZGQzN2I5NWM2MmU0YTBmYTcwZTM4
|
10
|
+
Y2Q3OGExNTlmMDYyNTNmZWI0YThkMzk2YzZlNjk2ZDA1ODk4ZjNmNTFiZDlm
|
11
|
+
MmY5ODY5MGVhOTAzZDAxZTcxODczNzc1NmVhYmFiYWM3ZTFhYTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODUzZjFhMGVjMGY2MjhmYzdiMTU5NGZmYmRhYzhkOWEwZDhjMWU3NTVmZGJh
|
14
|
+
OTU1YjlhMTg4YzQ3ZGMyNWQzOTFmYWFjZDMwZjYzZDcxMWYyMGVjNzY1OTU5
|
15
|
+
NmEwNjk0NjgyOTg1ZDJlNDk1ZDc1ZGViYTM1YTc3OTEzZjFlZjc=
|
data/lib/netsuite.rb
CHANGED
@@ -194,7 +194,7 @@ module NetSuite
|
|
194
194
|
def self.configure_from_env(&block)
|
195
195
|
NetSuite.configure do
|
196
196
|
reset!
|
197
|
-
|
197
|
+
|
198
198
|
email ENV['NETSUITE_EMAIL'] unless ENV['NETSUITE_EMAIL'].nil?
|
199
199
|
password ENV['NETSUITE_PASSWORD'] unless ENV['NETSUITE_PASSWORD'].nil?
|
200
200
|
account ENV['NETSUITE_ACCOUNT'] unless ENV['NETSUITE_ACCOUNT'].nil?
|
@@ -223,14 +223,10 @@ module NetSuite
|
|
223
223
|
@success ||= search_result[:status][:@is_success] == 'true'
|
224
224
|
end
|
225
225
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
error_obj = [error_obj] if error_obj.class == Hash
|
230
|
-
error_obj.map do |error|
|
231
|
-
NetSuite::Error.new(error)
|
226
|
+
protected
|
227
|
+
def method_name
|
228
|
+
|
232
229
|
end
|
233
|
-
end
|
234
230
|
|
235
231
|
module Support
|
236
232
|
def self.included(base)
|
@@ -10,13 +10,11 @@ module NetSuite
|
|
10
10
|
when Array
|
11
11
|
attributes[:custom_field].each { |custom_field| extract_custom_field(custom_field) }
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
@custom_fields_assoc = Hash.new
|
15
15
|
custom_fields.each do |custom_field|
|
16
|
-
reference_id = custom_field.script_id || custom_field.internal_id
|
17
|
-
|
18
16
|
# not all custom fields have an id; https://github.com/NetSweet/netsuite/issues/182
|
19
|
-
if reference_id
|
17
|
+
if reference_id = custom_field.send(reference_id_type)
|
20
18
|
@custom_fields_assoc[reference_id.to_sym] = custom_field
|
21
19
|
end
|
22
20
|
end
|
@@ -27,7 +25,7 @@ module NetSuite
|
|
27
25
|
end
|
28
26
|
|
29
27
|
def delete_custom_field(field)
|
30
|
-
custom_fields.delete_if { |c| c.
|
28
|
+
custom_fields.delete_if { |c| c.send(reference_id_type).to_sym == field }
|
31
29
|
@custom_fields_assoc.delete(field)
|
32
30
|
end
|
33
31
|
|
@@ -38,7 +36,7 @@ module NetSuite
|
|
38
36
|
def custom_fields_by_type(type)
|
39
37
|
custom_fields.select { |field| field.type == "platformCore:#{type}" }
|
40
38
|
end
|
41
|
-
|
39
|
+
|
42
40
|
def method_missing(sym, *args, &block)
|
43
41
|
# read custom field if already set
|
44
42
|
if @custom_fields_assoc.include?(sym)
|
@@ -93,6 +91,10 @@ module NetSuite
|
|
93
91
|
end
|
94
92
|
|
95
93
|
private
|
94
|
+
def reference_id_type
|
95
|
+
@reference_id_type ||= Configuration.api_version >= '2013_2' ? :script_id : :internal_id
|
96
|
+
end
|
97
|
+
|
96
98
|
def extract_custom_field(custom_field_data)
|
97
99
|
# TODO this seems brittle, but might sufficient, watch out for this if something breaks
|
98
100
|
if custom_field_data[:"@xsi:type"] == "platformCore:SelectCustomFieldRef"
|
@@ -102,7 +104,7 @@ module NetSuite
|
|
102
104
|
custom_fields << CustomField.new(custom_field_data)
|
103
105
|
end
|
104
106
|
|
105
|
-
def create_custom_field(
|
107
|
+
def create_custom_field(reference_id, field_value)
|
106
108
|
# all custom fields need types; infer type based on class sniffing
|
107
109
|
field_type = case
|
108
110
|
when field_value.is_a?(Array)
|
@@ -123,7 +125,7 @@ module NetSuite
|
|
123
125
|
# TODO seems like DateTime doesn't need the iso8601 call
|
124
126
|
# not sure if this is specific to my env though
|
125
127
|
|
126
|
-
custom_field_value = case
|
128
|
+
custom_field_value = case
|
127
129
|
when field_value.is_a?(Hash)
|
128
130
|
CustomRecordRef.new(field_value)
|
129
131
|
when field_value.is_a?(Date)
|
@@ -146,13 +148,13 @@ module NetSuite
|
|
146
148
|
end
|
147
149
|
|
148
150
|
custom_field = CustomField.new(
|
149
|
-
|
150
|
-
value
|
151
|
-
type
|
151
|
+
reference_id_type => reference_id,
|
152
|
+
:value => custom_field_value,
|
153
|
+
:type => "#{record_namespace}:#{field_type}"
|
152
154
|
)
|
153
155
|
|
154
156
|
custom_fields << custom_field
|
155
|
-
@custom_fields_assoc[
|
157
|
+
@custom_fields_assoc[reference_id.to_sym] = custom_field
|
156
158
|
end
|
157
159
|
end
|
158
160
|
end
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::TranSales
|
9
9
|
|
10
|
-
actions :get, :get_list, :initialize, :add, :delete, :upsert, :search
|
10
|
+
actions :get, :get_list, :initialize, :add, :update, :delete, :upsert, :search
|
11
11
|
|
12
12
|
fields :balance, :bill_address,
|
13
13
|
:billing_schedule, :contrib_pct, :created_date, :currency_name, :custom_field_list,
|
@@ -20,7 +20,7 @@ module NetSuite
|
|
20
20
|
def initialize(response, result_class)
|
21
21
|
@result_class = result_class
|
22
22
|
@response = response
|
23
|
-
|
23
|
+
|
24
24
|
@total_records = response.body[:total_records].to_i
|
25
25
|
@total_pages = response.body[:total_pages].to_i
|
26
26
|
@current_page = response.body[:page_index].to_i
|
@@ -48,7 +48,7 @@ module NetSuite
|
|
48
48
|
next if search_group.to_s.start_with?('@')
|
49
49
|
|
50
50
|
record[search_group].each_pair do |k, v|
|
51
|
-
# all return values
|
51
|
+
# all return values are wrapped in a <SearchValue/>
|
52
52
|
# extract the value from <SearchValue/> to make results easier to work with
|
53
53
|
|
54
54
|
if v.is_a?(Hash) && v.has_key?(:search_value)
|
@@ -63,7 +63,6 @@ module NetSuite
|
|
63
63
|
end
|
64
64
|
|
65
65
|
result_wrapper = result_class.new(record.delete(:basic))
|
66
|
-
# TODO if custom record search the type id should be copied over
|
67
66
|
result_wrapper.search_joins = record
|
68
67
|
results << result_wrapper
|
69
68
|
end
|
@@ -98,4 +97,4 @@ module NetSuite
|
|
98
97
|
|
99
98
|
end
|
100
99
|
end
|
101
|
-
end
|
100
|
+
end
|
data/lib/netsuite/version.rb
CHANGED
@@ -7,31 +7,77 @@ describe NetSuite::Records::CustomFieldList do
|
|
7
7
|
expect(list.custom_fields).to be_kind_of(Array)
|
8
8
|
end
|
9
9
|
|
10
|
-
context '
|
11
|
-
|
12
|
-
|
13
|
-
expect(list.custom_fields.size).to eq(1)
|
14
|
-
expect(list.custom_fields.first.value).to eq('a value')
|
15
|
-
expect(list.custom_fields.first.type).to eq('platformCore:StringCustomFieldRef')
|
16
|
-
end
|
10
|
+
context 'custom field internalId-to-scriptId transition at WSDL 2013_2:' do
|
11
|
+
before(:context) { @reset = NetSuite::Configuration.api_version }
|
12
|
+
after(:context) { NetSuite::Configuration.api_version = @reset }
|
17
13
|
|
18
|
-
|
19
|
-
list.custrecord_somefield = Date.parse("12/12/2012")
|
20
|
-
expect(list.custom_fields.first.value).to eq('2012-12-12T00:00:00+00:00')
|
21
|
-
end
|
14
|
+
transition_version = '2013_2'
|
22
15
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
['2012_2', '2013_2', '2014_2'].each do |version|
|
17
|
+
|
18
|
+
comparison = ['==', '>', '<'][version <=> transition_version]
|
19
|
+
|
20
|
+
context "when WSDL version #{comparison} #{transition_version}," do
|
21
|
+
before { NetSuite::Configuration.api_version = version }
|
22
|
+
|
23
|
+
context 'convenience methods' do
|
24
|
+
reference_id_type = version < transition_version ? :internal_id : :script_id
|
25
|
+
|
26
|
+
it "should create a custom field entry when none exists" do
|
27
|
+
list.some_custom_field = 'a value'
|
28
|
+
|
29
|
+
expect(list.custom_fields.size).to eq(1)
|
30
|
+
expect(list.custom_fields.first.value).to eq('a value')
|
31
|
+
expect(list.custom_fields.first.type).to eq('platformCore:StringCustomFieldRef')
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should set #{reference_id_type} to method name when creating a custom field" do
|
35
|
+
list.some_custom_field = 'a value'
|
36
|
+
|
37
|
+
expect(list.some_custom_field.send(reference_id_type)).to eq('some_custom_field')
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should update a custom field's value when one exists" do
|
41
|
+
list.existing_custom_field = 'old value'
|
42
|
+
list.existing_custom_field = 'new value'
|
43
|
+
|
44
|
+
expect(list.existing_custom_field.value).to eq('new value')
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should handle date custom field creation" do
|
48
|
+
list.some_custom_field = Date.parse("12/12/2012")
|
49
|
+
|
50
|
+
expect(list.custom_fields.first.value).to eq('2012-12-12T00:00:00+00:00')
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should handle datetime custom field creation" do
|
54
|
+
list.some_custom_field = DateTime.parse("12/12/2012 10:05am")
|
55
|
+
|
56
|
+
expect(list.custom_fields.first.value).to eq('2012-12-12T10:05:00+00:00')
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should convert a list of numbers into a list of custom field refs" do
|
60
|
+
list.some_custom_field = [1,2]
|
61
|
+
|
62
|
+
expect(list.custom_fields.first.type).to eq('platformCore:MultiSelectCustomFieldRef')
|
63
|
+
expect(list.custom_fields.first.value.map(&:to_record)).to eql([
|
64
|
+
NetSuite::Records::CustomRecordRef.new(:internal_id => 1),
|
65
|
+
NetSuite::Records::CustomRecordRef.new(:internal_id => 2)
|
66
|
+
].map(&:to_record))
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should return custom field record when entry exists" do
|
70
|
+
list.existing_custom_field = 'a value'
|
71
|
+
|
72
|
+
expect(list.existing_custom_field).to be_a(NetSuite::Records::CustomField)
|
73
|
+
expect(list.existing_custom_field.value).to eq('a value')
|
74
|
+
end
|
27
75
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
NetSuite::Records::CustomRecordRef.new(:internal_id => 2)
|
34
|
-
].map(&:to_record))
|
76
|
+
it "should raise an error if custom field entry does not exist" do
|
77
|
+
expect{ list.nonexisting_custom_field }.to raise_error
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
35
81
|
end
|
36
82
|
end
|
37
83
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netsuite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Moran
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-08-
|
12
|
+
date: 2015-08-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: savon
|