quickbooks-ruby 1.0.11 → 2.0
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.
- checksums.yaml +4 -4
- data/lib/quickbooks/model/account_based_expense_line_detail.rb +1 -0
- data/lib/quickbooks/model/bill.rb +1 -0
- data/lib/quickbooks/model/bill_line_item.rb +2 -0
- data/lib/quickbooks/model/customer.rb +1 -0
- data/lib/quickbooks/model/invoice.rb +5 -1
- data/lib/quickbooks/model/item_based_expense_line_detail.rb +1 -0
- data/lib/quickbooks/model/purchase_change.rb +7 -0
- data/lib/quickbooks/model/purchase_order.rb +2 -1
- data/lib/quickbooks/model/report.rb +12 -1
- data/lib/quickbooks/model/sales_item_line_detail.rb +1 -0
- data/lib/quickbooks/model/transaction_tax_detail.rb +1 -1
- data/lib/quickbooks/model/vendor.rb +1 -0
- data/lib/quickbooks/model/vendor_credit.rb +2 -0
- data/lib/quickbooks/service/access_token.rb +8 -4
- data/lib/quickbooks/service/base_service.rb +50 -33
- data/lib/quickbooks/service/payment.rb +6 -0
- data/lib/quickbooks/service/purchase_change.rb +16 -0
- data/lib/quickbooks/service/purchase_order.rb +8 -2
- data/lib/quickbooks/service/service_crud.rb +4 -1
- data/lib/quickbooks/util/logging.rb +12 -0
- data/lib/quickbooks/util/query_builder.rb +4 -0
- data/lib/quickbooks/version.rb +1 -1
- data/lib/quickbooks-ruby.rb +19 -5
- metadata +88 -31
- data/lib/quickbooks/faraday/middleware/gzip.rb +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc115bc7b925447fecb75976b448e66406441c9fd56208e964ac34844fdcd37a
|
4
|
+
data.tar.gz: fd1ca0b526c14cdadda7a1e276c3dcedb9b8c68e7c76be0aa074df30c63e0382
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce9c6d1732ab2d6ffd2a9ea57c2dad7f091867bb9af828a8bb25140f79a7d739cccd4f59d9b45665ec500d50241e2fbd65c833f4f307d71ba84543cdaec71725
|
7
|
+
data.tar.gz: 9bd4d94b4270280b142d93c3ee9bff0b579d4009fc5afe9a217404d201df6e74ea6db8a7fc5b33e48f16e919ea6716bd77f5aeb4e362421db659d1d9f8ac0bf4
|
@@ -7,6 +7,7 @@ module Quickbooks
|
|
7
7
|
xml_accessor :billable_status, :from => 'BillableStatus'
|
8
8
|
xml_accessor :tax_amount, :from => 'UnitPrice', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
9
9
|
xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
|
10
|
+
xml_accessor :tax_inclusive_amount, from: 'TaxInclusiveAmt', to_xml: Proc.new { |val| val.to_f }
|
10
11
|
|
11
12
|
reference_setters :customer_ref, :class_ref, :account_ref, :tax_code_ref
|
12
13
|
|
@@ -31,6 +31,7 @@ module Quickbooks
|
|
31
31
|
xml_accessor :due_date, :from => 'DueDate', :as => Date
|
32
32
|
xml_accessor :remit_to_address, :from => 'RemitToAddr', :as => PhysicalAddress
|
33
33
|
xml_accessor :ship_address, :from => 'ShipAddr', :as => PhysicalAddress
|
34
|
+
xml_accessor :mailing_address, :from => 'VendorAddr', :as => PhysicalAddress
|
34
35
|
xml_accessor :exchange_rate, :from => 'ExchangeRate', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
35
36
|
xml_accessor :balance, :from => 'Balance', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
36
37
|
|
@@ -12,6 +12,8 @@ module Quickbooks
|
|
12
12
|
xml_accessor :amount, :from => 'Amount', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
13
13
|
xml_accessor :detail_type, :from => 'DetailType'
|
14
14
|
|
15
|
+
xml_accessor :linked_transactions, :from => 'LinkedTxn', :as => [LinkedTransaction]
|
16
|
+
|
15
17
|
#== Various detail types
|
16
18
|
xml_accessor :account_based_expense_line_detail, :from => 'AccountBasedExpenseLineDetail', :as => AccountBasedExpenseLineDetail
|
17
19
|
xml_accessor :item_based_expense_line_detail, :from => 'ItemBasedExpenseLineDetail', :as => ItemBasedExpenseLineDetail
|
@@ -56,6 +56,7 @@ module Quickbooks
|
|
56
56
|
xml_accessor :tax_exemption_reason_id, :from => 'TaxExemptionReasonId'
|
57
57
|
xml_accessor :primary_tax_identifier, :from => 'PrimaryTaxIdentifier'
|
58
58
|
xml_accessor :customer_type_ref, :from => 'CustomerTypeRef', :as => BaseReference
|
59
|
+
xml_accessor :isproject?, :from => 'IsProject'
|
59
60
|
|
60
61
|
#== Validations
|
61
62
|
validate :names_cannot_contain_invalid_characters
|
@@ -36,6 +36,7 @@ module Quickbooks
|
|
36
36
|
xml_accessor :customer_memo, :from => 'CustomerMemo'
|
37
37
|
xml_accessor :billing_address, :from => 'BillAddr', :as => PhysicalAddress
|
38
38
|
xml_accessor :shipping_address, :from => 'ShipAddr', :as => PhysicalAddress
|
39
|
+
xml_accessor :ship_from_address, :from => 'ShipFromAddr', :as => PhysicalAddress
|
39
40
|
xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
|
40
41
|
xml_accessor :sales_term_ref, :from => 'SalesTermRef', :as => BaseReference
|
41
42
|
xml_accessor :due_date, :from => 'DueDate', :as => Date
|
@@ -59,6 +60,7 @@ module Quickbooks
|
|
59
60
|
xml_accessor :allow_online_credit_card_payment?, :from => 'AllowOnlineCreditCardPayment'
|
60
61
|
xml_accessor :allow_online_ach_payment?, :from => 'AllowOnlineACHPayment'
|
61
62
|
xml_accessor :deposit_to_account_ref, :from => 'DepositToAccountRef', :as => BaseReference
|
63
|
+
xml_accessor :bill_email_cc, :from => 'BillEmailCc', :as => EmailAddress
|
62
64
|
|
63
65
|
|
64
66
|
reference_setters
|
@@ -87,6 +89,9 @@ module Quickbooks
|
|
87
89
|
self.bill_email = EmailAddress.new(email_address_string)
|
88
90
|
end
|
89
91
|
|
92
|
+
def billing_email_cc_address=(email_address_string)
|
93
|
+
self.bill_email_cc = EmailAddress.new(email_address_string)
|
94
|
+
end
|
90
95
|
|
91
96
|
def wants_billing_email_sent!
|
92
97
|
self.email_status = EMAIL_STATUS_NEED_TO_SEND
|
@@ -96,7 +101,6 @@ module Quickbooks
|
|
96
101
|
email_status == EMAIL_STATUS_NEED_TO_SEND
|
97
102
|
end
|
98
103
|
|
99
|
-
|
100
104
|
def existence_of_customer_ref
|
101
105
|
if customer_ref.nil? || (customer_ref && customer_ref.value == 0)
|
102
106
|
errors.add(:customer_ref, "CustomerRef is required and must be a non-zero value.")
|
@@ -13,6 +13,7 @@ module Quickbooks
|
|
13
13
|
xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
|
14
14
|
xml_accessor :customer_ref, :from => 'CustomerRef', :as => BaseReference
|
15
15
|
xml_accessor :billable_status, :from => 'BillableStatus'
|
16
|
+
xml_accessor :tax_inclusive_amount, from: 'TaxInclusiveAmt', to_xml: Proc.new { |val| val.to_f }
|
16
17
|
|
17
18
|
reference_setters :item_ref, :class_ref, :price_level_ref, :customer_ref, :tax_code_ref
|
18
19
|
end
|
@@ -24,10 +24,11 @@ module Quickbooks
|
|
24
24
|
xml_accessor :attachable_ref, :from => 'AttachableRef', :as => BaseReference
|
25
25
|
xml_accessor :vendor_ref, :from => 'VendorRef', :as => BaseReference
|
26
26
|
xml_accessor :ap_account_ref, :from => 'APAccountRef', :as => BaseReference
|
27
|
+
xml_accessor :po_email, from: "POEmail", as: EmailAddress
|
27
28
|
xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
|
28
29
|
xml_accessor :sales_term_ref, :from => 'SalesTermRef', :as => BaseReference
|
29
30
|
|
30
|
-
xml_accessor :total, :from => 'TotalAmt', :as => BigDecimal, :to_xml =>
|
31
|
+
xml_accessor :total, :from => 'TotalAmt', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
31
32
|
xml_accessor :due_date, :from => 'DueDate', :as => Date
|
32
33
|
xml_accessor :vendor_address, :from => 'VendorAddr', :as => PhysicalAddress
|
33
34
|
xml_accessor :ship_address, :from => 'ShipAddr', :as => PhysicalAddress
|
@@ -38,9 +38,20 @@ module Quickbooks
|
|
38
38
|
value = el.attr('value')
|
39
39
|
|
40
40
|
next nil if value.blank?
|
41
|
-
|
41
|
+
|
42
|
+
parse_row_value(value)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_row_value(value)
|
47
|
+
# does it look like a number?
|
48
|
+
if value =~ /\A\-?[0-9\.]+\Z/
|
42
49
|
BigDecimal(value)
|
50
|
+
else
|
51
|
+
value
|
43
52
|
end
|
53
|
+
rescue ArgumentError
|
54
|
+
value
|
44
55
|
end
|
45
56
|
|
46
57
|
end
|
@@ -9,6 +9,7 @@ module Quickbooks
|
|
9
9
|
xml_accessor :quantity, :from => 'Qty', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
10
10
|
xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
|
11
11
|
xml_accessor :service_date, :from => 'ServiceDate', :as => Date
|
12
|
+
xml_accessor :tax_inclusive_amount, from: 'TaxInclusiveAmt', to_xml: Proc.new { |val| val.to_f }
|
12
13
|
|
13
14
|
reference_setters :item_ref, :class_ref, :price_level_ref, :tax_code_ref
|
14
15
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Quickbooks
|
2
2
|
module Model
|
3
3
|
class TransactionTaxDetail < BaseModel
|
4
|
-
|
5
4
|
xml_accessor :txn_tax_code_ref, :from => 'TxnTaxCodeRef', :as => BaseReference
|
6
5
|
xml_accessor :total_tax, :from => 'TotalTax', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
6
|
+
xml_accessor :total_tax_specified, :from => 'TotalTaxSpecified'
|
7
7
|
xml_accessor :lines, :from => 'TaxLine', :as => [TaxLine]
|
8
8
|
|
9
9
|
reference_setters :txn_tax_code_ref
|
@@ -41,6 +41,7 @@ module Quickbooks
|
|
41
41
|
xml_accessor :account_number, :from => 'AcctNum'
|
42
42
|
xml_accessor :is_1099?, :from => 'Vendor1099'
|
43
43
|
xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
|
44
|
+
xml_accessor :bill_rate, from: "BillRate", as: BigDecimal, to_xml: to_xml_big_decimal
|
44
45
|
|
45
46
|
#== Validations
|
46
47
|
validate :names_cannot_contain_invalid_characters
|
@@ -28,6 +28,8 @@ module Quickbooks
|
|
28
28
|
|
29
29
|
xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
|
30
30
|
xml_accessor :exchange_rate, :from => 'ExchangeRate', :as => BigDecimal, :to_xml => to_xml_big_decimal
|
31
|
+
|
32
|
+
xml_accessor :linked_transactions, :from => 'LinkedTxn', :as => [LinkedTransaction]
|
31
33
|
|
32
34
|
reference_setters
|
33
35
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Quickbooks
|
2
2
|
module Service
|
3
3
|
class AccessToken < BaseService
|
4
|
-
|
5
4
|
RENEW_URL = "https://appcenter.intuit.com/api/v1/connection/reconnect"
|
6
5
|
DISCONNECT_URL = "https://developer.api.intuit.com/v2/oauth2/tokens/revoke"
|
7
6
|
|
@@ -21,10 +20,15 @@ module Quickbooks
|
|
21
20
|
|
22
21
|
# https://developer.intuit.com/docs/0025_quickbooksapi/0053_auth_auth/oauth_management_api#Disconnect
|
23
22
|
def disconnect
|
24
|
-
|
25
|
-
|
23
|
+
connection = Faraday.new(headers: { 'Content-Type' => 'application/json' }) do |f|
|
24
|
+
f.adapter(::Quickbooks.http_adapter)
|
25
|
+
f.request(:authorization, :basic, oauth.client.id, oauth.client.secret)
|
26
|
+
end
|
27
|
+
|
26
28
|
url = "#{DISCONNECT_URL}?minorversion=#{Quickbooks.minorversion}"
|
27
|
-
response =
|
29
|
+
response = connection.post(url) do |request|
|
30
|
+
request.body = JSON.generate({ token: oauth.refresh_token || oauth.token })
|
31
|
+
end
|
28
32
|
|
29
33
|
if response.success?
|
30
34
|
Quickbooks::Model::AccessTokenResponse.new(error_code: "0")
|
@@ -49,12 +49,11 @@ module Quickbooks
|
|
49
49
|
# [OAuth2] The default Faraday connection does not have gzip or multipart support.
|
50
50
|
# We need to reset the existing connection and build a new one.
|
51
51
|
def rebuild_connection!
|
52
|
-
@oauth.client.connection =
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
builder.adapter :net_http
|
52
|
+
@oauth.client.connection = Faraday.new do |f|
|
53
|
+
f.request :multipart
|
54
|
+
f.request :gzip
|
55
|
+
f.request :url_encoded
|
56
|
+
f.adapter ::Quickbooks.http_adapter
|
58
57
|
end
|
59
58
|
end
|
60
59
|
|
@@ -248,11 +247,7 @@ module Quickbooks
|
|
248
247
|
headers['Accept-Encoding'] = HTTP_ACCEPT_ENCODING
|
249
248
|
end
|
250
249
|
|
251
|
-
|
252
|
-
log "METHOD = #{method}"
|
253
|
-
log "RESOURCE = #{url}"
|
254
|
-
log_request_body(body)
|
255
|
-
log "REQUEST HEADERS = #{headers.inspect}"
|
250
|
+
log_request(method, url, body, headers)
|
256
251
|
|
257
252
|
request_info = RequestInfo.new(url, headers, body, method)
|
258
253
|
before_request.call(request_info) if before_request
|
@@ -273,12 +268,8 @@ module Quickbooks
|
|
273
268
|
after_request.call(request_info, raw_response.body) if after_request
|
274
269
|
|
275
270
|
response = Quickbooks::Service::Responses::OAuthHttpResponse.wrap(raw_response)
|
276
|
-
|
277
|
-
|
278
|
-
log_response_body(response)
|
279
|
-
if response.respond_to?(:headers)
|
280
|
-
log "RESPONSE HEADERS = #{response.headers}"
|
281
|
-
end
|
271
|
+
log_response(response)
|
272
|
+
|
282
273
|
check_response(response, request: body)
|
283
274
|
end
|
284
275
|
|
@@ -354,28 +345,29 @@ module Quickbooks
|
|
354
345
|
end
|
355
346
|
end
|
356
347
|
|
357
|
-
def
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
348
|
+
def log_request(method, url, body, headers)
|
349
|
+
messages = []
|
350
|
+
messages << "------ QUICKBOOKS-RUBY REQUEST ------"
|
351
|
+
messages << "METHOD = #{method}"
|
352
|
+
messages << "RESOURCE = #{url}"
|
353
|
+
messages.concat(request_body_messages(body))
|
354
|
+
messages << "REQUEST HEADERS = #{headers.inspect}"
|
355
|
+
|
356
|
+
log_multiple(messages)
|
366
357
|
end
|
367
358
|
|
368
|
-
def
|
369
|
-
|
359
|
+
def request_body_messages(body)
|
360
|
+
messages = []
|
361
|
+
messages << "REQUEST BODY:"
|
370
362
|
if is_json?
|
371
|
-
|
363
|
+
messages << body.inspect
|
372
364
|
elsif is_pdf?
|
373
|
-
|
365
|
+
messages << "BODY is a PDF : not dumping"
|
374
366
|
else
|
375
367
|
#multipart request for uploads arrive here in a Hash with UploadIO vals
|
376
368
|
if body.is_a?(Hash)
|
377
369
|
body.each do |k,v|
|
378
|
-
|
370
|
+
messages << 'BODY PART:'
|
379
371
|
val_content = v.inspect
|
380
372
|
if v.is_a?(UploadIO)
|
381
373
|
if v.content_type == 'application/xml'
|
@@ -384,12 +376,37 @@ module Quickbooks
|
|
384
376
|
end
|
385
377
|
end
|
386
378
|
end
|
387
|
-
|
379
|
+
messages << "#{k}: #{val_content}"
|
388
380
|
end
|
389
381
|
else
|
390
|
-
|
382
|
+
messages << log_xml(body)
|
391
383
|
end
|
392
384
|
end
|
385
|
+
messages
|
386
|
+
end
|
387
|
+
|
388
|
+
def log_response(response)
|
389
|
+
messages = []
|
390
|
+
messages << "------ QUICKBOOKS-RUBY RESPONSE ------"
|
391
|
+
messages << "RESPONSE CODE = #{response.code}"
|
392
|
+
messages.concat(response_body_messages(response))
|
393
|
+
messages << "RESPONSE HEADERS = #{response.headers}" if response.respond_to?(:headers)
|
394
|
+
|
395
|
+
log_multiple(messages)
|
396
|
+
end
|
397
|
+
|
398
|
+
def response_body_messages(response)
|
399
|
+
messages = []
|
400
|
+
messages << "RESPONSE BODY:"
|
401
|
+
if is_json?
|
402
|
+
messages << ">>>>#{response.plain_body.inspect}"
|
403
|
+
elsif is_pdf?
|
404
|
+
messages << "BODY is a PDF : not dumping"
|
405
|
+
else
|
406
|
+
messages << log_xml(response.plain_body)
|
407
|
+
end
|
408
|
+
|
409
|
+
messages
|
393
410
|
end
|
394
411
|
|
395
412
|
def parse_and_raise_exception(options = {})
|
@@ -19,6 +19,12 @@ module Quickbooks
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
def pdf(payment)
|
23
|
+
url = "#{url_for_resource(model::REST_RESOURCE)}/#{payment.id}/pdf"
|
24
|
+
response = do_http_raw_get(url, {}, {'Accept' => 'application/pdf'})
|
25
|
+
response.plain_body
|
26
|
+
end
|
27
|
+
|
22
28
|
private
|
23
29
|
|
24
30
|
def model
|
@@ -7,13 +7,19 @@ module Quickbooks
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def fetch_by_id(id, params = {})
|
10
|
-
url = "#{url_for_base}/purchaseorder/#{id}?minorversion=#{Quickbooks
|
10
|
+
url = "#{url_for_base}/purchaseorder/#{id}?minorversion=#{Quickbooks.minorversion}"
|
11
11
|
fetch_object(model, url, params)
|
12
12
|
end
|
13
13
|
|
14
14
|
def url_for_query(query = nil, start_position = 1, max_results = 20, options = {})
|
15
15
|
url = super(query, start_position, max_results, options)
|
16
|
-
"#{url}&minorversion=#{Quickbooks
|
16
|
+
"#{url}&minorversion=#{Quickbooks.minorversion}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def pdf(purchase_order)
|
20
|
+
url = "#{url_for_resource(model::REST_RESOURCE)}/#{purchase_order.id}/pdf"
|
21
|
+
response = do_http_raw_get(url, {}, {'Accept' => 'application/pdf'})
|
22
|
+
response.plain_body
|
17
23
|
end
|
18
24
|
|
19
25
|
private
|
@@ -33,7 +33,10 @@ module Quickbooks
|
|
33
33
|
if field.class == Symbol
|
34
34
|
field = field.to_s.camelcase
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
|
+
clause = Quickbooks::Util::QueryBuilder.new.clause(field, '=', selector)
|
38
|
+
q = "select * from %s where %s" % [model.resource_for_singular, clause]
|
39
|
+
|
37
40
|
self.query(q, options)
|
38
41
|
end
|
39
42
|
|
@@ -5,10 +5,22 @@ module Quickbooks
|
|
5
5
|
::Quickbooks.log(msg)
|
6
6
|
end
|
7
7
|
|
8
|
+
def log_multiple(messages)
|
9
|
+
if condense_logs?
|
10
|
+
log(messages.join("\n"))
|
11
|
+
else
|
12
|
+
messages.each(&method(:log))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
8
16
|
def log?
|
9
17
|
::Quickbooks.log?
|
10
18
|
end
|
11
19
|
|
20
|
+
def condense_logs?
|
21
|
+
::Quickbooks.condense_logs?
|
22
|
+
end
|
23
|
+
|
12
24
|
def log_xml(str)
|
13
25
|
if ::Quickbooks.log_xml_pretty_print? && !(str and str.empty?)
|
14
26
|
Nokogiri::XML(str).to_xml
|
@@ -20,6 +20,8 @@ module Quickbooks
|
|
20
20
|
value.strftime('%Y-%m-%d')
|
21
21
|
when Array
|
22
22
|
value = value.map(&escape_single_quotes)
|
23
|
+
when true, false
|
24
|
+
value
|
23
25
|
else
|
24
26
|
value = escape_single_quotes.call(value)
|
25
27
|
end
|
@@ -27,6 +29,8 @@ module Quickbooks
|
|
27
29
|
if operator.downcase == 'in' && value.is_a?(Array)
|
28
30
|
value = value.map { |v| "#{VALUE_QUOTE}#{v}#{VALUE_QUOTE}" }
|
29
31
|
"#{field} #{operator} (#{value.join(', ')})"
|
32
|
+
elsif value == true || value == false
|
33
|
+
"#{field} #{operator} #{value}"
|
30
34
|
else
|
31
35
|
"#{field} #{operator} #{VALUE_QUOTE}#{value}#{VALUE_QUOTE}"
|
32
36
|
end
|
data/lib/quickbooks/version.rb
CHANGED
data/lib/quickbooks-ruby.rb
CHANGED
@@ -8,12 +8,13 @@ require 'date'
|
|
8
8
|
require 'forwardable'
|
9
9
|
require 'oauth2'
|
10
10
|
require 'net/http/post/multipart'
|
11
|
+
require 'faraday/multipart'
|
12
|
+
require 'faraday/gzip'
|
11
13
|
require 'quickbooks/util/collection'
|
12
14
|
require 'quickbooks/util/logging'
|
13
15
|
require 'quickbooks/util/http_encoding_helper'
|
14
16
|
require 'quickbooks/util/name_entity'
|
15
17
|
require 'quickbooks/util/query_builder'
|
16
|
-
require 'quickbooks/faraday/middleware/gzip'
|
17
18
|
|
18
19
|
#== OAuth Responses
|
19
20
|
require 'quickbooks/service/responses/oauth_http_response'
|
@@ -124,6 +125,7 @@ require 'quickbooks/model/item_change'
|
|
124
125
|
require 'quickbooks/model/report'
|
125
126
|
require 'quickbooks/model/credit_memo_change'
|
126
127
|
require 'quickbooks/model/payment_change'
|
128
|
+
require 'quickbooks/model/purchase_change'
|
127
129
|
require 'quickbooks/model/transfer'
|
128
130
|
require 'quickbooks/model/change_data_capture'
|
129
131
|
require 'quickbooks/model/refund_receipt_change'
|
@@ -181,17 +183,16 @@ require 'quickbooks/service/item_change'
|
|
181
183
|
require 'quickbooks/service/reports'
|
182
184
|
require 'quickbooks/service/credit_memo_change'
|
183
185
|
require 'quickbooks/service/payment_change'
|
186
|
+
require 'quickbooks/service/purchase_change'
|
184
187
|
require 'quickbooks/service/transfer'
|
185
188
|
require 'quickbooks/service/change_data_capture'
|
186
189
|
require 'quickbooks/service/refund_receipt_change'
|
187
190
|
|
188
|
-
# Register Faraday Middleware
|
189
|
-
Faraday::Middleware.register_middleware :gzip => lambda { Gzip }
|
190
|
-
|
191
191
|
module Quickbooks
|
192
192
|
@@sandbox_mode = false
|
193
193
|
@@logger = nil
|
194
194
|
@@minorversion = 47
|
195
|
+
@@http_adapter = :net_http
|
195
196
|
|
196
197
|
class << self
|
197
198
|
def sandbox_mode
|
@@ -218,14 +219,27 @@ module Quickbooks
|
|
218
219
|
@@logger = logger
|
219
220
|
end
|
220
221
|
|
222
|
+
def http_adapter
|
223
|
+
@@http_adapter
|
224
|
+
end
|
225
|
+
|
226
|
+
def http_adapter=(adapter)
|
227
|
+
@@http_adapter = adapter
|
228
|
+
end
|
229
|
+
|
221
230
|
# set logging on or off
|
222
|
-
attr_writer :log, :log_xml_pretty_print
|
231
|
+
attr_writer :log, :log_xml_pretty_print, :condense_logs
|
223
232
|
|
224
233
|
# Returns whether to log. Defaults to 'false'.
|
225
234
|
def log?
|
226
235
|
@log ||= false
|
227
236
|
end
|
228
237
|
|
238
|
+
# Returns whether to limit log lines
|
239
|
+
def condense_logs?
|
240
|
+
@condense_logs ||= false
|
241
|
+
end
|
242
|
+
|
229
243
|
# pretty printing the xml in the logs is "on" by default
|
230
244
|
def log_xml_pretty_print?
|
231
245
|
defined?(@log_xml_pretty_print) ? @log_xml_pretty_print : true
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quickbooks-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: '2.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Caughlan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth2
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "<"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '3.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "<"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: roxml
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '4.
|
33
|
+
version: '4.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '4.
|
40
|
+
version: '4.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activemodel
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '4.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: net-http-persistent
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: nokogiri
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,48 @@ dependencies:
|
|
80
94
|
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: faraday
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "<"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "<"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: faraday-multipart
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: faraday-gzip
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.1'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.1'
|
83
139
|
- !ruby/object:Gem::Dependency
|
84
140
|
name: rake
|
85
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,44 +154,44 @@ dependencies:
|
|
98
154
|
name: simplecov
|
99
155
|
requirement: !ruby/object:Gem::Requirement
|
100
156
|
requirements:
|
101
|
-
- -
|
157
|
+
- - ">="
|
102
158
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0
|
159
|
+
version: '0'
|
104
160
|
type: :development
|
105
161
|
prerelease: false
|
106
162
|
version_requirements: !ruby/object:Gem::Requirement
|
107
163
|
requirements:
|
108
|
-
- -
|
164
|
+
- - ">="
|
109
165
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0
|
166
|
+
version: '0'
|
111
167
|
- !ruby/object:Gem::Dependency
|
112
168
|
name: rr
|
113
169
|
requirement: !ruby/object:Gem::Requirement
|
114
170
|
requirements:
|
115
|
-
- - "
|
171
|
+
- - ">="
|
116
172
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
173
|
+
version: '0'
|
118
174
|
type: :development
|
119
175
|
prerelease: false
|
120
176
|
version_requirements: !ruby/object:Gem::Requirement
|
121
177
|
requirements:
|
122
|
-
- - "
|
178
|
+
- - ">="
|
123
179
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
180
|
+
version: '0'
|
125
181
|
- !ruby/object:Gem::Dependency
|
126
182
|
name: rspec
|
127
183
|
requirement: !ruby/object:Gem::Requirement
|
128
184
|
requirements:
|
129
|
-
- - "
|
185
|
+
- - ">="
|
130
186
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
187
|
+
version: '0'
|
132
188
|
type: :development
|
133
189
|
prerelease: false
|
134
190
|
version_requirements: !ruby/object:Gem::Requirement
|
135
191
|
requirements:
|
136
|
-
- - "
|
192
|
+
- - ">="
|
137
193
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
194
|
+
version: '0'
|
139
195
|
- !ruby/object:Gem::Dependency
|
140
196
|
name: webmock
|
141
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,16 +210,16 @@ dependencies:
|
|
154
210
|
name: dotenv
|
155
211
|
requirement: !ruby/object:Gem::Requirement
|
156
212
|
requirements:
|
157
|
-
- -
|
213
|
+
- - ">="
|
158
214
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
215
|
+
version: '0'
|
160
216
|
type: :development
|
161
217
|
prerelease: false
|
162
218
|
version_requirements: !ruby/object:Gem::Requirement
|
163
219
|
requirements:
|
164
|
-
- -
|
220
|
+
- - ">="
|
165
221
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
222
|
+
version: '0'
|
167
223
|
description: QBO V3 REST API to Quickbooks Online
|
168
224
|
email: toolbag@gmail.com
|
169
225
|
executables: []
|
@@ -171,7 +227,6 @@ extensions: []
|
|
171
227
|
extra_rdoc_files: []
|
172
228
|
files:
|
173
229
|
- lib/quickbooks-ruby.rb
|
174
|
-
- lib/quickbooks/faraday/middleware/gzip.rb
|
175
230
|
- lib/quickbooks/model/access_token_response.rb
|
176
231
|
- lib/quickbooks/model/account.rb
|
177
232
|
- lib/quickbooks/model/account_based_expense_line_detail.rb
|
@@ -249,6 +304,7 @@ files:
|
|
249
304
|
- lib/quickbooks/model/physical_address.rb
|
250
305
|
- lib/quickbooks/model/preferences.rb
|
251
306
|
- lib/quickbooks/model/purchase.rb
|
307
|
+
- lib/quickbooks/model/purchase_change.rb
|
252
308
|
- lib/quickbooks/model/purchase_line_item.rb
|
253
309
|
- lib/quickbooks/model/purchase_order.rb
|
254
310
|
- lib/quickbooks/model/purchase_tax_rate_list.rb
|
@@ -313,6 +369,7 @@ files:
|
|
313
369
|
- lib/quickbooks/service/payment_method.rb
|
314
370
|
- lib/quickbooks/service/preferences.rb
|
315
371
|
- lib/quickbooks/service/purchase.rb
|
372
|
+
- lib/quickbooks/service/purchase_change.rb
|
316
373
|
- lib/quickbooks/service/purchase_order.rb
|
317
374
|
- lib/quickbooks/service/refund_receipt.rb
|
318
375
|
- lib/quickbooks/service/refund_receipt_change.rb
|
@@ -345,7 +402,7 @@ homepage: http://github.com/ruckus/quickbooks-ruby
|
|
345
402
|
licenses:
|
346
403
|
- MIT
|
347
404
|
metadata: {}
|
348
|
-
post_install_message:
|
405
|
+
post_install_message:
|
349
406
|
rdoc_options: []
|
350
407
|
require_paths:
|
351
408
|
- lib
|
@@ -353,16 +410,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
353
410
|
requirements:
|
354
411
|
- - ">="
|
355
412
|
- !ruby/object:Gem::Version
|
356
|
-
version: '
|
413
|
+
version: '2.6'
|
357
414
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
358
415
|
requirements:
|
359
416
|
- - ">="
|
360
417
|
- !ruby/object:Gem::Version
|
361
418
|
version: '0'
|
362
419
|
requirements: []
|
363
|
-
rubyforge_project:
|
364
|
-
rubygems_version: 2.7.
|
365
|
-
signing_key:
|
420
|
+
rubyforge_project:
|
421
|
+
rubygems_version: 2.7.6.2
|
422
|
+
signing_key:
|
366
423
|
specification_version: 4
|
367
424
|
summary: REST API to Quickbooks Online
|
368
425
|
test_files: []
|
@@ -1,74 +0,0 @@
|
|
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
|
-
break if response_env[:response_headers].nil?
|
27
|
-
|
28
|
-
case response_env[:response_headers][CONTENT_ENCODING]
|
29
|
-
when 'gzip'
|
30
|
-
reset_body(response_env, &method(:uncompress_gzip))
|
31
|
-
when 'deflate'
|
32
|
-
reset_body(response_env, &method(:inflate))
|
33
|
-
when 'br'
|
34
|
-
reset_body(response_env, &method(:brotli_inflate))
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def reset_body(env)
|
40
|
-
env[:body] = yield(env[:body])
|
41
|
-
env[:response_headers].delete(CONTENT_ENCODING)
|
42
|
-
env[:response_headers][CONTENT_LENGTH] = env[:body].length
|
43
|
-
end
|
44
|
-
|
45
|
-
def uncompress_gzip(body)
|
46
|
-
io = StringIO.new(body)
|
47
|
-
gzip_reader = if RUBY_ENCODING
|
48
|
-
Zlib::GzipReader.new(io, :encoding => 'ASCII-8BIT')
|
49
|
-
else
|
50
|
-
Zlib::GzipReader.new(io)
|
51
|
-
end
|
52
|
-
gzip_reader.read
|
53
|
-
end
|
54
|
-
|
55
|
-
def inflate(body)
|
56
|
-
# Inflate as a DEFLATE (RFC 1950+RFC 1951) stream
|
57
|
-
Zlib::Inflate.inflate(body)
|
58
|
-
rescue Zlib::DataError
|
59
|
-
# Fall back to inflating as a "raw" deflate stream which
|
60
|
-
# Microsoft servers return
|
61
|
-
inflate = Zlib::Inflate.new(-Zlib::MAX_WBITS)
|
62
|
-
begin
|
63
|
-
inflate.inflate(body)
|
64
|
-
ensure
|
65
|
-
inflate.close
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def brotli_inflate(body)
|
70
|
-
self.class.dependency 'brotli'
|
71
|
-
|
72
|
-
Brotli.inflate(body)
|
73
|
-
end
|
74
|
-
end
|