Compare commits

...

360 Commits

Author SHA1 Message Date
Luis Ramos
b568d25446 Update all locales with the latest Transifex translations 2020-05-02 17:08:53 +01:00
Luis Ramos
303464a04e Merge pull request #5297 from openfoodfoundation/transifex
Transifex
2020-05-02 15:40:54 +01:00
Luis Ramos
0662c57d9d Merge pull request #5344 from luisramos0/debug_assets
Move PROFILE debug assets flag to another ENV var
2020-05-02 14:21:15 +01:00
Luis Ramos
acb7e9751b Move debug assets flag to another env var so we go back to having both profile and debug assets disabled by default 2020-05-02 10:42:49 +01:00
Transifex-Openfoodnetwork
39875308c2 Updating translations for config/locales/en_FR.yml 2020-05-01 04:55:35 +10:00
Transifex-Openfoodnetwork
c424e7b65e Updating translations for config/locales/fr.yml 2020-05-01 04:55:21 +10:00
Luis Ramos
74c7a01151 Merge pull request #5259 from luchiago/add-extra-social-media-to-emails
Add extra social media to order confirmation email
2020-04-30 15:01:09 +01:00
Luis Ramos
8845260979 Merge pull request #5285 from rmklaus12/5246-missing-translation-orders-list
5246 missing translation orders list
2020-04-30 14:00:26 +01:00
Pau Pérez Fabregat
4174ea69a1 Merge pull request #5247 from chrishil1/Placeholders_variant
Added placeholders in variant edit page
2020-04-30 12:05:59 +02:00
Pau Pérez Fabregat
676add18c3 Merge pull request #5322 from luisramos0/dead_content
Delete some dead views
2020-04-30 12:02:14 +02:00
Luis Ramos
8a107bee98 Merge pull request #5235 from luisramos0/mail_methods
Remove smtp config from admin config page
2020-04-29 19:10:02 +01:00
Transifex-Openfoodnetwork
5bc5ef9a9d Updating translations for config/locales/pt_BR.yml 2020-04-30 03:52:57 +10:00
Pau Pérez Fabregat
f9f4bdae8f Merge pull request #5238 from Matt-Yorkley/moar-performance
Improve Pain Points
2020-04-29 16:36:15 +02:00
Luis Ramos
407d890d23 Merge pull request #5315 from Matt-Yorkley/ordercyles-controller-tweaks
OrderCylesController tweaks
2020-04-29 13:50:10 +01:00
Luis Ramos
0e5d7c1eb1 Add migration to drop dead spree_mail_methods table and some dead mail_methods preferences 2020-04-29 13:34:50 +01:00
Luis Ramos
a38b18bd0d Remove smtp config from admin config page 2020-04-29 13:34:19 +01:00
Pau Pérez Fabregat
e7df9bb58d Merge pull request #5178 from coopdevs/dont-populate-empty-cart
Dont populate empty cart
2020-04-29 13:08:26 +02:00
Matt-Yorkley
9682544442 Eager-load and update BasicEnterpriseSerializer 2020-04-28 20:10:40 +02:00
Matt-Yorkley
f4bcf6c6d5 Eager-load line_item associations in order 2020-04-28 20:10:40 +02:00
Luis Ramos
e6fa08edfc Delete some dead views 2020-04-28 19:07:19 +01:00
Transifex-Openfoodnetwork
18fc4b7c92 Updating translations for config/locales/ca.yml 2020-04-29 01:13:42 +10:00
Transifex-Openfoodnetwork
612cc45ab7 Updating translations for config/locales/en_FR.yml 2020-04-29 01:13:35 +10:00
Transifex-Openfoodnetwork
16e289bf37 Updating translations for config/locales/en_GB.yml 2020-04-29 01:13:29 +10:00
Transifex-Openfoodnetwork
b54c6fcb26 Updating translations for config/locales/nb.yml 2020-04-29 01:13:26 +10:00
Transifex-Openfoodnetwork
8365c66add Updating translations for config/locales/fil_PH.yml 2020-04-29 01:13:22 +10:00
Transifex-Openfoodnetwork
5590671c23 Updating translations for config/locales/fr.yml 2020-04-29 01:13:19 +10:00
Luis Ramos
9e43661127 Merge pull request #5153 from luisramos0/bye_bye_ga
Bye bye Google Analytics
2020-04-28 16:09:16 +01:00
Kristina Lim
265871932f Merge pull request #5146 from coopdevs/dev-mode-profiling-settings
Add PROFILE var to set production-like settings
2020-04-28 20:31:13 +08:00
Kristina Lim
c34570e96e Merge pull request #5313 from kristinalim/fix/mirror_db_script_bucket
Fix script for syncing public/ in AWS bucket to local
2020-04-28 20:28:05 +08:00
Matt-Yorkley
e4985a9d51 Avoid needlessly fetching the current user records (for authentication and API key checks)
These endpoints are absolutely public, and don't need the current user at any point.
2020-04-28 14:06:02 +02:00
Matt-Yorkley
eb7de18298 Return early (before hitting the DB) in complex product list rendering if we already know the order cycle is closed 2020-04-28 13:51:25 +02:00
Matt-Yorkley
67a7140642 Memoize distributor and order_cycle in Api::OrderCyclesController 2020-04-28 13:48:07 +02:00
Luis Ramos
868929eed3 Merge pull request #4993 from luisramos0/move_ent_fees
Change engine routes to better work with specs in rails 4
2020-04-28 11:48:41 +01:00
Transifex-Openfoodnetwork
8e6d53f6c6 Updating translations for config/locales/nb.yml 2020-04-28 17:59:10 +10:00
Robin Klaus
f072e9d9c2 Add missing translations on order list page 2020-04-28 16:47:39 +10:00
Kristina Lim
7c985f39ab Fix script for syncing public/ in AWS bucket to local 2020-04-28 13:22:48 +08:00
Kristina Lim
efb83c2f95 Merge pull request #5250 from mkllnk/mirror-db-script
Add cache to mirror_db script
2020-04-28 13:18:29 +08:00
Luis Ramos
d851aa5106 Add model definition to migration to make migration more resilient 2020-04-27 18:40:56 +01:00
Luis Ramos
c5b9727177 Remove ga_cookies_preference from DB 2020-04-27 18:40:56 +01:00
Luis Ramos
248b0016d4 Remove trackers and google analytics 2020-04-27 18:40:33 +01:00
Luis Ramos
d8d6bad11c Remove config and sections related to google analytics in the cookies banner and cookies page 2020-04-27 18:40:00 +01:00
Luis Ramos
ab16931d70 Merge pull request #5257 from luisramos0/stripe_sca_payments_last
StripeSCA - reuse better method to fetch last payment of an order to avoid nasty bugs in the future
2020-04-27 18:34:35 +01:00
Transifex-Openfoodnetwork
670fff9d36 Updating translations for config/locales/es_CR.yml 2020-04-28 02:38:07 +10:00
Transifex-Openfoodnetwork
171ba09663 Updating translations for config/locales/fr.yml 2020-04-28 01:40:44 +10:00
Transifex-Openfoodnetwork
65c9c287e8 Updating translations for config/locales/en_FR.yml 2020-04-28 01:37:49 +10:00
Transifex-Openfoodnetwork
4332734f27 Updating translations for config/locales/ca.yml 2020-04-28 01:37:44 +10:00
Transifex-Openfoodnetwork
340f669506 Updating translations for config/locales/en_GB.yml 2020-04-28 01:37:36 +10:00
Transifex-Openfoodnetwork
3b7ad0ef4e Updating translations for config/locales/ca.yml 2020-04-27 23:49:48 +10:00
Luis Ramos
6e23f5bdac Merge pull request #5233 from luisramos0/stripe_sca_bo
[StripeSCA] Fix card payments in the Backoffice
2020-04-27 13:00:24 +01:00
Luis Ramos
8b5378e673 Merge pull request #5251 from luisramos0/Issue4654
Change Result of PriceSack Calculation from Integers to Floats, clone #4812
2020-04-27 12:36:18 +01:00
Transifex-Openfoodnetwork
ba32e2d676 Updating translations for config/locales/fil_PH.yml 2020-04-27 18:08:38 +10:00
Pau Pérez Fabregat
74c4722cfe Merge pull request #5286 from rmklaus12/4966-missing-translation-admin-prod-list
4966 missing translation admin prod list
2020-04-27 09:28:57 +02:00
Luis Ramos
b3eda9fecb Merge pull request #5256 from dacook/5190-fix-order-sorting
Fix sorting of orders list
2020-04-26 14:24:00 +01:00
Pau Perez
c224df9b6a Do not trigger an orderChanged with null quantity
When loading the page $watchGroup calls the listener function for every
listed line item but with a set variant and null quantity and
max_quantity. There's no point on computing an order change when there
was none.

This saves an empty request on the second most used endpoint of the app,
specially busy when users are placing orders.
2020-04-24 15:54:46 +02:00
Luis Ramos
b9c86d54b0 Merge pull request #5261 from luisramos0/search-iphone
[Mobile] Make search box font size be 16px so that no zoom happens on iphone
2020-04-24 11:30:26 +01:00
Transifex-Openfoodnetwork
cebba4dd43 Updating translations for config/locales/en_GB.yml 2020-04-24 18:22:49 +10:00
Transifex-Openfoodnetwork
8bcc9456d8 Updating translations for config/locales/en_FR.yml 2020-04-24 04:30:04 +10:00
Transifex-Openfoodnetwork
5f51b21fe9 Updating translations for config/locales/fr.yml 2020-04-24 04:29:52 +10:00
Luis Ramos
2984829790 Merge pull request #5253 from luisramos0/edit_order
Make edit order page work even if inventory_items dont have a corresponding line_item in the order
2020-04-23 19:27:31 +01:00
Luis Ramos
f366aa2605 Merge pull request #5290 from openfoodfoundation/dependabot/bundler/mini_racer-0.2.10
Bump mini_racer from 0.2.9 to 0.2.10
2020-04-23 18:53:14 +01:00
Matt-Yorkley
bf16a10129 Update all locales with the latest Transifex translations 2020-04-23 19:05:22 +02:00
Matt-Yorkley
43836d2b30 Merge pull request #5292 from openfoodfoundation/transifex
Transifex
2020-04-23 18:53:36 +02:00
Pau Pérez Fabregat
82156e32e0 Merge pull request #4920 from luisramos0/api_var_ctrl
Bring Spree::Variant#active from Spree so that we can improve it
2020-04-23 17:35:49 +02:00
Pau Pérez Fabregat
a8ca471cd2 Merge pull request #5189 from Matt-Yorkley/mobile-buttons
[Mobile UX] Style updates on buttons
2020-04-23 12:56:49 +02:00
Luis Ramos
aa52cf8bf0 Merge pull request #5254 from chrishil1/missing_translation_save_as_default
Added missing translation to column dropdown
2020-04-23 11:08:33 +01:00
Luis Ramos
ac6501c5d8 Merge pull request #5195 from luisramos0/prod_helper
Delete dead code from several places...
2020-04-23 11:07:44 +01:00
Luis Ramos
568e570b4b Move method to more generic helper to use it in mailers 2020-04-23 16:08:10 +10:00
Luis Ramos
42be6c905f Added spec for OrderPaymentFinder 2020-04-23 16:08:10 +10:00
Luis Ramos
d482cccefe Use OrderPaymentFinder methods instead of payments.last and payments.pending.last 2020-04-23 16:08:10 +10:00
Luis Ramos
52becf6abc Extract payment method logic from OrderPaymentFinder into the orders helper 2020-04-23 16:08:10 +10:00
Transifex-Openfoodnetwork
15319d66e2 Updating translations for config/locales/es_CR.yml 2020-04-23 12:27:58 +10:00
Robin Klaus
d8f4df4bcc Fixed missing translation, added keys to en.yml file 2020-04-23 09:58:47 +10:00
dependabot-preview[bot]
240d4a7802 Bump mini_racer from 0.2.9 to 0.2.10
Bumps [mini_racer](https://github.com/discourse/mini_racer) from 0.2.9 to 0.2.10.
- [Release notes](https://github.com/discourse/mini_racer/releases)
- [Changelog](https://github.com/rubyjs/mini_racer/blob/master/CHANGELOG)
- [Commits](https://github.com/discourse/mini_racer/compare/v0.2.9...v0.2.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-22 19:41:50 +00:00
Luis Ramos
3dff11e405 Merge pull request #5182 from luisramos0/nokogiri
Bump Nokogiri
2020-04-22 20:40:04 +01:00
Pau Perez
2d9b41729e Use memory cache-store when profiling
Or you want see any change when playing fragment-caching or other caching
strategies.
2020-04-22 17:56:56 +02:00
Pau Perez
de8d8e658c Add PROFILE var to set production-like settings
I took this from a recent newsletter I read. Sometimes replication
performance issues locally is actually slower than production due to dev
mode settings (code reloading, etc.), heavy de-only gems and the asset
pipeline.

The PROFILE env var switches these settings all at the same time,
giving us an environment closer to production, essential for reliable
profiling. Then, rack-mini-profiler is going to be more accurate.

Apparently it's something
[RubyGems](b026df86ae/config/environments/development.rb (L72-L92))
and
[CodeTriage](a3c957647d)
both use.
2020-04-22 17:53:17 +02:00
Pau Pérez Fabregat
a7013b5542 Merge pull request #5241 from Matt-Yorkley/remove-old-migrations
Remove old migrations!
2020-04-22 17:01:01 +02:00
Maikel
24fe7e8878 Merge pull request #5280 from openfoodfoundation/transifex
Transifex
2020-04-22 16:08:57 +10:00
Maikel
eb94c5a5bd Merge pull request #5283 from Matt-Yorkley/customer-tags
Fix disappearing tags issue
2020-04-22 16:03:17 +10:00
Matt-Yorkley
4ef61b642e Fix disappearing tags issue 2020-04-22 01:33:38 +02:00
Luis Ramos
23f4faf192 Merge pull request #4841 from luisramos0/kill_rabl
Hide broken product taxons field, remove last rabl template and rabl itself
2020-04-21 18:49:12 +01:00
Transifex-Openfoodnetwork
becd57f7a4 Updating translations for config/locales/fr.yml 2020-04-21 22:52:47 +10:00
Transifex-Openfoodnetwork
2e4b224d48 Updating translations for config/locales/en_FR.yml 2020-04-21 22:42:53 +10:00
Transifex-Openfoodnetwork
2b210bd096 Updating translations for config/locales/fr.yml 2020-04-21 22:42:34 +10:00
Matt-Yorkley
53183b8598 Eager-load properties in inject_enterprise_and_relatives 2020-04-21 11:13:20 +02:00
Pau Perez
91306d5ce4 Update all locales with the latest Transifex translations 2020-04-21 10:13:00 +02:00
Pau Pérez Fabregat
e20e19f963 Merge pull request #5244 from coopdevs/include-deleted-variants-and-products
Include deleted products in OC mailer
2020-04-20 20:46:21 +02:00
Luis Ramos
2ab07bc6a9 Make search box font size be 16px so that no zoom happens on iphone 2020-04-18 18:50:25 +01:00
Luis Ramos
15e56b21ae Merge pull request #5229 from chrishil1/missing_translation
Added missing translations to enterprise_relationship page
2020-04-18 18:15:54 +01:00
Luis Ramos
629db3ae4d Merge pull request #5230 from chrishil1/missing_translation_2
Add product translations to admin order creation
2020-04-18 18:15:01 +01:00
Luis Ramos
43274ecb4f Remove dead code
Dead since https://github.com/openfoodfoundation/openfoodnetwork/pull/3305
2020-04-18 14:47:33 +01:00
Luis Ramos
437c7367db Remove dead code 2020-04-18 14:37:07 +01:00
Lucas Hiago
acfe0c540a Create instagram css property and apply 2020-04-18 10:06:14 -03:00
Lucas Hiago
ac2ab34e11 Add connect with us footer to customer order confirmation email 2020-04-18 10:06:06 -03:00
Lucas Hiago
41c0204cfa Update instagram and linkedin links 2020-04-18 10:05:59 -03:00
Luis Ramos
910cc99c2f Add spec to cover orders_controller watch sortOptions 2020-04-18 10:23:02 +01:00
David Cook
a0a361673a Fix sorting of orders
(wrong copied function call)
2020-04-18 15:03:39 +10:00
jeffrey s hill md
70005a99a3 Added missing translations 2020-04-17 17:02:37 -05:00
Luis Ramos
8f8dce4bab Do not render inventory items in the shipment that dont have a line item in the order 2020-04-17 20:23:29 +01:00
Luis Ramos
8973a1b76c Merging 6 specs in one takes around 1 minute of execution time 2020-04-17 20:18:13 +01:00
Luis Ramos
c1b28543c6 Extract print ticket spec to a separate file 2020-04-17 20:07:45 +01:00
Luis Ramos
c33352904a Make spec a bit more resilient 2020-04-17 18:48:20 +01:00
Luis Ramos
8bd3062b16 Fix rubocop issues 2020-04-17 18:17:54 +01:00
jeffrey s hill md
ed91c179cd Changed translation paths 2020-04-17 12:04:27 -05:00
Luis Ramos
c7fb85a715 Replace background with members with before with let statements 2020-04-17 17:34:36 +01:00
Luis Ramos
e901615b61 Make spec simpler 2020-04-17 16:56:56 +01:00
Pau Perez
d8e6d98912 Preload line item's option_values
This fixes an N+1 with the query

```sql
SELECT "spree_option_values".* FROM "spree_option_values"
INNER JOIN "spree_option_types"
  ON "spree_option_types"."id" = "spree_option_values"."option_type_id"
INNER JOIN "spree_option_values_line_items"
  ON "spree_option_values"."id" = "spree_option_values_line_items"."option_value_id"
WHERE "spree_option_values_line_items"."line_item_id" = 1679
ORDER BY spree_option_types.position asc
```
2020-04-17 17:34:53 +02:00
Luis Ramos
c455dfb609 Make some specs faster by going directly to the order edit page and move incomplete order spec to a specific context 2020-04-17 16:28:27 +01:00
Pau Perez
63eb0980eb Memoize result of line items query
No need to fetch twice what we just loaded from DB.
2020-04-17 17:27:21 +02:00
Pau Perez
06ead827d8 Split long method 2020-04-17 17:27:21 +02:00
Pau Perez
6dd4a866e5 Address some Rubocop violations 2020-04-17 17:25:35 +02:00
Pau Perez
04c962432a Skip deleted default_scope in OC notification
This fixes the RuntimeError we get when accessing deleted variants due
to the variant being nil.

https://github.com/rails/rails/issues/11036 is still an open Rails bug,
as some people mention in https://github.com/rails/rails/pull/21550.

The issue is that `includes` doesn't respect `unscoped`. I found
a potential solution for the entire app in
https://github.com/rails/rails/issues/11036#issuecomment-302133116 but
our friend @markets has a gem,
https://github.com/markets/unscoped_associations, that solves that too.
2020-04-17 17:25:34 +02:00
Luis Ramos
d96d6b2337 Split orders_spec in two: tests for orders list page and tests for orders edit page 2020-04-17 15:21:03 +01:00
Luis Ramos
9147518422 Remove some unnecessary code 2020-04-17 14:51:06 +01:00
Luis Ramos
d23397f250 Move float test to a separate context 2020-04-17 14:49:09 +01:00
blainebillings
993a684e44 Add Price Sack Spec for Float Amounts 2020-04-17 14:43:28 +01:00
blainebillings
427dc54945 Change Result of PriceSack Calculation from Integers to Floats 2020-04-17 14:43:28 +01:00
Luis Ramos
ffceff3f0a Update GETTING_STARTED.md
Update link to osx catalina setup guide in wiki
2020-04-17 11:41:02 +01:00
Maikel Linke
b5d159e163 Add cache to mirror_db script
Also added some better error handling around image syncing.
2020-04-17 16:09:22 +10:00
Maikel Linke
4658a53aeb Update translations from Transifex 2020-04-17 15:37:54 +10:00
Maikel
3bc834435d Merge pull request #5152 from Matt-Yorkley/missing-indexes
Add missing indexes to spree_orders and spree_products
2020-04-17 15:16:03 +10:00
Maikel
9111ff1a38 Merge pull request #5211 from openfoodfoundation/transifex
Transifex
2020-04-17 14:24:26 +10:00
Maikel
b0eac1ecaa Merge branch 'master' into missing-indexes 2020-04-17 14:17:32 +10:00
Maikel
2e31f234d6 Merge pull request #5196 from Matt-Yorkley/customers-performance
Admin Customers performance
2020-04-17 13:28:39 +10:00
Maikel
e29a81cacc Merge pull request #5186 from oeoeaio/customer-totals-inventory-sku
Take sku overrides into account in customer totals report
2020-04-17 13:27:43 +10:00
Maikel
a672af1a79 Merge pull request #5237 from luisramos0/master_with_change
Clone of #5176
2020-04-17 13:27:14 +10:00
Maikel Linke
75207247e6 Correct database commands 2020-04-17 12:52:05 +10:00
Maikel Linke
8af40f4675 Format and indent migration message
It's much clearer to read this way:

```
==  OldMigrationsRemoved: migrating ===========================================
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

      You haven't updated your dev environment in a long time!
      Legacy migration files before 2019 have now been removed.
      Run `rails db:schema:load` before running `rails db:migrate`.

```
2020-04-17 12:47:49 +10:00
Maikel Linke
63ac6c5088 Remove superfluous conditional
A migration's `up` method is only run when the migration needs to be
applied. The only case we could have a higher version number is when a
migration with a higher version got merged before the current one. And
in that case, we still want this migration to fail, because it hasn't
been applied yet.
2020-04-17 12:40:54 +10:00
jeffrey s hill md
d8444dcf3c Added placeholders 2020-04-16 14:59:41 -05:00
Matt-Yorkley
71c7c35679 Remove old migrations! 🎉 2020-04-16 13:44:18 +02:00
Maikel
f282ff805d Merge pull request #5172 from kristinalim/feature/5170-increase_locale_chars_in_spree_users
Increase max characters for locale in spree_users
2020-04-16 18:18:45 +10:00
Transifex-Openfoodnetwork
2f7dc9a578 Updating translations for config/locales/es.yml 2020-04-16 17:09:44 +10:00
chrishil1
a9829ba5d9 Update _enterprise_relationship.html.haml 2020-04-15 17:01:22 -05:00
Luis Ramos
8532fa16cd Merge pull request #5202 from luisramos0/improve_checkout_js
Improve Checkout error handling in JS
2020-04-15 22:25:05 +01:00
chrishil1
c3f01be580 Fixed display all required tag 2020-04-15 19:00:35 +01:00
Luis Ramos
fcc746a1b7 Fix long lines in payments_controller_spec 2020-04-15 16:18:17 +01:00
Luis Ramos
8f7b3df9b5 Make payment controller authorize stripe_sca payments before processing them or advancing order workflow (that also calls payment.process) 2020-04-15 16:07:34 +01:00
jeffrey s hill md
e23045b19e Add product translations 2020-04-14 14:15:57 -05:00
jeffrey s hill md
5e1dea61a8 added missing translations to enterprise_relationship page 2020-04-14 11:20:56 -05:00
Luis Ramos
cedf1b26f2 If no flash is sent from the server, show the generic error 2020-04-14 14:31:34 +01:00
Luis Ramos
47a93568dc Make code simpler by extracting methods 2020-04-14 13:55:20 +01:00
Luis Ramos
62471bf2ab Clear Loading spinner when exception is caught 2020-04-14 13:50:38 +01:00
Luis Ramos
cdf5bcb7eb Improve unexpected error handling and add test cases for it 2020-04-14 13:44:58 +01:00
Luis Ramos
7414047b92 Switch from old success/error to modern then/catch structure
Catch() will get a few more errors then errors()

Also, add try/catch inside catch to detect any errors parsing the
response error payload
2020-04-14 13:04:28 +01:00
Pau Pérez Fabregat
4ef5dfe430 Merge pull request #5199 from openfoodfoundation/dependabot/bundler/rubocop-rails-2.5.2
Bump rubocop-rails from 2.5.1 to 2.5.2
2020-04-14 10:17:59 +02:00
Pau Pérez Fabregat
e58a1d080f Merge pull request #5205 from openfoodfoundation/dependabot/bundler/ddtrace-0.34.2
Bump ddtrace from 0.34.1 to 0.34.2
2020-04-14 10:17:06 +02:00
Luis Ramos
357a88fa22 Merge pull request #4786 from luisramos0/stripe_sca_extra_subs_fix
Make StripeSCA (with new authorize/purchase workflow) work with Subscriptions again
2020-04-13 17:21:53 +01:00
Rob H
f71045b3f2 Improve naming of variables in VariantOverridesIndexed for readability 2020-04-13 22:24:25 +10:00
Rob H
dcdd3f2444 Modify interface of VariantOverridesIndexed#indexed
Stop using keyword args and accept variant_ids instead of line_items
2020-04-13 22:11:58 +10:00
Rob H
6820919552 Rename VariantOverrides class to VariantOverridesIndexed 2020-04-13 21:56:37 +10:00
Rob H
4a4173bdc0 Move VariantOverrides class to app/services 2020-04-13 21:54:10 +10:00
Rob H
9a7e782102 Only load up variant overrides for relevant hubs 2020-04-13 12:07:17 +10:00
Transifex-Openfoodnetwork
9fa892346e Updating translations for config/locales/es_CR.yml 2020-04-13 10:30:00 +10:00
Transifex-Openfoodnetwork
7341912390 Updating translations for config/locales/pt_BR.yml 2020-04-12 07:14:21 +10:00
Transifex-Openfoodnetwork
d0c797b797 Updating translations for config/locales/es_CR.yml 2020-04-12 07:12:21 +10:00
Transifex-Openfoodnetwork
cb2e17d7dc Updating translations for config/locales/es_CR.yml 2020-04-12 07:09:21 +10:00
Transifex-Openfoodnetwork
147654df41 Updating translations for config/locales/es_CR.yml 2020-04-12 07:05:59 +10:00
Rob H
14cf168e3b Take sku overrides into account in customer totals report 2020-04-11 16:05:15 +10:00
dependabot-preview[bot]
c3ee7b7c64 Bump ddtrace from 0.34.1 to 0.34.2
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.34.1 to 0.34.2.
- [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.34.1...v0.34.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-10 19:19:13 +00:00
Matt-Yorkley
a6414b6dbe Make sure taggable_type is 'Customer' when querying customer tags 2020-04-10 20:14:14 +02:00
Luis Ramos
eafffa2c23 Update all locales with the latest Transifex translations 2020-04-10 13:08:11 +01:00
Luis Ramos
82a4753eec Merge pull request #5191 from openfoodfoundation/transifex
Transifex
2020-04-10 13:05:30 +01:00
Matt-Yorkley
b92e858448 Merge pull request #5197 from Matt-Yorkley/cart-populate-performance
Cart populate performance
2020-04-10 11:41:56 +02:00
Matt-Yorkley
4c41c84cc1 Refactor tag rules loading for customers
Fixes N+1 queries on customer tags
2020-04-10 10:12:32 +02:00
Matt-Yorkley
e53f733966 Eager-load addresses in customer serializer 2020-04-10 08:20:15 +02:00
Matt-Yorkley
2a8809e6e8 Eager-load default card in customer serializer 2020-04-10 08:20:15 +02:00
Matt-Yorkley
31a54e49c5 Allow User#default_card to work with eager-loading 2020-04-10 08:20:13 +02:00
Luis Ramos
b5ba2acb21 Merge pull request #5169 from jeduardo824/enhancement/5102-make-shop-names-links
make shop name a link on /account
2020-04-09 22:01:34 +01:00
dependabot-preview[bot]
0fabde8849 Bump rubocop-rails from 2.5.1 to 2.5.2
Bumps [rubocop-rails](https://github.com/rubocop-hq/rubocop-rails) from 2.5.1 to 2.5.2.
- [Release notes](https://github.com/rubocop-hq/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop-hq/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop-hq/rubocop-rails/compare/v2.5.1...v2.5.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-09 19:21:30 +00:00
Transifex-Openfoodnetwork
e97a16cb40 Updating translations for config/locales/ca.yml 2020-04-10 04:14:21 +10:00
Luis Ramos
314fed063d Merge property with property_decorator both in our codebase 2020-04-09 19:09:22 +01:00
Luis Ramos
0d5c08c363 Remove dead code, there's no Spree::Money in app/models/spree and the Spree::Money in lib/spree already has a class_eval with this function 2020-04-09 19:06:05 +01:00
Matt-Yorkley
57d87a8042 Eager-load variant stock items
Avoids another N+1
2020-04-09 19:55:08 +02:00
Matt-Yorkley
0ca87580e8 Load variants in cart in one query
Avoids an N+1
2020-04-09 19:55:06 +02:00
Luis Ramos
59f56cb0f6 Remove before delivery method in checkout controller, this differentiator is never used in OFN, only in Spree frontend code 2020-04-09 17:32:28 +01:00
Matt-Yorkley
cf712e9478 Select only enterprise id 2020-04-09 17:41:13 +02:00
Luis Ramos
2ff8356c63 Delete dead code from products helper 2020-04-09 16:33:17 +01:00
Luis Ramos
59e0f3d9f4 Merge pull request #5175 from Matt-Yorkley/memoize-scoper
Memoize ScopeProductToHub in product list
2020-04-09 14:45:57 +01:00
Luis Ramos
fc5aff8c79 Merge pull request #5145 from luisramos0/inv_perf
Performance improvements to Inventory page
2020-04-09 13:56:33 +01:00
Luis Ramos
4aad80c134 Update message for capybara with new upgrade blocker 2020-04-09 13:39:40 +01:00
Luis Ramos
71ffa6b178 Upgrade nokogiri as much as possible (it's not an explicit dependency of OFN and we dont need to control the version now, so I remove it from Gemfile) 2020-04-09 13:39:40 +01:00
Luis Ramos
e3de71668a Depend on a spree version in which spree_core doesnt depend on deface AND remove deface from list of dependencies 2020-04-09 13:39:40 +01:00
Luis Ramos
dd717fe8ac Merge pull request #5184 from Matt-Yorkley/inventory-loading
Inventory loading
2020-04-09 13:26:12 +01:00
Luis Ramos
6341c5fd80 Merge pull request #4964 from luisramos0/po_fix
Fix proxy orders controller in rails 4 by removing the use of responders
2020-04-09 10:12:33 +01:00
Matt-Yorkley
47ac6c1491 Remove unused methods from ProductSimpleSerializer 2020-04-09 09:51:32 +02:00
Matt-Yorkley
6afda141a1 Remove track_inventory_levels conditional
This value is always true in OFN
2020-04-09 09:19:37 +02:00
Matt-Yorkley
5bb2614f9d Refactor PagedFetcher so it makes one request at a time 2020-04-09 09:19:37 +02:00
Matt-Yorkley
b3c968856b Fix some rubocop issues 2020-04-09 09:19:37 +02:00
Matt-Yorkley
b0a7497f2a Remove another N+1 in product serialization 2020-04-09 09:19:37 +02:00
Matt-Yorkley
f959e632ea Modify Spree::Stock::Quantifier to not re-fetch stock items if they are already eager-loaded
This helps to remove a big N+1 here, and will also be very helpful elsewhere in the app
2020-04-09 09:19:37 +02:00
Matt-Yorkley
f9cf826f1c Bring Spree::Stock::Quantifier in to OFN
This is the original unmodified Class from Spree. Modifications added in subsequent commits.
2020-04-09 09:19:36 +02:00
Matt-Yorkley
ececbce596 Only select id in producers query 2020-04-09 09:16:44 +02:00
Matt-Yorkley
1b7ac1a252 Don't re-use fat serializers when thin ones are needed.
This cuts the pageload and query count in half, again.
2020-04-09 09:10:41 +02:00
Transifex-Openfoodnetwork
d31b24786a Updating translations for config/locales/en_NZ.yml 2020-04-09 16:16:24 +10:00
Matt-Yorkley
374bf04118 Merge pull request #5142 from Matt-Yorkley/shops-firefighting
Don't load distributed properties on inactive distributors
2020-04-08 20:45:01 +02:00
Matt-Yorkley
3aff7f62e3 Don't query distributed properties on enterprises that aren't active distributors
Cuts page load on /shops by ~75% (with production data) and removes ~300 expensive and superfluous queries.
2020-04-08 20:08:12 +02:00
Matt-Yorkley
fc5e346a06 Merge pull request #5156 from Matt-Yorkley/closed-shops
Load closed shops in a separate request on /shops page
2020-04-08 20:05:26 +02:00
Matt-Yorkley
538e4e54d2 Set cart buttons to fixed width and expand when screen is too small 2020-04-08 11:19:14 +02:00
Matt-Yorkley
1ddbabd841 Adjust colours of primary buttons to use (bright) orange instead of (warning) red 2020-04-08 10:57:33 +02:00
Matt-Yorkley
0414f4984d Align buttons left and right on cart page 2020-04-08 10:55:55 +02:00
Matt-Yorkley
9c421e146e Remove arrows from cart and checkout buttons 2020-04-08 10:23:18 +02:00
Luis Ramos
29bbf2fa74 Merge pull request #5088 from coopdevs/do-not-recreate-when-booting-docker
Do not reset the dev env when booting docker
2020-04-07 21:56:09 +01:00
Matt-Yorkley
64c66ddedc Eager-load variant data for overridable products
Cuts query count and page load time in half for this endpoint.
2020-04-07 15:16:32 +02:00
Luis Ramos
e0e2c32d9f Merge pull request #5177 from openfoodfoundation/dependabot/bundler/oj-3.10.6
Bump oj from 3.10.5 to 3.10.6
2020-04-07 11:44:09 +01:00
Matt-Yorkley
003341ef7a Add loading indicator when showing closed shops 2020-04-07 10:40:49 +02:00
Matt-Yorkley
94f8ea2f93 Fix flicker effect showing 3 buttons when clicking "Show Closed Shops" button 2020-04-07 10:31:56 +02:00
Kristina Lim
e6cd33ee57 Increase max characters for locale in spree_users
There are many locales that have six (6) characters.
2020-04-07 15:08:49 +08:00
Maikel
eb64112b22 Merge pull request #5144 from openfoodfoundation/transifex
Transifex
2020-04-07 16:23:35 +10:00
Maikel
3e14b62b46 Merge pull request #5136 from openfoodfoundation/dependabot/bundler/ddtrace-0.34.1
Bump ddtrace from 0.34.0 to 0.34.1
2020-04-07 16:05:53 +10:00
Maikel
3244650932 Merge pull request #5135 from openfoodfoundation/dependabot/bundler/rubocop-rails-2.5.1
Bump rubocop-rails from 2.5.0 to 2.5.1
2020-04-07 16:05:18 +10:00
Transifex-Openfoodnetwork
b6753a2593 Updating translations for config/locales/fil_PH.yml 2020-04-07 16:03:57 +10:00
Transifex-Openfoodnetwork
1b119805b4 Updating translations for config/locales/fil_PH.yml 2020-04-07 15:15:12 +10:00
Transifex-Openfoodnetwork
edde7689a9 Updating translations for config/locales/de_DE.yml 2020-04-07 13:57:54 +10:00
Transifex-Openfoodnetwork
8060977786 Updating translations for config/locales/en_GB.yml 2020-04-07 13:54:53 +10:00
Transifex-Openfoodnetwork
837a345958 Updating translations for config/locales/en_FR.yml 2020-04-07 13:54:46 +10:00
dependabot-preview[bot]
7c5e511fde Bump oj from 3.10.5 to 3.10.6
Bumps [oj](https://github.com/ohler55/oj) from 3.10.5 to 3.10.6.
- [Release notes](https://github.com/ohler55/oj/releases)
- [Changelog](https://github.com/ohler55/oj/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/ohler55/oj/compare/v3.10.5...v3.10.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-06 19:24:48 +00:00
Luis Ramos
d18a06a0f7 Merge pull request #4783 from luisramos0/stripe_sca_extra_subs
Move all subscriptions services to the OrderManagement engine
2020-04-06 20:20:02 +01:00
Luis Ramos
d23b4fd307 Merge pull request #5174 from coopdevs/change-pool-size
Allow changing the connection pool size
2020-04-06 19:29:09 +01:00
Matt-Yorkley
2cb4c6bec2 Memoize OpenFoodNetwork::ScopeProductToHub
This means we avoid fetching all of the hub's variants every time we scope a product. Applies to every product loaded when displaying a shops's product list.
2020-04-06 19:41:05 +02:00
Pau Pérez Fabregat
924e816a5b Merge pull request #5151 from luisramos0/fix_order_perms
Fix Permissions::Order spec in rails 4
2020-04-06 18:07:39 +02:00
Pau Pérez Fabregat
109da43905 Merge pull request #2 from luisramos0/do-not-recreate-when-booting-docker
Re-add setup instructions removed from docker-compose into Dockerfile…
2020-04-06 16:55:59 +02:00
Pau Perez
33ca6a2096 Allow changing the connection pool size
This allows us to tune for UK. The hypothesis from @kristinalim is:

> From what I understand, it can result to Rails processes waiting for
each other to complete, while the DB server can take more simultaneous
connections.
2020-04-06 16:03:06 +02:00
Eduardo
e7b780f963 make shop name a link on /account 2020-04-06 08:34:24 -03:00
dependabot-preview[bot]
13cba3d244 Bump ddtrace from 0.34.0 to 0.34.1
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.34.0 to 0.34.1.
- [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.34.0...v0.34.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-06 11:27:10 +00:00
Matt-Yorkley
ce45e7cf71 Merge pull request #5162 from Matt-Yorkley/unicorn-worker-killer
Add optional unicorn-worker-killer configs
2020-04-06 13:25:22 +02:00
Matt-Yorkley
ba5a56db14 Make upper and lower bounds configurable 2020-04-06 10:39:51 +02:00
Matt-Yorkley
276dcf4a3b Add optional unicorn-worker-killer configs 2020-04-06 10:39:50 +02:00
Transifex-Openfoodnetwork
dcfb1aec6d Updating translations for config/locales/en_PH.yml 2020-04-06 18:11:07 +10:00
Pau Pérez Fabregat
fde2aac366 Merge pull request #5163 from coopdevs/collect-Ruby-GC
Enable Ruby Runtime Metrics in Datadog
2020-04-05 14:32:54 +02:00
Luis Ramos
63138aef30 Re-add setup instructions removed from docker-compose into Dockerfile and Docker.md 2020-04-05 00:06:31 +01:00
Pau Perez
7612415991 Enable Ruby Runtime Metrics in Datadog
This automatically collects a bunch of Ruby's GC-related metrics that
will come in handy while we tune the Unicorn workers. Some of theres
are:

* runtime.ruby.class_count
* runtime.ruby.gc.malloc_increase_bytes
* runtime.ruby.gc.total_allocated_objects
* runtime.ruby.gc.total_freed_objects
* runtime.ruby.gc.heap_marked_slots
* runtime.ruby.gc.heap_available_slots
* runtime.ruby.gc.heap_free_slots
* runtime.ruby.thread_count

Check https://docs.datadoghq.com/tracing/runtime_metrics/ruby/#data-collected for the complete list.

The cool thing is that

> Runtime metrics can be viewed in correlation with your Ruby services
2020-04-05 00:16:10 +02:00
Luis Ramos
53d901b41b Merge pull request #5064 from luisramos0/fix_sample_data
Fix sample data and custom paper_trail config on order_cycles and schedules on rails 4
2020-04-04 18:29:26 +01:00
Matt-Yorkley
bc859cf9f7 Add api/shops_controller and refactor 2020-04-04 17:02:27 +02:00
Matt-Yorkley
af48cac140 Load closed shops in a separate request on /shops page 2020-04-04 14:06:10 +02:00
Luis Ramos
59bb956677 Merge pull request #5010 from Matt-Yorkley/remove_simple_form
Remove simple_form
2020-04-04 11:53:06 +01:00
Matt-Yorkley
8a544f3ab3 Add missing indexes to spree_orders and spree_products 2020-04-04 10:12:15 +02:00
Luis Ramos
55b3f4d54f Move search params test case to a different context so that we dont have to set the producer of the products in the order
This is working in master by chance of the factories but breaks in rails 4 because the orders in this test dont have products supplied by the producer which is a necessary condition in the context where it was
2020-04-03 19:47:33 +01:00
Luis Ramos
452ab3a842 Add comment to better explain variant_override_set.collection_to_delete 2020-04-03 15:36:19 +01:00
Luis Ramos
a049e7a433 Add product to includes to avoid N+1 queries to fetch products when VO authorization is done right after this 2020-04-03 14:48:06 +01:00
Transifex-Openfoodnetwork
97063bf47e Updating translations for config/locales/en_GB.yml 2020-04-03 23:24:25 +11:00
Luis Ramos
e64d573337 Revert accidental push of a byebug statement with the direct translations push to master 🙈 2020-04-03 12:06:39 +01:00
Luis Ramos
7858a26e5e Update all locales with the latest Transifex translations 2020-04-03 12:03:40 +01:00
Luis Ramos
4922c05bcf Merge pull request #5139 from openfoodfoundation/transifex
Transifex
2020-04-03 11:28:11 +01:00
Transifex-Openfoodnetwork
d06b7b8606 Updating translations for config/locales/de_DE.yml 2020-04-03 19:26:04 +11:00
Transifex-Openfoodnetwork
72b47fbceb Updating translations for config/locales/de_DE.yml 2020-04-03 19:22:55 +11:00
Luis Ramos
da7b0966be Merge pull request #5133 from Matt-Yorkley/cache-in-hand
Cache counts used in homepage for 24 hours
2020-04-03 08:34:58 +01:00
Luis Ramos
445eb9f287 Merge pull request #5121 from Matt-Yorkley/flaky-maps-js
Update vendor/assets/angular-google-maps.min.js
2020-04-02 22:13:51 +01:00
dependabot-preview[bot]
5b4dd57380 Bump rubocop-rails from 2.5.0 to 2.5.1
Bumps [rubocop-rails](https://github.com/rubocop-hq/rubocop-rails) from 2.5.0 to 2.5.1.
- [Release notes](https://github.com/rubocop-hq/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop-hq/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop-hq/rubocop-rails/compare/v2.5.0...v2.5.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-02 19:15:11 +00:00
Matt-Yorkley
adb61e48c5 Cache counts used in homepage for 24 hours 2020-04-02 19:09:03 +02:00
Matt-Yorkley
838ffdbf00 Add code comment for dependency 2020-04-02 17:33:10 +02:00
Pau Pérez Fabregat
fe8beb5448 Merge pull request #5099 from Matt-Yorkley/ticking-time-bom
Improve BOM
2020-04-02 16:01:48 +02:00
Matt-Yorkley
18ee5254f9 Make Geo service calls more resilient in /shops page
The Geo service is used heavily in the /shops page and especially in the search function. If the google maps js library has failed to load it was throwing a lot of fatal errors, so this change ensures the /shops page can at least: a) load, b) show some shops, and c) search for shops by name (but not location)
2020-04-02 13:56:25 +02:00
Matt-Yorkley
40f8cf660c Update vendor/assets/angular-google-maps.min.js
Fixes an issue where if the js library from maps.googleapis.com failed to load in the <head>, all of our subsequent Angular would completely break.
See: https://github.com/angular-ui/angular-google-maps
Note: `bluebird.js` is a new dependency of `angular-google-maps.js`.
2020-04-02 13:32:55 +02:00
Matt-Yorkley
2c70db7952 Merge pull request #5070 from luisramos0/master_card
Translate credit card brand so that active merchand code handles the payment correctly
2020-04-02 12:18:00 +02:00
Pau Pérez Fabregat
1a38a4e1a7 Merge pull request #5091 from openfoodfoundation/transifex
Transifex
2020-04-02 11:56:29 +02:00
Pau Pérez Fabregat
15d106bb0a Merge pull request #5116 from openfoodfoundation/dependabot/bundler/ddtrace-0.34.0
Bump ddtrace from 0.33.1 to 0.34.0
2020-04-02 11:55:53 +02:00
Pau Pérez Fabregat
c8be2fb89a Merge pull request #5125 from openfoodfoundation/dependabot/bundler/rubocop-0.81.0
Bump rubocop from 0.80.1 to 0.81.0
2020-04-02 11:54:00 +02:00
Transifex-Openfoodnetwork
b1f8f91011 Updating translations for config/locales/fr.yml 2020-04-02 18:03:11 +11:00
Transifex-Openfoodnetwork
e08606a310 Updating translations for config/locales/en_FR.yml 2020-04-02 18:02:57 +11:00
Transifex-Openfoodnetwork
2230d83729 Updating translations for config/locales/pt_BR.yml 2020-04-02 08:41:25 +11:00
dependabot-preview[bot]
d38da02113 Bump rubocop from 0.80.1 to 0.81.0
Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 0.80.1 to 0.81.0.
- [Release notes](https://github.com/rubocop-hq/rubocop/releases)
- [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop-hq/rubocop/compare/v0.80.1...v0.81.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-01 19:20:42 +00:00
Luis Ramos
0e268a171f Switch to console.error so we get a bugsnag alert everytime a user has a problem with their card
Add paymentMethodsAPI specific mapping function, we had some errors in production with mastercards probably caused by ActiveMerchant not handling the card type correctly
2020-04-01 18:58:43 +01:00
Luis Ramos
73c4eedd06 Translate credit card brand so that active merchant code handles the payment correctly
Adds a simple console.log statement in case there is an error adding the
card
2020-04-01 18:58:10 +01:00
Luis Ramos
8a220742f5 Merge pull request #5103 from jeduardo824/bug/5092-remove-blue-setence-in-payment-method-setting
remove blue sentence in payment method setting
2020-04-01 18:56:09 +01:00
Luis Ramos
9fa604db0d Merge pull request #5076 from luisramos0/rails_f_helper
Remove Rails Foundation Helper and improve error display and logging in checkout controller
2020-04-01 18:54:45 +01:00
Transifex-Openfoodnetwork
6083d91d3e Updating translations for config/locales/ca.yml 2020-04-02 01:57:50 +11:00
Transifex-Openfoodnetwork
9bdb396b86 Updating translations for config/locales/ca.yml 2020-04-02 01:54:42 +11:00
Matt-Yorkley
ad42b1b485 Remove pagination limits in BOM
We can re-assess this later, but for now it looks like some of the BOM functionality won't work if results are returned across multiple pages.
2020-04-01 13:43:21 +02:00
Luis Ramos
78170bc709 Merge pull request #4807 from openfoodfoundation/dependabot/bundler/compass-rails-4.0.0
Bump compass-rails from 3.1.0 to 4.0.0
2020-04-01 12:42:42 +01:00
Luis Ramos
957b398a54 Add call to $evalAsync() after Loading and FlashLoader are updated so
that a angular digest is triggered

This is required so that Loading.clear triggers a refresh and makes its placeholder to be cleared
2020-04-01 12:08:55 +01:00
Luis Ramos
c3d25bf163 Make checkout controller send bugsnag alerts on every checkout problem
There are two new situations here: we will see order.errors after update_attributes fails but before order restart; and we will see how often the order is not complete when the workflow finishes (maybe none)
2020-04-01 12:03:39 +01:00
Luis Ramos
ce2a164c66 Stop using f_form_for
Add labels for some fields, this was done automatically by rails foundation helper
2020-04-01 12:03:39 +01:00
Luis Ramos
b898ce1ae1 Make checkout controller add flash error if order contains any type of error
Here we add translations for a particular case where the credit card expiry date is in the past
2020-04-01 12:03:39 +01:00
Luis Ramos
409681b7af Merge pull request #5089 from Matt-Yorkley/checkout-scoping
Cart variant scoping
2020-04-01 11:49:23 +01:00
Luis Ramos
9317549103 Merge pull request #4813 from luisramos0/oc_selector
If there's only one OC available to the customer because there are tag rules hidding other OCs, select that OC by default
2020-04-01 10:44:58 +01:00
dependabot-preview[bot]
b22ad244f9 Bump ddtrace from 0.33.1 to 0.34.0
Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.33.1 to 0.34.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.33.1...v0.34.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-31 19:40:01 +00:00
Transifex-Openfoodnetwork
9c17a91215 Updating translations for config/locales/en_GB.yml 2020-04-01 05:07:08 +11:00
Luis Ramos
6a1c541479 Remove specific error color on checkout page so that the error message takes the default foundation error color which is white 2020-03-31 16:32:33 +01:00
Luis Ramos
6c64261868 Merge pull request #5113 from mkllnk/5110-bugsnag-js-logging
Add Bugsnag JS logging
2020-03-31 15:51:12 +01:00
Matt-Yorkley
f437d0f8a0 Report environment correctly in Bugsnag JS 2020-03-31 15:59:17 +02:00
Transifex-Openfoodnetwork
79d6d7cc9e Updating translations for config/locales/de_DE.yml 2020-03-31 22:09:16 +11:00
Matt-Yorkley
e200ece280 Rename partial to bugsnag_js for clarity 2020-03-31 12:57:12 +02:00
Matt-Yorkley
30bf9257ab Move conditional inside partial and use default key as fallback 2020-03-31 12:55:28 +02:00
Matt-Yorkley
03e229da08 Add bugsnag js script to admin layout above all.js 2020-03-31 12:25:42 +02:00
Maikel Linke
28473c9087 Add Bugsnag JS logging 2020-03-31 15:51:04 +11:00
Matt-Yorkley
09c8819e5a Remove unnecessary Bugsnag calls
The Bugsnag notification was just here to see if this was dead code. It's not.
2020-03-30 20:36:45 +02:00
Matt-Yorkley
f7c047b798 Memoize ScopeVariantToHub to avoid fetching the hub's overrides each time 2020-03-30 20:33:27 +02:00
Luis Ramos
635ea9c505 Fix some long lines on variant_decorator 2020-03-30 11:21:47 +01:00
Luis Ramos
fbbe586996 Avoid rails 3 bug where the first where clause is overriden by a second where clause
Co-Authored-By: Maikel <maikel@email.org.au>
2020-03-30 11:21:47 +01:00
Luis Ramos
a5184cce9d Make method a bit more readable and add comment with details 2020-03-30 11:21:47 +01:00
Luis Ramos
69b57544f1 Bring Spree::Variant#active so that we can make it return just variants without includes
This makes the variants returned not readonly in rails 4 and thus fixes a spec in Spree::VariantsController#destroy
2020-03-30 11:21:47 +01:00
Eduardo
b6da0e2092 remove @payment_method explict variable from the view 2020-03-29 20:32:55 -03:00
Matt-Yorkley
95963c5732 Refactor Angular line_items_controller 2020-03-29 19:54:49 +02:00
Matt-Yorkley
aba1b5b67a Add pagination specs and refactor 2020-03-29 19:54:49 +02:00
Matt-Yorkley
fe58121c7f Fix clear filters button 2020-03-29 19:54:49 +02:00
Matt-Yorkley
5c4a2c2790 Update javascript specs 2020-03-29 19:54:49 +02:00
Matt-Yorkley
a07281910b Fix dropdown placeholders 2020-03-29 19:54:49 +02:00
Matt-Yorkley
72f9da3ac4 Fix regex validation and HTML "type" settings not allowing decimals for final_weight_volume
`final_weight_volume` can be a decimal, and often *is* in production data. Not regarding them as valid was breaking the form submission in various cases
2020-03-29 19:54:49 +02:00
Matt-Yorkley
375b4648dc Add pagination to Bulk Order Management 2020-03-29 19:54:47 +02:00
Transifex-Openfoodnetwork
9af0a39305 Updating translations for config/locales/en_FR.yml 2020-03-29 06:43:01 +11:00
Transifex-Openfoodnetwork
6817231f29 Updating translations for config/locales/fr.yml 2020-03-29 06:42:36 +11:00
Matt-Yorkley
7c7f9551d6 Fix bug in order cycle select dropdown
The date filters were being filled with the string: "Invalid date" because momentjs was not able to parse the input
2020-03-28 15:17:31 +01:00
Matt-Yorkley
d568b45d4a Limit spamming the server with lots of requests
This uses "debounce" to add a little waiting time whilst the user is part-way through selecting dates (or manually typing in the date filter) so we don't make too many unnecessary requests.
2020-03-28 11:20:23 +01:00
Matt-Yorkley
b76a6d15a3 Improve date field query triggers
Don't submit the request if the user is part-way through typing something in the date field and the date is (currently) invalid; this results in the date ranges being broken and triggering a query for *all* results (with no date range).
2020-03-28 11:16:25 +01:00
Luis Ramos
940423acfc Merge pull request #5067 from gao329700254/fix/fix_fr_translation_in_order_cycles_outgoing(4937)
Fix translation missing in order cycles outgoing page (closed #4937)
2020-03-27 22:00:19 +00:00
Transifex-Openfoodnetwork
6a57aa3b29 Updating translations for config/locales/en_FR.yml 2020-03-28 04:08:31 +11:00
Transifex-Openfoodnetwork
ca78e9d0e2 Updating translations for config/locales/fr.yml 2020-03-28 04:08:17 +11:00
Luis Ramos
e705e88007 Merge pull request #5087 from luisramos0/custom_data
Fix bug in subscriptions logging by making versions.custom_data a longer field
2020-03-27 16:04:31 +00:00
Pau Pérez Fabregat
1fbb9fa3df Merge pull request #5083 from openfoodfoundation/transifex
Transifex
2020-03-27 16:51:30 +01:00
Matt-Yorkley
71f00f9283 Remove comment warning about this issue 2020-03-27 14:23:48 +01:00
Matt-Yorkley
7d33a237d0 Add scoping to VariantsStockLevels when variant is not in the order 2020-03-27 14:15:15 +01:00
Matt-Yorkley
857cacb74b Add test for additional case where variant is not in the order 2020-03-27 14:03:17 +01:00
Matt-Yorkley
fbfe663ebc Add variant scoping to VariantStockLevels 2020-03-27 13:38:57 +01:00
Matt-Yorkley
83b90f3167 Add spec variant override test to VariantsStockLevels 2020-03-27 13:31:39 +01:00
Luis Ramos
14fd9a121e Make versions.custom_data text so it can take longer lists 2020-03-27 11:34:01 +00:00
Pau Perez
904e89e325 Do not reset the dev env when booting docker
The current web container's command destroys anything you might have in
your local DB from a previous session, assuming you always want start
from a clean environment. This is hardly the case and makes
`docker-compose up` take quite long. What if you just stopped containers
temporally while developing?

This changes the approach to not assume anything. If you need to install
a new gem or reset your DB just run the commands you would without
docker. You can run anything you want with `docker-compose run web bundle exec
<rails/rake command>` anyway.

For someone setting things for the first time, the `Dockerfile` process
still installs all dependencies.
2020-03-27 12:17:09 +01:00
Transifex-Openfoodnetwork
2e98b0b5c1 Updating translations for config/locales/en_GB.yml 2020-03-27 01:40:20 +11:00
Luis Ramos
523faa670d Remove FoundationRailsHelper, this is dead code now 2020-03-25 17:31:56 +00:00
Luis Ramos
e5e9325499 Fix paper_trail custom_data for order_cycle, custom data must be a string, cant be an array 2020-03-25 15:35:51 +00:00
Luis Ramos
2e4f8003b6 Fix group factory in rails 4
params[:address] was breaking the creation of the EnterpriseGroup
2020-03-25 15:32:16 +00:00
Yuhao Gao
60d9edb185 fix translation missing in order cycles outgoing page (closed #4937) 2020-03-25 21:51:13 +09:00
Matt-Yorkley
e014e6c1a4 Ensure perform_deliveries is correctly set when testing user confirmation emails 2020-03-24 13:12:20 +00:00
Luis Ramos
9994bc75ca Adapt reports controller to handle routes of reports in the order_management engine differently 2020-03-20 11:07:23 +00:00
Luis Ramos
3f5a964dec Move enterprise_fee_summaries_spec to order_management engine, moving
translation keys for the views and adapting some routes
2020-03-20 11:07:23 +00:00
Luis Ramos
b4befea606 Fix namespace in spec 2020-03-20 11:07:23 +00:00
Luis Ramos
58465c4645 Adapt routes placeholder in the new catalog engine to make it similar to the other engines 2020-03-20 11:07:23 +00:00
Luis Ramos
0b05312f19 Move cookies spec to web engine and adapt routes to the fact they are now normal main apps routes 2020-03-20 11:07:23 +00:00
Luis Ramos
e209452f8b Make engine routes just prepend to apps routes instead of creating engine routes
This makes things a bit simpler in terms of routing, we avoid a problem running specs and we can still have the engine routes separated in specific files
2020-03-20 11:07:23 +00:00
Luis Ramos
a8078b22f8 Move enterprise fees summaries controller and views to ordermanagement engine 2020-03-20 11:07:23 +00:00
Luis Ramos
0e62dc04bd Improve comments to explain glitch on set_order_cycle and OrderCyclesList 2020-03-20 09:47:59 +00:00
Luis Ramos
e2940eb9ff Add namespace to OrderCyclesList
Shop will probably be the name of the future engine/domain for the shopfront pages
2020-03-20 09:47:59 +00:00
Luis Ramos
1c1f066884 Extract Shop::OrderCyclesList from base_controller 2020-03-20 09:47:59 +00:00
Luis Ramos
d5cf355a11 Call fetch_order_cycles from reset_order_cycles so we dont repeat the calculation
BaseController#set_order_cycle cant be used in reset_order_cycle because it will empty the order if the OC is not defined previously
2020-03-20 09:47:59 +00:00
Luis Ramos
d2eee1dafd Extract and fix reset_order_cycle logic from set_order_cycles: ActiveRecord.count will reload the relation and ignore the changes done by the TagRuleApplicator 2020-03-20 09:46:05 +00:00
Luis Ramos
540b26105f Delete dead code in oc helper 2020-03-20 09:46:05 +00:00
Matt-Yorkley
45b5e838b7 Remove simple_form
It looks like we don't use this at all. Discovered during the Spree 2.1 upgrade.
2020-03-17 17:03:48 +01:00
Luis Ramos
da837ff100 Remove rabl dependency 🎉 2020-03-17 15:51:50 +00:00
Luis Ramos
da2598282b Can be object or {}, it's what the injector is doing, not related to rabl any more 2020-03-17 15:51:26 +00:00
Luis Ramos
0308f1465d Remove taxons/search action and respective rabl view
This is dead code
2020-03-17 15:51:26 +00:00
Luis Ramos
a6e4893287 Remove taxons list field from product edit form.
It is not working and it's not used in any other place in the app, there's the product category already (product.primary_taxon_id)
2020-03-17 15:51:25 +00:00
Luis Ramos
26769b4150 Add StripeSCA payment authorize and use it both subs_confirm job as well as on teh checkout stripe redirect 2020-03-16 20:04:59 +00:00
Luis Ramos
84745e4ccb Add stripe payment setup spec and make minor tweaks to the code itself.
Also, add a missing . to card_set? that eanbles it! If the card was
already set, it would anyway set the default card. Now it will use the
defined card if there is one already.
2020-03-16 20:03:12 +00:00
Luis Ramos
aac7a5e559 Adapt PaymentSetup spec to new version and remove some private method testing (payment) as well as some tests testing order.pending_payments logic 2020-03-16 20:03:12 +00:00
Luis Ramos
0a2941ed96 Extract StripePaymentSetup from PaymentSetup 2020-03-16 20:03:12 +00:00
dependabot-preview[bot]
05ccd1ecbf Bump compass-rails from 3.1.0 to 4.0.0
Bumps [compass-rails](https://github.com/Compass/compass-rails) from 3.1.0 to 4.0.0.
- [Release notes](https://github.com/Compass/compass-rails/releases)
- [Changelog](https://github.com/Compass/compass-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Compass/compass-rails/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 18:49:51 +00:00
Luis Ramos
f8a4f00d52 Fix rubocop issues in subs specs 2020-03-16 17:20:01 +00:00
Luis Ramos
29377bbff9 Move 5 subscriptions services from app/services to the engines/order_management/app/services 2020-03-16 17:20:01 +00:00
Luis Ramos
f68d0c2a0f Remove Subscription from the name of the subscription summarizer and summary because it is already in the namespace 2020-03-16 17:20:01 +00:00
Luis Ramos
3901c49af9 Fix rubocop issues 2020-03-16 17:20:01 +00:00
Luis Ramos
ae0ceb61a1 Move ProxyOrderSyncer to OrderManagement engine 2020-03-16 17:20:01 +00:00
Luis Ramos
fb1c825fbc Move both subscription summarizer and subscription summary to order management engine 2020-03-16 17:20:01 +00:00
Luis Ramos
e36b0249b9 Use nested module names to fix rubocpo issue 2020-03-16 17:20:01 +00:00
Luis Ramos
34fa2d7ad6 Move Subscriptions::PaymentSetup to OrderManagement engine where all subscription code will be at some point in the future 2020-03-16 17:19:04 +00:00
Luis Ramos
3aefea9f04 Prepare SubsConfirmJob to receive a bit more payment logic 2020-03-16 17:19:04 +00:00
Luis Ramos
15231a9128 Make SubsConfirmJob more readable 2020-03-16 17:19:04 +00:00
Luis Ramos
25e3f72934 Fix rubocop issues in subs payment_setup 2020-03-16 17:19:04 +00:00
Luis Ramos
523d819575 Move and rename SubscriptionPaymentUpdater to Subscriptios::PaymentSetup to move to services/subscriptions and call it Setup instead to make explicit this is executed before the payment is processed 2020-03-16 17:16:31 +00:00
Luis Ramos
bc0a1d9bae Remove one more responder and fix rubocop issues 2020-03-10 15:56:08 +00:00
Luis Ramos
a53dc3a8c1 Remove usage of the responder as this is a json only controller 2020-03-10 14:46:16 +00:00
703 changed files with 21748 additions and 12691 deletions

1
.gitignore vendored
View File

@@ -31,6 +31,7 @@ public/system
public/stylesheets
public/images
public/spree
public/assets
config/abr.yml
config/initializers/feature_toggle.rb
NERD_tree*

View File

@@ -33,7 +33,6 @@ Layout/LineLength:
- app/controllers/admin/inventory_items_controller.rb
- app/controllers/admin/manager_invitations_controller.rb
- app/controllers/admin/product_import_controller.rb
- app/controllers/admin/proxy_orders_controller.rb
- app/controllers/admin/schedules_controller.rb
- app/controllers/admin/subscriptions_controller.rb
- app/controllers/admin/variant_overrides_controller.rb
@@ -89,7 +88,6 @@ Layout/LineLength:
- 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/subscription.rb
- app/models/variant_override.rb
- app/models/variant_override_set.rb
@@ -98,7 +96,6 @@ Layout/LineLength:
- app/services/embedded_page_service.rb
- app/services/order_cycle_form.rb
- app/services/order_factory.rb
- app/services/subscriptions_count.rb
- app/services/variants_stock_levels.rb
- engines/web/app/helpers/web/cookies_policy_helper.rb
- lib/discourse/single_sign_on.rb
@@ -158,7 +155,6 @@ Layout/LineLength:
- spec/controllers/spree/admin/orders/customer_details_controller_spec.rb
- spec/controllers/spree/admin/orders_controller_spec.rb
- spec/controllers/spree/admin/payment_methods_controller_spec.rb
- spec/controllers/spree/admin/payments_controller_spec.rb
- spec/controllers/spree/admin/products_controller_spec.rb
- spec/controllers/spree/admin/reports_controller_spec.rb
- spec/controllers/spree/admin/variants_controller_spec.rb
@@ -183,7 +179,6 @@ Layout/LineLength:
- spec/features/admin/image_settings_spec.rb
- spec/features/admin/multilingual_spec.rb
- spec/features/admin/order_cycles_spec.rb
- spec/features/admin/orders_spec.rb
- spec/features/admin/overview_spec.rb
- spec/features/admin/payment_method_spec.rb
- spec/features/admin/product_import_spec.rb
@@ -239,10 +234,7 @@ Layout/LineLength:
- 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/proxy_order_syncer_spec.rb
- spec/lib/open_food_network/scope_variant_to_hub_spec.rb
- spec/lib/open_food_network/subscription_payment_updater_spec.rb
- spec/lib/open_food_network/subscription_summarizer_spec.rb
- spec/lib/open_food_network/tag_rule_applicator_spec.rb
- spec/lib/open_food_network/users_and_enterprises_report_spec.rb
- spec/lib/open_food_network/xero_invoices_report_spec.rb
@@ -317,10 +309,6 @@ Layout/LineLength:
- spec/services/permissions/order_spec.rb
- spec/services/product_tag_rules_filterer_spec.rb
- spec/services/products_renderer_spec.rb
- spec/services/subscription_estimator_spec.rb
- spec/services/subscription_form_spec.rb
- spec/services/subscription_validator_spec.rb
- spec/services/subscription_variants_service_spec.rb
- spec/spec_helper.rb
- spec/support/cancan_helper.rb
- spec/support/delayed_job_helper.rb
@@ -386,7 +374,6 @@ Metrics/AbcSize:
- app/helpers/spree/admin/base_helper.rb
- app/helpers/spree/admin/zones_helper.rb
- app/helpers/spree/orders_helper.rb
- app/mailers/producer_mailer.rb
- app/models/calculator/flat_percent_per_item.rb
- app/models/column_preference.rb
- app/models/enterprise.rb
@@ -411,7 +398,7 @@ Metrics/AbcSize:
- app/services/cart_service.rb
- app/services/create_order_cycle.rb
- app/services/order_syncer.rb
- app/services/subscription_validator.rb
- engines/order_management/app/services/order_management/subscriptions/validator.rb
- lib/active_merchant/billing/gateways/stripe_decorator.rb
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
- lib/discourse/single_sign_on.rb
@@ -477,7 +464,6 @@ Metrics/BlockLength:
- spec/factories/shipping_method_factory.rb
- spec/factories/subscription_factory.rb
- spec/factories/variant_factory.rb
- spec/features/admin/orders_spec.rb
- 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
@@ -583,7 +569,6 @@ Metrics/MethodLength:
- app/helpers/spree/admin/navigation_helper.rb
- app/helpers/spree/admin/base_helper.rb
- app/jobs/subscription_placement_job.rb
- app/mailers/producer_mailer.rb
- app/models/column_preference.rb
- app/models/enterprise.rb
- app/models/enterprise_relationship.rb
@@ -686,6 +671,12 @@ Metrics/ModuleLength:
- app/helpers/injection_helper.rb
- app/helpers/spree/admin/navigation_helper.rb
- app/helpers/spree/admin/base_helper.rb
- engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb
- engines/order_management/spec/services/order_management/subscriptions/form_spec.rb
- engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb
- engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb
- 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
@@ -701,9 +692,7 @@ Metrics/ModuleLength:
- spec/lib/open_food_network/order_grouper_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/proxy_order_syncer_spec.rb
- spec/lib/open_food_network/scope_variant_to_hub_spec.rb
- spec/lib/open_food_network/subscription_payment_updater_spec.rb
- spec/lib/open_food_network/tag_rule_applicator_spec.rb
- spec/lib/open_food_network/users_and_enterprises_report_spec.rb
- spec/models/spree/ability_spec.rb

View File

@@ -71,7 +71,6 @@ Lint/DuplicateHashKey:
Lint/DuplicateMethods:
Exclude:
- 'lib/discourse/single_sign_on.rb'
- 'lib/open_food_network/subscription_summary.rb'
# Offense count: 10
Lint/IneffectiveAccessModifier:
@@ -159,7 +158,7 @@ Naming/MethodParameterName:
Exclude:
- 'app/helpers/spree/admin/base_helper_decorator.rb'
- 'app/helpers/spree/base_helper_decorator.rb'
- 'app/services/subscription_validator.rb'
- 'engines/order_management/app/services/order_management/subscriptions/validator.rb'
- 'lib/open_food_network/reports/bulk_coop_report.rb'
- 'lib/open_food_network/xero_invoices_report.rb'
- 'spec/lib/open_food_network/reports/report_spec.rb'
@@ -174,7 +173,6 @@ Naming/MethodParameterName:
Naming/PredicateName:
Exclude:
- 'spec/**/*'
- 'app/mailers/producer_mailer.rb'
- 'app/models/enterprise.rb'
- 'app/models/enterprise_relationship.rb'
- 'app/models/order_cycle.rb'
@@ -631,7 +629,6 @@ Style/FrozenStringLiteralComment:
- 'app/jobs/subscription_placement_job.rb'
- 'app/jobs/welcome_enterprise_job.rb'
- 'app/mailers/enterprise_mailer.rb'
- 'app/mailers/producer_mailer.rb'
- 'app/mailers/spree/base_mailer_decorator.rb'
- 'app/mailers/spree/order_mailer_decorator.rb'
- 'app/mailers/spree/user_mailer.rb'
@@ -849,11 +846,6 @@ Style/FrozenStringLiteralComment:
- 'app/services/reset_order_service.rb'
- 'app/services/restart_checkout.rb'
- 'app/services/search_orders.rb'
- 'app/services/subscription_estimator.rb'
- 'app/services/subscription_form.rb'
- 'app/services/subscription_validator.rb'
- 'app/services/subscription_variants_service.rb'
- 'app/services/subscriptions_count.rb'
- 'app/services/tax_rate_finder.rb'
- 'app/services/upload_sanitizer.rb'
- 'app/services/variant_deleter.rb'
@@ -861,7 +853,6 @@ Style/FrozenStringLiteralComment:
- 'app/validators/date_time_string_validator.rb'
- 'app/validators/distributors_validator.rb'
- 'app/validators/integer_array_validator.rb'
- 'app/views/spree/admin/taxons/search.rabl'
- 'config.ru'
- 'engines/order_management/app/controllers/order_management/application_controller.rb'
- 'engines/order_management/app/services/order_management/reports/enterprise_fee_summary/authorizer.rb'
@@ -892,6 +883,7 @@ Style/FrozenStringLiteralComment:
- 'engines/order_management/lib/order_management/engine.rb'
- 'engines/order_management/lib/order_management/version.rb'
- 'engines/order_management/order_management.gemspec'
- 'engines/order_management/spec/performance/order_management/subscriptions/proxy_order_syncer_spec.rb'
- 'engines/order_management/spec/services/order_management/reports/enterprise_fee_summary/authorizer_spec.rb'
- 'engines/order_management/spec/services/order_management/reports/enterprise_fee_summary/parameters_spec.rb'
- 'engines/order_management/spec/services/order_management/reports/enterprise_fee_summary/permissions_spec.rb'
@@ -949,7 +941,6 @@ Style/FrozenStringLiteralComment:
- 'lib/open_food_network/products_and_inventory_report.rb'
- 'lib/open_food_network/products_and_inventory_report_base.rb'
- 'lib/open_food_network/property_merge.rb'
- 'lib/open_food_network/proxy_order_syncer.rb'
- 'lib/open_food_network/rack_request_blocker.rb'
- 'lib/open_food_network/referer_parser.rb'
- 'lib/open_food_network/reports/bulk_coop_allocation_report.rb'
@@ -966,8 +957,6 @@ Style/FrozenStringLiteralComment:
- 'lib/open_food_network/scope_variants_for_search.rb'
- 'lib/open_food_network/spree_api_key_loader.rb'
- 'lib/open_food_network/subscription_payment_updater.rb'
- 'lib/open_food_network/subscription_summarizer.rb'
- 'lib/open_food_network/subscription_summary.rb'
- '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'
@@ -1209,7 +1198,6 @@ Style/FrozenStringLiteralComment:
- 'spec/lib/open_food_network/permissions_spec.rb'
- 'spec/lib/open_food_network/products_and_inventory_report_spec.rb'
- 'spec/lib/open_food_network/property_merge_spec.rb'
- 'spec/lib/open_food_network/proxy_order_syncer_spec.rb'
- 'spec/lib/open_food_network/referer_parser_spec.rb'
- 'spec/lib/open_food_network/reports/report_spec.rb'
- 'spec/lib/open_food_network/reports/row_spec.rb'
@@ -1218,8 +1206,6 @@ Style/FrozenStringLiteralComment:
- 'spec/lib/open_food_network/scope_variant_to_hub_spec.rb'
- 'spec/lib/open_food_network/scope_variants_to_search_spec.rb'
- 'spec/lib/open_food_network/subscription_payment_updater_spec.rb'
- 'spec/lib/open_food_network/subscription_summarizer_spec.rb'
- 'spec/lib/open_food_network/subscription_summary_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'
@@ -1304,7 +1290,6 @@ Style/FrozenStringLiteralComment:
- 'spec/models/variant_override_spec.rb'
- 'spec/performance/injection_helper_spec.rb'
- 'spec/performance/orders_controller_spec.rb'
- 'spec/performance/proxy_order_syncer_spec.rb'
- 'spec/performance/shop_controller_spec.rb'
- 'spec/requests/checkout/failed_checkout_spec.rb'
- 'spec/requests/checkout/paypal_spec.rb'
@@ -1355,11 +1340,6 @@ Style/FrozenStringLiteralComment:
- 'spec/services/reset_order_service_spec.rb'
- 'spec/services/restart_checkout_spec.rb'
- 'spec/services/search_orders_spec.rb'
- 'spec/services/subscription_estimator_spec.rb'
- 'spec/services/subscription_form_spec.rb'
- 'spec/services/subscription_validator_spec.rb'
- 'spec/services/subscription_variants_service_spec.rb'
- 'spec/services/subscriptions_count_spec.rb'
- 'spec/services/tax_rate_finder_spec.rb'
- 'spec/services/upload_sanitizer_spec.rb'
- 'spec/services/variants_stock_levels_spec.rb'
@@ -1557,7 +1537,6 @@ Style/Send:
- 'spec/lib/open_food_network/products_and_inventory_report_spec.rb'
- 'spec/lib/open_food_network/sales_tax_report_spec.rb'
- 'spec/lib/open_food_network/subscription_payment_updater_spec.rb'
- 'spec/lib/open_food_network/subscription_summarizer_spec.rb'
- 'spec/lib/open_food_network/tag_rule_applicator_spec.rb'
- 'spec/lib/open_food_network/xero_invoices_report_spec.rb'
- 'spec/lib/stripe/webhook_handler_spec.rb'

View File

@@ -35,13 +35,20 @@ Download the Docker images and build the containers:
$ docker-compose build
```
Run the app with all the required containers:
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
```
This command will setup the database and seed it with sample data. The default admin user is 'ofn@example.com' with 'ofn123' password.
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.

View File

@@ -12,7 +12,7 @@ ENV BUNDLE_PATH /bundles
WORKDIR /usr/src/app
COPY .ruby-version .
# Rbenv & Ruby part
# Install Rbenv & Ruby
RUN git clone https://github.com/rbenv/rbenv.git ${RBENV_ROOT} && \
git clone https://github.com/rbenv/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build && \
${RBENV_ROOT}/plugins/ruby-build/install.sh && \
@@ -21,7 +21,7 @@ RUN git clone https://github.com/rbenv/rbenv.git ${RBENV_ROOT} && \
rbenv global $(cat .ruby-version) && \
gem install bundler --version=1.17.2
# Postgres
# Install Postgres
RUN sh -c "echo 'deb https://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main' > /etc/apt/sources.list.d/pgdg.list" && \
wget --quiet -O - https://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | apt-key add - && \
apt-get update && \
@@ -38,4 +38,6 @@ RUN wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.z
unzip chromedriver_linux64.zip -d /usr/bin && \
chmod u+x /usr/bin/chromedriver
# Copy code and install app dependencies
COPY . /usr/src/app/
RUN bundle install

View File

@@ -118,7 +118,7 @@ $ createdb open_food_network_test --owner=ofn
If these commands succeed, you should be able to [continue the setup process](#get-it-running).
[developer-wiki]: https://github.com/openfoodfoundation/openfoodnetwork/wiki
[sierra]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup%3A-macOS-%28Sierra%2C-HighSierra-and-Mojave%29
[sierra]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup%3A-macOS-%28Sierra%2C-HighSierra%2C-Mojave-and-Catalina%29
[el-capitan]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup:-OS-X-(El-Capitan)
[ubuntu]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup:-Ubuntu
[wiki]: https://github.com/openfoodfoundation/openfoodnetwork/wiki

14
Gemfile
View File

@@ -9,8 +9,6 @@ gem 'rails-i18n', '~> 3.0.0'
gem 'rails_safe_tasks', '~> 1.0'
gem "activerecord-import"
# Patched version. See http://rubysec.com/advisories/CVE-2015-5312/.
gem 'nokogiri', '>= 1.6.7.1'
gem "catalog", path: "./engines/catalog"
gem "order_management", path: "./engines/order_management"
@@ -45,10 +43,6 @@ gem 'daemons'
gem 'delayed_job_active_record'
gem 'delayed_job_web'
# Fix bug in simple_form preventing collection_check_boxes usage within form_for block
# When merged, revert to upstream gem
gem 'simple_form', github: 'RohanM/simple_form'
# Spree's default pagination gem (locked to the current version used by Spree)
# We use it's methods in OFN code as well, so this is a direct dependency
gem 'kaminari', '~> 0.14.1'
@@ -59,7 +53,6 @@ gem 'aws-sdk'
gem 'bugsnag'
gem 'db2fog'
gem 'haml'
gem 'rabl'
gem 'redcarpet'
gem 'sass', "~> 3.3"
gem 'sass-rails', '~> 3.2.3'
@@ -74,7 +67,6 @@ gem 'angularjs-file-upload-rails', '~> 2.4.1'
gem 'blockenspiel'
gem 'custom_error_message', github: 'jeremydurham/custom-err-msg'
gem 'dalli'
gem 'deface', '1.0.2'
gem 'diffy'
gem 'figaro'
gem 'geocoder'
@@ -102,7 +94,7 @@ gem 'test-unit', '~> 3.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'compass-rails'
gem 'mini_racer', '0.2.9'
gem 'mini_racer', '0.2.10'
gem 'uglifier', '>= 1.0.3'
@@ -112,7 +104,6 @@ gem 'momentjs-rails'
gem 'turbo-sprockets-rails3'
gem "foundation-rails"
gem 'foundation_rails_helper', github: 'willrjmarshall/foundation_rails_helper', branch: "rails3"
gem 'jquery-migrate-rails'
gem 'jquery-rails', '3.1.5'
@@ -123,13 +114,14 @@ gem 'ofn-qz', github: 'openfoodfoundation/ofn-qz', ref: '60da2ae4c44cbb4c8d602f5
group :production, :staging do
gem 'ddtrace'
gem 'unicorn-worker-killer'
end
group :test, :development do
# Pretty printed test output
gem 'atomic'
gem 'awesome_print'
gem 'capybara', '>= 2.18.0' # 3.0 requires nokogiri 1.8
gem 'capybara', '>= 2.18.0' # 3.0 requires rack 1.6 that only works with Rails 4.2
gem 'database_cleaner', '0.7.1', require: false
gem "factory_bot_rails", require: false
gem 'fuubar', '~> 2.5.0'

View File

@@ -1,11 +1,3 @@
GIT
remote: https://github.com/RohanM/simple_form.git
revision: 45f08a213b40f3d4bda5f5398db841137587160a
specs:
simple_form (2.0.2)
actionpack (~> 3.0)
activemodel (~> 3.0)
GIT
remote: https://github.com/jeremydurham/custom-err-msg.git
revision: 3a8ec9dddc7a5b0aab7c69a6060596de300c68f4
@@ -31,7 +23,7 @@ GIT
GIT
remote: https://github.com/openfoodfoundation/spree.git
revision: 8a8585a43cd04d1a50dc65227f337a91b18d66d5
revision: e10ca1f689b1658040b081939b7523f6fb68895a
branch: 2-0-4-stable
specs:
spree_core (2.0.4)
@@ -40,14 +32,13 @@ GIT
awesome_nested_set (= 2.1.5)
aws-sdk (~> 1.11.1)
cancan (~> 1.6.10)
deface (>= 0.9.1)
ffaker (~> 1.16)
highline (= 1.6.18)
httparty (~> 0.11)
json (>= 1.7.7)
kaminari (~> 0.14.1)
money (= 5.1.1)
paperclip (~> 3.0)
paperclip (~> 3.4.1)
paranoia (~> 1.3)
rails (~> 3.2.14)
ransack (= 0.7.2)
@@ -65,16 +56,6 @@ GIT
rails-i18n
spree_core (>= 1.1)
GIT
remote: https://github.com/willrjmarshall/foundation_rails_helper.git
revision: 4d5d53fdc4b1fb71e66524d298c5c635de82cfbb
branch: rails3
specs:
foundation_rails_helper (0.4)
actionpack (>= 3.0)
activemodel (>= 3.0)
railties (>= 3.0)
PATH
remote: engines/catalog
specs:
@@ -173,7 +154,7 @@ GEM
xpath (>= 2.0, < 4.0)
childprocess (3.0.0)
chronic (0.10.2)
chunky_png (1.3.10)
chunky_png (1.3.11)
climate_control (0.2.0)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
@@ -185,7 +166,6 @@ GEM
coffee-script-source
execjs
coffee-script-source (1.10.0)
colorize (0.8.1)
combine_pdf (1.0.16)
ruby-rc4 (>= 0.1.5)
compass (1.0.3)
@@ -200,7 +180,7 @@ GEM
sass (>= 3.3.0, < 3.5)
compass-import-once (1.0.5)
sass (>= 3.2, < 3.5)
compass-rails (3.1.0)
compass-rails (4.0.0)
compass (~> 1.0.0)
sass-rails (< 5.1)
sprockets (< 4.0)
@@ -216,14 +196,9 @@ GEM
activerecord (>= 3.2.0, < 5.0)
fog (~> 1.0)
rails (>= 3.2.0, < 5.0)
ddtrace (0.33.1)
ddtrace (0.34.2)
msgpack
debugger-linecache (1.2.0)
deface (1.0.2)
colorize (>= 0.5.8)
nokogiri (~> 1.6.0)
polyglot
rails (>= 3.1)
delayed_job (4.1.8)
activesupport (>= 3.0, < 6.1)
delayed_job_active_record (4.1.4)
@@ -256,8 +231,8 @@ GEM
railties (>= 3.0.0)
faraday (1.0.0)
multipart-post (>= 1.2, < 3)
ffaker (1.22.1)
ffi (1.11.3)
ffaker (1.32.1)
ffi (1.12.2)
figaro (1.1.1)
thor (~> 0.14)
fission (0.5.0)
@@ -421,6 +396,8 @@ GEM
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
geocoder (1.1.8)
get_process_mem (0.2.5)
ffi (~> 1.0)
gmaps4rails (1.5.6)
haml (4.0.7)
tilt
@@ -465,9 +442,9 @@ GEM
method_source (0.9.2)
mime-types (1.25.1)
mini_mime (1.0.1)
mini_portile2 (2.1.0)
mini_racer (0.2.9)
libv8 (>= 6.9.411)
mini_portile2 (2.4.0)
mini_racer (0.2.10)
libv8 (> 7.3)
momentjs-rails (2.20.1)
railties (>= 3.1)
money (5.1.1)
@@ -477,15 +454,15 @@ GEM
multi_xml (0.6.0)
multipart-post (2.1.1)
newrelic_rpm (3.18.1.330)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
nokogiri (1.10.9)
mini_portile2 (~> 2.4.0)
oauth2 (1.4.4)
faraday (>= 0.8, < 2.0)
jwt (>= 1.0, < 3.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
oj (3.10.5)
oj (3.10.6)
orm_adapter (0.5.0)
paper_trail (5.2.3)
activerecord (>= 3.0, < 6.0)
@@ -499,7 +476,7 @@ GEM
parallel (1.19.1)
paranoia (1.3.4)
activerecord (~> 3.1)
parser (2.7.0.5)
parser (2.7.1.0)
ast (~> 2.4.0)
paypal-sdk-core (0.2.10)
multi_json (~> 1.0)
@@ -518,8 +495,6 @@ GEM
byebug (>= 9.0, < 9.1)
pry (~> 0.10)
public_suffix (4.0.3)
rabl (0.8.4)
activesupport (>= 2.3.14)
rack (1.4.7)
rack-cache (1.11.0)
rack (>= 0.4)
@@ -559,8 +534,8 @@ GEM
activerecord (~> 3.0)
polyamorous (~> 0.5.0)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rbvmomi (1.13.0)
builder (~> 3.0)
json (>= 1.8)
@@ -604,15 +579,15 @@ GEM
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.9.2)
rubocop (0.80.1)
rubocop (0.81.0)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
parser (>= 2.7.0.1)
rainbow (>= 2.2.2, < 4.0)
rexml
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 1.7)
rubocop-rails (2.5.0)
unicode-display_width (>= 1.4.0, < 2.0)
rubocop-rails (2.5.2)
activesupport
rack (>= 1.1)
rubocop (>= 0.72.0)
@@ -671,13 +646,16 @@ GEM
tzinfo (0.3.56)
uglifier (4.2.0)
execjs (>= 0.3.0, < 3)
unicode-display_width (1.6.1)
unicode-display_width (1.7.0)
unicorn (5.5.4)
kgio (~> 2.6)
raindrops (~> 0.7)
unicorn-rails (2.2.1)
rack
unicorn
unicorn-worker-killer (0.4.4)
get_process_mem (~> 0)
unicorn (>= 4, < 6)
uuidtools (2.1.5)
warden (1.2.7)
rack (>= 1.0)
@@ -728,7 +706,6 @@ DEPENDENCIES
db2fog
ddtrace
debugger-linecache
deface (= 1.0.2)
delayed_job_active_record
delayed_job_web
devise (~> 2.2.5)
@@ -740,7 +717,6 @@ DEPENDENCIES
foreigner
foundation-icons-sass-rails
foundation-rails
foundation_rails_helper!
fuubar (~> 2.5.0)
geocoder
gmaps4rails
@@ -756,10 +732,9 @@ DEPENDENCIES
kaminari (~> 0.14.1)
knapsack
letter_opener (>= 1.4.1)
mini_racer (= 0.2.9)
mini_racer (= 0.2.10)
momentjs-rails
newrelic_rpm (~> 3.0)
nokogiri (>= 1.6.7.1)
oauth2 (~> 1.4.4)
ofn-qz!
oj
@@ -768,7 +743,6 @@ DEPENDENCIES
paperclip (~> 3.4.1)
pg (~> 0.21.0)
pry-byebug (>= 3.4.3)
rabl
rack-mini-profiler (< 3.0.0)
rack-rewrite
rack-ssl
@@ -787,7 +761,6 @@ DEPENDENCIES
select2-rails (~> 3.4.7)
selenium-webdriver
shoulda-matchers
simple_form!
simplecov
spinjs-rails
spree_core!
@@ -803,6 +776,7 @@ DEPENDENCIES
uglifier (>= 1.0.3)
unicorn
unicorn-rails
unicorn-worker-killer
web!
webdrivers
webmock

View File

@@ -2,19 +2,24 @@ angular.module("admin.indexUtils").factory "PagedFetcher", (dataFetcher) ->
new class PagedFetcher
# Given a URL like http://example.com/foo?page=::page::&per_page=20
# And the response includes an attribute pages with the number of pages to fetch
# Fetch each page async, and call the processData callback with the resulting data
fetch: (url, processData, onLastPageComplete) ->
dataFetcher(@urlForPage(url, 1)).then (data) =>
processData data
# Fetch each page async, and call the pageCallback callback with the resulting data
# Developer note: this class should not be re-used!
page: 1
last_page: 1
if data.pages > 1
for page in [2..data.pages]
lastPromise = dataFetcher(@urlForPage(url, page)).then (data) ->
processData data
onLastPageComplete && lastPromise.then onLastPageComplete
return
else
onLastPageComplete && onLastPageComplete()
fetch: (url, pageCallback) ->
@fetchPages(url, @page, pageCallback)
urlForPage: (url, page) ->
url.replace("::page::", page)
fetchPages: (url, page, pageCallback) ->
dataFetcher(@urlForPage(url, page)).then (data) =>
@page++
@last_page = data.pages
pageCallback(data) if pageCallback
if @page <= @last_page
@fetchPages(url, @page, pageCallback)

View File

@@ -1,7 +1,7 @@
angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $http, $q, StatusMessage, Columns, SortOptions, Dereferencer, Orders, LineItems, Enterprises, OrderCycles, VariantUnitManager, RequestMonitor) ->
$scope.initialized = false
$scope.RequestMonitor = RequestMonitor
$scope.filteredLineItems = []
$scope.line_items = LineItems.all
$scope.confirmDelete = true
$scope.startDate = moment().startOf('day').subtract(7, 'days').format('YYYY-MM-DD')
$scope.endDate = moment().startOf('day').format('YYYY-MM-DD')
@@ -15,50 +15,77 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.confirmRefresh = ->
LineItems.allSaved() || confirm(t("unsaved_changes_warning"))
$scope.resetFilters = ->
$scope.distributorFilter = ''
$scope.supplierFilter = ''
$scope.orderCycleFilter = ''
$scope.quickSearch = ''
$scope.resetSelectFilters = ->
$scope.distributorFilter = 0
$scope.supplierFilter = 0
$scope.orderCycleFilter = 0
$scope.quickSearch = ""
$scope.resetFilters()
$scope.refreshData()
$scope.refreshData = ->
unless !$scope.orderCycleFilter? || $scope.orderCycleFilter == 0
$scope.startDate = moment(OrderCycles.byID[$scope.orderCycleFilter].orders_open_at).format('YYYY-MM-DD')
$scope.endDate = moment(OrderCycles.byID[$scope.orderCycleFilter].orders_close_at).startOf('day').format('YYYY-MM-DD')
unless !$scope.orderCycleFilter? || $scope.orderCycleFilter == ''
$scope.setOrderCycleDateRange()
formatted_start_date = moment($scope.startDate).format()
formatted_end_date = moment($scope.endDate).add(1,'day').format()
$scope.formattedStartDate = moment($scope.startDate).format()
$scope.formattedEndDate = moment($scope.endDate).add(1,'day').format()
return unless moment($scope.formattedStartDate).isValid() and moment($scope.formattedEndDate).isValid()
$scope.loadOrders()
$scope.loadLineItems()
unless $scope.initialized
$scope.loadAssociatedData()
$scope.dereferenceLoadedData()
$scope.setOrderCycleDateRange = ->
start_date = OrderCycles.byID[$scope.orderCycleFilter].orders_open_at
end_date = OrderCycles.byID[$scope.orderCycleFilter].orders_close_at
format = "YYYY-MM-DD HH:mm:ss Z"
$scope.startDate = moment(start_date, format).format('YYYY-MM-DD')
$scope.endDate = moment(end_date, format).startOf('day').format('YYYY-MM-DD')
$scope.loadOrders = ->
RequestMonitor.load $scope.orders = Orders.index(
"q[state_not_eq]": "canceled",
"q[completed_at_not_null]": "true",
"q[completed_at_gteq]": formatted_start_date,
"q[completed_at_lt]": formatted_end_date
"q[distributor_id_eq]": $scope.distributorFilter,
"q[order_cycle_id_eq]": $scope.orderCycleFilter,
"q[completed_at_gteq]": $scope.formattedStartDate,
"q[completed_at_lt]": $scope.formattedEndDate
)
RequestMonitor.load $scope.lineItems = LineItems.index(
"q[order][state_not_eq]": "canceled",
"q[order][completed_at_not_null]": "true",
"q[order][completed_at_gteq]": formatted_start_date,
"q[order][completed_at_lt]": formatted_end_date
$scope.loadLineItems = ->
RequestMonitor.load LineItems.index(
"q[order_state_not_eq]": "canceled",
"q[order_completed_at_not_null]": "true",
"q[order_distributor_id_eq]": $scope.distributorFilter,
"q[variant_product_supplier_id_eq]": $scope.supplierFilter,
"q[order_order_cycle_id_eq]": $scope.orderCycleFilter,
"q[order_completed_at_gteq]": $scope.formattedStartDate,
"q[order_completed_at_lt]": $scope.formattedEndDate
)
unless $scope.initialized
RequestMonitor.load $scope.distributors = Enterprises.index(action: "visible", ams_prefix: "basic", "q[sells_in][]": ["own", "any"])
RequestMonitor.load $scope.orderCycles = OrderCycles.index(ams_prefix: "basic", as: "distributor", "q[orders_close_at_gt]": "#{moment().subtract(90,'days').format()}")
RequestMonitor.load $scope.suppliers = Enterprises.index(action: "visible", ams_prefix: "basic", "q[is_primary_producer_eq]": "true")
$scope.loadAssociatedData = ->
RequestMonitor.load $scope.distributors = Enterprises.index(action: "visible", ams_prefix: "basic", "q[sells_in][]": ["own", "any"])
RequestMonitor.load $scope.orderCycles = OrderCycles.index(ams_prefix: "basic", as: "distributor", "q[orders_close_at_gt]": "#{moment().subtract(90,'days').format()}")
RequestMonitor.load $scope.suppliers = Enterprises.index(action: "visible", ams_prefix: "basic", "q[is_primary_producer_eq]": "true")
RequestMonitor.load $q.all([$scope.orders.$promise, $scope.distributors.$promise, $scope.orderCycles.$promise, $scope.suppliers.$promise, $scope.lineItems.$promise]).then ->
$scope.dereferenceLoadedData = ->
RequestMonitor.load $q.all([$scope.orders.$promise, $scope.distributors.$promise, $scope.orderCycles.$promise, $scope.suppliers.$promise, $scope.line_items.$promise]).then ->
Dereferencer.dereferenceAttr $scope.orders, "distributor", Enterprises.byID
Dereferencer.dereferenceAttr $scope.orders, "order_cycle", OrderCycles.byID
Dereferencer.dereferenceAttr $scope.lineItems, "supplier", Enterprises.byID
Dereferencer.dereferenceAttr $scope.lineItems, "order", Orders.byID
Dereferencer.dereferenceAttr $scope.line_items, "supplier", Enterprises.byID
Dereferencer.dereferenceAttr $scope.line_items, "order", Orders.byID
$scope.bulk_order_form.$setPristine()
StatusMessage.clear()
unless $scope.initialized
$scope.initialized = true
$timeout ->
$scope.resetSelectFilters()
$scope.$watch 'bulk_order_form.$dirty', (newVal, oldVal) ->
if newVal == true
@@ -77,13 +104,12 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.deleteLineItem = (lineItem) ->
if ($scope.confirmDelete && confirm(t "are_you_sure")) || !$scope.confirmDelete
LineItems.delete lineItem, =>
$scope.lineItems.splice $scope.lineItems.indexOf(lineItem), 1
LineItems.delete lineItem
$scope.deleteLineItems = (lineItems) ->
$scope.deleteLineItems = (lineItemsToDelete) ->
existingState = $scope.confirmDelete
$scope.confirmDelete = false
$scope.deleteLineItem lineItem for lineItem in lineItems when lineItem.checked
$scope.deleteLineItem lineItem for lineItem in lineItemsToDelete when lineItem.checked
$scope.confirmDelete = existingState
$scope.allBoxesChecked = ->
@@ -154,4 +180,5 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
lineItem.final_weight_volume = LineItems.pristineByID[lineItem.id].final_weight_volume * lineItem.quantity / LineItems.pristineByID[lineItem.id].quantity
$scope.weightAdjustedPrice(lineItem)
$scope.resetFilters()
$scope.refreshData()

View File

@@ -67,7 +67,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, $timeout, Reque
return unless sort && sort.predicate != ""
$scope.sorting = sort.getSortingExpr()
$scope.fetchProducts()
$scope.fetchResults()
, true
$scope.capturePayment = (order) ->

View File

@@ -14,9 +14,10 @@ angular.module("admin.payments").factory 'AdminStripeElements', ($rootScope, Sta
@stripe.createToken(@card, cardData).then (response) =>
if(response.error)
StatusMessage.display 'error', response.error.message
console.error(JSON.stringify(response.error))
else
secrets.token = response.token.id
secrets.cc_type = @mapCC(response.token.card.brand)
secrets.cc_type = @mapTokenApiCardBrand(response.token.card.brand)
secrets.card = response.token.card
submit()
@@ -29,15 +30,16 @@ angular.module("admin.payments").factory 'AdminStripeElements', ($rootScope, Sta
@stripe.createPaymentMethod({ type: 'card', card: @card }, @card, cardData).then (response) =>
if(response.error)
StatusMessage.display 'error', response.error.message
console.error(JSON.stringify(response.error))
else
secrets.token = response.paymentMethod.id
secrets.cc_type = response.paymentMethod.card.brand
secrets.cc_type = @mapPaymentMethodsApiCardBrand(response.paymentMethod.card.brand)
secrets.card = response.paymentMethod.card
submit()
# Maps the brand returned by Stripe to that required by activemerchant
mapCC: (ccType) ->
switch ccType
# Maps the brand returned by Stripe's tokenAPI to that required by activemerchant
mapTokenApiCardBrand: (cardBrand) ->
switch cardBrand
when 'MasterCard' then return 'master'
when 'Visa' then return 'visa'
when 'American Express' then return 'american_express'
@@ -45,6 +47,14 @@ angular.module("admin.payments").factory 'AdminStripeElements', ($rootScope, Sta
when 'JCB' then return 'jcb'
when 'Diners Club' then return 'diners_club'
# Maps the brand returned by Stripe's paymentMethodsAPI to that required by activemerchant
mapPaymentMethodsApiCardBrand: (cardBrand) ->
switch cardBrand
when 'mastercard' then return 'master'
when 'amex' then return 'american_express'
when 'diners' then return 'diners_club'
else return cardBrand # a few brands are equal, for example, visa
# It doesn't matter if any of these are nil, all are optional.
makeCardData: (secrets) ->
{'name': secrets.name,

View File

@@ -2,7 +2,6 @@ angular.module("admin.resources").factory 'LineItemResource', ($resource) ->
$resource('/admin/bulk_line_items/:id.json', {}, {
'index':
method: 'GET'
isArray: true
'update':
method: 'PUT'
transformRequest: (data, headersGetter) =>

View File

@@ -1,20 +1,27 @@
angular.module("admin.resources").factory 'LineItems', ($q, LineItemResource) ->
new class LineItems
all: []
byID: {}
pristineByID: {}
pagination: {}
index: (params={}, callback=null) ->
LineItemResource.index params, (data) =>
request = LineItemResource.index params, (data) =>
@load(data)
(callback || angular.noop)(data)
@all.$promise = request.$promise
@all
resetData: ->
@all.length = 0
@byID = {}
@pristineByID = {}
load: (lineItems) ->
load: (data) ->
angular.extend(@pagination, data.pagination)
@resetData()
for lineItem in lineItems
for lineItem in data.line_items
@all.push lineItem
@byID[lineItem.id] = lineItem
@pristineByID[lineItem.id] = angular.copy(lineItem)
@@ -25,8 +32,9 @@ angular.module("admin.resources").factory 'LineItems', ($q, LineItemResource) ->
save: (lineItem) ->
deferred = $q.defer()
lineItemResource = new LineItemResource(lineItem)
lineItem.errors = {}
lineItem.$update({id: lineItem.id})
lineItemResource.$update({id: lineItem.id})
.then( (data) =>
@pristineByID[lineItem.id] = angular.copy(lineItem)
deferred.resolve(data)
@@ -54,8 +62,10 @@ angular.module("admin.resources").factory 'LineItems', ($q, LineItemResource) ->
delete: (lineItem, callback=null) ->
deferred = $q.defer()
lineItem.$delete({id: lineItem.id})
lineItemResource = new LineItemResource(lineItem)
lineItemResource.$delete({id: lineItem.id})
.then( (data) =>
@all.splice(@all.indexOf(lineItem),1)
delete @byID[lineItem.id]
delete @pristineByID[lineItem.id]
(callback || angular.noop)(data)

View File

@@ -43,12 +43,11 @@ angular.module("admin.variantOverrides").controller "AdminVariantOverridesCtrl",
$scope.fetchProducts = ->
url = "/api/products/overridable?page=::page::;per_page=100"
PagedFetcher.fetch url, (data) => $scope.addProducts data.products
PagedFetcher.fetch url, $scope.addProducts
$scope.addProducts = (products) ->
$scope.products = $scope.products.concat products
VariantOverrides.ensureDataFor hubs, products
$scope.addProducts = (data) ->
$scope.products = $scope.products.concat data.products
VariantOverrides.ensureDataFor hubs, data.products
$scope.displayDirty = ->
if DirtyVariantOverrides.count() > 0

View File

@@ -9,6 +9,8 @@
#= require angular-animate
#= require angular-resource
#= require lodash.underscore.js
# bluebird.js is a dependency of angular-google-maps.js 2.0.0
#= require bluebird.js
#= require angular-scroll.min.js
#= require angular-google-maps.min.js
#= require ../shared/mm-foundation-tpls-0.9.0-20180826174721.min.js

View File

@@ -9,8 +9,13 @@ Darkswarm.controller "EnterprisesCtrl", ($scope, $rootScope, $timeout, $location
$scope.show_closed = false
$scope.filtersActive = false
$scope.distanceMatchesShown = false
$scope.closed_shops_loading = false
$scope.closed_shops_loaded = false
$scope.$watch "query", (query)->
$scope.resetSearch(query)
$scope.resetSearch = (query) ->
Enterprises.flagMatching query
Search.search query
$rootScope.$broadcast 'enterprisesChanged'
@@ -19,6 +24,7 @@ Darkswarm.controller "EnterprisesCtrl", ($scope, $rootScope, $timeout, $location
$timeout ->
Enterprises.calculateDistance query, $scope.firstNameMatch()
$rootScope.$broadcast 'enterprisesChanged'
$scope.closed_shops_loading = false
$timeout ->
if $location.search()['show_closed']?
@@ -73,6 +79,12 @@ Darkswarm.controller "EnterprisesCtrl", ($scope, $rootScope, $timeout, $location
undefined
$scope.showClosedShops = ->
unless $scope.closed_shops_loaded
$scope.closed_shops_loading = true
$scope.closed_shops_loaded = true
Enterprises.loadClosedEnterprises().then ->
$scope.resetSearch($scope.query)
$scope.show_closed = true
$location.search('show_closed', '1')

View File

@@ -24,7 +24,7 @@ Darkswarm.controller "HubNodeCtrl", ($scope, HashNavigation, CurrentHub, $http,
$scope.shopfront_loading = true
$scope.toggle_tab(event)
$http.get("/api/enterprises/" + $scope.hub.id + "/shopfront")
$http.get("/api/shops/" + $scope.hub.id)
.success (data) ->
$scope.shopfront_loading = false
$scope.hub = data

View File

@@ -24,7 +24,7 @@ Darkswarm.controller "ProducerNodeCtrl", ($scope, HashNavigation, $anchorScroll,
$scope.shopfront_loading = true
$scope.toggle_tab(event)
$http.get("/api/enterprises/" + $scope.producer.id + "/shopfront")
$http.get("/api/shops/" + $scope.producer.id)
.success (data) ->
$scope.shopfront_loading = false
$scope.producer = data

View File

@@ -7,7 +7,7 @@ window.Darkswarm = angular.module("Darkswarm", [
'templates',
'ngSanitize',
'ngAnimate',
'google-maps',
'uiGmapgoogle-maps',
'duScroll',
'angularFileUpload',
'angularSlideables'

View File

@@ -1,6 +1,6 @@
Darkswarm.directive 'mapOsmTiles', ($timeout) ->
restrict: 'E'
require: '^googleMap'
require: '^uiGmapGoogleMap'
scope: {}
link: (scope, elem, attrs, ctrl) ->
$timeout =>

View File

@@ -1,7 +1,7 @@
Darkswarm.directive 'mapSearch', ($timeout, Search) ->
# Install a basic search field in a map
restrict: 'E'
require: ['^googleMap', 'ngModel']
require: ['^uiGmapGoogleMap', 'ngModel']
replace: true
template: '<input id="pac-input" ng-model="query" placeholder="' + t('location_placeholder') + '"></input>'
scope: {}

View File

@@ -5,5 +5,9 @@ Darkswarm.directive "shopVariant", ->
scope:
variant: '='
controller: ($scope, Cart) ->
$scope.$watchGroup ['variant.line_item.quantity', 'variant.line_item.max_quantity'], ->
$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)

View File

@@ -14,15 +14,28 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeE
submit: =>
Loading.message = t 'submitting_order'
$http.put('/checkout.json', {order: @preprocess()}).success (data, status)=>
Navigation.go data.path
.error (response, status)=>
if response.path
Navigation.go response.path
else
Loading.clear()
@errors = response.errors
RailsFlashLoader.loadFlash(response.flash)
$http.put('/checkout.json', {order: @preprocess()})
.then (response) =>
Navigation.go response.data.path
.catch (response) =>
try
@handle_checkout_error_response(response)
catch error
@loadFlash(error: t("checkout.failed")) # inform the user about the unexpected error
throw error # generate a BugsnagJS alert
handle_checkout_error_response: (response) =>
if response.data.path
Navigation.go response.data.path
else
throw response unless response.data.flash
@errors = response.data.errors
@loadFlash(response.data.flash)
loadFlash: (flash) =>
Loading.clear()
RailsFlashLoader.loadFlash(flash)
# Rails wants our Spree::Address data to be provided with _attributes
preprocess: ->

View File

@@ -5,7 +5,7 @@ Darkswarm.factory "EnterpriseModal", ($modal, $rootScope, $http)->
scope = $rootScope.$new(true) # Spawn an isolate to contain the enterprise
scope.embedded_layout = window.location.search.indexOf("embedded_shopfront=true") != -1
$http.get("/api/enterprises/" + enterprise.id + "/shopfront").success (data) ->
$http.get("/api/shops/" + enterprise.id).success (data) ->
scope.enterprise = data
$modal.open(templateUrl: "enterprise_modal.html", scope: scope)
.error (data) ->

View File

@@ -1,27 +1,30 @@
Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer, Matcher, Geo, $rootScope) ->
Darkswarm.factory 'Enterprises', (enterprises, ShopsResource, CurrentHub, Taxons, Dereferencer, Matcher, Geo, $rootScope) ->
new class Enterprises
enterprises: []
enterprises_by_id: {}
constructor: ->
# Populate Enterprises.enterprises from json in page.
@enterprises = enterprises
@initEnterprises(enterprises)
initEnterprises: (enterprises) ->
# Map enterprises to id/object pairs for lookup.
for enterprise in enterprises
@enterprises.push enterprise
@enterprises_by_id[enterprise.id] = enterprise
# Replace enterprise and taxons ids with actual objects.
@dereferenceEnterprises()
@dereferenceEnterprises(enterprises)
@producers = @enterprises.filter (enterprise)->
enterprise.category in ["producer_hub", "producer_shop", "producer"]
@hubs = @enterprises.filter (enterprise)->
enterprise.category in ["hub", "hub_profile", "producer_hub", "producer_shop"]
dereferenceEnterprises: ->
dereferenceEnterprises: (enteprises) ->
if CurrentHub.hub?.id
CurrentHub.hub = @enterprises_by_id[CurrentHub.hub.id]
for enterprise in @enterprises
for enterprise in enterprises
@dereferenceEnterprise enterprise
dereferenceEnterprise: (enterprise) ->
@@ -42,6 +45,12 @@ Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer,
for enterprise in new_enterprises
@enterprises_by_id[enterprise.id] = enterprise
loadClosedEnterprises: ->
request = ShopsResource.closed_shops {}, (data) =>
@initEnterprises(data)
request.$promise
flagMatching: (query) ->
for enterprise in @enterprises
enterprise.matches_name_query = if query? && query.length > 0
@@ -50,7 +59,7 @@ Darkswarm.factory 'Enterprises', (enterprises, CurrentHub, Taxons, Dereferencer,
false
calculateDistance: (query, firstMatching) ->
if query?.length > 0
if query?.length > 0 and Geo.OK
if firstMatching?
@setDistanceFrom firstMatching
else

View File

@@ -1,6 +1,6 @@
Darkswarm.service "Geo", ->
new class Geo
OK: google.maps.GeocoderStatus.OK
OK: google?.maps?.GeocoderStatus?.OK
# Usage:
# Geo.geocode address, (results, status) ->

View File

@@ -1,6 +1,6 @@
Darkswarm.factory 'OrderCycle', ($resource, orderCycleData) ->
class OrderCycle
@order_cycle = orderCycleData # Object or {} due to RABL
@order_cycle = orderCycleData # Object or {}
@push_order_cycle: (callback) ->
new $resource("/shop/order_cycle").save {order_cycle_id: @order_cycle.order_cycle_id}, (order_data)->
OrderCycle.order_cycle.orders_close_at = order_data.orders_close_at

View File

@@ -0,0 +1,7 @@
Darkswarm.factory 'ShopsResource', ($resource) ->
$resource('/api/shops/:id.json', {}, {
'closed_shops':
method: 'GET'
isArray: true
url: '/api/shops/closed_shops.json'
})

View File

@@ -15,9 +15,11 @@ Darkswarm.factory 'StripeElements', ($rootScope, Loading, RailsFlashLoader) ->
if(response.error)
Loading.clear()
RailsFlashLoader.loadFlash({error: t("error") + ": #{response.error.message}"})
@triggerAngularDigest()
console.error(JSON.stringify(response.error))
else
secrets.token = response.token.id
secrets.cc_type = @mapCC(response.token.card.brand)
secrets.cc_type = @mapTokenApiCardBrand(response.token.card.brand)
secrets.card = response.token.card
submit()
@@ -32,15 +34,21 @@ Darkswarm.factory 'StripeElements', ($rootScope, Loading, RailsFlashLoader) ->
if(response.error)
Loading.clear()
RailsFlashLoader.loadFlash({error: t("error") + ": #{response.error.message}"})
@triggerAngularDigest()
console.error(JSON.stringify(response.error))
else
secrets.token = response.paymentMethod.id
secrets.cc_type = response.paymentMethod.card.brand
secrets.cc_type = @mapPaymentMethodsApiCardBrand(response.paymentMethod.card.brand)
secrets.card = response.paymentMethod.card
submit()
# Maps the brand returned by Stripe to that required by activemerchant
mapCC: (ccType) ->
switch ccType
triggerAngularDigest: ->
# $evalAsync is improved way of triggering a digest without calling $apply
$rootScope.$evalAsync()
# Maps the brand returned by Stripe's tokenAPI to that required by activemerchant
mapTokenApiCardBrand: (cardBrand) ->
switch cardBrand
when 'MasterCard' then return 'master'
when 'Visa' then return 'visa'
when 'American Express' then return 'american_express'
@@ -48,6 +56,14 @@ Darkswarm.factory 'StripeElements', ($rootScope, Loading, RailsFlashLoader) ->
when 'JCB' then return 'jcb'
when 'Diners Club' then return 'diners_club'
# Maps the brand returned by Stripe's paymentMethodsAPI to that required by activemerchant
mapPaymentMethodsApiCardBrand: (cardBrand) ->
switch cardBrand
when 'mastercard' then return 'master'
when 'amex' then return 'american_express'
when 'diners' then return 'diners_club'
else return cardBrand # a few brands are equal, for example, visa
# It doesn't matter if any of these are nil, all are optional.
makeCardData: (secrets) ->
{'name': secrets.name,

View File

@@ -8,4 +8,4 @@
%hr
%div.menu_item.text-center
%input.fullwidth.orange{ type: "button", ng: { value: "saved() ? 'Saved': 'Saving'", show: "saved() || saving", disabled: "saved()" } }
%input.fullwidth.red{ type: "button", value: 'Save As Default', ng: { show: "!saved() && !saving", click: "saveColumnPreferences(action)"} }
%input.fullwidth.red{ type: "button", :value => t('admin.column_save_as_default').html_safe, ng: { show: "!saved() && !saving", click: "saveColumnPreferences(action)"} }

View File

@@ -9,6 +9,9 @@
input#search {
@include medium-input(rgba(0, 0, 0, 0.3), #777, $clr-brick);
// avoid zoom on iphone, see issue #4535
font-size: 1rem;
}
// ordering

View File

@@ -54,6 +54,7 @@ $teal-400: #4cb5c5;
$teal-500: #0096ad;
$orange-400: #ff9466;
$orange-450: #f4704c;
$orange-500: #f27052;
$orange-600: #d7583a;

View File

@@ -109,9 +109,4 @@ checkout {
}
}
}
.error {
color: #c82020;
}
}

View File

@@ -14,5 +14,10 @@
.more-controls {
text-align: center;
.spinner {
height: 2.25em;
margin-right: 0.5em;
}
}
}

View File

@@ -115,3 +115,14 @@
height: 36px;
}
}
.links {
.button {
padding: 1.125rem 0 1.1875rem;
width: 210px;
@media all and (max-width: 480px) {
width: 100%;
}
}
}

View File

@@ -64,13 +64,13 @@
.button.primary, button.primary {
font-family: $body-font;
background: $clr-brick;
background: $orange-450;
color: white;
}
.button.primary:hover, .button.primary:active, .button.primary:focus, button.primary:hover, button.primary:active, button.primary:focus {
background: $clr-brick-bright;
text-shadow: 0 1px 0 $clr-brick;
background: $orange-400;
text-shadow: 0 1px 0 $orange-450;
}
button.success, .button.success {

View File

@@ -138,6 +138,10 @@ a {
&.ms {
background-color: #000 !important;
}
&.ig {
background-color: #fb3958 !important;
}
}
.sidebar .soc-btn {

View File

@@ -4,18 +4,17 @@ module Admin
#
def index
order_params = params[:q].andand.delete :order
orders = order_permissions.editable_orders.ransack(order_params).result
order_permissions = ::Permissions::Order.new(spree_current_user)
orders = order_permissions.
editable_orders.ransack(order_params).result
line_items = order_permissions.
@line_items = order_permissions.
editable_line_items.where(order_id: orders).
includes(variant: { option_values: :option_type }).
ransack(params[:q]).result.
reorder('spree_line_items.order_id ASC, spree_line_items.id ASC')
render_as_json line_items
@line_items = @line_items.page(page).per(params[:per_page]) if using_pagination?
render json: { line_items: serialized_line_items, pagination: pagination_data }
end
# PUT /admin/bulk_line_items/:id.json
@@ -65,6 +64,12 @@ module Admin
Api::Admin::LineItemSerializer
end
def serialized_line_items
ActiveModel::ArraySerializer.new(
@line_items, each_serializer: serializer(nil)
)
end
def authorize_update!
authorize! :update, order
authorize! :read, order
@@ -73,5 +78,28 @@ module Admin
def order
@line_item.order
end
def order_permissions
::Permissions::Order.new(spree_current_user)
end
def using_pagination?
params[:per_page]
end
def pagination_data
return unless using_pagination?
{
results: @line_items.total_count,
pages: @line_items.num_pages,
page: page.to_i,
per_page: params[:per_page].to_i
}
end
def page
params[:page] || 1
end
end
end

View File

@@ -17,8 +17,9 @@ module Admin
respond_to do |format|
format.html
format.json do
tag_rule_mapping = TagRule.mapping_for(Enterprise.where(id: params[:enterprise_id]))
render_as_json @collection, tag_rule_mapping: tag_rule_mapping
render_as_json @collection,
tag_rule_mapping: tag_rule_mapping,
customer_tags: customer_tags_by_id
end
end
end
@@ -64,8 +65,13 @@ module Admin
def collection
return Customer.where("1=0") unless json_request? && params[:enterprise_id].present?
enterprise = Enterprise.managed_by(spree_current_user).find_by_id(params[:enterprise_id])
Customer.of(enterprise)
Customer.of(managed_enterprise_id).
includes(:bill_address, :ship_address, user: :credit_cards)
end
def managed_enterprise_id
@managed_enterprise_id ||= Enterprise.managed_by(spree_current_user).
select('enterprises.id').find_by_id(params[:enterprise_id])
end
def load_managed_shops
@@ -80,5 +86,28 @@ module Admin
def ams_prefix_whitelist
[:subscription]
end
def tag_rule_mapping
TagRule.mapping_for(Enterprise.where(id: managed_enterprise_id))
end
# Fetches tags for all customers of the enterprise and returns a hash indexed by customer_id
def customer_tags_by_id
customer_tags = ::ActsAsTaggableOn::Tag.
joins(:taggings).
includes(:taggings).
where(taggings:
{ taggable_type: 'Customer',
taggable_id: Customer.of(managed_enterprise_id),
context: 'tags' })
customer_tags.each_with_object({}) do |tag, indexed_hash|
tag.taggings.each do |tagging|
customer_id = tagging.taggable_id
indexed_hash[customer_id] ||= []
indexed_hash[customer_id] << tag.name
end
end
end
end
end

View File

@@ -1,9 +1,13 @@
module Admin
class EnterpriseRelationshipsController < ResourceController
def index
@my_enterprises = Enterprise.managed_by(spree_current_user).by_name
@all_enterprises = Enterprise.by_name
@enterprise_relationships = EnterpriseRelationship.by_name.involving_enterprises @my_enterprises
@my_enterprises = Enterprise.
includes(:shipping_methods, :payment_methods).
managed_by(spree_current_user).by_name
@all_enterprises = Enterprise.includes(:shipping_methods, :payment_methods).by_name
@enterprise_relationships = EnterpriseRelationship.
includes(:parent, :child).
by_name.involving_enterprises @my_enterprises
end
def create

View File

@@ -16,7 +16,7 @@ module Admin
render_as_json @collection,
ams_prefix: params[:ams_prefix],
current_user: spree_current_user,
subscriptions_count: SubscriptionsCount.new(@collection)
subscriptions_count: OrderManagement::Subscriptions::Count.new(@collection)
end
end
end
@@ -74,7 +74,7 @@ module Admin
render_as_json @order_cycles,
ams_prefix: 'index',
current_user: spree_current_user,
subscriptions_count: SubscriptionsCount.new(@collection)
subscriptions_count: OrderManagement::Subscriptions::Count.new(@collection)
else
order_cycle = order_cycle_set.collection.find{ |oc| oc.errors.present? }
render json: { errors: order_cycle.errors.full_messages }, status: :unprocessable_entity

View File

@@ -9,25 +9,19 @@ module Admin
def cancel
if @proxy_order.cancel
respond_with(@proxy_order) do |format|
format.json { render_as_json @proxy_order }
end
render_as_json @proxy_order
else
respond_with(@proxy_order) do |format|
format.json { render json: { errors: [t('admin.proxy_orders.cancel.could_not_cancel_the_order')] }, status: :unprocessable_entity }
end
render json: { errors: [t('admin.proxy_orders.cancel.could_not_cancel_the_order')] },
status: :unprocessable_entity
end
end
def resume
if @proxy_order.resume
respond_with(@proxy_order) do |format|
format.json { render_as_json @proxy_order }
end
render_as_json @proxy_order
else
respond_with(@proxy_order) do |format|
format.json { render json: { errors: [t('admin.proxy_orders.resume.could_not_resume_the_order')] }, status: :unprocessable_entity }
end
render json: { errors: [t('admin.proxy_orders.resume.could_not_resume_the_order')] },
status: :unprocessable_entity
end
end
end

View File

@@ -1,5 +1,5 @@
require 'open_food_network/permissions'
require 'open_food_network/proxy_order_syncer'
require 'order_management/subscriptions/proxy_order_syncer'
module Admin
class SchedulesController < ResourceController
@@ -81,7 +81,7 @@ module Admin
return unless removed_ids.any? || new_ids.any?
subscriptions = Subscription.where(schedule_id: @schedule)
syncer = OpenFoodNetwork::ProxyOrderSyncer.new(subscriptions)
syncer = OrderManagement::Subscriptions::ProxyOrderSyncer.new(subscriptions)
syncer.sync!
end
end

View File

@@ -56,7 +56,7 @@ module Admin
end
def variant_if_eligible(variant_id)
SubscriptionVariantsService.eligible_variants(@shop).find_by_id(variant_id)
OrderManagement::Subscriptions::VariantsList.eligible_variants(@shop).find_by_id(variant_id)
end
end
end

View File

@@ -1,5 +1,4 @@
require 'open_food_network/permissions'
require 'open_food_network/proxy_order_syncer'
module Admin
class SubscriptionsController < ResourceController
@@ -65,7 +64,7 @@ module Admin
private
def save_form_and_render(render_issues = true)
form = SubscriptionForm.new(@subscription, params[:subscription])
form = OrderManagement::Subscriptions::Form.new(@subscription, params[:subscription])
unless form.save
render json: { errors: form.json_errors }, status: :unprocessable_entity
return

View File

@@ -73,8 +73,10 @@ module Admin
end
def collection
@variant_overrides = VariantOverride.includes(:variant).for_hubs(params[:hub_id] || @hubs)
@variant_overrides.select { |vo| vo.variant.present? }
@variant_overrides = VariantOverride.
includes(variant: :product).
for_hubs(params[:hub_id] || @hubs).
select { |vo| vo.variant.present? }
end
def collection_actions

View File

@@ -5,7 +5,6 @@ module Api
before_filter :override_sells, only: [:create, :update]
before_filter :override_visible, only: [:create, :update]
respond_to :json
skip_authorization_check only: [:shopfront]
def create
authorize! :create, Enterprise
@@ -42,12 +41,6 @@ module Api
end
end
def shopfront
enterprise = Enterprise.find_by_id(params[:id])
render text: Api::EnterpriseShopfrontSerializer.new(enterprise).to_json, status: :ok
end
private
def override_owner

View File

@@ -4,8 +4,11 @@ module Api
respond_to :json
skip_authorization_check
skip_before_filter :authenticate_user, :ensure_api_key, only: [:taxons, :properties]
def products
render_no_products unless order_cycle.open?
products = ProductsRenderer.new(
distributor,
order_cycle,
@@ -15,7 +18,7 @@ module Api
render json: products
rescue ProductsRenderer::NoProducts
render status: :not_found, json: ''
render_no_products
end
def taxons
@@ -35,6 +38,10 @@ module Api
private
def render_no_products
render status: :not_found, json: ''
end
def product_properties
Spree::Property.
joins(:products).
@@ -70,11 +77,11 @@ module Api
end
def distributor
Enterprise.find_by_id(params[:distributor])
@distributor ||= Enterprise.find_by_id(params[:distributor])
end
def order_cycle
OrderCycle.find_by_id(params[:id])
@order_cycle ||= OrderCycle.find_by_id(params[:id])
end
def customer

View File

@@ -69,12 +69,12 @@ module Api
end
def overridable
producers = OpenFoodNetwork::Permissions.new(current_api_user).
variant_override_producers.by_name
producer_ids = OpenFoodNetwork::Permissions.new(current_api_user).
variant_override_producers.by_name.select('enterprises.id')
@products = paged_products_for_producers producers
@products = paged_products_for_producers producer_ids
render_paged_products @products
render_paged_products @products, ::Api::Admin::ProductSimpleSerializer
end
# POST /api/products/:product_id/clone
@@ -118,19 +118,20 @@ module Api
]
end
def paged_products_for_producers(producers)
def paged_products_for_producers(producer_ids)
Spree::Product.scoped.
merge(product_scope).
where(supplier_id: producers).
includes(variants: [:product, :default_price, :stock_items]).
where(supplier_id: producer_ids).
by_producer.by_name.
ransack(params[:q]).result.
page(params[:page]).per(params[:per_page])
end
def render_paged_products(products)
def render_paged_products(products, product_serializer = ::Api::Admin::ProductSerializer)
serializer = ActiveModel::ArraySerializer.new(
products,
each_serializer: ::Api::Admin::ProductSerializer
each_serializer: product_serializer
)
render text: {

View File

@@ -0,0 +1,27 @@
# frozen_string_literal: true
module Api
class ShopsController < BaseController
respond_to :json
skip_authorization_check only: [:show, :closed_shops]
def show
enterprise = Enterprise.find_by_id(params[:id])
render text: Api::EnterpriseShopfrontSerializer.new(enterprise).to_json, status: :ok
end
def closed_shops
@active_distributor_ids = []
@earliest_closing_times = []
serialized_closed_shops = ActiveModel::ArraySerializer.new(
ShopsListService.new.closed_shops,
each_serializer: Api::EnterpriseSerializer,
data: OpenFoodNetwork::EnterpriseInjectionData.new
)
render json: serialized_closed_shops
end
end
end

View File

@@ -14,10 +14,6 @@ class BaseController < ApplicationController
helper 'spree/base'
# Spree::Core::ControllerHelpers declares helper_method get_taxonomies, so we need to
# include Spree::ProductsHelper so that method is available on the controller
include Spree::ProductsHelper
before_filter :set_locale
before_filter :check_order_cycle_expiry
@@ -29,17 +25,19 @@ class BaseController < ApplicationController
return
end
@order_cycles = OrderCycle.with_distributor(@distributor).active
.order(@distributor.preferred_shopfront_order_cycle_order)
@order_cycles = Shop::OrderCyclesList.new(@distributor, current_customer).call
applicator = OpenFoodNetwork::TagRuleApplicator.new(@distributor,
"FilterOrderCycles",
current_customer.andand.tag_list)
applicator.filter!(@order_cycles)
set_order_cycle
end
# And default to the only order cycle if there's only the one
if @order_cycles.count == 1
current_order(true).set_order_cycle! @order_cycles.first
end
# Default to the only order cycle if there's only one
#
# Here we need to use @order_cycles.size not @order_cycles.count
# because OrderCyclesList returns a modified ActiveRecord::Relation
# and these modifications are not seen if it is reloaded with count
def set_order_cycle
return if @order_cycles.size != 1
current_order(true).set_order_cycle! @order_cycles.first
end
end

View File

@@ -53,9 +53,8 @@ class CheckoutController < Spree::StoreController
rescue Spree::Core::GatewayError => e
rescue_from_spree_gateway_error(e)
rescue StandardError => e
Bugsnag.notify(e)
flash[:error] = I18n.t("checkout.failed")
update_failed
update_failed(e)
end
# Clears the cached order. Required for #current_order to return a new order
@@ -134,13 +133,6 @@ class CheckoutController < Spree::StoreController
@order.ship_address = finder.ship_address
end
def before_delivery
return if params[:order].present?
packages = @order.shipments.map(&:to_package)
@differentiator = Spree::Stock::Differentiator.new(@order, packages)
end
def before_payment
current_order.payments.destroy_all if request.put?
end
@@ -154,10 +146,12 @@ class CheckoutController < Spree::StoreController
end
def valid_payment_intent_provided?
params["payment_intent"]&.starts_with?("pi_") &&
@order.state == "payment" &&
@order.payments.last.state == "pending" &&
@order.payments.last.response_code == params["payment_intent"]
return false unless params["payment_intent"]&.starts_with?("pi_")
last_payment = OrderPaymentFinder.new(@order).last_payment
@order.state == "payment" &&
last_payment&.state == "pending" &&
last_payment&.response_code == params["payment_intent"]
end
def handle_redirect_from_stripe
@@ -165,7 +159,7 @@ class CheckoutController < Spree::StoreController
checkout_succeeded
redirect_to(order_path(@order)) && return
else
flash[:error] = order_workflow_error
flash[:error] = order_error
checkout_failed
end
end
@@ -180,7 +174,6 @@ class CheckoutController < Spree::StoreController
next if advance_order_state(@order)
flash[:error] = order_workflow_error
return update_failed
end
@@ -205,7 +198,7 @@ class CheckoutController < Spree::StoreController
false
end
def order_workflow_error
def order_error
if @order.errors.present?
@order.errors.full_messages.to_sentence
else
@@ -218,7 +211,7 @@ class CheckoutController < Spree::StoreController
checkout_succeeded
update_succeeded_response
else
update_failed
update_failed(RuntimeError.new("Order not complete after the checkout workflow"))
end
end
@@ -244,7 +237,10 @@ class CheckoutController < Spree::StoreController
end
end
def update_failed
def update_failed(error = RuntimeError.new(order_error))
Bugsnag.notify(error)
flash[:error] = order_error if flash.empty?
checkout_failed
update_failed_response
end

View File

@@ -96,8 +96,8 @@ class EnterprisesController < BaseController
end
def reset_order_cycle(order, distributor)
order_cycle_options = OrderCycle.active.with_distributor(distributor)
order.order_cycle = order_cycle_options.first if order_cycle_options.count == 1
order_cycles = Shop::OrderCyclesList.new(distributor, current_customer).call
order.order_cycle = order_cycles.first if order_cycles.size == 1
end
def shop_order_cycles

View File

@@ -5,12 +5,23 @@ class HomeController < BaseController
def index
if ContentConfig.home_show_stats
@num_distributors = Enterprise.is_distributor.activated.visible.count
@num_producers = Enterprise.is_primary_producer.activated.visible.count
@num_users = Spree::Order.complete.count('DISTINCT user_id')
@num_orders = Spree::Order.complete.count
@num_distributors = cached_count('distributors', Enterprise.is_distributor.activated.visible)
@num_producers = cached_count('producers', Enterprise.is_primary_producer.activated.visible)
@num_orders = cached_count('orders', Spree::Order.complete)
@num_users = cached_count(
'users', Spree::Order.complete.select('DISTINCT spree_orders.user_id')
)
end
end
def sell; end
private
# Cache the value of the query count for 24 hours
def cached_count(key, query)
Rails.cache.fetch("home_stats_count_#{key}", expires_in: 1.day, race_condition_ttl: 10) do
query.count
end
end
end

View File

@@ -4,13 +4,6 @@ class ShopsController < BaseController
before_filter :enable_embedded_shopfront
def index
@enterprises = Enterprise
.activated
.visible
.is_distributor
.includes(address: [:state, :country])
.includes(:properties)
.includes(supplied_products: :properties)
.all
@enterprises = ShopsListService.new.open_shops
end
end

View File

@@ -4,10 +4,6 @@ module Spree
after_filter :initialize_mail_settings
def update
if params[:smtp_password].blank?
params.delete(:smtp_password)
end
params.each do |name, value|
next unless Spree::Config.has_preference? name

View File

@@ -29,6 +29,8 @@ module Spree
return
end
authorize_stripe_sca_payment
if @order.completed?
@payment.process!
flash[:success] = flash_message_for(@payment, :successfully_created)
@@ -93,7 +95,7 @@ module Spree
available(:back_end).
select{ |pm| pm.has_distributor? @order.distributor }
@payment_method = if @payment && @payment.payment_method
@payment_method = if @payment&.payment_method
@payment.payment_method
else
@payment_methods.first
@@ -124,6 +126,13 @@ module Spree
def load_payment
@payment = Payment.find(params[:id])
end
def authorize_stripe_sca_payment
return unless @payment.payment_method.class == Spree::Gateway::StripeSCA
@payment.authorize!
raise Spree::Core::GatewayError, I18n.t('authorization_failure') unless @payment.pending?
end
end
end
end

View File

@@ -1,66 +0,0 @@
module Spree
module Admin
module Reports
class EnterpriseFeeSummariesController < BaseController
before_filter :load_report_parameters
before_filter :load_permissions
def new; end
def create
return respond_to_invalid_parameters unless @report_parameters.valid?
@report_parameters.authorize!(@permissions)
@report = report_klass::ReportService.new(@permissions, @report_parameters)
renderer.render(self)
rescue ::Reports::Authorizer::ParameterNotAllowedError => e
flash[:error] = e.message
render_report_form
end
private
def respond_to_invalid_parameters
flash[:error] = I18n.t("invalid_filter_parameters", scope: i18n_scope)
render_report_form
end
def i18n_scope
"order_management.reports.enterprise_fee_summary"
end
def render_report_form
render action: :new
end
def report_klass
OrderManagement::Reports::EnterpriseFeeSummary
end
def load_report_parameters
@report_parameters = report_klass::Parameters.new(params[:report] || {})
end
def load_permissions
@permissions = report_klass::Permissions.new(spree_current_user)
end
def report_renderer_klass
case params[:report_format]
when "csv"
report_klass::Renderers::CsvRenderer
when nil, "", "html"
report_klass::Renderers::HtmlRenderer
else
raise Reports::UnsupportedReportFormatException
end
end
def renderer
@renderer ||= report_renderer_klass.new(@report)
end
end
end
end
end

View File

@@ -298,11 +298,20 @@ module Spree
end
def url_for_report(report)
public_send("#{report}_admin_reports_url".to_sym)
if report_in_order_management_engine?(report)
main_app.public_send("new_order_management_reports_#{report}_url".to_sym)
else
public_send("#{report}_admin_reports_url".to_sym)
end
rescue NoMethodError
url_for([:new, :admin, :reports, report.to_s.singularize])
end
# List of reports that have been moved to the Order Management engine
def report_in_order_management_engine?(report)
report == :enterprise_fee_summary
end
def timestamp
Time.zone.now.strftime("%Y%m%d")
end

View File

@@ -3,14 +3,6 @@ module Spree
class TaxonsController < Spree::Admin::BaseController
respond_to :html, :json, :js
def search
@taxons = if params[:ids]
Spree::Taxon.where(id: params[:ids].split(','))
else
Spree::Taxon.limit(20).search(name_cont: params[:q]).result
end
end
def create
@taxonomy = Taxonomy.find(params[:taxonomy_id])
@taxon = @taxonomy.taxons.build(params[:taxon])

View File

@@ -1,6 +1,4 @@
module ApplicationHelper
include FoundationRailsHelper::FlashHelper
def feature?(feature)
OpenFoodNetwork::FeatureToggle.enabled? feature
end

View File

@@ -47,7 +47,7 @@ module InjectionHelper
enterprises_and_relatives = current_distributor.
relatives_including_self.
activated.
includes(address: [:state, :country]).
includes(:properties, address: [:state, :country], supplied_products: :properties).
all
inject_json_ams "enterprises",

View File

@@ -47,17 +47,6 @@ module OrderCyclesHelper
end
end
def order_cycle_options
@order_cycles.
with_distributor(current_distributor).
map { |oc| [order_cycle_close_to_s(oc.orders_close_at), oc.id] }
end
def order_cycle_close_to_s(orders_close_at)
"%s (%s)" % [orders_close_at.strftime("#{orders_close_at.day.ordinalize} %b"),
distance_of_time_in_words_to_now(orders_close_at)]
end
def active_order_cycle_for_distributor?(_distributor)
OrderCycle.active.with_distributor(@distributor).present?
end

View File

@@ -0,0 +1,7 @@
# frozen_string_literal: true
module OrderHelper
def last_payment_method(order)
OrderPaymentFinder.new(order).last_payment&.payment_method
end
end

View File

@@ -0,0 +1,13 @@
# frozen_string_literal: true
module Spree
module ProductsHelper
def product_has_variant_unit_option_type?(product)
product.option_types.any? { |option_type| variant_unit_option_type? option_type }
end
def variant_unit_option_type?(option_type)
Spree::Product.all_variant_unit_option_types.include? option_type
end
end
end

View File

@@ -1,23 +0,0 @@
module Spree
ProductsHelper.class_eval do
# Return the price of the variant, overriding sprees price diff capability.
# This will allways return the variant price as if the show_variant_full_price is set.
def variant_price_diff(variant)
"(#{Spree::Money.new(variant.price)})"
end
def product_has_variant_unit_option_type?(product)
product.option_types.any? { |option_type| variant_unit_option_type? option_type }
end
def variant_unit_option_type?(option_type)
Spree::Product.all_variant_unit_option_types.include? option_type
end
def product_variant_unit_options
[[I18n.t(:weight), 'weight'],
[I18n.t(:volume), 'volume'],
[I18n.t(:items), 'items']]
end
end
end

View File

@@ -1,17 +1,9 @@
require 'open_food_network/subscription_payment_updater'
require 'open_food_network/subscription_summarizer'
require 'order_management/subscriptions/summarizer'
# Confirms orders of unconfirmed proxy orders in recently closed Order Cycles
class SubscriptionConfirmJob
def perform
ids = proxy_orders.pluck(:id)
proxy_orders.update_all(confirmed_at: Time.zone.now)
ProxyOrder.where(id: ids).each do |proxy_order|
Rails.logger.info "Confirming Order for Proxy Order #{proxy_order.id}"
@order = proxy_order.order
process!
end
send_confirmation_summary_emails
confirm_proxy_orders!
end
private
@@ -20,10 +12,26 @@ class SubscriptionConfirmJob
delegate :record_and_log_error, :send_confirmation_summary_emails, to: :summarizer
def summarizer
@summarizer ||= OpenFoodNetwork::SubscriptionSummarizer.new
@summarizer ||= OrderManagement::Subscriptions::Summarizer.new
end
def proxy_orders
def confirm_proxy_orders!
# Fetch all unconfirmed proxy orders
unconfirmed_proxy_orders_ids = unconfirmed_proxy_orders.pluck(:id)
# Mark these proxy orders as confirmed
unconfirmed_proxy_orders.update_all(confirmed_at: Time.zone.now)
# Confirm these proxy orders
ProxyOrder.where(id: unconfirmed_proxy_orders_ids).each do |proxy_order|
Rails.logger.info "Confirming Order for Proxy Order #{proxy_order.id}"
confirm_order!(proxy_order.order)
end
send_confirmation_summary_emails
end
def unconfirmed_proxy_orders
ProxyOrder.not_canceled.where('confirmed_at IS NULL AND placed_at IS NOT NULL')
.joins(:order_cycle).merge(recently_closed_order_cycles)
.joins(:order).merge(Spree::Order.complete.not_state('canceled'))
@@ -33,30 +41,55 @@ class SubscriptionConfirmJob
OrderCycle.closed.where('order_cycles.orders_close_at BETWEEN (?) AND (?) OR order_cycles.updated_at BETWEEN (?) AND (?)', 1.hour.ago, Time.zone.now, 1.hour.ago, Time.zone.now)
end
def process!
record_order(@order)
update_payment! if @order.payment_required?
return send_failed_payment_email if @order.errors.present?
# It sets up payments, processes payments and sends confirmation emails
def confirm_order!(order)
record_order(order)
@order.process_payments! if @order.payment_required?
return send_failed_payment_email if @order.errors.present?
send_confirm_email
if process_payment!(order)
send_confirmation_email(order)
else
send_failed_payment_email(order)
end
end
def update_payment!
OpenFoodNetwork::SubscriptionPaymentUpdater.new(@order).update!
def process_payment!(order)
return false if order.errors.present?
return true unless order.payment_required?
setup_payment!(order)
return false if order.errors.any?
authorize_payment!(order)
return false if order.errors.any?
order.process_payments!
return false if order.errors.any?
true
end
def send_confirm_email
@order.update!
record_success(@order)
SubscriptionMailer.confirmation_email(@order).deliver
def setup_payment!(order)
OrderManagement::Subscriptions::PaymentSetup.new(order).call!
return if order.errors.any?
OrderManagement::Subscriptions::StripePaymentSetup.new(order).call!
end
def send_failed_payment_email
@order.update!
record_and_log_error(:failed_payment, @order)
SubscriptionMailer.failed_payment_email(@order).deliver
def authorize_payment!(order)
return if order.subscription.payment_method.class != Spree::Gateway::StripeSCA
OrderManagement::Subscriptions::StripeScaPaymentAuthorize.new(order).call!
end
def send_confirmation_email(order)
order.update!
record_success(order)
SubscriptionMailer.confirmation_email(order).deliver
end
def send_failed_payment_email(order)
order.update!
record_and_log_error(:failed_payment, order)
SubscriptionMailer.failed_payment_email(order).deliver
end
end

View File

@@ -1,4 +1,4 @@
require 'open_food_network/subscription_summarizer'
require 'order_management/subscriptions/summarizer'
class SubscriptionPlacementJob
def perform
@@ -17,7 +17,7 @@ class SubscriptionPlacementJob
delegate :record_and_log_error, :send_placement_summary_emails, to: :summarizer
def summarizer
@summarizer ||= OpenFoodNetwork::SubscriptionSummarizer.new
@summarizer ||= OrderManagement::Subscriptions::Summarizer.new
end
def proxy_orders

View File

@@ -1,41 +1,58 @@
# frozen_string_literal: true
class ProducerMailer < Spree::BaseMailer
include I18nHelper
def order_cycle_report(producer, order_cycle)
@producer = producer
@coordinator = order_cycle.coordinator
@order_cycle = order_cycle
line_items = line_items_from(@order_cycle, @producer)
@grouped_line_items = line_items.group_by(&:product_and_full_name)
@receival_instructions = @order_cycle.receival_instructions_for @producer
@total = total_from_line_items(line_items)
@tax_total = tax_total_from_line_items(line_items)
I18n.with_locale valid_locale(@producer.owner) do
order_cycle_subject = I18n.t('producer_mailer.order_cycle.subject', producer: producer.name)
subject = "[#{Spree::Config.site_name}] #{order_cycle_subject}"
with_unscoped_products_and_variants do
load_data
return unless has_orders?(order_cycle, producer)
I18n.with_locale(owner_locale) do
return unless orders?(order_cycle, producer)
mail(
to: @producer.contact.email,
from: from_address,
subject: subject,
reply_to: @coordinator.contact.email,
cc: @coordinator.contact.email
)
mail(
to: @producer.contact.email,
from: from_address,
subject: subject,
reply_to: @coordinator.contact.email,
cc: @coordinator.contact.email
)
end
end
end
private
def has_orders?(order_cycle, producer)
def owner_locale
valid_locale(@producer.owner)
end
def load_data
@coordinator = @order_cycle.coordinator
line_items = line_items_from(@order_cycle, @producer)
@grouped_line_items = line_items.group_by(&:product_and_full_name)
@receival_instructions = @order_cycle.receival_instructions_for(@producer)
@total = total_from_line_items(line_items)
@tax_total = tax_total_from_line_items(line_items)
end
def subject
order_cycle_subject = I18n.t('producer_mailer.order_cycle.subject', producer: @producer.name)
"[#{Spree::Config.site_name}] #{order_cycle_subject}"
end
def orders?(order_cycle, producer)
line_items_from(order_cycle, producer).any?
end
def line_items_from(order_cycle, producer)
Spree::LineItem.
includes(variant: { option_values: :option_type }).
@line_items ||= Spree::LineItem.
includes(:option_values, variant: [:product, { option_values: :option_type }]).
from_order_cycle(order_cycle).
sorted_by_name_and_unit_value.
merge(Spree::Product.in_supplier(producer)).
@@ -49,4 +66,22 @@ class ProducerMailer < Spree::BaseMailer
def tax_total_from_line_items(line_items)
Spree::Money.new line_items.sum(&:included_tax)
end
# This hack makes ActiveRecord skip the default_scope (deleted_at IS NULL)
# when eager loading associations. Further details:
# https://github.com/rails/rails/issues/11036
def with_unscoped_products_and_variants
variant_default_scopes = Spree::Variant.default_scopes
product_default_scopes = Spree::Product.default_scopes
Spree::Variant.default_scopes = []
Spree::Product.default_scopes = []
return_value = yield
Spree::Variant.default_scopes = variant_default_scopes
Spree::Product.default_scopes = product_default_scopes
return_value
end
end

View File

@@ -2,6 +2,7 @@ Spree::OrderMailer.class_eval do
helper HtmlHelper
helper CheckoutHelper
helper SpreeCurrencyHelper
helper OrderHelper
include I18nHelper
def cancel_email(order_or_order_id, resend = false)

View File

@@ -1,6 +1,7 @@
class SubscriptionMailer < Spree::BaseMailer
helper CheckoutHelper
helper ShopMailHelper
helper OrderHelper
include I18nHelper
def confirmation_email(order)

View File

@@ -57,8 +57,8 @@ class ContentConfiguration < Spree::Preferences::FileConfiguration
# Other
preference :footer_facebook_url, :string, default: "https://www.facebook.com/OpenFoodNet"
preference :footer_twitter_url, :string, default: "https://twitter.com/OpenFoodNet"
preference :footer_instagram_url, :string, default: ""
preference :footer_linkedin_url, :string, default: "http://www.linkedin.com/groups/Open-Food-Foundation-4743336"
preference :footer_instagram_url, :string, default: "https://www.instagram.com/openfoodnetworkuk/"
preference :footer_linkedin_url, :string, default: "https://www.linkedin.com/company/openfoodnetwork/"
preference :footer_googleplus_url, :string, default: ""
preference :footer_pinterest_url, :string, default: ""
preference :footer_email, :string, default: "hello@openfoodnetwork.org"

View File

@@ -17,7 +17,7 @@ class OrderCycle < ActiveRecord::Base
has_many :distributors, source: :receiver, through: :cached_outgoing_exchanges, uniq: true
has_and_belongs_to_many :schedules, join_table: 'order_cycle_schedules'
has_paper_trail meta: { custom_data: :schedule_ids }
has_paper_trail meta: { custom_data: proc { |order_cycle| order_cycle.schedule_ids.to_s } }
attr_accessor :incoming_exchanges, :outgoing_exchanges

View File

@@ -4,18 +4,6 @@ class ProducerProperty < ActiveRecord::Base
default_scope { order("#{table_name}.position") }
scope :ever_sold_by, ->(shop) {
joins(producer: { supplied_products: { variants: { exchanges: :order_cycle } } }).
merge(Exchange.outgoing).
merge(Exchange.to_enterprise(shop)).
select('DISTINCT producer_properties.*')
}
scope :currently_sold_by, ->(shop) {
ever_sold_by(shop).
merge(OrderCycle.active)
}
def property_name
property.name if property
end

View File

@@ -1,6 +1,6 @@
class Schedule < ActiveRecord::Base
has_and_belongs_to_many :order_cycles, join_table: 'order_cycle_schedules'
has_paper_trail meta: { custom_data: :order_cycle_ids }
has_paper_trail meta: { custom_data: proc { |schedule| schedule.order_cycle_ids.to_s } }
has_many :coordinators, uniq: true, through: :order_cycles

View File

@@ -14,7 +14,6 @@ Spree::AppConfiguration.class_eval do
preference :privacy_policy_url, :string, default: nil
preference :cookies_consent_banner_toggle, :boolean, default: false
preference :cookies_policy_matomo_section, :boolean, default: false
preference :cookies_policy_ga_section, :boolean, default: false
# Tax Preferences
preference :products_require_tax_category, :boolean, default: false

View File

@@ -17,9 +17,9 @@ module Spree
order_amount = line_items_for(object).map { |x| x.price * x.quantity }.sum
if order_amount < min
cost = preferred_normal_amount.to_i
cost = preferred_normal_amount.to_f
elsif order_amount >= min
cost = preferred_discount_amount.to_i
cost = preferred_discount_amount.to_f
end
cost

View File

@@ -1,6 +0,0 @@
Spree::Money.class_eval do
# return the currency symbol (on it's own) for the current default currency
def self.currency_symbol
Money.new(0, Spree::Config[:currency]).symbol
end
end

View File

@@ -263,7 +263,11 @@ Spree::Order.class_eval do
end
def line_item_variants
line_items.map(&:variant)
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

View File

@@ -2,11 +2,16 @@ module Spree
class Property < ActiveRecord::Base
has_many :product_properties, dependent: :destroy
has_many :products, through: :product_properties
has_many :producer_properties
attr_accessible :name, :presentation
validates :name, :presentation, presence: true
scope :sorted, -> { order(:name) }
def property
self
end
end
end

View File

@@ -1,27 +0,0 @@
module Spree
Property.class_eval do
has_many :producer_properties
scope :applied_by, ->(enterprise) {
select('DISTINCT spree_properties.*').
joins(:product_properties).
where('spree_product_properties.product_id IN (?)', enterprise.supplied_product_ids)
}
scope :ever_sold_by, ->(shop) {
joins(products: { variants: { exchanges: :order_cycle } }).
merge(Exchange.outgoing).
merge(Exchange.to_enterprise(shop)).
select('DISTINCT spree_properties.*')
}
scope :currently_sold_by, ->(shop) {
ever_sold_by(shop).
merge(OrderCycle.active)
}
def property
self
end
end
end

View File

@@ -0,0 +1,36 @@
# frozen_string_literal: true
module Spree
module Stock
class Quantifier
attr_reader :stock_items
def initialize(variant)
@variant = variant
@stock_items = fetch_stock_items
end
def total_on_hand
stock_items.sum(&:count_on_hand)
end
def backorderable?
stock_items.any?(&:backorderable)
end
def can_supply?(required)
total_on_hand >= required || backorderable?
end
private
def fetch_stock_items
# Don't re-fetch associated stock items from the DB if we've already eager-loaded them
return @variant.stock_items.to_a if @variant.stock_items.loaded?
Spree::StockItem.joins(:stock_location).
where(:variant_id => @variant, Spree::StockLocation.table_name => { active: true })
end
end
end
end

View File

@@ -125,7 +125,12 @@ module Spree
end
def default_card
credit_cards.where(is_default: true).first
# Don't re-fetch associated cards from the DB if they're already eager-loaded
if credit_cards.loaded?
credit_cards.to_a.find(&:is_default)
else
credit_cards.where(is_default: true).first
end
end
# Checks whether the specified user is a superadmin, with full control of the

View File

@@ -16,7 +16,8 @@ Spree::Variant.class_eval do
has_many :variant_overrides
has_many :inventory_items
attr_accessible :unit_value, :unit_description, :images_attributes, :display_as, :display_name, :import_date
attr_accessible :unit_value, :unit_description, :images_attributes,
:display_as, :display_name, :import_date
accepts_nested_attributes_for :images
validates :unit_value, presence: true, if: ->(variant) {
@@ -53,13 +54,23 @@ Spree::Variant.class_eval do
}
scope :visible_for, lambda { |enterprise|
joins(:inventory_items).where('inventory_items.enterprise_id = (?) AND inventory_items.visible = (?)', enterprise, true)
joins(:inventory_items).
where(
'inventory_items.enterprise_id = (?) AND inventory_items.visible = (?)',
enterprise,
true
)
}
scope :not_hidden_for, lambda { |enterprise|
return where("1=0") if enterprise.blank?
joins("LEFT OUTER JOIN (SELECT * from inventory_items WHERE enterprise_id = #{sanitize enterprise.andand.id}) AS o_inventory_items ON o_inventory_items.variant_id = spree_variants.id")
joins("
LEFT OUTER JOIN (SELECT *
FROM inventory_items
WHERE enterprise_id = #{sanitize enterprise.andand.id})
AS o_inventory_items
ON o_inventory_items.variant_id = spree_variants.id")
.where("o_inventory_items.id IS NULL OR o_inventory_items.visible = (?)", true)
}
@@ -68,7 +79,8 @@ Spree::Variant.class_eval do
scope :stockable_by, lambda { |enterprise|
return where("1=0") if enterprise.blank?
joins(:product).where(spree_products: { id: Spree::Product.stockable_by(enterprise).pluck(:id) })
joins(:product).
where(spree_products: { id: Spree::Product.stockable_by(enterprise).pluck(:id) })
}
# Define sope as class method to allow chaining with other scopes filtering id.
@@ -85,7 +97,19 @@ Spree::Variant.class_eval do
]
end
# We override in_stock? to avoid depending on the non-overridable method Spree::Stock::Quantifier.can_supply?
def self.active(currency = nil)
# "where(id:" is necessary so that the returned relation has no includes
# The relation without includes will not be readonly and allow updates on it
where("spree_variants.id in (?)", joins(:prices).
where(deleted_at: nil).
where('spree_prices.currency' =>
currency || Spree::Config[:currency]).
where('spree_prices.amount IS NOT NULL').
select("spree_variants.id"))
end
# We override in_stock? to avoid depending
# on the non-overridable method Spree::Stock::Quantifier.can_supply?
# VariantStock implements can_supply? itself which depends on overridable methods
def in_stock?(quantity = 1)
can_supply?(quantity)

View File

@@ -15,8 +15,10 @@ class VariantOverrideSet < ModelSet
tag_list.empty?
end
# Override of ModelSet method to allow us to check presence of a tag_list (which is not an attribute)
# This method will delete VariantOverrides that have no values (see deletable? above)
# If the user sets all values to nil in the UI the VO will be deleted from the DB
def collection_to_delete
# Override of ModelSet method to allow us to check presence of a tag_list (which is not an attribute)
deleted = []
collection.delete_if { |e| deleted << e if @delete_if.andand.call(e.attributes, e.tag_list) }
deleted

View File

@@ -1,4 +1,12 @@
class Api::Admin::BasicEnterpriseSerializer < ActiveModel::Serializer
attributes :name, :id, :is_primary_producer, :is_distributor, :sells, :category,
:payment_method_ids, :shipping_method_ids, :producer_profile_only, :permalink
def payment_method_ids
object.payment_methods.map(&:id)
end
def shipping_method_ids
object.shipping_methods.map(&:id)
end
end

View File

@@ -6,7 +6,7 @@ class Api::Admin::CustomerSerializer < ActiveModel::Serializer
has_one :bill_address, serializer: Api::AddressSerializer
def tag_list
object.tag_list.join(",")
customer_tag_list.join(",")
end
def name
@@ -14,7 +14,7 @@ class Api::Admin::CustomerSerializer < ActiveModel::Serializer
end
def tags
object.tag_list.map do |tag|
customer_tag_list.map do |tag|
tag_rule_map = options[:tag_rule_mapping].andand[tag]
tag_rule_map || { text: tag, rules: nil }
end
@@ -25,4 +25,12 @@ class Api::Admin::CustomerSerializer < ActiveModel::Serializer
object.user.default_card.present?
end
private
def customer_tag_list
return object.tag_list unless options[:customer_tags]
options[:customer_tags].andand[object.id] || []
end
end

View File

@@ -0,0 +1,15 @@
# frozen_string_literal: true
module Api
module Admin
class ProductSimpleSerializer < ActiveModel::Serializer
attributes :id, :name, :producer_id
has_many :variants, key: :variants, serializer: Api::Admin::VariantSimpleSerializer
def producer_id
object.supplier_id
end
end
end
end

View File

@@ -13,9 +13,9 @@ module Api
end
def in_open_and_upcoming_order_cycles
SubscriptionVariantsService.in_open_and_upcoming_order_cycles?(option_or_assigned_shop,
option_or_assigned_schedule,
object.variant)
OrderManagement::Subscriptions::VariantsList.in_open_and_upcoming_order_cycles?(option_or_assigned_shop,
option_or_assigned_schedule,
object.variant)
end
private

View File

@@ -0,0 +1,32 @@
# frozen_string_literal: true
module Api
module Admin
class VariantSimpleSerializer < ActiveModel::Serializer
attributes :id, :name, :import_date,
:options_text, :unit_value, :unit_description, :unit_to_display,
:display_as, :display_name, :name_to_display,
:price, :on_demand, :on_hand
has_many :variant_overrides
def name
if object.full_name.present?
"#{object.name} - #{object.full_name}"
else
object.name
end
end
def on_hand
return 0 if object.on_hand.nil?
object.on_hand
end
def price
object.price.nil? ? 0.to_f : object.price
end
end
end
end

View File

@@ -73,12 +73,16 @@ module Api
# This results in 3 queries per enterprise
def distributed_properties
return [] unless active
(distributed_product_properties + distributed_producer_properties).uniq do |property_object|
property_object.property.presentation
end
end
def distributed_product_properties
return [] unless active
properties = Spree::Property
.joins(products: { variants: { exchanges: :order_cycle } })
.merge(Exchange.outgoing)
@@ -91,6 +95,8 @@ module Api
end
def distributed_producer_properties
return [] unless active
properties = Spree::Property
.joins(
producer_properties: {

View File

@@ -12,11 +12,8 @@ module Checkout
def path
return unless stripe_payment_method?
payment = @order.pending_payments.last
return unless payment&.checkout?
payment.authorize!
raise unless payment.pending?
payment = OrderManagement::Subscriptions::StripeScaPaymentAuthorize.new(@order).call!
raise if @order.errors.any?
field_with_url(payment) if url?(field_with_url(payment))
end

View File

@@ -1,6 +1,6 @@
require 'open_food_network/permissions'
require 'open_food_network/proxy_order_syncer'
require 'open_food_network/order_cycle_form_applicator'
require 'order_management/subscriptions/proxy_order_syncer'
class OrderCycleForm
def initialize(order_cycle, params, user)
@@ -58,7 +58,7 @@ class OrderCycleForm
return unless schedule_ids?
return unless schedule_sync_required?
OpenFoodNetwork::ProxyOrderSyncer.new(subscriptions_to_sync).sync!
OrderManagement::Subscriptions::ProxyOrderSyncer.new(subscriptions_to_sync).sync!
end
def schedule_sync_required?

View File

@@ -1,14 +1,28 @@
# frozen_string_literal: true
module OrderPaymentFinder
def self.last_payment_method(order)
# `max_by` avoids additional database queries when payments are loaded
# already. There is usually only one payment and this shouldn't cause
# any overhead compared to `order(:created_at).last`. Using `last`
# without order is not deterministic.
#
# We are not using `updated_at` because all payments are touched when the
# order is updated and then all payments have the same `updated_at` value.
order.payments.max_by(&:created_at)&.payment_method
class OrderPaymentFinder
def initialize(order)
@order = order
end
def last_payment
last(@order.payments)
end
def last_pending_payment
last(@order.pending_payments)
end
private
# `max_by` avoids additional database queries when payments are loaded
# already. There is usually only one payment and this shouldn't cause
# any overhead compared to `order(:created_at).last`. Using `last`
# without order is not deterministic.
#
# We are not using `updated_at` because all payments are touched when the
# order is updated and then all payments have the same `updated_at` value.
def last(payments)
payments.max_by(&:created_at)
end
end

View File

@@ -40,7 +40,7 @@ class ProductsRenderer
end
def product_scoper
OpenFoodNetwork::ScopeProductToHub.new(distributor)
@product_scoper ||= OpenFoodNetwork::ScopeProductToHub.new(distributor)
end
def enterprise_fee_calculator

View File

@@ -0,0 +1,31 @@
# frozen_string_literal: true
# Lists available order cycles for a given customer in a given distributor
module Shop
class OrderCyclesList
def initialize(distributor, customer)
@distributor = distributor
@customer = customer
end
def call
order_cycles = OrderCycle.with_distributor(@distributor).active
.order(@distributor.preferred_shopfront_order_cycle_order)
apply_tag_rules!(order_cycles)
end
private
# order_cycles is a ActiveRecord::Relation that is modified with reject in the TagRuleApplicator
# If this relation is reloaded (for example by calling count on it), the modifications are lost
def apply_tag_rules!(order_cycles)
applicator = OpenFoodNetwork::TagRuleApplicator.new(@distributor,
"FilterOrderCycles",
@customer.andand.tag_list)
applicator.filter!(order_cycles)
order_cycles
end
end
end

View File

@@ -0,0 +1,23 @@
# frozen_string_literal: true
class ShopsListService
def open_shops
shops_list.ready_for_checkout.all
end
def closed_shops
shops_list.not_ready_for_checkout.all
end
private
def shops_list
Enterprise
.activated
.visible
.is_distributor
.includes(address: [:state, :country])
.includes(:properties)
.includes(supplied_products: :properties)
end
end

View File

@@ -1,63 +0,0 @@
require 'open_food_network/scope_variant_to_hub'
# Responsible for estimating prices and fees for subscriptions
# Used by SubscriptionForm as part of the create/update process
# The values calculated here are intended to be persisted in the db
class SubscriptionEstimator
def initialize(subscription)
@subscription = subscription
end
def estimate!
assign_price_estimates
assign_fee_estimates
end
private
attr_accessor :subscription
delegate :subscription_line_items, :shipping_method, :payment_method, :shop, to: :subscription
def assign_price_estimates
subscription_line_items.each do |item|
item.price_estimate =
price_estimate_for(item.variant, item.price_estimate_was)
end
end
def price_estimate_for(variant, fallback)
return fallback unless fee_calculator && variant
scoper.scope(variant)
fees = fee_calculator.indexed_fees_for(variant)
(variant.price + fees).to_d
end
def fee_calculator
return @fee_calculator unless @fee_calculator.nil?
next_oc = subscription.schedule.andand.current_or_next_order_cycle
return nil unless shop && next_oc
@fee_calculator = OpenFoodNetwork::EnterpriseFeeCalculator.new(shop, next_oc)
end
def scoper
OpenFoodNetwork::ScopeVariantToHub.new(shop)
end
def assign_fee_estimates
subscription.shipping_fee_estimate = shipping_fee_estimate
subscription.payment_fee_estimate = payment_fee_estimate
end
def shipping_fee_estimate
shipping_method.calculator.compute(subscription)
end
def payment_fee_estimate
payment_method.calculator.compute(subscription)
end
end

View File

@@ -1,34 +0,0 @@
require 'open_food_network/proxy_order_syncer'
class SubscriptionForm
attr_accessor :subscription, :params, :order_update_issues, :validator, :order_syncer, :estimator
delegate :json_errors, :valid?, to: :validator
delegate :order_update_issues, to: :order_syncer
def initialize(subscription, params = {})
@subscription = subscription
@params = params
@estimator = SubscriptionEstimator.new(subscription)
@validator = SubscriptionValidator.new(subscription)
@order_syncer = OrderSyncer.new(subscription)
end
def save
subscription.assign_attributes(params)
return false unless valid?
subscription.transaction do
estimator.estimate!
proxy_order_syncer.sync!
order_syncer.sync!
subscription.save!
end
end
private
def proxy_order_syncer
OpenFoodNetwork::ProxyOrderSyncer.new(subscription)
end
end

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