qbfc 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +11 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +85 -0
- data/Rakefile +84 -0
- data/VERSION +1 -0
- data/lib/qbfc.rb +41 -0
- data/lib/qbfc/base.rb +82 -0
- data/lib/qbfc/element.rb +243 -0
- data/lib/qbfc/entities/generated.rb +8 -0
- data/lib/qbfc/entity.rb +11 -0
- data/lib/qbfc/info.rb +42 -0
- data/lib/qbfc/infos/generated.rb +9 -0
- data/lib/qbfc/item.rb +29 -0
- data/lib/qbfc/items/generated.rb +11 -0
- data/lib/qbfc/list.rb +84 -0
- data/lib/qbfc/lists/account.rb +24 -0
- data/lib/qbfc/lists/generated.rb +15 -0
- data/lib/qbfc/lists/qb_class.rb +25 -0
- data/lib/qbfc/modifiable.rb +31 -0
- data/lib/qbfc/ole_wrapper.rb +201 -0
- data/lib/qbfc/qb_collection.rb +26 -0
- data/lib/qbfc/qb_types.rb +18 -0
- data/lib/qbfc/qbfc_const.rb +14 -0
- data/lib/qbfc/report.rb +95 -0
- data/lib/qbfc/reports/aging.rb +13 -0
- data/lib/qbfc/reports/budget_summary.rb +13 -0
- data/lib/qbfc/reports/custom_detail.rb +9 -0
- data/lib/qbfc/reports/custom_summary.rb +9 -0
- data/lib/qbfc/reports/general_detail.rb +44 -0
- data/lib/qbfc/reports/general_summary.rb +33 -0
- data/lib/qbfc/reports/job.rb +14 -0
- data/lib/qbfc/reports/payroll_detail.rb +13 -0
- data/lib/qbfc/reports/payroll_summary.rb +13 -0
- data/lib/qbfc/reports/rows.rb +51 -0
- data/lib/qbfc/reports/time.rb +12 -0
- data/lib/qbfc/request.rb +295 -0
- data/lib/qbfc/session.rb +147 -0
- data/lib/qbfc/terms.rb +10 -0
- data/lib/qbfc/terms/generated.rb +10 -0
- data/lib/qbfc/transaction.rb +110 -0
- data/lib/qbfc/transactions/generated.rb +25 -0
- data/lib/qbfc/voidable.rb +11 -0
- data/qbfc.gemspec +166 -0
- data/spec/fixtures/test.lgb +0 -0
- data/spec/fixtures/test.qbw +0 -0
- data/spec/fixtures/test.qbw.TLG +0 -0
- data/spec/integration/add_spec.rb +31 -0
- data/spec/integration/base_spec.rb +18 -0
- data/spec/integration/belongs_to_spec.rb +64 -0
- data/spec/integration/company_spec.rb +30 -0
- data/spec/integration/conditions_spec.rb +59 -0
- data/spec/integration/customer_spec.rb +46 -0
- data/spec/integration/element_finders_spec.rb +20 -0
- data/spec/integration/quick_test.rb +31 -0
- data/spec/integration/request_options_spec.rb +68 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +62 -0
- data/spec/unit/base_spec.rb +138 -0
- data/spec/unit/element_finder_spec.rb +185 -0
- data/spec/unit/element_spec.rb +108 -0
- data/spec/unit/entities/generated_spec.rb +18 -0
- data/spec/unit/entity_spec.rb +18 -0
- data/spec/unit/info/generated_spec.rb +12 -0
- data/spec/unit/info_spec.rb +48 -0
- data/spec/unit/item_spec.rb +33 -0
- data/spec/unit/items/generated_spec.rb +16 -0
- data/spec/unit/list_finders_spec.rb +129 -0
- data/spec/unit/list_spec.rb +86 -0
- data/spec/unit/lists/account_spec.rb +20 -0
- data/spec/unit/lists/generated_spec.rb +15 -0
- data/spec/unit/lists/qb_class_spec.rb +9 -0
- data/spec/unit/modifiable_spec.rb +84 -0
- data/spec/unit/ole_wrapper_spec.rb +337 -0
- data/spec/unit/qb_collection_spec.rb +13 -0
- data/spec/unit/qbfc_const_spec.rb +10 -0
- data/spec/unit/qbfc_spec.rb +10 -0
- data/spec/unit/report_spec.rb +12 -0
- data/spec/unit/request_query_survey.txt +48 -0
- data/spec/unit/request_spec.rb +486 -0
- data/spec/unit/session_spec.rb +144 -0
- data/spec/unit/terms/generated_spec.rb +14 -0
- data/spec/unit/terms_spec.rb +18 -0
- data/spec/unit/transaction_finders_spec.rb +125 -0
- data/spec/unit/transaction_spec.rb +94 -0
- data/spec/unit/transactions/generated_spec.rb +20 -0
- data/spec/unit/voidable_spec.rb +32 -0
- data/tasks/qbfc_tasks.rake +4 -0
- metadata +182 -0
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "QBFC::Customer.new" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@integration = QBFC::Integration.new
|
7
|
+
@sess = @integration.session
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:each) do
|
11
|
+
@integration.close
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should create a new customer" do
|
15
|
+
old_count = @sess.customers.find(:all).length
|
16
|
+
|
17
|
+
c = @sess.customers.new
|
18
|
+
c.name = "Cranky Customer"
|
19
|
+
c.is_active = true
|
20
|
+
c.last_name = "McCustomer"
|
21
|
+
c.save
|
22
|
+
|
23
|
+
n = @sess.customers.find("Cranky Customer")
|
24
|
+
n.name.should == "Cranky Customer"
|
25
|
+
n.is_active.should be(true)
|
26
|
+
n.last_name.should == "McCustomer"
|
27
|
+
|
28
|
+
@sess.customers.find(:all).length.should == old_count + 1
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe QBFC::Base do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@integration = QBFC::Integration::reader
|
7
|
+
@sess = @integration.session
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:each) do
|
11
|
+
@integration.close
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should do nothing" do
|
15
|
+
true.should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# This spec describes "belong to" style relationships,
|
4
|
+
# that is where QuickBooks specifies a Ref to another object.
|
5
|
+
|
6
|
+
describe "belongs to: " do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@integration = QBFC::Integration::reader
|
10
|
+
@sess = @integration.session
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
@integration.close
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "Bob Customer" do
|
18
|
+
before(:each) do
|
19
|
+
@customer = @sess.customers.find("Bob Customer")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has terms" do
|
23
|
+
@customer.terms.should be_kind_of(QBFC::Terms)
|
24
|
+
@customer.terms.id.should == @sess.terms.find("Net 30").id
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should not have a sales rep" do
|
28
|
+
@customer.sales_rep.should be_nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "Check to ABC Supplies" do
|
33
|
+
before(:each) do
|
34
|
+
@check = @sess.checks.find_by_ref("1000")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "has a payee" do
|
38
|
+
@check.payee.should be_kind_of(QBFC::Vendor)
|
39
|
+
@check.payee.id.should == @sess.vendors.find("ABC Supplies").id
|
40
|
+
end
|
41
|
+
|
42
|
+
it "has an account" do
|
43
|
+
@check.account.should be_kind_of(QBFC::Account)
|
44
|
+
@check.account.id.should == @sess.accounts.find("Checking").id
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "Invoice to Customer Bob" do
|
49
|
+
before(:each) do
|
50
|
+
@invoice = @sess.invoices.find_by_ref("1")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "has a template" do
|
54
|
+
@invoice.template.should be_kind_of(QBFC::Template)
|
55
|
+
@invoice.template.id.should == @sess.templates.find("Intuit Service Invoice").id
|
56
|
+
end
|
57
|
+
|
58
|
+
it "has a Customer" do
|
59
|
+
@invoice.customer.should be_kind_of(QBFC::Customer)
|
60
|
+
@invoice.customer.id.should == @sess.customers.find("Bob Customer").id
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "QBFC::Company" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@integration = QBFC::Integration::reader
|
7
|
+
@sess = @integration.session
|
8
|
+
@company = @sess.company
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:each) do
|
12
|
+
@integration.close
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should get name" do
|
16
|
+
@company.company_name.should == "Test Company"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should get address" do
|
20
|
+
@company.address.addr1.should == "123 Address St"
|
21
|
+
@company.address.city.should == "Oklahoma City"
|
22
|
+
@company.address.state.should == "OK"
|
23
|
+
@company.address.postal_code.should == "73160"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should get phone" do
|
27
|
+
@company.phone.should == "(555) 555-1212"
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# This spec describes use of the :conditions option to Element.find
|
4
|
+
# The implementation that this tests is Request#apply_options
|
5
|
+
|
6
|
+
describe "conditions: " do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@integration = QBFC::Integration::reader
|
10
|
+
@sess = @integration.session
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
@integration.close
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "Check" do
|
18
|
+
it "should limit records returned" do
|
19
|
+
checks = @sess.checks.find(:all, :limit => 2)
|
20
|
+
checks.length.should == 2
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should filter on date range" do
|
24
|
+
@sess.checks.find(:all, :conditions => {:txn_date_range => '2008-02-23'..'2008-02-25'}).length.should == 1
|
25
|
+
@sess.checks.find(:all, :conditions => {:txn_date_range => '2008-02-26'}).length.should == 3
|
26
|
+
@sess.checks.find(:all, :conditions => {:txn_date_range => Date.parse('2008-02-26')}).length.should == 3
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should filter on modified time" do
|
30
|
+
@sess.checks.find(:all, :conditions => {:modified_date_range => '2008-02-23'..'2008-02-25'}).length.should == 1
|
31
|
+
@sess.checks.find(:all, :conditions => {:modified_date_range => '2008-02-26'}).length.should == 3
|
32
|
+
@sess.checks.find(:all, :conditions => {:modified_date_range => Date.parse('2008-02-26')}).length.should == 3
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should filter on ref number criteria" do
|
36
|
+
checks = @sess.checks.find(:all, :conditions => {:ref_number_list => %w{1000 1002}})
|
37
|
+
checks.length.should == 2
|
38
|
+
checks[0].ref_number.should == '1000'
|
39
|
+
checks[1].ref_number.should == '1002'
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should filter on ref number range" do
|
43
|
+
@sess.checks.find(:all, :conditions => {:ref_number_range => '1000'..'1001'}).length.should == 2
|
44
|
+
@sess.checks.find(:all, :conditions => {:ref_number_range => 1000..1001}).length.should == 2
|
45
|
+
@sess.checks.find(:all, :conditions => {:ref_number_range => '1003'}).length.should >= 1
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should filter on Entity" do
|
49
|
+
@sess.checks.find(:all, :conditions => {:entity => 'ABC Supplies'}).length.should >= 2
|
50
|
+
@sess.checks.find(:first, :conditions => {:entity => 'Computer Shop'}).ref_number.should == '1002'
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should filter on Account" do
|
54
|
+
@sess.checks.find(:all, :conditions => {:account => 'Checking'}).length.should >= 4
|
55
|
+
@sess.checks.find(:all, :conditions => {:account => 'Accounts Receivable'}).length.should == 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "QBFC::Customer" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@integration = QBFC::Integration::reader
|
7
|
+
@sess = @integration.session
|
8
|
+
@bob = @sess.customers.find_by_name("Bob Customer")
|
9
|
+
@sue = @sess.customers.find_by_name("Sue Customer")
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:each) do
|
13
|
+
@integration.close
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should get name" do
|
17
|
+
@bob.name.should == "Bob Customer"
|
18
|
+
@sue.name.should == "Sue Customer"
|
19
|
+
|
20
|
+
@bob.full_name.should == "Bob Customer"
|
21
|
+
@sue.full_name.should == "Sue Customer"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "QBFC::Customer(setters)" do
|
27
|
+
|
28
|
+
before(:each) do
|
29
|
+
@integration = QBFC::Integration.new
|
30
|
+
@sess = @integration.session
|
31
|
+
@bob = @sess.customers.find_by_name("Bob Customer")
|
32
|
+
end
|
33
|
+
|
34
|
+
after(:each) do
|
35
|
+
@integration.close
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should set name" do
|
39
|
+
new_name = "New Customer"
|
40
|
+
@bob.name = new_name
|
41
|
+
@bob.name.should == new_name
|
42
|
+
@bob.save
|
43
|
+
|
44
|
+
@sess.customers.find(new_name).name.should == new_name
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "QBFC::Element(finders)" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@integration = QBFC::Integration::reader
|
7
|
+
@sess = @integration.session
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:each) do
|
11
|
+
@integration.close
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return a subclass of a base_class (e.g. Entity)" do
|
15
|
+
entity = QBFC::Entity.find(@sess, "Bob Customer")
|
16
|
+
entity.should be_kind_of(QBFC::Customer)
|
17
|
+
entity.name.should == "Bob Customer"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# This spec describes use of the :conditions option to Element.find
|
4
|
+
# The implementation that this tests is Request#apply_options
|
5
|
+
|
6
|
+
def run_test
|
7
|
+
@sess.report('ProfitAndLossStandard',
|
8
|
+
:conditions => {
|
9
|
+
:report_date_range => [Date.parse("2007-08-01"), Date.parse("2007-08-31")]},
|
10
|
+
:report_basis => QBFC_CONST::RbAccrual)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Setup
|
14
|
+
use_open = true
|
15
|
+
|
16
|
+
if use_open
|
17
|
+
@sess = QBFC::Session.new
|
18
|
+
else
|
19
|
+
@integration = QBFC::Integration::reader
|
20
|
+
@sess = @integration.session
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
puts run_test
|
25
|
+
ensure
|
26
|
+
if use_open
|
27
|
+
@sess.close
|
28
|
+
else
|
29
|
+
@integration.close
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# This spec describes use of the options to Element.find
|
4
|
+
# (except :conditions, which is in conditions_spec.rb)
|
5
|
+
# The implementation that this tests is Request#apply_options
|
6
|
+
|
7
|
+
describe "Request options: " do
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
@integration = QBFC::Integration::reader
|
11
|
+
@sess = @integration.session
|
12
|
+
end
|
13
|
+
|
14
|
+
after(:each) do
|
15
|
+
@integration.close
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "Invoice" do
|
19
|
+
def assert_line_items(inv)
|
20
|
+
inv.ORInvoiceLineRetList[0].InvoiceLineRet.desc == "First Line"
|
21
|
+
inv.ORInvoiceLineRetList[1].InvoiceLineRet.desc == "Second Line"
|
22
|
+
inv.ORInvoiceLineRetList[2].InvoiceLineRet.desc == "3rd Line"
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert_linked_txns(inv)
|
26
|
+
inv.LinkedTxnList[0].ref_number.should == '1972'
|
27
|
+
inv.LinkedTxnList[0].amount.should == -300.00
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should include line items" do
|
31
|
+
inv = @sess.invoices.find_by_ref('2', :include => [:line_items])
|
32
|
+
assert_line_items(inv)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should include linked txns" do
|
36
|
+
inv = @sess.invoices.find_by_ref('2', :include => [:linked_txns])
|
37
|
+
assert_linked_txns(inv)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should include include all (line items and linked txns)" do
|
41
|
+
inv = @sess.invoices.find_by_ref('2', :include => [:all])
|
42
|
+
assert_line_items(inv)
|
43
|
+
assert_linked_txns(inv)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should include a subset of elements" do
|
47
|
+
inv = @sess.invoices.find_by_ref('2',
|
48
|
+
:include => [:txn_id, :customer_ref, :bill_address])
|
49
|
+
inv.txn_id.should_not be_nil
|
50
|
+
inv.customer_ref.full_name.should_not be_nil
|
51
|
+
inv.bill_address.addr1.should_not be_nil
|
52
|
+
|
53
|
+
inv.ref_number.should be_nil
|
54
|
+
inv.class_ref.should be_nil
|
55
|
+
inv.bill_address_block.should be_nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should only txn_id" do
|
59
|
+
inv = @sess.invoices.find_by_ref('2',
|
60
|
+
:include => [:txn_id])
|
61
|
+
inv.txn_id.should_not be_nil
|
62
|
+
|
63
|
+
inv.customer_ref.should be_nil
|
64
|
+
inv.bill_address.should be_nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/spec/rcov.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--exclude "spec/*,gems/*"
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
require 'qbfc'
|
4
|
+
|
5
|
+
Spec::Runner.configure do |config|
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
module QBFC
|
10
|
+
class Integration
|
11
|
+
FIXTURE_DIRNAME = File.dirname(__FILE__) + "\\fixtures"
|
12
|
+
FIXTURE_FILENAME = FIXTURE_DIRNAME + "\\test.qbw"
|
13
|
+
TMP_DIRNAME = File.dirname(__FILE__) + "\\tmp"
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def reader
|
17
|
+
@@reader ||= new(true)
|
18
|
+
@@reader.open_sess
|
19
|
+
@@reader
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(is_reader = false)
|
24
|
+
FileUtils.mkdir_p(TMP_DIRNAME)
|
25
|
+
|
26
|
+
@is_reader = is_reader
|
27
|
+
@@i ||= 0
|
28
|
+
@@i += 1
|
29
|
+
@dirname = TMP_DIRNAME + "\\fixture_#{@@i}"
|
30
|
+
FileUtils.rm_rf(@dirname)
|
31
|
+
FileUtils.mkdir_p(@dirname)
|
32
|
+
|
33
|
+
['lgb', 'qbw', 'qbw.ND', 'qbw.TLG'].each do |ext|
|
34
|
+
FileUtils.cp FIXTURE_DIRNAME + "\\test.#{ext}", @dirname
|
35
|
+
end
|
36
|
+
|
37
|
+
open_sess
|
38
|
+
end
|
39
|
+
|
40
|
+
def filename
|
41
|
+
File.expand_path(@dirname + "\\test.qbw").gsub(/\//, "\\")
|
42
|
+
end
|
43
|
+
|
44
|
+
def open_sess
|
45
|
+
@sess = QBFC::Session.new(:filename => filename)
|
46
|
+
end
|
47
|
+
|
48
|
+
def session
|
49
|
+
@sess
|
50
|
+
end
|
51
|
+
|
52
|
+
def close
|
53
|
+
@sess.close
|
54
|
+
sleep(1)
|
55
|
+
unless @is_reader
|
56
|
+
sleep(3)
|
57
|
+
FileUtils.rm_rf(@dirname)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|