netsuite 0.8.2 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +69 -20
  3. data/lib/netsuite.rb +11 -0
  4. data/lib/netsuite/actions/search.rb +1 -6
  5. data/lib/netsuite/actions/update_list.rb +109 -0
  6. data/lib/netsuite/records/bin_transfer.rb +38 -0
  7. data/lib/netsuite/records/bin_transfer_inventory.rb +20 -0
  8. data/lib/netsuite/records/bin_transfer_inventory_list.rb +10 -0
  9. data/lib/netsuite/records/cash_refund_item.rb +1 -1
  10. data/lib/netsuite/records/classification.rb +1 -1
  11. data/lib/netsuite/records/inbound_shipment.rb +33 -0
  12. data/lib/netsuite/records/inbound_shipment_item.rb +39 -0
  13. data/lib/netsuite/records/inbound_shipment_item_list.rb +11 -0
  14. data/lib/netsuite/records/inter_company_journal_entry.rb +48 -0
  15. data/lib/netsuite/records/inter_company_journal_entry_line.rb +28 -0
  16. data/lib/netsuite/records/inter_company_journal_entry_line_list.rb +14 -0
  17. data/lib/netsuite/records/inventory_item.rb +1 -1
  18. data/lib/netsuite/records/price_level.rb +26 -0
  19. data/lib/netsuite/records/return_authorization_item.rb +1 -1
  20. data/lib/netsuite/records/sales_order_item.rb +12 -5
  21. data/lib/netsuite/records/support_case.rb +1 -1
  22. data/lib/netsuite/support/actions.rb +2 -0
  23. data/lib/netsuite/support/search_result.rb +7 -3
  24. data/lib/netsuite/utilities.rb +26 -0
  25. data/lib/netsuite/version.rb +1 -1
  26. data/spec/netsuite/actions/update_list_spec.rb +107 -0
  27. data/spec/netsuite/records/basic_record_spec.rb +5 -1
  28. data/spec/netsuite/records/inter_company_journal_entry_line_list_spec.rb +26 -0
  29. data/spec/netsuite/records/inter_company_journal_entry_line_spec.rb +60 -0
  30. data/spec/netsuite/records/inter_company_journal_entry_spec.rb +156 -0
  31. data/spec/netsuite/records/inventory_item_spec.rb +57 -0
  32. data/spec/netsuite/records/price_level_spec.rb +16 -0
  33. data/spec/netsuite/records/return_authorization_item_spec.rb +1 -1
  34. data/spec/netsuite/records/sales_order_item_spec.rb +11 -5
  35. data/spec/netsuite/utilities_spec.rb +21 -0
  36. data/spec/support/fixtures/update_list/update_list_items.xml +22 -0
  37. data/spec/support/fixtures/update_list/update_list_one_item.xml +18 -0
  38. data/spec/support/fixtures/update_list/update_list_with_errors.xml +32 -0
  39. metadata +29 -2
@@ -53,7 +53,11 @@ describe 'basic records' do
53
53
  NetSuite::Records::AssemblyUnbuild,
54
54
  NetSuite::Records::AssemblyComponent,
55
55
  NetSuite::Records::InventoryNumber,
56
- NetSuite::Records::LotNumberedAssemblyItem
56
+ NetSuite::Records::PriceLevel,
57
+ NetSuite::Records::LotNumberedAssemblyItem,
58
+ NetSuite::Records::InboundShipment,
59
+ NetSuite::Records::InterCompanyJournalEntry,
60
+ NetSuite::Records::BinTransfer
57
61
  ]
58
62
  }
59
63
 
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::InterCompanyJournalEntryLineList do
4
+ let(:list) { NetSuite::Records::InterCompanyJournalEntryLineList.new }
5
+
6
+ it 'has a custom_fields attribute' do
7
+ expect(list.lines).to be_kind_of(Array)
8
+ end
9
+
10
+ describe '#to_record' do
11
+ before do
12
+ list.lines << NetSuite::Records::InterCompanyJournalEntryLine.new(:memo => 'This is a memo')
13
+ end
14
+
15
+ it 'can represent itself as a SOAP record' do
16
+ record =
17
+ {
18
+ 'tranGeneral:line' => [{
19
+ 'tranGeneral:memo' => 'This is a memo'
20
+ }]
21
+ }
22
+ expect(list.to_record).to eql(record)
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::InterCompanyJournalEntryLine do
4
+ let(:line) { NetSuite::Records::InterCompanyJournalEntryLine.new }
5
+
6
+ it 'has all the right fields' do
7
+ [
8
+ :amortization_end_date, :amortization_residual, :amortiz_start_date, :credit, :debit, :eliminate, :end_date, :gross_amt, :memo,
9
+ :residual, :start_date, :tax1_amt, :tax_rate1
10
+ ].each do |field|
11
+ expect(line).to have_field(field)
12
+ end
13
+ end
14
+
15
+ it 'has all the right record refs' do
16
+ [
17
+ :account, :department, :entity, :klass, :line_subsidiary, :location, :schedule, :schedule_num, :tax1_acct, :tax_code
18
+ ].each do |record_ref|
19
+ expect(line).to have_record_ref(record_ref)
20
+ end
21
+ end
22
+
23
+ describe '#custom_field_list' do
24
+ it 'can be set from attributes' do
25
+ attributes = {
26
+ :custom_field => {
27
+ :amount => 10,
28
+ :internal_id => 'custfield_amount'
29
+ }
30
+ }
31
+ line.custom_field_list = attributes
32
+ expect(line.custom_field_list).to be_kind_of(NetSuite::Records::CustomFieldList)
33
+ expect(line.custom_field_list.custom_fields.length).to eql(1)
34
+ end
35
+
36
+ it 'can be set from a CustomFieldList object' do
37
+ custom_field_list = NetSuite::Records::CustomFieldList.new
38
+ line.custom_field_list = custom_field_list
39
+ expect(line.custom_field_list).to eql(custom_field_list)
40
+ end
41
+ end
42
+
43
+ describe '#to_record' do
44
+ let(:line) { NetSuite::Records::InterCompanyJournalEntryLine.new(:memo => 'This is a memo', :eliminate => true) }
45
+
46
+ it 'returns a hash of attributes that can be used in a SOAP request' do
47
+ expect(line.to_record).to eql({
48
+ 'tranGeneral:memo' => 'This is a memo',
49
+ 'tranGeneral:eliminate' => true
50
+ })
51
+ end
52
+ end
53
+
54
+ describe '#record_type' do
55
+ it 'returns a string type for the record to be used in a SOAP request' do
56
+ expect(line.record_type).to eql('tranGeneral:InterCompanyJournalEntryLine')
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,156 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::InterCompanyJournalEntry do
4
+ let(:entry) { NetSuite::Records::InterCompanyJournalEntry.new }
5
+
6
+ it 'has all the right fields' do
7
+ [
8
+ :approved, :created_date, :exchange_rate, :is_book_specific, :last_modified_date, :memo, :reversal_date,
9
+ :reversal_defer, :reversal_entry, :tran_date, :tran_id
10
+ ].each do |field|
11
+ expect(entry).to have_field(field)
12
+ end
13
+ end
14
+
15
+ it 'has all the right record refs' do
16
+ [
17
+ :created_from, :currency, :custom_form, :department, :klass, :location, :parent_expense_alloc, :posting_period,
18
+ :subsidiary, :to_subsidiary
19
+ ].each do |record_ref|
20
+ expect(entry).to have_record_ref(record_ref)
21
+ end
22
+ end
23
+
24
+ describe '#custom_field_list' do
25
+ it 'can be set from attributes' do
26
+ attributes = {
27
+ :custom_field => {
28
+ :amount => 10,
29
+ :script_id => 'custfield_amount'
30
+ }
31
+ }
32
+ entry.custom_field_list = attributes
33
+ expect(entry.custom_field_list).to be_kind_of(NetSuite::Records::CustomFieldList)
34
+ expect(entry.custom_field_list.custom_fields.length).to eql(1)
35
+ expect(entry.custom_field_list.custfield_amount.attributes[:amount]).to eq(10)
36
+ end
37
+
38
+ it 'can be set from a CustomFieldList object' do
39
+ custom_field_list = NetSuite::Records::CustomFieldList.new
40
+ entry.custom_field_list = custom_field_list
41
+ expect(entry.custom_field_list).to eql(custom_field_list)
42
+ end
43
+ end
44
+
45
+ describe '#line_list' do
46
+ it 'can be set from attributes' do
47
+ attributes = {
48
+ :line => {
49
+
50
+ }
51
+ }
52
+ entry.line_list = attributes
53
+ expect(entry.line_list).to be_kind_of(NetSuite::Records::InterCompanyJournalEntryLineList)
54
+ expect(entry.line_list.lines.length).to eql(1)
55
+ end
56
+
57
+ it 'can be set from a InterCompanyJournalEntryLineList object' do
58
+ line_list = NetSuite::Records::InterCompanyJournalEntryLineList.new
59
+ entry.line_list = line_list
60
+ expect(entry.line_list).to eql(line_list)
61
+ end
62
+ end
63
+
64
+ describe '.get' do
65
+ context 'when the response is successful' do
66
+ let(:response) { NetSuite::Response.new(:success => true, :body => { :approved => true }) }
67
+
68
+ it 'returns a InterCompanyJournalEntry instance populated with the data from the response object' do
69
+ expect(NetSuite::Actions::Get).to receive(:call).with([NetSuite::Records::InterCompanyJournalEntry, {:external_id => 1}], {}).and_return(response)
70
+ customer = NetSuite::Records::InterCompanyJournalEntry.get(:external_id => 1)
71
+ expect(customer).to be_kind_of(NetSuite::Records::InterCompanyJournalEntry)
72
+ expect(customer.approved).to be_truthy
73
+ end
74
+ end
75
+
76
+ context 'when the response is unsuccessful' do
77
+ let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
78
+
79
+ it 'raises a RecordNotFound exception' do
80
+ expect(NetSuite::Actions::Get).to receive(:call).with([NetSuite::Records::InterCompanyJournalEntry, {:external_id => 1}], {}).and_return(response)
81
+ expect {
82
+ NetSuite::Records::InterCompanyJournalEntry.get(:external_id => 1)
83
+ }.to raise_error(NetSuite::RecordNotFound,
84
+ /NetSuite::Records::InterCompanyJournalEntry with OPTIONS=(.*) could not be found/)
85
+ end
86
+ end
87
+ end
88
+
89
+ describe '#add' do
90
+ let(:entry) { NetSuite::Records::InterCompanyJournalEntry.new(:approved => true) }
91
+
92
+ context 'when the response is successful' do
93
+ let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
94
+
95
+ it 'returns true' do
96
+ expect(NetSuite::Actions::Add).to receive(:call).
97
+ with([entry], {}).
98
+ and_return(response)
99
+ expect(entry.add).to be_truthy
100
+ end
101
+ end
102
+
103
+ context 'when the response is unsuccessful' do
104
+ let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
105
+
106
+ it 'returns false' do
107
+ expect(NetSuite::Actions::Add).to receive(:call).
108
+ with([entry], {}).
109
+ and_return(response)
110
+ expect(entry.add).to be_falsey
111
+ end
112
+ end
113
+ end
114
+
115
+ describe '#delete' do
116
+ context 'when the response is successful' do
117
+ let(:response) { NetSuite::Response.new(:success => true, :body => { :internal_id => '1' }) }
118
+
119
+ it 'returns true' do
120
+ expect(NetSuite::Actions::Delete).to receive(:call).
121
+ with([entry], {}).
122
+ and_return(response)
123
+ expect(entry.delete).to be_truthy
124
+ end
125
+ end
126
+
127
+ context 'when the response is unsuccessful' do
128
+ let(:response) { NetSuite::Response.new(:success => false, :body => {}) }
129
+
130
+ it 'returns false' do
131
+ expect(NetSuite::Actions::Delete).to receive(:call).
132
+ with([entry], {}).
133
+ and_return(response)
134
+ expect(entry.delete).to be_falsey
135
+ end
136
+ end
137
+ end
138
+
139
+ describe '#to_record' do
140
+ let(:entry) { NetSuite::Records::InterCompanyJournalEntry.new(:tran_id => '1234', :approved => true) }
141
+
142
+ it 'returns a hash of attributes that can be used in a SOAP request' do
143
+ expect(entry.to_record).to eql({
144
+ 'tranGeneral:tranId' => '1234',
145
+ 'tranGeneral:approved' => true
146
+ })
147
+ end
148
+ end
149
+
150
+ describe '#record_type' do
151
+ it 'returns a string type for the record to be used in a SOAP request' do
152
+ expect(entry.record_type).to eql('tranGeneral:InterCompanyJournalEntry')
153
+ end
154
+ end
155
+
156
+ end
@@ -231,4 +231,61 @@ describe NetSuite::Records::InventoryItem do
231
231
  end
232
232
  end
233
233
 
234
+ describe '.update_list' do
235
+ before { savon.mock! }
236
+ after { savon.unmock! }
237
+
238
+ context 'with one item' do
239
+ before do
240
+ savon.expects(:update_list).with(:message =>
241
+ {
242
+ 'record' => [{
243
+ 'listAcct:itemId' => 'Target',
244
+ '@xsi:type' => 'listAcct:InventoryItem',
245
+ '@internalId' => '624113'
246
+ }]
247
+ }).returns(File.read('spec/support/fixtures/update_list/update_list_one_item.xml'))
248
+ end
249
+
250
+ it 'returns collection with one InventoryItem instances populated with the data from the response object' do
251
+ items = NetSuite::Records::InventoryItem.update_list([
252
+ NetSuite::Records::InventoryItem.new(internal_id: '624113', item_id: 'Target', upccode: 'Target')
253
+ ])
254
+ shutter_fly = items[0]
255
+ expect(shutter_fly).to be_kind_of(NetSuite::Records::InventoryItem)
256
+ expect(shutter_fly.item_id).to eq('Target')
257
+ expect(shutter_fly.internal_id).to eq('624113')
258
+ end
259
+ end
260
+
261
+ context 'with two items' do
262
+ before do
263
+ savon.expects(:update_list).with(:message =>
264
+ {
265
+ 'record' => [{
266
+ 'listAcct:itemId' => 'Shutter Fly',
267
+ '@xsi:type' => 'listAcct:InventoryItem',
268
+ '@internalId' => '624172'
269
+ },
270
+ {
271
+ 'listAcct:itemId' => 'Target',
272
+ '@xsi:type' => 'listAcct:InventoryItem',
273
+ '@internalId' => '624113'
274
+ }
275
+ ]
276
+ }).returns(File.read('spec/support/fixtures/update_list/update_list_items.xml'))
277
+ end
278
+
279
+ it 'returns collection of InventoryItem instances populated with the data from the response object' do
280
+ items = NetSuite::Records::InventoryItem.update_list( [
281
+ NetSuite::Records::InventoryItem.new(internal_id: '624172', item_id: 'Shutter Fly', upccode: 'Shutter Fly, Inc.'),
282
+ NetSuite::Records::InventoryItem.new(internal_id: '624113', item_id: 'Target', upccode: 'Target')
283
+ ])
284
+ shutter_fly = items[0]
285
+ expect(shutter_fly).to be_kind_of(NetSuite::Records::InventoryItem)
286
+ expect(shutter_fly.item_id).to eq('Shutter Fly')
287
+ expect(shutter_fly.internal_id).to eq('624172')
288
+ end
289
+ end
290
+ end
234
291
  end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe NetSuite::Records::PriceLevel do
4
+ describe "#initialize" do
5
+ it "behaves appropriately if it gets a hash as attributes[:pricing]" do
6
+ # this is what savon returns if there is only one pricing strategy matrix
7
+ # for the item:
8
+ level = {
9
+ :name => 'Base Price'
10
+ }
11
+
12
+ subject = NetSuite::Records::PriceLevel.new(level)
13
+ expect(subject.name).to eq(level[:name])
14
+ end
15
+ end
16
+ end
@@ -8,7 +8,7 @@ describe NetSuite::Records::ReturnAuthorizationItem do
8
8
  :alt_sales_amt, :amortization_period, :amortization_type, :amount, :bill_variance_status, :catch_up_period, :cost_estimate,
9
9
  :cost_estimate_rate, :cost_estimate_type, :days_before_expiration, :defer_rev_rec, :description, :gift_cert_from, :gift_cert_message,
10
10
  :gift_cert_recipient_email, :gift_cert_recipient_name, :id, :inventory_detail, :is_closed, :is_drop_shipment, :is_taxable,
11
- :is_vsoe_bundle, :item_subtype, :item_type, :line, :line_number, :matrix_type, :options, :print_items,
11
+ :is_vsoe_bundle, :item_subtype, :item_type, :line, :line_number, :matrix_type, :options, :order_line, :print_items,
12
12
  :quantity, :quantity_billed, :quantity_received, :quantity_rev_committed, :rate, :rate_schedule, :rev_rec_end_date,
13
13
  :rev_rec_start_date, :tax_rate1, :vsoe_allocation, :vsoe_amount, :vsoe_deferral, :vsoe_delivered, :vsoe_is_estimate,
14
14
  :vsoe_permit_discount, :vsoe_price, :vsoe_sop_group
@@ -5,11 +5,17 @@ describe NetSuite::Records::SalesOrderItem do
5
5
 
6
6
  it 'has all the right fields' do
7
7
  [
8
- :amount, :bin_numbers, :cost_estimate, :cost_estimate_type, :defer_rev_rec, :description, :gift_cert_from,
9
- :gift_cert_message, :gift_cert_number, :gift_cert_recipient_email, :gift_cert_recipient_name, :gross_amt, :is_taxable,
10
- :line, :order_line, :po_currency, :quantity, :rate, :rev_rec_end_date, :rev_rec_start_date, :rev_rec_term_in_months,
11
- :serial_numbers, :tax1_amt, :tax_rate1, :tax_rate2, :vsoe_allocation, :vsoe_amount, :vsoe_deferral, :vsoe_delivered,
12
- :vsoe_permit_discount, :vsoe_price
8
+ :amount, :bin_numbers, :cost_estimate, :cost_estimate_type,
9
+ :defer_rev_rec, :description, :expand_item_group,
10
+ :gift_cert_from, :gift_cert_message, :gift_cert_number,
11
+ :gift_cert_recipient_email, :gift_cert_recipient_name,
12
+ :gross_amt, :is_taxable, :line, :order_line, :po_currency,
13
+ :quantity, :quantity_back_ordered, :quantity_billed,
14
+ :quantity_committed, :quantity_fulfilled,
15
+ :rate, :rev_rec_end_date, :rev_rec_start_date,
16
+ :rev_rec_term_in_months, :serial_numbers, :tax1_amt, :tax_rate1,
17
+ :tax_rate2, :vsoe_allocation, :vsoe_amount, :vsoe_deferral,
18
+ :vsoe_delivered, :vsoe_permit_discount, :vsoe_price
13
19
  ].each do |field|
14
20
  expect(item).to have_field(field)
15
21
  end
@@ -13,6 +13,27 @@ describe NetSuite::Utilities do
13
13
  end
14
14
  end
15
15
 
16
+ it "#netsuite_data_center_urls" do
17
+ domains = NetSuite::Utilities.netsuite_data_center_urls('TSTDRV1576318')
18
+ expect(domains[:webservices_domain]).to eq('https://webservices.na1.netsuite.com')
19
+
20
+ NetSuite.configure do
21
+ reset!
22
+ sandbox true
23
+ end
24
+
25
+ domains = NetSuite::Utilities.netsuite_data_center_urls('TSTDRV1576318')
26
+ expect(domains[:webservices_domain]).to eq('https://webservices.na1.netsuite.com')
27
+
28
+ NetSuite.configure do
29
+ reset!
30
+ api_version '2015_1'
31
+ end
32
+
33
+ domains = NetSuite::Utilities.netsuite_data_center_urls('TSTDRV1576318')
34
+ expect(domains[:webservices_domain]).to eq('https://webservices.na1.netsuite.com')
35
+ end
36
+
16
37
  describe '#get_record' do
17
38
  context 'caching' do
18
39
  it 'does not hit the netsuite API' do
@@ -0,0 +1,22 @@
1
+ <soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2
+ <soapenv:Header>
3
+ <platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2015_1.platform.webservices.netsuite.com">
4
+ <platformMsgs:nsId>WEBSERVICES_4094105_100420174020144521635732562_3cddd9b4c927</platformMsgs:nsId>
5
+ </platformMsgs:documentInfo>
6
+ </soapenv:Header>
7
+ <soapenv:Body>
8
+ <updateListResponse xmlns="urn:messages_2015_1.platform.webservices.netsuite.com">
9
+ <writeResponseList>
10
+ <platformCore:status isSuccess="true" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
11
+ <writeResponse>
12
+ <platformCore:status isSuccess="true" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
13
+ <baseRef xsi:type="platformCore:RecordRef" type="inventoryItem" externalId="testing1" internalId="624113" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
14
+ </writeResponse>
15
+ <writeResponse>
16
+ <platformCore:status isSuccess="true" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
17
+ <baseRef xsi:type="platformCore:RecordRef" type="inventoryItem" externalId="testing1" internalId="624172" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
18
+ </writeResponse>
19
+ </writeResponseList>
20
+ </updateListResponse>
21
+ </soapenv:Body>
22
+ </soapenv:Envelope>
@@ -0,0 +1,18 @@
1
+ <soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2
+ <soapenv:Header>
3
+ <platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2015_1.platform.webservices.netsuite.com">
4
+ <platformMsgs:nsId>WEBSERVICES_4094105_100420174020144521635732562_3cddd9b4c927</platformMsgs:nsId>
5
+ </platformMsgs:documentInfo>
6
+ </soapenv:Header>
7
+ <soapenv:Body>
8
+ <updateListResponse xmlns="urn:messages_2015_1.platform.webservices.netsuite.com">
9
+ <writeResponseList>
10
+ <platformCore:status isSuccess="true" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
11
+ <writeResponse>
12
+ <platformCore:status isSuccess="true" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
13
+ <baseRef xsi:type="platformCore:RecordRef" type="inventoryItem" externalId="testing" internalId="624113" xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
14
+ </writeResponse>
15
+ </writeResponseList>
16
+ </updateListResponse>
17
+ </soapenv:Body>
18
+ </soapenv:Envelope>
@@ -0,0 +1,32 @@
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_2014_1.platform.webservices.netsuite.com">
5
+ <platformMsgs:nsId>WEBSERVICES_3868171_1117201410832887841076557109_965331437a3</platformMsgs:nsId>
6
+ </platformMsgs:documentInfo>
7
+ </soapenv:Header>
8
+ <soapenv:Body>
9
+ <updateListResponse xmlns="urn:messages_2014_1.platform.webservices.netsuite.com">
10
+ <writeResponseList>
11
+ <writeResponse>
12
+ <platformCore:status xmlns:platformCore="urn:core_2014_1.platform.webservices.netsuite.com" isSuccess="false">
13
+ <platformCore:statusDetail type="ERROR">
14
+ <platformCore:code>USER_ERROR</platformCore:code>
15
+ <platformCore:message>Please enter value(s) for: ItemId</platformCore:message>
16
+ </platformCore:statusDetail>
17
+ </platformCore:status>
18
+ <baseRef xmlns:platformCore="urn:core_2014_1.platform.webservices.netsuite.com" internalId="624172" type="InventoryItem" xsi:type="platformCore:RecordRef"/>
19
+ </writeResponse>
20
+ <writeResponse>
21
+ <platformCore:status xmlns:platformCore="urn:core_2014_1.platform.webservices.netsuite.com" isSuccess="false">
22
+ <platformCore:statusDetail type="ERROR">
23
+ <platformCore:code>USER_ERROR</platformCore:code>
24
+ <platformCore:message>Please enter value(s) for: ItemId</platformCore:message>
25
+ </platformCore:statusDetail>
26
+ </platformCore:status>
27
+ <baseRef xmlns:platformCore="urn:core_2014_1.platform.webservices.netsuite.com" internalId="624113" type="InventoryItem" xsi:type="platformCore:RecordRef"/>
28
+ </writeResponse>
29
+ </writeResponseList>
30
+ </updateListResponse>
31
+ </soapenv:Body>
32
+ </soapenv:Envelope>