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
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class PaymentTermTest < Skr::TestCase
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_immediate_terms_are_identified
|
|
8
|
+
assert skr_payment_terms(:cash).immediate?
|
|
9
|
+
refute skr_payment_terms(:net30).immediate?
|
|
10
|
+
assert skr_payment_terms(:cred_card).immediate?
|
|
11
|
+
refute skr_payment_terms(:bonus30).immediate?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_percnum
|
|
15
|
+
assert_kind_of Skr::Core::Numbers::PercNum, skr_payment_terms(:bonus30).discount
|
|
16
|
+
assert skr_payment_terms('10net30').discount.is_percentage?
|
|
17
|
+
refute skr_payment_terms(:bonus30).discount.is_percentage?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_expirations
|
|
21
|
+
assert_equal Date.today+30.days, skr_payment_terms('10net30').due_date_from(Date.today)
|
|
22
|
+
assert_equal Date.today+10.days, skr_payment_terms('10net30').discount_expires_at
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require_relative "test_helper"
|
|
2
|
+
|
|
3
|
+
class PickTicketTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_creation_from_so
|
|
6
|
+
so = skr_sales_orders(:first)
|
|
7
|
+
skr_sku_locs(:stringdefault).allocate_available_qty!
|
|
8
|
+
assert_equal 1, so.lines.pickable.count
|
|
9
|
+
pt = so.pick_tickets.build
|
|
10
|
+
assert_equal 1, pt.lines.length
|
|
11
|
+
assert_equal skr_skus(:string), pt.lines.first.sku
|
|
12
|
+
assert_equal 1.42, pt.lines.first.price
|
|
13
|
+
assert_saves pt
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_canceling
|
|
17
|
+
pt = skr_pick_tickets(:first)
|
|
18
|
+
assert_equal 1, pt.lines.length
|
|
19
|
+
refute pt.is_complete?, "Pick Ticket is complete when it shouldn't be"
|
|
20
|
+
|
|
21
|
+
pt.mark_complete=true
|
|
22
|
+
assert_saves pt
|
|
23
|
+
# pt.is_complete.must_equal true
|
|
24
|
+
# so_lines(:first_on_first).qty_picking.must_equal 0
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class PoLineTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_creation
|
|
7
|
+
po = skr_purchase_orders(:first)
|
|
8
|
+
skuloc = skr_sku_locs(:hatdefault)
|
|
9
|
+
pol = po.lines.build({ sku_loc: skuloc, description: 'a test item',
|
|
10
|
+
uom_code: 'EA', uom_size: 1, price: 33.3 })
|
|
11
|
+
assert_saves pol
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_recieving
|
|
16
|
+
line = skr_po_lines(:second_on_first)
|
|
17
|
+
line.qty_received = 1
|
|
18
|
+
|
|
19
|
+
assert_saves line
|
|
20
|
+
line.reload
|
|
21
|
+
assert_equal 0, line.qty_received, "qty received saved, even though it should be locked"
|
|
22
|
+
|
|
23
|
+
line.unlock_fields( :qty_received ) do
|
|
24
|
+
line.qty_received = 33
|
|
25
|
+
assert_saves line
|
|
26
|
+
end
|
|
27
|
+
line.reload
|
|
28
|
+
assert_equal 33, line.qty_received
|
|
29
|
+
line.qty_received = 3
|
|
30
|
+
assert_saves line
|
|
31
|
+
line.reload
|
|
32
|
+
assert_equal 33, line.qty_received
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class PoReceiptTest < Skr::TestCase
|
|
5
|
+
|
|
6
|
+
def test_posting_freight
|
|
7
|
+
po = skr_purchase_orders(:first)
|
|
8
|
+
por = PoReceipt.new( freight: 42.99, purchase_order: po )
|
|
9
|
+
assert_difference ->{ por.vendor.gl_freight_account.trial_balance }, 42.99 do
|
|
10
|
+
assert_saves por
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_allocations
|
|
15
|
+
po = skr_purchase_orders(:first)
|
|
16
|
+
|
|
17
|
+
poline = po.lines.last
|
|
18
|
+
qty = poline.qty_unreceived
|
|
19
|
+
|
|
20
|
+
sl=poline.sku_loc
|
|
21
|
+
sol = skr_so_lines(:picking_glove)
|
|
22
|
+
assert_equal 2, sl.so_lines.count
|
|
23
|
+
|
|
24
|
+
por = PoReceipt.new( freight: 42.99, purchase_order: po )
|
|
25
|
+
por.lines.build( po_line: poline, qty: qty, auto_allocate: true )
|
|
26
|
+
assert_equal 19, sol.qty-sol.qty_allocated
|
|
27
|
+
assert_difference( ->{sl.reload.qty_allocated}, 19 ) do
|
|
28
|
+
assert_saves por
|
|
29
|
+
end
|
|
30
|
+
refute por.lines.first.new_record?
|
|
31
|
+
assert_equal 1, por.lines.first.qty
|
|
32
|
+
|
|
33
|
+
assert_equal qty, poline.reload.qty_received
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_gl_postings
|
|
38
|
+
po = skr_purchase_orders(:first)
|
|
39
|
+
por = PoReceipt.new( freight: 42.99, purchase_order: po )
|
|
40
|
+
por.lines.build({ po_line: po.lines.first, qty: 1 })
|
|
41
|
+
por.lines.build({ po_line: po.lines.last, qty: 3 })
|
|
42
|
+
|
|
43
|
+
gl = skr_gl_accounts(:inventory)
|
|
44
|
+
|
|
45
|
+
# needs more nesting...
|
|
46
|
+
assert_difference ->{ GlTransaction.count }, 1 do
|
|
47
|
+
assert_difference ->{ GlPosting.count }, 3 do
|
|
48
|
+
assert_difference ->{ gl.trial_balance }, 164.62 do
|
|
49
|
+
assert_saves por
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
glt = por.gl_transaction
|
|
54
|
+
assert glt, "Receipt did not record a GlTransaction"
|
|
55
|
+
assert_equal 1, glt.debits.count
|
|
56
|
+
assert_equal( -207.61, glt.debits.first.amount )
|
|
57
|
+
assert_equal skr_gl_accounts(:inv_recpt).default_number, glt.debits.first.account_number
|
|
58
|
+
assert_equal 2, glt.credits.count
|
|
59
|
+
assert_equal( 42.99, glt.credits.first.amount )
|
|
60
|
+
assert_equal po.vendor.gl_freight_account.default_number, glt.credits.first.account_number
|
|
61
|
+
assert_equal( 207.61-42.99, glt.credits.last.amount )
|
|
62
|
+
assert_equal skr_gl_accounts(:inventory).default_number, glt.credits.last.account_number
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_no_posting_if_save_failed
|
|
66
|
+
po = skr_purchase_orders(:first)
|
|
67
|
+
por = PoReceipt.new # <- No PO
|
|
68
|
+
por.lines.build({ po_line: po.lines.first, qty: 1 })
|
|
69
|
+
assert_difference ->{ GlTransaction.count }, 0 do
|
|
70
|
+
assert_difference ->{ GlPosting.count }, 0 do
|
|
71
|
+
refute_saves por
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_failed_posting_raises
|
|
77
|
+
po = skr_purchase_orders(:first)
|
|
78
|
+
por = PoReceipt.new( freight: 42.99, purchase_order: po )
|
|
79
|
+
por.lines.build({ po_line: po.lines.first, qty: 1 })
|
|
80
|
+
assert_difference ->{ PoReceipt.count }, 0 do
|
|
81
|
+
assert_difference ->{ GlTransaction.count }, 0 do
|
|
82
|
+
assert_difference ->{ GlPosting.count }, 0 do
|
|
83
|
+
por.stub(:attributes_for_gl_transaction,{}) do
|
|
84
|
+
assert_raises Skr::InvalidGlTransaction do
|
|
85
|
+
refute_saves por
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class PorLineTest < Skr::TestCase
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_gl_postings
|
|
8
|
+
po = skr_purchase_orders(:first)
|
|
9
|
+
pol = skr_po_lines(:second_on_first)
|
|
10
|
+
por = PoReceipt.new( freight: 42.99, purchase_order: po )
|
|
11
|
+
line = por.lines.build({
|
|
12
|
+
qty: 1,
|
|
13
|
+
po_line: pol
|
|
14
|
+
})
|
|
15
|
+
assert_difference ->{ GlAccount.default_for(:inventory_receipts_clearing).trial_balance }, (line.price+42.99) * -1 do
|
|
16
|
+
assert_difference ->{ line.sku_loc.sku.gl_asset_account.trial_balance }, line.price do
|
|
17
|
+
assert_saves por
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_recieving_qty
|
|
23
|
+
po = skr_purchase_orders(:first)
|
|
24
|
+
pol = skr_po_lines(:second_on_first)
|
|
25
|
+
por = PoReceipt.new({ purchase_order: po })
|
|
26
|
+
line = por.lines.build({ po_line: pol })
|
|
27
|
+
assert_difference ->{ line.sku_loc.reload.qty }, 1 do
|
|
28
|
+
assert_saves por
|
|
29
|
+
refute_empty line.sku_trans
|
|
30
|
+
assert_equal 1, line.sku_trans.first.qty
|
|
31
|
+
assert_equal line.sku_loc, line.sku_trans.first.sku_loc
|
|
32
|
+
refute line.sku_trans.first.new_record?
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_mac_adjustments
|
|
37
|
+
po = skr_purchase_orders(:first)
|
|
38
|
+
pol = skr_po_lines(:second_on_first)
|
|
39
|
+
por = PoReceipt.new({ purchase_order: po })
|
|
40
|
+
line = por.lines.build({ po_line: pol })
|
|
41
|
+
assert_equal '0.12', line.sku_loc.mac.to_s
|
|
42
|
+
assert_saves por
|
|
43
|
+
assert_equal '2.9768', line.sku_loc.mac.to_s
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_empty_mac_adjustment
|
|
47
|
+
po = skr_purchase_orders(:unvouched)
|
|
48
|
+
sl = skr_sku_locs(:hatdefault)
|
|
49
|
+
pol = po.lines.where({ sku_loc_id: sl }).first
|
|
50
|
+
assert_equal 0, pol.qty_received
|
|
51
|
+
assert_equal 1, pol.qty
|
|
52
|
+
assert_equal 23.3, pol.price
|
|
53
|
+
sl.unlock_fields :mac, :qty do
|
|
54
|
+
sl.qty = sl.mac = 0
|
|
55
|
+
sl.save!
|
|
56
|
+
end
|
|
57
|
+
por = PoReceipt.new({ :freight=>42.99, :purchase_order => po })
|
|
58
|
+
por.lines.build({ :po_line => pol })
|
|
59
|
+
assert_saves por
|
|
60
|
+
sl.reload
|
|
61
|
+
assert_equal 23.3, sl.mac
|
|
62
|
+
assert_equal 1, sl.qty
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_prevents_over_receipt
|
|
66
|
+
pol = skr_po_lines(:second_on_first)
|
|
67
|
+
por = PoReceipt.new({ purchase_order: pol.purchase_order })
|
|
68
|
+
line = por.lines.build({ po_line: pol })
|
|
69
|
+
assert_difference ->{ line.sku_loc.reload.qty }, 1 do
|
|
70
|
+
assert_saves por
|
|
71
|
+
assert_equal 0, line.po_line.qty_unreceived
|
|
72
|
+
end
|
|
73
|
+
line = por.lines.build({ po_line: pol })
|
|
74
|
+
assert line.invalid?, "Line should not be valid"
|
|
75
|
+
assert line.errors[:qty]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require_relative "test_helper"
|
|
2
|
+
|
|
3
|
+
class PtLineTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_invoicing
|
|
6
|
+
pt = skr_pick_tickets(:first)
|
|
7
|
+
ptl = pt.lines.first
|
|
8
|
+
assert_equal 0, ptl.qty_invoiced
|
|
9
|
+
|
|
10
|
+
inv = Invoice.new({ :pick_ticket=> pt })
|
|
11
|
+
inv.lines.from_pick_ticket!
|
|
12
|
+
assert_saves inv
|
|
13
|
+
|
|
14
|
+
assert_equal inv.lines.length, pt.lines.length
|
|
15
|
+
refute_nil inv.lines.first.pt_line
|
|
16
|
+
assert_equal ptl, inv.lines.first.pt_line
|
|
17
|
+
assert_equal ptl.reload.qty_invoiced, inv.lines.first.qty
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_bin_is_assigned
|
|
21
|
+
so = skr_sales_orders(:first)
|
|
22
|
+
skr_sku_locs(:stringdefault).allocate_available_qty!
|
|
23
|
+
assert_equal 1, so.lines.pickable.count
|
|
24
|
+
pt = so.pick_tickets.build
|
|
25
|
+
assert_saves pt
|
|
26
|
+
assert_equal skr_sku_locs(:stringdefault).bin, pt.lines.first.bin
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class PurchaseOrderTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_creation
|
|
6
|
+
po = PurchaseOrder.new({
|
|
7
|
+
terms: skr_payment_terms(:cred_card),
|
|
8
|
+
vendor: skr_vendors(:bigco),
|
|
9
|
+
location: skr_locations(:default)
|
|
10
|
+
})
|
|
11
|
+
po.lines.build({
|
|
12
|
+
sku_loc: skr_sku_locs(:hatdefault),
|
|
13
|
+
description: 'a test item',
|
|
14
|
+
uom_code: 'BX',
|
|
15
|
+
uom_size: 10,
|
|
16
|
+
price: 33.3
|
|
17
|
+
})
|
|
18
|
+
assert_saves po
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_state_transistions
|
|
23
|
+
po = skr_purchase_orders(:first)
|
|
24
|
+
assert_equal 'open', po.state
|
|
25
|
+
assert_equal [ :mark_received ], po.valid_state_events
|
|
26
|
+
po.mark_received!
|
|
27
|
+
assert_equal 'received', po.state
|
|
28
|
+
assert_empty po.valid_state_events
|
|
29
|
+
assert_saves po
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_receiving
|
|
34
|
+
po = skr_purchase_orders(:first)
|
|
35
|
+
por = PoReceipt.new( purchase_order: po )
|
|
36
|
+
po.lines.each do | pol|
|
|
37
|
+
next if pol.qty_unreceived.zero?
|
|
38
|
+
por.lines.build({ :po_line => pol })
|
|
39
|
+
end
|
|
40
|
+
assert_saves por
|
|
41
|
+
assert_equal 'received', po.state
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class SalesOrderTest < Skr::TestCase
|
|
5
|
+
|
|
6
|
+
def test_date_default
|
|
7
|
+
so = SalesOrder.new
|
|
8
|
+
assert_equal Date.today, so.order_date
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_updating_location
|
|
12
|
+
so = skr_sales_orders(:first)
|
|
13
|
+
so.location = skr_locations(:amazon)
|
|
14
|
+
assert_not so.save, "SO saved with invalid location"
|
|
15
|
+
assert_equal "Location AMAZON does not have skus STRING", so.errors.full_messages.first
|
|
16
|
+
sku = skr_skus(:string)
|
|
17
|
+
sl = sku.sku_locs.find_or_create_for( so.location )
|
|
18
|
+
assert_saves so
|
|
19
|
+
assert sl
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_creating
|
|
24
|
+
customer = skr_customers(:joe)
|
|
25
|
+
so = SalesOrder.new( customer: customer )
|
|
26
|
+
Sku.where( code: ['HAT','STRING'] ).each do | sku |
|
|
27
|
+
so.lines.build(
|
|
28
|
+
sku_loc: sku.sku_locs.default
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
assert_saves so
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_allocation_counts
|
|
36
|
+
sol = skr_so_lines(:first_string)
|
|
37
|
+
sol.qty_allocated=1
|
|
38
|
+
assert_saves sol
|
|
39
|
+
so = SalesOrder.allocated.where({ :id=>skr_sales_orders(:first) }).first
|
|
40
|
+
assert so, "SO wasn't found"
|
|
41
|
+
assert_equal 1,so.number_of_lines_allocated
|
|
42
|
+
assert_equal 0,so.number_of_lines_fully_allocated
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_picking
|
|
46
|
+
so = skr_sales_orders(:first)
|
|
47
|
+
skr_sku_locs(:stringdefault).allocate_available_qty!
|
|
48
|
+
assert_equal 1, so.lines.pickable.count
|
|
49
|
+
assert_equal 2, so.lines.pickable.first.qty_allocated
|
|
50
|
+
pt = so.pick_tickets.build
|
|
51
|
+
pt.save!
|
|
52
|
+
assert_equal 1, pt.lines.count
|
|
53
|
+
so.reload
|
|
54
|
+
assert_equal 0, so.lines.pickable.count
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_cancelling
|
|
59
|
+
so = skr_sales_orders(:picking)
|
|
60
|
+
assert_equal 'open', so.state
|
|
61
|
+
assert_equal 5, so.lines.first.qty_picking
|
|
62
|
+
refute so.pick_tickets.first.is_complete
|
|
63
|
+
assert so.mark_canceled!
|
|
64
|
+
assert_equal 0, so.lines.first.qty_picking
|
|
65
|
+
assert so.pick_tickets.first.is_complete
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_sales_history
|
|
69
|
+
stats = SalesOrder.sales_history( 5 )
|
|
70
|
+
assert_equal 5, stats.count
|
|
71
|
+
assert_equal ["3","5","120.02"], stats[0][2..-1]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SkuLocTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_qty_locked
|
|
6
|
+
sl = skr_sku_locs(:hatdefault)
|
|
7
|
+
sl.qty=800
|
|
8
|
+
assert_saves sl
|
|
9
|
+
assert_equal 25, sl.reload.qty
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_allocations
|
|
14
|
+
sol = skr_so_lines(:first_string)
|
|
15
|
+
sl = sol.sku_loc
|
|
16
|
+
|
|
17
|
+
assert_equal 33, sl.qty_available
|
|
18
|
+
refute sol.is_fully_allocated?, "test line is already allocated"
|
|
19
|
+
sl.allocate_available_qty!
|
|
20
|
+
sol.reload # <- needed because sku_loc allocations uses a scope
|
|
21
|
+
assert sol.is_fully_allocated?, "failed to allocate test line"
|
|
22
|
+
assert_equal 27, sl.reload.qty_available
|
|
23
|
+
|
|
24
|
+
sol.update_attributes :qty_allocated => 0
|
|
25
|
+
assert_equal 33, sl.reload.qty_available
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_qty_event
|
|
29
|
+
sl = skr_sku_locs(:hatdefault)
|
|
30
|
+
assert_event_fires( SkuLoc, :qty_change ) do
|
|
31
|
+
# NEVER do this directly - it will throw the MAC
|
|
32
|
+
# and GL out off balance. Instead use SkuTran
|
|
33
|
+
sl.unlock_fields( :qty ) do
|
|
34
|
+
sl.adjust_qty( 10 )
|
|
35
|
+
assert_saves sl
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
assert_equal [sl], last_event_results
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_picking
|
|
42
|
+
sl = skr_sku_locs(:stringdefault)
|
|
43
|
+
sol = sl.so_lines.where( sku_loc: sl ).first
|
|
44
|
+
sl.allocate_available_qty!
|
|
45
|
+
pt = sol.sales_order.pick_tickets.build
|
|
46
|
+
assert_difference 'sl.reload.qty_picking', 6 do
|
|
47
|
+
assert_saves pt
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|