quickbooks-ruby-base 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZTQ4YTRkMzhlOWMyMGZhNWEzNDVhNTY0ZjM1Zjc5ZGU0NTkyZGY3Yg==
5
+ data.tar.gz: !binary |-
6
+ MjU3N2RjMDgyNzE5ODEzMjMwNTYzODY3ZWM0NzY4N2UxYjAyZDcwZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MjcxODk1NDAxMzMzMTRlOGJhNzMwZWI4ZDM0NzlkMWM0Yzc4Y2M5YTE2YTdh
10
+ OWEwZmFlZTRmNjNhMjkzZjNmYzk1NTBjNDQ0YmJhNTIwODFhMGM1Yzg2NGVj
11
+ YmU5Mzk0ZTdjNjhlOWExMTViMmFlNDljMGZkYTBjNTM0NDg1NDI=
12
+ data.tar.gz: !binary |-
13
+ MzllMDg1NGFhOGRkNmE5MjMwZDRjNDE2Mjc4ZjFkMmU4YTY0MGFhMDNjMWVi
14
+ M2RmMTJiOGM3ODE2MzY4ZTI4NWRmNDJjMzg1ODI0Zjg2ZjM5ZDcxYWJiNWZl
15
+ ZjYyMDdjZWIwOTQwMTgxMWMxZjhhZjRlMjIzM2UxZmQyMWNlNzU=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in quickbooks-ruby-base.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Christian
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # Quickbooks::Base
2
+
3
+ A gem to complement the [`quickbooks-ruby`](https://github.com/ruckus/quickbooks-ruby) gem by providing a base class to handle routine tasks like creating a model, service, and displaying information.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'quickbooks-ruby-base'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install quickbooks-ruby-base
18
+
19
+ ## Usage
20
+ 1. The first argument is required and is a persistent object holding Intuit OAuth information (see Configuration section).
21
+ 2. The second argument is optional but if passed must be a valid `quickbooks-ruby` service type such as Invoice, Customer, Item, PaymentMethod, etc. When passing in a symbol, snake case must be used e.g. `:payment_method`. If a string you must use the explicit name, e.g. 'PaymentMethod'
22
+ ```
23
+ def initialize(account, type = nil)
24
+ @account = account
25
+ create_service_for(type) if type
26
+ end
27
+ ```
28
+
29
+ ### qr_model(*args)
30
+ Generate a `quickbooks-ruby` model. First argument must be valid `quickbooks-ruby` model.
31
+ ```
32
+ >> base = Quickbooks::Base.new(account)
33
+ >> customer = base.qr_model(:customer)
34
+
35
+ # Accepts more than 1 argument e.g.
36
+ >> base = Quickbooks::Base.new(account)
37
+ >> qb_invoice = base.qr_model :invoice
38
+ >> qb_invoice.bill_email = base.qr_model(:email_address, invoice.customer.email)
39
+ ```
40
+
41
+ ### service()
42
+ Returns `quickbooks-ruby` service.
43
+ ```
44
+ >> base = Quickbooks::Base.new(account, :customer)
45
+ >> base.service
46
+ => #<Quickbooks::Service::Customer:0x007faf7fe3f130 @base_uri="https://qb.sbfinance.intuit.com/v3/company", .etc
47
+ >> customer = base.qr_model(:customer)
48
+ >> customer.display_name = 'Minimul X'
49
+ # Do a create
50
+ >> base.service.create(customer)
51
+ # Or an update
52
+ >> base.service.update(customer)
53
+ # Execute a query
54
+ >> base.service.query('SELECT * FROM INVOICES')
55
+ ```
56
+
57
+ ### show(options = {})
58
+ Returns an array of the QuickBooks' IDs and a "smart" description. Smart, meaning that different services have different identifiers. For a customer, employee, and vendor the `DESC` is `display_name`. For invoice, it is `doc_number`. For item, tax_code, and payment_method it is the `name`.
59
+ ```
60
+ base = Quickbooks::Base.new(account, :invoice)
61
+ >> base.service.create(qb_invoice)
62
+ # Returns an array of payment_methods from QBO account
63
+ base = Quickbooks::Base.new(account, :payment_method)
64
+ >> base.show
65
+ # Returns an array of payment_methods from QBO account
66
+ >> b.show
67
+ => ["QBID: 5 DESC: American Express", "QBID: 1 DESC: Cash", "QBID: 2 DESC: Check", "QBID: 6 DESC: Diners Club", "QBID: 7 DESC: Discover", "QBID: 4 DESC: MasterCard", "QBID: 3 DESC: Visa"]
68
+ # With options
69
+ >> b.show page:1, per_page: 3
70
+ => ["QBID: 5 DESC: American Express", "QBID: 1 DESC: Cash", "QBID: 2 DESC: Check"]
71
+
72
+ ```
73
+
74
+ ## Configuration
75
+
76
+ As the first argument, the `Quickbooks::Base` class expects a persistent object that holds OAuth connection information.
77
+
78
+ For example, if an account's OAuth information is stored like this:
79
+ ```
80
+ account.qb_token
81
+ account.qb_secret
82
+ account.qb_company_id
83
+ ```
84
+
85
+ Your `Quickbooks::Base` configuration would look like this.
86
+
87
+ ```
88
+
89
+ QB_KEY = ENV['MINIMULCASTS_CONSUMER_KEY']
90
+ QB_SECRET = ENV['MINIMULCASTS_CONSUMER_SECRET']
91
+
92
+ $qb_oauth_consumer = OAuth::Consumer.new(QB_KEY, QB_SECRET, {
93
+ :site => "https://oauth.intuit.com",
94
+ :request_token_path => "/oauth/v1/get_request_token",
95
+ :authorize_url => "https://appcenter.intuit.com/Connect/Begin",
96
+ :access_token_path => "/oauth/v1/get_access_token"
97
+ })
98
+
99
+ Quickbooks::Base.configure do |c|
100
+ c.persistent_token = 'qb_token'
101
+ c.persistent_secret = 'qb_secret'
102
+ c.persistent_company_id = 'qb_company_id'
103
+ end
104
+
105
+ ```
106
+
107
+ ### Configuration defaults
108
+ ```
109
+ p Quickbooks::Base.persistent_token
110
+ # "settings.qb_token"
111
+ p Quickbooks::Base.persistent_secret
112
+ # "settings.qb_secret"
113
+ p Quickbooks::Base.persistent_company_id
114
+ # "settings.qb_company_id"
115
+ ```
116
+ By default `quickbooks-base-ruby` uses the `$qb_oauth_consumer` global var but can be overridden e.g.:
117
+
118
+ ```
119
+ $intuit_oauth_consumer = OAuth::Consumer.new(QB_KEY, QB_SECRET, {
120
+ :site => "https://oauth.intuit.com",
121
+ :request_token_path => "/oauth/v1/get_request_token",
122
+ :authorize_url => "https://appcenter.intuit.com/Connect/Begin",
123
+ :access_token_path => "/oauth/v1/get_access_token"
124
+ })
125
+
126
+ Quickbooks::Base.configure do |c|
127
+ c.oauth_consumer = $intuit_oauth_consumer
128
+ end
129
+ ```
130
+
131
+ ## Contributing
132
+
133
+ 1. Fork it ( http://github.com/<my-github-username>/quickbooks-ruby-base/fork )
134
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
135
+ 3. Create a spec to test your feature.
136
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
137
+ 5. Push to the branch (`git push origin my-new-feature`)
138
+ 6. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,29 @@
1
+ module Quickbooks
2
+ class Base
3
+ module Configuration
4
+ def configure
5
+ yield self
6
+ end
7
+
8
+ def oauth_consumer=(var)
9
+ @oauth_consumer = var
10
+ end
11
+
12
+ def oauth_consumer
13
+ @oauth_consumer ||= $qb_oauth_consumer
14
+ end
15
+
16
+ %w(token secret company_id).each do |type|
17
+ class_eval <<-eos
18
+ def persistent_#{type}=(location)
19
+ @persistent_#{type} = location
20
+ end
21
+
22
+ def persistent_#{type}
23
+ @persistent_#{type} ||= 'settings.qb_#{type}'
24
+ end
25
+ eos
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,82 @@
1
+ require 'quickbooks-ruby'
2
+ require_relative 'base/configuration'
3
+
4
+ module Quickbooks
5
+ class Base
6
+ attr_reader :service
7
+ extend Configuration
8
+
9
+ def initialize(account, type = nil)
10
+ @account = account
11
+ create_service_for(type) if type
12
+ end
13
+
14
+ def generate_quickbooks_ruby_namespace(which, type = 'Model')
15
+ which = which.to_s.camelcase if which.is_a?(Symbol)
16
+ "Quickbooks::#{type}::#{which}"
17
+ end
18
+
19
+ def quickbooks_ruby_model(which, *args)
20
+ generate_quickbooks_ruby_namespace(which, 'Model').constantize.new(*args)
21
+ end
22
+ alias_method :qr_model, :quickbooks_ruby_model
23
+
24
+ def quickbooks_ruby_service(which)
25
+ generate_quickbooks_ruby_namespace(which, 'Service').constantize.new
26
+ end
27
+ alias_method :qr_service, :quickbooks_ruby_service
28
+
29
+ def oauth_client
30
+ @oauth_client ||= OAuth::AccessToken.new(Quickbooks::Base.oauth_consumer, token, secret)
31
+ end
32
+
33
+ def show(options = {})
34
+ options = { per_page: 20, page: 1 }.merge(options)
35
+ method = describing_method
36
+ @service.query(nil, options).entries.collect { |e| "QBID: #{e.id} DESC: #{e.send(method) if method}" }
37
+ end
38
+
39
+ def describing_method
40
+ case @service.class.name
41
+ when /(Item|TaxCode|PaymentMethod)/
42
+ 'name'
43
+ when /(Invoice|Payment)/
44
+ 'doc_number'
45
+ when /(Vendor|Customer|Employee)/
46
+ 'display_name'
47
+ end
48
+ end
49
+
50
+ def token
51
+ retrieve(:token)
52
+ end
53
+
54
+ def secret
55
+ retrieve(:secret)
56
+ end
57
+
58
+ def company_id
59
+ retrieve(:company_id)
60
+ end
61
+
62
+ def retrieve(type)
63
+ meth = "persistent_#{type}"
64
+ arr = Quickbooks::Base.send(meth).split('.')
65
+ send_chain(arr)
66
+ end
67
+
68
+ def create_service_for(type)
69
+ @service = quickbooks_ruby_service(type)
70
+ @service.access_token = oauth_client
71
+ @service.company_id = company_id
72
+ @service
73
+ end
74
+
75
+ private
76
+
77
+ def send_chain(arr)
78
+ arr.inject(@account) {|o, a| o.send(a) }
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1 @@
1
+ require_relative 'quickbooks/base'
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'quickbooks-ruby-base'
7
+ spec.version = '1.0.0'
8
+ spec.authors = ["Christian"]
9
+ spec.email = ["christian@minimul.com"]
10
+ spec.summary = %q{Base class to provide common methods for the quickbooks-ruby gem}
11
+ spec.description = %q{}
12
+ spec.homepage = "https://github.com/minimul/quickbooks-ruby-base"
13
+ spec.license = "MIT"
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.test_files = spec.files.grep %r{^spec/}
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_dependency 'quickbooks-ruby'
19
+ spec.add_development_dependency "bundler", "~> 1.5"
20
+ spec.add_development_dependency "rake"
21
+ spec.add_development_dependency "rspec"
22
+
23
+ end
@@ -0,0 +1,152 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-04-04T04:52:19.963-07:00">
3
+ <QueryResponse startPosition="1" maxResults="20" totalCount="20">
4
+ <Invoice domain="QBO" sparse="false">
5
+ <Id>29</Id>
6
+ <SyncToken>0</SyncToken>
7
+ <MetaData>
8
+ <CreateTime>2014-04-01T08:19:48-07:00</CreateTime>
9
+ <LastUpdatedTime>2014-04-01T08:19:48-07:00</LastUpdatedTime>
10
+ </MetaData>
11
+ <DocNumber>1234</DocNumber>
12
+ <TxnDate>2014-04-01</TxnDate>
13
+ <Line>
14
+ <Id>1</Id>
15
+ <LineNum>1</LineNum>
16
+ <Description>Some big thingy</Description>
17
+ <Amount>64.99</Amount>
18
+ <DetailType>SalesItemLineDetail</DetailType>
19
+ <SalesItemLineDetail>
20
+ <ItemRef name="Services">1</ItemRef>
21
+ <UnitPrice>64.99</UnitPrice>
22
+ <Qty>1</Qty>
23
+ <TaxCodeRef>TAX</TaxCodeRef>
24
+ </SalesItemLineDetail>
25
+ </Line>
26
+ <Line>
27
+ <Id>2</Id>
28
+ <LineNum>2</LineNum>
29
+ <Description>Some big thingy</Description>
30
+ <Amount>64.99</Amount>
31
+ <DetailType>SalesItemLineDetail</DetailType>
32
+ <SalesItemLineDetail>
33
+ <ItemRef name="Services">1</ItemRef>
34
+ <UnitPrice>64.99</UnitPrice>
35
+ <Qty>1</Qty>
36
+ <TaxCodeRef>TAX</TaxCodeRef>
37
+ </SalesItemLineDetail>
38
+ </Line>
39
+ <Line>
40
+ <Amount>129.98</Amount>
41
+ <DetailType>SubTotalLineDetail</DetailType>
42
+ <SubTotalLineDetail/>
43
+ </Line>
44
+ <TxnTaxDetail>
45
+ <TxnTaxCodeRef>2</TxnTaxCodeRef>
46
+ <TotalTax>0</TotalTax>
47
+ <TaxLine>
48
+ <Amount>0</Amount>
49
+ <DetailType>TaxLineDetail</DetailType>
50
+ <TaxLineDetail>
51
+ <TaxRateRef>1</TaxRateRef>
52
+ <PercentBased>true</PercentBased>
53
+ <TaxPercent>10</TaxPercent>
54
+ <NetAmountTaxable>129.98</NetAmountTaxable>
55
+ </TaxLineDetail>
56
+ </TaxLine>
57
+ </TxnTaxDetail>
58
+ <CustomerRef name="(empty)">6</CustomerRef>
59
+ <BillAddr>
60
+ <Id>3</Id>
61
+ <Line1>123 darkwing road</Line1>
62
+ <Line2>RT 101</Line2>
63
+ <City>Rockingham</City>
64
+ <CountrySubDivisionCode>NH</CountrySubDivisionCode>
65
+ <PostalCode>10002</PostalCode>
66
+ <Lat>40.7135097</Lat>
67
+ <Long>-73.9859414</Long>
68
+ </BillAddr>
69
+ <DueDate>2014-04-01</DueDate>
70
+ <TotalAmt>129.98</TotalAmt>
71
+ <ApplyTaxAfterDiscount>false</ApplyTaxAfterDiscount>
72
+ <PrintStatus>NeedToPrint</PrintStatus>
73
+ <EmailStatus>NotSet</EmailStatus>
74
+ <BillEmail>
75
+ <Address>john@doe.com</Address>
76
+ </BillEmail>
77
+ <Balance>129.98</Balance>
78
+ <Deposit>0</Deposit>
79
+ <AllowIPNPayment>false</AllowIPNPayment>
80
+ <AllowOnlinePayment>false</AllowOnlinePayment>
81
+ <AllowOnlineCreditCardPayment>false</AllowOnlineCreditCardPayment>
82
+ <AllowOnlineACHPayment>false</AllowOnlineACHPayment>
83
+ </Invoice>
84
+ <Invoice domain="QBO" sparse="false">
85
+ <Id>28</Id>
86
+ <SyncToken>0</SyncToken>
87
+ <MetaData>
88
+ <CreateTime>2014-04-01T07:04:10-07:00</CreateTime>
89
+ <LastUpdatedTime>2014-04-01T07:04:10-07:00</LastUpdatedTime>
90
+ </MetaData>
91
+ <DocNumber>1234</DocNumber>
92
+ <TxnDate>2014-04-01</TxnDate>
93
+ <Line>
94
+ <Id>1</Id>
95
+ <LineNum>1</LineNum>
96
+ <Description>Some big thingy</Description>
97
+ <Amount>64.99</Amount>
98
+ <DetailType>SalesItemLineDetail</DetailType>
99
+ <SalesItemLineDetail>
100
+ <ItemRef name="Services">1</ItemRef>
101
+ <UnitPrice>64.99</UnitPrice>
102
+ <Qty>1</Qty>
103
+ <TaxCodeRef>TAX</TaxCodeRef>
104
+ </SalesItemLineDetail>
105
+ </Line>
106
+ <Line>
107
+ <Amount>64.99</Amount>
108
+ <DetailType>SubTotalLineDetail</DetailType>
109
+ <SubTotalLineDetail/>
110
+ </Line>
111
+ <TxnTaxDetail>
112
+ <TxnTaxCodeRef>2</TxnTaxCodeRef>
113
+ <TotalTax>0</TotalTax>
114
+ <TaxLine>
115
+ <Amount>0</Amount>
116
+ <DetailType>TaxLineDetail</DetailType>
117
+ <TaxLineDetail>
118
+ <TaxRateRef>1</TaxRateRef>
119
+ <PercentBased>true</PercentBased>
120
+ <TaxPercent>10</TaxPercent>
121
+ <NetAmountTaxable>64.99</NetAmountTaxable>
122
+ </TaxLineDetail>
123
+ </TaxLine>
124
+ </TxnTaxDetail>
125
+ <CustomerRef name="(empty)">6</CustomerRef>
126
+ <BillAddr>
127
+ <Id>3</Id>
128
+ <Line1>123 darkwing road</Line1>
129
+ <Line2>RT 101</Line2>
130
+ <City>Rockingham</City>
131
+ <CountrySubDivisionCode>NH</CountrySubDivisionCode>
132
+ <PostalCode>10002</PostalCode>
133
+ <Lat>40.7135097</Lat>
134
+ <Long>-73.9859414</Long>
135
+ </BillAddr>
136
+ <DueDate>2014-04-01</DueDate>
137
+ <TotalAmt>64.99</TotalAmt>
138
+ <ApplyTaxAfterDiscount>false</ApplyTaxAfterDiscount>
139
+ <PrintStatus>NeedToPrint</PrintStatus>
140
+ <EmailStatus>NotSet</EmailStatus>
141
+ <BillEmail>
142
+ <Address>john@doe.com</Address>
143
+ </BillEmail>
144
+ <Balance>64.99</Balance>
145
+ <Deposit>0</Deposit>
146
+ <AllowIPNPayment>false</AllowIPNPayment>
147
+ <AllowOnlinePayment>false</AllowOnlinePayment>
148
+ <AllowOnlineCreditCardPayment>false</AllowOnlineCreditCardPayment>
149
+ <AllowOnlineACHPayment>false</AllowOnlineACHPayment>
150
+ </Invoice>
151
+ </QueryResponse>
152
+ </IntuitResponse>
@@ -0,0 +1,58 @@
1
+ <IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-04-04T04:50:02.406-07:00">
2
+ <QueryResponse startPosition="1" maxResults="4" totalCount="4">
3
+ <TaxCode>
4
+ <Id>TAX</Id>
5
+ <MetaData>
6
+ <CreateTime>2013-08-26T12:24:57-07:00</CreateTime>
7
+ <LastUpdatedTime>2013-08-26T12:24:57-07:00</LastUpdatedTime>
8
+ </MetaData>
9
+ <Name>TAX</Name>
10
+ <Description>TAX</Description>
11
+ <Taxable>true</Taxable>
12
+ <TaxGroup>false</TaxGroup>
13
+ </TaxCode>
14
+ <TaxCode>
15
+ <Id>NON</Id>
16
+ <MetaData>
17
+ <CreateTime>2013-08-26T12:24:57-07:00</CreateTime>
18
+ <LastUpdatedTime>2013-08-26T12:24:57-07:00</LastUpdatedTime>
19
+ </MetaData>
20
+ <Name>NON</Name>
21
+ <Description>NON</Description>
22
+ <Taxable>false</Taxable>
23
+ <TaxGroup>false</TaxGroup>
24
+ </TaxCode>
25
+ <TaxCode>
26
+ <Id>CustomSalesTax</Id>
27
+ <MetaData>
28
+ <CreateTime>2013-08-26T12:24:57-07:00</CreateTime>
29
+ <LastUpdatedTime>2013-08-26T12:24:57-07:00</LastUpdatedTime>
30
+ </MetaData>
31
+ <Name>CustomSalesTax</Name>
32
+ <Description>CustomSalesTax</Description>
33
+ <Taxable>true</Taxable>
34
+ <TaxGroup>true</TaxGroup>
35
+ </TaxCode>
36
+ <TaxCode domain="QBO" sparse="false">
37
+ <Id>2</Id>
38
+ <SyncToken>0</SyncToken>
39
+ <MetaData>
40
+ <CreateTime>2014-03-28T13:52:48-07:00</CreateTime>
41
+ <LastUpdatedTime>2014-03-28T13:52:48-07:00</LastUpdatedTime>
42
+ </MetaData>
43
+ <Name>New York City</Name>
44
+ <Description>New York City</Description>
45
+ <Active>true</Active>
46
+ <Taxable>true</Taxable>
47
+ <TaxGroup>true</TaxGroup>
48
+ <SalesTaxRateList>
49
+ <TaxRateDetail>
50
+ <TaxRateRef name="New York City">1</TaxRateRef>
51
+ <TaxTypeApplicable>TaxOnAmount</TaxTypeApplicable>
52
+ <TaxOrder>0</TaxOrder>
53
+ </TaxRateDetail>
54
+ </SalesTaxRateList>
55
+ <PurchaseTaxRateList/>
56
+ </TaxCode>
57
+ </QueryResponse>
58
+ </IntuitResponse>
@@ -0,0 +1,95 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-04-04T06:31:21.480-07:00">
3
+ <QueryResponse startPosition="1" maxResults="6">
4
+ <Vendor domain="QBO" sparse="false">
5
+ <Id>11</Id>
6
+ <SyncToken>1</SyncToken>
7
+ <MetaData>
8
+ <CreateTime>2014-02-04T14:27:38-08:00</CreateTime>
9
+ <LastUpdatedTime>2014-02-04T14:39:34-08:00</LastUpdatedTime>
10
+ </MetaData>
11
+ <GivenName>Bill</GivenName>
12
+ <FamilyName>Sales</FamilyName>
13
+ <CompanyName>Catherines Cupcakes</CompanyName>
14
+ <DisplayName>Catherines Cupcakes</DisplayName>
15
+ <PrintOnCheckName>Catherines Cupcakes</PrintOnCheckName>
16
+ <Active>true</Active>
17
+ <PrimaryPhone>
18
+ <FreeFormNumber>603-344-5555</FreeFormNumber>
19
+ </PrimaryPhone>
20
+ <PrimaryEmailAddr>
21
+ <Address>cathy@donkey.io</Address>
22
+ </PrimaryEmailAddr>
23
+ <BillAddr>
24
+ <Id>7</Id>
25
+ <Line1>44 Billings Circle</Line1>
26
+ <City>Keene</City>
27
+ <CountrySubDivisionCode>NH</CountrySubDivisionCode>
28
+ <PostalCode>03455</PostalCode>
29
+ <Lat>42.9453196</Lat>
30
+ <Long>-72.31237449999999</Long>
31
+ </BillAddr>
32
+ <Balance>0</Balance>
33
+ <Vendor1099>false</Vendor1099>
34
+ </Vendor>
35
+ <Vendor domain="QBO" sparse="false">
36
+ <Id>3</Id>
37
+ <SyncToken>2</SyncToken>
38
+ <MetaData>
39
+ <CreateTime>2013-12-16T07:07:30-08:00</CreateTime>
40
+ <LastUpdatedTime>2013-12-16T07:15:32-08:00</LastUpdatedTime>
41
+ </MetaData>
42
+ <GivenName>Christian</GivenName>
43
+ <DisplayName>Christian</DisplayName>
44
+ <PrintOnCheckName>Christian</PrintOnCheckName>
45
+ <Active>true</Active>
46
+ <PrimaryEmailAddr>
47
+ <Address>christian@minimul.io</Address>
48
+ </PrimaryEmailAddr>
49
+ <Balance>0</Balance>
50
+ <Vendor1099>false</Vendor1099>
51
+ </Vendor>
52
+ <Vendor domain="QBO" sparse="false">
53
+ <Id>1</Id>
54
+ <SyncToken>0</SyncToken>
55
+ <MetaData>
56
+ <CreateTime>2013-10-29T02:59:05-07:00</CreateTime>
57
+ <LastUpdatedTime>2013-10-29T02:59:05-07:00</LastUpdatedTime>
58
+ </MetaData>
59
+ <DisplayName>John Doe</DisplayName>
60
+ <PrintOnCheckName>John Doe</PrintOnCheckName>
61
+ <Active>true</Active>
62
+ <Balance>0</Balance>
63
+ <Vendor1099>false</Vendor1099>
64
+ </Vendor>
65
+ <Vendor domain="QBO" sparse="false">
66
+ <Id>2</Id>
67
+ <SyncToken>1</SyncToken>
68
+ <MetaData>
69
+ <CreateTime>2013-11-02T05:17:06-07:00</CreateTime>
70
+ <LastUpdatedTime>2013-11-02T07:16:45-07:00</LastUpdatedTime>
71
+ </MetaData>
72
+ <DisplayName>Minimul</DisplayName>
73
+ <PrintOnCheckName>Minimul</PrintOnCheckName>
74
+ <Active>true</Active>
75
+ <PrimaryEmailAddr>
76
+ <Address>christian@minimul.io</Address>
77
+ </PrimaryEmailAddr>
78
+ <Balance>0</Balance>
79
+ <Vendor1099>false</Vendor1099>
80
+ </Vendor>
81
+ <Vendor domain="QBO" sparse="false">
82
+ <Id>13</Id>
83
+ <SyncToken>0</SyncToken>
84
+ <MetaData>
85
+ <CreateTime>2014-04-01T06:17:50-07:00</CreateTime>
86
+ <LastUpdatedTime>2014-04-01T06:17:50-07:00</LastUpdatedTime>
87
+ </MetaData>
88
+ <DisplayName>Musty Musketts</DisplayName>
89
+ <PrintOnCheckName>Musty Musketts</PrintOnCheckName>
90
+ <Active>true</Active>
91
+ <Balance>0</Balance>
92
+ <Vendor1099>false</Vendor1099>
93
+ </Vendor>
94
+ </QueryResponse>
95
+ </IntuitResponse>
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe Quickbooks::Base do
4
+ let(:account) { double }
5
+ let(:qr_base) { Quickbooks::Base.new(account) }
6
+
7
+ describe ".quickbooks_ruby_namespace" do
8
+ it "should generate quickbooks ruby model namespace given a symbol" do
9
+ expect(qr_base.generate_quickbooks_ruby_namespace(:access_token)).to eq "Quickbooks::Model::AccessToken"
10
+ end
11
+
12
+ it "should generate quickbooks ruby service namespace given a string" do
13
+ expect(qr_base.generate_quickbooks_ruby_namespace('AccessToken', 'Service')).to eq "Quickbooks::Service::AccessToken"
14
+ end
15
+ end
16
+
17
+ describe ".qr_model" do
18
+
19
+ it "should create a new instance of a quickbooks-ruby model" do
20
+ expect(qr_base.qr_model(:invoice).class.name).to eq 'Quickbooks::Model::Invoice'
21
+ end
22
+
23
+ it "should create a new instance of a quickbooks-ruby model that take more than 1 argument" do
24
+ result = qr_base.qr_model(:email_address, 'test@email.com')
25
+ expect(result.address).to eq 'test@email.com'
26
+ end
27
+ end
28
+
29
+ describe ".show" do
30
+ let(:account) { account = double(settings: double( qb_token: 'tttttttttt', qb_secret: 'ssssssss', qb_company_id: '1234567')) }
31
+
32
+ it "should display using the name as the given name" do
33
+ xml = File.read(File.join('spec', 'fixtures', 'vendors.xml'))
34
+ response = Struct.new(:plain_body, :code).new(xml, 200)
35
+ allow_any_instance_of(OAuth::AccessToken).to receive(:get).and_return(response)
36
+ qr = Quickbooks::Base.new(account, :vendor)
37
+ expect(qr.show.first).to match /Catherines Cupcakes/
38
+ end
39
+
40
+ it "should display using the name and not doc_number" do
41
+ xml = File.read(File.join('spec', 'fixtures', 'tax_codes.xml'))
42
+ response = Struct.new(:plain_body, :code).new(xml, 200)
43
+ allow_any_instance_of(OAuth::AccessToken).to receive(:get).and_return(response)
44
+ qr = Quickbooks::Base.new(account, :tax_code)
45
+ expect(qr.show.last).to match /New York City/
46
+ end
47
+
48
+ it "should display using the doc_number and not name" do
49
+ xml = File.read(File.join('spec', 'fixtures', 'invoices.xml'))
50
+ response = Struct.new(:plain_body, :code).new(xml, 200)
51
+ allow_any_instance_of(OAuth::AccessToken).to receive(:get).and_return(response)
52
+ qr = Quickbooks::Base.new(account, :invoice)
53
+ expect(qr.show.last).to match /1234/
54
+ end
55
+ end
56
+
57
+ describe ".retrieve" do
58
+ after do
59
+ Quickbooks::Base.configure { |c| c.persistent_token = nil; c.persistent_secret = nil; c.persistent_company_id = nil }
60
+ end
61
+
62
+ it "should set the persistence token location" do
63
+ Quickbooks::Base.configure do |c|
64
+ c.persistent_token = 'quickbooks_token'
65
+ c.persistent_company_id = 'quickbooks_company_id'
66
+ end
67
+ expect(Quickbooks::Base.persistent_token).to eq 'quickbooks_token'
68
+ expect(Quickbooks::Base.persistent_company_id).to eq 'quickbooks_company_id'
69
+ end
70
+
71
+ it "should retrieve token configuration that is 2 levels deep, which is the default" do
72
+ token = 'xxxxxxxxxxxxxx'
73
+ account = double(settings: double( qb_token: token ))
74
+ qr_base = Quickbooks::Base.new(account)
75
+ expect(qr_base.retrieve(:token)).to eq token
76
+ end
77
+
78
+ it "should retrieve token configuration that is 1 level deep" do
79
+ token = 'xxxxxxxxxxxxxx'
80
+ Quickbooks::Base.configure do |c|
81
+ c.persistent_token = 'quickbooks_token'
82
+ end
83
+ account = double( quickbooks_token: token )
84
+ qr_base = Quickbooks::Base.new(account)
85
+ expect(qr_base.retrieve(:token)).to eq token
86
+ end
87
+ end
88
+
89
+ describe ".create_service_for" do
90
+ it "creates a access_token service" do
91
+ account = double(settings: double( qb_token: 'tttttttttt', qb_secret: 'ssssssss', qb_company_id: '1234567'))
92
+ qb = Quickbooks::Base.new(account)
93
+ service = qb.create_service_for :access_token
94
+ expect(service.class.name).to match /Service::AccessToken/
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,6 @@
1
+ require 'quickbooks/base'
2
+ require 'quickbooks-ruby'
3
+
4
+ RSpec.configure do |c|
5
+ c.color_enabled = true
6
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: quickbooks-ruby-base
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Christian
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: quickbooks-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: ''
70
+ email:
71
+ - christian@minimul.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - lib/quickbooks-ruby-base.rb
82
+ - lib/quickbooks/base.rb
83
+ - lib/quickbooks/base/configuration.rb
84
+ - quickbooks-ruby-base.gemspec
85
+ - spec/fixtures/invoices.xml
86
+ - spec/fixtures/tax_codes.xml
87
+ - spec/fixtures/vendors.xml
88
+ - spec/quickbooks_ruby_base_spec.rb
89
+ - spec/spec_helper.rb
90
+ homepage: https://github.com/minimul/quickbooks-ruby-base
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.2.2
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: Base class to provide common methods for the quickbooks-ruby gem
114
+ test_files:
115
+ - spec/fixtures/invoices.xml
116
+ - spec/fixtures/tax_codes.xml
117
+ - spec/fixtures/vendors.xml
118
+ - spec/quickbooks_ruby_base_spec.rb
119
+ - spec/spec_helper.rb
120
+ has_rdoc: