netsuite 0.0.23 → 0.0.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/Rakefile +1 -2
  2. data/lib/netsuite.rb +35 -25
  3. data/lib/netsuite/records/account.rb +3 -9
  4. data/lib/netsuite/records/classification.rb +3 -9
  5. data/lib/netsuite/records/credit_memo.rb +3 -23
  6. data/lib/netsuite/records/custom_record.rb +5 -11
  7. data/lib/netsuite/records/custom_record_type.rb +3 -9
  8. data/lib/netsuite/records/customer.rb +3 -14
  9. data/lib/netsuite/records/customer_payment.rb +10 -25
  10. data/lib/netsuite/records/customer_refund.rb +31 -0
  11. data/lib/netsuite/records/customer_refund_apply.rb +16 -0
  12. data/lib/netsuite/records/customer_refund_apply_list.rb +27 -0
  13. data/lib/netsuite/records/customer_refund_deposit.rb +16 -0
  14. data/lib/netsuite/records/customer_refund_deposit_list.rb +28 -0
  15. data/lib/netsuite/records/inventory_item.rb +3 -14
  16. data/lib/netsuite/records/invoice.rb +3 -23
  17. data/lib/netsuite/records/job.rb +3 -14
  18. data/lib/netsuite/records/journal_entry.rb +3 -14
  19. data/lib/netsuite/records/location.rb +3 -9
  20. data/lib/netsuite/records/non_inventory_sale_item.rb +3 -9
  21. data/lib/netsuite/records/payment_method.rb +3 -9
  22. data/lib/netsuite/support/actions.rb +80 -0
  23. data/lib/netsuite/version.rb +1 -1
  24. data/lib/netsuite/xml_logger.rb +31 -0
  25. data/netsuite.gemspec +1 -0
  26. data/spec/netsuite/records/customer_refund_apply_list_spec.rb +27 -0
  27. data/spec/netsuite/records/customer_refund_apply_spec.rb +14 -0
  28. data/spec/netsuite/records/customer_refund_deposit_list_spec.rb +27 -0
  29. data/spec/netsuite/records/customer_refund_deposit_spec.rb +14 -0
  30. data/spec/netsuite/records/customer_refund_spec.rb +172 -0
  31. data/spec/netsuite/support/actions_spec.rb +5 -0
  32. metadata +43 -10
data/Rakefile CHANGED
@@ -12,7 +12,6 @@ end
12
12
 
13
13
  desc 'Generate code coverage'
14
14
  RSpec::Core::RakeTask.new(:coverage) do |t|
15
- t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
16
15
  t.rcov = true
17
- t.rcov_opts = ['--exclude', 'spec']
16
+ t.rcov_opts = ['--exclude', '/gems/,spec']
18
17
  end
@@ -2,6 +2,7 @@ require 'set'
2
2
 
3
3
  require 'netsuite/version'
4
4
  require 'netsuite/errors'
5
+ require 'netsuite/xml_logger'
5
6
 
6
7
  module NetSuite
7
8
  autoload :Configuration, 'netsuite/configuration'
@@ -19,6 +20,7 @@ module NetSuite
19
20
  end
20
21
 
21
22
  module Support
23
+ autoload :Actions, 'netsuite/support/actions'
22
24
  autoload :Attributes, 'netsuite/support/attributes'
23
25
  autoload :Fields, 'netsuite/support/fields'
24
26
  autoload :RecordRefs, 'netsuite/support/record_refs'
@@ -34,37 +36,45 @@ module NetSuite
34
36
  end
35
37
 
36
38
  module Records
37
- autoload :Account, 'netsuite/records/account'
38
- autoload :BillAddress, 'netsuite/records/bill_address'
39
- autoload :Classification, 'netsuite/records/classification'
40
- autoload :CreditMemo, 'netsuite/records/credit_memo'
41
- autoload :CustomField, 'netsuite/records/custom_field'
42
- autoload :CustomFieldList, 'netsuite/records/custom_field_list'
43
- autoload :CustomRecord, 'netsuite/records/custom_record'
44
- autoload :CustomRecordRef, 'netsuite/records/custom_record_ref'
45
- autoload :CustomRecordType, 'netsuite/records/custom_record_type'
46
- autoload :Customer, 'netsuite/records/customer'
47
- autoload :CustomerAddressbook, 'netsuite/records/customer_addressbook'
48
- autoload :CustomerAddressbookList, 'netsuite/records/customer_addressbook_list'
49
- autoload :CustomerPayment, 'netsuite/records/customer_payment'
50
- autoload :Duration, 'netsuite/records/duration'
51
- autoload :InventoryItem, 'netsuite/records/inventory_item'
52
- autoload :Invoice, 'netsuite/records/invoice'
53
- autoload :InvoiceItem, 'netsuite/records/invoice_item'
54
- autoload :InvoiceItemList, 'netsuite/records/invoice_item_list'
55
- autoload :Job, 'netsuite/records/job'
56
- autoload :JournalEntry, 'netsuite/records/journal_entry'
57
- autoload :JournalEntryLine, 'netsuite/records/journal_entry_line'
58
- autoload :JournalEntryLineList, 'netsuite/records/journal_entry_line_list'
59
- autoload :Location, 'netsuite/records/location'
60
- autoload :NonInventorySaleItem, 'netsuite/records/non_inventory_sale_item'
61
- autoload :PaymentMethod, 'netsuite/records/payment_method'
39
+ autoload :Account, 'netsuite/records/account'
40
+ autoload :BillAddress, 'netsuite/records/bill_address'
41
+ autoload :Classification, 'netsuite/records/classification'
42
+ autoload :CreditMemo, 'netsuite/records/credit_memo'
43
+ autoload :CustomField, 'netsuite/records/custom_field'
44
+ autoload :CustomFieldList, 'netsuite/records/custom_field_list'
45
+ autoload :CustomRecord, 'netsuite/records/custom_record'
46
+ autoload :CustomRecordRef, 'netsuite/records/custom_record_ref'
47
+ autoload :CustomRecordType, 'netsuite/records/custom_record_type'
48
+ autoload :Customer, 'netsuite/records/customer'
49
+ autoload :CustomerAddressbook, 'netsuite/records/customer_addressbook'
50
+ autoload :CustomerAddressbookList, 'netsuite/records/customer_addressbook_list'
51
+ autoload :CustomerPayment, 'netsuite/records/customer_payment'
52
+ autoload :CustomerRefund, 'netsuite/records/customer_refund'
53
+ autoload :CustomerRefundApply, 'netsuite/records/customer_refund_apply'
54
+ autoload :CustomerRefundApplyList, 'netsuite/records/customer_refund_apply_list'
55
+ autoload :CustomerRefundDeposit, 'netsuite/records/customer_refund_deposit'
56
+ autoload :CustomerRefundDepositList, 'netsuite/records/customer_refund_deposit_list'
57
+ autoload :Duration, 'netsuite/records/duration'
58
+ autoload :InventoryItem, 'netsuite/records/inventory_item'
59
+ autoload :Invoice, 'netsuite/records/invoice'
60
+ autoload :InvoiceItem, 'netsuite/records/invoice_item'
61
+ autoload :InvoiceItemList, 'netsuite/records/invoice_item_list'
62
+ autoload :Job, 'netsuite/records/job'
63
+ autoload :JournalEntry, 'netsuite/records/journal_entry'
64
+ autoload :JournalEntryLine, 'netsuite/records/journal_entry_line'
65
+ autoload :JournalEntryLineList, 'netsuite/records/journal_entry_line_list'
66
+ autoload :Location, 'netsuite/records/location'
67
+ autoload :NonInventorySaleItem, 'netsuite/records/non_inventory_sale_item'
68
+ autoload :PaymentMethod, 'netsuite/records/payment_method'
62
69
  autoload :RecordRef, 'netsuite/records/record_ref'
63
70
  autoload :ShipAddress, 'netsuite/records/ship_address'
64
71
  end
65
72
 
66
73
  def self.configure(&block)
67
74
  NetSuite::Configuration.instance_eval(&block)
75
+ Savon.configure do |config|
76
+ config.logger = NetSuite::XmlLogger.new(STDOUT)
77
+ end
68
78
  end
69
79
 
70
80
  end
@@ -3,6 +3,9 @@ module NetSuite
3
3
  class Account
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
+ include Support::Actions
7
+
8
+ actions :get
6
9
 
7
10
  fields :acct_name, :acct_number, :acct_type, :cash_flow_rate, :cur_doc_num, :description, :eliminate, :exchange_rate,
8
11
  :general_rate, :include_children, :inventory, :is_inactive, :opening_balance, :revalue, :tran_date
@@ -18,15 +21,6 @@ module NetSuite
18
21
  initialize_from_attributes_hash(attributes)
19
22
  end
20
23
 
21
- def self.get(options = {})
22
- response = Actions::Get.call(self, options)
23
- if response.success?
24
- new(response.body)
25
- else
26
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
27
- end
28
- end
29
-
30
24
  end
31
25
  end
32
26
  end
@@ -2,6 +2,9 @@ module NetSuite
2
2
  module Records
3
3
  class Classification
4
4
  include Support::Fields
5
+ include Support::Actions
6
+
7
+ actions :get
5
8
 
6
9
  fields :name, :include_children, :is_inactive, :class_translation_list, :subsidiary_list, :custom_field_list
7
10
 
@@ -14,15 +17,6 @@ module NetSuite
14
17
  initialize_from_attributes_hash(attributes)
15
18
  end
16
19
 
17
- def self.get(options = {})
18
- response = Actions::Get.call(self, options)
19
- if response.success?
20
- new(response.body)
21
- else
22
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
23
- end
24
- end
25
-
26
20
  end
27
21
  end
28
22
  end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::TranCust
8
9
 
10
+ actions :get, :add, :initialize
11
+
9
12
  fields :alt_handling_cost, :alt_shipping_cost, :amount_paid, :amount_remaining, :auto_apply, :balance,
10
13
  :bill_address, :contrib_pct, :created_date, :currency_name, :deferred_revenue, :discount_rate, :email,
11
14
  :est_gross_profit, :est_gross_profit_percent, :exchange_rate, :exclude_commission, :fax, :gift_cert_applied,
@@ -31,29 +34,6 @@ module NetSuite
31
34
  initialize_from_attributes_hash(attributes)
32
35
  end
33
36
 
34
- def self.get(options = {})
35
- response = Actions::Get.call(self, options)
36
- if response.success?
37
- new(response.body)
38
- else
39
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
40
- end
41
- end
42
-
43
- def self.initialize(object)
44
- response = Actions::Initialize.call(self, object)
45
- if response.success?
46
- new(response.body)
47
- else
48
- raise InitializationError, "#{self}.initialize with #{object} failed."
49
- end
50
- end
51
-
52
- def add
53
- response = Actions::Add.call(self)
54
- response.success?
55
- end
56
-
57
37
  end
58
38
  end
59
39
  end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::SetupCustom
8
9
 
10
+ actions :get, :add
11
+
9
12
  fields :allow_attachments, :allow_inline_editing, :allow_numbering_override, :allow_quick_search, :created,
10
13
  :custom_record_id, :description, :disclaimer, :enabl_email_merge, :enable_numbering, :include_name,
11
14
  :is_available_offline, :is_inactive, :is_numbering_updateable, :is_ordered, :last_modified, :name,
@@ -28,17 +31,8 @@ module NetSuite
28
31
 
29
32
  def self.get(options = {})
30
33
  options.merge!(:type_id => type_id) unless options[:type_id]
31
- response = Actions::Get.call(self, options.merge!(:custom => true))
32
- if response.success?
33
- new(response.body)
34
- else
35
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
36
- end
37
- end
38
-
39
- def add
40
- response = Actions::Add.call(self)
41
- response.success?
34
+ options.merge!(:custom => true)
35
+ super(options)
42
36
  end
43
37
 
44
38
  def self.type_id(id = nil)
@@ -3,6 +3,9 @@ module NetSuite
3
3
  class CustomRecordType
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
+ include Support::Actions
7
+
8
+ actions :get
6
9
 
7
10
  fields :allow_attachments, :allow_inline_editing, :allow_numbering_override, :allow_quick_search, :description,
8
11
  :disclaimer, :enable_mail_merge, :enable_numbering, :include_name, :is_available_offline, :is_inactive,
@@ -22,15 +25,6 @@ module NetSuite
22
25
  initialize_from_attributes_hash(attributes)
23
26
  end
24
27
 
25
- def self.get(options = {})
26
- response = Actions::Get.call(self, options)
27
- if response.success?
28
- new(response.body)
29
- else
30
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
31
- end
32
- end
33
-
34
28
  end
35
29
  end
36
30
  end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::ListRel
8
9
 
10
+ actions :get, :add
11
+
9
12
  fields :access_role, :account_number, :aging, :alt_email, :alt_name, :alt_phone, :bill_pay,
10
13
  :buying_reason, :buying_time_frame, :campaign_category, :category, :click_stream, :comments, :company_name,
11
14
  :consol_aging, :consol_days_overdue, :contact_roles_list, :contrib_pct, :credit_cards_list, :credit_hold_override,
@@ -38,20 +41,6 @@ module NetSuite
38
41
  initialize_from_attributes_hash(attributes)
39
42
  end
40
43
 
41
- def self.get(options = {})
42
- response = Actions::Get.call(self, options)
43
- if response.success?
44
- new(response.body)
45
- else
46
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
47
- end
48
- end
49
-
50
- def add
51
- response = Actions::Add.call(self)
52
- response.success?
53
- end
54
-
55
44
  end
56
45
  end
57
46
  end
@@ -4,9 +4,12 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::TranCust
8
9
 
9
- fields :auth_code, :auto_apply, :balance, :cc_approved, :cc_avs_street_match, :cc_avs_zip_match,
10
+ actions :get, :initialize, :add
11
+
12
+ fields :auth_code, :auto_apply, :cc_approved, :cc_avs_street_match, :cc_avs_zip_match,
10
13
  :cc_expire_date, :cc_name, :cc_number, :cc_security_code, :cc_security_code_match, :cc_street, :cc_zip_code,
11
14
  :charge_it, :check_num, :created_date, :currency_name, :debit_card_issue_no, :exchange_rate, :ignore_avs,
12
15
  :last_modified_date, :memo, :payment, :pending, :pn_ref_num, :status, :three_d_status_code, :tran_date,
@@ -14,38 +17,20 @@ module NetSuite
14
17
 
15
18
  field :custom_field_list, CustomFieldList
16
19
 
17
- read_only_fields :applied, :total, :unapplied
20
+ read_only_fields :applied, :balance, :total, :unapplied
18
21
 
19
22
  record_refs :account, :ar_acct, :credit_card, :credit_card_processor, :custom_form, :customer, :department, :klass,
20
23
  :location, :payment_method, :posting_period, :subsidiary
21
24
 
25
+ attr_reader :internal_id
26
+ attr_accessor :external_id
27
+
22
28
  def initialize(attributes = {})
29
+ @internal_id = attributes.delete(:internal_id) || attributes.delete(:@internal_id)
30
+ @external_id = attributes.delete(:external_id) || attributes.delete(:@external_id)
23
31
  initialize_from_attributes_hash(attributes)
24
32
  end
25
33
 
26
- def self.get(options = {})
27
- response = Actions::Get.call(self, options)
28
- if response.success?
29
- new(response.body)
30
- else
31
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
32
- end
33
- end
34
-
35
- def self.initialize(object)
36
- response = Actions::Initialize.call(self, object)
37
- if response.success?
38
- new(response.body)
39
- else
40
- raise InitializationError, "#{self}.initialize with #{object} failed."
41
- end
42
- end
43
-
44
- def add
45
- response = Actions::Add.call(self)
46
- response.success?
47
- end
48
-
49
34
  end
50
35
  end
51
36
  end
@@ -0,0 +1,31 @@
1
+ module NetSuite
2
+ module Records
3
+ class CustomerRefund
4
+ include Support::Fields
5
+ include Support::RecordRefs
6
+ include Support::Records
7
+ include Support::Actions
8
+ include Namespaces::TranCust
9
+
10
+ actions :get, :initialize, :add
11
+
12
+ fields :address, :balance, :cc_approved, :cc_expire_date, :cc_name, :cc_number, :cc_street, :cc_zip_code, :charge_it,
13
+ :created_date, :currency_name, :debit_card_issue_no, :exchange_rate, :last_modified_date, :memo, :pn_ref_num, :status,
14
+ :to_be_printed, :tran_date, :tran_id, :valid_from
15
+
16
+ field :custom_field_list, CustomFieldList
17
+ field :apply_list, CustomerRefundApplyList
18
+ field :deposit_list, CustomerRefundDepositList
19
+
20
+ read_only_fields :total
21
+
22
+ record_refs :account, :ar_acct, :credit_card, :credit_card_processor, :custom_form, :customer, :department, :klass,
23
+ :location, :payment_method, :posting_period, :subsidiary, :void_journal
24
+
25
+ def initialize(attributes = {})
26
+ initialize_from_attributes_hash(attributes)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ module NetSuite
2
+ module Records
3
+ class CustomerRefundApply
4
+ include Support::Fields
5
+ include Support::Records
6
+ include Namespaces::TranCust
7
+
8
+ fields :amount, :apply, :apply_date, :currency, :doc, :due, :line, :ref_num, :total, :type
9
+
10
+ def initialize(attributes = {})
11
+ initialize_from_attributes_hash(attributes)
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ module NetSuite
2
+ module Records
3
+ class CustomerRefundApplyList
4
+ include Namespaces::TranCust
5
+
6
+ def initialize(attributes = {})
7
+ case attributes[:apply]
8
+ when Hash
9
+ applies << CustomerRefundApply.new(attributes[:apply])
10
+ when Array
11
+ attributes[:apply].each { |apply| applies << CustomerRefundApply.new(apply) }
12
+ end
13
+ end
14
+
15
+ def applies
16
+ @applies ||= []
17
+ end
18
+
19
+ def to_record
20
+ applies.map do |apply|
21
+ { "#{record_namespace}:apply" => apply.to_record }
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module NetSuite
2
+ module Records
3
+ class CustomerRefundDeposit
4
+ include Support::Fields
5
+ include Support::Records
6
+ include Namespaces::TranCust
7
+
8
+ fields :amount, :apply, :currency, :deposit_date, :doc, :line, :ref_num, :remaining, :total
9
+
10
+ def initialize(attributes = {})
11
+ initialize_from_attributes_hash(attributes)
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ module NetSuite
2
+ module Records
3
+ class CustomerRefundDepositList
4
+ include Support::Records
5
+ include Namespaces::TranCust
6
+
7
+ def initialize(attributes = {})
8
+ case attributes[:customer_refund_deposit]
9
+ when Hash
10
+ deposits << CustomerRefundDeposit.new(attributes[:customer_refund_deposit])
11
+ when Array
12
+ attributes[:customer_refund_deposit].each { |deposit| deposits << CustomerRefundDeposit.new(deposit) }
13
+ end
14
+ end
15
+
16
+ def deposits
17
+ @deposits ||= []
18
+ end
19
+
20
+ def to_record
21
+ deposits.map do |deposit|
22
+ { "#{record_namespace}:customerRefundDeposit" => deposit.to_record }
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::ListAcct
8
9
 
10
+ actions :get, :add
11
+
9
12
  fields :auto_lead_time, :auto_preferred_stock_level, :auto_reorder_point, :available_to_partners, :average_cost,
10
13
  :copy_description, :cost, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :cost_units, :costing_method,
11
14
  :costing_method_display, :country_of_manufacture, :created_date, :currency, :date_converted_to_inv,
@@ -46,20 +49,6 @@ module NetSuite
46
49
  initialize_from_attributes_hash(attributes)
47
50
  end
48
51
 
49
- def self.get(options = {})
50
- response = Actions::Get.call(self, options)
51
- if response.success?
52
- new(response.body)
53
- else
54
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
55
- end
56
- end
57
-
58
- def add
59
- response = Actions::Add.call(self)
60
- response.success?
61
- end
62
-
63
52
  end
64
53
  end
65
54
  end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::TranSales
8
9
 
10
+ actions :get, :initialize, :add
11
+
9
12
  fields :alt_handling_cost, :alt_shipping_cost, :balance, :bill_address,
10
13
  :billing_schedule, :contrib_pct, :created_date, :created_from, :currency_name, :custom_field_list,
11
14
  :deferred_revenue, :department, :discount_amount, :discount_date, :discount_item, :discount_rate,
@@ -45,29 +48,6 @@ module NetSuite
45
48
  initialize_from_attributes_hash(attributes)
46
49
  end
47
50
 
48
- def self.get(options = {})
49
- response = Actions::Get.call(self, options)
50
- if response.success?
51
- new(response.body)
52
- else
53
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
54
- end
55
- end
56
-
57
- def self.initialize(object)
58
- response = Actions::Initialize.call(self, object)
59
- if response.success?
60
- new(response.body)
61
- else
62
- raise InitializationError, "#{self}.initialize with #{object} failed."
63
- end
64
- end
65
-
66
- def add
67
- response = Actions::Add.call(self)
68
- response.success?
69
- end
70
-
71
51
  end
72
52
  end
73
53
  end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::ListRel
8
9
 
10
+ actions :get, :add
11
+
9
12
  fields :account_number, :allocate_payroll_expenses, :allow_all_resources_for_tasks, :allow_expenses, :allow_time,
10
13
  :alt_name, :alt_phone, :bill_pay, :calculated_end_date, :calculated_end_date_baseline, :comments, :company_name,
11
14
  :date_created, :default_address, :email, :email_preference, :end_date, :entity_id, :estimated_cost,
@@ -32,20 +35,6 @@ module NetSuite
32
35
  initialize_from_attributes_hash(attributes)
33
36
  end
34
37
 
35
- def self.get(options = {})
36
- response = Actions::Get.call(self, options)
37
- if response.success?
38
- new(response.body)
39
- else
40
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
41
- end
42
- end
43
-
44
- def add
45
- response = Actions::Add.call(self)
46
- response.success?
47
- end
48
-
49
38
  end
50
39
  end
51
40
  end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::TranGeneral
8
9
 
10
+ actions :get, :add
11
+
9
12
  fields :approved, :created_date, :exchange_rate, :last_modified_date, :reversal_date, :reversal_defer, :reversal_entry,
10
13
  :tran_date, :tran_id
11
14
 
@@ -19,20 +22,6 @@ module NetSuite
19
22
  initialize_from_attributes_hash(attributes)
20
23
  end
21
24
 
22
- def self.get(options = {})
23
- response = Actions::Get.call(self, options)
24
- if response.success?
25
- new(response.body)
26
- else
27
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
28
- end
29
- end
30
-
31
- def add
32
- response = Actions::Add.call(self)
33
- response.success?
34
- end
35
-
36
25
  end
37
26
  end
38
27
  end
@@ -3,6 +3,9 @@ module NetSuite
3
3
  class Location
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
+ include Support::Actions
7
+
8
+ actions :get
6
9
 
7
10
  fields :addr1, :addr2, :addr3, :addr_phone, :addr_text, :addressee, :attention, :city, :country, :include_children,
8
11
  :is_inactive, :make_inventory_available, :make_inventory_available_store, :name, :override, :state, :tran_prefix, :zip
@@ -18,15 +21,6 @@ module NetSuite
18
21
  initialize_from_attributes_hash(attributes)
19
22
  end
20
23
 
21
- def self.get(options = {})
22
- response = Actions::Get.call(self, options)
23
- if response.success?
24
- new(response.body)
25
- else
26
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
27
- end
28
- end
29
-
30
24
  end
31
25
  end
32
26
  end
@@ -4,8 +4,11 @@ module NetSuite
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
6
  include Support::Records
7
+ include Support::Actions
7
8
  include Namespaces::ListAcct
8
9
 
10
+ actions :get
11
+
9
12
  fields :available_to_partners, :cost_estimate, :cost_estimate_type, :cost_estimate_units, :country_of_manufacture,
10
13
  :created_date, :custom_field_list, :display_name, :dont_show_price, :enforce_min_qty_internally, :exclude_from_sitemap,
11
14
  :featured_description, :handling_cost, :handling_cost_units, :include_children, :is_donation_item, :is_fulfillable,
@@ -36,15 +39,6 @@ module NetSuite
36
39
  initialize_from_attributes_hash(attributes)
37
40
  end
38
41
 
39
- def self.get(options = {})
40
- response = Actions::Get.call(self, options)
41
- if response.success?
42
- new(response.body)
43
- else
44
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
45
- end
46
- end
47
-
48
42
  end
49
43
  end
50
44
  end
@@ -3,6 +3,9 @@ module NetSuite
3
3
  class PaymentMethod
4
4
  include Support::Fields
5
5
  include Support::RecordRefs
6
+ include Support::Actions
7
+
8
+ actions :get
6
9
 
7
10
  fields :credit_card, :express_checkout_arrangement, :is_debit_card, :is_inactive, :is_online, :name,
8
11
  :pay_pal_email_address, :undep_funds, :use_express_checkout
@@ -18,15 +21,6 @@ module NetSuite
18
21
  initialize_from_attributes_hash(attributes)
19
22
  end
20
23
 
21
- def self.get(options = {})
22
- response = Actions::Get.call(self, options)
23
- if response.success?
24
- new(response.body)
25
- else
26
- raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
27
- end
28
- end
29
-
30
24
  end
31
25
  end
32
26
  end
@@ -0,0 +1,80 @@
1
+ module NetSuite
2
+ module Support
3
+ module Actions
4
+
5
+ def self.included(base)
6
+ base.send(:extend, ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def actions(*args)
12
+ instance_module = Module.new
13
+ class_module = Module.new
14
+ args.each do |action|
15
+ define_action(instance_module, class_module, action)
16
+ end
17
+ self.send(:include, instance_module)
18
+ self.send(:extend, class_module)
19
+ end
20
+
21
+ def define_action(instance_module, class_module, action)
22
+ case action
23
+ when :get
24
+ define_get(class_module)
25
+ when :add
26
+ define_add(instance_module)
27
+ when :initialize
28
+ define_initialize(class_module)
29
+ else
30
+ raise "Unknown action: #{action.inspect}"
31
+ end
32
+ end
33
+
34
+ def define_get(class_module)
35
+ class_module.module_eval do
36
+ define_method :get do |*args|
37
+ options, *ignored = *args
38
+ response = NetSuite::Actions::Get.call(self, options)
39
+ if response.success?
40
+ new(response.body)
41
+ else
42
+ raise RecordNotFound, "#{self} with OPTIONS=#{options.inspect} could not be found"
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ def define_add(instance_module)
49
+ instance_module.module_eval do
50
+ define_method :add do
51
+ response = NetSuite::Actions::Add.call(self)
52
+ response.success?
53
+ end
54
+ end
55
+ end
56
+
57
+ def define_initialize(class_module)
58
+ (class << self; self; end).instance_eval do
59
+ define_method :initialize do |*args|
60
+ super(*args)
61
+ end
62
+ end
63
+
64
+ class_module.module_eval do
65
+ define_method :initialize do |object|
66
+ response = NetSuite::Actions::Initialize.call(self, object)
67
+ if response.success?
68
+ new(response.body)
69
+ else
70
+ raise InitializationError, "#{self}.initialize with #{object} failed."
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+ end
80
+ end
@@ -1,3 +1,3 @@
1
1
  module Netsuite
2
- VERSION = '0.0.23'
2
+ VERSION = '0.0.25'
3
3
  end
@@ -0,0 +1,31 @@
1
+ module NetSuite
2
+ require 'logger'
3
+ class XmlLogger < ::Logger
4
+ def format_message(severity, timestamp, progname, msg)
5
+ if msg.match('<?xml') && !(msg.match('SOAPAction'))
6
+ xp(msg)
7
+ else
8
+ "#{msg}\n"
9
+ end
10
+ end
11
+
12
+ def xp(xml_text)
13
+ xsl = <<XSL
14
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
15
+ <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
16
+ <xsl:strip-space elements="*"/>
17
+ <xsl:template match="/">
18
+ <xsl:copy-of select="."/>
19
+ </xsl:template>
20
+ </xsl:stylesheet>
21
+ XSL
22
+
23
+ doc = Nokogiri::XML(xml_text)
24
+ xslt = Nokogiri::XSLT(xsl)
25
+ out = xslt.transform(doc)
26
+
27
+ puts out.to_xml
28
+ end
29
+
30
+ end
31
+ end
@@ -16,6 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Netsuite::VERSION
17
17
 
18
18
  gem.add_dependency 'savon', '0.9.7'
19
+ gem.add_dependency 'nokogiri'
19
20
 
20
21
  gem.add_development_dependency 'rspec', '2.8.0'
21
22
  gem.add_development_dependency 'autotest-standalone', '4.5.9'
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::CustomerRefundApplyList do
4
+ let(:list) { NetSuite::Records::CustomerRefundApplyList.new }
5
+
6
+ it 'has a applies attribute' do
7
+ list.applies.should be_kind_of(Array)
8
+ end
9
+
10
+ describe '#to_record' do
11
+ before do
12
+ list.applies << NetSuite::Records::CustomerRefundApply.new(:amount => 10)
13
+ end
14
+
15
+ it 'can represent itself as a SOAP record' do
16
+ record = [
17
+ {
18
+ 'tranCust:apply' => {
19
+ 'tranCust:amount' => 10
20
+ }
21
+ }
22
+ ]
23
+ list.to_record.should eql(record)
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::CustomerRefundApply do
4
+ let(:apply) { NetSuite::Records::CustomerRefundApply.new }
5
+
6
+ it 'has all the right fields' do
7
+ [
8
+ :amount, :apply, :apply_date, :currency, :doc, :due, :line, :ref_num, :total, :type
9
+ ].each do |field|
10
+ apply.should have_field(field)
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::CustomerRefundDepositList do
4
+ let(:list) { NetSuite::Records::CustomerRefundDepositList.new }
5
+
6
+ it 'has a deposits attribute' do
7
+ list.deposits.should be_kind_of(Array)
8
+ end
9
+
10
+ describe '#to_record' do
11
+ before do
12
+ list.deposits << NetSuite::Records::CustomerRefundDeposit.new(:apply => false)
13
+ end
14
+
15
+ it 'can represent itself as a SOAP record' do
16
+ record = [
17
+ {
18
+ 'tranCust:customerRefundDeposit' => {
19
+ 'tranCust:apply' => false
20
+ }
21
+ }
22
+ ]
23
+ list.to_record.should eql(record)
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::CustomerRefundDeposit do
4
+ let(:deposit) { NetSuite::Records::CustomerRefundDeposit.new }
5
+
6
+ it 'has all the right fields' do
7
+ [
8
+ :amount, :apply, :currency, :deposit_date, :doc, :line, :ref_num, :remaining, :total
9
+ ].each do |field|
10
+ deposit.should have_field(field)
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,172 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::CustomerRefund do
4
+ let(:refund) { NetSuite::Records::CustomerRefund.new }
5
+ let(:memo) { NetSuite::Records::CreditMemo.new }
6
+ let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
7
+
8
+ # <element name="depositList" type="tranCust:CustomerRefundDepositList" minOccurs="0"/>
9
+
10
+ it 'has all the right fields' do
11
+ [
12
+ :address, :balance, :cc_approved, :cc_expire_date, :cc_name, :cc_number, :cc_street, :cc_zip_code, :charge_it,
13
+ :created_date, :currency_name, :debit_card_issue_no, :exchange_rate, :last_modified_date, :memo, :pn_ref_num, :status,
14
+ :to_be_printed, :total, :tran_date, :tran_id, :valid_from
15
+ ].each do |field|
16
+ refund.should have_field(field)
17
+ end
18
+ end
19
+
20
+ it 'has all the right record refs' do
21
+ [
22
+ :account, :ar_acct, :credit_card, :credit_card_processor, :custom_form, :customer, :department, :klass, :location,
23
+ :payment_method, :posting_period, :subsidiary, :void_journal
24
+ ].each do |record_ref|
25
+ refund.should have_record_ref(record_ref)
26
+ end
27
+ end
28
+
29
+ describe '#custom_field_list' do
30
+ it 'can be set from attributes' do
31
+ attributes = {
32
+ :custom_field => {
33
+ :amount => 10
34
+ }
35
+ }
36
+ refund.custom_field_list = attributes
37
+ refund.custom_field_list.should be_kind_of(NetSuite::Records::CustomFieldList)
38
+ refund.custom_field_list.custom_fields.length.should eql(1)
39
+ end
40
+
41
+ it 'can be set from a CustomFieldList object' do
42
+ custom_field_list = NetSuite::Records::CustomFieldList.new
43
+ refund.custom_field_list = custom_field_list
44
+ refund.custom_field_list.should eql(custom_field_list)
45
+ end
46
+ end
47
+
48
+ describe '#apply_list' do
49
+ it 'can be set from attributes' do
50
+ attributes = {
51
+ :apply => {
52
+ :amount => 10
53
+ }
54
+ }
55
+ refund.apply_list = attributes
56
+ refund.apply_list.should be_kind_of(NetSuite::Records::CustomerRefundApplyList)
57
+ refund.apply_list.applies.length.should eql(1)
58
+ end
59
+
60
+ it 'can be set from a CustomerRefundApplyList object' do
61
+ apply_list = NetSuite::Records::CustomerRefundApplyList.new
62
+ refund.apply_list = apply_list
63
+ refund.apply_list.should eql(apply_list)
64
+ end
65
+ end
66
+
67
+ describe '#deposit_list' do
68
+ it 'can be set from attributes' do
69
+ attributes = {
70
+ :customer_refund_deposit => {
71
+ :apply => false
72
+ }
73
+ }
74
+ refund.deposit_list = attributes
75
+ refund.deposit_list.should be_kind_of(NetSuite::Records::CustomerRefundDepositList)
76
+ refund.deposit_list.deposits.length.should eql(1)
77
+ end
78
+
79
+ it 'can be set from a CustomerRefundDepositList object' do
80
+ deposit_list = NetSuite::Records::CustomerRefundDepositList.new
81
+ refund.deposit_list = deposit_list
82
+ refund.deposit_list.should eql(deposit_list)
83
+ end
84
+ end
85
+
86
+ describe '.get' do
87
+ context 'when the response is successful' do
88
+ let(:response) { NetSuite::Response.new(:success => true, :body => { :is_person => true }) }
89
+
90
+ it 'returns an CustomerRefund instance populated with the data from the response object' do
91
+ NetSuite::Actions::Get.should_receive(:call).with(NetSuite::Records::CustomerRefund, :external_id => 10).and_return(response)
92
+ refund = NetSuite::Records::CustomerRefund.get(:external_id => 10)
93
+ refund.should be_kind_of(NetSuite::Records::CustomerRefund)
94
+ end
95
+ end
96
+
97
+ context 'when the response is unsuccessful' do
98
+ let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
99
+
100
+ it 'raises a RecordNotFound exception' do
101
+ NetSuite::Actions::Get.should_receive(:call).with(NetSuite::Records::CustomerRefund, :external_id => 10).and_return(response)
102
+ lambda {
103
+ NetSuite::Records::CustomerRefund.get(:external_id => 10)
104
+ }.should raise_error(NetSuite::RecordNotFound,
105
+ /NetSuite::Records::CustomerRefund with OPTIONS=(.*) could not be found/)
106
+ end
107
+ end
108
+ end
109
+
110
+ describe '.initialize' do
111
+ context 'when the request is successful' do
112
+ it 'returns an initialized invoice from the customer entity' do
113
+ NetSuite::Actions::Initialize.should_receive(:call).with(NetSuite::Records::CustomerRefund, memo).and_return(response)
114
+ refund = NetSuite::Records::CustomerRefund.initialize(memo)
115
+ refund.should be_kind_of(NetSuite::Records::CustomerRefund)
116
+ end
117
+ end
118
+
119
+ context 'when the response is unsuccessful' do
120
+ pending
121
+ end
122
+ end
123
+
124
+ describe '#add' do
125
+ let(:test_data) { { :memo => 'This is a memo', :balance => 100 } }
126
+
127
+ context 'when the response is successful' do
128
+ let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
129
+
130
+ it 'returns true' do
131
+ refund = NetSuite::Records::CustomerRefund.new(test_data)
132
+ NetSuite::Actions::Add.should_receive(:call).
133
+ with(refund).
134
+ and_return(response)
135
+ refund.add.should be_true
136
+ end
137
+ end
138
+
139
+ context 'when the response is unsuccessful' do
140
+ let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
141
+
142
+ it 'returns false' do
143
+ refund = NetSuite::Records::Invoice.new(test_data)
144
+ NetSuite::Actions::Add.should_receive(:call).
145
+ with(refund).
146
+ and_return(response)
147
+ refund.add.should be_false
148
+ end
149
+ end
150
+ end
151
+
152
+ describe '#to_record' do
153
+ before do
154
+ refund.memo = 'This is a memo'
155
+ refund.balance = 100
156
+ end
157
+ it 'can represent itself as a SOAP record' do
158
+ record = {
159
+ 'tranCust:memo' => 'This is a memo',
160
+ 'tranCust:balance' => 100
161
+ }
162
+ refund.to_record.should eql(record)
163
+ end
164
+ end
165
+
166
+ describe '#record_type' do
167
+ it 'returns a string representation of the SOAP type' do
168
+ refund.record_type.should eql('tranCust:CustomerRefund')
169
+ end
170
+ end
171
+
172
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Support::Actions do
4
+ pending
5
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netsuite
3
3
  version: !ruby/object:Gem::Version
4
- hash: 49
4
+ hash: 45
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 23
10
- version: 0.0.23
9
+ - 25
10
+ version: 0.0.25
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ryan Moran
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-20 00:00:00 Z
18
+ date: 2012-01-23 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: savon
@@ -34,9 +34,23 @@ dependencies:
34
34
  type: :runtime
35
35
  version_requirements: *id001
36
36
  - !ruby/object:Gem::Dependency
37
- name: rspec
37
+ name: nokogiri
38
38
  prerelease: false
39
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rspec
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
40
54
  none: false
41
55
  requirements:
42
56
  - - "="
@@ -48,11 +62,11 @@ dependencies:
48
62
  - 0
49
63
  version: 2.8.0
50
64
  type: :development
51
- version_requirements: *id002
65
+ version_requirements: *id003
52
66
  - !ruby/object:Gem::Dependency
53
67
  name: autotest-standalone
54
68
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
69
+ requirement: &id004 !ruby/object:Gem::Requirement
56
70
  none: false
57
71
  requirements:
58
72
  - - "="
@@ -64,11 +78,11 @@ dependencies:
64
78
  - 9
65
79
  version: 4.5.9
66
80
  type: :development
67
- version_requirements: *id003
81
+ version_requirements: *id004
68
82
  - !ruby/object:Gem::Dependency
69
83
  name: savon_spec
70
84
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
85
+ requirement: &id005 !ruby/object:Gem::Requirement
72
86
  none: false
73
87
  requirements:
74
88
  - - "="
@@ -80,7 +94,7 @@ dependencies:
80
94
  - 6
81
95
  version: 0.1.6
82
96
  type: :development
83
- version_requirements: *id004
97
+ version_requirements: *id005
84
98
  description: NetSuite SuiteTalk API Wrapper
85
99
  email:
86
100
  - ryan.moran@gmail.com
@@ -127,6 +141,11 @@ files:
127
141
  - lib/netsuite/records/customer_addressbook.rb
128
142
  - lib/netsuite/records/customer_addressbook_list.rb
129
143
  - lib/netsuite/records/customer_payment.rb
144
+ - lib/netsuite/records/customer_refund.rb
145
+ - lib/netsuite/records/customer_refund_apply.rb
146
+ - lib/netsuite/records/customer_refund_apply_list.rb
147
+ - lib/netsuite/records/customer_refund_deposit.rb
148
+ - lib/netsuite/records/customer_refund_deposit_list.rb
130
149
  - lib/netsuite/records/duration.rb
131
150
  - lib/netsuite/records/inventory_item.rb
132
151
  - lib/netsuite/records/invoice.rb
@@ -142,12 +161,14 @@ files:
142
161
  - lib/netsuite/records/record_ref.rb
143
162
  - lib/netsuite/records/ship_address.rb
144
163
  - lib/netsuite/response.rb
164
+ - lib/netsuite/support/actions.rb
145
165
  - lib/netsuite/support/attributes.rb
146
166
  - lib/netsuite/support/fields.rb
147
167
  - lib/netsuite/support/record_refs.rb
148
168
  - lib/netsuite/support/records.rb
149
169
  - lib/netsuite/support/requests.rb
150
170
  - lib/netsuite/version.rb
171
+ - lib/netsuite/xml_logger.rb
151
172
  - netsuite.gemspec
152
173
  - spec/netsuite/actions/add_spec.rb
153
174
  - spec/netsuite/actions/get_spec.rb
@@ -166,6 +187,11 @@ files:
166
187
  - spec/netsuite/records/customer_addressbook_list_spec.rb
167
188
  - spec/netsuite/records/customer_addressbook_spec.rb
168
189
  - spec/netsuite/records/customer_payment_spec.rb
190
+ - spec/netsuite/records/customer_refund_apply_list_spec.rb
191
+ - spec/netsuite/records/customer_refund_apply_spec.rb
192
+ - spec/netsuite/records/customer_refund_deposit_list_spec.rb
193
+ - spec/netsuite/records/customer_refund_deposit_spec.rb
194
+ - spec/netsuite/records/customer_refund_spec.rb
169
195
  - spec/netsuite/records/customer_spec.rb
170
196
  - spec/netsuite/records/duration_spec.rb
171
197
  - spec/netsuite/records/inventory_item_spec.rb
@@ -182,6 +208,7 @@ files:
182
208
  - spec/netsuite/records/record_ref_spec.rb
183
209
  - spec/netsuite/records/ship_address_spec.rb
184
210
  - spec/netsuite/response_spec.rb
211
+ - spec/netsuite/support/actions_spec.rb
185
212
  - spec/netsuite/support/attributes_spec.rb
186
213
  - spec/netsuite/support/fields_spec.rb
187
214
  - spec/netsuite/support/record_refs_spec.rb
@@ -253,6 +280,11 @@ test_files:
253
280
  - spec/netsuite/records/customer_addressbook_list_spec.rb
254
281
  - spec/netsuite/records/customer_addressbook_spec.rb
255
282
  - spec/netsuite/records/customer_payment_spec.rb
283
+ - spec/netsuite/records/customer_refund_apply_list_spec.rb
284
+ - spec/netsuite/records/customer_refund_apply_spec.rb
285
+ - spec/netsuite/records/customer_refund_deposit_list_spec.rb
286
+ - spec/netsuite/records/customer_refund_deposit_spec.rb
287
+ - spec/netsuite/records/customer_refund_spec.rb
256
288
  - spec/netsuite/records/customer_spec.rb
257
289
  - spec/netsuite/records/duration_spec.rb
258
290
  - spec/netsuite/records/inventory_item_spec.rb
@@ -269,6 +301,7 @@ test_files:
269
301
  - spec/netsuite/records/record_ref_spec.rb
270
302
  - spec/netsuite/records/ship_address_spec.rb
271
303
  - spec/netsuite/response_spec.rb
304
+ - spec/netsuite/support/actions_spec.rb
272
305
  - spec/netsuite/support/attributes_spec.rb
273
306
  - spec/netsuite/support/fields_spec.rb
274
307
  - spec/netsuite/support/record_refs_spec.rb