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.
Files changed (221) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +6 -0
  4. data/Guardfile +13 -0
  5. data/LICENSE.txt +674 -0
  6. data/README.md +88 -0
  7. data/Rakefile +58 -0
  8. data/config/database.yml +9 -0
  9. data/db/migrate/20120110142845_create_skr_sequential_ids.rb +35 -0
  10. data/db/migrate/20140202185309_create_skr_gl_accounts.rb +15 -0
  11. data/db/migrate/20140202193316_create_skr_gl_periods.rb +16 -0
  12. data/db/migrate/20140202193318_create_skr_gl_transactions.rb +14 -0
  13. data/db/migrate/20140202193319_create_skr_gl_postings.rb +16 -0
  14. data/db/migrate/20140202193700_create_skr_gl_manual_entries.rb +13 -0
  15. data/db/migrate/20140213040608_create_skr_payment_terms.rb +16 -0
  16. data/db/migrate/20140220031700_create_skr_addresses.rb +19 -0
  17. data/db/migrate/20140220031800_create_skr_locations.rb +19 -0
  18. data/db/migrate/20140220190836_create_skr_vendors.rb +22 -0
  19. data/db/migrate/20140220203029_create_skr_customers.rb +22 -0
  20. data/db/migrate/20140224034759_create_skr_skus.rb +22 -0
  21. data/db/migrate/20140225032853_create_skr_sku_locs.rb +21 -0
  22. data/db/migrate/20140320030501_create_skr_uoms.rb +19 -0
  23. data/db/migrate/20140321031604_create_skr_sku_vendors.rb +18 -0
  24. data/db/migrate/20140322012143_create_skr_ia_reasons.rb +14 -0
  25. data/db/migrate/20140322014401_create_skr_inventory_adjustments.rb +16 -0
  26. data/db/migrate/20140322023453_create_skr_ia_lines.rb +18 -0
  27. data/db/migrate/20140322035024_create_skr_sku_trans.rb +21 -0
  28. data/db/migrate/20140322223912_create_skr_sales_orders.rb +27 -0
  29. data/db/migrate/20140322223920_create_skr_so_lines.rb +25 -0
  30. data/db/migrate/20140323001446_create_so_details_view.rb +81 -0
  31. data/db/migrate/20140327202102_create_skr_purchase_orders.rb +20 -0
  32. data/db/migrate/20140327202107_create_skr_po_lines.rb +25 -0
  33. data/db/migrate/20140327202207_create_skr_pick_tickets.rb +16 -0
  34. data/db/migrate/20140327202209_create_skr_pt_lines.rb +23 -0
  35. data/db/migrate/20140327224000_create_skr_invoices.rb +25 -0
  36. data/db/migrate/20140327224002_create_skr_inv_lines.rb +23 -0
  37. data/db/migrate/20140330232808_create_skr_sku_loc_details_view.rb +31 -0
  38. data/db/migrate/20140330232810_create_skr_sku_qty_details_view.rb +48 -0
  39. data/db/migrate/20140400164729_create_skr_vouchers.rb +22 -0
  40. data/db/migrate/20140400164733_create_skr_vo_lines.rb +21 -0
  41. data/db/migrate/20140401164729_create_skr_po_receipt.rb +16 -0
  42. data/db/migrate/20140401164740_create_skr_por_line.rb +21 -0
  43. data/db/migrate/20140422024010_create_skr_inv_details_view.rb +42 -0
  44. data/lib/generators/stockor/migrations/install_generator.rb +42 -0
  45. data/lib/skr/address.rb +97 -0
  46. data/lib/skr/business_entity.rb +25 -0
  47. data/lib/skr/concerns/acts_as_uom.rb +47 -0
  48. data/lib/skr/concerns/all.rb +30 -0
  49. data/lib/skr/concerns/association_extensions.rb +85 -0
  50. data/lib/skr/concerns/attr_accessor_with_default.rb +54 -0
  51. data/lib/skr/concerns/code_identifier.rb +43 -0
  52. data/lib/skr/concerns/export_associations.rb +52 -0
  53. data/lib/skr/concerns/export_join_tables.rb +39 -0
  54. data/lib/skr/concerns/export_methods.rb +104 -0
  55. data/lib/skr/concerns/export_scope.rb +66 -0
  56. data/lib/skr/concerns/exported_limit_evaluator.rb +17 -0
  57. data/lib/skr/concerns/gl_tran_extensions.rb +18 -0
  58. data/lib/skr/concerns/has_gl_transaction.rb +67 -0
  59. data/lib/skr/concerns/has_sku_loc_lines.rb +47 -0
  60. data/lib/skr/concerns/immutable_model.rb +32 -0
  61. data/lib/skr/concerns/inv_extensions.rb +24 -0
  62. data/lib/skr/concerns/is_order_like.rb +47 -0
  63. data/lib/skr/concerns/is_sku_loc_line.rb +65 -0
  64. data/lib/skr/concerns/json_attribute_access.rb +55 -0
  65. data/lib/skr/concerns/locked_fields.rb +84 -0
  66. data/lib/skr/concerns/pt_extensions.rb +22 -0
  67. data/lib/skr/concerns/pub_sub.rb +105 -0
  68. data/lib/skr/concerns/queries.rb +20 -0
  69. data/lib/skr/concerns/random_hash_code.rb +40 -0
  70. data/lib/skr/concerns/sanitize_json.rb +49 -0
  71. data/lib/skr/concerns/sku_extensions.rb +52 -0
  72. data/lib/skr/concerns/so_extensions.rb +30 -0
  73. data/lib/skr/concerns/state_machine.rb +62 -0
  74. data/lib/skr/concerns/track_modifications.rb +48 -0
  75. data/lib/skr/concerns/visible_id_identifier.rb +53 -0
  76. data/lib/skr/core.rb +30 -0
  77. data/lib/skr/core/configuration.rb +87 -0
  78. data/lib/skr/core/db.rb +82 -0
  79. data/lib/skr/core/db/migration_helpers.rb +178 -0
  80. data/lib/skr/core/db/migrations.rb +15 -0
  81. data/lib/skr/core/db/seed.rb +46 -0
  82. data/lib/skr/core/db/seed/chart_of_accounts.yml +168 -0
  83. data/lib/skr/core/db/seed/payment_terms.yml +60 -0
  84. data/lib/skr/core/logger.rb +36 -0
  85. data/lib/skr/core/numbers.rb +71 -0
  86. data/lib/skr/core/rails_engine.rb +5 -0
  87. data/lib/skr/core/standard_pricing_provider.rb +15 -0
  88. data/lib/skr/core/strings.rb +57 -0
  89. data/lib/skr/core/testing.rb +11 -0
  90. data/lib/skr/core/testing/assertions.rb +44 -0
  91. data/lib/skr/core/testing/fixtures.rb +25 -0
  92. data/lib/skr/core/testing/fixtures/skr/addresses.yml +53 -0
  93. data/lib/skr/core/testing/fixtures/skr/customers.yml +43 -0
  94. data/lib/skr/core/testing/fixtures/skr/gl_accounts.yml +86 -0
  95. data/lib/skr/core/testing/fixtures/skr/gl_manual_entries.yml +4 -0
  96. data/lib/skr/core/testing/fixtures/skr/gl_periods.yml +26 -0
  97. data/lib/skr/core/testing/fixtures/skr/gl_postings.yml +88 -0
  98. data/lib/skr/core/testing/fixtures/skr/gl_transactions.yml +35 -0
  99. data/lib/skr/core/testing/fixtures/skr/ia_lines.yml +7 -0
  100. data/lib/skr/core/testing/fixtures/skr/ia_reasons.yml +15 -0
  101. data/lib/skr/core/testing/fixtures/skr/inv_lines.yml +22 -0
  102. data/lib/skr/core/testing/fixtures/skr/inventory_adjustments.yml +6 -0
  103. data/lib/skr/core/testing/fixtures/skr/invoices.yml +10 -0
  104. data/lib/skr/core/testing/fixtures/skr/locations.yml +24 -0
  105. data/lib/skr/core/testing/fixtures/skr/payment_terms.yml +42 -0
  106. data/lib/skr/core/testing/fixtures/skr/pick_tickets.yml +4 -0
  107. data/lib/skr/core/testing/fixtures/skr/po_lines.yml +44 -0
  108. data/lib/skr/core/testing/fixtures/skr/po_receipts.yml +5 -0
  109. data/lib/skr/core/testing/fixtures/skr/por_lines.yml +13 -0
  110. data/lib/skr/core/testing/fixtures/skr/pt_lines.yml +12 -0
  111. data/lib/skr/core/testing/fixtures/skr/purchase_orders.yml +16 -0
  112. data/lib/skr/core/testing/fixtures/skr/sales_orders.yml +32 -0
  113. data/lib/skr/core/testing/fixtures/skr/sku_locs.yml +78 -0
  114. data/lib/skr/core/testing/fixtures/skr/sku_trans.yml +9 -0
  115. data/lib/skr/core/testing/fixtures/skr/sku_vendors.yml +35 -0
  116. data/lib/skr/core/testing/fixtures/skr/skus.yml +50 -0
  117. data/lib/skr/core/testing/fixtures/skr/so_lines.yml +71 -0
  118. data/lib/skr/core/testing/fixtures/skr/uoms.yml +61 -0
  119. data/lib/skr/core/testing/fixtures/skr/vendors.yml +48 -0
  120. data/lib/skr/core/testing/fixtures/skr/vo_lines.yml +12 -0
  121. data/lib/skr/core/testing/fixtures/skr/vouchers.yml +8 -0
  122. data/lib/skr/core/testing/helper.rb +18 -0
  123. data/lib/skr/core/testing/test_case.rb +17 -0
  124. data/lib/skr/core/version.rb +5 -0
  125. data/lib/skr/customer.rb +34 -0
  126. data/lib/skr/gl_account.rb +56 -0
  127. data/lib/skr/gl_manual_entry.rb +31 -0
  128. data/lib/skr/gl_period.rb +13 -0
  129. data/lib/skr/gl_posting.rb +54 -0
  130. data/lib/skr/gl_transaction.rb +174 -0
  131. data/lib/skr/ia_line.rb +129 -0
  132. data/lib/skr/ia_reason.rb +16 -0
  133. data/lib/skr/inv_line.rb +90 -0
  134. data/lib/skr/inventory_adjustment.rb +60 -0
  135. data/lib/skr/invoice.rb +159 -0
  136. data/lib/skr/location.rb +31 -0
  137. data/lib/skr/model.rb +37 -0
  138. data/lib/skr/null_user.rb +30 -0
  139. data/lib/skr/payment_term.rb +30 -0
  140. data/lib/skr/pick_ticket.rb +71 -0
  141. data/lib/skr/po_line.rb +69 -0
  142. data/lib/skr/po_receipt.rb +51 -0
  143. data/lib/skr/por_line.rb +80 -0
  144. data/lib/skr/pt_line.rb +74 -0
  145. data/lib/skr/purchase_order.rb +112 -0
  146. data/lib/skr/sales_order.rb +159 -0
  147. data/lib/skr/sequential_id.rb +23 -0
  148. data/lib/skr/sku.rb +99 -0
  149. data/lib/skr/sku_loc.rb +94 -0
  150. data/lib/skr/sku_tran.rb +111 -0
  151. data/lib/skr/sku_vendor.rb +26 -0
  152. data/lib/skr/so_line.rb +159 -0
  153. data/lib/skr/uom.rb +63 -0
  154. data/lib/skr/user_proxy.rb +60 -0
  155. data/lib/skr/validators/all.rb +2 -0
  156. data/lib/skr/validators/email.rb +17 -0
  157. data/lib/skr/validators/set.rb +18 -0
  158. data/lib/skr/vendor.rb +33 -0
  159. data/lib/skr/vo_line.rb +35 -0
  160. data/lib/skr/voucher.rb +119 -0
  161. data/lib/stockor/core.rb +9 -0
  162. data/stockor-core.gemspec +37 -0
  163. data/tasks/migrations.rake +23 -0
  164. data/tasks/publish.rake +8 -0
  165. data/test/address_test.rb +57 -0
  166. data/test/concerns/attr_with_default_test.rb +45 -0
  167. data/test/concerns/code_identifier_test.rb +46 -0
  168. data/test/concerns/export_associations_test.rb +7 -0
  169. data/test/concerns/export_methods_test.rb +31 -0
  170. data/test/concerns/export_scope_test.rb +16 -0
  171. data/test/concerns/exported_limits_test.rb +47 -0
  172. data/test/concerns/json_attribute_access_test.rb +27 -0
  173. data/test/concerns/pub_sub_test.rb +83 -0
  174. data/test/concerns/sanitize_json_test.rb +47 -0
  175. data/test/core/configuration_test.rb +24 -0
  176. data/test/core/numbers_test.rb +26 -0
  177. data/test/core/strings_test.rb +41 -0
  178. data/test/customer_test.rb +34 -0
  179. data/test/gl_account_test.rb +23 -0
  180. data/test/gl_manual_entry_test.rb +17 -0
  181. data/test/gl_period_test.rb +12 -0
  182. data/test/gl_posting_test.rb +39 -0
  183. data/test/gl_transaction_test.rb +58 -0
  184. data/test/ia_line_test.rb +68 -0
  185. data/test/ia_reason_test.rb +11 -0
  186. data/test/inv_line_test.rb +58 -0
  187. data/test/inventory_adjustment_test.rb +72 -0
  188. data/test/invoice_test.rb +63 -0
  189. data/test/location_test.rb +10 -0
  190. data/test/payment_term_test.rb +25 -0
  191. data/test/pick_ticket_test.rb +27 -0
  192. data/test/po_line_test.rb +36 -0
  193. data/test/po_receipt_test.rb +93 -0
  194. data/test/por_line_test.rb +79 -0
  195. data/test/pt_line_test.rb +29 -0
  196. data/test/purchase_order_test.rb +44 -0
  197. data/test/sales_order_test.rb +74 -0
  198. data/test/sku_loc_test.rb +50 -0
  199. data/test/sku_test.rb +45 -0
  200. data/test/sku_tran_test.rb +21 -0
  201. data/test/sku_vendor_test.rb +13 -0
  202. data/test/so_line_test.rb +89 -0
  203. data/test/test_helper.rb +1 -0
  204. data/test/uom_test.rb +14 -0
  205. data/test/vendor_test.rb +35 -0
  206. data/test/vo_line_test.rb +20 -0
  207. data/test/voucher_test.rb +35 -0
  208. data/yard_ext/all.rb +9 -0
  209. data/yard_ext/code_identifier_handler.rb +33 -0
  210. data/yard_ext/concern_meta_methods.rb +60 -0
  211. data/yard_ext/config_options.rb +27 -0
  212. data/yard_ext/exported_scope.rb +4 -0
  213. data/yard_ext/immutable_handler.rb +17 -0
  214. data/yard_ext/json_attr_accessor.rb +22 -0
  215. data/yard_ext/locked_fields_handler.rb +21 -0
  216. data/yard_ext/templates/default/layout/html/layout.erb +20 -0
  217. data/yard_ext/templates/default/method_details/html/github_link.erb +1 -0
  218. data/yard_ext/templates/default/method_details/setup.rb +3 -0
  219. data/yard_ext/validators.rb +1 -0
  220. data/yard_ext/visible_id_handler.rb +38 -0
  221. 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,11 @@
1
+ require_relative 'test_helper'
2
+
3
+ class IaReasonTest < Skr::TestCase
4
+
5
+ def test_gl_posting
6
+ il = skr_inventory_adjustments(:first)
7
+ il.state.must_equal 'pending'
8
+ il.mark_applied
9
+ end
10
+
11
+ 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