netsuite 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +14 -12
  3. data/lib/netsuite.rb +16 -2
  4. data/lib/netsuite/actions/delete_list.rb +104 -0
  5. data/lib/netsuite/actions/login.rb +26 -1
  6. data/lib/netsuite/actions/search.rb +7 -3
  7. data/lib/netsuite/actions/upsert.rb +0 -4
  8. data/lib/netsuite/configuration.rb +1 -0
  9. data/lib/netsuite/namespaces/tran_purch.rb +11 -0
  10. data/lib/netsuite/records/cash_refund.rb +2 -2
  11. data/lib/netsuite/records/cash_sale.rb +41 -1
  12. data/lib/netsuite/records/cash_sale_item.rb +40 -0
  13. data/lib/netsuite/records/cash_sale_item_list.rb +25 -0
  14. data/lib/netsuite/records/contact.rb +1 -1
  15. data/lib/netsuite/records/contact_list.rb +1 -4
  16. data/lib/netsuite/records/credit_memo.rb +1 -1
  17. data/lib/netsuite/records/credit_memo_apply_list.rb +1 -4
  18. data/lib/netsuite/records/credit_memo_item.rb +1 -0
  19. data/lib/netsuite/records/credit_memo_item_list.rb +1 -4
  20. data/lib/netsuite/records/custom_field_list.rb +3 -0
  21. data/lib/netsuite/records/customer.rb +8 -8
  22. data/lib/netsuite/records/customer_payment.rb +1 -1
  23. data/lib/netsuite/records/customer_payment_apply.rb +1 -1
  24. data/lib/netsuite/records/customer_payment_apply_list.rb +13 -9
  25. data/lib/netsuite/records/customer_refund.rb +1 -1
  26. data/lib/netsuite/records/customer_refund_apply_list.rb +7 -3
  27. data/lib/netsuite/records/customer_refund_deposit_list.rb +1 -1
  28. data/lib/netsuite/records/deposit.rb +3 -3
  29. data/lib/netsuite/records/deposit_payment_list.rb +5 -2
  30. data/lib/netsuite/records/employee.rb +12 -4
  31. data/lib/netsuite/records/inventory_assignment.rb +1 -1
  32. data/lib/netsuite/records/inventory_assignment_list.rb +3 -1
  33. data/lib/netsuite/records/inventory_detail.rb +3 -3
  34. data/lib/netsuite/records/inventory_item.rb +4 -0
  35. data/lib/netsuite/records/invoice.rb +8 -4
  36. data/lib/netsuite/records/invoice_item_list.rb +4 -21
  37. data/lib/netsuite/records/job.rb +1 -1
  38. data/lib/netsuite/records/kit_item.rb +1 -1
  39. data/lib/netsuite/records/partner.rb +4 -2
  40. data/lib/netsuite/records/payment_method.rb +1 -1
  41. data/lib/netsuite/records/promotion_code.rb +1 -1
  42. data/lib/netsuite/records/rev_rec_template.rb +1 -1
  43. data/lib/netsuite/records/sales_order.rb +1 -1
  44. data/lib/netsuite/records/sales_order_item_list.rb +0 -1
  45. data/lib/netsuite/records/service_sale_item.rb +2 -2
  46. data/lib/netsuite/records/vendor_bill.rb +45 -0
  47. data/lib/netsuite/records/vendor_bill_expense.rb +40 -0
  48. data/lib/netsuite/records/vendor_bill_expense_list.rb +32 -0
  49. data/lib/netsuite/records/vendor_bill_item.rb +45 -0
  50. data/lib/netsuite/records/vendor_bill_item_list.rb +32 -0
  51. data/lib/netsuite/records/vendor_payment.rb +43 -0
  52. data/lib/netsuite/records/vendor_payment_apply.rb +16 -0
  53. data/lib/netsuite/records/vendor_payment_apply_list.rb +32 -0
  54. data/lib/netsuite/support/actions.rb +2 -2
  55. data/lib/netsuite/support/sublist.rb +13 -0
  56. data/lib/netsuite/version.rb +1 -1
  57. data/netsuite.gemspec +1 -1
  58. data/spec/netsuite/actions/delete_list_spec.rb +86 -0
  59. data/spec/netsuite/actions/login_spec.rb +21 -0
  60. data/spec/netsuite/records/cash_refund_spec.rb +1 -1
  61. data/spec/netsuite/records/cash_sale_item_list_spec.rb +27 -0
  62. data/spec/netsuite/records/cash_sale_item_spec.rb +23 -0
  63. data/spec/netsuite/records/credit_memo_apply_list_spec.rb +7 -8
  64. data/spec/netsuite/records/credit_memo_item_list_spec.rb +6 -8
  65. data/spec/netsuite/records/customer_payment_apply_list_spec.rb +25 -0
  66. data/spec/netsuite/records/customer_refund_apply_list_spec.rb +6 -8
  67. data/spec/netsuite/records/customer_spec.rb +6 -6
  68. data/spec/netsuite/records/employee_spec.rb +152 -0
  69. data/spec/netsuite/records/inventory_assignment_list_spec.rb +59 -0
  70. data/spec/netsuite/records/inventory_assignment_spec.rb +21 -0
  71. data/spec/netsuite/records/inventory_detail_spec.rb +13 -0
  72. data/spec/netsuite/records/invoice_spec.rb +3 -3
  73. data/spec/netsuite/records/job_spec.rb +4 -0
  74. data/spec/netsuite/records/vendor_bill_expense_list_spec.rb +36 -0
  75. data/spec/netsuite/records/vendor_bill_expense_spec.rb +72 -0
  76. data/spec/netsuite/records/vendor_bill_item_list_spec.rb +36 -0
  77. data/spec/netsuite/records/vendor_bill_item_spec.rb +118 -0
  78. data/spec/netsuite/records/vendor_bill_spec.rb +187 -0
  79. data/spec/netsuite/records/vendor_payment_apply_list_spec.rb +25 -0
  80. data/spec/netsuite/records/vendor_payment_apply_spec.rb +15 -0
  81. data/spec/netsuite/records/vendor_payment_spec.rb +164 -0
  82. data/spec/netsuite/support/sublist_spec.rb +6 -0
  83. data/spec/support/fixtures/delete_list/delete_list_customers.xml +26 -0
  84. data/spec/support/fixtures/delete_list/delete_list_customers_with_errors.xml +31 -0
  85. data/spec/support/fixtures/login.xml +35 -0
  86. metadata +58 -12
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjYyYWE4ZTFiZjRkZjc2ZGM0MmEyY2YzZjA1NGVkYzM2NjMwNWZiZg==
5
+ data.tar.gz: !binary |-
6
+ MGZiNTNiN2YwNmM3MmM3Yzc1Yzc4Mjg4ZGNkYmM1NDRkYjRjYzI2Mw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MDE4NDFiN2UxODAzNzcxNTQzMDQ2MWU5NWZiZGIyY2VlY2I4NmY0MjhmNmI1
10
+ NmU4NWI0ZGEwZmU4MGYzZmY5YzUzOTk1NDhkMDM2OWQ5MjdmNTQ2MjNmYmQ1
11
+ YTY0MGE1YzQ4NmNkZjY0ZmZlMTM5MjZjZGRkOTBmMmVhODI4ZDc=
12
+ data.tar.gz: !binary |-
13
+ ZmJkY2ZlYTMxYTZiMGQwMGNjYzlkYjYwNWY4MzMwNTA3MTY0Njk2MWUyZDA3
14
+ YTEyYmMyNmNmNWY4ZDkzNDdiZTM2MGY5NjkyNGJjY2ZhMzhhYjA3OWUwMzM3
15
+ NDk2Y2VkMTNjM2I0NWU2NjJiZmY0MWE2NjE0ZGY1ZDdiM2JkMzE=
data/README.md CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  * This gem will act as a wrapper around the NetSuite SuiteTalk WebServices API. Wow, that is a mouthful.
6
6
  * The gem does not cover the entire API, only the subset that we have found useful to cover so far.
7
- * Extending the wrapper is pretty simple. Check out the [contribution help doc](https://github.com/RevolutionPrep/netsuite/wiki/Contributing-to-the-Supported-NetSuite-API)
8
- * NetSuite development is overall a pretty poor experience. We have a list of [NetSuite Development Resources](https://github.com/RevolutionPrep/netsuite/wiki/NetSuite-Development-Resources) that might make things a bit less painful.
7
+ * Extending the wrapper is pretty simple. Check out the [contribution help doc](https://github.com/NetSweet/netsuite/wiki/Contributing-to-the-Supported-NetSuite-API)
8
+ * NetSuite development is overall a pretty poor experience. We have a list of [NetSuite Development Resources](https://github.com/NetSweet/netsuite/wiki/NetSuite-Development-Resources) that might make things a bit less painful.
9
9
 
10
10
  ## Installation
11
11
 
@@ -21,13 +21,13 @@ Or install it yourself as:
21
21
 
22
22
  $ gem install netsuite
23
23
 
24
- This gem is built for ruby 1.9.x, checkout the [1-8-stable](https://github.com/RevolutionPrep/netsuite/tree/1-8-stable) branch for ruby 1.8.x support.
24
+ This gem is built for ruby 1.9.x, checkout the [1-8-stable](https://github.com/NetSweet/netsuite/tree/1-8-stable) branch for ruby 1.8.x support.
25
25
 
26
26
  ## Testing
27
27
  Before contributing a patch make sure all existing tests pass.
28
28
 
29
29
  ```
30
- git clone git://github.com/RevolutionPrep/netsuite.git
30
+ git clone git://github.com/NetSweet/netsuite.git
31
31
  cd netsuite
32
32
  bundle
33
33
  bundle exec rspec
@@ -41,23 +41,23 @@ Not sure how to find your account id? Search for "web service preferences" in th
41
41
  ```ruby
42
42
  NetSuite.configure do
43
43
  reset!
44
-
44
+
45
45
  # optional, defaults to 2011_2
46
46
  api_version '2012_1'
47
-
47
+
48
48
  # optionally specify full wsdl URL (to switch to sandbox, for example)
49
49
  wsdl "https://webservices.sandbox.netsuite.com/wsdl/v#{api_version}_0/netsuite.wsdl"
50
-
50
+
51
51
  # or specify the sandbox flag if you don't want to deal with specifying a full URL
52
52
  sandbox true
53
-
53
+
54
54
  # often the netsuite servers will hang which would cause a timeout exception to be raised
55
55
  # if you don't mind waiting (e.g. processing NS via DJ), increasing the timeout should fix the issue
56
56
  read_timeout 100000
57
-
57
+
58
58
  # you can specify a file or file descriptor to send the log output to (defaults to STDOUT)
59
59
  log File.join(Rails.root, 'log/netsuite.log')
60
-
60
+
61
61
  # login information
62
62
  email 'email@domain.com'
63
63
  password 'password'
@@ -66,6 +66,8 @@ NetSuite.configure do
66
66
  end
67
67
  ```
68
68
 
69
+ There is a [convenience method](https://github.com/NetSweet/netsuite/blob/56fe7fae92908a2e3d6812ecc56516f773cacd45/lib/netsuite.rb#L180) to configure NetSuite based on ENV variables.
70
+
69
71
  ### Examples
70
72
 
71
73
  #### CRUD Operations
@@ -235,7 +237,7 @@ NetSuite::Records::Transaction.search({
235
237
  Time.parse("30/07/2013").iso8601,
236
238
 
237
239
  # or you can use a string. Note that the format below is different from the format of the above code
238
- # but it matches exactly what NS returns
240
+ # but it matches exactly what NS returns
239
241
  # "2012-01-01T22:00:00.000-07:00",
240
242
  # "2013-07-30T22:00:00.000-07:00"
241
243
  ]
@@ -268,7 +270,7 @@ NetSuite::Records::Transaction.search({
268
270
  }
269
271
  ]
270
272
  },
271
-
273
+
272
274
  # the column syntax is a WIP. This will change in the future
273
275
  columns: {
274
276
  'tranSales:basic' => [
@@ -24,6 +24,7 @@ module NetSuite
24
24
  autoload :TranGeneral, 'netsuite/namespaces/tran_general'
25
25
  autoload :TranInvt, 'netsuite/namespaces/tran_invt'
26
26
  autoload :TranSales, 'netsuite/namespaces/tran_sales'
27
+ autoload :TranPurch, 'netsuite/namespaces/tran_purch'
27
28
  autoload :SetupCustom, 'netsuite/namespaces/setup_custom'
28
29
  autoload :ListEmp, 'netsuite/namespaces/list_emp'
29
30
  autoload :ListMkt, 'netsuite/namespaces/list_mkt'
@@ -45,6 +46,7 @@ module NetSuite
45
46
  module Actions
46
47
  autoload :Add, 'netsuite/actions/add'
47
48
  autoload :Delete, 'netsuite/actions/delete'
49
+ autoload :DeleteList, 'netsuite/actions/delete_list'
48
50
  autoload :Get, 'netsuite/actions/get'
49
51
  autoload :GetAll, 'netsuite/actions/get_all'
50
52
  autoload :GetList, 'netsuite/actions/get_list'
@@ -70,6 +72,8 @@ module NetSuite
70
72
  autoload :BillingScheduleRecurrenceList, 'netsuite/records/billing_schedule_recurrence_list'
71
73
  autoload :BinNumberList, 'netsuite/records/bin_number_list'
72
74
  autoload :CashSale, 'netsuite/records/cash_sale'
75
+ autoload :CashSaleItem, 'netsuite/records/cash_sale_item'
76
+ autoload :CashSaleItemList, 'netsuite/records/cash_sale_item_list'
73
77
  autoload :CashRefund, 'netsuite/records/cash_refund'
74
78
  autoload :CashRefundItem, 'netsuite/records/cash_refund_item'
75
79
  autoload :CashRefundItemList, 'netsuite/records/cash_refund_item_list'
@@ -168,6 +172,14 @@ module NetSuite
168
172
  autoload :UnitsTypeUomList, 'netsuite/records/units_type_uom_list'
169
173
  autoload :UnitsTypeUom, 'netsuite/records/units_type_uom'
170
174
  autoload :Vendor, 'netsuite/records/vendor'
175
+ autoload :VendorBill, 'netsuite/records/vendor_bill'
176
+ autoload :VendorBillExpense, 'netsuite/records/vendor_bill_expense'
177
+ autoload :VendorBillExpenseList, 'netsuite/records/vendor_bill_expense_list'
178
+ autoload :VendorBillItem, 'netsuite/records/vendor_bill_item'
179
+ autoload :VendorBillItemList, 'netsuite/records/vendor_bill_item_list'
180
+ autoload :VendorPayment, 'netsuite/records/vendor_payment'
181
+ autoload :VendorPaymentApply, 'netsuite/records/vendor_payment_apply'
182
+ autoload :VendorPaymentApplyList, 'netsuite/records/vendor_payment_apply_list'
171
183
  autoload :WorkOrder, 'netsuite/records/work_order'
172
184
  autoload :WorkOrderItem, 'netsuite/records/work_order_item'
173
185
  autoload :WorkOrderItemList, 'netsuite/records/work_order_item_list'
@@ -177,7 +189,7 @@ module NetSuite
177
189
  NetSuite::Configuration.instance_eval(&block)
178
190
  end
179
191
 
180
- def self.configure_from_env
192
+ def self.configure_from_env(&block)
181
193
  NetSuite.configure do
182
194
  reset!
183
195
 
@@ -188,10 +200,12 @@ module NetSuite
188
200
  api_version ENV['NETSUITE_API'] unless ENV['NETSUITE_API'].nil?
189
201
  sandbox (ENV['NETSUITE_PRODUCTION'].nil? || ENV['NETSUITE_PRODUCTION'] != 'true')
190
202
  wsdl ENV['NETSUITE_WSDL'] unless ENV['NETSUITE_WSDL'].nil?
191
- silent (ENV['NETSUITE_SILENT'] || false)
203
+ silent (!ENV['NETSUITE_SILENT'].nil? && ENV['NETSUITE_SILENT'] == 'true')
192
204
 
193
205
  read_timeout 100_000
194
206
  end
207
+
208
+ self.configure(&block) if block
195
209
  end
196
210
 
197
211
  end
@@ -0,0 +1,104 @@
1
+ module NetSuite
2
+ module Actions
3
+ class DeleteList
4
+ include Support::Requests
5
+
6
+ def initialize(klass, options = { })
7
+ @klass = klass
8
+ @options = options
9
+ end
10
+
11
+ private
12
+
13
+ def request(credentials={})
14
+ NetSuite::Configuration.connection(
15
+ {namespaces: {
16
+ 'xmlns:platformMsgs' => "urn:messages_#{NetSuite::Configuration.api_version}.platform.webservices.netsuite.com",
17
+ 'xmlns:platformCore' => "urn:core_#{NetSuite::Configuration.api_version}.platform.webservices.netsuite.com"
18
+ }}, credentials
19
+ ).call :delete_list, message: request_body
20
+ end
21
+
22
+ # <soap:Body>
23
+ # <platformMsgs:deleteList>
24
+ # <platformMsgs:baseRef internalId="1" type="customer" xsi:type="platformCore:RecordRef"/>
25
+ # <platformMsgs:baseRef internalId="2" type="customer" xsi:type="platformCore:RecordRef"/>
26
+ # </platformMsgs:deleteList>
27
+ # </soap:Body>
28
+ def request_body
29
+ list = @options.is_a?(Hash) ? @options[:list] : @options
30
+
31
+ formatted_list = if @options[:type_id]
32
+ type_id = @options[:type_id]
33
+ record_type = 'platformCore:CustomRecordRef'
34
+
35
+ list.map do |internal_id|
36
+ {
37
+ '@internalId' => internal_id,
38
+ '@typeId' => type_id,
39
+ '@xsi:type' => record_type
40
+ }
41
+ end
42
+ else
43
+ type = @klass.to_s.split('::').last.lower_camelcase
44
+ record_type = 'platformCore:RecordRef'
45
+
46
+ list.map do |internal_id|
47
+ {
48
+ '@internalId' => internal_id,
49
+ '@type' => type,
50
+ '@xsi:type' => record_type
51
+ }
52
+ end
53
+ end
54
+
55
+ {
56
+ baseRef: formatted_list
57
+ }
58
+ end
59
+
60
+ def response_list
61
+ @response_list ||= @response.to_hash[:delete_list_response][:write_response_list][:write_response]
62
+ end
63
+
64
+ def success?
65
+ @success ||= response_errors.blank?
66
+ end
67
+
68
+ def response_errors
69
+ if response_list.any? { |r| r[:status][:@is_success] == 'false' }
70
+ @response_errors ||= errors
71
+ end
72
+ end
73
+
74
+ def errors
75
+ errors = response_list.select { |r| r[:status] && r[:status][:status_detail] }.map do |obj|
76
+ error_obj = obj[:status][:status_detail]
77
+ error_obj = [error_obj] if error_obj.class == Hash
78
+ errors = error_obj.map do |error|
79
+ NetSuite::Error.new(error)
80
+ end
81
+
82
+ [obj[:base_ref][:@internal_id], errors]
83
+ end
84
+ Hash[errors]
85
+ end
86
+
87
+ def response_body
88
+ @response_body ||= response_list
89
+ end
90
+
91
+ module Support
92
+ def self.included(base)
93
+ base.extend(ClassMethods)
94
+ end
95
+
96
+ module ClassMethods
97
+ def delete_list(options = { }, credentials={})
98
+ response = NetSuite::Actions::DeleteList.call([self, options], credentials)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -1,13 +1,37 @@
1
1
  # https://system.netsuite.com/help/helpcenter/en_US/Output/Help/SuiteCloudCustomizationScriptingWebServices/SuiteTalkWebServices/login.html
2
+
2
3
  module NetSuite
3
4
  module Actions
4
5
  class Login
5
6
 
7
+ # <userId xmlns:platformCore="urn:core_2013_1.platform.webservices.netsuite.com" internalId="460362">
8
+ # <platformCore:name>REDACTED ORG NAME</platformCore:name>
9
+ # </userId>
10
+ # <platformCore:wsRoleList xmlns:platformCore="urn:core_2013_1.platform.webservices.netsuite.com">
11
+ # <platformCore:wsRole>
12
+ # <platformCore:role internalId="1047">
13
+ # <platformCore:name>REDACTED ROLE</platformCore:name>
14
+ # </platformCore:role>
15
+ # <platformCore:isDefault>false</platformCore:isDefault>
16
+ # <platformCore:isInactive>false</platformCore:isInactive>
17
+ # <platformCore:isLoggedInRole>true</platformCore:isLoggedInRole>
18
+ # </platformCore:wsRole>
19
+ # <platformCore:wsRole>
20
+ # <platformCore:role internalId="1047">
21
+ # <platformCore:name>REDACTED ROLE</platformCore:name>
22
+ # </platformCore:role>
23
+ # <platformCore:isDefault>false</platformCore:isDefault>
24
+ # <platformCore:isInactive>false</platformCore:isInactive>
25
+ # <platformCore:isLoggedInRole>true</platformCore:isLoggedInRole>
26
+ # </platformCore:wsRole>
27
+ # </platformCore:wsRoleList>
28
+
6
29
  def self.call(credentials)
7
30
  passport = NetSuite::Configuration.auth_header.dup
8
31
  passport['platformMsgs:passport']['platformCore:email'] = credentials[:email] || ''
9
32
  passport['platformMsgs:passport']['platformCore:password'] = credentials[:password] || ''
10
33
  passport['platformMsgs:passport']['platformCore:role'] = credentials[:role] || ''
34
+ passport['platformMsgs:passport']['platformCore:account'] = credentials[:account] if !credentials[:account].nil?
11
35
 
12
36
  begin
13
37
  response = NetSuite::Configuration.connection(soap_header: {}).call :login, message: passport
@@ -24,9 +48,10 @@ module NetSuite
24
48
  )
25
49
  end
26
50
 
51
+ # include more data in body; leave it up to the user to pull the data they are looking for
27
52
  NetSuite::Response.new(
28
53
  success: response.to_hash[:login_response][:session_response][:status][:@is_success] == 'true',
29
- body: response.to_hash[:login_response][:session_response][:base_ref]
54
+ body: response.to_hash[:login_response][:session_response]
30
55
  )
31
56
  end
32
57
 
@@ -223,10 +223,14 @@ module NetSuite
223
223
  @success ||= search_result[:status][:@is_success] == 'true'
224
224
  end
225
225
 
226
- protected
227
- def method_name
228
-
226
+ # TODO need to figure out a way for the user to access this
227
+ def errors
228
+ error_obj = response_hash[:status][:status_detail]
229
+ error_obj = [error_obj] if error_obj.class == Hash
230
+ error_obj.map do |error|
231
+ NetSuite::Error.new(error)
229
232
  end
233
+ end
230
234
 
231
235
  module Support
232
236
  def self.included(base)
@@ -33,10 +33,6 @@ module NetSuite
33
33
  }
34
34
  }
35
35
 
36
- if @object.respond_to?(:internal_id) && @object.internal_id
37
- hash['platformMsgs:record']['@platformMsgs:internalId'] = @object.internal_id
38
- end
39
-
40
36
  if @object.respond_to?(:external_id) && @object.external_id
41
37
  hash['platformMsgs:record']['@platformMsgs:externalId'] = @object.external_id
42
38
  end
@@ -96,6 +96,7 @@ module NetSuite
96
96
  'xmlns:platformCommon' => "urn:common_#{api_version}.platform.webservices.netsuite.com",
97
97
  'xmlns:listRel' => "urn:relationships_#{api_version}.lists.webservices.netsuite.com",
98
98
  'xmlns:tranSales' => "urn:sales_#{api_version}.transactions.webservices.netsuite.com",
99
+ 'xmlns:tranPurch' => "urn:purchases_#{api_version}.transactions.webservices.netsuite.com",
99
100
  'xmlns:actSched' => "urn:scheduling_#{api_version}.activities.webservices.netsuite.com",
100
101
  'xmlns:setupCustom' => "urn:customization_#{api_version}.setup.webservices.netsuite.com",
101
102
  'xmlns:listAcct' => "urn:accounting_#{api_version}.lists.webservices.netsuite.com",
@@ -0,0 +1,11 @@
1
+ module NetSuite
2
+ module Namespaces
3
+ module TranPurch
4
+
5
+ def record_namespace
6
+ 'tranPurch'
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -7,9 +7,9 @@ module NetSuite
7
7
  include Support::Actions
8
8
  include Namespaces::TranCust
9
9
 
10
- actions :add, :get, :delete
10
+ actions :add, :get, :delete, :initialize, :upsert
11
11
 
12
- fields :tran_date, :to_be_emailed
12
+ fields :tran_date, :to_be_emailed, :memo, :total
13
13
 
14
14
  field :item_list, CashRefundItemList
15
15
  field :custom_field_list, CustomFieldList
@@ -1,7 +1,47 @@
1
1
  module NetSuite
2
2
  module Records
3
- class CashSale < SalesOrder
3
+ class CashSale
4
+ include Support::Fields
5
+ include Support::RecordRefs
6
+ include Support::Records
7
+ include Support::Actions
8
+ include Namespaces::TranSales
4
9
 
10
+ actions :get, :add, :initialize, :delete, :update, :upsert, :search
11
+
12
+ fields :alt_handling_cost, :alt_shipping_cost, :auth_code, :bill_address, :cc_approved, :cc_expire_date, :cc_is_purchase_card_bin,
13
+ :cc_name, :cc_number, :cc_process_as_purchas_card, :cc_security_code, :cc_street, :cc_zip_code, :charge_it, :contrib_pct, :created_date,
14
+ :currency_name, :debit_card_issue_no, :deferred_revenue, :discount_rate, :discount_total, :email, :end_date, :est_gross_profit,
15
+ :est_gross_profit_percent, :exchange_rate, :exclude_commission, :exp_cost_disc_amount, :exp_cost_discount, :exp_cost_discprint,
16
+ :exp_cost_disc_rate, :exp_cost_disc_tax1_amt, :exp_cost_disc_taxable, :exp_cost_tax_rate1, :exp_cost_tax_rate2, :fax, :fob,
17
+ :gift_cert_applied, :handling_cost, :handling_tax1_rate, :handling_tax2_rate, :ignore_avs, :is_recurring_payment, :is_taxable,
18
+ :item_cost_disc_amount, :item_cost_disc_print, :item_cost_disc_rate, :item_cost_disc_tax1_amt, :item_cost_disc_taxable, :item_cost_tax_rate1,
19
+ :item_cost_tax_rate2, :last_modified_date, :linked_tracking_numbers, :memo, :message, :other_ref_num, :paypal_auth_id, :paypal_process,
20
+ :pay_pal_status, :pay_pay_tran_id, :pn_ref_num, :recognized_revenue, :rev_rec_end_date, :rev_rec_on_rev_commitment, :rev_rec_state_date,
21
+ :sales_effective_date, :ship_address, :ship_date, :shipping_cost, :shipping_tax1_rate, :shipping_tax2_rate, :source, :start_date, :status,
22
+ :sub_total, :sync_partners_teams, :sync_sales_teams, :tax2_total, :tax_rate, :tax_total, :three_d_status_code, :time_disc_amount, :time_disc_print,
23
+ :time_disc_rate, :time_disc_tax1_amt, :time_disc_taxable, :time_tax_rate1, :time_tax_rate2, :to_be_emailed, :to_be_faxed, :total,
24
+ :total_cost_estimate, :tracking_numbers, :tran_date, :tran_id, :tan_is_vsoe_bundle, :undep_funds, :valid_from, :vat_reg_num, :vsoe_auto_calc
25
+
26
+
27
+ field :transaction_ship_address, ShipAddress
28
+ field :transaction_bill_address, BillAddress
29
+ field :custom_field_list, CustomFieldList
30
+ field :item_list, CashSaleItemList
31
+
32
+ record_refs :account, :bill_address_list, :billing_schedule, :created_from, :credit_card, :credit_card_processor, :currency, :custom_form,
33
+ :department, :discount_item, :entity, :exp_cost_discount, :exp_cost_tax_code, :handling_tax_code, :item_cost_discount, :item_cost_tax_code,
34
+ :job, :klass, :lead_source, :location, :message_sel, :opportunity, :partner, :payment_method, :posting_period, :promo_code, :rev_rec_schedule,
35
+ :sales_group, :sales_rep, :ship_address_list, :ship_method, :shipping_tax_code, :subsidiary, :tax_item, :time_discount, :time_tax_code
36
+
37
+ attr_reader :internal_id
38
+ attr_accessor :external_id
39
+
40
+ def initialize(attributes = {})
41
+ @internal_id = attributes.delete(:internal_id) || attributes.delete(:@internal_id)
42
+ @external_id = attributes.delete(:external_id) || attributes.delete(:@external_id)
43
+ initialize_from_attributes_hash(attributes)
44
+ end
5
45
  end
6
46
  end
7
47
  end
@@ -0,0 +1,40 @@
1
+ module NetSuite
2
+ module Records
3
+ class CashSaleItem
4
+ include Support::Fields
5
+ include Support::RecordRefs
6
+ include Support::Records
7
+ include Namespaces::TranSales
8
+
9
+ fields :amount, :amount_ordered, :bin_numbers, :cost_estimate, :current_percent, :defer_rev_rec, :description, :exclude_from_rate_request,
10
+ :gift_cert_from, :gift_cert_message, :gift_cert_number, :gift_cert_recipient_email, :gift_cert_recipient_name, :gross_amt, :is_taxable,
11
+ :item_is_fulfilled, :license_code, :line, :order_line, :percent_complete, :quantity, :quantity_available, :quantity_fulfilled, :quantity_oh_hand,
12
+ :quantity_ordered, :quantity_remaining, :rate, :rev_rec_end_date, :rev_rec_start_date, :serial_numbers, :ship_group,
13
+ :tax1_amt, :tax_rate1, :tax_rate2, :vsoe_allocation, :vsoe_amount, :vsoe_is_estimate, :vsoe_delivered, :vsoe_price
14
+
15
+ #field :charges_list, RecordRefList
16
+ #field :cost_estimate_type, ItemCostEstimateType
17
+ #field :vsoe_deferral, VsoeDeferral
18
+ #field :vsoe_permit_discount, VsoePermitDiscount
19
+ #field :vsoe_sop_group, VsoeSopGroup
20
+ field :custom_field_list, CustomFieldList
21
+ field :inventory_detail, InventoryDetail
22
+ field :options, CustomFieldList
23
+
24
+ record_refs :charge_type, :department, :item, :job, :klass, :location, :price, :rev_rec_schedule, :ship_address, :ship_method, :tax_code, :units
25
+
26
+ def initialize(attributes = {})
27
+ initialize_from_attributes_hash(attributes)
28
+ end
29
+
30
+ def to_record
31
+ rec = super
32
+ if rec["#{record_namespace}:customFieldList"]
33
+ rec["#{record_namespace}:customFieldList!"] = rec.delete("#{record_namespace}:customFieldList")
34
+ end
35
+ rec
36
+ end
37
+
38
+ end
39
+ end
40
+ end