stockor-core 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +6 -0
- data/Guardfile +13 -0
- data/LICENSE.txt +674 -0
- data/README.md +88 -0
- data/Rakefile +58 -0
- data/config/database.yml +9 -0
- data/db/migrate/20120110142845_create_skr_sequential_ids.rb +35 -0
- data/db/migrate/20140202185309_create_skr_gl_accounts.rb +15 -0
- data/db/migrate/20140202193316_create_skr_gl_periods.rb +16 -0
- data/db/migrate/20140202193318_create_skr_gl_transactions.rb +14 -0
- data/db/migrate/20140202193319_create_skr_gl_postings.rb +16 -0
- data/db/migrate/20140202193700_create_skr_gl_manual_entries.rb +13 -0
- data/db/migrate/20140213040608_create_skr_payment_terms.rb +16 -0
- data/db/migrate/20140220031700_create_skr_addresses.rb +19 -0
- data/db/migrate/20140220031800_create_skr_locations.rb +19 -0
- data/db/migrate/20140220190836_create_skr_vendors.rb +22 -0
- data/db/migrate/20140220203029_create_skr_customers.rb +22 -0
- data/db/migrate/20140224034759_create_skr_skus.rb +22 -0
- data/db/migrate/20140225032853_create_skr_sku_locs.rb +21 -0
- data/db/migrate/20140320030501_create_skr_uoms.rb +19 -0
- data/db/migrate/20140321031604_create_skr_sku_vendors.rb +18 -0
- data/db/migrate/20140322012143_create_skr_ia_reasons.rb +14 -0
- data/db/migrate/20140322014401_create_skr_inventory_adjustments.rb +16 -0
- data/db/migrate/20140322023453_create_skr_ia_lines.rb +18 -0
- data/db/migrate/20140322035024_create_skr_sku_trans.rb +21 -0
- data/db/migrate/20140322223912_create_skr_sales_orders.rb +27 -0
- data/db/migrate/20140322223920_create_skr_so_lines.rb +25 -0
- data/db/migrate/20140323001446_create_so_details_view.rb +81 -0
- data/db/migrate/20140327202102_create_skr_purchase_orders.rb +20 -0
- data/db/migrate/20140327202107_create_skr_po_lines.rb +25 -0
- data/db/migrate/20140327202207_create_skr_pick_tickets.rb +16 -0
- data/db/migrate/20140327202209_create_skr_pt_lines.rb +23 -0
- data/db/migrate/20140327224000_create_skr_invoices.rb +25 -0
- data/db/migrate/20140327224002_create_skr_inv_lines.rb +23 -0
- data/db/migrate/20140330232808_create_skr_sku_loc_details_view.rb +31 -0
- data/db/migrate/20140330232810_create_skr_sku_qty_details_view.rb +48 -0
- data/db/migrate/20140400164729_create_skr_vouchers.rb +22 -0
- data/db/migrate/20140400164733_create_skr_vo_lines.rb +21 -0
- data/db/migrate/20140401164729_create_skr_po_receipt.rb +16 -0
- data/db/migrate/20140401164740_create_skr_por_line.rb +21 -0
- data/db/migrate/20140422024010_create_skr_inv_details_view.rb +42 -0
- data/lib/generators/stockor/migrations/install_generator.rb +42 -0
- data/lib/skr/address.rb +97 -0
- data/lib/skr/business_entity.rb +25 -0
- data/lib/skr/concerns/acts_as_uom.rb +47 -0
- data/lib/skr/concerns/all.rb +30 -0
- data/lib/skr/concerns/association_extensions.rb +85 -0
- data/lib/skr/concerns/attr_accessor_with_default.rb +54 -0
- data/lib/skr/concerns/code_identifier.rb +43 -0
- data/lib/skr/concerns/export_associations.rb +52 -0
- data/lib/skr/concerns/export_join_tables.rb +39 -0
- data/lib/skr/concerns/export_methods.rb +104 -0
- data/lib/skr/concerns/export_scope.rb +66 -0
- data/lib/skr/concerns/exported_limit_evaluator.rb +17 -0
- data/lib/skr/concerns/gl_tran_extensions.rb +18 -0
- data/lib/skr/concerns/has_gl_transaction.rb +67 -0
- data/lib/skr/concerns/has_sku_loc_lines.rb +47 -0
- data/lib/skr/concerns/immutable_model.rb +32 -0
- data/lib/skr/concerns/inv_extensions.rb +24 -0
- data/lib/skr/concerns/is_order_like.rb +47 -0
- data/lib/skr/concerns/is_sku_loc_line.rb +65 -0
- data/lib/skr/concerns/json_attribute_access.rb +55 -0
- data/lib/skr/concerns/locked_fields.rb +84 -0
- data/lib/skr/concerns/pt_extensions.rb +22 -0
- data/lib/skr/concerns/pub_sub.rb +105 -0
- data/lib/skr/concerns/queries.rb +20 -0
- data/lib/skr/concerns/random_hash_code.rb +40 -0
- data/lib/skr/concerns/sanitize_json.rb +49 -0
- data/lib/skr/concerns/sku_extensions.rb +52 -0
- data/lib/skr/concerns/so_extensions.rb +30 -0
- data/lib/skr/concerns/state_machine.rb +62 -0
- data/lib/skr/concerns/track_modifications.rb +48 -0
- data/lib/skr/concerns/visible_id_identifier.rb +53 -0
- data/lib/skr/core.rb +30 -0
- data/lib/skr/core/configuration.rb +87 -0
- data/lib/skr/core/db.rb +82 -0
- data/lib/skr/core/db/migration_helpers.rb +178 -0
- data/lib/skr/core/db/migrations.rb +15 -0
- data/lib/skr/core/db/seed.rb +46 -0
- data/lib/skr/core/db/seed/chart_of_accounts.yml +168 -0
- data/lib/skr/core/db/seed/payment_terms.yml +60 -0
- data/lib/skr/core/logger.rb +36 -0
- data/lib/skr/core/numbers.rb +71 -0
- data/lib/skr/core/rails_engine.rb +5 -0
- data/lib/skr/core/standard_pricing_provider.rb +15 -0
- data/lib/skr/core/strings.rb +57 -0
- data/lib/skr/core/testing.rb +11 -0
- data/lib/skr/core/testing/assertions.rb +44 -0
- data/lib/skr/core/testing/fixtures.rb +25 -0
- data/lib/skr/core/testing/fixtures/skr/addresses.yml +53 -0
- data/lib/skr/core/testing/fixtures/skr/customers.yml +43 -0
- data/lib/skr/core/testing/fixtures/skr/gl_accounts.yml +86 -0
- data/lib/skr/core/testing/fixtures/skr/gl_manual_entries.yml +4 -0
- data/lib/skr/core/testing/fixtures/skr/gl_periods.yml +26 -0
- data/lib/skr/core/testing/fixtures/skr/gl_postings.yml +88 -0
- data/lib/skr/core/testing/fixtures/skr/gl_transactions.yml +35 -0
- data/lib/skr/core/testing/fixtures/skr/ia_lines.yml +7 -0
- data/lib/skr/core/testing/fixtures/skr/ia_reasons.yml +15 -0
- data/lib/skr/core/testing/fixtures/skr/inv_lines.yml +22 -0
- data/lib/skr/core/testing/fixtures/skr/inventory_adjustments.yml +6 -0
- data/lib/skr/core/testing/fixtures/skr/invoices.yml +10 -0
- data/lib/skr/core/testing/fixtures/skr/locations.yml +24 -0
- data/lib/skr/core/testing/fixtures/skr/payment_terms.yml +42 -0
- data/lib/skr/core/testing/fixtures/skr/pick_tickets.yml +4 -0
- data/lib/skr/core/testing/fixtures/skr/po_lines.yml +44 -0
- data/lib/skr/core/testing/fixtures/skr/po_receipts.yml +5 -0
- data/lib/skr/core/testing/fixtures/skr/por_lines.yml +13 -0
- data/lib/skr/core/testing/fixtures/skr/pt_lines.yml +12 -0
- data/lib/skr/core/testing/fixtures/skr/purchase_orders.yml +16 -0
- data/lib/skr/core/testing/fixtures/skr/sales_orders.yml +32 -0
- data/lib/skr/core/testing/fixtures/skr/sku_locs.yml +78 -0
- data/lib/skr/core/testing/fixtures/skr/sku_trans.yml +9 -0
- data/lib/skr/core/testing/fixtures/skr/sku_vendors.yml +35 -0
- data/lib/skr/core/testing/fixtures/skr/skus.yml +50 -0
- data/lib/skr/core/testing/fixtures/skr/so_lines.yml +71 -0
- data/lib/skr/core/testing/fixtures/skr/uoms.yml +61 -0
- data/lib/skr/core/testing/fixtures/skr/vendors.yml +48 -0
- data/lib/skr/core/testing/fixtures/skr/vo_lines.yml +12 -0
- data/lib/skr/core/testing/fixtures/skr/vouchers.yml +8 -0
- data/lib/skr/core/testing/helper.rb +18 -0
- data/lib/skr/core/testing/test_case.rb +17 -0
- data/lib/skr/core/version.rb +5 -0
- data/lib/skr/customer.rb +34 -0
- data/lib/skr/gl_account.rb +56 -0
- data/lib/skr/gl_manual_entry.rb +31 -0
- data/lib/skr/gl_period.rb +13 -0
- data/lib/skr/gl_posting.rb +54 -0
- data/lib/skr/gl_transaction.rb +174 -0
- data/lib/skr/ia_line.rb +129 -0
- data/lib/skr/ia_reason.rb +16 -0
- data/lib/skr/inv_line.rb +90 -0
- data/lib/skr/inventory_adjustment.rb +60 -0
- data/lib/skr/invoice.rb +159 -0
- data/lib/skr/location.rb +31 -0
- data/lib/skr/model.rb +37 -0
- data/lib/skr/null_user.rb +30 -0
- data/lib/skr/payment_term.rb +30 -0
- data/lib/skr/pick_ticket.rb +71 -0
- data/lib/skr/po_line.rb +69 -0
- data/lib/skr/po_receipt.rb +51 -0
- data/lib/skr/por_line.rb +80 -0
- data/lib/skr/pt_line.rb +74 -0
- data/lib/skr/purchase_order.rb +112 -0
- data/lib/skr/sales_order.rb +159 -0
- data/lib/skr/sequential_id.rb +23 -0
- data/lib/skr/sku.rb +99 -0
- data/lib/skr/sku_loc.rb +94 -0
- data/lib/skr/sku_tran.rb +111 -0
- data/lib/skr/sku_vendor.rb +26 -0
- data/lib/skr/so_line.rb +159 -0
- data/lib/skr/uom.rb +63 -0
- data/lib/skr/user_proxy.rb +60 -0
- data/lib/skr/validators/all.rb +2 -0
- data/lib/skr/validators/email.rb +17 -0
- data/lib/skr/validators/set.rb +18 -0
- data/lib/skr/vendor.rb +33 -0
- data/lib/skr/vo_line.rb +35 -0
- data/lib/skr/voucher.rb +119 -0
- data/lib/stockor/core.rb +9 -0
- data/stockor-core.gemspec +37 -0
- data/tasks/migrations.rake +23 -0
- data/tasks/publish.rake +8 -0
- data/test/address_test.rb +57 -0
- data/test/concerns/attr_with_default_test.rb +45 -0
- data/test/concerns/code_identifier_test.rb +46 -0
- data/test/concerns/export_associations_test.rb +7 -0
- data/test/concerns/export_methods_test.rb +31 -0
- data/test/concerns/export_scope_test.rb +16 -0
- data/test/concerns/exported_limits_test.rb +47 -0
- data/test/concerns/json_attribute_access_test.rb +27 -0
- data/test/concerns/pub_sub_test.rb +83 -0
- data/test/concerns/sanitize_json_test.rb +47 -0
- data/test/core/configuration_test.rb +24 -0
- data/test/core/numbers_test.rb +26 -0
- data/test/core/strings_test.rb +41 -0
- data/test/customer_test.rb +34 -0
- data/test/gl_account_test.rb +23 -0
- data/test/gl_manual_entry_test.rb +17 -0
- data/test/gl_period_test.rb +12 -0
- data/test/gl_posting_test.rb +39 -0
- data/test/gl_transaction_test.rb +58 -0
- data/test/ia_line_test.rb +68 -0
- data/test/ia_reason_test.rb +11 -0
- data/test/inv_line_test.rb +58 -0
- data/test/inventory_adjustment_test.rb +72 -0
- data/test/invoice_test.rb +63 -0
- data/test/location_test.rb +10 -0
- data/test/payment_term_test.rb +25 -0
- data/test/pick_ticket_test.rb +27 -0
- data/test/po_line_test.rb +36 -0
- data/test/po_receipt_test.rb +93 -0
- data/test/por_line_test.rb +79 -0
- data/test/pt_line_test.rb +29 -0
- data/test/purchase_order_test.rb +44 -0
- data/test/sales_order_test.rb +74 -0
- data/test/sku_loc_test.rb +50 -0
- data/test/sku_test.rb +45 -0
- data/test/sku_tran_test.rb +21 -0
- data/test/sku_vendor_test.rb +13 -0
- data/test/so_line_test.rb +89 -0
- data/test/test_helper.rb +1 -0
- data/test/uom_test.rb +14 -0
- data/test/vendor_test.rb +35 -0
- data/test/vo_line_test.rb +20 -0
- data/test/voucher_test.rb +35 -0
- data/yard_ext/all.rb +9 -0
- data/yard_ext/code_identifier_handler.rb +33 -0
- data/yard_ext/concern_meta_methods.rb +60 -0
- data/yard_ext/config_options.rb +27 -0
- data/yard_ext/exported_scope.rb +4 -0
- data/yard_ext/immutable_handler.rb +17 -0
- data/yard_ext/json_attr_accessor.rb +22 -0
- data/yard_ext/locked_fields_handler.rb +21 -0
- data/yard_ext/templates/default/layout/html/layout.erb +20 -0
- data/yard_ext/templates/default/method_details/html/github_link.erb +1 -0
- data/yard_ext/templates/default/method_details/setup.rb +3 -0
- data/yard_ext/validators.rb +1 -0
- data/yard_ext/visible_id_handler.rb +38 -0
- metadata +448 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
-
|
|
2
|
+
code: CREDCARD
|
|
3
|
+
description: Payment due at time of sale with credit card
|
|
4
|
+
days: 0
|
|
5
|
+
discount_days: 0
|
|
6
|
+
discount_amount: 0
|
|
7
|
+
-
|
|
8
|
+
code: CHECK
|
|
9
|
+
description: Payment due at time of sale by check
|
|
10
|
+
days: 0
|
|
11
|
+
discount_days: 0
|
|
12
|
+
discount_amount: 0
|
|
13
|
+
-
|
|
14
|
+
code: CASH
|
|
15
|
+
description: Payment due at time of sale with cash
|
|
16
|
+
days: 0
|
|
17
|
+
discount_days: 0
|
|
18
|
+
discount_amount: 0
|
|
19
|
+
-
|
|
20
|
+
code: NET10
|
|
21
|
+
description: Payment due in 10 days, no discount for early payment
|
|
22
|
+
days: 10
|
|
23
|
+
discount_days: 0
|
|
24
|
+
discount_amount: 0
|
|
25
|
+
|
|
26
|
+
-
|
|
27
|
+
code: NET15
|
|
28
|
+
description: Payment due in 15 days, no discount for early payment
|
|
29
|
+
days: 15
|
|
30
|
+
discount_days: 0
|
|
31
|
+
discount_amount: 0
|
|
32
|
+
|
|
33
|
+
-
|
|
34
|
+
code: NET30
|
|
35
|
+
description: Payment due in 30 days, no discount for early payment
|
|
36
|
+
days: 30
|
|
37
|
+
discount_days: 0
|
|
38
|
+
discount_amount: 0
|
|
39
|
+
|
|
40
|
+
-
|
|
41
|
+
code: NET45
|
|
42
|
+
description: Payment due in 45 days, no discount for early payment
|
|
43
|
+
days: 45
|
|
44
|
+
discount_days: 0
|
|
45
|
+
discount_amount: 0
|
|
46
|
+
|
|
47
|
+
-
|
|
48
|
+
code: NET60
|
|
49
|
+
description: Payment due in 60 days, no discount for early payment
|
|
50
|
+
days: 60
|
|
51
|
+
discount_days: 0
|
|
52
|
+
discount_amount: 0
|
|
53
|
+
|
|
54
|
+
-
|
|
55
|
+
code: 2P10NET30
|
|
56
|
+
description: Payment due in 30 days, 2 % discount if payed with 10 days
|
|
57
|
+
days: 30
|
|
58
|
+
discount_days: 10
|
|
59
|
+
discount_amount: 2
|
|
60
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
module Skr::Core
|
|
4
|
+
|
|
5
|
+
class << self
|
|
6
|
+
def logger
|
|
7
|
+
@logger ||= (
|
|
8
|
+
if defined?(::Rails)
|
|
9
|
+
Rails.logger
|
|
10
|
+
else
|
|
11
|
+
Logger.new(STDERR)
|
|
12
|
+
end
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def logger=( logger )
|
|
17
|
+
@logger = logger
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def silence_logs( &block )
|
|
21
|
+
old_logger = Skr::Core.logger
|
|
22
|
+
begin
|
|
23
|
+
Skr::Core.logger=Logger.new( StringIO.new )
|
|
24
|
+
yield
|
|
25
|
+
ensure
|
|
26
|
+
Skr::Core.logger=old_logger
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def logger_debug( output )
|
|
31
|
+
logger.debug '⚡ '*40
|
|
32
|
+
logger.debug '⚡ ' + output
|
|
33
|
+
logger.debug '⚡ '*40
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# * Utility methods that manipulate Numbers
|
|
2
|
+
|
|
3
|
+
module Skr::Core::Numbers extend self
|
|
4
|
+
# Document the responsibility of the class
|
|
5
|
+
#
|
|
6
|
+
# == Heading
|
|
7
|
+
#
|
|
8
|
+
# Use headings to break up descriptions
|
|
9
|
+
#
|
|
10
|
+
# == Formatting
|
|
11
|
+
#
|
|
12
|
+
# Embody +parameters+ or +options+ in Teletype Text tags. You can also use
|
|
13
|
+
# *bold* or *italics* but must use HTML tags for <b>multiple words</b>,
|
|
14
|
+
# <i>like this</i> and <tt>like this</tt>.
|
|
15
|
+
# - See more at: http://blog.firsthand.ca/2010/09/ruby-rdoc-example.html#sthash.q9Jkcjrl.dpuf
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ### PercNum
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
# A "percnum" is a Stockor invention *(or abomination, depending on your POV)*.
|
|
22
|
+
# It's a string that contains a number and an optional percent sign.
|
|
23
|
+
# If the percent sign is present, the number is treated as a percentage.
|
|
24
|
+
# If desired the user may also input negative numbers which will invert the sense of the method.
|
|
25
|
+
#
|
|
26
|
+
# It's intended to be a user-friendly method to provide one input box for "discount" or "surcharge",
|
|
27
|
+
# and allow the user to input either a flat amount such as 4.50, or a percentage like 20%
|
|
28
|
+
#
|
|
29
|
+
class PercNum
|
|
30
|
+
# @param perc_or_num [BigDecimal,String, Integer] any value that BigDecimal will accept
|
|
31
|
+
def initialize( perc_or_num )
|
|
32
|
+
@is_perc = !! perc_or_num.to_s.match( /\%\s*$/ )
|
|
33
|
+
@right_side = BigDecimal.new( perc_or_num, 5 )
|
|
34
|
+
if is_percentage?
|
|
35
|
+
@right_side *= 0.01
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Adds the PercNum to the specified amount.
|
|
40
|
+
# @param amount[BigDecimal] the amount that should be added to the PercNum
|
|
41
|
+
# @return [BigDecimal] The result of either adding (non percent) or multiplying by (percent) the amount
|
|
42
|
+
# @example
|
|
43
|
+
# PercNum.new( '23.42' ).credit_to( 33 ).to_s #=> '56.42'
|
|
44
|
+
# PercNum.new( '25%' ).credit_to( 100 ).to_s #=> '125.0'
|
|
45
|
+
def credit_to( amount )
|
|
46
|
+
is_percentage? ? ( 1 + @right_side ) * amount : amount += @right_side
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Subtracts the PercNum to the specified amount.
|
|
50
|
+
# @param amount[BigDecimal] the amount that should be added to the PercNum
|
|
51
|
+
# @return [BigDecimal] The result of either adding (non percent) or multiplying by (percent) the amount
|
|
52
|
+
# @example
|
|
53
|
+
# PercNum.new( '23.42' ).debit_from( 42.42 ).to_s #=> '19.00'
|
|
54
|
+
# PercNum.new( '25%' ).debit_from( 100 ).to_s #=> '75.0'
|
|
55
|
+
def debit_from( amount )
|
|
56
|
+
is_percentage? ? ( 1 - @right_side ) * amount : amount -= @right_side
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
## If PercNum was initialized with a blank string
|
|
60
|
+
def present?
|
|
61
|
+
! @right_side.zero?
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Is the PercNum percentage based or absolute
|
|
65
|
+
def is_percentage?
|
|
66
|
+
@is_perc
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Skr
|
|
2
|
+
module Core
|
|
3
|
+
|
|
4
|
+
class StandardPricingProvider
|
|
5
|
+
|
|
6
|
+
# The default implementation returns the price for the given UOM
|
|
7
|
+
# Custom implementations will return from a pricing library
|
|
8
|
+
# @return [BigDecimal] the "standard" price for the SKU
|
|
9
|
+
def self.price( sku_loc: nil, customer: nil, uom: nil, qty: 1 )
|
|
10
|
+
sku_loc.sku.uoms.with_code( uom.code ).price
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Skr
|
|
2
|
+
module Core
|
|
3
|
+
module Strings
|
|
4
|
+
|
|
5
|
+
# list of characters that should not be used
|
|
6
|
+
BAD_RAND_CHARS = %w{ B 8 o O 0 i l I 1 }
|
|
7
|
+
|
|
8
|
+
# characters that should be randomly chosen from
|
|
9
|
+
RAND_CHARS = ( ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a ) - BAD_RAND_CHARS
|
|
10
|
+
|
|
11
|
+
# Generates a random string without using commonly confused numbers and letters.
|
|
12
|
+
# It's intended for use in situations where the code will have to be
|
|
13
|
+
# read and re-entered later.
|
|
14
|
+
#
|
|
15
|
+
# The characters in BAD_RAND_CHARS are avoided since they can be confused with one another:
|
|
16
|
+
# @return [String] a random string <length> characters long.
|
|
17
|
+
def self.random( length = 12 )
|
|
18
|
+
1.upto(length).each_with_object(''){|i,s| s << RAND_CHARS[ rand(RAND_CHARS.length) ] }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Attempts to shorten a string while keeping it somewhat
|
|
22
|
+
# like it's original self.
|
|
23
|
+
# Useful for suggesting a code for a given entity name.
|
|
24
|
+
# @param string [String] the string to shorten.
|
|
25
|
+
# @param length [Integer] how long the returned code should be
|
|
26
|
+
# @param padding [String] What to pad the code with if it is shorter than length. False indicates no padding should be performed
|
|
27
|
+
# @return [String] a shortened version of the name with:
|
|
28
|
+
# * Upper cased
|
|
29
|
+
# * Spaces stripped
|
|
30
|
+
# * Made up of a proportional number of chars from each word
|
|
31
|
+
# #### Examples:
|
|
32
|
+
# Skr::Core::Strings.to_code_identifier('General Acme Corp') #=> 'GENACMCORP'
|
|
33
|
+
# Skr::Core::Strings.code_identifier('General I B', padding:false) #=> 'GENERALIB' *(no trailing X)*
|
|
34
|
+
# Skr::Core::Strings.to_code_identifier('Top Cat', maxlen: 5 ) #=> 'TOCAT'
|
|
35
|
+
def self.code_identifier( string, length:10, padding: 'X' )
|
|
36
|
+
stripped = string.gsub(/\W/, '').upcase
|
|
37
|
+
if stripped.length < length
|
|
38
|
+
return padding.present? ? stripped.ljust( length, padding ) : stripped
|
|
39
|
+
end
|
|
40
|
+
result = ''
|
|
41
|
+
words = string.gsub(/[^\w\s-]/,'').split(/\s+|-|_/)
|
|
42
|
+
0.upto(words.length + 1).each_with_index do | attempt_num |
|
|
43
|
+
remainder = length
|
|
44
|
+
result = ''
|
|
45
|
+
string = words.each_with_index do | word, index |
|
|
46
|
+
chars = ( remainder / (words.length-index) + attempt_num )
|
|
47
|
+
result << word[0...chars]
|
|
48
|
+
remainder = length - result.length
|
|
49
|
+
end
|
|
50
|
+
break if result.length >= length
|
|
51
|
+
end
|
|
52
|
+
result[0...length].upcase
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module MiniTest
|
|
2
|
+
module Assertions
|
|
3
|
+
|
|
4
|
+
def assert_logs_matching( regex, failure_message=nil, &block )
|
|
5
|
+
old_logger = Skr::Core.logger
|
|
6
|
+
begin
|
|
7
|
+
output = ""
|
|
8
|
+
Skr::Core.logger=Logger.new( StringIO.new(output) )
|
|
9
|
+
yield
|
|
10
|
+
assert_match( regex, output, failure_message )
|
|
11
|
+
ensure
|
|
12
|
+
Skr::Core.logger=old_logger
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def assert_saves( model )
|
|
18
|
+
assert model.save, "#{model.class} failed to save: #{model.errors.full_messages.join(',')}"
|
|
19
|
+
end
|
|
20
|
+
def refute_saves( model, *errors )
|
|
21
|
+
refute model.save, "#{model.class} saved successfully when it should not have"
|
|
22
|
+
errors.each do |error|
|
|
23
|
+
if model.errors[error.to_sym].empty?
|
|
24
|
+
raise MiniTest::Assertion, "expected #{model.class} to have an error on #{error}"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def assert_event_fires( klass, event, &block )
|
|
32
|
+
@event_results = []
|
|
33
|
+
klass.observe(event) do | *args |
|
|
34
|
+
@event_results = args
|
|
35
|
+
end
|
|
36
|
+
yield
|
|
37
|
+
raise MiniTest::Assertion, "Event #{event} was not fired" if @event_results.empty?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def last_event_results
|
|
41
|
+
@event_results
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module FixtureHelpers
|
|
2
|
+
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
alias_method_chain :table_rows, :custom_autoset_fields
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def table_rows_with_custom_autoset_fields
|
|
10
|
+
results = table_rows_without_custom_autoset_fields
|
|
11
|
+
if model_class
|
|
12
|
+
results[ table_name ].each do | row |
|
|
13
|
+
row['visible_id'] = Skr::SequentialId.next_for( model_class ) if model_class.column_names.include?('visible_id')
|
|
14
|
+
row['hash_code' ] = Skr::Core::Strings.random if model_class.column_names.include?('hash_code')
|
|
15
|
+
row['created_at'] = Time.now if model_class.column_names.include?('created_at')
|
|
16
|
+
row['updated_at'] = Time.now if model_class.column_names.include?('updated_at')
|
|
17
|
+
row['created_by_id'] = 593363170 if model_class.column_names.include?('created_by_id')
|
|
18
|
+
row['updated_by_id'] = 593363170 if model_class.column_names.include?('updated_by_id')
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
results
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
ActiveRecord::FixtureSet.send :include, FixtureHelpers
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
office:
|
|
4
|
+
name: Argosity Office
|
|
5
|
+
line1: 619 E Capitol Ave
|
|
6
|
+
city: Jefferson City
|
|
7
|
+
state: Missouri
|
|
8
|
+
postal_code: 65101
|
|
9
|
+
|
|
10
|
+
junk:
|
|
11
|
+
name: Junk Spot
|
|
12
|
+
line1: 623 E Capitol Ave
|
|
13
|
+
city: Jefferson City
|
|
14
|
+
state: Missouri
|
|
15
|
+
postal_code: 65101
|
|
16
|
+
|
|
17
|
+
amazon:
|
|
18
|
+
name: Amazon, Inc.
|
|
19
|
+
line1: 1200 12th Ave. South, Ste. 1200
|
|
20
|
+
city: Seattle
|
|
21
|
+
state: WA
|
|
22
|
+
postal_code: 98144
|
|
23
|
+
|
|
24
|
+
away:
|
|
25
|
+
name: Away
|
|
26
|
+
line1: 12727 Southview Dr
|
|
27
|
+
city: Holts Summit
|
|
28
|
+
state: Missouri
|
|
29
|
+
postal_code: 65043
|
|
30
|
+
|
|
31
|
+
bigco:
|
|
32
|
+
name: Big Co
|
|
33
|
+
email: orders@bgigco.biz
|
|
34
|
+
line1: 23 Wall Street
|
|
35
|
+
city: Manhattan
|
|
36
|
+
state: New York
|
|
37
|
+
postal_code: 10005
|
|
38
|
+
|
|
39
|
+
bigco_wh:
|
|
40
|
+
name: Big Co WH
|
|
41
|
+
line1: Industrial Drive
|
|
42
|
+
city: Manhattan
|
|
43
|
+
state: New York
|
|
44
|
+
postal_code: 10005
|
|
45
|
+
|
|
46
|
+
joe:
|
|
47
|
+
name: Joe Man
|
|
48
|
+
line1: joe
|
|
49
|
+
city: Freeburg
|
|
50
|
+
state: Missouri
|
|
51
|
+
postal_code: 12344
|
|
52
|
+
|
|
53
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
argosity:
|
|
4
|
+
code: ARGOSITY
|
|
5
|
+
terms: net30
|
|
6
|
+
name: Argosity
|
|
7
|
+
shipping_address: office
|
|
8
|
+
billing_address: away
|
|
9
|
+
gl_receivables_account: ar
|
|
10
|
+
open_balance: 13.88
|
|
11
|
+
|
|
12
|
+
web_customer:
|
|
13
|
+
code: WEB
|
|
14
|
+
terms: cred_card
|
|
15
|
+
name: Website Customer
|
|
16
|
+
shipping_address: office
|
|
17
|
+
billing_address: away
|
|
18
|
+
gl_receivables_account: ar
|
|
19
|
+
|
|
20
|
+
antonio:
|
|
21
|
+
code: KILLER
|
|
22
|
+
terms: cash
|
|
23
|
+
name: Antonio Montoya
|
|
24
|
+
shipping_address: office
|
|
25
|
+
billing_address: away
|
|
26
|
+
gl_receivables_account: ar
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
joe:
|
|
30
|
+
code: JOE
|
|
31
|
+
terms: 10net30
|
|
32
|
+
name: Joe Man
|
|
33
|
+
shipping_address: joe
|
|
34
|
+
billing_address: joe
|
|
35
|
+
gl_receivables_account: ar
|
|
36
|
+
|
|
37
|
+
bigco:
|
|
38
|
+
code: BIGCO
|
|
39
|
+
terms: 10net30
|
|
40
|
+
name: Big Company
|
|
41
|
+
shipping_address: bigco
|
|
42
|
+
billing_address: bigco
|
|
43
|
+
gl_receivables_account: ar
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
|
|
2
|
+
cash:
|
|
3
|
+
number: 1010
|
|
4
|
+
name: Cash
|
|
5
|
+
description: Checking account balance (as shown in company records), currency, coins, checks received from customers but not yet deposited.
|
|
6
|
+
|
|
7
|
+
bank_checking:
|
|
8
|
+
number: 1011
|
|
9
|
+
name: Cash
|
|
10
|
+
description: Checking account balance (as shown in company records), currency, coins, checks received from customers but not yet deposited.
|
|
11
|
+
|
|
12
|
+
inventory:
|
|
13
|
+
number: 1100
|
|
14
|
+
name: Inventory Assets
|
|
15
|
+
description: Inventory on hand and awaiting sale
|
|
16
|
+
|
|
17
|
+
transfers:
|
|
18
|
+
number: 1115
|
|
19
|
+
name: Inventory in Transist
|
|
20
|
+
description: Inventory on a transfer between locations
|
|
21
|
+
|
|
22
|
+
deposits:
|
|
23
|
+
number: 1200
|
|
24
|
+
name: Deposits
|
|
25
|
+
description: Deposit holding account
|
|
26
|
+
|
|
27
|
+
inv_recpt:
|
|
28
|
+
number: 2600
|
|
29
|
+
name: Accounts Receivable Clearing
|
|
30
|
+
description: Inventory Receipts clearing
|
|
31
|
+
|
|
32
|
+
ar:
|
|
33
|
+
number: 1220
|
|
34
|
+
name: Accounts Receivable
|
|
35
|
+
description: Amounts owed to the company for services performed or products sold but not yet paid for.
|
|
36
|
+
|
|
37
|
+
tax:
|
|
38
|
+
number: 2250
|
|
39
|
+
name: Sales Tax Recv
|
|
40
|
+
description: Tax collected
|
|
41
|
+
|
|
42
|
+
ap:
|
|
43
|
+
number: 2200
|
|
44
|
+
name: Accounts Payable
|
|
45
|
+
description: Amounts owed to the outside vendors for services performed or products received but not yet paid for.
|
|
46
|
+
|
|
47
|
+
retained_earnings:
|
|
48
|
+
number: 3100
|
|
49
|
+
name: Retained Earnings
|
|
50
|
+
description: Stockholders equity (Common Stock, Retained Earnings)
|
|
51
|
+
|
|
52
|
+
sales:
|
|
53
|
+
number: 4000
|
|
54
|
+
name: Sales
|
|
55
|
+
description: Amounts earned from selling physical goods. When a sale is provided on credit, both this account and Accounts Receivable will increase. When a service is provided for immediate cash, both this account and Cash will increase.
|
|
56
|
+
|
|
57
|
+
marketing:
|
|
58
|
+
number: 6100
|
|
59
|
+
name: Marketing
|
|
60
|
+
description: Marketing Expenses
|
|
61
|
+
|
|
62
|
+
inventory_write_off:
|
|
63
|
+
number: 6800
|
|
64
|
+
name: Inv Write Off
|
|
65
|
+
description: Cost of inventory written off
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
inventory_purchase:
|
|
69
|
+
number: 5000
|
|
70
|
+
name: Merchandise Inventory Purchases
|
|
71
|
+
description: Expenses incurred purchasing items for resale
|
|
72
|
+
|
|
73
|
+
rent:
|
|
74
|
+
number: 6600
|
|
75
|
+
name: Rent Expense
|
|
76
|
+
description: Cost of occupying rented facilities during the accounting period.
|
|
77
|
+
|
|
78
|
+
shipping:
|
|
79
|
+
number: 6410
|
|
80
|
+
name: Outbound Shipping Expense
|
|
81
|
+
description: Cost of shipping products to customers
|
|
82
|
+
|
|
83
|
+
inbound_shipping:
|
|
84
|
+
number: 6420
|
|
85
|
+
name: Inbound Shipping Expense
|
|
86
|
+
description: Cost of vendors shipping products to us
|