netsuite 0.7.5 → 0.7.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/netsuite.rb +2 -0
- data/lib/netsuite/actions/get_deleted.rb +88 -0
- data/lib/netsuite/configuration.rb +34 -2
- data/lib/netsuite/records/credit_memo.rb +2 -2
- data/lib/netsuite/records/customer.rb +4 -4
- data/lib/netsuite/records/invoice.rb +1 -1
- data/lib/netsuite/records/item_receipt.rb +1 -1
- data/lib/netsuite/records/non_inventory_sale_item.rb +1 -1
- data/lib/netsuite/records/service_sale_item.rb +1 -1
- data/lib/netsuite/records/transfer_order.rb +1 -1
- data/lib/netsuite/support/actions.rb +2 -0
- data/lib/netsuite/support/records.rb +6 -1
- data/lib/netsuite/support/search_result.rb +19 -8
- data/lib/netsuite/utilities.rb +14 -33
- data/lib/netsuite/utilities/data_center.rb +57 -0
- data/lib/netsuite/version.rb +1 -1
- data/spec/netsuite/actions/get_deleted_spec.rb +60 -0
- data/spec/netsuite/configuration_spec.rb +95 -4
- data/spec/netsuite/records/customer_spec.rb +3 -3
- data/spec/netsuite/records/non_inventory_sale_item_spec.rb +26 -0
- data/spec/netsuite/utilities/data_center_spec.rb +110 -0
- data/spec/support/fixtures/get_deleted/get_deleted_invoices.xml +38 -0
- metadata +10 -2
data/lib/netsuite.rb
CHANGED
@@ -4,6 +4,7 @@ require 'savon'
|
|
4
4
|
require 'netsuite/version'
|
5
5
|
require 'netsuite/errors'
|
6
6
|
require 'netsuite/utilities'
|
7
|
+
require 'netsuite/utilities/data_center'
|
7
8
|
require 'netsuite/rest/utilities/roles'
|
8
9
|
require 'netsuite/rest/utilities/request'
|
9
10
|
require 'netsuite/core_ext/string/lower_camelcase'
|
@@ -51,6 +52,7 @@ module NetSuite
|
|
51
52
|
autoload :Delete, 'netsuite/actions/delete'
|
52
53
|
autoload :DeleteList, 'netsuite/actions/delete_list'
|
53
54
|
autoload :Get, 'netsuite/actions/get'
|
55
|
+
autoload :GetDeleted, 'netsuite/actions/get_deleted'
|
54
56
|
autoload :GetAll, 'netsuite/actions/get_all'
|
55
57
|
autoload :GetList, 'netsuite/actions/get_list'
|
56
58
|
autoload :GetSelectValue, 'netsuite/actions/get_select_value'
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Actions
|
3
|
+
class GetDeleted
|
4
|
+
include Support::Requests
|
5
|
+
|
6
|
+
def initialize(object = nil, options = {})
|
7
|
+
@object = object
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def request(credentials={})
|
14
|
+
NetSuite::Configuration.connection(
|
15
|
+
{namespaces: {
|
16
|
+
'xmlns:platformMsgs' => "urn:messages_#{NetSuite::Configuration.api_version}.platform.webservices.netsuite.com",
|
17
|
+
'xmlns:platformCore' => "urn:core_#{NetSuite::Configuration.api_version}.platform.webservices.netsuite.com"
|
18
|
+
}}, credentials
|
19
|
+
).call :get_deleted, message: request_body
|
20
|
+
end
|
21
|
+
|
22
|
+
def soap_type
|
23
|
+
@object.class.to_s.split('::').last.lower_camelcase
|
24
|
+
end
|
25
|
+
|
26
|
+
# <soap:Body>
|
27
|
+
# <platformMsgs:getDeleted>
|
28
|
+
# <platformMsgs:pageIndex>1</platformMsgs:pageIndex>
|
29
|
+
# <platformMsgs:getDeletedFilter>
|
30
|
+
# <platformCore:deletedDate operator="within">
|
31
|
+
# <platformCore:searchValue>2016-12-01T00:00:00</platformCore:searchValue>
|
32
|
+
# <platformCore:searchValue2>2016-12-20T00:00:00</platformCore:searchValue2>
|
33
|
+
# </platformCore:deletedDate>
|
34
|
+
# <platformCore:type operator="anyOf">
|
35
|
+
# <platformCore:searchValue>invoice</platformCore:searchValue>
|
36
|
+
# </platformCore:type>
|
37
|
+
# </platformMsgs:getDeletedFilter>
|
38
|
+
# </platformMsgs:getDeleted>
|
39
|
+
# </soap:Body>
|
40
|
+
def request_body
|
41
|
+
criteria = @options[:criteria] || @options
|
42
|
+
filter_elements = {}
|
43
|
+
|
44
|
+
criteria.each do |c|
|
45
|
+
searchValue = { "@operator" => c[:operator] }
|
46
|
+
|
47
|
+
if c[:value].is_a?(Array) && c[:type] == 'SearchDateField'
|
48
|
+
searchValue["platformCore:searchValue"] = c[:value][0].to_s
|
49
|
+
searchValue["platformCore:searchValue2"] = c[:value][1].to_s
|
50
|
+
else
|
51
|
+
searchValue["platformCore:searchValue"] = c[:value]
|
52
|
+
end
|
53
|
+
|
54
|
+
filter_elements["platformCore:#{c[:field]}"] = searchValue
|
55
|
+
end
|
56
|
+
|
57
|
+
{
|
58
|
+
'platformMsgs:pageIndex' => @options.fetch(:page, 1),
|
59
|
+
'platformMsgs:getDeletedFilter' => filter_elements
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def response_hash
|
64
|
+
@response.body[:get_deleted_response]
|
65
|
+
end
|
66
|
+
|
67
|
+
def success?
|
68
|
+
@success ||= response_body[:status][:@is_success] == 'true'
|
69
|
+
end
|
70
|
+
|
71
|
+
def response_body
|
72
|
+
@response_body ||= response_hash[:get_deleted_result]
|
73
|
+
end
|
74
|
+
|
75
|
+
module Support
|
76
|
+
def self.included(base)
|
77
|
+
base.extend(ClassMethods)
|
78
|
+
end
|
79
|
+
|
80
|
+
module ClassMethods
|
81
|
+
def get_deleted(options = { }, credentials={})
|
82
|
+
NetSuite::Actions::GetDeleted.call([self, options], credentials)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -4,6 +4,7 @@ module NetSuite
|
|
4
4
|
|
5
5
|
def reset!
|
6
6
|
NetSuite::Utilities.clear_cache!
|
7
|
+
clear_wsdl_cache
|
7
8
|
|
8
9
|
attributes.clear
|
9
10
|
end
|
@@ -13,8 +14,8 @@ module NetSuite
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def connection(params={}, credentials={})
|
16
|
-
Savon.client({
|
17
|
-
wsdl: wsdl,
|
17
|
+
client = Savon.client({
|
18
|
+
wsdl: cached_wsdl || wsdl,
|
18
19
|
read_timeout: read_timeout,
|
19
20
|
namespaces: namespaces,
|
20
21
|
soap_header: auth_header(credentials).update(soap_header),
|
@@ -24,6 +25,8 @@ module NetSuite
|
|
24
25
|
log_level: log_level,
|
25
26
|
log: !silent, # turn off logging entirely if configured
|
26
27
|
}.update(params))
|
28
|
+
cache_wsdl(client)
|
29
|
+
return client
|
27
30
|
end
|
28
31
|
|
29
32
|
def filters(list = nil)
|
@@ -43,6 +46,35 @@ module NetSuite
|
|
43
46
|
attributes[:filters] = list
|
44
47
|
end
|
45
48
|
|
49
|
+
def wsdl_cache
|
50
|
+
@wsdl_cache ||= {}
|
51
|
+
end
|
52
|
+
|
53
|
+
def clear_wsdl_cache
|
54
|
+
@wsdl_cache = {}
|
55
|
+
end
|
56
|
+
|
57
|
+
def cached_wsdl
|
58
|
+
cached = wsdl_cache.fetch([api_version, wsdl], nil)
|
59
|
+
if cached.is_a? String
|
60
|
+
cached
|
61
|
+
elsif cached.is_a? Savon::Client
|
62
|
+
wsdl_cache[[api_version, wsdl]] = cached.instance_eval { @wsdl.xml }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def cache_wsdl(client)
|
67
|
+
# NOTE the Savon::Client doesn't pull the wsdl content upon
|
68
|
+
# instantiation; it pulls it when it recieves the #call method.
|
69
|
+
# If we force it to pull the wsdl here, it will duplicate the call later.
|
70
|
+
# So, we stash the entire client and fetch just the wsdl from it after
|
71
|
+
# it completes its call
|
72
|
+
# For reference, see:
|
73
|
+
# https://github.com/savonrb/savon/blob/d64925d3add33fa5531577ce9e3a28a7a93618b1/lib/savon/client.rb#L35-L37
|
74
|
+
# https://github.com/savonrb/savon/blob/d64925d3add33fa5531577ce9e3a28a7a93618b1/lib/savon/operation.rb#L22
|
75
|
+
wsdl_cache[[api_version, wsdl]] ||= client
|
76
|
+
end
|
77
|
+
|
46
78
|
def api_version(version = nil)
|
47
79
|
if version
|
48
80
|
self.api_version = version
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::TranCust
|
9
9
|
|
10
|
-
actions :get, :get_list, :add, :initialize, :delete, :update, :upsert, :search
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :initialize, :delete, :update, :upsert, :search
|
11
11
|
|
12
12
|
fields :alt_handling_cost, :alt_shipping_cost, :amount_paid, :amount_remaining, :auto_apply, :balance,
|
13
13
|
:bill_address, :contrib_pct, :created_date, :currency_name, :deferred_revenue, :discount_rate, :email,
|
@@ -34,7 +34,7 @@ module NetSuite
|
|
34
34
|
|
35
35
|
record_refs :account, :bill_address_list, :created_from, :custom_form, :department, :discount_item, :entity, :gift_cert,
|
36
36
|
:handling_tax_code, :job, :klass, :lead_source, :location, :message_sel, :partner, :posting_period, :promo_code,
|
37
|
-
:sales_group, :sales_rep, :ship_method, :shipping_tax_code, :subsidiary, :tax_item
|
37
|
+
:sales_group, :sales_rep, :ship_method, :shipping_tax_code, :subsidiary, :tax_item, :currency
|
38
38
|
|
39
39
|
attr_reader :internal_id
|
40
40
|
attr_accessor :external_id
|
@@ -22,8 +22,8 @@ module NetSuite
|
|
22
22
|
:opening_balance, :opening_balance_account, :opening_balance_date,
|
23
23
|
:password, :password2, :phone, :phonetic_name, :pref_cc_processor, :print_on_check_as,
|
24
24
|
:print_transactions, :referrer, :reminder_days, :representing_subsidiary, :require_pwd_change, :resale_number,
|
25
|
-
:sales_group, :sales_readiness, :sales_team_list, :salutation, :send_email, :ship_complete,
|
26
|
-
:stage, :start_date, :sync_partner_teams, :tax_exempt, :
|
25
|
+
:sales_group, :sales_readiness, :sales_team_list, :salutation, :send_email, :ship_complete,
|
26
|
+
:stage, :start_date, :sync_partner_teams, :tax_exempt, :taxable,
|
27
27
|
:third_party_acct, :third_party_country, :third_party_zipcode, :title, :url,
|
28
28
|
:vat_reg_number, :visits, :web_lead
|
29
29
|
|
@@ -32,14 +32,14 @@ module NetSuite
|
|
32
32
|
field :contact_roles_list, ContactAccessRolesList
|
33
33
|
field :currency_list, CustomerCurrencyList
|
34
34
|
field :partners_list, CustomerPartnersList
|
35
|
-
|
35
|
+
|
36
36
|
# TODO subscriptions_list
|
37
37
|
|
38
38
|
read_only_fields :balance, :consol_balance, :deposit_balance, :consol_deposit_balance, :overdue_balance,
|
39
39
|
:consol_overdue_balance, :unbilled_orders, :consol_unbilled_orders
|
40
40
|
|
41
41
|
record_refs :access_role, :custom_form, :currency, :entity_status, :partner, :category, :lead_source,
|
42
|
-
:price_level,:sales_rep, :subsidiary, :terms, :parent, :territory
|
42
|
+
:price_level,:sales_rep, :subsidiary, :terms, :parent, :territory, :tax_item, :shipping_item
|
43
43
|
|
44
44
|
attr_reader :internal_id
|
45
45
|
attr_accessor :external_id
|
@@ -9,7 +9,7 @@ module NetSuite
|
|
9
9
|
|
10
10
|
# https://system.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2014_1/schema/record/invoice.html?mode=package
|
11
11
|
|
12
|
-
actions :get, :get_list, :initialize, :add, :update, :delete, :upsert, :search
|
12
|
+
actions :get, :get_deleted, :get_list, :initialize, :add, :update, :delete, :upsert, :search
|
13
13
|
|
14
14
|
fields :balance, :bill_address,
|
15
15
|
:billing_schedule, :contrib_pct, :created_date, :currency_name, :custom_field_list,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::TranPurch
|
9
9
|
|
10
|
-
actions :get, :get_list, :add, :initialize, :delete, :update, :upsert, :search
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :initialize, :delete, :update, :upsert, :search
|
11
11
|
|
12
12
|
fields :created_date, :currency_name, :exchange_rate, :landed_cost_per_line,
|
13
13
|
:last_modified_date, :memo, :tran_date, :tran_id
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_list, :add, :delete, :search, :upsert
|
10
|
+
actions :get, :get_list, :add, :delete, :search, :update, :upsert
|
11
11
|
|
12
12
|
fields :available_to_partners, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :country_of_manufacture,
|
13
13
|
:created_date, :display_name, :dont_show_price, :enforce_min_qty_internally, :exclude_from_sitemap,
|
@@ -26,7 +26,7 @@ module NetSuite
|
|
26
26
|
record_refs :billing_schedule, :cost_category, :custom_form, :deferred_revenue_account, :department, :income_account,
|
27
27
|
:issue_product, :item_options_list, :klass, :location, :parent, :pricing_group, :purchase_tax_code,
|
28
28
|
:quantity_pricing_schedule, :rev_rec_schedule, :sale_unit, :sales_tax_code, :store_display_image,
|
29
|
-
:store_display_thumbnail, :store_item_template, :tax_schedule, :units_type
|
29
|
+
:store_display_thumbnail, :store_item_template, :tax_schedule, :units_type, :subsidiary
|
30
30
|
|
31
31
|
field :pricing_matrix, PricingMatrix
|
32
32
|
field :custom_field_list, CustomFieldList
|
@@ -13,7 +13,7 @@ module NetSuite
|
|
13
13
|
:handling_tax2_rate, :last_modified_date, :linked_tracking_numbers,
|
14
14
|
:memo, :ship_complete, :ship_date, :ship_is_residential, :shipping_cost,
|
15
15
|
:shipping_tax1_rate, :shipping_tax2_rate, :source, :status, :sub_total,
|
16
|
-
:total, :tracking_numbers, :tran_date, :tran_id, :order_status
|
16
|
+
:total, :tracking_numbers, :tran_date, :tran_id, :order_status, :use_item_cost_as_transfer_cost
|
17
17
|
|
18
18
|
record_refs :transfer_location, :shipping_tax_code, :subsidiary, :shipping_address,
|
19
19
|
:ship_method, :employee, :handling_tax_code,
|
@@ -22,6 +22,8 @@ module NetSuite
|
|
22
22
|
self.send(:include, NetSuite::Actions::Get::Support)
|
23
23
|
when :get_all
|
24
24
|
self.send(:include, NetSuite::Actions::GetAll::Support)
|
25
|
+
when :get_deleted
|
26
|
+
self.send(:include, NetSuite::Actions::GetDeleted::Support)
|
25
27
|
when :get_list
|
26
28
|
self.send(:include, NetSuite::Actions::GetList::Support)
|
27
29
|
when :get_select_value
|
@@ -56,7 +56,12 @@ module NetSuite
|
|
56
56
|
fresh_record = self.class.get(self.internal_id, credentials)
|
57
57
|
|
58
58
|
self.attributes = fresh_record.send(:attributes)
|
59
|
-
|
59
|
+
|
60
|
+
# gift cards do not have an external ID
|
61
|
+
if fresh_record.respond_to?(:external_id)
|
62
|
+
self.external_id = fresh_record.external_id
|
63
|
+
end
|
64
|
+
|
60
65
|
self.errors = nil
|
61
66
|
|
62
67
|
self
|
@@ -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
|
@@ -52,12 +52,23 @@ module NetSuite
|
|
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)
|
55
|
-
#
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
# Here's an example of a record ref and string response
|
56
|
+
|
57
|
+
# <platformCommon:entity>
|
58
|
+
# <platformCore:searchValue internalId="446515"/>
|
59
|
+
# </platformCommon:entity>
|
60
|
+
# <platformCommon:status>
|
61
|
+
# <platformCore:searchValue>open</platformCore:searchValue>
|
62
|
+
# </platformCommon:status>
|
63
|
+
|
64
|
+
# in both cases, header-level field's value should be set to the
|
65
|
+
# child `searchValue` result: if it's a record ref, the internalId
|
66
|
+
# attribute will be transitioned to the parent, and in the case
|
67
|
+
# of a string response the parent node's value will be to the string
|
68
|
+
|
69
|
+
record[search_group][k] = v[:search_value]
|
70
|
+
else
|
71
|
+
# NOTE need to understand this case more, in testing, only the namespace definition hits this condition
|
61
72
|
end
|
62
73
|
end
|
63
74
|
end
|
@@ -97,4 +108,4 @@ module NetSuite
|
|
97
108
|
|
98
109
|
end
|
99
110
|
end
|
100
|
-
end
|
111
|
+
end
|
data/lib/netsuite/utilities.rb
CHANGED
@@ -7,6 +7,7 @@ module NetSuite
|
|
7
7
|
def clear_cache!
|
8
8
|
@netsuite_get_record_cache = {}
|
9
9
|
@netsuite_find_record_cache = {}
|
10
|
+
DataCenter.clear_cache!
|
10
11
|
end
|
11
12
|
|
12
13
|
def append_memo(ns_record, added_memo, opts = {})
|
@@ -64,19 +65,18 @@ module NetSuite
|
|
64
65
|
return errors.size > 0
|
65
66
|
end
|
66
67
|
|
67
|
-
|
68
|
-
def get_item(ns_item_internal_id)
|
68
|
+
def get_item(ns_item_internal_id, opts = {})
|
69
69
|
# TODO add additional item types!
|
70
|
-
ns_item = NetSuite::Utilities.get_record(NetSuite::Records::InventoryItem, ns_item_internal_id)
|
71
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::AssemblyItem, ns_item_internal_id)
|
72
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::NonInventorySaleItem, ns_item_internal_id)
|
73
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::NonInventoryResaleItem, ns_item_internal_id)
|
74
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::DiscountItem, ns_item_internal_id)
|
75
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::OtherChargeSaleItem, ns_item_internal_id)
|
76
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ServiceSaleItem, ns_item_internal_id)
|
77
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::GiftCertificateItem, ns_item_internal_id)
|
78
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::KitItem, ns_item_internal_id)
|
79
|
-
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedInventoryItem, ns_item_internal_id)
|
70
|
+
ns_item = NetSuite::Utilities.get_record(NetSuite::Records::InventoryItem, ns_item_internal_id, opts)
|
71
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::AssemblyItem, ns_item_internal_id, opts)
|
72
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::NonInventorySaleItem, ns_item_internal_id, opts)
|
73
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::NonInventoryResaleItem, ns_item_internal_id, opts)
|
74
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::DiscountItem, ns_item_internal_id, opts)
|
75
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::OtherChargeSaleItem, ns_item_internal_id, opts)
|
76
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ServiceSaleItem, ns_item_internal_id, opts)
|
77
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::GiftCertificateItem, ns_item_internal_id, opts)
|
78
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::KitItem, ns_item_internal_id, opts)
|
79
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedInventoryItem, ns_item_internal_id, opts)
|
80
80
|
|
81
81
|
if ns_item.nil?
|
82
82
|
fail NetSuite::RecordNotFound, "item with ID #{ns_item_internal_id} not found"
|
@@ -157,27 +157,8 @@ module NetSuite
|
|
157
157
|
nil
|
158
158
|
end
|
159
159
|
|
160
|
-
def data_center_url(
|
161
|
-
|
162
|
-
data_center_call_response = NetSuite::Configuration.connection({}, {
|
163
|
-
email: '',
|
164
|
-
password: '',
|
165
|
-
account: ''
|
166
|
-
}).call(:get_data_center_urls, message: {
|
167
|
-
'platformMsgs:account' => netsuite_account
|
168
|
-
})
|
169
|
-
|
170
|
-
if data_center_call_response.success?
|
171
|
-
return data_center_call_response.body[:get_data_center_urls_response][:get_data_center_urls_result][:data_center_urls][:webservices_domain]
|
172
|
-
else
|
173
|
-
# log.error "error getting data center url"
|
174
|
-
end
|
175
|
-
rescue Exception => e
|
176
|
-
# log.error "error determining correct datacenter for account #{netsuite_account}. #{e.message}"
|
177
|
-
|
178
|
-
# TODO silence this later: for now we need to investigate when this would occur
|
179
|
-
raise(e)
|
180
|
-
end
|
160
|
+
def data_center_url(*args)
|
161
|
+
DataCenter.get(*args)
|
181
162
|
end
|
182
163
|
|
183
164
|
# Warning this was developed with a Web Services user whose time zone was set to CST
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Utilities
|
3
|
+
class DataCenter
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def clear_cache!
|
7
|
+
@cache = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(netsuite_account, opts = {})
|
11
|
+
if opts[:cache] && wsdl=fetch_from_cache(netsuite_account)
|
12
|
+
return wsdl
|
13
|
+
end
|
14
|
+
|
15
|
+
response = make_data_center_call(netsuite_account)
|
16
|
+
if response.success?
|
17
|
+
wsdl = extract_wsdl_from_response(response)
|
18
|
+
cache[netsuite_account.to_s] = wsdl if opts[:cache]
|
19
|
+
return wsdl
|
20
|
+
else
|
21
|
+
return nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def cache
|
28
|
+
@cache ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def make_data_center_call(netsuite_account)
|
32
|
+
NetSuite::Configuration.connection({}, {
|
33
|
+
email: '',
|
34
|
+
password: '',
|
35
|
+
account: ''
|
36
|
+
}).call(:get_data_center_urls, message: {
|
37
|
+
'platformMsgs:account' => netsuite_account
|
38
|
+
})
|
39
|
+
# allow errors to bubble up, log if patterns emerge
|
40
|
+
end
|
41
|
+
|
42
|
+
def fetch_from_cache(netsuite_account)
|
43
|
+
return cache.fetch(netsuite_account.to_s, nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
def extract_wsdl_from_response(response)
|
47
|
+
response.body
|
48
|
+
.fetch(:get_data_center_urls_response)
|
49
|
+
.fetch(:get_data_center_urls_result)
|
50
|
+
.fetch(:data_center_urls)
|
51
|
+
.fetch(:webservices_domain)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/netsuite/version.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NetSuite::Actions::GetDeleted do
|
4
|
+
before(:all) { savon.mock! }
|
5
|
+
after(:all) { savon.unmock! }
|
6
|
+
|
7
|
+
describe 'Invoice' do
|
8
|
+
before do
|
9
|
+
savon.expects(:get_deleted).with(:message => {
|
10
|
+
'platformMsgs:pageIndex' => 1,
|
11
|
+
'platformMsgs:getDeletedFilter' => {
|
12
|
+
"platformCore:type" => {
|
13
|
+
"@operator" =>"anyOf",
|
14
|
+
"platformCore:searchValue" => ["invoice"],
|
15
|
+
},
|
16
|
+
"platformCore:deletedDate" => {
|
17
|
+
"@operator" =>"within",
|
18
|
+
"platformCore:searchValue" => "2016-12-01T00:00:00",
|
19
|
+
"platformCore:searchValue2" => "2016-12-02T00:00:00",
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}).returns(File.read('spec/support/fixtures/get_deleted/get_deleted_invoices.xml'))
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'makes a valid request to the NetSuite API' do
|
26
|
+
NetSuite::Actions::GetDeleted.call([NetSuite::Records::Invoice, { page: 1, criteria: [
|
27
|
+
{
|
28
|
+
field: 'type',
|
29
|
+
operator: 'anyOf',
|
30
|
+
type: 'SearchEnumMultiSelectField',
|
31
|
+
value: ["invoice"]
|
32
|
+
},
|
33
|
+
{
|
34
|
+
field: 'deletedDate',
|
35
|
+
operator: "within",
|
36
|
+
type: 'SearchDateField',
|
37
|
+
value: ["2016-12-01T00:00:00","2016-12-02T00:00:00"]
|
38
|
+
}
|
39
|
+
]}])
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'returns a valid Response object' do
|
43
|
+
response = NetSuite::Actions::GetDeleted.call([NetSuite::Records::Invoice, { page: 1, criteria: [
|
44
|
+
{
|
45
|
+
field: 'type',
|
46
|
+
operator: 'anyOf',
|
47
|
+
type: 'SearchEnumMultiSelectField',
|
48
|
+
value: ["invoice"]
|
49
|
+
},
|
50
|
+
{
|
51
|
+
field: 'deletedDate',
|
52
|
+
operator: "within",
|
53
|
+
type: 'SearchDateField',
|
54
|
+
value: ["2016-12-01T00:00:00","2016-12-02T00:00:00"]
|
55
|
+
}
|
56
|
+
]}])
|
57
|
+
expect(response).to be_kind_of(NetSuite::Response)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -29,14 +29,34 @@ describe NetSuite::Configuration do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
describe '#connection' do
|
32
|
-
|
32
|
+
before(:each) do
|
33
33
|
# reset clears out the password info
|
34
|
-
config.email
|
35
|
-
config.password
|
36
|
-
config.account
|
34
|
+
config.email 'me@example.com'
|
35
|
+
config.password 'me@example.com'
|
36
|
+
config.account 1023
|
37
|
+
config.wsdl "my_wsdl"
|
38
|
+
config.api_version "2012_2"
|
39
|
+
end
|
37
40
|
|
41
|
+
it 'returns a Savon::Client object that allows requests to the service' do
|
38
42
|
expect(config.connection).to be_kind_of(Savon::Client)
|
39
43
|
end
|
44
|
+
|
45
|
+
it 'caches the client' do
|
46
|
+
expect(config.wsdl_cache).to be_empty
|
47
|
+
conn = config.connection
|
48
|
+
|
49
|
+
expect(
|
50
|
+
config.wsdl_cache.fetch([config.api_version, config.wsdl])
|
51
|
+
).to eq(conn)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'uses cached wsdls' do
|
55
|
+
allow(config).to receive(:cached_wsdl)
|
56
|
+
config.connection
|
57
|
+
|
58
|
+
expect(config).to have_received(:cached_wsdl)
|
59
|
+
end
|
40
60
|
end
|
41
61
|
|
42
62
|
describe '#wsdl' do
|
@@ -73,6 +93,77 @@ describe NetSuite::Configuration do
|
|
73
93
|
expect(config.wsdl).to eql('https://system.na1.netsuite.com/wsdl/v2014_1_0/netsuite.wsdl')
|
74
94
|
end
|
75
95
|
end
|
96
|
+
|
97
|
+
context '#cache_wsdl' do
|
98
|
+
it 'stores the client' do
|
99
|
+
expect(config.wsdl_cache).to be_empty
|
100
|
+
config.cache_wsdl("whatevs")
|
101
|
+
expect(config.wsdl_cache).to eq(
|
102
|
+
{[config.api_version, config.wsdl] => "whatevs"}
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'doesnt write over old values' do
|
107
|
+
config.class_exec(config.api_version, config.wsdl) do |api, wsdl|
|
108
|
+
wsdl_cache[[api, wsdl]] = "old value"
|
109
|
+
end
|
110
|
+
config.cache_wsdl("new value")
|
111
|
+
|
112
|
+
expect(config.wsdl_cache.values.first).to eq("old value")
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'handles a nil cache' do
|
116
|
+
config.class_eval { @wsdl_cache = nil }
|
117
|
+
config.cache_wsdl("whatevs")
|
118
|
+
expect(config.wsdl_cache).to eq(
|
119
|
+
{[config.api_version, config.wsdl] => "whatevs"}
|
120
|
+
)
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'can cache multiple values' do
|
124
|
+
config.class_exec("2020_2", "fake wsdl") do |api, wsdl|
|
125
|
+
wsdl_cache[[api, wsdl]] = "old value"
|
126
|
+
end
|
127
|
+
expect(config.wsdl_cache.keys.count).to eq 1
|
128
|
+
config.cache_wsdl("new value")
|
129
|
+
|
130
|
+
expect(config.wsdl_cache.keys.count).to eq 2
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context '#cached_wsdl' do
|
135
|
+
it 'returns wsdl (xml)' do
|
136
|
+
config.class_exec(config.api_version, config.wsdl) do |api, wsdl|
|
137
|
+
wsdl_cache[[api, wsdl]] = "xml wsdl string"
|
138
|
+
end
|
139
|
+
expect( config.cached_wsdl ).to eq "xml wsdl string"
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'stores client xml' do
|
143
|
+
client = double(:savon_client)
|
144
|
+
allow(client).to receive(:is_a?).with(String).and_return(false)
|
145
|
+
allow(client).to receive(:is_a?).with(Savon::Client).and_return(true)
|
146
|
+
wsdl_dbl = double(:wsdl, xml: "xml wsdl")
|
147
|
+
client.instance_exec(wsdl_dbl) {|wsdl| @wsdl = wsdl }
|
148
|
+
config.class_exec(config.api_version, config.wsdl, client) do |api, wsdl, c|
|
149
|
+
wsdl_cache[[api, wsdl]] = c
|
150
|
+
end
|
151
|
+
|
152
|
+
expect( config.wsdl_cache.values.first ).to eq client
|
153
|
+
expect( config.cached_wsdl ).to eq "xml wsdl"
|
154
|
+
expect( config.wsdl_cache.values.first ).to eq "xml wsdl"
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'handles a nil cache' do
|
158
|
+
config.class_eval { @wsdl_cache = nil }
|
159
|
+
expect( config.cached_wsdl ).to eq nil
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'handles an empty cache' do
|
163
|
+
expect(config.wsdl_cache).to be_empty
|
164
|
+
expect( config.cached_wsdl ).to eq nil
|
165
|
+
end
|
166
|
+
end
|
76
167
|
end
|
77
168
|
|
78
169
|
describe '#auth_header' do
|
@@ -17,8 +17,8 @@ describe NetSuite::Records::Customer do
|
|
17
17
|
:opening_balance, :opening_balance_account, :opening_balance_date, :overdue_balance,
|
18
18
|
:password, :password2, :phone, :phonetic_name, :pref_cc_processor,:print_on_check_as,
|
19
19
|
:print_transactions, :referrer, :reminder_days, :representing_subsidiary, :require_pwd_change, :resale_number,
|
20
|
-
:sales_group, :sales_readiness, :sales_team_list, :salutation, :send_email, :ship_complete,
|
21
|
-
:stage, :start_date, :sync_partner_teams, :tax_exempt, :
|
20
|
+
:sales_group, :sales_readiness, :sales_team_list, :salutation, :send_email, :ship_complete,
|
21
|
+
:stage, :start_date, :sync_partner_teams, :tax_exempt, :taxable,
|
22
22
|
:third_party_acct, :third_party_country, :third_party_zipcode, :title, :unbilled_orders, :url,
|
23
23
|
:vat_reg_number, :visits, :web_lead
|
24
24
|
].each do |field|
|
@@ -28,7 +28,7 @@ describe NetSuite::Records::Customer do
|
|
28
28
|
|
29
29
|
it 'has the right record_refs' do
|
30
30
|
[
|
31
|
-
:access_role, :currency, :custom_form, :entity_status, :partner, :sales_rep, :terms, :parent, :territory
|
31
|
+
:access_role, :currency, :custom_form, :entity_status, :partner, :sales_rep, :terms, :parent, :territory, :shipping_item, :tax_item
|
32
32
|
].each do |record_ref|
|
33
33
|
expect(customer).to have_record_ref(record_ref)
|
34
34
|
end
|
@@ -91,6 +91,32 @@ describe NetSuite::Records::NonInventorySaleItem do
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
describe '#update' do
|
95
|
+
context 'when the response is successful' do
|
96
|
+
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
97
|
+
|
98
|
+
it 'returns true' do
|
99
|
+
expect(NetSuite::Actions::Update).to receive(:call).
|
100
|
+
with([item.class, {external_id: 'foo'}], {}).
|
101
|
+
and_return(response)
|
102
|
+
item.external_id = 'foo'
|
103
|
+
expect(item.update).to be_truthy
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when the response is unsuccessful' do
|
108
|
+
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
109
|
+
|
110
|
+
it 'returns false' do
|
111
|
+
expect(NetSuite::Actions::Update).to receive(:call).
|
112
|
+
with([item.class, {external_id: 'foo'}], {}).
|
113
|
+
and_return(response)
|
114
|
+
item.external_id = 'foo'
|
115
|
+
expect(item.update).to be_falsey
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
94
120
|
describe '#delete' do
|
95
121
|
context 'when the response is successful' do
|
96
122
|
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NetSuite::Utilities::DataCenter do
|
4
|
+
describe '#get' do
|
5
|
+
let(:wsdl) { "https://webservices.na1.netsuite.com" }
|
6
|
+
let(:account) { "BOGUSACCT" }
|
7
|
+
let(:response) do
|
8
|
+
double(
|
9
|
+
success?: true,
|
10
|
+
body: {
|
11
|
+
get_data_center_urls_response: {
|
12
|
+
get_data_center_urls_result: {
|
13
|
+
data_center_urls: { webservices_domain: wsdl }
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'without caching' do
|
21
|
+
it 'hits the API more than once' do
|
22
|
+
allow(described_class).to receive(:make_data_center_call)
|
23
|
+
.with(account)
|
24
|
+
.and_return(response)
|
25
|
+
10.times { described_class.get(account) }
|
26
|
+
|
27
|
+
expect(described_class).to have_received(:make_data_center_call)
|
28
|
+
.with(account).exactly(10).times
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when caching is enabled' do
|
34
|
+
|
35
|
+
it 'doesnt hit the API when cached response is present' do
|
36
|
+
described_class.class_exec(account) {|acct| cache[acct] = "wsdl" }
|
37
|
+
allow(described_class).to receive(:make_data_center_call)
|
38
|
+
described_class.get(account, cache: true)
|
39
|
+
|
40
|
+
expect(described_class).to_not have_received(:make_data_center_call)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'hits the API at most once' do
|
44
|
+
allow(described_class).to receive(:make_data_center_call)
|
45
|
+
.with(account)
|
46
|
+
.and_return(response)
|
47
|
+
10.times { described_class.get(account, cache: true) }
|
48
|
+
|
49
|
+
expect(described_class).to have_received(:make_data_center_call)
|
50
|
+
.with(account).exactly(1).times
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'hits the API after its cache is cleared' do
|
54
|
+
described_class.class_exec(account) {|acct| cache[acct] = "wsdl" }
|
55
|
+
allow(described_class).to receive(:make_data_center_call)
|
56
|
+
.with(account)
|
57
|
+
.and_return(response)
|
58
|
+
described_class.get(account, cache: true)
|
59
|
+
|
60
|
+
expect(described_class).to_not have_received(:make_data_center_call)
|
61
|
+
|
62
|
+
described_class.clear_cache!
|
63
|
+
described_class.get(account, cache: true)
|
64
|
+
|
65
|
+
expect(described_class).to have_received(:make_data_center_call)
|
66
|
+
.with(account).exactly(1).times
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'hits the API if the cache contains another response' do
|
70
|
+
described_class.class_eval { cache["BOGUS"] = "wsdl" }
|
71
|
+
allow(described_class).to receive(:make_data_center_call)
|
72
|
+
.with(account)
|
73
|
+
.and_return(response)
|
74
|
+
expect(account).to_not eq("BOGUS")
|
75
|
+
described_class.get(account, cache: true)
|
76
|
+
|
77
|
+
expect(described_class).to have_received(:make_data_center_call)
|
78
|
+
.with(account).exactly(1).times
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when cache is empty' do
|
83
|
+
|
84
|
+
it 'does hit the API' do
|
85
|
+
expect( described_class.class_eval { cache }).to eq({})
|
86
|
+
allow(described_class).to receive(:make_data_center_call)
|
87
|
+
.with(account)
|
88
|
+
.and_return(response)
|
89
|
+
|
90
|
+
described_class.get(account, cache: true)
|
91
|
+
|
92
|
+
expect(described_class).to have_received(:make_data_center_call)
|
93
|
+
.with(account).exactly(1).times
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'stores API response' do
|
97
|
+
expect( described_class.class_eval { cache }).to eq({})
|
98
|
+
allow(described_class).to receive(:make_data_center_call)
|
99
|
+
.with(account)
|
100
|
+
.and_return(response)
|
101
|
+
|
102
|
+
described_class.get(account, cache: true)
|
103
|
+
|
104
|
+
expect( described_class.class_eval { cache }).to eq(
|
105
|
+
{ account => wsdl }
|
106
|
+
)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,38 @@
|
|
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_2016_1.platform.webservices.netsuite.com">
|
4
|
+
<platformMsgs:nsId>WEBSERVICES_3868171_122020162073815481885806769_24761121647f</platformMsgs:nsId>
|
5
|
+
</platformMsgs:documentInfo>
|
6
|
+
</soapenv:Header>
|
7
|
+
<soapenv:Body>
|
8
|
+
<getDeletedResponse xmlns="urn:messages_2016_1.platform.webservices.netsuite.com">
|
9
|
+
<platformCore:getDeletedResult xmlns:platformCore="urn:core_2016_1.platform.webservices.netsuite.com">
|
10
|
+
<platformCore:status isSuccess="true"/>
|
11
|
+
<platformCore:totalRecords>3</platformCore:totalRecords>
|
12
|
+
<platformCore:pageSize>1000</platformCore:pageSize>
|
13
|
+
<platformCore:totalPages>1</platformCore:totalPages>
|
14
|
+
<platformCore:pageIndex>1</platformCore:pageIndex>
|
15
|
+
<platformCore:deletedRecordList>
|
16
|
+
<platformCore:deletedRecord>
|
17
|
+
<platformCore:deletedDate>2016-12-15T15:00:00.000-08:00</platformCore:deletedDate>
|
18
|
+
<platformCore:record internalId="1" type="invoice" xsi:type="platformCore:RecordRef">
|
19
|
+
<platformCore:name>REDACTED</platformCore:name>
|
20
|
+
</platformCore:record>
|
21
|
+
</platformCore:deletedRecord>
|
22
|
+
<platformCore:deletedRecord>
|
23
|
+
<platformCore:deletedDate>2016-12-09T13:00:00.000-08:00</platformCore:deletedDate>
|
24
|
+
<platformCore:record internalId="2" type="invoice" xsi:type="platformCore:RecordRef">
|
25
|
+
<platformCore:name>REDACTED</platformCore:name>
|
26
|
+
</platformCore:record>
|
27
|
+
</platformCore:deletedRecord>
|
28
|
+
<platformCore:deletedRecord>
|
29
|
+
<platformCore:deletedDate>2016-12-15T15:00:00.000-08:00</platformCore:deletedDate>
|
30
|
+
<platformCore:record internalId="3" type="invoice" xsi:type="platformCore:RecordRef">
|
31
|
+
<platformCore:name>REDACTED</platformCore:name>
|
32
|
+
</platformCore:record>
|
33
|
+
</platformCore:deletedRecord>
|
34
|
+
</platformCore:deletedRecordList>
|
35
|
+
</platformCore:getDeletedResult>
|
36
|
+
</getDeletedResponse>
|
37
|
+
</soapenv:Body>
|
38
|
+
</soapenv:Envelope>
|
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.7.
|
4
|
+
version: 0.7.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-01-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: savon
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- lib/netsuite/actions/delete_list.rb
|
67
67
|
- lib/netsuite/actions/get.rb
|
68
68
|
- lib/netsuite/actions/get_all.rb
|
69
|
+
- lib/netsuite/actions/get_deleted.rb
|
69
70
|
- lib/netsuite/actions/get_list.rb
|
70
71
|
- lib/netsuite/actions/get_select_value.rb
|
71
72
|
- lib/netsuite/actions/initialize.rb
|
@@ -291,11 +292,13 @@ files:
|
|
291
292
|
- lib/netsuite/support/search_result.rb
|
292
293
|
- lib/netsuite/support/sublist.rb
|
293
294
|
- lib/netsuite/utilities.rb
|
295
|
+
- lib/netsuite/utilities/data_center.rb
|
294
296
|
- lib/netsuite/version.rb
|
295
297
|
- netsuite.gemspec
|
296
298
|
- spec/netsuite/actions/add_spec.rb
|
297
299
|
- spec/netsuite/actions/delete_list_spec.rb
|
298
300
|
- spec/netsuite/actions/delete_spec.rb
|
301
|
+
- spec/netsuite/actions/get_deleted_spec.rb
|
299
302
|
- spec/netsuite/actions/get_list_spec.rb
|
300
303
|
- spec/netsuite/actions/get_spec.rb
|
301
304
|
- spec/netsuite/actions/initialize_spec.rb
|
@@ -421,6 +424,7 @@ files:
|
|
421
424
|
- spec/netsuite/support/records_spec.rb
|
422
425
|
- spec/netsuite/support/requests_spec.rb
|
423
426
|
- spec/netsuite/support/sublist_spec.rb
|
427
|
+
- spec/netsuite/utilities/data_center_spec.rb
|
424
428
|
- spec/netsuite/utilities/request_spec.rb
|
425
429
|
- spec/netsuite/utilities/roles_spec.rb
|
426
430
|
- spec/netsuite/utilities_spec.rb
|
@@ -438,6 +442,7 @@ files:
|
|
438
442
|
- spec/support/fixtures/delete_list/delete_list_customers_with_errors.xml
|
439
443
|
- spec/support/fixtures/get/get_customer.xml
|
440
444
|
- spec/support/fixtures/get/get_invoice.xml
|
445
|
+
- spec/support/fixtures/get_deleted/get_deleted_invoices.xml
|
441
446
|
- spec/support/fixtures/initialize/initialize_invoice_from_customer.xml
|
442
447
|
- spec/support/fixtures/login/failure_concurrent_requests.xml
|
443
448
|
- spec/support/fixtures/login/failure_invalid_credentials.xml
|
@@ -486,6 +491,7 @@ test_files:
|
|
486
491
|
- spec/netsuite/actions/add_spec.rb
|
487
492
|
- spec/netsuite/actions/delete_list_spec.rb
|
488
493
|
- spec/netsuite/actions/delete_spec.rb
|
494
|
+
- spec/netsuite/actions/get_deleted_spec.rb
|
489
495
|
- spec/netsuite/actions/get_list_spec.rb
|
490
496
|
- spec/netsuite/actions/get_spec.rb
|
491
497
|
- spec/netsuite/actions/initialize_spec.rb
|
@@ -611,6 +617,7 @@ test_files:
|
|
611
617
|
- spec/netsuite/support/records_spec.rb
|
612
618
|
- spec/netsuite/support/requests_spec.rb
|
613
619
|
- spec/netsuite/support/sublist_spec.rb
|
620
|
+
- spec/netsuite/utilities/data_center_spec.rb
|
614
621
|
- spec/netsuite/utilities/request_spec.rb
|
615
622
|
- spec/netsuite/utilities/roles_spec.rb
|
616
623
|
- spec/netsuite/utilities_spec.rb
|
@@ -628,6 +635,7 @@ test_files:
|
|
628
635
|
- spec/support/fixtures/delete_list/delete_list_customers_with_errors.xml
|
629
636
|
- spec/support/fixtures/get/get_customer.xml
|
630
637
|
- spec/support/fixtures/get/get_invoice.xml
|
638
|
+
- spec/support/fixtures/get_deleted/get_deleted_invoices.xml
|
631
639
|
- spec/support/fixtures/initialize/initialize_invoice_from_customer.xml
|
632
640
|
- spec/support/fixtures/login/failure_concurrent_requests.xml
|
633
641
|
- spec/support/fixtures/login/failure_invalid_credentials.xml
|