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
data/test/sku_test.rb ADDED
@@ -0,0 +1,45 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SkuTest < Skr::TestCase
4
+
5
+ def test_locations
6
+ sku = skr_skus(:string)
7
+ assert_equal 2, sku.sku_locs.length
8
+ assert sku.sku_locs.find_or_create_for( skr_locations(:surplus) )
9
+ loc = skr_locations(:amazon)
10
+ refute sku.sku_locs.where( location: loc ).first
11
+ assert sku.sku_locs.find_or_create_for( loc )
12
+ end
13
+
14
+ def test_vendors
15
+ sku = skr_skus(:glove)
16
+ assert sku.sku_vendors.default
17
+ assert_equal skr_sku_vendors(:glove_bigco), sku.sku_vendors.default
18
+ end
19
+
20
+ def test_uoms
21
+ sku = skr_skus(:hat)
22
+ assert sku.uoms.default
23
+ end
24
+
25
+
26
+ def test_auto_location_creation
27
+ sku=Sku.new({ :code=>'Test', :description=>'A Long Description' })
28
+ sku.sku_vendors.build({
29
+ part_code: 'TESTHAT', vendor: skr_vendors(:bigco),
30
+ list_price: 0.42, cost: 0.34, uom_size: 1, uom_code: 'EA' })
31
+ sku.default_uom_code = 'EA'
32
+ assert_empty sku.sku_locs
33
+ assert_saves sku
34
+ refute_empty sku.sku_locs
35
+ end
36
+
37
+ def test_scopes
38
+ assert_equal skr_skus(:string), Sku.with_vendor_part_code( 'STRINGBALL' ).first
39
+ assert Sku.in_location( skr_locations(:amazon) ).where( code: 'HAT' ).first
40
+ sku=Sku.with_qty_details.where( code: 'HAT' ).first
41
+ assert_equal 25, sku.qty_on_orders
42
+ assert_equal 35, sku.qty_on_hand
43
+ assert_equal 4, sku.qty_incoming
44
+ end
45
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SkuTranTest < Skr::TestCase
4
+
5
+ def test_origin
6
+ ia = skr_inventory_adjustments(:first)
7
+ assert ia.mark_applied, "failed to mark as applied"
8
+ st = ia.lines.first.sku_tran
9
+ assert st, "SkuTran wasn't created"
10
+ assert_match( /^IA/, st.origin_description )
11
+ end
12
+
13
+ # def test_eq_qty
14
+ # st = SkuTran.new( qty: 8 )
15
+ # assert_equal 8, st.ea_qty
16
+
17
+ # st = SkuTran.new( uom: Skr::Uom.new( size: 10 ), qty: 8 )
18
+ # assert_equal 80, st.ea_qty
19
+ # end
20
+
21
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SkuVendorTest < Skr::TestCase
4
+
5
+ def test_associations
6
+ sv = skr_sku_vendors(:hat_bigco)
7
+ assert_equal sv.vendor, skr_vendors(:bigco)
8
+ assert_equal sv.sku, skr_skus(:hat)
9
+ skr_skus(:hat).sku_vendors.where( part_code: sv.part_code ).first.must_equal sv
10
+ skr_vendors(:bigco).sku_vendors.where( vendor_id: sv.vendor, part_code: sv.part_code ).first.must_equal sv
11
+ end
12
+
13
+ end
@@ -0,0 +1,89 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SoLineTest < Skr::TestCase
4
+
5
+
6
+ def test_creation
7
+ sol = SoLine.new({
8
+ sales_order: skr_sales_orders(:first),
9
+ sku_loc: skr_sku_locs(:hatdefault),
10
+ description:'A Test', price: 12.42
11
+ })
12
+ sol.uom = skr_uoms('HATEA')
13
+ assert_saves sol
14
+ end
15
+
16
+ def test_scopes
17
+ sol = skr_so_lines(:first_string)
18
+ sol.sku_loc.allocate_available_qty!
19
+ assert_equal 3, SoLine.open.count
20
+ assert_equal 3, SoLine.allocated.count
21
+ assert_equal 2, SoLine.unallocated.count
22
+ assert_equal 1, SoLine.pickable.count
23
+ end
24
+
25
+ def test_allocation
26
+ so = SalesOrder.new({ customer: skr_customers(:argosity) })
27
+ sku_loc = skr_sku_locs(:hatdefault)
28
+ assert_equal 20, sku_loc.qty_available
29
+ so.lines.build({ qty: 2, :price=>2.22, sku_loc: sku_loc })
30
+ assert_difference 'sku_loc.reload.qty_allocated',2 do
31
+ assert_saves so
32
+ end
33
+ end
34
+
35
+ def test_overcreate_prevented
36
+ so = skr_sales_orders(:first)
37
+ skr_sku_locs(:stringdefault).allocate_available_qty!
38
+ pt = so.pick_tickets.build
39
+
40
+ refute_empty pt.lines
41
+ assert_saves pt
42
+
43
+ empty_pt = so.pick_tickets.build
44
+ assert_empty empty_pt.lines
45
+ refute_saves empty_pt
46
+
47
+ # This is a corner case
48
+ # if the pt is created without referencing the SO
49
+ # it can sneak through. Not sure if we should prevent
50
+ # this or not, I mean.. maybe you want/need this?
51
+ manual_pt = PickTicket.new( sales_order: so )
52
+ manual_pt.lines.build({
53
+ so_line: pt.lines.first.so_line
54
+ })
55
+ assert_saves manual_pt
56
+ end
57
+
58
+ def test_backorders
59
+ so = skr_sales_orders(:first)
60
+ assert_equal 1, so.lines.count
61
+ assert_equal 1, so.lines.unallocated.count
62
+ line = so.lines.first
63
+ line.update_attributes :qty_allocated => line.qty
64
+ assert_equal 0, so.lines.unallocated.count
65
+
66
+ line = skr_sales_orders(:picking).lines.unallocated.first
67
+ assert line
68
+ line.update_attributes :qty_allocated => line.qty, :qty_picking=>line.qty
69
+ assert_equal 1, line = skr_sales_orders(:picking).lines.unallocated.count
70
+ assert_equal 0, skr_sales_orders(:complete).lines.unallocated.count
71
+ end
72
+
73
+ def test_picking_qty
74
+ sol = skr_so_lines(:first_string)
75
+ sol.sku_loc.allocate_available_qty!
76
+ pt = sol.sales_order.pick_tickets.build
77
+ assert_saves pt
78
+ assert_equal 2, sol.reload.qty_picking
79
+ end
80
+
81
+ def test_invoice_qty
82
+ so = skr_sales_orders(:first)
83
+ inv = Invoice.new( sales_order: so )
84
+ inv.lines.from_sales_order!
85
+ assert_saves inv
86
+ assert_equal inv.lines.first.qty, so.lines.first.qty_invoiced
87
+ end
88
+
89
+ end
@@ -0,0 +1 @@
1
+ require 'skr/core/testing/helper'
data/test/uom_test.rb ADDED
@@ -0,0 +1,14 @@
1
+ require_relative 'test_helper'
2
+
3
+ class UomTest < Skr::TestCase
4
+
5
+
6
+ def test_combining
7
+ uom = Uom.new
8
+ uom.size = 1
9
+ uom.code = 'BOX'
10
+ assert_equal 'BOX', uom.combined_uom
11
+ uom.size = 10
12
+ assert_equal 'BOX/10', uom.combined_uom
13
+ end
14
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'test_helper'
2
+
3
+ class VendorTest < Skr::TestCase
4
+
5
+ def setup
6
+ @vendor = Vendor.new({
7
+ code: 'TEST',
8
+ name: 'Mr Test Co',
9
+ billing_address: skr_addresses(:bigco),
10
+ shipping_address: skr_addresses(:bigco),
11
+ terms: skr_payment_terms(:net30)
12
+ })
13
+ end
14
+
15
+ def test_saving
16
+ assert @vendor.save
17
+ end
18
+
19
+ def test_it_sets_gl
20
+ assert @vendor.save
21
+ assert_equal '2200', @vendor.gl_payables_account.number
22
+ end
23
+
24
+ def test_creating
25
+ vendor = Vendor.find_by_code "BIGCO"
26
+ po = PurchaseOrder.new( vendor: vendor )
27
+ Sku.where( code: ['HAT','STRING'] ).each do | sku |
28
+ po.lines.build(
29
+ sku_vendor: sku.sku_vendors.for_vendor( vendor )
30
+ )
31
+ end
32
+ po.save
33
+
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'test_helper'
2
+
3
+
4
+ class VoucherLineTest < Skr::TestCase
5
+
6
+
7
+ def test_gl_posting
8
+ acct = GlAccount.default_for( :inventory_receipts_clearing )
9
+ po = skr_purchase_orders(:first)
10
+
11
+ v = Voucher.new({ :purchase_order => po })
12
+ old_balance = acct.trial_balance
13
+ po.lines.each do | poline |
14
+ v.lines.build({ :po_line => poline })
15
+ end
16
+ assert_saves v
17
+ assert_equal old_balance - v.total, acct.trial_balance
18
+ end
19
+
20
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'test_helper'
2
+
3
+
4
+ class VoucherTest < Skr::TestCase
5
+
6
+
7
+
8
+ def test_creation
9
+ por = skr_po_receipts(:first)
10
+ assert por.vendor
11
+ v = Voucher.new({ po_receipt: por })
12
+ por.lines.each do | por_line |
13
+ v.lines.build({ po_line: por_line.po_line })
14
+ end
15
+ assert_saves v
16
+ end
17
+
18
+ def test_state_transistions
19
+ v=Voucher.new({ :po_receipt => skr_po_receipts(:first) })
20
+ v.lines.build({
21
+ :po_line => skr_po_lines(:second_on_first)
22
+ })
23
+ assert_saves v
24
+
25
+ acct = v.vendor.gl_payables_account
26
+ before = acct.trial_balance
27
+ assert_equal 'pending', v.state
28
+ assert_difference 'acct.trial_balance', before - v.total do
29
+ v.mark_confirmed
30
+ assert_saves v
31
+ end
32
+
33
+ end
34
+
35
+ end
data/yard_ext/all.rb ADDED
@@ -0,0 +1,9 @@
1
+ require_relative 'validators'
2
+ require_relative 'config_options'
3
+ require_relative 'concern_meta_methods'
4
+ require_relative 'exported_scope'
5
+ require_relative 'visible_id_handler'
6
+ require_relative 'code_identifier_handler'
7
+ require_relative 'immutable_handler'
8
+ require_relative 'locked_fields_handler'
9
+ require_relative 'json_attr_accessor'
@@ -0,0 +1,33 @@
1
+ class CodeIdentifierHandler < SkrMetaMethodHandler
2
+
3
+ namespace_only
4
+ handles method_call(:has_code_identifier)
5
+
6
+ def process
7
+ super
8
+ add_to_overview
9
+
10
+
11
+ params = statement.parameters
12
+ if params.size > 1
13
+ params.pop
14
+ params.detect{ | param |
15
+ param.jump(:hash).source =~ /(:from\s*=>|from:)\s*["':]([^\W]+)/
16
+ }
17
+ namespace.docstring += "\n\nIf left blank, the {#code} field will be set by sending the {##{$2}} field through {Skr::Core::Strings.code_identifier}"
18
+ end
19
+
20
+ end
21
+
22
+ def concern_path
23
+ "Skr::Concerns::CodeIdentifier"
24
+ end
25
+
26
+ def method_name
27
+ :has_code_identifier
28
+ end
29
+
30
+ def method_title
31
+ 'Has Code Identifier'
32
+ end
33
+ end
@@ -0,0 +1,60 @@
1
+ class SkrMetaMethodHandler < YARD::Handlers::Ruby::MethodHandler
2
+
3
+ def process
4
+ if group_name
5
+ namespace.groups << group_name unless namespace.groups.include? group_name
6
+ end
7
+ end
8
+
9
+ def get_namespace( path )
10
+ ensure_loaded! P( path )
11
+ P( path )
12
+ end
13
+
14
+ def get_method( ns )
15
+ end
16
+
17
+ def add_to_overview
18
+ ns = get_namespace( concern_path + "::ClassMethods" )
19
+ method = ns.meths.detect{ |nsmethod| nsmethod.name == method_name }
20
+
21
+ namespace.docstring += "\n\n" +
22
+ "## #{method_title} {#{ns} >>}\n\n" +
23
+ method.docstring.dup
24
+
25
+ method.docstring.tags.each{ |tag| namespace.docstring.add_tag tag }
26
+ end
27
+
28
+ def add_instance_methods
29
+ ns = get_namespace( concern_path + "::InstanceMethods" )
30
+ ns.meths.each do |nsmethod|
31
+ object = YARD::CodeObjects::MethodObject.new(namespace, nsmethod.name )
32
+ object.scope = :instance
33
+ object.explicit = false
34
+
35
+ object.docstring = nsmethod.docstring.dup
36
+ register object
37
+ end
38
+ end
39
+
40
+ def add_class_methods
41
+ ns = get_namespace( concern_path + "::MixedInClassMethods" )
42
+
43
+ ns.meths.each do |nsmethod|
44
+ object = YARD::CodeObjects::MethodObject.new(namespace, nsmethod.name )
45
+ object.scope = :instance
46
+ object.explicit = false
47
+
48
+ object.docstring = nsmethod.docstring.dup
49
+ register object
50
+ end
51
+ end
52
+
53
+ def method_title
54
+ method_name.to_s.titleize
55
+ end
56
+
57
+ def group_name
58
+ end
59
+
60
+ end
@@ -0,0 +1,27 @@
1
+ class ConfigOptionHandler < YARD::Handlers::Ruby::Base
2
+ handles method_call(:config_option)
3
+ namespace_only
4
+
5
+ def process
6
+
7
+ name = statement.parameters.first.jump(:tsymbol_content, :ident).source
8
+ object = YARD::CodeObjects::MethodObject.new(namespace, name)
9
+
10
+ param_size = statement.parameters.size
11
+ default = statement.parameters[ param_size - 2 ]
12
+
13
+ object.parameters = [['default',default.source]]
14
+
15
+ # modify the object
16
+ object.dynamic = true
17
+
18
+ register(object)
19
+ unless object.docstring.has_tag?(:return)
20
+ object.docstring.add_tag YARD::Tags::Tag.new( :return, "defaults to #{default.source}", [ default.type.to_s.sub(/_.*$/,'').capitalize ])
21
+ end
22
+ end
23
+ def get_tag(tag, text, return_classes = [])
24
+ YARD::Tags::Tag.new(tag, text, [return_classes].flatten)
25
+ end
26
+
27
+ end
@@ -0,0 +1,4 @@
1
+ class ExportedScopeHandler < YARD::Handlers::Ruby::ActiveRecord::Scopes::ScopeHandler
2
+ handles method_call(:export_scope)
3
+ namespace_only
4
+ end
@@ -0,0 +1,17 @@
1
+ class ImmutableHandler < SkrMetaMethodHandler
2
+
3
+ namespace_only
4
+ handles method_call(:is_immutable)
5
+
6
+ def process
7
+ add_to_overview
8
+ end
9
+
10
+ def concern_path
11
+ "Skr::Concerns::ImmutableModel"
12
+ end
13
+
14
+ def method_name
15
+ :is_immutable
16
+ end
17
+ end