quickbooks-ruby 0.0.5 → 0.0.6
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-ruby.rb +33 -6
- data/lib/quickbooks/model/account.rb +2 -0
- data/lib/quickbooks/model/base_model.rb +21 -1
- data/lib/quickbooks/model/base_reference.rb +1 -1
- data/lib/quickbooks/model/estimate.rb +77 -0
- data/lib/quickbooks/model/group_line_detail.rb +11 -0
- data/lib/quickbooks/model/item_based_expense_line_detail.rb +18 -0
- data/lib/quickbooks/model/markup_info.rb +12 -0
- data/lib/quickbooks/model/payment.rb +41 -0
- data/lib/quickbooks/model/purchase.rb +43 -0
- data/lib/quickbooks/model/purchase_line_item.rb +22 -0
- data/lib/quickbooks/model/purchase_order.rb +39 -0
- data/lib/quickbooks/model/sales_item_line_detail.rb +1 -1
- data/lib/quickbooks/model/tax_line.rb +15 -0
- data/lib/quickbooks/model/tax_line_detail.rb +16 -0
- data/lib/quickbooks/model/term.rb +28 -0
- data/lib/quickbooks/model/transaction_tax_detail.rb +11 -0
- data/lib/quickbooks/model/vendor_credit.rb +31 -0
- data/lib/quickbooks/service/base_service.rb +13 -29
- data/lib/quickbooks/service/customer.rb +1 -1
- data/lib/quickbooks/service/employee.rb +1 -1
- data/lib/quickbooks/service/estimate.rb +21 -0
- data/lib/quickbooks/service/payment.rb +21 -0
- data/lib/quickbooks/service/purchase.rb +15 -0
- data/lib/quickbooks/service/purchase_order.rb +15 -0
- data/lib/quickbooks/service/service_crud.rb +2 -2
- data/lib/quickbooks/service/term.rb +22 -0
- data/lib/quickbooks/service/vendor_credit.rb +15 -0
- data/lib/quickbooks/version.rb +1 -1
- metadata +29 -5
- data/lib/quickbooks/util/class_util.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91bc61de465110193b80e334f32e2a38f1d5a80b
|
4
|
+
data.tar.gz: 6122789bac338be996e22c7a2784b916706eb943
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1032fc7945938f63b2623173dc4705f202123bf03a01bfb00c51080ded6dd5cabc28e5f9a9f67177afdef6a8a50bfa64709e2c96a54e40b6bf1bde5acb13cee
|
7
|
+
data.tar.gz: ba63a3754f73dca065d8909bfc5ccb81ab924bd53a0efb515584cf34a23997a6f401387d7352061108d73b4a763ded6a46cfef6f21bc71b53a6cec94657c0ea3
|
data/lib/quickbooks-ruby.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
require 'roxml'
|
2
2
|
require 'logger'
|
3
3
|
require 'nokogiri'
|
4
|
-
require 'logger'
|
5
4
|
require 'active_model'
|
6
5
|
require 'cgi'
|
6
|
+
require 'uri'
|
7
7
|
require 'date'
|
8
8
|
require 'forwardable'
|
9
9
|
require 'oauth'
|
10
10
|
require 'quickbooks/util/logging'
|
11
|
-
require 'quickbooks/util/class_util'
|
12
11
|
require 'quickbooks/util/http_encoding_helper'
|
13
12
|
require 'quickbooks/util/name_entity'
|
14
13
|
|
@@ -38,6 +37,7 @@ require 'quickbooks/model/invoice'
|
|
38
37
|
require 'quickbooks/model/company_info'
|
39
38
|
require 'quickbooks/model/customer'
|
40
39
|
require 'quickbooks/model/sales_receipt'
|
40
|
+
require 'quickbooks/model/payment'
|
41
41
|
require 'quickbooks/model/payment_method'
|
42
42
|
require 'quickbooks/model/credit_memo'
|
43
43
|
require 'quickbooks/model/bill_line_item'
|
@@ -48,6 +48,18 @@ require 'quickbooks/model/bill_payment_credit_card'
|
|
48
48
|
require 'quickbooks/model/bill_payment'
|
49
49
|
require 'quickbooks/model/vendor'
|
50
50
|
require 'quickbooks/model/employee'
|
51
|
+
require 'quickbooks/model/term'
|
52
|
+
require 'quickbooks/model/markup_info'
|
53
|
+
require 'quickbooks/model/group_line_detail'
|
54
|
+
require 'quickbooks/model/item_based_expense_line_detail'
|
55
|
+
require 'quickbooks/model/tax_line_detail'
|
56
|
+
require 'quickbooks/model/tax_line'
|
57
|
+
require 'quickbooks/model/transaction_tax_detail'
|
58
|
+
require 'quickbooks/model/purchase_line_item'
|
59
|
+
require 'quickbooks/model/purchase'
|
60
|
+
require 'quickbooks/model/purchase_order'
|
61
|
+
require 'quickbooks/model/vendor_credit'
|
62
|
+
require 'quickbooks/model/estimate'
|
51
63
|
|
52
64
|
#== Services
|
53
65
|
require 'quickbooks/service/base_service'
|
@@ -64,10 +76,12 @@ require 'quickbooks/service/bill'
|
|
64
76
|
require 'quickbooks/service/bill_payment'
|
65
77
|
require 'quickbooks/service/vendor'
|
66
78
|
require 'quickbooks/service/employee'
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
79
|
+
require 'quickbooks/service/payment'
|
80
|
+
require 'quickbooks/service/term'
|
81
|
+
require 'quickbooks/service/purchase'
|
82
|
+
require 'quickbooks/service/purchase_order'
|
83
|
+
require 'quickbooks/service/vendor_credit'
|
84
|
+
require 'quickbooks/service/estimate'
|
71
85
|
|
72
86
|
module Quickbooks
|
73
87
|
@@logger = nil
|
@@ -97,6 +111,19 @@ module Quickbooks
|
|
97
111
|
end
|
98
112
|
end # << self
|
99
113
|
|
114
|
+
class InvalidModelException < StandardError; end
|
115
|
+
|
116
|
+
class AuthorizationFailure < StandardError; end
|
117
|
+
|
118
|
+
class IntuitRequestException < StandardError
|
119
|
+
attr_accessor :message, :code, :detail, :type
|
120
|
+
def initialize(msg)
|
121
|
+
self.message = msg
|
122
|
+
super(msg)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
100
127
|
class Collection
|
101
128
|
attr_accessor :entries
|
102
129
|
|
@@ -34,6 +34,8 @@ module Quickbooks
|
|
34
34
|
xml_accessor :acct_num, :from => 'AcctNum'
|
35
35
|
xml_accessor :bank_num, :from => 'BankNum'
|
36
36
|
|
37
|
+
xml_accessor :current_balance, :from => 'CurrentBalance', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
38
|
+
xml_accessor :current_balance_with_sub_accounts, :from => 'CurrentBalanceWithSubAccounts', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
37
39
|
xml_accessor :opening_balance, :from => 'OpeningBalance', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
38
40
|
xml_accessor :opening_balance_date, :from => 'OpeningBalanceDate', :as => DateTime
|
39
41
|
xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
|
@@ -3,8 +3,13 @@ module Quickbooks
|
|
3
3
|
class BaseModel
|
4
4
|
include ActiveModel::Validations
|
5
5
|
include ROXML
|
6
|
+
|
6
7
|
xml_convention :camelcase
|
7
8
|
|
9
|
+
def initialize(attributes={})
|
10
|
+
attributes.each {|key, value| public_send("#{key}=", value) }
|
11
|
+
end
|
12
|
+
|
8
13
|
# ROXML doesnt insert the namespaces into generated XML so we need to do it ourselves
|
9
14
|
# insert the static namespaces in the first opening tag that matches the +model_name+
|
10
15
|
def to_xml_inject_ns(model_name, options = {})
|
@@ -24,7 +29,22 @@ module Quickbooks
|
|
24
29
|
to_xml_inject_ns(self.class::XML_NODE, options)
|
25
30
|
end
|
26
31
|
|
32
|
+
delegate :[], :fetch, :to => :attributes
|
33
|
+
|
34
|
+
def attributes
|
35
|
+
attributes = self.class.attribute_names.map do |name|
|
36
|
+
value = public_send(name)
|
37
|
+
value = value.attributes if value.respond_to?(:attributes)
|
38
|
+
[name, value]
|
39
|
+
end
|
40
|
+
|
41
|
+
HashWithIndifferentAccess[attributes]
|
42
|
+
end
|
43
|
+
|
27
44
|
class << self
|
45
|
+
def attribute_names
|
46
|
+
roxml_attrs.map(&:accessor)
|
47
|
+
end
|
28
48
|
|
29
49
|
# These can be over-ridden in each model object as needed
|
30
50
|
def resource_for_collection
|
@@ -59,4 +79,4 @@ module Quickbooks
|
|
59
79
|
end
|
60
80
|
end
|
61
81
|
end
|
62
|
-
end
|
82
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# == Business Rules
|
2
|
+
# The Estimate object has the following business rules and validations:
|
3
|
+
# * An Estimate must have at least one line that describes an item.
|
4
|
+
# * An Estimate must have a reference to a customer.
|
5
|
+
# * If shipping address and billing address are not provided, the customer address is used to fill those values.
|
6
|
+
# * For US country, CustomSalesTax cannot be used as TaxCodeRef.
|
7
|
+
|
8
|
+
module Quickbooks
|
9
|
+
module Model
|
10
|
+
class Estimate < BaseModel
|
11
|
+
|
12
|
+
#== Constants
|
13
|
+
REST_RESOURCE = 'estimate'
|
14
|
+
XML_COLLECTION_NODE = "Estimate"
|
15
|
+
XML_NODE = "Estimate"
|
16
|
+
|
17
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
18
|
+
xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
|
19
|
+
xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
|
20
|
+
xml_accessor :custom_fields, :from => 'CustomField', :as => [CustomField]
|
21
|
+
xml_accessor :doc_number, :from => 'DocNumber'
|
22
|
+
xml_accessor :txn_date, :from => 'TxnDate', :as => Date
|
23
|
+
xml_accessor :private_note, :from => 'PrivateNote'
|
24
|
+
|
25
|
+
xml_accessor :department_ref, :from => 'DepartmentRef', :as => BaseReference
|
26
|
+
xml_accessor :linked_transactions, :from => 'LinkedTxn', :as => [LinkedTransaction]
|
27
|
+
xml_accessor :line_items, :from => 'Line', :as => [InvoiceLineItem]
|
28
|
+
xml_accessor :txn_tax_detail, :from => 'TxnTaxDetail'
|
29
|
+
xml_accessor :txn_status, :from => 'TxnStatus'
|
30
|
+
|
31
|
+
xml_accessor :customer_ref, :from => 'CustomerRef', :as => BaseReference
|
32
|
+
xml_accessor :customer_memo, :from => 'CustomerMemo'
|
33
|
+
xml_accessor :billing_address, :from => 'BillAddr', :as => PhysicalAddress
|
34
|
+
xml_accessor :shipping_address, :from => 'ShipAddr', :as => PhysicalAddress
|
35
|
+
xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
|
36
|
+
xml_accessor :sales_term_ref, :from => 'SalesTermRef', :as => BaseReference
|
37
|
+
xml_accessor :total_amount, :from => 'TotalAmt', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
38
|
+
xml_accessor :ship_method_ref, :from => 'ShipMethodRef', :as => BaseReference
|
39
|
+
xml_accessor :ship_date, :from => 'ShipDate', :as => Date
|
40
|
+
|
41
|
+
xml_accessor :apply_tax_after_discount, :from => 'ApplyTaxAfterDiscount'
|
42
|
+
xml_accessor :print_status, :from => 'PrintStatus'
|
43
|
+
xml_accessor :email_status, :from => 'EmailStatus'
|
44
|
+
xml_accessor :bill_email, :from => 'BillEmail', :as => EmailAddress
|
45
|
+
xml_accessor :expiration_date, :from => 'ExpirationDate', :as => Date
|
46
|
+
xml_accessor :accepted_by, :from => 'AcceptedBy'
|
47
|
+
xml_accessor :accepted_date, :from => 'AcceptedDate', :as => Date
|
48
|
+
|
49
|
+
reference_setters :department_ref, :customer_ref, :class_ref, :sales_term_ref, :ship_method_ref
|
50
|
+
|
51
|
+
#== Validations
|
52
|
+
validates_length_of :line_items, :minimum => 1
|
53
|
+
validate :existence_of_customer_ref
|
54
|
+
|
55
|
+
def initialize
|
56
|
+
ensure_line_items_initialization
|
57
|
+
super
|
58
|
+
end
|
59
|
+
|
60
|
+
def apply_tax_after_discount?
|
61
|
+
apply_tax_after_discount.to_s == 'true'
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def existence_of_customer_ref
|
67
|
+
if customer_ref.nil? || (customer_ref && customer_ref.value == 0)
|
68
|
+
errors.add(:customer_ref, "CustomerRef is required and must be a non-zero value.")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def ensure_line_items_initialization
|
73
|
+
self.line_items ||= []
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Model
|
3
|
+
class GroupLineDetail < BaseModel
|
4
|
+
xml_accessor :group_item_ref, :from => 'CustomerRef', :as => BaseReference
|
5
|
+
xml_accessor :quantity, :from => 'Quantity', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
6
|
+
xml_accessor :line_items, :from => 'Line', :as => [Line]
|
7
|
+
|
8
|
+
reference_setters :group_item_ref
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Model
|
3
|
+
class ItemBasedExpenseLineDetail < 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 => Proc.new { |val| val.to_f }
|
8
|
+
xml_accessor :price_level_ref, :from => 'PriceLevelRef', :as => BaseReference
|
9
|
+
xml_accessor :markup_info, :from => 'MarkupInfo', :as => MarkupInfo
|
10
|
+
xml_accessor :quantity, :from => 'Qty', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
11
|
+
xml_accessor :tax_code_ref, :from => 'TaxCodeRef', :as => BaseReference
|
12
|
+
xml_accessor :customer_ref, :from => 'CustomerRef', :as => BaseReference
|
13
|
+
xml_accessor :billable_status, :from => 'BillableStatus'
|
14
|
+
|
15
|
+
reference_setters :item_ref, :class_ref, :price_level_ref, :customer_ref, :tax_code_ref
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Model
|
3
|
+
class MarkupInfo < BaseModel
|
4
|
+
xml_accessor :percent_based, :from => 'PercentBased'
|
5
|
+
xml_accessor :value, :from => 'Value', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
6
|
+
xml_accessor :percent, :from => 'Percent', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
7
|
+
xml_accessor :price_level_ref, :from => 'PriceLevelRef', :as => BaseReference
|
8
|
+
|
9
|
+
reference_setters :price_level_ref
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Model
|
3
|
+
class Payment < BaseModel
|
4
|
+
XML_COLLECTION_NODE = "Payment"
|
5
|
+
XML_NODE = "Payment"
|
6
|
+
REST_RESOURCE = 'payment'
|
7
|
+
|
8
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
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 :private_note, :from => 'PrivateNote'
|
13
|
+
xml_accessor :txn_status, :from => 'TxnStatus'
|
14
|
+
xml_accessor :line, :from => 'Line', :as => Line
|
15
|
+
xml_accessor :customer_ref, :from => 'CustomerRef', :as => BaseReference
|
16
|
+
xml_accessor :ar_account_ref, :from => 'ARAccountRef', :as => BaseReference
|
17
|
+
xml_accessor :deposit_to_account_ref, :from => 'DepositToAccountRef', :as => BaseReference
|
18
|
+
xml_accessor :payment_method_ref, :from => 'PaymentMethodRef', :as => BaseReference
|
19
|
+
xml_accessor :payment_method_number, :from => 'PaymentMethodNum'
|
20
|
+
xml_accessor :credit_card_payment, :from => 'CreditCardPayment', :as => CreditCardPayment
|
21
|
+
xml_accessor :total, :from => 'TotalAmt', :as => BigDecimal, :to_xml => :to_f.to_proc
|
22
|
+
xml_accessor :unapplied_amount, :from => 'UnappliedAmt', :as => BigDecimal, :to_xml => :to_f.to_proc
|
23
|
+
xml_accessor :process_payment, :from => 'ProcessPayment'
|
24
|
+
xml_accessor :currency_ref, :from => 'CurrencyRef', :as => BaseReference
|
25
|
+
xml_accessor :exchange_rate, :from => 'ExchangeRate', :as => BigDecimal, :to_xml => :to_f.to_proc
|
26
|
+
|
27
|
+
reference_setters :customer_ref
|
28
|
+
reference_setters :payment_method_ref
|
29
|
+
|
30
|
+
validate :existence_of_customer_ref
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def existence_of_customer_ref
|
35
|
+
if customer_ref.nil? || (customer_ref && customer_ref.value == 0)
|
36
|
+
errors.add(:customer_ref, "CustomerRef is required and must be a non-zero value.")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# == General
|
2
|
+
# This entity represents expenses, such as a purchase made from a vendor.
|
3
|
+
# There are three types of Purchases: Cash, Check, and Credit Card.
|
4
|
+
# * Cash Purchase contains information regarding a payment made in cash.
|
5
|
+
# * Check Purchase contains information regarding a payment made by check.
|
6
|
+
# * Credit Card Purchase contains information regarding a payment made by credit card.
|
7
|
+
#
|
8
|
+
# == Business Rules
|
9
|
+
# * You must specify an AccountRef for all puchases.
|
10
|
+
# * TotalAmt attribute must add up to sum of Line.Amount attributes
|
11
|
+
|
12
|
+
module Quickbooks
|
13
|
+
module Model
|
14
|
+
class Purchase < BaseModel
|
15
|
+
|
16
|
+
#== Constants
|
17
|
+
REST_RESOURCE = 'purchase'
|
18
|
+
XML_COLLECTION_NODE = "Purchase"
|
19
|
+
XML_NODE = "Purchase"
|
20
|
+
|
21
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
22
|
+
xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
|
23
|
+
xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
|
24
|
+
xml_accessor :doc_number, :from => 'DocNumber'
|
25
|
+
xml_accessor :txn_date, :from => 'TxnDate', :as => Date
|
26
|
+
xml_accessor :private_note, :from => 'PrivateNote'
|
27
|
+
|
28
|
+
xml_accessor :line_items, :from => 'Line', :as => [PurchaseLineItem]
|
29
|
+
xml_accessor :account_ref, :from => 'AccountRef', :as => BaseReference
|
30
|
+
xml_accessor :txn_tax_detail, :from => 'TxnTaxDetail', :as => TransactionTaxDetail
|
31
|
+
|
32
|
+
xml_accessor :payment_type, :from => 'PaymentType'
|
33
|
+
xml_accessor :entity_ref, :from => 'EntityRef', :as => BaseReference
|
34
|
+
xml_accessor :remit_to_address, :from => 'RemitToAddr', :as => PhysicalAddress
|
35
|
+
xml_accessor :total_amount, :from => 'TotalAmt', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
36
|
+
xml_accessor :print_status, :from => 'PrintStatus'
|
37
|
+
xml_accessor :department_ref, :from => 'DepartmentRef', :as => BaseReference
|
38
|
+
|
39
|
+
reference_setters :account_ref, :entity_ref, :department_ref
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Model
|
3
|
+
class PurchaseLineItem < BaseModel
|
4
|
+
|
5
|
+
#== Constants
|
6
|
+
ITEM_BASED_EXPENSE_LINE_DETAIL = 'ItemBasedExpenseLineDetail'
|
7
|
+
GROUP_LINE_DETAIL = 'GroupLineDetail'
|
8
|
+
|
9
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
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 => Proc.new { |val| val.to_f }
|
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 => ITEM_BASED_EXPENSE_LINE_DETAIL, :as => ItemBasedExpenseLineDetail
|
18
|
+
xml_accessor :group_line_detail, :from => GROUP_LINE_DETAIL, :as => GroupLineDetail
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Model
|
3
|
+
class PurchaseOrder < BaseModel
|
4
|
+
|
5
|
+
#== Constants
|
6
|
+
REST_RESOURCE = 'purchase_order'
|
7
|
+
XML_COLLECTION_NODE = "PurchaseOrder"
|
8
|
+
XML_NODE = "PurchaseOrder"
|
9
|
+
|
10
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
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
|
+
xml_accessor :custom_fields, :from => 'CustomField', :as => [CustomField]
|
16
|
+
xml_accessor :private_note, :from => 'PrivateNote'
|
17
|
+
|
18
|
+
xml_accessor :linked_transactions, :from => 'LinkedTxn', :as => [LinkedTransaction]
|
19
|
+
xml_accessor :line_items, :from => 'Line', :as => [PurchaseLineItem]
|
20
|
+
|
21
|
+
xml_accessor :attachable_ref, :from => 'AttachableRef', :as => BaseReference
|
22
|
+
xml_accessor :vendor_ref, :from => 'VendorRef', :as => BaseReference
|
23
|
+
xml_accessor :ap_account_ref, :from => 'APAccountRef', :as => BaseReference
|
24
|
+
xml_accessor :class_ref, :from => 'ClassRef', :as => BaseReference
|
25
|
+
xml_accessor :sales_term_ref, :from => 'SalesTermRef', :as => BaseReference
|
26
|
+
|
27
|
+
xml_accessor :total_amount, :from => 'TotalAmt', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
28
|
+
xml_accessor :due_date, :from => 'DueDate', :as => Date
|
29
|
+
xml_accessor :vendor_address, :from => 'VendorAddr', :as => PhysicalAddress
|
30
|
+
xml_accessor :ship_address, :from => 'ShipAddr', :as => PhysicalAddress
|
31
|
+
xml_accessor :ship_method_ref, :from => 'ShipMethodRef', :as => BaseReference
|
32
|
+
xml_accessor :po_status, :from => 'POStatus'
|
33
|
+
xml_accessor :txn_tax_detail, :from => 'TxnTaxDetail', :as => TransactionTaxDetail
|
34
|
+
|
35
|
+
reference_setters :attachable_ref, :vendor_ref, :ap_account_ref, :class_ref, :sales_term_ref, :ship_method_ref
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Model
|
3
|
+
class TaxLine < BaseModel
|
4
|
+
|
5
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
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 Term < BaseModel
|
4
|
+
XML_COLLECTION_NODE = "Term"
|
5
|
+
XML_NODE = "Term"
|
6
|
+
REST_RESOURCE = 'term'
|
7
|
+
|
8
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
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
|
+
|
21
|
+
validates_presence_of :name
|
22
|
+
|
23
|
+
def active?
|
24
|
+
active == "true"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
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 => 'Amount', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
7
|
+
xml_accessor :lines, :from => 'TaxLine', :as => [TaxLine]
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# === Business Rules
|
2
|
+
# * The VendorRef attribute must be specified.
|
3
|
+
# * At lease one Line with Line.Amount must be specified.
|
4
|
+
|
5
|
+
module Quickbooks
|
6
|
+
module Model
|
7
|
+
class VendorCredit < BaseModel
|
8
|
+
|
9
|
+
#== Constants
|
10
|
+
REST_RESOURCE = 'vendor_credit'
|
11
|
+
XML_COLLECTION_NODE = "VendorCredit"
|
12
|
+
XML_NODE = "VendorCredit"
|
13
|
+
|
14
|
+
xml_accessor :id, :from => 'Id', :as => Integer
|
15
|
+
xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
|
16
|
+
xml_accessor :meta_data, :from => 'MetaData', :as => MetaData
|
17
|
+
xml_accessor :doc_number, :from => 'DocNumber'
|
18
|
+
xml_accessor :txn_date, :from => 'TxnDate', :as => Date
|
19
|
+
xml_accessor :private_note, :from => 'PrivateNote'
|
20
|
+
|
21
|
+
xml_accessor :line_items, :from => 'Line', :as => [PurchaseLineItem]
|
22
|
+
xml_accessor :department_ref, :from => 'DepartmentRef', :as => BaseReference
|
23
|
+
xml_accessor :ap_account_ref, :from => 'APAccountRef', :as => BaseReference
|
24
|
+
xml_accessor :vendor_ref, :from => 'VendorRef', :as => BaseReference
|
25
|
+
xml_accessor :total_amount, :from => 'TotalAmt', :as => BigDecimal, :to_xml => Proc.new { |val| val.to_f }
|
26
|
+
|
27
|
+
reference_setters :department_ref, :ap_account_ref, :vendor_ref
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,21 +1,3 @@
|
|
1
|
-
#require 'rexml/document'
|
2
|
-
require 'uri'
|
3
|
-
require 'cgi'
|
4
|
-
|
5
|
-
unless Quickbooks::Util::ClassUtil.defined?("InvalidModelException")
|
6
|
-
class IntuitRequestException < StandardError
|
7
|
-
attr_accessor :message, :code, :detail, :type
|
8
|
-
def initialize(msg)
|
9
|
-
self.message = msg
|
10
|
-
super(msg)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
unless Quickbooks::Util::ClassUtil.defined?("InvalidModelException")
|
16
|
-
class AuthorizationFailure < StandardError; end
|
17
|
-
end
|
18
|
-
|
19
1
|
module Quickbooks
|
20
2
|
module Service
|
21
3
|
class BaseService
|
@@ -134,8 +116,7 @@ module Quickbooks
|
|
134
116
|
end
|
135
117
|
collection.entries = results
|
136
118
|
rescue => ex
|
137
|
-
|
138
|
-
raise IntuitRequestException.new("Error parsing XML: #{ex.message}")
|
119
|
+
raise Quickbooks::IntuitRequestException.new("Error parsing XML: #{ex.message}")
|
139
120
|
end
|
140
121
|
collection
|
141
122
|
else
|
@@ -181,9 +162,9 @@ module Quickbooks
|
|
181
162
|
when 200
|
182
163
|
result = Quickbooks::Model::RestResponse.from_xml(response.plain_body)
|
183
164
|
when 401
|
184
|
-
raise IntuitRequestException.new("Authorization failure: token timed out?")
|
165
|
+
raise Quickbooks::IntuitRequestException.new("Authorization failure: token timed out?")
|
185
166
|
when 404
|
186
|
-
raise IntuitRequestException.new("Resource Not Found: Check URL and try again")
|
167
|
+
raise Quickbooks::IntuitRequestException.new("Resource Not Found: Check URL and try again")
|
187
168
|
end
|
188
169
|
end
|
189
170
|
result
|
@@ -212,10 +193,11 @@ module Quickbooks
|
|
212
193
|
headers['Accept-Encoding'] = HTTP_ACCEPT_ENCODING
|
213
194
|
end
|
214
195
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
196
|
+
log "------ New Request ------"
|
197
|
+
log "METHOD = #{method}"
|
198
|
+
log "RESOURCE = #{url}"
|
199
|
+
log "BODY(#{body.class}) = #{body == nil ? "<NIL>" : body.inspect}"
|
200
|
+
log "HEADERS = #{headers.inspect}"
|
219
201
|
|
220
202
|
response = case method
|
221
203
|
when :get
|
@@ -223,7 +205,7 @@ module Quickbooks
|
|
223
205
|
when :post
|
224
206
|
@oauth.post(url, body, headers)
|
225
207
|
else
|
226
|
-
raise "
|
208
|
+
raise "Do not know how to perform that HTTP operation"
|
227
209
|
end
|
228
210
|
check_response(response)
|
229
211
|
end
|
@@ -237,6 +219,8 @@ module Quickbooks
|
|
237
219
|
end
|
238
220
|
|
239
221
|
def check_response(response)
|
222
|
+
log "RESPONSE CODE = #{response.code}"
|
223
|
+
log "RESPONSE BODY = #{response.plain_body}"
|
240
224
|
parse_xml(response.plain_body)
|
241
225
|
status = response.code.to_i
|
242
226
|
case status
|
@@ -250,7 +234,7 @@ module Quickbooks
|
|
250
234
|
when 302
|
251
235
|
raise "Unhandled HTTP Redirect"
|
252
236
|
when 401
|
253
|
-
raise AuthorizationFailure
|
237
|
+
raise Quickbooks::AuthorizationFailure
|
254
238
|
when 400, 500
|
255
239
|
parse_and_raise_exception
|
256
240
|
else
|
@@ -260,7 +244,7 @@ module Quickbooks
|
|
260
244
|
|
261
245
|
def parse_and_raise_exception
|
262
246
|
err = parse_intuit_error
|
263
|
-
ex = IntuitRequestException.new("#{err[:message]}:\n\t#{err[:detail]}")
|
247
|
+
ex = Quickbooks::IntuitRequestException.new("#{err[:message]}:\n\t#{err[:detail]}")
|
264
248
|
ex.code = err[:code]
|
265
249
|
ex.detail = err[:detail]
|
266
250
|
ex.type = err[:type]
|
@@ -5,7 +5,7 @@ module Quickbooks
|
|
5
5
|
|
6
6
|
# override update as sparse is not supported
|
7
7
|
def update(entity, options = {})
|
8
|
-
raise InvalidModelException.new('Employee sparse update is not supported by Intuit at this time') if options[:sparse] && options[:sparse] == true
|
8
|
+
raise Quickbooks::InvalidModelException.new('Employee sparse update is not supported by Intuit at this time') if options[:sparse] && options[:sparse] == true
|
9
9
|
super(entity, options)
|
10
10
|
end
|
11
11
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Service
|
3
|
+
class Estimate < BaseService
|
4
|
+
include ServiceCrud
|
5
|
+
|
6
|
+
def delete(estimate, options = {})
|
7
|
+
delete_by_query_string(estimate)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def default_model_query
|
13
|
+
"SELECT * FROM Estimate"
|
14
|
+
end
|
15
|
+
|
16
|
+
def model
|
17
|
+
Quickbooks::Model::Estimate
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Service
|
3
|
+
class Payment < BaseService
|
4
|
+
include ServiceCrud
|
5
|
+
|
6
|
+
def delete(payment)
|
7
|
+
delete_by_query_string(payment)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def default_model_query
|
13
|
+
"SELECT * FROM Payment"
|
14
|
+
end
|
15
|
+
|
16
|
+
def model
|
17
|
+
Quickbooks::Model::Payment
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -12,7 +12,7 @@ module Quickbooks
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def create(entity, options = {})
|
15
|
-
raise InvalidModelException.new(entity.errors.full_messages.join(',')) unless entity.valid?
|
15
|
+
raise Quickbooks::InvalidModelException.new(entity.errors.full_messages.join(',')) unless entity.valid?
|
16
16
|
xml = entity.to_xml_ns(options)
|
17
17
|
response = do_http_post(url_for_resource(model.resource_for_singular), valid_xml_document(xml))
|
18
18
|
if response.code.to_i == 200
|
@@ -40,7 +40,7 @@ module Quickbooks
|
|
40
40
|
|
41
41
|
def update(entity, options = {})
|
42
42
|
unless entity.valid?
|
43
|
-
raise InvalidModelException.new(entity.errors.full_messages.join(','))
|
43
|
+
raise Quickbooks::InvalidModelException.new(entity.errors.full_messages.join(','))
|
44
44
|
end
|
45
45
|
|
46
46
|
xml = entity.to_xml_ns(options)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Quickbooks
|
2
|
+
module Service
|
3
|
+
class Term < BaseService
|
4
|
+
include ServiceCrud
|
5
|
+
|
6
|
+
def delete(term)
|
7
|
+
term.active = false
|
8
|
+
update(term, :sparse => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def default_model_query
|
14
|
+
"SELECT * FROM Term"
|
15
|
+
end
|
16
|
+
|
17
|
+
def model
|
18
|
+
Quickbooks::Model::Term
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/quickbooks/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quickbooks-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Caughlan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth
|
@@ -44,14 +44,20 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
47
|
+
version: '1.6'
|
48
|
+
- - '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 1.6.1
|
48
51
|
type: :runtime
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
51
54
|
requirements:
|
52
55
|
- - ~>
|
53
56
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
57
|
+
version: '1.6'
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.6.1
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: activemodel
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -189,21 +195,34 @@ files:
|
|
189
195
|
- lib/quickbooks/model/discount_override.rb
|
190
196
|
- lib/quickbooks/model/email_address.rb
|
191
197
|
- lib/quickbooks/model/employee.rb
|
198
|
+
- lib/quickbooks/model/estimate.rb
|
199
|
+
- lib/quickbooks/model/group_line_detail.rb
|
192
200
|
- lib/quickbooks/model/invoice.rb
|
193
201
|
- lib/quickbooks/model/invoice_line_item.rb
|
194
202
|
- lib/quickbooks/model/item.rb
|
203
|
+
- lib/quickbooks/model/item_based_expense_line_detail.rb
|
195
204
|
- lib/quickbooks/model/line.rb
|
196
205
|
- lib/quickbooks/model/linked_transaction.rb
|
206
|
+
- lib/quickbooks/model/markup_info.rb
|
197
207
|
- lib/quickbooks/model/meta_data.rb
|
198
208
|
- lib/quickbooks/model/other_contact_info.rb
|
209
|
+
- lib/quickbooks/model/payment.rb
|
199
210
|
- lib/quickbooks/model/payment_line_detail.rb
|
200
211
|
- lib/quickbooks/model/payment_method.rb
|
201
212
|
- lib/quickbooks/model/physical_address.rb
|
213
|
+
- lib/quickbooks/model/purchase.rb
|
214
|
+
- lib/quickbooks/model/purchase_line_item.rb
|
215
|
+
- lib/quickbooks/model/purchase_order.rb
|
202
216
|
- lib/quickbooks/model/sales_item_line_detail.rb
|
203
217
|
- lib/quickbooks/model/sales_receipt.rb
|
204
218
|
- lib/quickbooks/model/sub_total_line_detail.rb
|
219
|
+
- lib/quickbooks/model/tax_line.rb
|
220
|
+
- lib/quickbooks/model/tax_line_detail.rb
|
205
221
|
- lib/quickbooks/model/telephone_number.rb
|
222
|
+
- lib/quickbooks/model/term.rb
|
223
|
+
- lib/quickbooks/model/transaction_tax_detail.rb
|
206
224
|
- lib/quickbooks/model/vendor.rb
|
225
|
+
- lib/quickbooks/model/vendor_credit.rb
|
207
226
|
- lib/quickbooks/model/web_site_address.rb
|
208
227
|
- lib/quickbooks/service/account.rb
|
209
228
|
- lib/quickbooks/service/base_service.rb
|
@@ -213,13 +232,18 @@ files:
|
|
213
232
|
- lib/quickbooks/service/credit_memo.rb
|
214
233
|
- lib/quickbooks/service/customer.rb
|
215
234
|
- lib/quickbooks/service/employee.rb
|
235
|
+
- lib/quickbooks/service/estimate.rb
|
216
236
|
- lib/quickbooks/service/invoice.rb
|
217
237
|
- lib/quickbooks/service/item.rb
|
238
|
+
- lib/quickbooks/service/payment.rb
|
218
239
|
- lib/quickbooks/service/payment_method.rb
|
240
|
+
- lib/quickbooks/service/purchase.rb
|
241
|
+
- lib/quickbooks/service/purchase_order.rb
|
219
242
|
- lib/quickbooks/service/sales_receipt.rb
|
220
243
|
- lib/quickbooks/service/service_crud.rb
|
244
|
+
- lib/quickbooks/service/term.rb
|
221
245
|
- lib/quickbooks/service/vendor.rb
|
222
|
-
- lib/quickbooks/
|
246
|
+
- lib/quickbooks/service/vendor_credit.rb
|
223
247
|
- lib/quickbooks/util/http_encoding_helper.rb
|
224
248
|
- lib/quickbooks/util/logging.rb
|
225
249
|
- lib/quickbooks/util/name_entity.rb
|