stockor 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +220 -0
- data/Guardfile +13 -0
- data/README.md +7 -0
- data/Rakefile +7 -0
- data/client/skr/Extension.coffee +12 -0
- data/client/skr/components/.gitkeep +0 -0
- data/client/skr/components/address/Address.coffee +21 -0
- data/client/skr/components/address/address.html +20 -0
- data/client/skr/index.js +21 -0
- data/client/skr/models/Address.coffee +17 -0
- data/client/skr/models/Base.coffee +8 -0
- data/client/skr/models/Customer.coffee +26 -0
- data/client/skr/models/GlAccount.coffee +10 -0
- data/client/skr/models/GlManualEntry.coffee +11 -0
- data/client/skr/models/GlPeriod.coffee +10 -0
- data/client/skr/models/GlPosting.coffee +15 -0
- data/client/skr/models/GlTransaction.coffee +16 -0
- data/client/skr/models/IaLine.coffee +19 -0
- data/client/skr/models/IaReason.coffee +12 -0
- data/client/skr/models/InvLine.coffee +27 -0
- data/client/skr/models/InventoryAdjustment.coffee +17 -0
- data/client/skr/models/Invoice.coffee +31 -0
- data/client/skr/models/Location.coffee +15 -0
- data/client/skr/models/PaymentTerm.coffee +11 -0
- data/client/skr/models/PickTicket.coffee +19 -0
- data/client/skr/models/PoLine.coffee +27 -0
- data/client/skr/models/PoReceipt.coffee +20 -0
- data/client/skr/models/PorLine.coffee +26 -0
- data/client/skr/models/PtLine.coffee +27 -0
- data/client/skr/models/PurchaseOrder.coffee +23 -0
- data/client/skr/models/SalesOrder.coffee +32 -0
- data/client/skr/models/Sku.coffee +21 -0
- data/client/skr/models/SkuLoc.coffee +21 -0
- data/client/skr/models/SkuTran.coffee +23 -0
- data/client/skr/models/SkuVendor.coffee +19 -0
- data/client/skr/models/SoLine.coffee +27 -0
- data/client/skr/models/Uom.coffee +17 -0
- data/client/skr/models/Vendor.coffee +28 -0
- data/client/skr/models/VoLine.coffee +23 -0
- data/client/skr/models/Voucher.coffee +22 -0
- data/client/skr/models/mixins/CodeField.coffee +5 -0
- data/client/skr/screens/.gitkeep +0 -0
- data/client/skr/screens/Base.coffee +3 -0
- data/client/skr/screens/base/index.js +5 -0
- data/client/skr/screens/base/index.scss +9 -0
- data/client/skr/screens/base/layout.html +3 -0
- data/client/skr/screens/customer-maint/CustomerMaint.coffee +49 -0
- data/client/skr/screens/customer-maint/index.js +5 -0
- data/client/skr/screens/customer-maint/index.scss +9 -0
- data/client/skr/screens/customer-maint/layout.html +32 -0
- data/client/skr/styles.scss +1 -0
- data/client/skr/views/.gitkeep +0 -0
- data/client/skr/views/Base.coffee +5 -0
- data/config/database.yml +9 -0
- data/config/lanes.rb +7 -0
- data/config/routes.rb +39 -0
- data/config/screens.rb +17 -0
- data/config.ru +5 -0
- data/db/.gitkeep +0 -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/db/schema.sql +2662 -0
- data/db/seed/chart_of_accounts.yml +168 -0
- data/db/seed/payment_terms.yml +60 -0
- data/db/seed.rb +29 -0
- data/lib/skr/access_roles.rb +28 -0
- data/lib/skr/concerns/acts_as_uom.rb +47 -0
- data/lib/skr/concerns/code_identifier.rb +43 -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/locked_fields.rb +84 -0
- data/lib/skr/concerns/pt_extensions.rb +22 -0
- data/lib/skr/concerns/random_hash_code.rb +40 -0
- data/lib/skr/concerns/so_extensions.rb +30 -0
- data/lib/skr/concerns/state_machine.rb +61 -0
- data/lib/skr/concerns/visible_id_identifier.rb +53 -0
- data/lib/skr/configuration.rb +68 -0
- data/lib/skr/db/migration_helpers.rb +178 -0
- data/lib/skr/extension.rb +23 -0
- data/lib/skr/model.rb +19 -0
- data/lib/skr/models/address.rb +97 -0
- data/lib/skr/models/business_entity.rb +29 -0
- data/lib/skr/models/customer.rb +35 -0
- data/lib/skr/models/gl_account.rb +56 -0
- data/lib/skr/models/gl_manual_entry.rb +31 -0
- data/lib/skr/models/gl_period.rb +13 -0
- data/lib/skr/models/gl_posting.rb +54 -0
- data/lib/skr/models/gl_transaction.rb +175 -0
- data/lib/skr/models/ia_line.rb +129 -0
- data/lib/skr/models/ia_reason.rb +16 -0
- data/lib/skr/models/inv_line.rb +90 -0
- data/lib/skr/models/inventory_adjustment.rb +60 -0
- data/lib/skr/models/invoice.rb +159 -0
- data/lib/skr/models/location.rb +31 -0
- data/lib/skr/models/payment_term.rb +30 -0
- data/lib/skr/models/pick_ticket.rb +71 -0
- data/lib/skr/models/po_line.rb +69 -0
- data/lib/skr/models/po_receipt.rb +51 -0
- data/lib/skr/models/por_line.rb +80 -0
- data/lib/skr/models/pt_line.rb +74 -0
- data/lib/skr/models/purchase_order.rb +112 -0
- data/lib/skr/models/sales_order.rb +159 -0
- data/lib/skr/models/sequential_id.rb +23 -0
- data/lib/skr/models/sku.rb +99 -0
- data/lib/skr/models/sku_loc.rb +94 -0
- data/lib/skr/models/sku_tran.rb +111 -0
- data/lib/skr/models/sku_vendor.rb +26 -0
- data/lib/skr/models/so_line.rb +159 -0
- data/lib/skr/models/uom.rb +63 -0
- data/lib/skr/models/user_proxy.rb +60 -0
- data/lib/skr/models/vendor.rb +33 -0
- data/lib/skr/models/vo_line.rb +35 -0
- data/lib/skr/models/voucher.rb +119 -0
- data/lib/skr/standard_pricing_provider.rb +14 -0
- data/lib/skr/version.rb +3 -0
- data/lib/skr.rb +18 -0
- data/lib/stockor.rb +4 -0
- data/lib/tasks/debug-activity.rake +58 -0
- data/log/test.log +0 -0
- data/spec/fixtures/skr/address.yml +2 -0
- data/spec/fixtures/skr/customer.yml +2 -0
- data/spec/fixtures/skr/gl_account.yml +2 -0
- data/spec/fixtures/skr/gl_manual_entry.yml +2 -0
- data/spec/fixtures/skr/gl_period.yml +2 -0
- data/spec/fixtures/skr/gl_posting.yml +2 -0
- data/spec/fixtures/skr/gl_transaction.yml +2 -0
- data/spec/fixtures/skr/ia_line.yml +2 -0
- data/spec/fixtures/skr/ia_reason.yml +2 -0
- data/spec/fixtures/skr/inv_line.yml +2 -0
- data/spec/fixtures/skr/inventory_adjustment.yml +2 -0
- data/spec/fixtures/skr/invoice.yml +2 -0
- data/spec/fixtures/skr/location.yml +2 -0
- data/spec/fixtures/skr/payment_term.yml +2 -0
- data/spec/fixtures/skr/pick_ticket.yml +2 -0
- data/spec/fixtures/skr/po_line.yml +2 -0
- data/spec/fixtures/skr/po_receipt.yml +2 -0
- data/spec/fixtures/skr/por_line.yml +2 -0
- data/spec/fixtures/skr/pt_line.yml +2 -0
- data/spec/fixtures/skr/purchase_order.yml +2 -0
- data/spec/fixtures/skr/sales_order.yml +2 -0
- data/spec/fixtures/skr/sku.yml +2 -0
- data/spec/fixtures/skr/sku_loc.yml +2 -0
- data/spec/fixtures/skr/sku_tran.yml +2 -0
- data/spec/fixtures/skr/sku_vendor.yml +2 -0
- data/spec/fixtures/skr/so_line.yml +2 -0
- data/spec/fixtures/skr/uom.yml +2 -0
- data/spec/fixtures/skr/vendor.yml +2 -0
- data/spec/fixtures/skr/vo_line.yml +2 -0
- data/spec/fixtures/skr/voucher.yml +2 -0
- data/spec/skr/address.rb +10 -0
- data/spec/skr/concerns/code_identifier_spec.rb +45 -0
- data/spec/skr/customer.rb +10 -0
- data/spec/skr/gl_account.rb +10 -0
- data/spec/skr/gl_manual_entry.rb +10 -0
- data/spec/skr/gl_period.rb +10 -0
- data/spec/skr/gl_posting.rb +10 -0
- data/spec/skr/gl_transaction.rb +10 -0
- data/spec/skr/ia_line.rb +10 -0
- data/spec/skr/ia_reason.rb +10 -0
- data/spec/skr/inv_line.rb +10 -0
- data/spec/skr/inventory_adjustment.rb +10 -0
- data/spec/skr/invoice.rb +10 -0
- data/spec/skr/location.rb +10 -0
- data/spec/skr/models/AddressSpec.coffee +5 -0
- data/spec/skr/models/CustomerSpec.coffee +5 -0
- data/spec/skr/models/GlAccountSpec.coffee +5 -0
- data/spec/skr/models/GlManualEntrySpec.coffee +5 -0
- data/spec/skr/models/GlPeriodSpec.coffee +5 -0
- data/spec/skr/models/GlPostingSpec.coffee +5 -0
- data/spec/skr/models/GlTransactionSpec.coffee +5 -0
- data/spec/skr/models/IaLineSpec.coffee +5 -0
- data/spec/skr/models/IaReasonSpec.coffee +5 -0
- data/spec/skr/models/InvLineSpec.coffee +5 -0
- data/spec/skr/models/InventoryAdjustmentSpec.coffee +5 -0
- data/spec/skr/models/InvoiceSpec.coffee +5 -0
- data/spec/skr/models/LocationSpec.coffee +5 -0
- data/spec/skr/models/PaymentTermSpec.coffee +5 -0
- data/spec/skr/models/PickTicketSpec.coffee +5 -0
- data/spec/skr/models/PoLineSpec.coffee +5 -0
- data/spec/skr/models/PoReceiptSpec.coffee +5 -0
- data/spec/skr/models/PorLineSpec.coffee +5 -0
- data/spec/skr/models/PtLineSpec.coffee +5 -0
- data/spec/skr/models/PurchaseOrderSpec.coffee +5 -0
- data/spec/skr/models/SalesOrderSpec.coffee +5 -0
- data/spec/skr/models/SkuLocSpec.coffee +5 -0
- data/spec/skr/models/SkuSpec.coffee +5 -0
- data/spec/skr/models/SkuTranSpec.coffee +5 -0
- data/spec/skr/models/SkuVendorSpec.coffee +5 -0
- data/spec/skr/models/SoLineSpec.coffee +5 -0
- data/spec/skr/models/UomSpec.coffee +5 -0
- data/spec/skr/models/VendorSpec.coffee +5 -0
- data/spec/skr/models/VoLineSpec.coffee +5 -0
- data/spec/skr/models/VoucherSpec.coffee +5 -0
- data/spec/skr/payment_term.rb +10 -0
- data/spec/skr/pick_ticket.rb +10 -0
- data/spec/skr/po_line.rb +10 -0
- data/spec/skr/po_receipt.rb +10 -0
- data/spec/skr/por_line.rb +10 -0
- data/spec/skr/pt_line.rb +10 -0
- data/spec/skr/purchase_order.rb +10 -0
- data/spec/skr/sales_order.rb +10 -0
- data/spec/skr/screens/Base.coffee +7 -0
- data/spec/skr/screens/CustomerMaint.coffee +7 -0
- data/spec/skr/screens/vendor-maint/VendorMaintSpec.coffee +5 -0
- data/spec/skr/sku.rb +10 -0
- data/spec/skr/sku_loc.rb +10 -0
- data/spec/skr/sku_tran.rb +10 -0
- data/spec/skr/sku_vendor.rb +10 -0
- data/spec/skr/so_line.rb +10 -0
- data/spec/skr/spec_helper.rb +26 -0
- data/spec/skr/uom.rb +10 -0
- data/spec/skr/vendor.rb +10 -0
- data/spec/skr/views/AddressSpec.coffee +5 -0
- data/spec/skr/vo_line.rb +10 -0
- data/spec/skr/voucher.rb +10 -0
- data/stockor.gemspec +38 -0
- data/tmp/.gitkeep +0 -0
- metadata +414 -0
@@ -0,0 +1,168 @@
|
|
1
|
+
# Asset Accounts
|
2
|
+
-
|
3
|
+
number: 1000
|
4
|
+
name: Cash
|
5
|
+
description: Cash on hand and held in bank accounts
|
6
|
+
-
|
7
|
+
number: 1010
|
8
|
+
name: Deposit Holding
|
9
|
+
description: Cash and equivalent waiting for deposit
|
10
|
+
-
|
11
|
+
number: 1110
|
12
|
+
name: Inventory
|
13
|
+
description: Inventory on hand and awaiting sale
|
14
|
+
-
|
15
|
+
number: 1115
|
16
|
+
name: Inventory in Transist
|
17
|
+
description: Inventory on a transfer between locations
|
18
|
+
|
19
|
+
-
|
20
|
+
number: 1200
|
21
|
+
name: Accounts Receivable
|
22
|
+
description: Amounts owed to the company for services performed or products sold but not yet paid for.
|
23
|
+
-
|
24
|
+
number: 1300
|
25
|
+
name: Prepayment Revenue
|
26
|
+
description: Amounts received in advance of providing goods and services but not yet delivered.
|
27
|
+
-
|
28
|
+
number: 1750
|
29
|
+
name: Buildings
|
30
|
+
description: Cost to purchase or construct buildings for use by the company.
|
31
|
+
-
|
32
|
+
number: 1800
|
33
|
+
name: Equipment
|
34
|
+
description: Cost to acquire and prepare equipment for use by the company.
|
35
|
+
-
|
36
|
+
number: 1900
|
37
|
+
name: Sales Tax Received
|
38
|
+
description: Amount received for sales tax.
|
39
|
+
|
40
|
+
# Liability Accounts
|
41
|
+
|
42
|
+
-
|
43
|
+
number: 2100
|
44
|
+
name: Notes Payable
|
45
|
+
description: Balance due on outstanding loans
|
46
|
+
-
|
47
|
+
number: 2200
|
48
|
+
name: Accounts Payable
|
49
|
+
description: Amount owed to suppliers for goods and services
|
50
|
+
-
|
51
|
+
number: 2300
|
52
|
+
name: Wages Payable
|
53
|
+
description: Amount owed to employees for hours worked but not yet paid.
|
54
|
+
|
55
|
+
-
|
56
|
+
number: 2400
|
57
|
+
name: Sales Tax
|
58
|
+
description: Sales tax expense
|
59
|
+
|
60
|
+
-
|
61
|
+
number: 2500
|
62
|
+
name: Interest Payable
|
63
|
+
description: Amount owed for interest on Notes Payable.
|
64
|
+
|
65
|
+
-
|
66
|
+
number: 2600
|
67
|
+
name: Inventory Receipts Clearing
|
68
|
+
description: Inventory received but vendor invoice not yet confirmed
|
69
|
+
|
70
|
+
# Equity Accounts
|
71
|
+
|
72
|
+
-
|
73
|
+
number: 3100
|
74
|
+
name: Capital
|
75
|
+
description: Amount the invested in the company (through cash or other assets) plus earnings of the company not withdrawn by the owner.
|
76
|
+
-
|
77
|
+
number: 3200
|
78
|
+
name: Drawing
|
79
|
+
description: Profit draws by owner
|
80
|
+
|
81
|
+
# Revenue Accounts
|
82
|
+
-
|
83
|
+
number: 4100
|
84
|
+
name: Sales
|
85
|
+
description: Amounts earned from selling physical goods.
|
86
|
+
|
87
|
+
-
|
88
|
+
number: 4200
|
89
|
+
name: Service Revenues
|
90
|
+
description: Amounts earned from providing services to clients.
|
91
|
+
|
92
|
+
# Cost of Goods
|
93
|
+
-
|
94
|
+
number: 5100
|
95
|
+
name: Inventory Costs
|
96
|
+
description: Cost of Goods Sold
|
97
|
+
|
98
|
+
-
|
99
|
+
number: 5150
|
100
|
+
name: Transfer Costs
|
101
|
+
description: Goods in transit on a transfer
|
102
|
+
|
103
|
+
# Expenses
|
104
|
+
-
|
105
|
+
number: 6100
|
106
|
+
name: Advertising Expense
|
107
|
+
description: Costs incurred by the company during the accounting period for ads, promotions, and other selling and expenses (other than salaries).
|
108
|
+
|
109
|
+
-
|
110
|
+
number: 6200
|
111
|
+
name: Salaries Expense
|
112
|
+
description: Expenses incurred for the work performed by employees.
|
113
|
+
-
|
114
|
+
number: 6300
|
115
|
+
name: Supplies Expense
|
116
|
+
description: Cost of supplies used up during the accounting period.
|
117
|
+
-
|
118
|
+
number: 6310
|
119
|
+
name: Lost Supplies Expense
|
120
|
+
description: Supplies that have been physicaly misplaced and cannot be found
|
121
|
+
-
|
122
|
+
number: 6320
|
123
|
+
name: Damaged Supplies Expense
|
124
|
+
description: Supplies that have been damaged and were disposed of
|
125
|
+
-
|
126
|
+
number: 6410
|
127
|
+
name: Outbound Shipping Expense
|
128
|
+
description: Cost of shipping goods to customers
|
129
|
+
|
130
|
+
-
|
131
|
+
number: 6420
|
132
|
+
name: Inbound Shipping Expense
|
133
|
+
description: Cost of vendors shipping goods to us
|
134
|
+
|
135
|
+
-
|
136
|
+
number: 6500
|
137
|
+
name: Depreciation Expense
|
138
|
+
description: Cost of long-term assets allocated to expense during the current accounting period.
|
139
|
+
|
140
|
+
-
|
141
|
+
number: 6600
|
142
|
+
name: Rent Expense
|
143
|
+
description: Cost of occupying rented facilities during the accounting period.
|
144
|
+
-
|
145
|
+
number: 6700
|
146
|
+
name: Utilities Expense
|
147
|
+
description: Costs for electricity, heat, water, and sewer that were used during the accounting period.
|
148
|
+
-
|
149
|
+
number: 6750
|
150
|
+
name: IT Expense
|
151
|
+
description: Cost of maintaining information systems
|
152
|
+
-
|
153
|
+
number: 6760
|
154
|
+
name: Telephone Expense
|
155
|
+
description: Cost of telephone used during the current accounting period.
|
156
|
+
|
157
|
+
# Other Revenues
|
158
|
+
-
|
159
|
+
number: 7100
|
160
|
+
name: Non operating Revenue
|
161
|
+
description: Revenue realized by other means
|
162
|
+
|
163
|
+
# Other Expense
|
164
|
+
-
|
165
|
+
number: 8100
|
166
|
+
name: Non operating Expense
|
167
|
+
description: Expense incurred by other means
|
168
|
+
|
@@ -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
|
+
|
data/db/seed.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'yaml'
|
3
|
+
require_relative '../lib/skr'
|
4
|
+
|
5
|
+
|
6
|
+
module Skr
|
7
|
+
|
8
|
+
user = Lanes::User.where(login: 'admin').first!
|
9
|
+
Lanes::User.scoped_to(user) do
|
10
|
+
seeds_path = Pathname.new(__FILE__).dirname.join('seed')
|
11
|
+
|
12
|
+
unless Location.default
|
13
|
+
Location.create( code: Skr.config.default_location_code, name: "System default",
|
14
|
+
address: Address.new(name:"System default")
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
YAML::load( seeds_path.join('chart_of_accounts.yml').read ).each do | acct_data |
|
19
|
+
GlAccount.where(number: acct_data['number'].to_s).any? || GlAccount.create!(acct_data)
|
20
|
+
end
|
21
|
+
|
22
|
+
YAML::load( seeds_path.join('payment_terms.yml').read ).each do | acct_data |
|
23
|
+
PaymentTerm.where(code: acct_data['code'].to_s).any? || PaymentTerm.create!(acct_data)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'lanes/access'
|
2
|
+
|
3
|
+
module Lanes::Access
|
4
|
+
module Roles
|
5
|
+
|
6
|
+
|
7
|
+
# re-open the exising Support role
|
8
|
+
class Support
|
9
|
+
grant Skr::Customer
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
class Accounting < Lanes::Access::Role
|
14
|
+
grant Skr::Customer, Skr::PaymentTerm
|
15
|
+
|
16
|
+
lock_writes Skr::Customer, :terms_id
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
class Purchasing < Lanes::Access::Role
|
21
|
+
self.read << Skr::Customer
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
Role.grant_global_access(:read, Skr::PaymentTerm)
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Skr
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
# @see ClassMethods
|
5
|
+
module ActsAsUOM
|
6
|
+
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def acts_as_uom( opts = {})
|
11
|
+
include InstanceMethods
|
12
|
+
|
13
|
+
export_methods :ea_qty, :combined_uom, :optional=>false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
def combined_uom
|
19
|
+
if self.uom_size.nil? || self.uom_code.nil?
|
20
|
+
''
|
21
|
+
elsif 1 == self.uom_size
|
22
|
+
self.uom_code
|
23
|
+
else
|
24
|
+
"#{self.uom_code}/#{self.uom_size}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def ea_qty
|
29
|
+
self.uom_size * self.qty
|
30
|
+
end
|
31
|
+
|
32
|
+
def uom=(uom)
|
33
|
+
self.uom_size = uom.size
|
34
|
+
self.uom_code = uom.code
|
35
|
+
end
|
36
|
+
|
37
|
+
def uom
|
38
|
+
Uom.new({ size: self.uom_size, code: self.uom_code })
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Skr
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
# @see ClassMethods
|
5
|
+
module CodeIdentifier
|
6
|
+
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
# ### Code Identifier Concern
|
10
|
+
# This adds the {#has_code_identifier} class method
|
11
|
+
module ClassMethods
|
12
|
+
|
13
|
+
# A 2-10 character string that identifies an entity, such as a Customer, Vendor, or SKU.
|
14
|
+
# The code is often assigned by the user, but may also
|
15
|
+
# be auto-generated by {Skr::Strings.code_identifier}
|
16
|
+
#
|
17
|
+
# @param max_length [Integer] how long the code is allowed to be
|
18
|
+
# @param from [Symbol], method to call for a string to base the code upon
|
19
|
+
def has_code_identifier( from: nil, max_length: 10 )
|
20
|
+
|
21
|
+
validates :code, :length=>2..max_length, :presence=>true, :uniqueness=>true
|
22
|
+
|
23
|
+
alias_attribute :record_identifier, :code
|
24
|
+
|
25
|
+
if from
|
26
|
+
before_validation(:on=>:create) do
|
27
|
+
source = self[from]
|
28
|
+
unless source.blank?
|
29
|
+
self.code ||= Skr::Strings.code_identifier( source, length:max_length )
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
before_validation do
|
35
|
+
self.code = self.code.upcase unless self.code.blank?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'active_record/validations'
|
2
|
+
|
3
|
+
module Skr
|
4
|
+
|
5
|
+
class InvalidGlTransaction < ActiveRecord::RecordInvalid
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
module Concerns
|
10
|
+
|
11
|
+
module HasGlTransaction
|
12
|
+
|
13
|
+
extend ActiveSupport::Concern
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
|
17
|
+
# N.B. We are overriding ActiveRecord::Base#save
|
18
|
+
# This is so we can wrap the save call inside a {GlTransaction.record} block
|
19
|
+
# which will collect any GlPostings and then collapse them down at the end of the block
|
20
|
+
# in order to prevent multiple postings to the same account.
|
21
|
+
def save(*)
|
22
|
+
opts = options_for_gl_transaction
|
23
|
+
# do nothing if the options specified an if clause and the method returns false
|
24
|
+
if opts.present? and opts.has_key?(:if) and self.send( opts[:if] ) == false
|
25
|
+
super
|
26
|
+
else
|
27
|
+
save_status = false
|
28
|
+
# First we wrap it up in our transaction since we don't have the benefit of
|
29
|
+
# save's rollback_active_record_state! block
|
30
|
+
# I'm tempted to appropriate it's usage, but am not since it's not documented (that I've found)
|
31
|
+
# and is thus likely to change
|
32
|
+
GlTransaction.transaction( requires_new: true ) do
|
33
|
+
# Enclose in GlTransaction#record block
|
34
|
+
gl_transaction = GlTransaction.record do
|
35
|
+
save_status = super # ActiveRecord::Base#save
|
36
|
+
# If save was successfull, pass attributes back to GlTransaction#record.
|
37
|
+
# Otherwise pass false back so it knows to not save the GlTransaction
|
38
|
+
save_status ? { attributes: self.send( opts[:attributes] ) } : false
|
39
|
+
end
|
40
|
+
# if we saved successfully, but the GlTransaction did not;
|
41
|
+
# Copy the errors to the model and abort the transaction
|
42
|
+
if save_status && gl_transaction.errors.any?
|
43
|
+
self.errors[:gl_transaction] += gl_transaction.errors.full_messages
|
44
|
+
save_status = false
|
45
|
+
raise InvalidGlTransaction.new(gl_transaction)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
return save_status
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
module ClassMethods
|
55
|
+
|
56
|
+
def has_gl_transaction( options={} )
|
57
|
+
options.merge!( attributes: :attributes_for_gl_transaction )
|
58
|
+
cattr_accessor :options_for_gl_transaction
|
59
|
+
self.options_for_gl_transaction = options unless options.empty?
|
60
|
+
self.send :include, InstanceMethods
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Skr
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
module HasSkuLocLines
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
module InstanceMethods
|
9
|
+
|
10
|
+
def other_charge_lines
|
11
|
+
self.lines.select{|l| l.sku.is_other_charge? }
|
12
|
+
end
|
13
|
+
|
14
|
+
def regular_lines
|
15
|
+
self.lines.reject{|l| l.sku.is_other_charge? }
|
16
|
+
end
|
17
|
+
|
18
|
+
def regular_lines_total
|
19
|
+
self.regular_lines.sum{|l|l.extended_price}
|
20
|
+
end
|
21
|
+
|
22
|
+
def subtotal
|
23
|
+
self.regular_lines.inject(0){|sum,line| sum + line.extended_price }
|
24
|
+
end
|
25
|
+
|
26
|
+
def total
|
27
|
+
if total = self.read_attribute('total')
|
28
|
+
BigDecimal.new(total)
|
29
|
+
elsif self.new_record? || self.association(:lines).loaded?
|
30
|
+
self.lines.inject( BigDecimal.new('0') ){|sum,line| sum += line.extended_price }
|
31
|
+
else
|
32
|
+
BigDecimal.new( self.lines.sum('price*qty') )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
module ClassMethods
|
38
|
+
|
39
|
+
def has_sku_loc_lines
|
40
|
+
self.send :include, InstanceMethods
|
41
|
+
export_methods :total
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Skr
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
module ImmutableModel
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
# Once it's created it may not be updated or destroyed.
|
11
|
+
# @raise [ActiveRecord::ReadOnlyRecord] if destroy, delete or save is called after it's been created.
|
12
|
+
def is_immutable(options = {})
|
13
|
+
|
14
|
+
options[:except] = [*options[:except]].map{|name| name.to_s } # make sure except is present and an array
|
15
|
+
|
16
|
+
before_destroy do
|
17
|
+
raise ActiveRecord::ReadOnlyRecord.new( "Can not destroy #{self.class.model_name}, only create is allowed" )
|
18
|
+
end
|
19
|
+
|
20
|
+
before_update do
|
21
|
+
unless ( changes.keys - change_tracking_fields - options[:except] ).blank?
|
22
|
+
raise ActiveRecord::ReadOnlyRecord.new( "Can not update, only create #{self.class.model_name}" )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Skr
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
module INV
|
5
|
+
|
6
|
+
module Lines
|
7
|
+
|
8
|
+
def from_pick_ticket!
|
9
|
+
proxy_association.owner.pick_ticket.lines.each do | line |
|
10
|
+
build({ pt_line: line, qty: line.qty_to_ship })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def from_sales_order!
|
15
|
+
proxy_association.owner.sales_order.lines.each do | line |
|
16
|
+
build({ so_line: line, qty: line.qty_allocated })
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Skr
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
module IsOrderLike
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
|
9
|
+
|
10
|
+
# Set's the customer. It also defaults the terms, addresses,and tax_exempt status to the customer's defaults
|
11
|
+
# @param cust [Customer]
|
12
|
+
# @return Customer
|
13
|
+
def customer=(cust)
|
14
|
+
super
|
15
|
+
self.terms ||= cust.terms
|
16
|
+
self.is_tax_exempt = cust.is_tax_exempt if self.is_tax_exempt.nil?
|
17
|
+
self.billing_address = cust.billing_address.dup unless self.billing_address.present?
|
18
|
+
self.shipping_address = cust.shipping_address.dup unless self.shipping_address.present?
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def set_order_defaults
|
24
|
+
self.location ||= Location.default
|
25
|
+
self.terms ||= customer.terms if self.customer
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
|
33
|
+
def is_order_like
|
34
|
+
self.send :include, InstanceMethods
|
35
|
+
has_sku_loc_lines # pull in the sku_loc_lines module
|
36
|
+
|
37
|
+
validates_associated :lines
|
38
|
+
|
39
|
+
before_validation :set_order_defaults, :on=>:create
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Skr
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
module IsSkuLocLine
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
module InstanceMethods
|
9
|
+
def uom_record
|
10
|
+
if self.association(:sku).loaded? && self.sku.association(:uoms).loaded?
|
11
|
+
self.sku.uoms.detect{|uom| uom.code == self.uom_code }
|
12
|
+
else
|
13
|
+
self.sku.uoms.where({ code: self.uom_code }).first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def ea_qty
|
18
|
+
self.qty*self.uom_size
|
19
|
+
end
|
20
|
+
|
21
|
+
def is_other_charge?
|
22
|
+
self.sku.is_other_charge?
|
23
|
+
end
|
24
|
+
|
25
|
+
def extended_price
|
26
|
+
self.price && self.qty ? self.price * self.qty : BigDecimal.new(0)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def ensure_sku_does_not_change
|
32
|
+
errors.add(:sku, "can not be updated") if changes['sku_code']
|
33
|
+
if change = changes['sku_loc_id']
|
34
|
+
# allow if the sku_id is the same on both old & new locations
|
35
|
+
unless 1 == SkuLoc.where( id: change ).pluck('sku_id').uniq.length
|
36
|
+
errors.add(:sku, "must be the same in both locations") if sku_code_changed?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
module ClassMethods
|
43
|
+
|
44
|
+
def is_sku_loc_line( parent: nil )
|
45
|
+
self.send :include, InstanceMethods
|
46
|
+
|
47
|
+
validate :ensure_sku_does_not_change, :on=>:update
|
48
|
+
|
49
|
+
if parent
|
50
|
+
before_create do
|
51
|
+
self.position ||= ( self.send( parent ).lines.maximum(:position) || 0 ) + 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
export_methods :extended_price, :optional=>false
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|