quickbooks-ruby-oauth2 0.6.1

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 (169) hide show
  1. checksums.yaml +7 -0
  2. data/lib/quickbooks/faraday/middleware/gzip.rb +72 -0
  3. data/lib/quickbooks/model/access_token_response.rb +29 -0
  4. data/lib/quickbooks/model/account.rb +78 -0
  5. data/lib/quickbooks/model/account_based_expense_line_detail.rb +15 -0
  6. data/lib/quickbooks/model/attachable.rb +33 -0
  7. data/lib/quickbooks/model/attachable_ref.rb +22 -0
  8. data/lib/quickbooks/model/base_model.rb +120 -0
  9. data/lib/quickbooks/model/base_model_json.rb +16 -0
  10. data/lib/quickbooks/model/base_reference.rb +23 -0
  11. data/lib/quickbooks/model/batch_request.rb +45 -0
  12. data/lib/quickbooks/model/batch_response.rb +33 -0
  13. data/lib/quickbooks/model/bill.rb +45 -0
  14. data/lib/quickbooks/model/bill_line_item.rb +42 -0
  15. data/lib/quickbooks/model/bill_payment.rb +40 -0
  16. data/lib/quickbooks/model/bill_payment_check.rb +12 -0
  17. data/lib/quickbooks/model/bill_payment_credit_card.rb +10 -0
  18. data/lib/quickbooks/model/bill_payment_line_item.rb +21 -0
  19. data/lib/quickbooks/model/budget.rb +27 -0
  20. data/lib/quickbooks/model/budget_line_item.rb +15 -0
  21. data/lib/quickbooks/model/change_data_capture.rb +42 -0
  22. data/lib/quickbooks/model/change_model.rb +10 -0
  23. data/lib/quickbooks/model/check_payment.rb +11 -0
  24. data/lib/quickbooks/model/class.rb +31 -0
  25. data/lib/quickbooks/model/company_info.rb +69 -0
  26. data/lib/quickbooks/model/credit_card_payment.rb +17 -0
  27. data/lib/quickbooks/model/credit_memo.rb +59 -0
  28. data/lib/quickbooks/model/credit_memo_change.rb +8 -0
  29. data/lib/quickbooks/model/custom_field.rb +13 -0
  30. data/lib/quickbooks/model/customer.rb +76 -0
  31. data/lib/quickbooks/model/customer_change.rb +8 -0
  32. data/lib/quickbooks/model/definition.rb +46 -0
  33. data/lib/quickbooks/model/delivery_info.rb +8 -0
  34. data/lib/quickbooks/model/department.rb +31 -0
  35. data/lib/quickbooks/model/deposit.rb +44 -0
  36. data/lib/quickbooks/model/deposit_line_detail.rb +17 -0
  37. data/lib/quickbooks/model/deposit_line_item.rb +35 -0
  38. data/lib/quickbooks/model/description_line_detail.rb +7 -0
  39. data/lib/quickbooks/model/discount_line_detail.rb +15 -0
  40. data/lib/quickbooks/model/discount_override.rb +13 -0
  41. data/lib/quickbooks/model/document_numbering.rb +18 -0
  42. data/lib/quickbooks/model/effective_tax_rate.rb +15 -0
  43. data/lib/quickbooks/model/email_address.rb +19 -0
  44. data/lib/quickbooks/model/employee.rb +47 -0
  45. data/lib/quickbooks/model/entity.rb +16 -0
  46. data/lib/quickbooks/model/entity_ref.rb +8 -0
  47. data/lib/quickbooks/model/estimate.rb +76 -0
  48. data/lib/quickbooks/model/exchange_rate.rb +23 -0
  49. data/lib/quickbooks/model/fault.rb +16 -0
  50. data/lib/quickbooks/model/global_tax_calculation.rb +13 -0
  51. data/lib/quickbooks/model/group_line_detail.rb +13 -0
  52. data/lib/quickbooks/model/has_line_items.rb +14 -0
  53. data/lib/quickbooks/model/invoice.rb +107 -0
  54. data/lib/quickbooks/model/invoice_change.rb +9 -0
  55. data/lib/quickbooks/model/invoice_group_line_detail.rb +14 -0
  56. data/lib/quickbooks/model/invoice_line_item.rb +88 -0
  57. data/lib/quickbooks/model/item.rb +87 -0
  58. data/lib/quickbooks/model/item_based_expense_line_detail.rb +20 -0
  59. data/lib/quickbooks/model/item_change.rb +8 -0
  60. data/lib/quickbooks/model/item_group_detail.rb +9 -0
  61. data/lib/quickbooks/model/item_group_line.rb +20 -0
  62. data/lib/quickbooks/model/journal_entry.rb +36 -0
  63. data/lib/quickbooks/model/journal_entry_line_detail.rb +27 -0
  64. data/lib/quickbooks/model/line.rb +95 -0
  65. data/lib/quickbooks/model/line_ex.rb +9 -0
  66. data/lib/quickbooks/model/linked_transaction.rb +9 -0
  67. data/lib/quickbooks/model/markup_info.rb +12 -0
  68. data/lib/quickbooks/model/meta_data.rb +24 -0
  69. data/lib/quickbooks/model/name_value.rb +8 -0
  70. data/lib/quickbooks/model/other_contact_info.rb +8 -0
  71. data/lib/quickbooks/model/payment.rb +43 -0
  72. data/lib/quickbooks/model/payment_change.rb +8 -0
  73. data/lib/quickbooks/model/payment_line_detail.rb +12 -0
  74. data/lib/quickbooks/model/payment_method.rb +25 -0
  75. data/lib/quickbooks/model/physical_address.rb +40 -0
  76. data/lib/quickbooks/model/preferences.rb +49 -0
  77. data/lib/quickbooks/model/purchase.rb +57 -0
  78. data/lib/quickbooks/model/purchase_line_item.rb +44 -0
  79. data/lib/quickbooks/model/purchase_order.rb +50 -0
  80. data/lib/quickbooks/model/purchase_tax_rate_list.rb +11 -0
  81. data/lib/quickbooks/model/refund_receipt.rb +62 -0
  82. data/lib/quickbooks/model/refund_receipt_change.rb +8 -0
  83. data/lib/quickbooks/model/report.rb +52 -0
  84. data/lib/quickbooks/model/sales_item_line_detail.rb +16 -0
  85. data/lib/quickbooks/model/sales_receipt.rb +65 -0
  86. data/lib/quickbooks/model/sales_tax_rate_list.rb +11 -0
  87. data/lib/quickbooks/model/sub_total_line_detail.rb +13 -0
  88. data/lib/quickbooks/model/tax_agency.rb +18 -0
  89. data/lib/quickbooks/model/tax_code.rb +21 -0
  90. data/lib/quickbooks/model/tax_line.rb +15 -0
  91. data/lib/quickbooks/model/tax_line_detail.rb +16 -0
  92. data/lib/quickbooks/model/tax_rate.rb +28 -0
  93. data/lib/quickbooks/model/tax_rate_detail.rb +15 -0
  94. data/lib/quickbooks/model/tax_rate_detail_line.rb +23 -0
  95. data/lib/quickbooks/model/tax_service.rb +52 -0
  96. data/lib/quickbooks/model/telephone_number.rb +13 -0
  97. data/lib/quickbooks/model/term.rb +28 -0
  98. data/lib/quickbooks/model/time_activity.rb +79 -0
  99. data/lib/quickbooks/model/transaction_tax_detail.rb +12 -0
  100. data/lib/quickbooks/model/transfer.rb +21 -0
  101. data/lib/quickbooks/model/upload.rb +35 -0
  102. data/lib/quickbooks/model/validator.rb +10 -0
  103. data/lib/quickbooks/model/vendor.rb +53 -0
  104. data/lib/quickbooks/model/vendor_change.rb +8 -0
  105. data/lib/quickbooks/model/vendor_credit.rb +40 -0
  106. data/lib/quickbooks/model/web_site_address.rb +16 -0
  107. data/lib/quickbooks/service/access_token.rb +38 -0
  108. data/lib/quickbooks/service/account.rb +17 -0
  109. data/lib/quickbooks/service/attachable.rb +12 -0
  110. data/lib/quickbooks/service/base_service.rb +445 -0
  111. data/lib/quickbooks/service/base_service_json.rb +39 -0
  112. data/lib/quickbooks/service/batch.rb +11 -0
  113. data/lib/quickbooks/service/bill.rb +16 -0
  114. data/lib/quickbooks/service/bill_payment.rb +16 -0
  115. data/lib/quickbooks/service/budget.rb +12 -0
  116. data/lib/quickbooks/service/change_data_capture.rb +24 -0
  117. data/lib/quickbooks/service/change_service.rb +28 -0
  118. data/lib/quickbooks/service/class.rb +23 -0
  119. data/lib/quickbooks/service/company_info.rb +12 -0
  120. data/lib/quickbooks/service/credit_memo.rb +16 -0
  121. data/lib/quickbooks/service/credit_memo_change.rb +16 -0
  122. data/lib/quickbooks/service/customer.rb +18 -0
  123. data/lib/quickbooks/service/customer_change.rb +16 -0
  124. data/lib/quickbooks/service/department.rb +23 -0
  125. data/lib/quickbooks/service/deposit.rb +16 -0
  126. data/lib/quickbooks/service/employee.rb +24 -0
  127. data/lib/quickbooks/service/estimate.rb +22 -0
  128. data/lib/quickbooks/service/exchange_rate.rb +25 -0
  129. data/lib/quickbooks/service/invoice.rb +45 -0
  130. data/lib/quickbooks/service/invoice_change.rb +16 -0
  131. data/lib/quickbooks/service/item.rb +32 -0
  132. data/lib/quickbooks/service/item_change.rb +16 -0
  133. data/lib/quickbooks/service/journal_entry.rb +16 -0
  134. data/lib/quickbooks/service/payment.rb +29 -0
  135. data/lib/quickbooks/service/payment_change.rb +16 -0
  136. data/lib/quickbooks/service/payment_method.rb +30 -0
  137. data/lib/quickbooks/service/preferences.rb +12 -0
  138. data/lib/quickbooks/service/purchase.rb +16 -0
  139. data/lib/quickbooks/service/purchase_order.rb +16 -0
  140. data/lib/quickbooks/service/refund_receipt.rb +16 -0
  141. data/lib/quickbooks/service/refund_receipt_change.rb +16 -0
  142. data/lib/quickbooks/service/reports.rb +33 -0
  143. data/lib/quickbooks/service/responses/methods.rb +17 -0
  144. data/lib/quickbooks/service/responses/oauth1_http_response.rb +42 -0
  145. data/lib/quickbooks/service/responses/oauth2_http_response.rb +43 -0
  146. data/lib/quickbooks/service/responses/oauth_http_response.rb +21 -0
  147. data/lib/quickbooks/service/sales_receipt.rb +46 -0
  148. data/lib/quickbooks/service/service_crud.rb +75 -0
  149. data/lib/quickbooks/service/service_crud_json.rb +31 -0
  150. data/lib/quickbooks/service/tax_agency.rb +12 -0
  151. data/lib/quickbooks/service/tax_code.rb +12 -0
  152. data/lib/quickbooks/service/tax_rate.rb +12 -0
  153. data/lib/quickbooks/service/tax_service.rb +11 -0
  154. data/lib/quickbooks/service/term.rb +17 -0
  155. data/lib/quickbooks/service/time_activity.rb +16 -0
  156. data/lib/quickbooks/service/transfer.rb +16 -0
  157. data/lib/quickbooks/service/upload.rb +39 -0
  158. data/lib/quickbooks/service/vendor.rb +24 -0
  159. data/lib/quickbooks/service/vendor_change.rb +16 -0
  160. data/lib/quickbooks/service/vendor_credit.rb +16 -0
  161. data/lib/quickbooks/util/collection.rb +18 -0
  162. data/lib/quickbooks/util/http_encoding_helper.rb +54 -0
  163. data/lib/quickbooks/util/logging.rb +19 -0
  164. data/lib/quickbooks/util/multipart.rb +85 -0
  165. data/lib/quickbooks/util/name_entity.rb +85 -0
  166. data/lib/quickbooks/util/query_builder.rb +35 -0
  167. data/lib/quickbooks/version.rb +5 -0
  168. data/lib/quickbooks-ruby.rb +255 -0
  169. metadata +378 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2c9c2d528c57e9e6d09996f5074a207f9ed11c52c8f41b1577d8a659e1b803bc
4
+ data.tar.gz: 900287d6e0a8d4a86065d89d657c32bb821dfc28503ac4203ffefd55f2fb1250
5
+ SHA512:
6
+ metadata.gz: 11486f7112333779da49608738d6ce7affd6fc37aed76d8f0ffe3483c09f25d454b6b35a80b82d679e2c13cbc0cfa2f5e1038548369820ea8590821d2d61813a
7
+ data.tar.gz: 9b30b67dcc88b031a685abea47ac9b24883f012da7d75ab7b49e8c47c28b6bbb8115aead480f2fcc9cfd3951a0b6880322900b21273195ba669c5c0249e87e28
@@ -0,0 +1,72 @@
1
+ # https://github.com/lostisland/faraday_middleware/blob/master/lib/faraday_middleware/gzip.rb
2
+
3
+ require 'faraday'
4
+
5
+ # Middleware to automatically decompress response bodies. If the
6
+ # "Accept-Encoding" header wasn't set in the request, this sets it to
7
+ # "gzip,deflate" and appropriately handles the compressed response from the
8
+ # server. This resembles what Ruby 1.9+ does internally in Net::HTTP#get.
9
+ #
10
+ # This middleware is NOT necessary when these adapters are used:
11
+ # - net_http on Ruby 1.9+
12
+ # - net_http_persistent on Ruby 2.0+
13
+ # - em_http
14
+ class Gzip < Faraday::Middleware
15
+ dependency 'zlib'
16
+
17
+ ACCEPT_ENCODING = 'Accept-Encoding'.freeze
18
+ CONTENT_ENCODING = 'Content-Encoding'.freeze
19
+ CONTENT_LENGTH = 'Content-Length'.freeze
20
+ SUPPORTED_ENCODINGS = 'gzip,deflate,br'.freeze
21
+ RUBY_ENCODING = '1.9'.respond_to?(:force_encoding)
22
+
23
+ def call(env)
24
+ env[:request_headers][ACCEPT_ENCODING] ||= SUPPORTED_ENCODINGS
25
+ @app.call(env).on_complete do |response_env|
26
+ case response_env[:response_headers][CONTENT_ENCODING]
27
+ when 'gzip'
28
+ reset_body(response_env, &method(:uncompress_gzip))
29
+ when 'deflate'
30
+ reset_body(response_env, &method(:inflate))
31
+ when 'br'
32
+ reset_body(response_env, &method(:brotli_inflate))
33
+ end
34
+ end
35
+ end
36
+
37
+ def reset_body(env)
38
+ env[:body] = yield(env[:body])
39
+ env[:response_headers].delete(CONTENT_ENCODING)
40
+ env[:response_headers][CONTENT_LENGTH] = env[:body].length
41
+ end
42
+
43
+ def uncompress_gzip(body)
44
+ io = StringIO.new(body)
45
+ gzip_reader = if RUBY_ENCODING
46
+ Zlib::GzipReader.new(io, :encoding => 'ASCII-8BIT')
47
+ else
48
+ Zlib::GzipReader.new(io)
49
+ end
50
+ gzip_reader.read
51
+ end
52
+
53
+ def inflate(body)
54
+ # Inflate as a DEFLATE (RFC 1950+RFC 1951) stream
55
+ Zlib::Inflate.inflate(body)
56
+ rescue Zlib::DataError
57
+ # Fall back to inflating as a "raw" deflate stream which
58
+ # Microsoft servers return
59
+ inflate = Zlib::Inflate.new(-Zlib::MAX_WBITS)
60
+ begin
61
+ inflate.inflate(body)
62
+ ensure
63
+ inflate.close
64
+ end
65
+ end
66
+
67
+ def brotli_inflate(body)
68
+ self.class.dependency 'brotli'
69
+
70
+ Brotli.inflate(body)
71
+ end
72
+ end
@@ -0,0 +1,29 @@
1
+ module Quickbooks
2
+ module Model
3
+ class AccessTokenResponse < BaseModel
4
+ xml_convention :camelcase
5
+ xml_accessor :error_code, :from => 'ErrorCode'
6
+ xml_accessor :error_message, :from => 'ErrorMessage'
7
+ xml_accessor :token, :from => 'OAuthToken'
8
+ xml_accessor :secret, :from => 'OAuthTokenSecret'
9
+ xml_accessor :server_time, :from => 'ServerTime', :as => Time
10
+
11
+ def error?
12
+ error_code.to_i != 0
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+
19
+ =begin
20
+ <?xml version="1.0"?>
21
+ <ReconnectResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://platform.intuit.com/api/v1">
22
+ <ErrorMessage/>
23
+ <ErrorCode>0</ErrorCode>
24
+ <ServerTime>2012-01-04T19:21:21.0782072Z</ServerTime>
25
+ <OAuthToken>qye2eIdQ5H5yMyrlJflUWh712xfFXjyNnW1MfbC0rz04TfCP</OAuthToken>
26
+ <OAuthTokenSecret>cyDeUNQTkFzoR0KkDn7viN6uLQxWTobeEUKW7I79</OAuthTokenSecret>
27
+ </ReconnectResponse>
28
+
29
+ =end
@@ -0,0 +1,78 @@
1
+ module Quickbooks
2
+ module Model
3
+ class Account < BaseModel
4
+ XML_COLLECTION_NODE = "Account"
5
+ XML_NODE = "Account"
6
+ REST_RESOURCE = 'account'
7
+
8
+ ASSET = 'Asset'
9
+ EQUITY = 'Equity'
10
+ EXPENSE = 'Expense'
11
+ LIABILITY = 'Liability'
12
+ REVENUE = 'Revenue'
13
+
14
+ ACCOUNT_CLASSIFICATION = [ASSET, EQUITY, EXPENSE, LIABILITY, REVENUE]
15
+
16
+ xml_name XML_NODE
17
+
18
+ xml_accessor :id, :from => 'Id'
19
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
20
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
21
+ xml_accessor :has_attachment?, :from => 'HasAttachment'
22
+ xml_accessor :name, :from => 'Name'
23
+ xml_accessor :description, :from => 'Description'
24
+ xml_accessor :fully_qualified_name, :from => 'FullyQualifiedName' # ReadOnly
25
+
26
+ xml_accessor :sub_account?, :from => 'SubAccount'
27
+ xml_accessor :parent_ref, :from => 'ParentRef', :as => BaseReference
28
+
29
+ xml_accessor :active?, :from => 'Active'
30
+
31
+ xml_accessor :classification, :from => 'Classification'
32
+ xml_accessor :account_type, :from => 'AccountType'
33
+ xml_accessor :account_sub_type, :from => 'AccountSubType'
34
+
35
+ xml_accessor :acct_num, :from => 'AcctNum'
36
+ xml_accessor :bank_num, :from => 'BankNum'
37
+
38
+ xml_accessor :current_balance, :from => 'CurrentBalance', :as => BigDecimal, :to_xml => to_xml_big_decimal
39
+ xml_accessor :current_balance_with_sub_accounts, :from => 'CurrentBalanceWithSubAccounts', :as => BigDecimal, :to_xml => to_xml_big_decimal
40
+ xml_accessor :opening_balance, :from => 'OpeningBalance', :as => BigDecimal, :to_xml => to_xml_big_decimal
41
+ xml_accessor :opening_balance_date, :from => 'OpeningBalanceDate', :as => DateTime
42
+ xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
43
+ xml_accessor :tax_account?, :from => 'TaxAccount'
44
+ xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
45
+
46
+ reference_setters :parent_ref, :currency_ref, :tax_code_ref
47
+
48
+ #== Validations
49
+ validates_inclusion_of :classification, :in => ACCOUNT_CLASSIFICATION
50
+ validates_length_of :name, :minimum => 1, :maximum => 100
51
+ validate :name_cannot_contain_invalid_characters
52
+
53
+ def name_cannot_contain_invalid_characters
54
+ if name && (name.index(':') || name.index('"'))
55
+ errors.add('name', ":#{name} cannot contain a colon (:) or double quotes (\").")
56
+ end
57
+ end
58
+
59
+ def valid_for_update?
60
+ if sync_token.nil?
61
+ errors.add(:sync_token, "Missing required attribute SyncToken for update")
62
+ end
63
+ errors.empty?
64
+ end
65
+
66
+ def valid_for_create?
67
+ valid?
68
+ errors.empty?
69
+ end
70
+
71
+ def valid_for_deletion?
72
+ return false if(id.nil? || sync_token.nil?)
73
+ id.to_i > 0 && !sync_token.to_s.empty? && sync_token.to_i >= 0
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,15 @@
1
+ module Quickbooks
2
+ module Model
3
+ class AccountBasedExpenseLineDetail < BaseModel
4
+ xml_accessor :customer_ref, :from => 'CustomerRef', :as => BaseReference
5
+ xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
6
+ xml_accessor :account_ref, :from => 'AccountRef', :as => BaseReference
7
+ xml_accessor :billable_status, :from => 'BillableStatus'
8
+ xml_accessor :tax_amount, :from => 'UnitPrice', :as => BigDecimal, :to_xml => to_xml_big_decimal
9
+ xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
10
+
11
+ reference_setters :customer_ref, :class_ref, :account_ref, :tax_code_ref
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ require 'quickbooks/model/attachable_ref'
2
+
3
+ module Quickbooks
4
+ module Model
5
+ class Attachable < BaseModel
6
+
7
+ XML_COLLECTION_NODE = "Attachable"
8
+ XML_NODE = "Attachable"
9
+ REST_RESOURCE = 'attachable'
10
+
11
+ xml_accessor :id, :from => 'Id'
12
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
13
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
14
+ xml_accessor :attachable_ref, :as => AttachableRef
15
+ xml_accessor :file_name
16
+ xml_accessor :file_access_uri
17
+ xml_accessor :temp_download_uri
18
+ xml_accessor :size
19
+ xml_accessor :content_type
20
+ xml_accessor :category
21
+ xml_accessor :lat
22
+ xml_accessor :long
23
+ xml_accessor :place_name
24
+ xml_accessor :note
25
+ xml_accessor :tag
26
+ xml_accessor :thumbnail_file_access_uri
27
+ xml_accessor :thumbnail_temp_download_uri
28
+
29
+ reference_setters :attachable_ref
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,22 @@
1
+ require 'quickbooks/model/entity_ref'
2
+ require 'quickbooks/model/custom_field'
3
+
4
+ module Quickbooks
5
+ module Model
6
+ class AttachableRef < BaseModel
7
+ xml_accessor :entity_ref, :as => BaseReference
8
+ xml_accessor :line_info
9
+ xml_accessor :include_on_send?
10
+ xml_accessor :inactive?
11
+ xml_accessor :no_ref_only?
12
+ xml_accessor :custom_fields, :as => [CustomField]
13
+
14
+ def initialize(an_entity_ref = nil)
15
+ if an_entity_ref
16
+ self.entity_ref = an_entity_ref
17
+ end
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,120 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BaseModel
4
+ include Definition
5
+ include ActiveModel::Validations
6
+ include Validator
7
+ include ROXML
8
+
9
+ xml_convention :camelcase
10
+
11
+ def initialize(attributes={})
12
+ attributes.each {|key, value| public_send("#{key}=", value) }
13
+ end
14
+
15
+ # ROXML doesnt insert the namespaces into generated XML so we need to do it ourselves
16
+ # insert the static namespaces in the first opening tag that matches the +model_name+
17
+ def to_xml_inject_ns(model_name, options = {})
18
+ s = StringIO.new
19
+ xml = to_xml(options).write_to(s, :indent => 0, :indent_text => '')
20
+ destination_name = options.fetch(:destination_name, nil)
21
+ destination_name ||= model_name
22
+
23
+ sparse = options.fetch(:sparse, false)
24
+ sparse_string = %{sparse="#{sparse}"}
25
+ step1 = s.string.sub("<#{model_name}>", "<#{destination_name} #{Quickbooks::Service::BaseService::XML_NS} #{sparse_string}>")
26
+ step2 = step1.sub("</#{model_name}>", "</#{destination_name}>")
27
+ step2
28
+ end
29
+
30
+ def as_json(options = nil)
31
+ options = {} if options.nil?
32
+ except_conditions = ["roxml_references"]
33
+ except_conditions << options[:except]
34
+ options[:except] = except_conditions.flatten.uniq.compact
35
+ super(options)
36
+ end
37
+
38
+ def to_xml_ns(options = {})
39
+ to_xml_inject_ns(self.class::XML_NODE, options)
40
+ end
41
+
42
+ delegate :[], :fetch, :to => :attributes
43
+
44
+ def attributes
45
+ attributes = self.class.attribute_names.map do |name|
46
+ value = public_send(name)
47
+ value = value.attributes if value.respond_to?(:attributes)
48
+ [name, value]
49
+ end
50
+
51
+ HashWithIndifferentAccess[attributes]
52
+ end
53
+
54
+ def inspect
55
+ # it would be nice if we could inspect all the children,
56
+ # but it's likely to blow the stack in some cases
57
+ "#<#{self.class} " +
58
+ "#{attributes.map{|k,v| "#{k}: #{v.nil? ? 'nil' : v.to_s }"}.join ", "}>"
59
+ end
60
+ class << self
61
+ def to_xml_big_decimal
62
+ Proc.new { |val| val.nil? ? nil : val.to_f }
63
+ end
64
+
65
+ def attribute_names
66
+ roxml_attrs.map(&:accessor)
67
+ end
68
+
69
+ # These can be over-ridden in each model object as needed
70
+ def resource_for_collection
71
+ self::REST_RESOURCE
72
+ end
73
+
74
+ def resource_for_singular
75
+ self::REST_RESOURCE
76
+ end
77
+
78
+ # Automatically generate an ID setter.
79
+ # Example:
80
+ # reference_setters :discount_ref
81
+ # Would generate a method like:
82
+ # def discount_id=(id)
83
+ # self.discount_ref = BaseReference.new(id)
84
+ # end
85
+ def reference_setters(*args)
86
+ references = args.empty? ? reference_attrs : args
87
+
88
+ references.each do |attribute|
89
+ last_index = attribute.to_s.rindex('_ref')
90
+ field_name = !last_index.nil? ? attribute.to_s.slice(0, last_index) : attribute
91
+ method_name = "#{field_name}_id=".to_sym
92
+ unless instance_methods(false).include?(method_name)
93
+ method_definition = <<-METH
94
+ def #{method_name}(id)
95
+ self.#{attribute} = BaseReference.new(id)
96
+ end
97
+ METH
98
+ class_eval(method_definition)
99
+ end
100
+ end
101
+ end
102
+
103
+ def reference_attrs
104
+ matches = roxml_attrs.select{|attr| attr.sought_type == Quickbooks::Model::BaseReference}.map{|attr| attr.accessor}
105
+ end
106
+
107
+ def inspect
108
+ "#{super}(#{attrs_with_types.join " "})"
109
+ end
110
+
111
+ def attrs_with_types
112
+ roxml_attrs.map do |attr|
113
+ "#{attr.accessor}:" +
114
+ "#{attr.class.block_shorthands.invert[attr.blocks.last]}:#{attr.sought_type}"
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BaseModelJSON < BaseModel
4
+
5
+ def to_json
6
+ params = {}
7
+ attributes.each_pair do |k, v|
8
+ next if v.blank?
9
+ params[k.camelize] = v.is_a?(Array) ? v.inject([]){|mem, item| mem << item.to_json; mem} : v
10
+ end
11
+ params.to_json
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BaseReference < BaseModel
4
+ xml_convention :camelcase
5
+ xml_accessor :name, :from => '@name' # Attribute with name 'name'
6
+ xml_accessor :value, :from => :content
7
+ xml_accessor :type, :from => '@type' # Attribute with name 'type'
8
+
9
+ def initialize(value=nil, attributes={})
10
+ self.value = value
11
+ attributes.each {|key, value| public_send("#{key}=", value) }
12
+ end
13
+
14
+ def to_i
15
+ self.value.to_i
16
+ end
17
+
18
+ def to_s
19
+ self.value.to_s
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ class Quickbooks::Model::BatchRequest < Quickbooks::Model::BaseModel
2
+ class BatchItemRequest
3
+ include ROXML
4
+ XML_NODE = "BatchItemRequest"
5
+ xml_name XML_NODE
6
+
7
+ xml_accessor :operation, :from => "@operation"
8
+ xml_accessor :bId, :from => "@bId"
9
+
10
+ # Supported Entities
11
+ xml_accessor :account, from: "Account", as: Quickbooks::Model::Account
12
+ xml_accessor :bill_payment, from: "BillPayment", as: Quickbooks::Model::BillPayment
13
+ xml_accessor :bill, from: "Bill", as: Quickbooks::Model::Bill
14
+ xml_accessor :credit_memo, from: "CreditMemo", as: Quickbooks::Model::CreditMemo
15
+ xml_accessor :customer, from: "Customer", as: Quickbooks::Model::Customer
16
+ xml_accessor :invoice, from: "Invoice", as: Quickbooks::Model::Invoice
17
+ xml_accessor :item, from: "Item", as: Quickbooks::Model::Item
18
+ xml_accessor :journal_entry, from: "JournalEntry", as: Quickbooks::Model::JournalEntry
19
+ xml_accessor :payment, from: "Payment", as: Quickbooks::Model::Payment
20
+ xml_accessor :purchase_order, from: "PurchaseOrder", as: Quickbooks::Model::PurchaseOrder
21
+ xml_accessor :purchase, from: "Purchase", as: Quickbooks::Model::Purchase
22
+ xml_accessor :refund_receipt, from: "RefundReceipt", as: Quickbooks::Model::RefundReceipt
23
+ xml_accessor :sales_receipt, from: "SalesReceipt", as: Quickbooks::Model::SalesReceipt
24
+ xml_accessor :time_activity, from: "TimeActivity", as: Quickbooks::Model::TimeActivity
25
+ xml_accessor :vendor, from: "Vendor", as: Quickbooks::Model::Vendor
26
+ end
27
+
28
+ XML_COLLECTION_NODE = "IntuitBatchRequest"
29
+ XML_NODE = "IntuitBatchRequest"
30
+ REST_RESOURCE = 'batch'
31
+ xml_name XML_NODE
32
+ xml_accessor :request_items, from: "BatchItemRequest", as: [Quickbooks::Model::BatchRequest::BatchItemRequest]
33
+
34
+ def initialize
35
+ self.request_items = []
36
+ end
37
+
38
+ def add(batch_item_id, batch_item, operation)
39
+ bir = Quickbooks::Model::BatchRequest::BatchItemRequest.new
40
+ bir.operation = operation
41
+ bir.bId = batch_item_id
42
+ bir.send("#{batch_item.class::XML_NODE.underscore}=", batch_item)
43
+ self.request_items << bir
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ class Quickbooks::Model::BatchResponse < Quickbooks::Model::BaseModel
2
+ class BatchItemResponse
3
+ include ROXML
4
+ xml_name "BatchItemResponse"
5
+
6
+ xml_accessor :bId, :from => "@bId"
7
+ xml_accessor :fault, :from => 'Fault', :as => Quickbooks::Model::Fault
8
+
9
+ # Supported Entities
10
+ xml_accessor :account, from: "Account", as: Quickbooks::Model::Account
11
+ xml_accessor :bill_payment, from: "BillPayment", as: Quickbooks::Model::BillPayment
12
+ xml_accessor :bill, from: "Bill", as: Quickbooks::Model::Bill
13
+ xml_accessor :credit_memo, from: "CreditMemo", as: Quickbooks::Model::CreditMemo
14
+ xml_accessor :customer, from: "Customer", as: Quickbooks::Model::Customer
15
+ xml_accessor :invoice, from: "Invoice", as: Quickbooks::Model::Invoice
16
+ xml_accessor :item, from: "Item", as: Quickbooks::Model::Item
17
+ xml_accessor :journal_entry, from: "JournalEntry", as: Quickbooks::Model::JournalEntry
18
+ xml_accessor :payment, from: "Payment", as: Quickbooks::Model::Payment
19
+ xml_accessor :purchase_order, from: "PurchaseOrder", as: Quickbooks::Model::PurchaseOrder
20
+ xml_accessor :purchase, from: "Purchase", as: Quickbooks::Model::Purchase
21
+ xml_accessor :refund_receipt, from: "RefundReceipt", as: Quickbooks::Model::RefundReceipt
22
+ xml_accessor :sales_receipt, from: "SalesReceipt", as: Quickbooks::Model::SalesReceipt
23
+ xml_accessor :time_activity, from: "TimeActivity", as: Quickbooks::Model::TimeActivity
24
+ xml_accessor :vendor, from: "Vendor", as: Quickbooks::Model::Vendor
25
+
26
+ def fault?
27
+ fault
28
+ end
29
+ end
30
+
31
+ xml_name "IntuitResponse"
32
+ xml_accessor :response_items, :from => :BatchItemResponse, as: [Quickbooks::Model::BatchResponse::BatchItemResponse]
33
+ end
@@ -0,0 +1,45 @@
1
+ module Quickbooks
2
+ module Model
3
+ class Bill < BaseModel
4
+ include GlobalTaxCalculation
5
+ include HasLineItems
6
+
7
+ XML_COLLECTION_NODE = "Bill"
8
+ XML_NODE = "Bill"
9
+ REST_RESOURCE = 'bill'
10
+
11
+ xml_accessor :id, :from => 'Id'
12
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
13
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
14
+ xml_accessor :doc_number, :from => 'DocNumber'
15
+ xml_accessor :txn_date, :from => 'TxnDate', :as => Date
16
+ xml_accessor :department_ref, :from => 'DepartmentRef', :as => BaseReference
17
+
18
+ xml_accessor :line_items, :from => 'Line', :as => [BillLineItem]
19
+
20
+ xml_accessor :private_note, :from => 'PrivateNote'
21
+
22
+ xml_accessor :vendor_ref, :from => 'VendorRef', :as => BaseReference
23
+ xml_accessor :payer_ref, :from => 'PayerRef', :as => BaseReference
24
+ xml_accessor :sales_term_ref, :from => 'SalesTermRef', :as => BaseReference
25
+ xml_accessor :attachable_ref, :from => 'AttachableRef', :as => BaseReference
26
+ xml_accessor :ap_account_ref, :from => 'APAccountRef', :as => BaseReference
27
+
28
+ xml_accessor :due_date, :from => 'DueDate', :as => Date
29
+ xml_accessor :remit_to_address, :from => 'RemitToAddr', :as => PhysicalAddress
30
+ xml_accessor :ship_address, :from => 'ShipAddr', :as => PhysicalAddress
31
+ xml_accessor :exchange_rate, :from => 'ExchangeRate', :as => BigDecimal, :to_xml => to_xml_big_decimal
32
+ xml_accessor :balance, :from => 'Balance', :as => BigDecimal, :to_xml => to_xml_big_decimal
33
+
34
+ # readonly
35
+ xml_accessor :bill_email, :from => 'BillEmail', :as => EmailAddress
36
+ xml_accessor :reply_email, :from => 'ReplyEmail', :as => EmailAddress
37
+ xml_accessor :total, :from => 'TotalAmt', :as => BigDecimal
38
+ xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
39
+
40
+ validate :line_item_size
41
+
42
+ reference_setters :department_ref, :vendor_ref, :payer_ref, :sales_term_ref, :currency_ref, :attachable_ref, :ap_account_ref
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,42 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BillLineItem < BaseModel
4
+
5
+ #== Constants
6
+ ACCOUNT_BASED_EXPENSE_LINE_DETAIL = 'AccountBasedExpenseLineDetail'
7
+ ITEM_BASED_EXPENSE_LINE_DETAIL = 'ItemBasedExpenseLineDetail'
8
+
9
+ xml_accessor :id, :from => 'Id'
10
+ xml_accessor :line_num, :from => 'LineNum', :as => Integer
11
+ xml_accessor :description, :from => 'Description'
12
+ xml_accessor :amount, :from => 'Amount', :as => BigDecimal, :to_xml => to_xml_big_decimal
13
+ xml_accessor :detail_type, :from => 'DetailType'
14
+
15
+ #== Various detail types
16
+ xml_accessor :account_based_expense_line_detail, :from => 'AccountBasedExpenseLineDetail', :as => AccountBasedExpenseLineDetail
17
+ xml_accessor :item_based_expense_line_detail, :from => 'ItemBasedExpenseLineDetail', :as => ItemBasedExpenseLineDetail
18
+
19
+ def account_based_expense_item?
20
+ detail_type.to_s == ACCOUNT_BASED_EXPENSE_LINE_DETAIL
21
+ end
22
+
23
+ def item_based_expense_item?
24
+ detail_type.to_s == ITEM_BASED_EXPENSE_LINE_DETAIL
25
+ end
26
+
27
+ def account_based_expense_item!
28
+ self.detail_type = ACCOUNT_BASED_EXPENSE_LINE_DETAIL
29
+ self.account_based_expense_line_detail = AccountBasedExpenseLineDetail.new
30
+
31
+ yield self.account_based_expense_line_detail if block_given?
32
+ end
33
+
34
+ def item_based_expense_item!
35
+ self.detail_type = ITEM_BASED_EXPENSE_LINE_DETAIL
36
+ self.item_based_expense_line_detail = ItemBasedExpenseLineDetail.new
37
+
38
+ yield self.item_based_expense_line_detail if block_given?
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,40 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BillPayment < BaseModel
4
+ include HasLineItems
5
+
6
+ XML_COLLECTION_NODE = "BillPayment"
7
+ XML_NODE = "BillPayment"
8
+ REST_RESOURCE = 'billpayment'
9
+
10
+ xml_accessor :id, :from => 'Id'
11
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
12
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
13
+ xml_accessor :doc_number, :from => 'DocNumber'
14
+ xml_accessor :txn_date, :from => 'TxnDate', :as => Date
15
+
16
+ xml_accessor :line_items, :from => 'Line', :as => [BillPaymentLineItem]
17
+
18
+ xml_accessor :private_note, :from => 'PrivateNote'
19
+
20
+ xml_accessor :vendor_ref, :from => 'VendorRef', :as => BaseReference
21
+ xml_accessor :department_ref, :from => 'DepartmentRef', :as => BaseReference
22
+ xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
23
+ xml_accessor :exchange_rate, :from => 'ExchangeRate', :as => BigDecimal, :to_xml => to_xml_big_decimal
24
+ xml_accessor :ap_account_ref, :from => 'APAccountRef', :as => BaseReference
25
+ xml_accessor :pay_type, :from => 'PayType'
26
+ xml_accessor :process_bill_payment?, :from => 'ProcessBillPayment'
27
+
28
+ ## Required if PayType is Check.
29
+ xml_accessor :check_payment, :from => 'CheckPayment', :as => BillPaymentCheck
30
+ ## Required if PayType is CreditCard.
31
+ xml_accessor :credit_card_payment, :from => 'CreditCardPayment', :as => BillPaymentCreditCard
32
+
33
+ xml_accessor :total, :from => 'TotalAmt', :as => BigDecimal
34
+
35
+ validate :line_item_size
36
+
37
+ reference_setters
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,12 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BillPaymentCheck < BaseModel
4
+ xml_accessor :bank_account_ref, :from => 'BankAccountRef', :as => BaseReference
5
+ xml_accessor :print_status, :from => 'PrintStatus'
6
+ xml_accessor :check_detail, :from => 'CheckDetail', :as => CheckPayment
7
+ xml_accessor :payee_address, :from => 'PayeeAddr', :as => PhysicalAddress
8
+
9
+ reference_setters :bank_account_ref
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Quickbooks
2
+ module Model
3
+ class BillPaymentCreditCard < BaseModel
4
+ xml_accessor :cc_account_ref, :from => 'CCAccountRef', :as => BaseReference
5
+ xml_accessor :cc_detail, :from => 'CCDetail', :as => CreditCardPayment
6
+
7
+ reference_setters
8
+ end
9
+ end
10
+ end