Compare commits

...

474 Commits

Author SHA1 Message Date
Matt-Yorkley
a296710f78 Update all locales *again* with the latest translations, before publishing 2020-10-26 10:55:17 +00:00
Luis Ramos
ebd7e9599b Merge pull request #6248 from Matt-Yorkley/s3-credentials
Fix #s3_credentials
2020-10-25 19:47:57 +00:00
Matt-Yorkley
df3ac0394c Fix #s3_credentials 2020-10-25 14:04:33 +00:00
Matt-Yorkley
822c82fa9d Merge pull request #6204 from jhsu802701/remove_docker_md
Removed DOCKER.md (redundant)
2020-10-25 13:20:35 +01:00
Matt-Yorkley
f22c7fcdfb Merge pull request #6151 from luisramos0/stripe_save_cards
Stripe Feature Tests: checkout with saved a card
2020-10-24 23:29:29 +02:00
Matt-Yorkley
9b72f7e45c Merge pull request #6234 from Matt-Yorkley/fix-ordercyle-layout
Fix minor ordercyle selector layout regression
2020-10-23 10:52:25 +02:00
Matt-Yorkley
21a48f14f4 Update all locales with the latest Transifex translations 2020-10-22 21:03:11 +01:00
Matt-Yorkley
7d604884bf Merge pull request #6201 from openfoodfoundation/transifex
Transifex
2020-10-22 22:01:20 +02:00
Matt-Yorkley
5edd562691 Merge pull request #6238 from openfoodfoundation/mobile-5-product-listings
Merge Product Listings to master
2020-10-22 21:55:42 +02:00
Transifex-Openfoodnetwork
ec1b5c228d Updating translations for config/locales/nb.yml 2020-10-23 05:58:25 +11:00
Matt-Yorkley
176021b201 Fix minor ordercyle selector layout regression 2020-10-22 19:57:32 +01:00
Transifex-Openfoodnetwork
828df9fd43 Updating translations for config/locales/ar.yml 2020-10-23 03:14:52 +11:00
Matt-Yorkley
28590fdad4 Merge pull request #6223 from luisramos0/image_default_styles
Update image default styles
2020-10-22 17:54:32 +02:00
Luis Ramos
61cfdb4038 Merge pull request #6114 from mbudm/issue/6031
Add matomo tag to admin pages
2020-10-22 15:24:34 +01:00
Matt-Yorkley
489529d30e Merge pull request #5729 from luisramos0/image_settings
Remove Image settings page and standardise Paperclip styles
2020-10-22 15:58:14 +02:00
Luis Ramos
a4f21be99a Merge pull request #6237 from openfoodfoundation/dependabot/bundler/ddtrace-0.42.0
Bump ddtrace from 0.41.0 to 0.42.0
2020-10-22 13:48:15 +01:00
Matt-Yorkley
4dbe966fcf Add subtle hover effect on clickable image 2020-10-22 10:37:11 +01:00
Matt-Yorkley
857ecaf680 Update "noimage" placeholder for :small size to 227x227px 2020-10-22 10:02:59 +01:00
Matt-Yorkley
01adf459b1 Replace top padding on product list 2020-10-22 09:59:16 +01:00
Matt-Yorkley
fb482fc1c7 Quickfix: unwanted border-right on bulk buy buttons 2020-10-22 15:46:49 +11:00
Maikel Linke
db53848092 Enable switching language of "Price breakdown"
And move translation to its own context.
2020-10-22 15:46:49 +11:00
Maikel Linke
2887751098 Move translation to its own section 2020-10-22 15:46:49 +11:00
Maikel Linke
e0a7f50626 Standardise new grey colour 2020-10-22 15:46:49 +11:00
Maikel Linke
db321da02a Fade "From" producer label 2020-10-22 15:46:49 +11:00
Maikel Linke
d5f0fb10f4 Distinguish unit size more from variant name 2020-10-22 15:46:49 +11:00
Maikel Linke
f6f029666a Remove gaps in multi-line variant name 2020-10-22 15:46:49 +11:00
Maikel Linke
23454ba3bf Show product property description nub on mobile 2020-10-22 15:46:49 +11:00
Maikel Linke
a3e83f2f70 Grey out disabled bulk quantity buttons
Since they are further away from each other, the colour difference has
to be stronger to be recognised.
2020-10-22 15:46:49 +11:00
Maikel Linke
ec1887544e Reduce bulk input modal size
This brings the related elements closer together.
2020-10-22 15:46:49 +11:00
Maikel Linke
e37fedc435 Add bulk ribbon to bulk products 2020-10-22 15:46:49 +11:00
Maikel Linke
ed902e7489 Reduce price breakdown size
It doesn't need as much space. This brings related text closer together
and hides less of the page, e.g. the add-to-cart button.
2020-10-22 15:46:49 +11:00
Maikel Linke
68777039bf Adjust padding in the price breakdown modal 2020-10-22 15:46:48 +11:00
Maikel Linke
bbe2ce9cba Add "Price breakdown" heading to pop-up
The translation key was already present even though it was unused.
2020-10-22 15:46:48 +11:00
Maikel Linke
450e5cc5e3 Remove indent of product description on iPhone
Our HTML formatting plugin for product descriptions adds whitespace to
the beginning of the description text. While that shouldn't be rendered
in HTML, Safari on iPhone was showing a whitespace and therefore moving
the text a bit to the right.
2020-10-22 15:46:48 +11:00
Maikel Linke
36ead3fdba Remove margin between products and search bar on mobile 2020-10-22 15:46:48 +11:00
Maikel Linke
30bfb1a7bd Fix clickable area when opening price breakdown
Once a price breakdown has been opened, the nub was over the bottom half
of the pie button. It made half of the pie unclickable.

And when you closed the breakdown, it became invisible but stayed
present, absorbing all clicks in that area. So other pie buttons were
unclickable as well.
2020-10-22 15:46:48 +11:00
Maikel Linke
0268782b5e Align price pie with product name
Moving it a bit to the right on mobile.
And giving the variant name a bit more space.
2020-10-22 15:46:48 +11:00
Maikel Linke
152835335d Pre-calculate product image size in layout
Giving a percentage is simpler than the whole formula.
2020-10-22 15:46:48 +11:00
Maikel Linke
fd14d61213 Adjust product separator color
The original design contains grey-100: e6e6e6

Also removed not needed comment.
2020-10-22 15:46:48 +11:00
Maikel Linke
05add9e530 Enlarge product pictures flexibly for devices
This change will need a change of the `small` image size. The new format
should be `227x227#`. The `#` crops the center of an image to make it
square if necessary. All old images should then be regenerated:

  rake paperclip:refresh:thumbnails CLASS=Spree::Image
2020-10-22 15:46:48 +11:00
Maikel Linke
de9b10b227 Darken add-button on hover 2020-10-22 15:46:48 +11:00
Maikel Linke
41ab84c8f9 Add padding to product tags 2020-10-22 15:46:48 +11:00
Maikel Linke
cb5089a69a Increase space for variant name on mobile 2020-10-22 15:46:48 +11:00
Maikel Linke
15c7dad5f2 Left-align prices on mobile 2020-10-22 15:46:48 +11:00
Maikel Linke
b57c912aa0 Add space between products and filters 2020-10-22 15:46:48 +11:00
Maikel Linke
66d5f8d5c1 Align first product flush to the search bar 2020-10-22 15:46:47 +11:00
Maikel Linke
1e3ff141f0 Reduce margin below product description 2020-10-22 15:46:47 +11:00
Maikel Linke
c053ae951b Style product header
Reduce font size.
Adjust margins.
2020-10-22 15:46:47 +11:00
Maikel Linke
3a3ec4e45e Close price breakdown on click outside 2020-10-22 15:46:47 +11:00
Maikel Linke
6bb48c0954 Adjust active colour of price breakdown button 2020-10-22 15:46:47 +11:00
Maikel Linke
1fd4dc471a Position the price breakdown below the button 2020-10-22 15:46:47 +11:00
Maikel Linke
2ce65472ec Remove obsolete styles
I think that this was overlooked when replacing the cart code in
be8c0f3600.
2020-10-22 15:46:47 +11:00
Maikel Linke
230d3e76a1 Label plus and minus symbols as special 2020-10-22 15:46:47 +11:00
Maikel Linke
650686c262 Adjust alignment of variant name with unit 2020-10-22 15:46:47 +11:00
Maikel Linke
cdbbcfd1fe Better naming for translation keys 2020-10-22 15:46:47 +11:00
Maikel Linke
e45941276e Better naming of translation keys
Also splitting one key for two different uses.
2020-10-22 15:46:47 +11:00
Maikel Linke
d2600b1d40 Avoid translation errors by hardcoding symbols
The fullwidth plus and minus signs are well understood in all countries
(that participate in the development of OFN). It's more likely that a
translator enters a normal plus or minus than that they want to change
the symbol. A normal + or - sign doesn't fill a whole character space
and is therefore not well aligned in the design.
2020-10-22 15:46:47 +11:00
Matt-Yorkley
b79d9bd75b Fix screen-width bug for desktop down
The width of these elements was ~105% of total screen width, adding horizontal scrollbars and whitespace on the left hand side
2020-10-22 15:46:47 +11:00
Matt-Yorkley
6bcf11e308 Adjust layout of variant rows for better use of vertical space 2020-10-22 15:46:47 +11:00
Matt-Yorkley
e39a15ed30 Remove margin-bottom with !important from product 2020-10-22 15:46:46 +11:00
Matt-Yorkley
98e581c059 Remove pad-top class from products from to match alignment with filter sidebar 2020-10-22 15:46:46 +11:00
Matt-Yorkley
e968a091f9 Match right and left row padding on phablet down 2020-10-22 15:46:46 +11:00
Matt-Yorkley
a2f710db1e Improve vertical alignment of variant form elements 2020-10-22 15:46:46 +11:00
Matt-Yorkley
898492c409 Remove borders from graph button 2020-10-22 15:46:46 +11:00
Matt-Yorkley
a89c81a033 Hide description paragraph if product has no description
Improves the appearance of the layout when no description is present
2020-10-22 15:46:46 +11:00
Maikel Linke
9da91576ac Fix height of invisible "in cart" text
While the text "x in cart" isn't visible, the item quantity is not set.
A missing variable leads to longer text that is taken up more space. In
this case it was two lines instead of one line. The resulting extra line
of margin disappeared when adding to the cart and the rest of the page
jumped up.
2020-10-22 15:46:46 +11:00
Maikel Linke
57178659c3 Remove bulk icon as per design 2020-10-22 15:46:46 +11:00
Maikel Linke
81cc951ed4 Name symbols on quantity buttons in specs 2020-10-22 15:46:46 +11:00
Maikel Linke
d337561ea8 Move ShopVariantCtrl to own file and spec it 2020-10-22 15:46:46 +11:00
Maikel Linke
755773e5ad Style code 2020-10-22 15:46:46 +11:00
Maikel Linke
58f4d7393c Make quantity labels translatable 2020-10-22 15:46:46 +11:00
Maikel Linke
01c4882759 Replace bulk buy inputs with add-remove-buttons 2020-10-22 15:46:46 +11:00
Maikel Linke
59c13b97ea Replace quantity input with add-remove buttons
The new mobile friendly design contains a nice "Add" button to add
variants to your cart. Once you have the variant in you cart, it's
replaced by plus and minus buttons to adjust the quantity.

Other languages have longer words than "Add" which need to fit on the
button. Since the add button and the +/- buttons should have the same
width, I widened them a little bit so that they fit the longest words
Aggiungi and Добавить.
2020-10-22 15:46:46 +11:00
Maikel Linke
35747dc2b1 Emphasize first identifying name of a variant
That can be a variant name or the unit if the name is missing. Putting
the second and third element in the background consistently.
2020-10-22 15:46:45 +11:00
Maikel Linke
7660116792 Display variant name only when set
The previous method was falling back to the product name which is
displayed already.
2020-10-22 15:46:45 +11:00
Maikel Linke
8734fb1776 Override *active* states for product properties w/o tooltip 2020-10-22 15:46:45 +11:00
Maikel Linke
9379e21bca Increase margin between product summary and variants 2020-10-22 15:46:45 +11:00
Maikel Linke
4ab2375832 Reduce margin on the right of product listing 2020-10-22 15:46:45 +11:00
Maikel Linke
1fb544b803 Remove margin of product listing on mobile and tablet 2020-10-22 15:46:45 +11:00
Maikel Linke
96cd5ca1fe Fix "Place price-breakdown and price in the middle" 2020-10-22 15:46:45 +11:00
Maikel Linke
e1a3c351e5 Fix "Removal of category icon" 2020-10-22 15:46:45 +11:00
Maikel Linke
4f6e900327 Fix "Remove background and border colors from product list" 2020-10-22 15:46:45 +11:00
Maikel Linke
615678db56 Align inline graph vertically 2020-10-22 15:46:45 +11:00
Maikel Linke
526d4f53ad Remove red overlay and icon on product image hover 2020-10-22 15:46:45 +11:00
Maikel Linke
ca1cb50314 Adjust margins 2020-10-22 15:46:45 +11:00
Maikel Linke
8006870b66 Adjust column widths 2020-10-22 15:46:45 +11:00
Maikel Linke
d02ab109f2 Show product images on mobile 2020-10-22 15:46:45 +11:00
Maikel Linke
fe1618cada Add description to product listing
It's truncated to one line and a click reveals the modal.
2020-10-22 15:46:45 +11:00
Maikel Linke
afed46531c Remove second line between products, leave one 2020-10-22 15:46:44 +11:00
Maikel Linke
893b6660fc Change price-breakdown colour to grey 2020-10-22 15:46:44 +11:00
Maikel Linke
3e789fdb84 Show only tabular price breakdown, no graph 2020-10-22 15:46:44 +11:00
Maikel Linke
065314f0e4 Revert "Remove popover indicator"
This reverts commit 0bef97a46710c50b8519752009ca9e8c811f8326.
2020-10-22 15:46:44 +11:00
Maikel Linke
952c39f736 Remove popover indicator 2020-10-22 15:46:44 +11:00
Maikel Linke
2b982cfc2e Show price breakdown on all screens 2020-10-22 15:46:44 +11:00
Maikel Linke
e29be51c45 Place price-breakdown and price in the middle 2020-10-22 15:46:44 +11:00
Maikel Linke
c15828061f Move unit under name 2020-10-22 15:46:44 +11:00
Maikel Linke
52c8c19dfc Remove black background from variant name on mobile
table-cell gave it a black background.
Also display it on the same line as the quantity input.
2020-10-22 15:46:44 +11:00
Maikel Linke
61d55ff16f Remove per-variant subtotal from mobile view 2020-10-22 15:46:44 +11:00
Maikel Linke
25e309b8cc Update link colors to orange and teal 2020-10-22 15:46:44 +11:00
Maikel Linke
9f5cec6d08 Remove tractor in front of producer name 2020-10-22 15:46:44 +11:00
Maikel Linke
03d8ccfe2e Remove modal open indicator 2020-10-22 15:46:44 +11:00
Maikel Linke
f05563b30f Removal of category icon 2020-10-22 15:46:44 +11:00
Maikel Linke
b34449832b Remove background and border colors from product list 2020-10-22 15:46:43 +11:00
Maikel Linke
0febc9e8c2 Remove unused mixin styles 2020-10-22 15:46:43 +11:00
dependabot-preview[bot]
20777bb80f Bump ddtrace from 0.41.0 to 0.42.0
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.41.0 to 0.42.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.41.0...v0.42.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-22 01:14:35 +00:00
Luis Ramos
032075c04a Merge pull request #6119 from arku/chore/fire-event-removal
Remove fire_event method usage
2020-10-21 21:21:35 +01:00
Transifex-Openfoodnetwork
6e6dd233e8 Updating translations for config/locales/ru.yml 2020-10-22 02:30:07 +11:00
Matt-Yorkley
eb026f2e22 Use "sRBG" colourspace.
This seems to be the correct setting, and fixes a bug with the colouring of uploaded images. Further details:
https://imagemagick.org/script/color-management.php
https://www.imagemagick.org/discourse-server/viewtopic.php?t=20501
2020-10-21 14:26:26 +01:00
Matt-Yorkley
92d6168a14 Don't restrict image filetypes to JPG 2020-10-21 13:42:07 +01:00
Luis Ramos
78651012bb Merge pull request #6177 from santakadev/fix-docker-setup
Fix docker local environment setup
2020-10-21 08:45:07 +01:00
Luis Ramos
d01f9b7aa1 Merge pull request #6227 from jhsu802701/fix_docker_scripts
docker-compose run --rm web -> docker-compose run web
2020-10-21 08:44:37 +01:00
Transifex-Openfoodnetwork
af9aa6a8db Updating translations for config/locales/en_FR.yml 2020-10-21 18:35:58 +11:00
Transifex-Openfoodnetwork
2539507df9 Updating translations for config/locales/en_FR.yml 2020-10-21 18:32:58 +11:00
Transifex-Openfoodnetwork
d8b36c5966 Updating translations for config/locales/fr.yml 2020-10-21 18:30:35 +11:00
Jason Hsu
a9feb53294 docker-compose run --rm web -> docker-compose run web 2020-10-20 17:48:46 -05:00
Matt-Yorkley
f5ce0d501d Merge pull request #5870 from luisramos0/prefs
[Bye bye Spree] Bring models app_configuration and preference from spree_core
2020-10-20 21:12:54 +02:00
Luis Ramos
b267f542d1 Merge pull request #5980 from luisramos0/spree_clean_up
[Bye bye spree] Some clean up fixes to make it all work without spree
2020-10-20 18:52:54 +01:00
Luis Ramos
9f568c1e9d Merge pull request #5928 from luisramos0/spree_core_js
[Bye bye spree] Bring final bits of js and css from spree_core
2020-10-20 13:20:41 +01:00
Luis Ramos
3dc3e0970e Update image default styles 2020-10-20 11:31:01 +01:00
Luis Ramos
10ed1f04c1 Revert default styles to what they were before, we can do this in a separate PR 2020-10-20 11:25:55 +01:00
Luis Ramos
16f9ef4ace Simplify method 2020-10-20 11:20:37 +01:00
Luis Ramos
f4d8bdc17e Fix easy rubocop issues 2020-10-20 11:20:37 +01:00
Luis Ramos
f3490e5668 Replace Spree::Image with self 2020-10-20 11:20:37 +01:00
Luis Ramos
7cf6518175 Set default values for styles directly in the attachment property without using Spree::Config
Only use ENV vars for attachment path and url coming from ofn-install
2020-10-20 11:20:37 +01:00
Luis Ramos
d15abe14d1 Join reformat styles and set attachement definitions and explain why we need to run them every time Spree::Image is loaded although this is also done in the spree initializer 2020-10-20 11:20:37 +01:00
Luis Ramos
6151c7420b Move S3 attachment definitions to Spree::Image 2020-10-20 11:20:37 +01:00
Luis Ramos
fdd7049857 Reuse Spree::Image.set_attachment_definitions 2020-10-20 11:20:37 +01:00
Luis Ramos
b66ad71017 Move image settings config out of Spree::config initialization 2020-10-20 11:20:37 +01:00
Luis Ramos
98c5fdcf26 Reuse some code from Spree::Image in the spree initializer and extract some code to a class method so we can reuse afterwards 2020-10-20 11:20:37 +01:00
Luis Ramos
25ab5f7f24 Move reformat_styles to initializer, it's the only place where it is used 2020-10-20 11:20:37 +01:00
Luis Ramos
a5a55b3c10 Add settings initialization from previous image settings controller to spree initializer 2020-10-20 11:20:37 +01:00
Luis Ramos
0f06195baa Remove Image settings page, these settings will come from ofn-install now 2020-10-20 11:20:37 +01:00
Luis Ramos
bebffcc90f Set new S3 and attachments configs from ofn-install 2020-10-20 11:20:37 +01:00
Luis Ramos
c291639962 Merge pull request #6156 from razanjoshi/add_simplecov
Add coverage threshold for simplecov.
2020-10-20 09:40:07 +01:00
Transifex-Openfoodnetwork
de4aab6cf7 Updating translations for config/locales/en_US.yml 2020-10-20 02:03:21 +11:00
Luis Ramos
c0880a1b9a Merge pull request #6191 from mkllnk/draft-release
Add script to draft release notes
2020-10-19 12:22:24 +01:00
Arun Kumar Mohan
b0fa1464f8 Remove fire_event method usage 2020-10-18 20:36:38 -05:00
Luis Ramos
e6baca37c4 Merge pull request #6215 from Matt-Yorkley/states-filepath
Fix deployments
2020-10-18 23:16:53 +01:00
Matt-Yorkley
58c0d90575 Fix error in countries.rb 2020-10-18 19:49:48 +01:00
Matt-Yorkley
dc06f60d2c Merge pull request #6211 from openfoodfoundation/dependabot/bundler/webmock-3.9.3
Bump webmock from 3.9.2 to 3.9.3
2020-10-18 12:22:07 +02:00
Matt-Yorkley
4cd645b60e Merge pull request #6150 from openfoodfoundation/luisramos0-patch-1
Make the release notes intructions a bit more clear so new contributors make them short
2020-10-18 00:44:06 +02:00
Matt-Yorkley
961fbd22cf Merge pull request #6183 from openfoodfoundation/dependabot/bundler/activerecord-import-1.0.7
Bump activerecord-import from 1.0.6 to 1.0.7
2020-10-18 00:42:17 +02:00
Matt-Yorkley
b7c8bae9e8 Merge pull request #6185 from openfoodfoundation/dependabot/bundler/i18n-js-3.8.0
Bump i18n-js from 3.7.1 to 3.8.0
2020-10-18 00:41:09 +02:00
Matt-Yorkley
3612386463 Make loading of Zones in db:seed idempotent (and avoid fatal errors if run twice) 2020-10-17 18:08:28 +01:00
Matt-Yorkley
e9e7bdc6cd Set Spree::Config[:default_country_id]` from ENV vars if default country specified. 2020-10-17 17:54:48 +01:00
Matt-Yorkley
d1c066d360 Move states.yml back to it's former filepath 2020-10-17 17:14:26 +01:00
Rajan Joshi
13fe8b6198 Add more directories to filter. 2020-10-17 15:55:22 +01:00
dependabot-preview[bot]
b2e14b36dd Bump webmock from 3.9.2 to 3.9.3
Bumps [webmock](https://github.com/bblimke/webmock) from 3.9.2 to 3.9.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.9.2...v3.9.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-17 07:47:24 +00:00
Jason Hsu
f9f054c611 Removed DOCKER.md (redundant) 2020-10-16 11:31:48 -05:00
Transifex-Openfoodnetwork
9445093ea8 Updating translations for config/locales/en_FR.yml 2020-10-17 01:26:13 +11:00
Transifex-Openfoodnetwork
a4f00f0152 Updating translations for config/locales/fr.yml 2020-10-17 01:25:38 +11:00
Luis Ramos
2711139420 Re-use existing stripe stub 2020-10-16 12:37:44 +01:00
Luis Ramos
cf319d3f05 Extract customers stripe stub to StripeStubs helper 2020-10-16 12:37:44 +01:00
Luis Ramos
f5f9a733fb Fix rubocop issue, long module, by extracting StripeStubs to a separate helper module 2020-10-16 12:37:42 +01:00
Luis Ramos
05bb75db00 Merge pull request #6089 from luisramos0/seed_data
[Bye bye spree] Prepare seed data for bye bye spree
2020-10-16 11:55:27 +01:00
Luis Ramos
487aaf4862 Extract stub to StripeHelper 2020-10-16 11:12:44 +01:00
Luis Ramos
f13ebf8f21 DRY StripeHelper 2020-10-16 11:09:52 +01:00
Luis Ramos
7e80ddf1e5 Add step to checkout with the previously saved card 2020-10-16 10:24:49 +01:00
Luis Ramos
7efc52075e First attempt at adding a spec to checkout and save a credit card 2020-10-16 09:26:19 +01:00
Luis Ramos
22bd0f3a52 Merge pull request #6187 from jhsu802701/spec_support_request_stripe_helper
Updated RuboCop (spec/support/request/stripe_helper.rb)
2020-10-16 08:49:17 +01:00
Luis Ramos
94713522e5 Merge pull request #6189 from jhsu802701/update_db_schema
Updated db/schema.rb by running database migrations
2020-10-16 08:40:18 +01:00
Luis Ramos
49947614b3 Merge pull request #6190 from jhsu802701/rubocop_calculator_factory
Updated spec/factories/calculator_factory.rb for RuboCop
2020-10-16 08:36:53 +01:00
Jason Hsu
c39e238e83 Updated spec/factories/calculator_factory.rb to remove unnecessary space; reduces number of RuboCop offenses from 91 to 90 2020-10-16 00:08:19 -05:00
Maikel Linke
6c1139c296 Add script to draft release notes 2020-10-16 16:03:26 +11:00
Jason Hsu
0119d9d0eb Updated db/schema.rb by running bundle exec rake db:migrate 2020-10-15 23:56:43 -05:00
Maikel Linke
3679e0fac9 Copy all translations from Transifex 2020-10-16 15:34:24 +11:00
Maikel
960da1e7e9 Merge pull request #6179 from openfoodfoundation/transifex
Transifex
2020-10-16 15:33:11 +11:00
Maikel
8c65498661 Merge pull request #5998 from andrewpbrett/shipping-per-pound
Per-pound shipping calculator
2020-10-16 15:27:57 +11:00
Maikel
07780c5663 Merge pull request #6146 from openfoodfoundation/dependabot/bundler/geocoder-1.6.4
Bump geocoder from 1.6.3 to 1.6.4
2020-10-16 15:26:41 +11:00
Jason Hsu
bdf0cb1364 Exclude spec/support/request/stripe_helper.rb from Metrics/ModuleLength cop; reduces number of offenses from 90 to 89 2020-10-15 23:25:32 -05:00
Matt-Yorkley
f260a2d114 Merge pull request #6141 from Matt-Yorkley/mobile-shops-list
Make shops index page usable on mobile
2020-10-16 03:21:32 +02:00
Matt-Yorkley
25ee38cb9a Merge pull request #6128 from luisramos0/stripe_bo
Add feature specs to stripe payments in the BackOffice
2020-10-16 02:53:42 +02:00
Matt-Yorkley
248633e14f Merge pull request #6161 from Matt-Yorkley/add-polish-momentjs
Add polish translations with momentjs
2020-10-16 01:49:51 +02:00
dependabot-preview[bot]
66cde06cf8 Bump i18n-js from 3.7.1 to 3.8.0
Bumps [i18n-js](https://github.com/fnando/i18n-js) from 3.7.1 to 3.8.0.
- [Release notes](https://github.com/fnando/i18n-js/releases)
- [Changelog](https://github.com/fnando/i18n-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fnando/i18n-js/compare/v3.7.1...v3.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-15 23:24:41 +00:00
dependabot-preview[bot]
4fa6070353 Bump activerecord-import from 1.0.6 to 1.0.7
Bumps [activerecord-import](https://github.com/zdennis/activerecord-import) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/zdennis/activerecord-import/releases)
- [Changelog](https://github.com/zdennis/activerecord-import/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zdennis/activerecord-import/compare/v1.0.6...v1.0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-15 23:14:21 +00:00
Luis Ramos
6bacc2f627 Fix group_buy_report_spec by avoiding orders with duplicate line items 2020-10-15 18:33:56 +01:00
Luis Ramos
4c9e4ee926 Fix problem in calculator spec
I am not sure why this started failing on this branch only and not in master but this fix is correct because line_items are created with order defined already, an order.reload is enough to load them into the order
2020-10-15 17:19:39 +01:00
Matt-Yorkley
7de98e74b8 Use #setup_stripe helper in tests to ensure Stripe keys are present 2020-10-15 17:09:24 +01:00
Luis Ramos
5141723b21 Re-add restart checkout specs
These were breaking because of the class_evals on the checkout_spec
2020-10-15 16:06:27 +01:00
Luis Ramos
fb3f35100f Remove specs related to subsclassing the order class
This is not something we will  do
2020-10-15 16:06:27 +01:00
Luis Ramos
249b4d124f Remove more specs related to dynamic order checkout workflow 2020-10-15 16:06:27 +01:00
Luis Ramos
07b3c100e8 Remove code and specs related to dynamic checkout workflow, we have a static workflow defines in the Order class 2020-10-15 16:06:27 +01:00
Andy Brett
ca24068d37 use case-insensitive sql query 2020-10-15 07:55:19 -07:00
Transifex-Openfoodnetwork
5bd7000f58 Updating translations for config/locales/en_US.yml 2020-10-16 01:19:20 +11:00
Transifex-Openfoodnetwork
d9c107f282 Updating translations for config/locales/en_US.yml 2020-10-16 01:16:13 +11:00
Luis Ramos
6046b0f6e4 Fix typo 2020-10-15 14:54:42 +01:00
Luis Ramos
62a54e5f17 Add spec to cover stripe SCA refunds in the backoffice 2020-10-15 14:54:42 +01:00
Luis Ramos
bce81d27dd Move spec to end of file so we can extend this case with refunds and cancelations 2020-10-15 14:54:42 +01:00
Luis Ramos
a6ed003cb9 Extract redirect stub to stripe_helper 2020-10-15 14:54:42 +01:00
Luis Ramos
b341f593e7 Improve method names 2020-10-15 14:54:42 +01:00
Luis Ramos
59b4e425b6 Fix some rubocop issues 2020-10-15 14:54:42 +01:00
Luis Ramos
4ab2a8ddd1 Add spec to cover stripe payment that fails on card registration with a request/redirect for extra SCA authorization 2020-10-15 14:54:42 +01:00
Luis Ramos
a5dbdaf228 Add spec to cover stripe payment that fails on capture 2020-10-15 14:54:42 +01:00
Luis Ramos
76a9271d9e Add spec to cover payments in the backoffice for an order in the payment state 2020-10-15 14:54:42 +01:00
Luis Ramos
0178d3f1e6 Add spec that takes a stripe payment in the BO 2020-10-15 14:54:42 +01:00
Luis Ramos
cfed6a7048 Split payments_spec so that we can add more stripe specific specs 2020-10-15 14:54:42 +01:00
Luis Ramos
c664181266 Update PULL_REQUEST_TEMPLATE.md 2020-10-15 14:39:20 +01:00
Luis Ramos
945ea476fc Merge pull request #6176 from openfoodfoundation/dependabot/bundler/timecop-0.9.2
Bump timecop from 0.9.1 to 0.9.2
2020-10-15 13:50:53 +01:00
Luis Ramos
9e4e72bec3 Merge pull request #6167 from jhsu802701/rubocop_spec_support_request
Updated files in the spec/support/request directory for RuboCop compliance
2020-10-15 13:48:12 +01:00
Daniel Santamaría
3fe7638dd6 Fix docker local environment setup 2020-10-15 12:28:07 +02:00
Pau Pérez Fabregat
981c17b6a5 Merge pull request #6169 from luisramos0/rubocop_refresh
Refresh Rubocop exception files
2020-10-15 12:06:41 +02:00
Pau Pérez Fabregat
55b6e7fa89 Merge pull request #6164 from openfoodfoundation/dependabot/bundler/webmock-3.9.2
Bump webmock from 3.9.1 to 3.9.2
2020-10-15 10:23:46 +02:00
Luis Ramos
d54ddacc05 Merge pull request #5887 from luisramos0/orders
[Bye bye Spree] Bring models order, line_item and other related from spree_core
2020-10-15 08:49:05 +01:00
dependabot-preview[bot]
b009c8675b Bump timecop from 0.9.1 to 0.9.2
Bumps [timecop](https://github.com/travisjeffery/timecop) from 0.9.1 to 0.9.2.
- [Release notes](https://github.com/travisjeffery/timecop/releases)
- [Changelog](https://github.com/travisjeffery/timecop/blob/master/History.md)
- [Commits](https://github.com/travisjeffery/timecop/compare/v0.9.1...v0.9.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-14 17:34:03 +00:00
Luis Ramos
2b6b2c1b65 Update rubocop manual according to latest state of the codebase 2020-10-14 10:11:56 +01:00
Luis Ramos
6ea021a561 Update rubocop_todo.yml 2020-10-14 09:59:08 +01:00
Jason Hsu
a8eaabc5da Used guard clause in spec/support/request/checkout_helper.rb instead of an if statement with two actions; reduces the number of RuboCop offenses from 108 to 107 2020-10-13 12:14:15 -05:00
Jason Hsu
0d051b7c7d Added '# frozen_string_literal: true' to spec/support/request/checkout_helper.rb; reduces number of RuboCop offenses from 109 to 108 2020-10-13 12:05:50 -05:00
Jason Hsu
c6d6b6f65a Removed empty trailing line in spec/support/request/stripe_helper.rb; reduces RuboCop offenses from 110 to 109 2020-10-13 12:01:11 -05:00
dependabot-preview[bot]
7c3da77ad6 Bump webmock from 3.9.1 to 3.9.2
Bumps [webmock](https://github.com/bblimke/webmock) from 3.9.1 to 3.9.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.9.1...v3.9.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-13 09:07:36 +00:00
Pau Pérez Fabregat
f1e2040ce3 Merge pull request #6061 from arku/fix/sleep-removal
Remove sleep calls from select2 helper
2020-10-13 09:42:25 +02:00
Pau Pérez Fabregat
536f54d6a7 Merge pull request #6092 from jhsu802701/docker_scripts
Added Docker scripts in the new Docker directory
2020-10-13 09:36:12 +02:00
Matt-Yorkley
32999e6be4 Add polish translations with momentjs 2020-10-12 23:05:43 +01:00
Jason Hsu
03b33e99cf Merge branch 'master' into docker_scripts 2020-10-12 11:36:49 -05:00
Luis Ramos
9545c57969 Merge pull request #6049 from luisramos0/momentjs
Use yarn and move Momentjs from gemfile to yarn
2020-10-12 15:28:23 +01:00
Luis Ramos
9288250194 Merge pull request #5981 from luisramos0/spree_ability
[Bye bye spree] Bring classes related to abilities to OFN
2020-10-12 15:26:30 +01:00
Rajan Joshi
8b64fbe80e Reduce coverage threshold to 54 inorder to pass CI. 2020-10-11 19:18:24 +01:00
Rajan Joshi
fbadf25043 Add coverage threshold for simplecov. 2020-10-11 17:18:50 +01:00
Jason Hsu
c53d4cf8ea Corrected typos in docker/seed 2020-10-08 23:24:54 -05:00
Jason Hsu
e5d97e37f1 Moved docker network prune -f command from docker/nukec to docker/nuke 2020-10-08 14:46:12 -05:00
Jason Hsu
71ad109f78 Changed docker/exec to docker/run; updated docker/README.md to reflect this 2020-10-08 14:43:30 -05:00
Jason Hsu
d9476ec87d Corrected the docker-compose commands in docker/cop, docker/seed, and docker/test-log 2020-10-08 14:38:49 -05:00
Jason Hsu
74980401b5 Synced to master; moved section about troubleshooting Docker in Windows to docker/README.md 2020-10-08 14:06:54 -05:00
Arun Kumar Mohan
1c4ef87654 Fix product import date filter spec
The spec was failing because the date in the spec had a couple of
spaces after the month name (October  9, 2020) but in the filter,
the two spaces were converted to a single space (October 9, 2020)
and the select2 helper wasn't able to select the option.
2020-10-08 13:29:23 -05:00
Luis Ramos
559af5076d Make the release notes intructions a bit more clear so new contributors make them short 2020-10-08 10:37:39 +01:00
Luis Ramos
6806035a45 Update all locales with the latest Transifex translations 2020-10-08 10:15:26 +01:00
Luis Ramos
b1dbf4fe0e Merge pull request #6147 from openfoodfoundation/transifex
Transifex
2020-10-08 10:13:00 +01:00
Luis Ramos
0829eaf0fb Merge pull request #6148 from openfoodfoundation/luisramos0-patch-1
Add break line troubleshooting to docker guide
2020-10-08 09:24:27 +01:00
Luis Ramos
da2e3c7cd1 Merge pull request #6144 from arku/fix/adjustment-metadata-spec
Fix adjustment metadata spec
2020-10-08 08:59:52 +01:00
Luis Ramos
d5f793f451 Add break line troubleshooting to docker guide 2020-10-08 08:40:14 +01:00
Transifex-Openfoodnetwork
8269665a7c Updating translations for config/locales/en_NZ.yml 2020-10-08 16:53:14 +11:00
Arun Kumar Mohan
4b7d4ad960 Refactor select2 specs 2020-10-07 21:56:43 -05:00
Arun Kumar Mohan
ead1419583 Remove sleep calls from select2 helper 2020-10-07 21:56:43 -05:00
Luis Ramos
1e7a3d7f46 Merge pull request #6123 from openfoodfoundation/mkllnk-patch-1
Create an initial Code of Conduct placeholder file
2020-10-07 23:36:59 +01:00
dependabot-preview[bot]
4ecfeaee4c Bump geocoder from 1.6.3 to 1.6.4
Bumps [geocoder](https://github.com/alexreisner/geocoder) from 1.6.3 to 1.6.4.
- [Release notes](https://github.com/alexreisner/geocoder/releases)
- [Changelog](https://github.com/alexreisner/geocoder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/alexreisner/geocoder/compare/v1.6.3...v1.6.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-07 22:03:07 +00:00
Luis Ramos
6c95444339 Merge pull request #6020 from andresgutgon/fix/admin-menu-in-multiple-lines
Fixed admin header buttons dropping multiple lines.
2020-10-07 21:24:48 +01:00
Luis Ramos
48ea804615 Merge pull request #6121 from cillian/fix-shop-variant-search
When searching for shop products check the variant :display_name and :display_as fields too
2020-10-07 21:22:46 +01:00
Luis Ramos
8626e7b433 Merge pull request #6094 from andrewpbrett/fix-inventory-import
Fix #6090 (Inventory import fails for products with units other than "g")
2020-10-07 21:21:40 +01:00
Luis Ramos
88b17372af Merge pull request #6131 from Snick555/issue-6118
Show product description in creation form after errors appeared
2020-10-07 21:21:13 +01:00
Luis Ramos
961e559a31 Merge pull request #6083 from luisramos0/shop_tabs_style
Make shop tabs black and capitalized in smaller screens
2020-10-07 14:39:23 +01:00
Pau Pérez Fabregat
85cee9e8cb Merge pull request #6091 from luisramos0/vat_rates_cache
Delete dead code brought from spree
2020-10-07 11:58:26 +02:00
Pau Pérez Fabregat
1e6fa1666c Merge pull request #6113 from openfoodfoundation/dependabot/bundler/knapsack-1.19.0
Bump knapsack from 1.18.0 to 1.19.0
2020-10-07 11:57:12 +02:00
Pau Pérez Fabregat
ce856750aa Merge pull request #6116 from openfoodfoundation/dependabot/bundler/ddtrace-0.41.0
Bump ddtrace from 0.40.0 to 0.41.0
2020-10-07 11:56:45 +02:00
Pau Pérez Fabregat
07e625ec32 Merge pull request #6104 from openfoodfoundation/dependabot/bundler/haml-5.2.0
Bump haml from 5.1.2 to 5.2.0
2020-10-07 11:56:12 +02:00
Arun Kumar Mohan
a20762a1f2 Fix adjustment metadata spec 2020-10-06 19:02:59 -05:00
Andy Brett
0edd341d46 add unit test for inventory import entry_validation 2020-10-06 10:17:30 -07:00
Luis Ramos
c31380cd1d Merge pull request #6132 from Matt-Yorkley/stripe-multiple-payments-spec
Stripe Tests: multiple attempted payments
2020-10-06 17:17:25 +01:00
Jason Hsu
3985e0e4bc Merge branch 'master' into docker_scripts 2020-10-06 10:53:33 -05:00
Matt-Yorkley
a04c2ccd6e Make producers and groups pages usable on mobile 2020-10-06 14:18:41 +01:00
Matt-Yorkley
469e4a4c87 Make shops index page usable on mobile 2020-10-06 14:18:39 +01:00
Luis Ramos
a4c8380d7e Remove removal of transition to confirm as confirm does not exist anymore 2020-10-06 13:00:43 +01:00
Matt-Yorkley
0c109d6384 Merge pull request #6103 from openfoodfoundation/dependabot/bundler/dalli-2.7.11
Bump dalli from 2.7.10 to 2.7.11
2020-10-06 11:15:37 +02:00
Pau Pérez Fabregat
427d1aaeff Merge pull request #6079 from arku/perf/test-prof-setup
Set up test_prof gem
2020-10-06 10:30:43 +02:00
Matt-Yorkley
3b130327a5 DRY error_message variable used multiple times 2020-10-05 00:51:01 +01:00
Matt-Yorkley
ced5329835 Add Stripe spec for multiple attempted payments at checkout 2020-10-05 00:50:59 +01:00
dependabot-preview[bot]
ee6f0f7951 Bump ddtrace from 0.40.0 to 0.41.0
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.40.0 to 0.41.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.40.0...v0.41.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-04 19:18:47 +00:00
dependabot-preview[bot]
6149a79038 Bump knapsack from 1.18.0 to 1.19.0
Bumps [knapsack](https://github.com/ArturT/knapsack) from 1.18.0 to 1.19.0.
- [Release notes](https://github.com/ArturT/knapsack/releases)
- [Changelog](https://github.com/ArturT/knapsack/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ArturT/knapsack/compare/v1.18.0...v1.19.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-04 19:15:57 +00:00
ivoloshy
7321e4ef89 show product description in creation form after errors appeared 2020-10-04 20:44:57 +03:00
Matt-Yorkley
76def3a74f Merge pull request #6124 from luisramos0/stripe_specs
Add more checkout feature specs covering stripe SCA cases
2020-10-03 18:24:06 +02:00
Luis Ramos
a5309627b7 Fix a typo 2020-10-03 15:46:29 +01:00
Luis Ramos
80ea80f26e DRY stripe spec 2020-10-03 11:50:04 +01:00
Luis Ramos
14f5ecfe0b Add spec to cover StripeSCA extra auth with redirect and failed auth 2020-10-03 11:39:56 +01:00
Luis Ramos
df4ec67974 Add feature spec that covers stripe_sca redirect case 2020-10-03 11:09:24 +01:00
Maikel
4b1e1afa69 Create an initial Code of Conduct placeholder file 2020-10-03 08:48:15 +10:00
Luis Ramos
ef70c1fc5c Make helper more flexible and use it in a spec 2020-10-02 19:20:32 +01:00
Luis Ramos
83456f94e3 Simplify test by re-using helper stripe mock 2020-10-02 19:12:56 +01:00
Luis Ramos
ff9f374950 Merge pull request #6050 from Matt-Yorkley/stripe-checkout-spec
Stripe checkout spec
2020-10-02 18:57:22 +01:00
Cillian O'Ruanaidh
6c22ee43a7 When searching for shop products check the variant :display_name and :display_as fields too.
Fixes #5757
2020-10-02 16:05:48 +01:00
Luis Ramos
6a2e49b9e7 Update all locales with the latest Transifex translations 2020-10-02 12:54:45 +01:00
Luis Ramos
ab0ecfb203 Merge pull request #6106 from openfoodfoundation/transifex
Transifex
2020-10-02 12:46:56 +01:00
Luis Ramos
db2e760c4c Merge pull request #6120 from luisramos0/restart_checkout
Comment 2 broken specs until we manage to fix them
2020-10-02 12:39:04 +01:00
Luis Ramos
da82df39c2 Comment 2 broken specs until we manage to fix them 2020-10-02 11:59:38 +01:00
Luis Ramos
98fb60a5e0 Merge pull request #6110 from filipefurtad0/content_spec.rb
content_spec.rb improvement
2020-10-01 23:22:04 +01:00
Andy Brett
854916907e add feature spec for inventory import in kg 2020-10-01 13:27:57 -07:00
Matt-Yorkley
1cc950a4d9 DRY StripeHelper methods 2020-10-01 15:54:16 +01:00
Steve Roberts
8679e438e8 Add matomo tag to admin pages 2020-10-01 21:37:05 +10:00
Arun Kumar Mohan
4858f5fb80 Improve order specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
350a3c0e1e Improve order checkout specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
b850f10d2e Improve classification specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
362ab8a605 Improve variant override specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
f5985de802 Improve order cycle specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
6c27ac5f99 Improve filter shipping methods tag rule specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
bb38523767 Improve filter products tag rule specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
e109ed6be7 Improve filter payment methods tag rule specs' performance 2020-10-01 01:43:08 -05:00
Arun Kumar Mohan
780f31f98e Improve filter order cycles tag rule specs' performance 2020-10-01 01:43:05 -05:00
François Turbelin
eda904337b Merge pull request #5810 from pacodelaluna/improve-dfc-standard-integration
Improve DFC Provider engine to support version 1.3
2020-09-30 11:13:03 +02:00
filipefurtad0
a85e500bb1 moves content_spec.rb into /configuration and adds an href string, incresing Redcarpet test coverage 2020-09-29 22:39:05 +01:00
Transifex-Openfoodnetwork
8480e16cac Updating translations for config/locales/tr.yml 2020-09-29 22:33:21 +10:00
Transifex-Openfoodnetwork
2eeba0483c Updating translations for config/locales/tr.yml 2020-09-29 22:30:18 +10:00
Transifex-Openfoodnetwork
e2ae566e88 Updating translations for config/locales/pl.yml 2020-09-29 22:08:01 +10:00
Transifex-Openfoodnetwork
01c6d5bc9c Updating translations for config/locales/ru.yml 2020-09-29 20:47:26 +10:00
Transifex-Openfoodnetwork
856ad24c6f Updating translations for config/locales/ru.yml 2020-09-29 20:44:21 +10:00
dependabot-preview[bot]
678e7acde0 Bump haml from 5.1.2 to 5.2.0
Bumps [haml](https://github.com/haml/haml) from 5.1.2 to 5.2.0.
- [Release notes](https://github.com/haml/haml/releases)
- [Changelog](https://github.com/haml/haml/blob/main/CHANGELOG.md)
- [Commits](https://github.com/haml/haml/compare/v5.1.2...v5.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-29 09:32:15 +00:00
dependabot-preview[bot]
4914a0d3a8 Bump dalli from 2.7.10 to 2.7.11
Bumps [dalli](https://github.com/petergoldstein/dalli) from 2.7.10 to 2.7.11.
- [Release notes](https://github.com/petergoldstein/dalli/releases)
- [Changelog](https://github.com/petergoldstein/dalli/blob/master/History.md)
- [Commits](https://github.com/petergoldstein/dalli/compare/v2.7.10...v2.7.11)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-29 09:29:14 +00:00
Pau Pérez Fabregat
e79187c1df Merge pull request #6097 from openfoodfoundation/transifex
Transifex
2020-09-29 09:22:59 +02:00
Matt-Yorkley
c518e7e0dd Extract Stripe credit card form filling 2020-09-28 19:59:26 +01:00
Matt-Yorkley
2babfa9a7b Add rejected card test 2020-09-28 19:55:52 +01:00
Transifex-Openfoodnetwork
c7d6b2782c Updating translations for config/locales/nb.yml 2020-09-28 22:29:05 +10:00
Transifex-Openfoodnetwork
3d71c2c0b8 Updating translations for config/locales/en_GB.yml 2020-09-28 21:31:02 +10:00
Pau Pérez Fabregat
807f91b0b8 Merge pull request #6093 from openfoodfoundation/RachL-patch-1
Hacktoberfest
2020-09-28 12:04:55 +02:00
Jason Hsu
881ace6a85 Merge branch 'master' into docker_scripts 2020-09-27 13:39:40 -05:00
Arun Kumar Mohan
6a722f2bbd Set up test-prof gem 2020-09-26 15:22:43 -05:00
Luis Ramos
d5ab3b47eb Merge pull request #6065 from arku/perf/address-specs
Replace `create` with `build_stubbed` in address model specs
2020-09-26 21:19:28 +01:00
Luis Ramos
0100963a39 Delete dead code brought from spree 2020-09-26 21:16:27 +01:00
Arun Kumar Mohan
06a3e55348 Replace create with build_stubbed in address model specs 2020-09-25 22:54:58 -05:00
Jason Hsu
ea9d5f7c5a Removed testc and testm; made the requested changes to the order of the scripts in the summary section 2020-09-25 20:35:24 -05:00
Luis Ramos
bbef0bac5f Make font size 1em for larger screens 2020-09-25 21:28:22 +01:00
Rachel Arnould
dbe6c316f8 Change typo
"participating in" instead of "participating to"
2020-09-25 19:07:33 +02:00
Rachel Arnould
21eef7187b Hacktoberfest
A proposal for the banner on Hacktoberfest.
2020-09-25 18:13:00 +02:00
Andy Brett
4f942db0ba convert entry's unscaled_units to a float
This was coming in as a string, e.g. "1", so when we did "1" * 1000 it returned "11111111111111....." :)
2020-09-25 09:12:19 -07:00
Jason Hsu
2b5a875bac Added script summary to docker/README.md 2020-09-25 11:00:54 -05:00
Jason Hsu
d2523abe34 Moved contents of DOCKER.md to docker/README.md; removed DOCKER.md; updated link to Docker page in GETTING_STARTED.md 2020-09-25 00:49:44 -05:00
Jason Hsu
97a38865a2 Added docker/testm 2020-09-25 00:30:20 -05:00
Jason Hsu
a46683ef01 Added docker/testc 2020-09-25 00:24:24 -05:00
Jason Hsu
2a902f29bb Added comments to scripts 2020-09-25 00:12:27 -05:00
Jason Hsu
dff6e5ce38 Merge branch 'master' into docker_scripts 2020-09-24 23:43:28 -05:00
Jason Hsu
423a766463 Added docker/exec 2020-09-24 23:42:00 -05:00
Luis Ramos
9b5bd7bb1c Merge pull request #6066 from arku/perf/variant-override-specs
Replace `create` with `build_stubbed` in variant override model specs
2020-09-24 18:47:08 +01:00
Luis Ramos
c377e316d5 Merge pull request #6068 from arku/perf/coordinator-specs
Replace `create` with `build_stubbed` in coordinator model specs
2020-09-24 18:46:45 +01:00
Luis Ramos
aa74b58810 Merge pull request #6067 from arku/perf/tag-rule-specs
Remove unnecessary create call in tag rule model specs
2020-09-24 18:45:18 +01:00
Luis Ramos
8919adb6bf Merge pull request #6074 from arku/perf/shipping-rate-specs
Replace `create` with `build_stubbed` in shipping rate model specs
2020-09-24 18:42:30 +01:00
Luis Ramos
e04b85e900 Merge pull request #6078 from arku/perf/per-item-flexi-rate-specs
Replace `build` with `build_stubbed` in flexi rate and per item model specs
2020-09-24 18:41:29 +01:00
Luis Ramos
b8fae8e3a3 Merge pull request #6077 from arku/perf/calculator-price-sack-specs
Replace `build` with `build_stubbed` in price sack model specs
2020-09-24 18:41:19 +01:00
Luis Ramos
01fdee9dba Merge pull request #6076 from arku/perf/calculator-flat-percent-item-total-specs
Replace `build` with `build_stubbed` in flat percent item total specs
2020-09-24 18:40:55 +01:00
Luis Ramos
dfd54c1cbc Merge pull request #6075 from arku/perf/calculator-weight-specs
Replace `create` with `build_stubbed` in calculator weight model specs
2020-09-24 18:40:31 +01:00
Andy Brett
84eb8e964d add specs for weight calculators using lbs 2020-09-24 07:03:57 -07:00
Luis Ramos
74161267fd Prepare seed data for bye bye spree 2020-09-24 12:54:43 +01:00
Jason Hsu
5ced17a94e Added docker/test and docker/test-log 2020-09-23 23:36:13 -05:00
Jason Hsu
c6fbc1e136 Added docker/cop 2020-09-23 23:27:51 -05:00
Jason Hsu
792127745a Added docker/server scripts 2020-09-23 23:22:38 -05:00
Jason Hsu
8125a860ea Merge branch 'master' into docker_scripts 2020-09-23 23:09:26 -05:00
Luis Ramos
1b4e19b32d Remore preferences not used in OFN 2020-09-23 22:16:56 +01:00
Luis Ramos
3074d3a17a Customize some defaults to OFN 2020-09-23 22:13:36 +01:00
Luis Ramos
5bf91cb140 Remove unused spree code 2020-09-23 22:13:36 +01:00
Luis Ramos
ce2f0a5b9e Transpec specs 2020-09-23 22:13:36 +01:00
Luis Ramos
d6862cdbce Revert rubocop autocorrect change, it breaks some of the tests 2020-09-23 22:13:36 +01:00
Luis Ramos
b9319239d5 Remove configurations that are no longer used as we have moved the code to OFN and fix specs 2020-09-23 22:13:36 +01:00
Luis Ramos
9ebb689370 Fix easy rubocop issues 2020-09-23 22:13:36 +01:00
Luis Ramos
024a64b73a Fix single rubocop rule: Use nested module definitions instead of compact style 2020-09-23 22:13:36 +01:00
Luis Ramos
25e61897aa Run rubocop autocorrect 2020-09-23 22:13:36 +01:00
Luis Ramos
ed81ceaffe Merge decorator with original file 2020-09-23 22:13:36 +01:00
Luis Ramos
8b42543ca3 Bring configuration and preferences code from spree_core 2020-09-23 22:13:36 +01:00
Jason Hsu
6a6f9be18e Added build and seeding scripts 2020-09-23 13:55:58 -05:00
Jason Hsu
06d54a3f4d Added docker directory and scripts for resetting Docker 2020-09-23 12:46:08 -05:00
Luis Ramos
fb9bcdee7c Load spree js on OFN side, not the one on Spree's side 2020-09-23 12:45:30 +01:00
Luis Ramos
3af5482960 Make date picker work with karma tests where the old Spree.translations js translations object is not defined 2020-09-23 12:45:30 +01:00
Luis Ramos
bfd4164c0b Remove handlebar extensions and some dead translations
This is not needed, these translations are always used through Spree.translations and this system is deprecated anyway
2020-09-23 12:45:30 +01:00
Luis Ramos
d5d2ae3ce0 Remove some dead code and broken links from comments 2020-09-23 12:45:29 +01:00
Luis Ramos
496f9c106e Bring the very last bits of js and css from spree_core 2020-09-23 12:45:29 +01:00
Luis Ramos
2234ea6f5a Make shop tabs black and capitalized 2020-09-22 16:59:42 +01:00
Arun Kumar Mohan
bc77b8bcb2 Replace build with build_stubbed in per item model specs 2020-09-21 21:24:38 -05:00
Arun Kumar Mohan
38ab95a9a4 Replace build with build_stubbed in flexi rate model specs 2020-09-21 21:22:59 -05:00
Arun Kumar Mohan
698d8b35fa Replace build with build_stubbed in price sack model specs 2020-09-21 21:18:36 -05:00
Arun Kumar Mohan
a257a9e9d2 Replace build with build_stubbed in calculator weight model specs 2020-09-21 21:12:30 -05:00
Arun Kumar Mohan
231fbcd11a Replace build with build_stubbed in flat percent item total specs 2020-09-21 21:04:16 -05:00
Arun Kumar Mohan
c098ba0ce3 Replace create with build_stubbed in calculator weight model specs 2020-09-21 20:46:50 -05:00
Arun Kumar Mohan
f7a9cc63a7 Replace create with build_stubbed in shipping rate model specs 2020-09-21 20:37:35 -05:00
Andy Brett
9ef706a201 update styles on enterprise fee UI 2020-09-21 15:21:18 -07:00
Arun Kumar Mohan
317618595c Replace create with build_stubbed in coordinator model specs 2020-09-21 01:47:19 -05:00
Arun Kumar Mohan
289fd09e20 Remove unnecessary create call in tag rule model specs 2020-09-21 01:09:14 -05:00
Arun Kumar Mohan
239b6e7577 Replace create with build_stubbed in variant override model specs 2020-09-21 00:45:35 -05:00
Matt-Yorkley
5bca561c4a Refactor Stripe request stubbing to helper 2020-09-20 17:06:03 +01:00
Matt-Yorkley
6737270ab7 Rename partial 2020-09-19 15:49:14 +01:00
Matt-Yorkley
70bd2161ba Rename Stripe Connect factory for clarity 2020-09-19 12:55:31 +01:00
Matt-Yorkley
1d01fc955d Include StripeJS fixture and refactor to partial 2020-09-19 12:20:55 +01:00
Matt-Yorkley
4080e7daa4 Add comments in StripeJS mock 2020-09-19 12:20:55 +01:00
Matt-Yorkley
cca8f9faf6 Add missing behaviour in StripeJS mock 2020-09-19 12:20:55 +01:00
andresgutgon
ef85ac3e27 Fixed admin header buttons dropping multiple lines. 2020-09-19 11:37:09 +02:00
Matt-Yorkley
368772dad2 Add another missing method to StripeJS mock
Our Angular code calls this method in some tests and expects a Promise object with a hash describing a payment method.
2020-09-19 00:39:39 +01:00
Matt-Yorkley
857f4e3a37 Add missing method to StripeJS mock
Our Angular code calls this method for interacting with live form validations and messages. We don't really need to use in tests, it just needs to exist otherwise the specs fail.
2020-09-19 00:39:39 +01:00
Matt-Yorkley
67d136548f Update form elements to more accurately reflect actual Stripe form
These attributes more closely reflect the actual form injected by Stripe. The additional attributes are also useful for selecting elements in tests
2020-09-19 00:39:39 +01:00
Matt-Yorkley
4c77c41533 Remove unused postal field from form 2020-09-19 00:39:39 +01:00
Matt-Yorkley
49bd9bd778 Import StripeJS mock from fake_stripe gem
This is the original from https://github.com/thoughtbot/fake_stripe/blob/v0.3.0/lib/fake_stripe/assets/v3.js
2020-09-19 00:39:39 +01:00
Matt-Yorkley
0ba3977422 Add new Stripe checkout spec 2020-09-19 00:39:32 +01:00
Andy Brett
edefe1d4bc use correct cache key for old preference 2020-09-18 14:35:51 -07:00
Matt-Yorkley
4ed34bb942 Add javascript debug option to test suite 2020-09-18 21:20:47 +01:00
Andy Brett
b9ee945062 fix nomethod error by interpolating integer inside string 2020-09-18 10:10:27 -07:00
Andy Brett
dc7b9ed8fa use sql query to update weight calculator prefs 2020-09-18 09:55:29 -07:00
Luis Ramos
fe7d7b54d1 Make version number 1.0.0 as we dont want to mantain the app version here and update AGPL to v3 2020-09-18 16:20:09 +01:00
Luis Ramos
2fae7e0df3 Use moment js min and locale files from node_modules
In this commit fil and nl-be are also added

We could use moment/min/locales.min.js but that would add all locales available in moment which would be a move in size from current 30k in moment locales to 300k
2020-09-18 16:18:24 +01:00
Luis Ramos
d4c4bcaa50 Make node_modules available for code in app/assets 2020-09-18 15:53:34 +01:00
Luis Ramos
5b3f700fb4 Move momentjs from a Gemfile dependeny to a package.jons dependency and upgrade it from 2.20.1 to 2.28.0 2020-09-18 15:29:38 +01:00
Luis Ramos
a872667912 Add yarn.lock after yarn was added in ofn-install and installed in all servers, every ofn deploy will run yarn install now 2020-09-18 15:28:43 +01:00
Andy Brett
843f43eb78 delete cached per_kg preference for all weight calculators 2020-09-17 17:30:43 -07:00
Andy Brett
96fb65600e refactor views to oneliners without single letter variable names 2020-09-17 16:45:55 -07:00
Andy Brett
fdb1019ee2 fix styles per rubocop 2020-09-17 16:41:49 -07:00
Andy Brett
bd25e8b40d Revert "schema update"
This reverts commit 73149dc695.
2020-09-17 08:46:03 -07:00
Andy Brett
66099239aa add translation for calculator preferred unit error 2020-09-17 08:42:08 -07:00
Andy Brett
988abf7a8c update preference field interface to be more clear 2020-09-17 08:27:45 -07:00
Andy Brett
73149dc695 schema update 2020-09-17 07:36:38 -07:00
Andy Brett
977e4e46f3 remove explicit raise from convert_weight 2020-09-17 07:36:28 -07:00
Andy Brett
6466829bdc fix typo in weight calculator migration 2020-09-17 07:17:25 -07:00
Luis Ramos
455111093d Fix easy rubocop issues 2020-09-17 14:18:51 +01:00
Luis Ramos
ecdba1fa4e For some reason the factory create(:admin_user) is not working here, this new version works 2020-09-17 14:18:51 +01:00
Luis Ramos
8234ad0906 Ensure test order cycle coordinator is really an enterprise not managed by the user instead of relying on the factory logic 2020-09-17 14:18:51 +01:00
Luis Ramos
60ef32300b No need to test code with different ability setup, this was a good spec for spree, in ofn we use and test the static auth config in Ability 2020-09-17 14:18:51 +01:00
Luis Ramos
405b317726 Merge ability and ability decorator 2020-09-17 14:18:45 +01:00
Luis Ramos
22eac6200c Add needed fake ability 2020-09-17 14:10:37 +01:00
Luis Ramos
32649cb25a Transpec ability_spec 2020-09-17 14:10:37 +01:00
Luis Ramos
895ab62ba9 Bring ability helpers from spree_core and fix ability_spec 2020-09-17 14:10:37 +01:00
Luis Ramos
37c7d254e1 Fix rubocop issues 2020-09-17 14:10:37 +01:00
Luis Ramos
051ee0fd14 Run rubocop -a 2020-09-17 14:10:37 +01:00
Luis Ramos
c00c03737e Bring user and ability related files from spree_core 2020-09-17 14:10:37 +01:00
Luis Ramos
a16dc4d720 Move ability decorator specs to specific file 2020-09-17 14:10:36 +01:00
Luis Ramos
4b597ada12 Fix easy rubocop issues 2020-09-17 14:06:51 +01:00
Luis Ramos
fe7cf0cf44 Remove reference to FactoryGirl 2020-09-17 14:06:51 +01:00
Luis Ramos
f81d4596aa Use correct updater 2020-09-17 14:06:51 +01:00
Luis Ramos
e0d731b92b Remove unused email validator 2020-09-17 14:06:51 +01:00
Luis Ramos
a5ff4d6853 Remove unneeded setup code and remove unnecessary reference to FactoryGirl 2020-09-17 14:06:51 +01:00
Luis Ramos
03419bbc35 Remove all and use find_each instead! 2020-09-17 14:06:51 +01:00
Luis Ramos
c49dbec85a Adapt order_spec to new updater code 2020-09-17 14:06:51 +01:00
Luis Ramos
7884dbfeb1 Revert rubocop autocorrect, each is needed here for find_each is not available for Arrays 2020-09-17 14:06:51 +01:00
Luis Ramos
4215dcb927 Run transpec on the new specs from spree_core 2020-09-17 14:06:50 +01:00
Luis Ramos
31f9cd3caf Fix spec/models/spree/order specs 2020-09-17 14:06:50 +01:00
Luis Ramos
8643cbd8ce Delete unused order.merge! and fix specs 2020-09-17 14:06:50 +01:00
Luis Ramos
2753e86325 Run rubocop autocorrect 2020-09-17 14:06:50 +01:00
Luis Ramos
2cd066237d Fix easy rubocop issues 2020-09-17 14:06:50 +01:00
Luis Ramos
94ad02abbe Run rubocop autocorrect 2020-09-17 14:06:50 +01:00
Luis Ramos
3c5a35df27 Remove original email validator and keep only previous OFN validator 2020-09-17 14:06:50 +01:00
Luis Ramos
82a116a92f We always define Spree.user_class 2020-09-17 14:06:50 +01:00
Luis Ramos
cc87e8c9a2 Remove code related to promotions 2020-09-17 14:06:50 +01:00
Luis Ramos
2a6d83b4dd Remove confirm checkout step and it's additional removal 2020-09-17 14:06:50 +01:00
Luis Ramos
6900f7a46f Merge decorators with original files from spree_core
EPIC COMMIT ALERT :-)
2020-09-17 14:06:50 +01:00
Luis Ramos
47d2f698ef Bring models related to Order from spree_core
EPIC COMMIT ALERT :-)
2020-09-17 14:05:29 +01:00
Luis Ramos
1a513567f2 Fix easy rubocop issues 2020-09-17 13:59:41 +01:00
Luis Ramos
1df7890a0d Use spree url_helpers 2020-09-17 13:59:41 +01:00
Luis Ramos
a2435d29af Add missing translation 2020-09-17 13:59:41 +01:00
Luis Ramos
d5d62894a5 Use spree url helpers 2020-09-17 13:59:41 +01:00
Luis Ramos
da19fa5f80 Add missing translations 2020-09-17 13:59:41 +01:00
Luis Ramos
a34c18451c Add spree helper 2020-09-17 13:59:41 +01:00
Luis Ramos
27fa04114e Add require for gateway error 2020-09-17 13:59:41 +01:00
Luis Ramos
ec8dfd668d Use ofn's calculator in all tests and add missing translation 2020-09-17 13:59:41 +01:00
Luis Ramos
bec6e8e604 Add missing translation 2020-09-17 13:59:41 +01:00
Luis Ramos
66f27aad32 Explicitly use spree url helpers for spree routes 2020-09-17 13:59:41 +01:00
Luis Ramos
739917ca46 Add require for spree responder 2020-09-17 13:58:45 +01:00
Luis Ramos
e0cb7a29bf Add helper prefix to helper calls 2020-09-17 13:58:45 +01:00
Luis Ramos
b6a374ab66 Remove spree require that is not needed in OFN 2020-09-17 13:58:10 +01:00
Luis Ramos
37f3861233 Remove require of a file no longer needed 2020-09-17 13:58:10 +01:00
Luis Ramos
a5dd1526f7 Delete dead code ProductFilters 2020-09-17 13:58:10 +01:00
Luis Ramos
8707f51214 Remove unused helper 2020-09-17 13:58:10 +01:00
Luis Ramos
b84212023b Require code from spree/core explicitly 2020-09-17 13:58:10 +01:00
Luis Ramos
01daf63fc6 Fix some problems with code that was relying on spree code 2020-09-17 13:57:05 +01:00
Andy Brett
246934d8ba update preference name in factor and specs 2020-09-12 14:49:42 -07:00
Andy Brett
37cfe65688 migrate existing weight calculators 2020-09-12 12:32:06 -07:00
Andy Brett
4123eb7c10 update specs; add specs to validate weight calculator preference is kg or lb 2020-09-12 11:53:45 -07:00
Andy Brett
d32ed6b48f improve styling on calculators UI 2020-09-12 10:43:14 -07:00
Andy Brett
c618ba3b2c style fixes 2020-09-07 13:44:42 -07:00
Andy Brett
5a5cbbd318 add drop down list for unit preference 2020-09-07 13:26:09 -07:00
Andy Brett
adb29a9c8f add preferred_unit to weight shipping calculator 2020-09-07 08:41:48 -07:00
Andy Brett
5793f0103d Revert "Add a per-pound calculator and a spec for it"
This reverts commit e8eadcbf39.
2020-09-07 07:50:59 -07:00
Andy Brett
e8eadcbf39 Add a per-pound calculator and a spec for it 2020-09-06 09:03:06 -07:00
François Turbelin
52d82d0a96 Use not found instead of 404 for spec descriptions 2020-09-03 00:59:21 +02:00
François Turbelin
d11d67561f Remove extra delegation in serializers 2020-09-03 00:58:54 +02:00
François Turbelin
d2c147109d Use Persons instead of People 2020-09-03 00:56:42 +02:00
François Turbelin
b60c1c9003 Dry current_enterprise emtod with enterprise_id_param_name 2020-09-03 00:50:23 +02:00
François Turbelin
59fb2abc5d Fix inheritance issue with specs on Semaphore 2020-09-02 23:08:47 +02:00
François Turbelin
6508897e3d Introduce current_enterprise with memoization 2020-09-02 22:28:12 +02:00
François Turbelin
1baba5b61c Introduce current_user with memoization 2020-09-02 22:18:56 +02:00
François Turbelin
4f2b7094d0 Use before_action instead of before_filter 2020-09-02 21:48:13 +02:00
François Turbelin
d5800642e7 Map DFC SuppliedProduct with OFN Variant 2020-08-30 23:11:59 +02:00
François Turbelin
c3cf08156d Add People controller 2020-08-13 11:49:45 +02:00
François Turbelin
8d4587506b Add SuppliedProducts controller 2020-08-13 11:46:48 +02:00
François Turbelin
99e905c768 Simplify enterprise check logic 2020-08-13 11:02:31 +02:00
François Turbelin
46d38930d9 Add some ajustements 2020-08-12 20:53:02 +02:00
François Turbelin
a4e8982351 Rename ProductsController into CatalogItemsController 2020-08-12 19:51:12 +02:00
François Turbelin
13e15f823e Add Read action for Enterprise and CatalogItem 2020-08-12 19:43:20 +02:00
François Turbelin
508ecd6bf7 Adjust with Rubocop suggestions 2020-08-12 13:46:23 +02:00
François Turbelin
d10fda6227 Put context inside serializer 2020-08-12 13:37:48 +02:00
François Turbelin
2a8268ca73 Use ActiveModelSerializer for DFC serialization 2020-08-12 13:37:01 +02:00
François Turbelin
8687e0199d Apply cosmetics 2020-08-05 08:20:14 +02:00
François Turbelin
2549d454ab Maintain specs 2020-07-23 09:28:32 +02:00
François Turbelin
645b4a9505 Use multiple serializers 2020-07-22 22:45:50 +02:00
François Turbelin
9f02ee3874 Use new serialization 2020-07-22 21:08:25 +02:00
François Turbelin
21fc14a9fe Use a better products list for catalog 2020-07-22 21:08:25 +02:00
317 changed files with 19136 additions and 5728 deletions

View File

@@ -20,6 +20,9 @@ plugins:
enabled: false
DeclarationOrder:
enabled: false
NestingDepth:
enabled: false
duplication:
enabled: true
exclude_patterns:

View File

@@ -13,21 +13,11 @@ Provide context for others to understand it. -->
#### Release notes
<!-- Write a line or two to be included in the release notes.
Everything is worth mentioning, because you did it for a reason. -->
<!-- Write a one liner description of the change to be included in the release notes.
Every PR is worth mentioning, because you did it for a reason. -->
<!-- Please assign one category to your PR and delete the others.
The categories are based on https://keepachangelog.com/en/1.0.0/. -->
Changelog Category: Added | Changed | Deprecated | Removed | Fixed | Security
#### Discourse thread
<!-- Is there a discussion about this in Discourse?
Add the link or remove this section. -->
<!-- Please select one for your PR and delete the other. -->
Changelog Category: User facing changes | Technical changes

View File

@@ -62,20 +62,13 @@ Layout/LineLength:
- app/models/product_import/unit_converter.rb
- app/models/proxy_order.rb
- app/models/schedule.rb
- app/models/spree/ability_decorator.rb
- app/models/spree/app_configuration_decorator.rb
- app/models/spree/calculator/default_tax_decorator.rb
- app/models/spree/classification_decorator.rb
- app/models/spree/concerns/payment_method_distributors.rb
- app/models/spree/gateway/stripe_connect.rb
- app/models/spree/image.rb
- app/models/spree/line_item_decorator.rb
- app/models/spree/order_decorator.rb
- app/models/spree/payment_decorator.rb
- app/models/spree/payment_method_decorator.rb
- app/models/spree/payment_method.rb
- app/models/spree/product_decorator.rb
- app/models/spree/shipping_method_decorator.rb
- app/models/spree/taxon_decorator.rb
- app/models/spree/tax_rate_decorator.rb
- app/models/spree/user.rb
- app/models/subscription.rb
- app/models/variant_override.rb
@@ -86,6 +79,8 @@ Layout/LineLength:
- app/services/embedded_page_service.rb
- app/services/order_cycle_form.rb
- app/services/order_factory.rb
- app/services/variant_units/variant_and_line_item_naming.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/subscriptions/validator.rb
- engines/web/app/helpers/web/cookies_policy_helper.rb
- engines/web/config/routes.rb
@@ -93,7 +88,6 @@ Layout/LineLength:
- Gemfile
- lib/discourse/single_sign_on.rb
- lib/open_food_network/available_payment_method_filter.rb
- lib/open_food_network/bulk_coop_report.rb
- lib/open_food_network/customers_report.rb
- lib/open_food_network/enterprise_fee_applicator.rb
- lib/open_food_network/enterprise_fee_calculator.rb
@@ -103,10 +97,8 @@ Layout/LineLength:
- lib/open_food_network/order_cycle_form_applicator.rb
- lib/open_food_network/order_cycle_management_report.rb
- lib/open_food_network/payments_report.rb
- lib/open_food_network/reports/bulk_coop_allocation_report.rb
- lib/open_food_network/sales_tax_report.rb
- lib/open_food_network/scope_variants_for_search.rb
- lib/open_food_network/variant_and_line_item_naming.rb
- lib/open_food_network/xero_invoices_report.rb
- lib/spree/localized_number.rb
- lib/spree/product_filters.rb
@@ -134,6 +126,8 @@ Layout/LineLength:
- spec/controllers/api/product_images_controller_spec.rb
- spec/controllers/api/products_controller_spec.rb
- spec/controllers/api/promo_images_controller_spec.rb
- spec/controllers/api/states_controller_spec.rb
- spec/controllers/api/terms_and_conditions_controller_spec.rb
- spec/controllers/api/variants_controller_spec.rb
- spec/controllers/cart_controller_spec.rb
- spec/controllers/checkout_controller_spec.rb
@@ -156,11 +150,15 @@ Layout/LineLength:
- spec/controllers/stripe/callbacks_controller_spec.rb
- spec/controllers/stripe/webhooks_controller_spec.rb
- spec/controllers/user_confirmations_controller_spec.rb
- spec/factories/line_item_factory.rb
- spec/factories/order_factory.rb
- spec/factories.rb
- spec/factories/shipment_factory.rb
- spec/factories/stock_location_factory.rb
- spec/factories/user_factory.rb
- spec/features/admin/adjustments_spec.rb
- spec/features/admin/bulk_order_management_spec.rb
- spec/features/admin/bulk_product_update_spec.rb
- spec/features/admin/configuration/content_spec.rb
- spec/features/admin/customers_spec.rb
- spec/features/admin/enterprise_fees_spec.rb
- spec/features/admin/enterprise_relationships_spec.rb
@@ -169,7 +167,6 @@ Layout/LineLength:
- spec/features/admin/enterprises/index_spec.rb
- spec/features/admin/enterprises_spec.rb
- spec/features/admin/enterprise_user_spec.rb
- spec/features/admin/image_settings_spec.rb
- spec/features/admin/multilingual_spec.rb
- spec/features/admin/order_cycles/complex_creating_specific_time_spec.rb
- spec/features/admin/order_cycles/complex_editing_multiple_product_pages_spec.rb
@@ -193,7 +190,7 @@ Layout/LineLength:
- spec/features/consumer/account/settings_spec.rb
- spec/features/consumer/account_spec.rb
- spec/features/consumer/authentication_spec.rb
- spec/features/consumer/caching/darkwarm_caching_spec.rb
- spec/features/consumer/caching/darkswarm_caching_spec.rb
- spec/features/consumer/caching/shops_caching_spec.rb
- spec/features/consumer/groups_spec.rb
- spec/features/consumer/multilingual_spec.rb
@@ -202,6 +199,7 @@ Layout/LineLength:
- spec/features/consumer/shopping/cart_spec.rb
- spec/features/consumer/shopping/checkout_auth_spec.rb
- spec/features/consumer/shopping/checkout_spec.rb
- spec/features/consumer/shopping/checkout_stripe_spec.rb
- spec/features/consumer/shopping/embedded_groups_spec.rb
- spec/features/consumer/shopping/embedded_shopfronts_spec.rb
- spec/features/consumer/shopping/orders_spec.rb
@@ -220,18 +218,15 @@ Layout/LineLength:
- spec/jobs/subscription_confirm_job_spec.rb
- spec/jobs/subscription_placement_job_spec.rb
- spec/lib/open_food_network/address_finder_spec.rb
- spec/lib/open_food_network/bulk_coop_report_spec.rb
- spec/lib/open_food_network/customers_report_spec.rb
- spec/lib/open_food_network/enterprise_fee_applicator_spec.rb
- spec/lib/open_food_network/enterprise_fee_calculator_spec.rb
- spec/lib/open_food_network/group_buy_report_spec.rb
- spec/lib/open_food_network/lettuce_share_report_spec.rb
- spec/lib/open_food_network/option_value_namer_spec.rb
- spec/lib/open_food_network/order_cycle_form_applicator_spec.rb
- spec/lib/open_food_network/order_cycle_permissions_spec.rb
- spec/lib/open_food_network/order_grouper_spec.rb
- spec/lib/open_food_network/orders_and_fulfillments_report_spec.rb
- spec/lib/open_food_network/packing_report_spec.rb
- spec/lib/open_food_network/permissions_spec.rb
- spec/lib/open_food_network/products_and_inventory_report_spec.rb
- spec/lib/open_food_network/scope_variant_to_hub_spec.rb
@@ -239,11 +234,14 @@ Layout/LineLength:
- spec/lib/open_food_network/user_balance_calculator_spec.rb
- spec/lib/open_food_network/users_and_enterprises_report_spec.rb
- spec/lib/open_food_network/xero_invoices_report_spec.rb
- spec/lib/spree/core/calculated_adjustments_spec.rb
- spec/lib/stripe/account_connector_spec.rb
- spec/lib/stripe/webhook_handler_spec.rb
- spec/mailers/order_mailer_spec.rb
- spec/mailers/producer_mailer_spec.rb
- spec/mailers/subscription_mailer_spec.rb
- spec/models/calculator/flexi_rate_spec.rb
- spec/models/calculator/price_sack_spec.rb
- spec/models/calculator/weight_spec.rb
- spec/models/column_preference_spec.rb
- spec/models/concerns/order_shipment_spec.rb
@@ -261,9 +259,8 @@ Layout/LineLength:
- spec/models/product_import/reset_absent_spec.rb
- spec/models/proxy_order_spec.rb
- spec/models/spree/ability_spec.rb
- spec/models/spree/address_spec.rb
- spec/models/spree/adjustment_spec.rb
- spec/models/spree/calculator/flexi_rate_spec.rb
- spec/models/spree/calculator/price_sack_spec.rb
- spec/models/spree/classification_spec.rb
- spec/models/spree/gateway/stripe_connect_spec.rb
- spec/models/spree/line_item_spec.rb
@@ -273,6 +270,7 @@ Layout/LineLength:
- spec/models/spree/product_set_spec.rb
- spec/models/spree/product_spec.rb
- spec/models/spree/shipping_method_spec.rb
- spec/models/spree/stock_item_spec.rb
- spec/models/spree/taxon_spec.rb
- spec/models/spree/tax_rate_spec.rb
- spec/models/spree/user_spec.rb
@@ -286,8 +284,8 @@ Layout/LineLength:
- spec/models/variant_override_spec.rb
- spec/performance/orders_controller_spec.rb
- spec/performance/shop_controller_spec.rb
- spec/requests/api/orders_spec.rb
- spec/requests/checkout/failed_checkout_spec.rb
- spec/requests/checkout/stripe_sca_spec.rb
- spec/requests/embedded_shopfronts_headers_spec.rb
- spec/serializers/api/admin/customer_serializer_spec.rb
- spec/serializers/api/admin/exchange_serializer_spec.rb
@@ -307,11 +305,11 @@ Layout/LineLength:
- spec/services/order_cycle_form_spec.rb
- spec/services/order_factory_spec.rb
- spec/services/order_syncer_spec.rb
- spec/services/order_tax_adjustments_fetcher_spec.rb
- spec/services/permissions/order_spec.rb
- spec/services/permitted_attributes/order_cycle_spec.rb
- spec/services/products_renderer_spec.rb
- spec/services/product_tag_rules_filterer_spec.rb
- spec/services/variant_units/option_value_namer_spec.rb
- spec/spec_helper.rb
- spec/support/cancan_helper.rb
- spec/support/delayed_job_helper.rb
@@ -321,22 +319,8 @@ Layout/LineLength:
- spec/support/request/shop_workflow.rb
- spec/support/request/web_helper.rb
- spec/support/seeds.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- spec/controllers/base_controller2_spec.rb
- spec/features/consumer/caching/darkswarm_caching_spec.rb
- spec/models/calculator/flexi_rate_spec.rb
- spec/models/calculator/price_sack_spec.rb
- spec/models/spree/stock_item_spec.rb
- spec/requests/api/orders_spec.rb
- spec/swagger_helper.rb
- spec/views/spree/admin/payment_methods/index.html.haml_spec.rb
- app/models/spree/image.rb
- app/models/spree/payment_method.rb
- spec/factories/line_item_factory.rb
- spec/factories/shipment_factory.rb
- spec/factories/stock_location_factory.rb
- spec/factories/user_factory.rb
- spec/lib/spree/core/calculated_adjustments_spec.rb
Metrics/AbcSize:
Max: 15
@@ -356,10 +340,10 @@ Metrics/AbcSize:
- app/controllers/api/shipments_controller.rb
- app/controllers/api/taxons_controller.rb
- app/controllers/api/variants_controller.rb
- app/controllers/application_controller.rb
- app/controllers/cart_controller.rb
- app/controllers/discourse_sso_controller.rb
- app/controllers/enterprises_controller.rb
- app/controllers/spree/admin/image_settings_controller.rb
- app/controllers/spree/admin/orders_controller.rb
- app/controllers/spree/admin/orders/customer_details_controller.rb
- app/controllers/spree/admin/overview_controller.rb
@@ -371,6 +355,7 @@ Metrics/AbcSize:
- app/controllers/spree/admin/search_controller.rb
- app/controllers/spree/admin/taxons_controller.rb
- app/controllers/spree/admin/users_controller.rb
- app/controllers/spree/admin/variants_controller.rb
- app/controllers/spree/credit_cards_controller.rb
- app/controllers/spree/orders_controller.rb
- app/controllers/spree/user_passwords_controller.rb
@@ -382,7 +367,6 @@ Metrics/AbcSize:
- app/controllers/user_passwords_controller.rb
- app/controllers/user_registrations_controller.rb
- app/helpers/checkout_helper.rb
- app/helpers/i18n_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/base_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
@@ -398,16 +382,18 @@ Metrics/AbcSize:
- app/models/product_import/entry_validator.rb
- app/models/product_import/product_importer.rb
- app/models/proxy_order.rb
- app/models/spree/ability_decorator.rb
- app/models/spree/calculator/default_tax_decorator.rb
- app/models/spree/calculator/flexi_rate_decorator.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/line_item_decorator.rb
- app/models/spree/order/checkout.rb
- app/models/spree/order_decorator.rb
- app/models/spree/payment_decorator.rb
- app/models/spree/payment/processing.rb
- app/models/spree/payment.rb
- app/models/spree/product_decorator.rb
- app/models/spree/shipment.rb
- app/models/spree/taxon_decorator.rb
- app/models/spree/tax_rate_decorator.rb
- app/models/spree/taxon.rb
- app/models/spree/tax_rate.rb
- app/models/spree/zone.rb
- app/serializers/api/admin/enterprise_serializer.rb
- app/serializers/api/product_serializer.rb
- app/serializers/api/variant_serializer.rb
@@ -415,7 +401,10 @@ Metrics/AbcSize:
- app/services/create_order_cycle.rb
- app/services/order_cycle_form.rb
- app/services/order_syncer.rb
- app/services/variant_units/option_value_namer.rb
- app/services/variant_units/variant_and_line_item_naming.rb
- engines/order_management/app/services/order_management/order/updater.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/stock/estimator.rb
- engines/order_management/app/services/order_management/stock/package.rb
- engines/order_management/app/services/order_management/stock/packer.rb
@@ -423,12 +412,10 @@ Metrics/AbcSize:
- lib/active_merchant/billing/gateways/stripe_decorator.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
- lib/open_food_network/bulk_coop_report.rb
- lib/open_food_network/customers_report.rb
- lib/open_food_network/enterprise_issue_validator.rb
- lib/open_food_network/group_buy_report.rb
- lib/open_food_network/lettuce_share_report.rb
- lib/open_food_network/option_value_namer.rb
- lib/open_food_network/order_and_distributor_report.rb
- lib/open_food_network/order_cycle_form_applicator.rb
- lib/open_food_network/order_cycle_management_report.rb
@@ -440,13 +427,17 @@ Metrics/AbcSize:
- lib/open_food_network/reports/line_items.rb
- lib/open_food_network/sales_tax_report.rb
- lib/open_food_network/users_and_enterprises_report.rb
- lib/open_food_network/variant_and_line_item_naming.rb
- lib/open_food_network/xero_invoices_report.rb
- lib/spree/api/controller_setup.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/controller_helpers/order.rb
- lib/spree/core/controller_helpers/respond_with.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/spree/core/delegate_belongs_to.rb
- lib/spree/core/permalinks.rb
- lib/spree/core/s3_support.rb
- lib/spree/localized_number.rb
- lib/spree/money.rb
- lib/stripe/account_connector.rb
- lib/tasks/enterprises.rake
- lib/tasks/sample_data/order_factory.rb
@@ -454,25 +445,13 @@ Metrics/AbcSize:
- spec/features/admin/product_import_spec.rb
- spec/features/admin/reports_spec.rb
- spec/features/admin/subscriptions_spec.rb
- spec/features/consumer/shopping/checkout_paypal_spec.rb
- spec/features/consumer/shopping/shopping_spec.rb
- spec/features/consumer/shopping/variant_overrides_spec.rb
- spec/models/enterprise_spec.rb
- spec/models/product_importer_spec.rb
- spec/services/order_checkout_restart_spec.rb
- spec/support/performance_helper.rb
- app/controllers/application_controller.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment/processing.rb
- app/models/spree/payment.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- app/models/spree/zone.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/delegate_belongs_to.rb
- lib/spree/core/permalinks.rb
- lib/spree/core/s3_support.rb
- lib/spree/money.rb
- spec/support/i18n_translations_checker.rb
- spec/support/performance_helper.rb
Metrics/BlockLength:
Max: 25
@@ -490,16 +469,21 @@ Metrics/BlockLength:
"scenario"
]
Exclude:
- app/models/spree/order/checkout.rb
- app/models/spree/payment/processing.rb
- app/models/spree/shipment.rb
- lib/spree/core/controller_helpers/common.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/tasks/data.rake
- spec/controllers/spree/admin/invoices_controller_spec.rb
- spec/factories/address_factory.rb
- spec/factories/enterprise_factory.rb
- spec/factories/order_cycle_factory.rb
- spec/factories/order_factory.rb
- spec/factories/payment_method_factory.rb
- spec/factories/product_factory.rb
- spec/factories.rb
- spec/factories/shipment_factory.rb
- spec/factories/shipping_method_factory.rb
- spec/factories/subscription_factory.rb
- spec/factories/user_factory.rb
@@ -507,17 +491,12 @@ Metrics/BlockLength:
- spec/features/consumer/shopping/embedded_shopfronts_spec.rb
- spec/lib/open_food_network/group_buy_report_spec.rb
- spec/models/tag_rule/discount_order_spec.rb
- spec/requests/api/orders_spec.rb
- spec/spec_helper.rb
- spec/support/delayed_job_helper.rb
- spec/support/matchers/select2_matchers.rb
- spec/support/matchers/table_matchers.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment/processing.rb
- spec/requests/api/orders_spec.rb
- spec/swagger_helper.rb
- spec/factories/address_factory.rb
- spec/factories/payment_method_factory.rb
- spec/factories/shipment_factory.rb
Metrics/CyclomaticComplexity:
Max: 6
@@ -527,68 +506,149 @@ Metrics/CyclomaticComplexity:
- app/controllers/spree/admin/taxons_controller.rb
- app/controllers/spree/orders_controller.rb
- app/helpers/checkout_helper.rb
- app/helpers/i18n_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/base_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
- app/models/enterprise.rb
- app/models/enterprise_relationship.rb
- app/models/spree/ability_decorator.rb
- app/models/spree/payment_decorator.rb
- app/models/spree/payment_method_decorator.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment_method.rb
- app/models/spree/payment.rb
- app/models/spree/product_decorator.rb
- app/models/spree/zone.rb
- app/models/variant_override_set.rb
- app/services/cart_service.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/stock/estimator.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
- lib/open_food_network/bulk_coop_report.rb
- lib/open_food_network/enterprise_issue_validator.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/controller_helpers/order.rb
- lib/spree/core/controller_helpers/respond_with.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/spree/localized_number.rb
- spec/models/product_importer_spec.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- app/models/spree/payment_method.rb
- app/models/spree/zone.rb
- lib/spree/core/calculated_adjustments.rb
Metrics/PerceivedComplexity:
Max: 7
Exclude:
- app/controllers/admin/enterprise_fees_controller.rb
- app/controllers/admin/enterprises_controller.rb
- app/controllers/spree/admin/taxons_controller.rb
- app/controllers/spree/orders_controller.rb
- app/helpers/checkout_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/base_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
- app/models/enterprise.rb
- app/models/enterprise_relationship.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment_method.rb
- app/models/spree/payment.rb
- app/models/spree/product_decorator.rb
- app/models/spree/zone.rb
- app/models/variant_override_set.rb
- app/services/cart_service.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/stock/estimator.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
- lib/open_food_network/enterprise_issue_validator.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/controller_helpers/order.rb
- lib/spree/core/controller_helpers/respond_with.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/spree/localized_number.rb
- spec/models/product_importer_spec.rb
- app/controllers/admin/enterprises_controller.rb
- app/controllers/api/variants_controller.rb
- app/controllers/spree/admin/taxons_controller.rb
- app/controllers/spree/orders_controller.rb
- app/helpers/checkout_helper.rb
- app/helpers/i18n_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
- app/models/enterprise_relationship.rb
- app/models/spree/ability_decorator.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/order/checkout.rb
- app/models/spree/order_decorator.rb
- app/models/spree/product_decorator.rb
- app/models/spree/zone.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/stock/estimator.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
- lib/open_food_network/bulk_coop_report.rb
- lib/open_food_network/enterprise_issue_validator.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/controller_helpers/order.rb
- lib/spree/core/controller_helpers/respond_with.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/spree/localized_number.rb
- spec/models/product_importer_spec.rb
- app/models/spree/order/checkout.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- app/models/spree/zone.rb
- lib/spree/core/calculated_adjustments.rb
Metrics/MethodLength:
Max: 10
Exclude:
- app/controllers/admin/enterprise_fees_controller.rb
- app/controllers/admin/enterprises_controller.rb
- app/controllers/spree/admin/taxons_controller.rb
- app/controllers/spree/orders_controller.rb
- app/helpers/checkout_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/base_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
- app/models/enterprise.rb
- app/models/enterprise_relationship.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment_method.rb
- app/models/spree/payment.rb
- app/models/spree/product_decorator.rb
- app/models/spree/zone.rb
- app/models/variant_override_set.rb
- app/services/cart_service.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/stock/estimator.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
- lib/open_food_network/enterprise_issue_validator.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/controller_helpers/order.rb
- lib/spree/core/controller_helpers/respond_with.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/spree/localized_number.rb
- spec/models/product_importer_spec.rb
- app/controllers/admin/enterprises_controller.rb
- app/controllers/api/variants_controller.rb
- app/controllers/spree/admin/taxons_controller.rb
- app/controllers/spree/orders_controller.rb
- app/helpers/checkout_helper.rb
- app/helpers/order_cycles_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
- app/models/enterprise_relationship.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/order/checkout.rb
- app/models/spree/order_decorator.rb
- app/models/spree/product_decorator.rb
- app/models/spree/zone.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/stock/estimator.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
- lib/open_food_network/enterprise_issue_validator.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/controller_helpers/order.rb
- lib/spree/core/controller_helpers/respond_with.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/spree/localized_number.rb
- spec/models/product_importer_spec.rb
- app/controllers/admin/contents_controller.rb
- app/controllers/admin/customers_controller.rb
- app/controllers/admin/enterprise_fees_controller.rb
@@ -603,7 +663,6 @@ Metrics/MethodLength:
- app/controllers/api/variants_controller.rb
- app/controllers/cart_controller.rb
- app/controllers/shop_controller.rb
- app/controllers/spree/admin/image_settings_controller.rb
- app/controllers/spree/admin/orders_controller.rb
- app/controllers/spree/admin/orders/customer_details_controller.rb
- app/controllers/spree/admin/payment_methods_controller.rb
@@ -614,9 +673,9 @@ Metrics/MethodLength:
- app/controllers/spree/admin/tax_categories_controller.rb
- app/controllers/spree/admin/taxons_controller.rb
- app/controllers/spree/admin/users_controller.rb
- app/controllers/spree/admin/variants_controller.rb
- app/controllers/spree/credit_cards_controller.rb
- app/controllers/spree/orders_controller.rb
- app/controllers/spree/user_registrations_controller.rb
- app/controllers/spree/user_sessions_controller.rb
- app/controllers/stripe/callbacks_controller.rb
- app/controllers/user_confirmations_controller.rb
@@ -635,32 +694,38 @@ Metrics/MethodLength:
- app/models/product_import/entry_processor.rb
- app/models/product_import/entry_validator.rb
- app/models/product_import/product_importer.rb
- app/models/spree/ability_decorator.rb
- app/models/spree/calculator/default_tax_decorator.rb
- app/models/spree/calculator/flexi_rate_decorator.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/credit_card.rb
- app/models/spree/order/checkout.rb
- app/models/spree/order_decorator.rb
- app/models/spree/payment_decorator.rb
- app/models/spree/payment_method_decorator.rb
- app/models/spree/payment_method.rb
- app/models/spree/payment/processing.rb
- app/models/spree/product_decorator.rb
- app/models/spree/shipment.rb
- app/models/spree/taxon.rb
- app/models/spree/tax_rate.rb
- app/models/spree/zone.rb
- app/serializers/api/admin/order_cycle_serializer.rb
- app/serializers/api/cached_enterprise_serializer.rb
- app/services/order_cycle_form.rb
- app/services/permitted_attributes/checkout.rb
- app/services/variant_units/option_value_namer.rb
- engines/order_management/app/services/order_management/order/updater.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_allocation_report.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_supplier_report.rb
- engines/order_management/app/services/order_management/reports/enterprise_fee_summary/scope.rb
- engines/order_management/app/services/order_management/stock/estimator.rb
- engines/order_management/app/services/order_management/stock/package.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
- lib/open_food_network/bulk_coop_report.rb
- lib/open_food_network/column_preference_defaults.rb
- lib/open_food_network/customers_report.rb
- lib/open_food_network/enterprise_fee_calculator.rb
- lib/open_food_network/enterprise_issue_validator.rb
- lib/open_food_network/group_buy_report.rb
- lib/open_food_network/lettuce_share_report.rb
- lib/open_food_network/option_value_namer.rb
- lib/open_food_network/order_and_distributor_report.rb
- lib/open_food_network/order_cycle_form_applicator.rb
- lib/open_food_network/order_cycle_management_report.rb
@@ -671,40 +736,25 @@ Metrics/MethodLength:
- lib/open_food_network/permissions.rb
- lib/open_food_network/products_and_inventory_report.rb
- lib/open_food_network/rack_request_blocker.rb
- lib/open_food_network/reports/bulk_coop_allocation_report.rb
- lib/open_food_network/reports/bulk_coop_supplier_report.rb
- lib/open_food_network/reports/line_items.rb
- lib/open_food_network/sales_tax_report.rb
- lib/open_food_network/users_and_enterprises_report.rb
- lib/open_food_network/xero_invoices_report.rb
- lib/spree/api/controller_setup.rb
- lib/spree/core/controller_helpers/auth.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/controller_helpers/order.rb
- lib/spree/core/controller_helpers/respond_with.rb
- lib/spree/core/controller_helpers/ssl.rb
- lib/spree/localized_number.rb
- lib/stripe/profile_storer.rb
- lib/tasks/data/truncate_data.rb
- lib/tasks/sample_data/group_factory.rb
- lib/tasks/sample_data/order_factory.rb
- lib/tasks/sample_data/product_factory.rb
- spec/features/consumer/shopping/checkout_paypal_spec.rb
- spec/features/consumer/shopping/variant_overrides_spec.rb
- spec/models/product_importer_spec.rb
- spec/support/request/authentication_helper.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment/processing.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_allocation_report.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_supplier_report.rb
- app/models/spree/credit_card.rb
- app/models/spree/payment_method.rb
- app/models/spree/zone.rb
- lib/spree/core/calculated_adjustments.rb
- lib/spree/core/delegate_belongs_to.rb
- lib/spree/core/permalinks.rb
- lib/spree/core/s3_support.rb
- lib/spree/localized_number.rb
- lib/spree/responder.rb
- lib/stripe/profile_storer.rb
- lib/tasks/sample_data/group_factory.rb
- lib/tasks/sample_data/order_factory.rb
- lib/tasks/sample_data/product_factory.rb
- spec/features/consumer/shopping/variant_overrides_spec.rb
- spec/models/product_importer_spec.rb
- spec/support/i18n_translations_checker.rb
Metrics/ClassLength:
@@ -729,16 +779,19 @@ Metrics/ClassLength:
- app/models/product_import/entry_processor.rb
- app/models/product_import/entry_validator.rb
- app/models/product_import/product_importer.rb
- app/models/spree/ability_decorator.rb
- app/models/spree/ability.rb
- app/models/spree/address.rb
- app/models/spree/credit_card.rb
- app/models/spree/payment.rb
- app/models/spree/shipment.rb
- app/models/spree/user.rb
- app/models/spree/zone.rb
- app/serializers/api/cached_enterprise_serializer.rb
- app/serializers/api/enterprise_shopfront_serializer.rb
- app/services/cart_service.rb
- engines/order_management/app/services/order_management/order/updater.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- engines/order_management/app/services/order_management/reports/enterprise_fee_summary/scope.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/open_food_network/bulk_coop_report.rb
- lib/open_food_network/enterprise_fee_calculator.rb
- lib/open_food_network/order_cycle_form_applicator.rb
- lib/open_food_network/order_cycle_management_report.rb
@@ -748,10 +801,6 @@ Metrics/ClassLength:
- lib/open_food_network/permissions.rb
- lib/open_food_network/users_and_enterprises_report.rb
- lib/open_food_network/xero_invoices_report.rb
- app/models/spree/payment.rb
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
- app/models/spree/credit_card.rb
- app/models/spree/zone.rb
Metrics/ModuleLength:
Max: 100
@@ -760,6 +809,8 @@ Metrics/ModuleLength:
- app/helpers/injection_helper.rb
- app/helpers/spree/admin/base_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment/processing.rb
- engines/order_management/spec/services/order_management/order/updater_spec.rb
- engines/order_management/spec/services/order_management/stock/package_spec.rb
- engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb
@@ -769,7 +820,6 @@ Metrics/ModuleLength:
- engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb
- engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb
- lib/open_food_network/column_preference_defaults.rb
- spec/controllers/admin/enterprises_controller_spec.rb
- spec/controllers/admin/order_cycles_controller_spec.rb
- spec/controllers/api/order_cycles_controller_spec.rb
- spec/controllers/api/orders_controller_spec.rb
@@ -777,28 +827,24 @@ Metrics/ModuleLength:
- spec/lib/open_food_network/address_finder_spec.rb
- spec/lib/open_food_network/customers_report_spec.rb
- spec/lib/open_food_network/enterprise_fee_calculator_spec.rb
- spec/lib/open_food_network/option_value_namer_spec.rb
- spec/lib/open_food_network/order_cycle_form_applicator_spec.rb
- spec/lib/open_food_network/order_cycle_permissions_spec.rb
- spec/lib/open_food_network/order_grouper_spec.rb
- spec/lib/open_food_network/packing_report_spec.rb
- spec/lib/open_food_network/permissions_spec.rb
- spec/lib/open_food_network/products_and_inventory_report_spec.rb
- spec/lib/open_food_network/scope_variant_to_hub_spec.rb
- spec/lib/open_food_network/tag_rule_applicator_spec.rb
- spec/lib/open_food_network/user_balance_calculator_spec.rb
- spec/lib/open_food_network/users_and_enterprises_report_spec.rb
- spec/models/spree/ability_spec.rb
- spec/models/spree/adjustment_spec.rb
- spec/models/spree/credit_card_spec.rb
- spec/models/spree/line_item_spec.rb
- spec/models/spree/payment_spec.rb
- spec/models/spree/product_spec.rb
- spec/models/spree/shipping_method_spec.rb
- spec/models/spree/variant_spec.rb
- spec/services/permissions/order_spec.rb
- spec/support/request/web_helper.rb
- app/models/spree/order/checkout.rb
- app/models/spree/payment/processing.rb
- spec/lib/open_food_network/packing_report_spec.rb
- spec/models/spree/credit_card_spec.rb
- spec/services/variant_units/option_value_namer_spec.rb
Metrics/ParameterLists:
Max: 5
@@ -807,8 +853,3 @@ Metrics/ParameterLists:
- app/models/product_import/entry_processor.rb
- lib/open_food_network/xero_invoices_report.rb
- spec/features/admin/reports_spec.rb
Lint/UselessAssignment:
Exclude:
- 'spec/**/*'
- 'lib/spree/core/controller_helpers/common.rb'

View File

@@ -1,17 +1,18 @@
# This configuration was generated by
# `rubocop --auto-gen-config --exclude-limit 1400`
# on 2020-09-10 16:12:05 +1000 using RuboCop version 0.81.0.
# on 2020-10-14 09:49:36 +0100 using RuboCop version 0.81.0.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 2
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: with_first_argument, with_fixed_indentation
Layout/ArgumentAlignment:
Exclude:
- 'spec/models/spree/address_spec.rb'
- 'spec/models/spree/order/checkout_spec.rb'
# Offense count: 1
@@ -22,10 +23,11 @@ Layout/BlockAlignment:
Exclude:
- 'spec/models/spree/order/checkout_spec.rb'
# Offense count: 2
# Offense count: 3
# Cop supports --auto-correct.
Layout/EmptyLines:
Exclude:
- 'spec/features/admin/variants_spec.rb'
- 'spec/models/spree/payment_spec.rb'
# Offense count: 4
@@ -118,7 +120,7 @@ Layout/SpaceInsideHashLiteralBraces:
- 'spec/services/checkout/form_data_adapter_spec.rb'
- 'spec/services/user_locale_setter_spec.rb'
# Offense count: 2
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: final_newline, final_blank_line
@@ -126,6 +128,7 @@ Layout/TrailingEmptyLines:
Exclude:
- 'spec/factories.rb'
- 'spec/factories/address_factory.rb'
- 'spec/support/request/stripe_helper.rb'
# Offense count: 6
# Cop supports --auto-correct.
@@ -171,11 +174,18 @@ Lint/UselessAccessModifier:
- 'app/services/mail_configuration.rb'
- 'lib/open_food_network/feature_toggle.rb'
# Offense count: 1
Lint/UselessAssignment:
Exclude:
- 'spec/**/*'
- 'lib/spree/core/controller_helpers/common.rb'
- 'app/models/spree/taxon.rb'
# Offense count: 9
Naming/AccessorMethodName:
Exclude:
- 'app/controllers/spree/admin/taxonomies_controller.rb'
- 'app/models/spree/adjustment_decorator.rb'
- 'app/models/spree/adjustment.rb'
- 'app/models/spree/order_decorator.rb'
- 'lib/spree/core/controller_helpers/common.rb'
- 'spec/support/request/shop_workflow.rb'
@@ -208,14 +218,14 @@ Naming/PredicateName:
- 'app/models/enterprise.rb'
- 'app/models/enterprise_relationship.rb'
- 'app/models/order_cycle.rb'
- 'app/models/spree/ability_decorator.rb'
- 'app/models/spree/adjustment_decorator.rb'
- 'app/models/spree/adjustment.rb'
- 'app/models/spree/credit_card.rb'
- 'app/models/spree/line_item_decorator.rb'
- 'app/models/spree/order_decorator.rb'
- 'app/models/spree/payment_method.rb'
- 'app/models/spree/preferences/file_configuration.rb'
- 'app/models/spree/shipping_method_decorator.rb'
- 'app/models/spree/shipping_method.rb'
- 'app/models/spree/user.rb'
- 'lib/open_food_network/customers_report.rb'
- 'lib/open_food_network/order_cycle_management_report.rb'
- 'lib/open_food_network/order_grouper.rb'
@@ -238,6 +248,12 @@ Rails/ActiveRecordAliases:
- 'spec/features/consumer/shopping/orders_spec.rb'
- 'spec/requests/api/orders_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
Rails/ApplicationController:
Exclude:
- 'engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb'
# Offense count: 3
# Configuration parameters: EnforcedStyle.
# SupportedStyles: strict, flexible
@@ -271,15 +287,15 @@ Rails/FilePath:
- 'spec/controllers/api/logos_controller_spec.rb'
- 'spec/controllers/api/product_images_controller_spec.rb'
- 'spec/controllers/api/promo_images_controller_spec.rb'
- 'spec/controllers/api/terms_and_conditions_controller_spec.rb'
- 'spec/factories/product_factory.rb'
- 'spec/features/admin/content_spec.rb'
- 'spec/features/admin/enterprises/images_spec.rb'
- 'spec/models/content_configuration_spec.rb'
- 'spec/models/spree/variant_spec.rb'
- 'spec/serializers/api/admin/enterprise_serializer_spec.rb'
- 'spec/support/downloads_helper.rb'
# Offense count: 9
# Offense count: 7
# Cop supports --auto-correct.
# Configuration parameters: Include.
# Include: app/models/**/*.rb
@@ -289,7 +305,6 @@ Rails/FindBy:
- 'app/models/product_import/entry_processor.rb'
- 'app/models/product_import/entry_validator.rb'
- 'app/models/product_import/spreadsheet_data.rb'
- 'app/models/spree/shipment.rb'
- 'app/models/spree/user.rb'
# Offense count: 2
@@ -301,18 +316,21 @@ Rails/FindEach:
- 'app/models/spree/order_decorator.rb'
- 'app/models/spree/shipment.rb'
# Offense count: 6
# Offense count: 9
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasAndBelongsToMany:
Exclude:
- 'app/models/concerns/payment_method_distributors.rb'
- 'app/models/enterprise.rb'
- 'app/models/enterprise_group.rb'
- 'app/models/spree/concerns/payment_method_distributors.rb'
- 'app/models/spree/line_item_decorator.rb'
- 'app/models/spree/role.rb'
- 'app/models/spree/shipping_method.rb'
- 'app/models/spree/user.rb'
- 'app/models/spree/zone.rb'
# Offense count: 27
# Offense count: 35
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasManyOrHasOneDependent:
@@ -320,13 +338,16 @@ Rails/HasManyOrHasOneDependent:
- 'app/models/customer.rb'
- 'app/models/enterprise.rb'
- 'app/models/order_cycle.rb'
- 'app/models/spree/adjustment_decorator.rb'
- 'app/models/spree/address.rb'
- 'app/models/spree/adjustment.rb'
- 'app/models/spree/credit_card.rb'
- 'app/models/spree/order_decorator.rb'
- 'app/models/spree/payment_method.rb'
- 'app/models/spree/property.rb'
- 'app/models/spree/shipment.rb'
- 'app/models/spree/shipping_method_decorator.rb'
- 'app/models/spree/shipping_category.rb'
- 'app/models/spree/shipping_method.rb'
- 'app/models/spree/taxonomy.rb'
- 'app/models/spree/user.rb'
- 'app/models/spree/variant_decorator.rb'
- 'app/models/subscription.rb'
@@ -347,7 +368,7 @@ Rails/HelperInstanceVariable:
- 'app/helpers/spree/admin/orders_helper.rb'
- 'app/helpers/spree/orders_helper.rb'
# Offense count: 35
# Offense count: 33
# Configuration parameters: Include.
# Include: app/controllers/**/*.rb
Rails/LexicallyScopedActionFilter:
@@ -363,7 +384,6 @@ Rails/LexicallyScopedActionFilter:
- 'app/controllers/spree/admin/adjustments_controller.rb'
- 'app/controllers/spree/admin/payment_methods_controller.rb'
- 'app/controllers/spree/admin/payments_controller.rb'
- 'app/controllers/spree/admin/product_properties_controller.rb'
- 'app/controllers/spree/admin/products_controller.rb'
- 'app/controllers/spree/admin/search_controller.rb'
- 'app/controllers/spree/admin/shipping_methods_controller.rb'
@@ -403,7 +423,7 @@ Rails/ReflectionClassName:
- 'app/models/enterprise_role.rb'
- 'app/models/subscription.rb'
# Offense count: 241
# Offense count: 243
# Configuration parameters: Blacklist, Whitelist.
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
Rails/SkipsModelValidations:
@@ -419,12 +439,15 @@ Rails/SkipsModelValidations:
- 'app/models/enterprise_relationship.rb'
- 'app/models/product_import/inventory_reset_strategy.rb'
- 'app/models/proxy_order.rb'
- 'app/models/spree/address_decorator.rb'
- 'app/models/spree/address.rb'
- 'app/models/spree/adjustment.rb'
- 'app/models/spree/credit_card.rb'
- 'app/models/spree/order_decorator.rb'
- 'app/models/spree/payment.rb'
- 'app/models/spree/shipment.rb'
- 'app/models/spree/shipping_method_decorator.rb'
- 'app/models/spree/shipping_method.rb'
- 'app/models/spree/tax_category.rb'
- 'app/models/spree/taxonomy.rb'
- 'app/models/spree/zone.rb'
- 'app/models/subscription.rb'
- 'app/models/variant_override.rb'
@@ -472,7 +495,6 @@ Rails/SkipsModelValidations:
- 'spec/lib/open_food_network/products_and_inventory_report_spec.rb'
- 'spec/lib/open_food_network/scope_variant_to_hub_spec.rb'
- 'spec/lib/stripe/credit_card_cloner_spec.rb'
- 'spec/models/calculator/weight_spec.rb'
- 'spec/models/concerns/variant_stock_spec.rb'
- 'spec/models/enterprise_relationship_spec.rb'
- 'spec/models/exchange_spec.rb'
@@ -480,6 +502,7 @@ Rails/SkipsModelValidations:
- 'spec/models/spree/asset_spec.rb'
- 'spec/models/spree/line_item_spec.rb'
- 'spec/models/spree/order_spec.rb'
- 'spec/models/spree/tax_category_spec.rb'
- 'spec/models/spree/variant_spec.rb'
- 'spec/models/tag_rule/discount_order_spec.rb'
- 'spec/serializers/api/admin/subscription_line_item_serializer_spec.rb'
@@ -494,7 +517,7 @@ Rails/SkipsModelValidations:
- 'spec/support/request/shop_workflow.rb'
- 'spec/views/spree/shared/_order_details.html.haml_spec.rb'
# Offense count: 4
# Offense count: 5
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/UniqueValidationWithoutIndex:
@@ -502,6 +525,7 @@ Rails/UniqueValidationWithoutIndex:
- 'app/models/customer.rb'
- 'app/models/exchange.rb'
- 'app/models/spree/stock_item.rb'
- 'app/models/spree/tax_category.rb'
- 'app/models/spree/zone.rb'
# Offense count: 2
@@ -512,14 +536,6 @@ Rails/UnknownEnv:
- 'app/models/spree/app_configuration_decorator.rb'
- 'lib/spree/core/controller_helpers/ssl.rb'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: percent_q, bare_percent
Style/BarePercentLiterals:
Exclude:
- 'spec/support/request/web_helper.rb'
# Offense count: 2
Style/CaseEquality:
Exclude:
@@ -608,7 +624,7 @@ Style/FormatStringToken:
- 'lib/open_food_network/sales_tax_report.rb'
- 'spec/features/admin/bulk_order_management_spec.rb'
# Offense count: 829
# Offense count: 818
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: always, always_true, never
@@ -675,7 +691,6 @@ Style/FrozenStringLiteralComment:
- 'app/controllers/spree/admin/base_controller.rb'
- 'app/controllers/spree/admin/countries_controller.rb'
- 'app/controllers/spree/admin/general_settings_controller.rb'
- 'app/controllers/spree/admin/image_settings_controller.rb'
- 'app/controllers/spree/admin/images_controller.rb'
- 'app/controllers/spree/admin/invoices_controller.rb'
- 'app/controllers/spree/admin/mail_methods_controller.rb'
@@ -710,7 +725,6 @@ Style/FrozenStringLiteralComment:
- 'app/controllers/user_passwords_controller.rb'
- 'app/controllers/user_registrations_controller.rb'
- 'app/helpers/admin/enterprises_helper.rb'
- 'app/helpers/admin/image_settings_helper.rb'
- 'app/helpers/admin/injection_helper.rb'
- 'app/helpers/admin/orders_helper.rb'
- 'app/helpers/admin/subscriptions_helper.rb'
@@ -739,7 +753,6 @@ Style/FrozenStringLiteralComment:
- 'app/helpers/spree/admin/taxons_helper.rb'
- 'app/helpers/spree/admin/zones_helper.rb'
- 'app/helpers/spree/api/api_helpers.rb'
- 'app/helpers/spree/base_helper_decorator.rb'
- 'app/helpers/spree/orders_helper.rb'
- 'app/helpers/spree/reports_helper.rb'
- 'app/helpers/spree_currency_helper.rb'
@@ -803,13 +816,7 @@ Style/FrozenStringLiteralComment:
- 'app/models/product_import/unit_converter.rb'
- 'app/models/proxy_order.rb'
- 'app/models/schedule.rb'
- 'app/models/spree/ability_decorator.rb'
- 'app/models/spree/address_decorator.rb'
- 'app/models/spree/adjustment_decorator.rb'
- 'app/models/spree/app_configuration_decorator.rb'
- 'app/models/spree/calculator_decorator.rb'
- 'app/models/spree/classification_decorator.rb'
- 'app/models/spree/concerns/payment_method_distributors.rb'
- 'app/models/spree/gateway/migs.rb'
- 'app/models/spree/gateway/pin.rb'
- 'app/models/spree/gateway/stripe_connect.rb'
@@ -823,9 +830,6 @@ Style/FrozenStringLiteralComment:
- 'app/models/spree/product_property_decorator.rb'
- 'app/models/spree/product_set.rb'
- 'app/models/spree/property.rb'
- 'app/models/spree/shipping_method_decorator.rb'
- 'app/models/spree/tax_rate_decorator.rb'
- 'app/models/spree/taxon_decorator.rb'
- 'app/models/spree/user.rb'
- 'app/models/spree/variant_decorator.rb'
- 'app/models/stripe_account.rb'
@@ -945,6 +949,7 @@ Style/FrozenStringLiteralComment:
- 'app/services/tax_rate_finder.rb'
- 'app/services/upload_sanitizer.rb'
- 'app/services/variant_deleter.rb'
- 'app/services/variant_units/variant_and_line_item_naming.rb'
- 'app/services/variants_stock_levels.rb'
- 'app/validators/date_time_string_validator.rb'
- 'app/validators/distributors_validator.rb'
@@ -1043,10 +1048,8 @@ Style/FrozenStringLiteralComment:
- 'lib/open_food_network/tag_rule_applicator.rb'
- 'lib/open_food_network/user_balance_calculator.rb'
- 'lib/open_food_network/users_and_enterprises_report.rb'
- 'lib/open_food_network/variant_and_line_item_naming.rb'
- 'lib/open_food_network/xero_invoices_report.rb'
- 'lib/spree/api/controller_setup.rb'
- 'lib/spree/api/testing_support/setup.rb'
- 'lib/spree/authentication_helpers.rb'
- 'lib/spree/localized_number.rb'
- 'lib/spree/money_decorator.rb'
@@ -1105,6 +1108,7 @@ Style/FrozenStringLiteralComment:
- 'spec/controllers/api/statuses_controller_spec.rb'
- 'spec/controllers/api/taxonomies_controller_spec.rb'
- 'spec/controllers/api/taxons_controller_spec.rb'
- 'spec/controllers/api/terms_and_conditions_controller_spec.rb'
- 'spec/controllers/api/variants_controller_spec.rb'
- 'spec/controllers/base_controller_spec.rb'
- 'spec/controllers/cart_controller_spec.rb'
@@ -1117,7 +1121,6 @@ Style/FrozenStringLiteralComment:
- 'spec/controllers/shops_controller_spec.rb'
- 'spec/controllers/spree/admin/adjustments_controller_spec.rb'
- 'spec/controllers/spree/admin/base_controller_spec.rb'
- 'spec/controllers/spree/admin/image_settings_controller_spec.rb'
- 'spec/controllers/spree/admin/invoices_controller_spec.rb'
- 'spec/controllers/spree/admin/mail_methods_controller_spec.rb'
- 'spec/controllers/spree/admin/orders/customer_details_controller_spec.rb'
@@ -1147,6 +1150,7 @@ Style/FrozenStringLiteralComment:
- 'spec/factories/order_cycle_factory.rb'
- 'spec/factories/order_factory.rb'
- 'spec/factories/product_factory.rb'
- 'spec/factories/return_authorization_factory.rb'
- 'spec/factories/shipment_factory.rb'
- 'spec/factories/shipping_method_factory.rb'
- 'spec/factories/state_factory.rb'
@@ -1159,26 +1163,23 @@ Style/FrozenStringLiteralComment:
- 'spec/features/admin/authentication_spec.rb'
- 'spec/features/admin/bulk_order_management_spec.rb'
- 'spec/features/admin/bulk_product_update_spec.rb'
- 'spec/features/admin/configuration/content_spec.rb'
- 'spec/features/admin/configuration/general_settings_spec.rb'
- 'spec/features/admin/configuration/image_settings_spec.rb'
- 'spec/features/admin/configuration/mail_methods_spec.rb'
- 'spec/features/admin/configuration/states_spec.rb'
- 'spec/features/admin/configuration/tax_categories_spec.rb'
- 'spec/features/admin/configuration/tax_rates_spec.rb'
- 'spec/features/admin/configuration/taxonomies_spec.rb'
- 'spec/features/admin/configuration/zones_spec.rb'
- 'spec/features/admin/content_spec.rb'
- 'spec/features/admin/customers_spec.rb'
- 'spec/features/admin/enterprise_fees_spec.rb'
- 'spec/features/admin/enterprise_groups_spec.rb'
- 'spec/features/admin/enterprise_relationships_spec.rb'
- 'spec/features/admin/enterprise_roles_spec.rb'
- 'spec/features/admin/enterprise_user_spec.rb'
- 'spec/features/admin/enterprises/images_spec.rb'
- 'spec/features/admin/enterprises/index_spec.rb'
- 'spec/features/admin/enterprises_spec.rb'
- 'spec/features/admin/external_services_spec.rb'
- 'spec/features/admin/image_settings_spec.rb'
- 'spec/features/admin/multilingual_spec.rb'
- 'spec/features/admin/overview_spec.rb'
- 'spec/features/admin/payment_method_spec.rb'
@@ -1250,7 +1251,6 @@ Style/FrozenStringLiteralComment:
- 'spec/lib/open_food_network/group_buy_report_spec.rb'
- 'spec/lib/open_food_network/i18n_config_spec.rb'
- 'spec/lib/open_food_network/lettuce_share_report_spec.rb'
- 'spec/lib/open_food_network/option_value_namer_spec.rb'
- 'spec/lib/open_food_network/order_and_distributor_report_spec.rb'
- 'spec/lib/open_food_network/order_cycle_form_applicator_spec.rb'
- 'spec/lib/open_food_network/order_cycle_management_report_spec.rb'
@@ -1331,7 +1331,6 @@ Style/FrozenStringLiteralComment:
- 'spec/models/spree/shipping_method_spec.rb'
- 'spec/models/spree/stock/availability_validator_spec.rb'
- 'spec/models/spree/tax_rate_spec.rb'
- 'spec/models/spree/taxon_spec.rb'
- 'spec/models/spree/user_spec.rb'
- 'spec/models/spree/variant_spec.rb'
- 'spec/models/stripe_account_spec.rb'
@@ -1397,6 +1396,7 @@ Style/FrozenStringLiteralComment:
- 'spec/services/search_orders_spec.rb'
- 'spec/services/tax_rate_finder_spec.rb'
- 'spec/services/upload_sanitizer_spec.rb'
- 'spec/services/variant_units/option_value_namer_spec.rb'
- 'spec/services/variants_stock_levels_spec.rb'
- 'spec/spec_helper.rb'
- 'spec/support/ability_helper.rb'
@@ -1425,7 +1425,7 @@ Style/FrozenStringLiteralComment:
- 'spec/support/products_helper.rb'
- 'spec/support/request/admin_helper.rb'
- 'spec/support/request/authentication_helper.rb'
- 'spec/support/request/checkout_workflow.rb'
- 'spec/support/request/checkout_helper.rb'
- 'spec/support/request/cookie_helper.rb'
- 'spec/support/request/distribution_helper.rb'
- 'spec/support/request/menu_helper.rb'
@@ -1460,16 +1460,16 @@ Style/GuardClause:
- 'app/models/enterprise.rb'
- 'app/models/enterprise_group.rb'
- 'app/models/producer_property.rb'
- 'app/models/spree/classification_decorator.rb'
- 'app/models/spree/order_decorator.rb'
- 'app/models/spree/price_decorator.rb'
- 'app/models/spree/product_decorator.rb'
- 'app/services/order_syncer.rb'
- 'app/services/variant_units/variant_and_line_item_naming.rb'
- 'lib/discourse/single_sign_on.rb'
- 'lib/open_food_network/order_cycle_form_applicator.rb'
- 'lib/open_food_network/rack_request_blocker.rb'
- 'lib/open_food_network/variant_and_line_item_naming.rb'
- 'spec/support/delayed_job_helper.rb'
- 'spec/support/request/checkout_helper.rb'
- 'spec/support/request/distribution_helper.rb'
- 'spec/support/request/shop_workflow.rb'
@@ -1495,7 +1495,7 @@ Style/MixinUsage:
- 'lib/open_food_network/orders_and_fulfillments_report.rb'
- 'spec/lib/open_food_network/packing_report_spec.rb'
# Offense count: 37
# Offense count: 36
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
# SupportedStyles: predicate, comparison
@@ -1508,7 +1508,6 @@ Style/NumericPredicate:
- 'app/helpers/shared_helper.rb'
- 'app/models/product_import/product_importer.rb'
- 'app/models/product_import/spreadsheet_entry.rb'
- 'app/models/spree/adjustment_decorator.rb'
- 'app/models/spree/gateway/stripe_connect.rb'
- 'app/models/spree/line_item_decorator.rb'
- 'app/models/spree/order_decorator.rb'
@@ -1538,12 +1537,6 @@ Style/RandomWithOffset:
Exclude:
- 'spec/factories.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/RedundantPercentQ:
Exclude:
- 'spec/support/request/web_helper.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
@@ -1563,7 +1556,6 @@ Style/RescueStandardError:
# Offense count: 231
Style/Send:
Exclude:
- 'app/models/spree/shipping_method_decorator.rb'
- 'spec/controllers/admin/subscriptions_controller_spec.rb'
- 'spec/controllers/checkout_controller_spec.rb'
- 'spec/controllers/spree/admin/base_controller_spec.rb'
@@ -1575,7 +1567,6 @@ Style/Send:
- 'spec/lib/open_food_network/enterprise_fee_applicator_spec.rb'
- 'spec/lib/open_food_network/enterprise_fee_calculator_spec.rb'
- 'spec/lib/open_food_network/lettuce_share_report_spec.rb'
- 'spec/lib/open_food_network/option_value_namer_spec.rb'
- 'spec/lib/open_food_network/order_cycle_form_applicator_spec.rb'
- 'spec/lib/open_food_network/permissions_spec.rb'
- 'spec/lib/open_food_network/products_and_inventory_report_spec.rb'
@@ -1597,6 +1588,7 @@ Style/Send:
- 'spec/models/tag_rule/filter_shipping_methods_spec.rb'
- 'spec/services/cart_service_spec.rb'
- 'spec/services/products_renderer_spec.rb'
- 'spec/services/variant_units/option_value_namer_spec.rb'
- 'spec/spec_helper.rb'
- 'spec/support/localized_number_helper.rb'
- 'spec/support/matchers/delegate_matchers.rb'

3
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,3 @@
# Code of Conduct of the Open Food Network
**Welcome!** We are currently working on a Code of Conduct. You are welcome to contribute. We started this work at the Global Gathering 2020 and you find [notes of the initial session](https://community.openfoodnetwork.org/t/global-gathering-2020-day-5-a-code-of-conduct-for-ofn/2071/1) in the community forum. You can edit this file on Github to suggest new content. Alternatively, you can post in our [community forum](https://community.openfoodnetwork.org) or reach us on [Slack](https://openfoodnetwork.org/slack-invite).

View File

@@ -40,7 +40,7 @@ Push your changes to a branch on your fork:
## Submitting a Pull Request
Use the GitHub UI to submit a [new pull request][pr] against upstream/master. To increase the chances that your pull request is swiftly accepted please have a look at our guide to [making a great pull request][great-pr].
Use the GitHub UI to submit a [new pull request][pr] against upstream/master. To increase the chances that your pull request is swiftly accepted please have a look at our guide to [making a great pull request][great-pr].
TL;DR:
* Write tests

View File

@@ -1,62 +0,0 @@
### Docker
It is possible to setup the Open Food Network app easily with Docker and Docker Compose.
The objective is to spare configuration time, in order to help people testing the app and contribute to it.
It can also be used as documentation. It is not perfect but it is used in many other projects and many devs are used to it nowadays.
### Install Docker
Please check the documentation here, https://docs.docker.com/install/ to install Docker.
For Docker Compose, information are here: https://docs.docker.com/compose/install/.
Better to have at least 2GB free on your computer in order to download images and create containers for Open Food Network app.
### Use Docker with Open Food Network
Open a terminal with a shell.
Clone the repository. If you're planning on contributing code to the project (which we [LOVE](CONTRIBUTING.md)), it is a good idea to begin by forking this repo using the Fork button in the top-right corner of this screen. You should then be able to use git clone to copy your fork onto your local machine.
```sh
$ git clone https://github.com/YOUR_GITHUB_USERNAME_HERE/openfoodnetwork
```
Otherwise, if you just want to get things running, clone from the OFN main repo:
```sh
$ git clone git@github.com:openfoodfoundation/openfoodnetwork.git
```
Go at the root of the app:
```sh
$ cd openfoodnetwork
```
Download the Docker images and build the containers:
```sh
$ docker-compose build
```
Setup the database and seed it with sample data:
```sh
$ docker-compose run web bundle exec rake db:reset
$ docker-compose run web bundle exec rake db:test:prepare
$ docker-compose run web bundle exec rake ofn:sample_data
```
Finally, run the app with all the required containers:
```sh
$ docker-compose up
```
The default admin user is 'ofn@example.com' with 'ofn123' password.
Check the app in the browser at `http://localhost:3000`.
You will then get the trace of the containers in the terminal. You can stop the containers using Ctrl-C in the terminal.
You can find some useful tips and commands [here](https://github.com/openfoodfoundation/openfoodnetwork/wiki/Docker:-useful-tips-and-commands).

View File

@@ -27,8 +27,11 @@ RUN sh -c "echo 'deb https://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main'
apt-get update && \
apt-get install -yqq --no-install-recommends postgresql-client-9.5 libpq-dev
# Install node
RUN apt-get install -y nodejs
# Install node & yarn
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && \
apt-get install -y nodejs yarn
# Install Chrome
RUN wget --quiet -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
@@ -43,5 +46,9 @@ RUN wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.z
# Copy code and install app dependencies
COPY . /usr/src/app/
# Install front-end dependencies
RUN yarn install
# Run bundler install in parallel with the amount of available CPUs
RUN bundle install --jobs="$(nproc)"

View File

@@ -4,7 +4,7 @@ This is a general guide to setting up an Open Food Network **development environ
### Requirements
The fastest way to make it work locally is to use Docker, you only need to setup git, see the [Docker setup guide](DOCKER.md).
The fastest way to make it work locally is to use Docker, you only need to setup git, see the [Docker setup guide](docker/README.md).
Otherwise, for a local setup you will need:
* Ruby 2.3.7 and bundler
* PostgreSQL database

View File

@@ -3,7 +3,7 @@ ruby "2.3.7"
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
gem 'i18n', '~> 0.6.11'
gem 'i18n-js', '~> 3.7.1'
gem 'i18n-js', '~> 3.8.0'
gem 'rails', '~> 4.0.13'
gem 'rails-i18n', '~> 4.0'
gem 'rails_safe_tasks', '~> 1.0'
@@ -117,7 +117,6 @@ gem 'uglifier', '>= 1.0.3'
gem 'angular-rails-templates', '~> 0.3.0'
gem 'foundation-icons-sass-rails'
gem 'momentjs-rails'
gem 'foundation-rails', '= 5.5.2.1'
@@ -156,6 +155,7 @@ end
group :test do
gem 'simplecov', require: false
gem 'test-prof'
gem 'webmock'
# See spec/spec_helper.rb for instructions
# gem 'perftools.rb'

View File

@@ -64,6 +64,7 @@ PATH
remote: engines/dfc_provider
specs:
dfc_provider (0.0.1)
active_model_serializers (~> 0.8.4)
jwt (~> 2.2)
rspec (~> 3.9)
@@ -108,7 +109,7 @@ GEM
activesupport (= 4.0.13)
arel (~> 4.0.0)
activerecord-deprecated_finders (1.0.4)
activerecord-import (1.0.6)
activerecord-import (1.0.7)
activerecord (>= 3.2)
activerecord-postgresql-adapter (0.0.1)
pg
@@ -193,18 +194,17 @@ GEM
sass-rails (< 5.1)
sprockets (< 4.0)
concurrent-ruby (1.1.7)
crack (0.4.3)
safe_yaml (~> 1.0.0)
crack (0.4.4)
css_parser (1.7.1)
addressable
daemons (1.3.1)
dalli (2.7.10)
dalli (2.7.11)
database_cleaner (1.8.5)
db2fog (0.9.0)
activerecord (>= 3.2.0, < 5.0)
fog (~> 1.0)
rails (>= 3.2.0, < 5.0)
ddtrace (0.40.0)
ddtrace (0.42.0)
msgpack
debugger-linecache (1.2.0)
delayed_job (4.1.8)
@@ -407,11 +407,11 @@ GEM
fuubar (2.5.0)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
geocoder (1.6.3)
geocoder (1.6.4)
get_process_mem (0.2.5)
ffi (~> 1.0)
gmaps4rails (2.1.2)
haml (5.1.2)
haml (5.2.0)
temple (>= 0.8.0)
tilt
hashdiff (1.0.1)
@@ -421,7 +421,7 @@ GEM
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
i18n (0.6.11)
i18n-js (3.7.1)
i18n-js (3.8.0)
i18n (>= 0.6.6)
immigrant (0.3.6)
activerecord (>= 3.0)
@@ -444,7 +444,7 @@ GEM
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.11.3)
knapsack (1.18.0)
knapsack (1.19.0)
rake
launchy (2.4.3)
addressable (~> 2.3)
@@ -462,8 +462,6 @@ GEM
mini_racer (0.2.15)
libv8 (> 7.3)
minitest (4.7.5)
momentjs-rails (2.20.1)
railties (>= 3.1)
money (5.1.1)
i18n (~> 0.6.0)
msgpack (1.3.3)
@@ -619,7 +617,6 @@ GEM
ruby-progressbar (1.10.1)
ruby-rc4 (0.1.5)
rubyzip (1.3.0)
safe_yaml (1.0.5)
sass (3.4.25)
sass-rails (5.0.7)
railties (>= 4.0.0, < 6)
@@ -660,12 +657,13 @@ GEM
stringex (1.5.1)
stripe (5.25.0)
temple (0.8.2)
test-prof (0.7.5)
test-unit (3.3.6)
power_assert
thor (0.20.3)
thread_safe (0.3.6)
tilt (1.4.1)
timecop (0.9.1)
timecop (0.9.2)
truncate_html (0.9.2)
tzinfo (0.3.57)
uglifier (4.2.0)
@@ -687,7 +685,7 @@ GEM
nokogiri (~> 1.6)
rubyzip (>= 1.3.0)
selenium-webdriver (>= 3.0, < 4.0)
webmock (3.9.1)
webmock (3.9.3)
addressable (>= 2.3.6)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
@@ -756,7 +754,7 @@ DEPENDENCIES
highline (= 1.6.18)
httparty (~> 0.18)
i18n (~> 0.6.11)
i18n-js (~> 3.7.1)
i18n-js (~> 3.8.0)
immigrant
jquery-migrate-rails
jquery-rails (= 3.1.5)
@@ -768,7 +766,6 @@ DEPENDENCIES
knapsack
letter_opener (>= 1.4.1)
mini_racer (= 0.2.15)
momentjs-rails
money (= 5.1.1)
newrelic_rpm (~> 3.0)
oauth2 (~> 1.4.4)
@@ -810,6 +807,7 @@ DEPENDENCIES
state_machine (= 1.2.0)
stringex (~> 1.5.1)
stripe
test-prof
test-unit (~> 3.3)
timecop
truncate_html (= 0.9.2)

View File

@@ -9,7 +9,7 @@ Supported by the Open Food Foundation and a network of global affiliates, we are
We're part of global movement - get involved!
* Join the conversation [on Slack][slack-invite]. Make sure you introduce yourself in the #general channel.
* Join the conversation [on Slack][slack-invite]. Make sure you introduce yourself in the #general channel and join #dev for all tech-related topics.
* Head to [https://openfoodnetwork.org](https://openfoodnetwork.org) for more information about the global OFN project.
* Check out the [User Guide](https://guide.openfoodnetwork.org/) for a list of features and tutorials.
* Join our [discussion forum](https://community.openfoodnetwork.org).
@@ -20,6 +20,11 @@ If you are interested in contributing to the OFN in any capacity, please introdu
Our [GETTING_STARTED](GETTING_STARTED.md) and [CONTRIBUTING](CONTRIBUTING.md) guides are the best place to start for developers looking to set up a development environment and make contributions to the codebase.
### Hacktoberfest :tada:
Are you participating in [Hacktoberfest](https://hacktoberfest.digitalocean.com/)? Go check out our [Welcome New Developers project board][welcome-dev]! We have curated all issues we consider to be a good starting point for new members of the community and categorized them by skills and level of complexity.
Have a look and pick the one you would prefer working on!
## Provisioning
If you're interested in provisioning a server, see [ofn-install][ofn-install] for the project's Ansible playbooks.
@@ -39,3 +44,4 @@ Copyright (c) 2012 - 2020 Open Food Foundation, released under the AGPL licence.
[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
[welcome-dev]: https://github.com/openfoodfoundation/openfoodnetwork/projects/27

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="15 13 34 38.4" enable-background="new 15 13 34 38.4" xml:space="preserve">
<g>
<polygon fill="#FFFFFF" points="15.5,13.5 48.5,13.5 48.5,50.7 31.6,45.5 15.5,50.7 "/>
<path fill="#999999" d="M48,14v36l-16.4-5L16,50V14H48 M49,13h-1H16h-1v1v36v1.4l1.3-0.4l15.3-5l16.1,5l1.3,0.4V50V14V13L49,13z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -27,14 +27,14 @@
//= require lodash.underscore.js
// spree
//= require spree
//= require admin/spree/spree
//= require admin/spree/spree-select2
//= require modernizr
//= require equalize
//= require css_browser_selector_dev
//= require responsive-tables
//= require admin/spree_paypal_express
//= require admin/handlebar_extensions
//= require handlebars
// OFN specific
//= require_tree ../templates/admin
@@ -71,20 +71,23 @@
//= require textAngular.min.js
//= require i18n/translations
//= require darkswarm/i18n.translate.js
//= require moment
//= require moment/de.js
//= require moment/en-gb.js
//= require moment/es.js
//= require moment/fr.js
//= require moment/it.js
//= require moment/nb.js
//= require moment/pt-br.js
//= require moment/pt.js
//= require moment/ru.js
//= require moment/sv.js
//= require moment/ca.js
//= require moment/ar.js
//= require moment/tr.js
//= require moment/min/moment.min.js
//= require moment/locale/ar.js
//= require moment/locale/ca.js
//= require moment/locale/de.js
//= require moment/locale/en-gb.js
//= require moment/locale/es.js
//= require moment/locale/fil.js
//= require moment/locale/fr.js
//= require moment/locale/it.js
//= require moment/locale/nb.js
//= require moment/locale/nl-be.js
//= require moment/locale/pt-br.js
//= require moment/locale/pt.js
//= require moment/locale/ru.js
//= require moment/locale/sv.js
//= require moment/locale/tr.js
//= require moment/locale/pl.js
// foundation
//= require ../shared/mm-foundation-tpls-0.9.0-20180826174721.min.js

View File

@@ -116,7 +116,8 @@ $.fn.radioControlsVisibilityOfElement = function(dependentElementSelector){
}
$(document).ready(function() {
if (typeof Spree !== 'undefined') {
if (typeof Spree !== 'undefined' &&
typeof Spree.translations !== 'undefined') {
handle_date_picker_fields = function(){
$('.datepicker').datepicker({
dateFormat: Spree.translations.date_picker,

View File

@@ -1,59 +0,0 @@
$(document).ready(function() {
if ($('input#preferences_use_s3[type="checkbox"]:checked').length > 0) {
$('#s3_settings, #s3_headers').show();
}
// Toggle display of S3 settings based on value of use_s3 checkbox
$('input#preferences_use_s3[type="checkbox"]').click(function() {
$('#s3_settings, #s3_headers').toggle();
});
$(document).on('click', '.destroy_style', function(e) {
e.preventDefault();
$(this).parent().remove();
});
$(document).on('click', '.destroy_new_attachment_styles', function(e) {
e.preventDefault();
$(this).closest('.new_attachment_styles').remove();
});
$(document).on('click', '.destroy_new_s3_headers', function(e) {
e.preventDefault();
$(this).closest('.new_s3_headers').remove();
});
// Handle adding new styles
var styles_hash_index = 1;
$(document).on('click', '.add_new_style', function(e) {
e.preventDefault();
$('#new-styles').append(generate_html_for_hash("new_attachment_styles", styles_hash_index));
});
// Handle adding new headers
var headers_hash_index = 1;
$(document).on('click', '.add_header', function(e) {
e.preventDefault();
$('#headers_list').append(generate_html_for_hash("new_s3_headers", headers_hash_index));
});
// Generates html for new paperclip styles form fields
generate_html_for_hash = function(hash_name, index) {
var html = '<div class="' + hash_name + ' row"><div class="field">';
html += '<div class="five columns">';
html += '<label for="' + hash_name + '_' + index + '_name">';
html += Spree.translations.name + '</label>';
html += '<input id="' + hash_name + '_' + index + '_name" name="' + hash_name + '[' + index + '][name]" type="text" class="fullwidth"><br>';
html += '</div><div class="five columns">'
html += '<label for="' + hash_name + '_' + index + '_value">';
html += Spree.translations.value + '</label>';
html += '<input id="' + hash_name + '_' + index + '_value" name="' + hash_name + '[' + index + '][value]" type="text" class="fullwidth">';
html += '</div><div class="two columns">'
html += '<a href="#" title="' + Spree.translations.destroy + '" class="destroy_' + hash_name + ' with-tip button" style="margin-top: 19px;"><i class="icon-trash"></i> &nbsp; ' + Spree.translations.destroy + '</a>';
html += '</div></div></div>';
index += 1;
return html;
};
});

View File

@@ -0,0 +1,13 @@
#= require jsuri
class window.Spree
# Helper function to take a URL and add query parameters to it
@url: (uri, query) ->
if uri.path == undefined
uri = new Uri(uri)
if query
$.each query, (key, value) ->
uri.addQueryParam(key, value)
if Spree.api_key
uri.addQueryParam('token', Spree.api_key)
return uri

View File

@@ -28,20 +28,23 @@
#= require angular-backstretch.js
#= require angular-flash.min.js
#
#= require moment
#= require moment/de.js
#= require moment/en-gb.js
#= require moment/es.js
#= require moment/fr.js
#= require moment/it.js
#= require moment/nb.js
#= require moment/pt-br.js
#= require moment/pt.js
#= require moment/ru.js
#= require moment/sv.js
#= require moment/ca.js
#= require moment/ar.js
#= require moment/tr.js
#= require moment/min/moment.min.js
#= require moment/locale/ar.js
#= require moment/locale/ca.js
#= require moment/locale/de.js
#= require moment/locale/en-gb.js
#= require moment/locale/es.js
#= require moment/locale/fil.js
#= require moment/locale/fr.js
#= require moment/locale/it.js
#= require moment/locale/nb.js
#= require moment/locale/nl-be.js
#= require moment/locale/pt-br.js
#= require moment/locale/pt.js
#= require moment/locale/ru.js
#= require moment/locale/sv.js
#= require moment/locale/tr.js
#= require moment/locale/pl.js
#
#= require modernizr
#

View File

@@ -1,6 +1,6 @@
Darkswarm.controller "ProductNodeCtrl", ($scope, $modal, FilterSelectorsService) ->
$scope.enterprise = $scope.product.supplier # For the modal, so it's consistent
$scope.productPropertySelectors = FilterSelectorsService.createSelectors()
$scope.triggerProductModal = ->
$scope.productPropertySelectors = FilterSelectorsService.createSelectors()
$modal.open(templateUrl: "product_modal.html", scope: $scope)

View File

@@ -68,7 +68,7 @@ Darkswarm.controller "ProductsCtrl", ($scope, $sce, $filter, $rootScope, Product
id: $scope.order_cycle.order_cycle_id,
page: page || $scope.page,
per_page: $scope.per_page,
'q[name_or_meta_keywords_or_supplier_name_cont]': $scope.query,
'q[name_or_meta_keywords_or_variants_display_as_or_variants_display_name_or_supplier_name_cont]': $scope.query,
'q[properties_id_or_supplier_properties_id_in_any][]': $scope.activeProperties,
'q[primary_taxon_id_in_any][]': $scope.activeTaxons
}

View File

@@ -0,0 +1,39 @@
Darkswarm.controller "ShopVariantCtrl", ($scope, $modal, Cart) ->
$scope.$watchGroup [
'variant.line_item.quantity',
'variant.line_item.max_quantity'
], (new_value, old_value) ->
return if old_value[0] == null && new_value[0] == null
Cart.adjust($scope.variant.line_item)
$scope.add = (quantity) ->
item = $scope.variant.line_item
item.quantity += quantity
if $scope.variant.product.group_buy
if item.quantity < 1 || item.max_quantity < item.quantity
item.max_quantity = item.quantity
$scope.addMax = (quantity) ->
item = $scope.variant.line_item
item.max_quantity += quantity
if item.max_quantity < item.quantity
item.quantity = item.max_quantity
$scope.canAdd = (quantity) ->
wantedQuantity = $scope.variant.line_item.quantity + quantity
$scope.quantityValid(wantedQuantity)
$scope.canAddMax = (quantity) ->
variant = $scope.variant
wantedQuantity = variant.line_item.max_quantity + quantity
$scope.quantityValid(wantedQuantity) && variant.line_item.quantity > 0
$scope.quantityValid = (quantity) ->
variant = $scope.variant
minimum = 0
maximum = variant.on_demand && Infinity || variant.on_hand
quantity >= minimum && quantity <= maximum
$scope.addBulk = (quantity) ->
$scope.add(quantity)
$modal.open(templateUrl: "bulk_buy_modal.html", scope: $scope, windowClass: "product-bulk-modal")

View File

@@ -2,7 +2,7 @@ Darkswarm.directive "priceBreakdown", ($tooltip)->
# We use the $tooltip service from Angular foundation to give us boilerplate
# Subsequently we patch the scope, template and restrictions
tooltip = $tooltip 'priceBreakdown', 'priceBreakdown', 'click'
tooltip.scope =
tooltip.scope =
variant: "="
tooltip.templateUrl = "price_breakdown_button.html"
tooltip.replace = true
@@ -15,6 +15,3 @@ Darkswarm.directive 'priceBreakdownPopup', ->
replace: true
templateUrl: 'price_breakdown.html'
scope: false
link: (scope, elem, attrs) ->
scope.expanded = false unless scope.expanded?

View File

@@ -1,10 +0,0 @@
Darkswarm.directive "pricePercentage", ->
restrict: 'E'
replace: true
templateUrl: 'price_percentage.html'
scope:
percentage: '='
link: (scope, elem, attrs) ->
elem.find(".meter").css
width: "#{scope.percentage}%"

View File

@@ -4,10 +4,4 @@ Darkswarm.directive "shopVariant", ->
templateUrl: 'shop_variant.html'
scope:
variant: '='
controller: ($scope, Cart) ->
$scope.$watchGroup [
'variant.line_item.quantity',
'variant.line_item.max_quantity'
], (new_value, old_value) ->
return if old_value[0] == null && new_value[0] == null
Cart.adjust($scope.variant.line_item)
controller: 'ShopVariantCtrl'

View File

@@ -10,7 +10,6 @@ Darkswarm.factory 'Variants', ->
extend: (variant)->
variant.extended_name = @extendedVariantName(variant)
variant.base_price_percentage = Math.round(variant.price / variant.price_with_fees * 100)
variant.line_item ||= @lineItemFor(variant) # line_item may have been initialised in Cart#constructor
variant.line_item.total_price = variant.price_with_fees * variant.line_item.quantity
variant

View File

@@ -0,0 +1,37 @@
.row
.columns.small-12
%h3{"ng-bind" => "::variant.extended_name"}
.row.variant-bulk-buy-price-summary
.columns.small-6
.variant-unit {{ ::variant.unit_to_display }}
.columns.small-6
{{ variant.line_item.total_price | localizeCurrency }}
.row
.columns.small-6
.variant-bulk-buy-quantity-label
{{ "js.shopfront.bulk_buy_modal.min_quantity" | t }}
%div
%button.bulk-buy-add.variant-quantity{type: "button", ng: {click: "add(-1)", disabled: "!canAdd(-1)"}}>
-# U+FF0D Fullwidth Hyphen-Minus
%span.bulk-buy.variant-quantity>
{{ variant.line_item.quantity }}
%button.bulk-buy-add.variant-quantity{type: "button", ng: {click: "add(1)", disabled: "!canAdd(1)"}}
-# U+FF0B Fullwidth Plus Sign
.columns.small-6
.variant-bulk-buy-quantity-label
{{ "js.shopfront.bulk_buy_modal.max_quantity" | t }}
%div
%button.bulk-buy-add.variant-quantity{type: "button", ng: {click: "addMax(-1)", disabled: "!canAddMax(-1)"}}>
-# U+FF0D Fullwidth Hyphen-Minus
%span.bulk-buy.variant-quantity>
{{ variant.line_item.max_quantity }}
%button.bulk-buy-add.variant-quantity{type: "button", ng: {click: "addMax(1)", disabled: "!canAddMax(1)"}}
-# U+FF0B Fullwidth Plus Sign
%ng-include{src: "'partials/close.html'"}

View File

@@ -1,14 +1,16 @@
.small-5.medium-3.large-3.columns.text-right{"ng-if" => "::!variant.product.group_buy"}
%input{type: :number,
integer: true,
value: nil,
min: 0,
placeholder: "0",
"ofn-disable-scroll" => true,
"ng-debounce" => "500",
onwheel: "this.blur()",
"ng-model" => "variant.line_item.quantity",
"ofn-on-hand" => "{{variant.on_demand && 9999 || variant.on_hand }}",
"ng-disabled" => "!variant.on_demand && variant.on_hand == 0",
name: "variants[{{::variant.id}}]", id: "variants_{{::variant.id}}"}
%button.add-variant{type: "button", ng: {if: "!variant.line_item.quantity", click: "add(1)", disabled: "!canAdd(1)"}}
{{ "js.shopfront.variant.add_to_cart" | t }}
%button.variant-quantity{type: "button", ng: {if: "variant.line_item.quantity", click: "add(-1)"}}>
-# U+FF0D Fullwidth Hyphen-Minus
%button.variant-quantity{type: "button", ng: {if: "variant.line_item.quantity", click: "add(1)", disabled: "!canAdd(1)"}}
-# U+FF0B Fullwidth Plus Sign
%br
.variant-quantity-display{ng: {class: "{visible: variant.line_item.quantity}"}}
{{ "js.shopfront.variant.quantity_in_cart" | t:{quantity: variant.line_item.quantity || 0} }}
%input{type: :hidden,
name: "variants[{{::variant.id}}]",
ng: {model: "variant.line_item.quantity"}}

View File

@@ -1,28 +1,17 @@
.small-5.medium-3.large-3.columns.text-right{"ng-if" => "::variant.product.group_buy"}
%span.bulk-input-container
%span.bulk-input
%input.bulk.first{type: :number,
value: nil,
integer: true,
min: 0,
"ng-model" => "variant.line_item.quantity",
placeholder: "{{::'shop_variant_quantity_min' | t}}",
"ofn-disable-scroll" => true,
"ng-debounce" => "500",
onwheel: "this.blur()",
"ofn-on-hand" => "{{variant.on_demand && 9999 || variant.on_hand }}",
name: "variants[{{::variant.id}}]", id: "variants_{{::variant.id}}"}
%span.bulk-input
%input.bulk.second{type: :number,
"ng-disabled" => "!variant.line_item.quantity",
integer: true,
min: 0,
"ng-model" => "variant.line_item.max_quantity",
placeholder: "{{::'shop_variant_quantity_max' | t}}",
"ofn-disable-scroll" => true,
"ng-debounce" => "500",
onwheel: "this.blur()",
min: "{{variant.line_item.quantity}}",
name: "variant_attributes[{{::variant.id}}][max_quantity]",
id: "variants_{{::variant.id}}_max"}
%button.add-variant{type: "button", ng: {if: "!variant.line_item.quantity", click: "addBulk(1)", disabled: "!canAdd(1)"}}
{{ "js.shopfront.variant.add_to_cart" | t }}
%button.bulk-buy.variant-quantity{type: "button", ng: {if: "variant.line_item.quantity", click: "addBulk(0)"}}>
{{ variant.line_item.quantity }}
%button.bulk-buy.variant-quantity{type: "button", ng: {if: "variant.line_item.quantity", click: "addBulk(0)"}}
{{ variant.line_item.max_quantity || "-" }}
%br
.variant-quantity-display{ng: {class: "{visible: variant.line_item.quantity}"}}
{{ "js.shopfront.variant.in_cart" | t }}
%input{type: :hidden,
name: "variants[{{::variant.id}}]",
ng: {model: "variant.line_item.quantity"}}
%input{type: :hidden,
name: "variants[{{::variant.id}}]",
ng: {model: "variant.line_item.max_quantity"}}

View File

@@ -1,37 +1,28 @@
.joyride-tip-guide.price_breakdown{"ng-class" => "{ in: tt_isOpen, fade: tt_animation }"}
%span.joyride-nub.right
.joyride-tip-guide.price_breakdown{ng: {class: "{ in: tt_isOpen, fade: tt_animation }", show: "tt_isOpen"}}
%span.joyride-nub.top
.background{ng: {click: "tt_isOpen = false"}}
.joyride-content-wrapper
.collapsed{"ng-show" => "!expanded"}
%price-percentage{percentage: 'variant.base_price_percentage'}
%a{"ng-click" => "expanded = !expanded"}
%span{"ng-bind" => "::'price_breakdown' | t"}
%i.ofn-i_005-caret-down
.expanded{"ng-show" => "expanded"}
%ul
%li.cost
.right {{ ::variant.price | localizeCurrency }}
%span{"ng-bind" => "::'item_cost' | t"}
%li.admin-fee{"ng-if" => "::variant.fees.admin"}
.right {{ ::variant.fees.admin | localizeCurrency }}
%span{"ng-bind" => "::'admin_fee' | t"}
%li.sales-fee{"ng-if" => "::variant.fees.sales"}
.right {{ ::variant.fees.sales | localizeCurrency }}
%span{"ng-bind" => "::'sales_fee' | t"}
%li.packing-fee{"ng-if" => "::variant.fees.packing"}
.right {{ ::variant.fees.packing | localizeCurrency }}
%span{"ng-bind" => "::'packing_fee' | t"}
%li.transport-fee{"ng-if" => "::variant.fees.transport"}
.right {{ ::variant.fees.transport | localizeCurrency }}
%span{"ng-bind" => "::'transport_fee' | t"}
%li.fundraising-fee{"ng-if" => "::variant.fees.fundraising"}
.right {{ ::variant.fees.fundraising | localizeCurrency }}
%span{"ng-bind" => "::'fundraising_fee' | t"}
%li.total
%strong
.right = {{ ::variant.price_with_fees | localizeCurrency }}
&nbsp;
%a{"ng-click" => "expanded = !expanded"}
%span{"ng-bind" => "::'price_graph' | t"}
%i.ofn-i_006-caret-up
%h6 {{ "js.shopfront.price_breakdown" | t }}
%ul
%li
.right {{ ::variant.price | localizeCurrency }}
%span{"ng-bind" => "::'item_cost' | t"}
%li{"ng-if" => "::variant.fees.admin"}
.right {{ ::variant.fees.admin | localizeCurrency }}
%span{"ng-bind" => "::'admin_fee' | t"}
%li{"ng-if" => "::variant.fees.sales"}
.right {{ ::variant.fees.sales | localizeCurrency }}
%span{"ng-bind" => "::'sales_fee' | t"}
%li{"ng-if" => "::variant.fees.packing"}
.right {{ ::variant.fees.packing | localizeCurrency }}
%span{"ng-bind" => "::'packing_fee' | t"}
%li{"ng-if" => "::variant.fees.transport"}
.right {{ ::variant.fees.transport | localizeCurrency }}
%span{"ng-bind" => "::'transport_fee' | t"}
%li{"ng-if" => "::variant.fees.fundraising"}
.right {{ ::variant.fees.fundraising | localizeCurrency }}
%span{"ng-bind" => "::'fundraising_fee' | t"}
%li
%strong
.right = {{ ::variant.price_with_fees | localizeCurrency }}
&nbsp;

View File

@@ -1,4 +0,0 @@
.progress
.right {{::'fees' | t}}
.meter
{{::'item_cost' | t}}

View File

@@ -1,31 +1,16 @@
.variants.row
.small-12.medium-4.large-4.columns.variant-name
.table-cell
.inline {{ ::variant.name_to_display }}
.bulk-buy.inline{"ng-if" => "::variant.product.group_buy"}
%i.ofn-i_056-bulk><
%em><
\ {{::'bulk' | t}}
.small-4.medium-4.large-6.columns.variant-name
.inline{"ng-if" => "::variant.display_name"} {{ ::variant.display_name }}
.variant-unit {{ ::variant.unit_to_display }}
.small-3.medium-3.large-2.columns.variant-price
%price-breakdown{"price-breakdown" => "_", variant: "variant",
"price-breakdown-append-to-body" => "true",
"price-breakdown-placement" => "bottom",
"price-breakdown-animation" => true}
{{ variant.price_with_fees | localizeCurrency }}
.medium-2.large-1.columns.total-price
%span{"ng-class" => "{filled: variant.line_item.total_price}"}
{{ variant.line_item.total_price | localizeCurrency }}
%ng-include{src: "'partials/shop_variant_no_group_buy.html'"}
%ng-include{src: "'partials/shop_variant_with_group_buy.html'"}
.small-3.medium-1.large-1.columns.variant-unit
.table-cell
%em {{ ::variant.unit_to_display }}
.small-4.medium-2.large-2.columns.variant-price
.table-cell.price
%i.ofn-i_009-close
{{ variant.price_with_fees | localizeCurrency }}
-# Now in a template in app/assets/javascripts/templates !
%price-breakdown{"price-breakdown" => "_", variant: "variant",
"price-breakdown-append-to-body" => "true",
"price-breakdown-placement" => "left",
"price-breakdown-animation" => true}
.small-12.medium-2.large-2.columns.total-price.text-right
.table-cell
%strong{"ng-class" => "{filled: variant.line_item.total_price}"}
{{ variant.line_item.total_price | localizeCurrency }}

View File

@@ -35,7 +35,6 @@
@import 'plugins/font-awesome';
@import 'plugins/select2';
@import 'sections/image_settings';
@import 'sections/orders';
@import 'sections/products';

View File

@@ -1,3 +1,5 @@
@import 'shared/variables/layout';
// -------------------------------------------------------------
// Variables used in all other files
//--------------------------------------------------------------

View File

@@ -29,11 +29,6 @@ html.ie {
z-index: 0;
}
}
// Fix margin-top for destroy paperclip styles background
.destroy_new_attachment_styles {
margin-top: 17px !important;
}
}
// IE8 Hacks

View File

@@ -1,3 +0,0 @@
.destroy_style, .destroy_header {
float: right;
}

View File

@@ -8,23 +8,61 @@
box-sizing: border-box;
}
// Helpers
.block-table {
display: table;
width: 100%;
.admin {
&__section-header {
padding: 15px 0;
background-color: very-light($color-3, 4);
border-bottom: 1px solid $color-border;
.table-cell {
display: table-cell;
vertical-align: middle;
padding: 0 10px;
&:first-child {
padding-left: 0;
width: 70%;
.ofn-drop-down {
border: 0;
background-color: $spree-blue;
color: $color-1;
float: none;
margin-left: 3px;
&:hover,
&.expanded {
border: 0;
color: $color-1;
}
}
&:last-child {
padding-right: 0;
width: 30%;
&__content {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
@media all and (min-width: $tablet_breakpoint) {
flex-wrap: nowrap;
}
}
&__title {
width: 100%;
margin-bottom: 10px;
@media all and (min-width: $tablet_breakpoint) {
margin-bottom: 0;
}
}
&__actions {
display: flex;
flex: 1 0 auto;
align-items: center;
list-style: none;
@media all and (min-width: $tablet_breakpoint) {
justify-content: flex-end;
}
> li {
display: flex;
margin-right: 10px;
&:empty {
display: none;
}
&:last-child {
margin-right: 0;
}
}
}
}
}
@@ -33,12 +71,6 @@
display: none;
}
// For block grids
.frameless {
margin-left: -10px;
margin-right: -10px;
}
// Header
//---------------------------------------------------
#header {
@@ -66,25 +98,6 @@
margin-top: 15px;
}
#content-header {
padding: 15px 0;
background-color: very-light($color-3, 4);
border-bottom: 1px solid $color-border;
.page-title {
font-size: 20px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.page-actions {
text-align: right;
form {
display: inline-block;
}
}
}
// Footer
//---------------------------------------------------
#footer {

View File

@@ -6,93 +6,110 @@
.darkswarm {
// #search
@include placeholder(rgba(0, 0, 0, 0.4), #777);
}
// ordering
product {
input {
@include border-radius(0);
.reveal-modal.product-bulk-modal {
width: 26em;
}
@include csstrans;
// Components to add variants to cart and change quantities
//
// They are not nested so that they can be used in modals.
button.add-variant, button.variant-quantity {
height: 2.5rem;
border-radius: 0;
background-color: $orange-500;
color: white;
// Override foundation button styles:
font-size: 1rem;
margin: 0;
padding: 0;
transition: none;
margin: 0;
width: 10rem;
display: inline;
@include box-shadow(none);
border-color: #b3b3b3;
text-align: right;
@include breakpoint(desktop) {
width: 8rem;
}
@include breakpoint(tablet) {
width: 7rem;
}
@include breakpoint(phablet) {
float: left !important;
font-size: 0.75rem;
padding-left: 0.25rem;
padding-right: 0.25rem;
}
@include breakpoint(mobile) {
width: 5.8rem;
}
&:hover {
@include box-shadow(none);
border-color: #888;
background-color: #fafafa;
}
&:active, &:focus, &.active {
@include box-shadow(none);
background-color: #f9f4b9;
border-color: #666;
}
&:hover {
background-color: $orange-600;
}
&[disabled] {
&:hover, &:focus {
background-color: $orange-500;
}
}
&:nth-of-type(1) {
border-bottom-left-radius: 0.25em;
border-top-left-radius: 0.25em;
}
&:nth-last-of-type(1) {
border-top-right-radius: 0.25em;
border-bottom-right-radius: 0.25em;
}
}
// BULK
button.add-variant {
min-width: 6rem;
padding: 0 1em;
input.bulk {
width: 5rem;
@include breakpoint(desktop) {
width: 4rem;
}
@include breakpoint(tablet) {
width: 3.5rem;
}
@include breakpoint(mobile) {
width: 2.8rem;
}
}
input.bulk.first {
border-right: 0;
}
input.bulk.second {
border-left: 0;
}
.bulk-input-container {
float: right;
@include breakpoint(phablet) {
float: left !important;
}
.bulk-input {
float: left;
}
&[disabled] {
&:hover, &:focus {
background-color: $orange-500;
}
}
}
button.variant-quantity {
width: 3rem;
&:nth-of-type(1):not(.bulk-buy):not(.bulk-buy-add) {
border-right: .1em solid $orange-400;
}
}
.variant-quantity-display {
display: inline-block;
font-size: 0.875em;
margin-top: 0.25em;
text-align: center;
width: 6rem;
visibility: hidden;
&.visible {
visibility: visible;
}
}
button.bulk-buy.variant-quantity {
background-color: transparent;
border: .1em solid $grey-200;
color: inherit;
}
button.bulk-buy-add.variant-quantity {
width: 2.5rem;
&[disabled] {
background-color: $grey-400;
&:hover, &:focus {
background-color: $grey-400;
}
}
}
span.bulk-buy.variant-quantity {
border: .1em solid $grey-200;
height: 2.5rem;
display: inline-block;
min-width: 3em;
padding: .5em;
text-align: center;
vertical-align: top;
}
.variant-bulk-buy-price-summary {
color: $disabled-med;
margin-bottom: 1em;
}
.variant-bulk-buy-quantity-label {
font-size: 0.875rem;
margin-bottom: .5em;
}

View File

@@ -178,7 +178,7 @@ shop ordercycle {
}
shop navigation ordercycle {
margin-top: 3em;
margin-top: 3.4em;
padding: 1em;
height: 7.6em;
position: absolute;

View File

@@ -4,86 +4,69 @@
// Pop over
// Foundation overrides
.joyride-tip-guide.price_breakdown {
width: 16rem;
max-width: 65%;
// JS needs to be tweaked to adjust for left alignment - this is dynamic can't rewrite in CSS
background-color: #999;
color: #1f1f1f;
margin-left: -8px;
margin-left: -7.4rem;
margin-top: 0.1rem;
@include box-shadow(0 1px 2px 0 rgba(0, 0, 0, 0.7));
@include box-shadow(0 2px 8px 0 rgba(0, 0, 0, 0.35));
.joyride-content-wrapper {
padding: 1.125rem 1.25rem 1.5rem;
padding: 1rem;
margin: 1%;
padding: .625rem;
width: 98%;
background-color: white;
}
h1, h2, h3, h4, h5, h6 {
color: #1f1f1f;
}
.joyride-nub.right {
top: 38px;
border-color: #999 !important;
border-top-color: transparent !important;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
}
.progress {
background-color: #13bf85;
padding: 0;
border: none;
background-color: $grey-800;
color: white;
font-size: 0.75rem;
font-style: oblique;
line-height: 1;
height: auto;
.right {
padding: 0.5rem 0.25rem 0 0;
}
.meter {
background-color: #0b8c61;
padding: 0.5rem 0.25rem;
border-right: 1px solid #539f92;
}
}
.expanded {
ul, li {
list-style: none;
margin: 0;
font-size: 0.875rem;
}
h6 {
font-size: 0.937rem;
line-height: 1;
border-bottom: .1em solid $grey-700;
padding: 0 0 .625em 0;
margin-bottom: 2px;
}
li {
background-color: #13bf85;
padding: 0 0.25rem;
margin-bottom: 2px;
color: white;
}
.joyride-nub.top {
left: 7.4rem;
z-index: -1;
}
li.cost {
background-color: #0b8c61;
}
.background {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
cursor: pointer;
}
li:last-child {
margin-bottom: 0.75rem;
}
ul, li {
list-style: none;
margin: 0;
font-size: 0.875rem;
}
li {
line-height: 1;
border-bottom: .1em solid $grey-700;
padding: 0.625rem 0;
margin-bottom: 2px;
}
li:last-child {
border-bottom: 0;
padding-bottom: 0;
}
}
button.graph-button {
// z-index: 9999999
border: 1px solid transparent;
padding: 0;
margin: 0;
display: inline;
display: inline-block;
background-color: rgba(255, 255, 255, 0.5);
padding: 4px;
@include box-shadow(none);
@@ -97,7 +80,6 @@ button.graph-button {
}
&:focus {
border: 1px solid #e0e0e0;
background-color: rgba(255, 255, 255, 1);
&:before {
@@ -107,22 +89,15 @@ button.graph-button {
&:hover, &:active {
background-color: rgba(255, 255, 255, 1);
border: 1px solid transparent;
&:before {
color: $clr-brick-bright;
color: $teal-500;
}
}
@include breakpoint(tablet) {
// Hide for small
display: none;
}
}
button.graph-button.open {
border: 1px solid transparent;
background-color: $clr-brick-bright;
background-color: $teal-500;
&:before {
content: "";

View File

@@ -10,91 +10,57 @@
.columns {
padding-top: 0em;
padding-bottom: 0em;
display: table;
line-height: 1.1;
// outline: 1px solid red
@include breakpoint(tablet) {
font-size: 0.875rem;
}
@include breakpoint(phablet) {
font-size: 0.75rem;
}
}
}
.table-cell {
display: table-cell;
vertical-align: middle;
height: 37px;
.shop-variants {
// product-thumb width + 1rem
padding-left: calc(22.222% + 1rem);
@include breakpoint(phablet) {
padding-left: 0;
clear: left;
}
}
// ROW VARIANTS
.row.variants {
margin-left: 0;
margin-right: 0;
background-color: #ECECEC;
&:hover, &:focus, &:active {
background-color: $clr-brick-light;
}
&:nth-of-type(even) {
background-color: #f9f9f9;
&:hover, &:focus, &:active {
background-color: $clr-brick-ultra-light;
}
}
margin: 0 0 1em 0;
&.out-of-stock {
opacity: 0.2;
}
.variant-name,
.total-price {
padding-top: .74em;
}
.variant-price {
padding-top: .65em;
}
// Variant name
.variant-name {
padding-left: 7.9375rem;
padding-left: 0;
padding-right: 0;
@include breakpoint(tablet) {
padding-left: 4.9375rem;
}
}
.variant-name {
@include breakpoint(phablet) {
background: #333;
color: white;
padding-left: 0.9375rem;
font-weight: bold;
.table-cell {
height: 27px;
}
padding-left: 0.5rem;
}
}
// Variant unit
.variant-unit {
padding-left: 0rem;
padding-right: 0rem;
color: #888;
font-size: 0.875rem;
overflow: hidden;
@include breakpoint(tablet) {
font-size: 0.75rem;
& > *:nth-child(n + 2) {
color: $grey-550;
font-size: 0.875rem;
font-style: italic;
line-height: normal;
}
}
// Variant price
.variant-price {
padding-left: 0.25rem;
padding-right: 0.25rem;
@include breakpoint(phablet) {
text-align: right;
padding-left: 1rem;
}
}
@@ -108,24 +74,16 @@
}
@include breakpoint(phablet) {
background: #777;
color: $disabled-med;
.filled {
color: white;
}
.table-cell {
height: 27px;
}
display: none;
}
}
}
// ROW SUMMARY
.row.summary {
.summary {
margin-left: 0;
margin-right: 0;
margin-bottom: 1.25em;
background: #fff;
.columns {
@@ -140,39 +98,77 @@
}
.summary-header {
padding-left: 7.9375rem;
@include breakpoint(tablet) {
padding-left: 4.9375rem;
}
// product-thumb width + 1rem
padding-left: calc(22.222% + 1rem);
padding-right: 1rem;
@include breakpoint(phablet) {
padding-left: 0.9375rem;
padding-left: calc(33.333% + 1rem);
}
small {
font-size: 80%;
.product-producer {
color: $grey-550;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-style: italic;
a {
color: $teal-500;
&:hover, &:focus, &:active {
color: $teal-600;
text-decoration: underline;
}
}
}
h3 {
font-size: 1.5rem;
margin: 0;
font-size: 1.3rem;
margin-top: 0.75rem;
margin-bottom: 0.6rem;
}
h3 a {
color: #222;
i {
@include csstrans;
font-size: 0.6em;
}
color: $orange-500;
&:hover, &:focus, &:active {
color: $clr-brick;
color: $orange-600;
text-decoration: underline;
}
}
i {
font-size: 0.8em;
.product-description {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-bottom: 0.75rem;
}
.product-properties {
margin: .5em 0;
li {
margin: 0 0.25rem 0.25rem 0;
a {
padding: 0.1em 0.625em;
cursor: auto;
&.has-tip {
cursor: pointer;
font-weight: normal;
}
&:hover, &:focus {
border-color: #ccc;
}
}
// Foundation doesn't show the nub on mobile.
// Repeating the style to show it here.
.nub {
border-color: transparent transparent #333333 transparent;
}
}
}

View File

@@ -1,80 +1,32 @@
@import "mixins";
@import "branding";
@import "animations";
.darkswarm {
products {
product {
.product-thumb {
@include csstrans;
position: absolute;
top: 2px;
left: 0px;
width: 7rem;
height: 7rem;
// Desktop: the product summary is nine columns wide. Use two
// for the image. 100% / 9 * 2 = 22.222% <= 192px
width: calc(22.222%);
float: left;
display: block;
z-index: 1;
background-color: white;
overflow: hidden;
i {
@include csstrans;
transition-delay: 150ms;
position: absolute;
left: 45%;
top: 45%;
z-index: 99999;
color: white;
font-size: 1rem;
opacity: 0;
}
img {
@include csstrans;
opacity: 1;
@include transform-scale(scale(1));
}
&:hover, &:focus, &:active {
background-color: $clr-brick;
i {
left: 32%;
top: 30%;
font-size: 3rem;
opacity: 1;
}
img {
opacity: 0.5;
@include transform-scale(scale(1.1));
}
}
@include breakpoint(tablet) {
top: 2px;
width: 4rem;
height: 4rem;
&:hover, &:focus, &:active {
i {
left: 30%;
top: 30%;
font-size: 2rem;
}
}
}
// Mobile: the summary has full twelve columns and the image
// should take four of them. 100% / 12 * 4 = 33.333% <= 227px
@include breakpoint(phablet) {
display: none;
width: 0rem;
height: 0rem;
width: calc(33.333%);
}
// Make this an anchor for the bulk label.
position: relative;
.product-thumb__bulk-label {
background-color: $grey-700;
color: white;
position: absolute;
right: 0;
top: .8em;
padding: .25em .5em;
}
&:hover {
filter: brightness(96%);
}
}
}

View File

@@ -1,47 +0,0 @@
@import "mixins";
.darkswarm {
products {
product {
.taxon-flag {
background: transparent image-url("flag.svg") top center no-repeat;
background-size: 34px 39px;
min-height: 40px;
width: 34px;
margin-top: -1.1rem;
padding-top: 0.25rem;
z-index: 999999;
@include breakpoint(mobile) {
background-size: 28px 32px;
min-height: 32px;
width: 28px;
}
render-svg {
svg {
width: 24px;
height: 24px;
path {
fill: #999;
}
}
}
@include breakpoint(tablet) {
margin-top: -0.85rem;
}
@include breakpoint(mobile) {
render-svg {
svg {
width: 18px;
height: 18px;
}
}
}
}
}
}
}

View File

@@ -11,7 +11,6 @@ $ofn-grey: #808184;
$clr-brick: #c1122b;
$clr-brick-light: #f5e6e7;
$clr-brick-light-trans: rgba(245, 230, 231, 0.9);
$clr-brick-ultra-light: #faf5f6;
$clr-brick-bright: #eb4c46;
$clr-brick-med-bright: #e5a2a0;
$clr-brick-light-bright: #f5c4c9;
@@ -48,6 +47,7 @@ $grey-200: #ddd;
$grey-300: #ccc;
$grey-400: #bbb;
$grey-500: #999;
$grey-550: #888;
$grey-600: #777;
$grey-650: #666;
$grey-700: #555;
@@ -56,6 +56,7 @@ $grey-800: #333;
$teal-300: #80d3df;
$teal-400: #4cb5c5;
$teal-500: #0096ad;
$teal-600: #007a9a;
$orange-400: #ff9466;
$orange-450: #f4704c;

View File

@@ -59,13 +59,6 @@ body.embedded {
line-height: $large-menu-height;
height: $large-menu-height;
vertical-align: top;
&.cart {
div.joyride-tip-guide { // Cart Dropdown
top: 75px;
overflow: visible;
}
}
}
}

View File

@@ -16,6 +16,22 @@
.active_table_row {
line-height: 1rem;
@include breakpoint(phablet) {
display: inline-block;
width: 100%;
background-color: rgba($white, 0.75);
&:not(.open) {
.columns:last-child {
padding-left: 0;
}
}
a.hub {
display: inline-block;
}
}
}
//Generic text link style
@@ -44,13 +60,6 @@
}
}
//Hub Link
@include breakpoint(phablet) {
a.hub {
display: block;
}
}
//Hub Name
span.hub-name-listing {
font-weight: 700;
@@ -67,11 +76,11 @@
.active_table_row {
border: 1px solid transparent;
@include breakpoint(phablet) {
border-color: $clr-brick-light;
&:hover, &:active, &:focus {
border-color: $clr-brick-light-bright;
}
&:hover, &:active, &:focus {
@include breakpoint(phablet) {
border-color: $clr-brick-light-bright;
}
}
@@ -165,8 +174,9 @@
}
@include breakpoint(phablet) {
.active_table_row:first-child .skinny-head {
background-color: rgba(255, 255, 255, 0.85);
.active_table_row:first-child,
.active_table_row:last-child, {
background-color: rgba($white, 0.75);
}
}
}

View File

@@ -1,4 +1,5 @@
// Note this mixin file is used in ADMIN and FRONTEND
@import 'shared/variables/layout';
@import "branding";
@@ -141,57 +142,6 @@
// Background options \\
@mixin darkbg {
background-color: $clr-brick;
&, & * {
color: white;
}
a {
color: $clr-brick-ultra-light;
&:hover {
text-decoration: none;
color: $clr-brick-light;
}
}
}
@mixin lightbg {
background-color: $clr-brick-light;
&, & * {
color: black;
}
a {
color: $clr-brick;
&:hover {
text-decoration: none;
color: $clr-brick-bright;
}
}
}
@mixin turqbg {
background-color: $clr-turquoise-light;
&, & * {
color: $clr-turquoise;
}
a {
color: $clr-turquoise;
&:hover {
text-decoration: none;
color: $clr-turquoise-bright;
}
}
}
@mixin fullbg {
background-position: center center;
background-repeat: no-repeat;
@@ -201,12 +151,6 @@
background-size: cover;
}
@mixin fullwidthbg {
background-position: center top;
background-repeat: no-repeat;
background-size: 100% auto;
}
@mixin gradient($gradient-clr1, $gradient-clr2) {
background: $gradient-clr1;
@@ -258,15 +202,15 @@
@mixin breakpoint($point) {
@if $point == desktop {
@media all and (max-width: 1024px) { @content; }
@media all and (max-width: $desktop_breakpoint) { @content; }
}
@else if $point == tablet {
@media all and (max-width: 768px) { @content; }
@media all and (max-width: $tablet_breakpoint) { @content; }
}
@else if $point == phablet {
@media all and (max-width: 640px) { @content; }
@media all and (max-width: $phablet_breakpoint) { @content; }
}
@else if $point == mobile {
@media all and (max-width: 480px) { @content; }
@media all and (max-width: $mobile_breakpoint) { @content; }
}
}

View File

@@ -5,6 +5,11 @@
.active_table .active_table_node {
// Header row
@include breakpoint(phablet) {
.active_table_row {
display: inline-block;
width: 100%;
}
.skinny-head {
background-color: $clr-turquoise-light;

View File

@@ -8,10 +8,30 @@
@import "shop-inputs";
@import "shop-navigation";
@import "shop-product-rows";
@import "shop-taxon-flag";
@import "shop-popovers";
.darkswarm {
.product-listing {
@include breakpoint(desktop) {
padding-right: 0;
padding-left: 0;
}
.row.full {
width: 100%;
margin: 0;
.columns.full {
padding-right: 0;
padding-left: 0;
}
}
}
.filter-header {
margin-top: 1.1em;
}
products {
display: block;
@@ -51,32 +71,18 @@
product {
@include csstrans;
border-bottom: 1px solid #e5e5e5;
border-top: 1px solid #e5e5e5;
// Avoid margin collapsing which breaks the flush alignment of the first
// image.
overflow: auto;
&:nth-child(n + 2) {
border-top: 1px solid $grey-100;
}
padding-bottom: 1px;
margin-bottom: 20px !important;
position: relative;
display: block;
color: $med-drk-grey;
&:hover, &:focus, &:active {
border-bottom: 1px solid $clr-brick-med-bright;
border-top: 1px solid $clr-brick-med-bright;
}
// BULK
.bulk-buy {
font-size: 0.875rem;
@include breakpoint(tablet) {
font-size: 0.75rem;
}
}
.bulk-buy, .bulk-buy i {
color: #888;
}
.inline {
display: inline;
}
@@ -85,27 +91,6 @@
width: 100px;
margin-bottom: 20px;
}
// ICONS
i {
font-size: 0.75em;
padding-right: 0.9375rem;
@include breakpoint(phablet) {
padding-right: 0.25rem;
}
}
i.ofn-i_056-bulk {
font-size: 1rem;
padding-right: 0rem;
}
i.ofn-i_036-producers {
padding-left: 0.2rem;
padding-right: 0rem;
font-size: 0.8rem;
}
}
}

View File

@@ -6,7 +6,6 @@
background-color: $grey-100;
height: 5em;
padding: 1em 0;
margin-bottom: 1em;
position: relative;
z-index: 5;
@@ -50,7 +49,7 @@
button {
background-color: $grey-600;
margin-left: 1em;
margin: 0 0 0 1em;
height: 3em;
width: 7em;
padding: 0;

View File

@@ -34,7 +34,7 @@
>a {
outline: none;
display: block;
color: $grey-500;
color: $black;
font-family: "Oswald", sans-serif;
}
@@ -42,9 +42,9 @@
@include headingFont;
background: transparent;
text-transform: uppercase;
text-transform: capitalize;
line-height: 1;
font-size: 0.875em;
font-size: 1em;
padding: 1em 2em;
border: none;
@@ -58,6 +58,7 @@
@include breakpoint(phablet) {
padding: 0.35em 0 0.65em 0;
font-size: 0.875em;
}
}

View File

@@ -159,11 +159,6 @@ a.button.large {
display: flex;
}
.no-gutter {
padding-right: 0;
padding-left: 0;
}
.disable-scroll {
overflow: hidden;
}

View File

@@ -0,0 +1,6 @@
// Breakpoints
$desktop_breakpoint: 1024px;
$tablet_breakpoint: 768px;
$phablet_breakpoint: 640px;
$mobile_breakpoint: 480px;

View File

@@ -73,7 +73,7 @@ module Admin
if @enterprise.update(attributes)
flash[:success] = I18n.t(:enterprise_register_success_notice, enterprise: @enterprise.name)
redirect_to admin_dashboard_path
redirect_to spree.admin_dashboard_path
else
flash[:error] = I18n.t(:enterprise_register_error, enterprise: @enterprise.name)
render :welcome, layout: "spree/layouts/bare_admin"

View File

@@ -75,7 +75,7 @@ module Api
end
def permitted_ransack_params
[:name_or_meta_keywords_or_supplier_name_cont,
[:name_or_meta_keywords_or_variants_display_as_or_variants_display_name_or_supplier_name_cont,
:properties_id_or_supplier_properties_id_in_any,
:primary_taxon_id_in_any]
end

View File

@@ -1,6 +1,7 @@
# frozen_string_literal: true
require 'open_food_network/address_finder'
require 'spree/core/gateway_error'
class CheckoutController < Spree::StoreController
layout 'darkswarm'
@@ -47,8 +48,6 @@ class CheckoutController < Spree::StoreController
params_adapter = Checkout::FormDataAdapter.new(permitted_params, @order, spree_current_user)
return action_failed unless @order.update(params_adapter.params[:order])
fire_event('spree.checkout.update')
checkout_workflow(params_adapter.shipping_method_id)
rescue Spree::Core::GatewayError => e
rescue_from_spree_gateway_error(e)
@@ -150,7 +149,7 @@ class CheckoutController < Spree::StoreController
def handle_redirect_from_stripe
if OrderWorkflow.new(@order).next && order_complete?
checkout_succeeded
redirect_to(order_path(@order)) && return
redirect_to(spree.order_path(@order)) && return
else
checkout_failed
end
@@ -210,10 +209,10 @@ class CheckoutController < Spree::StoreController
def update_succeeded_response
respond_to do |format|
format.html do
respond_with(@order, location: order_path(@order))
respond_with(@order, location: spree.order_path(@order))
end
format.json do
render json: { path: order_path(@order) }, status: :ok
render json: { path: spree.order_path(@order) }, status: :ok
end
end
end

View File

@@ -17,7 +17,7 @@ module Spree
end
flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:general_settings))
redirect_to edit_admin_general_settings_path
redirect_to spree.edit_admin_general_settings_path
end
end
end

View File

@@ -1,79 +0,0 @@
module Spree
module Admin
class ImageSettingsController < Spree::Admin::BaseController
def edit
@styles = ActiveSupport::JSON.decode(Spree::Config[:attachment_styles])
@headers = ActiveSupport::JSON.decode(Spree::Config[:s3_headers])
end
def update
update_styles(params)
update_headers(params) if Spree::Config[:use_s3]
Spree::Config.set(params[:preferences])
update_paperclip_settings
respond_to do |format|
format.html {
flash[:success] = Spree.t(:image_settings_updated)
redirect_to spree.edit_admin_image_settings_path
}
end
end
private
def update_styles(params)
if params[:new_attachment_styles].present?
params[:new_attachment_styles].each do |_index, style|
params[:attachment_styles][style[:name]] = style[:value] if style[:value].present?
end
end
styles = params[:attachment_styles]
Spree::Config[:attachment_styles] = ActiveSupport::JSON.encode(styles) unless styles.nil?
end
def update_headers(params)
if params[:new_s3_headers].present?
params[:new_s3_headers].each do |_index, header|
params[:s3_headers][header[:name]] = header[:value] if header[:value].present?
end
end
headers = params[:s3_headers]
Spree::Config[:s3_headers] = ActiveSupport::JSON.encode(headers) unless headers.nil?
end
def update_paperclip_settings
if Spree::Config[:use_s3]
s3_creds = { access_key_id: Spree::Config[:s3_access_key],
secret_access_key: Spree::Config[:s3_secret],
bucket: Spree::Config[:s3_bucket] }
Spree::Image.attachment_definitions[:attachment][:storage] = :s3
Spree::Image.attachment_definitions[:attachment][:s3_credentials] = s3_creds
Spree::Image.attachment_definitions[:attachment][:s3_headers] =
ActiveSupport::JSON.decode(Spree::Config[:s3_headers])
Spree::Image.attachment_definitions[:attachment][:bucket] = Spree::Config[:s3_bucket]
else
Spree::Image.attachment_definitions[:attachment].delete :storage
end
Spree::Image.attachment_definitions[:attachment][:styles] =
ActiveSupport::JSON.decode(Spree::Config[:attachment_styles]).symbolize_keys!
Spree::Image.attachment_definitions[:attachment][:path] = Spree::Config[:attachment_path]
Spree::Image.attachment_definitions[:attachment][:default_url] =
Spree::Config[:attachment_default_url]
Spree::Image.attachment_definitions[:attachment][:default_style] =
Spree::Config[:attachment_default_style]
# Spree stores attachent definitions in JSON. This converts the style name and format to
# strings. However, when paperclip encounters these, it doesn't recognise the format.
# Here we solve that problem by converting format and style name to symbols.
Spree::Image.reformat_styles
end
end
end
end

View File

@@ -61,7 +61,7 @@ module Spree
private
def location_after_save
admin_product_images_url(@product)
spree.admin_product_images_url(@product)
end
def load_data

View File

@@ -23,7 +23,7 @@ module Spree
rescue StandardError => e
flash[:error] = Spree.t('admin.mail_methods.testmail.error') % { e: e }
ensure
redirect_to edit_admin_mail_methods_url
redirect_to spree.edit_admin_mail_methods_url
end
private

View File

@@ -27,7 +27,7 @@ module Spree
@order.shipments.map(&:refresh_rates)
flash[:success] = Spree.t('customer_details_updated')
redirect_to admin_order_customer_path(@order)
redirect_to spree.admin_order_customer_path(@order)
else
render action: :edit
end

View File

@@ -29,7 +29,7 @@ module Spree
@order = Order.create
@order.created_by = spree_current_user
@order.save
redirect_to edit_admin_order_url(@order)
redirect_to spree.edit_admin_order_url(@order)
end
def edit
@@ -48,16 +48,16 @@ module Spree
if @order.line_items.empty?
@order.errors.add(:line_items, Spree.t('errors.messages.blank'))
end
return redirect_to(edit_admin_order_path(@order),
return redirect_to(spree.edit_admin_order_path(@order),
flash: { error: @order.errors.full_messages.join(', ') })
end
@order.update!
if @order.complete?
redirect_to edit_admin_order_path(@order)
redirect_to spree.edit_admin_order_path(@order)
else
# Jump to next step if order is not complete
redirect_to admin_order_customer_path(@order)
redirect_to spree.admin_order_customer_path(@order)
end
end
@@ -91,7 +91,9 @@ module Spree
Spree::OrderMailer.invoice_email(@order.id, pdf).deliver
flash[:success] = t('admin.orders.invoice_email_sent')
respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } }
respond_with(@order) { |format|
format.html { redirect_to spree.edit_admin_order_path(@order) }
}
end
def print
@@ -131,7 +133,9 @@ module Spree
flash[:error] = t(:must_have_valid_business_number,
enterprise_name: @order.distributor.name)
respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } }
respond_with(@order) { |format|
format.html { redirect_to spree.edit_admin_order_path(@order) }
}
end
def load_distribution_choices

View File

@@ -22,7 +22,7 @@ module Spree
if @payment_method.save
invoke_callbacks(:create, :after)
flash[:success] = Spree.t(:successfully_created, resource: Spree.t(:payment_method))
redirect_to edit_admin_payment_method_path(@payment_method)
redirect_to spree.edit_admin_payment_method_path(@payment_method)
else
invoke_callbacks(:create, :fails)
respond_with(@payment_method)
@@ -43,7 +43,7 @@ module Spree
if @payment_method.update(params_for_update)
invoke_callbacks(:update, :after)
flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:payment_method))
redirect_to edit_admin_payment_method_path(@payment_method)
redirect_to spree.edit_admin_payment_method_path(@payment_method)
else
invoke_callbacks(:update, :fails)
respond_with(@payment_method)
@@ -122,7 +122,7 @@ module Spree
return if valid_payment_methods.include?(params[:payment_method][:type])
flash[:error] = Spree.t(:invalid_payment_provider)
redirect_to new_admin_payment_method_path
redirect_to spree.new_admin_payment_method_path
end
def load_hubs

View File

@@ -12,7 +12,7 @@ module Spree
def index
@payments = @order.payments
redirect_to new_admin_order_payment_url(@order) if @payments.empty?
redirect_to spree.new_admin_order_payment_url(@order) if @payments.empty?
end
def new
@@ -25,7 +25,7 @@ module Spree
begin
unless @payment.save
redirect_to admin_order_payments_path(@order)
redirect_to spree.admin_order_payments_path(@order)
return
end
@@ -35,16 +35,16 @@ module Spree
@payment.process!
flash[:success] = flash_message_for(@payment, :successfully_created)
redirect_to admin_order_payments_path(@order)
redirect_to spree.admin_order_payments_path(@order)
else
OrderWorkflow.new(@order).complete!
flash[:success] = Spree.t(:new_order_completed)
redirect_to edit_admin_order_url(@order)
redirect_to spree.edit_admin_order_url(@order)
end
rescue Spree::Core::GatewayError => e
flash[:error] = e.message.to_s
redirect_to new_admin_order_payment_path(@order)
redirect_to spree.new_admin_order_payment_path(@order)
end
end
@@ -118,7 +118,7 @@ module Spree
return if @order.payment? || @order.complete?
flash[:notice] = Spree.t(:fill_in_customer_info)
redirect_to edit_admin_order_customer_url(@order)
redirect_to spree.edit_admin_order_customer_url(@order)
end
def load_order

View File

@@ -29,9 +29,9 @@ module Spree
if @object.save
flash[:success] = flash_message_for(@object, :successfully_created)
if params[:button] == "add_another"
redirect_to new_admin_product_path
redirect_to spree.new_admin_product_path
else
redirect_to admin_products_path
redirect_to spree.admin_products_path
end
else
render :new
@@ -70,7 +70,7 @@ module Spree
flash[:success] = flash_message_for(@object, :successfully_updated)
end
redirect_to edit_admin_product_url(@object, @url_filters)
redirect_to spree.edit_admin_product_url(@object, @url_filters)
end
end
@@ -97,7 +97,7 @@ module Spree
Spree.t('notice_messages.product_not_cloned')
end
redirect_to edit_admin_product_url(@new)
redirect_to spree.edit_admin_product_url(@new)
end
def group_buy_options

View File

@@ -74,7 +74,7 @@ module Spree
end
def location_after_save
edit_admin_shipping_method_path(@shipping_method)
spree.edit_admin_shipping_method_path(@shipping_method)
end
def load_data
@@ -84,13 +84,13 @@ module Spree
def permitted_resource_params
params.require(:shipping_method).permit(
:name, :description, :display_on,
:require_ship_address, :tag_list, :calculator_type,
:name, :description, :display_on, :require_ship_address, :tag_list, :calculator_type,
distributor_ids: [],
calculator_attributes: [
:id, :preferred_currency, :preferred_amount, :preferred_per_kg, :preferred_flat_percent,
:preferred_first_item, :preferred_additional_item, :preferred_max_items,
:preferred_minimal_amount, :preferred_normal_amount, :preferred_discount_amount
:id, :preferred_currency, :preferred_amount, :preferred_unit_from_list,
:preferred_per_unit, :preferred_flat_percent, :preferred_first_item,
:preferred_additional_item, :preferred_max_items, :preferred_minimal_amount,
:preferred_normal_amount, :preferred_discount_amount
]
)
end

View File

@@ -14,7 +14,7 @@ module Spree
protected
def location_after_save
admin_country_states_url(@country)
spree.admin_country_states_url(@country)
end
def collection

View File

@@ -3,9 +3,6 @@ module Spree
class TaxRatesController < ResourceController
before_action :load_data
update.after :update_after
create.after :create_after
private
def load_data
@@ -14,14 +11,6 @@ module Spree
@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
def permitted_resource_params
params.require(:tax_rate).permit(
:name, :amount, :included_in_price, :zone_id,

View File

@@ -6,7 +6,7 @@ module Spree
respond_to do |format|
format.html {
redirect_to edit_admin_tax_settings_path
redirect_to spree.edit_admin_tax_settings_path
}
end
end

View File

@@ -11,9 +11,9 @@ module Spree
def location_after_save
if @taxonomy.created_at == @taxonomy.updated_at
edit_admin_taxonomy_url(@taxonomy)
spree.edit_admin_taxonomy_url(@taxonomy)
else
admin_taxonomies_url
spree.admin_taxonomies_url
end
end

View File

@@ -15,9 +15,9 @@ module Spree
respond_with(@taxon) do |format|
format.html do
if redirect_to @taxonomy
edit_admin_taxonomy_url(@taxonomy)
spree.edit_admin_taxonomy_url(@taxonomy)
else
admin_taxonomies_url
spree.admin_taxonomies_url
end
end
end
@@ -95,7 +95,7 @@ module Spree
end
respond_with(@taxon) do |format|
format.html { redirect_to edit_admin_taxonomy_url(@taxonomy) }
format.html { redirect_to spree.edit_admin_taxonomy_url(@taxonomy) }
format.json { render json: @taxon.to_json }
end
end

View File

@@ -60,14 +60,14 @@ module Spree
if @user.generate_spree_api_key!
flash[:success] = t('spree.api.key_generated')
end
redirect_to edit_admin_user_path(@user)
redirect_to spree.edit_admin_user_path(@user)
end
def clear_api_key
if @user.clear_spree_api_key!
flash[:success] = t('spree.api.key_cleared')
end
redirect_to edit_admin_user_path(@user)
redirect_to spree.edit_admin_user_path(@user)
end
protected

View File

@@ -61,17 +61,21 @@ module Spree
@url_filters = ::ProductFilters.new.extract(request.query_parameters)
@variant = Spree::Variant.find(params[:id])
flash[:success] = if VariantDeleter.new.delete(@variant)
Spree.t('notice_messages.variant_deleted')
else
Spree.t('notice_messages.variant_not_deleted')
end
flash[:success] = delete_variant
redirect_to admin_product_variants_url(params[:product_id], @url_filters)
redirect_to spree.admin_product_variants_url(params[:product_id], @url_filters)
end
protected
def delete_variant
if VariantDeleter.new.delete(@variant)
Spree.t('notice_messages.variant_deleted')
else
Spree.t('notice_messages.variant_not_deleted')
end
end
def create_before
option_values = params[:new_variant]
option_values.andand.each_value { |id| @object.option_values << OptionValue.find(id) }

View File

@@ -3,8 +3,8 @@
require 'cancan'
require 'spree/core/controller_helpers/auth'
require 'spree/core/controller_helpers/respond_with'
require 'spree/core/controller_helpers/common'
require 'spree/core/controller_helpers/ssl'
require 'spree/core/controller_helpers/common'
module Spree
class BaseController < ApplicationController

View File

@@ -48,10 +48,10 @@ module Spree
else
flash[:error] = I18n.t(:card_could_not_be_removed)
end
redirect_to account_path(anchor: 'cards')
redirect_to spree.account_path(anchor: 'cards')
rescue Stripe::CardError
flash[:error] = I18n.t(:card_could_not_be_removed)
redirect_to account_path(anchor: 'cards')
redirect_to spree.account_path(anchor: 'cards')
end
private

View File

@@ -78,11 +78,7 @@ module Spree
discard_empty_line_items
with_open_adjustments { update_totals_and_taxes }
if @order == current_order
fire_event('spree.order.contents_changed')
else
@order.update_distribution_charge!
end
@order.update_distribution_charge!
respond_with(@order) do |format|
format.html do
@@ -90,7 +86,7 @@ module Spree
@order.next_transition.run_callbacks if @order.cart?
redirect_to checkout_state_path(@order.checkout_steps.first)
elsif @order.complete?
redirect_to order_path(@order)
redirect_to spree.order_path(@order)
else
redirect_to main_app.cart_path
end
@@ -157,7 +153,7 @@ module Spree
else
flash[:error] = I18n.t(:orders_could_not_cancel)
end
redirect_to request.referer || order_path(@order)
redirect_to request.referer || spree.order_path(@order)
end
private
@@ -221,7 +217,7 @@ module Spree
if items.empty?
flash[:error] = I18n.t(:orders_cannot_remove_the_final_item)
redirect_to order_path(order_to_update)
redirect_to spree.order_path(order_to_update)
end
end

View File

@@ -7,7 +7,7 @@ require "spree/core/controller_helpers/ssl"
module Spree
class UserPasswordsController < Devise::PasswordsController
helper 'spree/base', 'spree/store'
helper 'spree/base'
include Spree::Core::ControllerHelpers::Auth
include Spree::Core::ControllerHelpers::Common

View File

@@ -7,7 +7,7 @@ require "spree/core/controller_helpers/ssl"
module Spree
class UserRegistrationsController < Devise::RegistrationsController
helper 'spree/base', 'spree/store'
helper 'spree/base'
include Spree::Core::ControllerHelpers::Auth
include Spree::Core::ControllerHelpers::Common

View File

@@ -7,7 +7,7 @@ require "spree/core/controller_helpers/ssl"
module Spree
class UserSessionsController < Devise::SessionsController
helper 'spree/base', 'spree/store'
helper 'spree/base'
include Spree::Core::ControllerHelpers::Auth
include Spree::Core::ControllerHelpers::Common

View File

@@ -1,21 +0,0 @@
module Admin
module ImageSettingsHelper
def admin_image_settings_format_options
[['Unchanged', ''], ['PNG', 'png'], ['JPEG', 'jpg']]
end
def admin_image_settings_geometry_from_style(style)
geometry, _format = admin_image_settings_split_style style
geometry
end
def admin_image_settings_format_from_style(style)
_geometry, format = admin_image_settings_split_style style
format
end
def admin_image_settings_split_style(style)
[style, nil].flatten[0..1]
end
end
end

View File

@@ -45,14 +45,14 @@ module Spree
end
end
def preference_field_for(form, field, options)
def preference_field_for(form, field, options, object)
case options[:type]
when :integer
form.text_field(field, preference_field_options(options))
when :boolean
form.check_box(field, preference_field_options(options))
when :string
form.text_field(field, preference_field_options(options))
preference_field_for_text_field(form, field, options, object)
when :password
form.password_field(field, preference_field_options(options))
when :text
@@ -62,6 +62,21 @@ module Spree
end
end
# Here we show a text field for all string fields except when the field name ends in
# "_from_list", in that case we render a dropdown.
# In this specific case, to render the dropdown, the object provided must have a method named
# like "#{field}_values" that returns an array with the string options to be listed.
def preference_field_for_text_field(form, field, options, object)
if field.end_with?('_from_list') && object.respond_to?("#{field}_values")
list_values = object.__send__("#{field}_values")
selected_value = object.__send__(field)
form.select(field, options_for_select(list_values, selected_value),
preference_field_options(options))
else
form.text_field(field, preference_field_options(options))
end
end
def preference_field_options(options)
field_options = case options[:type]
when :integer
@@ -91,13 +106,21 @@ module Spree
)
end
# maps each preference to a hash containing the label and field html.
# E.g. { :label => "<label>...", :field => "<select>..." }
def preference_fields(object, form)
return unless object.respond_to?(:preferences)
object.preferences.keys.map{ |key|
form.label("preferred_#{key}", Spree.t(key) + ": ") +
preference_field_for(form, "preferred_#{key}", type: object.preference_type(key))
}.join("<br />").html_safe
object.preferences.keys.map { |key|
preference_label = form.label("preferred_#{key}",
Spree.t(key.to_s.gsub("_from_list", "")) + ": ").html_safe
preference_field = preference_field_for(
form,
"preferred_#{key}",
{ type: object.preference_type(key) }, object
).html_safe
{ label: preference_label, field: preference_field }
}
end
def link_to_add_fields(name, target, options = {})

View File

@@ -3,16 +3,30 @@ require 'spree/localized_number'
module Calculator
class Weight < Spree::Calculator
extend Spree::LocalizedNumber
preference :per_kg, :decimal, default: 0.0
localize_number :preferred_per_kg
preference :unit_from_list, :string, default: "kg"
preference :per_unit, :decimal, default: 0.0
localize_number :preferred_per_unit
def self.description
I18n.t('spree.weight')
end
def set_preference(name, value)
if name == :unit_from_list && !["kg", "lb"].include?(value)
calculable.errors.add(:preferred_unit_from_list, I18n.t(:calculator_preferred_unit_error))
else
__send__ self.class.preference_setter_method(name), value
end
end
def compute(object)
line_items = line_items_for object
(total_weight(line_items) * preferred_per_kg).round(2)
(total_weight(line_items) * preferred_per_unit).round(2)
end
def preferred_unit_from_list_values
["kg", "lb"]
end
private
@@ -33,8 +47,8 @@ module Calculator
def weight_per_variant(line_item)
if variant_unit(line_item) == 'weight'
# The calculator price is per_kg so we need to convert unit_value to kg
convert_g_to_kg(line_item.variant.andand.unit_value)
# Convert unit_value to the preferred unit
convert_weight(line_item.variant.andand.unit_value)
else
line_item.variant.andand.weight || 0
end
@@ -42,8 +56,8 @@ module Calculator
def weight_per_final_weight_volume(line_item)
if variant_unit(line_item) == 'weight'
# The calculator price is per_kg so we need to convert final_weight_volume to kg
convert_g_to_kg(line_item.final_weight_volume)
# Convert final_weight_volume to the preferred unit
convert_weight(line_item.final_weight_volume)
else
weight_per_variant(line_item) * quantity_implied_in_final_weight_volume(line_item)
end
@@ -66,10 +80,14 @@ module Calculator
line_item.variant.product.andand.variant_unit
end
def convert_g_to_kg(value)
return 0 unless value
def convert_weight(value)
return 0 unless value && ["kg", "lb"].include?(preferences[:unit_from_list])
value / 1000
if preferences[:unit_from_list] == "kg"
value / 1000
elsif preferences[:unit_from_list] == "lb"
value / 453.6
end
end
end
end

View File

@@ -1,5 +1,6 @@
require 'open_food_network/locking'
require 'open_food_network/permalink_generator'
require 'spree/core/s3_support'
class EnterpriseGroup < ActiveRecord::Base
include PermalinkGenerator

View File

@@ -253,7 +253,7 @@ module ProductImport
products.flat_map(&:variants).each do |existing_variant|
unit_scale = existing_variant.product.variant_unit_scale
unscaled_units = entry.unscaled_units || 0
unscaled_units = entry.unscaled_units.to_f || 0
entry.unit_value = unscaled_units * unit_scale unless unit_scale.nil?
if entry_matches_existing_variant?(entry, existing_variant)

366
app/models/spree/ability.rb Normal file
View File

@@ -0,0 +1,366 @@
# frozen_string_literal: true
require 'cancan'
module Spree
class Ability
include CanCan::Ability
def initialize(user)
clear_aliased_actions
# override cancan default aliasing (we don't want to differentiate between read and index)
alias_action :delete, to: :destroy
alias_action :edit, to: :update
alias_action :new, to: :create
alias_action :new_action, to: :create
alias_action :show, to: :read
user ||= Spree.user_class.new
if user.respond_to?(:has_spree_role?) && user.has_spree_role?('admin')
can :manage, :all
else
can [:index, :read], Country
can [:index, :read], OptionType
can [:index, :read], OptionValue
can :create, Order
can :read, Order do |order, token|
order.user == user || order.token && token == order.token
end
can :update, Order do |order, token|
order.user == user || order.token && token == order.token
end
can [:index, :read], Product
can [:index, :read], ProductProperty
can [:index, :read], Property
can :create, Spree.user_class
can [:read, :update, :destroy], Spree.user_class, id: user.id
can [:index, :read], State
can [:index, :read], StockItem
can [:index, :read], StockLocation
can [:index, :read], StockMovement
can [:index, :read], Taxon
can [:index, :read], Taxonomy
can [:index, :read], Variant
can [:index, :read], Zone
end
add_shopping_abilities user
add_base_abilities user if new_user? user
add_enterprise_management_abilities user if can_manage_enterprises? user
add_group_management_abilities user if can_manage_groups? user
add_product_management_abilities user if can_manage_products? user
add_order_cycle_management_abilities user if can_manage_order_cycles? user
add_order_management_abilities user if can_manage_orders? user
add_relationship_management_abilities user if can_manage_relationships? user
end
# New users have no enterprises.
def new_user?(user)
user.enterprises.blank?
end
# Users can manage an enterprise if they have one.
def can_manage_enterprises?(user)
user.enterprises.present?
end
# Users can manage a group if they have one.
def can_manage_groups?(user)
user.owned_groups.present?
end
# Users can manage products if they have an enterprise that is not a profile.
def can_manage_products?(user)
can_manage_enterprises?(user) &&
user.enterprises.any? { |e| e.category != :hub_profile && e.producer_profile_only != true }
end
# Users can manage order cycles if they manage a sells own/any enterprise
# OR if they manage a producer which is included in any order cycles
def can_manage_order_cycles?(user)
can_manage_orders?(user) ||
OrderCycle.visible_by(user).any?
end
# Users can manage orders if they have a sells own/any enterprise.
def can_manage_orders?(user)
( user.enterprises.map(&:sells) & %w(own any) ).any?
end
def can_manage_relationships?(user)
can_manage_enterprises? user
end
def add_shopping_abilities(user)
can [:destroy], Spree::LineItem do |item|
user == item.order.user &&
item.order.changes_allowed?
end
can [:cancel], Spree::Order do |order|
order.user == user
end
can [:update, :destroy], Spree::CreditCard do |credit_card|
credit_card.user == user
end
can [:update], Customer do |customer|
customer.user == user
end
end
# New users can create an enterprise, and gain other permissions from doing this.
def add_base_abilities(_user)
can [:create], Enterprise
end
def add_group_management_abilities(user)
can [:admin, :index], :overview
can [:admin, :index], EnterpriseGroup
can [:read, :edit, :update], EnterpriseGroup do |group|
user.owned_groups.include? group
end
end
def add_enterprise_management_abilities(user)
# We perform authorize! on (:create, nil) when creating a new order from admin,
# and also (:search, nil) when searching for variants to add to the order
can [:create, :search], nil
can [:admin, :index], :overview
can [:admin, :index, :read, :create, :edit, :update_positions, :destroy], ProducerProperty
can [:admin, :map_by_tag, :destroy], TagRule do |tag_rule|
user.enterprises.include? tag_rule.enterprise
end
can [:admin, :index, :create], Enterprise
can [:read, :edit, :update,
:remove_logo, :remove_promo_image, :remove_terms_and_conditions,
:bulk_update, :resend_confirmation], Enterprise do |enterprise|
OpenFoodNetwork::Permissions.new(user).editable_enterprises.include? enterprise
end
can [:welcome, :register], Enterprise do |enterprise|
enterprise.owner == user
end
can [:manage_payment_methods,
:manage_shipping_methods,
:manage_enterprise_fees], Enterprise do |enterprise|
user.enterprises.include? enterprise
end
# All enterprises can have fees, though possibly suppliers don't need them?
can [:index, :create], EnterpriseFee
can [:admin, :read, :edit, :bulk_update, :destroy], EnterpriseFee do |enterprise_fee|
user.enterprises.include? enterprise_fee.enterprise
end
can [:admin, :known_users, :customers], :search
can [:admin, :show], :account
# For printing own account invoice orders
can [:print], Spree::Order do |order|
order.user == user
end
can [:admin, :bulk_update], ColumnPreference do |column_preference|
column_preference.user == user
end
can [:admin, :connect, :status, :destroy], StripeAccount do |stripe_account|
user.enterprises.include? stripe_account.enterprise
end
can [:admin, :create], :manager_invitation
end
def add_product_management_abilities(user)
# Enterprise User can only access products that they are a supplier for
can [:create], Spree::Product
can [:admin, :read, :index, :update,
:seo, :group_buy_options,
:bulk_update, :clone, :delete,
:destroy], Spree::Product do |product|
OpenFoodNetwork::Permissions.new(user).managed_product_enterprises.include? product.supplier
end
can [:create], Spree::Variant
can [:admin, :index, :read, :edit,
:update, :search, :delete, :destroy], Spree::Variant do |variant|
OpenFoodNetwork::Permissions.new(user).
managed_product_enterprises.include? variant.product.supplier
end
can [:admin, :index, :read, :update, :bulk_update, :bulk_reset], VariantOverride do |vo|
next false unless vo.hub.present? && vo.variant.andand.product.andand.supplier.present?
hub_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_hubs.
include? vo.hub
producer_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_producers.
include? vo.variant.product.supplier
hub_auth && producer_auth
end
can [:admin, :create, :update], InventoryItem do |ii|
next false unless ii.enterprise.present? &&
ii.variant.andand.product.andand.supplier.present?
hub_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_hubs.
include? ii.enterprise
producer_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_producers.
include? ii.variant.product.supplier
hub_auth && producer_auth
end
can [:admin, :index, :read, :create,
:edit, :update_positions, :destroy], Spree::ProductProperty
can [:admin, :index, :read, :create, :edit, :update, :destroy], Spree::Image
can [:admin, :index, :read, :search], Spree::Taxon
can [:admin, :index, :read, :create, :edit], Spree::Classification
can [:admin, :index, :guide, :import, :save, :save_data,
:validate_data, :reset_absent_products], ProductImport::ProductImporter
# Reports page
can [:admin, :index, :customers, :orders_and_distributors, :group_buys, :payments,
:orders_and_fulfillment, :products_and_inventory, :order_cycle_management, :packing],
Spree::Admin::ReportsController
add_bulk_coop_abilities
add_enterprise_fee_summary_abilities
end
def add_order_cycle_management_abilities(user)
can [:admin, :index, :read, :edit, :update, :incoming, :outgoing], OrderCycle do |order_cycle|
OrderCycle.visible_by(user).include? order_cycle
end
can [:admin, :index, :create], Schedule
can [:admin, :update, :destroy], Schedule do |schedule|
OpenFoodNetwork::Permissions.new(user).editable_schedules.include? schedule
end
can [:bulk_update, :clone, :destroy, :notify_producers], OrderCycle do |order_cycle|
user.enterprises.include? order_cycle.coordinator
end
can [:for_order_cycle], Enterprise
can [:for_order_cycle], EnterpriseFee
end
def add_order_management_abilities(user)
can [:index, :create], Spree::Order
can [:read, :update, :fire, :resend, :invoice, :print, :print_ticket], Spree::Order do |order|
# We allow editing orders with a nil distributor as this state occurs
# during the order creation process from the admin backend
order.distributor.nil? ||
# Enterprise User can access orders that they are a distributor for
user.enterprises.include?(order.distributor) ||
# Enterprise User can access orders that are placed inside a OC they coordinate
order.order_cycle.andand.coordinated_by?(user)
end
can [:admin, :bulk_management, :managed], Spree::Order do
user.admin? || user.enterprises.any?(&:is_distributor)
end
can [:admin, :create, :show, :poll], :invoice
can [:admin, :visible], Enterprise
can [:admin, :index, :create, :update, :destroy], :line_item
can [:admin, :index, :create], Spree::LineItem
can [:destroy, :update], Spree::LineItem do |item|
order = item.order
user.admin? ||
user.enterprises.include?(order.distributor) ||
order.order_cycle.andand.coordinated_by?(user)
end
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::Payment
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::Shipment
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::Adjustment
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::ReturnAuthorization
can [:destroy], Spree::Adjustment do |adjustment|
if user.admin?
true
elsif adjustment.adjustable.instance_of? Spree::Order
order = adjustment.adjustable
user.enterprises.include?(order.distributor) ||
order.order_cycle.andand.coordinated_by?(user)
elsif adjustment.adjustable.instance_of? Spree::LineItem
order = adjustment.adjustable.order
user.enterprises.include?(order.distributor) ||
order.order_cycle.andand.coordinated_by?(user)
end
end
can [:create], OrderCycle
can [:admin, :index, :read, :create, :edit, :update], ExchangeVariant
can [:admin, :index, :read, :create, :edit, :update], Exchange
can [:admin, :index, :read, :create, :edit, :update], ExchangeFee
# Enterprise user can only access payment and shipping methods for their distributors
can [:index, :create], Spree::PaymentMethod
can [:admin, :read, :update, :fire, :resend,
:destroy, :show_provider_preferences], Spree::PaymentMethod do |payment_method|
(user.enterprises & payment_method.distributors).any?
end
can [:index, :create], Spree::ShippingMethod
can [:admin, :read, :update, :destroy], Spree::ShippingMethod do |shipping_method|
(user.enterprises & shipping_method.distributors).any?
end
# Reports page
can [:admin, :index, :customers, :group_buys, :sales_tax, :payments,
:orders_and_distributors, :orders_and_fulfillment, :products_and_inventory,
:order_cycle_management, :xero_invoices], Spree::Admin::ReportsController
add_bulk_coop_abilities
add_enterprise_fee_summary_abilities
can [:create], Customer
can [:admin, :index, :update,
:destroy, :show], Customer, enterprise_id: Enterprise.managed_by(user).pluck(:id)
can [:admin, :new, :index], Subscription
can [:create, :edit, :update, :cancel, :pause, :unpause], Subscription do |subscription|
user.enterprises.include?(subscription.shop)
end
can [:admin, :build], SubscriptionLineItem
can [:destroy], SubscriptionLineItem do |subscription_line_item|
user.enterprises.include?(subscription_line_item.subscription.shop)
end
can [:admin, :edit, :cancel, :resume], ProxyOrder do |proxy_order|
user.enterprises.include?(proxy_order.subscription.shop)
end
end
def add_relationship_management_abilities(user)
can [:admin, :index, :create], EnterpriseRelationship
can [:destroy], EnterpriseRelationship do |enterprise_relationship|
user.enterprises.include? enterprise_relationship.parent
end
end
def add_bulk_coop_abilities
# Reveal the report link in spree/admin/reports#index
can [:bulk_coop], Spree::Admin::ReportsController
# Allow direct access to the report resource
can [:admin, :new, :create], :bulk_coop
end
def add_enterprise_fee_summary_abilities
# Reveal the report link in spree/admin/reports#index
can [:enterprise_fee_summary], Spree::Admin::ReportsController
# Allow direct access to the report resource
can [:admin, :new, :create], :enterprise_fee_summary
end
end
end

View File

@@ -1,313 +0,0 @@
class AbilityDecorator
include CanCan::Ability
# All abilites are allocated from this initialiser.
# Spree also defines other abilities.
def initialize(user)
add_shopping_abilities user
add_base_abilities user if is_new_user? user
add_enterprise_management_abilities user if can_manage_enterprises? user
add_group_management_abilities user if can_manage_groups? user
add_product_management_abilities user if can_manage_products? user
add_order_cycle_management_abilities user if can_manage_order_cycles? user
add_order_management_abilities user if can_manage_orders? user
add_relationship_management_abilities user if can_manage_relationships? user
end
# New users have no enterprises.
def is_new_user?(user)
user.enterprises.blank?
end
# Users can manage an enterprise if they have one.
def can_manage_enterprises?(user)
user.enterprises.present?
end
# Users can manage a group if they have one.
def can_manage_groups?(user)
user.owned_groups.present?
end
# Users can manage products if they have an enterprise that is not a profile.
def can_manage_products?(user)
can_manage_enterprises?(user) &&
user.enterprises.any? { |e| e.category != :hub_profile && e.producer_profile_only != true }
end
# Users can manage order cycles if they manage a sells own/any enterprise
# OR if they manage a producer which is included in any order cycles
def can_manage_order_cycles?(user)
can_manage_orders?(user) ||
OrderCycle.visible_by(user).any?
end
# Users can manage orders if they have a sells own/any enterprise.
def can_manage_orders?(user)
( user.enterprises.map(&:sells) & %w(own any) ).any?
end
def can_manage_relationships?(user)
can_manage_enterprises? user
end
def add_shopping_abilities(user)
can [:destroy], Spree::LineItem do |item|
user == item.order.user &&
item.order.changes_allowed?
end
can [:cancel], Spree::Order do |order|
order.user == user
end
can [:update, :destroy], Spree::CreditCard do |credit_card|
credit_card.user == user
end
can [:update], Customer do |customer|
customer.user == user
end
end
# New users can create an enterprise, and gain other permissions from doing this.
def add_base_abilities(_user)
can [:create], Enterprise
end
def add_group_management_abilities(user)
can [:admin, :index], :overview
can [:admin, :index], EnterpriseGroup
can [:read, :edit, :update], EnterpriseGroup do |group|
user.owned_groups.include? group
end
end
def add_enterprise_management_abilities(user)
# Spree performs authorize! on (:create, nil) when creating a new order from admin, and also (:search, nil)
# when searching for variants to add to the order
can [:create, :search], nil
can [:admin, :index], :overview
can [:admin, :index, :read, :create, :edit, :update_positions, :destroy], ProducerProperty
can [:admin, :map_by_tag, :destroy], TagRule do |tag_rule|
user.enterprises.include? tag_rule.enterprise
end
can [:admin, :index, :create], Enterprise
can [:read, :edit, :update,
:remove_logo, :remove_promo_image, :remove_terms_and_conditions,
:bulk_update, :resend_confirmation], Enterprise do |enterprise|
OpenFoodNetwork::Permissions.new(user).editable_enterprises.include? enterprise
end
can [:welcome, :register], Enterprise do |enterprise|
enterprise.owner == user
end
can [:manage_payment_methods, :manage_shipping_methods, :manage_enterprise_fees], Enterprise do |enterprise|
user.enterprises.include? enterprise
end
# All enterprises can have fees, though possibly suppliers don't need them?
can [:index, :create], EnterpriseFee
can [:admin, :read, :edit, :bulk_update, :destroy], EnterpriseFee do |enterprise_fee|
user.enterprises.include? enterprise_fee.enterprise
end
can [:admin, :known_users, :customers], :search
can [:admin, :show], :account
# For printing own account invoice orders
can [:print], Spree::Order do |order|
order.user == user
end
can [:admin, :bulk_update], ColumnPreference do |column_preference|
column_preference.user == user
end
can [:admin, :connect, :status, :destroy], StripeAccount do |stripe_account|
user.enterprises.include? stripe_account.enterprise
end
can [:admin, :create], :manager_invitation
end
def add_product_management_abilities(user)
# Enterprise User can only access products that they are a supplier for
can [:create], Spree::Product
can [:admin, :read, :index, :update,
:seo, :group_buy_options,
:bulk_update, :clone, :delete,
:destroy], Spree::Product do |product|
OpenFoodNetwork::Permissions.new(user).managed_product_enterprises.include? product.supplier
end
can [:create], Spree::Variant
can [:admin, :index, :read, :edit, :update, :search, :delete, :destroy], Spree::Variant do |variant|
OpenFoodNetwork::Permissions.new(user).managed_product_enterprises.include? variant.product.supplier
end
can [:admin, :index, :read, :update, :bulk_update, :bulk_reset], VariantOverride do |vo|
next false unless vo.hub.present? && vo.variant.andand.product.andand.supplier.present?
hub_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_hubs.
include? vo.hub
producer_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_producers.
include? vo.variant.product.supplier
hub_auth && producer_auth
end
can [:admin, :create, :update], InventoryItem do |ii|
next false unless ii.enterprise.present? && ii.variant.andand.product.andand.supplier.present?
hub_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_hubs.
include? ii.enterprise
producer_auth = OpenFoodNetwork::Permissions.new(user).
variant_override_producers.
include? ii.variant.product.supplier
hub_auth && producer_auth
end
can [:admin, :index, :read, :create, :edit, :update_positions, :destroy], Spree::ProductProperty
can [:admin, :index, :read, :create, :edit, :update, :destroy], Spree::Image
can [:admin, :index, :read, :search], Spree::Taxon
can [:admin, :index, :read, :create, :edit], Spree::Classification
can [:admin, :index, :guide, :import, :save, :save_data, :validate_data, :reset_absent_products], ProductImport::ProductImporter
# Reports page
can [:admin, :index, :customers, :orders_and_distributors, :group_buys, :payments,
:orders_and_fulfillment, :products_and_inventory, :order_cycle_management, :packing],
Spree::Admin::ReportsController
add_bulk_coop_abilities
add_enterprise_fee_summary_abilities
end
def add_order_cycle_management_abilities(user)
can [:admin, :index, :read, :edit, :update, :incoming, :outgoing], OrderCycle do |order_cycle|
OrderCycle.visible_by(user).include? order_cycle
end
can [:admin, :index, :create], Schedule
can [:admin, :update, :destroy], Schedule do |schedule|
OpenFoodNetwork::Permissions.new(user).editable_schedules.include? schedule
end
can [:bulk_update, :clone, :destroy, :notify_producers], OrderCycle do |order_cycle|
user.enterprises.include? order_cycle.coordinator
end
can [:for_order_cycle], Enterprise
can [:for_order_cycle], EnterpriseFee
end
def add_order_management_abilities(user)
can [:index, :create], Spree::Order
can [:read, :update, :fire, :resend, :invoice, :print, :print_ticket], Spree::Order do |order|
# We allow editing orders with a nil distributor as this state occurs
# during the order creation process from the admin backend
order.distributor.nil? ||
# Enterprise User can access orders that they are a distributor for
user.enterprises.include?(order.distributor) ||
# Enterprise User can access orders that are placed inside a OC they coordinate
order.order_cycle.andand.coordinated_by?(user)
end
can [:admin, :bulk_management, :managed], Spree::Order do
user.admin? || user.enterprises.any?(&:is_distributor)
end
can [:admin, :create, :show, :poll], :invoice
can [:admin, :visible], Enterprise
can [:admin, :index, :create, :update, :destroy], :line_item
can [:admin, :index, :create], Spree::LineItem
can [:destroy, :update], Spree::LineItem do |item|
order = item.order
user.admin? || user.enterprises.include?(order.distributor) || order.order_cycle.andand.coordinated_by?(user)
end
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::Payment
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::Shipment
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::Adjustment
can [:admin, :index, :read, :create, :edit, :update, :fire], Spree::ReturnAuthorization
can [:destroy], Spree::Adjustment do |adjustment|
# Sharing code with destroying a line item. This should be unified and probably applied for other actions as well.
if user.admin?
true
elsif adjustment.adjustable.instance_of? Spree::Order
order = adjustment.adjustable
user.enterprises.include?(order.distributor) || order.order_cycle.andand.coordinated_by?(user)
elsif adjustment.adjustable.instance_of? Spree::LineItem
order = adjustment.adjustable.order
user.enterprises.include?(order.distributor) || order.order_cycle.andand.coordinated_by?(user)
end
end
can [:create], OrderCycle
can [:admin, :index, :read, :create, :edit, :update], ExchangeVariant
can [:admin, :index, :read, :create, :edit, :update], Exchange
can [:admin, :index, :read, :create, :edit, :update], ExchangeFee
# Enterprise user can only access payment and shipping methods for their distributors
can [:index, :create], Spree::PaymentMethod
can [:admin, :read, :update, :fire, :resend, :destroy, :show_provider_preferences], Spree::PaymentMethod do |payment_method|
(user.enterprises & payment_method.distributors).any?
end
can [:index, :create], Spree::ShippingMethod
can [:admin, :read, :update, :destroy], Spree::ShippingMethod do |shipping_method|
(user.enterprises & shipping_method.distributors).any?
end
# Reports page
can [:admin, :index, :customers, :group_buys, :sales_tax, :payments,
:orders_and_distributors, :orders_and_fulfillment, :products_and_inventory,
:order_cycle_management, :xero_invoices], Spree::Admin::ReportsController
add_bulk_coop_abilities
add_enterprise_fee_summary_abilities
can [:create], Customer
can [:admin, :index, :update, :destroy, :show], Customer, enterprise_id: Enterprise.managed_by(user).pluck(:id)
can [:admin, :new, :index], Subscription
can [:create, :edit, :update, :cancel, :pause, :unpause], Subscription do |subscription|
user.enterprises.include?(subscription.shop)
end
can [:admin, :build], SubscriptionLineItem
can [:destroy], SubscriptionLineItem do |subscription_line_item|
user.enterprises.include?(subscription_line_item.subscription.shop)
end
can [:admin, :edit, :cancel, :resume], ProxyOrder do |proxy_order|
user.enterprises.include?(proxy_order.subscription.shop)
end
end
def add_relationship_management_abilities(user)
can [:admin, :index, :create], EnterpriseRelationship
can [:destroy], EnterpriseRelationship do |enterprise_relationship|
user.enterprises.include? enterprise_relationship.parent
end
end
def add_bulk_coop_abilities
# Reveal the report link in spree/admin/reports#index
can [:bulk_coop], Spree::Admin::ReportsController
# Allow direct access to the report resource
can [:admin, :new, :create], :bulk_coop
end
def add_enterprise_fee_summary_abilities
# Reveal the report link in spree/admin/reports#index
can [:enterprise_fee_summary], Spree::Admin::ReportsController
# Allow direct access to the report resource
can [:admin, :new, :create], :enterprise_fee_summary
end
end
Spree::Ability.register_ability(AbilityDecorator)

View File

@@ -0,0 +1,148 @@
# frozen_string_literal: true
# This is the primary location for defining spree preferences
#
# This file allows us to add global configuration variables, which
# we can allow to be modified in the UI by adding appropriate form
# elements to existing or new configuration pages.
#
# The expectation is that this is created once and stored in
# the spree environment
#
# setters:
# a.color = :blue
# a[:color] = :blue
# a.set :color = :blue
# a.preferred_color = :blue
#
# getters:
# a.color
# a[:color]
# a.get :color
# a.preferred_color
#
module Spree
class AppConfiguration < Preferences::Configuration
# Should state/state_name be required
preference :address_requires_state, :boolean, default: true
preference :admin_interface_logo, :string, default: 'ofn-logo.png'
preference :admin_products_per_page, :integer, default: 10
# Should only be true if you don't need to track inventory
preference :allow_backorder_shipping, :boolean, default: false
preference :allow_checkout_on_gateway_error, :boolean, default: false
preference :allow_guest_checkout, :boolean, default: true
preference :allow_ssl_in_development_and_test, :boolean, default: false
preference :allow_ssl_in_production, :boolean, default: true
preference :allow_ssl_in_staging, :boolean, default: true
# Automatically capture the credit card (as opposed to just authorize and capture later)
preference :auto_capture, :boolean, default: false
# Replace with the name of a zone if you would like to limit the countries
preference :checkout_zone, :string, default: nil
preference :currency, :string, default: "USD"
preference :currency_decimal_mark, :string, default: "."
preference :currency_symbol_position, :string, default: "before"
preference :currency_thousands_separator, :string, default: ","
preference :display_currency, :boolean, default: false
preference :default_country_id, :integer
preference :default_meta_description, :string, default: 'OFN demo site'
preference :default_meta_keywords, :string, default: 'ofn, demo'
preference :default_seo_title, :string, default: ''
preference :hide_cents, :boolean, default: false
preference :layout, :string, default: 'darkswarm'
preference :logo, :string, default: 'ofn-logo.png'
# Maximum nesting level in taxons menu
preference :max_level_in_taxons_menu, :integer, default: 1
preference :orders_per_page, :integer, default: 15
preference :prices_inc_tax, :boolean, default: false
preference :products_per_page, :integer, default: 12
preference :redirect_https_to_http, :boolean, default: false
preference :require_master_price, :boolean, default: true
preference :shipment_inc_vat, :boolean, default: false
# Request instructions/info for shipping
preference :shipping_instructions, :boolean, default: false
# Displays variant full price or difference with product price.
preference :show_variant_full_price, :boolean, default: false
preference :show_products_without_price, :boolean, default: false
preference :show_raw_product_description, :boolean, default: false
preference :site_name, :string, default: 'OFN Demo Site'
preference :site_url, :string, default: 'demo.openfoodnetwork.org'
preference :tax_using_ship_address, :boolean, default: true
# Determines whether to track on_hand values for variants / products.
preference :track_inventory_levels, :boolean, default: true
# Preferences related to image settings
preference :attachment_default_url, :string,
default: '/spree/products/:id/:style/:basename.:extension'
preference :attachment_path, :string,
default: ':rails_root/public/spree/products/:id/:style/:basename.:extension'
preference :attachment_url, :string,
default: '/spree/products/:id/:style/:basename.:extension'
preference :attachment_styles, :string,
default: "{\"mini\":\"48x48>\",\"small\":\"100x100>\",\"product\":\"240x240>\",\"large\":\"600x600>\"}"
preference :attachment_default_style, :string, default: 'product'
preference :s3_access_key, :string
preference :s3_bucket, :string
preference :s3_secret, :string
preference :s3_headers, :string, default: "{\"Cache-Control\":\"max-age=31557600\"}"
preference :use_s3, :boolean, default: false # Use S3 for images rather than the file system
preference :s3_protocol, :string
preference :s3_host_alias, :string
# Default mail headers settings
preference :enable_mail_delivery, :boolean, default: false
preference :mails_from, :string, default: 'ofn@example.com'
preference :mail_bcc, :string, default: 'ofn@example.com'
preference :intercept_email, :string, default: nil
# Default smtp settings
preference :override_actionmailer_config, :boolean, default: true
preference :mail_host, :string, default: 'localhost'
preference :mail_domain, :string, default: 'localhost'
preference :mail_port, :integer, default: 25
preference :secure_connection_type, :string,
default: Core::MailSettings::SECURE_CONNECTION_TYPES[0]
preference :mail_auth_type, :string, default: Core::MailSettings::MAIL_AUTH[0]
preference :smtp_username, :string
preference :smtp_password, :string
# Embedded Shopfronts
preference :enable_embedded_shopfronts, :boolean, default: false
preference :embedded_shopfronts_whitelist, :text, default: nil
# Legal Preferences
preference :footer_tos_url, :string, default: "/Terms-of-service.pdf"
preference :enterprises_require_tos, :boolean, default: false
preference :privacy_policy_url, :string, default: nil
preference :cookies_consent_banner_toggle, :boolean, default: false
preference :cookies_policy_matomo_section, :boolean, default: false
# Tax Preferences
preference :products_require_tax_category, :boolean, default: false
preference :shipping_tax_rate, :decimal, default: 0
# Monitoring
preference :last_job_queue_heartbeat_at, :string, default: nil
# External services
preference :bugherd_api_key, :string, default: nil
preference :matomo_url, :string, default: nil
preference :matomo_site_id, :string, default: nil
preference :matomo_tag_manager_url, :string, default: nil
# Invoices & Receipts
preference :enable_invoices?, :boolean, default: true
preference :invoice_style2?, :boolean, default: false
preference :enable_receipt_printing?, :boolean, default: false
# Stripe Connect
preference :stripe_connect_enabled, :boolean, default: false
# Number localization
preference :enable_localized_number?, :boolean, default: false
# Enable cache
preference :enable_products_cache?, :boolean,
default: (Rails.env.production? || Rails.env.staging?)
end
end

View File

@@ -1,44 +0,0 @@
Spree::AppConfiguration.class_eval do
# This file decorates the existing preferences file defined by Spree.
# It allows us to add our own global configuration variables, which
# we can allow to be modified in the UI by adding appropriate form
# elements to existing or new configuration pages.
# Embedded Shopfronts
preference :enable_embedded_shopfronts, :boolean, default: false
preference :embedded_shopfronts_whitelist, :text, default: nil
# Legal Preferences
preference :footer_tos_url, :string, default: "/Terms-of-service.pdf"
preference :enterprises_require_tos, :boolean, default: false
preference :privacy_policy_url, :string, default: nil
preference :cookies_consent_banner_toggle, :boolean, default: false
preference :cookies_policy_matomo_section, :boolean, default: false
# Tax Preferences
preference :products_require_tax_category, :boolean, default: false
preference :shipping_tax_rate, :decimal, default: 0
# Monitoring
preference :last_job_queue_heartbeat_at, :string, default: nil
# External services
preference :bugherd_api_key, :string, default: nil
preference :matomo_url, :string, default: nil
preference :matomo_site_id, :string, default: nil
preference :matomo_tag_manager_url, :string, default: nil
# Invoices & Receipts
preference :enable_invoices?, :boolean, default: true
preference :invoice_style2?, :boolean, default: false
preference :enable_receipt_printing?, :boolean, default: false
# Stripe Connect
preference :stripe_connect_enabled, :boolean, default: false
# Number localization
preference :enable_localized_number?, :boolean, default: false
# Enable cache
preference :enable_products_cache?, :boolean, default: (Rails.env.production? || Rails.env.staging?)
end

View File

@@ -1,5 +1,8 @@
# frozen_string_literal: true
require 'concerns/payment_method_distributors'
require 'spree/core/delegate_belongs_to'
module Spree
class Gateway < PaymentMethod
include PaymentMethodDistributors

View File

@@ -5,13 +5,19 @@ module Spree
validates_attachment_presence :attachment
validate :no_attachment_errors
# This is where the styles are used in the app:
# - mini: used in the BackOffice: Bulk Product Edit page and Order Cycle edit page
# - small: used in the FrontOffice: Product List page
# - product: used in the BackOffice: Product Image upload modal in the Bulk Product Edit page
# and Product image edit page
# - large: used in the FrontOffice: product modal
has_attached_file :attachment,
styles: { mini: '48x48>', small: '100x100>',
product: '240x240>', large: '600x600>' },
styles: { mini: "48x48#", small: "227x227#",
product: "240x240>", large: "600x600>" },
default_style: :product,
url: '/spree/products/:id/:style/:basename.:extension',
path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
convert_options: { all: '-strip -auto-orient -colorspace RGB' }
convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
# save the w,h of the original image (from which others can be calculated)
# we need to look at the write-queue for images which have not been saved yet
@@ -20,15 +26,6 @@ module Spree
include Spree::Core::S3Support
supports_s3 :attachment
Spree::Image.attachment_definitions[:attachment][:styles] =
ActiveSupport::JSON.decode(Spree::Config[:attachment_styles]).symbolize_keys!
Spree::Image.attachment_definitions[:attachment][:path] = Spree::Config[:attachment_path]
Spree::Image.attachment_definitions[:attachment][:url] = Spree::Config[:attachment_url]
Spree::Image.attachment_definitions[:attachment][:default_url] =
Spree::Config[:attachment_default_url]
Spree::Image.attachment_definitions[:attachment][:default_style] =
Spree::Config[:attachment_default_style]
# used by admin products autocomplete
def mini_url
attachment.url(:mini, false)
@@ -51,26 +48,26 @@ module Spree
false
end
# Spree stores attachent definitions in JSON. This converts the style name and format to
# strings. However, when paperclip encounters these, it doesn't recognise the format.
# Here we solve that problem by converting format and style name to symbols.
# See also: ImageSettingsController decorator.
#
# eg. {'mini' => ['48x48>', 'png']} is converted to {mini: ['48x48>', :png]}
def self.format_styles(styles)
styles_a = styles.map do |name, style|
style[1] = style[1].to_sym if style.is_a? Array
[name.to_sym, style]
def self.set_attachment_attributes(attribute_name, attribute_value)
attachment_definitions[:attachment][attribute_name] = attribute_value
end
def self.set_s3_attachment_definitions
if Spree::Config[:use_s3]
set_attachment_attributes(:storage, :s3)
set_attachment_attributes(:s3_credentials, s3_credentials)
set_attachment_attributes(:s3_headers,
ActiveSupport::JSON.decode(Spree::Config[:s3_headers]))
set_attachment_attributes(:bucket, Spree::Config[:s3_bucket])
else
attachment_definitions[:attachment].delete :storage
end
Hash[styles_a]
end
def self.reformat_styles
Spree::Image.attachment_definitions[:attachment][:styles] =
format_styles(Spree::Image.attachment_definitions[:attachment][:styles])
def self.s3_credentials
{ access_key_id: Spree::Config[:s3_access_key],
secret_access_key: Spree::Config[:s3_secret],
bucket: Spree::Config[:s3_bucket] }
end
reformat_styles
end
end

View File

@@ -0,0 +1,71 @@
# frozen_string_literal: true
module Spree
class InventoryUnit < ActiveRecord::Base
belongs_to :variant, class_name: "Spree::Variant"
belongs_to :order, class_name: "Spree::Order"
belongs_to :shipment, class_name: "Spree::Shipment"
belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization"
scope :backordered, -> { where state: 'backordered' }
scope :shipped, -> { where state: 'shipped' }
scope :backordered_per_variant, ->(stock_item) do
includes(:shipment)
.where("spree_shipments.state != 'canceled'").references(:shipment)
.where(variant_id: stock_item.variant_id)
.backordered.order("#{table_name}.created_at ASC")
end
# state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
state_machine initial: :on_hand do
event :fill_backorder do
transition to: :on_hand, from: :backordered
end
after_transition on: :fill_backorder, do: :update_order
event :ship do
transition to: :shipped, if: :allow_ship?
end
event :return do
transition to: :returned, from: :shipped
end
end
# This was refactored from a simpler query because the previous implementation
# lead to issues once users tried to modify the objects returned. That's due
# to ActiveRecord `joins(shipment: :stock_location)` only return readonly
# objects
#
# Returns an array of backordered inventory units as per a given stock item
def self.backordered_for_stock_item(stock_item)
backordered_per_variant(stock_item).select do |unit|
unit.shipment.stock_location == stock_item.stock_location
end
end
def self.finalize_units!(inventory_units)
inventory_units.map { |iu| iu.update_column(:pending, false) }
end
def find_stock_item
Spree::StockItem.find_by(stock_location_id: shipment.stock_location_id,
variant_id: variant_id)
end
# Remove variant default_scope `deleted_at: nil`
def variant
Spree::Variant.unscoped { super }
end
private
def allow_ship?
Spree::Config[:allow_backorder_shipping] || on_hand?
end
def update_order
order.update!
end
end
end

View File

@@ -0,0 +1,264 @@
# frozen_string_literal: true
require 'open_food_network/scope_variant_to_hub'
require 'variant_units/variant_and_line_item_naming'
module Spree
class LineItem < ActiveRecord::Base
include VariantUnits::VariantAndLineItemNaming
include LineItemBasedAdjustmentHandling
belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items
belongs_to :variant, class_name: "Spree::Variant"
belongs_to :tax_category, class_name: "Spree::TaxCategory"
has_one :product, through: :variant
has_many :adjustments, as: :adjustable, dependent: :destroy
has_and_belongs_to_many :option_values, join_table: 'spree_option_values_line_items',
class_name: 'Spree::OptionValue'
before_validation :adjust_quantity
before_validation :copy_price
before_validation :copy_tax_category
validates :variant, presence: true
validates :quantity, numericality: {
only_integer: true,
greater_than: -1,
message: Spree.t('validation.must_be_int')
}
validates :price, numericality: true
validates_with Stock::AvailabilityValidator
before_save :update_inventory
before_save :calculate_final_weight_volume, if: :quantity_changed?,
unless: :final_weight_volume_changed?
after_save :update_order
after_save :update_units
before_destroy :update_inventory_before_destroy
after_destroy :update_order
delegate :product, :unit_description, :display_name, to: :variant
attr_accessor :skip_stock_check # Allows manual skipping of Stock::AvailabilityValidator
attr_accessor :target_shipment
# -- Scopes
scope :managed_by, lambda { |user|
if user.has_spree_role?('admin')
where(nil)
else
# Find line items that are from orders distributed by the user or supplied by the user
joins(variant: :product).
joins(:order).
where('spree_orders.distributor_id IN (?) OR spree_products.supplier_id IN (?)',
user.enterprises, user.enterprises).
select('spree_line_items.*')
end
}
scope :in_orders, lambda { |orders|
where(order_id: orders)
}
# Find line items that are from order sorted by variant name and unit value
scope :sorted_by_name_and_unit_value, -> {
joins(variant: :product).
reorder("
lower(spree_products.name) asc,
lower(spree_variants.display_name) asc,
spree_variants.unit_value asc")
}
scope :from_order_cycle, lambda { |order_cycle|
joins(order: :order_cycle).
where('order_cycles.id = ?', order_cycle)
}
# Here we are simply joining the line item to its variant and product
# We dont use joins here to avoid the default scopes,
# and with that, include deleted variants and deleted products
scope :supplied_by_any, lambda { |enterprises|
product_ids = Spree::Product.unscoped.where(supplier_id: enterprises).select(:id)
variant_ids = Spree::Variant.unscoped.where(product_id: product_ids).select(:id)
where("spree_line_items.variant_id IN (?)", variant_ids)
}
scope :with_tax, -> {
joins(:adjustments).
where('spree_adjustments.originator_type = ?', 'Spree::TaxRate').
select('DISTINCT spree_line_items.*')
}
# Line items without a Spree::TaxRate-originated adjustment
scope :without_tax, -> {
joins("
LEFT OUTER JOIN spree_adjustments
ON (spree_adjustments.adjustable_id=spree_line_items.id
AND spree_adjustments.adjustable_type = 'Spree::LineItem'
AND spree_adjustments.originator_type='Spree::TaxRate')").
where('spree_adjustments.id IS NULL')
}
def copy_price
return unless variant
self.price = variant.price if price.nil?
self.cost_price = variant.cost_price if cost_price.nil?
self.currency = variant.currency if currency.nil?
end
def copy_tax_category
return unless variant
self.tax_category = variant.product.tax_category
end
def amount
price * quantity
end
alias total amount
def single_money
Spree::Money.new(price, currency: currency)
end
alias single_display_amount single_money
def money
Spree::Money.new(amount, currency: currency)
end
alias display_total money
alias display_amount money
def adjust_quantity
self.quantity = 0 if quantity.nil? || quantity < 0
end
# Here we skip stock check if skip_stock_check flag is active,
# we skip stock check if requested quantity is zero or negative,
# and we scope variants to hub and thus acivate variant overrides.
def sufficient_stock?
return true if skip_stock_check
return true if quantity <= 0
scoper.scope(variant)
variant.can_supply?(quantity)
end
def insufficient_stock?
!sufficient_stock?
end
def assign_stock_changes_to=(shipment)
@preferred_shipment = shipment
end
# Remove product default_scope `deleted_at: nil`
def product
variant.product
end
# This ensures that LineItems always have access to soft-deleted variants.
# In some situations, unscoped super will be nil. In these cases,
# we fetch the variant using variant_id. See issue #4946 for more details.
def variant
Spree::Variant.unscoped { super } || Spree::Variant.unscoped.find(variant_id)
end
def cap_quantity_at_stock!
scoper.scope(variant)
return if variant.on_demand
update!(quantity: variant.on_hand) if quantity > variant.on_hand
end
def has_tax?
adjustments.included_tax.any?
end
def included_tax
adjustments.included_tax.sum(&:included_tax)
end
def tax_rates
product.tax_category.andand.tax_rates || []
end
def price_with_adjustments
# EnterpriseFee#create_adjustment applies adjustments on line items to their parent order,
# so line_item.adjustments returns an empty array
return 0 if quantity.zero?
line_item_adjustments = OrderAdjustmentsFetcher.new(order).line_item_adjustments(self)
(price + line_item_adjustments.sum(&:amount) / quantity).round(2)
end
def single_display_amount_with_adjustments
Spree::Money.new(price_with_adjustments, currency: currency)
end
def amount_with_adjustments
# We calculate from price_with_adjustments here rather than building our own value because
# rounding errors can produce discrepencies of $0.01.
price_with_adjustments * quantity
end
def display_amount_with_adjustments
Spree::Money.new(amount_with_adjustments, currency: currency)
end
def display_included_tax
Spree::Money.new(included_tax, currency: currency)
end
def unit_value
return variant.unit_value if quantity == 0 || !final_weight_volume
final_weight_volume / quantity
end
def scoper
@scoper ||= OpenFoodNetwork::ScopeVariantToHub.new(order.distributor)
end
private
def update_inventory
return unless changed?
scoper.scope(variant)
Spree::OrderInventory.new(order).verify(self, target_shipment)
end
def update_order
return unless changed? || destroyed?
# update the order totals, etc.
order.create_tax_charge!
order.update!
end
def update_inventory_before_destroy
# This is necessary before destroying the line item
# so that update_inventory will restore stock to the variant
self.quantity = 0
update_inventory
# This is necessary after updating inventory
# because update_inventory may delete the last shipment in the order
# and that makes update_order fail if we don't reload the shipments
order.shipments.reload
end
def calculate_final_weight_volume
if final_weight_volume.present? && quantity_was > 0
self.final_weight_volume = final_weight_volume * quantity / quantity_was
elsif variant.andand.unit_value.present?
self.final_weight_volume = variant.andand.unit_value * quantity
end
end
end
end

View File

@@ -1,185 +0,0 @@
require 'open_food_network/scope_variant_to_hub'
require 'variant_units/variant_and_line_item_naming'
Spree::LineItem.class_eval do
include VariantUnits::VariantAndLineItemNaming
include LineItemBasedAdjustmentHandling
has_and_belongs_to_many :option_values, join_table: 'spree_option_values_line_items', class_name: 'Spree::OptionValue'
# Redefining here to add the inverse_of option
belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items
# Allows manual skipping of Stock::AvailabilityValidator
attr_accessor :skip_stock_check
before_save :calculate_final_weight_volume, if: :quantity_changed?, unless: :final_weight_volume_changed?
after_save :update_units
before_destroy :update_inventory_before_destroy
delegate :product, :unit_description, to: :variant
# -- Scopes
scope :managed_by, lambda { |user|
if user.has_spree_role?('admin')
where(nil)
else
# Find line items that are from orders distributed by the user or supplied by the user
joins(variant: :product).
joins(:order).
where('spree_orders.distributor_id IN (?) OR spree_products.supplier_id IN (?)', user.enterprises, user.enterprises).
select('spree_line_items.*')
end
}
scope :in_orders, lambda { |orders|
where(order_id: orders)
}
# Find line items that are from order sorted by variant name and unit value
scope :sorted_by_name_and_unit_value, -> {
joins(variant: :product).
reorder("
lower(spree_products.name) asc,
lower(spree_variants.display_name) asc,
spree_variants.unit_value asc")
}
scope :from_order_cycle, lambda { |order_cycle|
joins(order: :order_cycle).
where('order_cycles.id = ?', order_cycle)
}
# Here we are simply joining the line item to its variant and product
# We dont use joins here to avoid the default scopes,
# and with that, include deleted variants and deleted products
scope :supplied_by_any, lambda { |enterprises|
product_ids = Spree::Product.unscoped.where(supplier_id: enterprises).select(:id)
variant_ids = Spree::Variant.unscoped.where(product_id: product_ids).select(:id)
where("spree_line_items.variant_id IN (?)", variant_ids)
}
scope :with_tax, -> {
joins(:adjustments).
where('spree_adjustments.originator_type = ?', 'Spree::TaxRate').
select('DISTINCT spree_line_items.*')
}
# Line items without a Spree::TaxRate-originated adjustment
scope :without_tax, -> {
joins("
LEFT OUTER JOIN spree_adjustments
ON (spree_adjustments.adjustable_id=spree_line_items.id
AND spree_adjustments.adjustable_type = 'Spree::LineItem'
AND spree_adjustments.originator_type='Spree::TaxRate')").
where('spree_adjustments.id IS NULL')
}
# Overridden so that LineItems always have access to soft-deleted Variant
# attributes. In some situations, unscoped super will be nil, in these cases
# we fetch the variant using the variant_id. See isssue #4946 for more
# details
def variant
Spree::Variant.unscoped { super } || Spree::Variant.unscoped.find(variant_id)
end
def cap_quantity_at_stock!
scoper.scope(variant)
return if variant.on_demand
update!(quantity: variant.on_hand) if quantity > variant.on_hand
end
def has_tax?
adjustments.included_tax.any?
end
def included_tax
adjustments.included_tax.sum(&:included_tax)
end
def tax_rates
product.tax_category.andand.tax_rates || []
end
def price_with_adjustments
# EnterpriseFee#create_adjustment applies adjustments on line items to their parent order,
# so line_item.adjustments returns an empty array
return 0 if quantity.zero?
line_item_adjustments = OrderAdjustmentsFetcher.new(order).line_item_adjustments(self)
(price + line_item_adjustments.sum(&:amount) / quantity).round(2)
end
def single_display_amount_with_adjustments
Spree::Money.new(price_with_adjustments, currency: currency)
end
def amount_with_adjustments
# We calculate from price_with_adjustments here rather than building our own value because
# rounding errors can produce discrepencies of $0.01.
price_with_adjustments * quantity
end
def display_amount_with_adjustments
Spree::Money.new(amount_with_adjustments, currency: currency)
end
def display_included_tax
Spree::Money.new(included_tax, currency: currency)
end
delegate :display_name, to: :variant
def unit_value
return variant.unit_value if quantity == 0 || !final_weight_volume
final_weight_volume / quantity
end
# Overrides Spree version to:
# - skip stock check if skip_stock_check flag is active
# - skip stock check if requested quantity is zero or negative
# - scope variants to hub and thus acivate variant overrides
def sufficient_stock?
return true if skip_stock_check
return true if quantity <= 0
scoper.scope(variant)
variant.can_supply?(quantity)
end
def scoper
@scoper ||= OpenFoodNetwork::ScopeVariantToHub.new(order.distributor)
end
private
def update_inventory_with_scoping
scoper.scope(variant)
update_inventory_without_scoping
end
alias_method_chain :update_inventory, :scoping
def update_inventory_before_destroy
# This is necessary before destroying the line item
# so that update_inventory will restore stock to the variant
self.quantity = 0
update_inventory
# This is necessary after updating inventory
# because update_inventory may delete the last shipment in the order
# and that makes update_order fail if we don't reload the shipments
order.shipments.reload
end
def calculate_final_weight_volume
if final_weight_volume.present? && quantity_was > 0
self.final_weight_volume = final_weight_volume * quantity / quantity_was
elsif variant.andand.unit_value.present?
self.final_weight_volume = variant.andand.unit_value * quantity
end
end
end

904
app/models/spree/order.rb Normal file
View File

@@ -0,0 +1,904 @@
# frozen_string_literal: true
require 'spree/order/checkout'
require 'open_food_network/enterprise_fee_calculator'
require 'open_food_network/feature_toggle'
require 'open_food_network/tag_rule_applicator'
require 'concerns/order_shipment'
module Spree
class Order < ActiveRecord::Base
prepend OrderShipment
include Checkout
checkout_flow do
go_to_state :address
go_to_state :delivery
go_to_state :payment, if: ->(order) {
order.update_totals
order.payment_required?
}
go_to_state :complete
end
state_machine.after_transition to: :payment, do: :charge_shipping_and_payment_fees!
state_machine.event :restart_checkout do
transition to: :cart, unless: :completed?
end
token_resource
belongs_to :user, class_name: Spree.user_class.to_s
belongs_to :created_by, class_name: Spree.user_class.to_s
belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
alias_attribute :billing_address, :bill_address
belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
alias_attribute :shipping_address, :ship_address
has_many :state_changes, as: :stateful
has_many :line_items, -> { order('created_at ASC') }, dependent: :destroy
has_many :payments, dependent: :destroy
has_many :return_authorizations, dependent: :destroy
has_many :adjustments, -> { order "#{Spree::Adjustment.table_name}.created_at ASC" },
as: :adjustable,
dependent: :destroy
has_many :line_item_adjustments, through: :line_items, source: :adjustments
has_many :shipments, dependent: :destroy do
def states
pluck(:state).uniq
end
end
belongs_to :order_cycle
belongs_to :distributor, class_name: 'Enterprise'
belongs_to :customer
has_one :proxy_order
has_one :subscription, through: :proxy_order
accepts_nested_attributes_for :line_items
accepts_nested_attributes_for :bill_address
accepts_nested_attributes_for :ship_address
accepts_nested_attributes_for :payments
accepts_nested_attributes_for :shipments
delegate :admin_and_handling_total, :payment_fee, :ship_total, to: :adjustments_fetcher
# Needs to happen before save_permalink is called
before_validation :set_currency
before_validation :generate_order_number, on: :create
before_validation :clone_billing_address, if: :use_billing?
before_validation :associate_customer, unless: :customer_id?
before_validation :ensure_customer, unless: :customer_is_valid?
validates :customer, presence: true, if: :require_customer?
validate :products_available_from_new_distribution, if: lambda {
distributor_id_changed? || order_cycle_id_changed?
}
validate :disallow_guest_order
attr_accessor :use_billing
before_create :link_by_email
after_create :create_tax_charge!
validate :has_available_shipment
validate :has_available_payment
validates :email, presence: true,
format: /\A([\w\.%\+\-']+)@([\w\-]+\.)+([\w]{2,})\z/i,
if: :require_email
make_permalink field: :number
before_save :update_shipping_fees!, if: :complete?
before_save :update_payment_fees!, if: :complete?
class_attribute :update_hooks
self.update_hooks = Set.new
# -- Scopes
scope :managed_by, lambda { |user|
if user.has_spree_role?('admin')
where(nil)
else
# Find orders that are distributed by the user or have products supplied by the user
# WARNING: This only filters orders,
# you'll need to filter line items separately using LineItem.managed_by
with_line_items_variants_and_products_outer.
where('spree_orders.distributor_id IN (?) OR spree_products.supplier_id IN (?)',
user.enterprises.select(&:id),
user.enterprises.select(&:id)).
select('DISTINCT spree_orders.*')
end
}
scope :distributed_by_user, lambda { |user|
if user.has_spree_role?('admin')
where(nil)
else
where('spree_orders.distributor_id IN (?)', user.enterprises.select(&:id))
end
}
scope :with_line_items_variants_and_products_outer, lambda {
joins('LEFT OUTER JOIN spree_line_items ON (spree_line_items.order_id = spree_orders.id)').
joins('LEFT OUTER JOIN spree_variants ON (spree_variants.id = spree_line_items.variant_id)').
joins('LEFT OUTER JOIN spree_products ON (spree_products.id = spree_variants.product_id)')
}
scope :not_state, lambda { |state|
where("state != ?", state)
}
def self.by_number(number)
where(number: number)
end
def self.between(start_date, end_date)
where(created_at: start_date..end_date)
end
def self.by_customer(customer)
joins(:user).where("#{Spree.user_class.table_name}.email" => customer)
end
def self.by_state(state)
where(state: state)
end
def self.complete
where('completed_at IS NOT NULL')
end
def self.incomplete
where(completed_at: nil)
end
# Use this method in other gems that wish to register their own custom logic
# that should be called after Order#update
def self.register_update_hook(hook)
update_hooks.add(hook)
end
# For compatiblity with Calculator::PriceSack
def amount
line_items.inject(0.0) { |sum, li| sum + li.amount }
end
def currency
self[:currency] || Spree::Config[:currency]
end
def display_outstanding_balance
Spree::Money.new(outstanding_balance, currency: currency)
end
def display_item_total
Spree::Money.new(item_total, currency: currency)
end
def display_adjustment_total
Spree::Money.new(adjustment_total, currency: currency)
end
def display_tax_total
Spree::Money.new(tax_total, currency: currency)
end
def display_ship_total
Spree::Money.new(ship_total, currency: currency)
end
def display_total
Spree::Money.new(total, currency: currency)
end
def to_param
number.to_s.to_url.upcase
end
def completed?
completed_at.present?
end
# Indicates whether or not the user is allowed to proceed to checkout.
# Currently this is implemented as a check for whether or not there is at
# least one LineItem in the Order. Feel free to override this logic in your
# own application if you require additional steps before allowing a checkout.
def checkout_allowed?
line_items.count > 0
end
def changes_allowed?
complete? && distributor.andand.allow_order_changes? && order_cycle.andand.open?
end
# Is this a free order in which case the payment step should be skipped
# This allows unpaid subscription orders to be completed.
# Subscriptions place orders at the beginning of an order cycle. They need to
# be completed to draw from stock levels and trigger emails.
def payment_required?
total.to_f > 0.0 && !skip_payment_for_subscription?
end
# Indicates the number of items in the order
def item_count
line_items.inject(0) { |sum, li| sum + li.quantity }
end
def backordered?
shipments.any?(&:backordered?)
end
# Returns the relevant zone (if any) to be used for taxation purposes.
# Uses default tax zone unless there is a specific match
def tax_zone
Zone.match(tax_address) || Zone.default_tax
end
# Indicates whether tax should be backed out of the price calcualtions in
# cases where prices include tax but the customer is not required to pay
# taxes in that case.
def exclude_tax?
return false unless Spree::Config[:prices_inc_tax]
tax_zone != Zone.default_tax
end
# Returns the address for taxation based on configuration
def tax_address
Spree::Config[:tax_using_ship_address] ? ship_address : bill_address
end
# Array of totals grouped by Adjustment#label. Useful for displaying line item
# adjustments on an invoice. For example, you can display tax breakout for
# cases where tax is included in price.
def line_item_adjustment_totals
Hash[line_item_adjustments.eligible.group_by(&:label).map do |label, adjustments|
total = adjustments.sum(&:amount)
[label, Spree::Money.new(total, currency: currency)]
end]
end
def updater
@updater ||= OrderManagement::Order::Updater.new(self)
end
def update!
updater.update
end
delegate :update_totals, to: :updater
def clone_billing_address
if bill_address && ship_address.nil?
self.ship_address = bill_address.clone
else
ship_address.attributes = bill_address.attributes.except('id', 'updated_at', 'created_at')
end
true
end
def allow_cancel?
return false unless completed? && (state != 'canceled')
shipment_state.nil? || %w{ready backorder pending}.include?(shipment_state)
end
def allow_resume?
# we shouldn't allow resume for legacy orders b/c we lack the information
# necessary to restore to a previous state
return false if state_changes.empty? || state_changes.last.previous_state.nil?
true
end
def awaiting_returns?
return_authorizations.any?(&:authorized?)
end
# This is currently used when adding a variant to an order in the BackOffice.
# Spree::OrderContents#add is equivalent but slightly different from add_variant below.
def contents
@contents ||= Spree::OrderContents.new(self)
end
# This is currently used when adding a variant to an order in the FrontOffice.
# This add_variant is equivalent but slightly different from Spree::OrderContents#add above.
# Spree::OrderContents#add is the more modern version in Spree history
# but this add_variant has been customized for OFN FrontOffice.
def add_variant(variant, quantity = 1, max_quantity = nil, currency = nil)
line_items(:reload)
current_item = find_line_item_by_variant(variant)
# Notify bugsnag if we get line items with a quantity of zero
if quantity == 0
Bugsnag.notify(RuntimeError.new("Zero Quantity Line Item"),
current_item: current_item.as_json,
line_items: line_items.map(&:id),
variant: variant.as_json)
end
if current_item
current_item.quantity = quantity
current_item.max_quantity = max_quantity
current_item.currency = currency unless currency.nil?
current_item.save
else
current_item = Spree::LineItem.new(quantity: quantity, max_quantity: max_quantity)
current_item.variant = variant
if currency
current_item.currency = currency unless currency.nil?
current_item.price = variant.price_in(currency).amount
else
current_item.price = variant.price
end
line_items << current_item
end
reload
current_item
end
def set_variant_attributes(variant, attributes)
line_item = find_line_item_by_variant(variant)
return unless line_item
if attributes.key?(:max_quantity) && attributes[:max_quantity].to_i < line_item.quantity
attributes[:max_quantity] = line_item.quantity
end
line_item.assign_attributes(attributes)
line_item.save!
end
# Associates the specified user with the order.
def associate_user!(user)
self.user = user
self.email = user.email
self.created_by = user if created_by.blank?
return unless persisted?
# Persist the changes we just made,
# but don't use save since we might have an invalid address associated
self.class.unscoped.where(id: id).update_all(email: user.email,
user_id: user.id,
created_by_id: created_by_id)
end
# FIXME refactor this method and implement validation using validates_* utilities
def generate_order_number
record = true
while record
random = "R#{Array.new(9){ rand(9) }.join}"
record = self.class.find_by(number: random)
end
self.number = random if number.blank?
number
end
def shipped_shipments
shipments.shipped
end
def contains?(variant)
find_line_item_by_variant(variant).present?
end
def find_line_item_by_variant(variant)
line_items.detect { |line_item| line_item.variant_id == variant.id }
end
def ship_total
adjustments.shipping.map(&:amount).sum
end
def tax_total
adjustments.tax.map(&:amount).sum
end
# Creates new tax charges if there are any applicable rates. If prices already
# include taxes then price adjustments are created instead.
def create_tax_charge!
Spree::TaxRate.adjust(self)
end
def outstanding_balance
total - payment_total
end
def outstanding_balance?
outstanding_balance != 0
end
def name
address = bill_address || ship_address
return unless address
"#{address.firstname} #{address.lastname}"
end
def can_ship?
complete? || resumed? || awaiting_return? || returned?
end
def credit_cards
credit_card_ids = payments.from_credit_card.pluck(:source_id).uniq
CreditCard.where(id: credit_card_ids)
end
# Finalizes an in progress order after checkout is complete.
# Called after transition to complete state when payments will have been processed
def finalize!
touch :completed_at
adjustments.update_all state: 'closed'
# update payment and shipment(s) states, and save
updater.update_payment_state
shipments.each do |shipment|
shipment.update!(self)
shipment.finalize!
end
updater.update_shipment_state
updater.before_save_hook
save
updater.run_hooks
deliver_order_confirmation_email
state_changes.create(
previous_state: 'cart',
next_state: 'complete',
name: 'order',
user_id: user_id
)
end
def deliver_order_confirmation_email
return if subscription.present?
Delayed::Job.enqueue ConfirmOrderJob.new(id)
end
# Helper methods for checkout steps
def paid?
payment_state == 'paid' || payment_state == 'credit_owed'
end
def available_payment_methods
@available_payment_methods ||= PaymentMethod.available(:front_end)
end
# "Checkout" is the initial state and, for card payments, "pending" is the state after auth
# These are both valid states to process the payment
def pending_payments
(payments.select(&:pending?) +
payments.select(&:processing?) +
payments.select(&:checkout?)).uniq
end
# processes any pending payments and must return a boolean as it's
# return value is used by the checkout state_machine to determine
# success or failure of the 'complete' event for the order
#
# Returns:
# - true if all pending_payments processed successfully
# - true if a payment failed, ie. raised a GatewayError
# which gets rescued and converted to TRUE when
# :allow_checkout_gateway_error is set to true
# - false if a payment failed, ie. raised a GatewayError
# which gets rescued and converted to FALSE when
# :allow_checkout_on_gateway_error is set to false
#
def process_payments!
raise Core::GatewayError, Spree.t(:no_pending_payments) if pending_payments.empty?
pending_payments.each do |payment|
break if payment_total >= total
payment.process!
if payment.completed?
self.payment_total += payment.amount
end
end
rescue Core::GatewayError => e
result = !!Spree::Config[:allow_checkout_on_gateway_error]
errors.add(:base, e.message) && (return result)
end
def billing_firstname
bill_address.try(:firstname)
end
def billing_lastname
bill_address.try(:lastname)
end
def products
line_items.map(&:product)
end
def variants
line_items.map(&:variant)
end
def insufficient_stock_lines
line_items.select(&:insufficient_stock?)
end
def empty!
line_items.destroy_all
adjustments.destroy_all
payments.clear
shipments.destroy_all
end
def clear_adjustments!
adjustments.destroy_all
line_item_adjustments.destroy_all
end
def state_changed(name)
state = "#{name}_state"
return unless persisted?
old_state = __send__("#{state}_was")
state_changes.create(
previous_state: old_state,
next_state: __send__(state),
name: name,
user_id: user_id
)
end
def shipped?
%w(partial shipped).include?(shipment_state)
end
# Does this order have shipments that can be shipped?
def ready_to_ship?
shipments.any?(&:can_ship?)
end
# Ship all pending orders
def ship
shipments.each do |s|
s.ship if s.can_ship?
end
end
def line_item_variants
if line_items.loaded?
line_items.map(&:variant)
else
line_items.includes(:variant).map(&:variant)
end
end
# Show already bought line items of this order cycle
def finalised_line_items
return [] unless order_cycle && user && distributor
order_cycle.items_bought_by_user(user, distributor)
end
def create_proposed_shipments
adjustments.shipping.delete_all
shipments.destroy_all
packages = OrderManagement::Stock::Coordinator.new(self).packages
packages.each do |package|
shipments << package.to_shipment
end
shipments
end
# Clean shipments and make order back to address state
#
# At some point the might need to force the order to transition from address
# to delivery again so that proper updated shipments are created.
# e.g. customer goes back from payment step and changes order items
def ensure_updated_shipments
return unless shipments.any?
shipments.destroy_all
update_column(:state, "address")
end
def refresh_shipment_rates
shipments.map(&:refresh_rates)
end
# Check that line_items in the current order are available from a newly selected distribution
def products_available_from_new_distribution
return if OrderCycleDistributedVariants.new(order_cycle, distributor)
.distributes_order_variants?(self)
errors.add(:base, I18n.t(:spree_order_availability_error))
end
def disallow_guest_order
return unless using_guest_checkout? && registered_email?
errors.add(:base, I18n.t('devise.failure.already_registered'))
end
# After changing line items of a completed order
def update_shipping_fees!
shipments.each do |shipment|
next if shipment.shipped?
update_adjustment! shipment.adjustment if shipment.adjustment
save_or_rescue_shipment(shipment)
end
end
def save_or_rescue_shipment(shipment)
shipment.save # updates included tax
rescue ActiveRecord::RecordNotUnique => e
# This error was seen in production on `shipment.save` above.
# It caused lost payments and duplicate payments due to database rollbacks.
# While we don't understand the cause of this error yet, we rescue here
# because an outdated shipping fee is not as bad as a lost payment.
# And the shipping fee is already up-to-date when this error occurs.
# https://github.com/openfoodfoundation/openfoodnetwork/issues/3924
Bugsnag.notify(e) do |report|
report.add_tab(:order, attributes)
report.add_tab(:shipment, shipment.attributes)
report.add_tab(:shipment_in_db, Spree::Shipment.find_by(id: shipment.id).attributes)
end
end
# After changing line items of a completed order
def update_payment_fees!
payments.each do |payment|
next if payment.completed?
update_adjustment! payment.adjustment if payment.adjustment
payment.save
end
end
def update_distribution_charge!
# `with_lock` acquires an exclusive row lock on order so no other
# requests can update it until the transaction is commited.
# See https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/locking/pessimistic.rb#L69
# and https://www.postgresql.org/docs/current/static/sql-select.html#SQL-FOR-UPDATE-SHARE
with_lock do
EnterpriseFee.clear_all_adjustments_on_order self
loaded_line_items =
line_items.includes(variant: :product, order: [:distributor, :order_cycle]).all
loaded_line_items.each do |line_item|
if provided_by_order_cycle? line_item
OpenFoodNetwork::EnterpriseFeeCalculator.new.create_line_item_adjustments_for line_item
end
end
if order_cycle
OpenFoodNetwork::EnterpriseFeeCalculator.new.create_order_adjustments_for self
end
end
end
def set_order_cycle!(order_cycle)
return if self.order_cycle == order_cycle
self.order_cycle = order_cycle
self.distributor = nil unless order_cycle.nil? || order_cycle.has_distributor?(distributor)
empty!
save!
end
def remove_variant(variant)
line_items(:reload)
current_item = find_line_item_by_variant(variant)
current_item.andand.destroy
end
def cap_quantity_at_stock!
line_items.includes(variant: :stock_items).find_each(&:cap_quantity_at_stock!)
end
def set_distributor!(distributor)
self.distributor = distributor
self.order_cycle = nil unless order_cycle.andand.has_distributor? distributor
save!
end
def set_distribution!(distributor, order_cycle)
self.distributor = distributor
self.order_cycle = order_cycle
save!
end
def distribution_set?
distributor && order_cycle
end
def shipping_tax
adjustments(:reload).shipping.sum(&:included_tax)
end
def enterprise_fee_tax
adjustments(:reload).enterprise_fee.sum(&:included_tax)
end
def total_tax
(adjustments + price_adjustments).sum(&:included_tax)
end
def price_adjustments
adjustments = []
line_items.each { |line_item| adjustments.concat line_item.adjustments }
adjustments
end
def price_adjustment_totals
Hash[tax_adjustment_totals.map do |tax_rate, tax_amount|
[tax_rate.name,
Spree::Money.new(tax_amount, currency: currency)]
end]
end
def has_taxes_included
!line_items.with_tax.empty?
end
def address_from_distributor
address = distributor.address.clone
if bill_address
address.firstname = bill_address.firstname
address.lastname = bill_address.lastname
address.phone = bill_address.phone
end
address
end
# Update attributes of a record in the database without callbacks, validations etc.
# This was originally an extension to ActiveRecord in Spree but only used for Spree::Order
def update_attributes_without_callbacks(attributes)
assign_attributes(attributes)
Spree::Order.where(id: id).update_all(attributes)
end
private
def link_by_email
self.email = user.email if user
end
# Determine if email is required (we don't want validation errors before we hit the checkout)
def require_email
return true unless new_record? || (state == 'cart')
end
def ensure_line_items_present
return if line_items.present?
errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) && (return false)
end
def has_available_shipment
return unless address?
return unless ship_address&.valid?
# errors.add(:base, :no_shipping_methods_available) if available_shipping_methods.empty?
end
def ensure_available_shipping_rates
return unless shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? }
errors.add(:base, Spree.t(:items_cannot_be_shipped)) && (return false)
end
def has_available_payment
return unless delivery?
# errors.add(:base, :no_payment_methods_available) if available_payment_methods.empty?
end
def after_cancel
shipments.each(&:cancel!)
OrderMailer.cancel_email(id).deliver
self.payment_state = 'credit_owed' unless shipped?
end
def after_resume
shipments.each(&:resume!)
end
def use_billing?
@use_billing == true || @use_billing == 'true' || @use_billing == '1'
end
def set_currency
self.currency = Spree::Config[:currency] if self[:currency].nil?
end
def using_guest_checkout?
require_email && !user.andand.id
end
def registered_email?
Spree.user_class.exists?(email: email)
end
def adjustments_fetcher
@adjustments_fetcher ||= OrderAdjustmentsFetcher.new(self)
end
def skip_payment_for_subscription?
subscription.present? && order_cycle.orders_close_at.andand > Time.zone.now
end
def provided_by_order_cycle?(line_item)
order_cycle_variants = order_cycle.andand.variants || []
order_cycle_variants.include? line_item.variant
end
def require_customer?
return true unless new_record? || state == 'cart'
end
def customer_is_valid?
return true unless require_customer?
customer.present? && customer.enterprise_id == distributor_id && customer.email == email_for_customer
end
def email_for_customer
(user.andand.email || email).andand.downcase
end
def associate_customer
return customer if customer.present?
self.customer = Customer.of(distributor).find_by(email: email_for_customer)
end
def ensure_customer
return if associate_customer
customer_name = bill_address.andand.full_name
self.customer = Customer.create(enterprise: distributor, email: email_for_customer,
user: user, name: customer_name,
bill_address: bill_address.andand.clone,
ship_address: ship_address.andand.clone)
end
def update_adjustment!(adjustment)
return if adjustment.finalized?
state = adjustment.state
adjustment.state = 'open'
adjustment.update!
update!
adjustment.state = state
end
# object_params sets the payment amount to the order total, but it does this
# before the shipping method is set. This results in the customer not being
# charged for their order's shipping. To fix this, we refresh the payment
# amount here.
def charge_shipping_and_payment_fees!
update_totals
return unless pending_payments.any?
pending_payments.first.update_attribute :amount, total
end
end
end

View File

@@ -9,7 +9,6 @@ module Spree
class_attribute :previous_states
class_attribute :checkout_flow
class_attribute :checkout_steps
class_attribute :removed_transitions
def self.checkout_flow(&block)
if block_given?
@@ -24,7 +23,6 @@ module Spree
self.checkout_steps = {}
self.next_event_transitions = []
self.previous_states = [:cart]
self.removed_transitions = []
# Build the checkout flow using the checkout_flow defined either
# within the Order class, or a decorator for that class.
@@ -95,43 +93,6 @@ module Spree
end
end
def self.insert_checkout_step(name, options = {})
before = options.delete(:before)
after = options.delete(:after) unless before
after = checkout_steps.keys.last unless before || after
cloned_steps = checkout_steps.clone
cloned_removed_transitions = removed_transitions.clone
checkout_flow do
cloned_steps.each_pair do |key, value|
go_to_state(name, options) if key == before
go_to_state(key, value)
go_to_state(name, options) if key == after
end
cloned_removed_transitions.each do |transition|
remove_transition(transition)
end
end
end
def self.remove_checkout_step(name)
cloned_steps = checkout_steps.clone
cloned_removed_transitions = removed_transitions.clone
checkout_flow do
cloned_steps.each_pair do |key, value|
go_to_state(key, value) unless key == name
end
cloned_removed_transitions.each do |transition|
remove_transition(transition)
end
end
end
def self.remove_transition(options = {})
removed_transitions << options
next_event_transitions.delete(find_transition(options))
end
def self.find_transition(options = {})
return nil if options.nil? || !options.include?(:from) || !options.include?(:to)
@@ -173,10 +134,6 @@ module Spree
checkout_steps.index(step)
end
def self.removed_transitions
@removed_transitions ||= []
end
def can_go_to_state?(state)
return false unless self.state.present? &&
checkout_step?(state) &&

View File

@@ -0,0 +1,68 @@
# frozen_string_literal: true
module Spree
class OrderContents
attr_accessor :order, :currency
def initialize(order)
@order = order
end
# Get current line item for variant if exists
# Add variant qty to line_item
def add(variant, quantity = 1, currency = nil, shipment = nil)
line_item = order.find_line_item_by_variant(variant)
add_to_line_item(line_item, variant, quantity, currency, shipment)
end
# Get current line item for variant
# Remove variant qty from line_item
def remove(variant, quantity = 1, shipment = nil)
line_item = order.find_line_item_by_variant(variant)
unless line_item
raise ActiveRecord::RecordNotFound, "Line item not found for variant #{variant.sku}"
end
remove_from_line_item(line_item, variant, quantity, shipment)
end
private
def add_to_line_item(line_item, variant, quantity, currency = nil, shipment = nil)
if line_item
line_item.target_shipment = shipment
line_item.quantity += quantity.to_i
line_item.currency = currency unless currency.nil?
else
line_item = order.line_items.new(quantity: quantity, variant: variant)
line_item.target_shipment = shipment
if currency
line_item.currency = currency unless currency.nil?
line_item.price = variant.price_in(currency).amount
else
line_item.price = variant.price
end
end
line_item.save
order.reload
line_item
end
def remove_from_line_item(line_item, _variant, quantity, shipment = nil)
line_item.quantity += -quantity
line_item.target_shipment = shipment
if line_item.quantity == 0
Spree::OrderInventory.new(order).verify(line_item, shipment)
line_item.destroy
else
line_item.save!
end
order.reload
line_item
end
end
end

View File

@@ -1,446 +0,0 @@
require 'open_food_network/enterprise_fee_calculator'
require 'open_food_network/feature_toggle'
require 'open_food_network/tag_rule_applicator'
require 'concerns/order_shipment'
ActiveSupport::Notifications.subscribe('spree.order.contents_changed') do |_name, _start, _finish, _id, payload|
payload[:order].reload.update_distribution_charge!
end
Spree::Order.class_eval do
prepend OrderShipment
delegate :admin_and_handling_total, :payment_fee, :ship_total, to: :adjustments_fetcher
belongs_to :order_cycle
belongs_to :distributor, class_name: 'Enterprise'
belongs_to :customer
has_one :proxy_order
has_one :subscription, through: :proxy_order
# This removes "inverse_of: source" which breaks shipment adjustment calculations
# This change is done in Spree 2.1 (see https://github.com/spree/spree/commit/3fa44165c7825f79a2fa4eb79b99dc29944c5d55)
# When OFN gets to Spree 2.1, this can be removed
has_many :adjustments, -> { order "#{Spree::Adjustment.table_name}.created_at ASC" },
as: :adjustable,
dependent: :destroy
validates :customer, presence: true, if: :require_customer?
validate :products_available_from_new_distribution, if: lambda { distributor_id_changed? || order_cycle_id_changed? }
validate :disallow_guest_order
# The EmailValidator introduced in Spree 2.1 is not working
# So here we remove it and re-introduce the regexp validation rule from Spree 2.0
_validate_callbacks.each do |callback|
if callback.raw_filter.respond_to? :attributes
callback.raw_filter.attributes.delete :email
end
end
validates :email, presence: true, format: /\A([\w\.%\+\-']+)@([\w\-]+\.)+([\w]{2,})\z/i,
if: :require_email
before_validation :associate_customer, unless: :customer_id?
before_validation :ensure_customer, unless: :customer_is_valid?
before_save :update_shipping_fees!, if: :complete?
before_save :update_payment_fees!, if: :complete?
# Orders are confirmed with their payment, we don't use the confirm step.
# Here we remove that step from Spree's checkout state machine.
# See: https://guides.spreecommerce.org/developer/checkout.html#modifying-the-checkout-flow
remove_checkout_step :confirm
state_machine.after_transition to: :payment, do: :charge_shipping_and_payment_fees!
state_machine.event :restart_checkout do
transition to: :cart, unless: :completed?
end
# -- Scopes
scope :managed_by, lambda { |user|
if user.has_spree_role?('admin')
where(nil)
else
# Find orders that are distributed by the user or have products supplied by the user
# WARNING: This only filters orders, you'll need to filter line items separately using LineItem.managed_by
with_line_items_variants_and_products_outer.
where('spree_orders.distributor_id IN (?) OR spree_products.supplier_id IN (?)',
user.enterprises.select(&:id),
user.enterprises.select(&:id)).
select('DISTINCT spree_orders.*')
end
}
scope :distributed_by_user, lambda { |user|
if user.has_spree_role?('admin')
where(nil)
else
where('spree_orders.distributor_id IN (?)', user.enterprises.select(&:id))
end
}
scope :with_line_items_variants_and_products_outer, lambda {
joins('LEFT OUTER JOIN spree_line_items ON (spree_line_items.order_id = spree_orders.id)').
joins('LEFT OUTER JOIN spree_variants ON (spree_variants.id = spree_line_items.variant_id)').
joins('LEFT OUTER JOIN spree_products ON (spree_products.id = spree_variants.product_id)')
}
scope :not_state, lambda { |state|
where("state != ?", state)
}
def updater
@updater ||= OrderManagement::Order::Updater.new(self)
end
def create_proposed_shipments
adjustments.shipping.delete_all
shipments.destroy_all
packages = OrderManagement::Stock::Coordinator.new(self).packages
packages.each do |package|
shipments << package.to_shipment
end
shipments
end
# -- Methods
def products_available_from_new_distribution
# Check that the line_items in the current order are available from a newly selected distribution
errors.add(:base, I18n.t(:spree_order_availability_error)) unless OrderCycleDistributedVariants.new(order_cycle, distributor).distributes_order_variants?(self)
end
def using_guest_checkout?
require_email && !user.andand.id
end
def registered_email?
Spree.user_class.exists?(email: email)
end
def disallow_guest_order
if using_guest_checkout? && registered_email?
errors.add(:base, I18n.t('devise.failure.already_registered'))
end
end
def empty_with_clear_shipping_and_payments!
empty_without_clear_shipping_and_payments!
payments.clear
shipments.destroy_all
end
alias_method_chain :empty!, :clear_shipping_and_payments
def set_order_cycle!(order_cycle)
return if self.order_cycle == order_cycle
self.order_cycle = order_cycle
self.distributor = nil unless order_cycle.nil? || order_cycle.has_distributor?(distributor)
empty!
save!
end
# "Checkout" is the initial state and, for card payments, "pending" is the state after authorization
# These are both valid states to process the payment
def pending_payments
(payments.select(&:pending?) + payments.select(&:processing?) + payments.select(&:checkout?)).uniq
end
def remove_variant(variant)
line_items(:reload)
current_item = find_line_item_by_variant(variant)
current_item.andand.destroy
end
# Overridden to support max_quantity
def add_variant(variant, quantity = 1, max_quantity = nil, currency = nil)
line_items(:reload)
current_item = find_line_item_by_variant(variant)
# Notify bugsnag if we get line items with a quantity of zero
if quantity == 0
Bugsnag.notify(RuntimeError.new("Zero Quantity Line Item"),
current_item: current_item.as_json,
line_items: line_items.map(&:id),
variant: variant.as_json)
end
if current_item
current_item.quantity = quantity
current_item.max_quantity = max_quantity
# This is the original behaviour, behaviour above is so that we can resolve the order populator bug
# current_item.quantity ||= 0
# current_item.max_quantity ||= 0
# current_item.quantity += quantity.to_i
# current_item.max_quantity += max_quantity.to_i
current_item.currency = currency unless currency.nil?
current_item.save
else
current_item = Spree::LineItem.new(quantity: quantity, max_quantity: max_quantity)
current_item.variant = variant
if currency
current_item.currency = currency unless currency.nil?
current_item.price = variant.price_in(currency).amount
else
current_item.price = variant.price
end
line_items << current_item
end
reload
current_item
end
# After changing line items of a completed order
def update_shipping_fees!
shipments.each do |shipment|
next if shipment.shipped?
update_adjustment! shipment.adjustment if shipment.adjustment
save_or_rescue_shipment(shipment)
end
end
def save_or_rescue_shipment(shipment)
shipment.save # updates included tax
rescue ActiveRecord::RecordNotUnique => e
# This error was seen in production on `shipment.save` above.
# It caused lost payments and duplicate payments due to database rollbacks.
# While we don't understand the cause of this error yet, we rescue here
# because an outdated shipping fee is not as bad as a lost payment.
# And the shipping fee is already up-to-date when this error occurs.
# https://github.com/openfoodfoundation/openfoodnetwork/issues/3924
Bugsnag.notify(e) do |report|
report.add_tab(:order, attributes)
report.add_tab(:shipment, shipment.attributes)
report.add_tab(:shipment_in_db, Spree::Shipment.find_by(id: shipment.id).attributes)
end
end
# After changing line items of a completed order
def update_payment_fees!
payments.each do |payment|
next if payment.completed?
update_adjustment! payment.adjustment if payment.adjustment
payment.save
end
end
def cap_quantity_at_stock!
line_items.includes(variant: :stock_items).all.each(&:cap_quantity_at_stock!)
end
def set_distributor!(distributor)
self.distributor = distributor
self.order_cycle = nil unless order_cycle.andand.has_distributor? distributor
save!
end
def set_distribution!(distributor, order_cycle)
self.distributor = distributor
self.order_cycle = order_cycle
save!
end
def distribution_set?
distributor && order_cycle
end
def update_distribution_charge!
# `with_lock` acquires an exclusive row lock on order so no other
# requests can update it until the transaction is commited.
# See https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/locking/pessimistic.rb#L69
# and https://www.postgresql.org/docs/current/static/sql-select.html#SQL-FOR-UPDATE-SHARE
with_lock do
EnterpriseFee.clear_all_adjustments_on_order self
loaded_line_items =
line_items.includes(variant: :product, order: [:distributor, :order_cycle]).all
loaded_line_items.each do |line_item|
if provided_by_order_cycle? line_item
OpenFoodNetwork::EnterpriseFeeCalculator.new.create_line_item_adjustments_for line_item
end
end
if order_cycle
OpenFoodNetwork::EnterpriseFeeCalculator.new.create_order_adjustments_for self
end
end
end
def set_variant_attributes(variant, attributes)
line_item = find_line_item_by_variant(variant)
if line_item
if attributes.key?(:max_quantity) && attributes[:max_quantity].to_i < line_item.quantity
attributes[:max_quantity] = line_item.quantity
end
line_item.assign_attributes(attributes)
line_item.save!
end
end
def line_item_variants
if line_items.loaded?
line_items.map(&:variant)
else
line_items.includes(:variant).map(&:variant)
end
end
# Show already bought line items of this order cycle
def finalised_line_items
return [] unless order_cycle && user && distributor
order_cycle.items_bought_by_user(user, distributor)
end
# Does this order have shipments that can be shipped?
def ready_to_ship?
shipments.any?(&:can_ship?)
end
# Ship all pending orders
def ship
shipments.each do |s|
s.ship if s.can_ship?
end
end
def shipping_tax
adjustments(:reload).shipping.sum(&:included_tax)
end
def enterprise_fee_tax
adjustments(:reload).enterprise_fee.sum(&:included_tax)
end
def total_tax
(adjustments + price_adjustments).sum(&:included_tax)
end
def price_adjustments
adjustments = []
line_items.each { |line_item| adjustments.concat line_item.adjustments }
adjustments
end
def price_adjustment_totals
Hash[tax_adjustment_totals.map do |tax_rate, tax_amount|
[tax_rate.name,
Spree::Money.new(tax_amount, currency: currency)]
end]
end
def has_taxes_included
!line_items.with_tax.empty?
end
# Overrride of Spree method, that allows us to send separate confirmation emails to user and shop owners
def deliver_order_confirmation_email
if subscription.blank?
Delayed::Job.enqueue ConfirmOrderJob.new(id)
end
end
def changes_allowed?
complete? && distributor.andand.allow_order_changes? && order_cycle.andand.open?
end
# Override Spree method to allow unpaid orders to be completed.
# Subscriptions place orders at the beginning of an order cycle. They need to
# be completed to draw from stock levels and trigger emails.
# Spree doesn't allow this. Other options would be to introduce an additional
# order state or implement a special proxy payment method.
# https://github.com/openfoodfoundation/openfoodnetwork/pull/3012#issuecomment-438146484
def payment_required?
total.to_f > 0.0 && !skip_payment_for_subscription?
end
def address_from_distributor
address = distributor.address.clone
if bill_address
address.firstname = bill_address.firstname
address.lastname = bill_address.lastname
address.phone = bill_address.phone
end
address
end
# Update attributes of a record in the database without callbacks, validations etc.
# This was originally an extension to ActiveRecord in Spree but only used for Spree::Order
def update_attributes_without_callbacks(attributes)
assign_attributes(attributes)
Spree::Order.where(id: id).update_all(attributes)
end
private
def adjustments_fetcher
@adjustments_fetcher ||= OrderAdjustmentsFetcher.new(self)
end
def skip_payment_for_subscription?
subscription.present? && order_cycle.orders_close_at.andand > Time.zone.now
end
def provided_by_order_cycle?(line_item)
order_cycle_variants = order_cycle.andand.variants || []
order_cycle_variants.include? line_item.variant
end
def require_customer?
return true unless new_record? || state == 'cart'
end
def customer_is_valid?
return true unless require_customer?
customer.present? && customer.enterprise_id == distributor_id && customer.email == email_for_customer
end
def email_for_customer
(user.andand.email || email).andand.downcase
end
def associate_customer
return customer if customer.present?
self.customer = Customer.of(distributor).find_by(email: email_for_customer)
end
def ensure_customer
unless associate_customer
customer_name = bill_address.andand.full_name
self.customer = Customer.create(enterprise: distributor, email: email_for_customer, user: user, name: customer_name, bill_address: bill_address.andand.clone, ship_address: ship_address.andand.clone)
end
end
def update_adjustment!(adjustment)
return if adjustment.finalized?
state = adjustment.state
adjustment.state = 'open'
adjustment.update!
update!
adjustment.state = state
end
# object_params sets the payment amount to the order total, but it does this
# before the shipping method is set. This results in the customer not being
# charged for their order's shipping. To fix this, we refresh the payment
# amount here.
def charge_shipping_and_payment_fees!
update_totals
return unless pending_payments.any?
pending_payments.first.update_attribute :amount, total
end
end

View File

@@ -0,0 +1,112 @@
# frozen_string_literal: true
module Spree
class OrderInventory
attr_accessor :order
def initialize(order)
@order = order
end
# Only verify inventory for completed orders (as orders in frontend checkout
# have inventory assigned via +order.create_proposed_shipment+) or when
# shipment is explicitly passed
#
# In case shipment is passed the stock location should only unstock or
# restock items if the order is completed. That is so because stock items
# are always unstocked when the order is completed through +shipment.finalize+
def verify(line_item, shipment = nil)
if order.completed? || shipment.present?
variant_units = inventory_units_for(line_item.variant)
if variant_units.size < line_item.quantity
quantity = line_item.quantity - variant_units.size
shipment ||= determine_target_shipment(line_item.variant)
add_to_shipment(shipment, line_item.variant, quantity)
elsif variant_units.size > line_item.quantity
remove(line_item, variant_units, shipment)
end
else
true
end
end
def inventory_units_for(variant)
units = order.shipments.collect{ |s| s.inventory_units.to_a }.flatten
units.group_by(&:variant_id)[variant.id] || []
end
private
def remove(line_item, variant_units, shipment = nil)
quantity = variant_units.size - line_item.quantity
if shipment.present?
remove_from_shipment(shipment, line_item.variant, quantity)
else
order.shipments.each do |each_shipment|
break if quantity == 0
quantity -= remove_from_shipment(each_shipment, line_item.variant, quantity)
end
end
end
# Returns either one of the shipment:
#
# first unshipped that already includes this variant
# first unshipped that's leaving from a stock_location that stocks this variant
def determine_target_shipment(variant)
target_shipment = order.shipments.detect do |shipment|
(shipment.ready? || shipment.pending?) && shipment.include?(variant)
end
target_shipment || order.shipments.detect do |shipment|
(shipment.ready? || shipment.pending?) &&
variant.stock_location_ids.include?(shipment.stock_location_id)
end
end
def add_to_shipment(shipment, variant, quantity)
on_hand, back_order = shipment.stock_location.fill_status(variant, quantity)
on_hand.times { shipment.set_up_inventory('on_hand', variant, order) }
back_order.times { shipment.set_up_inventory('backordered', variant, order) }
# adding to this shipment, and removing from stock_location
if order.completed?
shipment.stock_location.unstock(variant, quantity, shipment)
end
quantity
end
def remove_from_shipment(shipment, variant, quantity)
return 0 if quantity == 0 || shipment.shipped?
shipment_units = shipment.inventory_units_for(variant).reject do |variant_unit|
variant_unit.state == 'shipped'
end.sort_by(&:state)
removed_quantity = 0
shipment_units.each do |inventory_unit|
break if removed_quantity == quantity
inventory_unit.destroy
removed_quantity += 1
end
shipment.destroy if shipment.inventory_units.count == 0
# removing this from shipment, and adding to stock_location
if order.completed?
shipment.stock_location.restock variant, removed_quantity, shipment
end
removed_quantity
end
end
end

View File

@@ -1,5 +1,8 @@
# frozen_string_literal: true
require 'concerns/payment_method_distributors'
require 'spree/core/calculated_adjustments'
module Spree
class PaymentMethod < ActiveRecord::Base
include Spree::Core::CalculatedAdjustments
@@ -99,7 +102,7 @@ module Spree
self.class.include Spree::Core::CalculatedAdjustments
end
self.calculator ||= Calculator::FlatRate.new(preferred_amount: 0)
self.calculator ||= ::Calculator::FlatRate.new(preferred_amount: 0)
end
def has_distributor?(distributor)

View File

@@ -0,0 +1,42 @@
# frozen_string_literal: true
module Spree
class Preference < ActiveRecord::Base
serialize :value
validates :key, presence: true
validates :value_type, presence: true
scope :valid, -> {
where(Spree::Preference.arel_table[:key].not_eq(nil)).
where(Spree::Preference.arel_table[:value_type].not_eq(nil))
}
# The type conversions here should match
# the ones in spree::preferences::preferrable#convert_preference_value
def value
if self[:value_type].present?
case self[:value_type].to_sym
when :string, :text
self[:value].to_s
when :password
self[:value].to_s
when :decimal
BigDecimal(self[:value].to_s).round(2, BigDecimal::ROUND_HALF_UP)
when :integer
self[:value].to_i
when :boolean
!(self[:value].to_s =~ /^[t|1]/i).nil?
else
self[:value].is_a?(String) ? YAML.safe_load(self[:value]) : self[:value]
end
else
self[:value]
end
end
def raw_value
self[:value]
end
end
end

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