netsuite 0.0.4 → 0.0.5
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.
- data/README.md +3 -3
- data/lib/netsuite.rb +6 -5
- data/lib/netsuite/actions/add.rb +4 -7
- data/lib/netsuite/attribute_support.rb +16 -0
- data/lib/netsuite/configuration.rb +3 -3
- data/lib/netsuite/field_support.rb +2 -20
- data/lib/netsuite/record_support.rb +17 -0
- data/lib/netsuite/records/customer.rb +52 -0
- data/lib/netsuite/records/customer_addressbook_list.rb +45 -0
- data/lib/netsuite/records/invoice.rb +50 -0
- data/lib/netsuite/savon_support.rb +3 -3
- data/lib/netsuite/version.rb +1 -1
- data/spec/netsuite/actions/add_spec.rb +34 -7
- data/spec/netsuite/actions/initialize_spec.rb +1 -1
- data/spec/netsuite/attribute_support_spec.rb +5 -0
- data/spec/netsuite/field_support_spec.rb +0 -18
- data/spec/netsuite/record_support_spec.rb +33 -0
- data/spec/netsuite/records/customer_addressbook_list_spec.rb +71 -0
- data/spec/netsuite/records/customer_spec.rb +116 -0
- data/spec/netsuite/records/invoice_spec.rb +79 -0
- data/spec/support/fixtures/add/add_invoice.xml +16 -0
- data/spec/support/fixtures/initialize/initialize_invoice_from_customer.xml +14 -14
- metadata +22 -13
- data/lib/netsuite/entities/customer.rb +0 -41
- data/lib/netsuite/transactions/invoice.rb +0 -38
- data/spec/netsuite/entities/customer_spec.rb +0 -83
- data/spec/netsuite/transactions/invoice_spec.rb +0 -53
data/README.md
CHANGED
@@ -29,15 +29,15 @@ Or install it yourself as:
|
|
29
29
|
* Retrieves the customer by internalId.
|
30
30
|
|
31
31
|
```Ruby
|
32
|
-
customer = NetSuite::Customer.get(4) # => #<NetSuite::Customer:0x1042f59b8>
|
33
|
-
customer.is_person
|
32
|
+
customer = NetSuite::Records::Customer.get(4) # => #<NetSuite::Records::Customer:0x1042f59b8>
|
33
|
+
customer.is_person # => true
|
34
34
|
```
|
35
35
|
|
36
36
|
<a name='extending'>
|
37
37
|
## Additions
|
38
38
|
|
39
39
|
* Please submit a pull request for any models or actions that you would like to be included. The API is quite large and so we will necessarily not cover all of it.
|
40
|
-
*
|
40
|
+
* Records should go into the `lib/netsuite/records/` directory.
|
41
41
|
* Actions should be placed in their respective subdirectory under `lib/netsuite/actions`.
|
42
42
|
* Example:
|
43
43
|
|
data/lib/netsuite.rb
CHANGED
@@ -4,7 +4,9 @@ require 'netsuite/configuration'
|
|
4
4
|
require 'netsuite/errors'
|
5
5
|
require 'netsuite/response'
|
6
6
|
require 'netsuite/version'
|
7
|
+
require 'netsuite/attribute_support'
|
7
8
|
require 'netsuite/field_support'
|
9
|
+
require 'netsuite/record_support'
|
8
10
|
require 'netsuite/savon_support'
|
9
11
|
|
10
12
|
# ACTIONS
|
@@ -12,11 +14,10 @@ require 'netsuite/actions/add'
|
|
12
14
|
require 'netsuite/actions/get'
|
13
15
|
require 'netsuite/actions/initialize'
|
14
16
|
|
15
|
-
#
|
16
|
-
require 'netsuite/
|
17
|
-
|
18
|
-
|
19
|
-
require 'netsuite/transactions/invoice'
|
17
|
+
# RECORDS
|
18
|
+
require 'netsuite/records/customer'
|
19
|
+
require 'netsuite/records/customer_addressbook_list'
|
20
|
+
require 'netsuite/records/invoice'
|
20
21
|
|
21
22
|
module NetSuite
|
22
23
|
|
data/lib/netsuite/actions/add.rb
CHANGED
@@ -3,8 +3,8 @@ module NetSuite
|
|
3
3
|
class Add
|
4
4
|
include SavonSupport
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(obj = nil)
|
7
|
+
@obj = obj
|
8
8
|
end
|
9
9
|
|
10
10
|
private
|
@@ -29,13 +29,10 @@ module NetSuite
|
|
29
29
|
# </soap:Body>
|
30
30
|
def request_body
|
31
31
|
{
|
32
|
-
'platformMsgs:record' =>
|
33
|
-
'listRel:entityId' => @attributes[:entity_id],
|
34
|
-
'listRel:companyName' => @attributes[:company_name]
|
35
|
-
},
|
32
|
+
'platformMsgs:record' => @obj.to_record,
|
36
33
|
:attributes! => {
|
37
34
|
'platformMsgs:record' => {
|
38
|
-
'xsi:type' =>
|
35
|
+
'xsi:type' => @obj.record_type
|
39
36
|
}
|
40
37
|
}
|
41
38
|
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module AttributeSupport
|
3
|
+
|
4
|
+
def attributes
|
5
|
+
@attributes ||= {}
|
6
|
+
end
|
7
|
+
private :attributes
|
8
|
+
|
9
|
+
def initialize_from_attributes_hash(attributes = {})
|
10
|
+
Hash[attributes.select { |k,v| self.class.fields.include?(k) }].each do |k,v|
|
11
|
+
send("#{k}=", v)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -45,7 +45,7 @@ module NetSuite
|
|
45
45
|
self.email = email
|
46
46
|
else
|
47
47
|
attributes[:email] ||
|
48
|
-
raise(
|
48
|
+
raise(ConfigurationError,
|
49
49
|
'#email is a required configuration value. Please set it by calling NetSuite::Configuration.email = "me@example.com"')
|
50
50
|
end
|
51
51
|
end
|
@@ -59,7 +59,7 @@ module NetSuite
|
|
59
59
|
self.password = password
|
60
60
|
else
|
61
61
|
attributes[:password] ||
|
62
|
-
raise(
|
62
|
+
raise(ConfigurationError,
|
63
63
|
'#password is a required configuration value. Please set it by calling NetSuite::Configuration.password = "my_pass"')
|
64
64
|
end
|
65
65
|
end
|
@@ -73,7 +73,7 @@ module NetSuite
|
|
73
73
|
self.account = account
|
74
74
|
else
|
75
75
|
attributes[:account] ||
|
76
|
-
raise(
|
76
|
+
raise(ConfigurationError,
|
77
77
|
'#account is a required configuration value. Please set it by calling NetSuite::Configuration.account = 1234')
|
78
78
|
end
|
79
79
|
end
|
@@ -1,34 +1,16 @@
|
|
1
1
|
module NetSuite
|
2
2
|
module FieldSupport
|
3
|
+
include AttributeSupport
|
3
4
|
|
4
5
|
def self.included(base)
|
5
6
|
base.send(:extend, ClassMethods)
|
6
7
|
end
|
7
8
|
|
8
|
-
def initialize(attributes = {})
|
9
|
-
attributes = attributes.inject({}) do |hash, (k,v)|
|
10
|
-
if k.to_s.match(/@.+/)
|
11
|
-
hash.store(k.to_s.delete('@').to_sym, attributes[k])
|
12
|
-
else
|
13
|
-
hash.store(k,v)
|
14
|
-
end
|
15
|
-
hash
|
16
|
-
end
|
17
|
-
Hash[attributes.select { |k,v| self.class.fields.include?(k) }].each do |k,v|
|
18
|
-
send("#{k}=", v)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def attributes
|
23
|
-
@attributes ||= {}
|
24
|
-
end
|
25
|
-
private :attributes
|
26
|
-
|
27
9
|
module ClassMethods
|
28
10
|
|
29
11
|
def fields(*args)
|
30
12
|
if args.empty?
|
31
|
-
@fields
|
13
|
+
@fields ||= {}
|
32
14
|
else
|
33
15
|
args.each do |arg|
|
34
16
|
field arg
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module RecordSupport
|
3
|
+
include AttributeSupport
|
4
|
+
|
5
|
+
def to_record
|
6
|
+
attributes.inject({}) do |hash, (k,v)|
|
7
|
+
hash.store("listRel:#{k.to_s.lower_camelcase}", v)
|
8
|
+
hash
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def record_type
|
13
|
+
"listRel:#{self.class.to_s.split('::').last}"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class Customer
|
4
|
+
include FieldSupport
|
5
|
+
include RecordSupport
|
6
|
+
|
7
|
+
fields :access_role, :account_number, :addressbook_list, :aging, :alt_email, :alt_name, :alt_phone, :balance, :bill_pay,
|
8
|
+
:buying_reason, :buying_time_frame, :campaign_category, :category, :click_stream, :comments, :company_name,
|
9
|
+
:consol_aging, :consol_balance, :consol_days_overdue, :consol_deposit_balance, :consol_overdue_balance,
|
10
|
+
:consol_unbilled_orders, :contact_roles_list, :contrib_pct, :credit_cards_list, :credit_hold_override, :credit_limit,
|
11
|
+
:currency, :currency_list, :custom_field_list, :custom_form, :date_created, :days_overdue, :default_address,
|
12
|
+
:deposit_balance, :download_list, :email, :email_preference, :email_transactions, :end_date, :entity_id, :entity_status,
|
13
|
+
:estimated_budget, :fax, :fax_transactions, :first_name, :first_visit, :give_access, :global_subscription_status,
|
14
|
+
:group_pricing_list, :home_phone, :image, :is_budget_approved, :is_inactive, :is_person, :item_pricing_list, :keywords,
|
15
|
+
:language, :last_modified, :last_name, :last_page_visited, :last_visit, :lead_source, :middle_name, :mobile_phone,
|
16
|
+
:opening_balance, :opening_balance_account, :opening_balance_date, :overdue_balance, :parent, :partner, :partners_list,
|
17
|
+
:password, :password_2, :phone, :phonetic_name, :pref_cc_processor, :price_level, :print_on_check_as,
|
18
|
+
:print_transactions, :referrer, :reminder_days, :representing_subsidiary, :require_pwd_change, :resale_number,
|
19
|
+
:sales_group, :sales_readiness, :sales_rep, :sales_team_list, :salutation, :send_email, :ship_complete, :shipping_item,
|
20
|
+
:stage, :start_date, :subscriptions_list, :subsidiary, :sync_partner_teams, :tax_exempt, :tax_item, :taxable, :terms,
|
21
|
+
:territory, :third_party_acct, :third_party_country, :third_party_zipcode, :title, :unbilled_orders, :url,
|
22
|
+
:vat_reg_number, :visits, :web_lead
|
23
|
+
|
24
|
+
attr_reader :internal_id, :external_id
|
25
|
+
|
26
|
+
def initialize(attributes = {})
|
27
|
+
@internal_id = attributes.delete(:internal_id) || attributes.delete(:@internal_id)
|
28
|
+
@external_id = attributes.delete(:external_id) || attributes.delete(:@external_id)
|
29
|
+
initialize_from_attributes_hash(attributes)
|
30
|
+
end
|
31
|
+
|
32
|
+
def addressbook_list=(attributes_or_record)
|
33
|
+
attributes[:addressbook_list] = NetSuite::Records::CustomerAddressbookList.new(attributes_or_record)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.get(id)
|
37
|
+
response = Actions::Get.call(id)
|
38
|
+
if response.success?
|
39
|
+
new(response.body)
|
40
|
+
else
|
41
|
+
raise RecordNotFound, "#{self} with ID=#{id} could not be found"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def add
|
46
|
+
response = Actions::Add.call(self)
|
47
|
+
response.success?
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class CustomerAddressbookList
|
4
|
+
include FieldSupport
|
5
|
+
include RecordSupport
|
6
|
+
|
7
|
+
fields :default_shipping, :default_billing, :is_residential, :label, :attention, :addressee,
|
8
|
+
:phone, :addr1, :addr2, :addr3, :city, :zip, :country, :addr_text, :override, :state
|
9
|
+
|
10
|
+
attr_reader :internal_id
|
11
|
+
|
12
|
+
def initialize(attributes_or_record = {})
|
13
|
+
case attributes_or_record
|
14
|
+
when self.class
|
15
|
+
initialize_from_record(attributes_or_record)
|
16
|
+
when Hash
|
17
|
+
attributes_or_record = attributes_or_record[:addressbook] if attributes_or_record[:addressbook]
|
18
|
+
@internal_id = attributes_or_record.delete(:internal_id)
|
19
|
+
initialize_from_attributes_hash(attributes_or_record)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize_from_record(obj)
|
24
|
+
self.default_shipping = obj.default_shipping
|
25
|
+
self.default_billing = obj.default_billing
|
26
|
+
self.is_residential = obj.is_residential
|
27
|
+
self.label = obj.label
|
28
|
+
self.attention = obj.attention
|
29
|
+
self.addressee = obj.addressee
|
30
|
+
self.phone = obj.phone
|
31
|
+
self.addr1 = obj.addr1
|
32
|
+
self.addr2 = obj.addr2
|
33
|
+
self.addr3 = obj.addr3
|
34
|
+
self.city = obj.city
|
35
|
+
self.zip = obj.zip
|
36
|
+
self.country = obj.country
|
37
|
+
self.addr_text = obj.addr_text
|
38
|
+
self.override = obj.override
|
39
|
+
self.state = obj.state
|
40
|
+
@internal_id = obj.internal_id
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module NetSuite
|
2
|
+
module Records
|
3
|
+
class Invoice
|
4
|
+
include FieldSupport
|
5
|
+
include RecordSupport
|
6
|
+
|
7
|
+
fields :account, :alt_handling_cost, :alt_shipping_cost, :amount_paid, :amount_remaining, :balance, :bill_address,
|
8
|
+
:bill_address_list, :billing_schedule, :contrib_pct, :created_date, :created_from, :currency_name, :custom_field_list,
|
9
|
+
:custom_form, :deferred_revenue, :department, :discount_amount, :discount_date, :discount_item, :discount_rate,
|
10
|
+
:discount_total, :due_date, :email, :end_date, :entity, :est_gross_profit, :est_gross_profit_percent, :exchange_rate,
|
11
|
+
:exclude_commission, :exp_cost_disc_amount, :exp_cost_disc_print, :exp_cost_disc_rate, :exp_cost_disc_tax_1_amt,
|
12
|
+
:exp_cost_disc_taxable, :exp_cost_discount, :exp_cost_list, :exp_cost_tax_code, :exp_cost_tax_rate_1,
|
13
|
+
:exp_cost_tax_rate_2, :fax, :fob, :gift_cert_applied, :gift_cert_redemption_list, :handling_cost, :handling_tax_1_rate,
|
14
|
+
:handling_tax_2_rate, :handling_tax_code, :is_taxable, :item_cost_disc_amount, :item_cost_disc_print,
|
15
|
+
:item_cost_disc_rate, :item_cost_disc_tax_1_amt, :item_cost_disc_taxable, :item_cost_discount, :item_cost_list,
|
16
|
+
:item_cost_tax_code, :item_cost_tax_rate_1, :item_cost_tax_rate_2, :item_list, :job, :klass, :last_modified_date,
|
17
|
+
:lead_source, :linked_tracking_numbers, :location, :memo, :message, :message_sel, :on_credit_hold, :opportunity,
|
18
|
+
:other_ref_name, :partner, :partners_list, :posting_period, :promo_code, :recognized_revenue, :rev_rec_end_date,
|
19
|
+
:rev_rec_on_rev_commitment, :rev_rec_schedule, :rev_rec_start_date, :revenue_status, :sales_effective_date,
|
20
|
+
:sales_group, :sales_rep, :sales_team_list, :ship_address, :ship_address_list, :ship_date, :ship_group_list,
|
21
|
+
:ship_method, :shipping_cost, :shipping_tax_1_rate, :shipping_tax_2_rate, :shipping_tax_code, :source, :start_date,
|
22
|
+
:status, :sub_total, :subsidiary, :sync_partner_teams, :sync_sales_teams, :tax_2_total, :tax_item, :tax_rate,
|
23
|
+
:tax_total, :terms, :time_disc_amount, :time_disc_print, :time_disc_rate, :time_disc_tax_1_amt, :time_disc_taxable,
|
24
|
+
:time_discount, :time_list, :time_tax_code, :time_tax_rate_1, :time_tax_rate_2, :to_be_emailed, :to_be_faxed,
|
25
|
+
:to_be_printed, :total, :total_cost_estimate, :tracking_numbers, :tran_date, :tran_id, :tran_is_vsoe_bundle,
|
26
|
+
:transaction_bill_address, :transaction_ship_address, :vat_reg_num, :vsoe_auto_calc
|
27
|
+
|
28
|
+
def initialize(attributes = {})
|
29
|
+
@internal_id = attributes.delete(:internal_id)
|
30
|
+
@external_id = attributes.delete(:external_id)
|
31
|
+
initialize_from_attributes_hash(attributes)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.initialize(customer)
|
35
|
+
response = Actions::Initialize.call(customer)
|
36
|
+
if response.success?
|
37
|
+
new(response.body)
|
38
|
+
else
|
39
|
+
raise RecordNotFound, "#{self} with ID=#{id} could not be found"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def add
|
44
|
+
response = Actions::Add.call(self)
|
45
|
+
response.success?
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -26,15 +26,15 @@ module NetSuite
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def connection
|
29
|
-
|
29
|
+
Configuration.connection
|
30
30
|
end
|
31
31
|
|
32
32
|
def auth_header
|
33
|
-
|
33
|
+
Configuration.auth_header
|
34
34
|
end
|
35
35
|
|
36
36
|
def build_response
|
37
|
-
|
37
|
+
Response.new(:success => success?, :body => response_body)
|
38
38
|
end
|
39
39
|
|
40
40
|
def success?
|
data/lib/netsuite/version.rb
CHANGED
@@ -3,11 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe NetSuite::Actions::Add do
|
4
4
|
|
5
5
|
context 'Customer' do
|
6
|
-
let(:
|
7
|
-
|
8
|
-
:entity_id => 'Shutter Fly',
|
9
|
-
:company_name => 'Shutter Fly, Inc.'
|
10
|
-
}
|
6
|
+
let(:customer) do
|
7
|
+
NetSuite::Records::Customer.new(:entity_id => 'Shutter Fly', :company_name => 'Shutter Fly, Inc.')
|
11
8
|
end
|
12
9
|
|
13
10
|
before do
|
@@ -25,11 +22,41 @@ describe NetSuite::Actions::Add do
|
|
25
22
|
end
|
26
23
|
|
27
24
|
it 'makes a valid request to the NetSuite API' do
|
28
|
-
NetSuite::Actions::Add.call(
|
25
|
+
NetSuite::Actions::Add.call(customer)
|
29
26
|
end
|
30
27
|
|
31
28
|
it 'returns a valid Response object' do
|
32
|
-
response = NetSuite::Actions::Add.call(
|
29
|
+
response = NetSuite::Actions::Add.call(customer)
|
30
|
+
response.should be_kind_of(NetSuite::Response)
|
31
|
+
response.should be_success
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'Invoice' do
|
36
|
+
let(:invoice) do
|
37
|
+
NetSuite::Records::Invoice.new(:source => 'Google', :total => 100.0)
|
38
|
+
end
|
39
|
+
|
40
|
+
before do
|
41
|
+
savon.expects(:add).with({
|
42
|
+
'platformMsgs:record' => {
|
43
|
+
'listRel:source' => 'Google',
|
44
|
+
'listRel:total' => 100.0
|
45
|
+
},
|
46
|
+
:attributes! => {
|
47
|
+
'platformMsgs:baseRef' => {
|
48
|
+
'xsi:type' => 'listRel:Invoice'
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}).returns(:add_invoice)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'makes a valid request to the NetSuite API' do
|
55
|
+
NetSuite::Actions::Add.call(invoice)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'returns a valid Response object' do
|
59
|
+
response = NetSuite::Actions::Add.call(invoice)
|
33
60
|
response.should be_kind_of(NetSuite::Response)
|
34
61
|
response.should be_success
|
35
62
|
end
|
@@ -4,24 +4,6 @@ describe NetSuite::FieldSupport do
|
|
4
4
|
let(:klass) { Class.new.send(:include, NetSuite::FieldSupport) }
|
5
5
|
let(:instance) { klass.new }
|
6
6
|
|
7
|
-
describe '#initialize' do
|
8
|
-
before do
|
9
|
-
klass.field(:banana)
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'stores the passed in attributes into the attributes instance variable' do
|
13
|
-
instance = klass.new(:banana => 'for a monkey')
|
14
|
-
instance.send(:attributes).should eql(:banana => 'for a monkey')
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'ignores passed in attributes that are not in the fields set' do
|
18
|
-
instance = klass.new(:apple => 'for a horse', :banana => 'for a monkey')
|
19
|
-
instance.send(:attributes).should eql(:banana => 'for a monkey')
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'renames attributes with swirlies'
|
23
|
-
end
|
24
|
-
|
25
7
|
describe '.fields' do
|
26
8
|
context 'with arguments' do
|
27
9
|
it 'calls .field with each argument passed to it' do
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Foo
|
4
|
+
module Bar
|
5
|
+
class Baz
|
6
|
+
include NetSuite::RecordSupport
|
7
|
+
|
8
|
+
def attributes
|
9
|
+
{ :source => 'Google', :total => 100.0 }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe NetSuite::RecordSupport do
|
16
|
+
let(:instance) { Foo::Bar::Baz.new }
|
17
|
+
|
18
|
+
describe '#record_type' do
|
19
|
+
it 'returns a hash of attributes to be used in a SOAP request' do
|
20
|
+
instance.to_record.should eql({
|
21
|
+
'listRel:source' => 'Google',
|
22
|
+
'listRel:total' => 100.0
|
23
|
+
})
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#record_type' do
|
28
|
+
it 'returns a string of the record type to be used in a SOAP request' do
|
29
|
+
instance.record_type.should eql('listRel:Baz')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NetSuite::Records::CustomerAddressbookList do
|
4
|
+
let(:attributes) do
|
5
|
+
{
|
6
|
+
:addressbook => {
|
7
|
+
:addr1 => '123 Happy Lane',
|
8
|
+
:addr_text => "123 Happy Lane\nLos Angeles CA 90007",
|
9
|
+
:city => 'Los Angeles',
|
10
|
+
:country => '_unitedStates',
|
11
|
+
:default_billing => true,
|
12
|
+
:default_shipping => true,
|
13
|
+
:internal_id => '567',
|
14
|
+
:is_residential => false,
|
15
|
+
:label => '123 Happy Lane',
|
16
|
+
:override => false,
|
17
|
+
:state => 'CA',
|
18
|
+
:zip => '90007'
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
let(:record) { NetSuite::Records::CustomerAddressbookList.new(attributes) }
|
23
|
+
|
24
|
+
it 'has all the right fields' do
|
25
|
+
[
|
26
|
+
:default_shipping, :default_billing, :is_residential, :label, :attention, :addressee,
|
27
|
+
:phone, :addr1, :addr2, :addr3, :city, :zip, :country, :addr_text, :override, :state
|
28
|
+
].each do |field|
|
29
|
+
record.should have_field(field)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#initialize' do
|
34
|
+
context 'when taking in a hash of attributes' do
|
35
|
+
it 'sets the attributes for the object given the attributes hash' do
|
36
|
+
record.addr1.should eql('123 Happy Lane')
|
37
|
+
record.addr_text.should eql("123 Happy Lane\nLos Angeles CA 90007")
|
38
|
+
record.city.should eql('Los Angeles')
|
39
|
+
record.country.should eql('_unitedStates')
|
40
|
+
record.default_billing.should be_true
|
41
|
+
record.default_shipping.should be_true
|
42
|
+
record.is_residential.should be_false
|
43
|
+
record.label.should eql('123 Happy Lane')
|
44
|
+
record.override.should be_false
|
45
|
+
record.state.should eql('CA')
|
46
|
+
record.zip.should eql('90007')
|
47
|
+
record.internal_id.should eql('567')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when taking in a CustomerAddressbookList instance' do
|
52
|
+
it 'sets the attributes for the object given the record attributes' do
|
53
|
+
old_record = NetSuite::Records::CustomerAddressbookList.new(attributes)
|
54
|
+
record = NetSuite::Records::CustomerAddressbookList.new(old_record)
|
55
|
+
record.addr1.should eql('123 Happy Lane')
|
56
|
+
record.addr_text.should eql("123 Happy Lane\nLos Angeles CA 90007")
|
57
|
+
record.city.should eql('Los Angeles')
|
58
|
+
record.country.should eql('_unitedStates')
|
59
|
+
record.default_billing.should be_true
|
60
|
+
record.default_shipping.should be_true
|
61
|
+
record.is_residential.should be_false
|
62
|
+
record.label.should eql('123 Happy Lane')
|
63
|
+
record.override.should be_false
|
64
|
+
record.state.should eql('CA')
|
65
|
+
record.zip.should eql('90007')
|
66
|
+
record.internal_id.should eql('567')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NetSuite::Records::Customer do
|
4
|
+
let(:customer) { NetSuite::Records::Customer.new }
|
5
|
+
|
6
|
+
it 'has all the right fields' do
|
7
|
+
[
|
8
|
+
:access_role, :account_number, :aging, :alt_email, :alt_name, :alt_phone, :balance, :bill_pay,
|
9
|
+
:buying_reason, :buying_time_frame, :campaign_category, :category, :click_stream, :comments, :company_name,
|
10
|
+
:consol_aging, :consol_balance, :consol_days_overdue, :consol_deposit_balance, :consol_overdue_balance,
|
11
|
+
:consol_unbilled_orders, :contact_roles_list, :contrib_pct, :credit_cards_list, :credit_hold_override, :credit_limit,
|
12
|
+
:currency, :currency_list, :custom_field_list, :custom_form, :date_created, :days_overdue, :default_address,
|
13
|
+
:deposit_balance, :download_list, :email, :email_preference, :email_transactions, :end_date, :entity_id, :entity_status,
|
14
|
+
:estimated_budget, :fax, :fax_transactions, :first_name, :first_visit, :give_access, :global_subscription_status,
|
15
|
+
:group_pricing_list, :home_phone, :image, :is_budget_approved, :is_inactive, :is_person, :item_pricing_list, :keywords,
|
16
|
+
:language, :last_modified, :last_name, :last_page_visited, :last_visit, :lead_source, :middle_name, :mobile_phone,
|
17
|
+
:opening_balance, :opening_balance_account, :opening_balance_date, :overdue_balance, :parent, :partner, :partners_list,
|
18
|
+
:password, :password_2, :phone, :phonetic_name, :pref_cc_processor, :price_level, :print_on_check_as,
|
19
|
+
:print_transactions, :referrer, :reminder_days, :representing_subsidiary, :require_pwd_change, :resale_number,
|
20
|
+
:sales_group, :sales_readiness, :sales_rep, :sales_team_list, :salutation, :send_email, :ship_complete, :shipping_item,
|
21
|
+
:stage, :start_date, :subscriptions_list, :subsidiary, :sync_partner_teams, :tax_exempt, :tax_item, :taxable, :terms,
|
22
|
+
:territory, :third_party_acct, :third_party_country, :third_party_zipcode, :title, :unbilled_orders, :url,
|
23
|
+
:vat_reg_number, :visits, :web_lead
|
24
|
+
].each do |field|
|
25
|
+
customer.should have_field(field)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'has an addressbook_list field that builds a CustomerAddressbookList object' do
|
30
|
+
customer.addressbook_list = {
|
31
|
+
:addressbook => {
|
32
|
+
:addr1 => '123 Happy Lane',
|
33
|
+
:addr_text => "123 Happy Lane\nLos Angeles CA 90007",
|
34
|
+
:city => 'Los Angeles',
|
35
|
+
:country => '_unitedStates',
|
36
|
+
:default_billing => true,
|
37
|
+
:default_shipping => true,
|
38
|
+
:internal_id => '567',
|
39
|
+
:is_residential => false,
|
40
|
+
:label => '123 Happy Lane',
|
41
|
+
:override => false,
|
42
|
+
:state => 'CA',
|
43
|
+
:zip => '90007'
|
44
|
+
}
|
45
|
+
}
|
46
|
+
customer.addressbook_list.should be_kind_of(NetSuite::Records::CustomerAddressbookList)
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '.get' do
|
50
|
+
context 'when the response is successful' do
|
51
|
+
let(:response) { NetSuite::Response.new(:success => true, :body => { :is_person => true }) }
|
52
|
+
|
53
|
+
it 'returns a Customer instance populated with the data from the response object' do
|
54
|
+
NetSuite::Actions::Get.should_receive(:call).with(1).and_return(response)
|
55
|
+
customer = NetSuite::Records::Customer.get(1)
|
56
|
+
customer.should be_kind_of(NetSuite::Records::Customer)
|
57
|
+
customer.is_person.should be_true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when the response is unsuccessful' do
|
62
|
+
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
63
|
+
|
64
|
+
it 'returns a Customer instance populated with the data from the response object' do
|
65
|
+
NetSuite::Actions::Get.should_receive(:call).with(1).and_return(response)
|
66
|
+
lambda {
|
67
|
+
NetSuite::Records::Customer.get(1)
|
68
|
+
}.should raise_error(NetSuite::RecordNotFound, 'NetSuite::Records::Customer with ID=1 could not be found')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#add' do
|
74
|
+
let(:customer) { NetSuite::Records::Customer.new(:entity_id => 'TEST CUSTOMER', :is_person => true) }
|
75
|
+
|
76
|
+
context 'when the response is successful' do
|
77
|
+
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
78
|
+
|
79
|
+
it 'returns true' do
|
80
|
+
NetSuite::Actions::Add.should_receive(:call).
|
81
|
+
with(customer).
|
82
|
+
and_return(response)
|
83
|
+
customer.add.should be_true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'when the response is unsuccessful' do
|
88
|
+
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
89
|
+
|
90
|
+
it 'returns false' do
|
91
|
+
NetSuite::Actions::Add.should_receive(:call).
|
92
|
+
with(customer).
|
93
|
+
and_return(response)
|
94
|
+
customer.add.should be_false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#to_record' do
|
100
|
+
let(:customer) { NetSuite::Records::Customer.new(:entity_id => 'TEST CUSTOMER', :is_person => true) }
|
101
|
+
|
102
|
+
it 'returns a hash of attributes that can be used in a SOAP request' do
|
103
|
+
customer.to_record.should eql({
|
104
|
+
'listRel:entityId' => 'TEST CUSTOMER',
|
105
|
+
'listRel:isPerson' => true
|
106
|
+
})
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#record_type' do
|
111
|
+
it 'returns a string type for the record to be used in a SOAP request' do
|
112
|
+
customer.record_type.should eql('listRel:Customer')
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NetSuite::Records::Invoice do
|
4
|
+
let(:invoice) { NetSuite::Records::Invoice.new }
|
5
|
+
let(:customer) { NetSuite::Records::Customer.new }
|
6
|
+
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
7
|
+
|
8
|
+
it 'has all the right fields' do
|
9
|
+
[
|
10
|
+
:created_date, :last_modified_date, :custom_form, :entity, :tran_date, :tran_id, :source, :created_from, :posting_period,
|
11
|
+
:opportunity, :department, :klass, :terms, :location, :subsidiary, :due_date, :discount_date, :discount_amount, :sales_rep,
|
12
|
+
:contrib_pct, :partner, :lead_source, :start_date, :end_date, :other_ref_name, :memo, :sales_effective_date,
|
13
|
+
:exclude_commission, :total_cost_estimate, :est_gross_profit, :est_gross_profit_percent, :rev_rec_schedule,
|
14
|
+
:rev_rec_start_date, :rev_rec_end_date, :amount_paid, :amount_remaining, :balance, :account, :on_credit_hold,
|
15
|
+
:exchange_rate, :currency_name, :promo_code, :discount_item, :discount_rate, :is_taxable, :tax_item, :tax_rate,
|
16
|
+
:to_be_printed, :to_be_emailed, :to_be_faxed, :fax, :message_sel, :message, :transaction_bill_address, :bill_address_list,
|
17
|
+
:bill_address, :transaction_ship_address, :ship_address_list, :ship_address, :fob, :ship_date, :ship_method, :shipping_cost,
|
18
|
+
:shipping_tax_1_rate, :shipping_tax_2_rate, :shipping_tax_code, :handling_tax_code, :handling_tax_1_rate, :handling_cost,
|
19
|
+
:handling_tax_2_rate, :tracking_numbers, :linked_tracking_numbers, :sales_group, :sub_total, :revenue_status,
|
20
|
+
:recognized_revenue, :deferred_revenue, :rev_rec_on_rev_commitment, :sync_sales_teams, :discount_total, :tax_total,
|
21
|
+
:alt_shipping_cost, :alt_handling_cost, :total, :status, :job, :billing_schedule, :email, :tax_2_total, :vat_reg_num,
|
22
|
+
:exp_cost_discount, :item_cost_discount, :time_discount, :exp_cost_disc_rate, :item_cost_disc_rate, :time_disc_rate,
|
23
|
+
:exp_cost_disc_amount, :exp_cost_tax_rate_1, :exp_cost_tax_rate_2, :item_cost_disc_amount, :exp_cost_tax_code,
|
24
|
+
:exp_cost_disc_tax_1_amt, :item_cost_tax_rate_1, :time_disc_amount, :item_cost_tax_code, :exp_cost_disc_taxable,
|
25
|
+
:item_cost_disc_taxable, :item_cost_tax_rate_2, :item_cost_disc_tax_1_amt, :item_cost_disc_print, :time_disc_taxable,
|
26
|
+
:time_tax_rate_1, :exp_cost_disc_print, :time_tax_code, :time_disc_print, :gift_cert_applied, :time_disc_tax_1_amt,
|
27
|
+
:tran_is_vsoe_bundle, :time_tax_rate_2, :vsoe_auto_calc, :sync_partner_teams, :sales_team_list, :partners_list, :item_list,
|
28
|
+
:item_cost_list, :gift_cert_redemption_list, :exp_cost_list, :time_list, :ship_group_list, :custom_field_list
|
29
|
+
].each do |field|
|
30
|
+
invoice.should have_field(field)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'handles the "klass" field correctly'
|
35
|
+
# This field maps to 'class' but cannot be set as such in Ruby as it will cause runtime errors.
|
36
|
+
|
37
|
+
describe '.initialize' do
|
38
|
+
context 'when the request is successful' do
|
39
|
+
it 'returns an initialized invoice from the customer entity' do
|
40
|
+
NetSuite::Actions::Initialize.should_receive(:call).with(customer).and_return(response)
|
41
|
+
invoice = NetSuite::Records::Invoice.initialize(customer)
|
42
|
+
invoice.should be_kind_of(NetSuite::Records::Invoice)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when the response is unsuccessful' do
|
47
|
+
pending
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#add' do
|
52
|
+
let(:test_data) { { :email => 'test@example.com', :fax => '1234567890' } }
|
53
|
+
|
54
|
+
context 'when the response is successful' do
|
55
|
+
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
56
|
+
|
57
|
+
it 'returns true' do
|
58
|
+
invoice = NetSuite::Records::Invoice.new(test_data)
|
59
|
+
NetSuite::Actions::Add.should_receive(:call).
|
60
|
+
with(invoice).
|
61
|
+
and_return(response)
|
62
|
+
invoice.add.should be_true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when the response is unsuccessful' do
|
67
|
+
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
68
|
+
|
69
|
+
it 'returns false' do
|
70
|
+
invoice = NetSuite::Records::Invoice.new(test_data)
|
71
|
+
NetSuite::Actions::Add.should_receive(:call).
|
72
|
+
with(invoice).
|
73
|
+
and_return(response)
|
74
|
+
invoice.add.should be_false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
3
|
+
<soapenv:Header>
|
4
|
+
<platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2011_2.platform.webservices.netsuite.com">
|
5
|
+
<platformMsgs:nsId>WEBSERVICES_3392464_1220201115821392011296470399_67055c545d0</platformMsgs:nsId>
|
6
|
+
</platformMsgs:documentInfo>
|
7
|
+
</soapenv:Header>
|
8
|
+
<soapenv:Body>
|
9
|
+
<addResponse xmlns="urn:messages_2_5.platform.webservices.netsuite.com">
|
10
|
+
<writeResponse xmlns="urn:messages_2_5.platform.webservices.netsuite.com">
|
11
|
+
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_5.platform.webservices.netsuite.com"/>
|
12
|
+
<baseRef internalId="999" type="invoice" xsi:type="ns2:RecordRef" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="urn:core_2_5.platform.webservices.netsuite.com"/>
|
13
|
+
</writeResponse>
|
14
|
+
</addResponse>
|
15
|
+
</soapenv:Body>
|
16
|
+
</soapenv:Envelope>
|
@@ -11,10 +11,10 @@
|
|
11
11
|
<platformCore:status isSuccess="true" xmlns:platformCore="urn:core_2011_2.platform.webservices.netsuite.com"/>
|
12
12
|
<record xsi:type="tranSales:Invoice" xmlns:tranSales="urn:sales_2011_2.transactions.webservices.netsuite.com">
|
13
13
|
<tranSales:customForm internalId="101" xmlns:platformCore="urn:core_2011_2.platform.webservices.netsuite.com">
|
14
|
-
<platformCore:name>
|
14
|
+
<platformCore:name>Test Product Invoice</platformCore:name>
|
15
15
|
</tranSales:customForm>
|
16
16
|
<tranSales:entity internalId="988" xmlns:platformCore="urn:core_2011_2.platform.webservices.netsuite.com">
|
17
|
-
<platformCore:name>100157
|
17
|
+
<platformCore:name>100157 Shutter Fly</platformCore:name>
|
18
18
|
</tranSales:entity>
|
19
19
|
<tranSales:tranDate>2012-01-02T00:00:00.000-08:00</tranSales:tranDate>
|
20
20
|
<tranSales:tranId>2582003</tranSales:tranId>
|
@@ -27,28 +27,28 @@
|
|
27
27
|
<platformCore:name>1100 Accounts Receivable</platformCore:name>
|
28
28
|
</tranSales:account>
|
29
29
|
<tranSales:transactionBillAddress xmlns:platformCommon="urn:common_2011_2.platform.webservices.netsuite.com">
|
30
|
-
<platformCommon:billAddr1>
|
31
|
-
<platformCommon:billCity>
|
32
|
-
<platformCommon:billState>
|
33
|
-
<platformCommon:billZip>
|
30
|
+
<platformCommon:billAddr1>123 Happy Lane</platformCommon:billAddr1>
|
31
|
+
<platformCommon:billCity>Los Angeles</platformCommon:billCity>
|
32
|
+
<platformCommon:billState>CA</platformCommon:billState>
|
33
|
+
<platformCommon:billZip>90007</platformCommon:billZip>
|
34
34
|
<platformCommon:billCountry>_unitedStates</platformCommon:billCountry>
|
35
35
|
</tranSales:transactionBillAddress>
|
36
36
|
<tranSales:billAddressList internalId="567" xmlns:platformCore="urn:core_2011_2.platform.webservices.netsuite.com">
|
37
|
-
<platformCore:name>
|
37
|
+
<platformCore:name>123 Happy Lane</platformCore:name>
|
38
38
|
</tranSales:billAddressList>
|
39
|
-
<tranSales:billAddress>
|
39
|
+
<tranSales:billAddress>123 Happy Lane, Los Angeles, CA 90007</tranSales:billAddress>
|
40
40
|
<tranSales:transactionShipAddress xmlns:platformCommon="urn:common_2011_2.platform.webservices.netsuite.com">
|
41
|
-
<platformCommon:shipAddr1>
|
42
|
-
<platformCommon:shipCity>
|
43
|
-
<platformCommon:shipState>
|
44
|
-
<platformCommon:shipZip>
|
41
|
+
<platformCommon:shipAddr1>123 Happy Lane</platformCommon:shipAddr1>
|
42
|
+
<platformCommon:shipCity>Los Angeles</platformCommon:shipCity>
|
43
|
+
<platformCommon:shipState>CA</platformCommon:shipState>
|
44
|
+
<platformCommon:shipZip>90007</platformCommon:shipZip>
|
45
45
|
<platformCommon:shipCountry>_unitedStates</platformCommon:shipCountry>
|
46
46
|
<platformCommon:shipIsResidential>false</platformCommon:shipIsResidential>
|
47
47
|
</tranSales:transactionShipAddress>
|
48
48
|
<tranSales:shipAddressList internalId="567" xmlns:platformCore="urn:core_2011_2.platform.webservices.netsuite.com">
|
49
|
-
<platformCore:name>
|
49
|
+
<platformCore:name>123 Happy Lane</platformCore:name>
|
50
50
|
</tranSales:shipAddressList>
|
51
|
-
<tranSales:shipAddress>
|
51
|
+
<tranSales:shipAddress>123 Happy Lane, Los Angeles, CA 90007</tranSales:shipAddress>
|
52
52
|
<tranSales:shipDate>2012-01-02T00:00:00.000-08:00</tranSales:shipDate>
|
53
53
|
<tranSales:subTotal>0.0</tranSales:subTotal>
|
54
54
|
<tranSales:syncSalesTeams>false</tranSales:syncSalesTeams>
|
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:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Moran
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-01-
|
19
|
-
default_executable:
|
18
|
+
date: 2012-01-04 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: savon
|
@@ -104,34 +103,40 @@ files:
|
|
104
103
|
- lib/netsuite/actions/add.rb
|
105
104
|
- lib/netsuite/actions/get.rb
|
106
105
|
- lib/netsuite/actions/initialize.rb
|
106
|
+
- lib/netsuite/attribute_support.rb
|
107
107
|
- lib/netsuite/configuration.rb
|
108
|
-
- lib/netsuite/entities/customer.rb
|
109
108
|
- lib/netsuite/errors.rb
|
110
109
|
- lib/netsuite/field_support.rb
|
110
|
+
- lib/netsuite/record_support.rb
|
111
|
+
- lib/netsuite/records/customer.rb
|
112
|
+
- lib/netsuite/records/customer_addressbook_list.rb
|
113
|
+
- lib/netsuite/records/invoice.rb
|
111
114
|
- lib/netsuite/response.rb
|
112
115
|
- lib/netsuite/savon_support.rb
|
113
|
-
- lib/netsuite/transactions/invoice.rb
|
114
116
|
- lib/netsuite/version.rb
|
115
117
|
- netsuite.gemspec
|
116
118
|
- spec/netsuite/actions/add_spec.rb
|
117
119
|
- spec/netsuite/actions/get_spec.rb
|
118
120
|
- spec/netsuite/actions/initialize_spec.rb
|
121
|
+
- spec/netsuite/attribute_support_spec.rb
|
119
122
|
- spec/netsuite/configuration_spec.rb
|
120
|
-
- spec/netsuite/entities/customer_spec.rb
|
121
123
|
- spec/netsuite/field_support_spec.rb
|
124
|
+
- spec/netsuite/record_support_spec.rb
|
125
|
+
- spec/netsuite/records/customer_addressbook_list_spec.rb
|
126
|
+
- spec/netsuite/records/customer_spec.rb
|
127
|
+
- spec/netsuite/records/invoice_spec.rb
|
122
128
|
- spec/netsuite/response_spec.rb
|
123
129
|
- spec/netsuite/savon_support_spec.rb
|
124
|
-
- spec/netsuite/transactions/invoice_spec.rb
|
125
130
|
- spec/netsuite_spec.rb
|
126
131
|
- spec/spec_helper.rb
|
127
132
|
- spec/support/configuration.rb
|
128
133
|
- spec/support/field_matcher.rb
|
129
134
|
- spec/support/fixtures/add/add_customer.xml
|
135
|
+
- spec/support/fixtures/add/add_invoice.xml
|
130
136
|
- spec/support/fixtures/get/get_customer.xml
|
131
137
|
- spec/support/fixtures/initialize/initialize_invoice_from_customer.xml
|
132
138
|
- spec/support/savon.rb
|
133
139
|
- wsdl/2011_02.wsdl
|
134
|
-
has_rdoc: true
|
135
140
|
homepage: https://github.com/RevolutionPrep/netsuite
|
136
141
|
licenses: []
|
137
142
|
|
@@ -161,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
166
|
requirements: []
|
162
167
|
|
163
168
|
rubyforge_project:
|
164
|
-
rubygems_version: 1.
|
169
|
+
rubygems_version: 1.8.13
|
165
170
|
signing_key:
|
166
171
|
specification_version: 3
|
167
172
|
summary: NetSuite SuiteTalk API Wrapper
|
@@ -169,17 +174,21 @@ test_files:
|
|
169
174
|
- spec/netsuite/actions/add_spec.rb
|
170
175
|
- spec/netsuite/actions/get_spec.rb
|
171
176
|
- spec/netsuite/actions/initialize_spec.rb
|
177
|
+
- spec/netsuite/attribute_support_spec.rb
|
172
178
|
- spec/netsuite/configuration_spec.rb
|
173
|
-
- spec/netsuite/entities/customer_spec.rb
|
174
179
|
- spec/netsuite/field_support_spec.rb
|
180
|
+
- spec/netsuite/record_support_spec.rb
|
181
|
+
- spec/netsuite/records/customer_addressbook_list_spec.rb
|
182
|
+
- spec/netsuite/records/customer_spec.rb
|
183
|
+
- spec/netsuite/records/invoice_spec.rb
|
175
184
|
- spec/netsuite/response_spec.rb
|
176
185
|
- spec/netsuite/savon_support_spec.rb
|
177
|
-
- spec/netsuite/transactions/invoice_spec.rb
|
178
186
|
- spec/netsuite_spec.rb
|
179
187
|
- spec/spec_helper.rb
|
180
188
|
- spec/support/configuration.rb
|
181
189
|
- spec/support/field_matcher.rb
|
182
190
|
- spec/support/fixtures/add/add_customer.xml
|
191
|
+
- spec/support/fixtures/add/add_invoice.xml
|
183
192
|
- spec/support/fixtures/get/get_customer.xml
|
184
193
|
- spec/support/fixtures/initialize/initialize_invoice_from_customer.xml
|
185
194
|
- spec/support/savon.rb
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module NetSuite
|
2
|
-
module Entities
|
3
|
-
class Customer
|
4
|
-
include FieldSupport
|
5
|
-
|
6
|
-
fields :internal_id, :external_id, :custom_form, :entity_id, :alt_name, :is_person, :phonetic_name,
|
7
|
-
:salutation, :first_name, :middle_name, :last_name, :company_name, :entity_status, :parent, :phone,
|
8
|
-
:fax, :email, :url, :default_address, :is_inactive, :category, :title, :print_on_check_as, :alt_phone,
|
9
|
-
:home_phone, :mobile_phone, :alt_email, :language, :comments, :date_created, :image, :email_preference,
|
10
|
-
:subsidiary, :representing_subsidiary, :sales_rep, :territory, :contrib_pct, :partner, :sales_group,
|
11
|
-
:vat_reg_number, :account_number, :tax_exempt, :terms, :credit_limit, :credit_hold_override, :balance,
|
12
|
-
:overdue_balance, :days_overdue, :unbilled_orders, :consol_unbilled_orders, :consol_overdue_balance,
|
13
|
-
:consol_deposit_balance, :consol_balance, :consol_aging, :consol_days_overdue, :price_level, :currency,
|
14
|
-
:pref_cc_processor, :deposit_balance, :ship_complete, :taxable, :tax_item, :resale_number, :aging,
|
15
|
-
:start_date, :end_date, :reminder_days, :shipping_item, :third_party_acct, :third_party_zipcode,
|
16
|
-
:third_party_country, :give_access, :estimated_budget, :access_role, :send_email, :password, :password_2,
|
17
|
-
:require_pwd_change, :campaign_category, :lead_source, :web_lead, :referrer, :keywords, :click_stream,
|
18
|
-
:last_page_visited, :visits, :first_visit, :last_visit, :bill_pay, :opening_balance, :last_modified,
|
19
|
-
:opening_balance_date, :opening_balance_account, :stage, :email_transactions, :print_transactions,
|
20
|
-
:fax_transactions, :sync_partner_teams, :is_budget_approved, :global_subscription_status, :sales_readiness,
|
21
|
-
:sales_team_list, :buying_reason, :download_list, :buying_time_frame, :addressbook_list, :subscriptions_list,
|
22
|
-
:contact_roles_list, :currency_list, :credit_cards_list, :partners_list, :group_pricing_list,
|
23
|
-
:item_pricing_list, :custom_field_list
|
24
|
-
|
25
|
-
def self.get(id)
|
26
|
-
response = NetSuite::Actions::Get.call(id)
|
27
|
-
if response.success?
|
28
|
-
new(response.body)
|
29
|
-
else
|
30
|
-
raise RecordNotFound, "#{self} with ID=#{id} could not be found"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def add
|
35
|
-
response = NetSuite::Actions::Add.call(@attributes)
|
36
|
-
response.success?
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module NetSuite
|
2
|
-
module Transactions
|
3
|
-
class Invoice
|
4
|
-
include FieldSupport
|
5
|
-
|
6
|
-
fields :internal_id, :external_id, :created_date, :last_modified_date, :custom_form, :entity, :tran_date, :tran_id,
|
7
|
-
:source, :created_from, :posting_period, :opportunity, :department, :klass, :terms, :location, :subsidiary, :due_date,
|
8
|
-
:discount_date, :discount_amount, :sales_rep, :contrib_pct, :partner, :lead_source, :start_date, :end_date,
|
9
|
-
:other_ref_name, :memo, :sales_effective_date, :exclude_commission, :total_cost_estimate, :est_gross_profit,
|
10
|
-
:est_gross_profit_percent, :rev_rec_schedule, :rev_rec_start_date, :rev_rec_end_date, :amount_paid, :amount_remaining,
|
11
|
-
:balance, :account, :on_credit_hold, :exchange_rate, :currency_name, :promo_code, :discount_item, :discount_rate,
|
12
|
-
:is_taxable, :tax_item, :tax_rate, :to_be_printed, :to_be_emailed, :to_be_faxed, :fax, :message_sel, :message,
|
13
|
-
:transaction_bill_address, :bill_address_list, :bill_address, :transaction_ship_address, :ship_address_list,
|
14
|
-
:ship_address, :fob, :ship_date, :ship_method, :shipping_cost, :shipping_tax_1_rate, :shipping_tax_2_rate,
|
15
|
-
:shipping_tax_code, :handling_tax_code, :handling_tax_1_rate, :handling_cost, :handling_tax_2_rate, :tracking_numbers,
|
16
|
-
:linked_tracking_numbers, :sales_group, :sub_total, :revenue_status, :recognized_revenue, :deferred_revenue,
|
17
|
-
:rev_rec_on_rev_commitment, :sync_sales_teams, :discount_total, :tax_total, :alt_shipping_cost, :alt_handling_cost,
|
18
|
-
:total, :status, :job, :billing_schedule, :email, :tax_2_total, :vat_reg_num, :exp_cost_discount, :item_cost_discount,
|
19
|
-
:time_discount, :exp_cost_disc_rate, :item_cost_disc_rate, :time_disc_rate, :exp_cost_disc_amount, :exp_cost_tax_rate_1,
|
20
|
-
:exp_cost_tax_rate_2, :item_cost_disc_amount, :exp_cost_tax_code, :exp_cost_disc_tax_1_amt, :item_cost_tax_rate_1,
|
21
|
-
:time_disc_amount, :item_cost_tax_code, :exp_cost_disc_taxable, :item_cost_disc_taxable, :item_cost_tax_rate_2,
|
22
|
-
:item_cost_disc_tax_1_amt, :item_cost_disc_print, :time_disc_taxable, :time_tax_rate_1, :exp_cost_disc_print,
|
23
|
-
:time_tax_code, :time_disc_print, :gift_cert_applied, :time_disc_tax_1_amt, :tran_is_vsoe_bundle, :time_tax_rate_2,
|
24
|
-
:vsoe_auto_calc, :sync_partner_teams, :sales_team_list, :partners_list, :item_list, :item_cost_list,
|
25
|
-
:gift_cert_redemption_list, :exp_cost_list, :time_list, :ship_group_list, :custom_field_list
|
26
|
-
|
27
|
-
def self.initialize(customer)
|
28
|
-
response = NetSuite::Actions::Initialize.call(customer)
|
29
|
-
if response.success?
|
30
|
-
new(response.body)
|
31
|
-
else
|
32
|
-
raise RecordNotFound, "#{self} with ID=#{id} could not be found"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe NetSuite::Entities::Customer do
|
4
|
-
let(:customer) { NetSuite::Entities::Customer.new }
|
5
|
-
|
6
|
-
it 'has all the right fields' do
|
7
|
-
[
|
8
|
-
:internal_id, :external_id, :custom_form, :entity_id, :alt_name, :is_person, :phonetic_name,
|
9
|
-
:salutation, :first_name, :middle_name, :last_name, :company_name, :entity_status, :parent,
|
10
|
-
:phone, :fax, :email, :url, :default_address, :is_inactive, :category, :title, :print_on_check_as,
|
11
|
-
:alt_phone, :home_phone, :mobile_phone, :alt_email, :language, :comments, :date_created, :image,
|
12
|
-
:email_preference, :subsidiary, :representing_subsidiary, :sales_rep, :territory, :contrib_pct,
|
13
|
-
:partner, :sales_group, :vat_reg_number, :account_number, :tax_exempt, :terms, :credit_limit,
|
14
|
-
:credit_hold_override, :balance, :overdue_balance, :days_overdue, :unbilled_orders,
|
15
|
-
:consol_unbilled_orders, :consol_overdue_balance, :consol_deposit_balance, :consol_balance,
|
16
|
-
:consol_aging, :consol_days_overdue, :price_level, :currency, :pref_cc_processor, :deposit_balance,
|
17
|
-
:ship_complete, :taxable, :tax_item, :resale_number, :aging, :start_date, :end_date, :reminder_days,
|
18
|
-
:shipping_item, :third_party_acct, :third_party_zipcode, :third_party_country, :give_access,
|
19
|
-
:estimated_budget, :access_role, :send_email, :password, :password_2, :require_pwd_change,
|
20
|
-
:campaign_category, :lead_source, :web_lead, :referrer, :keywords, :click_stream,
|
21
|
-
:last_page_visited, :visits, :first_visit, :last_visit, :bill_pay, :opening_balance, :last_modified,
|
22
|
-
:opening_balance_date, :opening_balance_account, :stage, :email_transactions, :print_transactions,
|
23
|
-
:fax_transactions, :sync_partner_teams, :is_budget_approved, :global_subscription_status,
|
24
|
-
:sales_readiness, :sales_team_list, :buying_reason, :download_list, :buying_time_frame,
|
25
|
-
:addressbook_list, :subscriptions_list, :contact_roles_list, :currency_list, :credit_cards_list,
|
26
|
-
:partners_list, :group_pricing_list, :item_pricing_list, :custom_field_list
|
27
|
-
].each do |field|
|
28
|
-
customer.should have_field(field)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '.get' do
|
33
|
-
context 'when the response is successful' do
|
34
|
-
let(:response) { NetSuite::Response.new(:success => true, :body => { :is_person => true }) }
|
35
|
-
|
36
|
-
it 'returns a Customer instance populated with the data from the response object' do
|
37
|
-
NetSuite::Actions::Get.should_receive(:call).with(1).and_return(response)
|
38
|
-
customer = NetSuite::Entities::Customer.get(1)
|
39
|
-
customer.should be_kind_of(NetSuite::Entities::Customer)
|
40
|
-
customer.is_person.should be_true
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'when the response is unsuccessful' do
|
45
|
-
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
46
|
-
|
47
|
-
it 'returns a Customer instance populated with the data from the response object' do
|
48
|
-
NetSuite::Actions::Get.should_receive(:call).with(1).and_return(response)
|
49
|
-
lambda {
|
50
|
-
NetSuite::Entities::Customer.get(1)
|
51
|
-
}.should raise_error(NetSuite::RecordNotFound, 'NetSuite::Entities::Customer with ID=1 could not be found')
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe '#add' do
|
57
|
-
let(:test_data) { { :entity_id => 'TEST CUSTOMER', :is_person => true } }
|
58
|
-
|
59
|
-
context 'when the response is successful' do
|
60
|
-
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
61
|
-
|
62
|
-
it 'returns true' do
|
63
|
-
NetSuite::Actions::Add.should_receive(:call).
|
64
|
-
with(test_data).
|
65
|
-
and_return(response)
|
66
|
-
customer = NetSuite::Entities::Customer.new(test_data)
|
67
|
-
customer.add.should be_true
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'when the response is unsuccessful' do
|
72
|
-
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
73
|
-
it 'returns false' do
|
74
|
-
NetSuite::Actions::Add.should_receive(:call).
|
75
|
-
with(test_data).
|
76
|
-
and_return(response)
|
77
|
-
customer = NetSuite::Entities::Customer.new(test_data)
|
78
|
-
customer.add.should be_false
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe NetSuite::Transactions::Invoice do
|
4
|
-
let(:invoice) { NetSuite::Transactions::Invoice.new }
|
5
|
-
let(:customer) { NetSuite::Entities::Customer.new }
|
6
|
-
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
7
|
-
|
8
|
-
it 'has all the right fields' do
|
9
|
-
[
|
10
|
-
:internal_id, :external_id, :created_date, :last_modified_date, :custom_form, :entity, :tran_date, :tran_id,
|
11
|
-
:source, :created_from, :posting_period, :opportunity, :department, :klass, :terms, :location, :subsidiary,
|
12
|
-
:due_date, :discount_date, :discount_amount, :sales_rep, :contrib_pct, :partner, :lead_source, :start_date,
|
13
|
-
:end_date, :other_ref_name, :memo, :sales_effective_date, :exclude_commission, :total_cost_estimate,
|
14
|
-
:est_gross_profit, :est_gross_profit_percent, :rev_rec_schedule, :rev_rec_start_date, :rev_rec_end_date,
|
15
|
-
:amount_paid, :amount_remaining, :balance, :account, :on_credit_hold, :exchange_rate, :currency_name,
|
16
|
-
:promo_code, :discount_item, :discount_rate, :is_taxable, :tax_item, :tax_rate, :to_be_printed, :to_be_emailed,
|
17
|
-
:to_be_faxed, :fax, :message_sel, :message, :transaction_bill_address, :bill_address_list, :bill_address,
|
18
|
-
:transaction_ship_address, :ship_address_list, :ship_address, :fob, :ship_date, :ship_method, :shipping_cost,
|
19
|
-
:shipping_tax_1_rate, :shipping_tax_2_rate, :shipping_tax_code, :handling_tax_code, :handling_tax_1_rate,
|
20
|
-
:handling_cost, :handling_tax_2_rate, :tracking_numbers, :linked_tracking_numbers, :sales_group, :sub_total,
|
21
|
-
:revenue_status, :recognized_revenue, :deferred_revenue, :rev_rec_on_rev_commitment, :sync_sales_teams,
|
22
|
-
:discount_total, :tax_total, :alt_shipping_cost, :alt_handling_cost, :total, :status, :job, :billing_schedule,
|
23
|
-
:email, :tax_2_total, :vat_reg_num, :exp_cost_discount, :item_cost_discount, :time_discount, :exp_cost_disc_rate,
|
24
|
-
:item_cost_disc_rate, :time_disc_rate, :exp_cost_disc_amount, :exp_cost_tax_rate_1, :exp_cost_tax_rate_2,
|
25
|
-
:item_cost_disc_amount, :exp_cost_tax_code, :exp_cost_disc_tax_1_amt, :item_cost_tax_rate_1, :time_disc_amount,
|
26
|
-
:item_cost_tax_code, :exp_cost_disc_taxable, :item_cost_disc_taxable, :item_cost_tax_rate_2, :item_cost_disc_tax_1_amt,
|
27
|
-
:item_cost_disc_print, :time_disc_taxable, :time_tax_rate_1, :exp_cost_disc_print, :time_tax_code, :time_disc_print,
|
28
|
-
:gift_cert_applied, :time_disc_tax_1_amt, :tran_is_vsoe_bundle, :time_tax_rate_2, :vsoe_auto_calc, :sync_partner_teams,
|
29
|
-
:sales_team_list, :partners_list, :item_list, :item_cost_list, :gift_cert_redemption_list, :exp_cost_list, :time_list,
|
30
|
-
:ship_group_list, :custom_field_list
|
31
|
-
].each do |field|
|
32
|
-
invoice.should have_field(field)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'handles the "klass" field correctly'
|
37
|
-
# This field maps to 'class' but cannot be set as such in Ruby as it will cause runtime errors.
|
38
|
-
|
39
|
-
describe '.initialize' do
|
40
|
-
context 'when the request is successful' do
|
41
|
-
it 'returns an initialized invoice from the customer entity' do
|
42
|
-
NetSuite::Actions::Initialize.should_receive(:call).with(customer).and_return(response)
|
43
|
-
invoice = NetSuite::Transactions::Invoice.initialize(customer)
|
44
|
-
invoice.should be_kind_of(NetSuite::Transactions::Invoice)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when the response is unsuccessful' do
|
49
|
-
pending
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|