stockor 0.1.5
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 +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
|