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,34 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class CustomerTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@customer=Customer.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_saves @customer
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_it_sets_gl
|
|
20
|
+
assert_saves @customer
|
|
21
|
+
assert_equal '1200', @customer.gl_receivables_account.number
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_balance_recording
|
|
26
|
+
inv = Invoice.new( sales_order: skr_sales_orders(:picking) )
|
|
27
|
+
inv.lines.from_sales_order!
|
|
28
|
+
customer = inv.sales_order.customer
|
|
29
|
+
assert_difference ->{ customer.reload.open_balance }, 18.94 do
|
|
30
|
+
assert_saves inv
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class GlAccountTest < Skr::TestCase
|
|
5
|
+
|
|
6
|
+
def test_balance
|
|
7
|
+
gla = skr_gl_accounts(:marketing)
|
|
8
|
+
|
|
9
|
+
assert_equal 3033.28, gla.balance_for( skr_gl_periods(:nov2013) )
|
|
10
|
+
|
|
11
|
+
assert_equal 3133.28, gla.balance_for( skr_gl_periods(:dec2013) )
|
|
12
|
+
|
|
13
|
+
assert_equal 0, gla.balance_for( skr_gl_periods(:close2013) )
|
|
14
|
+
|
|
15
|
+
assert_equal 356.81, gla.balance_for( skr_gl_periods(:jan2014) )
|
|
16
|
+
|
|
17
|
+
assert_equal -843.61, gla.trial_balance # Our free hats brings the expense account to a negative balance
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class GlManualEntryTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_notes_are_copied
|
|
6
|
+
gle = GlManualEntry.new({ notes: 'A good test' })
|
|
7
|
+
tran = gle.gl_transaction = GlTransaction.new( location: Location.default )
|
|
8
|
+
tran.add_posting( amount: 33.42, debit: skr_gl_accounts(:cash), credit: skr_gl_accounts(:inventory) )
|
|
9
|
+
|
|
10
|
+
assert_saves gle
|
|
11
|
+
assert_equal gle.notes, tran.description
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_querying_using_visible_id
|
|
15
|
+
GlManualEntry.with_visible_id( 23)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class GlPeriodTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_it_returns_current_period
|
|
6
|
+
glp = GlPeriod.current
|
|
7
|
+
glp.new_record?.must_equal false
|
|
8
|
+
glp.period.must_equal Time.now.month
|
|
9
|
+
glp.year.must_equal Time.now.year
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class GlPostingTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
gle = GlManualEntry.create({ notes: 'A good test' })
|
|
7
|
+
@glt = gle.gl_transaction = GlTransaction.new({ source: gle })
|
|
8
|
+
@glt.location = skr_locations(:default)
|
|
9
|
+
@glt.add_posting( amount: 33.42, debit: skr_gl_accounts(:cash), credit: skr_gl_accounts(:inventory) )
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_attribute_caching
|
|
13
|
+
assert_saves @glt
|
|
14
|
+
assert_equal '110001', @glt.credits.first.account_number
|
|
15
|
+
assert_equal Date.today.year, @glt.credits.first.year
|
|
16
|
+
assert_equal Date.today.month, @glt.credits.first.period
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_it_cannot_be_updated
|
|
21
|
+
assert_saves @glt
|
|
22
|
+
@glt.credits.first.amount = 33
|
|
23
|
+
assert_raises( ActiveRecord::ReadOnlyRecord ) do
|
|
24
|
+
@glt.credits.first.save
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_no_adding_to_transaction
|
|
29
|
+
assert_saves @glt
|
|
30
|
+
posting = @glt.credits.create({
|
|
31
|
+
account_number: '100000',
|
|
32
|
+
amount: 22
|
|
33
|
+
})
|
|
34
|
+
assert posting.new_record?, "allowed saving an adhoc posting"
|
|
35
|
+
assert_equal ["does not accept new postings"], posting.errors[:gl_transaction]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class GlTransactionTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@gle = GlManualEntry.create({ notes: 'A good test' })
|
|
8
|
+
@glt = @gle.build_gl_transaction({ description: 'test manual source', source: @gle, location: Location.default })
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_stand_alone_creation
|
|
12
|
+
@glt.add_posting( amount: 22.1, debit: skr_gl_accounts(:cash), credit: skr_gl_accounts(:inventory) )
|
|
13
|
+
assert_saves @glt
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_no_updates
|
|
17
|
+
glt = skr_gl_transactions(:free_hats)
|
|
18
|
+
assert_raises( ActiveRecord::ReadOnlyRecord ) do
|
|
19
|
+
glt.description = 'updated'
|
|
20
|
+
assert_saves glt
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_no_differing_amounts
|
|
25
|
+
@glt.add_posting( amount: 22.42, debit: skr_gl_accounts(:cash), credit: skr_gl_accounts(:inventory) )
|
|
26
|
+
@glt.credits.first.amount = 18
|
|
27
|
+
refute @glt.save, "allowed saving with mismatched amounts"
|
|
28
|
+
assert_equal ['must equal debits'], @glt.errors[:credits]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_nested_recording
|
|
32
|
+
tran = GlTransaction.record do | glt |
|
|
33
|
+
assert_equal glt, GlTransaction.current
|
|
34
|
+
GlTransaction.record( description: '2nd level' ) do | glt2 |
|
|
35
|
+
refute_equal glt, glt2
|
|
36
|
+
assert_equal glt2, GlTransaction.current
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
assert tran.new_record?
|
|
40
|
+
assert tran.errors.empty?, "since no postings, it shouldn't attempt to save"
|
|
41
|
+
refute_saves tran
|
|
42
|
+
refute tran.errors.empty?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_compacting
|
|
46
|
+
tran = GlTransaction.record do | glt |
|
|
47
|
+
glt.add_posting( amount: 12.12, debit: skr_gl_accounts(:cash), credit: skr_gl_accounts(:inventory) )
|
|
48
|
+
glt.add_posting( amount: 42.42, debit: skr_gl_accounts(:cash), credit: skr_gl_accounts(:inventory) )
|
|
49
|
+
{ attributes: { source: @gle, description: 'A Test', location: Location.default } }
|
|
50
|
+
end
|
|
51
|
+
assert_saves tran
|
|
52
|
+
assert_equal 1, tran.debits.size
|
|
53
|
+
assert_equal 1, tran.credits.count
|
|
54
|
+
assert_equal '54.54', tran.credits.total.to_s
|
|
55
|
+
assert_equal '-54.54', tran.debits.total.to_s
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class IaLineTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_cost_adjustment
|
|
7
|
+
ial = skr_ia_lines(:first)
|
|
8
|
+
prior_mac = ial.sku_loc.mac
|
|
9
|
+
ial.cost = 2332.33
|
|
10
|
+
ial.cost_was_set = true
|
|
11
|
+
ial.qty = -3
|
|
12
|
+
refute_saves ial
|
|
13
|
+
refute_nil ial.errors[:cost]
|
|
14
|
+
|
|
15
|
+
ial.cost_was_set =false
|
|
16
|
+
assert_saves ial
|
|
17
|
+
|
|
18
|
+
assert_in_delta prior_mac * ial.uom_size, ial.cost
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_setting_mac_cost
|
|
22
|
+
ial = skr_ia_lines(:first)
|
|
23
|
+
il = ial.sku_loc
|
|
24
|
+
refute ial.is_applied?
|
|
25
|
+
assert_in_delta 0.64, il.mac
|
|
26
|
+
assert_nil ial.read_attribute('cost')
|
|
27
|
+
assert_equal 6.4, ial.ledger_cost
|
|
28
|
+
assert_saves ial
|
|
29
|
+
adj = ial.inventory_adjustment
|
|
30
|
+
adj.state_event='mark_applied'
|
|
31
|
+
assert_saves ial#.inventory_adjustment.mark_applied!, "marking applied failed"
|
|
32
|
+
ial.reload
|
|
33
|
+
assert ial.cost, "Cost wasn't set from sku_loc"
|
|
34
|
+
assert_in_delta 6.4, ial.cost
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_no_mac_on_negative_qty
|
|
38
|
+
ia = InventoryAdjustment.new({
|
|
39
|
+
"reason_id" => skr_ia_reasons(:free).id, "description"=>"A Groovy Adjustment",
|
|
40
|
+
"lines_attributes"=>[ {
|
|
41
|
+
"qty"=>-10, "cost"=>3, "cost_was_set"=>true, "uom_code"=>"EA",
|
|
42
|
+
"uom_size"=>1, "sku_loc_id"=> skr_sku_locs(:hatdefault).id
|
|
43
|
+
} ],
|
|
44
|
+
"location_id"=>skr_sku_locs(:hatdefault).location.id
|
|
45
|
+
})
|
|
46
|
+
refute_saves ia, 'lines.cost'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_adjusting_mac_cost
|
|
50
|
+
ial = skr_ia_lines(:first)
|
|
51
|
+
il = ial.sku_loc
|
|
52
|
+
assert_equal 0.64, il.mac
|
|
53
|
+
assert_equal 25, il.qty
|
|
54
|
+
assert_equal 16.0, il.onhand_mac_value
|
|
55
|
+
ial.cost = 10
|
|
56
|
+
ial.qty = 100
|
|
57
|
+
ial.uom_size = 2
|
|
58
|
+
ial.cost_was_set = true
|
|
59
|
+
assert_equal 1000, ial.total
|
|
60
|
+
assert_saves ial
|
|
61
|
+
assert ial.inventory_adjustment.mark_applied, "Failed to mark adj as applied"
|
|
62
|
+
refute_nil ial.reload.sku_tran, "SkuTran wasn't created"
|
|
63
|
+
il.reload
|
|
64
|
+
assert_in_delta 4.515, il.mac # ( 16.0 + 1000 ) / ( 25 + 200 )
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class InvLineTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_inventory_adjusting
|
|
6
|
+
inv = Invoice.new( customer: skr_customers(:argosity) )
|
|
7
|
+
sl = skr_sku_locs(:stringdefault)
|
|
8
|
+
inv.lines.build({
|
|
9
|
+
:sku_loc => sl, :qty => 2
|
|
10
|
+
})
|
|
11
|
+
assert_difference ->{ sl.reload.qty }, -2 do
|
|
12
|
+
assert_difference ->{ sl.reload.mac }, 0, "MAC was adjusted by invoice?" do
|
|
13
|
+
assert_saves inv
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_setting_price
|
|
19
|
+
price = BigDecimal.new('112.54')
|
|
20
|
+
inv = Invoice.new( location: skr_locations(:default), customer: skr_customers( :bigco ) )
|
|
21
|
+
inv.lines.build(
|
|
22
|
+
sku_loc: skr_sku_locs(:hatdefault),
|
|
23
|
+
qty: 2,
|
|
24
|
+
price: price
|
|
25
|
+
)
|
|
26
|
+
assert_saves inv
|
|
27
|
+
line = inv.lines(true).first
|
|
28
|
+
assert_equal price, line.price
|
|
29
|
+
assert_equal price*2, line.extended_price
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_no_updates
|
|
33
|
+
inv = Invoice.new( customer: skr_customers( :argosity ) )
|
|
34
|
+
inv.lines.build( sku_loc: skr_sku_locs(:hatdefault), qty: 1 )
|
|
35
|
+
assert inv.save
|
|
36
|
+
assert_raises( ActiveRecord::ReadOnlyRecord ){ inv.lines.first.destroy }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_gl_posting
|
|
40
|
+
inv = Invoice.new( customer: skr_customers(:argosity) )
|
|
41
|
+
inv.lines.build({ :sku_loc => skr_sku_locs( :hatdefault ), :qty => 1 }) # price is 3.11 from UOM
|
|
42
|
+
inv.lines.build({ :sku_loc => skr_sku_locs( :stringdefault ), :qty => 2, price: 1.8 })
|
|
43
|
+
inv.lines.build({ :sku_loc => skr_sku_locs( :glovedefault ), :qty => 4, price: 2.1 })
|
|
44
|
+
gl = skr_gl_accounts(:inventory)
|
|
45
|
+
|
|
46
|
+
assert_difference ->{ GlPosting.count }, 2 do
|
|
47
|
+
assert_difference ->{ gl.trial_balance }, -15.11 do
|
|
48
|
+
assert_saves inv
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_creating_with_sku
|
|
54
|
+
inv = Invoice.new( customer: skr_customers(:argosity) )
|
|
55
|
+
inv.lines.build({ sku: Sku.find_by_code('GLOVE'), qty: 1, price: 8.27 })
|
|
56
|
+
assert_saves inv
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class InventoryAdjustmentTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_state_transitioning
|
|
6
|
+
il = skr_sku_locs(:hatdefault)
|
|
7
|
+
assert_equal 25, il.qty
|
|
8
|
+
ia = InventoryAdjustment.create!({ reason: skr_ia_reasons(:free),
|
|
9
|
+
location: skr_locations(:default), description: 'A testing adjustment' })
|
|
10
|
+
ia.lines.create!({ sku_loc: il, uom_code: 'BX', uom_size: 10, qty: 3 })
|
|
11
|
+
|
|
12
|
+
assert_equal 'pending', ia.state
|
|
13
|
+
assert_equal 1, ia.lines.unapplied.size
|
|
14
|
+
|
|
15
|
+
ia.mark_applied!
|
|
16
|
+
assert_equal 'applied', ia.state
|
|
17
|
+
assert ia.lines.first.is_applied?, "line wasn't applied when parent was"
|
|
18
|
+
il.reload
|
|
19
|
+
assert_equal 55, il.qty
|
|
20
|
+
assert_empty ia.lines.unapplied
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_apply_while_saving
|
|
25
|
+
ia = InventoryAdjustment.create!({
|
|
26
|
+
"reason_id" => skr_ia_reasons(:free).id, "description"=>"A Groovy Adjustment",
|
|
27
|
+
:state_event=>:mark_applied,
|
|
28
|
+
"lines_attributes"=>[ {
|
|
29
|
+
"qty"=>10, "cost"=>3, "cost_was_set"=>true, "uom_code"=>"EA",
|
|
30
|
+
"uom_size"=>1, "sku_loc_id"=> skr_sku_locs(:hatdefault).id
|
|
31
|
+
} ],
|
|
32
|
+
"location_id"=>skr_sku_locs(:hatdefault).location.id
|
|
33
|
+
})
|
|
34
|
+
refute ia.new_record?
|
|
35
|
+
assert_equal 'applied', ia.state
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_gl_postings
|
|
39
|
+
ia = InventoryAdjustment.new({
|
|
40
|
+
reason: skr_ia_reasons(:free), "description"=>"This is going to cost us",
|
|
41
|
+
state_event: :mark_applied, location: Location.default
|
|
42
|
+
})
|
|
43
|
+
assert_equal 25, skr_sku_locs( :hatdefault ).qty
|
|
44
|
+
[ :hatdefault, :stringdefault ].each do | sl |
|
|
45
|
+
ia.lines.build({
|
|
46
|
+
sku_loc: skr_sku_locs( sl ),
|
|
47
|
+
qty: 2, uom_code: 'CS', uom_size: 5,
|
|
48
|
+
})
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
assert_difference ->{ GlTransaction.count }, 1 do
|
|
52
|
+
assert_difference ->{ GlPosting.count }, 2 do # would be 4, except it should compact
|
|
53
|
+
assert_saves ia
|
|
54
|
+
assert_equal 'applied', ia.state
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
assert_equal 35, skr_sku_locs( :hatdefault ).qty
|
|
58
|
+
assert_equal 43, skr_sku_locs( :stringdefault ).qty
|
|
59
|
+
assert_equal '2.12', skr_sku_locs( :stringdefault ).mac.to_s
|
|
60
|
+
|
|
61
|
+
assert ia.gl_transaction, "Missing GL Transaction?"
|
|
62
|
+
|
|
63
|
+
# credits inventory
|
|
64
|
+
assert_equal '27.6', ia.gl_transaction.credits.first.amount.to_s
|
|
65
|
+
assert_equal '110001', ia.gl_transaction.credits.first.account_number
|
|
66
|
+
|
|
67
|
+
# debits marketing (free reason code)
|
|
68
|
+
assert_equal '-27.6', ia.gl_transaction.debits.first.amount.to_s
|
|
69
|
+
assert_equal '610001', ia.gl_transaction.debits.first.account_number
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class InvoiceTest < Skr::TestCase
|
|
4
|
+
|
|
5
|
+
def test_create_from_pt
|
|
6
|
+
pt = skr_pick_tickets(:first)
|
|
7
|
+
pt.lines.each{|l| l.qty_to_ship = l.qty }
|
|
8
|
+
inv = Invoice.new
|
|
9
|
+
inv.pick_ticket = pt
|
|
10
|
+
inv.lines.from_pick_ticket!
|
|
11
|
+
assert_saves inv
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_applying_payments
|
|
15
|
+
inv = skr_invoices(:unpaid)
|
|
16
|
+
assert_equal 'open', inv.state
|
|
17
|
+
inv.amount_paid = inv.total-10.2
|
|
18
|
+
assert_difference ->{ GlAccount.default_for(:deposit_holding).trial_balance }, inv.total-10.2 do
|
|
19
|
+
assert_saves inv
|
|
20
|
+
assert_equal 'partial', inv.state
|
|
21
|
+
end
|
|
22
|
+
inv.amount_paid += 1.12
|
|
23
|
+
assert_difference ->{ GlAccount.default_for(:deposit_holding).trial_balance }, 1.12 do
|
|
24
|
+
assert_saves inv
|
|
25
|
+
assert_equal 'partial', inv.state
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
assert_difference ->{ GlAccount.default_for(:deposit_holding).trial_balance }, inv.unpaid_amount do
|
|
29
|
+
inv.amount_paid = inv.total
|
|
30
|
+
assert_saves inv
|
|
31
|
+
assert_equal 'paid', inv.state
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_applying_payments_while_saving
|
|
36
|
+
inv = Invoice.new({ customer: skr_customers(:argosity), location: skr_locations(:default) })
|
|
37
|
+
inv.lines.build({ sku_loc: skr_sku_locs(:hatdefault), qty: 1, price: 8 })
|
|
38
|
+
inv.lines.build({ sku_loc: skr_sku_locs(:glovedefault), qty: 1, price: 2 })
|
|
39
|
+
inv.amount_paid = inv.total
|
|
40
|
+
assert_difference ->{ GlAccount.default_for(:deposit_holding).trial_balance }, 10.0 do
|
|
41
|
+
assert_saves inv
|
|
42
|
+
assert_equal 'paid', inv.state
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_detail_view
|
|
47
|
+
inv = Invoice.with_details.where( id: skr_invoices(:unpaid).id ).first
|
|
48
|
+
assert_equal inv.sales_order.visible_id, inv.sales_order_visible_id
|
|
49
|
+
assert_equal 13.88, inv.total
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_create_from_sales_order
|
|
53
|
+
inv = Invoice.new( sales_order: skr_sales_orders(:picking) )
|
|
54
|
+
inv.lines.from_sales_order!
|
|
55
|
+
assert_saves inv
|
|
56
|
+
assert_equal 2, inv.lines.size
|
|
57
|
+
assert_equal 3.11, inv.lines.first.price
|
|
58
|
+
assert_equal 5, inv.lines.first.qty
|
|
59
|
+
assert_equal 18.94, inv.total
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|