netsuite 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/README.md +2 -0
- data/lib/netsuite.rb +2 -0
- data/lib/netsuite/actions/add.rb +19 -1
- data/lib/netsuite/actions/search.rb +10 -6
- data/lib/netsuite/actions/update.rb +1 -15
- data/lib/netsuite/configuration.rb +16 -4
- data/lib/netsuite/errors.rb +10 -0
- data/lib/netsuite/records/customer_deposit.rb +34 -0
- data/lib/netsuite/records/customer_refund_deposit_list.rb +9 -8
- data/lib/netsuite/records/inventory_item.rb +18 -2
- data/lib/netsuite/records/invoice.rb +1 -1
- data/lib/netsuite/records/locations_list.rb +15 -0
- data/lib/netsuite/records/sales_order.rb +1 -0
- data/lib/netsuite/response.rb +5 -4
- data/lib/netsuite/support/actions.rb +2 -0
- data/lib/netsuite/support/requests.rb +5 -1
- data/lib/netsuite/support/search_result.rb +2 -0
- data/lib/netsuite/version.rb +1 -1
- data/spec/netsuite/actions/add_spec.rb +69 -14
- data/spec/netsuite/actions/search_spec.rb +28 -20
- data/spec/netsuite/records/customer_refund_deposit_list_spec.rb +5 -7
- data/spec/netsuite/records/invoice_spec.rb +1 -1
- data/spec/netsuite/records/sales_order_spec.rb +5 -0
- data/spec/support/fixtures/add/add_invoice_error.xml +19 -0
- data/spec/support/fixtures/add/add_invoice_multiple_errors.xml +24 -0
- metadata +17 -17
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ODNjODA3MjM1ZDkyNWJkYWZkZWQ3NWIxNTFiMDJjODYxNzY0MWJiYw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZmE3YTNhMjRhNTRiZmRiY2Q5MzJkMDJkYWNkNWI0MzY5MTcyY2QyZg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZjBlOGYzODFkNzg3NjQxZTdlYmExMmRmNmRkMzI5YzBkMDFiYjAzOWQ5ZWMw
|
10
|
+
YTIyNWRkYWQ5Y2MxNjNmNGNkYmJkZDM5ZDllMjc1YWJkZTk4MjM2MzZhMjU4
|
11
|
+
NmJhYjQyYmVmZmJjMjkzN2UwMzYwM2QzMTk1YjE1Nzk4NWNmODg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjZiZDAxYWY5ZWRkNjg4OTY0NWIxYzY1MjUxYzQwZjdjZDEzM2FmNjM3ZGYw
|
14
|
+
NmMxNzQxYzQ5OTcxYmNhNzgwNjJiMjQwNzc0ZGVhOTE0MzA3ODJiOTMxMzcz
|
15
|
+
ZTA4Mjk5MjU3MzdlMGViYjg4OTRiZWE5YWY4ZjY4YzJjOWZkMTU=
|
data/README.md
CHANGED
@@ -254,6 +254,8 @@ NetSuite::Configuration.connection.call :get_customization_id, message: {
|
|
254
254
|
'platformMsgs:includeInactives' => 'false'
|
255
255
|
}
|
256
256
|
|
257
|
+
server_time_response = NetSuite::Configuration.connection.call :get_server_time
|
258
|
+
server_time_response.body[:get_server_time_response][:get_server_time_result][:server_time]
|
257
259
|
```
|
258
260
|
|
259
261
|
|
data/lib/netsuite.rb
CHANGED
@@ -66,6 +66,7 @@ module NetSuite
|
|
66
66
|
autoload :Customer, 'netsuite/records/customer'
|
67
67
|
autoload :CustomerAddressbook, 'netsuite/records/customer_addressbook'
|
68
68
|
autoload :CustomerAddressbookList, 'netsuite/records/customer_addressbook_list'
|
69
|
+
autoload :CustomerDeposit, 'netsuite/records/customer_deposit'
|
69
70
|
autoload :CustomerPayment, 'netsuite/records/customer_payment'
|
70
71
|
autoload :CustomerPaymentApply, 'netsuite/records/customer_payment_apply'
|
71
72
|
autoload :CustomerPaymentApplyList, 'netsuite/records/customer_payment_apply_list'
|
@@ -91,6 +92,7 @@ module NetSuite
|
|
91
92
|
autoload :JournalEntryLineList, 'netsuite/records/journal_entry_line_list'
|
92
93
|
autoload :KitItem, 'netsuite/records/kit_item'
|
93
94
|
autoload :Location, 'netsuite/records/location'
|
95
|
+
autoload :LocationsList, 'netsuite/records/locations_list'
|
94
96
|
autoload :NonInventorySaleItem, 'netsuite/records/non_inventory_sale_item'
|
95
97
|
autoload :PaymentMethod, 'netsuite/records/payment_method'
|
96
98
|
autoload :PhoneCall, 'netsuite/records/phone_call'
|
data/lib/netsuite/actions/add.rb
CHANGED
@@ -3,6 +3,8 @@ module NetSuite
|
|
3
3
|
class Add
|
4
4
|
include Support::Requests
|
5
5
|
|
6
|
+
attr_reader :response_hash
|
7
|
+
|
6
8
|
def initialize(object = nil)
|
7
9
|
@object = object
|
8
10
|
end
|
@@ -37,7 +39,7 @@ module NetSuite
|
|
37
39
|
if @object.respond_to?(:external_id) && @object.external_id
|
38
40
|
hash['platformMsgs:record']['@platformMsgs:externalId'] = @object.external_id
|
39
41
|
end
|
40
|
-
|
42
|
+
|
41
43
|
hash
|
42
44
|
end
|
43
45
|
|
@@ -49,14 +51,30 @@ module NetSuite
|
|
49
51
|
@response_body ||= response_hash[:base_ref]
|
50
52
|
end
|
51
53
|
|
54
|
+
def response_errors
|
55
|
+
if response_hash[:status] && response_hash[:status][:status_detail]
|
56
|
+
@response_errors ||= errors
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
52
60
|
def response_hash
|
53
61
|
@response_hash ||= @response.to_hash[:add_response][:write_response]
|
54
62
|
end
|
55
63
|
|
64
|
+
def errors
|
65
|
+
error_obj = response_hash[:status][:status_detail]
|
66
|
+
error_obj = [error_obj] if error_obj.class == Hash
|
67
|
+
error_obj.map do |error|
|
68
|
+
NetSuite::Error.new(error)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
56
72
|
module Support
|
57
73
|
def add
|
58
74
|
response = NetSuite::Actions::Add.call(self)
|
59
75
|
|
76
|
+
@errors = response.errors
|
77
|
+
|
60
78
|
if response.success?
|
61
79
|
@internal_id = response.body[:@internal_id]
|
62
80
|
true
|
@@ -8,15 +8,21 @@ module NetSuite
|
|
8
8
|
@options = options
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
def class_name
|
12
|
+
@class_name ||= if @klass.respond_to? :search_class_name
|
13
|
+
@klass.search_class_name
|
14
|
+
else
|
15
|
+
@klass.to_s.split("::").last
|
16
|
+
end
|
17
|
+
end
|
12
18
|
|
19
|
+
private
|
13
20
|
def request
|
14
21
|
# https://system.netsuite.com/help/helpcenter/en_US/Output/Help/SuiteCloudCustomizationScriptingWebServices/SuiteTalkWebServices/SettingSearchPreferences.html
|
15
22
|
# https://webservices.netsuite.com/xsd/platform/v2012_2_0/messages.xsd
|
16
|
-
|
17
23
|
preferences = NetSuite::Configuration.auth_header
|
18
24
|
preferences = preferences.merge(
|
19
|
-
(@options
|
25
|
+
(@options.delete(:preferences) || {}).inject({'platformMsgs:SearchPreferences' => {}}) do |h, (k, v)|
|
20
26
|
h['platformMsgs:SearchPreferences'][k.to_s.lower_camelcase] = v
|
21
27
|
h
|
22
28
|
end
|
@@ -56,9 +62,7 @@ module NetSuite
|
|
56
62
|
# TODO find cleaner solution for pulling the namespace of the record, which is a instance method
|
57
63
|
example_instance = @klass.new
|
58
64
|
namespace = example_instance.record_namespace
|
59
|
-
|
60
65
|
# extract the class name
|
61
|
-
class_name = @klass.to_s.split("::").last
|
62
66
|
|
63
67
|
criteria_structure = {}
|
64
68
|
columns_structure = columns
|
@@ -237,4 +241,4 @@ module NetSuite
|
|
237
241
|
end
|
238
242
|
end
|
239
243
|
end
|
240
|
-
end
|
244
|
+
end
|
@@ -9,21 +9,7 @@ module NetSuite
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def request
|
12
|
-
|
13
|
-
|
14
|
-
NetSuite::Configuration.connection(
|
15
|
-
namespaces: {
|
16
|
-
'xmlns:platformMsgs' => "urn:messages_#{api_version}.platform.webservices.netsuite.com",
|
17
|
-
'xmlns:platformCore' => "urn:core_#{api_version}.platform.webservices.netsuite.com",
|
18
|
-
'xmlns:listRel' => "urn:relationships_#{api_version}.lists.webservices.netsuite.com",
|
19
|
-
'xmlns:tranSales' => "urn:sales_#{api_version}.transactions.webservices.netsuite.com",
|
20
|
-
'xmlns:platformCommon' => "urn:common_#{api_version}.platform.webservices.netsuite.com",
|
21
|
-
'xmlns:listAcct' => "urn:accounting_#{api_version}.lists.webservices.netsuite.com",
|
22
|
-
'xmlns:actSched' => "urn:scheduling_#{api_version}.activities.webservices.netsuite.com",
|
23
|
-
'xmlns:tranCust' => "urn:customers_#{api_version}.transactions.webservices.netsuite.com",
|
24
|
-
'xmlns:setupCustom' => "urn:customization_#{api_version}.setup.webservices.netsuite.com",
|
25
|
-
},
|
26
|
-
).call :update, :message => request_body
|
12
|
+
NetSuite::Configuration.connection.call :update, :message => request_body
|
27
13
|
end
|
28
14
|
|
29
15
|
# <platformMsgs:update>
|
@@ -17,8 +17,8 @@ module NetSuite
|
|
17
17
|
namespaces: namespaces,
|
18
18
|
soap_header: auth_header,
|
19
19
|
pretty_print_xml: true,
|
20
|
-
logger: logger
|
21
|
-
|
20
|
+
logger: logger,
|
21
|
+
log_level: log_level,
|
22
22
|
}.merge(params))
|
23
23
|
end
|
24
24
|
|
@@ -167,9 +167,21 @@ module NetSuite
|
|
167
167
|
attributes[:log]
|
168
168
|
end
|
169
169
|
|
170
|
-
def logger
|
171
|
-
attributes[:logger]
|
170
|
+
def logger(value = nil)
|
171
|
+
attributes[:logger] = if value.nil?
|
172
|
+
::Logger.new((log && !log.empty?) ? log : $stdout)
|
173
|
+
else
|
174
|
+
value
|
175
|
+
end
|
172
176
|
end
|
173
177
|
|
178
|
+
def log_level(value = nil)
|
179
|
+
self.log_level = value || :debug
|
180
|
+
attributes[:log_level]
|
181
|
+
end
|
182
|
+
|
183
|
+
def log_level=(value)
|
184
|
+
attributes[:log_level] ||= value
|
185
|
+
end
|
174
186
|
end
|
175
187
|
end
|
data/lib/netsuite/errors.rb
CHANGED
@@ -2,4 +2,14 @@ module NetSuite
|
|
2
2
|
class RecordNotFound < StandardError; end
|
3
3
|
class InitializationError < StandardError; end
|
4
4
|
class ConfigurationError < StandardError; end
|
5
|
+
|
6
|
+
class Error
|
7
|
+
attr_accessor :type, :code, :message
|
8
|
+
|
9
|
+
def initialize(args = {})
|
10
|
+
@type = args[:@type]
|
11
|
+
@code = args[:code]
|
12
|
+
@message = args[:message]
|
13
|
+
end
|
14
|
+
end
|
5
15
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
# Adding a Customer Deposit example. The customer associated with the sales
|
4
|
+
# order would be linked to the deposit.
|
5
|
+
#
|
6
|
+
# deposit = CustomerDeposit.new
|
7
|
+
# deposit.sales_order = RecordRef.new(internal_id: 7279)
|
8
|
+
# deposit.payment = 20
|
9
|
+
# deposit.add
|
10
|
+
#
|
11
|
+
class CustomerDeposit
|
12
|
+
include Support::Actions
|
13
|
+
include Support::RecordRefs
|
14
|
+
include Support::Fields
|
15
|
+
include Support::Records
|
16
|
+
include Namespaces::TranCust
|
17
|
+
|
18
|
+
actions :add, :get
|
19
|
+
|
20
|
+
fields :custom_form, :payment, :tran_date, :exchange_rate
|
21
|
+
|
22
|
+
record_refs :customer, :sales_order, :account
|
23
|
+
|
24
|
+
attr_reader :internal_id
|
25
|
+
attr_accessor :external_id
|
26
|
+
|
27
|
+
def initialize(attributes = {})
|
28
|
+
@internal_id = attributes.delete(:internal_id) || attributes.delete(:@internal_id)
|
29
|
+
@external_id = attributes.delete(:external_id) || attributes.delete(:@external_id)
|
30
|
+
initialize_from_attributes_hash(attributes)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,10 +1,14 @@
|
|
1
1
|
module NetSuite
|
2
2
|
module Records
|
3
3
|
class CustomerRefundDepositList
|
4
|
+
include Support::Fields
|
4
5
|
include Support::Records
|
5
6
|
include Namespaces::TranCust
|
6
|
-
|
7
|
+
|
8
|
+
fields :replace_all
|
9
|
+
|
7
10
|
def initialize(attributes = {})
|
11
|
+
initialize_from_attributes_hash(attributes)
|
8
12
|
case attributes[:customer_refund_deposit]
|
9
13
|
when Hash
|
10
14
|
deposits << CustomerRefundDeposit.new(attributes[:customer_refund_deposit])
|
@@ -12,17 +16,14 @@ module NetSuite
|
|
12
16
|
attributes[:customer_refund_deposit].each { |deposit| deposits << CustomerRefundDeposit.new(deposit) }
|
13
17
|
end
|
14
18
|
end
|
15
|
-
|
19
|
+
|
16
20
|
def deposits
|
17
21
|
@deposits ||= []
|
18
22
|
end
|
19
|
-
|
23
|
+
|
20
24
|
def to_record
|
21
|
-
deposits.map
|
22
|
-
{ "#{record_namespace}:customerRefundDeposit" => deposit.to_record }
|
23
|
-
end
|
25
|
+
super.merge({ "#{record_namespace}:customerRefundDeposit" => deposits.map(&:to_record) })
|
24
26
|
end
|
25
|
-
|
26
27
|
end
|
27
28
|
end
|
28
|
-
end
|
29
|
+
end
|
@@ -7,7 +7,20 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
|
10
|
+
# NOTE NetSuite doesn't have a InventoryItemSearch object. So we use
|
11
|
+
# the ItemSearch instead. In order to actually get Inventory Items only
|
12
|
+
# you will still have to specify the type:
|
13
|
+
#
|
14
|
+
# basic: [
|
15
|
+
# {
|
16
|
+
# field: 'type',
|
17
|
+
# operator: 'anyOf',
|
18
|
+
# type: 'SearchEnumMultiSelectField',
|
19
|
+
# value: ['_inventoryItem']
|
20
|
+
# }
|
21
|
+
# ]
|
22
|
+
#
|
23
|
+
actions :get, :add, :delete, :search, :update
|
11
24
|
|
12
25
|
fields :auto_lead_time, :auto_preferred_stock_level, :auto_reorder_point, :available_to_partners, :average_cost,
|
13
26
|
:copy_description, :cost, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :cost_units, :costing_method,
|
@@ -43,7 +56,7 @@ module NetSuite
|
|
43
56
|
field :pricing_matrix, PricingMatrix
|
44
57
|
field :custom_field_list, CustomFieldList
|
45
58
|
field :bin_number_list, BinNumberList
|
46
|
-
field :
|
59
|
+
field :locations_list, LocationsList
|
47
60
|
|
48
61
|
attr_reader :internal_id
|
49
62
|
attr_accessor :external_id
|
@@ -54,6 +67,9 @@ module NetSuite
|
|
54
67
|
initialize_from_attributes_hash(attributes)
|
55
68
|
end
|
56
69
|
|
70
|
+
def self.search_class_name
|
71
|
+
"Item"
|
72
|
+
end
|
57
73
|
end
|
58
74
|
end
|
59
75
|
end
|
@@ -20,7 +20,7 @@ module NetSuite
|
|
20
20
|
:item_cost_disc_rate, :item_cost_disc_tax_1_amt, :item_cost_disc_taxable, :item_cost_discount, :item_cost_list,
|
21
21
|
:item_cost_tax_code, :item_cost_tax_rate_1, :item_cost_tax_rate_2, :item_list, :job, :last_modified_date,
|
22
22
|
:lead_source, :linked_tracking_numbers, :memo, :message, :message_sel, :on_credit_hold, :opportunity,
|
23
|
-
:
|
23
|
+
:other_ref_num, :partners_list, :promo_code, :rev_rec_end_date,
|
24
24
|
:rev_rec_on_rev_commitment, :rev_rec_schedule, :rev_rec_start_date, :revenue_status, :sales_effective_date,
|
25
25
|
:sales_group, :sales_team_list, :ship_address, :ship_date, :ship_group_list,
|
26
26
|
:shipping_cost, :shipping_tax_1_rate, :shipping_tax_2_rate, :shipping_tax_code, :source, :start_date,
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class LocationsList
|
4
|
+
def initialize(attributes = {})
|
5
|
+
attributes[:locations].each do |location|
|
6
|
+
locations << location
|
7
|
+
end if attributes[:locations]
|
8
|
+
end
|
9
|
+
|
10
|
+
def locations
|
11
|
+
@locations ||= []
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -19,6 +19,7 @@ module NetSuite
|
|
19
19
|
:to_be_printed, :total_cost_estimate, :tran_date, :tran_id, :tran_is_vsoe_bundle, :vat_reg_num,
|
20
20
|
:vsoe_auto_calc
|
21
21
|
|
22
|
+
field :transaction_ship_address, ShipAddress
|
22
23
|
field :transaction_bill_address, BillAddress
|
23
24
|
field :item_list, SalesOrderItemList
|
24
25
|
field :custom_field_list, CustomFieldList
|
data/lib/netsuite/response.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module NetSuite
|
2
2
|
class Response
|
3
|
-
attr_accessor :header, :body
|
3
|
+
attr_accessor :header, :body, :errors
|
4
4
|
|
5
5
|
def initialize(attributes = {})
|
6
|
-
@success
|
7
|
-
@header
|
8
|
-
@body
|
6
|
+
@success = attributes[:success]
|
7
|
+
@header = attributes[:header]
|
8
|
+
@body = attributes[:body]
|
9
|
+
@errors = attributes[:errors]
|
9
10
|
end
|
10
11
|
|
11
12
|
def success!
|
@@ -26,7 +26,7 @@ module NetSuite
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def build_response
|
29
|
-
Response.new(:
|
29
|
+
Response.new(success: success?, header: response_header, body: response_body, errors: response_errors)
|
30
30
|
end
|
31
31
|
|
32
32
|
def success?
|
@@ -38,6 +38,10 @@ module NetSuite
|
|
38
38
|
nil
|
39
39
|
end
|
40
40
|
|
41
|
+
def response_errors
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
41
45
|
def response_body
|
42
46
|
raise NotImplementedError, 'Please implement a #response_body method'
|
43
47
|
end
|
data/lib/netsuite/version.rb
CHANGED
@@ -37,25 +37,80 @@ describe NetSuite::Actions::Add do
|
|
37
37
|
NetSuite::Records::Invoice.new(:source => 'Google', :total => 100.0)
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
:
|
44
|
-
|
40
|
+
context 'when successful' do
|
41
|
+
before do
|
42
|
+
savon.expects(:add).with(:message => {
|
43
|
+
'platformMsgs:record' => {
|
44
|
+
:content! => {
|
45
|
+
'tranSales:source' => 'Google'
|
46
|
+
},
|
47
|
+
'@xsi:type' => 'tranSales:Invoice'
|
45
48
|
},
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
+
}).returns(File.read('spec/support/fixtures/add/add_invoice.xml'))
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'makes a valid request to the NetSuite API' do
|
53
|
+
NetSuite::Actions::Add.call(invoice)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'returns a valid Response object' do
|
57
|
+
response = NetSuite::Actions::Add.call(invoice)
|
58
|
+
response.should be_kind_of(NetSuite::Response)
|
59
|
+
response.should be_success
|
60
|
+
end
|
49
61
|
end
|
50
62
|
|
51
|
-
|
52
|
-
|
63
|
+
context 'when not successful' do
|
64
|
+
before do
|
65
|
+
savon.expects(:add).with(:message => {
|
66
|
+
'platformMsgs:record' => {
|
67
|
+
:content! => {
|
68
|
+
'tranSales:source' => 'Google'
|
69
|
+
},
|
70
|
+
'@xsi:type' => 'tranSales:Invoice'
|
71
|
+
},
|
72
|
+
}).returns(File.read('spec/support/fixtures/add/add_invoice_error.xml'))
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'provides an error method on the object with details about the error' do
|
76
|
+
invoice.add
|
77
|
+
error = invoice.errors.first
|
78
|
+
|
79
|
+
error.should be_kind_of(NetSuite::Error)
|
80
|
+
error.type.should eq('ERROR')
|
81
|
+
error.code.should eq('INVALID_INITIALIZE_REF')
|
82
|
+
error.message.should eq('You can not initialize invoice: invalid reference 7281.')
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'provides an error method on the response' do
|
86
|
+
response = NetSuite::Actions::Add.call(invoice)
|
87
|
+
response.errors.first.should be_kind_of(NetSuite::Error)
|
88
|
+
end
|
53
89
|
end
|
54
90
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
91
|
+
context 'when not successful with multiple errors' do
|
92
|
+
before do
|
93
|
+
savon.expects(:add).with(:message => {
|
94
|
+
'platformMsgs:record' => {
|
95
|
+
:content! => {
|
96
|
+
'tranSales:source' => 'Google'
|
97
|
+
},
|
98
|
+
'@xsi:type' => 'tranSales:Invoice'
|
99
|
+
},
|
100
|
+
}).returns(File.read('spec/support/fixtures/add/add_invoice_multiple_errors.xml'))
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'provides an error method on the object with details about the error' do
|
104
|
+
invoice.add
|
105
|
+
invoice.errors.length.should eq(2)
|
106
|
+
|
107
|
+
error = invoice.errors.first
|
108
|
+
|
109
|
+
error.should be_kind_of(NetSuite::Error)
|
110
|
+
error.type.should eq('ERROR')
|
111
|
+
error.code.should eq('ERROR')
|
112
|
+
error.message.should eq('Some message')
|
113
|
+
end
|
59
114
|
end
|
60
115
|
end
|
61
116
|
|
@@ -4,8 +4,20 @@ describe NetSuite::Actions::Search do
|
|
4
4
|
before(:all) { savon.mock! }
|
5
5
|
after(:all) { savon.unmock! }
|
6
6
|
|
7
|
+
context "search class name" do
|
8
|
+
it "infers class name if class doesn't specify search class" do
|
9
|
+
instance = described_class.new NetSuite::Records::Customer
|
10
|
+
expect(instance.class_name).to eq "Customer"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "gets class name from search class specified" do
|
14
|
+
instance = described_class.new NetSuite::Records::InventoryItem
|
15
|
+
expect(instance.class_name).to eq NetSuite::Records::InventoryItem.search_class_name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
7
19
|
context "saved search" do
|
8
|
-
|
20
|
+
before do
|
9
21
|
savon.expects(:search).with(:message => {
|
10
22
|
'searchRecord' => {
|
11
23
|
'@xsi:type' => 'listRel:CustomerSearchAdvanced',
|
@@ -13,19 +25,25 @@ describe NetSuite::Actions::Search do
|
|
13
25
|
:content! => { "listRel:criteria" => {} }
|
14
26
|
},
|
15
27
|
}).returns(File.read('spec/support/fixtures/search/saved_search_customer.xml'))
|
28
|
+
end
|
16
29
|
|
30
|
+
it "should handle a ID only search" do
|
17
31
|
result = NetSuite::Records::Customer.search(saved: 500)
|
18
32
|
result.results.size.should == 1
|
19
33
|
result.results.first.email.should == 'aemail@gmail.com'
|
20
34
|
end
|
21
35
|
|
22
|
-
it "
|
23
|
-
|
36
|
+
it "merges preferences gracefully" do
|
37
|
+
expect {
|
38
|
+
NetSuite::Records::Customer.search(
|
39
|
+
saved: 500,
|
40
|
+
preferences: { page_size: 20 }
|
41
|
+
)
|
42
|
+
}.not_to raise_error
|
24
43
|
end
|
25
44
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
45
|
+
pending "should handle a ID search with basic params"
|
46
|
+
pending "should handle a search with joined params"
|
29
47
|
|
30
48
|
it "should handle a search with joined params containing custom field search" do
|
31
49
|
savon.expects(:search).with(:message => {
|
@@ -128,22 +146,12 @@ describe NetSuite::Actions::Search do
|
|
128
146
|
end
|
129
147
|
|
130
148
|
context "advanced search" do
|
131
|
-
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
it "should handle joined search results" do
|
136
|
-
|
137
|
-
end
|
149
|
+
pending "should handle search column definitions"
|
150
|
+
pending "should handle joined search results"
|
138
151
|
end
|
139
152
|
|
140
153
|
context "basic search" do
|
141
|
-
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
|
-
it "should handle searching with joined fields" do
|
146
|
-
|
147
|
-
end
|
154
|
+
pending "should handle searching basic fields"
|
155
|
+
pending "should handle searching with joined fields"
|
148
156
|
end
|
149
157
|
end
|
@@ -13,13 +13,11 @@ describe NetSuite::Records::CustomerRefundDepositList do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'can represent itself as a SOAP record' do
|
16
|
-
record =
|
17
|
-
{
|
18
|
-
'tranCust:
|
19
|
-
|
20
|
-
|
21
|
-
}
|
22
|
-
]
|
16
|
+
record = {
|
17
|
+
'tranCust:customerRefundDeposit' => [{
|
18
|
+
'tranCust:apply' => false
|
19
|
+
}]
|
20
|
+
}
|
23
21
|
list.to_record.should eql(record)
|
24
22
|
end
|
25
23
|
end
|
@@ -18,7 +18,7 @@ describe NetSuite::Records::Invoice do
|
|
18
18
|
:item_cost_disc_rate, :item_cost_disc_tax_1_amt, :item_cost_disc_taxable, :item_cost_discount, :item_cost_list,
|
19
19
|
:item_cost_tax_code, :item_cost_tax_rate_1, :item_cost_tax_rate_2, :job, :last_modified_date,
|
20
20
|
:lead_source, :linked_tracking_numbers, :memo, :message, :message_sel, :on_credit_hold, :opportunity,
|
21
|
-
:
|
21
|
+
:other_ref_num, :partners_list, :promo_code, :rev_rec_end_date,
|
22
22
|
:rev_rec_on_rev_commitment, :rev_rec_schedule, :rev_rec_start_date, :revenue_status, :sales_effective_date,
|
23
23
|
:sales_group, :sales_team_list, :ship_address, :ship_date, :ship_group_list,
|
24
24
|
:shipping_cost, :shipping_tax_1_rate, :shipping_tax_2_rate, :shipping_tax_code, :source, :start_date,
|
@@ -63,6 +63,11 @@ describe NetSuite::Records::SalesOrder do
|
|
63
63
|
it 'can be set from a BillAddress object'
|
64
64
|
end
|
65
65
|
|
66
|
+
describe '#transaction_ship_address' do
|
67
|
+
it 'can be set from attributes'
|
68
|
+
it 'can be set from a ShipAddress object'
|
69
|
+
end
|
70
|
+
|
66
71
|
describe '#revenue_status' do
|
67
72
|
it 'can be set from attributes'
|
68
73
|
it 'can be set from a RevenueStatus object'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soapenv:Header>
|
3
|
+
<platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2011_2.platform.webservices.netsuite.com">
|
4
|
+
<platformMsgs:nsId>WEBSERVICES_TSTDRV1141558_0120201413459254121612426069_c2488</platformMsgs:nsId>
|
5
|
+
</platformMsgs:documentInfo>
|
6
|
+
</soapenv:Header>
|
7
|
+
<soapenv:Body>
|
8
|
+
<addResponse xmlns="urn:messages_2011_2.platform.webservices.netsuite.com">
|
9
|
+
<writeResponse>
|
10
|
+
<platformCore:status xmlns:platformCore="urn:core_2011_2.platform.webservices.netsuite.com" isSuccess="false">
|
11
|
+
<platformCore:statusDetail type="ERROR">
|
12
|
+
<platformCore:code>INVALID_INITIALIZE_REF</platformCore:code>
|
13
|
+
<platformCore:message>You can not initialize invoice: invalid reference 7281.</platformCore:message>
|
14
|
+
</platformCore:statusDetail>
|
15
|
+
</platformCore:status>
|
16
|
+
</writeResponse>
|
17
|
+
</addResponse>
|
18
|
+
</soapenv:Body>
|
19
|
+
</soapenv:Envelope>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
2
|
+
<soapenv:Header>
|
3
|
+
<platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2011_2.platform.webservices.netsuite.com">
|
4
|
+
<platformMsgs:nsId>WEBSERVICES_TSTDRV1141558_012020141341351370832200514_6a6fc5</platformMsgs:nsId>
|
5
|
+
</platformMsgs:documentInfo>
|
6
|
+
</soapenv:Header>
|
7
|
+
<soapenv:Body>
|
8
|
+
<addResponse xmlns="urn:messages_2011_2.platform.webservices.netsuite.com">
|
9
|
+
<writeResponse>
|
10
|
+
<platformCore:status xmlns:platformCore="urn:core_2011_2.platform.webservices.netsuite.com" isSuccess="false">
|
11
|
+
<platformCore:statusDetail type="ERROR">
|
12
|
+
<platformCore:code>ERROR</platformCore:code>
|
13
|
+
<platformCore:message>Some message</platformCore:message>
|
14
|
+
</platformCore:statusDetail>
|
15
|
+
<platformCore:statusDetail type="ERROR">
|
16
|
+
<platformCore:code>ERROR</platformCore:code>
|
17
|
+
<platformCore:message>Some message 2</platformCore:message>
|
18
|
+
</platformCore:statusDetail>
|
19
|
+
</platformCore:status>
|
20
|
+
<baseRef internalId="999" type="invoice" xsi:type="ns2:RecordRef" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="urn:core_2_5.platform.webservices.netsuite.com"/>
|
21
|
+
</writeResponse>
|
22
|
+
</addResponse>
|
23
|
+
</soapenv:Body>
|
24
|
+
</soapenv:Envelope>
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netsuite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.2.0
|
4
|
+
version: 0.2.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ryan Moran
|
@@ -10,40 +9,36 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2014-02-03 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
|
-
|
15
|
+
name: savon
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 2.3.0
|
21
|
-
none: false
|
22
|
-
name: savon
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
|
-
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
24
|
requirements:
|
27
25
|
- - ~>
|
28
26
|
- !ruby/object:Gem::Version
|
29
27
|
version: 2.3.0
|
30
|
-
none: false
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
|
-
|
29
|
+
name: rspec
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
33
31
|
requirements:
|
34
32
|
- - ~>
|
35
33
|
- !ruby/object:Gem::Version
|
36
34
|
version: '2.10'
|
37
|
-
none: false
|
38
|
-
name: rspec
|
39
35
|
type: :development
|
40
36
|
prerelease: false
|
41
|
-
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
38
|
requirements:
|
43
39
|
- - ~>
|
44
40
|
- !ruby/object:Gem::Version
|
45
41
|
version: '2.10'
|
46
|
-
none: false
|
47
42
|
description: NetSuite SuiteTalk API Wrapper
|
48
43
|
email:
|
49
44
|
- ryan.moran@gmail.com
|
@@ -105,6 +100,7 @@ files:
|
|
105
100
|
- lib/netsuite/records/customer.rb
|
106
101
|
- lib/netsuite/records/customer_addressbook.rb
|
107
102
|
- lib/netsuite/records/customer_addressbook_list.rb
|
103
|
+
- lib/netsuite/records/customer_deposit.rb
|
108
104
|
- lib/netsuite/records/customer_payment.rb
|
109
105
|
- lib/netsuite/records/customer_payment_apply.rb
|
110
106
|
- lib/netsuite/records/customer_payment_apply_list.rb
|
@@ -128,6 +124,7 @@ files:
|
|
128
124
|
- lib/netsuite/records/journal_entry_line_list.rb
|
129
125
|
- lib/netsuite/records/kit_item.rb
|
130
126
|
- lib/netsuite/records/location.rb
|
127
|
+
- lib/netsuite/records/locations_list.rb
|
131
128
|
- lib/netsuite/records/non_inventory_sale_item.rb
|
132
129
|
- lib/netsuite/records/payment_method.rb
|
133
130
|
- lib/netsuite/records/phone_call.rb
|
@@ -217,6 +214,8 @@ files:
|
|
217
214
|
- spec/support/field_matcher.rb
|
218
215
|
- spec/support/fixtures/add/add_customer.xml
|
219
216
|
- spec/support/fixtures/add/add_invoice.xml
|
217
|
+
- spec/support/fixtures/add/add_invoice_error.xml
|
218
|
+
- spec/support/fixtures/add/add_invoice_multiple_errors.xml
|
220
219
|
- spec/support/fixtures/delete/delete_customer.xml
|
221
220
|
- spec/support/fixtures/get/get_customer.xml
|
222
221
|
- spec/support/fixtures/get/get_invoice.xml
|
@@ -232,6 +231,7 @@ files:
|
|
232
231
|
- wsdl/2012_1.wsdl
|
233
232
|
homepage: https://github.com/RevolutionPrep/netsuite
|
234
233
|
licenses: []
|
234
|
+
metadata: {}
|
235
235
|
post_install_message:
|
236
236
|
rdoc_options: []
|
237
237
|
require_paths:
|
@@ -241,18 +241,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
241
241
|
- - ! '>='
|
242
242
|
- !ruby/object:Gem::Version
|
243
243
|
version: '0'
|
244
|
-
none: false
|
245
244
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
246
245
|
requirements:
|
247
246
|
- - ! '>='
|
248
247
|
- !ruby/object:Gem::Version
|
249
248
|
version: '0'
|
250
|
-
none: false
|
251
249
|
requirements: []
|
252
250
|
rubyforge_project:
|
253
|
-
rubygems_version: 1.
|
251
|
+
rubygems_version: 2.1.11
|
254
252
|
signing_key:
|
255
|
-
specification_version:
|
253
|
+
specification_version: 4
|
256
254
|
summary: NetSuite SuiteTalk API Wrapper
|
257
255
|
test_files:
|
258
256
|
- spec/netsuite/actions/add_spec.rb
|
@@ -320,6 +318,8 @@ test_files:
|
|
320
318
|
- spec/support/field_matcher.rb
|
321
319
|
- spec/support/fixtures/add/add_customer.xml
|
322
320
|
- spec/support/fixtures/add/add_invoice.xml
|
321
|
+
- spec/support/fixtures/add/add_invoice_error.xml
|
322
|
+
- spec/support/fixtures/add/add_invoice_multiple_errors.xml
|
323
323
|
- spec/support/fixtures/delete/delete_customer.xml
|
324
324
|
- spec/support/fixtures/get/get_customer.xml
|
325
325
|
- spec/support/fixtures/get/get_invoice.xml
|