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,52 @@
1
+ module Quickbooks
2
+ module Model
3
+ class Report < BaseModel
4
+
5
+ attr_accessor :xml
6
+
7
+ def all_rows
8
+ @all_rows ||= xml.css("ColData:first-child").map {|node| parse_row(node.parent) }
9
+ end
10
+
11
+ def columns
12
+ @columns ||= begin
13
+ nodes = xml.css('Column')
14
+ nodes.map do |node|
15
+ # There is also a ColType field, but it does not seem valuable to capture
16
+ node.at('ColTitle').content
17
+ end
18
+ end
19
+ end
20
+
21
+ def find_row(label)
22
+ all_rows.find {|r| r[0] == label }
23
+ end
24
+
25
+ private
26
+
27
+ # Parses the given row:
28
+ # <Row type="Data">
29
+ # <ColData value="Checking" id="35"/>
30
+ # <ColData value="1201.00"/>
31
+ # <ColData value="200.50"/>
32
+ # </Row>
33
+ #
34
+ # To:
35
+ # ['Checking', BigDecimal(1201.00), BigDecimal(200.50)]
36
+ def parse_row(row_node)
37
+ row_node.elements.map.with_index do |el, i|
38
+ value = el.attr('value')
39
+
40
+ if i.zero? # Return the first column as a string, its the label.
41
+ value
42
+ elsif value.blank?
43
+ nil
44
+ else
45
+ BigDecimal(value)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Model
3
+ class SalesItemLineDetail < BaseModel
4
+ xml_accessor :item_ref, :from => 'ItemRef', :as => BaseReference
5
+ xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
6
+ xml_accessor :unit_price, :from => 'UnitPrice', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
7
+ xml_accessor :rate_percent, :from => 'RatePercent', :as => BigDecimal, :to_xml => to_xml_big_decimal
8
+ xml_accessor :price_level_ref, :from => 'PriceLevelRef', :as => BaseReference
9
+ xml_accessor :quantity, :from => 'Qty', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
10
+ xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
11
+ xml_accessor :service_date, :from => 'ServiceDate', :as => Date
12
+
13
+ reference_setters :item_ref, :class_ref, :price_level_ref, :tax_code_ref
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,65 @@
1
+ module Quickbooks
2
+ module Model
3
+ class SalesReceipt < BaseModel
4
+ include DocumentNumbering
5
+ include GlobalTaxCalculation
6
+ include HasLineItems
7
+
8
+ XML_COLLECTION_NODE = "SalesReceipt"
9
+ XML_NODE = "SalesReceipt"
10
+ REST_RESOURCE = 'salesreceipt'
11
+
12
+ xml_accessor :id, :from => 'Id'
13
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
14
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
15
+ xml_accessor :auto_doc_number, :from => 'AutoDocNumber' # See auto_doc_number! method below for usage
16
+ xml_accessor :doc_number, :from => 'DocNumber'
17
+ xml_accessor :txn_date, :from => 'TxnDate', :as => Time
18
+ xml_accessor :line_items, :from => 'Line', :as => [Line]
19
+ xml_accessor :customer_ref, :from => 'CustomerRef', :as => BaseReference
20
+ xml_accessor :department_ref, :from => 'DepartmentRef', :as => BaseReference
21
+ xml_accessor :bill_email, :from => 'BillEmail', :as => EmailAddress
22
+ xml_accessor :bill_address, :from => 'BillAddr', :as => PhysicalAddress
23
+ xml_accessor :delivery_info, :from => 'DeliveryInfo', :as => DeliveryInfo
24
+ xml_accessor :ship_address, :from => 'ShipAddr', :as => PhysicalAddress
25
+ xml_accessor :po_number, :from => 'PONumber'
26
+ xml_accessor :ship_method_ref, :from => 'ShipMethodRef', :as => BaseReference
27
+ xml_accessor :ship_date, :from => 'ShipDate', :as => Time
28
+ xml_accessor :tracking_num, :from => 'TrackingNum'
29
+ xml_accessor :payment_method_ref, :from => 'PaymentMethodRef', :as => BaseReference
30
+ xml_accessor :payment_ref_number, :from => 'PaymentRefNum'
31
+ xml_accessor :deposit_to_account_ref, :from => 'DepositToAccountRef', :as => BaseReference
32
+ xml_accessor :customer_memo, :from => 'CustomerMemo'
33
+ xml_accessor :private_note, :from => 'PrivateNote'
34
+ xml_accessor :txn_tax_detail, :from => 'TxnTaxDetail', :as => TransactionTaxDetail
35
+ xml_accessor :custom_fields, :from => 'CustomField', :as => [CustomField]
36
+ xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
37
+ xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
38
+ xml_accessor :apply_tax_after_discount?, :from => 'ApplyTaxAfterDiscount'
39
+ xml_accessor :print_status, :from => 'PrintStatus'
40
+ xml_accessor :balance, :from => 'Balance', :as => BigDecimal, :to_xml => to_xml_big_decimal
41
+
42
+ xml_accessor :linked_transactions, :from => 'LinkedTxn', :as => [LinkedTransaction]
43
+ xml_accessor :email_status, :from => 'EmailStatus'
44
+ xml_accessor :exchange_rate, :from => 'ExchangeRate', :as => BigDecimal, :to_xml => to_xml_big_decimal
45
+
46
+ # readonly
47
+ xml_accessor :total, :from => 'TotalAmt', :as => BigDecimal
48
+ xml_accessor :home_total, :from => 'HomeTotalAmt', :as => BigDecimal, :to_xml => to_xml_big_decimal
49
+
50
+ # backward-compatible alias
51
+ alias_attribute :placed_on, :txn_date
52
+
53
+ reference_setters
54
+
55
+ validate :line_item_size
56
+ validate :document_numbering
57
+
58
+ def billing_email_address=(email_address_string)
59
+ self.bill_email = EmailAddress.new(email_address_string)
60
+ end
61
+ alias_method :email=, :billing_email_address= # backward backward compatibility to v0.4.6
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,11 @@
1
+ module Quickbooks
2
+ module Model
3
+ class SalesTaxRateList < BaseModel
4
+ XML_COLLECTION_NODE = "SalesTaxRateList"
5
+ XML_NODE = "SalesTaxRateList"
6
+ REST_RESOURCE = "salestaxratelist"
7
+
8
+ xml_accessor :tax_rate_detail, :from => "TaxRateDetail", :as => [TaxRateDetail]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Quickbooks
2
+ module Model
3
+ class SubTotalLineDetail < BaseModel
4
+ xml_accessor :item_ref, :from => 'ItemRef', :as => BaseReference
5
+ xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
6
+ xml_accessor :unit_price, :from => 'UnitPrice', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
7
+ xml_accessor :quantity, :from => 'Qty', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
8
+ xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
9
+
10
+ reference_setters :item_ref, :class_ref, :tax_code_ref
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxAgency < BaseModel
4
+ XML_COLLECTION_NODE = "TaxAgency"
5
+ XML_NODE = "TaxAgency"
6
+ REST_RESOURCE = "taxagency"
7
+
8
+ xml_accessor :id, :from => "Id"
9
+ xml_accessor :sync_token, :from => "SyncToken", :as => Integer
10
+ xml_accessor :meta_data, :from => "MetaData", :as => MetaData
11
+ xml_accessor :tax_tracked_on_purchases?, :from => "TaxTrackedOnPurchases"
12
+ xml_accessor :tax_tracked_on_sales?, :from => "TaxTrackedOnSales"
13
+ xml_accessor :display_name, :from => "DisplayName"
14
+
15
+ validates_presence_of :display_name
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxCode < BaseModel
4
+ XML_COLLECTION_NODE = "TaxCode"
5
+ XML_NODE = "TaxCode"
6
+ REST_RESOURCE = "taxcode"
7
+
8
+ xml_accessor :id, :from => "Id"
9
+ xml_accessor :sync_token, :from => "SyncToken", :as => Integer
10
+ xml_accessor :meta_data, :from => "MetaData", :as => MetaData
11
+ xml_accessor :name, :from => "Name"
12
+ xml_accessor :description, :from => "Description"
13
+ xml_accessor :active?, :from => "Active"
14
+ xml_accessor :taxable?, :from => "Taxable"
15
+ xml_accessor :tax_group?, :from => "TaxGroup"
16
+ xml_accessor :sales_tax_rate_list, :from => "SalesTaxRateList", :as => SalesTaxRateList
17
+ xml_accessor :purchase_tax_rate_list, :from => "PurchaseTaxRateList", :as => PurchaseTaxRateList
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxLine < BaseModel
4
+
5
+ xml_accessor :id, :from => 'Id'
6
+ xml_accessor :line_num, :from => 'LineNum', :as => Integer
7
+ xml_accessor :description, :from => 'Description'
8
+ xml_accessor :amount, :from => 'Amount', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
9
+ xml_accessor :detail_type, :from => 'DetailType'
10
+
11
+ xml_accessor :tax_line_detail, :from => 'TaxLineDetail', :as => TaxLineDetail
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxLineDetail < BaseModel
4
+
5
+ xml_accessor :percent_based?, :from => 'PercentBased'
6
+ xml_accessor :net_amount_taxable, :from => 'NetAmountTaxable', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
7
+ xml_accessor :tax_inclusive_amount, :from => 'TaxInclusiveAmount', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
8
+ xml_accessor :override_delta_amount, :from => 'OverrideDeltaAmount', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
9
+ xml_accessor :tax_percent, :from => 'TaxPercent', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
10
+ xml_accessor :tax_rate_ref, :from => 'TaxRateRef', :as => BaseReference
11
+
12
+ reference_setters :tax_rate_ref
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxRate < BaseModel
4
+ XML_COLLECTION_NODE = "TaxRate"
5
+ XML_NODE = "TaxRate"
6
+ REST_RESOURCE = "taxrate"
7
+
8
+ xml_accessor :id, :from => "Id"
9
+ xml_accessor :sync_token, :from => "SyncToken", :as => Integer
10
+ xml_accessor :meta_data, :from => "MetaData", :as => MetaData
11
+ xml_accessor :name, :from => "Name"
12
+ xml_accessor :description, :from => "Description"
13
+ xml_accessor :active?, :from => "Active"
14
+ xml_accessor :rate_value, :from => "RateValue", :as => BigDecimal, :to_xml => :to_f.to_proc
15
+ xml_accessor :agency_ref, :from => "AgencyRef", :as => BaseReference
16
+ xml_accessor :tax_return_line_ref, :from => "TaxReturnLineRef", :as => BaseReference
17
+ xml_accessor :special_tax_type, :from => "SpecialTaxType"
18
+ xml_accessor :display_type, :from => "DisplayType"
19
+ xml_accessor :effective_tax_rate, :from => "EffectiveTaxRate", :as => [EffectiveTaxRate]
20
+
21
+ validates_presence_of :name, :rate_value
22
+
23
+ reference_setters :agency_ref
24
+ reference_setters :tax_return_line_ref
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxRateDetail < BaseModel
4
+ XML_COLLECTION_NODE = "TaxRateDetail"
5
+ XML_NODE = "TaxRateDetail"
6
+ REST_RESOURCE = "taxratedetail"
7
+
8
+ xml_accessor :tax_rate_ref, :from => "TaxRateRef", :as => BaseReference
9
+ xml_accessor :tax_type_applicable, :from => "TaxTypeApplicable"
10
+ xml_accessor :tax_order, :from => "TaxOrder"
11
+
12
+ reference_setters :tax_rate_ref
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxRateDetailLine < BaseModel
4
+
5
+ xml_accessor :tax_rate_id, :from => "TaxRateId"
6
+ xml_accessor :tax_rate_name, :from => "TaxRateName"
7
+ xml_accessor :rate_value, :from => "RateValue"
8
+ xml_accessor :tax_agency_id, :from => "TaxAgencyId"
9
+ xml_accessor :tax_applicable_on, :from => 'TaxApplicableOn', :as => :text
10
+
11
+ validates :tax_rate_name, presence: true, length: { maximum: 100 }, if: Proc.new {|line| line.tax_rate_id.blank?}
12
+ validates :tax_agency_id, presence: true, numericality: {greater_than: 0}, if: Proc.new {|line| line.tax_rate_id.blank?}
13
+ validates :rate_value, presence: true, numericality: {less_than_or_equal_to: 100}, if: Proc.new {|line| line.tax_rate_id.blank?}
14
+ validates :tax_rate_id, numericality: true, if: Proc.new {|line| line.tax_rate_name.blank? && tax_agency_id.blank? && rate_value.blank? }
15
+
16
+ validates :tax_applicable_on, inclusion: {in: %w(Sales Purchase)}
17
+
18
+ def to_json
19
+ attributes.inject({}){|mem, item| mem[item.first.camelize] = item.last if item.last.present?; mem}
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,52 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TaxService < BaseModelJSON
4
+ REST_RESOURCE = "taxservice/taxcode"
5
+
6
+ xml_accessor :tax_code_id, :from => "TaxCodeId"
7
+ xml_accessor :tax_code, :from => "TaxCode"
8
+ xml_accessor :tax_rate_details, :from => 'TaxRateDetails', :as => [TaxRateDetailLine]
9
+
10
+ validates :tax_code, presence: true, length: { maximum: 100 }
11
+
12
+ validate :check_details_item
13
+
14
+ def initialize(options = {})
15
+ self.tax_rate_details = options['tax_rate_details'] || []
16
+ super
17
+ end
18
+
19
+ def self.from_json(response)
20
+ result = JSON.parse(response)
21
+ if result.present?
22
+ ts = Quickbooks::Model::TaxService.new
23
+ ts.tax_code = result['TaxCode']
24
+ ts.tax_code_id = result['TaxCodeId']
25
+ result['TaxRateDetails'].each do |item|
26
+ attrs = item.keys.inject({}){|mem, k| mem[k.underscore] = item[k]; mem}
27
+ ts.tax_rate_details << Quickbooks::Model::TaxRateDetailLine.new(attrs)
28
+ end
29
+ return ts
30
+ else
31
+ return nil
32
+ end
33
+ end
34
+
35
+ def check_details_item
36
+ if tax_rate_details.blank?
37
+ errors.add(:tax_rate_details, "must have at least one item")
38
+ else
39
+ tax_rate_details.each do |line|
40
+ unless line.valid?
41
+ errors.add(:base, line.errors.full_messages.join(', '))
42
+ end
43
+ end
44
+ names = tax_rate_details.map(&:tax_rate_name).uniq
45
+ if names.size < tax_rate_details.size
46
+ errors.add(:tax_rate_name, "Duplicate Tax Rate Name")
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,13 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TelephoneNumber < BaseModel
4
+ xml_accessor :free_form_number, :from => 'FreeFormNumber'
5
+
6
+ def initialize(number = nil)
7
+ unless number.nil?
8
+ self.free_form_number = number
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ module Quickbooks
2
+ module Model
3
+ class Term < BaseModel
4
+ XML_COLLECTION_NODE = "Term"
5
+ XML_NODE = "Term"
6
+ REST_RESOURCE = 'term'
7
+
8
+ xml_accessor :id, :from => 'Id'
9
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
10
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
11
+ xml_accessor :name, :from => 'Name'
12
+ xml_accessor :active?, :from => 'Active'
13
+ xml_accessor :type, :from => 'Type'
14
+ xml_accessor :discount_percent, :from => 'DiscountPercent', :as => BigDecimal
15
+ xml_accessor :due_days, :from => 'DueDays', :as => Integer
16
+ xml_accessor :discount_days, :from => 'DiscountDays', :as => Integer
17
+ xml_accessor :day_of_month_due, :from => 'DayOfMonthDue', :as => Integer
18
+ xml_accessor :due_next_month_days, :from => 'DueNextMonthDays', :as => Integer
19
+ xml_accessor :discount_day_of_month, :from => 'DiscountDayOfMonth', :as => Integer
20
+ xml_accessor :attachable_ref, :from => 'AttachableRef', :as => BaseReference
21
+
22
+ validates_presence_of :name
23
+
24
+ reference_setters :attachable_ref
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,79 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TimeActivity < BaseModel
4
+ XML_COLLECTION_NODE = "TimeActivity"
5
+ XML_NODE = "TimeActivity"
6
+ REST_RESOURCE = 'timeactivity'
7
+
8
+ NAMEOF_OPTIONS = %w( Employee Vendor )
9
+
10
+ xml_name XML_NODE
11
+
12
+ xml_accessor :id, :from => 'Id'
13
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
14
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
15
+
16
+ xml_accessor :txn_date, :from => 'TxnDate'
17
+ xml_accessor :name_of, :from => 'NameOf'
18
+
19
+ xml_accessor :employee_ref, :from => 'EmployeeRef', :as => BaseReference
20
+ xml_accessor :vendor_ref, :from => 'VendorRef', :as => BaseReference
21
+ xml_accessor :customer_ref, :from => 'CustomerRef', :as => BaseReference
22
+ xml_accessor :item_ref, :from => 'ItemRef', :as => BaseReference
23
+ xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
24
+
25
+ xml_accessor :billable_status, :from => 'BillableStatus'
26
+ xml_accessor :taxable, :from => 'Taxable'
27
+ xml_accessor :hourly_rate, :from => 'HourlyRate'
28
+ xml_accessor :minutes, :from => 'Minutes', :as => Integer
29
+ xml_accessor :hours, :from => 'Hours', :as => Integer
30
+ xml_accessor :break_minutes, :from => 'BreakMinutes', :as => Integer
31
+ xml_accessor :break_hours, :from => 'BreakHours', :as => Integer
32
+ xml_accessor :description, :from => 'Description'
33
+
34
+ xml_accessor :attachable_ref, :from => 'AttachableRef', :as => BaseReference
35
+ xml_accessor :department_ref, :from => 'DepartmentRef', :as => BaseReference
36
+ xml_accessor :start_time, :from => 'StartTime', :as => DateTime
37
+ xml_accessor :end_time, :from => 'EndTime', :as => DateTime
38
+ xml_accessor :time_zone, :from => 'TimeZone'
39
+
40
+ reference_setters
41
+
42
+ # == Validations
43
+ validates_inclusion_of :name_of, :in => NAMEOF_OPTIONS
44
+ validate :existence_of_employee_ref, :if => Proc.new { |ta| ta.name_of == "Employee" }
45
+ validate :existence_of_vendor_ref, :if => Proc.new { |ta| ta.name_of == "Vendor" }
46
+ validates :description, length: { maximum: 4000 }
47
+
48
+ def existence_of_employee_ref
49
+ if employee_ref.nil? || (employee_ref && employee_ref.value == 0)
50
+ errors.add(:employee_ref, "EmployeeRef is required and must be a non-zero value.")
51
+ end
52
+ end
53
+
54
+ def existence_of_vendor_ref
55
+ if vendor_ref.nil? || (vendor_ref && vendor_ref.value == 0)
56
+ errors.add(:vendor_ref, "VendorRef is required and must be a non-zero value.")
57
+ end
58
+ end
59
+
60
+ def valid_for_update?
61
+ if sync_token.nil?
62
+ errors.add(:sync_token, "Missing required attribute SyncToken for update")
63
+ end
64
+ errors.empty?
65
+ end
66
+
67
+ def valid_for_create?
68
+ valid?
69
+ errors.empty?
70
+ end
71
+
72
+ def valid_for_deletion?
73
+ return false if(id.nil? || sync_token.nil?)
74
+ id.to_i > 0 && !sync_token.to_s.empty? && sync_token.to_i >= 0
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,12 @@
1
+ module Quickbooks
2
+ module Model
3
+ class TransactionTaxDetail < BaseModel
4
+
5
+ xml_accessor :txn_tax_code_ref, :from => 'TxnTaxCodeRef', :as => BaseReference
6
+ xml_accessor :total_tax, :from => 'TotalTax', :as => BigDecimal, :to_xml => to_xml_big_decimal
7
+ xml_accessor :lines, :from => 'TaxLine', :as => [TaxLine]
8
+
9
+ reference_setters :txn_tax_code_ref
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module Quickbooks
2
+ module Model
3
+ class Transfer < BaseModel
4
+ XML_COLLECTION_NODE = "Transfer"
5
+ XML_NODE = "Transfer"
6
+ REST_RESOURCE = 'transfer'
7
+
8
+ xml_accessor :id, :from => 'Id'
9
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
10
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
11
+ xml_accessor :txn_date, :from => 'TxnDate', :as => Date
12
+ xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
13
+ xml_accessor :private_note, :from => 'PrivateNote'
14
+ xml_accessor :from_account_ref, :from => 'FromAccountRef', :as => BaseReference
15
+ xml_accessor :to_account_ref, :from => 'ToAccountRef', :as => BaseReference
16
+ xml_accessor :amount, :from => 'Amount', :as => BigDecimal, :to_xml => to_xml_big_decimal
17
+
18
+ reference_setters :currency_ref, :to_account_ref, :from_account_ref
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ module Quickbooks
2
+ module Model
3
+ class Upload < BaseModel
4
+ xml_convention :camelcase
5
+
6
+ #xml_accessor :attache, :as => Attachable
7
+
8
+ end
9
+ end
10
+ end
11
+
12
+ =begin
13
+
14
+ Response XML:
15
+
16
+ <IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-08-18T09:58:04.583-07:00">
17
+ <AttachableResponse>
18
+ <Attachable domain="QBO" sparse="false">
19
+ <Id>2700000000001439108</Id>
20
+ <SyncToken>0</SyncToken>
21
+ <MetaData>
22
+ <CreateTime>2014-08-18T09:58:06-07:00</CreateTime>
23
+ <LastUpdatedTime>2014-08-18T09:58:06-07:00</LastUpdatedTime>
24
+ </MetaData>
25
+ <FileName>monkey.jpg</FileName>
26
+ <FileAccessUri>/v3/company/1002341430/download/2700000000001439108</FileAccessUri>
27
+ <TempDownloadUri>https://intuit-qbo-prod-30.s3.amazonaws.com/1002341430%2Fattachments%2Fmonkey.jpg?Expires=1408381986&amp;AWSAccessKeyId=AKIAJEXDXKNYCBUNCCCQ&amp;Signature=WOVACYm6zi1rM5EGZRq3d3AMSM0%3D</TempDownloadUri>
28
+ <Size>105840</Size>
29
+ <ContentType>image/jpeg</ContentType>
30
+ <ThumbnailFileAccessUri>/v3/company/1002341430/attachable-thumbnail/2700000000001439108</ThumbnailFileAccessUri>
31
+ </Attachable>
32
+ </AttachableResponse>
33
+ </IntuitResponse>
34
+
35
+ =end
@@ -0,0 +1,10 @@
1
+ module Quickbooks
2
+ module Model
3
+ module Validator
4
+
5
+ def line_item_size
6
+ validates_length_of :line_items, :minimum => 1, :message => 'At least 1 line item is required'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,53 @@
1
+ # == Business Rules
2
+ # * The DisplayName, GivenName, MiddleName, FamilyName, and PrintOnCheckName attributes must not contain a colon,":".
3
+ # * The DisplayName attribute must be unique across all other customers, employees, vendors, and other names.
4
+ # * The PrimaryEmailAddress attribute must contain an at sign, "@," and dot, ".".
5
+ # * Either the DisplayName attribute or at least one of Title, GivenName, MiddleName, FamilyName, Suffix, or FullyQualifiedName attributes are required during create.
6
+
7
+ module Quickbooks
8
+ module Model
9
+ class Vendor < BaseModel
10
+ XML_COLLECTION_NODE = "Vendor"
11
+ XML_NODE = "Vendor"
12
+ REST_RESOURCE = 'vendor'
13
+ include NameEntity::Quality
14
+ include NameEntity::PermitAlterations
15
+
16
+ xml_name XML_NODE
17
+ xml_accessor :id, :from => 'Id'
18
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
19
+ xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
20
+ xml_accessor :attachable_ref, :from => 'AttachableRef', :as => BaseReference
21
+ xml_accessor :title, :from => 'Title'
22
+ xml_accessor :given_name, :from => 'GivenName'
23
+ xml_accessor :middle_name, :from => 'MiddleName'
24
+ xml_accessor :family_name, :from => 'FamilyName'
25
+ xml_accessor :suffix, :from => 'Suffix'
26
+ xml_accessor :company_name, :from => 'CompanyName'
27
+ xml_accessor :display_name, :from => 'DisplayName'
28
+ xml_accessor :print_on_check_name, :from => 'PrintOnCheckName'
29
+ xml_accessor :active?, :from => 'Active'
30
+ xml_accessor :primary_phone, :from => 'PrimaryPhone', :as => TelephoneNumber
31
+ xml_accessor :alternate_phone, :from => 'AlternatePhone', :as => TelephoneNumber
32
+ xml_accessor :mobile_phone, :from => 'Mobile', :as => TelephoneNumber
33
+ xml_accessor :fax_phone, :from => 'Fax', :as => TelephoneNumber
34
+ xml_accessor :primary_email_address, :from => 'PrimaryEmailAddr', :as => EmailAddress
35
+ xml_accessor :web_site, :from => 'WebAddr', :as => WebSiteAddress
36
+ xml_accessor :billing_address, :from => 'BillAddr', :as => PhysicalAddress
37
+ xml_accessor :other_contact_info, :from => 'OtherContactInfo', :as => OtherContactInfo
38
+ xml_accessor :tax_identifier, :from => 'TaxIdentifier'
39
+ xml_accessor :term_ref, :from => 'TermRef', :as => BaseReference
40
+ xml_accessor :balance, :from => 'Balance', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
41
+ xml_accessor :account_number, :from => 'AcctNum'
42
+ xml_accessor :is_1099?, :from => 'Vendor1099'
43
+ xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
44
+
45
+ #== Validations
46
+ validate :names_cannot_contain_invalid_characters
47
+ validate :email_address_is_valid
48
+
49
+ reference_setters
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,8 @@
1
+ module Quickbooks
2
+ module Model
3
+ # Refer to: https://developer.intuit.com/docs/0100_accounting/0300_developer_guides/change_data_capture
4
+ class VendorChange < ChangeModel
5
+ XML_NODE = "Vendor"
6
+ end
7
+ end
8
+ end