netsuite 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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