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,10 @@
1
+ require_relative 'test_helper'
2
+
3
+ class LocationTest < Skr::TestCase
4
+
5
+ def test_it_copies_branch
6
+ loc = Location.new
7
+ assert_equal '01', loc.gl_branch_code
8
+ end
9
+
10
+ end
@@ -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