netsuite 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/netsuite.rb +9 -6
- data/lib/netsuite/actions/add.rb +11 -11
- data/lib/netsuite/records/custom_record.rb +4 -10
- data/lib/netsuite/records/custom_record_type.rb +9 -1
- data/lib/netsuite/records/customer.rb +5 -12
- data/lib/netsuite/records/duration.rb +14 -0
- data/lib/netsuite/records/invoice.rb +5 -32
- data/lib/netsuite/records/job.rb +31 -7
- data/lib/netsuite/support/fields.rb +16 -6
- data/lib/netsuite/support/record_refs.rb +1 -9
- data/lib/netsuite/version.rb +1 -1
- data/spec/netsuite/records/custom_record_spec.rb +17 -2
- data/spec/netsuite/records/custom_record_type_spec.rb +8 -2
- data/spec/netsuite/records/customer_spec.rb +26 -17
- data/spec/netsuite/records/duration_spec.rb +14 -0
- data/spec/netsuite/records/invoice_spec.rb +73 -35
- data/spec/netsuite/records/job_spec.rb +134 -24
- metadata +6 -3
data/lib/netsuite.rb
CHANGED
@@ -26,23 +26,26 @@ require 'netsuite/actions/get'
|
|
26
26
|
require 'netsuite/actions/initialize'
|
27
27
|
require 'netsuite/actions/update'
|
28
28
|
|
29
|
-
#
|
29
|
+
# SUBRECORDS
|
30
30
|
require 'netsuite/records/bill_address'
|
31
31
|
require 'netsuite/records/custom_field'
|
32
32
|
require 'netsuite/records/custom_field_list'
|
33
|
-
require 'netsuite/records/customer'
|
34
33
|
require 'netsuite/records/customer_addressbook'
|
35
34
|
require 'netsuite/records/customer_addressbook_list'
|
36
|
-
require 'netsuite/records/invoice'
|
37
|
-
require 'netsuite/records/record_ref'
|
38
35
|
require 'netsuite/records/ship_address'
|
39
|
-
require 'netsuite/records/
|
36
|
+
require 'netsuite/records/record_ref'
|
40
37
|
require 'netsuite/records/invoice_item'
|
41
38
|
require 'netsuite/records/invoice_item_list'
|
39
|
+
require 'netsuite/records/custom_record_ref'
|
40
|
+
require 'netsuite/records/duration'
|
41
|
+
|
42
|
+
# RECORDS
|
43
|
+
require 'netsuite/records/customer'
|
44
|
+
require 'netsuite/records/invoice'
|
45
|
+
require 'netsuite/records/non_inventory_sale_item'
|
42
46
|
require 'netsuite/records/classification'
|
43
47
|
require 'netsuite/records/custom_record'
|
44
48
|
require 'netsuite/records/custom_record_type'
|
45
|
-
require 'netsuite/records/custom_record_ref'
|
46
49
|
require 'netsuite/records/job'
|
47
50
|
|
48
51
|
module NetSuite
|
data/lib/netsuite/actions/add.rb
CHANGED
@@ -17,7 +17,6 @@ module NetSuite
|
|
17
17
|
soap.namespaces['xmlns:tranSales'] = 'urn:sales_2011_2.transactions.webservices.netsuite.com'
|
18
18
|
soap.namespaces['xmlns:platformCommon'] = 'urn:common_2011_2.platform.webservices.netsuite.com'
|
19
19
|
soap.namespaces['xmlns:listAcct'] = 'urn:accounting_2011_2.lists.webservices.netsuite.com'
|
20
|
-
soap.namespaces['xmlns:setupCustom'] = 'urn:customization_2011_2.setup.webservices.netsuite.com'
|
21
20
|
soap.header = auth_header
|
22
21
|
soap.body = request_body
|
23
22
|
end
|
@@ -32,20 +31,21 @@ module NetSuite
|
|
32
31
|
# </platformMsgs:add>
|
33
32
|
# </soap:Body>
|
34
33
|
def request_body
|
35
|
-
|
34
|
+
hash = {
|
36
35
|
'platformMsgs:record' => @obj.to_record,
|
37
36
|
:attributes! => {
|
38
|
-
'platformMsgs:record' => {
|
37
|
+
'platformMsgs:record' => {
|
38
|
+
'xsi:type' => @obj.record_type
|
39
|
+
}
|
39
40
|
}
|
40
41
|
}
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
@obj.class.to_s.split('::').last.lower_camelcase
|
42
|
+
if @obj.respond_to?(:internal_id) && @obj.internal_id
|
43
|
+
hash[:attributes!]['platformMsgs:record']['platformMsgs:internalId'] = @obj.internal_id
|
44
|
+
end
|
45
|
+
if @obj.respond_to?(:external_id) && @obj.external_id
|
46
|
+
hash[:attributes!]['platformMsgs:record']['platformMsgs:externalId'] = @obj.external_id
|
47
|
+
end
|
48
|
+
hash
|
49
49
|
end
|
50
50
|
|
51
51
|
def success?
|
@@ -7,12 +7,14 @@ module NetSuite
|
|
7
7
|
include Namespaces::SetupCustom
|
8
8
|
|
9
9
|
fields :allow_attachments, :allow_inline_editing, :allow_numbering_override, :allow_quick_search, :created,
|
10
|
-
:
|
11
|
-
:
|
10
|
+
:custom_record_id, :description, :disclaimer, :enabl_email_merge, :enable_numbering, :include_name,
|
11
|
+
:is_available_offline, :is_inactive, :is_numbering_updateable, :is_ordered, :last_modified, :name,
|
12
12
|
:numbering_current_number, :numbering_init, :numbering_min_digits, :numbering_prefix, :numbering_suffix,
|
13
13
|
:record_name, :script_id, :show_creation_date, :show_creation_date_on_list, :show_id, :show_last_modified_on_list,
|
14
14
|
:show_last_modified, :show_notes, :show_owner, :show_owner_allow_change, :show_owner_on_list, :use_permissions
|
15
15
|
|
16
|
+
field :custom_field_list, CustomFieldList
|
17
|
+
|
16
18
|
record_refs :custom_form, :owner, :rec_type
|
17
19
|
|
18
20
|
attr_reader :internal_id
|
@@ -24,14 +26,6 @@ module NetSuite
|
|
24
26
|
initialize_from_attributes_hash(attributes)
|
25
27
|
end
|
26
28
|
|
27
|
-
def custom_field_list
|
28
|
-
attributes[:custom_field_list] ||= CustomFieldList.new
|
29
|
-
end
|
30
|
-
|
31
|
-
def custom_field_list=(attrs)
|
32
|
-
attributes[:custom_field_list] = attrs.kind_of?(CustomFieldList) ? attrs : CustomFieldList.new(attrs)
|
33
|
-
end
|
34
|
-
|
35
29
|
def self.get(options = {})
|
36
30
|
options.merge!(:type_id => type_id) unless options[:type_id]
|
37
31
|
response = Actions::Get.call(self, options.merge!(:custom => true))
|
@@ -2,8 +2,16 @@ module NetSuite
|
|
2
2
|
module Records
|
3
3
|
class CustomRecordType
|
4
4
|
include Support::Fields
|
5
|
+
include Support::RecordRefs
|
5
6
|
|
6
|
-
fields :allow_attachments, :allow_inline_editing, :allow_numbering_override, :allow_quick_search, :description,
|
7
|
+
fields :allow_attachments, :allow_inline_editing, :allow_numbering_override, :allow_quick_search, :description,
|
8
|
+
:disclaimer, :enable_mail_merge, :enable_numbering, :include_name, :is_available_offline, :is_inactive,
|
9
|
+
:is_numbering_updateable, :is_ordered, :numbering_current_number, :numbering_init, :numbering_min_digits,
|
10
|
+
:numbering_prefix, :numbering_suffix, :record_name, :script_id, :show_creation_date, :show_creation_date_on_list,
|
11
|
+
:show_id, :show_last_modified, :show_last_modified_on_list, :show_notes, :show_owner, :show_owner_allow_change,
|
12
|
+
:show_owner_on_list, :use_permissions
|
13
|
+
|
14
|
+
record_ref :owner
|
7
15
|
|
8
16
|
attr_reader :internal_id
|
9
17
|
attr_accessor :external_id
|
@@ -6,11 +6,10 @@ module NetSuite
|
|
6
6
|
include Support::Records
|
7
7
|
include Namespaces::ListRel
|
8
8
|
|
9
|
-
fields :access_role, :account_number, :
|
9
|
+
fields :access_role, :account_number, :aging, :alt_email, :alt_name, :alt_phone, :bill_pay,
|
10
10
|
:buying_reason, :buying_time_frame, :campaign_category, :category, :click_stream, :comments, :company_name,
|
11
|
-
:consol_aging, :consol_days_overdue,
|
12
|
-
:
|
13
|
-
:currency, :currency_list, :custom_field_list, :date_created, :days_overdue, :default_address,
|
11
|
+
:consol_aging, :consol_days_overdue, :contact_roles_list, :contrib_pct, :credit_cards_list, :credit_hold_override,
|
12
|
+
:credit_limit, :currency, :currency_list, :custom_field_list, :date_created, :days_overdue, :default_address,
|
14
13
|
:download_list, :email, :email_preference, :email_transactions, :end_date, :entity_id,
|
15
14
|
:estimated_budget, :fax, :fax_transactions, :first_name, :first_visit, :give_access, :global_subscription_status,
|
16
15
|
:group_pricing_list, :home_phone, :image, :is_budget_approved, :is_inactive, :is_person, :item_pricing_list, :keywords,
|
@@ -23,6 +22,8 @@ module NetSuite
|
|
23
22
|
:territory, :third_party_acct, :third_party_country, :third_party_zipcode, :title, :url,
|
24
23
|
:vat_reg_number, :visits, :web_lead
|
25
24
|
|
25
|
+
field :addressbook_list, CustomerAddressbookList
|
26
|
+
|
26
27
|
read_only_fields :balance, :consol_balance, :deposit_balance, :consol_deposit_balance, :overdue_balance,
|
27
28
|
:consol_overdue_balance, :unbilled_orders, :consol_unbilled_orders
|
28
29
|
|
@@ -37,14 +38,6 @@ module NetSuite
|
|
37
38
|
initialize_from_attributes_hash(attributes)
|
38
39
|
end
|
39
40
|
|
40
|
-
def addressbook_list=(attrs)
|
41
|
-
attributes[:addressbook_list] = CustomerAddressbookList.new(attrs)
|
42
|
-
end
|
43
|
-
|
44
|
-
def addressbook_list
|
45
|
-
attributes[:addressbook_list] ||= CustomerAddressbookList.new
|
46
|
-
end
|
47
|
-
|
48
41
|
def self.get(options = {})
|
49
42
|
response = Actions::Get.call(self, options)
|
50
43
|
if response.success?
|
@@ -27,6 +27,11 @@ module NetSuite
|
|
27
27
|
:to_be_printed, :total_cost_estimate, :tracking_numbers, :tran_date, :tran_id, :tran_is_vsoe_bundle,
|
28
28
|
:transaction_bill_address, :transaction_ship_address, :vat_reg_num, :vsoe_auto_calc
|
29
29
|
|
30
|
+
field :transaction_bill_address, BillAddress
|
31
|
+
field :transaction_ship_address, ShipAddress
|
32
|
+
field :item_list, InvoiceItemList
|
33
|
+
field :custom_field_list, CustomFieldList
|
34
|
+
|
30
35
|
read_only_fields :sub_total, :discount_total, :total, :recognized_revenue, :amount_remaining, :amount_paid
|
31
36
|
|
32
37
|
record_refs :account, :bill_address_list, :custom_form, :entity, :klass, :posting_period, :ship_address_list
|
@@ -40,38 +45,6 @@ module NetSuite
|
|
40
45
|
initialize_from_attributes_hash(attributes)
|
41
46
|
end
|
42
47
|
|
43
|
-
def transaction_bill_address=(attrs)
|
44
|
-
attributes[:transaction_bill_address] = attrs.kind_of?(BillAddress) ? attrs : BillAddress.new(attrs)
|
45
|
-
end
|
46
|
-
|
47
|
-
def transaction_bill_address
|
48
|
-
attributes[:transaction_bill_address] ||= BillAddress.new
|
49
|
-
end
|
50
|
-
|
51
|
-
def transaction_ship_address=(attrs)
|
52
|
-
attributes[:transaction_ship_address] = attrs.kind_of?(ShipAddress) ? attrs : ShipAddress.new(attrs)
|
53
|
-
end
|
54
|
-
|
55
|
-
def transaction_ship_address
|
56
|
-
attributes[:transaction_ship_address] ||= ShipAddress.new
|
57
|
-
end
|
58
|
-
|
59
|
-
def item_list
|
60
|
-
attributes[:item_list] ||= InvoiceItemList.new
|
61
|
-
end
|
62
|
-
|
63
|
-
def item_list=(attrs)
|
64
|
-
attributes[:item_list] = InvoiceItemList.new(attrs)
|
65
|
-
end
|
66
|
-
|
67
|
-
def custom_field_list
|
68
|
-
attributes[:custom_field_list] ||= CustomFieldList.new
|
69
|
-
end
|
70
|
-
|
71
|
-
def custom_field_list=(attrs)
|
72
|
-
attributes[:custom_field_list] = attrs.kind_of?(CustomFieldList) ? attrs : CustomFieldList.new(attrs)
|
73
|
-
end
|
74
|
-
|
75
48
|
def self.get(options = {})
|
76
49
|
response = Actions::Get.call(self, options)
|
77
50
|
if response.success?
|
data/lib/netsuite/records/job.rb
CHANGED
@@ -2,21 +2,45 @@ module NetSuite
|
|
2
2
|
module Records
|
3
3
|
class Job
|
4
4
|
include Support::Fields
|
5
|
+
include Support::RecordRefs
|
6
|
+
include Support::Records
|
7
|
+
include Namespaces::ListRel
|
5
8
|
|
6
9
|
fields :account_number, :allocate_payroll_expenses, :allow_all_resources_for_tasks, :allow_expenses, :allow_time,
|
7
10
|
:alt_name, :alt_phone, :bill_pay, :calculated_end_date, :calculated_end_date_baseline, :comments, :company_name,
|
8
|
-
:date_created, :default_address, :email, :end_date, :entity_id, :estimated_cost,
|
9
|
-
:estimated_gross_profit_percent, :estimated_labor_cost, :estimated_labor_cost_baseline,
|
10
|
-
:estimated_revenue, :estimated_time, :fax, :fx_rate, :
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:start_date_baseline
|
11
|
+
:date_created, :default_address, :email, :email_preference, :end_date, :entity_id, :estimated_cost,
|
12
|
+
:estimated_gross_profit, :estimated_gross_profit_percent, :estimated_labor_cost, :estimated_labor_cost_baseline,
|
13
|
+
:estimated_labor_revenue, :estimated_revenue, :estimated_time, :fax, :fx_rate, :global_subscription_status,
|
14
|
+
:include_crm_tasks_in_totals, :is_exempt_time, :is_inactive, :is_productive_time, :is_utilized_time, :job_billing_type,
|
15
|
+
:job_price, :last_baseline_date, :last_modified_date, :limit_time_to_assignees, :materialize_time, :opening_balance,
|
16
|
+
:opening_balance_account, :opening_balance_date, :percent_complete, :percent_time_complete, :phone, :phonetic_name,
|
17
|
+
:projected_end_date, :projected_end_date_baseline, :start_date, :start_date_baseline
|
18
|
+
|
19
|
+
field :estimated_time_override, Duration
|
20
|
+
field :actual_time, Duration
|
21
|
+
field :time_remaining, Duration
|
22
|
+
|
23
|
+
record_refs :billing_schedule, :category, :currency, :custom_form, :entity_status, :estimate_rev_rec_template, :job_item,
|
24
|
+
:job_type, :language, :parent, :subsidiary, :workplace
|
15
25
|
|
16
26
|
def initialize(attributes = {})
|
17
27
|
initialize_from_attributes_hash(attributes)
|
18
28
|
end
|
19
29
|
|
30
|
+
def self.get(options = {})
|
31
|
+
response = Actions::Get.call(self, options)
|
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?
|
42
|
+
end
|
43
|
+
|
20
44
|
end
|
21
45
|
end
|
22
46
|
end
|
@@ -19,15 +19,25 @@ module NetSuite
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def field(name)
|
22
|
+
def field(name, klass = nil)
|
23
23
|
name_sym = name.to_sym
|
24
24
|
fields << name_sym
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
if klass
|
26
|
+
define_method(name_sym) do
|
27
|
+
attributes[name_sym] ||= klass.new
|
28
|
+
end
|
28
29
|
|
29
|
-
|
30
|
-
|
30
|
+
define_method("#{name_sym}=") do |value|
|
31
|
+
attributes[name_sym] = value.kind_of?(klass) ? value : klass.new(value)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
define_method(name_sym) do
|
35
|
+
attributes[name_sym]
|
36
|
+
end
|
37
|
+
|
38
|
+
define_method("#{name_sym}=") do |value|
|
39
|
+
attributes[name_sym] = value
|
40
|
+
end
|
31
41
|
end
|
32
42
|
end
|
33
43
|
|
@@ -15,15 +15,7 @@ module NetSuite
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def record_ref(name)
|
18
|
-
|
19
|
-
fields << name_sym
|
20
|
-
define_method "#{name}=" do |attrs|
|
21
|
-
attributes[name_sym] = NetSuite::Records::RecordRef.new(attrs)
|
22
|
-
end
|
23
|
-
|
24
|
-
define_method name_sym do
|
25
|
-
attributes[name_sym]
|
26
|
-
end
|
18
|
+
field name, NetSuite::Records::RecordRef
|
27
19
|
end
|
28
20
|
|
29
21
|
end
|
data/lib/netsuite/version.rb
CHANGED
@@ -24,8 +24,23 @@ describe NetSuite::Records::CustomRecord do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
describe '#custom_field_list' do
|
28
|
+
it 'can be set from attributes' do
|
29
|
+
attributes = {
|
30
|
+
:custom_field => {
|
31
|
+
:amount => 10
|
32
|
+
}
|
33
|
+
}
|
34
|
+
record.custom_field_list = attributes
|
35
|
+
record.custom_field_list.should be_kind_of(NetSuite::Records::CustomFieldList)
|
36
|
+
record.custom_field_list.custom_fields.length.should eql(1)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'can be set from a CustomFieldList object' do
|
40
|
+
custom_field_list = NetSuite::Records::CustomFieldList.new
|
41
|
+
record.custom_field_list = custom_field_list
|
42
|
+
record.custom_field_list.should eql(custom_field_list)
|
43
|
+
end
|
29
44
|
end
|
30
45
|
|
31
46
|
describe '.get' do
|
@@ -3,8 +3,6 @@ require 'spec_helper'
|
|
3
3
|
describe NetSuite::Records::CustomRecordType do
|
4
4
|
let(:record_type) { NetSuite::Records::CustomRecordType.new }
|
5
5
|
|
6
|
-
# <element name="owner" type="platformCore:RecordRef" minOccurs="0"/>
|
7
|
-
|
8
6
|
# <element name="fieldList" type="setupCustom:CustomRecordTypeFieldList" minOccurs="0"/>
|
9
7
|
# <element name="tabsList" type="setupCustom:CustomRecordTypeTabsList" minOccurs="0"/>
|
10
8
|
# <element name="sublistsList" type="setupCustom:CustomRecordTypeSublistsList" minOccurs="0"/>
|
@@ -28,6 +26,14 @@ describe NetSuite::Records::CustomRecordType do
|
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
29
|
+
it 'has all the right record refs' do
|
30
|
+
[
|
31
|
+
:owner
|
32
|
+
].each do |record_ref|
|
33
|
+
record_type.should have_record_ref(record_ref)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
31
37
|
describe '.get' do
|
32
38
|
context 'when the response is successful' do
|
33
39
|
let(:response) { NetSuite::Response.new(:success => true, :body => { :allow_attachments => true }) }
|
@@ -34,24 +34,33 @@ describe NetSuite::Records::Customer do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
:
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
37
|
+
describe '#addressbook_list' do
|
38
|
+
it 'can be set from attributes' do
|
39
|
+
customer.addressbook_list = {
|
40
|
+
:addressbook => {
|
41
|
+
:addr1 => '123 Happy Lane',
|
42
|
+
:addr_text => "123 Happy Lane\nLos Angeles CA 90007",
|
43
|
+
:city => 'Los Angeles',
|
44
|
+
:country => '_unitedStates',
|
45
|
+
:default_billing => true,
|
46
|
+
:default_shipping => true,
|
47
|
+
:internal_id => '567',
|
48
|
+
:is_residential => false,
|
49
|
+
:label => '123 Happy Lane',
|
50
|
+
:override => false,
|
51
|
+
:state => 'CA',
|
52
|
+
:zip => '90007'
|
53
|
+
}
|
52
54
|
}
|
53
|
-
|
54
|
-
|
55
|
+
customer.addressbook_list.should be_kind_of(NetSuite::Records::CustomerAddressbookList)
|
56
|
+
customer.addressbook_list.addressbooks.length.should eql(1)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'can be set from a CustomerAddressbookList object' do
|
60
|
+
customer_addressbook_list = NetSuite::Records::CustomerAddressbookList.new
|
61
|
+
customer.addressbook_list = customer_addressbook_list
|
62
|
+
customer.addressbook_list.should eql(customer_addressbook_list)
|
63
|
+
end
|
55
64
|
end
|
56
65
|
|
57
66
|
describe '.get' do
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NetSuite::Records::Duration do
|
4
|
+
let(:duration) { NetSuite::Records::Duration.new }
|
5
|
+
|
6
|
+
it 'has all the right fields' do
|
7
|
+
[
|
8
|
+
:time_span, :unit
|
9
|
+
].each do |field|
|
10
|
+
duration.should have_field(field)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -49,16 +49,83 @@ describe NetSuite::Records::Invoice do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
describe '#custom_field_list' do
|
52
|
-
it '
|
52
|
+
it 'can be set from attributes' do
|
53
|
+
attributes = {
|
54
|
+
:custom_field => {
|
55
|
+
:amount => 10
|
56
|
+
}
|
57
|
+
}
|
58
|
+
invoice.custom_field_list = attributes
|
53
59
|
invoice.custom_field_list.should be_kind_of(NetSuite::Records::CustomFieldList)
|
60
|
+
invoice.custom_field_list.custom_fields.length.should eql(1)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'can be set from a CustomFieldList object' do
|
64
|
+
custom_field_list = NetSuite::Records::CustomFieldList.new
|
65
|
+
invoice.custom_field_list = custom_field_list
|
66
|
+
invoice.custom_field_list.should eql(custom_field_list)
|
54
67
|
end
|
55
68
|
end
|
56
69
|
|
57
|
-
describe 'item_list' do
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
70
|
+
describe '#item_list' do
|
71
|
+
it 'can be set from attributes' do
|
72
|
+
attributes = {
|
73
|
+
:item => {
|
74
|
+
:amount => 10
|
75
|
+
}
|
76
|
+
}
|
77
|
+
invoice.item_list = attributes
|
78
|
+
invoice.item_list.should be_kind_of(NetSuite::Records::InvoiceItemList)
|
79
|
+
invoice.item_list.items.length.should eql(1)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'can be set from a CustomFieldList object' do
|
83
|
+
item_list = NetSuite::Records::InvoiceItemList.new
|
84
|
+
invoice.item_list = item_list
|
85
|
+
invoice.item_list.should eql(item_list)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#transaction_bill_address' do
|
90
|
+
it 'has a transaction_bill_address field that builds a BillAddress object from attributes' do
|
91
|
+
invoice.transaction_bill_address = {
|
92
|
+
:"@xmlns:platform_common" => 'urn:common_2011_2.platform.webservices.netsuite.com',
|
93
|
+
:bill_addr1 => '123 Happy Lane',
|
94
|
+
:bill_city => 'Los Angeles',
|
95
|
+
:bill_country => '_unitedStates',
|
96
|
+
:bill_state => 'CA',
|
97
|
+
:bill_zip => '90007'
|
98
|
+
}
|
99
|
+
invoice.transaction_bill_address.should be_kind_of(NetSuite::Records::BillAddress)
|
100
|
+
invoice.transaction_bill_address.bill_city.should eql('Los Angeles')
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'can be set with a BillAddress object' do
|
104
|
+
bill_address = NetSuite::Records::BillAddress.new
|
105
|
+
invoice.transaction_bill_address = bill_address
|
106
|
+
invoice.transaction_bill_address.should eql(bill_address)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#transaction_ship_address' do
|
111
|
+
it 'has a transaction_ship_address field that builds a ShipAddress object from attributes' do
|
112
|
+
invoice.transaction_ship_address = {
|
113
|
+
:"@xmlns:platform_common" => 'urn:common_2011_2.platform.webservices.netsuite.com',
|
114
|
+
:ship_addr1 => '123 Happy Lane',
|
115
|
+
:ship_city => 'Los Angeles',
|
116
|
+
:ship_country => '_unitedStates',
|
117
|
+
:ship_is_residential => false,
|
118
|
+
:ship_state => 'CA',
|
119
|
+
:ship_zip => '90007'
|
120
|
+
}
|
121
|
+
invoice.transaction_ship_address.should be_kind_of(NetSuite::Records::ShipAddress)
|
122
|
+
invoice.transaction_ship_address.ship_addr1.should eql('123 Happy Lane')
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'can be set with a ShipAddress object' do
|
126
|
+
ship_address = NetSuite::Records::ShipAddress.new
|
127
|
+
invoice.transaction_ship_address = ship_address
|
128
|
+
invoice.transaction_ship_address.should eql(ship_address)
|
62
129
|
end
|
63
130
|
end
|
64
131
|
|
@@ -100,35 +167,6 @@ describe NetSuite::Records::Invoice do
|
|
100
167
|
end
|
101
168
|
end
|
102
169
|
|
103
|
-
describe '#add' do
|
104
|
-
pending
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'has a transaction_bill_address field that builds a BillAddress object' do
|
108
|
-
invoice.transaction_bill_address = {
|
109
|
-
:"@xmlns:platform_common" => 'urn:common_2011_2.platform.webservices.netsuite.com',
|
110
|
-
:bill_addr1 => '123 Happy Lane',
|
111
|
-
:bill_city => 'Los Angeles',
|
112
|
-
:bill_country => '_unitedStates',
|
113
|
-
:bill_state => 'CA',
|
114
|
-
:bill_zip => '90007'
|
115
|
-
}
|
116
|
-
invoice.transaction_bill_address.should be_kind_of(NetSuite::Records::BillAddress)
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'has a transaction_ship_address field that builds a ShipAddress object' do
|
120
|
-
invoice.transaction_ship_address = {
|
121
|
-
:"@xmlns:platform_common" => 'urn:common_2011_2.platform.webservices.netsuite.com',
|
122
|
-
:ship_addr1 => '123 Happy Lane',
|
123
|
-
:ship_city => 'Los Angeles',
|
124
|
-
:ship_country => '_unitedStates',
|
125
|
-
:ship_is_residential => false,
|
126
|
-
:ship_state => 'CA',
|
127
|
-
:ship_zip => '90007'
|
128
|
-
}
|
129
|
-
invoice.transaction_ship_address.should be_kind_of(NetSuite::Records::ShipAddress)
|
130
|
-
end
|
131
|
-
|
132
170
|
describe '#add' do
|
133
171
|
let(:test_data) { { :email => 'test@example.com', :fax => '1234567890' } }
|
134
172
|
|
@@ -3,24 +3,6 @@ require 'spec_helper'
|
|
3
3
|
describe NetSuite::Records::Job do
|
4
4
|
let(:job) { NetSuite::Records::Job.new }
|
5
5
|
|
6
|
-
#<element name="customForm" type="platformCore:RecordRef" minOccurs="0"/>
|
7
|
-
#<element name="entityStatus" type="platformCore:RecordRef" minOccurs="0"/>
|
8
|
-
#<element name="parent" type="platformCore:RecordRef" minOccurs="0"/>
|
9
|
-
#<element name="category" type="platformCore:RecordRef" minOccurs="0"/>
|
10
|
-
#<element name="workplace" type="platformCore:RecordRef" minOccurs="0"/>
|
11
|
-
#<element name="language" type="platformCore:RecordRef" minOccurs="0"/>
|
12
|
-
#<element name="currency" type="platformCore:RecordRef" minOccurs="0"/>
|
13
|
-
#<element name="jobType" type="platformCore:RecordRef" minOccurs="0"/>
|
14
|
-
#<element name="estimatedTimeOverride" type="platformCore:Duration" minOccurs="0"/>
|
15
|
-
#<element name="emailPreference" type="listRelTyp:EmailPreference" minOccurs="0"/>
|
16
|
-
#<element name="subsidiary" type="platformCore:RecordRef" minOccurs="0"/>
|
17
|
-
#<element name="jobBillingType" type="listRelTyp:JobBillingType" minOccurs="0"/>
|
18
|
-
#<element name="billingSchedule" type="platformCore:RecordRef" minOccurs="0"/>
|
19
|
-
#<element name="jobItem" type="platformCore:RecordRef" minOccurs="0"/>
|
20
|
-
#<element name="actualTime" type="platformCore:Duration" minOccurs="0"/>
|
21
|
-
#<element name="timeRemaining" type="platformCore:Duration" minOccurs="0"/>
|
22
|
-
#<element name="estimateRevRecTemplate" type="platformCore:RecordRef" minOccurs="0"/>
|
23
|
-
#<element name="globalSubscriptionStatus" type="platformCommonTyp:GlobalSubscriptionStatus" minOccurs="0"/>
|
24
6
|
#<element name="jobResourcesList" type="listRel:JobResourcesList" minOccurs="0"/>
|
25
7
|
#<element name="addressbookList" type="listRel:JobAddressbookList" minOccurs="0"/>
|
26
8
|
#<element name="milestonesList" type="listRel:JobMilestonesList" minOccurs="0"/>
|
@@ -31,15 +13,143 @@ describe NetSuite::Records::Job do
|
|
31
13
|
[
|
32
14
|
:account_number, :allocate_payroll_expenses, :allow_all_resources_for_tasks, :allow_expenses, :allow_time, :alt_name,
|
33
15
|
:alt_phone, :bill_pay, :calculated_end_date, :calculated_end_date_baseline, :comments, :company_name, :date_created,
|
34
|
-
:default_address, :email, :end_date, :entity_id, :estimated_cost, :estimated_gross_profit,
|
35
|
-
:estimated_labor_cost, :estimated_labor_cost_baseline, :estimated_labor_revenue,
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
16
|
+
:default_address, :email, :email_preference, :end_date, :entity_id, :estimated_cost, :estimated_gross_profit,
|
17
|
+
:estimated_gross_profit_percent, :estimated_labor_cost, :estimated_labor_cost_baseline, :estimated_labor_revenue,
|
18
|
+
:estimated_revenue, :estimated_time, :fax, :fx_rate, :global_subscription_status, :include_crm_tasks_in_totals,
|
19
|
+
:is_exempt_time, :is_inactive, :is_productive_time, :is_utilized_time, :job_billing_type, :job_price, :last_baseline_date,
|
20
|
+
:last_modified_date, :limit_time_to_assignees, :materialize_time, :opening_balance, :opening_balance_account,
|
21
|
+
:opening_balance_date, :percent_complete, :percent_time_complete, :phone, :phonetic_name, :projected_end_date,
|
22
|
+
:projected_end_date_baseline, :start_date, :start_date_baseline
|
40
23
|
].each do |field|
|
41
24
|
job.should have_field(field)
|
42
25
|
end
|
43
26
|
end
|
44
27
|
|
28
|
+
it 'has all the right record refs' do
|
29
|
+
[
|
30
|
+
:billing_schedule, :category, :currency, :custom_form, :entity_status, :estimate_rev_rec_template, :job_item, :job_type, :language, :parent, :subsidiary, :workplace
|
31
|
+
].each do |record_ref|
|
32
|
+
job.should have_record_ref(record_ref)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#estimated_time_override' do
|
37
|
+
it 'can be set from attributes' do
|
38
|
+
attributes = {
|
39
|
+
:time_span => 10
|
40
|
+
}
|
41
|
+
job.estimated_time_override = attributes
|
42
|
+
job.estimated_time_override.should be_kind_of(NetSuite::Records::Duration)
|
43
|
+
job.estimated_time_override.time_span.should eql(10)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'can be set from a Duration object' do
|
47
|
+
duration = NetSuite::Records::Duration.new
|
48
|
+
job.estimated_time_override = duration
|
49
|
+
job.estimated_time_override.should eql(duration)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#actual_time' do
|
54
|
+
it 'can be set from attributes' do
|
55
|
+
attributes = {
|
56
|
+
:time_span => 20
|
57
|
+
}
|
58
|
+
job.actual_time = attributes
|
59
|
+
job.actual_time.should be_kind_of(NetSuite::Records::Duration)
|
60
|
+
job.actual_time.time_span.should eql(20)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'can be set from a Duration object' do
|
64
|
+
duration = NetSuite::Records::Duration.new
|
65
|
+
job.actual_time = duration
|
66
|
+
job.actual_time.should eql(duration)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#time_remaining' do
|
71
|
+
it 'can be set from attributes' do
|
72
|
+
attributes = {
|
73
|
+
:time_span => 30
|
74
|
+
}
|
75
|
+
job.time_remaining = attributes
|
76
|
+
job.time_remaining.should be_kind_of(NetSuite::Records::Duration)
|
77
|
+
job.time_remaining.time_span.should eql(30)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'can be set from a Duration object' do
|
81
|
+
duration = NetSuite::Records::Duration.new
|
82
|
+
job.time_remaining = duration
|
83
|
+
job.time_remaining.should eql(duration)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '.get' do
|
88
|
+
context 'when the response is successful' do
|
89
|
+
let(:response) { NetSuite::Response.new(:success => true, :body => { :account_number => 7 }) }
|
90
|
+
|
91
|
+
it 'returns a Job instance populated with the data from the response object' do
|
92
|
+
NetSuite::Actions::Get.should_receive(:call).with(NetSuite::Records::Job, :external_id => 1).and_return(response)
|
93
|
+
job = NetSuite::Records::Job.get(:external_id => 1)
|
94
|
+
job.should be_kind_of(NetSuite::Records::Job)
|
95
|
+
job.account_number.should be_true
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when the response is unsuccessful' do
|
100
|
+
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
101
|
+
|
102
|
+
it 'raises a RecordNotFound exception' do
|
103
|
+
NetSuite::Actions::Get.should_receive(:call).with(NetSuite::Records::Job, :external_id => 1).and_return(response)
|
104
|
+
lambda {
|
105
|
+
NetSuite::Records::Job.get(:external_id => 1)
|
106
|
+
}.should raise_error(NetSuite::RecordNotFound,
|
107
|
+
/NetSuite::Records::Job with OPTIONS=(.*) could not be found/)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '#add' do
|
113
|
+
let(:job) { NetSuite::Records::Job.new(:account_number => 7, :job_price => 10) }
|
114
|
+
|
115
|
+
context 'when the response is successful' do
|
116
|
+
let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
|
117
|
+
|
118
|
+
it 'returns true' do
|
119
|
+
NetSuite::Actions::Add.should_receive(:call).
|
120
|
+
with(job).
|
121
|
+
and_return(response)
|
122
|
+
job.add.should be_true
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'when the response is unsuccessful' do
|
127
|
+
let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
|
128
|
+
|
129
|
+
it 'returns false' do
|
130
|
+
NetSuite::Actions::Add.should_receive(:call).
|
131
|
+
with(job).
|
132
|
+
and_return(response)
|
133
|
+
job.add.should be_false
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe '#to_record' do
|
139
|
+
let(:job) { NetSuite::Records::Job.new(:entity_id => 'TEST JOB', :account_number => 7) }
|
140
|
+
|
141
|
+
it 'returns a hash of attributes that can be used in a SOAP request' do
|
142
|
+
job.to_record.should eql({
|
143
|
+
'listRel:entityId' => 'TEST JOB',
|
144
|
+
'listRel:accountNumber' => 7
|
145
|
+
})
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe '#record_type' do
|
150
|
+
it 'returns a string type for the record to be used in a SOAP request' do
|
151
|
+
job.record_type.should eql('listRel:Job')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
45
155
|
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:
|
4
|
+
hash: 57
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 19
|
10
|
+
version: 0.0.19
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Moran
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/netsuite/records/customer.rb
|
123
123
|
- lib/netsuite/records/customer_addressbook.rb
|
124
124
|
- lib/netsuite/records/customer_addressbook_list.rb
|
125
|
+
- lib/netsuite/records/duration.rb
|
125
126
|
- lib/netsuite/records/invoice.rb
|
126
127
|
- lib/netsuite/records/invoice_item.rb
|
127
128
|
- lib/netsuite/records/invoice_item_list.rb
|
@@ -152,6 +153,7 @@ files:
|
|
152
153
|
- spec/netsuite/records/customer_addressbook_list_spec.rb
|
153
154
|
- spec/netsuite/records/customer_addressbook_spec.rb
|
154
155
|
- spec/netsuite/records/customer_spec.rb
|
156
|
+
- spec/netsuite/records/duration_spec.rb
|
155
157
|
- spec/netsuite/records/invoice_item_list_spec.rb
|
156
158
|
- spec/netsuite/records/invoice_item_spec.rb
|
157
159
|
- spec/netsuite/records/invoice_spec.rb
|
@@ -229,6 +231,7 @@ test_files:
|
|
229
231
|
- spec/netsuite/records/customer_addressbook_list_spec.rb
|
230
232
|
- spec/netsuite/records/customer_addressbook_spec.rb
|
231
233
|
- spec/netsuite/records/customer_spec.rb
|
234
|
+
- spec/netsuite/records/duration_spec.rb
|
232
235
|
- spec/netsuite/records/invoice_item_list_spec.rb
|
233
236
|
- spec/netsuite/records/invoice_item_spec.rb
|
234
237
|
- spec/netsuite/records/invoice_spec.rb
|