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,9 @@
1
+
2
+ free_adj:
3
+ origin: first(Skr::InventoryAdjustment)
4
+ sku_loc: hatdefault
5
+ cost: 3.22
6
+ origin_description: 'IA Adj'
7
+ prior_qty: 25
8
+ mac: 0.64
9
+ prior_mac: 0.64
@@ -0,0 +1,35 @@
1
+ string_bigco:
2
+ sku: string
3
+ vendor: bigco
4
+ part_code: STRINGBALL
5
+ list_price: 12.42
6
+ cost: 8.33
7
+ uom_size: 100
8
+ uom_code: FT
9
+
10
+ hat_bigco:
11
+ sku: hat
12
+ vendor: bigco
13
+ part_code: "Hat 'O Glory"
14
+ list_price: 42.42
15
+ cost: 34.33
16
+ uom_size: 10
17
+ uom_code: BX
18
+
19
+ glove_bigco:
20
+ sku: glove
21
+ vendor: bigco
22
+ part_code: GLOVEYDOVEY
23
+ list_price: 42.42
24
+ cost: 34.33
25
+ uom_size: 10
26
+ uom_code: BX
27
+
28
+ glove_bob:
29
+ sku: glove
30
+ vendor: bob
31
+ part_code: BLACKGLOVE
32
+ list_price: 138.42
33
+ cost: 88.33
34
+ uom_size: 100
35
+ uom_code: CASE
@@ -0,0 +1,50 @@
1
+
2
+ hat:
3
+ code: HAT
4
+ description: A Large Top Hat
5
+ default_vendor: bigco
6
+ default_uom_code: EA
7
+ is_other_charge: false
8
+ does_track_inventory: true
9
+ gl_asset_account: inventory
10
+ can_backorder: false
11
+
12
+ glove:
13
+ code: GLOVE
14
+ description: A small black riding glove
15
+ default_vendor: bigco
16
+ default_uom_code: PR
17
+ is_other_charge: false
18
+ does_track_inventory: true
19
+ gl_asset_account: inventory
20
+ can_backorder: false
21
+
22
+ string:
23
+ code: STRING
24
+ description: A bunch of string
25
+ default_vendor: bigco
26
+ default_uom_code: FT
27
+ is_other_charge: false
28
+ does_track_inventory: true
29
+ gl_asset_account: inventory
30
+ can_backorder: false
31
+
32
+ tax:
33
+ code: TAX
34
+ is_other_charge: true
35
+ does_track_inventory: false
36
+ description: Sales Tax
37
+ default_vendor: bigco
38
+ default_uom_code: EA
39
+ gl_asset_account: tax
40
+ can_backorder: false
41
+
42
+ ship:
43
+ code: SHIP
44
+ is_other_charge: true
45
+ does_track_inventory: false
46
+ description: Sales Ship
47
+ default_vendor: bigco
48
+ default_uom_code: EA
49
+ gl_asset_account: ship
50
+ can_backorder: false
@@ -0,0 +1,71 @@
1
+
2
+ first_string:
3
+ sales_order: first
4
+ sku_loc: stringdefault
5
+ sku_code: STRING
6
+ description: Some String, custom color AQUA
7
+ uom_code: YARD
8
+ uom_size: 3
9
+ position: 1
10
+ price: 1.42
11
+ qty_picking: 0
12
+ qty: 2
13
+ qty_allocated: 0
14
+ qty_invoiced: 0
15
+
16
+ picking_hat:
17
+ sales_order: picking
18
+ sku_loc: hatdefault
19
+ sku_code: HAT
20
+ description: A first Item
21
+ uom_code: EA
22
+ uom_size: 1
23
+ position: 2
24
+ price: 1.42
25
+ qty: 25
26
+ qty_allocated: 5
27
+ qty_picking: 5
28
+ qty_invoiced: 0
29
+
30
+ picking_glove:
31
+ sales_order: picking
32
+ sku_loc: glovedefault
33
+ sku_code: GLOVE
34
+ description: Lily White Gloves
35
+ uom_code: PR
36
+ uom_size: 1
37
+ position: 2
38
+ price: 3.39
39
+ qty: 20
40
+ qty_allocated: 1
41
+ qty_picking: 1
42
+ qty_invoiced: 0
43
+
44
+
45
+ complete_hat:
46
+ sales_order: complete
47
+ sku_code: HAT
48
+ sku_loc: hatdefault
49
+ description: Top Hat
50
+ uom_code: EA
51
+ uom_size: 1
52
+ position: 1
53
+ price: 1.42
54
+ qty: 5
55
+ qty_allocated: 0
56
+ qty_picking: 0
57
+ qty_invoiced: 5
58
+
59
+ complete_glove:
60
+ sales_order: complete
61
+ sku_loc: glovedefault
62
+ sku_code: GLOVE
63
+ description: Lily White Gloves
64
+ uom_code: PR
65
+ uom_size: 1
66
+ position: 2
67
+ price: 3.39
68
+ qty: 2
69
+ qty_allocated: 0
70
+ qty_picking: 0
71
+ qty_invoiced: 2
@@ -0,0 +1,61 @@
1
+
2
+
3
+ HATEA:
4
+ sku: hat
5
+ size: 1
6
+ code: EA
7
+ price: 3.11
8
+ weight: 1.8
9
+ height: 12
10
+ width: 8
11
+ depth: 1.2
12
+
13
+ HATCA:
14
+ sku: hat
15
+ size: 20
16
+ code: CASE
17
+ price: 3.23
18
+ weight: 21.9
19
+ height: 22
20
+ width: 22
21
+ depth: 28
22
+
23
+ GLOVEPR:
24
+ sku: glove
25
+ size: 1
26
+ code: PR
27
+ price: 3.39
28
+ weight: 0.8
29
+ height: 10
30
+ width: 5
31
+ depth: 0.2
32
+
33
+ GLOVECA:
34
+ sku: glove
35
+ size: 10
36
+ code: CA
37
+ price: 13.39
38
+ weight: 0.8
39
+ height: 10
40
+ width: 5
41
+ depth: 0.2
42
+
43
+ STRINGFT:
44
+ sku: string
45
+ size: 1
46
+ code: FT
47
+ price: 0.11
48
+ weight: 0.1
49
+ height: 12
50
+ width: 0.1
51
+ depth: 0.1
52
+
53
+ STRINGYARD:
54
+ sku: string
55
+ size: 3
56
+ code: YARD
57
+ price: 0.87
58
+ weight: 0.2
59
+ height: 12
60
+ width: 0.1
61
+ depth: 0.1
@@ -0,0 +1,48 @@
1
+
2
+
3
+ bigco:
4
+ code: BIGCO
5
+ name: Mr Bob
6
+ terms: default_test
7
+ gl_payables_account: ap
8
+ gl_freight_account: shipping
9
+ billing_address: bigco
10
+ shipping_address: bigco_wh
11
+
12
+ unused:
13
+ code: UNUSED
14
+ terms: default_test
15
+ name: Mr Unused Person
16
+ gl_payables_account: ap
17
+ gl_freight_account: shipping
18
+ billing_address: bigco
19
+ shipping_address: bigco_wh
20
+
21
+ bob:
22
+ code: BOB
23
+ terms: default_test
24
+ name: Mr Bob
25
+ gl_payables_account: ap
26
+ gl_freight_account: shipping
27
+ billing_address: bigco
28
+ shipping_address: bigco_wh
29
+
30
+ demo:
31
+ code: Demo
32
+ terms: default_test
33
+ name: Mr Bob
34
+ gl_payables_account: ap
35
+ gl_freight_account: shipping
36
+ billing_address: bigco
37
+ shipping_address: bigco_wh
38
+
39
+ joe:
40
+ code: Sam
41
+ terms: default_bob
42
+ gl_payables_account: ap
43
+ gl_freight_account: shipping
44
+ billing_address: joe
45
+ shipping_address: joe
46
+ name: Joe Man
47
+
48
+
@@ -0,0 +1,12 @@
1
+
2
+ first:
3
+ voucher: first
4
+ sku_vendor: hat_bigco
5
+ qty: 3
6
+ uom_code: EA
7
+ uom_size: 1
8
+ price: 1.42
9
+ sku_code: HAT
10
+ part_code: "Hat 'O Glory"
11
+ description: A hatty hat
12
+ position: 1
@@ -0,0 +1,8 @@
1
+
2
+
3
+ first:
4
+ purchase_order: first
5
+ terms: net30
6
+ state: pending
7
+ vendor: bigco
8
+ confirmation_date: <%= Date.today - 1.week %>
@@ -0,0 +1,18 @@
1
+ require 'minitest/autorun'
2
+ require 'skr/core'
3
+
4
+ require 'active_record'
5
+ require 'active_record/fixtures'
6
+ require_relative "../../core"
7
+
8
+ ENV["RAILS_ENV"] = "test"
9
+ RAILS_ENV = "test"
10
+ I18n.enforce_available_locales = true
11
+ Skr::Core::DB.establish_connection('test')
12
+ Skr::Core.logger=Logger.new( File.open('log/test.log', File::WRONLY | File::APPEND | File::CREAT ))
13
+ ActiveRecord::Base.logger = Skr::Core.logger
14
+ ActiveSupport::Dependencies.mechanism = :require
15
+
16
+ require_relative 'assertions'
17
+ require_relative 'fixtures'
18
+ require_relative 'test_case'
@@ -0,0 +1,17 @@
1
+ module Skr
2
+
3
+ class TestCase < ActiveSupport::TestCase
4
+ include ActiveRecord::TestFixtures
5
+ include Skr
6
+
7
+ setup do
8
+ Thread.current[:skr_user_proxy] = Skr::NullUser.new
9
+ end
10
+
11
+ self.fixture_path = Skr::Core::Testing.fixtures_path
12
+ self.use_transactional_fixtures = true
13
+
14
+ fixtures :all
15
+ end
16
+
17
+ end
@@ -0,0 +1,5 @@
1
+ module Skr
2
+ module Core
3
+ VERSION = "0.2"
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ module Skr
2
+
3
+ # Customers are Companies (or individuals) that purchase {Sku}s.
4
+ # They have both a billing and shipping address,
5
+ # a gl account that payments should be applied against, and a payment term.
6
+ #
7
+ class Customer < Skr::Model
8
+
9
+ # Common code shared with {Vendor}
10
+ include BusinessEntity
11
+
12
+ belongs_to :gl_receivables_account, class_name: 'Skr::GlAccount', export: true
13
+
14
+ has_many :sales_orders, inverse_of: :customer
15
+ has_many :invoices, inverse_of: :customer, listen: { save: :update_balance! }
16
+
17
+ delegate_and_export :gl_receivables_account_number
18
+
19
+ validates :gl_receivables_account, set: true
20
+
21
+ # Updates the amount the customer owes, which is the sum of the amount unpaid on open invoices
22
+ def update_balance!(*)
23
+ update_attributes open_balance: invoices.open_for_customer(self)
24
+ .with_details.sum('details.total')
25
+ end
26
+
27
+ private
28
+
29
+ def set_defaults
30
+ self.terms ||= PaymentTerm.find_by_code(Core.config.customer_terms_code)
31
+ self.gl_receivables_account ||= GlAccount.default_for( :ar )
32
+ end
33
+ end
34
+ end # Skr module
@@ -0,0 +1,56 @@
1
+ module Skr
2
+
3
+ # A GlAccount *(short for General Ledger Account)* is used
4
+ # to define each class of items for
5
+ # which money or the equivalent is spent or received.
6
+ class GlAccount < Skr::Model
7
+
8
+ # @private
9
+ DEFAULT_ACCOUNTS = {}
10
+
11
+ is_immutable except: [:name, :is_active]
12
+
13
+ validates :name, :description, :presence => true
14
+
15
+ # @!attribute description
16
+ # A short description of the GL Account
17
+
18
+ # A future improvement would be to allow arbitrary account masks. For now, keep it simple
19
+ # with mandatory 4 characters + 2 char branch code
20
+ validates :number, :presence => true, :numericality=>true, :length=>{ :is=>4 }
21
+
22
+ # @return [GlAccount] the default account for the key from {Skr::Core::Configuration.default_gl_accounts}
23
+ def self.default_for( lookup )
24
+ number = Core.config.default_gl_accounts[ lookup ]
25
+ raise RuntimeError.new("Unkown GL default account lookup code: {lookup}") unless number
26
+ DEFAULT_ACCOUNTS[ lookup ] ||= GlAccount.find_by_number( number )
27
+ end
28
+
29
+ # @return [String] the account number combined with location branch code
30
+ def number_for_location( location )
31
+ self.number + location.gl_branch_code
32
+ end
33
+
34
+ # @return [String] the account number combined with the default branch code
35
+ def default_number
36
+ self.number + Skr::Core.config.default_branch_code
37
+ end
38
+
39
+ # @return [BigDecimal] The balance for the current period
40
+ def trial_balance
41
+ balance_for( GlPeriod.current )
42
+ end
43
+
44
+ # @return [String] the account number suitable for querying all branches
45
+ def account_mask
46
+ number + '%'
47
+ end
48
+
49
+ # @return [BigDecimal] the balance for a given period
50
+ def balance_for( period, mask = self.account_mask )
51
+ GlPosting.matching( period, account_mask ).sum(:amount)
52
+ end
53
+
54
+ end
55
+
56
+ end