netsuite 0.8.12 → 0.9.1
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/.github/workflows/codeql-analysis.yml +3 -3
- data/Gemfile +7 -0
- data/HISTORY.md +24 -0
- data/README.md +26 -0
- data/lib/netsuite/actions/add.rb +2 -1
- data/lib/netsuite/actions/delete.rb +17 -0
- data/lib/netsuite/configuration.rb +37 -4
- data/lib/netsuite/records/assembly_item.rb +2 -1
- data/lib/netsuite/records/customer.rb +225 -23
- data/lib/netsuite/records/customer_refund.rb +1 -1
- data/lib/netsuite/records/description_item.rb +1 -1
- data/lib/netsuite/records/discount_item.rb +1 -1
- data/lib/netsuite/records/file.rb +1 -1
- data/lib/netsuite/records/gift_certificate_item.rb +1 -1
- data/lib/netsuite/records/item_availability.rb +46 -0
- data/lib/netsuite/records/item_fulfillment.rb +4 -1
- data/lib/netsuite/records/item_fulfillment_package_fed_ex.rb +28 -0
- data/lib/netsuite/records/item_fulfillment_package_fed_ex_list.rb +32 -0
- data/lib/netsuite/records/item_fulfillment_package_ups.rb +27 -0
- data/lib/netsuite/records/item_fulfillment_package_ups_list.rb +32 -0
- data/lib/netsuite/records/item_fulfillment_package_usps.rb +26 -0
- data/lib/netsuite/records/item_fulfillment_package_usps_list.rb +32 -0
- data/lib/netsuite/records/item_group.rb +1 -1
- data/lib/netsuite/records/kit_item.rb +1 -1
- data/lib/netsuite/records/lot_numbered_assembly_item.rb +1 -1
- data/lib/netsuite/records/non_inventory_purchase_item.rb +1 -1
- data/lib/netsuite/records/non_inventory_resale_item.rb +1 -1
- data/lib/netsuite/records/non_inventory_sale_item.rb +1 -1
- data/lib/netsuite/records/other_charge_sale_item.rb +1 -1
- data/lib/netsuite/records/payment_item.rb +1 -1
- data/lib/netsuite/records/sales_order.rb +1 -0
- data/lib/netsuite/records/sales_order_item.rb +2 -1
- data/lib/netsuite/records/serialized_assembly_item.rb +1 -1
- data/lib/netsuite/records/serialized_inventory_item.rb +1 -1
- data/lib/netsuite/records/service_resale_item.rb +1 -1
- data/lib/netsuite/records/service_sale_item.rb +1 -1
- data/lib/netsuite/records/{customer_subscription.rb → subscription.rb} +1 -1
- data/lib/netsuite/records/subscriptions_list.rb +10 -0
- data/lib/netsuite/records/subtotal_item.rb +1 -1
- data/lib/netsuite/support/sublist.rb +1 -1
- data/lib/netsuite/utilities.rb +35 -13
- data/lib/netsuite/version.rb +1 -1
- data/lib/netsuite.rb +9 -2
- data/netsuite.gemspec +6 -3
- data/spec/netsuite/actions/add_spec.rb +4 -2
- data/spec/netsuite/actions/delete_spec.rb +74 -14
- data/spec/netsuite/actions/get_select_value_spec.rb +43 -0
- data/spec/netsuite/configuration_spec.rb +62 -3
- data/spec/netsuite/records/customer_spec.rb +287 -20
- data/spec/netsuite/records/item_availability_spec.rb +59 -0
- data/spec/netsuite/records/item_fulfillment_package_fed_ex_list_spec.rb +27 -0
- data/spec/netsuite/records/item_fulfillment_package_ups_list_spec.rb +27 -0
- data/spec/netsuite/records/item_fulfillment_package_usps_list_spec.rb +27 -0
- data/spec/netsuite/records/sales_order_item_spec.rb +4 -3
- data/spec/netsuite/records/sales_order_spec.rb +17 -0
- data/spec/netsuite/records/{customer_subscription_spec.rb → subscription_spec.rb} +2 -2
- data/spec/netsuite/records/{customer_subscriptions_list_spec.rb → subscriptions_list_spec.rb} +2 -2
- data/spec/support/fixtures/add/add_invoice.xml +9 -5
- data/spec/support/fixtures/delete/delete_customer_error.xml +21 -0
- data/spec/support/fixtures/delete/delete_customer_multiple_errors.xml +25 -0
- data/spec/support/fixtures/get_item_availability/get_item_availability.xml +46 -0
- data/spec/support/fixtures/get_select_value/empty_result.xml +22 -0
- data/spec/support/fixtures/get_select_value/item_fulfillment_ship_method.xml +43 -0
- metadata +46 -9
- data/lib/netsuite/records/customer_subscriptions_list.rb +0 -10
@@ -0,0 +1,32 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class ItemFulfillmentPackageFedExList
|
4
|
+
include Support::Fields
|
5
|
+
include Support::Records
|
6
|
+
include Namespaces::TranSales
|
7
|
+
|
8
|
+
fields :package_fed_ex
|
9
|
+
|
10
|
+
def initialize(attributes = {})
|
11
|
+
initialize_from_attributes_hash(attributes)
|
12
|
+
end
|
13
|
+
|
14
|
+
def package_fed_ex=(packages)
|
15
|
+
case packages
|
16
|
+
when Hash
|
17
|
+
self.packages << ItemFulfillmentPackageFedEx.new(packages)
|
18
|
+
when Array
|
19
|
+
packages.each { |package| self.packages << ItemFulfillmentPackageFedEx.new(package) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def packages
|
24
|
+
@packages ||= []
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_record
|
28
|
+
{ "#{record_namespace}:packageFedEx" => packages.map(&:to_record) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class ItemFulfillmentPackageUps
|
4
|
+
include Support::Fields
|
5
|
+
include Support::Records
|
6
|
+
include Namespaces::TranSales
|
7
|
+
|
8
|
+
fields :additional_handling_ups, :cod_amount_ups, :cod_method_ups, :delivery_conf_ups, :insured_value_ups, :package_descr_ups,
|
9
|
+
:package_height_ups, :package_length_ups, :package_tracking_number_ups, :package_weight_ups, :package_width_ups,
|
10
|
+
:packaging_ups, :reference1_ups, :reference2_ups, :use_cod_ups
|
11
|
+
|
12
|
+
|
13
|
+
def initialize(attributes_or_record = {})
|
14
|
+
case attributes_or_record
|
15
|
+
when Hash
|
16
|
+
initialize_from_attributes_hash(attributes_or_record)
|
17
|
+
when self.class
|
18
|
+
initialize_from_record(attributes_or_record)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize_from_record(record)
|
23
|
+
self.attributes = record.send(:attributes)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class ItemFulfillmentPackageUpsList
|
4
|
+
include Support::Fields
|
5
|
+
include Support::Records
|
6
|
+
include Namespaces::TranSales
|
7
|
+
|
8
|
+
fields :package_ups
|
9
|
+
|
10
|
+
def initialize(attributes = {})
|
11
|
+
initialize_from_attributes_hash(attributes)
|
12
|
+
end
|
13
|
+
|
14
|
+
def package_ups=(packages)
|
15
|
+
case packages
|
16
|
+
when Hash
|
17
|
+
self.packages << ItemFulfillmentPackageUps.new(packages)
|
18
|
+
when Array
|
19
|
+
packages.each { |package| self.packages << ItemFulfillmentPackageUps.new(package) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def packages
|
24
|
+
@packages ||= []
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_record
|
28
|
+
{ "#{record_namespace}:packageUps" => packages.map(&:to_record) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class ItemFulfillmentPackageUsps
|
4
|
+
include Support::Fields
|
5
|
+
include Support::Records
|
6
|
+
include Namespaces::TranSales
|
7
|
+
|
8
|
+
fields :insured_value_usps, :package_descr_usps, :package_height_usps, :package_length_usps,
|
9
|
+
:package_tracking_number_usps, :package_weight_usps, :package_width_usps, :reference1_usps, :reference2_usps, :use_insured_value_usps
|
10
|
+
|
11
|
+
|
12
|
+
def initialize(attributes_or_record = {})
|
13
|
+
case attributes_or_record
|
14
|
+
when Hash
|
15
|
+
initialize_from_attributes_hash(attributes_or_record)
|
16
|
+
when self.class
|
17
|
+
initialize_from_record(attributes_or_record)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize_from_record(record)
|
22
|
+
self.attributes = record.send(:attributes)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class ItemFulfillmentPackageUspsList
|
4
|
+
include Support::Fields
|
5
|
+
include Support::Records
|
6
|
+
include Namespaces::TranSales
|
7
|
+
|
8
|
+
fields :package_usps
|
9
|
+
|
10
|
+
def initialize(attributes = {})
|
11
|
+
initialize_from_attributes_hash(attributes)
|
12
|
+
end
|
13
|
+
|
14
|
+
def package_usps=(packages)
|
15
|
+
case packages
|
16
|
+
when Hash
|
17
|
+
self.packages << ItemFulfillmentPackageUsps.new(packages)
|
18
|
+
when Array
|
19
|
+
packages.each { |package| self.packages << ItemFulfillmentPackageUsps.new(package) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def packages
|
24
|
+
@packages ||= []
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_record
|
28
|
+
{ "#{record_namespace}:packageUsps" => packages.map(&:to_record) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
|
11
11
|
|
12
12
|
fields :available_to_partners, :created_date, :description, :display_name, :include_children, :include_start_end_lines,
|
13
13
|
:is_inactive, :is_vsoe_bundle, :item_id, :last_modified_date, :print_items, :upc_code, :vendor_name
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
|
11
11
|
|
12
12
|
fields :available_to_partners, :cost_estimate, :created_date, :defer_rev_rec, :description, :display_name,
|
13
13
|
:dont_show_price, :enforce_min_qty_internally, :exclude_from_sitemap, :featured_description, :handling_cost,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :get_select_value, :add, :delete, :update, :upsert, :upsert_list, :search
|
10
|
+
actions :get, :get_deleted, :get_list, :get_select_value, :add, :delete, :update, :update_list, :upsert, :upsert_list, :search
|
11
11
|
|
12
12
|
fields :auto_lead_time, :auto_preferred_stock_level, :auto_reorder_point, :available_to_partners, :average_cost, :build_entire_assembly,
|
13
13
|
:copy_description, :cost, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :cost_units, :costing_method,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update_list, :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,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :upsert, :update
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :upsert, :update, :update_list
|
11
11
|
|
12
12
|
fields :amortization_period,
|
13
13
|
:available_to_partners,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
|
11
11
|
|
12
12
|
fields :available_to_partners,
|
13
13
|
:contingent_revenue_handling,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :update, :delete, :upsert, :search
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :update, :update_list, :delete, :upsert, :search
|
11
11
|
|
12
12
|
attr_reader :internal_id
|
13
13
|
attr_accessor :external_id
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
|
11
11
|
|
12
12
|
fields :available_to_partners, :created_date, :description, :display_name, :include_children, :is_inactive, :item_id, :last_modified_date, :undep_funds
|
13
13
|
|
@@ -33,6 +33,7 @@ module NetSuite
|
|
33
33
|
field :gift_cert_redemption_list, GiftCertRedemptionList
|
34
34
|
field :ship_group_list, SalesOrderShipGroupList
|
35
35
|
field :promotions_list, PromotionsList
|
36
|
+
field :null_field_list, NullFieldList
|
36
37
|
|
37
38
|
read_only_fields :applied, :discount_total, :sub_total, :tax_total, :total, :unapplied,
|
38
39
|
:est_gross_profit_percent
|
@@ -17,7 +17,8 @@ module NetSuite
|
|
17
17
|
:rev_rec_start_date, :rev_rec_term_in_months, :serial_numbers,
|
18
18
|
:shipping_cost, :tax1_amt, :tax_rate1, :tax_rate2,
|
19
19
|
:vsoe_allocation, :vsoe_amount, :vsoe_deferral,
|
20
|
-
:vsoe_delivered, :vsoe_permit_discount, :vsoe_price
|
20
|
+
:vsoe_delivered, :vsoe_permit_discount, :vsoe_price,
|
21
|
+
:ship_group
|
21
22
|
|
22
23
|
field :custom_field_list, CustomFieldList
|
23
24
|
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
|
11
11
|
|
12
12
|
fields :alternate_demand_source_item,
|
13
13
|
:asset_account,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
|
11
11
|
|
12
12
|
record_refs :soft_descriptor,
|
13
13
|
:stock_unit,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :update, :delete, :upsert, :search
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :update, :update_list, :delete, :upsert, :search
|
11
11
|
|
12
12
|
fields :amortization_period,
|
13
13
|
:available_to_partners,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :update, :delete, :upsert, :search
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :update, :update_list, :delete, :upsert, :search
|
11
11
|
|
12
12
|
fields :available_to_partners, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :create_job, :created_date,
|
13
13
|
:display_name, :dont_show_price, :enforce_min_qty_internally, :exclude_from_sitemap, :featured_description,
|
@@ -7,7 +7,7 @@ module NetSuite
|
|
7
7
|
include Support::Actions
|
8
8
|
include Namespaces::ListAcct
|
9
9
|
|
10
|
-
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :upsert
|
10
|
+
actions :get, :get_deleted, :get_list, :add, :delete, :search, :update, :update_list, :upsert
|
11
11
|
|
12
12
|
fields :available_to_partners, :created_date, :description, :include_children, :is_inactive, :item_id, :last_modified_date
|
13
13
|
|
data/lib/netsuite/utilities.rb
CHANGED
@@ -7,11 +7,33 @@ module NetSuite
|
|
7
7
|
# TODO need structured logger for various statements
|
8
8
|
|
9
9
|
def clear_cache!
|
10
|
-
|
11
|
-
|
10
|
+
if NetSuite::Configuration.multi_tenant?
|
11
|
+
Thread.current[:netsuite_gem_netsuite_get_record_cache] = {}
|
12
|
+
Thread.current[:netsuite_gem_netsuite_find_record_cache] = {}
|
13
|
+
else
|
14
|
+
@netsuite_get_record_cache = {}
|
15
|
+
@netsuite_find_record_cache = {}
|
16
|
+
end
|
17
|
+
|
12
18
|
DataCenter.clear_cache!
|
13
19
|
end
|
14
20
|
|
21
|
+
def netsuite_get_record_cache
|
22
|
+
if NetSuite::Configuration.multi_tenant?
|
23
|
+
Thread.current[:netsuite_gem_netsuite_get_record_cache] ||= {}
|
24
|
+
else
|
25
|
+
@netsuite_get_record_cache ||= {}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def netsuite_find_record_cache
|
30
|
+
if NetSuite::Configuration.multi_tenant?
|
31
|
+
Thread.current[:netsuite_gem_netsuite_find_record_cache] ||= {}
|
32
|
+
else
|
33
|
+
@netsuite_find_record_cache ||= {}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
15
37
|
def append_memo(ns_record, added_memo, opts = {})
|
16
38
|
opts[:skip_if_exists] ||= false
|
17
39
|
|
@@ -103,6 +125,8 @@ module NetSuite
|
|
103
125
|
exceptions_to_retry << OpenSSL::SSL::SSLErrorWaitReadable if defined?(OpenSSL::SSL::SSLErrorWaitReadable)
|
104
126
|
|
105
127
|
# depends on the http library chosen
|
128
|
+
exceptions_to_retry << HTTPI::SSLError if defined?(HTTPI::SSLError)
|
129
|
+
exceptions_to_retry << HTTPI::TimeoutError if defined?(HTTPI::TimeoutError)
|
106
130
|
exceptions_to_retry << HTTPClient::TimeoutError if defined?(HTTPClient::TimeoutError)
|
107
131
|
exceptions_to_retry << HTTPClient::ConnectTimeoutError if defined?(HTTPClient::ConnectTimeoutError)
|
108
132
|
exceptions_to_retry << HTTPClient::ReceiveTimeoutError if defined?(HTTPClient::ReceiveTimeoutError)
|
@@ -177,6 +201,7 @@ module NetSuite
|
|
177
201
|
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ServiceResaleItem, ns_item_internal_id, opts)
|
178
202
|
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::GiftCertificateItem, ns_item_internal_id, opts)
|
179
203
|
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::KitItem, ns_item_internal_id, opts)
|
204
|
+
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ItemGroup, ns_item_internal_id, opts)
|
180
205
|
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedInventoryItem, ns_item_internal_id, opts)
|
181
206
|
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedAssemblyItem, ns_item_internal_id, opts)
|
182
207
|
ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::LotNumberedAssemblyItem, ns_item_internal_id, opts)
|
@@ -193,11 +218,10 @@ module NetSuite
|
|
193
218
|
opts[:external_id] ||= false
|
194
219
|
|
195
220
|
if opts[:cache]
|
196
|
-
|
197
|
-
@netsuite_get_record_cache[record_klass.to_s] ||= {}
|
221
|
+
netsuite_get_record_cache[record_klass.to_s] ||= {}
|
198
222
|
|
199
|
-
if
|
200
|
-
return
|
223
|
+
if netsuite_get_record_cache[record_klass.to_s].has_key?(id.to_i)
|
224
|
+
return netsuite_get_record_cache[record_klass.to_s][id.to_i]
|
201
225
|
end
|
202
226
|
end
|
203
227
|
|
@@ -211,14 +235,14 @@ module NetSuite
|
|
211
235
|
end
|
212
236
|
|
213
237
|
if opts[:cache]
|
214
|
-
|
238
|
+
netsuite_get_record_cache[record_klass.to_s][id.to_i] = ns_record
|
215
239
|
end
|
216
240
|
|
217
241
|
return ns_record
|
218
242
|
rescue ::NetSuite::RecordNotFound
|
219
243
|
# log.warn("record not found", ns_record_type: record_klass.name, ns_record_id: id)
|
220
244
|
if opts[:cache]
|
221
|
-
|
245
|
+
netsuite_get_record_cache[record_klass.to_s][id.to_i] = nil
|
222
246
|
end
|
223
247
|
|
224
248
|
return nil
|
@@ -233,10 +257,8 @@ module NetSuite
|
|
233
257
|
# FIXME: Records that have the same name but different types will break
|
234
258
|
# the cache
|
235
259
|
names.each do |name|
|
236
|
-
|
237
|
-
|
238
|
-
if @netsuite_find_record_cache.has_key?(name)
|
239
|
-
return @netsuite_find_record_cache[name]
|
260
|
+
if netsuite_find_record_cache.has_key?(name)
|
261
|
+
return netsuite_find_record_cache[name]
|
240
262
|
end
|
241
263
|
|
242
264
|
# sniff for an email-like input; useful for employee/customer searches
|
@@ -262,7 +284,7 @@ module NetSuite
|
|
262
284
|
}) }
|
263
285
|
|
264
286
|
if search.results.first
|
265
|
-
return
|
287
|
+
return netsuite_find_record_cache[name] = search.results.first
|
266
288
|
end
|
267
289
|
end
|
268
290
|
|
data/lib/netsuite/version.rb
CHANGED
data/lib/netsuite.rb
CHANGED
@@ -133,8 +133,6 @@ module NetSuite
|
|
133
133
|
autoload :CustomerRefundApplyList, 'netsuite/records/customer_refund_apply_list'
|
134
134
|
autoload :CustomerRefundDeposit, 'netsuite/records/customer_refund_deposit'
|
135
135
|
autoload :CustomerRefundDepositList, 'netsuite/records/customer_refund_deposit_list'
|
136
|
-
autoload :CustomerSubscription, 'netsuite/records/customer_subscription'
|
137
|
-
autoload :CustomerSubscriptionsList, 'netsuite/records/customer_subscriptions_list'
|
138
136
|
autoload :CustomerStatus, 'netsuite/records/customer_status'
|
139
137
|
autoload :CustomerPartner, 'netsuite/records/customer_partner'
|
140
138
|
autoload :CustomerSalesTeam, 'netsuite/records/customer_sales_team'
|
@@ -193,11 +191,18 @@ module NetSuite
|
|
193
191
|
autoload :Invoice, 'netsuite/records/invoice'
|
194
192
|
autoload :InvoiceItem, 'netsuite/records/invoice_item'
|
195
193
|
autoload :InvoiceItemList, 'netsuite/records/invoice_item_list'
|
194
|
+
autoload :ItemAvailability, 'netsuite/records/item_availability'
|
196
195
|
autoload :ItemFulfillment, 'netsuite/records/item_fulfillment'
|
197
196
|
autoload :ItemFulfillmentItem, 'netsuite/records/item_fulfillment_item'
|
198
197
|
autoload :ItemFulfillmentItemList, 'netsuite/records/item_fulfillment_item_list'
|
199
198
|
autoload :ItemFulfillmentPackage, 'netsuite/records/item_fulfillment_package'
|
200
199
|
autoload :ItemFulfillmentPackageList, 'netsuite/records/item_fulfillment_package_list'
|
200
|
+
autoload :ItemFulfillmentPackageFedEx, 'netsuite/records/item_fulfillment_package_fed_ex'
|
201
|
+
autoload :ItemFulfillmentPackageUps, 'netsuite/records/item_fulfillment_package_ups'
|
202
|
+
autoload :ItemFulfillmentPackageUsps, 'netsuite/records/item_fulfillment_package_usps'
|
203
|
+
autoload :ItemFulfillmentPackageFedExList, 'netsuite/records/item_fulfillment_package_fed_ex_list'
|
204
|
+
autoload :ItemFulfillmentPackageUpsList, 'netsuite/records/item_fulfillment_package_ups_list'
|
205
|
+
autoload :ItemFulfillmentPackageUspsList, 'netsuite/records/item_fulfillment_package_usps_list'
|
201
206
|
autoload :ItemGroup, 'netsuite/records/item_group'
|
202
207
|
autoload :ItemMember, 'netsuite/records/item_member'
|
203
208
|
autoload :ItemMemberList, 'netsuite/records/item_member_list'
|
@@ -271,6 +276,8 @@ module NetSuite
|
|
271
276
|
autoload :SerializedInventoryItemLocationsList, 'netsuite/records/serialized_inventory_item_locations_list'
|
272
277
|
autoload :ShipAddress, 'netsuite/records/ship_address'
|
273
278
|
autoload :SiteCategory, 'netsuite/records/site_category'
|
279
|
+
autoload :Subscription, 'netsuite/records/subscription'
|
280
|
+
autoload :SubscriptionsList, 'netsuite/records/subscriptions_list'
|
274
281
|
autoload :Subsidiary, 'netsuite/records/subsidiary'
|
275
282
|
autoload :SubtotalItem, 'netsuite/records/subtotal_item'
|
276
283
|
autoload :SupportCase, 'netsuite/records/support_case'
|
data/netsuite.gemspec
CHANGED
@@ -3,8 +3,8 @@ require File.expand_path('../lib/netsuite/version', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.licenses = ['MIT']
|
6
|
-
gem.authors = ['Ryan Moran', 'Michael Bianco']
|
7
|
-
gem.email = ['ryan.moran@gmail.com', 'mike@mikebian.co']
|
6
|
+
gem.authors = ['Ryan Moran', 'Michael Bianco', 'Chris Gunther']
|
7
|
+
gem.email = ['ryan.moran@gmail.com', 'mike@mikebian.co', 'chris@room118solutions.com']
|
8
8
|
gem.description = %q{NetSuite SuiteTalk API Wrapper}
|
9
9
|
gem.summary = %q{NetSuite SuiteTalk API (SOAP) Wrapper}
|
10
10
|
gem.homepage = 'https://github.com/NetSweet/netsuite'
|
@@ -15,9 +15,12 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.name = 'netsuite'
|
16
16
|
gem.require_paths = ['lib']
|
17
17
|
gem.version = NetSuite::VERSION
|
18
|
+
gem.required_ruby_version = '>= 2.1'
|
18
19
|
gem.metadata['changelog_uri'] = 'https://github.com/netsweet/netsuite/blob/master/HISTORY.md'
|
20
|
+
gem.metadata['mailing_list_uri'] = 'http://opensuite-slackin.herokuapp.com'
|
21
|
+
gem.metadata['rubygems_mfa_required'] = 'true'
|
19
22
|
|
20
|
-
gem.add_dependency 'savon', '>= 2.3.0'
|
23
|
+
gem.add_dependency 'savon', '>= 2.3.0', '!= 2.13.0'
|
21
24
|
|
22
25
|
gem.add_development_dependency 'rspec', '~> 3.11.0'
|
23
26
|
gem.add_development_dependency 'rake', '~> 12.3.3'
|
@@ -53,10 +53,11 @@ describe NetSuite::Actions::Add do
|
|
53
53
|
NetSuite::Actions::Add.call([invoice])
|
54
54
|
end
|
55
55
|
|
56
|
-
it 'returns a valid Response object' do
|
56
|
+
it 'returns a valid Response object with no errors' do
|
57
57
|
response = NetSuite::Actions::Add.call([invoice])
|
58
58
|
expect(response).to be_kind_of(NetSuite::Response)
|
59
59
|
expect(response).to be_success
|
60
|
+
expect(response.errors).to be_empty
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
@@ -136,10 +137,11 @@ describe NetSuite::Actions::Add do
|
|
136
137
|
NetSuite::Actions::Add.call([file])
|
137
138
|
end
|
138
139
|
|
139
|
-
it 'returns a valid Response object' do
|
140
|
+
it 'returns a valid Response object with no errors' do
|
140
141
|
response = NetSuite::Actions::Add.call([file])
|
141
142
|
expect(response).to be_kind_of(NetSuite::Response)
|
142
143
|
expect(response).to be_success
|
144
|
+
expect(response.errors).to be_empty
|
143
145
|
end
|
144
146
|
|
145
147
|
it 'properly extracts internal ID from response' do
|
@@ -9,24 +9,84 @@ describe NetSuite::Actions::Delete do
|
|
9
9
|
NetSuite::Records::Customer.new(:internal_id => '980', :entity_id => 'Shutter Fly', :company_name => 'Shutter Fly, Inc.')
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
'
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
context 'when successful' do
|
13
|
+
before do
|
14
|
+
savon.expects(:delete).with(:message => {
|
15
|
+
'platformMsgs:baseRef' => {
|
16
|
+
'@internalId' => '980',
|
17
|
+
'@type' => 'customer',
|
18
|
+
'@xsi:type' => 'platformCore:RecordRef'
|
19
|
+
},
|
20
|
+
}).returns(File.read('spec/support/fixtures/delete/delete_customer.xml'))
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'makes a valid request to the NetSuite API' do
|
24
|
+
NetSuite::Actions::Delete.call([customer])
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns a valid Response object' do
|
28
|
+
response = NetSuite::Actions::Delete.call([customer])
|
29
|
+
expect(response).to be_kind_of(NetSuite::Response)
|
30
|
+
expect(response).to be_success
|
31
|
+
end
|
20
32
|
end
|
21
33
|
|
22
|
-
|
23
|
-
|
34
|
+
context 'when not successful' do
|
35
|
+
before do
|
36
|
+
savon.expects(:delete).with(:message => {
|
37
|
+
'platformMsgs:baseRef' => {
|
38
|
+
'@xsi:type' => 'platformCore:RecordRef',
|
39
|
+
'@internalId' => '980',
|
40
|
+
'@type' => 'customer',
|
41
|
+
},
|
42
|
+
}).returns(File.read('spec/support/fixtures/delete/delete_customer_error.xml'))
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'provides an error method on the object with details about the error' do
|
46
|
+
customer.delete
|
47
|
+
error = customer.errors.first
|
48
|
+
|
49
|
+
expect(error).to be_kind_of(NetSuite::Error)
|
50
|
+
expect(error.type).to eq('ERROR')
|
51
|
+
expect(error.code).to eq('INSUFFICIENT_PERMISSION')
|
52
|
+
expect(error.message).to eq("Permission Violation: You need a higher level of the 'Lists -> Documents and Files' permission to access this page. Please contact your account administrator.")
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'provides an error method on the response' do
|
56
|
+
response = NetSuite::Actions::Delete.call([customer])
|
57
|
+
expect(response.errors.first).to be_kind_of(NetSuite::Error)
|
58
|
+
end
|
24
59
|
end
|
25
60
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
61
|
+
context 'when not successful with multiple errors' do
|
62
|
+
before do
|
63
|
+
savon.expects(:delete).with(:message => {
|
64
|
+
'platformMsgs:baseRef' => {
|
65
|
+
'@xsi:type' => 'platformCore:RecordRef',
|
66
|
+
'@internalId' => '980',
|
67
|
+
'@type' => 'customer',
|
68
|
+
},
|
69
|
+
}).returns(File.read('spec/support/fixtures/delete/delete_customer_multiple_errors.xml'))
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'provides an error method on the object with details about the error' do
|
73
|
+
customer.delete
|
74
|
+
expect(customer.errors.length).to eq(2)
|
75
|
+
|
76
|
+
error = customer.errors.first
|
77
|
+
|
78
|
+
expect(error).to be_kind_of(NetSuite::Error)
|
79
|
+
expect(error.type).to eq('ERROR')
|
80
|
+
expect(error.code).to eq('INSUFFICIENT_PERMISSION')
|
81
|
+
expect(error.message).to eq("Permission Violation: You need a higher level of the 'Lists -> Documents and Files' permission to access this page. Please contact your account administrator.")
|
82
|
+
|
83
|
+
error = customer.errors[1]
|
84
|
+
|
85
|
+
expect(error).to be_kind_of(NetSuite::Error)
|
86
|
+
expect(error.type).to eq('ERROR')
|
87
|
+
expect(error.code).to eq('SOMETHING_ELSE')
|
88
|
+
expect(error.message).to eq('Another error.')
|
89
|
+
end
|
30
90
|
end
|
31
91
|
end
|
32
92
|
|