diff --git a/bin/rspec b/bin/rspec new file mode 100755 index 000000000..a6c78521d --- /dev/null +++ b/bin/rspec @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rspec' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "pathname" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", + Pathname.new(__FILE__).realpath) + +bundle_binstub = File.expand_path("../bundle", __FILE__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rspec-core", "rspec") diff --git a/lib/netsuite.rb b/lib/netsuite.rb index dbe6b3eb1..baff263f0 100644 --- a/lib/netsuite.rb +++ b/lib/netsuite.rb @@ -191,11 +191,18 @@ module Records autoload :Invoice, 'netsuite/records/invoice' autoload :InvoiceItem, 'netsuite/records/invoice_item' autoload :InvoiceItemList, 'netsuite/records/invoice_item_list' + autoload :ItemAvailability, 'netsuite/records/item_availability' autoload :ItemFulfillment, 'netsuite/records/item_fulfillment' autoload :ItemFulfillmentItem, 'netsuite/records/item_fulfillment_item' autoload :ItemFulfillmentItemList, 'netsuite/records/item_fulfillment_item_list' autoload :ItemFulfillmentPackage, 'netsuite/records/item_fulfillment_package' autoload :ItemFulfillmentPackageList, 'netsuite/records/item_fulfillment_package_list' + autoload :ItemFulfillmentPackageFedEx, 'netsuite/records/item_fulfillment_package_fed_ex' + autoload :ItemFulfillmentPackageUps, 'netsuite/records/item_fulfillment_package_ups' + autoload :ItemFulfillmentPackageUsps, 'netsuite/records/item_fulfillment_package_usps' + autoload :ItemFulfillmentPackageFedExList, 'netsuite/records/item_fulfillment_package_fed_ex_list' + autoload :ItemFulfillmentPackageUpsList, 'netsuite/records/item_fulfillment_package_ups_list' + autoload :ItemFulfillmentPackageUspsList, 'netsuite/records/item_fulfillment_package_usps_list' autoload :ItemGroup, 'netsuite/records/item_group' autoload :ItemMember, 'netsuite/records/item_member' autoload :ItemMemberList, 'netsuite/records/item_member_list' diff --git a/lib/netsuite/actions/get_select_value.rb b/lib/netsuite/actions/get_select_value.rb index f4938f7b2..15147e086 100644 --- a/lib/netsuite/actions/get_select_value.rb +++ b/lib/netsuite/actions/get_select_value.rb @@ -25,7 +25,7 @@ def success? end def response_body - @response_body ||= response_hash[:base_ref_list] + @response_body ||= response_hash[:base_ref_list] || {base_ref: []} end def response_hash diff --git a/lib/netsuite/configuration.rb b/lib/netsuite/configuration.rb index 936cbb247..1a8dc1bd1 100644 --- a/lib/netsuite/configuration.rb +++ b/lib/netsuite/configuration.rb @@ -11,7 +11,7 @@ def reset! end def attributes - @attributes ||= {} + Thread.current[:netsuite_configuration] ||= {} end def connection(params={}, credentials={}) @@ -21,7 +21,7 @@ def connection(params={}, credentials={}) read_timeout: read_timeout, open_timeout: open_timeout, namespaces: namespaces, - soap_header: auth_header(credentials).update(soap_header), + soap_header: auth_header(credentials).merge(soap_header), pretty_print_xml: true, filters: filters, logger: logger, @@ -50,11 +50,12 @@ def filters=(list) end def wsdl_cache - @wsdl_cache ||= {} + Thread.current[:netsuite_wsdl_cache] ||= {} + end def clear_wsdl_cache - @wsdl_cache = {} + Thread.current[:netsuite_wsdl_cache] = {} end def cached_wsdl @@ -185,6 +186,18 @@ def auth_header(credentials={}) token_auth(credentials) else user_auth(credentials) + end.merge(application_info_header(credentials)) + end + + def application_info_header(credentials={}) + if credentials[:application_id].blank? + {} + else + { + 'platformMsgs:ApplicationInfo' => { + 'platformMsgs:applicationId' => credentials[:application_id] + } + } end end diff --git a/lib/netsuite/records/item_availability.rb b/lib/netsuite/records/item_availability.rb new file mode 100644 index 000000000..2e42ae1bc --- /dev/null +++ b/lib/netsuite/records/item_availability.rb @@ -0,0 +1,51 @@ +module NetSuite + module Records + class ItemAvailability + include Support::Fields + include Support::RecordRefs + include Support::Records + + field :item, InventoryItem + field :location_id, Location + alias_method :location, :location_id + + field :quantity_on_hand + field :on_hand_value_mli + field :reorder_point + field :quantity_on_order + field :quantity_committed + field :quantity_available + + def initialize(attributes = {}) + initialize_from_attributes_hash(attributes) + end + + def self.get_for_inventory_items(items, credentials={}) + ref_list = NetSuite::Records::RecordRefList.new( + record_ref: items.map do |item| + {internal_id: item.internal_id} + end + ) + connection = NetSuite::Configuration.connection({}, credentials) + response = connection.call :get_item_availability, message: { + "platformMsgs:itemAvailabilityFilter" => { + "platformCore:item" => ref_list.to_record + } + } + return false unless response.success? + + result = response.body[:get_item_availability_response][:get_item_availability_result] + unless result[:status][:@is_success] == "true" + return false + end + if result[:item_availability_list] + result[:item_availability_list][:item_availability].map do |row| + NetSuite::Records::ItemAvailability.new(row) + end + else + [] + end + end + end + end +end diff --git a/lib/netsuite/records/item_fulfillment.rb b/lib/netsuite/records/item_fulfillment.rb index b903c7f23..ed9265afd 100644 --- a/lib/netsuite/records/item_fulfillment.rb +++ b/lib/netsuite/records/item_fulfillment.rb @@ -26,6 +26,9 @@ class ItemFulfillment field :item_list, ItemFulfillmentItemList field :package_list, ItemFulfillmentPackageList + field :package_fed_ex_list, ItemFulfillmentPackageFedExList + field :package_ups_list, ItemFulfillmentPackageUpsList + field :package_usps_list, ItemFulfillmentPackageUspsList field :custom_field_list, CustomFieldList attr_reader :internal_id diff --git a/lib/netsuite/records/item_fulfillment_package_fed_ex.rb b/lib/netsuite/records/item_fulfillment_package_fed_ex.rb new file mode 100644 index 000000000..48e8f1446 --- /dev/null +++ b/lib/netsuite/records/item_fulfillment_package_fed_ex.rb @@ -0,0 +1,28 @@ +module NetSuite + module Records + class ItemFulfillmentPackageFedEx + include Support::Fields + include Support::Records + include Namespaces::TranSales + + fields :authorization_number_fed_ex, :cod_amount_fed_ex, :dry_ice_weight_fed_ex, :insured_value_fed_ex, :is_alcohol_fed_ex, + :is_non_haz_lithium_fed_ex, :is_non_standard_container_fed_ex, :package_height_fed_ex, :package_length_fed_ex, + :package_tracking_number_fed_ex, :package_weight_fed_ex, :package_width_fed_ex, :priority_alert_content_fed_ex, + :reference1_fed_ex, :signature_releasefed_ex, :use_cod_fed_ex, :use_insured_value_fed_ex + + + def initialize(attributes_or_record = {}) + case attributes_or_record + when Hash + initialize_from_attributes_hash(attributes_or_record) + when self.class + initialize_from_record(attributes_or_record) + end + end + + def initialize_from_record(record) + self.attributes = record.send(:attributes) + end + end + end +end diff --git a/lib/netsuite/records/item_fulfillment_package_fed_ex_list.rb b/lib/netsuite/records/item_fulfillment_package_fed_ex_list.rb new file mode 100644 index 000000000..070f97b13 --- /dev/null +++ b/lib/netsuite/records/item_fulfillment_package_fed_ex_list.rb @@ -0,0 +1,32 @@ +module NetSuite + module Records + class ItemFulfillmentPackageFedExList + include Support::Fields + include Support::Records + include Namespaces::TranSales + + fields :package_fed_ex + + def initialize(attributes = {}) + initialize_from_attributes_hash(attributes) + end + + def package_fed_ex=(packages) + case packages + when Hash + self.packages << ItemFulfillmentPackageFedEx.new(packages) + when Array + packages.each { |package| self.packages << ItemFulfillmentPackageFedEx.new(package) } + end + end + + def packages + @packages ||= [] + end + + def to_record + { "#{record_namespace}:packageFedEx" => packages.map(&:to_record) } + end + end + end +end diff --git a/lib/netsuite/records/item_fulfillment_package_ups.rb b/lib/netsuite/records/item_fulfillment_package_ups.rb new file mode 100644 index 000000000..235292080 --- /dev/null +++ b/lib/netsuite/records/item_fulfillment_package_ups.rb @@ -0,0 +1,27 @@ +module NetSuite + module Records + class ItemFulfillmentPackageUps + include Support::Fields + include Support::Records + include Namespaces::TranSales + + fields :additional_handling_ups, :cod_amount_ups, :cod_method_ups, :delivery_conf_ups, :insured_value_ups, :package_descr_ups, + :package_height_ups, :package_length_ups, :package_tracking_number_ups, :package_weight_ups, :package_width_ups, + :packaging_ups, :reference1_ups, :reference2_ups, :use_cod_ups + + + def initialize(attributes_or_record = {}) + case attributes_or_record + when Hash + initialize_from_attributes_hash(attributes_or_record) + when self.class + initialize_from_record(attributes_or_record) + end + end + + def initialize_from_record(record) + self.attributes = record.send(:attributes) + end + end + end +end diff --git a/lib/netsuite/records/item_fulfillment_package_ups_list.rb b/lib/netsuite/records/item_fulfillment_package_ups_list.rb new file mode 100644 index 000000000..22b0455d4 --- /dev/null +++ b/lib/netsuite/records/item_fulfillment_package_ups_list.rb @@ -0,0 +1,32 @@ +module NetSuite + module Records + class ItemFulfillmentPackageUpsList + include Support::Fields + include Support::Records + include Namespaces::TranSales + + fields :package_ups + + def initialize(attributes = {}) + initialize_from_attributes_hash(attributes) + end + + def package_ups=(packages) + case packages + when Hash + self.packages << ItemFulfillmentPackageUps.new(packages) + when Array + packages.each { |package| self.packages << ItemFulfillmentPackageUps.new(package) } + end + end + + def packages + @packages ||= [] + end + + def to_record + { "#{record_namespace}:packageUps" => packages.map(&:to_record) } + end + end + end +end diff --git a/lib/netsuite/records/item_fulfillment_package_usps.rb b/lib/netsuite/records/item_fulfillment_package_usps.rb new file mode 100644 index 000000000..e8df42da1 --- /dev/null +++ b/lib/netsuite/records/item_fulfillment_package_usps.rb @@ -0,0 +1,26 @@ +module NetSuite + module Records + class ItemFulfillmentPackageUsps + include Support::Fields + include Support::Records + include Namespaces::TranSales + + fields :insured_value_usps, :package_descr_usps, :package_height_usps, :package_length_usps, + :package_tracking_number_usps, :package_weight_usps, :package_width_usps, :reference1_usps, :reference2_usps, :use_insured_value_usps + + + def initialize(attributes_or_record = {}) + case attributes_or_record + when Hash + initialize_from_attributes_hash(attributes_or_record) + when self.class + initialize_from_record(attributes_or_record) + end + end + + def initialize_from_record(record) + self.attributes = record.send(:attributes) + end + end + end +end diff --git a/lib/netsuite/records/item_fulfillment_package_usps_list.rb b/lib/netsuite/records/item_fulfillment_package_usps_list.rb new file mode 100644 index 000000000..0daa01622 --- /dev/null +++ b/lib/netsuite/records/item_fulfillment_package_usps_list.rb @@ -0,0 +1,32 @@ +module NetSuite + module Records + class ItemFulfillmentPackageUspsList + include Support::Fields + include Support::Records + include Namespaces::TranSales + + fields :package_usps + + def initialize(attributes = {}) + initialize_from_attributes_hash(attributes) + end + + def package_usps=(packages) + case packages + when Hash + self.packages << ItemFulfillmentPackageUsps.new(packages) + when Array + packages.each { |package| self.packages << ItemFulfillmentPackageUsps.new(package) } + end + end + + def packages + @packages ||= [] + end + + def to_record + { "#{record_namespace}:packageUsps" => packages.map(&:to_record) } + end + end + end +end diff --git a/lib/netsuite/records/sales_order_item.rb b/lib/netsuite/records/sales_order_item.rb index 0b659a5ea..2a8a09c11 100644 --- a/lib/netsuite/records/sales_order_item.rb +++ b/lib/netsuite/records/sales_order_item.rb @@ -17,7 +17,8 @@ class SalesOrderItem :rev_rec_start_date, :rev_rec_term_in_months, :serial_numbers, :shipping_cost, :tax1_amt, :tax_rate1, :tax_rate2, :vsoe_allocation, :vsoe_amount, :vsoe_deferral, - :vsoe_delivered, :vsoe_permit_discount, :vsoe_price + :vsoe_delivered, :vsoe_permit_discount, :vsoe_price, + :ship_group field :custom_field_list, CustomFieldList diff --git a/lib/netsuite/utilities.rb b/lib/netsuite/utilities.rb index 7708857cd..b0cc1c982 100644 --- a/lib/netsuite/utilities.rb +++ b/lib/netsuite/utilities.rb @@ -177,6 +177,7 @@ def get_item(ns_item_internal_id, opts = {}) ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ServiceResaleItem, ns_item_internal_id, opts) ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::GiftCertificateItem, ns_item_internal_id, opts) ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::KitItem, ns_item_internal_id, opts) + ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::ItemGroup, ns_item_internal_id, opts) ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedInventoryItem, ns_item_internal_id, opts) ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::SerializedAssemblyItem, ns_item_internal_id, opts) ns_item ||= NetSuite::Utilities.get_record(NetSuite::Records::LotNumberedAssemblyItem, ns_item_internal_id, opts) diff --git a/lib/netsuite/version.rb b/lib/netsuite/version.rb index ecf1526e5..68d9365d5 100644 --- a/lib/netsuite/version.rb +++ b/lib/netsuite/version.rb @@ -1,3 +1,3 @@ module NetSuite - VERSION = '0.8.12' + VERSION = '0.10.0' end diff --git a/netsuite.gemspec b/netsuite.gemspec index 9102e627f..c4e954f62 100644 --- a/netsuite.gemspec +++ b/netsuite.gemspec @@ -20,5 +20,5 @@ Gem::Specification.new do |gem| gem.add_dependency 'savon', '>= 2.3.0' gem.add_development_dependency 'rspec', '~> 3.11.0' - gem.add_development_dependency 'rake', '~> 12.3.3' + gem.add_development_dependency 'rake', '~> 13.0.6' end diff --git a/spec/netsuite/records/item_fulfillment_package_fed_ex_list_spec.rb b/spec/netsuite/records/item_fulfillment_package_fed_ex_list_spec.rb new file mode 100644 index 000000000..165ac3dae --- /dev/null +++ b/spec/netsuite/records/item_fulfillment_package_fed_ex_list_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe NetSuite::Records::ItemFulfillmentPackageFedExList do + let(:list) { NetSuite::Records::ItemFulfillmentPackageFedExList.new } + + it 'has a packages attribute' do + expect(list.packages).to be_kind_of(Array) + end + + describe '#to_record' do + before do + list.packages << NetSuite::Records::ItemFulfillmentPackageFedEx.new( + :package_tracking_number_fed_ex => '1Z12354645757686786' + ) + end + + it 'can represent itself as a SOAP record' do + record = { + 'tranSales:packageFedEx' => [ + 'tranSales:packageTrackingNumberFedEx' => '1Z12354645757686786' + ] + } + + expect(list.to_record).to eql(record) + end + end +end diff --git a/spec/netsuite/records/item_fulfillment_package_ups_list_spec.rb b/spec/netsuite/records/item_fulfillment_package_ups_list_spec.rb new file mode 100644 index 000000000..d98473551 --- /dev/null +++ b/spec/netsuite/records/item_fulfillment_package_ups_list_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe NetSuite::Records::ItemFulfillmentPackageUpsList do + let(:list) { NetSuite::Records::ItemFulfillmentPackageUpsList.new } + + it 'has a packages attribute' do + expect(list.packages).to be_kind_of(Array) + end + + describe '#to_record' do + before do + list.packages << NetSuite::Records::ItemFulfillmentPackageUps.new( + :package_tracking_number_ups => '1Z12354645757686786' + ) + end + + it 'can represent itself as a SOAP record' do + record = { + 'tranSales:packageUps' => [ + 'tranSales:packageTrackingNumberUps' => '1Z12354645757686786' + ] + } + + expect(list.to_record).to eql(record) + end + end +end diff --git a/spec/netsuite/records/item_fulfillment_package_usps_list_spec.rb b/spec/netsuite/records/item_fulfillment_package_usps_list_spec.rb new file mode 100644 index 000000000..1a9516cbd --- /dev/null +++ b/spec/netsuite/records/item_fulfillment_package_usps_list_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe NetSuite::Records::ItemFulfillmentPackageUspsList do + let(:list) { NetSuite::Records::ItemFulfillmentPackageUspsList.new } + + it 'has a packages attribute' do + expect(list.packages).to be_kind_of(Array) + end + + describe '#to_record' do + before do + list.packages << NetSuite::Records::ItemFulfillmentPackageUsps.new( + :package_tracking_number_usps => '1Z12354645757686786' + ) + end + + it 'can represent itself as a SOAP record' do + record = { + 'tranSales:packageUsps' => [ + 'tranSales:packageTrackingNumberUsps' => '1Z12354645757686786' + ] + } + + expect(list.to_record).to eql(record) + end + end +end