quickeebooks 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/README.md +7 -0
  2. data/lib/quickeebooks.rb +16 -1
  3. data/lib/quickeebooks/online/model/invoice.rb +1 -2
  4. data/lib/quickeebooks/online/model/invoice_header.rb +2 -1
  5. data/lib/quickeebooks/online/service/filter.rb +4 -90
  6. data/lib/quickeebooks/online/service/service_base.rb +5 -3
  7. data/lib/quickeebooks/shared/service/filter.rb +96 -0
  8. data/lib/quickeebooks/version.rb +1 -1
  9. data/lib/quickeebooks/windows/model/company_meta_data.rb +29 -0
  10. data/lib/quickeebooks/windows/model/credit_card.rb +14 -0
  11. data/lib/quickeebooks/windows/model/credit_charge_info.rb +17 -0
  12. data/lib/quickeebooks/windows/model/credit_charge_response.rb +13 -0
  13. data/lib/quickeebooks/windows/model/customer.rb +37 -7
  14. data/lib/quickeebooks/windows/model/party_role_ref.rb +12 -0
  15. data/lib/quickeebooks/windows/model/payment.rb +41 -0
  16. data/lib/quickeebooks/windows/model/payment_detail.rb +12 -0
  17. data/lib/quickeebooks/windows/model/payment_header.rb +24 -0
  18. data/lib/quickeebooks/windows/model/payment_line_item.rb +15 -0
  19. data/lib/quickeebooks/windows/model/rest_response.rb +2 -1
  20. data/lib/quickeebooks/windows/model/success.rb +3 -0
  21. data/lib/quickeebooks/windows/service/company_meta_data.rb +14 -0
  22. data/lib/quickeebooks/windows/service/customer.rb +17 -0
  23. data/lib/quickeebooks/windows/service/filter.rb +10 -0
  24. data/lib/quickeebooks/windows/service/payment.rb +26 -0
  25. data/spec/quickeebooks/online/invoice_spec.rb +2 -1
  26. data/spec/quickeebooks/online/services/service_base_spec.rb +14 -0
  27. data/spec/quickeebooks/windows/services/company_meta_data_spec.rb +34 -0
  28. data/spec/quickeebooks/windows/services/customer_spec.rb +98 -0
  29. data/spec/quickeebooks/windows/services/payment_spec.rb +48 -0
  30. data/spec/xml/online/invalid_user.xml +7 -0
  31. data/spec/xml/windows/company_meta_data.xml +30 -0
  32. data/spec/xml/windows/customer_create_success.xml +13 -0
  33. data/spec/xml/windows/payments.xml +39 -0
  34. data/tmp/create_customer_windows.rb +41 -0
  35. data/tmp/online.rb +23 -0
  36. metadata +23 -2
data/README.md CHANGED
@@ -300,6 +300,13 @@ _Note:_ it is up to you the caller to remove or clean up the file when you are d
300
300
 
301
301
  Cody Caughlan
302
302
 
303
+ ## Credits
304
+
305
+ Thank you for the contributions:
306
+
307
+ * [Walter McGinnis](https://github.com/walter)
308
+ * [Simon Wistow](https://github.com/simonwistow)
309
+
303
310
  ## License
304
311
 
305
312
  The MIT License
data/lib/quickeebooks.rb CHANGED
@@ -51,6 +51,11 @@ module ROXML
51
51
  end
52
52
  end
53
53
 
54
+ #== Shared
55
+
56
+ # Services
57
+ require 'quickeebooks/shared/service/filter'
58
+
54
59
  #== Online
55
60
 
56
61
  # Models
@@ -111,9 +116,17 @@ require 'quickeebooks/windows/model/external_key'
111
116
  require 'quickeebooks/windows/model/ship_method'
112
117
  require 'quickeebooks/windows/model/sales_tax'
113
118
  require 'quickeebooks/windows/model/customer_msg'
114
-
119
+ require 'quickeebooks/windows/model/company_meta_data'
120
+ require 'quickeebooks/windows/model/payment'
121
+ require 'quickeebooks/windows/model/payment_header'
122
+ require 'quickeebooks/windows/model/payment_line_item'
123
+ require 'quickeebooks/windows/model/payment_detail'
124
+ require 'quickeebooks/windows/model/credit_card'
125
+ require 'quickeebooks/windows/model/credit_charge_info'
126
+ require 'quickeebooks/windows/model/credit_charge_response'
115
127
 
116
128
  # Services
129
+ require 'quickeebooks/windows/service/filter'
117
130
  require 'quickeebooks/windows/service/service_base'
118
131
  require 'quickeebooks/windows/service/account'
119
132
  require 'quickeebooks/windows/service/customer'
@@ -123,3 +136,5 @@ require 'quickeebooks/windows/service/sales_rep'
123
136
  require 'quickeebooks/windows/service/ship_method'
124
137
  require 'quickeebooks/windows/service/sales_tax'
125
138
  require 'quickeebooks/windows/service/customer_msg'
139
+ require 'quickeebooks/windows/service/company_meta_data'
140
+ require 'quickeebooks/windows/service/payment'
@@ -26,7 +26,6 @@ module Quickeebooks
26
26
  xml_accessor :bill_email, :from => 'BillEmail'
27
27
  xml_accessor :ship_method_id, :from => 'ShipMethodId', :as => Quickeebooks::Online::Model::Id
28
28
  xml_accessor :ship_method_name, :from => 'ShipMethodName'
29
- xml_accessor :balance, :from => 'Balance', :as => Float
30
29
  xml_accessor :discount_amount, :from => 'DiscountAmt', :as => Float
31
30
  xml_accessor :discount_rate, :from => 'DiscountRate', :as => Float
32
31
  xml_accessor :discount_taxable, :from => 'DiscountTaxable'
@@ -70,4 +69,4 @@ module Quickeebooks
70
69
  end
71
70
  end
72
71
 
73
- end
72
+ end
@@ -17,6 +17,7 @@ module Quickeebooks
17
17
  xml_accessor :sales_tax_code_name, :from => 'SalesTaxCodeName'
18
18
  xml_accessor :sub_total_amount, :from => 'SubTotalAmt', :as => Float
19
19
  xml_accessor :tax_rate, :from => 'TaxRate', :as => Float
20
+ xml_accessor :balance, :from => 'Balance', :as => Float
20
21
  xml_accessor :total_amount, :from => 'TotalAmt', :as => Float
21
22
  xml_accessor :due_date, :from => 'DueDate', :as => Time
22
23
  xml_accessor :bill_email, :from => 'BillEmail'
@@ -28,4 +29,4 @@ module Quickeebooks
28
29
  end
29
30
  end
30
31
 
31
- end
32
+ end
@@ -1,96 +1,10 @@
1
+ require 'quickeebooks/shared/service/filter'
2
+
1
3
  module Quickeebooks
2
4
  module Online
3
5
  module Service
4
- class Filter
5
-
6
- DATE_FORMAT = '%Y-%m-%d'
7
- DATE_TIME_FORMAT = '%Y-%m-%dT%H:%M:%S%z'
8
-
9
- attr_reader :type
10
- attr_accessor :field, :value
11
-
12
- # For Date/Time filtering
13
- attr_accessor :before, :after
14
-
15
- # For number comparisons
16
- attr_accessor :gt, :lt, :eq
17
-
18
- def initialize(type, *args)
19
- @type = type
20
- if args.first.is_a?(Hash)
21
- args.first.each_pair do |key, value|
22
- instance_variable_set("@#{key}", value)
23
- end
24
- end
25
- end
26
-
27
- def to_s
28
- case @type.to_sym
29
- when :date, :datetime
30
- date_time_to_s
31
- when :text
32
- text_to_s
33
- when :boolean
34
- boolean_to_s
35
- when :number
36
- number_to_s
37
- else
38
- raise ArgumentError, "Don't know how to generate a Filter for type #{@type}"
39
- end
40
- end
41
-
42
- private
43
-
44
- def number_to_s
45
- clauses = []
46
- if @eq
47
- clauses << "#{@field} :EQUALS: #{@value}"
48
- end
49
- if @gt
50
- clauses << "#{@field} :GreaterThan: #{@value}"
51
- end
52
- if @lt
53
- clauses << "#{@field} :LessThan: #{@value}"
54
- end
55
- clauses.join(" :AND: ")
56
- end
57
-
58
- def date_time_to_s
59
- clauses = []
60
- if @before
61
- raise ':before is not a valid DateTime/Time object' unless (@before.is_a?(Time) || @before.is_a?(DateTime))
62
- clauses << "#{@field} :BEFORE: #{formatted_time(@before)}"
63
- end
64
- if @after
65
- raise ':after is not a valid DateTime/Time object' unless (@after.is_a?(Time) || @after.is_a?(DateTime))
66
- clauses << "#{@field} :AFTER: #{formatted_time(@after)}"
67
- end
68
-
69
- if @before.nil? && @after.nil?
70
- clauses << "#{@field} :EQUALS: #{formatted_time(@value)}"
71
- end
72
-
73
- clauses.join(" :AND: ")
74
- end
75
-
76
- def text_to_s
77
- "#{@field} :EQUALS: #{@value}"
78
- end
79
-
80
- def boolean_to_s
81
- "#{@field} :EQUALS: #{@value}"
82
- end
83
-
84
- def formatted_time(time)
85
- if time.is_a?(Date)
86
- time.strftime(DATE_FORMAT)
87
- elsif time.is_a?(DateTime) || time.is_a?(Time)
88
- time.strftime(DATE_TIME_FORMAT)
89
- end
90
- end
91
-
92
-
6
+ class Filter < Quickeebooks::Shared::Service::Filter
93
7
  end
94
8
  end
95
9
  end
96
- end
10
+ end
@@ -39,9 +39,9 @@ module Quickeebooks
39
39
 
40
40
  def realm_id=(realm_id)
41
41
  @realm_id = realm_id
42
- determine_base_url
43
42
  end
44
43
 
44
+ # uri is of the form `https://qbo.intuit.com/qbo36`
45
45
  def base_url=(uri)
46
46
  @base_uri = uri
47
47
  end
@@ -55,19 +55,21 @@ module Quickeebooks
55
55
  element = base_doc.xpath("//qbo:QboUser/qbo:CurrentCompany/qbo:BaseURI")[0]
56
56
  if element
57
57
  @base_uri = element.text
58
+ else
59
+ raise IntuitRequestException.new("Response error: Could not extract BaseURI from response. Invalid XML: #{service_response.body}")
58
60
  end
59
61
  else
60
- raise IntuitRequestException.new("Response error: invalid code #{response.code}")
62
+ raise IntuitRequestException.new("Response error: invalid code #{service_response.code}")
61
63
  end
62
64
  end
63
65
  end
64
66
 
65
67
  def url_for_resource(resource)
66
68
  url_for_base("resource/#{resource}")
67
- #{}"#{@base_uri}/resource/#{resource}/v2/#{@realm_id}"
68
69
  end
69
70
 
70
71
  def url_for_base(raw)
72
+ determine_base_url unless determined_base_url?
71
73
  "#{@base_uri}/#{raw}/v2/#{@realm_id}"
72
74
  end
73
75
 
@@ -0,0 +1,96 @@
1
+ module Quickeebooks
2
+ module Shared
3
+ module Service
4
+ class Filter
5
+
6
+ DATE_FORMAT = '%Y-%m-%d'
7
+ DATE_TIME_FORMAT = '%Y-%m-%dT%H:%M:%S%z'
8
+
9
+ attr_reader :type
10
+ attr_accessor :field, :value
11
+
12
+ # For Date/Time filtering
13
+ attr_accessor :before, :after
14
+
15
+ # For number comparisons
16
+ attr_accessor :gt, :lt, :eq
17
+
18
+ def initialize(type, *args)
19
+ @type = type
20
+ if args.first.is_a?(Hash)
21
+ args.first.each_pair do |key, value|
22
+ instance_variable_set("@#{key}", value)
23
+ end
24
+ end
25
+ end
26
+
27
+ def to_s
28
+ case @type.to_sym
29
+ when :date, :datetime
30
+ date_time_to_s
31
+ when :text
32
+ text_to_s
33
+ when :boolean
34
+ boolean_to_s
35
+ when :number
36
+ number_to_s
37
+ else
38
+ raise ArgumentError, "Don't know how to generate a Filter for type #{@type}"
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def number_to_s
45
+ clauses = []
46
+ if @eq
47
+ clauses << "#{@field} :EQUALS: #{@value}"
48
+ end
49
+ if @gt
50
+ clauses << "#{@field} :GreaterThan: #{@value}"
51
+ end
52
+ if @lt
53
+ clauses << "#{@field} :LessThan: #{@value}"
54
+ end
55
+ clauses.join(" :AND: ")
56
+ end
57
+
58
+ def date_time_to_s
59
+ clauses = []
60
+ if @before
61
+ raise ':before is not a valid DateTime/Time object' unless (@before.is_a?(Time) || @before.is_a?(DateTime))
62
+ clauses << "#{@field} :BEFORE: #{formatted_time(@before)}"
63
+ end
64
+ if @after
65
+ raise ':after is not a valid DateTime/Time object' unless (@after.is_a?(Time) || @after.is_a?(DateTime))
66
+ clauses << "#{@field} :AFTER: #{formatted_time(@after)}"
67
+ end
68
+
69
+ if @before.nil? && @after.nil?
70
+ clauses << "#{@field} :EQUALS: #{formatted_time(@value)}"
71
+ end
72
+
73
+ clauses.join(" :AND: ")
74
+ end
75
+
76
+ def text_to_s
77
+ "#{@field} :EQUALS: #{@value}"
78
+ end
79
+
80
+ def boolean_to_s
81
+ "#{@field} :EQUALS: #{@value}"
82
+ end
83
+
84
+ def formatted_time(time)
85
+ if time.is_a?(Date)
86
+ time.strftime(DATE_FORMAT)
87
+ elsif time.is_a?(DateTime) || time.is_a?(Time)
88
+ time.strftime(DATE_TIME_FORMAT)
89
+ end
90
+ end
91
+
92
+
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,5 +1,5 @@
1
1
  module Quickeebooks
2
2
 
3
- VERSION = "0.0.6"
3
+ VERSION = "0.0.7"
4
4
 
5
5
  end
@@ -0,0 +1,29 @@
1
+ # see https://ipp.developer.intuit.com/0010_Intuit_Partner_Platform/0050_Data_Services/0400_QuickBooks_Online/CompanyMetaData
2
+ require "quickeebooks"
3
+ require "quickeebooks/windows/model/address"
4
+ require "quickeebooks/windows/model/phone"
5
+ require "quickeebooks/windows/model/email"
6
+
7
+ module Quickeebooks
8
+ module Windows
9
+ module Model
10
+ class CompanyMetaData < Quickeebooks::Windows::Model::IntuitType
11
+ include ActiveModel::Validations
12
+
13
+ XML_COLLECTION_NODE = 'CompaniesMetaData'
14
+ XML_NODE = 'CompanyMetaData'
15
+
16
+ REST_RESOURCE = "company"
17
+
18
+ xml_convention :camelcase
19
+ xml_accessor :external_realm_id, :from => 'ExternalRealmId'
20
+ xml_accessor :registered_company_name, :from => 'QBNRegisteredCompanyName'
21
+ xml_accessor :industry_type, :from => 'IndustryType'
22
+ xml_accessor :addresses, :from => 'Address', :as => [Quickeebooks::Windows::Model::Address]
23
+ xml_accessor :legal_address, :from => 'LegalAddress', :as => Quickeebooks::Windows::Model::Address
24
+ xml_accessor :emails, :from => 'Email', :as => [Quickeebooks::Windows::Model::Email]
25
+ xml_accessor :phone, :from => 'Phone', :as => Quickeebooks::Windows::Model::Phone
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ require 'quickeebooks/windows/model/credit_charge_info'
2
+ require 'quickeebooks/windows/model/credit_charge_response'
3
+
4
+ module Quickeebooks
5
+ module Windows
6
+ module Model
7
+ class CreditCard < Quickeebooks::Windows::Model::IntuitType
8
+ xml_name 'CreditCard'
9
+ xml_accessor :credit_charge_info, :from => 'CreditChargeInfo', :as => Quickeebooks::Windows::Model::CreditChargeInfo
10
+ xml_accessor :credit_charge_response, :from => 'CreditChargeResponse', :as => Quickeebooks::Windows::Model::CreditChargeResponse
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module Quickeebooks
2
+ module Windows
3
+ module Model
4
+ class CreditChargeInfo < Quickeebooks::Windows::Model::IntuitType
5
+ xml_name 'CreditChargeInfo'
6
+ xml_accessor :number, :from => 'Number'
7
+ xml_accessor :type, :from => 'Type'
8
+ xml_accessor :name_on_acct, :from => 'NameOnAcct'
9
+ xml_accessor :cc_expiration_month, :from => 'CcExpireMn', :as => Integer
10
+ xml_accessor :cc_expiration_year, :from => 'CcExpireYr', :as => Integer
11
+ xml_accessor :billing_address_street, :from => 'BillAddrStreet'
12
+ xml_accessor :zip_code, :from => 'ZipCode'
13
+ xml_accessor :cvv, :from => 'Ccv'
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Quickeebooks
2
+ module Windows
3
+ module Model
4
+ class CreditChargeResponse < Quickeebooks::Windows::Model::IntuitType
5
+ xml_name 'CreditChargeResponse'
6
+ xml_accessor :cc_transaction_id, :from => 'CCTransId'
7
+ xml_accessor :status, :from => 'Status'
8
+ xml_accessor :auth_code, :from => 'AuthCode'
9
+ xml_accessor :avs_street, :from => 'AvsStreet'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -73,7 +73,9 @@ module Quickeebooks
73
73
  xml_accessor :total_expense, :from => 'TotalExpense', :as => Quickeebooks::Windows::Model::Price
74
74
 
75
75
  validates_length_of :name, :minimum => 1
76
- validate :has_required_attributes
76
+ validate :require_an_address
77
+ validate :name_cannot_contain_invalid_characters
78
+ validate :email_address_is_valid
77
79
 
78
80
  def active?
79
81
  active == 'true'
@@ -87,18 +89,20 @@ module Quickeebooks
87
89
  addresses.detect { |address| address.tag == "Shipping" }
88
90
  end
89
91
 
90
- def has_required_attributes
91
- if name.is_a?(String) && name.index(':') != nil
92
- errors.add(:name, "Attribute :name cannot contain a colon")
93
- end
94
- end
95
-
96
92
  def valid_for_update?
97
93
  if sync_token.nil?
98
94
  errors.add(:sync_token, "Missing required attribute SyncToken for update")
99
95
  end
100
96
  errors.empty?
101
97
  end
98
+
99
+ def valid_for_create?
100
+ valid?
101
+ if type_of.nil?
102
+ errors.add(:type_of, "Missing required attribute TypeOf for Create")
103
+ end
104
+ errors.empty?
105
+ end
102
106
 
103
107
  def to_xml_ns(options = {})
104
108
  to_xml
@@ -107,12 +111,38 @@ module Quickeebooks
107
111
  def email_address=(email_address)
108
112
  self.email = Quickeebooks::Windows::Model::Email.new(email_address)
109
113
  end
114
+
115
+ def address=(address)
116
+ self.addresses ||= []
117
+ self.addresses << address
118
+ end
110
119
 
111
120
  # To delete an account Intuit requires we provide Id and SyncToken fields
112
121
  def valid_for_deletion?
113
122
  return false if(id.nil? || sync_token.nil?)
114
123
  id.to_i > 0 && !sync_token.to_s.empty? && sync_token.to_i >= 0
115
124
  end
125
+
126
+ def name_cannot_contain_invalid_characters
127
+ if name.to_s.index(':')
128
+ errors.add(:name, "Name cannot contain a colon (:)")
129
+ end
130
+ end
131
+
132
+ def email_address_is_valid
133
+ if email
134
+ address = email.address
135
+ unless address.index('@') && address.index('.')
136
+ errors.add(:email, "Email address must contain @ and . (dot)")
137
+ end
138
+ end
139
+ end
140
+
141
+ def require_an_address
142
+ if addresses.nil? || (addresses.is_a?(Array) && addresses.empty?)
143
+ errors.add(:addresses, "Must provide at least one address for this Customer.")
144
+ end
145
+ end
116
146
 
117
147
  end
118
148
  end
@@ -0,0 +1,12 @@
1
+ module Quickeebooks
2
+ module Windows
3
+ module Model
4
+ class PartyRoleRef < Quickeebooks::Windows::Model::IntuitType
5
+ xml_convention :camelcase
6
+ xml_accessor :id, :as => Quickeebooks::Windows::Model::Id
7
+ xml_accessor :party_reference_id, :as => Quickeebooks::Windows::Model::Id
8
+ xml_accessor :last_updated_time, :as => Time
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,41 @@
1
+ require 'quickeebooks/windows/model/payment_header'
2
+ require 'quickeebooks/windows/model/payment_line_item'
3
+ require 'quickeebooks/windows/model/payment_detail'
4
+ require 'quickeebooks/windows/model/credit_card'
5
+ require 'quickeebooks/windows/model/credit_charge_info'
6
+ require 'quickeebooks/windows/model/credit_charge_response'
7
+ require 'quickeebooks/windows/model/meta_data'
8
+
9
+ module Quickeebooks
10
+ module Windows
11
+ module Model
12
+ class Payment < Quickeebooks::Windows::Model::IntuitType
13
+ include ActiveModel::Validations
14
+
15
+ XML_COLLECTION_NODE = 'Payments'
16
+ XML_NODE = "Payment"
17
+ REST_RESOURCE = "payment"
18
+
19
+ xml_convention :camelcase
20
+ xml_accessor :id, :from => 'Id', :as => Quickeebooks::Windows::Model::Id
21
+ xml_accessor :sync_token, :from => 'SyncToken', :as => Integer
22
+ xml_accessor :meta_data, :from => 'MetaData', :as => Quickeebooks::Windows::Model::MetaData
23
+ xml_accessor :header, :from => 'Header', :as => Quickeebooks::Windows::Model::PaymentHeader
24
+ xml_accessor :line_items, :from => 'Line', :as => [Quickeebooks::Windows::Model::PaymentLineItem]
25
+
26
+ def initialize
27
+ ensure_line_items_initialization
28
+ end
29
+
30
+ private
31
+
32
+ def after_parse
33
+ end
34
+
35
+ def ensure_line_items_initialization
36
+ self.line_items ||= []
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,12 @@
1
+ require 'quickeebooks/windows/model/credit_card'
2
+
3
+ module Quickeebooks
4
+ module Windows
5
+ module Model
6
+ class PaymentDetail < Quickeebooks::Windows::Model::IntuitType
7
+ xml_name 'Detail'
8
+ xml_accessor :credit_card, :from => 'CreditCard', :as => Quickeebooks::Windows::Model::CreditCard
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ require 'time'
2
+ require 'quickeebooks/windows/model/payment_detail'
3
+
4
+ module Quickeebooks
5
+ module Windows
6
+ module Model
7
+ class PaymentHeader < Quickeebooks::Windows::Model::IntuitType
8
+ xml_name 'Header'
9
+ xml_accessor :doc_number, :from => 'DocNumber'
10
+ xml_accessor :txn_date, :from => 'TxnDate', :as => Time
11
+ xml_accessor :note, :from => 'Note'
12
+ xml_accessor :status, :from => 'Status'
13
+ xml_accessor :customer_id, :from => 'CustomerId', :as => Quickeebooks::Windows::Model::Id
14
+ xml_accessor :customer_name, :from => 'CustomerName'
15
+ xml_accessor :deposit_to_account_id, :from => 'DepositToAccountId', :as => Quickeebooks::Windows::Model::Id
16
+ xml_accessor :payment_method_id, :from => 'PaymentMethodId', :as => Quickeebooks::Windows::Model::Id
17
+ xml_accessor :payment_method_name, :from => 'PaymentMethodName'
18
+ xml_accessor :detail, :from => 'Detail', :as => Quickeebooks::Windows::Model::PaymentDetail
19
+ xml_accessor :total_amount, :from => 'TotalAmt', :as => Float
20
+ xml_accessor :process_payment, :from => 'ProcessPayment'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ require 'quickeebooks/windows/model/id'
2
+
3
+ module Quickeebooks
4
+ module Windows
5
+ module Model
6
+ class PaymentLineItem < Quickeebooks::Windows::Model::IntuitType
7
+ xml_name 'Line'
8
+ xml_accessor :id, :from => 'Id', :as => Integer
9
+ xml_accessor :amount, :from => 'Amount', :as => Float
10
+ xml_accessor :desc, :from => 'Desc'
11
+ xml_accessor :txn_id, :from => 'TxnId', :as => Quickeebooks::Windows::Model::Id
12
+ end
13
+ end
14
+ end
15
+ end
@@ -22,10 +22,11 @@ module Quickeebooks
22
22
  s = "#<RestResponse>: "
23
23
  if success?
24
24
  s += "Success[#{success.request_name}] @ #{success.processed_time} - "
25
- else
25
+ elsif error?
26
26
  s += "Error[#{error.request_name}] @ #{error.processed_time} - "
27
27
  s += "Code: #{error.code}, Desc: #{error.desc}"
28
28
  end
29
+ s
29
30
  end
30
31
 
31
32
  end
@@ -1,4 +1,6 @@
1
1
  require "quickeebooks/windows/model/object_ref"
2
+ require "quickeebooks/windows/model/party_role_ref"
3
+
2
4
  module Quickeebooks
3
5
  module Windows
4
6
  module Model
@@ -8,6 +10,7 @@ module Quickeebooks
8
10
 
9
11
  xml_accessor :request_id, :from => '@RequestId'
10
12
  xml_accessor :object_ref, :as => Quickeebooks::Windows::Model::ObjectRef
13
+ xml_accessor :party_role_ref, :as => Quickeebooks::Windows::Model::PartyRoleRef
11
14
  xml_accessor :request_name
12
15
  xml_accessor :processed_time, :as => Time
13
16
 
@@ -0,0 +1,14 @@
1
+ require 'quickeebooks/windows/service/service_base'
2
+
3
+ module Quickeebooks
4
+ module Windows
5
+ module Service
6
+ class CompanyMetaData < Quickeebooks::Windows::Service::ServiceBase
7
+ def load
8
+ model = Quickeebooks::Windows::Model::CompanyMetaData
9
+ fetch_object(model, url_for_resource(model::REST_RESOURCE))
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -17,6 +17,23 @@ module Quickeebooks
17
17
  url = "#{url_for_resource(Quickeebooks::Windows::Model::Customer::REST_RESOURCE)}/#{id}"
18
18
  fetch_object(Quickeebooks::Windows::Model::Customer, url, {:idDomain => idDomain})
19
19
  end
20
+
21
+ def create(customer)
22
+ raise InvalidModelException unless customer.valid_for_create?
23
+
24
+ # XML is a wrapped 'object' where the type is specified as an attribute
25
+ # <Object xsi:type="Invoice">
26
+ xml_node = customer.to_xml(:name => 'Object')
27
+ xml_node.set_attribute('xsi:type', 'Customer')
28
+ xml = <<-XML
29
+ <Add xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" RequestId="#{guid}" xmlns="http://www.intuit.com/sb/cdm/v2">
30
+ <ExternalRealmId>#{self.realm_id}</ExternalRealmId>
31
+ #{xml_node}
32
+ </Add>
33
+ XML
34
+ perform_write(Quickeebooks::Windows::Model::Customer, xml)
35
+
36
+ end
20
37
 
21
38
  end
22
39
  end
@@ -0,0 +1,10 @@
1
+ require 'quickeebooks/shared/service/filter'
2
+
3
+ module Quickeebooks
4
+ module Windows
5
+ module Service
6
+ class Filter < Quickeebooks::Shared::Service::Filter
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ require 'quickeebooks/windows/service/service_base'
2
+ require 'quickeebooks/windows/model/payment'
3
+ require 'quickeebooks/windows/model/payment_header'
4
+ require 'quickeebooks/windows/model/payment_line_item'
5
+ require 'quickeebooks/windows/model/payment_detail'
6
+ require 'quickeebooks/windows/model/credit_card'
7
+ require 'quickeebooks/windows/model/credit_charge_info'
8
+ require 'quickeebooks/windows/model/credit_charge_response'
9
+ require 'nokogiri'
10
+
11
+ module Quickeebooks
12
+ module Windows
13
+ module Service
14
+ class Payment < ServiceBase
15
+ def fetch_by_id(id, idDomain = 'QB', options = {})
16
+ url = "#{url_for_resource(Quickeebooks::Windows::Model::Payment::REST_RESOURCE)}/#{id}"
17
+ fetch_object(Quickeebooks::Windows::Model::Payment, url, { :idDomain => idDomain })
18
+ end
19
+
20
+ def list(filters = [], page = 1, per_page = 20, sort = nil, options = {})
21
+ fetch_collection(Quickeebooks::Windows::Model::Payment, nil, filters, page, per_page, sort, options)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -7,9 +7,10 @@ describe "Quickeebooks::Online::Model::Invoice" do
7
7
  describe "parse invoice from XML" do
8
8
  xml = File.read(File.dirname(__FILE__) + "/../../xml/online/invoice.xml")
9
9
  invoice = Quickeebooks::Online::Model::Invoice.from_xml(xml)
10
+ invoice.header.balance.should == 0
10
11
  invoice.id.value.should == "13"
11
12
  invoice.line_items.count.should == 1
12
13
  invoice.line_items.first.unit_price.should == 225
13
14
  end
14
15
 
15
- end
16
+ end
@@ -37,4 +37,18 @@ describe "Quickeebooks::Online::Service::ServiceBase" do
37
37
  it "can determine login_name" do
38
38
  @service.login_name.should == 'foo@example.com'
39
39
  end
40
+
41
+ it "throws exception when response XML is invalid when determining base url" do
42
+ xml = File.read(File.dirname(__FILE__) + "/../../../xml/online/invalid_user.xml")
43
+ user_url = Quickeebooks::Online::Service::ServiceBase::QB_BASE_URI + "/" + @realm_id
44
+ FakeWeb.register_uri(:get, user_url, :status => ["200", "OK"], :body => xml)
45
+ @service = Quickeebooks::Online::Service::ServiceBase.new
46
+ @service.access_token = @oauth
47
+ @service.instance_eval {
48
+ @realm_id = "9991111222"
49
+ }
50
+ lambda { @service.determine_base_url }.should raise_error(IntuitRequestException)
51
+ @service.base_uri.should == nil
52
+ end
53
+
40
54
  end
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+ require "fakeweb"
3
+ require "oauth"
4
+ require "quickeebooks"
5
+
6
+ describe "Quickeebooks::Windows::Service::CompanyMetaData" do
7
+ before(:all) do
8
+ FakeWeb.allow_net_connect = false
9
+ qb_key = "key"
10
+ qb_secret = "secreet"
11
+
12
+ @realm_id = "9991111222"
13
+ @base_uri = "https://qbo.intuit.com/qbo36"
14
+ @oauth_consumer = OAuth::Consumer.new(qb_key, qb_key, {
15
+ :site => "https://oauth.intuit.com",
16
+ :request_token_path => "/oauth/v1/get_request_token",
17
+ :authorize_path => "/oauth/v1/get_access_token",
18
+ :access_token_path => "/oauth/v1/get_access_token"
19
+ })
20
+ @oauth = OAuth::AccessToken.new(@oauth_consumer, "blah", "blah")
21
+ end
22
+
23
+ it "can fetch the company meta data" do
24
+ xml = File.read(File.dirname(__FILE__) + "/../../../xml/windows/company_meta_data.xml")
25
+ model = Quickeebooks::Windows::Model::CompanyMetaData
26
+ service = Quickeebooks::Windows::Service::CompanyMetaData.new
27
+ service.access_token = @oauth
28
+ service.realm_id = @realm_id
29
+ FakeWeb.register_uri(:get, service.url_for_resource(model::REST_RESOURCE), :status => ["200", "OK"], :body => xml)
30
+ company_meta_data_response = service.load
31
+
32
+ company_meta_data_response.registered_company_name.should == "Castle Rock Construction"
33
+ end
34
+ end
@@ -56,5 +56,103 @@ describe "Quickeebooks::Windows::Service::Customer" do
56
56
  customer = service.fetch_by_id(341)
57
57
  customer.name.should == "Wine Stop"
58
58
  end
59
+
60
+ it "cannot create a customer without a name" do
61
+ customer = Quickeebooks::Windows::Model::Customer.new
62
+ service = Quickeebooks::Windows::Service::Customer.new
63
+ service.access_token = @oauth
64
+ service.realm_id = @realm_id
65
+ lambda do
66
+ service.create(customer)
67
+ end.should raise_error(InvalidModelException)
68
+
69
+ customer.valid?.should == false
70
+ customer.errors.keys.include?(:name).should == true
71
+ end
72
+
73
+ it "cannot create a customer without a type_of attribute" do
74
+ customer = Quickeebooks::Windows::Model::Customer.new
75
+ service = Quickeebooks::Windows::Service::Customer.new
76
+ service.access_token = @oauth
77
+ service.realm_id = @realm_id
78
+ lambda do
79
+ service.create(customer)
80
+ end.should raise_error(InvalidModelException)
81
+ customer.errors.keys.include?(:type_of).should == true
82
+ end
83
+
84
+ it "cannot create a customer with invalid name" do
85
+ customer = Quickeebooks::Windows::Model::Customer.new
86
+ service = Quickeebooks::Windows::Service::Customer.new
87
+ service.access_token = @oauth
88
+ service.realm_id = @realm_id
89
+ customer.name = "Bobs:Plumbing"
90
+ lambda do
91
+ service.create(customer)
92
+ end.should raise_error(InvalidModelException)
93
+
94
+ customer.valid?.should == false
95
+ customer.errors.keys.include?(:name).should == true
96
+ end
97
+
98
+ it "cannot create a customer with no address" do
99
+ customer = Quickeebooks::Windows::Model::Customer.new
100
+ service = Quickeebooks::Windows::Service::Customer.new
101
+ service.access_token = @oauth
102
+ service.realm_id = @realm_id
103
+ customer.name = "Bobs Plumbing"
104
+ lambda do
105
+ service.create(customer)
106
+ end.should raise_error(InvalidModelException)
107
+
108
+ customer.valid?.should == false
109
+ customer.errors.keys.include?(:addresses).should == true
110
+ end
111
+
112
+ it "cannot create a customer with an invalid email" do
113
+ customer = Quickeebooks::Windows::Model::Customer.new
114
+ service = Quickeebooks::Windows::Service::Customer.new
115
+ service.access_token = @oauth
116
+ service.realm_id = @realm_id
117
+ customer.name = "Bobs Plumbing"
118
+ customer.email_address = "foobar.com"
119
+ lambda do
120
+ service.create(customer)
121
+ end.should raise_error(InvalidModelException)
122
+
123
+ customer.valid?.should == false
124
+ customer.errors.keys.include?(:email).should == true
125
+ end
126
+
127
+ it "can create a customer" do
128
+ xml = File.read(File.dirname(__FILE__) + "/../../../xml/windows/customer_create_success.xml")
129
+ service = Quickeebooks::Windows::Service::Customer.new
130
+ model = Quickeebooks::Windows::Model::Customer
131
+ customer = Quickeebooks::Windows::Model::Customer.new
132
+
133
+ service.access_token = @oauth
134
+ service.realm_id = @realm_id
135
+ FakeWeb.register_uri(:post, service.url_for_resource(model::REST_RESOURCE), :status => ["200", "OK"], :body => xml)
136
+
137
+ customer.type_of = "Person"
138
+ customer.name = "Bobs Plumbing"
139
+ email = Quickeebooks::Windows::Model::Email.new
140
+ email.address = "foo@bar.com"
141
+ email.tag = "Business"
142
+ customer.email = email
143
+ billing_address = Quickeebooks::Windows::Model::Address.new
144
+ billing_address.tag = "Billing"
145
+ billing_address.line1 = "123 Main St."
146
+ billing_address.city = "San Francisco"
147
+ billing_address.country_sub_division_code = "CA"
148
+ billing_address.postal_code = "94117"
149
+ billing_address.country = "USA"
150
+ customer.address = billing_address
151
+ create_response = service.create(customer)
152
+ create_response.success?.should == true
153
+ create_response.success.party_role_ref.id.value.should == "6762304"
154
+ create_response.success.request_name.should == "CustomerAdd"
155
+ end
156
+
59
157
 
60
158
  end
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+ require "fakeweb"
3
+ require "oauth"
4
+ require "quickeebooks"
5
+ require "date"
6
+
7
+ describe "Quickeebooks::Windows::Service::Payment" do
8
+ before(:all) do
9
+ FakeWeb.allow_net_connect = false
10
+ qb_key = "key"
11
+ qb_secret = "secreet"
12
+
13
+ @realm_id = "9991111222"
14
+ @base_uri = "https://qbo.intuit.com/qbo36"
15
+ @oauth_consumer = OAuth::Consumer.new(qb_key, qb_key, {
16
+ :site => "https://oauth.intuit.com",
17
+ :request_token_path => "/oauth/v1/get_request_token",
18
+ :authorize_path => "/oauth/v1/get_access_token",
19
+ :access_token_path => "/oauth/v1/get_access_token"
20
+ })
21
+ @oauth = OAuth::AccessToken.new(@oauth_consumer, "blah", "blah")
22
+ end
23
+
24
+ it "can fetch a list of payments" do
25
+ xml = File.read(File.dirname(__FILE__) + "/../../../xml/windows/payments.xml")
26
+ service = Quickeebooks::Windows::Service::Payment.new
27
+ service.access_token = @oauth
28
+ service.realm_id = @realm_id
29
+
30
+ model = Quickeebooks::Windows::Model::Payment
31
+ FakeWeb.register_uri(:get,
32
+ service.url_for_resource(model::REST_RESOURCE),
33
+ :status => ["200", "OK"],
34
+ :body => xml)
35
+ payments = service.list
36
+ payments.entries.count.should == 1
37
+
38
+ payment = payments.entries.first
39
+ payment.id.value.should == "4"
40
+ payment.header.should_not be_nil
41
+ header = payment.header
42
+ header.customer_name.should == "Davis"
43
+
44
+ line1 = payment.line_items.first
45
+ line1.should_not be_nil
46
+ line1.amount.should == header.total_amount
47
+ end
48
+ end
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <qbo:QboUser xmlns="http://www.intuit.com/sb/cdm/v2" xmlns:qbp="http://www.intuit.com/sb/cdm/qbopayroll/v1" xmlns:qbo="http://www.intuit.com/sb/cdm/qbo">
3
+ <qbo:LoginName>foo@example.com</qbo:LoginName>
4
+ <qbo:Ticket>V1-162-alskdfasldkjfalsdkjf</qbo:Ticket>
5
+ <qbo:AgentId>9991111222</qbo:AgentId>
6
+ <qbo:Blah>Hello</qbo:Blah>
7
+ </qbo:QboUser>
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--XML GENERATED by IntuitDataSyncEngine (IDS) using \\\\SBDomainServices\\CDM\\branches\\3.4.0-rel-1-->
3
+ <RestResponse xmlns="http://www.intuit.com/sb/cdm/v2" xmlns:xdb="http://xmlns.oracle.com/xdb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.intuit.com/sb/cdm/v2 ../common/RestDataFilter.xsd">
4
+ <CompaniesMetaData>
5
+ <CompanyMetaData>
6
+ <ExternalRealmId>202720551</ExternalRealmId>
7
+ <QBNRegisteredCompanyName>Castle Rock Construction</QBNRegisteredCompanyName>
8
+ <CompanySignUpDateTime>2011-03-28T17:33:34.0Z</CompanySignUpDateTime>
9
+ <LatestUploadDateTime>2011-03-28T18:52:19.0Z</LatestUploadDateTime>
10
+ <QBVersion>21 0 6 4</QBVersion>
11
+ <CompanyFileName>Quality-Built Construction</CompanyFileName>
12
+ <FlavorStratum>standard_stratum</FlavorStratum>
13
+ <SampleFile>false</SampleFile>
14
+ <QBNCompanyUserAdminIdNumber>118149998</QBNCompanyUserAdminIdNumber>
15
+ <SyncEnabled>true</SyncEnabled>
16
+ <Address>
17
+ <Line1>100 Mason St.</Line1>
18
+ <Line2>Woodcrest, CA 94327</Line2>
19
+ </Address>
20
+ <LegalAddress>
21
+ <Line1>100 Mason St.</Line1>
22
+ <City>Woodcrest</City>
23
+ <CountrySubDivisionCode>CA</CountrySubDivisionCode>
24
+ <PostalCode>94327</PostalCode>
25
+ </LegalAddress>
26
+ <FiscalYearStart>1</FiscalYearStart>
27
+ <IncomeTaxYearStart>1</IncomeTaxYearStart>
28
+ </CompanyMetaData>
29
+ </CompaniesMetaData>
30
+ </RestResponse>
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0"?>
2
+ <RestResponse xmlns="http://www.intuit.com/sb/cdm/v2">
3
+ <Success RequestId="48147b60b90e460893db27b32d9f2acf">
4
+ <PartyRoleRef>
5
+ <Id idDomain="NG">6762304</Id>
6
+ <SyncToken>1</SyncToken>
7
+ <LastUpdatedTime>2012-09-25T21:08:17Z</LastUpdatedTime>
8
+ <PartyReferenceId idDomain="NG">9270150</PartyReferenceId>
9
+ </PartyRoleRef>
10
+ <RequestName>CustomerAdd</RequestName>
11
+ <ProcessedTime>2012-09-25T21:08:17Z</ProcessedTime>
12
+ </Success>
13
+ </RestResponse>
@@ -0,0 +1,39 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--XML GENERATED by IntuitDataSyncEngine (IDS) using \\\\SBDomainServices\\CDM\\branches\\3.9.0-rel-1-->
3
+ <RestResponse xmlns="http://www.intuit.com/sb/cdm/v2"
4
+ xmlns:xdb ="http://xmlns.oracle.com/xdb"
5
+ xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
6
+ xsi:schemaLocation ="http://www.intuit.com/sb/cdm/v2 ../common/RestDataFilter.xsd"><Payments>
7
+ <Payment>
8
+ <Id idDomain="QB">4</Id>
9
+ <SyncToken>1</SyncToken>
10
+ <MetaData>
11
+ <CreatedBy>app</CreatedBy>
12
+ <CreateTime>2012-09-23T23:53:53.0Z</CreateTime>
13
+ <LastModifiedBy>app</LastModifiedBy>
14
+ <LastUpdatedTime>2012-09-23T23:53:53.0Z</LastUpdatedTime>
15
+ </MetaData>
16
+ <ExternalKey idDomain="QB">4</ExternalKey>
17
+ <Synchronized>true</Synchronized>
18
+ <Header>
19
+ <TxnDate>2012-09-23</TxnDate>
20
+ <Status>Paid</Status>
21
+ <CustomerId idDomain="QB">1</CustomerId>
22
+ <CustomerName>Davis</CustomerName>
23
+ <RemitToId idDomain="QB">1</RemitToId>
24
+ <RemitToName>Davis</RemitToName>
25
+ <ARAccountId idDomain="QB">33</ARAccountId>
26
+ <ARAccountName>Accounts Receivable</ARAccountName>
27
+ <DepositToAccountId idDomain="QB">34</DepositToAccountId>
28
+ <DepositToAccountName>Undeposited Funds</DepositToAccountName>
29
+ <PaymentMethodId idDomain="QB">1</PaymentMethodId>
30
+ <PaymentMethodName>Cash</PaymentMethodName>
31
+ <TotalAmt>100</TotalAmt>
32
+ </Header>
33
+ <Line>
34
+ <Amount>100</Amount>
35
+ <TxnId idDomain="QB">1</TxnId>
36
+ <TxnNum>1</TxnNum>
37
+ </Line>
38
+ </Payment>
39
+ </Payments></RestResponse>
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ require 'oauth'
3
+ $: << File.expand_path('./lib')
4
+ require 'quickeebooks'
5
+
6
+ consumer_key = 'qyprdL8NUDMYcCzwp8ea9KbIhaMSRk'
7
+ consumer_secret = 'FcE5kihBYMVQGvX9UNYMxsrM8mP7bfuxc36PLhJB'
8
+ qb_oauth_consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {
9
+ :site => "https://oauth.intuit.com",
10
+ :request_token_path => "/oauth/v1/get_request_token",
11
+ :authorize_path => "/oauth/v1/get_access_token",
12
+ :access_token_path => "/oauth/v1/get_access_token",
13
+ :proxy => 'http://127.0.0.1:8080'
14
+ })
15
+ realm_id = "524388660"
16
+ access_token = "qyprdBzoHRYCVSZg0z5DrX970E2uebeaXSRNnoIjPQMqAXAY"
17
+ access_secret = "W2oWdboxA9XqwEZrbSv7rNsatphhBs9Vi5byKBjT"
18
+ oauth = OAuth::AccessToken.new(qb_oauth_consumer, access_token, access_secret)
19
+
20
+ service = Quickeebooks::Windows::Service::Customer.new
21
+
22
+ service.access_token = oauth
23
+ service.realm_id = realm_id
24
+
25
+ customer = Quickeebooks::Windows::Model::Customer.new
26
+ customer.type_of = "Person"
27
+ customer.name = "Cody Test-#{Time.now.to_i}"
28
+ email = Quickeebooks::Windows::Model::Email.new
29
+ email.address = "foo@bar.com"
30
+ email.tag = "Business"
31
+ customer.email = email
32
+ billing_address = Quickeebooks::Windows::Model::Address.new
33
+ billing_address.tag = "Billing"
34
+ billing_address.line1 = "#{Time.now.to_i} Main St."
35
+ billing_address.city = "San Francisco"
36
+ billing_address.country_sub_division_code = "CA"
37
+ billing_address.postal_code = "94117"
38
+ billing_address.country = "USA"
39
+ customer.address = billing_address
40
+ result = service.create(customer)
41
+ puts result.inspect
data/tmp/online.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'oauth'
3
+ $: << File.expand_path('./lib')
4
+ require 'quickeebooks'
5
+
6
+ consumer_key = 'qyprdZrwArlbUcJX7SlxresbflsXKY'
7
+ consumer_secret = 'qhgNfrl9XX8JVztdu5z27idFHdNI5UOSHC5HcItt'
8
+ qb_oauth_consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {
9
+ :site => "https://oauth.intuit.com",
10
+ :request_token_path => "/oauth/v1/get_request_token",
11
+ :authorize_path => "/oauth/v1/get_access_token",
12
+ :access_token_path => "/oauth/v1/get_access_token",
13
+ :proxy => 'http://127.0.0.1:8080'
14
+ })
15
+ realm_id = "214483939"
16
+ access_token = "qyprdTrgSmjG8p8yAdBYJAZYEdGDlh5JyuNhBvKS3CSQUMjE"
17
+ access_secret = "4lAHnUImKT7a69iIjA19xQuk7UNUvs8d6fLcbO6F"
18
+ oauth = OAuth::AccessToken.new(qb_oauth_consumer, access_token, access_secret)
19
+
20
+ service = Quickeebooks::Online::Service::Customer.new
21
+ service.access_token = oauth
22
+ service.realm_id = realm_id
23
+ service.list([], 1, 2)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quickeebooks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-31 00:00:00.000000000 Z
12
+ date: 2012-10-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: roxml
@@ -219,11 +219,16 @@ files:
219
219
  - lib/quickeebooks/online/service/payment.rb
220
220
  - lib/quickeebooks/online/service/service_base.rb
221
221
  - lib/quickeebooks/online/service/sort.rb
222
+ - lib/quickeebooks/shared/service/filter.rb
222
223
  - lib/quickeebooks/version.rb
223
224
  - lib/quickeebooks/windows/model/account.rb
224
225
  - lib/quickeebooks/windows/model/account_detail_type.rb
225
226
  - lib/quickeebooks/windows/model/account_reference.rb
226
227
  - lib/quickeebooks/windows/model/address.rb
228
+ - lib/quickeebooks/windows/model/company_meta_data.rb
229
+ - lib/quickeebooks/windows/model/credit_card.rb
230
+ - lib/quickeebooks/windows/model/credit_charge_info.rb
231
+ - lib/quickeebooks/windows/model/credit_charge_response.rb
227
232
  - lib/quickeebooks/windows/model/custom_field.rb
228
233
  - lib/quickeebooks/windows/model/customer.rb
229
234
  - lib/quickeebooks/windows/model/customer_msg.rb
@@ -242,6 +247,11 @@ files:
242
247
  - lib/quickeebooks/windows/model/open_balance.rb
243
248
  - lib/quickeebooks/windows/model/other_name.rb
244
249
  - lib/quickeebooks/windows/model/other_name_id.rb
250
+ - lib/quickeebooks/windows/model/party_role_ref.rb
251
+ - lib/quickeebooks/windows/model/payment.rb
252
+ - lib/quickeebooks/windows/model/payment_detail.rb
253
+ - lib/quickeebooks/windows/model/payment_header.rb
254
+ - lib/quickeebooks/windows/model/payment_line_item.rb
245
255
  - lib/quickeebooks/windows/model/phone.rb
246
256
  - lib/quickeebooks/windows/model/price.rb
247
257
  - lib/quickeebooks/windows/model/purchase_cost.rb
@@ -257,10 +267,13 @@ files:
257
267
  - lib/quickeebooks/windows/model/vendor_reference.rb
258
268
  - lib/quickeebooks/windows/model/web_site.rb
259
269
  - lib/quickeebooks/windows/service/account.rb
270
+ - lib/quickeebooks/windows/service/company_meta_data.rb
260
271
  - lib/quickeebooks/windows/service/customer.rb
261
272
  - lib/quickeebooks/windows/service/customer_msg.rb
273
+ - lib/quickeebooks/windows/service/filter.rb
262
274
  - lib/quickeebooks/windows/service/invoice.rb
263
275
  - lib/quickeebooks/windows/service/item.rb
276
+ - lib/quickeebooks/windows/service/payment.rb
264
277
  - lib/quickeebooks/windows/service/sales_rep.rb
265
278
  - lib/quickeebooks/windows/service/sales_tax.rb
266
279
  - lib/quickeebooks/windows/service/service_base.rb
@@ -284,8 +297,10 @@ files:
284
297
  - spec/quickeebooks/online/services/service_base_spec.rb
285
298
  - spec/quickeebooks/online/services/sort_spec.rb
286
299
  - spec/quickeebooks/windows/customer_spec.rb
300
+ - spec/quickeebooks/windows/services/company_meta_data_spec.rb
287
301
  - spec/quickeebooks/windows/services/customer_spec.rb
288
302
  - spec/quickeebooks/windows/services/invoice_spec.rb
303
+ - spec/quickeebooks/windows/services/payment_spec.rb
289
304
  - spec/quickeebooks/windows/services/sales_rep_spec.rb
290
305
  - spec/quickeebooks/windows/services/sales_taxes_spec.rb
291
306
  - spec/quickeebooks/windows/services/ship_method_spec.rb
@@ -299,18 +314,24 @@ files:
299
314
  - spec/xml/online/customer2.xml
300
315
  - spec/xml/online/customers.xml
301
316
  - spec/xml/online/determine_base_url.xml
317
+ - spec/xml/online/invalid_user.xml
302
318
  - spec/xml/online/invoice.xml
303
319
  - spec/xml/online/payment.xml
304
320
  - spec/xml/online/user.xml
321
+ - spec/xml/windows/company_meta_data.xml
305
322
  - spec/xml/windows/customer.xml
323
+ - spec/xml/windows/customer_create_success.xml
306
324
  - spec/xml/windows/customers.xml
307
325
  - spec/xml/windows/fetch_customer_by_id.xml
308
326
  - spec/xml/windows/http_401.xml
309
327
  - spec/xml/windows/invoice_success_create.xml
310
328
  - spec/xml/windows/invoices.xml
329
+ - spec/xml/windows/payments.xml
311
330
  - spec/xml/windows/sales_reps.xml
312
331
  - spec/xml/windows/sales_taxes.xml
313
332
  - spec/xml/windows/ship_methods.xml
333
+ - tmp/create_customer_windows.rb
334
+ - tmp/online.rb
314
335
  homepage: http://github.com/ruckus/quickeebooks
315
336
  licenses: []
316
337
  post_install_message: