Compare commits

..

283 Commits

Author SHA1 Message Date
luisramos0
5077b0e625 Update all locales with the latest Transifex translations 2019-10-08 10:02:54 +01:00
Luis Ramos
1299c0b5eb Merge pull request #4339 from openfoodfoundation/transifex
Transifex
2019-10-08 09:40:54 +01:00
Pau Pérez Fabregat
057572a445 Merge pull request #4321 from luisramos0/fix_pt_br
Delete old pt-BR translations file (it's now correctly called pt_BR)
2019-10-08 08:49:12 +02:00
Pau Pérez Fabregat
3403ab4162 Merge pull request #4340 from openfoodfoundation/sigmundpetersen-patch-1
Delete ISSUE_TEMPLATE.md
2019-10-08 08:48:47 +02:00
Luis Ramos
9a036d18b7 Merge pull request #4271 from luisramos0/no_obsolete_master
Remove logic related to master variants in Exchanges and migrate data
2019-10-07 15:22:53 +01:00
luisramos0
f2b57057cd Add migration to delete all master variants from exchanges and replace them with standard variants 2019-10-07 14:53:44 +01:00
luisramos0
95bc8fa984 Remove logic from OrderCycleDistributedProducts related to obsolete master variants in OCs, this is a condition that will never happen now since we ensure products always have a standard variants
A migration will be added as well to clean up any very old master variants available in order cycles
2019-10-07 14:53:44 +01:00
Luis Ramos
54c44c33eb Merge pull request #4324 from Matt-Yorkley/reports_memoize
Reports memoization
2019-10-07 13:20:03 +01:00
Luis Ramos
8a732568e7 Merge pull request #4325 from kristinalim/feature/4312-remove_find_variant_in_orders_and_fulfillment_report
4312 Use association instead of OrderAndFulfillmentsReport#find_variant
2019-10-07 11:38:37 +01:00
Pau Pérez Fabregat
f4523f0305 Merge pull request #4350 from luisramos0/docker
Update ruby version in dockerfile and in getting started
2019-10-04 16:21:22 +02:00
Transifex-Openfoodnetwork
56a7a49ea2 Updating translations for config/locales/es.yml 2019-10-04 21:23:11 +10:00
Transifex-Openfoodnetwork
7d1ae3bf67 Updating translations for config/locales/es.yml 2019-10-04 21:20:03 +10:00
Transifex-Openfoodnetwork
b9aa4e11da Updating translations for config/locales/ca.yml 2019-10-04 21:19:57 +10:00
Luis Ramos
96428c11c6 Merge pull request #4334 from Matt-Yorkley/products_renderer
Products renderer
2019-10-03 13:47:04 +01:00
Luis Ramos
c15660da0e Merge pull request #4269 from luisramos0/spree_be_config
Move shipping_methods and shipping categories from spree_backend to OFN
2019-10-03 13:45:17 +01:00
Transifex-Openfoodnetwork
9ea05b0794 Updating translations for config/locales/de_DE.yml 2019-10-03 20:48:44 +10:00
luisramos0
c5b939c8ee Update ruby version in dockerfile and in getting started 2019-10-02 23:45:23 +01:00
Luis Ramos
e6408161db Merge pull request #4291 from luisramos0/spree_be_config_taxons
Move taxons and taxonomies from spree_backend to OFN
2019-10-02 21:13:12 +01:00
Luis Ramos
4540b32d3a Merge branch 'master' into spree_be_config_taxons 2019-10-02 15:35:15 +01:00
Luis Ramos
9f8d2fddbc Merge pull request #4292 from luisramos0/spree_be_config_tax
Move tax_rates, tax categories and tax settings from spree_backend to OFN
2019-10-02 15:33:32 +01:00
Luis Ramos
14047c620a Merge branch 'master' into spree_be_config_tax 2019-10-02 15:31:25 +01:00
Luis Ramos
2be1c231f7 Merge pull request #4290 from luisramos0/spree_be_config_zones
Move zones, countries and states from spree_backend to OFN
2019-10-02 14:30:59 +01:00
Luis Ramos
c34646724c Merge pull request #4254 from luisramos0/swagger
Update API swagger docs to reflect current API state
2019-10-02 10:31:13 +01:00
Luis Ramos
b731635270 Merge pull request #4303 from luisramos0/missing_translation
Add missing translation for order.shipment.state "on hand" (with a space between on and hand)
2019-10-02 10:27:33 +01:00
Transifex-Openfoodnetwork
c9a62fad4c Updating translations for config/locales/nb.yml 2019-10-02 16:50:07 +10:00
Transifex-Openfoodnetwork
70169d477c Updating translations for config/locales/nb.yml 2019-10-02 16:47:01 +10:00
Transifex-Openfoodnetwork
d95646ea98 Updating translations for config/locales/en_NZ.yml 2019-10-02 14:29:29 +10:00
Transifex-Openfoodnetwork
d50bf928e1 Updating translations for config/locales/de_DE.yml 2019-10-02 10:58:44 +10:00
Luis Ramos
3f7aff4b8b Merge pull request #4305 from luisramos0/new_product_translations
Make translations in new product page relative and specific to the page
2019-10-01 22:38:49 +01:00
Sigmund Petersen
5fded022d4 Update README.md
Slack invite link changed
2019-10-01 23:09:47 +02:00
Pau Pérez Fabregat
1f644f4020 Merge pull request #4281 from Matt-Yorkley/memcached-apm
Add memcached APM
2019-10-01 18:46:22 +02:00
Matt-Yorkley
cc11d4e5f0 Remove unused user parameter from OrdersAndFulfillmentsReport 2019-10-01 15:59:51 +01:00
Pau Pérez Fabregat
5ecac77aa5 Merge branch 'master' into memcached-apm 2019-10-01 16:58:01 +02:00
Matt-Yorkley
a5d2579c69 Pluck line_item ids instead of all line_items 2019-10-01 15:51:45 +01:00
Matt-Yorkley
112adb11db Pass permissions object into OrdersAndFulfillMentsReport 2019-10-01 15:51:43 +01:00
Transifex-Openfoodnetwork
5fdc11bdc7 Updating translations for config/locales/fr.yml 2019-10-01 23:59:19 +10:00
Matt-Yorkley
c038b485b1 Rename service and methods to remove use of "shop" term 2019-10-01 14:43:47 +01:00
Luis Ramos
19eb93012c Merge pull request #4326 from kristinalim/feature/4310-remove_shipments_count
4310 Do not count order shipments in Order#shipping_method
2019-10-01 11:17:42 +01:00
Luis Ramos
d998ec8453 Merge pull request #4331 from openfoodfoundation/dependabot/bundler/uglifier-4.2.0
Bump uglifier from 4.1.20 to 4.2.0
2019-10-01 11:11:35 +01:00
Luis Ramos
0c93665030 Merge pull request #4335 from Matt-Yorkley/remove_deprecations
Remove deprecation warnings from VariantStock methods
2019-10-01 10:59:57 +01:00
Luis Ramos
c4d298d732 Merge branch 'master' into remove_deprecations 2019-10-01 10:57:10 +01:00
Luis Ramos
8c252fc160 Merge pull request #4341 from openfoodfoundation/dependabot/bundler/webmock-3.7.6
Bump webmock from 3.7.5 to 3.7.6
2019-10-01 10:53:54 +01:00
Pau Pérez Fabregat
c2f8803d72 Merge pull request #4297 from luisramos0/inv_levels
Remove all usages of Spree Config track_inventory_levels
2019-10-01 10:35:20 +02:00
dependabot-preview[bot]
07967275d8 Bump webmock from 3.7.5 to 3.7.6
Bumps [webmock](https://github.com/bblimke/webmock) from 3.7.5 to 3.7.6.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.7.5...v3.7.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-30 22:02:54 +00:00
Sigmund Petersen
c7db1b7fc0 Delete ISSUE_TEMPLATE.md
This ISSUE_TEMPLATE.md file is the old way of handling templates on Github. OFN is now using the new method for handling templates, so this file can be removed. 
This template still comes up as 'Default template' when opening an issue from the Zenhub board. This gives 2 almost equal template choices which is confusing.
2019-09-30 21:18:51 +02:00
Rachel Arnould
fa57d71a23 Merge pull request #4332 from openfoodfoundation/RachL-patch-2
Update story template
2019-09-30 20:06:12 +02:00
Rachel Arnould
be5e7bd18d Merge pull request #4330 from openfoodfoundation/RachL-patch-1
Update bug template
2019-09-30 20:05:51 +02:00
Transifex-Openfoodnetwork
5cfc2613ac Updating translations for config/locales/en_GB.yml 2019-10-01 04:01:28 +10:00
Transifex-Openfoodnetwork
903eb23122 Updating translations for config/locales/en_GB.yml 2019-10-01 03:58:19 +10:00
Luis Ramos
d162e8c087 Merge pull request #4300 from daningenthron/daningenthron/add-a-new-card
Translation: "Add new credit card"
2019-09-30 13:27:25 +01:00
Luis Ramos
75a56c2be5 Merge pull request #4293 from jasonk357/4031-change-user-email-alert
Improve user email change flash alert message
2019-09-30 13:19:40 +01:00
Luis Ramos
07a5963554 Merge pull request #4311 from mkllnk/rails3-deprecations
Replace deprecated validates_presence_of
2019-09-30 13:19:25 +01:00
luisramos0
a6888cf0be Update all locales with the latest Transifex translations 2019-09-30 13:15:45 +01:00
Luis Ramos
ef35db6db2 Merge pull request #4296 from luisramos0/subs_line_items
Make subscription line items handle soft deleted variants
2019-09-30 13:07:10 +01:00
Rachel Arnould
375d4fbffd Add workaround item 2019-09-30 11:02:36 +02:00
Matt-Yorkley
6153789055 Eager-load serialized objects in variant query 2019-09-29 20:44:48 +01:00
Matt-Yorkley
032741c54f Refactor ProductsRenderer variants queries
This removes another N+1 and allows pagination applied to the inital query to also affect the returned variants
2019-09-29 17:41:58 +01:00
Matt-Yorkley
e9acf6e0de Refactor #load_products and memoize 2019-09-29 14:30:04 +01:00
Matt-Yorkley
d5e90c3c6c Extract #load_products logic into a new service 2019-09-29 00:10:47 +01:00
Matt-Yorkley
7e7429446d Remove deprecation warnings from VariantStock methods 2019-09-27 17:28:16 +01:00
Matt-Yorkley
535e389fb4 Query variant stock including overrides
This allows the results to be properly filtered and paginated whilst showing the correct stock, and removes a big N+1
2019-09-27 17:25:52 +01:00
Matt-Yorkley
cecebb82f4 Move distributed products relation out from OrderCycleDistributedProducts 2019-09-27 17:25:50 +01:00
Pau Pérez Fabregat
49665ae360 Merge pull request #4167 from luisramos0/last_dedeface
Move app_wrapper deface to spree/layouts/admin view
2019-09-27 09:21:28 +02:00
Pau Pérez Fabregat
7e5c194515 Merge pull request #4295 from coopdevs/enable-datadog-analytics
Enable trace & search analytics in Datadog
2019-09-27 09:17:03 +02:00
Matt-Yorkley
fe0b3172c7 Move scoper to method 2019-09-27 01:52:45 +01:00
Matt-Yorkley
5b27ed6b9f Remove unnecessary #deleted? check
It should be included in te default product scope
2019-09-27 01:52:29 +01:00
Matt-Yorkley
bef4741e31 Enable analytics in all APM services 2019-09-26 22:38:20 +01:00
Rachel Arnould
d604328bfb Update story template 2019-09-26 21:25:01 +02:00
dependabot-preview[bot]
2af3de51c7 Bump uglifier from 4.1.20 to 4.2.0
Bumps [uglifier](https://github.com/lautis/uglifier) from 4.1.20 to 4.2.0.
- [Release notes](https://github.com/lautis/uglifier/releases)
- [Changelog](https://github.com/lautis/uglifier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/lautis/uglifier/compare/v4.1.20...v4.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-26 19:21:05 +00:00
Rachel Arnould
d0c77a8dc4 Update bug template 2019-09-26 21:20:50 +02:00
Kristina Lim
8fc4ca6f65 Do not use OrderAndFulfillmentsReport#find_variant 2019-09-26 11:45:05 +08:00
Kristina Lim
721a0d3a98 Do not count order shipments in Order#shipping_method 2019-09-26 11:01:06 +08:00
JASON KNOEPFLER
c46fe7b675 encapsulate new unconfirmed email logic 2019-09-25 19:41:33 -07:00
luisramos0
bb372984e1 Deleting old pt-BR translations file, it's now called pt_BR with underscore 2019-09-25 11:26:06 +01:00
Luis Ramos
2489a2f5f5 Merge pull request #4294 from openfoodfoundation/transifex
Transifex
2019-09-25 11:22:58 +01:00
Transifex-Openfoodnetwork
a6698230fe Updating translations for config/locales/en_NZ.yml 2019-09-25 20:13:57 +10:00
Luis Ramos
2f3509bf9b Merge pull request #4287 from luisramos0/mini_racer
Replace therubyracer with mini_racer.
2019-09-24 19:48:50 +01:00
Dan Ingenthron
e8f9ace8e6 Correct translation key on add card link 2019-09-24 13:42:31 -05:00
Luis Ramos
04270b6cec Merge pull request #4286 from luisramos0/transpec
Finish transpec
2019-09-24 19:33:26 +01:00
Matt-Yorkley
1155931ea9 Merge pull request #4280 from luisramos0/knapsack
Update knapsack report
2019-09-24 19:26:27 +01:00
Maikel Linke
efd450606e Replace deprecated validates_presence_of
This syntax has been deprecated in Rails 3:
https://guides.rubyonrails.org/3_0_release_notes.html#patches-and-deprecations
2019-09-24 19:16:05 +10:00
luisramos0
f3bc038c05 Make translations in new product page relative and specific to the page 2019-09-23 17:02:30 +01:00
luisramos0
7817a40a35 Add missing translation for shipment state on hand with space between on and hand 2019-09-23 16:33:59 +01:00
Transifex-Openfoodnetwork
a18f6f5b8f Updating translations for config/locales/fr_CA.yml 2019-09-24 01:01:41 +10:00
Transifex-Openfoodnetwork
403653381c Updating translations for config/locales/en_CA.yml 2019-09-24 00:59:20 +10:00
luisramos0
cd6d34663e Remove all usages of Spree Config track_inventory_levels, this is always true in OFN since v2.0.0 2019-09-22 15:25:24 +01:00
luisramos0
c66e5fe1e9 Make subscription line items handle soft deleted variants
This ensures subscription list page works. The variant can be removed from the subscription by the user in the edit subscription page
2019-09-22 14:59:59 +01:00
JASON KNOEPFLER
4ec8fcd3a6 Assign flash message var from conditional return 2019-09-21 08:10:58 -07:00
Pau Perez
88893a2968 Enable trace & search analytics in Datadog
This will enrich the quality of the reported traces for all web
frameworks in our stack. That means not only memcached as we did in
https://github.com/openfoodfoundation/openfoodnetwork/pull/4266 but
PostgreSQL and Rails too.

After enabling, the Trace Search & Analytics page populates which allows
us to search traces and add APM queries to dashboards.
2019-09-21 14:09:27 +02:00
JASON KNOEPFLER
62599e8dfc Edit user email feature spec 2019-09-20 15:28:25 -07:00
Transifex-Openfoodnetwork
b97c428f72 Updating translations for config/locales/pt_BR.yml 2019-09-21 04:00:00 +10:00
Transifex-Openfoodnetwork
42b074f02e Updating translations for config/locales/pt_BR.yml 2019-09-21 03:56:52 +10:00
JASON KNOEPFLER
07e0951490 Change users#update email change flash alert 2019-09-20 10:35:25 -07:00
luisramos0
fc433ff8f0 Refactor ship methods controller destroy action: remove single action before_filter 2019-09-20 16:29:36 +01:00
luisramos0
8e33437fbb MErge ship method controller decorator with the controller that came from spree 2019-09-20 15:59:24 +01:00
luisramos0
a5103c737d Fix rubocop issues in ship methods controller from spree 2019-09-20 15:58:05 +01:00
luisramos0
37c8f42244 Bring shipping methods and categories controllers from spree_backend 2019-09-20 15:56:24 +01:00
luisramos0
0e8765636b Bring tax_settings from spree_backend to ofn 2019-09-20 15:46:33 +01:00
luisramos0
6855e5c8f4 Fix rubocop issues in feature spec 2019-09-20 15:43:55 +01:00
luisramos0
a96b56239c Transpec feature specs brought from spre_backend 2019-09-20 15:43:55 +01:00
luisramos0
4f9eee2682 Fix feature specs added from spree_backend in the configuration area 2019-09-20 15:43:55 +01:00
luisramos0
44761315c2 Bring feature specs for configuration pages from spree_backend 2019-09-20 15:43:55 +01:00
luisramos0
0d18b1a032 Bring spree/admin configuration routes to ofn 2019-09-20 15:43:55 +01:00
luisramos0
cc0dabcd1e Convert spree/admin/tax_rates from erb to haml 2019-09-20 15:36:58 +01:00
luisramos0
e79c672263 Convert spree/admin/tax_categories from erb to haml 2019-09-20 15:36:54 +01:00
luisramos0
bc6f7934e0 Add spree_backend views related to admin/configuration menu that are missing in ofn 2019-09-20 15:35:49 +01:00
luisramos0
89029f46f9 Fix basic rubocop issues in newly added controller 2019-09-20 15:32:34 +01:00
luisramos0
144369e55f Add tax related controllers from spree_backend related to config 2019-09-20 15:31:30 +01:00
luisramos0
3833cbbf73 Fix rubocop issues in feature spec 2019-09-20 15:24:26 +01:00
luisramos0
5b703a02cd Transpec feature spec brought from spree_backend 2019-09-20 15:24:26 +01:00
luisramos0
1d4aebd3f9 Fix feature spec added from spree_backend 2019-09-20 15:24:15 +01:00
luisramos0
845a764320 Bring taxonomies feature spec from spree_backend 2019-09-20 15:24:06 +01:00
luisramos0
c66579a22f Fix simple rubocop issues in helper 2019-09-20 15:24:06 +01:00
luisramos0
9291bf5c82 Bring taxons_helper from spree 2019-09-20 15:24:06 +01:00
luisramos0
4781ab93ef Bring spree/admin configuration routes to ofn 2019-09-20 15:24:06 +01:00
luisramos0
def9ab7c47 Convert spree/admin/taxons from erb to haml 2019-09-20 15:24:06 +01:00
luisramos0
2a68d34fb0 Convert spree/admin/taxonomies from erb to haml 2019-09-20 15:24:06 +01:00
luisramos0
2ce56aef2c Add spree_backend views related to admin/configuration taxonomies that are missing in ofn 2019-09-20 15:23:45 +01:00
luisramos0
20f965731d Fix basic rubocop issues in recently added controller from spree_backend 2019-09-20 15:14:34 +01:00
luisramos0
8378dce752 Bring taxons config controller that is overriden in ofn to ofn so we can merge them with their decorator in a second step 2019-09-20 15:13:45 +01:00
luisramos0
d7a4e3a896 Add taxonomies controller from spree_backend 2019-09-20 15:12:38 +01:00
luisramos0
7d9de0ca70 Fix rubocop issues in feature specs 2019-09-20 15:07:34 +01:00
luisramos0
f9c6f09cd4 Transpec feature specs brought from spre_backend 2019-09-20 15:06:02 +01:00
luisramos0
4a83eca832 Fix feature specs added from spree_backend in the configuration area 2019-09-20 15:05:21 +01:00
luisramos0
4954db64b3 Bring feature specs for configuration pages from spree_backend 2019-09-20 15:04:45 +01:00
luisramos0
b2c4b97d94 Bring spree/admin configuration routes to ofn 2019-09-20 15:02:01 +01:00
luisramos0
32c1eecece Convert spree/admin/zones from erb to haml 2019-09-20 15:01:06 +01:00
luisramos0
6d8c7a4bee Fix minor detail in states and countries views 2019-09-20 14:57:48 +01:00
luisramos0
bd2045cad7 Convert spree/admin/states from erb to haml 2019-09-20 14:55:36 +01:00
luisramos0
e1c3d2442a Convert spree/admin/countries from erb to haml 2019-09-20 14:55:10 +01:00
luisramos0
3df65d0463 Add spree_backend views related to admin/configuration menu that are missing in ofn 2019-09-20 14:54:55 +01:00
luisramos0
822a17f732 Fix basic rubocop issues in newly added controllers 2019-09-20 14:50:38 +01:00
luisramos0
ffde0307e2 Add controllers from spree_backend related to config 2019-09-20 14:50:01 +01:00
luisramos0
9e57807dc2 Replace therubyracer with mini_racer.
This is being replaced to increase the reliability and speed of asset compilation.
2019-09-20 11:22:07 +01:00
luisramos0
052bac196b Fix problem in spec/features/consumer/shopping/shopping_spec introduced with transpec 2019-09-20 10:33:40 +01:00
luisramos0
00e789b95b Force use of expect over should in spec expectations 2019-09-20 10:29:56 +01:00
luisramos0
a004822019 Transpec spec/features/consumer/shopping/shopping_spec 2019-09-20 10:16:08 +01:00
luisramos0
49f7b4c8e2 Transpec spec/features/consumer/shopping/cart_spec.rb 2019-09-20 10:11:02 +01:00
luisramos0
8b503b51ca Fix typo in spec name 2019-09-20 10:03:52 +01:00
luisramos0
4e431ecf18 Transpec spec/features/consumer/shopping/products_spec.rb 2019-09-20 10:02:27 +01:00
luisramos0
81f8b127db Transpec spec/features/consumer/authentication_spec.rb and spec/features/consumer/producers_spec.rb 2019-09-20 09:53:23 +01:00
luisramos0
f9f81086fd Transpec features/consumer/shopping/variant_overrides_spec 2019-09-20 09:02:43 +01:00
Luis Ramos
9807b432f9 Merge pull request #4272 from openfoodfoundation/dependabot/bundler/webmock-3.7.5
Bump webmock from 3.7.4 to 3.7.5
2019-09-20 08:42:12 +01:00
luisramos0
6b0f3cd4f3 Transpec spec/performance/shop_controller_spec 2019-09-19 20:36:33 +01:00
luisramos0
3c412b7b7d Transpec spec/controllers/api/taxonomies_controller_spec, spec/controllers/api/taxons_controller_spec and spec/models/enterprise_spec 2019-09-19 20:34:30 +01:00
luisramos0
c4e6c0af2b Transpec features/consumer/registration_spec 2019-09-19 20:18:24 +01:00
Matt-Yorkley
e6387197ec Add memcached APM 2019-09-19 19:48:16 +01:00
Luis Ramos
746c4f03f6 Merge pull request #4261 from jasonk357/3979-malformed-referer-error
Guard against malformed request referer
2019-09-19 17:29:18 +01:00
Kristina Lim
3535c4d564 Merge pull request #4240 from Matt-Yorkley/backorder_to_the_future_2
Disentangle on_demand and backordered
2019-09-20 00:05:27 +08:00
luisramos0
37abdb7727 Update knapsack report 2019-09-19 16:58:06 +01:00
dependabot-preview[bot]
47056e3cc1 Bump webmock from 3.7.4 to 3.7.5
Bumps [webmock](https://github.com/bblimke/webmock) from 3.7.4 to 3.7.5.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.7.4...v3.7.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-19 13:10:20 +00:00
Kristina Lim
311ee92e84 Update all locales with the latest Transifex translations 2019-09-19 17:08:17 +08:00
Kristina Lim
241e97d938 Merge pull request #4241 from openfoodfoundation/transifex
Transifex
2019-09-19 16:58:57 +08:00
Pau Pérez Fabregat
85b1ba8eae Merge pull request #4263 from coopdevs/index-frequent-spree-orders-query
Index spree_orders on various columns
2019-09-19 10:12:54 +02:00
Pau Pérez Fabregat
baa4783141 Merge pull request #4260 from jasonk357/4184-delivery-report-default-range
Add default date range to Delivery Report
2019-09-19 09:58:06 +02:00
Transifex-Openfoodnetwork
ce40fcaf7b Updating translations for config/locales/fr.yml 2019-09-19 07:44:00 +10:00
Luis Ramos
40438de7fe Merge pull request #4250 from Matt-Yorkley/ruby-2.1.9
Bump Ruby version from 2.1.5 to 2.1.9
2019-09-18 11:39:15 +01:00
Luis Ramos
29dcd96fca Merge pull request #4265 from openfoodfoundation/dependabot/bundler/simplecov-0.17.1
Bump simplecov from 0.17.0 to 0.17.1
2019-09-18 10:25:54 +01:00
Pau Pérez Fabregat
7fd6a7e654 Merge pull request #4270 from openfoodfoundation/dependabot/bundler/webmock-3.7.4
Bump webmock from 3.7.3 to 3.7.4
2019-09-18 10:11:11 +02:00
dependabot-preview[bot]
8f2a80f199 Bump webmock from 3.7.3 to 3.7.4
Bumps [webmock](https://github.com/bblimke/webmock) from 3.7.3 to 3.7.4.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.7.3...v3.7.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-17 19:21:37 +00:00
Pau Perez
ea41405209 Index spree_orders on various columns
The following query

```sql
SELECT spree_orders . *
FROM spree_orders
WHERE spree_orders . user_id = ?
AND spree_orders . completed_at IS ?
AND spree_orders . created_by_id = ?
ORDER BY created_at DESC LIMIT ?
```

performs quite badly even though LIMIT is always 1 because:

* ORDER BY requires sorting by a column which is not indexed therefore
a sequential scan is performed.
* Although `completed_at` is indexed, `user_id` and `created_by_id` are
not causing a sequential scan.

To make it worse this query is executed very often in the following
controllers among others also related to checkout:

* CartController#populate
* EnterprisesController#Shop
* LineItemsController#bought
* ShopController#products
* ShopController#order_cycle

In some cases this query alone accounts for 66.8% of the total time
of the endpoint.

Results

See by yourself. We move from 56.643ms to 0.077ms. Pretty neat.

```
openfoodnetwork=> explain analyze SELECT "spree_orders".* FROM "spree_orders" WHERE "spree_orders"."user_id" = 1 AND "spree_orders"."completed_at" IS NULL AND "spree_orders"."created_by_id" = 1 ORDER BY created_at DESC LIMIT 1;
                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=11753.03..11753.04 rows=1 width=195) (actual time=56.580..56.580 rows=0 loops=1)
   ->  Sort  (cost=11753.03..11753.04 rows=1 width=195) (actual time=56.578..56.578 rows=0 loops=1)
         Sort Key: created_at DESC
         Sort Method: quicksort  Memory: 25kB
         ->  Seq Scan on spree_orders  (cost=0.00..11753.02 rows=1 width=195) (actual time=56.571..56.571 rows=0 loops=1)
               Filter: ((completed_at IS NULL) AND (user_id = 1) AND (created_by_id = 1))
               Rows Removed by Filter: 256135
 Planning time: 0.252 ms
 Execution time: 56.643 ms
(9 rows)

openfoodnetwork=> CREATE INDEX ON spree_orders (completed_at, user_id, created_by_id, created_at);
CREATE INDEX
openfoodnetwork=> explain analyze SELECT "spree_orders".* FROM "spree_orders" WHERE "spree_orders"."user_id" = 1 AND "spree_orders"."completed_at" IS NULL AND "spree_orders"."created_by_id" = 1 ORDER BY created_at DESC LIMIT 1;
mit  (cost=8.45..8.46 rows=1 width=195) (actual time=0.030..0.030 rows=0 loops=1)
   ->  Sort  (cost=8.45..8.46 rows=1 width=195) (actual time=0.029..0.029 rows=0 loops=1)
         Sort Key: created_at DESC
         Sort Method: quicksort  Memory: 25kB
         ->  Index Scan using spree_orders_completed_at_user_id_created_by_id_created_at_idx on spree_orders  (cost=0.42..8.44 rows=1 width=195) (actual time=0.021..0.021 rows=0 loops=1)
               Index Cond: ((completed_at IS NULL) AND (user_id = 1) AND (created_by_id = 1))
 Planning time: 0.199 ms
 Execution time: 0.077 ms
```
2019-09-17 17:02:14 +02:00
luisramos0
2683efdd3c Add missing update to db/schema by running db:migrate
This was missed in PR 4242
2019-09-17 15:27:56 +01:00
Luis Ramos
ed1c154b78 Merge pull request #4252 from luisramos0/remove_clear_ship_address
On checkout of pickup orders, set ship_address to shipping_address_from_distributor instead of empty Spree::Address.default
2019-09-17 13:18:20 +01:00
Pau Pérez Fabregat
4aba2730f7 Merge pull request #4230 from openfoodfoundation/dependabot/bundler/ddtrace-0.27.0
Bump ddtrace from 0.26.0 to 0.27.0
2019-09-17 13:11:12 +02:00
Pau Pérez Fabregat
07ae51560e Merge pull request #4259 from openfoodfoundation/dependabot/bundler/webmock-3.7.3
Bump webmock from 3.7.2 to 3.7.3
2019-09-17 09:32:21 +02:00
dependabot-preview[bot]
3c5c842bbf Bump simplecov from 0.17.0 to 0.17.1
Bumps [simplecov](https://github.com/colszowka/simplecov) from 0.17.0 to 0.17.1.
- [Release notes](https://github.com/colszowka/simplecov/releases)
- [Changelog](https://github.com/colszowka/simplecov/blob/master/CHANGELOG.md)
- [Commits](https://github.com/colszowka/simplecov/compare/v0.17.0...v0.17.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-16 21:08:17 +00:00
Luis Ramos
e7e4508555 Merge pull request #4242 from Matt-Yorkley/another_cartastrophe
Soft-delete price objects
2019-09-16 17:18:39 +01:00
Luis Ramos
9a3b5d0700 Merge pull request #4257 from daningenthron/daningenthron/payment-method-translation
Fix typo on 'no payment methods' translation keys
2019-09-16 13:18:46 +01:00
Luis Ramos
46353be9a3 Merge pull request #4237 from coopdevs/unobfuscate-bulk-management-action
Add implicit #bulk_management including filter
2019-09-15 12:15:11 +01:00
JASON KNOEPFLER
91a52ead58 Guard against malformed request referer 2019-09-14 09:13:44 -07:00
JASON KNOEPFLER
0f55049eda OrderCycleManagementReport sets default date range before querying for orders 2019-09-13 17:15:57 -07:00
Luis Ramos
83f1a7a9a9 Merge pull request #4258 from coopdevs/fix-test-example-name
Fix test example name
2019-09-13 23:04:45 +01:00
dependabot-preview[bot]
fac118fce2 Bump webmock from 3.7.2 to 3.7.3
Bumps [webmock](https://github.com/bblimke/webmock) from 3.7.2 to 3.7.3.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.7.2...v3.7.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-13 19:19:34 +00:00
Dan Ingenthron
5270cdaa32 Fixed typo on 'no payment methods' translation keys
Modified to remove edits to translation files. These will be updated via Transifex webhook.
2019-09-13 13:43:13 -05:00
luisramos0
caebcdf184 Add correct schemas for EnterpriseShopfront and Variant (not Api::Admin::VariantSerializer but Api::VariantSerializer) 2019-09-13 15:33:54 +01:00
luisramos0
c66a659e8e Fix /products payloads: product, variants and variant overrides 2019-09-13 14:55:18 +01:00
luisramos0
b8b107dd2d Fix api_key header name 2019-09-13 14:27:39 +01:00
Luis Ramos
ecf336fe51 Merge pull request #4244 from luisramos0/fix_truncate_data
Adapt db truncate task to ofn v2 by removing db tables from v1
2019-09-13 13:09:07 +01:00
Matt-Yorkley
a3efd13d46 Update existing Spree::InventoryItem records: change backordered state to on_hand. 2019-09-13 13:05:15 +01:00
Matt-Yorkley
2ff0169016 Replace hard-deleted prices with empty (0.00) price records 2019-09-13 12:55:24 +01:00
Pau Perez
08d37bbed7 Fix test example name
The name wasn't reflecting the method being tested.
2019-09-13 12:55:34 +02:00
Transifex-Openfoodnetwork
b71443ccd8 Updating translations for config/locales/ca.yml 2019-09-13 20:45:12 +10:00
Transifex-Openfoodnetwork
8fd3d9e03c Updating translations for config/locales/es.yml 2019-09-13 20:42:43 +10:00
Transifex-Openfoodnetwork
787727872f Updating translations for config/locales/ca.yml 2019-09-13 20:42:04 +10:00
Pau Pérez Fabregat
5bf72ae780 Merge pull request #4234 from coopdevs/remove-hidden-integrity-check
Remove integrity check for deleted variants in OCs
2019-09-13 11:27:41 +02:00
Pau Pérez Fabregat
290d00f17d Merge pull request #4232 from coopdevs/remove-guard
Remove Guard and Guard-related gems
2019-09-13 11:25:29 +02:00
Pau Perez
3d7bbbbb19 Remove unused Guardfile 2019-09-13 08:25:54 +02:00
luisramos0
3d32987227 Fix taxonomies to represent the endpoints in OFN 2019-09-12 19:52:13 +01:00
luisramos0
902e51e580 Add api/customers endpoints 2019-09-12 19:11:53 +01:00
luisramos0
743cb3b33a Add update product image endpoint and delete enterprise fees endpoint 2019-09-12 18:02:06 +01:00
luisramos0
74e49787f4 Add the remaining missing enterprises endpoints 2019-09-12 15:16:35 +01:00
luisramos0
afa8f97627 Add post and put on enterprises and fix details in shipments endpoints 2019-09-12 13:42:40 +01:00
luisramos0
6e677fecce Remove now inexistent endpoints /new 2019-09-12 13:19:43 +01:00
luisramos0
889a3e6d9d Improve file layout and move Order model to correct place 2019-09-12 13:15:40 +01:00
luisramos0
664be47ac3 Add endpoints for /orders/shipments 2019-09-12 13:08:39 +01:00
Sigmund Petersen
fd77f48aca Merge pull request #4253 from openfoodfoundation/RachL-patch-1
Update Slack invite link
2019-09-12 09:17:37 +02:00
Rachel Arnould
9a31b99de6 Update missing second link 2019-09-11 15:52:44 +02:00
luisramos0
0e4b5ad9ec Remove now gone orders/{order_number} endpoint and its models, may be readded in the near future but the models may be different as these docs refer to the now gone spree_api order rabl representation 2019-09-11 11:35:01 +01:00
luisramos0
5634f4af18 Move orders endpoints above in the file as they are the most important endpoints 2019-09-11 11:34:57 +01:00
luisramos0
0dede39617 Make list of /products/{product_id}/variants endpoints correct according to current code 2019-09-11 11:15:55 +01:00
Transifex-Openfoodnetwork
d98e302047 Updating translations for config/locales/nb.yml 2019-09-11 19:47:09 +10:00
luisramos0
377b4a3755 Do not add ng-controller if main_ng_ctrl_name is not set 2019-09-11 10:36:19 +01:00
luisramos0
0c809b2911 Remove now unused override app_wrapper 2019-09-11 10:35:39 +01:00
luisramos0
33472014f1 Do not add main_ng_app_name if it is not defined 2019-09-11 10:32:30 +01:00
luisramos0
d038c27f1f Fix app_wrapper_attr code by making the content_for tag be only the name of the ng-app and ng-ctrller 2019-09-11 10:32:30 +01:00
luisramos0
3d718d9738 Move admin layout body contents to a separate partial 2019-09-11 10:32:29 +01:00
Luis Ramos
500ef901fd Merge pull request #4164 from luisramos0/little_de_deface
Remove some unused deface overrides and move some others to their views
2019-09-11 10:26:56 +01:00
Matt-Yorkley
a15db65e69 Reload tested variant and price objects 2019-09-11 04:32:19 +01:00
Matt-Yorkley
64a501ee20 Don't index new deleted_at column for spree_prices 2019-09-11 04:29:02 +01:00
Matt-Yorkley
95fcff8bb1 Add migration to remove broken variants from open carts 2019-09-11 04:29:00 +01:00
luisramos0
a2e6b84db2 List the actual actions available in the api/products endpoint 2019-09-10 17:22:52 +01:00
luisramos0
d319f97733 Remove now unexisting endpoints zones, states and countries 2019-09-10 12:36:34 +01:00
Luis Ramos
c0bf7e2e75 Merge pull request #4236 from mkllnk/4222-checkout-paypal-error-handling
4233 Add missing Spree route for Paypal
2019-09-10 12:24:21 +01:00
Luis Ramos
1d177a164b Merge pull request #4247 from mkllnk/4243-inventory-pagination
4243 Restore old pagination API for inventory products
2019-09-10 11:35:04 +01:00
Rachel Arnould
d846c31db9 Update Slack invite link
Updated Slack invite link in README
2019-09-10 09:51:59 +02:00
Maikel Linke
efd01f8c9e Move new inventory spec to existing variant overrides spec
I decided to not share the same data setup with the other parts of the
spec because we don't need as much data and it's slow to create.
2019-09-10 10:05:23 +10:00
luisramos0
fb65c64c68 Keep the ship_address clearing logic (this time reusing the OrderUpdate method) thus making the restart_checkout process work for these cases (because order.ship_address is not empty)
OrderUpdater#shipping_address_from_distributor uses order.address_from_distributor to set order.ship_address when order is not delivery: this will clear the ship address as it was done previously without setting an empty address like Spree::Address.default
2019-09-09 22:05:20 +01:00
Transifex-Openfoodnetwork
b8d8ee4edc Updating translations for config/locales/en_GB.yml 2019-09-10 05:14:09 +10:00
Luis Ramos
936784404e Merge pull request #4112 from luisramos0/convert_shipments_rabl
Convert spree/api/shipments views from rabl to ams
2019-09-09 18:34:02 +01:00
Matt-Yorkley
11ea852211 Add migration to reset negative stock levels to zero 2019-09-09 17:49:58 +01:00
Matt-Yorkley
4656c35f71 Don't change on_demand variant's stock when updating shipments 2019-09-09 17:49:58 +01:00
Matt-Yorkley
254315b79e Don't mark on_demand items and shipments as "backordered" 2019-09-09 17:49:56 +01:00
luisramos0
cc7461e692 Remove clear_ship_address from checkout_controller because it is setting an empty address on order.ship_address which is breaking the reset_checkout process in some cases.
This logic is already repeated in the before_save hook in the OrderUpdater where the distributor address is put into the ship_address on order.finalize

In cases the order is not to be finalized we keep the ship_address sent from the client as we may need it to make the order workflow work properly
2019-09-09 17:48:17 +01:00
luisramos0
c4d5eec7fd Covering restart_checkout code with more tests to clarify behaviour with different order.ship_address objects
The edge case here is when ship_address is present but empty, on the checkout_controller we are going to move from using an empty ship_address to using a non-empty one. We keep the original case where this spec was testing with a nil order.ship_address
2019-09-09 17:48:04 +01:00
Luis Ramos
2dc85463ce Merge pull request #4226 from HugsDaniel/4090-missing-translations-order
Add missing translations for orders
2019-09-09 15:16:47 +01:00
Matt-Yorkley
aa3bd93ad0 Bump Ruby version to 2.1.9 2019-09-09 12:22:20 +01:00
Maikel Linke
24c8bb95cb Restore old pagination API for products
It's still used by the inventory page. This is an easy fix that I can
deploy without risk. A rewrite of the inventory pagination should
follow.
2019-09-09 14:53:04 +10:00
Maikel Linke
2e361baeaa Ignore block length cop for feature and scenario
They are typically long and that's okay, same with `describe` and `it`.
2019-09-09 14:53:04 +10:00
luisramos0
a98a0bd264 Adapt db truncate task to ofn v2 by removing db tables from v1 2019-09-08 14:05:49 +01:00
luisramos0
b4de8ef899 Make enterprises/index_spec a bit more resilient 2019-09-08 12:17:36 +01:00
luisramos0
f0586af1c7 Re-organized api/orders resource routes 2019-09-08 12:17:36 +01:00
luisramos0
e9b5551c0f Adpat shipment controller to move out of Spree namespace 2019-09-08 12:17:36 +01:00
luisramos0
7cec24f1d4 Move shipments route, controller and ctrl spec from spree/api to api 2019-09-08 12:17:36 +01:00
luisramos0
26f5ece7c0 Add a few relevant attributes to shipment serializer and fix some details in shipment controller spec 2019-09-08 12:15:33 +01:00
luisramos0
a21a4aba5d Convert spree/api/shipments from rabl to AMS and adapt its spec 2019-09-08 12:15:33 +01:00
Matt-Yorkley
f413ce2a27 Soft-delete price objects 2019-09-06 17:50:19 +01:00
Transifex-Openfoodnetwork
5847b1a51e Updating translations for config/locales/en_ZA.yml 2019-09-07 01:50:35 +10:00
Transifex-Openfoodnetwork
f51ebc63c3 Updating translations for config/locales/en_AU.yml 2019-09-07 01:47:27 +10:00
Pau Pérez Fabregat
908e1dfcaf Merge pull request #4202 from coopdevs/remove-skylight
Remove Skylight
2019-09-06 17:09:14 +02:00
Matt-Yorkley
5bc2c96248 Add specs for existing on_demand behaviour 2019-09-06 15:47:59 +01:00
Pau Perez
ab8c7bad76 Remove Skylight
Since we adopted Skylight to get response times across endpoints and
instances, we failed to get accurate numbers. Our Rails version is not
supported and thus Skylight fails to provide data for the slowest
endpoints, the ones we care about the most. Even with a supported one we
could potentially hit any limits on tracing and have the same problem.

Recently, we started paying for Datadog's APM and the experience,
although it's still early, has been better. It makes it possible to
correlate between services and other metrics which helps spotting the
underlying issues.

Therefore, having two agents running on the server consumes system
resources so we better get rid of Skylight's one.
2019-09-06 16:25:33 +02:00
Pau Perez
55883a0efc Add implicit #bulk_management including filter
OFN it's hard enough. No need to abuse implicitness making things very
hard to follow.

I've spent around 20min trying to find out where this controller action
was implemented until I realized Rails renders the matching view if no
controller action is defined.

Making it git-greppable makes it a bit easier next time.
2019-09-06 16:02:44 +02:00
Pau Pérez Fabregat
2e519957ec Merge pull request #4231 from openfoodfoundation/dependabot/bundler/webmock-3.7.2
Bump webmock from 3.7.1 to 3.7.2
2019-09-06 13:31:55 +02:00
Pau Pérez Fabregat
cd5b3c7393 Merge pull request #4229 from openfoodfoundation/dependabot/bundler/bugsnag-6.12.1
Bump bugsnag from 6.12.0 to 6.12.1
2019-09-06 13:08:47 +02:00
Maikel Linke
eb9f02f3bd Add missing Spree route for Paypal 2019-09-06 19:07:41 +10:00
Maikel Linke
a1f3e8205f Add spec for failing Paypal checkout
https://github.com/openfoodfoundation/openfoodnetwork/issues/4233
2019-09-06 19:05:59 +10:00
Pau Perez
410e23085e Remove integrity check for deleted variants in OCs
We have no way to see the output of this weird RSpec integrity check
thus, it's pointless. It only adds unnecessary load the server.

However, the issue it checks seems to still be happening although
not very often. UK's server has 70 occurrences the last one being from
early 2019 while FR's server returns 10.
2019-09-06 10:30:26 +02:00
Pau Perez
e2b3ee7b3f Remove Guard and Guard-related gems
Guard and the other Guard-related gems should be removed from our
Gemfile. We think is not worth the extra dependencies given the effort
it requires to keep them up-to-date.

This came up in a PR that was upgrading Guard: #4213.
2019-09-06 10:11:17 +02:00
Maikel Linke
242767dc73 Give variables meaningful names in checkout spec 2019-09-06 12:27:15 +10:00
Maikel Linke
8e8c77c5bd Convert specs to RSpec 3.8.0 syntax with Transpec
This conversion is done by Transpec 3.4.0 with the following command:
    transpec spec/features/consumer/shopping/checkout_spec.rb

* 43 conversions
    from: obj.should
      to: expect(obj).to

* 8 conversions
    from: obj.should_not
      to: expect(obj).not_to

* 3 conversions
    from: == expected
      to: eq(expected)

For more details: https://github.com/yujinakayama/transpec#supported-conversions
2019-09-06 11:32:44 +10:00
Luis Ramos
e3ce2a7486 Merge pull request #4104 from luisramos0/convert_taxons_to_ams
Convert spree/api/taxons views from rabl to AMS
2019-09-06 00:04:10 +01:00
dependabot-preview[bot]
8524f49589 Bump webmock from 3.7.1 to 3.7.2
Bumps [webmock](https://github.com/bblimke/webmock) from 3.7.1 to 3.7.2.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.7.1...v3.7.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-05 19:17:24 +00:00
dependabot-preview[bot]
36f9cd9cbf Bump ddtrace from 0.26.0 to 0.27.0
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.26.0 to 0.27.0.
- [Release notes](https://github.com/DataDog/dd-trace-rb/releases)
- [Changelog](https://github.com/DataDog/dd-trace-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/DataDog/dd-trace-rb/compare/v0.26.0...v0.27.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-05 19:16:35 +00:00
dependabot-preview[bot]
0fab4a3a8e Bump bugsnag from 6.12.0 to 6.12.1
Bumps [bugsnag](https://github.com/bugsnag/bugsnag-ruby) from 6.12.0 to 6.12.1.
- [Release notes](https://github.com/bugsnag/bugsnag-ruby/releases)
- [Changelog](https://github.com/bugsnag/bugsnag-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bugsnag/bugsnag-ruby/compare/v6.12.0...v6.12.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-05 19:15:41 +00:00
Luis Ramos
722884d8d8 Merge pull request #3895 from luisramos0/fees_based_on_final_weight
Make weight calculator use line_item.final_weight_volume rather than variant.weight
2019-09-05 19:24:56 +01:00
Hugo Daniel
f88d54b862 Add missing translations for orders 2019-09-05 15:13:10 +02:00
luisramos0
192bff4fed Move taxons and taxonomies api routes to api out of spree routes 2019-08-28 22:06:56 +01:00
luisramos0
92a270165e Add missing api taxonomies controller only for the required jstree action 2019-08-28 22:06:56 +01:00
luisramos0
9f5c9916ba Add back required api actions (create, update and destroy) and add AMS serializers for the jstree action 2019-08-28 22:06:56 +01:00
luisramos0
d08de4bdf9 Add extra fields to taxon serializer to be used in the api 2019-08-28 22:06:56 +01:00
luisramos0
45bdb85bf3 Add missing method and skip_authorization_check to taxons controller 2019-08-28 22:06:56 +01:00
luisramos0
ece0652ca3 Adapt spree/admin/shared/_routes.html.erb to new location of the api/taxons routes 2019-08-28 22:06:56 +01:00
luisramos0
7a652fd67b Adapt api/taxons controller to new namespace outside Spree: remove Spree module and add Spree namespace to Taxons and Taxonomy classes 2019-08-28 22:06:56 +01:00
luisramos0
4ca8feeef1 Move api/taxons route and controller out of spree namespace into /api and move the ctrl spec as well 2019-08-28 22:06:56 +01:00
luisramos0
367932a767 Make spree/api/taxons_controller use AMS serializer instead of rabl 2019-08-28 22:06:56 +01:00
luisramos0
e591658f48 Keep only used api/taxons index action, delete all others as not required right now 2019-08-28 22:06:56 +01:00
luisramos0
8a4e5b445f Delete unused frontend auth toekn script override and move the backend one to the head partial 2019-08-18 21:53:56 +01:00
luisramos0
2394eda2ac Remove unused sidebar override 2019-08-18 21:47:21 +01:00
luisramos0
f97a3a030a Remove unused nav_bar sessions route and override 2019-08-18 21:44:22 +01:00
luisramos0
ec645f8fa8 Remove unused login override of nav_bar 2019-08-18 21:43:18 +01:00
luisramos0
56a54db602 Remove admin login_nav override and move it to admin layout file 2019-08-18 21:39:19 +01:00
luisramos0
4c3d15b42b Remove users menu entry override and file and add it directly to the tabs view together with all the other entries 2019-08-18 21:36:50 +01:00
luisramos0
5f4429646d Move override to the view that is now in our code base (from spree_auth_devise originally) 2019-08-18 21:33:23 +01:00
luisramos0
f37db456f8 Delete dead overrides of spree frontend code 2019-08-18 21:32:53 +01:00
luisramos0
006c6e6b7b Add comment to explain method in weight calculator 2019-08-02 21:02:33 +01:00
luisramos0
41aa4ff479 Improve code readability and fix rubocop complexity issue in weight calculator 2019-08-02 20:54:41 +01:00
luisramos0
0e8f167ab9 Fix spec in weight calculator tests 2019-08-02 20:44:11 +01:00
Kristina Lim
e1fce8304d Update weight calculator and add specs 2019-07-23 23:24:00 +08:00
Kristina Lim
0d6ba90ea1 Round off fee from Calculator::Weight to nearest cent 2019-07-24 00:42:42 +10:00
luisramos0
160b535e2f Make weight calculator compute 0 for variants with unit different from weight 2019-06-18 15:21:13 +01:00
luisramos0
e8eeb3d5dc Further improve weight calculator code 2019-06-18 13:28:16 +01:00
luisramos0
4551149532 Improve code of weight calculator 2019-05-31 19:55:39 +01:00
luisramos0
82955b9fe5 Make weight calculator use line_item.final_weight_volume rather than variant.weight for cases where the final weight is set manually in the BOM 2019-05-31 19:55:17 +01:00
206 changed files with 10863 additions and 3542 deletions

View File

@@ -1,66 +0,0 @@
<!-- Provide a general summary of the issue in the Title above.
If your issue is not a bug, please use the Feature template instead:
https://github.com/openfoodfoundation/openfoodnetwork/wiki/Feature-template
-->
## Description
<!-- Provide a more detailed introduction to the issue itself, and why you consider it to be a bug -->
## Expected Behavior
<!-- Tell us what should happen -->
## Actual Behavior
<!-- Tell us what happens instead -->
## Steps to Reproduce
<!-- Provide an unambiguous set of steps to reproduce this bug -->
<!-- Include code to reproduce if relevant -->
1.
2.
3.
4.
## Animated Gif/Screenshot
<!-- Provide a screenshot or brief animated gif reproducing the bug. Linux users can use
[Peek](https://github.com/phw/peek#ubuntu) while Mac users can use [Recordit](http://recordit.co/) -->
## Context
<!-- How has this bug affected you? What were you trying to accomplish? -->
## Severity
<!-- Assign a label and explain the impact.
bug-s1: a critical feature is broken: checkout, payments, signup, login
bug-s2: a non-critical feature is broken, no workaround
bug-s3: a feature is broken but there is a workaround
bug-s4: it's annoying, but you can use it
bug-s5: we can live with it, only a few users impacted
https://github.com/openfoodfoundation/openfoodnetwork/wiki/Bug-severity
-->
## Your Environment
<!-- Include relevant details about the environment you experienced the bug in -->
* Version used:
* Browser name and version:
* Operating System and version (desktop or mobile):
## Possible Fix
<!-- Not obligatory, but suggest a fix or reason for the bug -->

View File

@@ -9,6 +9,7 @@ assignees: ''
## Description
<!-- Provide a more detailed introduction to the issue itself, and why you consider it to be a bug -->
<!-- How has this bug affected you? What were you trying to accomplish? -->
## Expected Behavior
@@ -22,6 +23,8 @@ assignees: ''
## Steps to Reproduce
<!-- Provide an unambiguous set of steps to reproduce this bug -->
<!-- Include code to reproduce if relevant -->
<!-- Include links -->
<!-- Include user ID -->
1.
2.
@@ -29,13 +32,11 @@ assignees: ''
4.
## Animated Gif/Screenshot
<!-- Provide a screenshot or brief animated gif reproducing the bug. Linux users can use
[Peek](https://github.com/phw/peek#ubuntu) while Mac users can use [Recordit](http://recordit.co/) -->
## Context
<!-- How has this bug affected you? What were you trying to accomplish? -->
<!-- Provide a screenshot or brief video reproducing the bug. -->
<!-- Please try to have the dev tools opened on the network tab (press F12 to open the devtools of your browser -->
## Workaround
<!-- Include a workaround for this bug (if relevant) -->
## Severity
<!-- Assign a label and explain the impact.
@@ -55,7 +56,6 @@ https://github.com/openfoodfoundation/openfoodnetwork/wiki/Bug-severity
* Version used:
* Browser name and version:
* Operating System and version (desktop or mobile):
* OFN Platform instance where you discovered the bug, and which version of the software they are using.
## Possible Fix
<!-- Not obligatory, but suggest a fix or reason for the bug -->

View File

@@ -14,5 +14,12 @@ assignees: ''
**- I want to be able to do:** (specify the desired behavior)
(Link to others issues or resources to provide context > only if really necessary). -->
## Acceptance Criteria
<!-- Document the outcomes that need to be achieved before this component can be considered complete. -->
## Acceptance Criteria & Tests
<!-- Document the outcomes that need to be achieved before this component can be considered complete.
-->
<!-- Provide an unambiguous set of steps a tester should do to validate the PR that will solve this issue -->
1.
2.
3.
4.

View File

@@ -1 +1 @@
2.1.5
2.1.9

View File

@@ -6,7 +6,7 @@ RUN apt-get update && apt-get install -y curl git build-essential software-prope
# Setup ENV variables
ENV PATH /usr/local/src/rbenv/shims:/usr/local/src/rbenv/bin:$PATH
ENV RBENV_ROOT /usr/local/src/rbenv
ENV RUBY_VERSION 2.1.5
ENV RUBY_VERSION 2.1.9
ENV CONFIGURE_OPTS --disable-install-doc
# Rbenv & Ruby part

View File

@@ -11,7 +11,7 @@ The following guides are located in the wiki and provide more OS-specific step-b
### Dependencies
* Rails 3.2.x
* Ruby 2.1.5
* Ruby 2.1.9
* PostgreSQL database
* PhantomJS (for testing)
* See Gemfile for a list of gems required

12
Gemfile
View File

@@ -1,5 +1,5 @@
source 'https://rubygems.org'
ruby "2.1.5"
ruby "2.1.9"
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
gem 'i18n', '~> 0.6.11'
@@ -85,7 +85,6 @@ gem 'paperclip', '~> 3.4.1'
gem 'rack-rewrite'
gem 'rack-ssl', require: 'rack/ssl'
gem 'roadie-rails', '~> 1.1.1'
gem 'skylight', '< 2.0'
gem 'spinjs-rails'
gem 'combine_pdf'
@@ -105,7 +104,10 @@ group :assets do
gem 'coffee-rails', '~> 3.2.1'
gem 'compass-rails'
gem 'therubyracer', '=0.12.0'
gem 'mini_racer', '0.1.15'
# Previously we found that libv8 6.7.288.46.1 breakis the compilation of mini_racer.
# Now we see that we need to set the version explicitly. Nothing else depends on libv8.
gem 'libv8', '6.3.292.48.1'
gem 'uglifier', '>= 1.0.3'
@@ -157,10 +159,6 @@ end
group :development do
gem 'byebug', '~> 9.0.0' # 9.1 requires ruby 2.2
gem 'debugger-linecache'
gem 'guard'
gem 'guard-livereload'
gem 'guard-rails'
gem 'guard-rspec', '~> 4.7.3'
gem 'listen', '3.0.8' # 3.1.0 requires ruby 2.2
gem "newrelic_rpm", "~> 3.0"
gem 'pry-byebug', '>= 3.4.3'

View File

@@ -164,7 +164,7 @@ GEM
bcrypt-ruby (3.1.5)
bcrypt (>= 3.1.3)
blockenspiel (0.5.0)
bugsnag (6.12.0)
bugsnag (6.12.1)
concurrent-ruby (~> 1.0)
builder (3.0.4)
byebug (9.0.6)
@@ -223,7 +223,7 @@ GEM
activerecord (>= 3.2.0, < 5.0)
fog (~> 1.0)
rails (>= 3.2.0, < 5.0)
ddtrace (0.26.0)
ddtrace (0.27.0)
msgpack
debugger-linecache (1.2.0)
deface (1.0.2)
@@ -252,9 +252,6 @@ GEM
diffy (3.3.0)
docile (1.3.2)
dry-inflector (0.1.2)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
erubis (2.7.0)
eventmachine (1.2.7)
excon (0.62.0)
@@ -432,34 +429,11 @@ GEM
ruby-progressbar (~> 1.4)
geocoder (1.1.8)
gmaps4rails (1.5.6)
guard (2.15.0)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
lumberjack (>= 1.0.12, < 2.0)
nenv (~> 0.1)
notiffany (~> 0.0)
pry (>= 0.9.12)
shellany (~> 0.0)
thor (>= 0.18.1)
guard-compat (1.2.1)
guard-livereload (2.5.2)
em-websocket (~> 0.5)
guard (~> 2.8)
guard-compat (~> 1.0)
multi_json (~> 1.8)
guard-rails (0.7.2)
guard (~> 2.11)
guard-compat (~> 1.0)
guard-rspec (4.7.3)
guard (~> 2.1)
guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0)
haml (4.0.7)
tilt
hashdiff (1.0.0)
highline (1.6.18)
hike (1.2.3)
http_parser.rb (0.6.0)
httparty (0.16.2)
multi_xml (>= 0.5.2)
i18n (0.6.11)
@@ -491,11 +465,10 @@ GEM
addressable (~> 2.3)
letter_opener (1.7.0)
launchy (~> 2.2)
libv8 (3.16.14.19)
libv8 (6.3.292.48.1)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
lumberjack (1.0.13)
mail (2.5.5)
mime-types (~> 1.16)
treetop (~> 1.4.8)
@@ -503,6 +476,8 @@ GEM
mime-types (1.25.1)
mini_mime (1.0.1)
mini_portile2 (2.1.0)
mini_racer (0.1.15)
libv8 (~> 6.3)
momentjs-rails (2.20.1)
railties (>= 3.1)
money (5.1.1)
@@ -511,15 +486,11 @@ GEM
multi_json (1.13.1)
multi_xml (0.6.0)
multipart-post (2.1.1)
nenv (0.3.0)
net-http-persistent (3.1.0)
connection_pool (~> 2.2)
newrelic_rpm (3.18.1.330)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
oauth2 (1.4.1)
faraday (>= 0.8, < 0.16.0)
jwt (>= 1.0, < 3.0)
@@ -610,7 +581,6 @@ GEM
rdoc (3.12.2)
json (~> 1.4)
redcarpet (3.5.0)
ref (2.0.0)
request_store (1.4.1)
rack (>= 1.4)
roadie (3.4.0)
@@ -673,10 +643,9 @@ GEM
selenium-webdriver (3.141.0)
childprocess (~> 0.5)
rubyzip (~> 1.2, >= 1.2.2)
shellany (0.0.1)
shoulda-matchers (2.8.0)
activesupport (>= 3.0.0)
simplecov (0.17.0)
simplecov (0.17.1)
docile (~> 1.1)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
@@ -685,8 +654,6 @@ GEM
rack (~> 1.4)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
skylight (1.7.2)
activesupport (>= 3.0.0)
spinjs-rails (1.4)
rails (>= 3.1)
spreadsheet (1.1.7)
@@ -704,9 +671,6 @@ GEM
stripe (4.24.0)
faraday (~> 0.13)
net-http-persistent (~> 3.0)
therubyracer (0.12.0)
libv8 (~> 3.16.14.0)
ref
thor (0.20.3)
tilt (1.4.1)
timecop (0.9.1)
@@ -719,7 +683,7 @@ GEM
railties (> 3.2.8, < 4.0.0)
sprockets (>= 2.2.0)
tzinfo (0.3.55)
uglifier (4.1.20)
uglifier (4.2.0)
execjs (>= 0.3.0, < 3)
unicode-display_width (1.3.2)
unicorn (5.5.1)
@@ -739,7 +703,7 @@ GEM
nokogiri (~> 1.6)
rubyzip (~> 1.0)
selenium-webdriver (~> 3.0)
webmock (3.7.1)
webmock (3.7.6)
addressable (>= 2.3.6)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
@@ -796,10 +760,6 @@ DEPENDENCIES
fuubar (~> 2.4.1)
geocoder
gmaps4rails
guard
guard-livereload
guard-rails
guard-rspec (~> 4.7.3)
haml
i18n (~> 0.6.11)
i18n-js (~> 3.3.0)
@@ -811,7 +771,9 @@ DEPENDENCIES
kaminari (~> 0.14.1)
knapsack
letter_opener (>= 1.4.1)
libv8 (= 6.3.292.48.1)
listen (= 3.0.8)
mini_racer (= 0.1.15)
momentjs-rails
newrelic_rpm (~> 3.0)
nokogiri (>= 1.6.7.1)
@@ -843,7 +805,6 @@ DEPENDENCIES
shoulda-matchers
simple_form!
simplecov
skylight (< 2.0)
spinjs-rails
spree_api!
spree_backend!
@@ -853,7 +814,6 @@ DEPENDENCIES
spring (= 1.7.2)
spring-commands-rspec
stripe
therubyracer (= 0.12.0)
timecop
truncate_html
turbo-sprockets-rails3
@@ -868,7 +828,7 @@ DEPENDENCIES
wkhtmltopdf-binary
RUBY VERSION
ruby 2.1.5p273
ruby 2.1.9p490
BUNDLED WITH
1.17.2

View File

@@ -1,11 +0,0 @@
# A sample Guardfile
# More info at https://github.com/guard/guard#readme
guard 'livereload' do
watch(%r{app/views/.+\.(erb|haml|slim)$})
watch(%r{app/helpers/.+\.rb})
watch(%r{public/.+\.(css|js|html)})
# Rails Assets Pipeline
watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|js|html|png|jpg))).*}) { |m| "/assets/#{m[3]}" }
end

View File

@@ -1,6 +1,5 @@
[![Build Status](https://semaphoreci.com/api/v1/openfoodfoundation/openfoodnetwork-2/branches/master/badge.svg)](https://semaphoreci.com/openfoodfoundation/openfoodnetwork-2)
[![Code Climate](https://codeclimate.com/github/openfoodfoundation/openfoodnetwork.png)](https://codeclimate.com/github/openfoodfoundation/openfoodnetwork)
[![View performance data on Skylight](https://badges.skylight.io/status/EiXQ6sSKij8y.svg)](https://oss.skylight.io/app/applications/EiXQ6sSKij8y)
# Open Food Network
@@ -36,7 +35,7 @@ We use [BrowserStack](https://www.browserstack.com/) as a manual testing tool. B
Copyright (c) 2012 - 2019 Open Food Foundation, released under the AGPL licence.
[survey]: https://docs.google.com/a/eaterprises.com.au/forms/d/1zxR5vSiU9CigJ9cEaC8-eJLgYid8CR8er7PPH9Mc-30/edit#
[slack-invite]: https://openfoodnetwork.org/slack-invite
[slack-invite]: https://join.slack.com/t/openfoodnetwork/shared_invite/enQtNzY3NDEwNzM2MDM0LWFmNGRhNDUwYzNmNWNkYmFkMzgxNDg1OTg1ODNjNWY4Y2FhNDIwNmE4ZWI0OThiMGNmZjFkODczNGZiYTJmNWI
[contributor-guide]: https://ofn-user-guide.gitbook.io/ofn-contributor-guide/who-are-we
[ofn-install]: https://github.com/openfoodfoundation/ofn-install
[super-admin-guide]: https://ofn-user-guide.gitbook.io/ofn-super-admin-guide

View File

@@ -0,0 +1,105 @@
require 'open_food_network/scope_variant_to_hub'
module Api
class ShipmentsController < Api::BaseController
respond_to :json
before_filter :find_order
before_filter :find_and_update_shipment, only: [:ship, :ready, :add, :remove]
def create
variant = scoped_variant(params[:variant_id])
quantity = params[:quantity].to_i
@shipment = get_or_create_shipment(params[:stock_location_id])
@order.contents.add(variant, quantity, nil, @shipment)
@shipment.refresh_rates
@shipment.save!
render json: @shipment.reload, serializer: Api::ShipmentSerializer, status: :ok
end
def update
authorize! :read, Spree::Shipment
@shipment = @order.shipments.find_by_number!(params[:id])
params[:shipment] ||= []
unlock = params[:shipment].delete(:unlock)
if unlock == 'yes'
@shipment.adjustment.open
end
@shipment.update_attributes(params[:shipment])
if unlock == 'yes'
@shipment.adjustment.close
end
render json: @shipment.reload, serializer: Api::ShipmentSerializer, status: :ok
end
def ready
authorize! :read, Spree::Shipment
unless @shipment.ready?
if @shipment.can_ready?
@shipment.ready!
else
render(json: { error: I18n.t(:cannot_ready, scope: "spree.api.shipment") },
status: :unprocessable_entity) && return
end
end
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
end
def ship
authorize! :read, Spree::Shipment
unless @shipment.shipped?
@shipment.ship!
end
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
end
def add
variant = scoped_variant(params[:variant_id])
quantity = params[:quantity].to_i
@order.contents.add(variant, quantity, nil, @shipment)
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
end
def remove
variant = scoped_variant(params[:variant_id])
quantity = params[:quantity].to_i
@order.contents.remove(variant, quantity, @shipment)
@shipment.reload if @shipment.persisted?
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
end
private
def find_order
@order = Spree::Order.find_by_number!(params[:order_id])
authorize! :read, @order
end
def find_and_update_shipment
@shipment = @order.shipments.find_by_number!(params[:id])
@shipment.update_attributes(params[:shipment])
@shipment.reload
end
def scoped_variant(variant_id)
variant = Spree::Variant.find(variant_id)
OpenFoodNetwork::ScopeVariantToHub.new(@order.distributor).scope(variant)
variant
end
def get_or_create_shipment(stock_location_id)
@order.shipment || @order.shipments.create(stock_location_id: stock_location_id)
end
end
end

View File

@@ -0,0 +1,12 @@
module Api
class TaxonomiesController < Api::BaseController
respond_to :json
skip_authorization_check only: :jstree
def jstree
@taxonomy = Spree::Taxonomy.find(params[:id])
render json: @taxonomy.root, serializer: Api::TaxonJstreeSerializer
end
end
end

View File

@@ -0,0 +1,71 @@
module Api
class TaxonsController < Api::BaseController
respond_to :json
skip_authorization_check only: [:index, :show, :jstree]
def index
if taxonomy
@taxons = taxonomy.root.children
else
if params[:ids]
@taxons = Spree::Taxon.where(id: params[:ids].split(","))
else
@taxons = Spree::Taxon.ransack(params[:q]).result
end
end
render json: @taxons, each_serializer: Api::TaxonSerializer
end
def jstree
@taxon = taxon
render json: @taxon.children, each_serializer: Api::TaxonJstreeSerializer
end
def create
authorize! :create, Spree::Taxon
@taxon = Spree::Taxon.new(params[:taxon])
@taxon.taxonomy_id = params[:taxonomy_id]
taxonomy = Spree::Taxonomy.find_by_id(params[:taxonomy_id])
if taxonomy.nil?
@taxon.errors[:taxonomy_id] = I18n.t(:invalid_taxonomy_id, scope: 'spree.api')
invalid_resource!(@taxon) && return
end
@taxon.parent_id = taxonomy.root.id unless params[:taxon][:parent_id]
if @taxon.save
render json: @taxon, serializer: Api::TaxonSerializer, status: :created
else
invalid_resource!(@taxon)
end
end
def update
authorize! :update, Spree::Taxon
if taxon.update_attributes(params[:taxon])
render json: taxon, serializer: Api::TaxonSerializer, status: :ok
else
invalid_resource!(taxon)
end
end
def destroy
authorize! :delete, Spree::Taxon
taxon.destroy
render json: taxon, serializer: Api::TaxonSerializer, status: :no_content
end
private
def taxonomy
return if params[:taxonomy_id].blank?
@taxonomy ||= Spree::Taxonomy.find(params[:taxonomy_id])
end
def taxon
@taxon ||= taxonomy.taxons.find(params[:id])
end
end
end

View File

@@ -152,7 +152,7 @@ class CheckoutController < Spree::CheckoutController
end
def update_failed
clear_ship_address
current_order.updater.shipping_address_from_distributor
RestartCheckout.new(@order).call
respond_to do |format|
@@ -165,15 +165,6 @@ class CheckoutController < Spree::CheckoutController
end
end
# When we have a pickup Shipping Method,
# we clone the distributor address into ship_address before_save
# We don't want this data in the form, so we clear it out
def clear_ship_address
unless current_order.shipping_method.andand.require_ship_address
current_order.ship_address = Spree::Address.default
end
end
def load_order
@order = current_order
redirect_to(main_app.shop_path) && return unless @order && @order.checkout_allowed?

View File

@@ -0,0 +1,9 @@
module Spree
module Admin
class CountriesController < ResourceController
def collection
super.order(:name)
end
end
end
end

View File

@@ -3,7 +3,6 @@ require 'open_food_network/spree_api_key_loader'
Spree::Admin::OrdersController.class_eval do
include OpenFoodNetwork::SpreeApiKeyLoader
helper CheckoutHelper
before_filter :load_spree_api_key, only: :bulk_management
before_filter :load_order, only: %i[show edit update fire resend invoice print print_ticket]
before_filter :load_distribution_choices, only: [:new, :edit, :update]
@@ -27,6 +26,10 @@ Spree::Admin::OrdersController.class_eval do
# within the page then fetches the data it needs from Api::OrdersController
end
def bulk_management
load_spree_api_key
end
def edit
@order.shipments.map &:refresh_rates

View File

@@ -126,7 +126,8 @@ Spree::Admin::ReportsController.class_eval do
@include_blank = I18n.t(:all)
# -- Build Report with Order Grouper
@report = OpenFoodNetwork::OrdersAndFulfillmentsReport.new spree_current_user, params, render_content?
@report = OpenFoodNetwork::OrdersAndFulfillmentsReport.new(permissions,
params, render_content?)
@table = order_grouper_table
csv_file_name = "#{params[:report_type]}_#{timestamp}.csv"

View File

@@ -0,0 +1,6 @@
module Spree
module Admin
class ShippingCategoriesController < ResourceController
end
end
end

View File

@@ -0,0 +1,79 @@
module Spree
module Admin
class ShippingMethodsController < ResourceController
before_filter :load_data, except: [:index]
before_filter :set_shipping_category, only: [:create, :update]
before_filter :set_zones, only: [:create, :update]
before_filter :load_hubs, only: [:new, :edit, :create, :update]
# Sort shipping methods by distributor name
def collection
collection = super
collection = collection.managed_by(spree_current_user).by_name
if params.key? :enterprise_id
distributor = Enterprise.find params[:enterprise_id]
collection = collection.for_distributor(distributor)
end
collection
end
def destroy
# Our reports are not adapted to soft deleted shipping_methods so here we prevent
# the deletion (even soft) of shipping_methods that are referenced in orders
if order = order_referenced_by_shipping_method
flash[:error] = I18n.t(:shipping_method_destroy_error, number: order.number)
redirect_to(collection_url) && return
end
@object.touch :deleted_at
flash[:success] = flash_message_for(@object, :successfully_removed)
respond_with(@object) do |format|
format.html { redirect_to collection_url }
end
end
private
def order_referenced_by_shipping_method
Order.joins(shipments: :shipping_rates)
.where( spree_shipping_rates: { shipping_method_id: @object } )
.first
end
def load_hubs
# rubocop:disable Style/TernaryParentheses
@hubs = Enterprise.managed_by(spree_current_user).is_distributor.sort_by! do |d|
[(@shipping_method.has_distributor? d) ? 0 : 1, d.name]
end
# rubocop:enable Style/TernaryParentheses
end
def set_shipping_category
return true if params["shipping_method"][:shipping_categories] == ""
@shipping_method.shipping_categories =
Spree::ShippingCategory.where(id: params["shipping_method"][:shipping_categories])
@shipping_method.save
params[:shipping_method].delete(:shipping_categories)
end
def set_zones
return true if params["shipping_method"][:zones] == ""
@shipping_method.zones = Spree::Zone.where(id: params["shipping_method"][:zones])
@shipping_method.save
params[:shipping_method].delete(:zones)
end
def location_after_save
edit_admin_shipping_method_path(@shipping_method)
end
def load_data
@available_zones = Zone.order(:name)
@calculators = ShippingMethod.calculators.sort_by(&:name)
end
end
end
end

View File

@@ -1,42 +0,0 @@
module Spree
module Admin
ShippingMethodsController.class_eval do
before_filter :do_not_destroy_referenced_shipping_methods, only: :destroy
before_filter :load_hubs, only: [:new, :edit, :create, :update]
# Sort shipping methods by distributor name
def collection
collection = super
collection = collection.managed_by(spree_current_user).by_name
if params.key? :enterprise_id
distributor = Enterprise.find params[:enterprise_id]
collection = collection.for_distributor(distributor)
end
collection
end
# Spree allows soft deletes of shipping_methods but our reports are not adapted to that
# Here we prevent the deletion (even soft) of shipping_methods that are referenced in orders
def do_not_destroy_referenced_shipping_methods
order = Order.joins(shipments: :shipping_rates)
.where( spree_shipping_rates: { shipping_method_id: @object } )
.first
return unless order
flash[:error] = I18n.t(:shipping_method_destroy_error, number: order.number)
redirect_to(collection_url) && return
end
private
def load_hubs
# rubocop:disable Style/TernaryParentheses
@hubs = Enterprise.managed_by(spree_current_user).is_distributor.sort_by! do |d|
[(@shipping_method.has_distributor? d) ? 0 : 1, d.name]
end
# rubocop:enable Style/TernaryParentheses
end
end
end
end

View File

@@ -0,0 +1,29 @@
module Spree
module Admin
class StatesController < ResourceController
belongs_to 'spree/country'
before_filter :load_data
def index
respond_with(@collection) do |format|
format.html
format.js { render partial: 'state_list' }
end
end
protected
def location_after_save
admin_country_states_url(@country)
end
def collection
super.order(:name)
end
def load_data
@countries = Country.order(:name)
end
end
end
end

View File

@@ -0,0 +1,19 @@
module Spree
module Admin
class TaxCategoriesController < ResourceController
def destroy
if @object.destroy
flash[:success] = flash_message_for(@object, :successfully_removed)
respond_with(@object) do |format|
format.html { redirect_to collection_url }
format.js { render partial: "spree/admin/shared/destroy" }
end
else
respond_with(@object) do |format|
format.html { redirect_to collection_url }
end
end
end
end
end
end

View File

@@ -0,0 +1,26 @@
module Spree
module Admin
class TaxRatesController < ResourceController
before_filter :load_data
update.after :update_after
create.after :create_after
private
def load_data
@available_zones = Zone.order(:name)
@available_categories = TaxCategory.order(:name)
@calculators = TaxRate.calculators.sort_by(&:name)
end
def update_after
Rails.cache.delete('vat_rates')
end
def create_after
Rails.cache.delete('vat_rates')
end
end
end
end

View File

@@ -0,0 +1,15 @@
module Spree
module Admin
class TaxSettingsController < Spree::Admin::BaseController
def update
Spree::Config.set(params[:preferences])
respond_to do |format|
format.html {
redirect_to edit_admin_tax_settings_path
}
end
end
end
end
end

View File

@@ -0,0 +1,21 @@
module Spree
module Admin
class TaxonomiesController < ResourceController
respond_to :json, :only => [:get_children]
def get_children
@taxons = Taxon.find(params[:parent_id]).children
end
private
def location_after_save
if @taxonomy.created_at == @taxonomy.updated_at
edit_admin_taxonomy_url(@taxonomy)
else
admin_taxonomies_url
end
end
end
end
end

View File

@@ -0,0 +1,118 @@
module Spree
module Admin
class TaxonsController < Spree::Admin::BaseController
respond_to :html, :json, :js
def search
if params[:ids]
@taxons = Spree::Taxon.where(id: params[:ids].split(','))
else
@taxons = Spree::Taxon.limit(20).search(name_cont: params[:q]).result
end
end
def create
@taxonomy = Taxonomy.find(params[:taxonomy_id])
@taxon = @taxonomy.taxons.build(params[:taxon])
if @taxon.save
respond_with(@taxon) do |format|
format.json { render json: @taxon.to_json }
end
else
flash[:error] = Spree.t('errors.messages.could_not_create_taxon')
respond_with(@taxon) do |format|
format.html do
if redirect_to @taxonomy
edit_admin_taxonomy_url(@taxonomy)
else
admin_taxonomies_url
end
end
end
end
end
def edit
@taxonomy = Taxonomy.find(params[:taxonomy_id])
@taxon = @taxonomy.taxons.find(params[:id])
@permalink_part = @taxon.permalink.split("/").last
end
def update
@taxonomy = Taxonomy.find(params[:taxonomy_id])
@taxon = @taxonomy.taxons.find(params[:id])
parent_id = params[:taxon][:parent_id]
new_position = params[:taxon][:position]
if parent_id || new_position # taxon is being moved
new_parent = parent_id.nil? ? @taxon.parent : Taxon.find(parent_id.to_i)
new_position = new_position.nil? ? -1 : new_position.to_i
# Bellow is a very complicated way of finding where in nested set we
# should actually move the taxon to achieve sane results,
# JS is giving us the desired position, which was awesome for previous setup,
# but now it's quite complicated to find where we should put it as we have
# to differenciate between moving to the same branch, up down and into
# first position.
new_siblings = new_parent.children
if new_position <= 0 && new_siblings.empty?
@taxon.move_to_child_of(new_parent)
elsif new_parent.id != @taxon.parent_id
if new_position.zero?
@taxon.move_to_left_of(new_siblings.first)
else
@taxon.move_to_right_of(new_siblings[new_position - 1])
end
elsif new_position < new_siblings.index(@taxon)
@taxon.move_to_left_of(new_siblings[new_position]) # we move up
else
@taxon.move_to_right_of(new_siblings[new_position - 1]) # we move down
end
# Reset legacy position, if any extensions still rely on it
new_parent.children.reload.each{ |t| t.update_column(:position, t.position) }
if parent_id
@taxon.reload
@taxon.set_permalink
@taxon.save!
@update_children = true
end
end
if params.key? "permalink_part"
parent_permalink = @taxon.permalink.split("/")[0...-1].join("/")
parent_permalink += "/" if parent_permalink.present?
params[:taxon][:permalink] = parent_permalink + params[:permalink_part]
end
# check if we need to rename child taxons if parent name or permalink changes
if params[:taxon][:name] != @taxon.name || params[:taxon][:permalink] != @taxon.permalink
@update_children = true
end
if @taxon.update_attributes(params[:taxon])
flash[:success] = flash_message_for(@taxon, :successfully_updated)
end
# rename child taxons
if @update_children
@taxon.descendants.each do |taxon|
taxon.reload
taxon.set_permalink
taxon.save!
end
end
respond_with(@taxon) do |format|
format.html { redirect_to edit_admin_taxonomy_url(@taxonomy) }
format.json { render json: @taxon.to_json }
end
end
def destroy
@taxon = Taxon.find(params[:id])
@taxon.destroy
respond_with(@taxon) { |format| format.json { render json: '' } }
end
end
end
end

View File

@@ -46,7 +46,12 @@ module Spree
@user.spree_roles = roles.reject(&:blank?).collect{ |r| Spree::Role.find(r) }
end
flash.now[:success] = Spree.t(:account_updated)
message = if new_email_unconfirmed?
Spree.t(:email_updated)
else
Spree.t(:account_updated)
end
flash.now[:success] = message
end
render :edit
end
@@ -126,6 +131,10 @@ module Spree
def load_roles
@roles = Spree::Role.scoped
end
def new_email_unconfirmed?
params[:user][:email] != @user.email
end
end
end
end

View File

@@ -0,0 +1,26 @@
module Spree
module Admin
class ZonesController < ResourceController
before_filter :load_data, except: [:index]
def new
@zone.zone_members.build
end
protected
def collection
params[:q] ||= {}
params[:q][:s] ||= "ascend_by_name"
@search = super.ransack(params[:q])
@zones = @search.result.page(params[:page]).per(Spree::Config[:orders_per_page])
end
def load_data
@countries = Country.order(:name)
@states = State.order(:name)
@zones = Zone.order(:name)
end
end
end
end

View File

@@ -1,108 +0,0 @@
require 'open_food_network/scope_variant_to_hub'
module Spree
module Api
class ShipmentsController < Spree::Api::BaseController
respond_to :json
before_filter :find_order
before_filter :find_and_update_shipment, only: [:ship, :ready, :add, :remove]
def create
variant = scoped_variant(params[:variant_id])
quantity = params[:quantity].to_i
@shipment = get_or_create_shipment(params[:stock_location_id])
@order.contents.add(variant, quantity, nil, @shipment)
@shipment.refresh_rates
@shipment.save!
respond_with(@shipment.reload, default_template: :show)
end
def update
authorize! :read, Shipment
@shipment = @order.shipments.find_by_number!(params[:id])
params[:shipment] ||= []
unlock = params[:shipment].delete(:unlock)
if unlock == 'yes'
@shipment.adjustment.open
end
@shipment.update_attributes(params[:shipment])
if unlock == 'yes'
@shipment.adjustment.close
end
@shipment.reload
respond_with(@shipment, default_template: :show)
end
def ready
authorize! :read, Shipment
unless @shipment.ready?
if @shipment.can_ready?
@shipment.ready!
else
render "spree/api/shipments/cannot_ready_shipment", status: :unprocessable_entity
return
end
end
respond_with(@shipment, default_template: :show)
end
def ship
authorize! :read, Shipment
unless @shipment.shipped?
@shipment.ship!
end
respond_with(@shipment, default_template: :show)
end
def add
variant = scoped_variant(params[:variant_id])
quantity = params[:quantity].to_i
@order.contents.add(variant, quantity, nil, @shipment)
respond_with(@shipment, default_template: :show)
end
def remove
variant = scoped_variant(params[:variant_id])
quantity = params[:quantity].to_i
@order.contents.remove(variant, quantity, @shipment)
@shipment.reload if @shipment.persisted?
respond_with(@shipment, default_template: :show)
end
private
def find_order
@order = Spree::Order.find_by_number!(params[:order_id])
authorize! :read, @order
end
def find_and_update_shipment
@shipment = @order.shipments.find_by_number!(params[:id])
@shipment.update_attributes(params[:shipment])
@shipment.reload
end
def scoped_variant(variant_id)
variant = Spree::Variant.find(variant_id)
OpenFoodNetwork::ScopeVariantToHub.new(@order.distributor).scope(variant)
variant
end
def get_or_create_shipment(stock_location_id)
@order.shipment || @order.shipments.create(stock_location_id: stock_location_id)
end
end
end
end

View File

@@ -1,75 +0,0 @@
module Spree
module Api
class TaxonsController < Spree::Api::BaseController
respond_to :json
def index
if taxonomy
@taxons = taxonomy.root.children
else
if params[:ids]
@taxons = Taxon.where(id: params[:ids].split(","))
else
@taxons = Taxon.ransack(params[:q]).result
end
end
respond_with(@taxons)
end
def show
@taxon = taxon
respond_with(@taxon)
end
def jstree
show
end
def create
authorize! :create, Taxon
@taxon = Taxon.new(params[:taxon])
@taxon.taxonomy_id = params[:taxonomy_id]
taxonomy = Taxonomy.find_by_id(params[:taxonomy_id])
if taxonomy.nil?
@taxon.errors[:taxonomy_id] = I18n.t(:invalid_taxonomy_id, scope: 'spree.api')
invalid_resource!(@taxon) && return
end
@taxon.parent_id = taxonomy.root.id unless params[:taxon][:parent_id]
if @taxon.save
respond_with(@taxon, status: 201, default_template: :show)
else
invalid_resource!(@taxon)
end
end
def update
authorize! :update, Taxon
if taxon.update_attributes(params[:taxon])
respond_with(taxon, status: 200, default_template: :show)
else
invalid_resource!(taxon)
end
end
def destroy
authorize! :delete, Taxon
taxon.destroy
respond_with(taxon, status: 204)
end
private
def taxonomy
return if params[:taxonomy_id].blank?
@taxonomy ||= Taxonomy.find(params[:taxonomy_id])
end
def taxon
@taxon ||= taxonomy.taxons.find(params[:id])
end
end
end
end

View File

@@ -38,10 +38,6 @@ module Spree
end
end
def nav_bar
render partial: 'spree/shared/nav_bar'
end
private
def accurate_title

View File

@@ -0,0 +1,9 @@
module Spree
module Admin
module TaxonsHelper
def taxon_path(taxon)
taxon.ancestors.reverse.collect(&:name).join( " >> ")
end
end
end
end

View File

@@ -13,8 +13,43 @@ module Calculator
def compute(object)
line_items = line_items_for object
total_weight = line_items.sum { |li| ((li.variant.andand.weight || 0) * li.quantity) }
total_weight * preferred_per_kg
(total_weight(line_items) * preferred_per_kg).round(2)
end
private
def total_weight(line_items)
line_items.sum do |line_item|
line_item_weight(line_item)
end
end
def line_item_weight(line_item)
if line_item.final_weight_volume.present?
weight_per_final_weight_volume(line_item)
else
weight_per_variant(line_item) * line_item.quantity
end
end
def weight_per_variant(line_item)
line_item.variant.andand.weight || 0
end
def weight_per_final_weight_volume(line_item)
if line_item.variant.product.andand.variant_unit == 'weight'
# Divided by 1000 because grams is the base weight unit and the calculator price is per_kg
line_item.final_weight_volume / 1000.0
else
weight_per_variant(line_item) * quantity_implied_in_final_weight_volume(line_item)
end
end
# Example: 2 (line_item.quantity) wine glasses of 125mL (line_item.variant.unit_value)
# Customer ends up getting 350mL (line_item.final_weight_volume) of wine
# that represent 2.8 (quantity_implied_in_final_weight_volume) glasses of wine
def quantity_implied_in_final_weight_volume(line_item)
(1.0 * line_item.final_weight_volume / line_item.variant.unit_value).round(3)
end
end
end

View File

@@ -19,7 +19,7 @@ module OrderShipment
#
# @return [ShippingMethod]
def shipping_method
return if shipments.empty?
return if shipments.blank?
shipments.first.shipping_method
end

View File

@@ -25,36 +25,21 @@ module VariantStock
#
# @return [Float|Integer]
def on_hand
warn_deprecation(__method__, '#total_on_hand')
total_on_hand
end
# Sets the stock level of the variant.
# This will only work if `track_inventory_levels` config is set
# and if there is a stock item for the variant.
# This will only work if there is a stock item for the variant.
#
# @raise [StandardError] when the track_inventory_levels config key is not set
# and when the variant has no stock item
# @raise [StandardError] when the variant has no stock item
def on_hand=(new_level)
warn_deprecation(__method__, '#total_on_hand')
error = 'Cannot set on_hand value when Spree::Config[:track_inventory_levels] is false'
raise error unless Spree::Config.track_inventory_levels
raise_error_if_no_stock_item_available
overwrite_stock_levels(new_level)
end
# Checks whether this variant is produced on demand.
#
# In Spree 2.0 this attribute is removed in favour of
# track_inventory_levels only. It was initially introduced in
# https://github.com/openfoodfoundation/spree/commit/20b5ad9835dca7f41a40ad16c7b45f987eea6dcc
def on_demand
warn_deprecation(__method__, 'StockItem#backorderable?')
# A variant that has not been saved yet, doesn't have a stock item
# This provides a default value for variant.on_demand using Spree::StockLocation.backorderable_default
return Spree::StockLocation.first.backorderable_default if stock_items.empty?
@@ -69,8 +54,6 @@ module VariantStock
#
# @raise [StandardError] when the variant has no stock item yet
def on_demand=(new_value)
warn_deprecation(__method__, 'StockItem#backorderable=')
raise_error_if_no_stock_item_available
# There should be only one at the default stock location.
@@ -89,8 +72,6 @@ module VariantStock
# Here we depend only on variant.total_on_hand and variant.on_demand.
# This way, variant_overrides only need to override variant.total_on_hand and variant.on_demand.
def can_supply?(quantity)
return true unless Spree::Config[:track_inventory_levels]
on_demand || total_on_hand >= quantity
end
@@ -100,13 +81,13 @@ module VariantStock
# Here we depend only on variant.total_on_hand and variant.on_demand.
# This way, variant_overrides only need to override variant.total_on_hand and variant.on_demand.
def fill_status(quantity)
if on_hand >= quantity
on_hand = quantity
backordered = 0
else
on_hand = [0, total_on_hand].max
backordered = on_demand ? (quantity - on_hand) : 0
end
on_hand = if total_on_hand >= quantity || on_demand
quantity
else
[0, total_on_hand].max
end
backordered = 0
[on_hand, backordered]
end
@@ -117,6 +98,9 @@ module VariantStock
def move(quantity, originator = nil)
raise_error_if_no_stock_item_available
# Don't change variant stock if variant is on_demand
return if on_demand
# Creates a stock movement: it updates stock_item.count_on_hand and fills backorders
#
# This is the original Spree::StockLocation#move,
@@ -155,11 +139,4 @@ module VariantStock
def stock_item
stock_items.first
end
def warn_deprecation(method_name, new_method_name)
ActiveSupport::Deprecation.warn(
"`##{method_name}` is deprecated and will be removed. " \
"Please use `#{new_method_name}` instead."
)
end
end

View File

@@ -1,7 +1,14 @@
module Spree
Price.class_eval do
acts_as_paranoid without_default_scope: true
after_save :refresh_products_cache
# Allow prices to access associated soft-deleted variants.
def variant
Spree::Variant.unscoped { super }
end
private
def check_price

View File

@@ -32,7 +32,7 @@ module Spree
# NOTE: This is an override of spree's method, needed to allow orders
# without line items (ie. user invoices) to not have inventory units
def require_inventory
return false unless Spree::Config[:track_inventory_levels] && line_items.count > 0 # This line altered
return false unless line_items.count > 0 # This line altered
order.completed? && !order.canceled?
end
end

View File

@@ -91,6 +91,11 @@ Spree::Variant.class_eval do
can_supply?(quantity)
end
# Allow variant to access associated soft-deleted prices.
def default_price
Spree::Price.unscoped { super }
end
def price_with_fees(distributor, order_cycle)
price + fees_for(distributor, order_cycle)
end

View File

@@ -10,6 +10,11 @@ class SubscriptionLineItem < ActiveRecord::Base
(price_estimate || 0) * (quantity || 0)
end
# Ensure SubscriptionLineItem always has access to soft-deleted Variant attribute
def variant
Spree::Variant.unscoped { super }
end
# Used to calculators to estimate fees
alias_method :amount, :total_estimate

View File

@@ -1,6 +0,0 @@
Deface::Override.new(virtual_path: "spree/layouts/admin",
name: "user_admin_tabs",
insert_bottom: "[data-hook='admin_tabs'], #admin_tabs[data-hook]",
partial: "spree/admin/users_tab",
disabled: false,
original: '031652cf5a054796022506622082ab6d2693699f')

View File

@@ -1,5 +0,0 @@
Deface::Override.new(virtual_path: "spree/layouts/admin",
name: "auth_admin_login_navigation_bar",
insert_top: "[data-hook='admin_login_navigation_bar'], #admin_login_navigation_bar[data-hook]",
partial: "spree/layouts/admin/login_nav",
original: '841227d0aedf7909d62237d8778df99100087715')

View File

@@ -1,6 +0,0 @@
Deface::Override.new(virtual_path: "spree/shared/_nav_bar",
name: "auth_shared_login_bar",
insert_before: "li#search-bar",
partial: "spree/shared/login_bar",
disabled: false,
original: 'eb3fa668cd98b6a1c75c36420ef1b238a1fc55ac')

View File

@@ -1,3 +0,0 @@
Deface::Override.new(virtual_path: "spree/shared/_nav_bar",
remove: "#search-bar",
name: "search_removal")

View File

@@ -1,3 +0,0 @@
Deface::Override.new(virtual_path: "spree/shared/_sidebar",
remove: "#sidebar",
name: "sidebar_removal")

View File

@@ -1,5 +0,0 @@
Deface::Override.new(virtual_path: "spree/layouts/admin",
insert_bottom: "[data-hook='admin_inside_head']",
partial: "layouts/auth_token_script",
name: "set_auth_token_in_backend",
original: '6bc2c5de1c8f7542d033548557437c9fe4b3ba02')

View File

@@ -1,5 +0,0 @@
Deface::Override.new(virtual_path: "spree/layouts/spree_application",
insert_bottom: "[data-hook='inside_head']",
partial: "layouts/auth_token_script",
name: "set_auth_token_in_frontend",
original: '5659ac7dbf6ac6469907b005b85285b894677815')

View File

@@ -1,5 +0,0 @@
<!-- surround_contents 'body' -->
<div <%= yield(:app_wrapper_attrs).strip.html_safe %>>
<%= render_original %>
</div>

View File

@@ -1,19 +0,0 @@
/ replace "footer"
-#= render partial: "shared/footer"
%footer
%hr/
-#.row
-#.seven.columns.offset-by-three
-#%center
-#%h1 What is open food network?
-#%p
-#%i
-#Open food network is an online space in which people can connect with, trade and sell food directly with
-#Australian farmers. We aim to reconnect people with their food.
-#%hr/
-#.row
-#.five.columns.secondary.offset-by-seven.secondary
-#All rights reserved. &copy; 2013 Open Food Foundation

View File

@@ -1,8 +0,0 @@
/ replace "#logo"
%figure#logo.columns.eight
- if current_distributor
%h1= link_to current_distributor.name, main_app.enterprise_shop_path(current_distributor)
.change-location= link_to 'Change Location', root_path
- else
%h1= link_to "OPEN FOOD NETWORK", root_path

View File

@@ -1,2 +0,0 @@
/ set_attributes '#top-nav-bar'
/ attributes({:class => "columns eight"})

View File

@@ -1,5 +0,0 @@
/ insert_before "#password-credentials"
- if @unconfirmed_email
%p.alert-box
= t('spree.users.show.unconfirmed_email', unconfirmed_email: @unconfirmed_email)

View File

@@ -0,0 +1,13 @@
module Api
class ShipmentSerializer < ActiveModel::Serializer
attributes :id, :tracking, :number, :order_id, :cost, :shipped_at, :stock_location_name, :state
def order_id
object.order.number
end
def stock_location_name
object.stock_location.name
end
end
end

View File

@@ -0,0 +1,5 @@
module Api
class TaxonJstreeAttributeSerializer < ActiveModel::Serializer
attributes :id, :name
end
end

View File

@@ -0,0 +1,18 @@
module Api
class TaxonJstreeSerializer < ActiveModel::Serializer
attributes :data, :state
has_one :attr, serializer: TaxonJstreeAttributeSerializer
def data
object.name
end
def attr
object
end
def state
"closed"
end
end
end

View File

@@ -2,7 +2,7 @@ class Api::TaxonSerializer < ActiveModel::Serializer
cached
delegate :cache_key, to: :object
attributes :id, :name, :permalink, :icon
attributes :id, :name, :permalink, :icon, :pretty_name, :position, :parent_id, :taxonomy_id
def icon
object.icon(:original)

View File

@@ -73,7 +73,9 @@ class EmbeddedPageService
def current_referer
return if @request.referer.blank?
URI(@request.referer).host.downcase
uri = URI(@request.referer)
return if uri.host.blank?
uri.host.downcase
end
def current_referer_without_www

View File

@@ -1,41 +1,75 @@
# Finds valid products distributed by a particular distributor in an order cycle
#
# If a product without variants is added to an order cycle, and then some
# variants are added to that product, but not the order cycle, then the master
# variant should not available for customers to purchase. This class filters
# out such products so that the customer cannot purchase them.
# Returns a (paginatable) AR object for the products or variants in stock for a given shop and OC.
# The stock-checking includes on_demand and stock level overrides from variant_overrides.
class OrderCycleDistributedProducts
def initialize(order_cycle, distributor)
@order_cycle = order_cycle
def initialize(distributor, order_cycle)
@distributor = distributor
@order_cycle = order_cycle
end
# Returns an ActiveRecord relation without invalid products. Check
# #valid_products_distributed_by for details
#
# @return [ActiveRecord::Relation<Spree::Product>]
def relation
variants = order_cycle.variants_distributed_by(distributor)
products = variants.map(&:product).uniq
def products_relation
Spree::Product.where(id: stocked_products)
end
valid_products = products.reject do |product|
product_has_only_obsolete_master_in_distribution?(product, variants)
end
product_ids = valid_products.map(&:id)
Spree::Product.where(id: product_ids)
def variants_relation
@order_cycle.
variants_distributed_by(@distributor).
merge(stocked_variants_and_overrides)
end
private
attr_reader :order_cycle, :distributor
def stocked_products
@order_cycle.
variants_distributed_by(@distributor).
merge(stocked_variants_and_overrides).
select("DISTINCT spree_variants.product_id")
end
# If a product without variants is added to an order cycle, and then some variants are added
# to that product, but not the order cycle, then the master variant should not available for
# customers to purchase.
def product_has_only_obsolete_master_in_distribution?(product, distributed_variants)
product.has_variants? &&
distributed_variants.include?(product.master) &&
(product.variants & distributed_variants).empty?
def stocked_variants_and_overrides
Spree::Variant.
joins("LEFT OUTER JOIN variant_overrides ON variant_overrides.variant_id = spree_variants.id
AND variant_overrides.hub_id = #{@distributor.id}").
joins(:stock_items).
where(query_stock_with_overrides)
end
def query_stock_with_overrides
"( #{variant_not_overriden} AND ( #{variant_on_demand} OR #{variant_in_stock} ) )
OR ( #{variant_overriden} AND ( #{override_on_demand} OR #{override_in_stock} ) )
OR ( #{variant_overriden} AND ( #{override_on_demand_null} AND #{variant_on_demand} ) )
OR ( #{variant_overriden} AND ( #{override_on_demand_null}
AND #{variant_not_on_demand} AND #{variant_in_stock} ) )"
end
def variant_not_overriden
"variant_overrides.id IS NULL"
end
def variant_overriden
"variant_overrides.id IS NOT NULL"
end
def variant_in_stock
"spree_stock_items.count_on_hand > 0"
end
def variant_on_demand
"spree_stock_items.backorderable IS TRUE"
end
def variant_not_on_demand
"spree_stock_items.backorderable IS FALSE"
end
def override_on_demand
"variant_overrides.on_demand IS TRUE"
end
def override_in_stock
"variant_overrides.count_on_hand > 0"
end
def override_on_demand_null
"variant_overrides.on_demand IS NULL"
end
end

View File

@@ -9,8 +9,8 @@ class SubscriptionValidator
attr_reader :subscription
validates_presence_of :shop, :customer, :schedule, :shipping_method, :payment_method
validates_presence_of :bill_address, :ship_address, :begins_at
validates :shop, :customer, :schedule, :shipping_method, :payment_method, presence: true
validates :bill_address, :ship_address, :begins_at, presence: true
validate :shipping_method_allowed?
validate :payment_method_allowed?
validate :payment_method_type_allowed?

View File

@@ -2,8 +2,8 @@
%h1.page-title
=t :customers
- content_for :app_wrapper_attrs do
= "ng-app='admin.customers'"
- content_for :main_ng_app_name do
= "admin.customers"
- content_for :page_actions do
%li

View File

@@ -4,8 +4,8 @@
= t('.editing')
= @enterprise.name
- content_for :app_wrapper_attrs do
= "ng-app='admin.enterprises'"
- content_for :main_ng_app_name do
= "admin.enterprises"
- content_for :page_actions do
%li= select :enterprise, :id, options_for_select(editable_enterprises.collect {|e| [e.name, e.id, {:'data-url' => "#{main_app.edit_admin_enterprise_path(e.permalink)}", :'ng-selected' => "selected==#{e.id}"}]}, @enterprise.id ), {}, {:'enterprise-switcher' => '', 'data-initial' => "#{@enterprise.id}", :'ng-init' => "selected='#{@enterprise.id}'", :'ng-model' => 'selected', :id => 'enterprise_switcher', :class => 'select2'}

View File

@@ -1,8 +1,8 @@
- content_for :page_title do
= t('.title')
- content_for :app_wrapper_attrs do
= "ng-app='admin.enterprises'"
- content_for :main_ng_app_name do
= "admin.enterprises"
- content_for :page_actions do
= render 'admin/shared/user_guide_link'

View File

@@ -6,8 +6,8 @@
- content_for :page_actions do
%li= button_link_to t('.back_link'), main_app.admin_enterprises_path, icon: 'icon-arrow-left'
- content_for :app_wrapper_attrs do
= "ng-app='admin.enterprises'"
- content_for :main_ng_app_name do
= "admin.enterprises"
= admin_inject_available_countries(module: 'admin.enterprises')
= admin_inject_json "admin.enterprises", "defaultCountryID", Spree::Config[:default_country_id]

View File

@@ -1,8 +1,8 @@
= content_for :page_title do
= t :admin_order_cycles
- content_for :app_wrapper_attrs do
= "ng-app='admin.orderCycles'"
- content_for :main_ng_app_name do
= "admin.orderCycles"
= content_for :page_actions do
- if subscriptions_enabled?

View File

@@ -1,8 +1,8 @@
- content_for :page_title do
= t('admin.subscriptions.subscriptions')
- content_for :app_wrapper_attrs do
= "ng-app='admin.subscriptions'"
- content_for :main_ng_app_name do
= "admin.subscriptions"
- content_for :page_actions do
%li

View File

@@ -146,13 +146,3 @@
= t '.footer_data_text_without_privacy_policy_html', {cookies_policy: cookies_policy_link.html_safe }
.medium-2.columns.text-center
/ Placeholder
-if ENV['SKYLIGHT_PUBLIC_DASHBOARD_URL'].present?
.row
.small-12.medium-8.medium-offset-2.columns.text-center
%hr.hr-light
%br
.row
.small-12.medium-8.medium-offset-2.columns.text-center
.text.small
= t '.footer_skylight_dashboard_html', {dashboard: link_to('Skylight', ENV['SKYLIGHT_PUBLIC_DASHBOARD_URL'], target: "_blank")}

View File

@@ -1,2 +0,0 @@
- if can? :admin, Spree::User
= tab(:users, url: spree.admin_users_path, icon: 'icon-user')

View File

@@ -2,12 +2,12 @@
- content_for :page_title do
%i.icon-arrow-right
= Spree.t(:adjustments)
= t(:adjustments)
- content_for :page_actions do
%li= button_link_to Spree.t(:new_adjustment), new_admin_order_adjustment_url(@order), :icon => 'icon-plus'
%li= button_link_to Spree.t(:back_to_orders_list), admin_orders_path, :icon => 'icon-arrow-left'
%li= button_link_to t(:new_adjustment), new_admin_order_adjustment_url(@order), :icon => 'icon-plus'
%li= button_link_to t(:back_to_orders_list), admin_orders_path, :icon => 'icon-arrow-left'
= render :partial => 'adjustments_table'
= button_link_to Spree.t(:continue), @order.cart? ? new_admin_order_payment_url(@order) : admin_orders_url, :icon => 'icon-arrow-right'
= button_link_to t(:continue), @order.cart? ? new_admin_order_payment_url(@order) : admin_orders_url, :icon => 'icon-arrow-right'

View File

@@ -0,0 +1,14 @@
.row
.alpha.four.columns
.field
= f.label :name, t("spree.name")
= f.text_field :name, class: 'fullwidth'
.four.columns
.field
= f.label :iso_name, t("spree.iso_name")
= f.text_field :iso_name, class: 'fullwidth'
.omega.four.columns
.field.checkbox
%label
= f.check_box :states_required
= t("spree.states_required")

View File

@@ -0,0 +1,16 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.editing_country")
- content_for :page_actions do
%li
= button_link_to t("spree.back_to_countries_list"), spree.admin_countries_path, icon: 'icon-arrow-left'
= render partial: 'spree/shared/error_messages', locals: { target: @country }
= form_for [:admin, @country] do |f|
%fieldset.no-border-top
= render partial: 'form', locals: { f: f }
.clear
= render partial: 'spree/admin/shared/edit_resource_links'

View File

@@ -0,0 +1,27 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.listing_countries")
%table#listing_countries.index
%colgroup
%col{style: "width: 35%"}/
%col{style: "width: 35%"}/
%col{style: "width: 20%"}/
%col{style: "width: 10%"}/
%thead
%tr
%th= t("spree.country_name")
%th= t("spree.iso_name")
%th= t("spree.states_required")
%th.actions
%tbody
- @countries.each do |country|
- tr_class = cycle('odd', 'even')
- tr_id = spree_dom_id(country)
%tr{class: tr_class, id: tr_id}
%td= country.name
%td= country.iso_name
%td.align-center= country.states_required.to_s.titleize
%td.actions
= link_to_edit country, no_text: true

View File

@@ -8,7 +8,7 @@
= Spree.t("shipment_states.#{shipment.state}")
- if shipment.ready? and can? :update, shipment
= "-"
= link_to 'ship', '#', :class => 'ship button icon-arrow-right', :data => { 'shipment-number' => shipment.number }
= link_to t(:ship), '#', :class => 'ship button icon-arrow-right', :data => { 'shipment-number' => shipment.number }
%table.stock-contents.index{ "data-hook" => "stock-contents" }
%colgroup

View File

@@ -10,7 +10,7 @@
= line_item.single_money.to_html
%td.item-qty-show.align-center
- item.states.each do |state,count|
= "#{count} x #{state.humanize.downcase}"
= "#{count} x #{t(state.humanize.downcase)}"
- unless shipment.shipped?
%td.item-qty-edit.hidden
= number_field_tag :quantity, item.quantity, :min => 0, :class => "line_item_quantity", :size => 5

View File

@@ -1,5 +1,5 @@
- content_for :app_wrapper_attrs do
= "ng-app='admin.lineItems'"
- content_for :main_ng_app_name do
= "admin.lineItems"
- content_for :page_title do
%h1.page-title

View File

@@ -13,8 +13,8 @@
#select-customer{"data-hook" => ""}
%fieldset.no-border-bottom
%legend{:align => "center"}= Spree.t(:customer_search)
- content_for :app_wrapper_attrs do
= 'ng-app=admin.orders'
- content_for :main_ng_app_name do
= "admin.orders"
= hidden_field_tag :customer_search_override, nil, distributor_id: @order.distributor_id, :class => 'fullwidth title customer-search-override'
= render :partial => "spree/admin/orders/customer_details/autocomplete", :formats => :js

View File

@@ -6,7 +6,7 @@
%li= button_link_to Spree.t(:resend), resend_admin_order_url(@order), :method => :post, :icon => 'icon-email'
%li.links-dropdown#links-dropdown{ links: order_links(@order).to_json }
- if can?(:admin, Spree::Order)
%li= button_link_to Spree.t(:back_to_orders_list), admin_orders_path, :icon => 'icon-arrow-left'
%li= button_link_to t(:back_to_orders_list), admin_orders_path, :icon => 'icon-arrow-left'
= render :partial => 'spree/admin/shared/order_tabs', :locals => { :current => 'Order Details' }

View File

@@ -7,8 +7,11 @@
= render partial: 'spree/admin/shared/order_sub_menu'
- content_for :app_wrapper_attrs do
= "ng-app='admin.orders' ng-controller='ordersCtrl'"
- content_for :main_ng_app_name do
= "admin.orders"
- content_for :main_ng_ctrl_name do
= "ordersCtrl"
- content_for :table_filter_title do
= t(:search)

View File

@@ -2,9 +2,9 @@
%thead
%tr
%th= "#{Spree.t('date')}/#{Spree.t('time')}"
%th= Spree.t(:amount)
%th= Spree.t(:payment_method)
%th= Spree.t(:payment_state)
%th= t(:amount)
%th= t(:payment_method)
%th= t(:payment_state)
%th.actions
%tbody
- payments.each do |payment|
@@ -13,7 +13,7 @@
%td.align-center= payment.display_amount.to_html
%td.align-center= link_to payment_method_name(payment), spree.admin_order_payment_path(@order, payment)
%td.align-center
%span{class: "state #{payment.state}"}= Spree.t(payment.state, scope: :payment_states, default: payment.state.capitalize)
%span{class: "state #{payment.state}"}= t(payment.state, scope: :payment_states, default: payment.state.capitalize)
%td.actions
- payment.actions.each do |action|
= link_to_with_icon "icon-#{action}", Spree.t(action), fire_admin_order_payment_path(@order, payment, e: action), method: :put, no_text: true, data: {action: action}

View File

@@ -3,20 +3,20 @@
- content_for :page_actions do
- if @order.outstanding_balance?
%li#new_payment_section
= button_link_to Spree.t(:new_payment), new_admin_order_payment_url(@order), icon: 'icon-plus'
%li= button_link_to Spree.t(:back_to_orders_list), admin_orders_path, icon: 'icon-arrow-left'
= button_link_to t(:new_payment), new_admin_order_payment_url(@order), icon: 'icon-plus'
%li= button_link_to t(:back_to_orders_list), admin_orders_path, icon: 'icon-arrow-left'
- content_for :page_title do
%i.icon-arrow-right
= Spree.t(:payments)
= t(:payments)
- if @order.outstanding_balance?
%h5.outstanding-balance
= @order.outstanding_balance < 0 ? Spree.t(:credit_owed) : Spree.t(:balance_due)
= @order.outstanding_balance < 0 ? t(:credit_owed) : t(:balance_due)
\:
%strong= @order.display_outstanding_balance
- if @payments.any?
= render partial: 'list', locals: { payments: @payments }
- else
.alpha.twelve.columns.no-objects-found= Spree.t(:order_has_no_payments)
.alpha.twelve.columns.no-objects-found= t(:order_has_no_payments)

View File

@@ -53,18 +53,17 @@
= f.label :sku, t(:sku)
= f.text_field :sku, :size => 16
- if Spree::Config[:track_inventory_levels]
.alpha.two.columns
= f.field_container :on_hand do
= f.label :on_hand, t(:on_hand)
= f.number_field :on_hand, :min => 0
.omega.two.columns
= f.field_container :on_demand, :class => ['checkbox'] do
%label
= f.check_box :on_demand
= t(:on_demand)
.alpha.two.columns
= f.field_container :on_hand do
= f.label :on_hand, t(:on_hand)
= f.number_field :on_hand, :min => 0
.omega.two.columns
= f.field_container :on_demand, :class => ['checkbox'] do
%label
= f.check_box :on_demand
= t(:on_demand)
.clear
.clear
%ul#shipping_specs
%li#shipping_specs_weight_field.field.alpha.two.columns

View File

@@ -3,17 +3,17 @@
= form_for [:admin, @product], :html => { :multipart => true } do |f|
.twelve.columns.alpha
%fieldset.no-border-bottom{ id: "new_product" }
%legend{align: "center"}= t(:new_product)
%legend{align: "center"}= t(".new_product")
.twelve.columns.alpha
.six.columns.alpha
= f.field_container :supplier do
= f.label :supplier_id, t(:supplier)
= f.label :supplier_id, t(".supplier")
%span.required *
= f.collection_select(:supplier_id, @producers, :id, :name, {:include_blank => true}, {:class => "select2 fullwidth"})
= f.error_message_on :supplier
.six.columns.omega
= f.field_container :name do
= f.label :name, t(:product_name)
= f.label :name, t(".product_name")
%span.required *
%br/
= f.text_field :name, :class => 'fullwidth title'
@@ -21,7 +21,7 @@
.twelve.columns.alpha{ 'ng-controller' => 'unitsCtrl' }
.six.columns.alpha
= f.field_container :units do
= f.label :variant_unit_with_scale, t(:units)
= f.label :variant_unit_with_scale, t(".units")
%span.required *
%select.select2.fullwidth{ id: 'product_variant_unit_with_scale', 'ng-model' => 'product.variant_unit_with_scale', 'ng-options' => 'unit[1] as unit[0] for unit in variant_unit_options' }
%option{'value' => '', 'ng-hide' => "hasUnit(product)"}
@@ -29,7 +29,7 @@
%input{ type: 'hidden', 'ng-value' => 'product.variant_unit_scale', name: 'product[variant_unit_scale]' }
.three.columns
= f.field_container :unit_value do
= f.label :product_unit_value_with_description, t(:value), 'ng-disabled' => "!hasUnit(product)"
= f.label :product_unit_value_with_description, t(".value"), 'ng-disabled' => "!hasUnit(product)"
%span.required *
%input.fullwidth{ id: 'product_unit_value_with_description', 'ng-model' => 'product.master.unit_value_with_description', :type => 'text', placeholder: "eg. 2", 'ng-disabled' => "!hasUnit(product)" }
%input{ type: 'hidden', 'ng-value' => 'product.master.unit_value', name: 'product[unit_value]' }
@@ -37,28 +37,28 @@
= render 'display_as', f: f
.three.columns.omega{ 'ng-show' => "product.variant_unit_with_scale == 'items'" }
= f.field_container :unit_name do
= f.label :product_variant_unit_name, t(:unit_name)
= f.label :product_variant_unit_name, t(".unit_name")
%input.fullwidth{ id: 'product_variant_unit_name','ng-model' => 'product.variant_unit_name', :name => 'product[variant_unit_name]', :placeholder => t('admin.products.unit_name_placeholder'), :type => 'text' }
.twelve.columns.alpha
.six.columns.alpha
= render 'spree/admin/products/primary_taxon_form', f: f
.two.columns
= f.field_container :price do
= f.label :price, t(:price)
= f.label :price, t(".price")
%span.required *
%br/
= f.text_field :price, class: 'fullwidth'
= f.error_message_on :price
.two.columns
= f.field_container :on_hand do
= f.label :on_hand, t(:on_hand)
= f.label :on_hand, t(".on_hand")
%span.required *
%br/
= f.text_field :on_hand, class: 'fullwidth'
= f.error_message_on :on_hand
.two.columns.omega
= f.field_container :on_demand do
= f.label :on_demand, t(:on_demand)
= f.label :on_demand, t(".on_demand")
%br/
= f.check_box :on_demand
= f.error_message_on :on_demand
@@ -74,13 +74,13 @@
.twelve.columns.alpha
= f.field_container :description do
= f.label :product_description, t(:product_description)
= f.label :product_description, t(".product_description")
%br/
%text-angular{'id' => 'product_description', 'name' => 'product[description]', 'class' => 'text-angular', "textangular-links-target-blank" => true, 'ta-toolbar' => "[['bold','italics','underline','clear'],['insertLink']]"}
= f.error_message_on :description
.four.columns.omega{ style: "text-align: center" }
%fieldset.no-border-bottom{ id: "image" }
%legend{align: "center"}= t(:image)
%legend{align: "center"}= t(".image")
.row
= image_tag "noimage/product.png", class: "four columns alpha"
.row
@@ -90,10 +90,10 @@
.form-buttons.filter-actions.actions
= button t('actions.create'), 'icon-ok', :submit, value: "create"
%span.or
= t(:or)
= t(".or")
= button t('actions.create_and_add_another'), 'icon-repeat', :submit, value: 'add_another'
%span.or
= t(:or)
= t(".or")
= link_to_with_icon 'icon-remove', t('actions.cancel'), admin_products_path, :class => 'button'

View File

@@ -24,4 +24,6 @@
= render "layouts/bugherd_script"
%link{'data-require' => "font-awesome@*", 'data-semver'=>"4.2.0", 'rel' => "stylesheet", 'href' => "//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.2.0/css/font-awesome.css"}
= render "layouts/auth_token_script"
= yield :head

View File

@@ -1,7 +1,7 @@
<script>
Spree.routes = <%== {
:variants_search => spree.admin_search_variants_path(:format => 'json'),
:taxons_search => spree.api_taxons_path(:format => 'json'),
:taxons_search => main_app.api_taxons_path(:format => 'json'),
:user_search => spree.admin_search_users_path(:format => 'json'),
:orders_api => spree.api_orders_path(:format => 'json')
}.to_json %>;

View File

@@ -7,3 +7,5 @@
= tab :enterprises, :url => main_app.admin_enterprises_path
= tab :customers, :url => main_app.admin_customers_path
= tab :enterprise_groups, :url => main_app.admin_enterprise_groups_path, label: 'groups'
- if can? :admin, Spree::User
= tab(:users, url: spree.admin_users_path, icon: 'icon-user')

View File

@@ -0,0 +1,9 @@
.row
.alpha.six.columns
= f.field_container :name do
= f.label :name, t("spree.name")
= f.text_field :name, class: 'fullwidth'
.omega.six.columns
= f.field_container :abbr do
= f.label :abbr, t("spree.abbreviation")
= f.text_field :abbr, class: 'fullwidth'

View File

@@ -0,0 +1,24 @@
#new_state
%table#listing_states.index
%colgroup
%col{style: "width: 70%"}/
%col{style: "width: 15%"}/
%col{style: "width: 15%"}/
%thead
%tr
%th= t("spree.name")
%th= t("spree.abbreviation")
%th.actions
%tbody
- @states.each do |state|
- tr_class = cycle('odd', 'even')
- tr_id = spree_dom_id(state)
%tr{class: tr_class, id: tr_id}
%td= state.name
%td.align-center= state.abbr
%td.actions
= link_to_with_icon 'icon-edit', t("spree.edit"), edit_admin_country_state_url(@country, state), no_text: true
= link_to_delete state, no_text: true
- if @states.empty?
%tr
%td{colspan: "3"}= t("spree.none")

View File

@@ -0,0 +1,16 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.editing_state")
%i.icon-arrow-right
= @state.name
- content_for :page_actions do
%li
= button_link_to t("spree.back_to_states_list"), spree.admin_country_states_url(@country), icon: 'icon-arrow-left'
= render partial: 'spree/shared/error_messages', locals: { target: @state }
= form_for [:admin, @country, @state] do |f|
%fieldset.no-border-top
= render partial: 'form', locals: { f: f }
= render partial: 'spree/admin/shared/edit_resource_links'

View File

@@ -0,0 +1,16 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.states")
- content_for :page_actions do
%li#new_state_link
= button_link_to t("spree.new_state"), new_admin_country_state_url(@country), { remote: true, icon: 'icon-plus', id: 'new_state_link' }
.field.row
= label_tag :country, t("spree.country")
- databaseurl = "#{admin_states_path(format: :js)}?country_id="
%select#country.observe_field.select2.fullwidth{"data-base-url" => databaseurl, "data-update" => "#state-list"}
= options_from_collection_for_select(@countries, :id, :name, @country.id)
= image_tag 'select2-spinner.gif', plugin: 'spree', style: 'display:none;', id: 'busy_indicator'
#state-list
= render partial: 'state_list'

View File

@@ -0,0 +1,12 @@
= render partial: 'spree/admin/shared/configuration_menu'
= render partial: 'spree/shared/error_messages', locals: { target: @state }
- content_for :page_title do
= t("spree.new_state")
= form_for [:admin, @country, @state] do |f|
%fieldset
%legend= t("spree.new_state")
= render partial: 'form', locals: { f: f }
= render partial: 'spree/admin/shared/new_resource_links'

View File

@@ -0,0 +1,2 @@
$("#new_state").html("<%= escape_javascript(render :template => 'spree/admin/states/new', :formats => [:html], :handlers => [:erb]) %>");
$("#new_state_link").parent().hide();

View File

@@ -0,0 +1,15 @@
.row
.alpha.four.columns
= f.field_container :name do
= f.label :name, t("spree.name")
= f.text_field :name, class: 'fullwidth'
.five.columns
= f.field_container :description do
= f.label :description, t("spree.description")
%br/
= f.text_field :description, class: 'fullwidth'
.three.columns.omega
= f.field_container :is_default, class: ['checkbox'] do
%label
= f.check_box :is_default
= t("spree.default")

View File

@@ -0,0 +1,14 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.editing_tax_category")
- content_for :page_actions do
%li= link_to_with_icon 'icon-arrow-left', t("spree.back_to_tax_categories_list"), admin_tax_categories_path, class: 'button'
= render partial: 'spree/shared/error_messages', locals: { target: @tax_category }
= form_for [:admin, @tax_category] do |f|
%fieldset.no-border-top
= render partial: 'form', locals: { f: f }
= render partial: 'spree/admin/shared/edit_resource_links'

View File

@@ -0,0 +1,38 @@
= render :partial => 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.listing_tax_categories")
- content_for :page_actions do
%ul.actions.inline-menu
%li
= button_link_to t("spree.new_tax_category"), new_object_url, :icon => 'icon-plus', :id => 'admin_new_tax_categories_link'
%table#listing_tax_categories.index
%colgroup
%col{style: "width: 30%"}/
%col{style: "width: 40%"}/
%col{style: "width: 15%"}/
%col{style: "width: 15%"}/
%thead
%tr{"data-hook" => "tax_header"}
%th= t("spree.name")
%th= t("spree.description")
%th= t("spree.default")
%th.actions
%tbody
- @tax_categories.each do |tax_category|
- @edit_url = edit_admin_tax_category_path(tax_category)
- @delete_url = admin_tax_category_path(tax_category)
- tr_class = cycle('odd', 'even')
- tr_id = spree_dom_id(tax_category)
%tr{class: tr_class, id: tr_id}
%td= tax_category.name
%td= tax_category.description
%td.align-center= tax_category.is_default.to_s.titleize
%td.actions
= link_to_edit tax_category, no_text: true
= link_to_delete tax_category, no_text: true
- if @tax_categories.empty?
%tr
%td{colspan: "4"}= t("spree.none")

View File

@@ -0,0 +1,14 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.new_tax_category")
- content_for :page_actions do
%li= link_to_with_icon 'icon-arrow-left', t("spree.back_to_tax_categories_list"), admin_tax_categories_path, class: 'button'
= render partial: 'spree/shared/error_messages', locals: { target: @tax_category }
= form_for [:admin, @tax_category] do |f|
%fieldset.no-border-top
= render partial: 'form', locals: { f: f }
= render partial: 'spree/admin/shared/new_resource_links'

View File

@@ -0,0 +1 @@
= render partial: 'spree/admin/shared/configuration_menu'

View File

@@ -0,0 +1,28 @@
%div
.alpha.twelve.columns
%fieldset.no-border-bottom
%legend{align: "center"}= t("spree.general_settings")
.alpha.six.columns
.field
= f.label :name, t("spree.name")
= f.text_field :name, class: 'fullwidth'
.field
= f.label :amount, t("spree.rate")
= f.text_field :amount, class: 'fullwidth'
%p
%em= t("spree.tax_rate_amount_explanation")
.field
= f.check_box :included_in_price
= f.label :included_in_price, t("spree.included_in_price")
.omega.six.columns
.field
= f.label :zone, t("spree.zone")
= f.collection_select(:zone_id, @available_zones, :id, :name, {}, {class: 'select2 fullwidth'})
.field
= f.label :tax_category_id, t("spree.tax_category")
= f.collection_select(:tax_category_id, @available_categories,:id, :name, {}, {class: 'select2 fullwidth'})
.field
= f.check_box :show_rate_in_label
= f.label :show_rate_in_label, t("spree.show_rate_in_label")
.clear
= render partial: 'spree/admin/shared/calculator_fields', locals: { f: f }

View File

@@ -0,0 +1,16 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.editing_tax_rate")
- content_for :page_actions do
%li
= button_link_to t("spree.back_to_tax_rates_list"), spree.admin_tax_rates_path, icon: 'icon-arrow-left'
= render partial: 'spree/shared/error_messages', locals: { target: @tax_rate }
= form_for [:admin, @tax_rate] do |f|
%fieldset.no-border-top
= render partial: 'form', locals: { f: f }
.clear
= render partial: 'spree/admin/shared/edit_resource_links'

View File

@@ -0,0 +1,48 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.tax_rates")
- content_for :page_actions do
%li
= button_link_to t("spree.new_tax_rate"), new_object_url, icon: 'icon-plus'
- unless @tax_rates.any?
.no-objects-found
= t("spree.no_results")
- else
%table.index
%colgroup
%col{style: "width: 15%"}/
%col{style: "width: 15%"}/
%col{style: "width: 10%"}/
%col{style: "width: 10%"}/
%col{style: "width: 10%"}/
%col{style: "width: 10%"}/
%col{style: "width: 15%"}/
%col{style: "width: 15%"}/
%thead
%tr
%th= t("spree.zone")
%th= t("spree.name")
%th= t("spree.category")
%th= t("spree.amount")
%th= t("spree.included_in_price")
%th= t("spree.show_rate_in_label")
%th= t("spree.calculator")
%th.actions
%tbody
- @tax_rates.each do |tax_rate|
- tr_class = cycle('odd', 'even')
- tr_id = spree_dom_id(tax_rate)
%tr{class: tr_class, id: tr_id}
%td= tax_rate.zone.try(:name) || t("spree.not_available")
%td= tax_rate.name
%td= tax_rate.tax_category.try(:name) || t("spree.not_available")
%td.align-center= tax_rate.amount
%td.align-center= tax_rate.included_in_price
%td.align-center= tax_rate.show_rate_in_label
%td.align-center= tax_rate.calculator.to_s
%td.actions
= link_to_edit tax_rate, no_text: true
= link_to_delete tax_rate, no_text: true

View File

@@ -0,0 +1,16 @@
= render partial: 'spree/admin/shared/configuration_menu'
- content_for :page_title do
= t("spree.new_tax_rate")
- content_for :page_actions do
%li
= button_link_to t("spree.back_to_tax_rates_list"), spree.admin_tax_rates_path, icon: 'icon-arrow-left'
= render partial: 'spree/shared/error_messages', locals: { target: @tax_rate }
= form_for [:admin, @tax_rate] do |f|
%fieldset.no-border-top
= render partial: 'form', locals: { f: f }
.clear
= render partial: 'spree/admin/shared/new_resource_links'

View File

@@ -0,0 +1,7 @@
.field.align-center
= f.field_container :name do
= f.label :name, t("spree.name")
%span.required *
%br/
= error_message_on :taxonomy, :name, class: 'fullwidth title'
= text_field :taxonomy, :name

View File

@@ -0,0 +1,13 @@
<% content_for :head do %>
<%= javascript_tag "var taxonomy_id = #{@taxonomy.id};
var loading = '#{escape_javascript t("spree.loading")}';
var new_taxon = '#{escape_javascript t("spree.new_taxon")}';
var server_error = '#{escape_javascript t("spree.server_error")}';
var taxonomy_tree_error = '#{escape_javascript t("spree.taxonomy_tree_error")}';
$(document).ready(function(){
setup_taxonomy_tree(taxonomy_id);
});
"
%>
<% end %>

Some files were not shown because too many files have changed in this diff Show More