shoppe 0.0.15 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -0
- data/Rakefile +21 -1
- data/app/assets/javascripts/shoppe/application.coffee +5 -0
- data/app/assets/stylesheets/shoppe/application.scss +16 -3
- data/app/assets/stylesheets/shoppe/elements.scss +8 -0
- data/app/assets/stylesheets/shoppe/printable.scss +67 -0
- data/app/controllers/shoppe/application_controller.rb +1 -10
- data/app/controllers/shoppe/orders_controller.rb +4 -0
- data/app/controllers/shoppe/sessions_controller.rb +1 -0
- data/app/controllers/shoppe/settings_controller.rb +12 -0
- data/app/controllers/shoppe/users_controller.rb +2 -2
- data/app/controllers/shoppe/variants_controller.rb +1 -1
- data/app/helpers/shoppe/application_helper.rb +63 -8
- data/app/mailers/shoppe/order_mailer.rb +5 -7
- data/app/mailers/shoppe/user_mailer.rb +2 -2
- data/app/models/shoppe/country.rb +17 -1
- data/app/models/shoppe/delivery_service.rb +15 -0
- data/app/models/shoppe/delivery_service_price.rb +17 -0
- data/app/models/shoppe/order.rb +82 -9
- data/app/models/shoppe/order_item.rb +18 -0
- data/app/models/shoppe/product.rb +26 -1
- data/app/models/shoppe/product/product_attributes.rb +1 -1
- data/app/models/shoppe/product/variants.rb +3 -3
- data/app/models/shoppe/product_attribute.rb +15 -0
- data/app/models/shoppe/product_category.rb +12 -0
- data/app/models/shoppe/setting.rb +59 -0
- data/app/models/shoppe/stock_level_adjustment.rb +15 -0
- data/app/models/shoppe/tax_rate.rb +13 -1
- data/app/models/shoppe/user.rb +13 -0
- data/app/views/layouts/shoppe/application.html.haml +2 -1
- data/app/views/layouts/shoppe/printable.html.haml +11 -0
- data/app/views/shoppe/delivery_service_prices/index.html.haml +1 -1
- data/app/views/shoppe/order_mailer/accepted.text.erb +2 -2
- data/app/views/shoppe/order_mailer/received.text.erb +2 -2
- data/app/views/shoppe/order_mailer/rejected.text.erb +2 -2
- data/app/views/shoppe/order_mailer/shipped.text.erb +2 -2
- data/app/views/shoppe/orders/despatch_note.html.haml +45 -0
- data/app/views/shoppe/orders/index.html.haml +2 -2
- data/app/views/shoppe/orders/show.html.haml +21 -11
- data/app/views/shoppe/settings/edit.html.haml +19 -0
- data/app/views/shoppe/user_mailer/new_password.text.erb +1 -1
- data/app/views/shoppe/variants/form.html.haml +4 -0
- data/config/locales/en.yml +34 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20130926094549_create_shoppe_initial_schema.rb +92 -33
- data/db/seeds.rb +1 -1
- data/lib/shoppe.rb +13 -35
- data/lib/shoppe/engine.rb +6 -6
- data/lib/shoppe/settings.rb +28 -0
- data/lib/shoppe/settings_loader.rb +16 -0
- data/lib/shoppe/setup_generator.rb +0 -4
- data/lib/shoppe/version.rb +1 -1
- data/test/{dummy → app}/README.rdoc +0 -0
- data/test/{dummy → app}/Rakefile +0 -0
- data/test/{dummy → app}/app/assets/javascripts/application.js +0 -0
- data/test/{dummy → app}/app/assets/stylesheets/application.css +0 -0
- data/test/{dummy → app}/app/controllers/application_controller.rb +0 -0
- data/test/{dummy → app}/app/helpers/application_helper.rb +0 -0
- data/test/{dummy → app}/app/views/layouts/application.html.erb +0 -0
- data/test/{dummy → app}/bin/bundle +0 -0
- data/test/{dummy → app}/bin/rails +0 -0
- data/test/{dummy → app}/bin/rake +0 -0
- data/test/{dummy → app}/config.ru +0 -0
- data/test/{dummy → app}/config/application.rb +0 -0
- data/test/{dummy → app}/config/boot.rb +0 -0
- data/test/app/config/database.example.yml +30 -0
- data/test/{dummy → app}/config/database.yml +9 -5
- data/test/{dummy → app}/config/environment.rb +0 -0
- data/test/{dummy → app}/config/environments/development.rb +0 -0
- data/test/{dummy → app}/config/environments/production.rb +0 -0
- data/test/{dummy → app}/config/environments/test.rb +0 -0
- data/test/{dummy → app}/config/initializers/backtrace_silencers.rb +0 -0
- data/test/{dummy → app}/config/initializers/filter_parameter_logging.rb +0 -0
- data/test/{dummy → app}/config/initializers/inflections.rb +0 -0
- data/test/{dummy → app}/config/initializers/mime_types.rb +0 -0
- data/test/{dummy → app}/config/initializers/secret_token.rb +0 -0
- data/test/app/config/initializers/session_store.rb +3 -0
- data/test/{dummy → app}/config/initializers/wrap_parameters.rb +0 -0
- data/test/{dummy → app}/config/locales/en.yml +0 -0
- data/test/{dummy → app}/config/routes.rb +0 -0
- data/{config/shoppe.example.yml → test/app/config/shoppe.yml} +0 -0
- data/test/{dummy → app}/db/development.sqlite3 +0 -0
- data/test/{dummy → app}/db/migrate/20131017165217_create_nifty_attachments_table.rb +0 -0
- data/test/{dummy → app}/db/migrate/20131017165222_create_nifty_key_value_store_table.rb +0 -0
- data/test/{dummy → app}/db/schema.rb +31 -16
- data/test/{dummy → app}/db/test.sqlite3 +0 -0
- data/test/app/log/development.log +8093 -0
- data/test/{dummy → app}/log/test.log +0 -0
- data/test/{dummy → app}/public/404.html +0 -0
- data/test/{dummy → app}/public/422.html +0 -0
- data/test/{dummy → app}/public/500.html +0 -0
- data/test/{dummy → app}/public/favicon.ico +0 -0
- data/test/app/tmp/cache/assets/development/sass/7c98994848dbb534749f971b176724aa382339bb/dialog.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/application.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/dialog.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/elements.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/reset.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/sub.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/variables.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/06d540cec125e08e63a898c35e8235d6 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/0a6bca3e510625f255083bd154cc470b +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/0d8942b2279b6bc7c68b3db3e2e4c342 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/122a65fdcbb923c3c1cd95549ef52f43 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/140840b7aefa4bf5beda2c32e20374a6 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/160ddfa6141944c4a03757fe91643137 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/1bb0d399b6b81fc3b47ff794b066873f +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/1e1679158bd397a720be46fa3a5876a3 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/2a75ba35f8e751887ba89a914363fefd +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/2cc6ef740b5691af5ee246c0dbc68f14 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/2f80004fb2e2ce07283a83ac15cf920a +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/322295abdd8625fcce4da08f9565cc63 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/421b79f445cd87f3532a5c445877cbec +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4528fe4a109cad1ff031659cd9eeae17 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/45a9c7dfe9986570daa4c972277375ec +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/48b2cd7153bbc442eaa84c3e24e963e0 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4c3fef5a3e293ed6b6df3d869f54e1d1 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4c8cb5cfd87990ebddbaa5b5fd594be5 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4cefa37a52d669d3ca7e6aa1e1aaf435 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4ea4f5c13aaeda9a7d39684ab72fa710 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4ecd1cb66cb36718daadcfba0aa42c1e +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4ed3cbd180c275b98627eaeea4c9c838 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/519aa2b3c3ab8fd8f065c56507111878 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/51d409a48872319ac6a731aa880e6368 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/55bae604bcb5ccf7d9e0ed0fd61953b6 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/5805d2c402f412642d86ec03a7ec4a3d +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/5cd772b44cdeae4d3b37b62193e946eb +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/5f32b259cbcc52156d2fe21c185d9390 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/656ea3403f27a33b86d5bf9e8a0c0e46 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/679705affe2ad274da1ad48cb5137c21 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/69a687de4cbb95365bf8aa2037d63726 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/69d5224a79e874431294e8adf04e7d65 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/6bc5a76ff13bc4daebb7e164a4b64196 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/6c1a5456c2e5d87285dd1910762fe01e +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/6d52ff2c9298014f2d648eb9e04a61a6 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/7938636d16e11b754d4dd046b89863c4 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/7ce7981501e05438faa017eb2e197379 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/7e232a7b4ac10fe1350e2b9b05ab0b02 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/81d7800826e89041f377af8570b8324f +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/81f524fed55fe63e95c1aeccb5d83571 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/85984636ee801f63af86b35d7697d4c5 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/88de2cf8ce5990c5fa59f7c9f4599a65 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/8932a78ffe18ad2e3bb7ceb90ac4b933 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/8d6fd863923e78438318b02bf83be1c4 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/8f43db1e57a90ffbae3be00a895d5a09 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/91e11940ab63a407af03d21720ac2951 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/938abfdc262a8ab42e768545640bfb2a +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/9e760b9565b110e433b7e42f827cb5f8 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/9e8fbfd56e8ef705ba94bb03b5b3696e +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/9ebbf73fb48cdf8bc07a8bfdd6d14328 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/9f240d481b0818a6da0b1a1aaaac2b54 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/a2b956b30a80f996b5aeb1b2f226775c +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/a5b5ed9849e8019160b73aa554132b37 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/a692ba7ed6cff183bb840c2622233c87 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/a951f4ceb83ae691f002b4f6183bc1ed +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/accc4dc17ef18d0b510917a005340da5 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b2db166e9974feb35358e7fcce87cb39 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b519a4f6c5b5a0d9236bdca14e0eb00d +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b5cbeb3def40b118469fff2d80c1b596 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b6f65271a0e77b349529ce9148dd2782 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b9ad7ea18b7e55c3626a15d1dae142ed +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/bc384ea2fdcc667aa4282209caba921f +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/bcf06bf434bb3d3a5769036d6e24b301 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/bd83357635155d3457747e92e47da0ed +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/c39634555e4eba3595350eeea648ddf4 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/c3ef336ca8f7e64969d8bfdcf837ad10 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/c55037904a95162828e5d0b087677878 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/c733f1a2fe9d05a3a634ff64a394f64b +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/c83a337688a52890ba93372fea6ec932 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/ca92d0dbc43c066af9b31f2bc26d038d +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/cae2fc80bfbc81ec7b6c11a72be18c98 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/cd665363677ffcef0dde972284e8d942 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/d5154a1eda9cfbfe54e091d6ead1ac5f +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/daa7fa7a610bc5951cc3c4403f290eb6 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/dabc0e94bc1e37007351ac756dd2dd6a +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/edf3c55a27678996371bffe56298925b +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/f0f04c3b2b0091fa3ca4a1edacc23a1c +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/f8610737fbfdcb85db95ae7c6a70514e +0 -0
- data/test/app/tmp/restart.txt +0 -0
- data/test/shoppe_test.rb +0 -5
- data/test/test_helper.rb +1 -1
- metadata +298 -98
- data/app/helpers/shoppe/shoppe_helper.rb +0 -30
- data/db/migrate/20131012123829_create_shoppe_product_attributes.rb +0 -11
- data/db/migrate/20131012163301_add_public_boolean_to_product_attributes.rb +0 -5
- data/db/migrate/20131013123937_add_cost_prices_to_various_objects.rb +0 -8
- data/db/migrate/20131013131658_add_stock_control_boolean_to_products.rb +0 -5
- data/db/migrate/20131017144430_create_shoppe_stock_level_adjustments.rb +0 -18
- data/db/migrate/20131017180920_create_shoppe_countries.rb +0 -16
- data/db/migrate/20131017183211_create_shoppe_tax_rates.rb +0 -26
- data/db/migrate/20131020204719_add_countries_to_tax_rates_and_delivery_prices.rb +0 -6
- data/db/migrate/20131021135208_add_notes_to_orders.rb +0 -5
- data/db/migrate/20131022090919_refactor_order_items_to_allow_any_product.rb +0 -6
- data/db/migrate/20131022092904_rename_product_title_to_name.rb +0 -5
- data/db/migrate/20131022093538_stock_level_adjustments_should_be_polymorphic.rb +0 -6
- data/db/migrate/20131022135331_add_parent_id_to_products.rb +0 -5
- data/db/migrate/20131022145653_cost_price_should_be_default_to_zero.rb +0 -9
- data/test/dummy/config/initializers/session_store.rb +0 -3
- data/test/dummy/config/shoppe.yml +0 -7
- data/test/dummy/log/development.log +0 -1162
@@ -0,0 +1,45 @@
|
|
1
|
+
- @page_title = "Order #{@order.number}"
|
2
|
+
|
3
|
+
.despatchNote
|
4
|
+
%header
|
5
|
+
%h1= Shoppe.settings.store_name
|
6
|
+
%h2= t('.despatch_note')
|
7
|
+
.address
|
8
|
+
%p.name= @order.delivery_name
|
9
|
+
%p= @order.delivery_address1
|
10
|
+
%p= @order.delivery_address2
|
11
|
+
%p= @order.delivery_address3
|
12
|
+
%p= @order.delivery_address4
|
13
|
+
%p= @order.delivery_postcode
|
14
|
+
%p= @order.delivery_country.try(:name)
|
15
|
+
|
16
|
+
%table.details
|
17
|
+
%tr
|
18
|
+
%th= t('.order_number')
|
19
|
+
%th= t('.order_placed')
|
20
|
+
%th= t('.total_weight')
|
21
|
+
%th= t('.telephone')
|
22
|
+
%tr
|
23
|
+
%td= @order.number
|
24
|
+
%td= @order.received_at.to_s(:long)
|
25
|
+
%td= number_to_weight @order.total_weight
|
26
|
+
%td= @order.phone_number
|
27
|
+
|
28
|
+
%table.items
|
29
|
+
%thead
|
30
|
+
%tr
|
31
|
+
%th= t('.quantity')
|
32
|
+
%th= t('.product')
|
33
|
+
%th= t('.sku')
|
34
|
+
%th= t('.weight')
|
35
|
+
%th= t('.packed?')
|
36
|
+
%tbody
|
37
|
+
- for item in @order.order_items
|
38
|
+
%tr
|
39
|
+
%td= item.quantity
|
40
|
+
%td= item.ordered_item.full_name
|
41
|
+
%td= item.ordered_item.sku
|
42
|
+
%td= number_to_weight item.weight
|
43
|
+
%td.check
|
44
|
+
|
45
|
+
%p.footer= t('.footer', :default => "Thank you for your order!")
|
@@ -13,8 +13,8 @@
|
|
13
13
|
%dd= f.text_field :id_eq
|
14
14
|
%dt= f.label :first_name_or_last_name_or_company_cont, "Customer"
|
15
15
|
%dd= f.text_field :first_name_or_last_name_or_company_cont
|
16
|
-
%dt= f.label :address1_or_address2_or_address3_or_address4_or_postcode_cont, "Address"
|
17
|
-
%dd= f.text_field :
|
16
|
+
%dt= f.label :address1_or_address2_or_address3_or_address4_or_postcode_cont, "Billing Address"
|
17
|
+
%dd= f.text_field :billing_address1_or_billing_address2_or_billing_address3_or_billing_address4_or_billing_postcode_cont
|
18
18
|
%dt= f.label :consignment_number_cont, "Consignment Number"
|
19
19
|
%dd= f.text_field :consignment_number_cont
|
20
20
|
%dt= f.label :received_at_eq, "Received between"
|
@@ -1,7 +1,9 @@
|
|
1
1
|
- @page_title = 'Order #' + @order.number
|
2
2
|
|
3
3
|
= content_for :header do
|
4
|
-
%p.buttons
|
4
|
+
%p.buttons
|
5
|
+
= link_to "Despatch Note", [:despatch_note, @order], :class => 'button', :rel => 'print'
|
6
|
+
= link_to "Back to orders", :orders, :class => 'button grey'
|
5
7
|
%h2.orders Order <b>##{@order.number}</b>
|
6
8
|
|
7
9
|
#order
|
@@ -12,14 +14,22 @@
|
|
12
14
|
%dd= @order.first_name + ' ' + @order.last_name
|
13
15
|
%dt Company
|
14
16
|
%dd= @order.company.blank? ? '-' : @order.company
|
15
|
-
%dt Address
|
16
|
-
%dd= @order.
|
17
|
-
%dd= @order.
|
18
|
-
%dd= @order.
|
19
|
-
%dd= @order.
|
20
|
-
%
|
21
|
-
%dd= @order.
|
22
|
-
|
17
|
+
%dt Billing#{@order.separate_delivery_address? ? '' : '/Delivery'} Address
|
18
|
+
%dd= @order.billing_address1
|
19
|
+
%dd= @order.billing_address2
|
20
|
+
%dd= @order.billing_address3
|
21
|
+
%dd= @order.billing_address4
|
22
|
+
%dd= @order.billing_postcode
|
23
|
+
%dd= @order.billing_country.try(:name)
|
24
|
+
- if @order.separate_delivery_address?
|
25
|
+
%dt Delivery Address
|
26
|
+
%dd= @order.delivery_name
|
27
|
+
%dd= @order.delivery_address1
|
28
|
+
%dd= @order.delivery_address2
|
29
|
+
%dd= @order.delivery_address3
|
30
|
+
%dd= @order.delivery_address4
|
31
|
+
%dd= @order.delivery_postcode
|
32
|
+
%dd= @order.delivery_country.try(:name)
|
23
33
|
.right
|
24
34
|
%dl
|
25
35
|
%dt E-Mail Address
|
@@ -27,7 +37,7 @@
|
|
27
37
|
%dt Telephone
|
28
38
|
%dd= @order.phone_number
|
29
39
|
%dt Weight
|
30
|
-
%dd
|
40
|
+
%dd= number_to_weight @order.total_weight
|
31
41
|
%dt Build Time
|
32
42
|
%dd= distance_of_time_in_words(@order.created_at, @order.received_at)
|
33
43
|
|
@@ -98,7 +108,7 @@
|
|
98
108
|
%th SKU
|
99
109
|
%th.money Cost
|
100
110
|
%th.money Price
|
101
|
-
%th.money= Shoppe.
|
111
|
+
%th.money= Shoppe.settings.tax_name
|
102
112
|
%th.money Sub-Total
|
103
113
|
%tbody
|
104
114
|
- for item in @order.order_items
|
@@ -0,0 +1,19 @@
|
|
1
|
+
- @page_title = "Settings"
|
2
|
+
|
3
|
+
= content_for :header do
|
4
|
+
%h2.settings Settings
|
5
|
+
|
6
|
+
= form_tag :url => settings_path do |f|
|
7
|
+
|
8
|
+
- Shoppe.setting_groups.each do |group, fields|
|
9
|
+
= field_set_tag t(group) do
|
10
|
+
- fields.each do |f|
|
11
|
+
%dl.sided
|
12
|
+
%dt= settings_label f
|
13
|
+
%dd
|
14
|
+
= settings_field f
|
15
|
+
- if v = t("shoppe.settings.help")[f]
|
16
|
+
%p.help= v
|
17
|
+
|
18
|
+
%p.submit.sided
|
19
|
+
= submit_tag "Save Settings", :class => 'button green'
|
@@ -56,6 +56,10 @@
|
|
56
56
|
= f.check_box :active
|
57
57
|
= f.label :active, "If checked, this product will be displayed within the public store"
|
58
58
|
%dl.half
|
59
|
+
%dt= f.label :default, "Default varient?"
|
60
|
+
%dd.checkbox
|
61
|
+
= f.check_box :default
|
62
|
+
= f.label :default, "If checked, this varient will be the default"
|
59
63
|
|
60
64
|
%p.submit
|
61
65
|
- unless @variant.new_record?
|
@@ -0,0 +1,34 @@
|
|
1
|
+
en:
|
2
|
+
shoppe:
|
3
|
+
|
4
|
+
settings:
|
5
|
+
|
6
|
+
types:
|
7
|
+
# Force certain settings to certain type
|
8
|
+
demo_mode: boolean
|
9
|
+
|
10
|
+
labels:
|
11
|
+
# Labels for fields go here
|
12
|
+
email_address: Store E-Mail Address
|
13
|
+
|
14
|
+
options:
|
15
|
+
# Options for boolean settings
|
16
|
+
demo_mode:
|
17
|
+
affirmative: Enabled
|
18
|
+
negative: Disabled
|
19
|
+
|
20
|
+
help:
|
21
|
+
# Help text for individual fields
|
22
|
+
store_name: This is the name of your store which will be used through the Shoppe admin interface as well as in the default outbound e-mail messages.
|
23
|
+
email_address: The e-mail address to use when sending outbound messages. Must just be an e-mail address.
|
24
|
+
currency_unit: The symbol to be displayed before all numbers which relate to money. Only applies to the admin interface and must be implemented separately in your base application.
|
25
|
+
tax_name: The name for "Tax" which will be displayed in your admin interface. Commonly replaced with VAT in European countries.
|
26
|
+
demo_mode: If enabled, your Shoppe admin interface will allow any users to login and will not permit changes to your users. This should be used with caution and never enabled for a production store.
|
27
|
+
|
28
|
+
defaults:
|
29
|
+
store_name: Widgets Inc.
|
30
|
+
email_address: sales@example.com
|
31
|
+
currency_unit: $
|
32
|
+
tax_name: Tax
|
33
|
+
demo_mode: false
|
34
|
+
|
data/config/routes.rb
CHANGED
@@ -11,6 +11,7 @@ Shoppe::Engine.routes.draw do
|
|
11
11
|
post :reject, :on => :member
|
12
12
|
post :ship, :on => :member
|
13
13
|
post :pay, :on => :member
|
14
|
+
get :despatch_note, :on => :member
|
14
15
|
end
|
15
16
|
resources :stock_level_adjustments, :only => [:index, :create]
|
16
17
|
resources :delivery_services do
|
@@ -19,6 +20,10 @@ Shoppe::Engine.routes.draw do
|
|
19
20
|
resources :tax_rates
|
20
21
|
resources :users
|
21
22
|
resources :attachments, :only => :destroy
|
23
|
+
|
24
|
+
get 'settings'=> 'settings#edit'
|
25
|
+
post 'settings' => 'settings#update'
|
26
|
+
|
22
27
|
get 'login' => 'sessions#new'
|
23
28
|
post 'login' => 'sessions#create'
|
24
29
|
match 'login/reset' => 'sessions#reset', :via => [:get, :post]
|
@@ -1,17 +1,29 @@
|
|
1
1
|
class CreateShoppeInitialSchema < ActiveRecord::Migration
|
2
2
|
def up
|
3
|
-
create_table "
|
3
|
+
create_table "shoppe_countries" do |t|
|
4
|
+
t.string "name"
|
5
|
+
t.string "code2"
|
6
|
+
t.string "code3"
|
7
|
+
t.string "continent"
|
8
|
+
t.string "tld"
|
9
|
+
t.string "currency"
|
10
|
+
t.boolean "eu_member", default: false
|
11
|
+
end
|
12
|
+
|
13
|
+
create_table "shoppe_delivery_service_prices" do |t|
|
4
14
|
t.integer "delivery_service_id"
|
5
15
|
t.string "code"
|
6
16
|
t.decimal "price", precision: 8, scale: 2
|
7
|
-
t.decimal "
|
17
|
+
t.decimal "cost_price", precision: 8, scale: 2
|
18
|
+
t.integer "tax_rate_id"
|
8
19
|
t.decimal "min_weight", precision: 8, scale: 2
|
9
20
|
t.decimal "max_weight", precision: 8, scale: 2
|
10
21
|
t.datetime "created_at"
|
11
22
|
t.datetime "updated_at"
|
23
|
+
t.text "country_ids"
|
12
24
|
end
|
13
25
|
|
14
|
-
create_table "shoppe_delivery_services"
|
26
|
+
create_table "shoppe_delivery_services" do |t|
|
15
27
|
t.string "name"
|
16
28
|
t.string "code"
|
17
29
|
t.boolean "default", default: false
|
@@ -22,28 +34,31 @@ class CreateShoppeInitialSchema < ActiveRecord::Migration
|
|
22
34
|
t.string "tracking_url"
|
23
35
|
end
|
24
36
|
|
25
|
-
create_table "shoppe_order_items"
|
37
|
+
create_table "shoppe_order_items" do |t|
|
26
38
|
t.integer "order_id"
|
27
|
-
t.integer "
|
28
|
-
t.
|
29
|
-
t.
|
30
|
-
t.decimal "
|
31
|
-
t.decimal "
|
32
|
-
t.decimal "
|
39
|
+
t.integer "ordered_item_id"
|
40
|
+
t.string "ordered_item_type"
|
41
|
+
t.integer "quantity", default: 1
|
42
|
+
t.decimal "unit_price", precision: 8, scale: 2
|
43
|
+
t.decimal "unit_cost_price", precision: 8, scale: 2
|
44
|
+
t.decimal "tax_amount", precision: 8, scale: 2
|
45
|
+
t.decimal "tax_rate", precision: 8, scale: 2
|
46
|
+
t.decimal "weight", precision: 8, scale: 3, default: 0.0
|
33
47
|
t.datetime "created_at"
|
34
48
|
t.datetime "updated_at"
|
35
49
|
end
|
36
50
|
|
37
|
-
create_table "shoppe_orders"
|
51
|
+
create_table "shoppe_orders" do |t|
|
38
52
|
t.string "token"
|
39
53
|
t.string "first_name"
|
40
54
|
t.string "last_name"
|
41
55
|
t.string "company"
|
42
|
-
t.string "
|
43
|
-
t.string "
|
44
|
-
t.string "
|
45
|
-
t.string "
|
46
|
-
t.string "
|
56
|
+
t.string "billing_address1"
|
57
|
+
t.string "billing_address2"
|
58
|
+
t.string "billing_address3"
|
59
|
+
t.string "billing_address4"
|
60
|
+
t.string "billing_postcode"
|
61
|
+
t.integer "billing_country_id"
|
47
62
|
t.string "email_address"
|
48
63
|
t.string "phone_number"
|
49
64
|
t.string "status"
|
@@ -53,9 +68,10 @@ class CreateShoppeInitialSchema < ActiveRecord::Migration
|
|
53
68
|
t.datetime "created_at"
|
54
69
|
t.datetime "updated_at"
|
55
70
|
t.integer "delivery_service_id"
|
56
|
-
t.decimal "delivery_price",
|
57
|
-
t.decimal "
|
58
|
-
t.decimal "
|
71
|
+
t.decimal "delivery_price", precision: 8, scale: 2
|
72
|
+
t.decimal "delivery_cost_price", precision: 8, scale: 2
|
73
|
+
t.decimal "delivery_tax_rate", precision: 8, scale: 2
|
74
|
+
t.decimal "delivery_tax_amount", precision: 8, scale: 2
|
59
75
|
t.datetime "paid_at"
|
60
76
|
t.integer "accepted_by"
|
61
77
|
t.integer "shipped_by"
|
@@ -63,12 +79,31 @@ class CreateShoppeInitialSchema < ActiveRecord::Migration
|
|
63
79
|
t.datetime "rejected_at"
|
64
80
|
t.integer "rejected_by"
|
65
81
|
t.string "ip_address"
|
66
|
-
t.string "country"
|
67
82
|
t.string "payment_reference"
|
68
83
|
t.string "payment_method"
|
84
|
+
t.text "notes"
|
85
|
+
t.boolean "separate_delivery_address", default: false
|
86
|
+
t.string "delivery_name"
|
87
|
+
t.string "delivery_address1"
|
88
|
+
t.string "delivery_address2"
|
89
|
+
t.string "delivery_address3"
|
90
|
+
t.string "delivery_address4"
|
91
|
+
t.string "deilvery_postcode"
|
92
|
+
t.integer "delivery_country_id"
|
69
93
|
end
|
70
94
|
|
71
|
-
create_table "
|
95
|
+
create_table "shoppe_product_attributes" do |t|
|
96
|
+
t.integer "product_id"
|
97
|
+
t.string "key"
|
98
|
+
t.string "value"
|
99
|
+
t.integer "position", default: 1
|
100
|
+
t.boolean "searchable", default: true
|
101
|
+
t.datetime "created_at"
|
102
|
+
t.datetime "updated_at"
|
103
|
+
t.boolean "public", default: true
|
104
|
+
end
|
105
|
+
|
106
|
+
create_table "shoppe_product_categories" do |t|
|
72
107
|
t.string "name"
|
73
108
|
t.string "permalink"
|
74
109
|
t.text "description"
|
@@ -76,9 +111,10 @@ class CreateShoppeInitialSchema < ActiveRecord::Migration
|
|
76
111
|
t.datetime "updated_at"
|
77
112
|
end
|
78
113
|
|
79
|
-
create_table "shoppe_products"
|
114
|
+
create_table "shoppe_products" do |t|
|
115
|
+
t.integer "parent_id"
|
80
116
|
t.integer "product_category_id"
|
81
|
-
t.string "
|
117
|
+
t.string "name"
|
82
118
|
t.string "sku"
|
83
119
|
t.string "permalink"
|
84
120
|
t.text "description"
|
@@ -86,15 +122,42 @@ class CreateShoppeInitialSchema < ActiveRecord::Migration
|
|
86
122
|
t.boolean "active", default: true
|
87
123
|
t.decimal "weight", precision: 8, scale: 3, default: 0.0
|
88
124
|
t.decimal "price", precision: 8, scale: 2, default: 0.0
|
89
|
-
t.decimal "
|
90
|
-
t.integer "
|
125
|
+
t.decimal "cost_price", precision: 8, scale: 2, default: 0.0
|
126
|
+
t.integer "tax_rate_id"
|
91
127
|
t.datetime "created_at"
|
92
128
|
t.datetime "updated_at"
|
93
129
|
t.boolean "featured", default: false
|
94
130
|
t.text "in_the_box"
|
131
|
+
t.boolean "stock_control", default: true
|
132
|
+
t.boolean "default", default: false
|
133
|
+
end
|
134
|
+
|
135
|
+
create_table "shoppe_settings" do |t|
|
136
|
+
t.string "key"
|
137
|
+
t.string "value"
|
138
|
+
t.string "value_type"
|
95
139
|
end
|
96
140
|
|
97
|
-
create_table "
|
141
|
+
create_table "shoppe_stock_level_adjustments" do |t|
|
142
|
+
t.integer "item_id"
|
143
|
+
t.string "item_type"
|
144
|
+
t.string "description"
|
145
|
+
t.integer "adjustment", default: 0
|
146
|
+
t.string "parent_type"
|
147
|
+
t.integer "parent_id"
|
148
|
+
t.datetime "created_at"
|
149
|
+
t.datetime "updated_at"
|
150
|
+
end
|
151
|
+
|
152
|
+
create_table "shoppe_tax_rates" do |t|
|
153
|
+
t.string "name"
|
154
|
+
t.decimal "rate", precision: 8, scale: 2
|
155
|
+
t.datetime "created_at"
|
156
|
+
t.datetime "updated_at"
|
157
|
+
t.text "country_ids"
|
158
|
+
end
|
159
|
+
|
160
|
+
create_table "shoppe_users" do |t|
|
98
161
|
t.string "first_name"
|
99
162
|
t.string "last_name"
|
100
163
|
t.string "email_address"
|
@@ -105,12 +168,8 @@ class CreateShoppeInitialSchema < ActiveRecord::Migration
|
|
105
168
|
end
|
106
169
|
|
107
170
|
def down
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
drop_table :shoppe_orders
|
112
|
-
drop_table :shoppe_product_categories
|
113
|
-
drop_table :shoppe_products
|
114
|
-
drop_table :shoppe_users
|
171
|
+
[:users, :tax_rates, :stock_level_adjustments, :settings, :products, :product_categories, :product_attributes, :orders, :order_items, :delivery_services, :delivery_service_prices, :countries].each do |table|
|
172
|
+
drop_table "shoppe_#{table}"
|
173
|
+
end
|
115
174
|
end
|
116
175
|
end
|
data/db/seeds.rb
CHANGED
@@ -101,7 +101,7 @@ pro.product_attributes.create!(:key => 'Lines', :value => '10', :position => 1)
|
|
101
101
|
pro.product_attributes.create!(:key => 'Colour Screen?', :value => 'Yes', :position => 1)
|
102
102
|
pro.product_attributes.create!(:key => 'Power over ethernet?', :value => 'Yes', :position => 1)
|
103
103
|
|
104
|
-
v1 = pro.variants.create(:name => "White/Grey", :sku => "SM-870-GREY", :price => 230.00, :cost_price => 220, :tax_rate => tax_rate, :weight => 1.35)
|
104
|
+
v1 = pro.variants.create(:name => "White/Grey", :sku => "SM-870-GREY", :price => 230.00, :cost_price => 220, :tax_rate => tax_rate, :weight => 1.35, :default => true)
|
105
105
|
v1.default_image_file = get_file('snom-870-grey.jpg')
|
106
106
|
v1.save!
|
107
107
|
v1.stock_level_adjustments.create(:description => 'Initial Stock', :adjustment => 4)
|
data/lib/shoppe.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "coffee-rails"
|
2
|
+
require "sass-rails"
|
3
|
+
require "jquery-rails"
|
1
4
|
require 'haml'
|
2
5
|
require 'bcrypt'
|
3
6
|
require 'dynamic_form'
|
@@ -14,51 +17,26 @@ module Shoppe
|
|
14
17
|
class Error < StandardError; end
|
15
18
|
|
16
19
|
class << self
|
20
|
+
|
17
21
|
def root
|
18
22
|
File.expand_path('../../', __FILE__)
|
19
23
|
end
|
20
24
|
|
21
|
-
def
|
22
|
-
|
23
|
-
path = Rails.root.join('config', 'shoppe.yml')
|
24
|
-
if File.exist?(path)
|
25
|
-
config = YAML.load_file(path).with_indifferent_access
|
26
|
-
setup_config(config)
|
27
|
-
config
|
28
|
-
else
|
29
|
-
raise InvalidConfiguration, "Shoppe configuration file missing at #{path}"
|
30
|
-
end
|
31
|
-
end
|
25
|
+
def settings
|
26
|
+
Thread.current[:shoppe_settings] ||= Shoppe::Settings.new(Shoppe::Setting.to_hash)
|
32
27
|
end
|
33
28
|
|
34
|
-
def
|
35
|
-
|
29
|
+
def reset_settings
|
30
|
+
Thread.current[:shoppe_settings] = nil
|
36
31
|
end
|
37
32
|
|
38
|
-
def
|
39
|
-
|
33
|
+
def add_setting_group(group, fields = [])
|
34
|
+
setting_groups[group] ||= []
|
35
|
+
setting_groups[group] = setting_groups[group] | fields
|
40
36
|
end
|
41
37
|
|
42
|
-
def
|
43
|
-
|
44
|
-
case req
|
45
|
-
when String, Symbol
|
46
|
-
unless config.keys.include?(req.to_s)
|
47
|
-
raise Shoppe::Errors::InvalidConfiguration, "Missing configuration option '#{scope.join('.')}.#{req}' in shoppe.yml"
|
48
|
-
end
|
49
|
-
when Array
|
50
|
-
validate_config(config, scope, *req)
|
51
|
-
when Hash
|
52
|
-
req.each do |key, value|
|
53
|
-
if config[key] && config[key].is_a?(Hash)
|
54
|
-
scope << key
|
55
|
-
validate_config(config[key], scope, *value)
|
56
|
-
else
|
57
|
-
validate_config(config, scope, key)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
38
|
+
def setting_groups
|
39
|
+
@setting_groups ||= {}
|
62
40
|
end
|
63
41
|
|
64
42
|
end
|