netsuite 0.7.2 → 0.7.3

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.
@@ -196,6 +196,7 @@ module NetSuite
196
196
  autoload :RevRecTemplate, 'netsuite/records/rev_rec_template'
197
197
  autoload :RevRecSchedule, 'netsuite/records/rev_rec_schedule'
198
198
  autoload :RoleList, 'netsuite/records/role_list'
199
+ autoload :ReturnAuthorization, 'netsuite/records/return_authorization'
199
200
  autoload :SalesOrder, 'netsuite/records/sales_order'
200
201
  autoload :SalesOrderItem, 'netsuite/records/sales_order_item'
201
202
  autoload :SalesOrderItemList, 'netsuite/records/sales_order_item_list'
@@ -0,0 +1,133 @@
1
+ module NetSuite
2
+ module Records
3
+ class ReturnAuthorization
4
+ include Support::Fields
5
+ include Support::RecordRefs
6
+ include Support::Records
7
+ include Support::Actions
8
+ include Namespaces::TranSales
9
+
10
+ # https://system.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2015_2/schema/record/returnauthorization.html
11
+
12
+ actions :get, :get_list, :initialize, :add, :update, :delete, :upsert, :search
13
+
14
+ fields :alt_sales_total,
15
+ :cc_approved,
16
+ :cc_expire_date,
17
+ :cc_name,
18
+ :cc_number,
19
+ :cc_street,
20
+ :cc_zip_code,
21
+ :contrib_pct,
22
+ :created_date,
23
+ :currency_name,
24
+ :debit_card_issue_no,
25
+ :deferred_revenue,
26
+ :discount_rate,
27
+ :discount_total,
28
+ :email,
29
+ :est_gross_profit,
30
+ :est_gross_profit_percent,
31
+ :exchange_rate,
32
+ :exclude_commission,
33
+ :fax,
34
+ :gift_cert_applied,
35
+ :gift_cert_available,
36
+ :gift_cert_total,
37
+ :is_taxable,
38
+ :job,
39
+ :last_modified_date,
40
+ :memo,
41
+ :message,
42
+ :other_ref_num,
43
+ :pay_pal_auth_id,
44
+ :pay_pal_process,
45
+ :pn_ref_num,
46
+ :recognized_revenue,
47
+ :rev_rec_end_date,
48
+ :rev_rec_on_rev_commitment,
49
+ :rev_rec_start_date,
50
+ :sales_effective_date,
51
+ :ship_address,
52
+ :source,
53
+ :status,
54
+ :sub_total,
55
+ :sync_partner_teams,
56
+ :sync_sales_teams,
57
+ :tax2_total,
58
+ :tax_rate,
59
+ :tax_total,
60
+ :to_be_emailed,
61
+ :to_be_faxed,
62
+ :to_be_printed,
63
+ :total,
64
+ :total_cost_estimate,
65
+ :tran_date,
66
+ :tran_id,
67
+ :tran_is_vsoe_bundle,
68
+ :valid_from,
69
+ :vat_reg_num,
70
+ :vsoe_auto_calc
71
+
72
+ record_refs :klass,
73
+ :created_from,
74
+ :credit_card,
75
+ :credit_card_processor,
76
+ :currency,
77
+ :custom_form,
78
+ :department,
79
+ :discount_item,
80
+ :dr_account,
81
+ :entity,
82
+ :fx_account,
83
+ :gift_cert,
84
+ :interco_status,
85
+ :interco_transaction,
86
+ :lead_source,
87
+ :location,
88
+ :message_sel,
89
+ :order_status,
90
+ :partner,
91
+ :payment_method,
92
+ :promo_code,
93
+ :rev_commit_status,
94
+ :revenue_status,
95
+ :rev_rec_schedule,
96
+ :sales_group,
97
+ :sales_rep,
98
+ :subsidiary,
99
+ :tax_item
100
+
101
+ # :bill_address_list
102
+ # :item_list,
103
+ # :partners_list,
104
+ # :sales_team_list,
105
+ # :ship_address_list,
106
+
107
+ field :billing_address, Address
108
+ field :custom_field_list, CustomFieldList
109
+
110
+ attr_reader :internal_id
111
+ attr_accessor :external_id
112
+
113
+ def initialize(attributes = {})
114
+ @internal_id = attributes.delete(:internal_id) || attributes.delete(:@internal_id)
115
+ @external_id = attributes.delete(:external_id) || attributes.delete(:@external_id)
116
+ initialize_from_attributes_hash(attributes)
117
+ end
118
+
119
+ def to_record
120
+ rec = super
121
+ if rec["#{record_namespace}:customFieldList"]
122
+ rec["#{record_namespace}:customFieldList!"] = rec.delete("#{record_namespace}:customFieldList")
123
+ end
124
+ rec
125
+ end
126
+
127
+ def self.search_class_name
128
+ "Transaction"
129
+ end
130
+
131
+ end
132
+ end
133
+ end
@@ -18,7 +18,7 @@ module NetSuite
18
18
  :start_date, :status, :sync_partner_teams, :sync_sales_teams, :tax2_total, :tax_rate, :to_be_emailed, :to_be_faxed,
19
19
  :to_be_printed, :total_cost_estimate, :tran_date, :tran_id, :tran_is_vsoe_bundle, :vat_reg_num,
20
20
  :linked_tracking_numbers, :vsoe_auto_calc, :quantity, :bill_city, :bill_state, :ship_city, :ship_state, :cost_estimate,
21
- :amount, :is_ship_address
21
+ :amount, :is_ship_address, :auth_code
22
22
 
23
23
  # NOTE API >= 2014_2 only
24
24
  field :shipping_address, Address
@@ -7,7 +7,8 @@ module NetSuite
7
7
  module Utilities
8
8
  class Request
9
9
 
10
- BASE_API = "https://rest.netsuite.com/rest"
10
+ PRODUCTION_API = "https://rest.netsuite.com/rest"
11
+ SANDBOX_API = "https://rest.sandbox.netsuite.com/rest"
11
12
  DEFAULT_TIMEOUT = 30
12
13
  USE_SSL = true
13
14
 
@@ -16,7 +17,8 @@ module NetSuite
16
17
  def get(options)
17
18
  email = encode(options.fetch :email)
18
19
  signature = encode(options.fetch :password)
19
- uri = options.fetch(:uri)
20
+ sandbox = options.fetch(:sandbox, false)
21
+ uri = determine_uri(options.fetch(:uri), sandbox)
20
22
  response = make_request(:get, uri, email, signature)
21
23
  [response.code, JSON.parse(response.body)]
22
24
  end
@@ -24,7 +26,6 @@ module NetSuite
24
26
  private
25
27
 
26
28
  def make_request(method_name, uri, email, signature)
27
- uri = URI(BASE_API + uri)
28
29
  klass = Module.const_get "Net::HTTP::#{method_name.to_s.capitalize}"
29
30
  method = klass.new(uri)
30
31
  method['AUTHORIZATION'] = auth_header(email, signature)
@@ -39,6 +40,10 @@ module NetSuite
39
40
  "NLAuth nlauth_email=#{email},nlauth_signature=#{signature}"
40
41
  end
41
42
 
43
+ def determine_uri(uri, sandbox)
44
+ URI((sandbox ? SANDBOX_API : PRODUCTION_API) + uri)
45
+ end
46
+
42
47
  def encode(unencoded_string)
43
48
  URI.escape(
44
49
  unencoded_string,
@@ -5,37 +5,39 @@ module NetSuite
5
5
 
6
6
  class << self
7
7
 
8
- def get(email, password)
9
- code, body = Request.get(
10
- email: email,
11
- password: password,
12
- uri: '/roles'
8
+ def get(opts={})
9
+ status, body = Request.get(
10
+ email: opts.fetch(:email, Configuration.email),
11
+ password: opts.fetch(:password, Configuration.password),
12
+ sandbox: opts.fetch(:sandbox, Configuration.sandbox),
13
+ uri: '/roles',
13
14
  )
14
- code == "200" ? format_response(body) : body
15
+ status == "200" ? format_response(body) : body
15
16
  end
16
17
 
17
18
  private
18
19
 
19
20
  def format_response(parsed)
20
- # [
21
- # {
22
- # "account"=>{
23
- # "internalId"=>"TSTDRV15",
24
- # "name"=>"Honeycomb Mfg SDN (Leading)"},
25
- # "role"=>{
26
- # "internalId"=>3,
27
- # "name"=>"Administrator"},
28
- # "dataCenterURLs"=>{
29
- # "webservicesDomain"=>"https://webservices.na1.netsuite.com",
30
- # "restDomain"=>"https://rest.na1.netsuite.com",
31
- # "systemDomain"=>"https://system.na1.netsuite.com"}
32
- # },
33
- # ....
34
- {
35
- accounts: parsed.map {|hash| hash["account"]["internalId"] }.uniq,
36
- roles: parsed.map {|hash| hash["role"]["internalId"] }.uniq,
37
- wsdls: parsed.map {|hash| hash["dataCenterURLs"]["webservicesDomain"] }.uniq,
38
- }
21
+ uniq_accounts = parsed.map {|hash| hash["account"] }.uniq
22
+
23
+ uniq_accounts.map do |hash|
24
+ matches = parsed.select {|x| x["account"]["internalId"] == hash["internalId"]}
25
+ {
26
+ account_id: hash["internalId"],
27
+ account_name: hash["name"],
28
+ roles: matches.map do |match|
29
+ {
30
+ id: match["role"]["internalId"],
31
+ name: match["role"]["name"]
32
+ }
33
+ end.uniq,
34
+ wsdls: {
35
+ webservices: matches.map {|match| match["dataCenterURLs"]["webservicesDomain"] }.uniq,
36
+ rest: matches.map {|match| match["dataCenterURLs"]["restDomain"] }.uniq,
37
+ system: matches.map {|match| match["dataCenterURLs"]["systemDomain"] }.uniq,
38
+ }
39
+ }
40
+ end
39
41
  end
40
42
 
41
43
  end
@@ -32,7 +32,8 @@ module NetSuite
32
32
  count += 1
33
33
  yield
34
34
  rescue options[:exception] || Savon::SOAPFault => e
35
- if !e.message.include?("Only one request may be made against a session at a time")
35
+ if !e.message.include?("Only one request may be made against a session at a time") &&
36
+ !e.message.include?('java.util.ConcurrentModificationException')
36
37
  raise e
37
38
  end
38
39
  if count >= (options[:attempts] || 8)
@@ -1,3 +1,3 @@
1
1
  module Netsuite
2
- VERSION = '0.7.2'
2
+ VERSION = '0.7.3'
3
3
  end
@@ -42,6 +42,7 @@ describe 'basic records' do
42
42
  NetSuite::Records::Note,
43
43
  NetSuite::Records::OtherChargeSaleItem,
44
44
  NetSuite::Records::GiftCertificateItem,
45
+ NetSuite::Records::ReturnAuthorization,
45
46
  ]
46
47
  }
47
48
 
@@ -1,14 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe NetSuite::Rest::Utilities::Roles do
4
- subject { described_class }
5
4
 
6
5
  describe '#get' do
6
+ subject { described_class }
7
7
  it { is_expected.to respond_to :get }
8
8
 
9
9
  it 'invokes the request module' do
10
10
  expect( NetSuite::Rest::Utilities::Request ).to receive(:get)
11
- subject.get('jimbob@netzero.com', 'pickles')
11
+ subject.get(email: 'jimbob@netzero.com', password: 'pickles')
12
12
  end
13
13
 
14
14
  it 'formats the API response if successful' do
@@ -16,7 +16,7 @@ describe NetSuite::Rest::Utilities::Roles do
16
16
  ["200", {parsed: :response}]
17
17
  )
18
18
  expect( subject ).to receive(:format_response).with({parsed: :response}).and_return nil
19
- subject.get('jimbob@netzero.com', 'pickles')
19
+ subject.get(email: 'jimbob@netzero.com', password: 'pickles')
20
20
  end
21
21
 
22
22
  it 'returns the full error message if unsuccessful' do
@@ -24,11 +24,13 @@ describe NetSuite::Rest::Utilities::Roles do
24
24
  ["500", {oh: :no!}]
25
25
  )
26
26
  expect( subject ).to_not receive(:format_reponse)
27
- expect( subject.get('jimbob@netzero.com', 'pickles') ).to eq({oh: :no!})
27
+ expect( subject.get(email: 'jimbob@netzero.com', password: 'pickles') ).to eq({oh: :no!})
28
28
  end
29
29
  end
30
30
 
31
31
  describe '#format_response' do
32
+ subject { described_class.send(:format_response, parsed) }
33
+
32
34
  let(:parsed) do
33
35
  [
34
36
  {
@@ -36,61 +38,106 @@ describe NetSuite::Rest::Utilities::Roles do
36
38
  "internalId"=>"TSTDRV15",
37
39
  "name"=>"Honeycomb Mfg SDN (Leading)"},
38
40
  "role"=>{
39
- "internalId"=>3,
40
- "name"=>"Administrator"},
41
- "dataCenterURLs"=>{
42
- "webservicesDomain"=>"https://webservices.na1.netsuite.com",
43
- "restDomain"=>"https://rest.na1.netsuite.com",
44
- "systemDomain"=>"https://system.na1.netsuite.com"}
41
+ "internalId"=>3,
42
+ "name"=>"Administrator"},
43
+ "dataCenterURLs"=>{
44
+ "webservicesDomain"=>"https://webservices.na1.netsuite.com",
45
+ "restDomain"=>"https://rest.na1.netsuite.com",
46
+ "systemDomain"=>"https://system.na1.netsuite.com"}
45
47
  },
46
48
  {
47
49
  "account"=>{
48
50
  "internalId"=>"TSTDRV15",
49
51
  "name"=>"Honeycomb Mfg SDN (Leading)"},
50
52
  "role"=>{
51
- "internalId"=>1,
52
- "name"=>"Accountant"},
53
- "dataCenterURLs"=>{
54
- "webservicesDomain"=>"https://webservices.na1.netsuite.com",
55
- "restDomain"=>"https://rest.na1.netsuite.com",
56
- "systemDomain"=>"https://system.na1.netsuite.com"}
53
+ "internalId"=>1,
54
+ "name"=>"Accountant"},
55
+ "dataCenterURLs"=>{
56
+ "webservicesDomain"=>"https://webservices.na1.netsuite.com",
57
+ "restDomain"=>"https://rest.na1.netsuite.com",
58
+ "systemDomain"=>"https://system.na1.netsuite.com"}
57
59
  },
58
60
  {
59
61
  "account"=>{
60
62
  "internalId"=>"TSTDRV14",
61
63
  "name"=>"Honeycomb Mfg SDN (Leading)"},
62
64
  "role"=>{
63
- "internalId"=>1,
64
- "name"=>"Accountant"},
65
- "dataCenterURLs"=>{
66
- "webservicesDomain"=>"https://webservices.na1.netsuite.com",
67
- "restDomain"=>"https://rest.na1.netsuite.com",
68
- "systemDomain"=>"https://system.na1.netsuite.com"}
65
+ "internalId"=>1,
66
+ "name"=>"Accountant"},
67
+ "dataCenterURLs"=>{
68
+ "webservicesDomain"=>"https://webservices.netsuite.com",
69
+ "restDomain"=>"https://rest.netsuite.com",
70
+ "systemDomain"=>"https://system.netsuite.com"}
69
71
  },
70
72
  ]
71
73
  end
72
74
 
73
- it 'pulls out the account_ids' do
74
- expect(
75
- subject.send(:format_response, parsed).fetch(:accounts)
76
- ).to eq ["TSTDRV15","TSTDRV14"]
75
+ it 'groups by uniq account ids' do
76
+ expect( subject.count ).to eq 2
77
+ end
78
+
79
+ it 'returns the account name and id' do
80
+ expect( subject.first ).to be_a Hash
81
+ expect( subject.first[:account_id] ).to be_a String
82
+ expect( subject.first[:account_name] ).to be_a String
77
83
  end
78
84
 
79
- it 'pulls out the role_ids' do
80
- expect(
81
- subject.send(:format_response, parsed).fetch(:roles)
82
- ).to eq [3, 1]
85
+ it 'returns the account roles' do
86
+ expect( subject.first[:roles] ).to be_an Array
87
+ expect( subject.first[:roles].first ).to be_a Hash
88
+ expect( subject.first[:roles].first[:id] ).to be_an Integer
89
+ expect( subject.first[:roles].first[:name] ).to be_a String
83
90
  end
84
91
 
85
- it 'pulls out the wsdls' do
86
- expect(
87
- subject.send(:format_response, parsed).fetch(:wsdls)
88
- ).to eq ["https://webservices.na1.netsuite.com"]
92
+ it 'returns the wsdls' do
93
+ expect( subject.first[:wsdls] ).to be_a Hash
94
+ expect( subject.first[:wsdls][:webservices] ).to be_an Array
95
+ expect( subject.first[:wsdls][:rest] ).to be_an Array
96
+ expect( subject.first[:wsdls][:system] ).to be_an Array
97
+ end
98
+
99
+ it 'parses correctly' do
100
+ expect(subject).to eq(
101
+ [
102
+ { account_id: 'TSTDRV15',
103
+ account_name: 'Honeycomb Mfg SDN (Leading)',
104
+ roles: [
105
+ {
106
+ id: 3,
107
+ name: 'Administrator'
108
+ },
109
+ {
110
+ id: 1,
111
+ name: 'Accountant'
112
+ }
113
+ ],
114
+ wsdls: {
115
+ webservices: ["https://webservices.na1.netsuite.com"],
116
+ rest: ["https://rest.na1.netsuite.com"],
117
+ system: ["https://system.na1.netsuite.com"]
118
+ }
119
+ },
120
+ { account_id: 'TSTDRV14',
121
+ account_name: 'Honeycomb Mfg SDN (Leading)',
122
+ roles: [
123
+ {
124
+ id: 1,
125
+ name: 'Accountant'
126
+ }
127
+ ],
128
+ wsdls: {
129
+ webservices: ["https://webservices.netsuite.com"],
130
+ rest: ["https://rest.netsuite.com"],
131
+ system: ["https://system.netsuite.com"]
132
+ }
133
+ }
134
+ ]
135
+ )
89
136
  end
90
137
 
91
138
  it 'handles an empty response body' do
92
139
  expect{
93
- subject.send(:format_response, [])
140
+ described_class.send(:format_response, [])
94
141
  }.to_not raise_error
95
142
  end
96
143
 
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.2
4
+ version: 0.7.3
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: 2016-08-31 00:00:00.000000000 Z
13
+ date: 2016-09-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: savon
@@ -228,6 +228,7 @@ files:
228
228
  - lib/netsuite/records/purchase_order_item_list.rb
229
229
  - lib/netsuite/records/record_ref.rb
230
230
  - lib/netsuite/records/record_ref_list.rb
231
+ - lib/netsuite/records/return_authorization.rb
231
232
  - lib/netsuite/records/rev_rec_schedule.rb
232
233
  - lib/netsuite/records/rev_rec_template.rb
233
234
  - lib/netsuite/records/role_list.rb