mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-17 19:26:48 +00:00
Compare commits
145 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4960402643 | ||
|
|
3557c10cd6 | ||
|
|
45dd421f1f | ||
|
|
11653c9430 | ||
|
|
d068094044 | ||
|
|
b892bf726e | ||
|
|
ba45dd84dd | ||
|
|
92e2a83e0e | ||
|
|
f42f513f8c | ||
|
|
54342254b6 | ||
|
|
470761da86 | ||
|
|
6fdf9fa038 | ||
|
|
bbec01a9cb | ||
|
|
e3001cc8c4 | ||
|
|
ad0d0e393e | ||
|
|
2690ff5eb5 | ||
|
|
2594382488 | ||
|
|
89cb3b7c14 | ||
|
|
3e0b358370 | ||
|
|
f206b7ed9e | ||
|
|
946b69242c | ||
|
|
a409d3b97e | ||
|
|
1f661c1e69 | ||
|
|
97f51d24b8 | ||
|
|
c3d274c84f | ||
|
|
0b03152f3b | ||
|
|
6f492d868c | ||
|
|
dab2a4af75 | ||
|
|
f7935bde34 | ||
|
|
61850f7e92 | ||
|
|
7df456c1e3 | ||
|
|
2fa86492d1 | ||
|
|
85860692ae | ||
|
|
8ad4d2cc2e | ||
|
|
c967eca9c4 | ||
|
|
7fff82eec3 | ||
|
|
c30ed0f7c8 | ||
|
|
cde420716b | ||
|
|
ee37c5d4a3 | ||
|
|
e9d236f761 | ||
|
|
8b78c28feb | ||
|
|
871b2f8816 | ||
|
|
214bdc6fbe | ||
|
|
d2fce053a7 | ||
|
|
11a7aa9f96 | ||
|
|
c0203e7091 | ||
|
|
44cc5cc665 | ||
|
|
6c8e383ab8 | ||
|
|
5c6d9a092e | ||
|
|
8d500a2c27 | ||
|
|
425674c4e5 | ||
|
|
e91e827f29 | ||
|
|
8f201c830a | ||
|
|
1b536d9265 | ||
|
|
1b8a9244a6 | ||
|
|
a40e883d17 | ||
|
|
6bf21d2abd | ||
|
|
29b9777a96 | ||
|
|
283dd84ad6 | ||
|
|
03828c5608 | ||
|
|
dad4061ff9 | ||
|
|
b19df0dfbf | ||
|
|
efb2ae6843 | ||
|
|
407fca17cb | ||
|
|
33409725a5 | ||
|
|
c70a694111 | ||
|
|
9c88c77066 | ||
|
|
42585bb074 | ||
|
|
b0211d0930 | ||
|
|
0675422509 | ||
|
|
5ff1b0d358 | ||
|
|
43cbac7d17 | ||
|
|
98e4f867b4 | ||
|
|
ebb15781d5 | ||
|
|
028c4f4281 | ||
|
|
ef7dfa3b4f | ||
|
|
71f9415d21 | ||
|
|
12848acf21 | ||
|
|
4f751c2711 | ||
|
|
920e2564a4 | ||
|
|
6b4e150e2a | ||
|
|
2d43e32688 | ||
|
|
a6cd393c57 | ||
|
|
b1060bf1c9 | ||
|
|
1bf5fbaf3a | ||
|
|
2ace3afd67 | ||
|
|
0bfceb877d | ||
|
|
c1d28b2e8f | ||
|
|
2841b42296 | ||
|
|
98e44e7a40 | ||
|
|
51c6c19f80 | ||
|
|
26947a64c0 | ||
|
|
df5c21048a | ||
|
|
8a124fb6be | ||
|
|
ced49e0217 | ||
|
|
75b7a1864b | ||
|
|
281d0eb417 | ||
|
|
496f5199c9 | ||
|
|
f13c0e1dca | ||
|
|
f801d4a4cb | ||
|
|
d94da8df1e | ||
|
|
70d9cfa08e | ||
|
|
193ae7936e | ||
|
|
0971e8d9b5 | ||
|
|
e78b44b9ca | ||
|
|
c5779eff81 | ||
|
|
b616c14f63 | ||
|
|
03cb14c926 | ||
|
|
da78e06a39 | ||
|
|
f4c351febf | ||
|
|
30184ac6aa | ||
|
|
a123d45eca | ||
|
|
a75f16e23c | ||
|
|
546e90b286 | ||
|
|
bf9f47a000 | ||
|
|
3da6e6b5ed | ||
|
|
111705f6f2 | ||
|
|
68d5327b12 | ||
|
|
688285c374 | ||
|
|
15058299d8 | ||
|
|
4e92f33b1c | ||
|
|
c7cb982c9a | ||
|
|
34e9112c0a | ||
|
|
28eb11bda5 | ||
|
|
d8e82d9c88 | ||
|
|
061fc321b4 | ||
|
|
5201e54f82 | ||
|
|
5192a08082 | ||
|
|
94d3f136e2 | ||
|
|
db3a923ea7 | ||
|
|
619eb43c57 | ||
|
|
5c221621d3 | ||
|
|
60d7ed5036 | ||
|
|
e74328f1d7 | ||
|
|
6abd652251 | ||
|
|
3821eede51 | ||
|
|
020af0c0e4 | ||
|
|
00a3976905 | ||
|
|
3bd8e430f9 | ||
|
|
77733169fc | ||
|
|
54d5d0ed80 | ||
|
|
ac5cbcf19e | ||
|
|
e10ea4b686 | ||
|
|
913f8bbad0 | ||
|
|
fc951e92ac |
@@ -11,3 +11,9 @@ OFN_REDIS_URL="redis://localhost:6379/1"
|
||||
OFN_REDIS_JOBS_URL="redis://localhost:6379/2"
|
||||
|
||||
SITE_URL="0.0.0.0:3000"
|
||||
|
||||
# Deactivate rack-timeout in development.
|
||||
# https://github.com/zombocom/rack-timeout#configuring
|
||||
RACK_TIMEOUT_SERVICE_TIMEOUT="0"
|
||||
RACK_TIMEOUT_WAIT_TIMEOUT="0"
|
||||
RACK_TIMEOUT_WAIT_OVERTIME="0"
|
||||
|
||||
1
.github/workflows/brakeman-analysis.yml
vendored
1
.github/workflows/brakeman-analysis.yml
vendored
@@ -41,6 +41,7 @@ jobs:
|
||||
- name: Scan
|
||||
continue-on-error: true
|
||||
run: |
|
||||
git show --no-patch # the commit being tested (which is often a merge due to actions/checkout@v3)
|
||||
brakeman -f sarif -o output.sarif.json .
|
||||
|
||||
# Upload the SARIF file generated in the previous step
|
||||
|
||||
3
.github/workflows/build.yml
vendored
3
.github/workflows/build.yml
vendored
@@ -68,7 +68,6 @@ jobs:
|
||||
bundle exec rake db:schema:load
|
||||
|
||||
- name: Run tests
|
||||
|
||||
env:
|
||||
KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: 864ef557d85ea8e603e086c0387d5154
|
||||
KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }}
|
||||
@@ -82,8 +81,8 @@ jobs:
|
||||
# https://knapsackpro.com/faq/question/how-to-split-slow-rspec-test-files-by-test-examples-by-individual-it
|
||||
#KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES: true
|
||||
KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/controllers/**/*_spec.rb}"
|
||||
|
||||
run: |
|
||||
git show --no-patch # the commit being tested (which is often a merge due to actions/checkout@v3)
|
||||
bundle exec rake knapsack_pro:rspec
|
||||
|
||||
knapsack_rspec_models:
|
||||
|
||||
6
.github/workflows/linters.yml
vendored
6
.github/workflows/linters.yml
vendored
@@ -9,7 +9,11 @@ jobs:
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- uses: ruby/setup-ruby@v1
|
||||
|
||||
- run: git show --no-patch # the commit being tested (which is often a merge due to actions/checkout@v3)
|
||||
|
||||
- name: rubocop
|
||||
uses: reviewdog/action-rubocop@v2
|
||||
with:
|
||||
@@ -32,6 +36,8 @@ jobs:
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
|
||||
- run: git show --no-patch # the commit being tested (which is often a merge due to actions/checkout@v3)
|
||||
|
||||
- name: prettier
|
||||
uses: EPMatt/reviewdog-action-prettier@v1
|
||||
with:
|
||||
|
||||
@@ -2,9 +2,8 @@
|
||||
#
|
||||
# These are the rules we agreed upon and we work towards.
|
||||
AllCops:
|
||||
NewCops: disable
|
||||
NewCops: enable
|
||||
SuggestExtensions: false
|
||||
TargetRailsVersion: 5.0
|
||||
Exclude:
|
||||
- 'bin/**/*'
|
||||
- 'db/**/*'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# This configuration was generated by
|
||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400`
|
||||
# on 2023-04-01 00:21:28 UTC using RuboCop version 1.47.0.
|
||||
# on 2023-04-14 06:27:24 UTC using RuboCop version 1.50.1.
|
||||
# The point is for the user to remove these configuration records
|
||||
# one by one as the offenses are removed from the code base.
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
@@ -14,6 +14,28 @@ Bundler/OrderedGems:
|
||||
Exclude:
|
||||
- 'Gemfile'
|
||||
|
||||
# Offense count: 4
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Severity, Include.
|
||||
# Include: **/*.gemspec
|
||||
Gemspec/DeprecatedAttributeAssignment:
|
||||
Exclude:
|
||||
- 'engines/catalog/catalog.gemspec'
|
||||
- 'engines/dfc_provider/dfc_provider.gemspec'
|
||||
- 'engines/order_management/order_management.gemspec'
|
||||
- 'engines/web/web.gemspec'
|
||||
|
||||
# Offense count: 4
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Severity, Include.
|
||||
# Include: **/*.gemspec
|
||||
Gemspec/RequireMFA:
|
||||
Exclude:
|
||||
- 'engines/catalog/catalog.gemspec'
|
||||
- 'engines/dfc_provider/dfc_provider.gemspec'
|
||||
- 'engines/order_management/order_management.gemspec'
|
||||
- 'engines/web/web.gemspec'
|
||||
|
||||
# Offense count: 4
|
||||
# Configuration parameters: Severity, Include.
|
||||
# Include: **/*.gemspec
|
||||
@@ -63,11 +85,10 @@ Layout/BlockAlignment:
|
||||
Exclude:
|
||||
- 'spec/services/products_renderer_spec.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Offense count: 4
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Layout/BlockEndNewline:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/subscriptions_controller.rb'
|
||||
- 'spec/lib/open_food_network/enterprise_fee_calculator_spec.rb'
|
||||
- 'spec/system/admin/orders_spec.rb'
|
||||
|
||||
@@ -100,14 +121,13 @@ Layout/ExtraSpacing:
|
||||
Exclude:
|
||||
- 'spec/spec_helper.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
||||
# SupportedStyles: consistent, consistent_relative_to_receiver, special_for_inner_method_call, special_for_inner_method_call_in_parentheses
|
||||
Layout/FirstArgumentIndentation:
|
||||
Exclude:
|
||||
- 'spec/system/admin/orders_spec.rb'
|
||||
- 'spec/system/admin/products_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
@@ -117,7 +137,7 @@ Layout/FirstHashElementIndentation:
|
||||
Exclude:
|
||||
- 'spec/services/products_renderer_spec.rb'
|
||||
|
||||
# Offense count: 13
|
||||
# Offense count: 11
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
|
||||
# SupportedHashRocketStyles: key, separator, table
|
||||
@@ -125,31 +145,25 @@ Layout/FirstHashElementIndentation:
|
||||
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
|
||||
Layout/HashAlignment:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/subscriptions_controller.rb'
|
||||
- 'app/controllers/spree/users_controller.rb'
|
||||
- 'app/models/spree/image.rb'
|
||||
- 'spec/migrations/migrate_customer_names_spec.rb'
|
||||
- 'spec/models/enterprise_spec.rb'
|
||||
- 'spec/support/request/stripe_stubs.rb'
|
||||
- 'spec/system/admin/customers_spec.rb'
|
||||
- 'spec/system/admin/order_spec.rb'
|
||||
- 'spec/system/admin/orders_spec.rb'
|
||||
- 'spec/system/admin/tag_rules_spec.rb'
|
||||
- 'spec/system/consumer/shopping/cart_spec.rb'
|
||||
|
||||
# Offense count: 18
|
||||
# Offense count: 4
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: normal, indented_internal_methods
|
||||
Layout/IndentationConsistency:
|
||||
Exclude:
|
||||
- 'spec/system/admin/order_cycles/complex_editing_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/complex_updating_specific_time_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/simple_spec.rb'
|
||||
- 'spec/system/admin/order_spec.rb'
|
||||
- 'spec/system/admin/orders_spec.rb'
|
||||
- 'spec/system/admin/product_import_spec.rb'
|
||||
- 'spec/system/consumer/split_checkout_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
@@ -165,7 +179,64 @@ Layout/LeadingCommentSpace:
|
||||
Exclude:
|
||||
- 'spec/system/admin/enterprises_spec.rb'
|
||||
|
||||
# Offense count: 603
|
||||
# Offense count: 114
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: space, no_space
|
||||
Layout/LineContinuationSpacing:
|
||||
Exclude:
|
||||
- 'app/helpers/checkout_helper.rb'
|
||||
- 'engines/order_management/spec/services/order_management/order/updater_spec.rb'
|
||||
- 'engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb'
|
||||
- 'engines/web/app/helpers/web/cookies_policy_helper.rb'
|
||||
- 'spec/system/admin/bulk_order_management_spec.rb'
|
||||
- 'spec/system/admin/configuration/content_spec.rb'
|
||||
- 'spec/system/admin/customers_spec.rb'
|
||||
- 'spec/system/admin/enterprise_fees_spec.rb'
|
||||
- 'spec/system/admin/enterprises/index_spec.rb'
|
||||
- 'spec/system/admin/enterprises_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/list_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/simple_spec.rb'
|
||||
- 'spec/system/admin/order_spec.rb'
|
||||
- 'spec/system/admin/orders_spec.rb'
|
||||
- 'spec/system/admin/overview_spec.rb'
|
||||
- 'spec/system/admin/payment_method_spec.rb'
|
||||
- 'spec/system/admin/product_import_spec.rb'
|
||||
- 'spec/system/admin/subscriptions_spec.rb'
|
||||
- 'spec/system/admin/tag_rules_spec.rb'
|
||||
- 'spec/system/admin/users_spec.rb'
|
||||
- 'spec/system/admin/variant_overrides_spec.rb'
|
||||
- 'spec/system/consumer/authentication_spec.rb'
|
||||
- 'spec/system/consumer/caching/shops_caching_spec.rb'
|
||||
- 'spec/system/consumer/cookies_spec.rb'
|
||||
- 'spec/system/consumer/shopping/cart_spec.rb'
|
||||
- 'spec/system/consumer/shopping/checkout_auth_spec.rb'
|
||||
- 'spec/system/consumer/shopping/checkout_spec.rb'
|
||||
- 'spec/system/consumer/shopping/products_spec.rb'
|
||||
- 'spec/system/consumer/shopping/shopping_spec.rb'
|
||||
- 'spec/system/consumer/shopping/unit_price_spec.rb'
|
||||
- 'spec/system/consumer/split_checkout_spec.rb'
|
||||
|
||||
# Offense count: 18
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
||||
# SupportedStyles: aligned, indented
|
||||
Layout/LineEndStringConcatenationIndentation:
|
||||
Exclude:
|
||||
- 'app/mailers/spree/user_mailer.rb'
|
||||
- 'engines/order_management/app/services/order_management/subscriptions/proxy_order_syncer.rb'
|
||||
- 'engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb'
|
||||
- 'spec/system/admin/configuration/content_spec.rb'
|
||||
- 'spec/system/admin/customers_spec.rb'
|
||||
- 'spec/system/admin/overview_spec.rb'
|
||||
- 'spec/system/admin/payment_method_spec.rb'
|
||||
- 'spec/system/admin/subscriptions_spec.rb'
|
||||
- 'spec/system/admin/tag_rules_spec.rb'
|
||||
- 'spec/system/consumer/caching/shops_caching_spec.rb'
|
||||
- 'spec/system/consumer/cookies_spec.rb'
|
||||
- 'spec/system/consumer/shopping/cart_spec.rb'
|
||||
|
||||
# Offense count: 605
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
|
||||
# URISchemes: http, https
|
||||
@@ -378,7 +449,7 @@ Layout/TrailingEmptyLines:
|
||||
Exclude:
|
||||
- 'Rakefile'
|
||||
|
||||
# Offense count: 69
|
||||
# Offense count: 67
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowInHeredoc.
|
||||
Layout/TrailingWhitespace:
|
||||
@@ -406,6 +477,16 @@ Layout/TrailingWhitespace:
|
||||
- 'spec/system/admin/shipping_methods_spec.rb'
|
||||
- 'spec/system/consumer/split_checkout_spec.rb'
|
||||
|
||||
# Offense count: 7
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Lint/AmbiguousOperatorPrecedence:
|
||||
Exclude:
|
||||
- 'app/models/calculator/flexi_rate.rb'
|
||||
- 'app/models/enterprise.rb'
|
||||
- 'app/models/spree/ability.rb'
|
||||
- 'app/models/spree/line_item.rb'
|
||||
- 'app/models/spree/preferences/store.rb'
|
||||
|
||||
# Offense count: 17
|
||||
# Configuration parameters: AllowedMethods.
|
||||
# AllowedMethods: enums
|
||||
@@ -424,6 +505,16 @@ Lint/ConstantDefinitionInBlock:
|
||||
- 'spec/validators/date_time_string_validator_spec.rb'
|
||||
- 'spec/validators/integer_array_validator_spec.rb'
|
||||
|
||||
# Offense count: 8
|
||||
# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
|
||||
Lint/DuplicateBranch:
|
||||
Exclude:
|
||||
- 'app/helpers/spree/admin/base_helper.rb'
|
||||
- 'app/models/enterprise.rb'
|
||||
- 'app/models/spree/calculator.rb'
|
||||
- 'app/models/spree/preference.rb'
|
||||
- 'app/models/spree/preferences/preferable.rb'
|
||||
|
||||
# Offense count: 2
|
||||
Lint/DuplicateMethods:
|
||||
Exclude:
|
||||
@@ -435,6 +526,30 @@ Lint/DuplicateRequire:
|
||||
Exclude:
|
||||
- 'spec/lib/open_food_network/scope_variants_to_search_spec.rb'
|
||||
|
||||
# Offense count: 20
|
||||
# Configuration parameters: AllowComments, AllowEmptyLambdas.
|
||||
Lint/EmptyBlock:
|
||||
Exclude:
|
||||
- 'engines/catalog/config/routes.rb'
|
||||
- 'spec/components/distributor_title_component_spec.rb'
|
||||
- 'spec/components/example_component_spec.rb'
|
||||
- 'spec/controllers/admin/subscription_line_items_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/shipments_controller_spec.rb'
|
||||
- 'spec/controllers/concerns/extra_fields_spec.rb'
|
||||
- 'spec/factories.rb'
|
||||
- 'spec/factories/enterprise_factory.rb'
|
||||
- 'spec/jobs/order_cycle_opened_job_spec.rb'
|
||||
- 'spec/jobs/subscription_placement_job_spec.rb'
|
||||
- 'spec/models/product_import/entry_validator_spec.rb'
|
||||
- 'spec/requests/checkout/concurrency_spec.rb'
|
||||
|
||||
# Offense count: 6
|
||||
# Configuration parameters: AllowComments.
|
||||
Lint/EmptyClass:
|
||||
Exclude:
|
||||
- 'spec/controllers/spree/admin/base_controller_spec.rb'
|
||||
- 'spec/lib/reports/report_loader_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: AllowComments.
|
||||
Lint/EmptyFile:
|
||||
@@ -452,6 +567,26 @@ Lint/IneffectiveAccessModifier:
|
||||
Exclude:
|
||||
- 'app/models/spree/user.rb'
|
||||
|
||||
# Offense count: 1
|
||||
Lint/NoReturnInBeginEndBlocks:
|
||||
Exclude:
|
||||
- 'app/controllers/payment_gateways/stripe_controller.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Lint/NonAtomicFileOperation:
|
||||
Exclude:
|
||||
- 'app/services/bulk_invoice_service.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Lint/RedundantDirGlobSort:
|
||||
Exclude:
|
||||
- 'engines/catalog/spec/spec_helper.rb'
|
||||
- 'engines/dfc_provider/spec/spec_helper.rb'
|
||||
- 'spec/base_spec_helper.rb'
|
||||
- 'spec/system_helper.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: AllowedMethods.
|
||||
@@ -482,14 +617,12 @@ Lint/UselessMethodDefinition:
|
||||
Exclude:
|
||||
- 'app/models/spree/gateway.rb'
|
||||
|
||||
# Offense count: 13
|
||||
# Offense count: 3
|
||||
# Configuration parameters: CheckForMethodsWithNoSideEffects.
|
||||
Lint/Void:
|
||||
Exclude:
|
||||
- 'spec/system/admin/order_cycles/complex_editing_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/complex_updating_specific_time_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/simple_spec.rb'
|
||||
- 'spec/system/admin/order_spec.rb'
|
||||
|
||||
# Offense count: 27
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
|
||||
@@ -746,12 +879,6 @@ Naming/AccessorMethodName:
|
||||
- 'spec/support/request/shop_workflow.rb'
|
||||
- 'spec/support/request/web_helper.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: AsciiConstants.
|
||||
Naming/AsciiIdentifiers:
|
||||
Exclude:
|
||||
- 'spec/system/admin/products_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: ForbiddenDelimiters.
|
||||
# ForbiddenDelimiters: (?i-mx:(^|\s)(EO[A-Z]{1}|END)(\s|$))
|
||||
@@ -791,6 +918,40 @@ Naming/VariableNumber:
|
||||
- 'spec/models/spree/tax_rate_spec.rb'
|
||||
- 'spec/requests/api/orders_spec.rb'
|
||||
|
||||
# Offense count: 9
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: ExpectedOrder, Include.
|
||||
# ExpectedOrder: index, show, new, edit, create, update, destroy
|
||||
# Include: app/controllers/**/*.rb
|
||||
Rails/ActionOrder:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/resource_controller.rb'
|
||||
- 'app/controllers/api/v0/orders_controller.rb'
|
||||
- 'app/controllers/spree/admin/images_controller.rb'
|
||||
- 'app/controllers/spree/admin/invoices_controller.rb'
|
||||
- 'app/controllers/spree/admin/products_controller.rb'
|
||||
- 'app/controllers/spree/admin/taxons_controller.rb'
|
||||
- 'app/controllers/spree/admin/variants_controller.rb'
|
||||
- 'app/controllers/user_confirmations_controller.rb'
|
||||
|
||||
# Offense count: 15
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/models/**/*.rb
|
||||
Rails/ActiveRecordCallbacksOrder:
|
||||
Exclude:
|
||||
- 'app/models/customer.rb'
|
||||
- 'app/models/enterprise.rb'
|
||||
- 'app/models/enterprise_group.rb'
|
||||
- 'app/models/enterprise_relationship.rb'
|
||||
- 'app/models/spree/line_item.rb'
|
||||
- 'app/models/spree/order.rb'
|
||||
- 'app/models/spree/payment.rb'
|
||||
- 'app/models/spree/product.rb'
|
||||
- 'app/models/spree/return_authorization.rb'
|
||||
- 'app/models/spree/user.rb'
|
||||
- 'app/models/spree/variant.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: Severity, Include.
|
||||
# Include: app/models/**/*.rb
|
||||
@@ -810,12 +971,6 @@ Rails/ApplicationJob:
|
||||
Exclude:
|
||||
- 'app/jobs/report_job.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/ApplicationMailer:
|
||||
Exclude:
|
||||
- 'app/mailers/spree/base_mailer.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: NilOrEmpty, NotPresent, UnlessPresent.
|
||||
@@ -826,6 +981,45 @@ Rails/Blank:
|
||||
- 'engines/order_management/app/services/order_management/stock/package.rb'
|
||||
- 'lib/stripe/authorize_response_patcher.rb'
|
||||
|
||||
# Offense count: 17
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/CompactBlank:
|
||||
Exclude:
|
||||
- 'app/controllers/spree/admin/users_controller.rb'
|
||||
- 'app/models/concerns/address_display.rb'
|
||||
- 'app/models/spree/zone.rb'
|
||||
- 'app/services/order_cycle_form.rb'
|
||||
- 'lib/reporting/report_headers_builder.rb'
|
||||
- 'lib/reporting/report_ruler.rb'
|
||||
- 'lib/reporting/reports/enterprise_fee_summary/parameters.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/DotSeparatedKeys:
|
||||
Exclude:
|
||||
- 'app/controllers/api/v1/base_controller.rb'
|
||||
|
||||
# Offense count: 27
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/DurationArithmetic:
|
||||
Exclude:
|
||||
- 'app/services/create_order_cycle.rb'
|
||||
- 'spec/jobs/order_cycle_closing_job_spec.rb'
|
||||
- 'spec/jobs/order_cycle_opened_job_spec.rb'
|
||||
- 'spec/services/permissions/order_spec.rb'
|
||||
- 'spec/services/terms_of_service_spec.rb'
|
||||
- 'spec/system/admin/bulk_order_management_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/list_spec.rb'
|
||||
- 'spec/system/admin/orders_spec.rb'
|
||||
- 'spec/system/admin/reports/orders_and_fulfillment_spec.rb'
|
||||
- 'spec/system/admin/reports/packing_report_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/ExpandedDateRange:
|
||||
Exclude:
|
||||
- 'app/models/spree/product.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: slashes, arguments
|
||||
@@ -894,17 +1088,38 @@ Rails/HelperInstanceVariable:
|
||||
- 'app/helpers/spree/admin/orders_helper.rb'
|
||||
- 'app/helpers/spree/orders_helper.rb'
|
||||
|
||||
# Offense count: 37
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/controllers/**/*.rb
|
||||
Rails/I18nLazyLookup:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/proxy_orders_controller.rb'
|
||||
|
||||
# Offense count: 8
|
||||
# Configuration parameters: Include.
|
||||
# Include: spec/**/*.rb, test/**/*.rb
|
||||
Rails/I18nLocaleAssignment:
|
||||
Exclude:
|
||||
- 'spec/controllers/user_registrations_controller_spec.rb'
|
||||
- 'spec/helpers/i18n_helper_spec.rb'
|
||||
- 'spec/models/spree/variant_spec.rb'
|
||||
- 'spec/system/admin/order_cycles/list_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
Rails/I18nLocaleTexts:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/stripe_accounts_controller.rb'
|
||||
|
||||
# Offense count: 27
|
||||
# Configuration parameters: IgnoreScopes, Include.
|
||||
# Include: app/models/**/*.rb
|
||||
Rails/InverseOf:
|
||||
Exclude:
|
||||
- 'app/models/concerns/calculated_adjustments.rb'
|
||||
- 'app/models/enterprise.rb'
|
||||
- 'app/models/order_cycle.rb'
|
||||
- 'app/models/spree/adjustment.rb'
|
||||
- 'app/models/spree/country.rb'
|
||||
- 'app/models/spree/credit_card.rb'
|
||||
- 'app/models/spree/inventory_unit.rb'
|
||||
- 'app/models/spree/line_item.rb'
|
||||
- 'app/models/spree/option_type.rb'
|
||||
@@ -912,9 +1127,7 @@ Rails/InverseOf:
|
||||
- 'app/models/spree/payment.rb'
|
||||
- 'app/models/spree/price.rb'
|
||||
- 'app/models/spree/product.rb'
|
||||
- 'app/models/spree/shipment.rb'
|
||||
- 'app/models/spree/stock_item.rb'
|
||||
- 'app/models/spree/tax_rate.rb'
|
||||
- 'app/models/spree/taxonomy.rb'
|
||||
- 'app/models/spree/variant.rb'
|
||||
- 'app/models/subscription_line_item.rb'
|
||||
@@ -944,6 +1157,19 @@ Rails/LexicallyScopedActionFilter:
|
||||
- 'app/controllers/spree/admin/zones_controller.rb'
|
||||
- 'app/controllers/spree/users_controller.rb'
|
||||
|
||||
# Offense count: 9
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/NegateInclude:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/resource_controller.rb'
|
||||
- 'app/models/calculator/weight.rb'
|
||||
- 'app/models/product_import/spreadsheet_entry.rb'
|
||||
- 'app/models/spree/order/checkout.rb'
|
||||
- 'app/services/order_cart_reset.rb'
|
||||
- 'engines/order_management/app/services/order_management/stock/estimator.rb'
|
||||
- 'lib/spree/localized_number.rb'
|
||||
- 'spec/support/matchers/table_matchers.rb'
|
||||
|
||||
# Offense count: 18
|
||||
Rails/OutputSafety:
|
||||
Exclude:
|
||||
@@ -959,12 +1185,112 @@ Rails/OutputSafety:
|
||||
- 'lib/reporting/queries/query_interface.rb'
|
||||
- 'lib/spree/money.rb'
|
||||
|
||||
# Offense count: 29
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/Pluck:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/variant_overrides_controller.rb'
|
||||
- 'app/helpers/shop_helper.rb'
|
||||
- 'app/services/cart_service.rb'
|
||||
- 'app/services/sets/product_set.rb'
|
||||
- 'lib/reporting/report_headers_builder.rb'
|
||||
- 'spec/controllers/admin/bulk_line_items_controller_spec.rb'
|
||||
- 'spec/controllers/admin/subscriptions_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/order_cycles_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/orders_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/products_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/shops_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/states_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/taxons_controller_spec.rb'
|
||||
- 'spec/helpers/spree/admin/orders_helper_spec.rb'
|
||||
- 'spec/lib/reports/lettuce_share_report_spec.rb'
|
||||
- 'spec/lib/reports/users_and_enterprises_report_spec.rb'
|
||||
- 'spec/serializers/api/admin/for_order_cycle/supplied_product_serializer_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: conservative, aggressive
|
||||
Rails/PluckInWhere:
|
||||
Exclude:
|
||||
- 'app/models/spree/variant.rb'
|
||||
|
||||
# Offense count: 28
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/RedundantPresenceValidationOnBelongsTo:
|
||||
Exclude:
|
||||
- 'app/models/enterprise.rb'
|
||||
- 'app/models/enterprise_fee.rb'
|
||||
- 'app/models/enterprise_group.rb'
|
||||
- 'app/models/enterprise_relationship.rb'
|
||||
- 'app/models/enterprise_role.rb'
|
||||
- 'app/models/exchange.rb'
|
||||
- 'app/models/inventory_item.rb'
|
||||
- 'app/models/order_cycle.rb'
|
||||
- 'app/models/spree/address.rb'
|
||||
- 'app/models/spree/line_item.rb'
|
||||
- 'app/models/spree/order.rb'
|
||||
- 'app/models/spree/product.rb'
|
||||
- 'app/models/spree/product_property.rb'
|
||||
- 'app/models/spree/return_authorization.rb'
|
||||
- 'app/models/spree/state.rb'
|
||||
- 'app/models/spree/stock_item.rb'
|
||||
- 'app/models/spree/stock_movement.rb'
|
||||
- 'app/models/spree/tax_rate.rb'
|
||||
- 'app/models/subscription_line_item.rb'
|
||||
- 'app/models/tag_rule.rb'
|
||||
- 'app/models/variant_override.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/RelativeDateConstant:
|
||||
Exclude:
|
||||
- 'lib/tasks/data/remove_transient_data.rb'
|
||||
|
||||
# Offense count: 58
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: Include.
|
||||
# Include: spec/controllers/**/*.rb, spec/requests/**/*.rb, test/controllers/**/*.rb, test/integration/**/*.rb
|
||||
Rails/ResponseParsedBody:
|
||||
Exclude:
|
||||
- 'spec/controllers/admin/bulk_line_items_controller_spec.rb'
|
||||
- 'spec/controllers/admin/customers_controller_spec.rb'
|
||||
- 'spec/controllers/admin/order_cycles_controller_spec.rb'
|
||||
- 'spec/controllers/admin/proxy_orders_controller_spec.rb'
|
||||
- 'spec/controllers/admin/schedules_controller_spec.rb'
|
||||
- 'spec/controllers/admin/stripe_accounts_controller_spec.rb'
|
||||
- 'spec/controllers/admin/subscription_line_items_controller_spec.rb'
|
||||
- 'spec/controllers/admin/subscriptions_controller_spec.rb'
|
||||
- 'spec/controllers/cart_controller_spec.rb'
|
||||
- 'spec/controllers/line_items_controller_spec.rb'
|
||||
- 'spec/controllers/spree/admin/search_controller_spec.rb'
|
||||
- 'spec/controllers/spree/credit_cards_controller_spec.rb'
|
||||
- 'spec/controllers/user_registrations_controller_spec.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/RootPathnameMethods:
|
||||
Exclude:
|
||||
- 'spec/lib/reports/orders_and_fulfillment/order_cycle_customer_totals_report_spec.rb'
|
||||
- 'spec/models/content_configuration_spec.rb'
|
||||
- 'spec/models/terms_of_service_file_spec.rb'
|
||||
- 'spec/system/admin/configuration/terms_of_service_files_spec.rb'
|
||||
|
||||
# Offense count: 13
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/RootPublicPath:
|
||||
Exclude:
|
||||
- 'app/controllers/concerns/request_timeouts.rb'
|
||||
- 'lib/spree/core/controller_helpers/common.rb'
|
||||
- 'spec/controllers/api/v0/product_images_controller_spec.rb'
|
||||
- 'spec/controllers/api/v0/terms_and_conditions_controller_spec.rb'
|
||||
- 'spec/models/terms_of_service_file_spec.rb'
|
||||
- 'spec/system/admin/bulk_product_update_spec.rb'
|
||||
- 'spec/system/admin/enterprises/terms_and_conditions_spec.rb'
|
||||
- 'spec/system/consumer/shopping/checkout_spec.rb'
|
||||
- 'spec/system/consumer/shopping/embedded_groups_spec.rb'
|
||||
- 'spec/system/consumer/split_checkout_spec.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Configuration parameters: ForbiddenMethods, AllowedMethods.
|
||||
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
|
||||
@@ -973,6 +1299,24 @@ Rails/SkipsModelValidations:
|
||||
- 'app/models/variant_override.rb'
|
||||
- 'spec/models/spree/line_item_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/SquishedSQLHeredocs:
|
||||
Exclude:
|
||||
- 'app/queries/customers_with_balance.rb'
|
||||
- 'app/queries/outstanding_balance.rb'
|
||||
- 'spec/queries/outstanding_balance_spec.rb'
|
||||
|
||||
# Offense count: 24
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/StripHeredoc:
|
||||
Exclude:
|
||||
- 'app/models/content_configuration.rb'
|
||||
- 'app/queries/customers_with_balance.rb'
|
||||
- 'app/queries/outstanding_balance.rb'
|
||||
- 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
|
||||
- 'lib/tasks/data/truncate_data.rake'
|
||||
|
||||
# Offense count: 4
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
@@ -984,6 +1328,11 @@ Rails/TimeZone:
|
||||
- 'spec/models/spree/tax_rate_spec.rb'
|
||||
- 'spec/services/customer_order_cancellation_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
Rails/TransactionExitStatement:
|
||||
Exclude:
|
||||
- 'app/services/place_proxy_order.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/models/**/*.rb
|
||||
@@ -1002,6 +1351,77 @@ Rails/UnknownEnv:
|
||||
Exclude:
|
||||
- 'app/models/spree/app_configuration.rb'
|
||||
|
||||
# Offense count: 55
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/WhereEquals:
|
||||
Exclude:
|
||||
- 'app/controllers/spree/admin/products_controller.rb'
|
||||
- 'app/mailers/producer_mailer.rb'
|
||||
- 'app/models/enterprise.rb'
|
||||
- 'app/models/enterprise_fee.rb'
|
||||
- 'app/models/enterprise_group.rb'
|
||||
- 'app/models/enterprise_relationship.rb'
|
||||
- 'app/models/exchange.rb'
|
||||
- 'app/models/order_cycle.rb'
|
||||
- 'app/models/product_import/entry_processor.rb'
|
||||
- 'app/models/proxy_order.rb'
|
||||
- 'app/models/schedule.rb'
|
||||
- 'app/models/spree/line_item.rb'
|
||||
- 'app/models/spree/order.rb'
|
||||
- 'app/models/spree/payment_method.rb'
|
||||
- 'app/models/spree/product.rb'
|
||||
- 'app/models/spree/shipping_method.rb'
|
||||
- 'app/models/spree/variant.rb'
|
||||
- 'app/models/subscription.rb'
|
||||
- 'app/queries/payments_requiring_action.rb'
|
||||
- 'app/serializers/api/enterprise_shopfront_serializer.rb'
|
||||
- 'app/serializers/api/order_serializer.rb'
|
||||
- 'lib/open_food_network/enterprise_fee_calculator.rb'
|
||||
- 'lib/open_food_network/order_cycle_permissions.rb'
|
||||
- 'lib/reporting/reports/customers/base.rb'
|
||||
- 'lib/reporting/reports/products_and_inventory/base.rb'
|
||||
- 'lib/tasks/data.rake'
|
||||
- 'lib/tasks/data/anonymize_data.rake'
|
||||
- 'lib/tasks/data/remove_transient_data.rb'
|
||||
- 'spec/services/product_tag_rules_filterer_spec.rb'
|
||||
|
||||
# Offense count: 8
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: exists, where
|
||||
Rails/WhereExists:
|
||||
Exclude:
|
||||
- 'app/controllers/spree/admin/overview_controller.rb'
|
||||
- 'app/controllers/spree/admin/tax_rates_controller.rb'
|
||||
- 'app/controllers/spree/user_sessions_controller.rb'
|
||||
- 'app/models/spree/preferences/store.rb'
|
||||
- 'lib/tasks/sample_data/customer_factory.rb'
|
||||
- 'lib/tasks/sample_data/group_factory.rb'
|
||||
- 'lib/tasks/sample_data/order_cycle_factory.rb'
|
||||
- 'lib/tasks/sample_data/taxon_factory.rb'
|
||||
|
||||
# Offense count: 24
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/WhereNot:
|
||||
Exclude:
|
||||
- 'app/controllers/spree/admin/products_controller.rb'
|
||||
- 'app/models/concerns/permalink_generator.rb'
|
||||
- 'app/models/enterprise.rb'
|
||||
- 'app/models/enterprise_fee.rb'
|
||||
- 'app/models/enterprise_relationship.rb'
|
||||
- 'app/models/product_import/inventory_reset_strategy.rb'
|
||||
- 'app/models/proxy_order.rb'
|
||||
- 'app/models/spree/credit_card.rb'
|
||||
- 'app/models/spree/product.rb'
|
||||
- 'app/models/spree/variant.rb'
|
||||
- 'app/models/spree/zone.rb'
|
||||
- 'app/models/variant_override.rb'
|
||||
- 'app/services/cap_quantity.rb'
|
||||
- 'engines/catalog/app/services/catalog/product_import/products_reset_strategy.rb'
|
||||
- 'engines/order_management/app/services/order_management/subscriptions/proxy_order_syncer.rb'
|
||||
- 'lib/reporting/reports/users_and_enterprises/base.rb'
|
||||
- 'lib/tasks/data/anonymize_data.rake'
|
||||
|
||||
# Offense count: 1
|
||||
Security/Open:
|
||||
Exclude:
|
||||
@@ -1020,14 +1440,6 @@ Style/CaseEquality:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Style/CaseLikeIf:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/order_cycles_controller.rb'
|
||||
- 'app/models/calculator/weight.rb'
|
||||
- 'app/models/spree/payment/processing.rb'
|
||||
|
||||
# Offense count: 25
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
@@ -1063,6 +1475,27 @@ Style/ClassVars:
|
||||
Exclude:
|
||||
- 'lib/spree/core/delegate_belongs_to.rb'
|
||||
|
||||
# Offense count: 9
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowedVars.
|
||||
Style/FetchEnvVar:
|
||||
Exclude:
|
||||
- 'app/helpers/discourse_helper.rb'
|
||||
- 'app/models/spree/preferences/configuration.rb'
|
||||
- 'app/models/spree/preferences/preferable.rb'
|
||||
- 'app/services/default_country.rb'
|
||||
- 'spec/base_spec_helper.rb'
|
||||
- 'spec/controllers/spree/credit_cards_controller_spec.rb'
|
||||
- 'spec/models/order_balance_spec.rb'
|
||||
- 'spec/support/vcr_setup.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Style/FileRead:
|
||||
Exclude:
|
||||
- 'lib/tasks/karma.rake'
|
||||
- 'spec/services/upload_sanitizer_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: MaxUnannotatedPlaceholdersAllowed, AllowedMethods, AllowedPatterns.
|
||||
@@ -1117,27 +1550,36 @@ Style/GuardClause:
|
||||
- 'spec/support/request/shop_workflow.rb'
|
||||
- 'spec/system/support/precompile_assets.rb'
|
||||
|
||||
# Offense count: 12
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowSplatArgument.
|
||||
Style/HashConversion:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/column_preferences_controller.rb'
|
||||
- 'app/controllers/admin/variant_overrides_controller.rb'
|
||||
- 'app/controllers/spree/admin/products_controller.rb'
|
||||
- 'app/models/order_cycle.rb'
|
||||
- 'app/models/product_import/product_importer.rb'
|
||||
- 'app/models/spree/shipping_method.rb'
|
||||
- 'app/serializers/api/admin/exchange_serializer.rb'
|
||||
- 'app/services/variants_stock_levels.rb'
|
||||
- 'spec/controllers/admin/inventory_items_controller_spec.rb'
|
||||
- 'spec/controllers/admin/variant_overrides_controller_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: MinBranchesCount.
|
||||
Style/HashLikeCase:
|
||||
Exclude:
|
||||
- 'app/models/enterprise.rb'
|
||||
|
||||
# Offense count: 11
|
||||
# Offense count: 4
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: InverseMethods, InverseBlocks.
|
||||
Style/InverseMethods:
|
||||
Style/MapToHash:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/resource_controller.rb'
|
||||
- 'app/models/calculator/weight.rb'
|
||||
- 'app/models/product_import/spreadsheet_entry.rb'
|
||||
- 'app/models/spree/order/checkout.rb'
|
||||
- 'app/models/spree/order_contents.rb'
|
||||
- 'app/models/spree/payment.rb'
|
||||
- 'app/services/order_cart_reset.rb'
|
||||
- 'engines/order_management/app/services/order_management/stock/estimator.rb'
|
||||
- 'lib/spree/localized_number.rb'
|
||||
- 'spec/support/matchers/table_matchers.rb'
|
||||
- 'lib/reporting/report_query_template.rb'
|
||||
- 'lib/reporting/report_row_builder.rb'
|
||||
- 'lib/reporting/reports/enterprise_fee_summary/base.rb'
|
||||
- 'lib/tasks/sample_data/user_factory.rb'
|
||||
|
||||
# Offense count: 3
|
||||
Style/MissingRespondToMissing:
|
||||
@@ -1152,6 +1594,13 @@ Style/MultilineTernaryOperator:
|
||||
Exclude:
|
||||
- 'spec/system/admin/subscriptions_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Style/NegatedIfElseCondition:
|
||||
Exclude:
|
||||
- 'app/mailers/spree/shipment_mailer.rb'
|
||||
- 'spec/support/matchers/table_matchers.rb'
|
||||
|
||||
# Offense count: 22
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Style/NestedModifier:
|
||||
@@ -1167,13 +1616,18 @@ Style/NestedModifier:
|
||||
- 'spec/system/admin/payments_stripe_spec.rb'
|
||||
- 'spec/system/admin/reports_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowedMethods.
|
||||
# AllowedMethods: be, be_a, be_an, be_between, be_falsey, be_kind_of, be_instance_of, be_truthy, be_within, eq, eql, end_with, include, match, raise_error, respond_to, start_with
|
||||
Style/NestedParenthesizedCalls:
|
||||
# Offense count: 36
|
||||
Style/OpenStructUse:
|
||||
Exclude:
|
||||
- 'spec/system/admin/products_spec.rb'
|
||||
- 'app/helpers/injection_helper.rb'
|
||||
- 'app/models/spree/shipment.rb'
|
||||
- 'lib/open_food_network/enterprise_fee_calculator.rb'
|
||||
- 'lib/reporting/report_row_builder.rb'
|
||||
- 'lib/reporting/report_rows_builder.rb'
|
||||
- 'spec/lib/reports/report_renderer_spec.rb'
|
||||
- 'spec/lib/reports/report_spec.rb'
|
||||
- 'spec/lib/reports/users_and_enterprises_report_spec.rb'
|
||||
- 'spec/serializers/api/enterprise_serializer_spec.rb'
|
||||
|
||||
# Offense count: 16
|
||||
# Configuration parameters: AllowedMethods.
|
||||
@@ -1207,12 +1661,70 @@ Style/PreferredHashMethods:
|
||||
Exclude:
|
||||
- 'app/controllers/api/v0/shipments_controller.rb'
|
||||
|
||||
# Offense count: 16
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: same_as_string_literals, single_quotes, double_quotes
|
||||
Style/QuotedSymbols:
|
||||
Exclude:
|
||||
- 'app/services/exchange_products_renderer.rb'
|
||||
- 'lib/stripe/credit_card_cloner.rb'
|
||||
- 'spec/controllers/api/v0/exchange_products_controller_spec.rb'
|
||||
- 'spec/requests/api/orders_spec.rb'
|
||||
- 'spec/requests/api/v1/customers_spec.rb'
|
||||
- 'spec/support/request/stripe_stubs.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: Methods.
|
||||
Style/RedundantArgument:
|
||||
Exclude:
|
||||
- 'engines/dfc_provider/app/services/authorization_control.rb'
|
||||
- 'spec/support/query_counter.rb'
|
||||
|
||||
# Offense count: 15
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Style/RedundantConstantBase:
|
||||
Exclude:
|
||||
- 'app/controllers/checkout_controller.rb'
|
||||
- 'app/controllers/split_checkout_controller.rb'
|
||||
- 'app/controllers/webhook_endpoints_controller.rb'
|
||||
- 'config.ru'
|
||||
- 'spec/base_spec_helper.rb'
|
||||
- 'spec/helpers/checkout_helper_spec.rb'
|
||||
- 'spec/models/spree/order_spec.rb'
|
||||
- 'spec/models/spree/payment_method_spec.rb'
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
- 'spec/queries/complete_visible_orders_spec.rb'
|
||||
- 'spec/services/paypal_items_builder_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Style/RedundantDoubleSplatHashBraces:
|
||||
Exclude:
|
||||
- 'spec/system/support/cuprite_setup.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: AllowComments.
|
||||
Style/RedundantInitialize:
|
||||
Exclude:
|
||||
- 'spec/models/spree/gateway_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Style/RedundantRegexpEscape:
|
||||
Exclude:
|
||||
- 'app/models/spree/order.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Style/RedundantStringEscape:
|
||||
Exclude:
|
||||
- 'app/models/spree/calculator.rb'
|
||||
- 'spec/controllers/spree/admin/shipping_methods_controller_spec.rb'
|
||||
- 'spec/system/admin/enterprise_fees_spec.rb'
|
||||
|
||||
# Offense count: 206
|
||||
Style/Send:
|
||||
Exclude:
|
||||
|
||||
@@ -57,6 +57,7 @@ TL;DR:
|
||||
* Maintain a clean commit history
|
||||
* Use a style consistent with the rest of the codebase
|
||||
* Before submitting, [rebase your work][rebase] on the current master branch
|
||||
* After submitting, be sure to check the [CI test results](ci). Click on a ❌ result to view the logged results and investigate.
|
||||
|
||||
From here, your pull request will progress through the [Review, Test, Merge & Deploy process][process].
|
||||
|
||||
@@ -71,3 +72,4 @@ From here, your pull request will progress through the [Review, Test, Merge & De
|
||||
[ofn-transifex]: https://www.transifex.com/open-food-foundation/open-food-network/
|
||||
[i18n]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Internationalisation-%28i18n%29
|
||||
[welcome-dev]: https://github.com/orgs/openfoodfoundation/projects/2
|
||||
[ci]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Continuous-Integration
|
||||
|
||||
2
Gemfile
2
Gemfile
@@ -92,6 +92,7 @@ gem 'gmaps4rails'
|
||||
gem 'mimemagic', '> 0.3.5'
|
||||
gem 'paper_trail', '~> 12.1'
|
||||
gem 'rack-rewrite'
|
||||
gem 'rack-timeout'
|
||||
gem 'roadie-rails'
|
||||
|
||||
gem 'hiredis'
|
||||
@@ -141,7 +142,6 @@ gem "private_address_check"
|
||||
|
||||
group :production, :staging do
|
||||
gem 'ddtrace'
|
||||
gem 'rack-timeout'
|
||||
gem 'sd_notify' # For better Systemd process management. Used by Puma.
|
||||
end
|
||||
|
||||
|
||||
26
Gemfile.lock
26
Gemfile.lock
@@ -157,7 +157,7 @@ GEM
|
||||
awesome_nested_set (3.5.0)
|
||||
activerecord (>= 4.0.0, < 7.1)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.739.0)
|
||||
aws-partitions (1.750.0)
|
||||
aws-sdk-core (3.171.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
@@ -166,7 +166,7 @@ GEM
|
||||
aws-sdk-kms (1.63.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.120.0)
|
||||
aws-sdk-s3 (1.121.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
@@ -219,7 +219,7 @@ GEM
|
||||
matrix
|
||||
ruby-rc4 (>= 0.1.5)
|
||||
concurrent-ruby (1.2.2)
|
||||
connection_pool (2.3.0)
|
||||
connection_pool (2.4.0)
|
||||
crack (0.4.5)
|
||||
rexml
|
||||
crass (1.0.6)
|
||||
@@ -425,8 +425,8 @@ GEM
|
||||
timeout
|
||||
net-smtp (0.3.3)
|
||||
net-protocol
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.14.2)
|
||||
nio4r (2.5.9)
|
||||
nokogiri (1.14.3)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
oauth2 (1.4.11)
|
||||
@@ -485,7 +485,7 @@ GEM
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
public_suffix (5.0.1)
|
||||
puma (6.2.1)
|
||||
puma (6.2.2)
|
||||
nio4r (~> 2.0)
|
||||
raabro (1.4.0)
|
||||
racc (1.6.2)
|
||||
@@ -556,9 +556,9 @@ GEM
|
||||
ffi (~> 1.0)
|
||||
redcarpet (3.6.0)
|
||||
redis (4.8.1)
|
||||
redis-client (0.14.0)
|
||||
redis-client (0.14.1)
|
||||
connection_pool
|
||||
regexp_parser (2.7.0)
|
||||
regexp_parser (2.8.0)
|
||||
reline (0.3.3)
|
||||
io-console (~> 0.5)
|
||||
request_store (1.5.1)
|
||||
@@ -612,7 +612,7 @@ GEM
|
||||
rswag-ui (2.8.0)
|
||||
actionpack (>= 3.1, < 7.1)
|
||||
railties (>= 3.1, < 7.1)
|
||||
rubocop (1.49.0)
|
||||
rubocop (1.50.2)
|
||||
json (~> 2.3)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.2.0.0)
|
||||
@@ -624,7 +624,7 @@ GEM
|
||||
unicode-display_width (>= 2.4.0, < 3.0)
|
||||
rubocop-ast (1.28.0)
|
||||
parser (>= 3.2.1.0)
|
||||
rubocop-rails (2.18.0)
|
||||
rubocop-rails (2.19.1)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.33.0, < 2.0)
|
||||
@@ -652,7 +652,7 @@ GEM
|
||||
semantic_range (3.0.0)
|
||||
shoulda-matchers (5.3.0)
|
||||
activesupport (>= 5.2.0)
|
||||
sidekiq (7.0.7)
|
||||
sidekiq (7.0.9)
|
||||
concurrent-ruby (< 2)
|
||||
connection_pool (>= 2.3.0)
|
||||
rack (>= 2.2.4)
|
||||
@@ -697,8 +697,8 @@ GEM
|
||||
rack (>= 2, < 4)
|
||||
railties (>= 5.2, < 8)
|
||||
redis (>= 4.0, < 6.0)
|
||||
stringex (2.8.5)
|
||||
stripe (8.3.0)
|
||||
stringex (2.8.6)
|
||||
stripe (8.5.0)
|
||||
swd (1.3.0)
|
||||
activesupport (>= 3)
|
||||
attr_required (>= 0.0.5)
|
||||
|
||||
4
Procfile
4
Procfile
@@ -1,5 +1,5 @@
|
||||
# Foreman Procfile. Start all dev server processes with: `foreman start`
|
||||
|
||||
rails: bundle exec rails s -p 3000
|
||||
rails: DEV_CACHING=true bundle exec rails s -p 3000
|
||||
webpack: ./bin/webpack-dev-server
|
||||
sidekiq: bundle exec sidekiq -q mailers -q default
|
||||
sidekiq: DEV_CACHING=true bundle exec sidekiq -q mailers -q default
|
||||
|
||||
@@ -12,5 +12,6 @@ angular.module("ofn.admin", [
|
||||
"admin.orders"
|
||||
]).config ($httpProvider, $locationProvider, $qProvider) ->
|
||||
$httpProvider.defaults.headers.common["Accept"] = "application/json, text/javascript, */*"
|
||||
# for the next line, you should also probably check file: app/assets/javascripts/admin/utils/utils.js.coffee
|
||||
$locationProvider.hashPrefix('')
|
||||
$qProvider.errorOnUnhandledRejections(false)
|
||||
|
||||
@@ -11,5 +11,6 @@ angular.module("admin.indexUtils").factory 'SortOptions', ->
|
||||
sortingExpr
|
||||
|
||||
toggle: (predicate) ->
|
||||
@reverse = (@predicate == predicate) && !@reverse
|
||||
# predicate is a string or an array of strings
|
||||
@reverse = (JSON.stringify(@predicate) == JSON.stringify(predicate)) && !@reverse
|
||||
@predicate = predicate
|
||||
|
||||
@@ -17,6 +17,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
]
|
||||
$scope.page = 1
|
||||
$scope.per_page = $scope.per_page_options[0].id
|
||||
$scope.filterByVariantId = null
|
||||
searchThrough = ["order_distributor_name",
|
||||
"order_bill_address_phone",
|
||||
"order_bill_address_firstname",
|
||||
@@ -68,6 +69,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
|
||||
RequestMonitor.load LineItems.index(
|
||||
"q[#{searchThrough}]": $scope.query,
|
||||
"q[variant_id_eq]": $scope.filterByVariantId if $scope.filterByVariantId,
|
||||
"q[order_state_not_eq]": "canceled",
|
||||
"q[order_shipment_state_not_eq]": "shipped",
|
||||
"q[order_completed_at_not_null]": "true",
|
||||
@@ -176,6 +178,17 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
|
||||
$scope.setSelectedUnitsVariant = (unitsProduct,unitsVariant) ->
|
||||
$scope.selectedUnitsProduct = unitsProduct
|
||||
$scope.selectedUnitsVariant = unitsVariant
|
||||
$scope.filterByVariantId = unitsVariant.id
|
||||
$scope.page = 1
|
||||
$scope.refreshData()
|
||||
|
||||
$scope.resetSelectedUnitsVariant = ->
|
||||
$scope.selectedUnitsProduct = { }
|
||||
$scope.selectedUnitsVariant = { }
|
||||
$scope.filterByVariantId = null
|
||||
$scope.sharedResource = false
|
||||
$scope.page = 1
|
||||
$scope.refreshData()
|
||||
|
||||
$scope.getLineItemScale = (lineItem) ->
|
||||
if lineItem.units_product && lineItem.units_variant && (lineItem.units_product.variant_unit == "weight" || lineItem.units_product.variant_unit == "volume")
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
angular.module("admin.lineItems").filter "variantFilter", ->
|
||||
return (lineItems,selectedUnitsProduct,selectedUnitsVariant,sharedResource) ->
|
||||
filtered = []
|
||||
filtered.push lineItem for lineItem in lineItems when (angular.equals(selectedUnitsProduct,{}) ||
|
||||
(lineItem.units_product.id == selectedUnitsProduct.id && (sharedResource || lineItem.units_variant.id == selectedUnitsVariant.id ) ) )
|
||||
filtered
|
||||
@@ -1,3 +1,4 @@
|
||||
angular.module("admin.utils", ["templates", "ngSanitize"]).config ($httpProvider, $locationProvider) ->
|
||||
# for the next line, you should also probably check file: app/assets/javascripts/admin/admin_ofn.js.coffee
|
||||
$locationProvider.hashPrefix('')
|
||||
$httpProvider.defaults.headers.common["Accept"] = "application/json, text/javascript, */*"
|
||||
|
||||
@@ -2,6 +2,7 @@ angular.module('Darkswarm').factory "EnterpriseModal", ($modal, $rootScope, $htt
|
||||
# Build a modal popup for an enterprise.
|
||||
new class EnterpriseModal
|
||||
open: (enterprise)->
|
||||
return if enterprise.visible == 'hidden'
|
||||
scope = $rootScope.$new(true) # Spawn an isolate to contain the enterprise
|
||||
scope.embedded_layout = window.location.search.indexOf("embedded_shopfront=true") != -1
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ConfirmModalComponent < ModalComponent
|
||||
def initialize(id:, confirm_actions: nil, controllers: nil, message: nil)
|
||||
def initialize(id:, confirm_actions: nil, controllers: nil, message: nil, confirm_reflexes: nil)
|
||||
super(id: id, close_button: true)
|
||||
@confirm_actions = confirm_actions
|
||||
@confirm_reflexes = confirm_reflexes
|
||||
@controllers = controllers
|
||||
@message = message
|
||||
end
|
||||
|
||||
@@ -7,4 +7,4 @@
|
||||
|
||||
.modal-actions
|
||||
%input{ class: "button icon-plus #{close_button_class}", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->modal#close" }
|
||||
%input{ class: "button icon-plus primary", type: 'button', value: t('js.admin.modals.confirm'), "data-action": @confirm_actions }
|
||||
%input{ class: "button icon-plus primary", type: 'button', value: t('js.admin.modals.confirm'), "data-action": @confirm_actions, "data-reflex": @confirm_reflexes }
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
require 'open_food_network/address_finder'
|
||||
|
||||
# rubocop:disable Metrics/ClassLength
|
||||
module Admin
|
||||
class CustomersController < Admin::ResourceController
|
||||
before_action :load_managed_shops, only: :index, if: :html_request?
|
||||
@@ -67,7 +68,7 @@ module Admin
|
||||
|
||||
def collection
|
||||
if json_request? && params[:enterprise_id].present?
|
||||
CustomersWithBalance.new(Customer.of(managed_enterprise_id)).query.
|
||||
CustomersWithBalance.new(customers).query.
|
||||
includes(
|
||||
:enterprise,
|
||||
{ bill_address: [:state, :country] },
|
||||
@@ -79,6 +80,15 @@ module Admin
|
||||
end
|
||||
end
|
||||
|
||||
def customers
|
||||
return @customers if @customers.present?
|
||||
|
||||
@customers = Customer.managed_by(spree_current_user)
|
||||
return @customers if params[:enterprise_id].blank?
|
||||
|
||||
@customers = @customers.where(enterprise_id: params[:enterprise_id])
|
||||
end
|
||||
|
||||
def managed_enterprise_id
|
||||
@managed_enterprise_id ||= Enterprise.managed_by(spree_current_user).
|
||||
select('enterprises.id').find_by(id: params[:enterprise_id])
|
||||
@@ -120,3 +130,4 @@ module Admin
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop:enable Metrics/ClassLength
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
module Admin
|
||||
class ReportsController < Spree::Admin::BaseController
|
||||
include ActiveStorage::SetCurrent
|
||||
include ReportsActions
|
||||
helper ReportsHelper
|
||||
|
||||
@@ -21,11 +22,13 @@ module Admin
|
||||
def show
|
||||
@report = report_class.new(spree_current_user, params, render: render_data?)
|
||||
|
||||
if report_format.present?
|
||||
if params[:report_format].present?
|
||||
export_report
|
||||
else
|
||||
show_report
|
||||
end
|
||||
rescue Timeout::Error
|
||||
render_timeout_error
|
||||
end
|
||||
|
||||
private
|
||||
@@ -36,6 +39,7 @@ module Admin
|
||||
|
||||
def show_report
|
||||
assign_view_data
|
||||
@table = render_report_as(:html) if render_data?
|
||||
render "show"
|
||||
end
|
||||
|
||||
@@ -45,7 +49,6 @@ module Admin
|
||||
@report_subtype = report_subtype
|
||||
@report_title = report_title
|
||||
@rendering_options = rendering_options
|
||||
@table = render_report_as(:html) if render_data?
|
||||
@data = Reporting::FrontendData.new(spree_current_user)
|
||||
end
|
||||
|
||||
@@ -55,16 +58,43 @@ module Admin
|
||||
|
||||
def render_report_as(format)
|
||||
if OpenFoodNetwork::FeatureToggle.enabled?(:background_reports, spree_current_user)
|
||||
job = ReportJob.perform_later(
|
||||
report_class, spree_current_user, params, format
|
||||
@blob = ReportBlob.create_for_upload_later!(report_filename)
|
||||
ReportJob.perform_later(
|
||||
report_class, spree_current_user, params, format, @blob
|
||||
)
|
||||
sleep 1 until job.done?
|
||||
Timeout.timeout(max_wait_time) do
|
||||
sleep 1 until @blob.content_stored?
|
||||
end
|
||||
|
||||
# This result has been rendered by Rails in safe mode already.
|
||||
job.result.html_safe # rubocop:disable Rails/OutputSafety
|
||||
@blob.result.html_safe # rubocop:disable Rails/OutputSafety
|
||||
else
|
||||
@report.render_as(format)
|
||||
end
|
||||
end
|
||||
|
||||
def render_timeout_error
|
||||
assign_view_data
|
||||
if @blob
|
||||
@error = ".report_taking_longer_html"
|
||||
@error_url = @blob.url
|
||||
else
|
||||
@error = ".report_taking_longer"
|
||||
@error_url = ""
|
||||
end
|
||||
render "show"
|
||||
end
|
||||
|
||||
def max_wait_time
|
||||
# This value is used by rack-timeout and nginx, usually 30 seconds in
|
||||
# staging and production:
|
||||
server_timeout = ENV.fetch("RACK_TIMEOUT_SERVICE_TIMEOUT", "15").to_f
|
||||
|
||||
# Zero disables the timeout:
|
||||
return 0 if server_timeout.zero?
|
||||
|
||||
# We want to time out earlier than nginx:
|
||||
server_timeout - 2.seconds
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -63,7 +63,7 @@ module Admin
|
||||
|
||||
options = [{ id: '0', name: 'All' }]
|
||||
import_dates.collect(&:import_date).map { |i|
|
||||
options.push(id: i.to_date, name: i.to_date.to_formatted_s(:long))
|
||||
options.push(id: i.to_date, name: i.to_date.to_fs(:long))
|
||||
}
|
||||
|
||||
options
|
||||
|
||||
@@ -80,9 +80,7 @@ module Api
|
||||
end
|
||||
|
||||
def visible_customers
|
||||
current_api_user.customers.or(
|
||||
Customer.where(enterprise_id: editable_enterprises)
|
||||
)
|
||||
Customer.managed_by(current_api_user)
|
||||
end
|
||||
|
||||
def customer_params
|
||||
@@ -106,10 +104,6 @@ module Api
|
||||
attributes
|
||||
end
|
||||
|
||||
def editable_enterprises
|
||||
OpenFoodNetwork::Permissions.new(current_api_user).editable_enterprises.select(:id)
|
||||
end
|
||||
|
||||
def include_options
|
||||
fields = [params.fetch(:include, [])].flatten
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ module ReportsActions
|
||||
end
|
||||
|
||||
def report_format
|
||||
params[:report_format]
|
||||
params[:report_format].presence || "html"
|
||||
end
|
||||
|
||||
def report_filename
|
||||
|
||||
@@ -10,5 +10,12 @@ module WhiteLabel
|
||||
# if the distributor has the hide_ofn_navigation preference set to true
|
||||
# then we should hide the OFN navigation
|
||||
@hide_ofn_navigation = distributor.hide_ofn_navigation
|
||||
|
||||
# if the distributor has the hide_ofn_navigation preference
|
||||
# set to false, there is no need to check the white_label_logo preference
|
||||
return unless @hide_ofn_navigation
|
||||
|
||||
@white_label_logo = distributor.white_label_logo
|
||||
@white_label_distributor = distributor
|
||||
end
|
||||
end
|
||||
|
||||
@@ -177,7 +177,7 @@ module Spree
|
||||
def product_import_dates
|
||||
options = [{ id: '0', name: '' }]
|
||||
product_import_dates_query.collect(&:import_date).
|
||||
map { |i| options.push(id: i.to_date, name: i.to_date.to_formatted_s(:long)) }
|
||||
map { |i| options.push(id: i.to_date, name: i.to_date.to_fs(:long)) }
|
||||
|
||||
options
|
||||
end
|
||||
|
||||
@@ -14,7 +14,6 @@ module Admin
|
||||
producers.size == 1 ? producers.first.id : nil
|
||||
end
|
||||
|
||||
# rubocop:disable Metrics/MethodLength
|
||||
def enterprise_side_menu_items(enterprise)
|
||||
is_shop = enterprise.sells != "none"
|
||||
show_properties = !!enterprise.is_primary_producer
|
||||
@@ -58,6 +57,5 @@ module Admin
|
||||
|
||||
{ name: 'white_label', icon_class: "icon-leaf", show: true }
|
||||
end
|
||||
# rubocop:enable Metrics/MethodLength
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
module ReportsHelper
|
||||
def report_order_cycle_options(order_cycles)
|
||||
order_cycles.map do |oc|
|
||||
orders_open_at = oc.orders_open_at&.to_s(:short) || 'NA'
|
||||
orders_close_at = oc.orders_close_at&.to_s(:short) || 'NA'
|
||||
orders_open_at = oc.orders_open_at&.to_fs(:short) || 'NA'
|
||||
orders_close_at = oc.orders_close_at&.to_fs(:short) || 'NA'
|
||||
["#{oc.name} (#{orders_open_at} - #{orders_close_at})".html_safe, oc.id]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,34 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Renders a report and saves it to a temporary file.
|
||||
class ReportJob < ActiveJob::Base
|
||||
def perform(report_class, user, params, format)
|
||||
# Renders a report and stores it in a given blob.
|
||||
class ReportJob < ApplicationJob
|
||||
def perform(report_class, user, params, format, blob)
|
||||
report = report_class.new(user, params, render: true)
|
||||
result = report.render_as(format)
|
||||
write(result)
|
||||
end
|
||||
|
||||
def done?
|
||||
@done ||= File.file?(filename)
|
||||
end
|
||||
|
||||
def result
|
||||
@result ||= read_result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def write(result)
|
||||
File.write(filename, result, mode: "wb")
|
||||
end
|
||||
|
||||
def read_result
|
||||
File.read(filename)
|
||||
ensure
|
||||
File.unlink(filename)
|
||||
end
|
||||
|
||||
def filename
|
||||
Rails.root.join("tmp/report-#{job_id}")
|
||||
blob.store(result)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -37,7 +37,7 @@ class JsonApiSchema
|
||||
end
|
||||
|
||||
def relationship_properties
|
||||
relationships.to_h { |name| [name, relationship_schema(name)] }
|
||||
relationships.index_with { |name| relationship_schema(name) }
|
||||
end
|
||||
|
||||
# Example
|
||||
|
||||
23
app/mailers/application_mailer.rb
Normal file
23
app/mailers/application_mailer.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ApplicationMailer < ActionMailer::Base
|
||||
# Inline stylesheets
|
||||
include Roadie::Rails::Automatic
|
||||
|
||||
helper TermsAndConditionsHelper
|
||||
|
||||
default from: -> { Spree::Config[:mails_from] }
|
||||
layout 'mailer'
|
||||
|
||||
def money(amount)
|
||||
Spree::Money.new(amount).to_s
|
||||
end
|
||||
helper_method :money
|
||||
|
||||
protected
|
||||
|
||||
def roadie_options
|
||||
# This lets us specify assets using relative paths in email templates
|
||||
super.merge(url_options: { host: URI(main_app.root_url).host })
|
||||
end
|
||||
end
|
||||
@@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'devise/mailers/helpers'
|
||||
class EnterpriseMailer < Spree::BaseMailer
|
||||
class EnterpriseMailer < ApplicationMailer
|
||||
include Devise::Mailers::Helpers
|
||||
include I18nHelper
|
||||
|
||||
@@ -12,7 +12,6 @@ class EnterpriseMailer < Spree::BaseMailer
|
||||
enterprise: @enterprise.name,
|
||||
sitename: Spree::Config[:site_name])
|
||||
mail(to: enterprise.contact.email,
|
||||
from: from_address,
|
||||
subject: subject)
|
||||
end
|
||||
end
|
||||
@@ -20,12 +19,10 @@ class EnterpriseMailer < Spree::BaseMailer
|
||||
def manager_invitation(enterprise, user)
|
||||
@enterprise = enterprise
|
||||
@instance = Spree::Config[:site_name]
|
||||
@instance_email = from_address
|
||||
|
||||
I18n.with_locale valid_locale(@enterprise.owner) do
|
||||
subject = t('enterprise_mailer.invite_manager.subject', enterprise: @enterprise.name)
|
||||
mail(to: user.email,
|
||||
from: from_address,
|
||||
subject: subject)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class PaymentMailer < Spree::BaseMailer
|
||||
class PaymentMailer < ApplicationMailer
|
||||
include I18nHelper
|
||||
|
||||
def authorize_payment(payment)
|
||||
@@ -8,7 +8,7 @@ class PaymentMailer < Spree::BaseMailer
|
||||
subject = I18n.t('spree.payment_mailer.authorize_payment.subject',
|
||||
distributor: @payment.order.distributor.name)
|
||||
I18n.with_locale valid_locale(@payment.order.user) do
|
||||
mail(to: payment.order.email, from: from_address, subject: subject)
|
||||
mail(to: payment.order.email, subject: subject)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,7 +19,6 @@ class PaymentMailer < Spree::BaseMailer
|
||||
order: @payment.order)
|
||||
I18n.with_locale valid_locale(shop_owner) do
|
||||
mail(to: shop_owner.email,
|
||||
from: from_address,
|
||||
subject: subject)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ProducerMailer < Spree::BaseMailer
|
||||
class ProducerMailer < ApplicationMailer
|
||||
include I18nHelper
|
||||
|
||||
def order_cycle_report(producer, order_cycle)
|
||||
@@ -14,7 +14,6 @@ class ProducerMailer < Spree::BaseMailer
|
||||
|
||||
mail(
|
||||
to: @producer.contact.email,
|
||||
from: from_address,
|
||||
subject: subject,
|
||||
reply_to: @coordinator.contact.email,
|
||||
cc: @coordinator.contact.email
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class BaseMailer < ActionMailer::Base
|
||||
# Inline stylesheets
|
||||
include Roadie::Rails::Automatic
|
||||
|
||||
helper TermsAndConditionsHelper
|
||||
|
||||
layout 'mailer'
|
||||
|
||||
def from_address
|
||||
Spree::Config[:mails_from]
|
||||
end
|
||||
|
||||
def money(amount)
|
||||
Spree::Money.new(amount).to_s
|
||||
end
|
||||
helper_method :money
|
||||
|
||||
protected
|
||||
|
||||
def roadie_options
|
||||
# This lets us specify assets using relative paths in email templates
|
||||
super.merge(url_options: { host: URI(main_app.root_url).host })
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class OrderMailer < BaseMailer
|
||||
class OrderMailer < ApplicationMailer
|
||||
helper 'checkout'
|
||||
helper SpreeCurrencyHelper
|
||||
helper Spree::PaymentMethodsHelper
|
||||
@@ -13,7 +13,6 @@ module Spree
|
||||
@order = find_order(order_or_order_id)
|
||||
I18n.with_locale valid_locale(@order.user) do
|
||||
mail(to: @order.email,
|
||||
from: from_address,
|
||||
subject: mail_subject(t('spree.order_mailer.cancel_email.subject'), resend))
|
||||
end
|
||||
end
|
||||
@@ -23,7 +22,6 @@ module Spree
|
||||
I18n.with_locale valid_locale(@order.distributor.owner) do
|
||||
subject = I18n.t('spree.order_mailer.cancel_email_for_shop.subject')
|
||||
mail(to: @order.distributor.contact.email,
|
||||
from: from_address,
|
||||
subject: subject)
|
||||
end
|
||||
end
|
||||
@@ -33,7 +31,6 @@ module Spree
|
||||
I18n.with_locale valid_locale(@order.user) do
|
||||
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
|
||||
mail(to: @order.email,
|
||||
from: from_address,
|
||||
subject: subject,
|
||||
reply_to: @order.distributor.contact.email)
|
||||
end
|
||||
@@ -44,7 +41,6 @@ module Spree
|
||||
I18n.with_locale valid_locale(@order.user) do
|
||||
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
|
||||
mail(to: @order.distributor.contact.email,
|
||||
from: from_address,
|
||||
subject: subject)
|
||||
end
|
||||
end
|
||||
@@ -56,7 +52,6 @@ module Spree
|
||||
attach_file("invoice-#{@order.number}.pdf", pdf)
|
||||
I18n.with_locale valid_locale(@order.user) do
|
||||
mail(to: @order.email,
|
||||
from: from_address,
|
||||
subject: mail_subject(t(:invoice), false),
|
||||
reply_to: @order.distributor.contact.email)
|
||||
end
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class ShipmentMailer < BaseMailer
|
||||
class ShipmentMailer < ApplicationMailer
|
||||
def shipped_email(shipment, delivery:)
|
||||
@shipment = shipment.respond_to?(:id) ? shipment : Spree::Shipment.find(shipment)
|
||||
@delivery = delivery
|
||||
subject = base_subject
|
||||
mail(to: @shipment.order.email, from: from_address, subject: subject)
|
||||
mail(to: @shipment.order.email, subject: subject)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class TestMailer < BaseMailer
|
||||
class TestMailer < ApplicationMailer
|
||||
def test_email(user)
|
||||
recipient = user.respond_to?(:id) ? user : Spree::User.find(user)
|
||||
subject = "#{Spree::Config[:site_name]} #{t('spree.test_mailer.test_email.subject')}"
|
||||
mail(to: recipient.email, from: from_address, subject: subject)
|
||||
mail(to: recipient.email, subject: subject)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# This mailer is configured to be the Devise mailer
|
||||
# Some methods here override Devise::Mailer methods
|
||||
module Spree
|
||||
class UserMailer < BaseMailer
|
||||
class UserMailer < ApplicationMailer
|
||||
include I18nHelper
|
||||
|
||||
helper MailerHelper
|
||||
@@ -16,7 +16,7 @@ module Spree
|
||||
"#{I18n.t('spree.user_mailer.reset_password_instructions.subject')}"
|
||||
|
||||
I18n.with_locale valid_locale(user) do
|
||||
mail(to: user.email, from: from_address, subject: subject)
|
||||
mail(to: user.email, subject: subject)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -24,7 +24,7 @@ module Spree
|
||||
def signup_confirmation(user)
|
||||
@user = user
|
||||
I18n.with_locale valid_locale(@user) do
|
||||
mail(to: user.email, from: from_address,
|
||||
mail(to: user.email,
|
||||
subject: t(:welcome_to) + ' ' + Spree::Config[:site_name])
|
||||
end
|
||||
end
|
||||
@@ -39,7 +39,6 @@ module Spree
|
||||
I18n.with_locale valid_locale(@user) do
|
||||
subject = t('spree.user_mailer.confirmation_instructions.subject')
|
||||
mail(to: confirmation_email_address,
|
||||
from: from_address,
|
||||
subject: subject)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class SubscriptionMailer < Spree::BaseMailer
|
||||
class SubscriptionMailer < ApplicationMailer
|
||||
helper 'checkout'
|
||||
helper MailerHelper
|
||||
helper ShopMailHelper
|
||||
@@ -37,7 +37,6 @@ class SubscriptionMailer < Spree::BaseMailer
|
||||
@shop = Enterprise.find(summary.shop_id)
|
||||
@summary = summary
|
||||
mail(to: @shop.contact.email,
|
||||
from: from_address,
|
||||
subject: "#{Spree::Config[:site_name]} #{t('subscription_mailer.placement_summary_email.subject')}")
|
||||
end
|
||||
|
||||
@@ -45,7 +44,6 @@ class SubscriptionMailer < Spree::BaseMailer
|
||||
@shop = Enterprise.find(summary.shop_id)
|
||||
@summary = summary
|
||||
mail(to: @shop.contact.email,
|
||||
from: from_address,
|
||||
subject: "#{Spree::Config[:site_name]} #{t('subscription_mailer.confirmation_summary_email.subject')}")
|
||||
end
|
||||
|
||||
@@ -56,7 +54,6 @@ class SubscriptionMailer < Spree::BaseMailer
|
||||
confirm_email_subject = t('spree.order_mailer.confirm_email.subject')
|
||||
subject = "#{Spree::Config[:site_name]} #{confirm_email_subject} ##{order.number}"
|
||||
mail(to: order.email,
|
||||
from: from_address,
|
||||
subject: subject,
|
||||
reply_to: order.distributor.contact.email)
|
||||
end
|
||||
|
||||
@@ -4,4 +4,8 @@ module AddressDisplay
|
||||
def full_name_reverse
|
||||
[lastname, firstname].reject(&:blank?).join(" ")
|
||||
end
|
||||
|
||||
def full_name_for_sorting
|
||||
[last_name, first_name].reject(&:blank?).join(", ")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -35,6 +35,7 @@ class Customer < ApplicationRecord
|
||||
uniqueness: { scope: :enterprise_id, message: I18n.t('validation_msg_is_associated_with_an_exising_customer') }
|
||||
|
||||
scope :of, ->(enterprise) { where(enterprise_id: enterprise) }
|
||||
scope :managed_by, ->(user) { user&.persisted? ? where(user: user).or(of(Enterprise.managed_by(user))) : none }
|
||||
|
||||
before_create :associate_user
|
||||
|
||||
|
||||
@@ -15,6 +15,10 @@ class Enterprise < ApplicationRecord
|
||||
medium: { resize_to_fill: [720, 156] },
|
||||
large: { resize_to_fill: [1200, 260] },
|
||||
}.freeze
|
||||
WHITE_LABEL_LOGO_SIZES = {
|
||||
default: { gravity: "Center", resize_to_fill: [217, 44] },
|
||||
mobile: { gravity: "Center", resize_to_fill: [75, 26] },
|
||||
}.freeze
|
||||
VALID_INSTAGRAM_REGEX = %r{\A[a-zA-Z0-9._]{1,30}([^/-]*)\z}
|
||||
|
||||
searchable_attributes :sells, :is_primary_producer, :name
|
||||
@@ -84,9 +88,14 @@ class Enterprise < ApplicationRecord
|
||||
has_one_attached :logo
|
||||
has_one_attached :promo_image
|
||||
has_one_attached :terms_and_conditions
|
||||
has_one_attached :white_label_logo
|
||||
|
||||
validates :logo, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :promo_image, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :logo,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :promo_image,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :terms_and_conditions, content_type: {
|
||||
in: "application/pdf",
|
||||
message: I18n.t(:enterprise_terms_and_conditions_type_error),
|
||||
@@ -267,8 +276,7 @@ class Enterprise < ApplicationRecord
|
||||
|
||||
def plus_parents_and_order_cycle_producers(order_cycles)
|
||||
oc_producer_ids = Exchange.in_order_cycle(order_cycles).incoming.pluck :sender_id
|
||||
Enterprise.not_hidden.is_primary_producer
|
||||
.parents_of_one_union_others(id, oc_producer_ids | [id])
|
||||
Enterprise.is_primary_producer.parents_of_one_union_others(id, oc_producer_ids | [id])
|
||||
end
|
||||
|
||||
def relatives_including_self
|
||||
@@ -299,6 +307,14 @@ class Enterprise < ApplicationRecord
|
||||
)
|
||||
end
|
||||
|
||||
def white_label_logo_url(name = :default)
|
||||
return unless white_label_logo.variable?
|
||||
|
||||
Rails.application.routes.url_helpers.url_for(
|
||||
white_label_logo.variant(WHITE_LABEL_LOGO_SIZES[name])
|
||||
)
|
||||
end
|
||||
|
||||
def website
|
||||
strip_url self[:website]
|
||||
end
|
||||
|
||||
@@ -28,8 +28,12 @@ class EnterpriseGroup < ApplicationRecord
|
||||
has_one_attached :logo
|
||||
has_one_attached :promo_image
|
||||
|
||||
validates :logo, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :promo_image, content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :logo,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :promo_image,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
|
||||
scope :by_position, -> { order('position ASC') }
|
||||
scope :on_front_page, -> { where(on_front_page: true) }
|
||||
|
||||
@@ -13,6 +13,7 @@ class EnterpriseRelationship < ApplicationRecord
|
||||
|
||||
after_save :update_permissions_of_child_variant_overrides
|
||||
before_destroy :revoke_all_child_variant_overrides
|
||||
before_destroy :destroy_related_exchanges
|
||||
|
||||
scope :with_enterprises, -> {
|
||||
joins("
|
||||
@@ -102,6 +103,10 @@ class EnterpriseRelationship < ApplicationRecord
|
||||
child_variant_overrides.update_all(permission_revoked_at: Time.zone.now)
|
||||
end
|
||||
|
||||
def destroy_related_exchanges
|
||||
Exchange.where(sender: parent, receiver: child, incoming: true).destroy_all
|
||||
end
|
||||
|
||||
def child_variant_overrides
|
||||
VariantOverride.unscoped.for_hubs(child)
|
||||
.joins(variant: :product).where("spree_products.supplier_id IN (?)", parent)
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class EnterpriseRelationshipPermission < ApplicationRecord
|
||||
belongs_to :enterprise_relationship
|
||||
default_scope { order('name') }
|
||||
before_destroy :destroy_related_exchanges
|
||||
|
||||
def destroy_related_exchanges
|
||||
return if name != "add_to_order_cycle"
|
||||
|
||||
Exchange
|
||||
.where(sender: enterprise_relationship.parent,
|
||||
receiver: enterprise_relationship.child, incoming: true).destroy_all
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,4 +3,9 @@
|
||||
class ExchangeVariant < ApplicationRecord
|
||||
belongs_to :exchange
|
||||
belongs_to :variant, class_name: 'Spree::Variant'
|
||||
after_destroy :destroy_related_outgoing_variants
|
||||
|
||||
def destroy_related_outgoing_variants
|
||||
VariantDeleter.new.destroy_related_outgoing_variants(variant_id, exchange.order_cycle)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -39,6 +39,8 @@ module ProductImport
|
||||
enterprise_validation(entry)
|
||||
unit_fields_validation(entry)
|
||||
variant_of_product_validation(entry)
|
||||
price_validation(entry)
|
||||
on_hand_on_demand_validation(entry)
|
||||
|
||||
next if entry.enterprise_id.blank?
|
||||
|
||||
@@ -170,6 +172,11 @@ module ProductImport
|
||||
error: I18n.t('admin.product_import.model.blank'))
|
||||
end
|
||||
|
||||
unless is_numeric(entry.units) && entry.units.to_f > 0
|
||||
mark_as_invalid(entry, attribute: 'units',
|
||||
error: I18n.t('admin.product_import.model.incorrect_value'))
|
||||
end
|
||||
|
||||
return if import_into_inventory?
|
||||
|
||||
# unit_type must be valid type
|
||||
@@ -189,6 +196,42 @@ module ProductImport
|
||||
error: I18n.t('admin.product_import.model.conditional_blank'))
|
||||
end
|
||||
|
||||
def is_numeric(value)
|
||||
return true unless Float(value, exception: false).nil?
|
||||
end
|
||||
|
||||
def price_validation(entry)
|
||||
return if is_numeric(entry.price)
|
||||
|
||||
error_string = if empty_or_placeholder_value(entry.price)
|
||||
'admin.product_import.model.blank'
|
||||
else
|
||||
'admin.product_import.model.incorrect_value'
|
||||
end
|
||||
mark_as_invalid(entry, attribute: 'price', error: I18n.t(error_string))
|
||||
end
|
||||
|
||||
def on_hand_on_demand_validation(entry)
|
||||
on_hand_present_numeric = !empty_or_placeholder_value(entry.on_hand) &&
|
||||
is_numeric(entry.on_hand)
|
||||
on_hand_value = entry.on_hand&.to_i
|
||||
on_demand_present_numeric = !empty_or_placeholder_value(entry.on_demand) &&
|
||||
is_numeric(entry.on_demand)
|
||||
on_demand_value = entry.on_demand&.to_i
|
||||
|
||||
return if (on_hand_present_numeric && on_hand_value >= 0) ||
|
||||
(on_demand_present_numeric && on_demand_value == 1)
|
||||
|
||||
mark_as_invalid(entry, attribute: 'on_hand',
|
||||
error: I18n.t('admin.product_import.model.incorrect_value'))
|
||||
mark_as_invalid(entry, attribute: 'on_demand',
|
||||
error: I18n.t('admin.product_import.model.incorrect_value'))
|
||||
end
|
||||
|
||||
def empty_or_placeholder_value(value)
|
||||
value.blank? || value.to_s.strip == "-"
|
||||
end
|
||||
|
||||
def variant_of_product_validation(entry)
|
||||
return if entry.producer.blank? || entry.name.blank?
|
||||
|
||||
@@ -293,8 +336,7 @@ module ProductImport
|
||||
entry.primary_taxon_id = @spreadsheet_data.categories_index[category_name]
|
||||
else
|
||||
mark_as_invalid(entry, attribute: "category",
|
||||
error: I18n.t(:error_not_found_in_database,
|
||||
name: category_name))
|
||||
error: I18n.t('admin.product_import.model.category_not_found'))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
36
app/models/report_blob.rb
Normal file
36
app/models/report_blob.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Stores a generated report.
|
||||
class ReportBlob < ActiveStorage::Blob
|
||||
def self.create_for_upload_later!(filename)
|
||||
# ActiveStorage discourages modifying a blob later but we need a blob
|
||||
# before we know anything about the report file. It enables us to use the
|
||||
# same blob in the controller to read the result.
|
||||
create_before_direct_upload!(
|
||||
filename: filename,
|
||||
byte_size: 0,
|
||||
checksum: "0",
|
||||
content_type: content_type(filename),
|
||||
).tap do |blob|
|
||||
ActiveStorage::PurgeJob.set(wait: 1.month).perform_later(blob)
|
||||
end
|
||||
end
|
||||
|
||||
def self.content_type(filename)
|
||||
MIME::Types.of(filename).first&.to_s || "application/octet-stream"
|
||||
end
|
||||
|
||||
def store(content)
|
||||
io = StringIO.new(content)
|
||||
upload(io, identify: false)
|
||||
save!
|
||||
end
|
||||
|
||||
def content_stored?
|
||||
@content_stored ||= reload.checksum != "0"
|
||||
end
|
||||
|
||||
def result
|
||||
@result ||= download
|
||||
end
|
||||
end
|
||||
@@ -11,8 +11,10 @@ module Spree
|
||||
|
||||
has_one_attached :attachment
|
||||
|
||||
validates :attachment, attached: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validates :attachment,
|
||||
attached: true,
|
||||
processable_image: true,
|
||||
content_type: %r{\Aimage/(png|jpeg|gif|jpg|svg\+xml|webp)\Z}
|
||||
validate :no_attachment_errors
|
||||
|
||||
def variant(name)
|
||||
|
||||
@@ -114,6 +114,7 @@ module Spree
|
||||
presence: { if: ->(p) { %w(weight volume).include? p.variant_unit } }
|
||||
validates :variant_unit_name,
|
||||
presence: { if: ->(p) { p.variant_unit == 'items' } }
|
||||
validate :validate_image_for_master
|
||||
|
||||
attr_accessor :option_values_hash
|
||||
|
||||
@@ -474,5 +475,11 @@ module Spree
|
||||
requested = permalink.presence || permalink_was.presence || name.presence || 'product'
|
||||
self.permalink = create_unique_permalink(requested.parameterize)
|
||||
end
|
||||
|
||||
def validate_image_for_master
|
||||
return if master.images.all?(&:valid?)
|
||||
|
||||
errors.add(:base, I18n.t('spree.admin.products.image_not_processable'))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
12
app/reflexes/concerns/enterprise_concern.rb
Normal file
12
app/reflexes/concerns/enterprise_concern.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module EnterpriseConcern
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
before_reflex do
|
||||
@enterprise = Enterprise.find_by(permalink: params[:id])
|
||||
authorize! :update, @enterprise
|
||||
end
|
||||
end
|
||||
end
|
||||
24
app/reflexes/white_label_reflex.rb
Normal file
24
app/reflexes/white_label_reflex.rb
Normal file
@@ -0,0 +1,24 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class WhiteLabelReflex < ApplicationReflex
|
||||
include EnterpriseConcern
|
||||
delegate :view_context, to: :controller
|
||||
|
||||
def remove_logo
|
||||
@enterprise.update!(white_label_logo: nil)
|
||||
|
||||
f = ActionView::Helpers::FormBuilder.new(:enterprise, @enterprise, view_context, {})
|
||||
|
||||
html = with_locale {
|
||||
render(partial: "admin/enterprises/form/white_label",
|
||||
locals: { f: f, enterprise: @enterprise })
|
||||
}
|
||||
morph "#white_label_panel", html
|
||||
|
||||
flash[:success] = with_locale {
|
||||
I18n.t("admin.enterprises.form.white_label.remove_logo_success")
|
||||
}
|
||||
cable_ready.dispatch_event(name: "modal:close")
|
||||
morph "#flashes", render(partial: "shared/flashes", locals: { flashes: flash })
|
||||
end
|
||||
end
|
||||
@@ -14,7 +14,7 @@ module Api
|
||||
:logo, :promo_image, :terms_and_conditions,
|
||||
:terms_and_conditions_file_name, :terms_and_conditions_updated_at,
|
||||
:preferred_invoice_order_by_supplier, :preferred_product_low_stock_display,
|
||||
:visible, :hide_ofn_navigation
|
||||
:visible, :hide_ofn_navigation, :white_label_logo
|
||||
|
||||
has_one :owner, serializer: Api::Admin::UserSerializer
|
||||
has_many :users, serializer: Api::Admin::UserSerializer
|
||||
@@ -29,6 +29,10 @@ module Api
|
||||
attachment_urls(object.promo_image, Enterprise::PROMO_IMAGE_SIZES)
|
||||
end
|
||||
|
||||
def white_label_logo
|
||||
attachment_urls(object.white_label_logo, Enterprise::WHITE_LABEL_LOGO_SIZES)
|
||||
end
|
||||
|
||||
def terms_and_conditions
|
||||
return unless object.terms_and_conditions.attached?
|
||||
|
||||
|
||||
@@ -3,8 +3,10 @@
|
||||
module Api
|
||||
module Admin
|
||||
class OrderSerializer < ActiveModel::Serializer
|
||||
attributes :id, :number, :user_id, :full_name, :email, :phone, :completed_at,
|
||||
:completed_at_utc_iso8601, :display_total,
|
||||
include AddressDisplay
|
||||
|
||||
attributes :id, :number, :user_id, :full_name, :full_name_for_sorting, :email, :phone,
|
||||
:completed_at, :completed_at_utc_iso8601, :display_total,
|
||||
:edit_path, :state, :payment_state, :shipment_state,
|
||||
:payments_path, :ready_to_ship, :ready_to_capture, :created_at,
|
||||
:distributor_name, :special_instructions, :display_outstanding_balance,
|
||||
@@ -17,6 +19,14 @@ module Api
|
||||
object.billing_address.nil? ? "" : ( object.billing_address.full_name || "" )
|
||||
end
|
||||
|
||||
def first_name
|
||||
object.billing_address&.first_name || ""
|
||||
end
|
||||
|
||||
def last_name
|
||||
object.billing_address&.last_name || ""
|
||||
end
|
||||
|
||||
def distributor_name
|
||||
object.distributor&.name
|
||||
end
|
||||
|
||||
@@ -10,7 +10,7 @@ module Api
|
||||
:phone, :whatsapp_phone, :whatsapp_url, :visible, :email_address, :hash, :logo,
|
||||
:promo_image, :path, :category, :active, :producers, :orders_close_at, :hubs,
|
||||
:taxons, :supplied_taxons, :pickup, :delivery, :preferred_product_low_stock_display,
|
||||
:hide_ofn_navigation
|
||||
:hide_ofn_navigation, :white_label_logo
|
||||
|
||||
has_one :address, serializer: Api::AddressSerializer
|
||||
has_many :supplied_properties, serializer: Api::PropertySerializer
|
||||
@@ -49,6 +49,10 @@ module Api
|
||||
enterprise.promo_image_url(:large)
|
||||
end
|
||||
|
||||
def white_label_logo
|
||||
enterprise.white_label_logo_url
|
||||
end
|
||||
|
||||
def path
|
||||
enterprise_shop_path(enterprise)
|
||||
end
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
module Api
|
||||
class EnterpriseThinSerializer < ActiveModel::Serializer
|
||||
attributes :name, :id, :active, :path
|
||||
attributes :name, :id, :active, :path, :visible
|
||||
|
||||
has_one :address, serializer: Api::AddressSerializer
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ module PermittedAttributes
|
||||
:show_customer_names_to_suppliers, :preferred_shopfront_product_sorting_method,
|
||||
:preferred_invoice_order_by_supplier,
|
||||
:preferred_product_low_stock_display,
|
||||
:hide_ofn_navigation
|
||||
:hide_ofn_navigation, :white_label_logo,
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,6 +11,15 @@ class VariantDeleter
|
||||
variant.destroy
|
||||
end
|
||||
|
||||
def destroy_related_outgoing_variants(variant_id, order_cycle)
|
||||
internal_variants = ExchangeVariant.where(variant_id: variant_id).
|
||||
joins(:exchange).
|
||||
where(
|
||||
exchanges: { order_cycle: order_cycle, incoming: false }
|
||||
)
|
||||
internal_variants.destroy_all
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def only_variant_on_product?(variant)
|
||||
|
||||
@@ -1,6 +1,23 @@
|
||||
- @object ||= enterprise
|
||||
|
||||
.row
|
||||
.three.columns.alpha
|
||||
= f.label :hide_ofn_navigation, t('.hide_ofn_navigation')
|
||||
.three.columns
|
||||
= f.check_box :hide_ofn_navigation
|
||||
= f.check_box :hide_ofn_navigation, { "data-controller": "checkbox-display", "data-checkbox-display-target-id-value": "white_label_logo" }
|
||||
|
||||
.row{id: "white_label_logo"}
|
||||
.three.columns.alpha
|
||||
= f.label :white_label_logo, t('.upload_logo')
|
||||
.three.columns
|
||||
= image_tag @object.white_label_logo_url if @object.white_label_logo.present?
|
||||
= f.file_field :white_label_logo, accept: "image/*"
|
||||
- if @object.white_label_logo.variable?
|
||||
%button.button.small{ type: "button", "data-controller": "modal-link", "data-action": "click->modal-link#open", "data-modal-link-target-value": "remove_logo" }
|
||||
= t('.remove_logo')
|
||||
|
||||
|
||||
- if @object.white_label_logo.variable?
|
||||
= render ConfirmModalComponent.new(id: "remove_logo", confirm_reflexes: "click->WhiteLabel#remove_logo" ) do
|
||||
.margin-bottom-30
|
||||
= t('.remove_logo_confirm')
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
.report__header.print-hidden
|
||||
- if @report.message.present?
|
||||
%p.report__message= @report.message
|
||||
- if request.post?
|
||||
- if request.post? && !@error
|
||||
%button.btn-print.icon-print{ onclick: "window.print()"}= t(:report_print)
|
||||
|
||||
= t(@error, link: link_to(t(".report_link_label"), @error_url)) if @error
|
||||
= @table
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
%ul.nav-logo
|
||||
%li.ofn-logo
|
||||
%a{href: main_app.root_path}
|
||||
%img{src: ContentConfig.url_for(:logo)}
|
||||
- if @white_label_logo&.variable?
|
||||
= image_tag @white_label_distributor.white_label_logo_url(:default)
|
||||
- else
|
||||
%img{src: ContentConfig.url_for(:logo)}
|
||||
%li.powered-by
|
||||
%img{src: '/favicon.ico'}
|
||||
%span
|
||||
|
||||
@@ -6,7 +6,10 @@
|
||||
%section.left
|
||||
.ofn-logo
|
||||
%a{href: main_app.root_path}
|
||||
%img{src: ContentConfig.url_for(:logo_mobile), srcset: ContentConfig.url_for(:logo_mobile_svg), width: "75", height: "26"}
|
||||
- if @white_label_logo&.variable?
|
||||
= image_tag @white_label_distributor.white_label_logo_url(:mobile)
|
||||
- else
|
||||
%img{src: ContentConfig.url_for(:logo_mobile), srcset: ContentConfig.url_for(:logo_mobile_svg), width: "75", height: "26"}
|
||||
|
||||
%section.right{"ng-cloak" => true}
|
||||
%span.cart-span{"ng-class" => "{ dirty: Cart.dirty || Cart.empty(), 'pure-dirty': Cart.dirty }"}
|
||||
|
||||
@@ -10,11 +10,12 @@
|
||||
%a{"ng-click" => "triggerProductModal()", href: 'javascript:void(0)'}
|
||||
%span{"ng-bind" => "::product.name"}
|
||||
.product-description{ng: {"bind-html": "::product.description_html", click: "triggerProductModal()", show: "product.description_html.length"}}
|
||||
.product-producer
|
||||
= t :products_from
|
||||
%span
|
||||
%enterprise-modal
|
||||
%span{"ng-bind" => "::enterprise.name"}
|
||||
%div{ "ng-switch" => "enterprise.visible" }
|
||||
.product-producer
|
||||
= t :products_from
|
||||
%span{ "ng-switch-when": "hidden", "ng-bind" => "::enterprise.name"}
|
||||
%span{ "ng-switch-default": true }
|
||||
%enterprise-modal{"ng-bind" => "::enterprise.name"}
|
||||
|
||||
.product-properties.filter-shopfront.property-selectors
|
||||
%filter-selector{ 'selector-set' => "productPropertySelectors", objects: "[product] | propertiesWithValuesOf" }
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
= t :shopping_producers_of_hub, hub: '{{ shopfront.name }}'
|
||||
%ul.small-block-grid-1.medium-block-grid-2.large-block-grid-3
|
||||
%li{"ng-repeat" => "enterprise in shopfront.producers"}
|
||||
%enterprise-modal
|
||||
%enterprise-modal{"ng-if": "enterprise.visible != 'hidden'"}
|
||||
%i.ofn-i_036-producers
|
||||
{{ enterprise.name }}
|
||||
%span{"ng-if": "enterprise.visible == 'hidden'"}
|
||||
%i.ofn-i_036-producers
|
||||
{{ enterprise.name }}
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
%h6.text-center{ 'ng-hide' => 'sharedResource' } {{ selectedUnitsVariant.full_name }}
|
||||
.three.columns
|
||||
%h6.text-right
|
||||
%a{ :href => '#', 'ng-click' => 'selectedUnitsVariant = {};selectedUnitsProduct = {};sharedResource=false;' }= t('admin.clear')
|
||||
%a{ :href => '#', 'ng-click' => 'resetSelectedUnitsVariant()' }= t('admin.clear')
|
||||
%hr
|
||||
.row
|
||||
.one.columns.alpha
|
||||
@@ -133,7 +133,7 @@
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('order.number')" }
|
||||
= t("admin.orders.bulk_management.order_no")
|
||||
%th.full_name{ 'ng-show' => 'columns.full_name.visible' }
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('order.full_name')" }
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('order.full_name_for_sorting')" }
|
||||
= t("admin.name")
|
||||
%th.email{ 'ng-show' => 'columns.email.visible' }
|
||||
%a{ :href => '', 'ng-click' => "sorting.toggle('order.email')" }
|
||||
@@ -166,11 +166,11 @@
|
||||
= "#{t('admin.price')} (#{Spree::Money.currency_symbol})"
|
||||
%th.actions
|
||||
|
||||
%tr.line_item{ ng: { repeat: "line_item in filteredLineItems = ( line_items | variantFilter:selectedUnitsProduct:selectedUnitsVariant:sharedResource | orderBy:sorting.predicate:sorting.reverse )", 'class-even' => "'even'", 'class-odd' => "'odd'", attr: { id: "li_{{line_item.id}}" } } }
|
||||
%tr.line_item{ ng: { repeat: "line_item in filteredLineItems = ( line_items | orderBy:sorting.predicate:sorting.reverse )", 'class-even' => "'even'", 'class-odd' => "'odd'", attr: { id: "li_{{line_item.id}}" } } }
|
||||
%td.bulk
|
||||
%input{ :type => "checkbox", :name => 'bulk', 'ng-model' => 'line_item.checked', 'ignore-dirty' => true }
|
||||
%td.order_no{ 'ng-show' => 'columns.order_no.visible' } {{ line_item.order.number }}
|
||||
%td.full_name{ 'ng-show' => 'columns.full_name.visible' } {{ line_item.order.full_name }}
|
||||
%td.full_name{ 'ng-show' => 'columns.full_name.visible' } {{ line_item.order.full_name_for_sorting }}
|
||||
%td.email{ 'ng-show' => 'columns.email.visible' } {{ line_item.order.email }}
|
||||
%td.phone{ 'ng-show' => 'columns.phone.visible' } {{ line_item.order.phone }}
|
||||
%td.date{ 'ng-show' => 'columns.order_date.visible' } {{ line_item.order.completed_at }}
|
||||
|
||||
37
app/webpacker/controllers/checkbox_display_controller.js
Normal file
37
app/webpacker/controllers/checkbox_display_controller.js
Normal file
@@ -0,0 +1,37 @@
|
||||
import { Controller } from "stimulus";
|
||||
|
||||
export default class extends Controller {
|
||||
static values = { targetId: String };
|
||||
|
||||
connect() {
|
||||
this.element.addEventListener("change", this.change.bind(this));
|
||||
if (this.element.checked) {
|
||||
this.showTarget();
|
||||
} else {
|
||||
this.hideTarget();
|
||||
}
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
this.element.removeEventListener("change", this.change.bind(this));
|
||||
}
|
||||
|
||||
change(event) {
|
||||
// if the checkbox is checked, display the target
|
||||
if (this.element.checked) {
|
||||
this.showTarget();
|
||||
} else {
|
||||
this.hideTarget();
|
||||
}
|
||||
}
|
||||
|
||||
showTarget() {
|
||||
let target = document.getElementById(this.targetIdValue);
|
||||
target.style.display = "block";
|
||||
}
|
||||
|
||||
hideTarget() {
|
||||
let target = document.getElementById(this.targetIdValue);
|
||||
target.style.display = "none";
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
margin-right: 3px;
|
||||
border-radius: $body-font-size/2;
|
||||
border-radius: $body-font-size*0.5;
|
||||
width: $body-font-size - 4px;
|
||||
height: $body-font-size - 4px;
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,11 +1,13 @@
|
||||
// Grid Calculations
|
||||
// Adjust $col-gutter (space between columns, as percentage) to adjust everything else automatically
|
||||
|
||||
@use "sass:math";
|
||||
|
||||
$col-gutter: 2;
|
||||
$total-gutter: $col-gutter * 15;
|
||||
$total-colspace: 100 - $total-gutter;
|
||||
$gutter-width: $col-gutter / 100;
|
||||
$col-width: ($total-colspace / 16) / 100;
|
||||
$gutter-width: $col-gutter * 0.01;
|
||||
$col-width: math.div($total-colspace, 16) * 0.01;
|
||||
|
||||
$col-1: $col-width;
|
||||
$col-2: ($col-width * 2) + $gutter-width;
|
||||
|
||||
@@ -281,7 +281,7 @@ nav.top-bar {
|
||||
nav .top-bar-section {
|
||||
ul li a,
|
||||
.has-dropdown > a {
|
||||
padding: 0 ($topbar-height / 8) !important;
|
||||
padding: 0 ($topbar-height * 0.125) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ $brand-colour: #f27052;
|
||||
|
||||
// Topbar
|
||||
$topbar-height: rem-calc(64);
|
||||
$topbar-link-padding: $topbar-height / 4;
|
||||
$topbar-link-padding: $topbar-height * 0.25;
|
||||
$topbar-arrows: false;
|
||||
|
||||
$topbar-bg: $white;
|
||||
|
||||
@@ -13,8 +13,6 @@ Openfoodnetwork::Application.configure do
|
||||
|
||||
config.action_controller.default_url_options = {host: "localhost", port: 3000}
|
||||
|
||||
config.session_store :cache_store, key: "_sessions_development", compress: true, pool_size: 5, expire_after: 1.year
|
||||
|
||||
# :file_store is used by default when no cache store is specifically configured.
|
||||
if !!ENV["PROFILE"] || !!ENV["DEV_CACHING"]
|
||||
config.cache_store = :redis_cache_store, {
|
||||
|
||||
@@ -125,6 +125,7 @@ en:
|
||||
aspect_ratio_not_landscape: "must be a landscape image"
|
||||
aspect_ratio_is_not: "must have an aspect ratio of %{aspect_ratio}"
|
||||
aspect_ratio_unknown: "has an unknown aspect ratio"
|
||||
image_not_processable: "is not a valid image"
|
||||
|
||||
stripe:
|
||||
error_code:
|
||||
@@ -1160,6 +1161,10 @@ en:
|
||||
white_label:
|
||||
legend: "White Label"
|
||||
hide_ofn_navigation: "Hide OFN navigation"
|
||||
upload_logo: "Logo used in shopfront"
|
||||
remove_logo: "Remove logo"
|
||||
remove_logo_confirm: "Are you sure you want to remove this logo?"
|
||||
remove_logo_success: "Logo removed"
|
||||
actions:
|
||||
edit_profile: Settings
|
||||
properties: Properties
|
||||
@@ -1440,6 +1445,16 @@ en:
|
||||
pack_by_customer: Pack By Customer
|
||||
pack_by_supplier: Pack By Supplier
|
||||
pack_by_product: Pack By Product
|
||||
show:
|
||||
report_taking_longer: >
|
||||
Sorry, this report took too long to process.
|
||||
It may contain a lot of data or we are busy with other reports.
|
||||
You can try again later.
|
||||
report_taking_longer_html: >
|
||||
This report is taking longer to process.
|
||||
It may contain a lot of data or we are busy with other reports.
|
||||
Once it's finished, you can download it: %{link}
|
||||
report_link_label: Download report (when available)
|
||||
revenues_by_hub:
|
||||
name: Revenues By Hub
|
||||
description: Revenues by hub
|
||||
@@ -4134,6 +4149,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
no_payment_via_admin_backend: Paypal payments cannot be captured in the Backoffice
|
||||
products:
|
||||
image_upload_error: "Please upload the image in JPG, PNG, GIF, SVG or WEBP format."
|
||||
image_not_processable: "Image attachment is not a valid image."
|
||||
new:
|
||||
title: "New Product"
|
||||
new_product: "New Product"
|
||||
|
||||
@@ -1360,6 +1360,10 @@ en_FR:
|
||||
pack_by_customer: Pack By Customer
|
||||
pack_by_supplier: Pack By Supplier
|
||||
pack_by_product: Pack By Product
|
||||
show:
|
||||
report_taking_longer: >
|
||||
Sorry, this report took too long to process. It may contain a lot of data
|
||||
or we are busy with other reports. You can try again later.
|
||||
revenues_by_hub:
|
||||
name: Revenues By Hub
|
||||
description: Revenues by hub
|
||||
@@ -3609,6 +3613,7 @@ en_FR:
|
||||
shipping_categories: "Shipping Categories"
|
||||
new_shipping_category: "New Shipping Category"
|
||||
back_to_shipping_categories: "Back To Shipping Categories"
|
||||
editing_shipping_category: "Editing Shipping Category"
|
||||
name: "Name"
|
||||
description: "Description"
|
||||
type: "Type"
|
||||
|
||||
@@ -1361,6 +1361,11 @@ fr:
|
||||
pack_by_customer: Préparation des commandes par Acheteur
|
||||
pack_by_supplier: Préparation des commandes par Producteur
|
||||
pack_by_product: Préparation des commandes par Produit
|
||||
show:
|
||||
report_taking_longer: >
|
||||
Désolée, ce rapport met trop de temps à se charger, probablement parce
|
||||
qu'il contient une grande quantité de données ou que d'autres rapports
|
||||
sont en cours de téléchargement. Merci de réessayer plus tard.
|
||||
revenues_by_hub:
|
||||
name: CA par boutique
|
||||
description: CA par boutique
|
||||
@@ -3664,6 +3669,7 @@ fr:
|
||||
shipping_categories: "Conditions de transport"
|
||||
new_shipping_category: "Nouvelle condition de transport"
|
||||
back_to_shipping_categories: "Retour aux conditions de transport"
|
||||
editing_shipping_category: "Modifier condition de transport"
|
||||
name: "Produit/Variante"
|
||||
description: "Description"
|
||||
type: "Catégorie"
|
||||
|
||||
@@ -363,7 +363,7 @@ it:
|
||||
supplier_only: Solo Fornitore
|
||||
has_shopfront: Ha una Vetrina
|
||||
weight: Peso
|
||||
volume: Volume
|
||||
volume: Acquisto di gruppo
|
||||
items: Prodotti
|
||||
summary: Sommario
|
||||
detailed: Dettaglio
|
||||
@@ -487,7 +487,7 @@ it:
|
||||
tags: Etichetta
|
||||
variant: Variante
|
||||
weight: Peso
|
||||
volume: Volume
|
||||
volume: Acquisto di gruppo
|
||||
items: Prodotti
|
||||
select_all: Seleziona tutto
|
||||
quick_search: Ricerca veloce
|
||||
|
||||
@@ -6,9 +6,22 @@ ru:
|
||||
spree/shipping_method: Способ Доставки
|
||||
attributes:
|
||||
spree/order/ship_address:
|
||||
address1: "Адрес доставки (Улица + Номер дома)"
|
||||
address2: "2 строка адреса доставки"
|
||||
city: "Город адреса доставки "
|
||||
country: "Страна доставки"
|
||||
phone: "Номер телефона"
|
||||
firstname: "Имя"
|
||||
lastname: "Фамилия"
|
||||
zipcode: "Почтовый индекс адреса доставки"
|
||||
spree/order/bill_address:
|
||||
address1: "Платежный адрес (Улица + Номер дома)"
|
||||
zipcode: "Почтовый индекс платежного адреса"
|
||||
city: "Город адреса платежа"
|
||||
country: "Страна платежного адреса"
|
||||
firstname: "Имя платежного адреса"
|
||||
lastname: "Фамилия платежного адреса"
|
||||
phone: Телефон клиента
|
||||
spree/user:
|
||||
password: "Пароль"
|
||||
password_confirmation: "Подтверждение пароля"
|
||||
@@ -409,8 +422,11 @@ ru:
|
||||
filters:
|
||||
categories:
|
||||
title: Категории
|
||||
selected_categories: "выбрано категории %{count}"
|
||||
producers:
|
||||
title: Производители
|
||||
selected_producers: "%{count} выбраны производители"
|
||||
per_page: "%{count} элементов на странице"
|
||||
colums: Колонки
|
||||
columns:
|
||||
name: Название
|
||||
@@ -665,6 +681,7 @@ ru:
|
||||
not_found: не найден в базе данных
|
||||
category_not_found: не соответствует разрешенным категориям. Посмотрите, какие категории выбрать на странице импорта продуктов, или проверьте, нет ли орфографических ошибок.
|
||||
not_updatable: невозможно обновить существующие товары с помощью импорта товаров
|
||||
values_must_be_same: должно быть одинаковым для товаров с одинаковым названием
|
||||
blank: не может быть пустым
|
||||
products_no_permission: у Вас нет разрешения на управление товарами этого предприятия
|
||||
inventory_no_permission: у Вас нет разрешения на создание товарной номенклатуры этого производителя
|
||||
@@ -839,6 +856,7 @@ ru:
|
||||
legend: "Адрес"
|
||||
business_details:
|
||||
legend: "Юридическая Информация"
|
||||
upload: 'загрузить'
|
||||
abn: ИНН
|
||||
abn_placeholder: напр. 0123456789
|
||||
acn: Полное юридическое наименование
|
||||
@@ -1053,8 +1071,20 @@ ru:
|
||||
email_confirmed: "Email подтверждён"
|
||||
email_not_confirmed: "Email не подтверждён"
|
||||
vouchers:
|
||||
legend: Купоны
|
||||
voucher_code: Код Купона
|
||||
rate: Ставка
|
||||
label: Этикетка
|
||||
purpose: Цель
|
||||
expiry: Срок действия
|
||||
use_limit: Использование/Ограничение
|
||||
customers: Клиент
|
||||
net_value: Чистая стоимость
|
||||
add_new: Добавить новое
|
||||
no_voucher_yet: Купонов пока нет
|
||||
white_label:
|
||||
legend: "Белая Этикетка"
|
||||
hide_ofn_navigation: "Скрыть навигацию ОСП"
|
||||
actions:
|
||||
edit_profile: Настройки
|
||||
properties: Свойства
|
||||
@@ -1290,6 +1320,8 @@ ru:
|
||||
tag_rules: "Правила Меток"
|
||||
shop_preferences: "Параметры Магазина"
|
||||
users: "Пользователи"
|
||||
vouchers: Купоны
|
||||
white_label: "Белая Этикетка"
|
||||
enterprise_group:
|
||||
primary_details: "Основная Информация"
|
||||
users: "Пользователи"
|
||||
@@ -1312,6 +1344,7 @@ ru:
|
||||
total_by_customer: Итого По Клиентам
|
||||
total_by_supplier: Всего По Поставщику
|
||||
supplier_totals: Итоговые данные Поставщика Цикла Заказа
|
||||
percentage: "%{value} %"
|
||||
supplier_totals_by_distributor: Итоговые данные Поставщика Цикла Заказа по Дистрибьюторам
|
||||
totals_by_supplier: Итоговые данные Дистрибьютора за Цикл Заказов по Поставщикам
|
||||
customer_totals: Итоги по Клиентам Цикла Заказа
|
||||
@@ -1322,11 +1355,18 @@ ru:
|
||||
addresses: Адреса
|
||||
payment_methods: Отчет О Способах Оплаты
|
||||
delivery: Отчет О Доставке
|
||||
sales_tax_totals_by_producer: Итоговые Суммы Налога с Продаж по Производителям
|
||||
sales_tax_totals_by_order: Сумма Налога с Продаж по Заказу
|
||||
tax_types: Типы Налогов
|
||||
tax_rates: Налоговые Ставки
|
||||
pack_by_customer: Выборка по Клиенту
|
||||
pack_by_supplier: Выборка по Поставщику
|
||||
pack_by_product: Пакет По Продукту
|
||||
show:
|
||||
report_taking_longer: >
|
||||
К сожалению, обработка этого отчета заняла слишком много времени. Он может
|
||||
содержать много данных или мы заняты другими отчетами. Вы можете повторить
|
||||
попытку позже.
|
||||
revenues_by_hub:
|
||||
name: Доходы По Центрам
|
||||
description: Доходы по центрам
|
||||
@@ -1497,8 +1537,10 @@ ru:
|
||||
associated_subscriptions_error: Это расписание не может быть удалено, потому что оно имеет связанные подписки
|
||||
vouchers:
|
||||
new:
|
||||
legend: Новый Купон
|
||||
back: Назад
|
||||
save: Сохранить
|
||||
voucher_code: Код Купона
|
||||
voucher_amount: Количество
|
||||
controllers:
|
||||
enterprises:
|
||||
@@ -1507,6 +1549,16 @@ ru:
|
||||
stripe_connect_fail: К сожалению, не удалось подключиться к вашей учетной записи Stripe
|
||||
stripe_connect_settings:
|
||||
resource: Конфигурация Stripe Connect
|
||||
resend_confirmation_emails_feedback:
|
||||
one: "Письмо с подтверждением отправлено для 1 заказа."
|
||||
few: "Электронные письма с подтверждением отправлены для заказов %{count}."
|
||||
many: "Электронные письма с подтверждением отправлены для заказов %{count}."
|
||||
other: "Электронные письма с подтверждением отправлены для заказов %{count}."
|
||||
send_invoice_feedback:
|
||||
one: "Электронный счет-фактура отправлен за 1 заказ."
|
||||
few: "Электронные счета-фактуры отправлены для заказов %{count}."
|
||||
many: "Электронные счета-фактуры отправлены для заказов %{count}."
|
||||
other: "Электронные счета-фактуры отправлены для %{count} заказов ."
|
||||
api:
|
||||
unknown_error: "Что-то пошло не так. Наша команда уже уведомлена."
|
||||
invalid_api_key: "Указан неверный API ключ (%{key})."
|
||||
@@ -1523,6 +1575,10 @@ ru:
|
||||
destroy_attachment_does_not_exist: "Файл Условий и Положений не существует"
|
||||
orders:
|
||||
failed_to_update: "Не удалось обновить заказ"
|
||||
query_param:
|
||||
error:
|
||||
title: Неверный параметр запроса
|
||||
extra_fields: "Не поддерживаемые поля: %{fields}"
|
||||
checkout:
|
||||
already_ordered:
|
||||
cart: "корзина"
|
||||
@@ -1817,6 +1873,7 @@ ru:
|
||||
message_html: "У вас уже есть заказ для этого цикла заказов. Проверьте %{cart}, чтобы увидеть товары, которые вы заказали ранее. Вы также можете отменять позиции, пока открыт цикл заказа."
|
||||
step1:
|
||||
contact_information:
|
||||
title: Контактная информация
|
||||
email:
|
||||
label: Email
|
||||
phone:
|
||||
@@ -1870,10 +1927,13 @@ ru:
|
||||
title: Подробности доставки
|
||||
edit: Изменить
|
||||
address: Адрес доставки
|
||||
instructions: Инструкции
|
||||
payment_method:
|
||||
title: Способ оплаты
|
||||
edit: Изменить
|
||||
instructions: Инструкции
|
||||
order:
|
||||
title: Информация по заказу
|
||||
edit: Изменить
|
||||
terms_and_conditions:
|
||||
message_html: "Согласен на %{terms_and_conditions_link} продавца."
|
||||
@@ -1886,6 +1946,7 @@ ru:
|
||||
submit: Завершить заказ
|
||||
cancel: Вернуться к Способу оплаты
|
||||
errors:
|
||||
saving_failed: "Не удалось сохранить. Обновите выделенные поля. %{messages}"
|
||||
terms_not_accepted: Пожалуйста, примите Условия использования
|
||||
required: Поле не может быть пустым
|
||||
invalid_number: "Пожалуйста, введите действующий номер телефона"
|
||||
@@ -2668,6 +2729,8 @@ ru:
|
||||
report_header_tax_on_delivery: "Налог на доставку (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Налог на сборы (%{currency_symbol})"
|
||||
report_header_tax_category: "Налоговая Категория"
|
||||
report_header_tax_rate_name: "Название Налоговой Ставки"
|
||||
report_header_tax_rate: "Ставка Налога"
|
||||
report_header_total_tax: "Общий налог (%{currency_symbol})"
|
||||
report_header_total_excl_tax: "Итого искл. налог (%{currency_symbol})"
|
||||
report_header_total_incl_tax: "Итого, вкл. налог (%{currency_symbol})"
|
||||
@@ -2677,6 +2740,7 @@ ru:
|
||||
report_header_customer_code: Код Клиента
|
||||
report_header_product: Товар
|
||||
report_header_product_properties: Свойства Товара
|
||||
report_header_product_tax_category: Категория Налога на Товар
|
||||
report_header_quantity: Количество
|
||||
report_header_max_quantity: Max Количество
|
||||
report_header_variant: Вариант
|
||||
@@ -2689,6 +2753,8 @@ ru:
|
||||
report_header_supplier: Поставщик
|
||||
report_header_producer: Производитель
|
||||
report_header_producer_suburb: Город Производителя
|
||||
report_header_producer_tax_status: Налоговый Статус Производителя
|
||||
report_header_producer_charges_sales_tax?: Зарегистрирован НДС
|
||||
report_header_unit: Единица измерения
|
||||
report_header_group_buy_unit_quantity: Группа покупает количество единиц
|
||||
report_header_cost: Стоимость
|
||||
@@ -2704,10 +2770,12 @@ ru:
|
||||
report_header_distributor_address: Адрес Дистрибьютора
|
||||
report_header_distributor_city: Город Дистрибьютора
|
||||
report_header_distributor_postcode: Почтовый индекс Дистрибьютора
|
||||
report_header_distributor_tax_status: Налоговый Статус Дистрибьютора
|
||||
report_header_delivery_address: Адрес Доставки
|
||||
report_header_delivery_postcode: Почтовый индекс Доставки
|
||||
report_header_bulk_unit_size: Размер оптовой единицы
|
||||
report_header_weight: Вес
|
||||
report_header_final_weight_volume: Окончательный (Вес/Объем)
|
||||
report_header_height: Высота
|
||||
report_header_width: Ширина
|
||||
report_header_depth: Глубина
|
||||
@@ -2884,6 +2952,7 @@ ru:
|
||||
deleting_item_will_cancel_order: "Эта операция приведет к созданию одного или нескольких пустых заказов, которые будут отменены. Вы хотите продолжить?"
|
||||
modals:
|
||||
got_it: "Понятно"
|
||||
confirm: "Подтвердить"
|
||||
close: "Закрыть"
|
||||
continue: "Продолжить"
|
||||
cancel: "Выход"
|
||||
@@ -3081,6 +3150,11 @@ ru:
|
||||
cancel_the_order_send_cancelation_email: "Отправить клиенту электронное письмо об отмене"
|
||||
restock_item: "Restock Items: вернуть этот товар на склад"
|
||||
restock_items: "Restock Items: вернуть все товары на склад"
|
||||
delete_line_items_html:
|
||||
one: "Это приведет к удалению одной позиции из заказа.<br /> Вы уверены, что хотите продолжить?"
|
||||
few: "Это приведет к удалению позиций %{count} из заказа.<br /> Вы уверены, что хотите продолжить?"
|
||||
many: "Это приведет к удалению позиций %{count} из заказа.<br /> Вы уверены, что хотите продолжить?"
|
||||
other: "Это приведет к удалению позиций %{count} из заказа.<br /> Вы уверены, что хотите продолжить?"
|
||||
resend_user_email_confirmation:
|
||||
resend: "Повторно отправить"
|
||||
sending: "Повторная Отправка..."
|
||||
@@ -3420,6 +3494,13 @@ ru:
|
||||
first: "Первый"
|
||||
previous: "Предыдущий"
|
||||
last: "Последний"
|
||||
webhook_endpoints:
|
||||
create:
|
||||
success: Конечная точка веб-хука успешно создана
|
||||
error: Не удалось создать конечную точку веб-хука
|
||||
destroy:
|
||||
success: Конечная точка веб-хука успешно удалена
|
||||
error: Не удалось удалить конечную точку веб-хука.
|
||||
spree:
|
||||
add_country: "Добавить страну"
|
||||
add_state: "Добавить область"
|
||||
@@ -3460,6 +3541,8 @@ ru:
|
||||
server_error: "Ошибка сервера"
|
||||
shipping_method_names:
|
||||
UPS Ground: "UPS Ground"
|
||||
pick_up: "Самовывоз на ферме"
|
||||
delivery: "Подписано, запечатано, доставлено"
|
||||
start_date: "Дата начала"
|
||||
successfully_removed: "Успешно удалено"
|
||||
taxonomy_edit: "Изменить таксономию"
|
||||
@@ -3544,6 +3627,7 @@ ru:
|
||||
display_currency: "Показывать валюту"
|
||||
choose_currency: "Выбор валюты"
|
||||
mail_method_settings: "Почтовые Настройки"
|
||||
mail_settings_notice_html: "<b>Внесенные здесь изменения будут временными</b> только для отладки и могут быть отменены в будущем.<br> Постоянные изменения можно внести, обновив секреты экземпляра и предоставив их с помощью <a href='https://github.com/openfoodfoundation/ofn-install'>ofn-install</a> . Свяжитесь с глобальной командой ОСП для получения дополнительной информации."
|
||||
general: "Основные"
|
||||
enable_mail_delivery: "Включить отправку почты"
|
||||
send_mails_as: "Отправлять Почту Как"
|
||||
@@ -3592,6 +3676,7 @@ ru:
|
||||
shipping_categories: "Категории Доставки"
|
||||
new_shipping_category: "Новая Категория Доставки"
|
||||
back_to_shipping_categories: "Назад в Категории Доставки"
|
||||
editing_shipping_category: "Редактирование Категории Доставки"
|
||||
name: "Имя"
|
||||
description: "Описание"
|
||||
type: "Тип"
|
||||
@@ -3666,6 +3751,7 @@ ru:
|
||||
messages:
|
||||
included_price_validation: "не может быть выбран, если вы не установили Налоговую Зону по Умолчанию"
|
||||
blank: "не может быть пустым"
|
||||
invalid_instagram_url: "Должно быть только имя пользователя, например the_prof"
|
||||
layouts:
|
||||
admin:
|
||||
login_nav:
|
||||
@@ -3776,6 +3862,9 @@ ru:
|
||||
print_invoices: "Печать Счетов"
|
||||
cancel_orders: "Отменить Заказы"
|
||||
resend_confirmation: "Подтверждение Заказа"
|
||||
resend_confirmation_confirm_html: "Это приведет к повторной отправке письма с подтверждением клиенту.<br /> Вы уверены, что хотите продолжить?"
|
||||
send_invoice: "Отправить Счета"
|
||||
send_invoice_confirm_html: "Счета клиентов будут отправлены по электронной почте для всех выбранных полных заказов.<br> Вы уверены, что хотите продолжить?"
|
||||
selected:
|
||||
zero: "Заказ не выбран"
|
||||
one: "1 заказ выбран"
|
||||
@@ -3924,6 +4013,7 @@ ru:
|
||||
title: "Новый Товар"
|
||||
new_product: "Новый Товар"
|
||||
supplier: "Поставщик"
|
||||
supplier_select_placeholder: "Выберите поставщика"
|
||||
product_name: "Название Товара"
|
||||
units: "Единица измерения"
|
||||
value: "Значение"
|
||||
@@ -3969,6 +4059,9 @@ ru:
|
||||
select_and_search: "Для получения данных, выберите фильры и нажмите на %{option}."
|
||||
customer_names_message:
|
||||
customer_names_tip: "Если имена клиентов скрыты для заказов, которые вы предоставили, вы можете связаться с дистрибьютором и спросить, могут ли они обновить настройки своего магазина, чтобы их поставщики могли просматривать имена клиентов."
|
||||
products_and_inventory:
|
||||
all_products:
|
||||
message: "Обратите внимание, что указанные уровни запасов взяты только из списков продуктов поставщиков. Если вы используете Товарную Номенклатуру для управления запасами, эти значения будут игнорироваться в этом отчете."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Список Пользователей"
|
||||
@@ -4188,6 +4281,16 @@ ru:
|
||||
api_keys:
|
||||
regenerate_key: "Пересоздать Ключ"
|
||||
title: Ключ API
|
||||
webhook_endpoints:
|
||||
title: Конечные точки веб-хука
|
||||
description: События в системе могут запускать веб-хуки к внешним системам.
|
||||
event_types:
|
||||
order_cycle_opened: Цикл Заказа Открыт
|
||||
event_type:
|
||||
header: Тип события
|
||||
url:
|
||||
header: URL-адрес конечной точки
|
||||
create_placeholder: Введите URL-адрес конечной точки удаленного веб-хука.
|
||||
developer_settings:
|
||||
title: Настройки Разработчика
|
||||
form:
|
||||
@@ -4345,6 +4448,7 @@ ru:
|
||||
search_input:
|
||||
placeholder: Поиск
|
||||
selector_with_filter:
|
||||
selected_items: "выбрано %{count}"
|
||||
search_placeholder: Поиск
|
||||
pagination:
|
||||
next: Следующий
|
||||
|
||||
@@ -17,7 +17,19 @@ function hotfixPostcssLoaderConfig (subloader) {
|
||||
}
|
||||
}
|
||||
|
||||
function addQuietDepsToSassLoader (subloader) {
|
||||
if (subloader.loader === 'sass-loader') {
|
||||
subloader.options.sassOptions = {
|
||||
...subloader.options.sassOptions,
|
||||
quietDeps: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
environment.loaders.keys().forEach(loaderName => {
|
||||
const loader = environment.loaders.get(loaderName);
|
||||
if (loaderName === 'sass') {
|
||||
loader.use.forEach(addQuietDepsToSassLoader);
|
||||
}
|
||||
loader.use.forEach(hotfixPostcssLoaderConfig);
|
||||
});
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class ActivateSplitCheckoutByDefault < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
Flipper.enable(:split_checkout)
|
||||
end
|
||||
end
|
||||
@@ -10,7 +10,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[7.0].define(version: 2023_03_29_080357) do
|
||||
ActiveRecord::Schema[7.0].define(version: 2023_04_13_111157) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pg_stat_statements"
|
||||
enable_extension "plpgsql"
|
||||
|
||||
@@ -4,6 +4,20 @@ module Reporting
|
||||
module Reports
|
||||
module Customers
|
||||
class Addresses < Base
|
||||
def query_result
|
||||
super.group_by do |order|
|
||||
{
|
||||
first_name: order.billing_address.firstname,
|
||||
last_name: order.billing_address.lastname,
|
||||
billing_address: order.billing_address.address_and_city,
|
||||
email: order.email,
|
||||
phone: order.billing_address.phone,
|
||||
hub_id: order.distributor_id,
|
||||
shipping_method_id: order.shipping_method&.id,
|
||||
}
|
||||
end.values.map(&:first)
|
||||
end
|
||||
|
||||
def columns
|
||||
{
|
||||
first_name: proc { |order| order.billing_address.firstname },
|
||||
|
||||
@@ -4,6 +4,17 @@ module Reporting
|
||||
module Reports
|
||||
module Customers
|
||||
class MailingList < Base
|
||||
def query_result
|
||||
super.group_by do |order|
|
||||
{
|
||||
email: order.email,
|
||||
first_name: order.billing_address.firstname,
|
||||
last_name: order.billing_address.lastname,
|
||||
suburb: order.billing_address.city,
|
||||
}
|
||||
end.values.map(&:first)
|
||||
end
|
||||
|
||||
def columns
|
||||
{
|
||||
email: proc { |order| order.email },
|
||||
|
||||
@@ -15,7 +15,7 @@ module Reporting
|
||||
end
|
||||
|
||||
def custom_headers
|
||||
data_attributes.map { |attr| [attr, I18n.t("header.#{attr}", scope: i18n_scope)] }.to_h
|
||||
data_attributes.index_with { |attr| I18n.t("header.#{attr}", scope: i18n_scope) }
|
||||
end
|
||||
|
||||
def i18n_scope
|
||||
|
||||
@@ -11,6 +11,12 @@ module Reporting
|
||||
def query_result
|
||||
search.result.group_by { |order| [order.payment_state, order.distributor] }.values
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def payment_state(order)
|
||||
I18n.t "spree.payment_states.#{order.payment_state}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -6,7 +6,7 @@ module Reporting
|
||||
class ItemisedPaymentTotals < Base
|
||||
def columns
|
||||
{
|
||||
payment_state: proc { |orders| orders.first.payment_state },
|
||||
payment_state: proc { |orders| payment_state(orders.first) },
|
||||
distributor: proc { |orders| orders.first.distributor.name },
|
||||
product_total_price: proc { |orders| orders.to_a.sum(&:item_total) },
|
||||
shipping_total_price: proc { |orders| orders.sum(&:ship_total) },
|
||||
|
||||
@@ -6,7 +6,7 @@ module Reporting
|
||||
class PaymentTotals < Base
|
||||
def columns
|
||||
{
|
||||
payment_state: proc { |orders| orders.first.payment_state },
|
||||
payment_state: proc { |orders| payment_state(orders.first) },
|
||||
distributor: proc { |orders| orders.first.distributor.name },
|
||||
product_total_price: proc { |orders| orders.to_a.sum(&:item_total) },
|
||||
shipping_total_price: proc { |orders| orders.sum(&:ship_total) },
|
||||
|
||||
@@ -15,7 +15,7 @@ module Reporting
|
||||
|
||||
def columns
|
||||
{
|
||||
payment_state: proc { |payments| payments.first.order.payment_state },
|
||||
payment_state: proc { |payments| payment_state(payments.first.order) },
|
||||
distributor: proc { |payments| payments.first.order.distributor.name },
|
||||
payment_type: proc { |payments| payments.first.payment_method.name },
|
||||
total_price: proc { |payments| payments.sum(&:amount) }
|
||||
|
||||
@@ -137,7 +137,7 @@ module Reporting
|
||||
order(query_result_row).all_adjustments
|
||||
.tax
|
||||
.where(originator_id: tax_rate_id(query_result_row))
|
||||
.pluck('sum(amount)').first || 0
|
||||
.pick('sum(amount)') || 0
|
||||
end
|
||||
|
||||
def total_incl_tax(query_result_row)
|
||||
|
||||
@@ -19,12 +19,14 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/preset-env": "^7.18.2",
|
||||
"@floating-ui/dom": "^1.2.5",
|
||||
"@babel/core": "^7.21.4",
|
||||
"@babel/plugin-transform-runtime": "^7.21.4",
|
||||
"@babel/preset-env": "^7.21.4",
|
||||
"@floating-ui/dom": "^1.2.6",
|
||||
"@hotwired/turbo": "^7.3.0",
|
||||
"@rails/webpacker": "5.4.4",
|
||||
"babel-loader": "^8.2.3",
|
||||
"cable_ready": "5.0.0-rc2",
|
||||
"cable_ready": "5.0.0",
|
||||
"debounced": "^0.0.5",
|
||||
"flatpickr": "^4.6.9",
|
||||
"foundation-sites": "^5.5.2",
|
||||
|
||||
@@ -57,6 +57,24 @@ RSpec.configure do |config|
|
||||
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
||||
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
||||
|
||||
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
||||
# examples within a transaction, remove the following line or assign false
|
||||
# instead of true.
|
||||
#
|
||||
# Setting this to true keeps the database clean by rolling back any changes.
|
||||
config.use_transactional_fixtures = true
|
||||
|
||||
# Some tests don't work within a transaction. Then we use DatabaseCleaner.
|
||||
config.before(:each, concurrency: true) do
|
||||
config.use_transactional_fixtures = false
|
||||
DatabaseCleaner.strategy = :deletion, { except: ['spree_countries', 'spree_states'] }
|
||||
DatabaseCleaner.start
|
||||
end
|
||||
config.append_after(:each, concurrency: true) do
|
||||
DatabaseCleaner.clean
|
||||
config.use_transactional_fixtures = true
|
||||
end
|
||||
|
||||
# If true, the base class of anonymous controllers will be inferred
|
||||
# automatically. This will be the default behavior in future versions of
|
||||
# rspec-rails.
|
||||
@@ -124,6 +142,7 @@ RSpec.configure do |config|
|
||||
|
||||
config.infer_spec_type_from_file_location!
|
||||
|
||||
# Helpers
|
||||
config.include FactoryBot::Syntax::Methods
|
||||
config.include JsonSpec::Helpers
|
||||
|
||||
@@ -141,6 +160,13 @@ RSpec.configure do |config|
|
||||
config.include ActiveJob::TestHelper
|
||||
config.include ReportsHelper
|
||||
|
||||
config.include ViewComponent::TestHelpers, type: :component
|
||||
|
||||
config.include ControllerRequestsHelper, type: :controller
|
||||
config.include Devise::Test::ControllerHelpers, type: :controller
|
||||
config.include OpenFoodNetwork::ApiHelper, type: :controller
|
||||
config.include OpenFoodNetwork::ControllerHelper, type: :controller
|
||||
|
||||
config.include Features::DatepickerHelper, type: :system
|
||||
config.include DownloadsHelper, type: :system
|
||||
end
|
||||
|
||||
@@ -30,6 +30,8 @@ module Admin
|
||||
end
|
||||
|
||||
context "and enterprise_id is given in params" do
|
||||
let(:user){ enterprise.users.first }
|
||||
let(:customers){ Customer.managed_by(user).where(enterprise_id: enterprise.id) }
|
||||
let(:params) { { format: :json, enterprise_id: enterprise.id } }
|
||||
|
||||
it "scopes @collection to customers of that enterprise" do
|
||||
@@ -45,7 +47,7 @@ module Admin
|
||||
it 'calls CustomersWithBalance' do
|
||||
customers_with_balance = instance_double(CustomersWithBalance)
|
||||
allow(CustomersWithBalance)
|
||||
.to receive(:new).with(Customer.of(enterprise)) { customers_with_balance }
|
||||
.to receive(:new).with(customers) { customers_with_balance }
|
||||
|
||||
expect(customers_with_balance).to receive(:query) { Customer.none }
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ describe Api::V0::ProductImagesController, type: :controller do
|
||||
}
|
||||
|
||||
expect(response.status).to eq 201
|
||||
expect(product_without_image.images.first.id).to eq json_response['id']
|
||||
expect(product_without_image.reload.images.first.id).to eq json_response['id']
|
||||
end
|
||||
|
||||
it "updates an existing product image" do
|
||||
@@ -34,7 +34,7 @@ describe Api::V0::ProductImagesController, type: :controller do
|
||||
}
|
||||
|
||||
expect(response.status).to eq 200
|
||||
expect(product_with_image.images.first.id).to eq json_response['id']
|
||||
expect(product_with_image.reload.images.first.id).to eq json_response['id']
|
||||
end
|
||||
|
||||
it "reports errors when saving fails" do
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
* @jest-environment jsdom
|
||||
*/
|
||||
|
||||
import { Application } from "stimulus";
|
||||
import checkbox_display_controller from "../../../app/webpacker/controllers/checkbox_display_controller";
|
||||
|
||||
describe("CheckboxDisplayController", () => {
|
||||
beforeAll(() => {
|
||||
const application = Application.start();
|
||||
application.register("checkbox-display", checkbox_display_controller);
|
||||
});
|
||||
|
||||
describe("#toggle", () => {
|
||||
beforeEach(() => {
|
||||
document.body.innerHTML = `<div >
|
||||
<input type="checkbox" id="checkbox" data-controller="checkbox-display" data-checkbox-display-target-id-value="content" />
|
||||
<div id="content">
|
||||
content
|
||||
</div>
|
||||
</div>`;
|
||||
});
|
||||
|
||||
it("show the content if the checkbox is checked, hide content either", () => {
|
||||
const checkbox = document.getElementById("checkbox");
|
||||
const content = document.getElementById("content");
|
||||
|
||||
expect(content.style.display).toBe("none");
|
||||
|
||||
checkbox.click();
|
||||
|
||||
expect(content.style.display).toBe("block");
|
||||
|
||||
checkbox.click();
|
||||
|
||||
expect(content.style.display).toBe("none");
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -3,34 +3,37 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe ReportJob do
|
||||
let(:report_args) { [report_class, user, params, format] }
|
||||
let(:report_args) { [report_class, user, params, format, blob] }
|
||||
let(:report_class) { Reporting::Reports::UsersAndEnterprises::Base }
|
||||
let(:user) { enterprise.owner }
|
||||
let(:enterprise) { create(:enterprise) }
|
||||
let(:params) { {} }
|
||||
let(:format) { :csv }
|
||||
let(:blob) { ReportBlob.create_for_upload_later!("report.csv") }
|
||||
|
||||
it "generates a report" do
|
||||
job = ReportJob.new
|
||||
job.perform(*report_args)
|
||||
expect_csv_report(job)
|
||||
job = perform_enqueued_jobs(only: ReportJob) do
|
||||
ReportJob.perform_later(*report_args)
|
||||
end
|
||||
expect_csv_report
|
||||
end
|
||||
|
||||
it "enqueues a job for asynch processing" do
|
||||
it "enqueues a job for async processing" do
|
||||
job = ReportJob.perform_later(*report_args)
|
||||
expect(job.done?).to eq false
|
||||
expect(blob.content_stored?).to eq false
|
||||
|
||||
# This performs the job in the same process but that's good enought for
|
||||
# testing the job code. I hope that we can rely on the job worker.
|
||||
ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
|
||||
job.retry_job
|
||||
perform_enqueued_jobs(only: ReportJob)
|
||||
|
||||
expect(job.done?).to eq true
|
||||
expect_csv_report(job)
|
||||
expect(blob.content_stored?).to eq true
|
||||
expect_csv_report
|
||||
end
|
||||
|
||||
def expect_csv_report(job)
|
||||
table = CSV.parse(job.result)
|
||||
def expect_csv_report
|
||||
blob.reload
|
||||
expect(blob.filename.to_s).to eq "report.csv"
|
||||
expect(blob.content_type).to eq "text/csv"
|
||||
|
||||
table = CSV.parse(blob.result)
|
||||
expect(table[0][1]).to eq "Relationship"
|
||||
expect(table[1][1]).to eq "owns"
|
||||
end
|
||||
|
||||
@@ -32,6 +32,31 @@ module Reporting
|
||||
"test@test.com", "Firsty", "Lasty", "Suburbia"
|
||||
]])
|
||||
end
|
||||
|
||||
context "when there are multiple orders for the same customer" do
|
||||
let!(:address) {
|
||||
create(:bill_address, firstname: "Firsty",
|
||||
lastname: "Lasty", city: "Suburbia")
|
||||
}
|
||||
let!(:order1) {
|
||||
create(:order_with_totals_and_distribution, :completed, bill_address: address)
|
||||
}
|
||||
let!(:order2) {
|
||||
create(:order_with_totals_and_distribution, :completed, bill_address: address)
|
||||
}
|
||||
before do
|
||||
[order1, order2].each do |order|
|
||||
order.update!(email: "test@test.com")
|
||||
end
|
||||
end
|
||||
it "returns only one row per customer" do
|
||||
expect(subject.query_result).to match_array [order1]
|
||||
expect(subject.table_rows.size).to eq(1)
|
||||
expect(subject.table_rows).to eq([[
|
||||
"test@test.com", "Firsty", "Lasty", "Suburbia"
|
||||
]])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "addresses report" do
|
||||
@@ -57,6 +82,89 @@ module Reporting
|
||||
o.shipping_method.name
|
||||
]])
|
||||
end
|
||||
|
||||
context "when there are multiple orders for the same customer" do
|
||||
let!(:a) { create(:bill_address) }
|
||||
let!(:d){ create(:distributor_enterprise) }
|
||||
let!(:sm) { create(:shipping_method, distributors: [d]) }
|
||||
let!(:o1) {
|
||||
create(:order_with_totals_and_distribution, :completed, distributor: d, bill_address: a, shipping_method: sm)
|
||||
}
|
||||
let!(:o2) {
|
||||
create(:order_with_totals_and_distribution, :completed, distributor: d, bill_address: a, shipping_method: sm)
|
||||
}
|
||||
before do
|
||||
[o1, o2].each do |order|
|
||||
order.update!(email: "test@test.com")
|
||||
end
|
||||
end
|
||||
|
||||
it "returns only one row per customer" do
|
||||
expect(subject.query_result).to match_array [o1]
|
||||
expect(subject.table_rows.size).to eq(1)
|
||||
expect(subject.table_rows).to eq([[
|
||||
a.firstname, a.lastname,
|
||||
[a.address1, a.address2, a.city].join(" "),
|
||||
o1.email, a.phone, d.name,
|
||||
[d.address.address1, d.address.address2, d.address.city].join(" "),
|
||||
o1.shipping_method.name
|
||||
]])
|
||||
end
|
||||
|
||||
context "orders from different hubs" do
|
||||
let!(:d2) { create(:distributor_enterprise) }
|
||||
let!(:sm2) { create(:shipping_method, distributors: [d2]) }
|
||||
let!(:o2) {
|
||||
create(:order_with_totals_and_distribution, :completed, distributor: d2, bill_address: a, shipping_method: sm2)
|
||||
}
|
||||
|
||||
it "returns one row per customer per hub" do
|
||||
expect(subject.query_result.size).to eq(2)
|
||||
expect(subject.table_rows.size).to eq(2)
|
||||
expect(subject.table_rows).to eq([[
|
||||
a.firstname, a.lastname,
|
||||
[a.address1, a.address2, a.city].join(" "),
|
||||
o1.email, a.phone, d.name,
|
||||
[d.address.address1, d.address.address2, d.address.city].join(" "),
|
||||
o1.shipping_method.name
|
||||
], [
|
||||
a.firstname, a.lastname,
|
||||
[a.address1, a.address2, a.city].join(" "),
|
||||
o2.email, a.phone, d2.name,
|
||||
[d2.address.address1, d2.address.address2, d2.address.city].join(" "),
|
||||
o2.shipping_method.name
|
||||
]])
|
||||
end
|
||||
end
|
||||
|
||||
context "orders with different shipping methods" do
|
||||
let!(:sm2) { create(:shipping_method, distributors: [d]) }
|
||||
let!(:o2) {
|
||||
create(:order_with_totals_and_distribution, :completed, distributor: d, bill_address: a, shipping_method: sm2)
|
||||
}
|
||||
before do
|
||||
o2.select_shipping_method(sm2.id)
|
||||
end
|
||||
|
||||
it "returns one row per customer per shipping method" do
|
||||
expect(subject.query_result.size).to eq(2)
|
||||
expect(subject.table_rows.size).to eq(2)
|
||||
expect(subject.table_rows).to eq([[
|
||||
a.firstname, a.lastname,
|
||||
[a.address1, a.address2, a.city].join(" "),
|
||||
o1.email, a.phone, d.name,
|
||||
[d.address.address1, d.address.address2, d.address.city].join(" "),
|
||||
o1.shipping_method.name
|
||||
], [
|
||||
a.firstname, a.lastname,
|
||||
[a.address1, a.address2, a.city].join(" "),
|
||||
o2.email, a.phone, d.name,
|
||||
[d.address.address1, d.address.address2, d.address.city].join(" "),
|
||||
sm2.name
|
||||
]])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "fetching orders" do
|
||||
|
||||
@@ -2,13 +2,11 @@
|
||||
|
||||
require 'open_food_network/scope_variant_to_hub'
|
||||
|
||||
module Spree
|
||||
class ShipmentPreview < ActionMailer::Preview
|
||||
def shipped
|
||||
shipment =
|
||||
Shipment.where.not(tracking: [nil, ""]).last ||
|
||||
Shipment.last
|
||||
ShipmentMailer.shipped_email(shipment)
|
||||
end
|
||||
class ShipmentPreview < ActionMailer::Preview
|
||||
def shipped
|
||||
shipment =
|
||||
Spree::Shipment.where.not(tracking: [nil, ""]).last ||
|
||||
Spree::Shipment.last
|
||||
Spree::ShipmentMailer.shipped_email(shipment, delivery: true)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -69,4 +69,47 @@ describe Customer, type: :model do
|
||||
expect(c.user).to eq user2
|
||||
end
|
||||
end
|
||||
|
||||
describe 'scopes' do
|
||||
context 'managed_by' do
|
||||
let!(:user) { create(:user) }
|
||||
let!(:enterprise) { create(:enterprise, owner: user) }
|
||||
let!(:customer) { create(:customer, enterprise: enterprise, user: user) }
|
||||
let!(:customer1) { create(:customer, enterprise: enterprise) }
|
||||
|
||||
let!(:user1) { create(:user) }
|
||||
let!(:enterprise1) { create(:enterprise, owner: user1) }
|
||||
let!(:customer2) { create(:customer, enterprise: enterprise1, user: user1) }
|
||||
|
||||
let(:guest) { Spree::User.new }
|
||||
|
||||
context 'with user who has edit profile permission on enterprise via enterprise2' do
|
||||
let!(:user3) { create(:user) }
|
||||
let!(:enterprise2) { create(:enterprise, owner: user3) }
|
||||
|
||||
it 'returns customers managed by the user' do
|
||||
EnterpriseRelationship.create!(parent: enterprise2, child: enterprise,
|
||||
permissions_list: [:edit_profile])
|
||||
expect(Customer.managed_by(user)).to match_array [customer, customer1]
|
||||
expect(Customer.managed_by(user1)).to match_array(customer2)
|
||||
expect(Customer.managed_by(user3)).to match_array([])
|
||||
end
|
||||
end
|
||||
|
||||
it 'returns customers of managed enterprises' do
|
||||
user2 = create(:user)
|
||||
EnterpriseRole.create!(user: user2, enterprise: enterprise)
|
||||
expect(Customer.managed_by(user2)).to match_array [customer, customer1]
|
||||
end
|
||||
|
||||
it 'returns all customers if the user is an admin' do
|
||||
admin = create(:admin_user)
|
||||
expect(Customer.managed_by(admin)).to match_array [customer, customer1, customer2]
|
||||
end
|
||||
|
||||
it 'returns no customers if the user is non-persisted user object' do
|
||||
expect(Customer.managed_by(guest)).to match_array []
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -147,7 +147,7 @@ describe EnterpriseRelationship do
|
||||
end
|
||||
|
||||
describe "callbacks" do
|
||||
context "updating variant override permissions" do
|
||||
describe "updating variant override permissions" do
|
||||
let(:hub) { create(:distributor_enterprise) }
|
||||
let(:producer) { create(:supplier_enterprise) }
|
||||
let(:some_other_producer) { create(:supplier_enterprise) }
|
||||
@@ -255,5 +255,101 @@ describe EnterpriseRelationship do
|
||||
end
|
||||
end
|
||||
end
|
||||
describe "updating order cycles" do
|
||||
let(:hub) { create(:distributor_enterprise) }
|
||||
let(:producer) { create(:supplier_enterprise) }
|
||||
let(:order_cycle) { create(:simple_order_cycle) }
|
||||
let(:some_other_producer) { create(:supplier_enterprise) }
|
||||
|
||||
context "when order_cycle permission is present" do
|
||||
let!(:er) {
|
||||
create(:enterprise_relationship, child: hub, parent: producer,
|
||||
permissions_list: [
|
||||
:add_to_order_cycle,
|
||||
:create_variant_overrides
|
||||
] )
|
||||
}
|
||||
let!(:incoming_external_exchange) {
|
||||
order_cycle.exchanges.create! sender: producer, receiver: hub, incoming: true
|
||||
}
|
||||
let!(:other_external_exchange) {
|
||||
order_cycle.exchanges.create! sender: some_other_producer, receiver: hub, incoming: true
|
||||
}
|
||||
let!(:incoming_internal_exchange) {
|
||||
order_cycle.exchanges.create! sender: hub, receiver: hub, incoming: true
|
||||
}
|
||||
let!(:outgoing_internal_exchange) {
|
||||
order_cycle.exchanges.create! sender: hub, receiver: hub, incoming: false
|
||||
}
|
||||
let!(:variant) { create(:variant) }
|
||||
let!(:some_other_variant) { create(:variant) }
|
||||
let!(:incoming_external_variant) {
|
||||
incoming_external_exchange.exchange_variants.create!(
|
||||
exchange: incoming_external_exchange, variant: variant
|
||||
)
|
||||
}
|
||||
let!(:incoming_internal_only_variant) {
|
||||
incoming_internal_exchange.exchange_variants.create!(
|
||||
exchange: incoming_internal_exchange, variant: some_other_variant
|
||||
)
|
||||
}
|
||||
let!(:outgoing_internal_variant) {
|
||||
outgoing_internal_exchange.exchange_variants.create!(
|
||||
exchange: outgoing_internal_exchange, variant: variant
|
||||
)
|
||||
}
|
||||
let!(:outgoing_internal_only_variant) {
|
||||
outgoing_internal_exchange.exchange_variants.create!(
|
||||
exchange: outgoing_internal_exchange, variant: some_other_variant
|
||||
)
|
||||
}
|
||||
|
||||
# We need to destroy the exchange variants on all order cycles related to the ER if
|
||||
# 'add_to_order_cycle' permission is removed. If they are left on the order cycle, the
|
||||
# Taxons of the variants will still appear on the /shops page, despite the hub not
|
||||
# actually offering the variants anymore.
|
||||
context "removing exchanges and exchange variants" do
|
||||
context "when the enterprise relationship is destroyed" do
|
||||
before { er.destroy }
|
||||
it "should destroy all exchanges and exchange variants related to ER" do
|
||||
expect(Exchange.exists?(incoming_external_exchange.id)).to be false
|
||||
expect(Exchange.exists?(other_external_exchange.id)).to be true
|
||||
expect(ExchangeVariant.exists?(incoming_external_variant.id)).to be false
|
||||
expect(ExchangeVariant.exists?(outgoing_internal_variant.id)).to be false
|
||||
expect(ExchangeVariant.exists?(incoming_internal_only_variant.id)).to be true
|
||||
expect(ExchangeVariant.exists?(outgoing_internal_only_variant.id)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "and is then removed" do
|
||||
before { er.permissions_list = [:create_variant_overrides]; er.save! }
|
||||
it "should destroy all exchanges and exchange variants related to ER" do
|
||||
expect(Exchange.exists?(incoming_external_exchange.id)).to be false
|
||||
expect(Exchange.exists?(other_external_exchange.id)).to be true
|
||||
expect(ExchangeVariant.exists?(incoming_external_variant.id)).to be false
|
||||
expect(ExchangeVariant.exists?(outgoing_internal_variant.id)).to be false
|
||||
expect(ExchangeVariant.exists?(incoming_internal_only_variant.id)).to be true
|
||||
expect(ExchangeVariant.exists?(outgoing_internal_only_variant.id)).to be true
|
||||
end
|
||||
|
||||
it "should not affect other exchanges or order cycles" do
|
||||
expect(Exchange.exists?(outgoing_internal_exchange.id)).to be true
|
||||
end
|
||||
end
|
||||
|
||||
context "and then some other permission is removed" do
|
||||
before { er.permissions_list = [:add_to_order_cycle]; er.save! }
|
||||
it "should have no effect on existing exchanges" do
|
||||
expect(Exchange.exists?(incoming_external_exchange.id)).to be true
|
||||
expect(Exchange.exists?(other_external_exchange.id)).to be true
|
||||
expect(ExchangeVariant.exists?(incoming_external_variant.id)).to be true
|
||||
expect(ExchangeVariant.exists?(outgoing_internal_variant.id)).to be true
|
||||
expect(ExchangeVariant.exists?(incoming_internal_only_variant.id)).to be true
|
||||
expect(ExchangeVariant.exists?(outgoing_internal_only_variant.id)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -37,7 +37,9 @@ describe ProductImport::EntryValidator do
|
||||
enterprise_id: enterprise.id,
|
||||
producer: enterprise,
|
||||
producer_id: enterprise.id,
|
||||
distributor: enterprise
|
||||
distributor: enterprise,
|
||||
price: "1.0",
|
||||
on_hand: "1"
|
||||
)
|
||||
end
|
||||
|
||||
@@ -51,7 +53,9 @@ describe ProductImport::EntryValidator do
|
||||
enterprise_id: enterprise.id,
|
||||
producer: enterprise,
|
||||
producer_id: enterprise.id,
|
||||
distributor: enterprise
|
||||
distributor: enterprise,
|
||||
price: "1.0",
|
||||
on_hand: "1"
|
||||
)
|
||||
end
|
||||
|
||||
@@ -99,7 +103,7 @@ describe ProductImport::EntryValidator do
|
||||
it "validates a product" do
|
||||
entries = [potato_variant]
|
||||
entry_validator.validate_all(entries)
|
||||
expect(potato_variant.errors.count).to eq 1
|
||||
expect(potato_variant.errors.count).to eq 4
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -677,7 +677,7 @@ describe ProductImport::ProductImporter do
|
||||
let(:csv_data) {
|
||||
CSV.generate do |csv|
|
||||
csv << ["name", "display_name", "distributor", "producer", "on_hand", "price", "units"]
|
||||
csv << ["Oats", "Porridge Oats", enterprise2.name, enterprise.name, "900", "", "500"]
|
||||
csv << ["Oats", "Porridge Oats", enterprise2.name, enterprise.name, "900", "1.0", "500"]
|
||||
end
|
||||
}
|
||||
let(:importer) { import_data csv_data, import_into: 'inventories' }
|
||||
@@ -705,7 +705,7 @@ describe ProductImport::ProductImporter do
|
||||
CSV.generate do |csv|
|
||||
csv << ["name", "distributor", "producer", "on_hand", "price", "units",
|
||||
"variant_unit_name"]
|
||||
csv << ["Cabbage", enterprise2.name, enterprise.name, "900", "", "1", "Whole"]
|
||||
csv << ["Cabbage", enterprise2.name, enterprise.name, "900", "1.0", "1", "Whole"]
|
||||
end
|
||||
}
|
||||
let(:importer) { import_data csv_data, import_into: 'inventories' }
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user