stockor-core 0.2
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 +7 -0
- data/.gitignore +18 -0
- data/Gemfile +6 -0
- data/Guardfile +13 -0
- data/LICENSE.txt +674 -0
- data/README.md +88 -0
- data/Rakefile +58 -0
- data/config/database.yml +9 -0
- data/db/migrate/20120110142845_create_skr_sequential_ids.rb +35 -0
- data/db/migrate/20140202185309_create_skr_gl_accounts.rb +15 -0
- data/db/migrate/20140202193316_create_skr_gl_periods.rb +16 -0
- data/db/migrate/20140202193318_create_skr_gl_transactions.rb +14 -0
- data/db/migrate/20140202193319_create_skr_gl_postings.rb +16 -0
- data/db/migrate/20140202193700_create_skr_gl_manual_entries.rb +13 -0
- data/db/migrate/20140213040608_create_skr_payment_terms.rb +16 -0
- data/db/migrate/20140220031700_create_skr_addresses.rb +19 -0
- data/db/migrate/20140220031800_create_skr_locations.rb +19 -0
- data/db/migrate/20140220190836_create_skr_vendors.rb +22 -0
- data/db/migrate/20140220203029_create_skr_customers.rb +22 -0
- data/db/migrate/20140224034759_create_skr_skus.rb +22 -0
- data/db/migrate/20140225032853_create_skr_sku_locs.rb +21 -0
- data/db/migrate/20140320030501_create_skr_uoms.rb +19 -0
- data/db/migrate/20140321031604_create_skr_sku_vendors.rb +18 -0
- data/db/migrate/20140322012143_create_skr_ia_reasons.rb +14 -0
- data/db/migrate/20140322014401_create_skr_inventory_adjustments.rb +16 -0
- data/db/migrate/20140322023453_create_skr_ia_lines.rb +18 -0
- data/db/migrate/20140322035024_create_skr_sku_trans.rb +21 -0
- data/db/migrate/20140322223912_create_skr_sales_orders.rb +27 -0
- data/db/migrate/20140322223920_create_skr_so_lines.rb +25 -0
- data/db/migrate/20140323001446_create_so_details_view.rb +81 -0
- data/db/migrate/20140327202102_create_skr_purchase_orders.rb +20 -0
- data/db/migrate/20140327202107_create_skr_po_lines.rb +25 -0
- data/db/migrate/20140327202207_create_skr_pick_tickets.rb +16 -0
- data/db/migrate/20140327202209_create_skr_pt_lines.rb +23 -0
- data/db/migrate/20140327224000_create_skr_invoices.rb +25 -0
- data/db/migrate/20140327224002_create_skr_inv_lines.rb +23 -0
- data/db/migrate/20140330232808_create_skr_sku_loc_details_view.rb +31 -0
- data/db/migrate/20140330232810_create_skr_sku_qty_details_view.rb +48 -0
- data/db/migrate/20140400164729_create_skr_vouchers.rb +22 -0
- data/db/migrate/20140400164733_create_skr_vo_lines.rb +21 -0
- data/db/migrate/20140401164729_create_skr_po_receipt.rb +16 -0
- data/db/migrate/20140401164740_create_skr_por_line.rb +21 -0
- data/db/migrate/20140422024010_create_skr_inv_details_view.rb +42 -0
- data/lib/generators/stockor/migrations/install_generator.rb +42 -0
- data/lib/skr/address.rb +97 -0
- data/lib/skr/business_entity.rb +25 -0
- data/lib/skr/concerns/acts_as_uom.rb +47 -0
- data/lib/skr/concerns/all.rb +30 -0
- data/lib/skr/concerns/association_extensions.rb +85 -0
- data/lib/skr/concerns/attr_accessor_with_default.rb +54 -0
- data/lib/skr/concerns/code_identifier.rb +43 -0
- data/lib/skr/concerns/export_associations.rb +52 -0
- data/lib/skr/concerns/export_join_tables.rb +39 -0
- data/lib/skr/concerns/export_methods.rb +104 -0
- data/lib/skr/concerns/export_scope.rb +66 -0
- data/lib/skr/concerns/exported_limit_evaluator.rb +17 -0
- data/lib/skr/concerns/gl_tran_extensions.rb +18 -0
- data/lib/skr/concerns/has_gl_transaction.rb +67 -0
- data/lib/skr/concerns/has_sku_loc_lines.rb +47 -0
- data/lib/skr/concerns/immutable_model.rb +32 -0
- data/lib/skr/concerns/inv_extensions.rb +24 -0
- data/lib/skr/concerns/is_order_like.rb +47 -0
- data/lib/skr/concerns/is_sku_loc_line.rb +65 -0
- data/lib/skr/concerns/json_attribute_access.rb +55 -0
- data/lib/skr/concerns/locked_fields.rb +84 -0
- data/lib/skr/concerns/pt_extensions.rb +22 -0
- data/lib/skr/concerns/pub_sub.rb +105 -0
- data/lib/skr/concerns/queries.rb +20 -0
- data/lib/skr/concerns/random_hash_code.rb +40 -0
- data/lib/skr/concerns/sanitize_json.rb +49 -0
- data/lib/skr/concerns/sku_extensions.rb +52 -0
- data/lib/skr/concerns/so_extensions.rb +30 -0
- data/lib/skr/concerns/state_machine.rb +62 -0
- data/lib/skr/concerns/track_modifications.rb +48 -0
- data/lib/skr/concerns/visible_id_identifier.rb +53 -0
- data/lib/skr/core.rb +30 -0
- data/lib/skr/core/configuration.rb +87 -0
- data/lib/skr/core/db.rb +82 -0
- data/lib/skr/core/db/migration_helpers.rb +178 -0
- data/lib/skr/core/db/migrations.rb +15 -0
- data/lib/skr/core/db/seed.rb +46 -0
- data/lib/skr/core/db/seed/chart_of_accounts.yml +168 -0
- data/lib/skr/core/db/seed/payment_terms.yml +60 -0
- data/lib/skr/core/logger.rb +36 -0
- data/lib/skr/core/numbers.rb +71 -0
- data/lib/skr/core/rails_engine.rb +5 -0
- data/lib/skr/core/standard_pricing_provider.rb +15 -0
- data/lib/skr/core/strings.rb +57 -0
- data/lib/skr/core/testing.rb +11 -0
- data/lib/skr/core/testing/assertions.rb +44 -0
- data/lib/skr/core/testing/fixtures.rb +25 -0
- data/lib/skr/core/testing/fixtures/skr/addresses.yml +53 -0
- data/lib/skr/core/testing/fixtures/skr/customers.yml +43 -0
- data/lib/skr/core/testing/fixtures/skr/gl_accounts.yml +86 -0
- data/lib/skr/core/testing/fixtures/skr/gl_manual_entries.yml +4 -0
- data/lib/skr/core/testing/fixtures/skr/gl_periods.yml +26 -0
- data/lib/skr/core/testing/fixtures/skr/gl_postings.yml +88 -0
- data/lib/skr/core/testing/fixtures/skr/gl_transactions.yml +35 -0
- data/lib/skr/core/testing/fixtures/skr/ia_lines.yml +7 -0
- data/lib/skr/core/testing/fixtures/skr/ia_reasons.yml +15 -0
- data/lib/skr/core/testing/fixtures/skr/inv_lines.yml +22 -0
- data/lib/skr/core/testing/fixtures/skr/inventory_adjustments.yml +6 -0
- data/lib/skr/core/testing/fixtures/skr/invoices.yml +10 -0
- data/lib/skr/core/testing/fixtures/skr/locations.yml +24 -0
- data/lib/skr/core/testing/fixtures/skr/payment_terms.yml +42 -0
- data/lib/skr/core/testing/fixtures/skr/pick_tickets.yml +4 -0
- data/lib/skr/core/testing/fixtures/skr/po_lines.yml +44 -0
- data/lib/skr/core/testing/fixtures/skr/po_receipts.yml +5 -0
- data/lib/skr/core/testing/fixtures/skr/por_lines.yml +13 -0
- data/lib/skr/core/testing/fixtures/skr/pt_lines.yml +12 -0
- data/lib/skr/core/testing/fixtures/skr/purchase_orders.yml +16 -0
- data/lib/skr/core/testing/fixtures/skr/sales_orders.yml +32 -0
- data/lib/skr/core/testing/fixtures/skr/sku_locs.yml +78 -0
- data/lib/skr/core/testing/fixtures/skr/sku_trans.yml +9 -0
- data/lib/skr/core/testing/fixtures/skr/sku_vendors.yml +35 -0
- data/lib/skr/core/testing/fixtures/skr/skus.yml +50 -0
- data/lib/skr/core/testing/fixtures/skr/so_lines.yml +71 -0
- data/lib/skr/core/testing/fixtures/skr/uoms.yml +61 -0
- data/lib/skr/core/testing/fixtures/skr/vendors.yml +48 -0
- data/lib/skr/core/testing/fixtures/skr/vo_lines.yml +12 -0
- data/lib/skr/core/testing/fixtures/skr/vouchers.yml +8 -0
- data/lib/skr/core/testing/helper.rb +18 -0
- data/lib/skr/core/testing/test_case.rb +17 -0
- data/lib/skr/core/version.rb +5 -0
- data/lib/skr/customer.rb +34 -0
- data/lib/skr/gl_account.rb +56 -0
- data/lib/skr/gl_manual_entry.rb +31 -0
- data/lib/skr/gl_period.rb +13 -0
- data/lib/skr/gl_posting.rb +54 -0
- data/lib/skr/gl_transaction.rb +174 -0
- data/lib/skr/ia_line.rb +129 -0
- data/lib/skr/ia_reason.rb +16 -0
- data/lib/skr/inv_line.rb +90 -0
- data/lib/skr/inventory_adjustment.rb +60 -0
- data/lib/skr/invoice.rb +159 -0
- data/lib/skr/location.rb +31 -0
- data/lib/skr/model.rb +37 -0
- data/lib/skr/null_user.rb +30 -0
- data/lib/skr/payment_term.rb +30 -0
- data/lib/skr/pick_ticket.rb +71 -0
- data/lib/skr/po_line.rb +69 -0
- data/lib/skr/po_receipt.rb +51 -0
- data/lib/skr/por_line.rb +80 -0
- data/lib/skr/pt_line.rb +74 -0
- data/lib/skr/purchase_order.rb +112 -0
- data/lib/skr/sales_order.rb +159 -0
- data/lib/skr/sequential_id.rb +23 -0
- data/lib/skr/sku.rb +99 -0
- data/lib/skr/sku_loc.rb +94 -0
- data/lib/skr/sku_tran.rb +111 -0
- data/lib/skr/sku_vendor.rb +26 -0
- data/lib/skr/so_line.rb +159 -0
- data/lib/skr/uom.rb +63 -0
- data/lib/skr/user_proxy.rb +60 -0
- data/lib/skr/validators/all.rb +2 -0
- data/lib/skr/validators/email.rb +17 -0
- data/lib/skr/validators/set.rb +18 -0
- data/lib/skr/vendor.rb +33 -0
- data/lib/skr/vo_line.rb +35 -0
- data/lib/skr/voucher.rb +119 -0
- data/lib/stockor/core.rb +9 -0
- data/stockor-core.gemspec +37 -0
- data/tasks/migrations.rake +23 -0
- data/tasks/publish.rake +8 -0
- data/test/address_test.rb +57 -0
- data/test/concerns/attr_with_default_test.rb +45 -0
- data/test/concerns/code_identifier_test.rb +46 -0
- data/test/concerns/export_associations_test.rb +7 -0
- data/test/concerns/export_methods_test.rb +31 -0
- data/test/concerns/export_scope_test.rb +16 -0
- data/test/concerns/exported_limits_test.rb +47 -0
- data/test/concerns/json_attribute_access_test.rb +27 -0
- data/test/concerns/pub_sub_test.rb +83 -0
- data/test/concerns/sanitize_json_test.rb +47 -0
- data/test/core/configuration_test.rb +24 -0
- data/test/core/numbers_test.rb +26 -0
- data/test/core/strings_test.rb +41 -0
- data/test/customer_test.rb +34 -0
- data/test/gl_account_test.rb +23 -0
- data/test/gl_manual_entry_test.rb +17 -0
- data/test/gl_period_test.rb +12 -0
- data/test/gl_posting_test.rb +39 -0
- data/test/gl_transaction_test.rb +58 -0
- data/test/ia_line_test.rb +68 -0
- data/test/ia_reason_test.rb +11 -0
- data/test/inv_line_test.rb +58 -0
- data/test/inventory_adjustment_test.rb +72 -0
- data/test/invoice_test.rb +63 -0
- data/test/location_test.rb +10 -0
- data/test/payment_term_test.rb +25 -0
- data/test/pick_ticket_test.rb +27 -0
- data/test/po_line_test.rb +36 -0
- data/test/po_receipt_test.rb +93 -0
- data/test/por_line_test.rb +79 -0
- data/test/pt_line_test.rb +29 -0
- data/test/purchase_order_test.rb +44 -0
- data/test/sales_order_test.rb +74 -0
- data/test/sku_loc_test.rb +50 -0
- data/test/sku_test.rb +45 -0
- data/test/sku_tran_test.rb +21 -0
- data/test/sku_vendor_test.rb +13 -0
- data/test/so_line_test.rb +89 -0
- data/test/test_helper.rb +1 -0
- data/test/uom_test.rb +14 -0
- data/test/vendor_test.rb +35 -0
- data/test/vo_line_test.rb +20 -0
- data/test/voucher_test.rb +35 -0
- data/yard_ext/all.rb +9 -0
- data/yard_ext/code_identifier_handler.rb +33 -0
- data/yard_ext/concern_meta_methods.rb +60 -0
- data/yard_ext/config_options.rb +27 -0
- data/yard_ext/exported_scope.rb +4 -0
- data/yard_ext/immutable_handler.rb +17 -0
- data/yard_ext/json_attr_accessor.rb +22 -0
- data/yard_ext/locked_fields_handler.rb +21 -0
- data/yard_ext/templates/default/layout/html/layout.erb +20 -0
- data/yard_ext/templates/default/method_details/html/github_link.erb +1 -0
- data/yard_ext/templates/default/method_details/setup.rb +3 -0
- data/yard_ext/validators.rb +1 -0
- data/yard_ext/visible_id_handler.rb +38 -0
- metadata +448 -0
data/test/sku_test.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SkuTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_locations
|
|
6
|
+
sku = skr_skus(:string)
|
|
7
|
+
assert_equal 2, sku.sku_locs.length
|
|
8
|
+
assert sku.sku_locs.find_or_create_for( skr_locations(:surplus) )
|
|
9
|
+
loc = skr_locations(:amazon)
|
|
10
|
+
refute sku.sku_locs.where( location: loc ).first
|
|
11
|
+
assert sku.sku_locs.find_or_create_for( loc )
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_vendors
|
|
15
|
+
sku = skr_skus(:glove)
|
|
16
|
+
assert sku.sku_vendors.default
|
|
17
|
+
assert_equal skr_sku_vendors(:glove_bigco), sku.sku_vendors.default
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_uoms
|
|
21
|
+
sku = skr_skus(:hat)
|
|
22
|
+
assert sku.uoms.default
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_auto_location_creation
|
|
27
|
+
sku=Sku.new({ :code=>'Test', :description=>'A Long Description' })
|
|
28
|
+
sku.sku_vendors.build({
|
|
29
|
+
part_code: 'TESTHAT', vendor: skr_vendors(:bigco),
|
|
30
|
+
list_price: 0.42, cost: 0.34, uom_size: 1, uom_code: 'EA' })
|
|
31
|
+
sku.default_uom_code = 'EA'
|
|
32
|
+
assert_empty sku.sku_locs
|
|
33
|
+
assert_saves sku
|
|
34
|
+
refute_empty sku.sku_locs
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_scopes
|
|
38
|
+
assert_equal skr_skus(:string), Sku.with_vendor_part_code( 'STRINGBALL' ).first
|
|
39
|
+
assert Sku.in_location( skr_locations(:amazon) ).where( code: 'HAT' ).first
|
|
40
|
+
sku=Sku.with_qty_details.where( code: 'HAT' ).first
|
|
41
|
+
assert_equal 25, sku.qty_on_orders
|
|
42
|
+
assert_equal 35, sku.qty_on_hand
|
|
43
|
+
assert_equal 4, sku.qty_incoming
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SkuTranTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_origin
|
|
6
|
+
ia = skr_inventory_adjustments(:first)
|
|
7
|
+
assert ia.mark_applied, "failed to mark as applied"
|
|
8
|
+
st = ia.lines.first.sku_tran
|
|
9
|
+
assert st, "SkuTran wasn't created"
|
|
10
|
+
assert_match( /^IA/, st.origin_description )
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# def test_eq_qty
|
|
14
|
+
# st = SkuTran.new( qty: 8 )
|
|
15
|
+
# assert_equal 8, st.ea_qty
|
|
16
|
+
|
|
17
|
+
# st = SkuTran.new( uom: Skr::Uom.new( size: 10 ), qty: 8 )
|
|
18
|
+
# assert_equal 80, st.ea_qty
|
|
19
|
+
# end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SkuVendorTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_associations
|
|
6
|
+
sv = skr_sku_vendors(:hat_bigco)
|
|
7
|
+
assert_equal sv.vendor, skr_vendors(:bigco)
|
|
8
|
+
assert_equal sv.sku, skr_skus(:hat)
|
|
9
|
+
skr_skus(:hat).sku_vendors.where( part_code: sv.part_code ).first.must_equal sv
|
|
10
|
+
skr_vendors(:bigco).sku_vendors.where( vendor_id: sv.vendor, part_code: sv.part_code ).first.must_equal sv
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SoLineTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_creation
|
|
7
|
+
sol = SoLine.new({
|
|
8
|
+
sales_order: skr_sales_orders(:first),
|
|
9
|
+
sku_loc: skr_sku_locs(:hatdefault),
|
|
10
|
+
description:'A Test', price: 12.42
|
|
11
|
+
})
|
|
12
|
+
sol.uom = skr_uoms('HATEA')
|
|
13
|
+
assert_saves sol
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_scopes
|
|
17
|
+
sol = skr_so_lines(:first_string)
|
|
18
|
+
sol.sku_loc.allocate_available_qty!
|
|
19
|
+
assert_equal 3, SoLine.open.count
|
|
20
|
+
assert_equal 3, SoLine.allocated.count
|
|
21
|
+
assert_equal 2, SoLine.unallocated.count
|
|
22
|
+
assert_equal 1, SoLine.pickable.count
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_allocation
|
|
26
|
+
so = SalesOrder.new({ customer: skr_customers(:argosity) })
|
|
27
|
+
sku_loc = skr_sku_locs(:hatdefault)
|
|
28
|
+
assert_equal 20, sku_loc.qty_available
|
|
29
|
+
so.lines.build({ qty: 2, :price=>2.22, sku_loc: sku_loc })
|
|
30
|
+
assert_difference 'sku_loc.reload.qty_allocated',2 do
|
|
31
|
+
assert_saves so
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_overcreate_prevented
|
|
36
|
+
so = skr_sales_orders(:first)
|
|
37
|
+
skr_sku_locs(:stringdefault).allocate_available_qty!
|
|
38
|
+
pt = so.pick_tickets.build
|
|
39
|
+
|
|
40
|
+
refute_empty pt.lines
|
|
41
|
+
assert_saves pt
|
|
42
|
+
|
|
43
|
+
empty_pt = so.pick_tickets.build
|
|
44
|
+
assert_empty empty_pt.lines
|
|
45
|
+
refute_saves empty_pt
|
|
46
|
+
|
|
47
|
+
# This is a corner case
|
|
48
|
+
# if the pt is created without referencing the SO
|
|
49
|
+
# it can sneak through. Not sure if we should prevent
|
|
50
|
+
# this or not, I mean.. maybe you want/need this?
|
|
51
|
+
manual_pt = PickTicket.new( sales_order: so )
|
|
52
|
+
manual_pt.lines.build({
|
|
53
|
+
so_line: pt.lines.first.so_line
|
|
54
|
+
})
|
|
55
|
+
assert_saves manual_pt
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_backorders
|
|
59
|
+
so = skr_sales_orders(:first)
|
|
60
|
+
assert_equal 1, so.lines.count
|
|
61
|
+
assert_equal 1, so.lines.unallocated.count
|
|
62
|
+
line = so.lines.first
|
|
63
|
+
line.update_attributes :qty_allocated => line.qty
|
|
64
|
+
assert_equal 0, so.lines.unallocated.count
|
|
65
|
+
|
|
66
|
+
line = skr_sales_orders(:picking).lines.unallocated.first
|
|
67
|
+
assert line
|
|
68
|
+
line.update_attributes :qty_allocated => line.qty, :qty_picking=>line.qty
|
|
69
|
+
assert_equal 1, line = skr_sales_orders(:picking).lines.unallocated.count
|
|
70
|
+
assert_equal 0, skr_sales_orders(:complete).lines.unallocated.count
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_picking_qty
|
|
74
|
+
sol = skr_so_lines(:first_string)
|
|
75
|
+
sol.sku_loc.allocate_available_qty!
|
|
76
|
+
pt = sol.sales_order.pick_tickets.build
|
|
77
|
+
assert_saves pt
|
|
78
|
+
assert_equal 2, sol.reload.qty_picking
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_invoice_qty
|
|
82
|
+
so = skr_sales_orders(:first)
|
|
83
|
+
inv = Invoice.new( sales_order: so )
|
|
84
|
+
inv.lines.from_sales_order!
|
|
85
|
+
assert_saves inv
|
|
86
|
+
assert_equal inv.lines.first.qty, so.lines.first.qty_invoiced
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'skr/core/testing/helper'
|
data/test/uom_test.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class UomTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_combining
|
|
7
|
+
uom = Uom.new
|
|
8
|
+
uom.size = 1
|
|
9
|
+
uom.code = 'BOX'
|
|
10
|
+
assert_equal 'BOX', uom.combined_uom
|
|
11
|
+
uom.size = 10
|
|
12
|
+
assert_equal 'BOX/10', uom.combined_uom
|
|
13
|
+
end
|
|
14
|
+
end
|
data/test/vendor_test.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class VendorTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@vendor = Vendor.new({
|
|
7
|
+
code: 'TEST',
|
|
8
|
+
name: 'Mr Test Co',
|
|
9
|
+
billing_address: skr_addresses(:bigco),
|
|
10
|
+
shipping_address: skr_addresses(:bigco),
|
|
11
|
+
terms: skr_payment_terms(:net30)
|
|
12
|
+
})
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_saving
|
|
16
|
+
assert @vendor.save
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_it_sets_gl
|
|
20
|
+
assert @vendor.save
|
|
21
|
+
assert_equal '2200', @vendor.gl_payables_account.number
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_creating
|
|
25
|
+
vendor = Vendor.find_by_code "BIGCO"
|
|
26
|
+
po = PurchaseOrder.new( vendor: vendor )
|
|
27
|
+
Sku.where( code: ['HAT','STRING'] ).each do | sku |
|
|
28
|
+
po.lines.build(
|
|
29
|
+
sku_vendor: sku.sku_vendors.for_vendor( vendor )
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
po.save
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class VoucherLineTest < Skr::TestCase
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_gl_posting
|
|
8
|
+
acct = GlAccount.default_for( :inventory_receipts_clearing )
|
|
9
|
+
po = skr_purchase_orders(:first)
|
|
10
|
+
|
|
11
|
+
v = Voucher.new({ :purchase_order => po })
|
|
12
|
+
old_balance = acct.trial_balance
|
|
13
|
+
po.lines.each do | poline |
|
|
14
|
+
v.lines.build({ :po_line => poline })
|
|
15
|
+
end
|
|
16
|
+
assert_saves v
|
|
17
|
+
assert_equal old_balance - v.total, acct.trial_balance
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class VoucherTest < Skr::TestCase
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_creation
|
|
9
|
+
por = skr_po_receipts(:first)
|
|
10
|
+
assert por.vendor
|
|
11
|
+
v = Voucher.new({ po_receipt: por })
|
|
12
|
+
por.lines.each do | por_line |
|
|
13
|
+
v.lines.build({ po_line: por_line.po_line })
|
|
14
|
+
end
|
|
15
|
+
assert_saves v
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_state_transistions
|
|
19
|
+
v=Voucher.new({ :po_receipt => skr_po_receipts(:first) })
|
|
20
|
+
v.lines.build({
|
|
21
|
+
:po_line => skr_po_lines(:second_on_first)
|
|
22
|
+
})
|
|
23
|
+
assert_saves v
|
|
24
|
+
|
|
25
|
+
acct = v.vendor.gl_payables_account
|
|
26
|
+
before = acct.trial_balance
|
|
27
|
+
assert_equal 'pending', v.state
|
|
28
|
+
assert_difference 'acct.trial_balance', before - v.total do
|
|
29
|
+
v.mark_confirmed
|
|
30
|
+
assert_saves v
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
data/yard_ext/all.rb
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
require_relative 'validators'
|
|
2
|
+
require_relative 'config_options'
|
|
3
|
+
require_relative 'concern_meta_methods'
|
|
4
|
+
require_relative 'exported_scope'
|
|
5
|
+
require_relative 'visible_id_handler'
|
|
6
|
+
require_relative 'code_identifier_handler'
|
|
7
|
+
require_relative 'immutable_handler'
|
|
8
|
+
require_relative 'locked_fields_handler'
|
|
9
|
+
require_relative 'json_attr_accessor'
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class CodeIdentifierHandler < SkrMetaMethodHandler
|
|
2
|
+
|
|
3
|
+
namespace_only
|
|
4
|
+
handles method_call(:has_code_identifier)
|
|
5
|
+
|
|
6
|
+
def process
|
|
7
|
+
super
|
|
8
|
+
add_to_overview
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
params = statement.parameters
|
|
12
|
+
if params.size > 1
|
|
13
|
+
params.pop
|
|
14
|
+
params.detect{ | param |
|
|
15
|
+
param.jump(:hash).source =~ /(:from\s*=>|from:)\s*["':]([^\W]+)/
|
|
16
|
+
}
|
|
17
|
+
namespace.docstring += "\n\nIf left blank, the {#code} field will be set by sending the {##{$2}} field through {Skr::Core::Strings.code_identifier}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def concern_path
|
|
23
|
+
"Skr::Concerns::CodeIdentifier"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def method_name
|
|
27
|
+
:has_code_identifier
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def method_title
|
|
31
|
+
'Has Code Identifier'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
class SkrMetaMethodHandler < YARD::Handlers::Ruby::MethodHandler
|
|
2
|
+
|
|
3
|
+
def process
|
|
4
|
+
if group_name
|
|
5
|
+
namespace.groups << group_name unless namespace.groups.include? group_name
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def get_namespace( path )
|
|
10
|
+
ensure_loaded! P( path )
|
|
11
|
+
P( path )
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_method( ns )
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_to_overview
|
|
18
|
+
ns = get_namespace( concern_path + "::ClassMethods" )
|
|
19
|
+
method = ns.meths.detect{ |nsmethod| nsmethod.name == method_name }
|
|
20
|
+
|
|
21
|
+
namespace.docstring += "\n\n" +
|
|
22
|
+
"## #{method_title} {#{ns} >>}\n\n" +
|
|
23
|
+
method.docstring.dup
|
|
24
|
+
|
|
25
|
+
method.docstring.tags.each{ |tag| namespace.docstring.add_tag tag }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def add_instance_methods
|
|
29
|
+
ns = get_namespace( concern_path + "::InstanceMethods" )
|
|
30
|
+
ns.meths.each do |nsmethod|
|
|
31
|
+
object = YARD::CodeObjects::MethodObject.new(namespace, nsmethod.name )
|
|
32
|
+
object.scope = :instance
|
|
33
|
+
object.explicit = false
|
|
34
|
+
|
|
35
|
+
object.docstring = nsmethod.docstring.dup
|
|
36
|
+
register object
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def add_class_methods
|
|
41
|
+
ns = get_namespace( concern_path + "::MixedInClassMethods" )
|
|
42
|
+
|
|
43
|
+
ns.meths.each do |nsmethod|
|
|
44
|
+
object = YARD::CodeObjects::MethodObject.new(namespace, nsmethod.name )
|
|
45
|
+
object.scope = :instance
|
|
46
|
+
object.explicit = false
|
|
47
|
+
|
|
48
|
+
object.docstring = nsmethod.docstring.dup
|
|
49
|
+
register object
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def method_title
|
|
54
|
+
method_name.to_s.titleize
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def group_name
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class ConfigOptionHandler < YARD::Handlers::Ruby::Base
|
|
2
|
+
handles method_call(:config_option)
|
|
3
|
+
namespace_only
|
|
4
|
+
|
|
5
|
+
def process
|
|
6
|
+
|
|
7
|
+
name = statement.parameters.first.jump(:tsymbol_content, :ident).source
|
|
8
|
+
object = YARD::CodeObjects::MethodObject.new(namespace, name)
|
|
9
|
+
|
|
10
|
+
param_size = statement.parameters.size
|
|
11
|
+
default = statement.parameters[ param_size - 2 ]
|
|
12
|
+
|
|
13
|
+
object.parameters = [['default',default.source]]
|
|
14
|
+
|
|
15
|
+
# modify the object
|
|
16
|
+
object.dynamic = true
|
|
17
|
+
|
|
18
|
+
register(object)
|
|
19
|
+
unless object.docstring.has_tag?(:return)
|
|
20
|
+
object.docstring.add_tag YARD::Tags::Tag.new( :return, "defaults to #{default.source}", [ default.type.to_s.sub(/_.*$/,'').capitalize ])
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
def get_tag(tag, text, return_classes = [])
|
|
24
|
+
YARD::Tags::Tag.new(tag, text, [return_classes].flatten)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class ImmutableHandler < SkrMetaMethodHandler
|
|
2
|
+
|
|
3
|
+
namespace_only
|
|
4
|
+
handles method_call(:is_immutable)
|
|
5
|
+
|
|
6
|
+
def process
|
|
7
|
+
add_to_overview
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def concern_path
|
|
11
|
+
"Skr::Concerns::ImmutableModel"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def method_name
|
|
15
|
+
:is_immutable
|
|
16
|
+
end
|
|
17
|
+
end
|