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
@@ -0,0 +1,21 @@
1
+ module Quickbooks
2
+ module Service
3
+ module Responses
4
+
5
+ # This class just proxies and returns a wrapped response so that callers
6
+ # can invoke a common interface
7
+ class OAuthHttpResponse
8
+
9
+ def self.wrap(response)
10
+ if response.is_a?(OAuth2::Response)
11
+ Quickbooks::Service::Responses::OAuth2HttpResponse.new(response)
12
+ else
13
+ Quickbooks::Service::Responses::OAuth1HttpResponse.new(response)
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,46 @@
1
+ module Quickbooks
2
+ module Service
3
+ class SalesReceipt < BaseService
4
+
5
+ def delete(sales_receipt)
6
+ delete_by_query_string(sales_receipt)
7
+ end
8
+
9
+ def pdf(sales_receipt)
10
+ url = "#{url_for_resource(model::REST_RESOURCE)}/#{sales_receipt.id}/pdf"
11
+ response = do_http_raw_get(url, {}, {'Accept' => 'application/pdf'})
12
+ response.plain_body
13
+ end
14
+
15
+ def send(sr, email_address=nil)
16
+ query = email_address.present? ? "?sendTo=#{email_address}" : ""
17
+ url = "#{url_for_resource(model::REST_RESOURCE)}/#{sr.id}/send#{query}"
18
+ response = do_http_post(url,{})
19
+ if response.code.to_i == 200
20
+ model.from_xml(parse_singular_entity_response(model, response.plain_body))
21
+ else
22
+ nil
23
+ end
24
+ end
25
+
26
+ def void(sales_receipt, options = {})
27
+ raise Quickbooks::InvalidModelException.new(sales_receipt.errors.full_messages.join(',')) unless sales_receipt.valid?
28
+ xml = sales_receipt.to_xml_ns(options)
29
+ url = "#{url_for_resource(model::REST_RESOURCE)}?include=void"
30
+
31
+ response = do_http_post(url, valid_xml_document(xml), {})
32
+ if response.code.to_i == 200
33
+ model.from_xml(parse_singular_entity_response(model, response.plain_body))
34
+ else
35
+ false
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def model
42
+ Quickbooks::Model::SalesReceipt
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,75 @@
1
+ module Quickbooks
2
+ module Service
3
+ module ServiceCrud
4
+
5
+ def query(object_query = nil, options = {})
6
+ fetch_collection(object_query, model, options)
7
+ end
8
+
9
+ # fetch all records, returns an array of models
10
+ def all(object_query=nil, options={})
11
+ collection = []
12
+ self.query_in_batches(object_query, options) do |batch|
13
+ collection << batch.entries
14
+ end
15
+ collection.flatten
16
+ end
17
+
18
+ def query_in_batches(object_query=nil, options={})
19
+ page = 0
20
+ per_page = options.delete(:per_page) || 1_000
21
+ begin
22
+ page += 1
23
+ results = query(object_query, page: page, per_page: per_page)
24
+ yield results if results.count > 0
25
+ end until results.count < per_page
26
+ end
27
+
28
+ def exists?(field, selector, options={})
29
+ find_by(field, selector, options).count > 0
30
+ end
31
+
32
+ def find_by(field, selector, options={})
33
+ if field.class == Symbol
34
+ field = field.to_s.camelcase
35
+ end
36
+ q = "select * from %s where %s = '%s'" % [model.resource_for_singular, field, selector]
37
+ self.query(q, options)
38
+ end
39
+
40
+ def fetch_by_id(id, params = {})
41
+ url = "#{url_for_resource(model.resource_for_singular)}/#{id}"
42
+ fetch_object(model, url, params)
43
+ end
44
+
45
+ def create(entity, options = {})
46
+ raise Quickbooks::InvalidModelException.new(entity.errors.full_messages.join(',')) unless entity.valid?
47
+ xml = entity.to_xml_ns(options)
48
+
49
+ response = do_http_post(url_for_resource(model.resource_for_singular), valid_xml_document(xml), options[:query])
50
+ if response.code.to_i == 200
51
+ model.from_xml(parse_singular_entity_response(model, response.plain_body))
52
+ else
53
+ nil
54
+ end
55
+ end
56
+ alias :update :create
57
+
58
+ def delete(entity)
59
+ raise NotImplementedError
60
+ end
61
+
62
+ def delete_by_query_string(entity, options = {})
63
+ url = "#{url_for_resource(model::REST_RESOURCE)}?operation=delete"
64
+
65
+ xml = entity.to_xml_ns(options)
66
+ response = do_http_post(url, valid_xml_document(xml))
67
+ if response.code.to_i == 200
68
+ parse_singular_entity_response_for_delete(model, response.plain_body)
69
+ else
70
+ false
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,31 @@
1
+ module Quickbooks
2
+ module Service
3
+ module ServiceCrudJSON
4
+
5
+ def fetch_by_id(id, params = {})
6
+ raise NotImplementedError
7
+ end
8
+
9
+ def create(entity, options = {})
10
+ raise Quickbooks::InvalidModelException.new(entity.errors.full_messages.join(',')) unless entity.valid?
11
+ response = do_http(:post, url_for_resource(model.resource_for_singular), entity.to_json, options)
12
+ if response.code.to_i == 200
13
+ JSON.parse(response.plain_body)
14
+ else
15
+ nil
16
+ end
17
+ end
18
+ alias :update :create
19
+
20
+ def delete
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def delete_by_query_string
25
+ raise NotImplementedError
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,12 @@
1
+ module Quickbooks
2
+ module Service
3
+ class TaxAgency < BaseService
4
+
5
+ private
6
+
7
+ def model
8
+ Quickbooks::Model::TaxAgency
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Quickbooks
2
+ module Service
3
+ class TaxCode < BaseService
4
+
5
+ private
6
+
7
+ def model
8
+ Quickbooks::Model::TaxCode
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Quickbooks
2
+ module Service
3
+ class TaxRate < BaseService
4
+
5
+ private
6
+
7
+ def model
8
+ Quickbooks::Model::TaxRate
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Quickbooks
2
+ module Service
3
+ class TaxService < BaseServiceJSON
4
+ private
5
+
6
+ def model
7
+ Quickbooks::Model::TaxService
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module Quickbooks
2
+ module Service
3
+ class Term < BaseService
4
+
5
+ def delete(term)
6
+ term.active = false
7
+ update(term, :sparse => true)
8
+ end
9
+
10
+ private
11
+
12
+ def model
13
+ Quickbooks::Model::Term
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Service
3
+ class TimeActivity < BaseService
4
+
5
+ def delete(time_activity)
6
+ delete_by_query_string(time_activity)
7
+ end
8
+
9
+ private
10
+
11
+ def model
12
+ Quickbooks::Model::TimeActivity
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Service
3
+ class Transfer < BaseService
4
+
5
+ def delete(transfer)
6
+ delete_by_query_string(transfer)
7
+ end
8
+
9
+ private
10
+
11
+ def model
12
+ Quickbooks::Model::Transfer
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ module Quickbooks
2
+ module Service
3
+ class Upload < BaseService
4
+
5
+ XML_NODE = "AttachableResponse"
6
+
7
+ # path_to_file: String - path to file
8
+ # mime_type: String - the MIME type of the file, e.g. image/jpeg
9
+ # attachable: Quickbooks::Model::Attachable meta-data details, can be null
10
+ def upload(path_to_file, mime_type, attachable = nil)
11
+ url = url_for_resource("upload")
12
+ uploadIO = class_for_io.new(path_to_file, mime_type)
13
+ response = do_http_file_upload(uploadIO, url, attachable)
14
+ prefix = "AttachableResponse/xmlns:Attachable"
15
+ if response.code.to_i == 200
16
+ model.from_xml(parse_singular_entity_response(model, response.plain_body, prefix))
17
+ else
18
+ nil
19
+ end
20
+ end
21
+
22
+ def class_for_io
23
+ oauth.is_a?(OAuth2::AccessToken) ? Faraday::UploadIO : UploadIO
24
+ end
25
+
26
+ def download(uploadId)
27
+ url = url_for_resource("download/#{uploadId}")
28
+ do_http_get(url, {}, headers)
29
+ end
30
+
31
+ private
32
+
33
+ def model
34
+ Quickbooks::Model::Attachable
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,24 @@
1
+ module Quickbooks
2
+ module Service
3
+ class Vendor < BaseService
4
+
5
+ # override update as sparse is not supported
6
+ def update(entity, options = {})
7
+ raise InvalidModelException.new('Vendor sparse update is not supported by Intuit at this time') if options[:sparse] && options[:sparse] == true
8
+ super(entity, options)
9
+ end
10
+
11
+ def delete(vendor)
12
+ vendor.active = false
13
+ update(vendor, :sparse => false)
14
+ end
15
+
16
+ private
17
+
18
+ def model
19
+ Quickbooks::Model::Vendor
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Service
3
+ class VendorChange < ChangeService
4
+
5
+ private
6
+
7
+ def entity
8
+ "Vendor"
9
+ end
10
+
11
+ def model
12
+ Quickbooks::Model::VendorChange
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Service
3
+ class VendorCredit < BaseService
4
+
5
+ def delete(vendor_credit)
6
+ delete_by_query_string(vendor_credit)
7
+ end
8
+
9
+ private
10
+
11
+ def model
12
+ Quickbooks::Model::VendorCredit
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module Quickbooks
2
+ class Collection
3
+ include Enumerable
4
+ attr_accessor :entries
5
+
6
+ attr_accessor :body
7
+
8
+ # Legacy Attributes (v2)
9
+ attr_accessor :count, :current_page
10
+
11
+ # v3 Attributes
12
+ attr_accessor :start_position, :max_results, :total_count
13
+
14
+ def each(*args, &block)
15
+ (entries|| []).each *args, &block
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,54 @@
1
+ # Intended to extend the Net::HTTP response object
2
+ # and adds support for decoding gzip and deflate encoded pages
3
+ #
4
+ # Author: Jason Stirk <http://griffin.oobleyboo.com>
5
+ # Home: http://griffin.oobleyboo.com/projects/http_encoding_helper
6
+ # Created: 5 September 2007
7
+ # Last Updated: 23 November 2007
8
+ #
9
+ # Usage:
10
+ #
11
+ # require 'net/http'
12
+ # require 'http_encoding_helper'
13
+ # headers={'Accept-Encoding' => 'gzip, deflate' }
14
+ # http = Net::HTTP.new('griffin.oobleyboo.com', 80)
15
+ # http.start do |h|
16
+ # request = Net::HTTP::Get.new('/', headers)
17
+ # response = http.request(request)
18
+ # content=response.plain_body # Method from our library
19
+ # puts "Transferred: #{response.body.length} bytes"
20
+ # puts "Compression: #{response['content-encoding']}"
21
+ # puts "Extracted: #{response.plain_body.length} bytes"
22
+ # end
23
+ #
24
+
25
+ require 'zlib'
26
+ require 'stringio'
27
+
28
+ class Net::HTTPResponse
29
+ # Return the uncompressed content
30
+ def plain_body
31
+
32
+ encoding = self['Content-Encoding']
33
+ @_content ||= nil
34
+
35
+ return @_content if @_content
36
+
37
+ if encoding
38
+ case encoding
39
+ when 'gzip'
40
+ i = Zlib::GzipReader.new(StringIO.new(self.body))
41
+ @_content = i.read
42
+ when 'deflate'
43
+ i = Zlib::Inflate.new
44
+ @_content = i.inflate(self.body)
45
+ else
46
+ raise "Unknown encoding - #{encoding}"
47
+ end
48
+ else
49
+ @_content = self.body
50
+ end
51
+
52
+ @_content
53
+ end
54
+ end
@@ -0,0 +1,19 @@
1
+ module Quickbooks
2
+ module Util
3
+ module Logging
4
+ def log(msg)
5
+ ::Quickbooks.log(msg)
6
+ end
7
+
8
+ def log_xml(str)
9
+ if ::Quickbooks.log_xml_pretty_print? && !(str and str.empty?)
10
+ Nokogiri::XML(str).to_xml
11
+ else
12
+ str
13
+ end
14
+ rescue => e
15
+ e
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,85 @@
1
+ module OauthMultipart
2
+ end
3
+
4
+ require "oauth"
5
+
6
+ OAuth::Consumer.class_eval do
7
+ def create_http_request(http_method, path, *arguments)
8
+ http_method = http_method.to_sym
9
+
10
+ if [:post, :put].include?(http_method)
11
+ data = arguments.shift
12
+ end
13
+
14
+ # if the base site contains a path, add it now
15
+ uri = URI.parse(site)
16
+ path = uri.path + path if uri.path
17
+
18
+ headers = arguments.first.is_a?(Hash) ? arguments.shift : {}
19
+
20
+ case http_method
21
+ when :post
22
+ request = Net::HTTP::Post.new(path,headers)
23
+ request["Content-Length"] = '0' # Default to 0
24
+ when :put
25
+ request = Net::HTTP::Put.new(path,headers)
26
+ request["Content-Length"] = '0' # Default to 0
27
+ when :get
28
+ request = Net::HTTP::Get.new(path,headers)
29
+ when :delete
30
+ request = Net::HTTP::Delete.new(path,headers)
31
+
32
+ when :head
33
+ request = Net::HTTP::Head.new(path,headers)
34
+ when :multipart_post
35
+ request = Net::HTTP::Post::Multipart.new(path, headers)
36
+ else
37
+ raise ArgumentError, "Don't know how to handle http_method: :#{http_method.to_s}"
38
+ end
39
+
40
+ if data.is_a?(Hash)
41
+ form_data = {}
42
+ data.each {|k,v| form_data[k.to_s] = v if !v.nil?}
43
+ request.set_form_data(form_data)
44
+ elsif data
45
+ if data.respond_to?(:read)
46
+ request.body_stream = data
47
+ if data.respond_to?(:length)
48
+ request["Content-Length"] = data.length.to_s
49
+ elsif data.respond_to?(:stat) && data.stat.respond_to?(:size)
50
+ request["Content-Length"] = data.stat.size.to_s
51
+ else
52
+ raise ArgumentError, "Don't know how to send a body_stream that doesn't respond to .length or .stat.size"
53
+ end
54
+ else
55
+ request.body = data.to_s
56
+ request["Content-Length"] = request.body.length.to_s
57
+ end
58
+ end
59
+
60
+ request
61
+
62
+ end
63
+ end
64
+
65
+ OAuth::AccessToken.class_eval do
66
+
67
+ def post_with_multipart(*args)
68
+ multipart_post *args
69
+ end
70
+
71
+ def multipart_post(*args)
72
+ request(:multipart_post, *args)
73
+ end
74
+ end
75
+
76
+ OAuth2::AccessToken.class_eval do
77
+
78
+ def post_with_multipart(*args)
79
+ multipart_post *args
80
+ end
81
+
82
+ def multipart_post(*args)
83
+ request(:post, *args)
84
+ end
85
+ end
@@ -0,0 +1,85 @@
1
+ module NameEntity
2
+
3
+ module Quality
4
+ def email_address=(email_address)
5
+ self.primary_email_address = Quickbooks::Model::EmailAddress.new(email_address)
6
+ end
7
+
8
+ def email_address
9
+ primary_email_address
10
+ end
11
+
12
+ def names_cannot_contain_invalid_characters
13
+ [:name, :display_name, :given_name, :middle_name, :family_name, :print_on_check_name].each do |property|
14
+ next unless respond_to? property
15
+ value = send(property).to_s
16
+ if value.index(':')
17
+ errors.add(property, ":#{property} cannot contain a colon (:).")
18
+ end
19
+ end
20
+ end
21
+
22
+ def email_address_is_valid
23
+ if primary_email_address
24
+ address = primary_email_address.address.to_s
25
+ return false if address.length == 0
26
+ unless address.index('@') && address.index('.')
27
+ errors.add(:primary_email_address, "Email address must contain @ and . (dot)")
28
+ end
29
+ end
30
+ end
31
+
32
+ def posting_type_is_valid
33
+ if posting_type
34
+ unless %w(Debit Credit).include?(posting_type)
35
+ errors.add(:posting_type, "Posting Type must be either 'Debit' or 'Credit'")
36
+ end
37
+ end
38
+ end
39
+
40
+ def billable_status_is_valid
41
+ if billable_status
42
+ unless %w(Billable NotBillable HasBeenBilled).include?(billable_status)
43
+ errors.add(:posting_type, "Posting Type must be either 'Debit' or 'Credit'")
44
+ end
45
+ end
46
+ end
47
+
48
+ def entity_type_is_valid
49
+ if entity_type
50
+ unless %w(Customer Vendor).include?(entity_type)
51
+ errors.add(:entity_type, "Entity Type must be either 'Customer' or 'Vendor'")
52
+ end
53
+ end
54
+ end
55
+
56
+ def journal_line_entry_tax
57
+ if tax_code_ref
58
+ # tax_applicable_on must be set
59
+ errors.add(:tax_applicable_on, "TaxApplicableOn must be set when TaxCodeRef is set") if tax_applicable_on.nil?
60
+ errors.add(:tax_amount, "TaxAmount must be set when TaxCodeRef is set") if tax_amount.nil?
61
+ end
62
+ end
63
+ end
64
+
65
+ module PermitAlterations
66
+
67
+ def valid_for_update?
68
+ if sync_token.nil?
69
+ errors.add(:sync_token, "Missing required attribute SyncToken for update")
70
+ end
71
+ errors.empty?
72
+ end
73
+
74
+ def valid_for_create?
75
+ valid?
76
+ errors.empty?
77
+ end
78
+
79
+ # To delete an account Intuit requires we provide Id and SyncToken fields
80
+ def valid_for_deletion?
81
+ return false if(id.nil? || sync_token.nil?)
82
+ id.to_i > 0 && !sync_token.to_s.empty? && sync_token.to_i >= 0
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,35 @@
1
+ require 'uri'
2
+
3
+ module Quickbooks
4
+ module Util
5
+ class QueryBuilder
6
+
7
+ VALUE_QUOTE = "'"
8
+
9
+ def initialize
10
+ end
11
+
12
+ def clause(field, operator, value)
13
+ value = case value
14
+ when DateTime, Time
15
+ value.iso8601
16
+ when Date
17
+ value.strftime('%Y-%m-%d')
18
+ when Array
19
+ value = value.map{|v| v.to_s.gsub("'", "\\\\'") }
20
+ else
21
+ # escape single quotes with an escaped backslash
22
+ value = value.gsub("'", "\\\\'")
23
+ end
24
+
25
+ if operator.downcase == 'in' && value.is_a?(Array)
26
+ value = value.map{|v| "#{VALUE_QUOTE}#{v}#{VALUE_QUOTE}"}
27
+ "#{field} #{operator} (#{value.join(', ')})"
28
+ else
29
+ "#{field} #{operator} #{VALUE_QUOTE}#{value}#{VALUE_QUOTE}"
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ module Quickbooks
2
+
3
+ VERSION = "0.6.1"
4
+
5
+ end