mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-12 18:36:49 +00:00
Compare commits
365 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fd8613107 | ||
|
|
bea8c2035f | ||
|
|
e616e32bbc | ||
|
|
19b5a004dd | ||
|
|
4a5a6a2242 | ||
|
|
d1b60e3778 | ||
|
|
31fe8850b5 | ||
|
|
0309a20cb1 | ||
|
|
9d772dbcc9 | ||
|
|
0abcbc7b8f | ||
|
|
3badaa07d2 | ||
|
|
977ab26b00 | ||
|
|
d6160b5759 | ||
|
|
40d4ed2c95 | ||
|
|
72f5b1b251 | ||
|
|
eb2d8e65ed | ||
|
|
355c5f5c55 | ||
|
|
bb3f958dd2 | ||
|
|
b367d4328e | ||
|
|
ed346b3b54 | ||
|
|
290120d015 | ||
|
|
0fd163602d | ||
|
|
4c3a3d5d1a | ||
|
|
9771fd7f13 | ||
|
|
6a61bf7656 | ||
|
|
9754d8d754 | ||
|
|
ce5bcaaa20 | ||
|
|
de22ad0000 | ||
|
|
23706ec1d6 | ||
|
|
c3e0f45f1a | ||
|
|
0a1947ae34 | ||
|
|
b79c568b08 | ||
|
|
e8139d3948 | ||
|
|
5761014205 | ||
|
|
90bf4f312b | ||
|
|
63a9765fea | ||
|
|
5c6cb4840e | ||
|
|
271d1ec103 | ||
|
|
2271a57ffe | ||
|
|
95e048b37f | ||
|
|
99ca0adf64 | ||
|
|
a8207128df | ||
|
|
47bde1e77c | ||
|
|
0edeb82c32 | ||
|
|
acf984699e | ||
|
|
70e2fb759c | ||
|
|
74252e9d13 | ||
|
|
78fbac8ff2 | ||
|
|
4e22787386 | ||
|
|
f6c85af4da | ||
|
|
1123e08a98 | ||
|
|
3a2802f5aa | ||
|
|
766b7449d8 | ||
|
|
2caa559869 | ||
|
|
04feccaef3 | ||
|
|
dfc31b9338 | ||
|
|
2ccb7c3eb0 | ||
|
|
f92d05656c | ||
|
|
1e2c092b70 | ||
|
|
6e626447d0 | ||
|
|
f14bb280c1 | ||
|
|
f093656c6b | ||
|
|
dd86e00913 | ||
|
|
b2309f8673 | ||
|
|
5404efcbce | ||
|
|
d8acf90240 | ||
|
|
6cc296926c | ||
|
|
6e1dd78e9f | ||
|
|
6e39ab779c | ||
|
|
8792ec1de3 | ||
|
|
b91f1578c9 | ||
|
|
9b91c490cb | ||
|
|
e8ba44f958 | ||
|
|
800ac0cabf | ||
|
|
9ef59f440b | ||
|
|
61c14cb61d | ||
|
|
467fa7e566 | ||
|
|
ef48187332 | ||
|
|
425901fa7a | ||
|
|
6e57e1ad56 | ||
|
|
6b4a518371 | ||
|
|
e6ab2ae753 | ||
|
|
c97fc45109 | ||
|
|
1d44d463e7 | ||
|
|
13b72154fa | ||
|
|
619e13ccba | ||
|
|
bc66c10a52 | ||
|
|
06e77372be | ||
|
|
e615674541 | ||
|
|
327d6c43d9 | ||
|
|
cc7363d9e7 | ||
|
|
ff82a1b73f | ||
|
|
b025d5a600 | ||
|
|
2aa6c70dc6 | ||
|
|
d052a7b796 | ||
|
|
9d1e12da68 | ||
|
|
aae0a6533a | ||
|
|
7c498a573c | ||
|
|
86afa6f413 | ||
|
|
ca9898839a | ||
|
|
f31d790714 | ||
|
|
0f29806198 | ||
|
|
c0f9f8c8bf | ||
|
|
a2ae78bde9 | ||
|
|
26ca374a76 | ||
|
|
40e065eada | ||
|
|
f7ee6ce6c5 | ||
|
|
85e9819c3b | ||
|
|
1ea06763f8 | ||
|
|
5064769717 | ||
|
|
581a246b4f | ||
|
|
bee7990c60 | ||
|
|
27404872de | ||
|
|
1e9b11d209 | ||
|
|
df465cf45b | ||
|
|
f524560624 | ||
|
|
7af47df570 | ||
|
|
18cb0e0980 | ||
|
|
354b76205e | ||
|
|
fbc7eea1a5 | ||
|
|
0359d103b2 | ||
|
|
1400b3667b | ||
|
|
e739c5185e | ||
|
|
2136eecd09 | ||
|
|
9e9e0d0bd8 | ||
|
|
da4abf6617 | ||
|
|
ad00971ca8 | ||
|
|
54cb479fa1 | ||
|
|
e9787552c8 | ||
|
|
bea472623d | ||
|
|
84178c637e | ||
|
|
9bf58a8258 | ||
|
|
c923edd3bb | ||
|
|
bcaa308ac8 | ||
|
|
fe0c04b650 | ||
|
|
4375a34ef8 | ||
|
|
07005594ff | ||
|
|
ac5882e3e6 | ||
|
|
9cbcf14485 | ||
|
|
c3f99050fd | ||
|
|
26eee4631f | ||
|
|
734fce5ce7 | ||
|
|
e80337a458 | ||
|
|
51de5269dc | ||
|
|
e99f0dc6b7 | ||
|
|
d8a96c9d34 | ||
|
|
555a74c9e6 | ||
|
|
be3a10b2b1 | ||
|
|
275a864e51 | ||
|
|
61453968dd | ||
|
|
8263e2e373 | ||
|
|
aff8933d25 | ||
|
|
d4570240ae | ||
|
|
d0a7f8e1af | ||
|
|
d673f278ce | ||
|
|
a002ec1894 | ||
|
|
ecc58cedd9 | ||
|
|
27ace50eb7 | ||
|
|
4df81f0864 | ||
|
|
95a9ca7775 | ||
|
|
d6a5ad70a8 | ||
|
|
a2ebc614d9 | ||
|
|
10b07aabd9 | ||
|
|
5738ec0542 | ||
|
|
c6bb756531 | ||
|
|
8b04e45ea5 | ||
|
|
f1a3814c0d | ||
|
|
8e84754f35 | ||
|
|
81710a2704 | ||
|
|
1af4bf6994 | ||
|
|
3217b3ba86 | ||
|
|
16b9c8c814 | ||
|
|
79aadf5c86 | ||
|
|
ec0d06af54 | ||
|
|
b23b707b5d | ||
|
|
1bf946d124 | ||
|
|
5266d95910 | ||
|
|
df22ad46d6 | ||
|
|
227892b629 | ||
|
|
ffc98c63fa | ||
|
|
add7bb489f | ||
|
|
702669e61c | ||
|
|
cc317bc8c9 | ||
|
|
752d9e9bb8 | ||
|
|
d93c1684b9 | ||
|
|
603991996f | ||
|
|
32d45f6fe5 | ||
|
|
8f4395a6ea | ||
|
|
1b31b727c7 | ||
|
|
97f551a2dd | ||
|
|
357037e429 | ||
|
|
e6943ce554 | ||
|
|
4d9fbb68d6 | ||
|
|
813459ee38 | ||
|
|
c0f72f89f2 | ||
|
|
0f0a704147 | ||
|
|
f2b28a198d | ||
|
|
f2fd426c4a | ||
|
|
1c026479f5 | ||
|
|
73b1b1f172 | ||
|
|
59da07de66 | ||
|
|
26ed601996 | ||
|
|
6ca6938df4 | ||
|
|
abc132d3db | ||
|
|
b16f486dcc | ||
|
|
6cc91d457e | ||
|
|
438aef1e7a | ||
|
|
c8b738cbd5 | ||
|
|
6419036a26 | ||
|
|
3dc9548fb3 | ||
|
|
daa3f00302 | ||
|
|
77c920daab | ||
|
|
d3296dd5ee | ||
|
|
48efb42b1a | ||
|
|
e445fc33a1 | ||
|
|
aadbc9ed5d | ||
|
|
9b5875a7d1 | ||
|
|
7ba8c5ace1 | ||
|
|
8d7b383b72 | ||
|
|
4d6920bd92 | ||
|
|
426c536750 | ||
|
|
9be199a6cc | ||
|
|
bb178c71b2 | ||
|
|
d43a3ac65e | ||
|
|
19c7d11df5 | ||
|
|
eb2e894802 | ||
|
|
62a3b6b720 | ||
|
|
152e432f78 | ||
|
|
89906f581d | ||
|
|
001d40d691 | ||
|
|
f31a1ff59c | ||
|
|
dd5e679f69 | ||
|
|
efacca6292 | ||
|
|
2605c4249b | ||
|
|
3599cb2047 | ||
|
|
8fac1bc9ca | ||
|
|
7f1797de58 | ||
|
|
bf3150ddc8 | ||
|
|
1666ffb191 | ||
|
|
144811268e | ||
|
|
d2e52f3136 | ||
|
|
046c5f6585 | ||
|
|
97f00153ad | ||
|
|
643a82c73c | ||
|
|
a3ea4b757d | ||
|
|
1167a1a9bb | ||
|
|
20f610fbee | ||
|
|
d5744572f7 | ||
|
|
23ff9d6fbb | ||
|
|
10849504c3 | ||
|
|
2452202e92 | ||
|
|
96839a03aa | ||
|
|
4ee30d7cac | ||
|
|
7e75581da6 | ||
|
|
c8dd841c48 | ||
|
|
2ea026ea31 | ||
|
|
70afcee3fc | ||
|
|
3a64cc426a | ||
|
|
a8af3a27b1 | ||
|
|
42658b5255 | ||
|
|
66dbd85eb4 | ||
|
|
3435d5ac97 | ||
|
|
dbc7632c4e | ||
|
|
646f48f0af | ||
|
|
f66538d2cb | ||
|
|
55f160c309 | ||
|
|
5835a0ee3a | ||
|
|
e96d9c1f45 | ||
|
|
5162964936 | ||
|
|
d12495f3db | ||
|
|
c6cd695b3c | ||
|
|
c4d7899a99 | ||
|
|
60870a1215 | ||
|
|
63a080266e | ||
|
|
ebf9be41bb | ||
|
|
95ffff5087 | ||
|
|
03bb1f053a | ||
|
|
2e3702550d | ||
|
|
56b83b6bb5 | ||
|
|
e367cbd1e6 | ||
|
|
bdf9c1e405 | ||
|
|
2070cfd5bb | ||
|
|
8001e63f77 | ||
|
|
aed384183b | ||
|
|
e453b130e4 | ||
|
|
7e355a3248 | ||
|
|
a8a81f8023 | ||
|
|
d4c48e2b94 | ||
|
|
872cfcfc58 | ||
|
|
5b3fbe0aed | ||
|
|
ebeeeb7ed3 | ||
|
|
a929d82580 | ||
|
|
1f39731068 | ||
|
|
d2f0d96174 | ||
|
|
7218bb0c7d | ||
|
|
58da11fde7 | ||
|
|
2c65cea911 | ||
|
|
95698fac37 | ||
|
|
7b30008e8b | ||
|
|
50e6ce92b3 | ||
|
|
a78d615936 | ||
|
|
cd8355ea66 | ||
|
|
724a88344e | ||
|
|
9a09f420c1 | ||
|
|
12a5a266fd | ||
|
|
efeda61e40 | ||
|
|
38c5a9e105 | ||
|
|
89e5221dc5 | ||
|
|
c75341838e | ||
|
|
84d7538b1b | ||
|
|
388d575cc8 | ||
|
|
fdd21d7d7d | ||
|
|
ab67a4f80c | ||
|
|
cf64d3a290 | ||
|
|
55d52b875f | ||
|
|
5afb862ce1 | ||
|
|
6389fdb16e | ||
|
|
01ab974a3b | ||
|
|
7a9f9a5624 | ||
|
|
683794636b | ||
|
|
2f4648342f | ||
|
|
562f397b22 | ||
|
|
8fbbb0bb64 | ||
|
|
d8b748a851 | ||
|
|
d49068ce66 | ||
|
|
cf6138da66 | ||
|
|
3fb6193098 | ||
|
|
861726200c | ||
|
|
48910aeb77 | ||
|
|
6d9a518616 | ||
|
|
322c4d0f3f | ||
|
|
eafaa97b0e | ||
|
|
31d0d4bcae | ||
|
|
9935df9f2d | ||
|
|
0ad8dcc2c5 | ||
|
|
a01f601363 | ||
|
|
34de219233 | ||
|
|
e1ea5dbcb3 | ||
|
|
abacd06f6b | ||
|
|
06aa56164f | ||
|
|
5648b2e281 | ||
|
|
2f562809c0 | ||
|
|
eda9293619 | ||
|
|
26c511d47e | ||
|
|
1199a356c4 | ||
|
|
c40697cf61 | ||
|
|
ba50491c6d | ||
|
|
34207fc20f | ||
|
|
e12e50aa84 | ||
|
|
20fd3c2642 | ||
|
|
4694f1b21a | ||
|
|
e53913756c | ||
|
|
774b3720d5 | ||
|
|
13ecf0ec73 | ||
|
|
fb20f220c0 | ||
|
|
0a1cb71ee4 | ||
|
|
bc530b92b5 | ||
|
|
2acf61fd0f | ||
|
|
1e8543dfe7 | ||
|
|
22c0693beb | ||
|
|
d1725014c4 | ||
|
|
0fd66f9a55 | ||
|
|
b783118700 | ||
|
|
84d973d383 | ||
|
|
0e711832fd |
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -23,10 +23,6 @@ The categories are based on https://keepachangelog.com/en/1.0.0/. -->
|
||||
|
||||
Changelog Category: Added | Changed | Deprecated | Removed | Fixed | Security
|
||||
|
||||
#### How is this related to the Spree upgrade?
|
||||
<!-- Any known conflicts with the Spree Upgrade?
|
||||
Explain them or remove this section. -->
|
||||
|
||||
|
||||
|
||||
#### Discourse thread
|
||||
|
||||
@@ -108,7 +108,6 @@ Layout/LineLength:
|
||||
- lib/open_food_network/scope_variants_for_search.rb
|
||||
- lib/open_food_network/variant_and_line_item_naming.rb
|
||||
- lib/open_food_network/xero_invoices_report.rb
|
||||
- lib/spree/core/controller_helpers/respond_with_decorator.rb
|
||||
- lib/spree/localized_number.rb
|
||||
- lib/spree/product_filters.rb
|
||||
- lib/tasks/data.rake
|
||||
@@ -322,6 +321,15 @@ Layout/LineLength:
|
||||
- spec/support/request/shop_workflow.rb
|
||||
- spec/support/request/web_helper.rb
|
||||
- spec/support/seeds.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
|
||||
- spec/controllers/base_controller2_spec.rb
|
||||
- spec/features/consumer/caching/darkswarm_caching_spec.rb
|
||||
- spec/models/calculator/flexi_rate_spec.rb
|
||||
- spec/models/calculator/price_sack_spec.rb
|
||||
- spec/models/spree/stock_item_spec.rb
|
||||
- spec/requests/api/orders_spec.rb
|
||||
- spec/swagger_helper.rb
|
||||
- spec/views/spree/admin/payment_methods/index.html.haml_spec.rb
|
||||
|
||||
Metrics/AbcSize:
|
||||
Max: 15
|
||||
@@ -400,6 +408,7 @@ Metrics/AbcSize:
|
||||
- app/services/create_order_cycle.rb
|
||||
- app/services/order_cycle_form.rb
|
||||
- app/services/order_syncer.rb
|
||||
- engines/order_management/app/services/order_management/order/updater.rb
|
||||
- engines/order_management/app/services/order_management/stock/estimator.rb
|
||||
- engines/order_management/app/services/order_management/stock/package.rb
|
||||
- engines/order_management/app/services/order_management/stock/packer.rb
|
||||
@@ -427,7 +436,9 @@ Metrics/AbcSize:
|
||||
- lib/open_food_network/variant_and_line_item_naming.rb
|
||||
- lib/open_food_network/xero_invoices_report.rb
|
||||
- lib/spree/api/controller_setup.rb
|
||||
- lib/spree/core/controller_helpers/respond_with_decorator.rb
|
||||
- lib/spree/core/controller_helpers/order.rb
|
||||
- lib/spree/core/controller_helpers/respond_with.rb
|
||||
- lib/spree/core/controller_helpers/ssl.rb
|
||||
- lib/spree/localized_number.rb
|
||||
- lib/stripe/account_connector.rb
|
||||
- lib/tasks/enterprises.rake
|
||||
@@ -443,6 +454,11 @@ Metrics/AbcSize:
|
||||
- spec/models/product_importer_spec.rb
|
||||
- spec/services/order_checkout_restart_spec.rb
|
||||
- spec/support/performance_helper.rb
|
||||
- app/controllers/application_controller.rb
|
||||
- app/models/spree/order/checkout.rb
|
||||
- app/models/spree/payment/processing.rb
|
||||
- app/models/spree/payment.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
|
||||
|
||||
Metrics/BlockLength:
|
||||
Max: 25
|
||||
@@ -461,6 +477,8 @@ Metrics/BlockLength:
|
||||
]
|
||||
Exclude:
|
||||
- app/models/spree/shipment.rb
|
||||
- lib/spree/core/controller_helpers/common.rb
|
||||
- lib/spree/core/controller_helpers/ssl.rb
|
||||
- lib/tasks/data.rake
|
||||
- spec/controllers/spree/admin/invoices_controller_spec.rb
|
||||
- spec/factories/enterprise_factory.rb
|
||||
@@ -479,6 +497,10 @@ Metrics/BlockLength:
|
||||
- spec/support/delayed_job_helper.rb
|
||||
- spec/support/matchers/select2_matchers.rb
|
||||
- spec/support/matchers/table_matchers.rb
|
||||
- app/models/spree/order/checkout.rb
|
||||
- app/models/spree/payment/processing.rb
|
||||
- spec/requests/api/orders_spec.rb
|
||||
- spec/swagger_helper.rb
|
||||
|
||||
Metrics/CyclomaticComplexity:
|
||||
Max: 6
|
||||
@@ -505,10 +527,14 @@ Metrics/CyclomaticComplexity:
|
||||
- lib/discourse/single_sign_on.rb
|
||||
- lib/open_food_network/bulk_coop_report.rb
|
||||
- lib/open_food_network/enterprise_issue_validator.rb
|
||||
- lib/spree/core/controller_helpers/order_decorator.rb
|
||||
- lib/spree/core/controller_helpers/respond_with_decorator.rb
|
||||
- lib/spree/core/controller_helpers/order.rb
|
||||
- lib/spree/core/controller_helpers/respond_with.rb
|
||||
- lib/spree/core/controller_helpers/ssl.rb
|
||||
- lib/spree/localized_number.rb
|
||||
- spec/models/product_importer_spec.rb
|
||||
- app/models/spree/order/checkout.rb
|
||||
- app/models/spree/payment.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
|
||||
|
||||
Metrics/PerceivedComplexity:
|
||||
Max: 7
|
||||
@@ -530,10 +556,13 @@ Metrics/PerceivedComplexity:
|
||||
- lib/discourse/single_sign_on.rb
|
||||
- lib/open_food_network/bulk_coop_report.rb
|
||||
- lib/open_food_network/enterprise_issue_validator.rb
|
||||
- lib/spree/core/controller_helpers/order_decorator.rb
|
||||
- lib/spree/core/controller_helpers/respond_with_decorator.rb
|
||||
- lib/spree/core/controller_helpers/order.rb
|
||||
- lib/spree/core/controller_helpers/respond_with.rb
|
||||
- lib/spree/core/controller_helpers/ssl.rb
|
||||
- lib/spree/localized_number.rb
|
||||
- spec/models/product_importer_spec.rb
|
||||
- app/models/spree/order/checkout.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
|
||||
|
||||
Metrics/MethodLength:
|
||||
Max: 10
|
||||
@@ -596,6 +625,7 @@ Metrics/MethodLength:
|
||||
- app/serializers/api/cached_enterprise_serializer.rb
|
||||
- app/services/order_cycle_form.rb
|
||||
- app/services/permitted_attributes/checkout.rb
|
||||
- engines/order_management/app/services/order_management/order/updater.rb
|
||||
- engines/order_management/app/services/order_management/reports/enterprise_fee_summary/scope.rb
|
||||
- engines/order_management/app/services/order_management/stock/estimator.rb
|
||||
- engines/order_management/app/services/order_management/stock/package.rb
|
||||
@@ -626,7 +656,10 @@ Metrics/MethodLength:
|
||||
- lib/open_food_network/users_and_enterprises_report.rb
|
||||
- lib/open_food_network/xero_invoices_report.rb
|
||||
- lib/spree/api/controller_setup.rb
|
||||
- lib/spree/core/controller_helpers/respond_with_decorator.rb
|
||||
- lib/spree/core/controller_helpers/auth.rb
|
||||
- lib/spree/core/controller_helpers/order.rb
|
||||
- lib/spree/core/controller_helpers/respond_with.rb
|
||||
- lib/spree/core/controller_helpers/ssl.rb
|
||||
- lib/spree/localized_number.rb
|
||||
- lib/stripe/profile_storer.rb
|
||||
- lib/tasks/data/truncate_data.rb
|
||||
@@ -636,7 +669,12 @@ Metrics/MethodLength:
|
||||
- spec/features/consumer/shopping/checkout_paypal_spec.rb
|
||||
- spec/features/consumer/shopping/variant_overrides_spec.rb
|
||||
- spec/models/product_importer_spec.rb
|
||||
- spec/support/request/authentication_workflow.rb
|
||||
- spec/support/request/authentication_helper.rb
|
||||
- app/models/spree/order/checkout.rb
|
||||
- app/models/spree/payment/processing.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_allocation_report.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_supplier_report.rb
|
||||
|
||||
Metrics/ClassLength:
|
||||
Max: 100
|
||||
@@ -666,6 +704,7 @@ Metrics/ClassLength:
|
||||
- app/serializers/api/cached_enterprise_serializer.rb
|
||||
- app/serializers/api/enterprise_shopfront_serializer.rb
|
||||
- app/services/cart_service.rb
|
||||
- engines/order_management/app/services/order_management/order/updater.rb
|
||||
- engines/order_management/app/services/order_management/reports/enterprise_fee_summary/scope.rb
|
||||
- lib/active_merchant/billing/gateways/stripe_payment_intents.rb
|
||||
- lib/open_food_network/bulk_coop_report.rb
|
||||
@@ -678,6 +717,8 @@ Metrics/ClassLength:
|
||||
- lib/open_food_network/permissions.rb
|
||||
- lib/open_food_network/users_and_enterprises_report.rb
|
||||
- lib/open_food_network/xero_invoices_report.rb
|
||||
- app/models/spree/payment.rb
|
||||
- engines/order_management/app/services/order_management/reports/bulk_coop/bulk_coop_report.rb
|
||||
|
||||
Metrics/ModuleLength:
|
||||
Max: 100
|
||||
@@ -686,6 +727,7 @@ Metrics/ModuleLength:
|
||||
- app/helpers/injection_helper.rb
|
||||
- app/helpers/spree/admin/base_helper.rb
|
||||
- app/helpers/spree/admin/navigation_helper.rb
|
||||
- engines/order_management/spec/services/order_management/order/updater_spec.rb
|
||||
- engines/order_management/spec/services/order_management/stock/package_spec.rb
|
||||
- engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb
|
||||
- engines/order_management/spec/services/order_management/subscriptions/form_spec.rb
|
||||
@@ -720,6 +762,8 @@ Metrics/ModuleLength:
|
||||
- spec/models/spree/variant_spec.rb
|
||||
- spec/services/permissions/order_spec.rb
|
||||
- spec/support/request/web_helper.rb
|
||||
- app/models/spree/order/checkout.rb
|
||||
- app/models/spree/payment/processing.rb
|
||||
|
||||
Metrics/ParameterLists:
|
||||
Max: 5
|
||||
@@ -728,3 +772,8 @@ Metrics/ParameterLists:
|
||||
- app/models/product_import/entry_processor.rb
|
||||
- lib/open_food_network/xero_invoices_report.rb
|
||||
- spec/features/admin/reports_spec.rb
|
||||
|
||||
Lint/UselessAssignment:
|
||||
Exclude:
|
||||
- 'spec/**/*'
|
||||
- 'lib/spree/core/controller_helpers/common.rb'
|
||||
|
||||
@@ -1,79 +1,214 @@
|
||||
# This configuration was generated by
|
||||
# `rubocop --auto-gen-config --exclude-limit 1400`
|
||||
# on 2020-06-22 13:28:10 +0100 using RuboCop version 0.81.0.
|
||||
# on 2020-08-13 16:05:53 +1000 using RuboCop version 0.81.0.
|
||||
# The point is for the user to remove these configuration records
|
||||
# one by one as the offenses are removed from the code base.
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
# versions of RuboCop, may require this file to be generated again.
|
||||
|
||||
# Offense count: 139
|
||||
# Offense count: 2
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
||||
# SupportedStyles: with_first_argument, with_fixed_indentation
|
||||
Layout/ArgumentAlignment:
|
||||
Exclude:
|
||||
- 'spec/models/spree/order/checkout_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleAlignWith.
|
||||
# SupportedStylesAlignWith: either, start_of_block, start_of_line
|
||||
Layout/BlockAlignment:
|
||||
Exclude:
|
||||
- 'spec/models/spree/order/checkout_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# Cop supports --auto-correct.
|
||||
Layout/EmptyLines:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: empty_lines, no_empty_lines
|
||||
Layout/EmptyLinesAroundBlockBody:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment.
|
||||
Layout/ExtraSpacing:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
- 'spec/requests/api/orders_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
||||
# SupportedStyles: special_inside_parentheses, consistent, align_brackets
|
||||
Layout/FirstArrayElementIndentation:
|
||||
Exclude:
|
||||
- 'spec/views/spree/admin/payment_methods/index.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
||||
# SupportedStyles: special_inside_parentheses, consistent, align_braces
|
||||
Layout/FirstHashElementIndentation:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
- 'spec/swagger_helper.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
|
||||
# SupportedHashRocketStyles: key, separator, table
|
||||
# SupportedColonStyles: key, separator, table
|
||||
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
|
||||
Layout/HashAlignment:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: normal, indented_internal_methods
|
||||
Layout/IndentationConsistency:
|
||||
Exclude:
|
||||
- 'spec/models/spree/order/checkout_spec.rb'
|
||||
|
||||
# Offense count: 26
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
||||
# URISchemes: http, https
|
||||
Layout/LineLength:
|
||||
Max: 268
|
||||
Max: 409
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: symmetrical, new_line, same_line
|
||||
Layout/MultilineHashBraceLayout:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator.
|
||||
# SupportedStylesForExponentOperator: space, no_space
|
||||
Layout/SpaceAroundOperators:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
|
||||
# SupportedStyles: space, no_space
|
||||
# SupportedStylesForEmptyBraces: space, no_space
|
||||
Layout/SpaceInsideBlockBraces:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 11
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces.
|
||||
# SupportedStyles: space, no_space, compact
|
||||
# SupportedStylesForEmptyBraces: space, no_space
|
||||
Layout/SpaceInsideHashLiteralBraces:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
- 'spec/requests/api/orders_spec.rb'
|
||||
- 'spec/services/checkout/form_data_adapter_spec.rb'
|
||||
- 'spec/services/user_locale_setter_spec.rb'
|
||||
|
||||
# Offense count: 6
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowInHeredoc.
|
||||
Layout/TrailingWhitespace:
|
||||
Exclude:
|
||||
- 'spec/controllers/base_controller2_spec.rb'
|
||||
- 'spec/features/consumer/shopping/shopping_spec.rb'
|
||||
- 'spec/requests/api/orders_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
Lint/DuplicateMethods:
|
||||
Exclude:
|
||||
- 'lib/discourse/single_sign_on.rb'
|
||||
|
||||
# Offense count: 9
|
||||
# Offense count: 8
|
||||
Lint/IneffectiveAccessModifier:
|
||||
Exclude:
|
||||
- 'app/models/column_preference.rb'
|
||||
- 'app/models/spree/user.rb'
|
||||
- 'app/services/mail_configuration.rb'
|
||||
- 'lib/open_food_network/feature_toggle.rb'
|
||||
- 'spec/lib/open_food_network/reports/report_spec.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods.
|
||||
Lint/UnusedMethodArgument:
|
||||
Exclude:
|
||||
- 'spec/views/spree/admin/payment_methods/index.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# Configuration parameters: ContextCreatingMethods, MethodCreatingMethods.
|
||||
Lint/UselessAccessModifier:
|
||||
Exclude:
|
||||
- 'app/models/column_preference.rb'
|
||||
- 'app/services/mail_configuration.rb'
|
||||
- 'lib/open_food_network/feature_toggle.rb'
|
||||
- 'lib/open_food_network/reports/bulk_coop_report.rb'
|
||||
- 'spec/lib/open_food_network/reports/report_spec.rb'
|
||||
|
||||
# Offense count: 6
|
||||
# Configuration parameters: IgnoredMethods.
|
||||
Metrics/AbcSize:
|
||||
Max: 37
|
||||
|
||||
# Offense count: 1
|
||||
Lint/UselessAssignment:
|
||||
Exclude:
|
||||
- 'spec/**/*'
|
||||
- 'lib/spree/core/controller_helpers/common.rb'
|
||||
|
||||
# Offense count: 19
|
||||
# Configuration parameters: IgnoredMethods.
|
||||
Metrics/AbcSize:
|
||||
Max: 126
|
||||
|
||||
# Offense count: 7
|
||||
# Configuration parameters: CountComments, ExcludedMethods.
|
||||
# ExcludedMethods: refine
|
||||
Metrics/BlockLength:
|
||||
Max: 27
|
||||
Max: 102
|
||||
|
||||
# Offense count: 1
|
||||
# Offense count: 2
|
||||
# Configuration parameters: CountComments.
|
||||
Metrics/ClassLength:
|
||||
Max: 101
|
||||
Max: 231
|
||||
|
||||
# Offense count: 1
|
||||
# Offense count: 3
|
||||
# Configuration parameters: IgnoredMethods.
|
||||
Metrics/CyclomaticComplexity:
|
||||
Max: 7
|
||||
Max: 23
|
||||
|
||||
# Offense count: 6
|
||||
# Offense count: 19
|
||||
# Configuration parameters: CountComments, ExcludedMethods.
|
||||
Metrics/MethodLength:
|
||||
Max: 20
|
||||
Max: 140
|
||||
|
||||
# Offense count: 1
|
||||
# Offense count: 2
|
||||
# Configuration parameters: CountComments.
|
||||
Metrics/ModuleLength:
|
||||
Max: 121
|
||||
Max: 208
|
||||
|
||||
# Offense count: 8
|
||||
# Offense count: 2
|
||||
# Configuration parameters: IgnoredMethods.
|
||||
Metrics/PerceivedComplexity:
|
||||
Max: 24
|
||||
|
||||
# Offense count: 9
|
||||
Naming/AccessorMethodName:
|
||||
Exclude:
|
||||
- 'app/controllers/spree/admin/taxonomies_controller.rb'
|
||||
- 'app/models/spree/adjustment_decorator.rb'
|
||||
- 'app/models/spree/order_decorator.rb'
|
||||
- 'lib/spree/core/controller_helpers/common.rb'
|
||||
- 'spec/support/request/shop_workflow.rb'
|
||||
- 'spec/support/request/web_helper.rb'
|
||||
|
||||
@@ -117,6 +252,15 @@ Naming/PredicateName:
|
||||
- 'lib/open_food_network/packing_report.rb'
|
||||
- 'lib/tasks/data.rake'
|
||||
|
||||
# Offense count: 7
|
||||
# Cop supports --auto-correct.
|
||||
Rails/ActiveRecordAliases:
|
||||
Exclude:
|
||||
- 'spec/controllers/line_items_controller_spec.rb'
|
||||
- 'spec/controllers/spree/orders_controller_spec.rb'
|
||||
- 'spec/features/consumer/shopping/orders_spec.rb'
|
||||
- 'spec/requests/api/orders_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: strict, flexible
|
||||
@@ -124,6 +268,13 @@ Rails/Date:
|
||||
Exclude:
|
||||
- 'app/models/order_cycle.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforceForPrefixed.
|
||||
Rails/Delegate:
|
||||
Exclude:
|
||||
- 'engines/order_management/app/services/order_management/reports/bulk_coop/renderers/html_renderer.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: Whitelist.
|
||||
@@ -150,7 +301,7 @@ Rails/FilePath:
|
||||
- 'spec/serializers/api/admin/enterprise_serializer_spec.rb'
|
||||
- 'spec/support/downloads_helper.rb'
|
||||
|
||||
# Offense count: 7
|
||||
# Offense count: 9
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/models/**/*.rb
|
||||
@@ -160,15 +311,17 @@ Rails/FindBy:
|
||||
- 'app/models/product_import/entry_processor.rb'
|
||||
- 'app/models/product_import/entry_validator.rb'
|
||||
- 'app/models/product_import/spreadsheet_data.rb'
|
||||
- 'app/models/spree/shipment.rb'
|
||||
- 'app/models/spree/user.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Offense count: 2
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/models/**/*.rb
|
||||
Rails/FindEach:
|
||||
Exclude:
|
||||
- 'app/models/spree/order_decorator.rb'
|
||||
- 'app/models/spree/shipment.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# Configuration parameters: Include.
|
||||
@@ -180,7 +333,7 @@ Rails/HasAndBelongsToMany:
|
||||
- 'app/models/spree/concerns/payment_method_distributors.rb'
|
||||
- 'app/models/spree/line_item_decorator.rb'
|
||||
|
||||
# Offense count: 25
|
||||
# Offense count: 26
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/models/**/*.rb
|
||||
Rails/HasManyOrHasOneDependent:
|
||||
@@ -192,6 +345,7 @@ Rails/HasManyOrHasOneDependent:
|
||||
- 'app/models/spree/order_decorator.rb'
|
||||
- 'app/models/spree/payment_method_decorator.rb'
|
||||
- 'app/models/spree/property.rb'
|
||||
- 'app/models/spree/shipment.rb'
|
||||
- 'app/models/spree/shipping_method_decorator.rb'
|
||||
- 'app/models/spree/user.rb'
|
||||
- 'app/models/spree/variant_decorator.rb'
|
||||
@@ -268,7 +422,7 @@ Rails/ReflectionClassName:
|
||||
- 'app/models/enterprise_role.rb'
|
||||
- 'app/models/subscription.rb'
|
||||
|
||||
# Offense count: 227
|
||||
# Offense count: 233
|
||||
# Configuration parameters: Blacklist, Whitelist.
|
||||
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
|
||||
Rails/SkipsModelValidations:
|
||||
@@ -287,7 +441,8 @@ Rails/SkipsModelValidations:
|
||||
- 'app/models/spree/address_decorator.rb'
|
||||
- 'app/models/spree/credit_card_decorator.rb'
|
||||
- 'app/models/spree/order_decorator.rb'
|
||||
- 'app/models/spree/payment_decorator.rb'
|
||||
- 'app/models/spree/payment.rb'
|
||||
- 'app/models/spree/shipment.rb'
|
||||
- 'app/models/spree/shipping_method_decorator.rb'
|
||||
- 'app/models/subscription.rb'
|
||||
- 'app/models/variant_override.rb'
|
||||
@@ -355,20 +510,22 @@ Rails/SkipsModelValidations:
|
||||
- 'spec/support/request/shop_workflow.rb'
|
||||
- 'spec/views/spree/shared/_order_details.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# Offense count: 3
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/models/**/*.rb
|
||||
Rails/UniqueValidationWithoutIndex:
|
||||
Exclude:
|
||||
- 'app/models/customer.rb'
|
||||
- 'app/models/exchange.rb'
|
||||
- 'app/models/spree/stock_item.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Offense count: 2
|
||||
# Configuration parameters: Environments.
|
||||
# Environments: development, test, production
|
||||
Rails/UnknownEnv:
|
||||
Exclude:
|
||||
- 'app/models/spree/app_configuration_decorator.rb'
|
||||
- 'lib/spree/core/controller_helpers/ssl.rb'
|
||||
|
||||
# Offense count: 2
|
||||
Style/CaseEquality:
|
||||
@@ -376,7 +533,7 @@ Style/CaseEquality:
|
||||
- 'app/helpers/angular_form_helper.rb'
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 75
|
||||
# Offense count: 71
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AutoCorrect, EnforcedStyle.
|
||||
# SupportedStyles: nested, compact
|
||||
@@ -440,20 +597,10 @@ Style/ClassAndModuleChildren:
|
||||
- 'app/serializers/api/property_serializer.rb'
|
||||
- 'app/serializers/api/shipping_method_serializer.rb'
|
||||
- 'app/serializers/api/state_serializer.rb'
|
||||
- 'app/serializers/api/taxon_image_serializer.rb'
|
||||
- 'app/serializers/api/taxon_serializer.rb'
|
||||
- 'app/serializers/api/variant_serializer.rb'
|
||||
- 'lib/open_food_network/locking.rb'
|
||||
- 'lib/open_food_network/reports/bulk_coop_allocation_report.rb'
|
||||
- 'lib/open_food_network/reports/bulk_coop_report.rb'
|
||||
- 'lib/open_food_network/reports/bulk_coop_supplier_report.rb'
|
||||
- 'lib/open_food_network/reports/report.rb'
|
||||
- 'lib/open_food_network/reports/row.rb'
|
||||
- 'lib/open_food_network/reports/rule.rb'
|
||||
- 'spec/controllers/spree/admin/base_controller_spec.rb'
|
||||
- 'spec/lib/open_food_network/reports/report_spec.rb'
|
||||
- 'spec/lib/open_food_network/reports/row_spec.rb'
|
||||
- 'spec/lib/open_food_network/reports/rule_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
Style/ClassVars:
|
||||
@@ -468,7 +615,7 @@ Style/FormatStringToken:
|
||||
- 'lib/open_food_network/sales_tax_report.rb'
|
||||
- 'spec/features/admin/bulk_order_management_spec.rb'
|
||||
|
||||
# Offense count: 874
|
||||
# Offense count: 847
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: always, always_true, never
|
||||
@@ -562,7 +709,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/controllers/spree/admin/variants_controller.rb'
|
||||
- 'app/controllers/spree/admin/zones_controller.rb'
|
||||
- 'app/controllers/spree/credit_cards_controller.rb'
|
||||
- 'app/controllers/spree/home_controller.rb'
|
||||
- 'app/controllers/spree/orders_controller.rb'
|
||||
- 'app/controllers/spree/store_controller.rb'
|
||||
- 'app/controllers/spree/user_passwords_controller.rb'
|
||||
@@ -617,8 +763,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/jobs/subscription_placement_job.rb'
|
||||
- 'app/jobs/welcome_enterprise_job.rb'
|
||||
- 'app/mailers/enterprise_mailer.rb'
|
||||
- 'app/mailers/spree/base_mailer_decorator.rb'
|
||||
- 'app/mailers/spree/order_mailer_decorator.rb'
|
||||
- 'app/mailers/spree/user_mailer.rb'
|
||||
- 'app/mailers/subscription_mailer.rb'
|
||||
- 'app/models/adjustment_metadata.rb'
|
||||
@@ -677,12 +821,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/models/spree/address_decorator.rb'
|
||||
- 'app/models/spree/adjustment_decorator.rb'
|
||||
- 'app/models/spree/app_configuration_decorator.rb'
|
||||
- 'app/models/spree/calculator/default_tax_decorator.rb'
|
||||
- 'app/models/spree/calculator/flat_percent_item_total_decorator.rb'
|
||||
- 'app/models/spree/calculator/flat_rate_decorator.rb'
|
||||
- 'app/models/spree/calculator/flexi_rate_decorator.rb'
|
||||
- 'app/models/spree/calculator/per_item_decorator.rb'
|
||||
- 'app/models/spree/calculator/price_sack_decorator.rb'
|
||||
- 'app/models/spree/calculator_decorator.rb'
|
||||
- 'app/models/spree/classification_decorator.rb'
|
||||
- 'app/models/spree/concerns/payment_method_distributors.rb'
|
||||
@@ -695,7 +833,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/models/spree/line_item_decorator.rb'
|
||||
- 'app/models/spree/option_type_decorator.rb'
|
||||
- 'app/models/spree/order_decorator.rb'
|
||||
- 'app/models/spree/payment_decorator.rb'
|
||||
- 'app/models/spree/payment_method_decorator.rb'
|
||||
- 'app/models/spree/preferences/file_configuration.rb'
|
||||
- 'app/models/spree/price_decorator.rb'
|
||||
@@ -704,15 +841,12 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/models/spree/product_property_decorator.rb'
|
||||
- 'app/models/spree/product_set.rb'
|
||||
- 'app/models/spree/property.rb'
|
||||
- 'app/models/spree/shipment_decorator.rb'
|
||||
- 'app/models/spree/shipping_method_decorator.rb'
|
||||
- 'app/models/spree/stock/availability_validator_decorator.rb'
|
||||
- 'app/models/spree/stock_location_decorator.rb'
|
||||
- 'app/models/spree/tax_rate_decorator.rb'
|
||||
- 'app/models/spree/taxon_decorator.rb'
|
||||
- 'app/models/spree/user.rb'
|
||||
- 'app/models/spree/variant_decorator.rb'
|
||||
- 'app/models/stock/package.rb'
|
||||
- 'app/models/stripe_account.rb'
|
||||
- 'app/models/subscription.rb'
|
||||
- 'app/models/subscription_line_item.rb'
|
||||
@@ -796,7 +930,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/serializers/api/shipping_method_serializer.rb'
|
||||
- 'app/serializers/api/shop_for_orders_serializer.rb'
|
||||
- 'app/serializers/api/state_serializer.rb'
|
||||
- 'app/serializers/api/taxon_image_serializer.rb'
|
||||
- 'app/serializers/api/taxon_jstree_attribute_serializer.rb'
|
||||
- 'app/serializers/api/taxon_jstree_serializer.rb'
|
||||
- 'app/serializers/api/taxon_serializer.rb'
|
||||
@@ -804,7 +937,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/serializers/api/user_serializer.rb'
|
||||
- 'app/serializers/api/variant_serializer.rb'
|
||||
- 'app/services/action_callbacks.rb'
|
||||
- 'app/services/advance_order_service.rb'
|
||||
- 'app/services/bulk_invoice_service.rb'
|
||||
- 'app/services/cart_service.rb'
|
||||
- 'app/services/create_order_cycle.rb'
|
||||
@@ -824,6 +956,7 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/services/order_factory.rb'
|
||||
- 'app/services/order_syncer.rb'
|
||||
- 'app/services/order_update_issues.rb'
|
||||
- 'app/services/order_workflow.rb'
|
||||
- 'app/services/permissions/order.rb'
|
||||
- 'app/services/product_tag_rules_filterer.rb'
|
||||
- 'app/services/products_renderer.rb'
|
||||
@@ -886,7 +1019,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'lib/discourse/single_sign_on.rb'
|
||||
- 'lib/open_food_network/address_finder.rb'
|
||||
- 'lib/open_food_network/available_payment_method_filter.rb'
|
||||
- 'lib/open_food_network/bulk_coop_report.rb'
|
||||
- 'lib/open_food_network/column_preference_defaults.rb'
|
||||
- 'lib/open_food_network/customers_report.rb'
|
||||
- 'lib/open_food_network/enterprise_fee_applicator.rb'
|
||||
@@ -899,7 +1031,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'lib/open_food_network/i18n_config.rb'
|
||||
- 'lib/open_food_network/lettuce_share_report.rb'
|
||||
- 'lib/open_food_network/locking.rb'
|
||||
- 'lib/open_food_network/model_class_from_controller_name.rb'
|
||||
- 'lib/open_food_network/order_and_distributor_report.rb'
|
||||
- 'lib/open_food_network/order_cycle_form_applicator.rb'
|
||||
- 'lib/open_food_network/order_cycle_management_report.rb'
|
||||
@@ -921,14 +1052,8 @@ Style/FrozenStringLiteralComment:
|
||||
- 'lib/open_food_network/property_merge.rb'
|
||||
- 'lib/open_food_network/rack_request_blocker.rb'
|
||||
- 'lib/open_food_network/referer_parser.rb'
|
||||
- 'lib/open_food_network/reports/bulk_coop_allocation_report.rb'
|
||||
- 'lib/open_food_network/reports/bulk_coop_report.rb'
|
||||
- 'lib/open_food_network/reports/bulk_coop_supplier_report.rb'
|
||||
- 'lib/open_food_network/reports/line_items.rb'
|
||||
- 'lib/open_food_network/reports/list.rb'
|
||||
- 'lib/open_food_network/reports/report.rb'
|
||||
- 'lib/open_food_network/reports/row.rb'
|
||||
- 'lib/open_food_network/reports/rule.rb'
|
||||
- 'lib/open_food_network/sales_tax_report.rb'
|
||||
- 'lib/open_food_network/scope_product_to_hub.rb'
|
||||
- 'lib/open_food_network/scope_variant_to_hub.rb'
|
||||
@@ -942,9 +1067,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'lib/spree/api/controller_setup.rb'
|
||||
- 'lib/spree/api/testing_support/setup.rb'
|
||||
- 'lib/spree/authentication_helpers.rb'
|
||||
- 'lib/spree/core/controller_helpers/auth_decorator.rb'
|
||||
- 'lib/spree/core/controller_helpers/order_decorator.rb'
|
||||
- 'lib/spree/core/controller_helpers/respond_with_decorator.rb'
|
||||
- 'lib/spree/localized_number.rb'
|
||||
- 'lib/spree/money_decorator.rb'
|
||||
- 'lib/spree/product_filters.rb'
|
||||
@@ -973,7 +1095,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'lib/tasks/sample_data/user_factory.rb'
|
||||
- 'lib/tasks/specs.rake'
|
||||
- 'lib/tasks/users.rake'
|
||||
- 'spec/config/application_spec.rb'
|
||||
- 'spec/controllers/admin/bulk_line_items_controller_spec.rb'
|
||||
- 'spec/controllers/admin/column_preferences_controller_spec.rb'
|
||||
- 'spec/controllers/admin/customers_controller_spec.rb'
|
||||
@@ -1004,9 +1125,9 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/controllers/api/taxonomies_controller_spec.rb'
|
||||
- 'spec/controllers/api/taxons_controller_spec.rb'
|
||||
- 'spec/controllers/api/variants_controller_spec.rb'
|
||||
- 'spec/controllers/base_controller2_spec.rb'
|
||||
- 'spec/controllers/base_controller_spec.rb'
|
||||
- 'spec/controllers/cart_controller_spec.rb'
|
||||
- 'spec/controllers/checkout_controller_concurrency_spec.rb'
|
||||
- 'spec/controllers/checkout_controller_spec.rb'
|
||||
- 'spec/controllers/enterprises_controller_spec.rb'
|
||||
- 'spec/controllers/groups_controller_spec.rb'
|
||||
@@ -1023,7 +1144,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/controllers/spree/admin/orders_controller_spec.rb'
|
||||
- 'spec/controllers/spree/admin/overview_controller_spec.rb'
|
||||
- 'spec/controllers/spree/admin/payment_methods_controller_spec.rb'
|
||||
- 'spec/controllers/spree/admin/payments_controller_spec.rb'
|
||||
- 'spec/controllers/spree/admin/products_controller_spec.rb'
|
||||
- 'spec/controllers/spree/admin/reports_controller_spec.rb'
|
||||
- 'spec/controllers/spree/admin/search_controller_spec.rb'
|
||||
@@ -1032,7 +1152,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/controllers/spree/admin/variants_controller_spec.rb'
|
||||
- 'spec/controllers/spree/credit_cards_controller_spec.rb'
|
||||
- 'spec/controllers/spree/orders_controller_spec.rb'
|
||||
- 'spec/controllers/spree/store_controller_spec.rb'
|
||||
- 'spec/controllers/spree/user_sessions_controller_spec.rb'
|
||||
- 'spec/controllers/spree/users_controller_spec.rb'
|
||||
- 'spec/controllers/stripe/callbacks_controller_spec.rb'
|
||||
@@ -1140,7 +1259,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/jobs/subscription_placement_job_spec.rb'
|
||||
- 'spec/jobs/welcome_enterprise_job_spec.rb'
|
||||
- 'spec/lib/open_food_network/address_finder_spec.rb'
|
||||
- 'spec/lib/open_food_network/bulk_coop_report_spec.rb'
|
||||
- 'spec/lib/open_food_network/customers_report_spec.rb'
|
||||
- 'spec/lib/open_food_network/enterprise_fee_applicator_spec.rb'
|
||||
- 'spec/lib/open_food_network/enterprise_fee_calculator_spec.rb'
|
||||
@@ -1166,9 +1284,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/lib/open_food_network/products_and_inventory_report_spec.rb'
|
||||
- 'spec/lib/open_food_network/property_merge_spec.rb'
|
||||
- 'spec/lib/open_food_network/referer_parser_spec.rb'
|
||||
- 'spec/lib/open_food_network/reports/report_spec.rb'
|
||||
- 'spec/lib/open_food_network/reports/row_spec.rb'
|
||||
- 'spec/lib/open_food_network/reports/rule_spec.rb'
|
||||
- 'spec/lib/open_food_network/sales_tax_report_spec.rb'
|
||||
- 'spec/lib/open_food_network/scope_variant_to_hub_spec.rb'
|
||||
- 'spec/lib/open_food_network/scope_variants_to_search_spec.rb'
|
||||
@@ -1183,12 +1298,16 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/lib/tasks/enterprises_rake_spec.rb'
|
||||
- 'spec/lib/tasks/users_rake_spec.rb'
|
||||
- 'spec/mailers/enterprise_mailer_spec.rb'
|
||||
- 'spec/mailers/order_mailer_spec.rb'
|
||||
- 'spec/mailers/producer_mailer_spec.rb'
|
||||
- 'spec/mailers/subscription_mailer_spec.rb'
|
||||
- 'spec/mailers/user_mailer_spec.rb'
|
||||
- 'spec/models/adjustment_metadata_spec.rb'
|
||||
- 'spec/models/calculator/flat_percent_item_total_spec.rb'
|
||||
- 'spec/models/calculator/flat_percent_per_item_spec.rb'
|
||||
- 'spec/models/calculator/flat_rate_spec.rb'
|
||||
- 'spec/models/calculator/flexi_rate_spec.rb'
|
||||
- 'spec/models/calculator/per_item_spec.rb'
|
||||
- 'spec/models/calculator/price_sack_spec.rb'
|
||||
- 'spec/models/calculator/weight_spec.rb'
|
||||
- 'spec/models/column_preference_spec.rb'
|
||||
- 'spec/models/concerns/order_shipment_spec.rb'
|
||||
@@ -1214,11 +1333,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/models/spree/ability_spec.rb'
|
||||
- 'spec/models/spree/addresses_spec.rb'
|
||||
- 'spec/models/spree/adjustment_spec.rb'
|
||||
- 'spec/models/spree/calculator/flat_percent_item_total_spec.rb'
|
||||
- 'spec/models/spree/calculator/flat_rate_spec.rb'
|
||||
- 'spec/models/spree/calculator/flexi_rate_spec.rb'
|
||||
- 'spec/models/spree/calculator/per_item_spec.rb'
|
||||
- 'spec/models/spree/calculator/price_sack_spec.rb'
|
||||
- 'spec/models/spree/calculator_spec.rb'
|
||||
- 'spec/models/spree/classification_spec.rb'
|
||||
- 'spec/models/spree/credit_card_spec.rb'
|
||||
@@ -1233,14 +1347,12 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/models/spree/price_spec.rb'
|
||||
- 'spec/models/spree/product_set_spec.rb'
|
||||
- 'spec/models/spree/product_spec.rb'
|
||||
- 'spec/models/spree/shipment_spec.rb'
|
||||
- 'spec/models/spree/shipping_method_spec.rb'
|
||||
- 'spec/models/spree/stock/availability_validator_spec.rb'
|
||||
- 'spec/models/spree/tax_rate_spec.rb'
|
||||
- 'spec/models/spree/taxon_spec.rb'
|
||||
- 'spec/models/spree/user_spec.rb'
|
||||
- 'spec/models/spree/variant_spec.rb'
|
||||
- 'spec/models/stock/package_spec.rb'
|
||||
- 'spec/models/stripe_account_spec.rb'
|
||||
- 'spec/models/subscription_line_item_spec.rb'
|
||||
- 'spec/models/subscription_spec.rb'
|
||||
@@ -1282,7 +1394,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/serializers/api/product_serializer_spec.rb'
|
||||
- 'spec/serializers/api/shipping_method_serializer_spec.rb'
|
||||
- 'spec/serializers/api/variant_serializer_spec.rb'
|
||||
- 'spec/services/advance_order_service_spec.rb'
|
||||
- 'spec/services/bulk_invoice_service_spec.rb'
|
||||
- 'spec/services/cart_service_spec.rb'
|
||||
- 'spec/services/default_shipping_category_spec.rb'
|
||||
@@ -1298,6 +1409,7 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/services/order_cycle_warning_spec.rb'
|
||||
- 'spec/services/order_factory_spec.rb'
|
||||
- 'spec/services/order_syncer_spec.rb'
|
||||
- 'spec/services/order_workflow_spec.rb'
|
||||
- 'spec/services/permissions/order_spec.rb'
|
||||
- 'spec/services/product_tag_rules_filterer_spec.rb'
|
||||
- 'spec/services/products_renderer_spec.rb'
|
||||
@@ -1331,7 +1443,7 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/support/performance_helper.rb'
|
||||
- 'spec/support/products_helper.rb'
|
||||
- 'spec/support/request/admin_helper.rb'
|
||||
- 'spec/support/request/authentication_workflow.rb'
|
||||
- 'spec/support/request/authentication_helper.rb'
|
||||
- 'spec/support/request/checkout_workflow.rb'
|
||||
- 'spec/support/request/cookie_helper.rb'
|
||||
- 'spec/support/request/distribution_helper.rb'
|
||||
@@ -1348,8 +1460,9 @@ Style/FrozenStringLiteralComment:
|
||||
- 'spec/validators/integer_array_validator_spec.rb'
|
||||
- 'spec/views/spree/admin/orders/edit.html.haml_spec.rb'
|
||||
- 'spec/views/spree/admin/orders/index.html.haml_spec.rb'
|
||||
- 'spec/views/spree/admin/payment_methods/index.html.haml_spec.rb'
|
||||
|
||||
# Offense count: 51
|
||||
# Offense count: 48
|
||||
# Configuration parameters: MinBodyLength.
|
||||
Style/GuardClause:
|
||||
Exclude:
|
||||
@@ -1369,32 +1482,35 @@ Style/GuardClause:
|
||||
- 'app/models/spree/order_decorator.rb'
|
||||
- 'app/models/spree/price_decorator.rb'
|
||||
- 'app/models/spree/product_decorator.rb'
|
||||
- 'app/services/advance_order_service.rb'
|
||||
- 'app/services/order_syncer.rb'
|
||||
- 'lib/discourse/single_sign_on.rb'
|
||||
- 'lib/open_food_network/order_cycle_form_applicator.rb'
|
||||
- 'lib/open_food_network/rack_request_blocker.rb'
|
||||
- 'lib/open_food_network/variant_and_line_item_naming.rb'
|
||||
- 'lib/spree/core/controller_helpers/order_decorator.rb'
|
||||
- 'lib/spree/core/controller_helpers/respond_with_decorator.rb'
|
||||
- 'spec/support/delayed_job_helper.rb'
|
||||
- 'spec/support/request/distribution_helper.rb'
|
||||
- 'spec/support/request/shop_workflow.rb'
|
||||
|
||||
# Offense count: 54
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols.
|
||||
# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys
|
||||
Style/HashSyntax:
|
||||
Exclude:
|
||||
- 'spec/models/spree/payment_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
Style/MissingRespondToMissing:
|
||||
Exclude:
|
||||
- 'app/helpers/application_helper.rb'
|
||||
|
||||
# Offense count: 4
|
||||
# Offense count: 2
|
||||
Style/MixinUsage:
|
||||
Exclude:
|
||||
- 'lib/open_food_network/orders_and_fulfillments_report.rb'
|
||||
- 'spec/lib/open_food_network/bulk_coop_report_spec.rb'
|
||||
- 'spec/lib/open_food_network/order_cycle_management_report_spec.rb'
|
||||
- 'spec/lib/open_food_network/packing_report_spec.rb'
|
||||
|
||||
# Offense count: 41
|
||||
# Offense count: 39
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
|
||||
# SupportedStyles: predicate, comparison
|
||||
@@ -1409,11 +1525,9 @@ Style/NumericPredicate:
|
||||
- 'app/models/product_import/product_importer.rb'
|
||||
- 'app/models/product_import/spreadsheet_entry.rb'
|
||||
- 'app/models/spree/adjustment_decorator.rb'
|
||||
- 'app/models/spree/calculator/flexi_rate_decorator.rb'
|
||||
- 'app/models/spree/gateway/stripe_connect.rb'
|
||||
- 'app/models/spree/line_item_decorator.rb'
|
||||
- 'app/models/spree/order_decorator.rb'
|
||||
- 'app/models/spree/shipment_decorator.rb'
|
||||
- 'app/models/spree/user.rb'
|
||||
- 'app/models/variant_override.rb'
|
||||
- 'app/services/cart_service.rb'
|
||||
@@ -1426,6 +1540,22 @@ Style/NumericPredicate:
|
||||
- 'lib/spree/money_decorator.rb'
|
||||
- 'lib/tasks/sample_data.rake'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: compact, exploded
|
||||
Style/RaiseArgs:
|
||||
Exclude:
|
||||
- 'spec/controllers/checkout_controller_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
|
||||
# SupportedStyles: slashes, percent_r, mixed
|
||||
Style/RegexpLiteral:
|
||||
Exclude:
|
||||
- 'lib/spree/core/controller_helpers/auth.rb'
|
||||
|
||||
# Offense count: 231
|
||||
Style/Send:
|
||||
Exclude:
|
||||
|
||||
@@ -17,7 +17,13 @@ Better to have at least 2GB free on your computer in order to download images an
|
||||
|
||||
Open a terminal with a shell.
|
||||
|
||||
Clone the repository:
|
||||
Clone the repository. If you're planning on contributing code to the project (which we [LOVE](CONTRIBUTING.md)), it is a good idea to begin by forking this repo using the Fork button in the top-right corner of this screen. You should then be able to use git clone to copy your fork onto your local machine.
|
||||
|
||||
```sh
|
||||
$ git clone https://github.com/YOUR_GITHUB_USERNAME_HERE/openfoodnetwork
|
||||
```
|
||||
|
||||
Otherwise, if you just want to get things running, clone from the OFN main repo:
|
||||
|
||||
```sh
|
||||
$ git clone git@github.com:openfoodfoundation/openfoodnetwork.git
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
### Getting Started
|
||||
|
||||
This is a general guide to setting up an Open Food Network development environment on your local machine.
|
||||
This is a general guide to setting up an Open Food Network **development environment on your local machine**. If you want to setup OFN on a server, please have a look at the [ofn-install deployment guide](https://github.com/openfoodfoundation/ofn-install/wiki).
|
||||
|
||||
### Requirements
|
||||
|
||||
|
||||
10
Gemfile
10
Gemfile
@@ -39,18 +39,21 @@ gem 'stringex', '~> 1.5.1'
|
||||
|
||||
gem 'spree_i18n', github: 'spree/spree_i18n', branch: '1-3-stable'
|
||||
|
||||
# Our branch contains two changes
|
||||
# Our branch contains the following changes:
|
||||
# - Pass customer email and phone number to PayPal (merged to upstream master)
|
||||
# - Change type of password from string to password to hide it in the form
|
||||
# - Skip CA cert file and use the ones provided by the OS
|
||||
gem 'spree_paypal_express', github: 'openfoodfoundation/better_spree_paypal_express', branch: '2-1-0-stable'
|
||||
|
||||
gem 'stripe'
|
||||
|
||||
# We need at least this version to have Digicert's root certificate
|
||||
# which is needed for Pin Payments (and possibly others).
|
||||
gem 'activemerchant', '~> 1.78.0'
|
||||
|
||||
gem 'devise', '~> 3.0.1'
|
||||
gem 'devise', '~> 3.5.10' # v4.0.0 needs rails 4.1
|
||||
gem 'devise-encryptable'
|
||||
gem 'devise-token_authenticatable', '~> 0.4.10' # v0.5.0 needs devise v4
|
||||
gem 'jwt', '~> 2.2'
|
||||
gem 'oauth2', '~> 1.4.4' # Used for Stripe Connect
|
||||
|
||||
@@ -83,12 +86,11 @@ gem 'acts-as-taggable-on', '~> 4.0'
|
||||
gem 'angularjs-file-upload-rails', '~> 2.4.1'
|
||||
gem 'custom_error_message', github: 'jeremydurham/custom-err-msg'
|
||||
gem 'dalli'
|
||||
gem 'diffy'
|
||||
gem 'figaro'
|
||||
gem 'geocoder'
|
||||
gem 'gmaps4rails'
|
||||
gem 'oj'
|
||||
gem 'paper_trail', '~> 5.2.3'
|
||||
gem 'paper_trail', '~> 7.1.3'
|
||||
gem 'paperclip', '~> 3.4.1'
|
||||
gem 'rack-rewrite'
|
||||
gem 'rack-ssl', require: 'rack/ssl'
|
||||
|
||||
67
Gemfile.lock
67
Gemfile.lock
@@ -6,7 +6,7 @@ GIT
|
||||
|
||||
GIT
|
||||
remote: https://github.com/openfoodfoundation/better_spree_paypal_express.git
|
||||
revision: e28e4a8c5cedba504eea9cdad4be440d277d7e68
|
||||
revision: 1736e3268239a841576d2719a1f276cf9b74c5c5
|
||||
branch: 2-1-0-stable
|
||||
specs:
|
||||
spree_paypal_express (2.0.3)
|
||||
@@ -108,7 +108,7 @@ GEM
|
||||
activesupport (= 4.0.13)
|
||||
arel (~> 4.0.0)
|
||||
activerecord-deprecated_finders (1.0.4)
|
||||
activerecord-import (1.0.5)
|
||||
activerecord-import (1.0.6)
|
||||
activerecord (>= 3.2)
|
||||
activerecord-postgresql-adapter (0.0.1)
|
||||
pg
|
||||
@@ -148,9 +148,7 @@ GEM
|
||||
nokogiri (>= 1.4.4)
|
||||
uuidtools (~> 2.1)
|
||||
bcrypt (3.1.13)
|
||||
bcrypt-ruby (3.1.5)
|
||||
bcrypt (>= 3.1.3)
|
||||
bugsnag (6.13.1)
|
||||
bugsnag (6.16.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
builder (3.1.4)
|
||||
byebug (11.0.1)
|
||||
@@ -194,7 +192,7 @@ GEM
|
||||
compass (~> 1.0.0)
|
||||
sass-rails (< 5.1)
|
||||
sprockets (< 4.0)
|
||||
concurrent-ruby (1.1.6)
|
||||
concurrent-ruby (1.1.7)
|
||||
crack (0.4.3)
|
||||
safe_yaml (~> 1.0.0)
|
||||
css_parser (1.7.1)
|
||||
@@ -206,7 +204,7 @@ GEM
|
||||
activerecord (>= 3.2.0, < 5.0)
|
||||
fog (~> 1.0)
|
||||
rails (>= 3.2.0, < 5.0)
|
||||
ddtrace (0.37.0)
|
||||
ddtrace (0.39.0)
|
||||
msgpack
|
||||
debugger-linecache (1.2.0)
|
||||
delayed_job (4.1.8)
|
||||
@@ -219,15 +217,18 @@ GEM
|
||||
delayed_job (> 2.0.3)
|
||||
rack-protection (>= 1.5.5)
|
||||
sinatra (>= 1.4.4)
|
||||
devise (3.0.4)
|
||||
bcrypt-ruby (~> 3.0)
|
||||
devise (3.5.10)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 3.2.6, < 5)
|
||||
responders
|
||||
thread_safe (~> 0.1)
|
||||
warden (~> 1.2.3)
|
||||
devise-encryptable (0.2.0)
|
||||
devise (>= 2.1.0)
|
||||
devise-token_authenticatable (0.4.10)
|
||||
devise (>= 3.5.2, < 4.0.0)
|
||||
diff-lcs (1.3)
|
||||
diffy (3.3.0)
|
||||
docile (1.3.2)
|
||||
dry-inflector (0.1.2)
|
||||
erubis (2.7.0)
|
||||
@@ -466,7 +467,7 @@ GEM
|
||||
money (5.1.1)
|
||||
i18n (~> 0.6.0)
|
||||
msgpack (1.3.3)
|
||||
multi_json (1.14.1)
|
||||
multi_json (1.15.0)
|
||||
multi_xml (0.6.0)
|
||||
multipart-post (2.1.1)
|
||||
newrelic_rpm (3.18.1.330)
|
||||
@@ -478,11 +479,11 @@ GEM
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
oj (3.10.7)
|
||||
oj (3.10.8)
|
||||
optimist (3.0.0)
|
||||
orm_adapter (0.5.0)
|
||||
paper_trail (5.2.3)
|
||||
activerecord (>= 3.0, < 6.0)
|
||||
paper_trail (7.1.3)
|
||||
activerecord (>= 4.0, < 5.2)
|
||||
request_store (~> 1.1)
|
||||
paperclip (3.4.2)
|
||||
activemodel (>= 3.0.0)
|
||||
@@ -508,7 +509,7 @@ GEM
|
||||
pry-byebug (3.7.0)
|
||||
byebug (~> 11.0)
|
||||
pry (~> 0.10)
|
||||
public_suffix (4.0.3)
|
||||
public_suffix (4.0.5)
|
||||
rack (1.5.5)
|
||||
rack-mini-profiler (2.0.2)
|
||||
rack (>= 1.2.0)
|
||||
@@ -553,8 +554,10 @@ GEM
|
||||
nokogiri (~> 1.5)
|
||||
optimist (~> 3.0)
|
||||
redcarpet (3.5.0)
|
||||
request_store (1.4.1)
|
||||
request_store (1.5.0)
|
||||
rack (>= 1.4)
|
||||
responders (1.1.2)
|
||||
railties (>= 3.2, < 4.2)
|
||||
rexml (3.2.4)
|
||||
roadie (3.4.0)
|
||||
css_parser (~> 1.4)
|
||||
@@ -588,19 +591,19 @@ GEM
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.9.2)
|
||||
rswag (2.2.0)
|
||||
rswag-api (= 2.2.0)
|
||||
rswag-specs (= 2.2.0)
|
||||
rswag-ui (= 2.2.0)
|
||||
rswag-api (2.2.0)
|
||||
railties (>= 3.1, < 6.1)
|
||||
rswag-specs (2.2.0)
|
||||
activesupport (>= 3.1, < 6.1)
|
||||
rswag (2.3.1)
|
||||
rswag-api (= 2.3.1)
|
||||
rswag-specs (= 2.3.1)
|
||||
rswag-ui (= 2.3.1)
|
||||
rswag-api (2.3.1)
|
||||
railties (>= 3.1, < 7.0)
|
||||
rswag-specs (2.3.1)
|
||||
activesupport (>= 3.1, < 7.0)
|
||||
json-schema (~> 2.2)
|
||||
railties (>= 3.1, < 6.1)
|
||||
rswag-ui (2.2.0)
|
||||
actionpack (>= 3.1, < 6.1)
|
||||
railties (>= 3.1, < 6.1)
|
||||
railties (>= 3.1, < 7.0)
|
||||
rswag-ui (2.3.1)
|
||||
actionpack (>= 3.1, < 7.0)
|
||||
railties (>= 3.1, < 7.0)
|
||||
rubocop (0.81.0)
|
||||
jaro_winkler (~> 1.5.1)
|
||||
parallel (~> 1.10)
|
||||
@@ -668,7 +671,7 @@ GEM
|
||||
uglifier (4.2.0)
|
||||
execjs (>= 0.3.0, < 3)
|
||||
unicode-display_width (1.7.0)
|
||||
unicorn (5.5.5)
|
||||
unicorn (5.6.0)
|
||||
kgio (~> 2.6)
|
||||
raindrops (~> 0.7)
|
||||
unicorn-rails (2.2.1)
|
||||
@@ -735,10 +738,10 @@ DEPENDENCIES
|
||||
debugger-linecache
|
||||
delayed_job_active_record
|
||||
delayed_job_web
|
||||
devise (~> 3.0.1)
|
||||
devise (~> 3.5.10)
|
||||
devise-encryptable
|
||||
devise-token_authenticatable (~> 0.4.10)
|
||||
dfc_provider!
|
||||
diffy
|
||||
eventmachine (>= 1.2.3)
|
||||
factory_bot_rails (= 4.10.0)
|
||||
ffaker (~> 1.16)
|
||||
@@ -772,7 +775,7 @@ DEPENDENCIES
|
||||
ofn-qz!
|
||||
oj
|
||||
order_management!
|
||||
paper_trail (~> 5.2.3)
|
||||
paper_trail (~> 7.1.3)
|
||||
paperclip (~> 3.4.1)
|
||||
paranoia (~> 2.0)
|
||||
pg (~> 0.21.0)
|
||||
|
||||
@@ -80,7 +80,11 @@
|
||||
//= require moment/nb.js
|
||||
//= require moment/pt-br.js
|
||||
//= require moment/pt.js
|
||||
//= require moment/ru.js
|
||||
//= require moment/sv.js
|
||||
//= require moment/ca.js
|
||||
//= require moment/ar.js
|
||||
//= require moment/tr.js
|
||||
|
||||
// foundation
|
||||
//= require ../shared/mm-foundation-tpls-0.9.0-20180826174721.min.js
|
||||
|
||||
@@ -37,7 +37,11 @@
|
||||
#= require moment/nb.js
|
||||
#= require moment/pt-br.js
|
||||
#= require moment/pt.js
|
||||
#= require moment/ru.js
|
||||
#= require moment/sv.js
|
||||
#= require moment/ca.js
|
||||
#= require moment/ar.js
|
||||
#= require moment/tr.js
|
||||
#
|
||||
#= require modernizr
|
||||
#
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
Darkswarm.directive "disableEnterWithBlur", ()->
|
||||
# Stops enter from doing normal enter things, and blurs the input
|
||||
restrict: 'A'
|
||||
link: (scope, element, attrs)->
|
||||
element.bind "keydown keypress", (e)->
|
||||
code = e.keyCode || e.which
|
||||
if code == 13
|
||||
element.blur()
|
||||
e.preventDefault()
|
||||
@@ -1,4 +1,4 @@
|
||||
Darkswarm.directive 'ofnOpenStreetMap', ($window, Enterprises, EnterpriseModal, availableCountries, openStreetMapConfig) ->
|
||||
Darkswarm.directive 'ofnOpenStreetMap', ($window, MapCentreCalculator, Enterprises, EnterpriseModal, availableCountries, openStreetMapConfig) ->
|
||||
restrict: 'E'
|
||||
replace: true
|
||||
scope: true
|
||||
@@ -11,34 +11,6 @@ Darkswarm.directive 'ofnOpenStreetMap', ($window, Enterprises, EnterpriseModal,
|
||||
openStreetMapProviderName = openStreetMapConfig.open_street_map_provider_name
|
||||
openStreetMapProviderOptions = JSON.parse(openStreetMapConfig.open_street_map_provider_options)
|
||||
|
||||
average = (values) ->
|
||||
total = values.reduce (sum, value) ->
|
||||
sum = sum + value
|
||||
, 0
|
||||
total / values.length
|
||||
|
||||
averageAngle = (angleName) ->
|
||||
positiveAngles = []
|
||||
negativeAngles = []
|
||||
for enterprise in Enterprises.enterprises
|
||||
if enterprise.latitude? && enterprise.longitude?
|
||||
if enterprise[angleName] > 0
|
||||
positiveAngles.push(enterprise[angleName])
|
||||
else
|
||||
negativeAngles.push(enterprise[angleName])
|
||||
|
||||
averageNegativeAngle = average(negativeAngles)
|
||||
averagePositiveAngle = average(positiveAngles)
|
||||
|
||||
if negativeAngles.length == 0
|
||||
averagePositiveAngle
|
||||
else if positiveAngles.length == 0
|
||||
averageNegativeAngle
|
||||
else if averagePositiveAngle > averageNegativeAngle
|
||||
averagePositiveAngle - averageNegativeAngle
|
||||
else
|
||||
averageNegativeAngle - averagePositiveAngle
|
||||
|
||||
buildMarker = (enterprise, latlng, title) ->
|
||||
icon = L.icon
|
||||
iconUrl: enterprise.icon
|
||||
@@ -61,28 +33,31 @@ Darkswarm.directive 'ofnOpenStreetMap', ($window, Enterprises, EnterpriseModal,
|
||||
|
||||
displayMap = ->
|
||||
setMapDimensions()
|
||||
averageLatitude = averageAngle("latitude")
|
||||
averageLongitude = averageAngle("longitude")
|
||||
zoomLevel = 6
|
||||
map = L.map('open-street-map')
|
||||
L.tileLayer.provider(openStreetMapProviderName, openStreetMapProviderOptions).addTo(map)
|
||||
map.setView([averageLatitude, averageLongitude], zoomLevel)
|
||||
map.setView([MapCentreCalculator.initialLatitude(), MapCentreCalculator.initialLongitude()], zoomLevel)
|
||||
|
||||
displayEnterprises = ->
|
||||
for enterprise in Enterprises.enterprises
|
||||
if enterprise.latitude? && enterprise.longitude?
|
||||
marker = buildMarker(enterprise, { lat: enterprise.latitude, lng: enterprise.longitude }, enterprise.name).addTo(map)
|
||||
enterpriseNames.push(enterpriseName(enterprise))
|
||||
markers.push(marker)
|
||||
for enterprise in Enterprises.geocodedEnterprises()
|
||||
marker = buildMarker(enterprise, { lat: enterprise.latitude, lng: enterprise.longitude }, enterprise.name).addTo(map)
|
||||
enterpriseNames.push(enterpriseName(enterprise))
|
||||
markers.push(marker)
|
||||
|
||||
disableSearchField = () =>
|
||||
$('#open-street-map--search input').prop("disabled", true)
|
||||
|
||||
displaySearchField = () ->
|
||||
new Autocomplete('#open-street-map--search',
|
||||
onSubmit: goToEnterprise
|
||||
search: searchEnterprises
|
||||
)
|
||||
overwriteInlinePositionRelativeToPositionSearchField = ->
|
||||
$('#open-street-map--search').css("position", "absolute")
|
||||
overwriteInlinePositionRelativeToPositionSearchField()
|
||||
overwriteInlinePositionRelativeToAbsoluteOnSearchField()
|
||||
if Enterprises.geocodedEnterprises().length == 0
|
||||
disableSearchField()
|
||||
|
||||
overwriteInlinePositionRelativeToAbsoluteOnSearchField = ->
|
||||
$('#open-street-map--search').css("position", "absolute")
|
||||
|
||||
searchEnterprises = (input) ->
|
||||
if input.length < 1
|
||||
|
||||
@@ -24,7 +24,8 @@ Darkswarm.factory 'Checkout', ($injector, CurrentOrder, ShippingMethods, StripeE
|
||||
try
|
||||
@loadFlash(error: t("checkout.failed")) # inform the user about the unexpected error
|
||||
finally
|
||||
throw error # generate a BugsnagJS alert
|
||||
Bugsnag.notify(error)
|
||||
throw error
|
||||
|
||||
handle_checkout_error_response: (response) =>
|
||||
throw response unless response.data?
|
||||
|
||||
@@ -84,3 +84,8 @@ Darkswarm.factory 'Enterprises', (enterprises, ShopsResource, CurrentHub, Taxons
|
||||
|
||||
resetDistance: ->
|
||||
enterprise.distance = null for enterprise in @enterprises
|
||||
|
||||
geocodedEnterprises: =>
|
||||
@enterprises.filter (enterprise) ->
|
||||
enterprise.latitude? && enterprise.longitude?
|
||||
|
||||
|
||||
@@ -2,9 +2,7 @@ Darkswarm.factory "OfnMap", (Enterprises, EnterpriseListModal, MapConfiguration)
|
||||
new class OfnMap
|
||||
constructor: ->
|
||||
@coordinates = {}
|
||||
@enterprises = Enterprises.enterprises.filter (enterprise) ->
|
||||
# Remove enterprises w/o lat or long
|
||||
enterprise.latitude != null || enterprise.longitude != null
|
||||
@enterprises = Enterprises.geocodedEnterprises()
|
||||
@enterprises = @enterprise_markers(@enterprises)
|
||||
|
||||
enterprise_markers: (enterprises) ->
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
Darkswarm.factory 'MapCentreCalculator', (Enterprises, openStreetMapConfig) ->
|
||||
new class MapCentreCalculator
|
||||
|
||||
initialLatitude: =>
|
||||
if Enterprises.geocodedEnterprises().length > 0
|
||||
@_calculate("latitude", Enterprises.geocodedEnterprises())
|
||||
else
|
||||
openStreetMapConfig.open_street_map_default_latitude
|
||||
|
||||
initialLongitude: =>
|
||||
if Enterprises.geocodedEnterprises().length > 0
|
||||
@_calculate("longitude", Enterprises.geocodedEnterprises())
|
||||
else
|
||||
openStreetMapConfig.open_street_map_default_longitude
|
||||
|
||||
_calculate: (angleName, coordinates) =>
|
||||
angles = []
|
||||
|
||||
for coordinate in coordinates
|
||||
angles.push(coordinate[angleName])
|
||||
|
||||
minimumAngle = Math.min.apply(null, angles)
|
||||
maximumAngle = Math.max.apply(null, angles)
|
||||
|
||||
distanceBetweenMinimumAndMaximum = if maximumAngle > minimumAngle
|
||||
maximumAngle - minimumAngle
|
||||
else
|
||||
minimumAngle - maximumAngle
|
||||
|
||||
minimumAngle + (distanceBetweenMinimumAndMaximum / 2)
|
||||
@@ -20,9 +20,11 @@
|
||||
|
||||
&:first-child {
|
||||
padding-left: 0;
|
||||
width: 70%;
|
||||
}
|
||||
&:last-child {
|
||||
padding-right: 0;
|
||||
width: 30%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,12 +16,14 @@
|
||||
width: 100%;
|
||||
background-color: $shop-sidebar-overlay;
|
||||
opacity: 0;
|
||||
transition: opacity $transition-sidebar;
|
||||
visibility: hidden;
|
||||
transition: all $transition-sidebar;
|
||||
}
|
||||
|
||||
&.shown {
|
||||
.background {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.sidebar,
|
||||
|
||||
@@ -17,10 +17,12 @@
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
top: 0;
|
||||
z-index: -1;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
// Use vh units for new browsers - fixed issue 1253
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
h1 {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# Base controller for OFN's API
|
||||
require_dependency 'spree/api/controller_setup'
|
||||
require "spree/core/controller_helpers/ssl"
|
||||
|
||||
module Api
|
||||
class BaseController < ActionController::Metal
|
||||
@@ -53,7 +54,7 @@ module Api
|
||||
|
||||
# Use logged in user (spree_current_user) for API authentication (current_api_user)
|
||||
def authenticate_user
|
||||
return if @current_api_user = try_spree_current_user
|
||||
return if @current_api_user = spree_current_user
|
||||
|
||||
if api_key.blank?
|
||||
# An anonymous user
|
||||
|
||||
@@ -62,11 +62,15 @@ class ApplicationController < ActionController::Base
|
||||
end
|
||||
|
||||
def after_sign_out_path_for(_resource_or_scope)
|
||||
session[:shopfront_redirect] || main_app.root_path
|
||||
shopfront_redirect || main_app.root_path
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def shopfront_redirect
|
||||
session[:shopfront_redirect]
|
||||
end
|
||||
|
||||
def restrict_iframes
|
||||
response.headers['X-Frame-Options'] = 'DENY'
|
||||
response.headers['Content-Security-Policy'] = "frame-ancestors 'none'"
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
require 'spree/core/controller_helpers/respond_with_decorator'
|
||||
require 'spree/core/controller_helpers/auth'
|
||||
require 'spree/core/controller_helpers/common'
|
||||
require 'spree/core/controller_helpers/order'
|
||||
require 'spree/core/controller_helpers/respond_with'
|
||||
require 'open_food_network/tag_rule_applicator'
|
||||
|
||||
class BaseController < ApplicationController
|
||||
include Spree::Core::ControllerHelpers
|
||||
include Spree::Core::ControllerHelpers::Auth
|
||||
include Spree::Core::ControllerHelpers::Common
|
||||
include Spree::Core::ControllerHelpers::Order
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
require 'spree/core/controller_helpers/order_decorator'
|
||||
require 'spree/core/controller_helpers/order'
|
||||
|
||||
class CartController < BaseController
|
||||
before_action :check_authorization
|
||||
|
||||
@@ -32,20 +32,20 @@ class CheckoutController < Spree::StoreController
|
||||
|
||||
helper 'spree/orders'
|
||||
|
||||
rescue_from Spree::Core::GatewayError, with: :rescue_from_spree_gateway_error
|
||||
|
||||
def edit
|
||||
return handle_redirect_from_stripe if valid_payment_intent_provided?
|
||||
|
||||
# This is only required because of spree_paypal_express. If we implement
|
||||
# a version of paypal that uses this controller, and more specifically
|
||||
# the #update_failed method, then we can remove this call
|
||||
# the #action_failed method, then we can remove this call
|
||||
OrderCheckoutRestart.new(@order).call
|
||||
rescue Spree::Core::GatewayError => e
|
||||
rescue_from_spree_gateway_error(e)
|
||||
end
|
||||
|
||||
def update
|
||||
params_adapter = Checkout::FormDataAdapter.new(permitted_params, @order, spree_current_user)
|
||||
return update_failed unless @order.update(params_adapter.params[:order])
|
||||
return action_failed unless @order.update(params_adapter.params[:order])
|
||||
|
||||
fire_event('spree.checkout.update')
|
||||
|
||||
@@ -54,7 +54,7 @@ class CheckoutController < Spree::StoreController
|
||||
rescue_from_spree_gateway_error(e)
|
||||
rescue StandardError => e
|
||||
flash[:error] = I18n.t("checkout.failed")
|
||||
update_failed(e)
|
||||
action_failed(e)
|
||||
end
|
||||
|
||||
# Clears the cached order. Required for #current_order to return a new order
|
||||
@@ -138,14 +138,6 @@ class CheckoutController < Spree::StoreController
|
||||
current_order.payments.destroy_all if request.put?
|
||||
end
|
||||
|
||||
def rescue_from_spree_gateway_error(error)
|
||||
flash[:error] = t(:spree_gateway_error_flash_for_checkout, error: error.message)
|
||||
respond_to do |format|
|
||||
format.html { render :edit }
|
||||
format.json { render json: { flash: flash.to_hash }, status: :bad_request }
|
||||
end
|
||||
end
|
||||
|
||||
def valid_payment_intent_provided?
|
||||
return false unless params["payment_intent"]&.starts_with?("pi_")
|
||||
|
||||
@@ -156,11 +148,10 @@ class CheckoutController < Spree::StoreController
|
||||
end
|
||||
|
||||
def handle_redirect_from_stripe
|
||||
if advance_order_state(@order) && order_complete?
|
||||
if OrderWorkflow.new(@order).next && order_complete?
|
||||
checkout_succeeded
|
||||
redirect_to(order_path(@order)) && return
|
||||
else
|
||||
flash[:error] = order_error
|
||||
checkout_failed
|
||||
end
|
||||
end
|
||||
@@ -171,11 +162,9 @@ class CheckoutController < Spree::StoreController
|
||||
return if redirect_to_payment_gateway
|
||||
end
|
||||
|
||||
@order.select_shipping_method(shipping_method_id) if @order.state == "delivery"
|
||||
next if OrderWorkflow.new(@order).next({ shipping_method_id: shipping_method_id })
|
||||
|
||||
next if advance_order_state(@order)
|
||||
|
||||
return update_failed
|
||||
return action_failed
|
||||
end
|
||||
|
||||
update_response
|
||||
@@ -190,15 +179,6 @@ class CheckoutController < Spree::StoreController
|
||||
true
|
||||
end
|
||||
|
||||
# Perform order.next, guarding against StaleObjectErrors
|
||||
def advance_order_state(order)
|
||||
tries ||= 3
|
||||
order.next
|
||||
rescue ActiveRecord::StaleObjectError
|
||||
retry unless (tries -= 1).zero?
|
||||
false
|
||||
end
|
||||
|
||||
def order_error
|
||||
if @order.errors.present?
|
||||
@order.errors.full_messages.to_sentence
|
||||
@@ -212,7 +192,7 @@ class CheckoutController < Spree::StoreController
|
||||
checkout_succeeded
|
||||
update_succeeded_response
|
||||
else
|
||||
update_failed(RuntimeError.new("Order not complete after the checkout workflow"))
|
||||
action_failed(RuntimeError.new("Order not complete after the checkout workflow"))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -238,30 +218,42 @@ class CheckoutController < Spree::StoreController
|
||||
end
|
||||
end
|
||||
|
||||
def update_failed(error = RuntimeError.new(order_error))
|
||||
Bugsnag.notify(error)
|
||||
|
||||
flash[:error] = order_error if flash.blank?
|
||||
checkout_failed
|
||||
update_failed_response
|
||||
def action_failed(error = RuntimeError.new(order_error))
|
||||
checkout_failed(error)
|
||||
action_failed_response
|
||||
end
|
||||
|
||||
def checkout_failed
|
||||
def checkout_failed(error = RuntimeError.new(order_error))
|
||||
Bugsnag.notify(error)
|
||||
flash[:error] = order_error if flash.blank?
|
||||
Checkout::PostCheckoutActions.new(@order).failure
|
||||
end
|
||||
|
||||
def update_failed_response
|
||||
def action_failed_response
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
render :edit
|
||||
end
|
||||
format.json do
|
||||
discard_flash_errors
|
||||
render json: { errors: @order.errors, flash: flash.to_hash }.to_json, status: :bad_request
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def rescue_from_spree_gateway_error(error)
|
||||
flash[:error] = t(:spree_gateway_error_flash_for_checkout, error: error.message)
|
||||
action_failed(error)
|
||||
end
|
||||
|
||||
def permitted_params
|
||||
PermittedAttributes::Checkout.new(params).call
|
||||
end
|
||||
|
||||
def discard_flash_errors
|
||||
# Marks flash errors for deletion after the current action has completed.
|
||||
# This ensures flash errors generated during XHR requests are not persisted in the
|
||||
# session for longer than expected.
|
||||
flash.discard(:error)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -68,7 +68,7 @@ class EnterprisesController < BaseController
|
||||
# reset_distributor must be called before any call to current_customer or current_distributor
|
||||
order_cart_reset = OrderCartReset.new(order, params[:id])
|
||||
order_cart_reset.reset_distributor
|
||||
order_cart_reset.reset_other!(try_spree_current_user, current_customer)
|
||||
order_cart_reset.reset_other!(spree_current_user, current_customer)
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
flash[:error] = I18n.t(:enterprise_shop_show_error)
|
||||
redirect_to shops_path
|
||||
|
||||
@@ -16,6 +16,10 @@ class HomeController < BaseController
|
||||
|
||||
def sell; end
|
||||
|
||||
def unauthorized
|
||||
render 'shared/unauthorized', status: :unauthorized
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Cache the value of the query count
|
||||
|
||||
@@ -24,7 +24,7 @@ module Spree
|
||||
# This is in Spree::Core::ControllerHelpers::Auth
|
||||
# But you can't easily reopen modules in Ruby
|
||||
def unauthorized
|
||||
if try_spree_current_user
|
||||
if spree_current_user
|
||||
flash[:error] = t(:authorization_failure)
|
||||
redirect_to '/unauthorized'
|
||||
else
|
||||
|
||||
@@ -15,7 +15,7 @@ module Spree
|
||||
end
|
||||
|
||||
def testmail
|
||||
if TestMailer.test_email(try_spree_current_user).deliver
|
||||
if TestMailer.test_email(spree_current_user).deliver
|
||||
flash[:success] = Spree.t('admin.mail_methods.testmail.delivery_success')
|
||||
else
|
||||
flash[:error] = Spree.t('admin.mail_methods.testmail.delivery_error')
|
||||
|
||||
@@ -23,7 +23,7 @@ module Spree
|
||||
@order.associate_user!(Spree.user_class.find_by(email: @order.email))
|
||||
end
|
||||
|
||||
AdvanceOrderService.new(@order).call
|
||||
OrderWorkflow.new(@order).complete
|
||||
|
||||
@order.shipments.map(&:refresh_rates)
|
||||
flash[:success] = Spree.t('customer_details_updated')
|
||||
|
||||
@@ -27,7 +27,7 @@ module Spree
|
||||
|
||||
def new
|
||||
@order = Order.create
|
||||
@order.created_by = try_spree_current_user
|
||||
@order.created_by = spree_current_user
|
||||
@order.save
|
||||
redirect_to edit_admin_order_url(@order)
|
||||
end
|
||||
@@ -35,7 +35,7 @@ module Spree
|
||||
def edit
|
||||
@order.shipments.map(&:refresh_rates)
|
||||
|
||||
AdvanceOrderService.new(@order).call
|
||||
OrderWorkflow.new(@order).complete
|
||||
|
||||
# The payment step shows an error of 'No pending payments'
|
||||
# Clearing the errors from the order object will stop this error
|
||||
|
||||
@@ -37,7 +37,7 @@ module Spree
|
||||
|
||||
redirect_to admin_order_payments_path(@order)
|
||||
else
|
||||
AdvanceOrderService.new(@order).call!
|
||||
OrderWorkflow.new(@order).complete!
|
||||
|
||||
flash[:success] = Spree.t(:new_order_completed)
|
||||
redirect_to edit_admin_order_url(@order)
|
||||
@@ -61,7 +61,7 @@ module Spree
|
||||
else
|
||||
flash[:error] = t(:cannot_perform_operation)
|
||||
end
|
||||
rescue Spree::Core::GatewayError => e
|
||||
rescue StandardError => e
|
||||
flash[:error] = e.message
|
||||
ensure
|
||||
redirect_to request.referer
|
||||
|
||||
16
app/controllers/spree/base_controller.rb
Normal file
16
app/controllers/spree/base_controller.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'cancan'
|
||||
|
||||
module Spree
|
||||
class BaseController < ApplicationController
|
||||
include Spree::Core::ControllerHelpers::Auth
|
||||
include Spree::Core::ControllerHelpers::RespondWith
|
||||
include Spree::Core::ControllerHelpers::SSL
|
||||
include Spree::Core::ControllerHelpers::Common
|
||||
|
||||
respond_to :html
|
||||
end
|
||||
end
|
||||
|
||||
require 'spree/i18n/initializer'
|
||||
@@ -1,7 +0,0 @@
|
||||
module Spree
|
||||
class HomeController < Spree::StoreController
|
||||
respond_to :html
|
||||
|
||||
def index; end
|
||||
end
|
||||
end
|
||||
@@ -1,5 +1,5 @@
|
||||
require 'spree/core/controller_helpers/order_decorator'
|
||||
require 'spree/core/controller_helpers/auth_decorator'
|
||||
require 'spree/core/controller_helpers/order'
|
||||
require 'spree/core/controller_helpers/auth'
|
||||
|
||||
module Spree
|
||||
class OrdersController < Spree::StoreController
|
||||
@@ -194,7 +194,7 @@ module Spree
|
||||
return if session[:access_token] || params[:token] || spree_current_user
|
||||
|
||||
flash[:error] = I18n.t("spree.orders.edit.login_to_view_order")
|
||||
require_login_then_redirect_to request.env['PATH_INFO']
|
||||
redirect_to main_app.root_path(anchor: "login?after_login=#{request.env['PATH_INFO']}")
|
||||
end
|
||||
|
||||
def order_to_update
|
||||
|
||||
@@ -6,9 +6,5 @@ module Spree
|
||||
|
||||
include I18nHelper
|
||||
before_action :set_locale
|
||||
|
||||
def unauthorized
|
||||
render 'shared/unauthorized', status: :unauthorized
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "spree/core/controller_helpers/auth"
|
||||
require "spree/core/controller_helpers/common"
|
||||
require "spree/core/controller_helpers/order"
|
||||
require "spree/core/controller_helpers/ssl"
|
||||
|
||||
module Spree
|
||||
class UserPasswordsController < Devise::PasswordsController
|
||||
helper 'spree/base', 'spree/store'
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "spree/core/controller_helpers/auth"
|
||||
require "spree/core/controller_helpers/common"
|
||||
require "spree/core/controller_helpers/order"
|
||||
require "spree/core/controller_helpers/ssl"
|
||||
|
||||
module Spree
|
||||
class UserRegistrationsController < Devise::RegistrationsController
|
||||
helper 'spree/base', 'spree/store'
|
||||
@@ -23,7 +30,6 @@ module Spree
|
||||
if resource.save
|
||||
set_flash_message(:notice, :signed_up)
|
||||
sign_in(:spree_user, @user)
|
||||
session[:spree_user_signup] = true
|
||||
associate_user
|
||||
respond_with resource, location: after_sign_up_path_for(resource)
|
||||
else
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "spree/core/controller_helpers/auth"
|
||||
require "spree/core/controller_helpers/common"
|
||||
require "spree/core/controller_helpers/order"
|
||||
require "spree/core/controller_helpers/ssl"
|
||||
|
||||
module Spree
|
||||
class UserSessionsController < Devise::SessionsController
|
||||
helper 'spree/base', 'spree/store'
|
||||
@@ -39,8 +46,18 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
# Logout will clear session data including shopfront_redirect
|
||||
# Here we store it before actually logging out so that the redirect works correctly
|
||||
@shopfront_redirect = session[:shopfront_redirect]
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_reader :shopfront_redirect
|
||||
|
||||
def accurate_title
|
||||
Spree.t(:login)
|
||||
end
|
||||
|
||||
@@ -59,7 +59,7 @@ module Spree
|
||||
if @user
|
||||
authorize! params[:action].to_sym, @user
|
||||
else
|
||||
redirect_to spree.login_path
|
||||
redirect_to main_app.login_path
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -44,9 +44,10 @@ class UserConfirmationsController < DeviseController
|
||||
'not_confirmed'
|
||||
end
|
||||
|
||||
if resource.reset_password_token.present?
|
||||
if result == 'confirmed' && resource.reset_password_token.present?
|
||||
raw_reset_password_token = resource.regenerate_reset_password_token
|
||||
return spree.edit_spree_user_password_path(
|
||||
reset_password_token: resource.reset_password_token
|
||||
reset_password_token: raw_reset_password_token
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ class UserPasswordsController < Spree::UserPasswordsController
|
||||
|
||||
if resource.errors.empty?
|
||||
set_flash_message(:success, :send_instructions) if is_navigational_format?
|
||||
respond_with resource, location: spree.login_path
|
||||
respond_with resource, location: main_app.login_path
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
|
||||
@@ -16,7 +16,6 @@ class UserRegistrationsController < Spree::UserRegistrationsController
|
||||
return render_error(@user.errors)
|
||||
end
|
||||
|
||||
session[:spree_user_signup] = true
|
||||
session[:confirmation_return_url] = params[:return_url]
|
||||
associate_user
|
||||
|
||||
|
||||
@@ -45,27 +45,33 @@ class SubscriptionConfirmJob
|
||||
def confirm_order!(order)
|
||||
record_order(order)
|
||||
|
||||
if process_payment!(order)
|
||||
send_confirmation_email(order)
|
||||
else
|
||||
process_payment!(order)
|
||||
send_confirmation_email(order)
|
||||
rescue StandardError => e
|
||||
if order.errors.any?
|
||||
send_failed_payment_email(order)
|
||||
else
|
||||
Bugsnag.notify(e, order: order)
|
||||
send_failed_payment_email(order, e.message)
|
||||
end
|
||||
end
|
||||
|
||||
# Process the order payment and raise if it's not successful
|
||||
def process_payment!(order)
|
||||
return false if order.errors.present?
|
||||
return true unless order.payment_required?
|
||||
raise if order.errors.present?
|
||||
return unless order.payment_required?
|
||||
|
||||
prepare_for_payment!(order)
|
||||
order.process_payments!
|
||||
raise if order.errors.any?
|
||||
end
|
||||
|
||||
def prepare_for_payment!(order)
|
||||
setup_payment!(order)
|
||||
return false if order.errors.any?
|
||||
raise if order.errors.any?
|
||||
|
||||
authorize_payment!(order)
|
||||
return false if order.errors.any?
|
||||
|
||||
order.process_payments!
|
||||
return false if order.errors.any?
|
||||
|
||||
true
|
||||
raise if order.errors.any?
|
||||
end
|
||||
|
||||
def setup_payment!(order)
|
||||
@@ -87,9 +93,11 @@ class SubscriptionConfirmJob
|
||||
SubscriptionMailer.confirmation_email(order).deliver
|
||||
end
|
||||
|
||||
def send_failed_payment_email(order)
|
||||
def send_failed_payment_email(order, error_message = nil)
|
||||
order.update!
|
||||
record_and_log_error(:failed_payment, order)
|
||||
record_and_log_error(:failed_payment, order, error_message)
|
||||
SubscriptionMailer.failed_payment_email(order).deliver
|
||||
rescue StandardError => e
|
||||
Bugsnag.notify(e, order: order, error_message: error_message)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -29,10 +29,16 @@ class SubscriptionPlacementJob
|
||||
|
||||
def place_order_for(proxy_order)
|
||||
JobLogger.logger.info("Placing Order for Proxy Order #{proxy_order.id}")
|
||||
proxy_order.initialise_order!
|
||||
initialise_order(proxy_order)
|
||||
place_order(proxy_order.order)
|
||||
end
|
||||
|
||||
def initialise_order(proxy_order)
|
||||
proxy_order.initialise_order!
|
||||
rescue StandardError => e
|
||||
Bugsnag.notify(e, subscription: proxy_order.subscription, proxy_order: proxy_order)
|
||||
end
|
||||
|
||||
def place_order(order)
|
||||
record_order(order)
|
||||
return record_issue(:complete, order) if order.completed?
|
||||
@@ -42,8 +48,9 @@ class SubscriptionPlacementJob
|
||||
|
||||
move_to_completion(order)
|
||||
send_placement_email(order, changes)
|
||||
rescue StateMachine::InvalidTransition
|
||||
record_and_log_error(:processing, order)
|
||||
rescue StandardError => e
|
||||
record_and_log_error(:processing, order, e.message)
|
||||
Bugsnag.notify(e, order: order)
|
||||
end
|
||||
|
||||
def cap_quantity_and_store_changes(order)
|
||||
@@ -66,7 +73,7 @@ class SubscriptionPlacementJob
|
||||
end
|
||||
|
||||
def move_to_completion(order)
|
||||
AdvanceOrderService.new(order).call!
|
||||
OrderWorkflow.new(order).complete!
|
||||
end
|
||||
|
||||
def unavailable_stock_lines_for(order)
|
||||
|
||||
26
app/mailers/spree/base_mailer.rb
Normal file
26
app/mailers/spree/base_mailer.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class BaseMailer < ActionMailer::Base
|
||||
# Inline stylesheets
|
||||
include Roadie::Rails::Automatic
|
||||
|
||||
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,14 +0,0 @@
|
||||
Spree::BaseMailer.class_eval do
|
||||
# Inline stylesheets
|
||||
include Roadie::Rails::Automatic
|
||||
|
||||
# Define layout
|
||||
layout 'mailer'
|
||||
|
||||
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
|
||||
68
app/mailers/spree/order_mailer.rb
Normal file
68
app/mailers/spree/order_mailer.rb
Normal file
@@ -0,0 +1,68 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class OrderMailer < BaseMailer
|
||||
helper HtmlHelper
|
||||
helper ::CheckoutHelper
|
||||
helper SpreeCurrencyHelper
|
||||
helper OrderHelper
|
||||
include I18nHelper
|
||||
|
||||
def cancel_email(order_or_order_id, resend = false)
|
||||
@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
|
||||
|
||||
def confirm_email_for_customer(order_or_order_id, resend = false)
|
||||
@order = find_order(order_or_order_id)
|
||||
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
|
||||
end
|
||||
|
||||
def confirm_email_for_shop(order_or_order_id, resend = false)
|
||||
@order = find_order(order_or_order_id)
|
||||
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
|
||||
|
||||
def invoice_email(order_or_order_id, pdf)
|
||||
@order = find_order(order_or_order_id)
|
||||
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
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Finds an order instance from an order or from an order id
|
||||
def find_order(order_or_order_id)
|
||||
order_or_order_id.respond_to?(:id) ? order_or_order_id : Spree::Order.find(order_or_order_id)
|
||||
end
|
||||
|
||||
def mail_subject(base_subject, resend)
|
||||
resend_prefix = (resend ? "[#{t(:resend).upcase}] " : '')
|
||||
"#{resend_prefix}#{Spree::Config[:site_name]} #{base_subject} ##{@order.number}"
|
||||
end
|
||||
|
||||
def attach_file(filename, file)
|
||||
attachments[filename] = file if file.present?
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,64 +0,0 @@
|
||||
Spree::OrderMailer.class_eval do
|
||||
helper HtmlHelper
|
||||
helper CheckoutHelper
|
||||
helper SpreeCurrencyHelper
|
||||
helper OrderHelper
|
||||
include I18nHelper
|
||||
|
||||
def cancel_email(order_or_order_id, resend = false)
|
||||
@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
|
||||
|
||||
def confirm_email_for_customer(order_or_order_id, resend = false)
|
||||
@order = find_order(order_or_order_id)
|
||||
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
|
||||
end
|
||||
|
||||
def confirm_email_for_shop(order_or_order_id, resend = false)
|
||||
@order = find_order(order_or_order_id)
|
||||
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
|
||||
|
||||
def invoice_email(order_or_order_id, pdf)
|
||||
@order = find_order(order_or_order_id)
|
||||
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
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Finds an order instance from an order or from an order id
|
||||
def find_order(order_or_order_id)
|
||||
order_or_order_id.respond_to?(:id) ? order_or_order_id : Spree::Order.find(order_or_order_id)
|
||||
end
|
||||
|
||||
def mail_subject(base_subject, resend)
|
||||
resend_prefix = (resend ? "[#{t(:resend).upcase}] " : '')
|
||||
"#{resend_prefix}#{Spree::Config[:site_name]} #{base_subject} ##{@order.number}"
|
||||
end
|
||||
|
||||
def attach_file(filename, file)
|
||||
attachments[filename] = file if file.present?
|
||||
end
|
||||
end
|
||||
13
app/mailers/spree/shipment_mailer.rb
Normal file
13
app/mailers/spree/shipment_mailer.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class ShipmentMailer < BaseMailer
|
||||
def shipped_email(shipment, resend = false)
|
||||
@shipment = shipment.respond_to?(:id) ? shipment : Spree::Shipment.find(shipment)
|
||||
subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
|
||||
base_subject = t('spree.shipment_mailer.shipped_email.subject')
|
||||
subject += "#{Spree::Config[:site_name]} #{base_subject} ##{@shipment.order.number}"
|
||||
mail(to: @shipment.order.email, from: from_address, subject: subject)
|
||||
end
|
||||
end
|
||||
end
|
||||
11
app/mailers/spree/test_mailer.rb
Normal file
11
app/mailers/spree/test_mailer.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class TestMailer < BaseMailer
|
||||
def test_email(user)
|
||||
recipient = user.respond_to?(:id) ? user : Spree.user_class.find(user)
|
||||
subject = "#{Spree::Config[:site_name]} #{t('spree.test_mailer.test_email.subject')}"
|
||||
mail(to: recipient.email, from: from_address, subject: subject)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -5,12 +5,11 @@ module Spree
|
||||
include I18nHelper
|
||||
|
||||
# Overrides `Devise::Mailer.reset_password_instructions`
|
||||
def reset_password_instructions(user)
|
||||
recipient = user.respond_to?(:id) ? user : Spree.user_class.find(user)
|
||||
def reset_password_instructions(user, token, _opts = {})
|
||||
@edit_password_reset_url = spree.
|
||||
edit_spree_user_password_url(reset_password_token: recipient.reset_password_token)
|
||||
edit_spree_user_password_url(reset_password_token: token)
|
||||
|
||||
mail(to: recipient.email, from: from_address,
|
||||
mail(to: user.email, from: from_address,
|
||||
subject: Spree::Config[:site_name] + ' ' +
|
||||
I18n.t(:subject, scope: [:devise, :mailer, :reset_password_instructions]))
|
||||
end
|
||||
@@ -25,8 +24,9 @@ module Spree
|
||||
end
|
||||
|
||||
# Overrides `Devise::Mailer.confirmation_instructions`
|
||||
def confirmation_instructions(user, _opts)
|
||||
def confirmation_instructions(user, token, _opts = {})
|
||||
@user = user
|
||||
@token = token
|
||||
@instance = Spree::Config[:site_name]
|
||||
@contact = ContentConfig.footer_email
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ class ContentConfiguration < Spree::Preferences::FileConfiguration
|
||||
preference :open_street_map_enabled, :boolean, default: false
|
||||
preference :open_street_map_provider_name, :string, default: "OpenStreetMap.Mapnik"
|
||||
preference :open_street_map_provider_options, :text, default: "{}"
|
||||
preference :open_street_map_default_latitude, :string, default: "-37.4713077"
|
||||
preference :open_street_map_default_longitude, :string, default: "144.7851531"
|
||||
|
||||
# Producer sign-up page
|
||||
# All the following defaults using I18n don't work.
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
require 'delegate'
|
||||
|
||||
class OrderUpdater < SimpleDelegator
|
||||
# TODO: This logic adapted from Spree 2.4, remove when we get there
|
||||
# Handles state updating in a much more logical way than < 2.4
|
||||
# Specifically, doesn't depend on payments.last to determine payment state
|
||||
# Also swapped: == 0 for .zero?, .size == 0 for empty? and .size > 0 for !empty?
|
||||
# See:
|
||||
# https://github.com/spree/spree/commit/38b8456183d11fc1e00e395e7c9154c76ef65b85
|
||||
# https://github.com/spree/spree/commit/7b264acff7824f5b3dc6651c106631d8f30b147a
|
||||
def update_payment_state
|
||||
last_payment_state = order.payment_state
|
||||
|
||||
order.payment_state = infer_payment_state
|
||||
track_payment_state_change(last_payment_state)
|
||||
|
||||
order.payment_state
|
||||
end
|
||||
|
||||
def before_save_hook
|
||||
shipping_address_from_distributor
|
||||
end
|
||||
|
||||
# Sets the distributor's address as shipping address of the order for those
|
||||
# shipments using a shipping method that doesn't require address, such us
|
||||
# a pickup.
|
||||
def shipping_address_from_distributor
|
||||
return if order.shipping_method.blank? || order.shipping_method.require_ship_address
|
||||
|
||||
order.ship_address = order.address_from_distributor
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def infer_payment_state
|
||||
if failed_payments?
|
||||
'failed'
|
||||
elsif canceled_and_not_paid_for?
|
||||
'void'
|
||||
else
|
||||
infer_payment_state_from_balance
|
||||
end
|
||||
end
|
||||
|
||||
def infer_payment_state_from_balance
|
||||
# This part added so that we don't need to override
|
||||
# order.outstanding_balance
|
||||
balance = order.outstanding_balance
|
||||
balance = -1 * order.payment_total if canceled_and_paid_for?
|
||||
|
||||
infer_state(balance)
|
||||
end
|
||||
|
||||
def infer_state(balance)
|
||||
if balance > 0
|
||||
'balance_due'
|
||||
elsif balance < 0
|
||||
'credit_owed'
|
||||
elsif balance.zero?
|
||||
'paid'
|
||||
end
|
||||
end
|
||||
|
||||
# Tracks the state transition through a state_change for this order. It
|
||||
# does so until the last state is reached. That is, when the infered next
|
||||
# state is the same as the order has now.
|
||||
#
|
||||
# @param last_payment_state [String]
|
||||
def track_payment_state_change(last_payment_state)
|
||||
return if last_payment_state == order.payment_state
|
||||
|
||||
order.state_changed('payment')
|
||||
end
|
||||
|
||||
# Taken from order.outstanding_balance in Spree 2.4
|
||||
# See: https://github.com/spree/spree/commit/7b264acff7824f5b3dc6651c106631d8f30b147a
|
||||
def canceled_and_paid_for?
|
||||
order.canceled? && paid?
|
||||
end
|
||||
|
||||
def canceled_and_not_paid_for?
|
||||
order.state == 'canceled' && order.payment_total.zero?
|
||||
end
|
||||
|
||||
def paid?
|
||||
payments.present? && !payments.completed.empty?
|
||||
end
|
||||
|
||||
def failed_payments?
|
||||
payments.present? && payments.valid.empty?
|
||||
end
|
||||
end
|
||||
@@ -10,7 +10,9 @@ module PreferenceSections
|
||||
[
|
||||
:open_street_map_enabled,
|
||||
:open_street_map_provider_name,
|
||||
:open_street_map_provider_options
|
||||
:open_street_map_provider_options,
|
||||
:open_street_map_default_latitude,
|
||||
:open_street_map_default_longitude
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
191
app/models/spree/order/checkout.rb
Normal file
191
app/models/spree/order/checkout.rb
Normal file
@@ -0,0 +1,191 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class Order < ActiveRecord::Base
|
||||
module Checkout
|
||||
def self.included(klass)
|
||||
klass.class_eval do
|
||||
class_attribute :next_event_transitions
|
||||
class_attribute :previous_states
|
||||
class_attribute :checkout_flow
|
||||
class_attribute :checkout_steps
|
||||
class_attribute :removed_transitions
|
||||
|
||||
def self.checkout_flow(&block)
|
||||
if block_given?
|
||||
@checkout_flow = block
|
||||
define_state_machine!
|
||||
else
|
||||
@checkout_flow
|
||||
end
|
||||
end
|
||||
|
||||
def self.define_state_machine!
|
||||
self.checkout_steps = {}
|
||||
self.next_event_transitions = []
|
||||
self.previous_states = [:cart]
|
||||
self.removed_transitions = []
|
||||
|
||||
# Build the checkout flow using the checkout_flow defined either
|
||||
# within the Order class, or a decorator for that class.
|
||||
#
|
||||
# This method may be called multiple times depending on if the
|
||||
# checkout_flow is re-defined in a decorator or not.
|
||||
instance_eval(&checkout_flow)
|
||||
|
||||
klass = self
|
||||
|
||||
# To avoid a ton of warnings when the state machine is re-defined
|
||||
StateMachine::Machine.ignore_method_conflicts = true
|
||||
# To avoid multiple occurrences of the same transition being defined
|
||||
# On first definition, state_machines will not be defined
|
||||
state_machines.clear if respond_to?(:state_machines)
|
||||
state_machine :state, initial: :cart do
|
||||
klass.next_event_transitions.each { |t| transition(t.merge(on: :next)) }
|
||||
|
||||
# Persist the state on the order
|
||||
after_transition do |order|
|
||||
order.state = order.state
|
||||
order.save
|
||||
end
|
||||
|
||||
event :cancel do
|
||||
transition to: :canceled, if: :allow_cancel?
|
||||
end
|
||||
|
||||
event :return do
|
||||
transition to: :returned, from: :awaiting_return, unless: :awaiting_returns?
|
||||
end
|
||||
|
||||
event :resume do
|
||||
transition to: :resumed, from: :canceled, if: :allow_resume?
|
||||
end
|
||||
|
||||
event :authorize_return do
|
||||
transition to: :awaiting_return
|
||||
end
|
||||
|
||||
if states[:payment]
|
||||
before_transition to: :complete do |order|
|
||||
order.process_payments! if order.payment_required?
|
||||
end
|
||||
end
|
||||
|
||||
before_transition from: :cart, do: :ensure_line_items_present
|
||||
|
||||
before_transition to: :delivery, do: :create_proposed_shipments
|
||||
before_transition to: :delivery, do: :ensure_available_shipping_rates
|
||||
|
||||
after_transition to: :complete, do: :finalize!
|
||||
after_transition to: :delivery, do: :create_tax_charge!
|
||||
after_transition to: :resumed, do: :after_resume
|
||||
after_transition to: :canceled, do: :after_cancel
|
||||
end
|
||||
end
|
||||
|
||||
def self.go_to_state(name, options = {})
|
||||
checkout_steps[name] = options
|
||||
previous_states.each do |state|
|
||||
add_transition({ from: state, to: name }.merge(options))
|
||||
end
|
||||
if options[:if]
|
||||
previous_states << name
|
||||
else
|
||||
self.previous_states = [name]
|
||||
end
|
||||
end
|
||||
|
||||
def self.insert_checkout_step(name, options = {})
|
||||
before = options.delete(:before)
|
||||
after = options.delete(:after) unless before
|
||||
after = checkout_steps.keys.last unless before || after
|
||||
|
||||
cloned_steps = checkout_steps.clone
|
||||
cloned_removed_transitions = removed_transitions.clone
|
||||
checkout_flow do
|
||||
cloned_steps.each_pair do |key, value|
|
||||
go_to_state(name, options) if key == before
|
||||
go_to_state(key, value)
|
||||
go_to_state(name, options) if key == after
|
||||
end
|
||||
cloned_removed_transitions.each do |transition|
|
||||
remove_transition(transition)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.remove_checkout_step(name)
|
||||
cloned_steps = checkout_steps.clone
|
||||
cloned_removed_transitions = removed_transitions.clone
|
||||
checkout_flow do
|
||||
cloned_steps.each_pair do |key, value|
|
||||
go_to_state(key, value) unless key == name
|
||||
end
|
||||
cloned_removed_transitions.each do |transition|
|
||||
remove_transition(transition)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.remove_transition(options = {})
|
||||
removed_transitions << options
|
||||
next_event_transitions.delete(find_transition(options))
|
||||
end
|
||||
|
||||
def self.find_transition(options = {})
|
||||
return nil if options.nil? || !options.include?(:from) || !options.include?(:to)
|
||||
|
||||
next_event_transitions.detect do |transition|
|
||||
transition[options[:from].to_sym] == options[:to].to_sym
|
||||
end
|
||||
end
|
||||
|
||||
def self.next_event_transitions
|
||||
@next_event_transitions ||= []
|
||||
end
|
||||
|
||||
def self.checkout_steps
|
||||
@checkout_steps ||= {}
|
||||
end
|
||||
|
||||
def self.add_transition(options)
|
||||
next_event_transitions << { options.delete(:from) => options.delete(:to) }.
|
||||
merge(options)
|
||||
end
|
||||
|
||||
def checkout_steps
|
||||
steps = self.class.checkout_steps.
|
||||
each_with_object([]) { |(step, options), checkout_steps|
|
||||
next if options.include?(:if) && !options[:if].call(self)
|
||||
|
||||
checkout_steps << step
|
||||
}.map(&:to_s)
|
||||
# Ensure there is always a complete step
|
||||
steps << "complete" unless steps.include?("complete")
|
||||
steps
|
||||
end
|
||||
|
||||
def checkout_step?(step)
|
||||
step.present? ? checkout_steps.include?(step) : false
|
||||
end
|
||||
|
||||
def checkout_step_index(step)
|
||||
checkout_steps.index(step)
|
||||
end
|
||||
|
||||
def self.removed_transitions
|
||||
@removed_transitions ||= []
|
||||
end
|
||||
|
||||
def can_go_to_state?(state)
|
||||
return false unless self.state.present? &&
|
||||
checkout_step?(state) &&
|
||||
checkout_step?(self.state)
|
||||
|
||||
checkout_step_index(state) > checkout_step_index(self.state)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -89,6 +89,10 @@ Spree::Order.class_eval do
|
||||
where("state != ?", state)
|
||||
}
|
||||
|
||||
def updater
|
||||
@updater ||= OrderManagement::Order::Updater.new(self)
|
||||
end
|
||||
|
||||
def create_proposed_shipments
|
||||
adjustments.shipping.delete_all
|
||||
shipments.destroy_all
|
||||
@@ -374,6 +378,13 @@ Spree::Order.class_eval do
|
||||
address
|
||||
end
|
||||
|
||||
# Update attributes of a record in the database without callbacks, validations etc.
|
||||
# This was originally an extension to ActiveRecord in Spree but only used for Spree::Order
|
||||
def update_attributes_without_callbacks(attributes)
|
||||
assign_attributes(attributes)
|
||||
Spree::Order.where(id: id).update_all(attributes)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def adjustments_fetcher
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
Spree::OrderUpdater.class_eval do
|
||||
# Override spree method to make it update all adjustments as in Spree v2.0.4
|
||||
def update_shipping_adjustments
|
||||
order.adjustments.reload.each(&:update!)
|
||||
end
|
||||
end
|
||||
216
app/models/spree/payment.rb
Normal file
216
app/models/spree/payment.rb
Normal file
@@ -0,0 +1,216 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class Payment < ActiveRecord::Base
|
||||
include Spree::Payment::Processing
|
||||
extend Spree::LocalizedNumber
|
||||
|
||||
localize_number :amount
|
||||
|
||||
IDENTIFIER_CHARS = (('A'..'Z').to_a + ('0'..'9').to_a - %w(0 1 I O)).freeze
|
||||
|
||||
delegate :line_items, to: :order
|
||||
delegate :currency, to: :order
|
||||
|
||||
belongs_to :order, class_name: 'Spree::Order'
|
||||
belongs_to :source, polymorphic: true
|
||||
belongs_to :payment_method, class_name: 'Spree::PaymentMethod'
|
||||
|
||||
has_many :offsets, -> { where("source_type = 'Spree::Payment' AND amount < 0").completed },
|
||||
class_name: "Spree::Payment", foreign_key: :source_id
|
||||
has_many :log_entries, as: :source, dependent: :destroy
|
||||
|
||||
has_one :adjustment, as: :source, dependent: :destroy
|
||||
|
||||
validate :validate_source
|
||||
before_save :set_unique_identifier
|
||||
|
||||
after_save :create_payment_profile, if: :profiles_supported?
|
||||
|
||||
# update the order totals, etc.
|
||||
after_save :ensure_correct_adjustment, :update_order
|
||||
# invalidate previously entered payments
|
||||
after_create :invalidate_old_payments
|
||||
|
||||
# Skips the validation of the source (for example, credit card) of the payment.
|
||||
#
|
||||
# This is used in refunds as the validation of the card can fail but the refund can go through,
|
||||
# we trust the payment gateway in these cases. For example, Stripe is accepting refunds with
|
||||
# source cards that were valid when the payment was placed but are now expired, and we
|
||||
# consider them invalid.
|
||||
attr_accessor :skip_source_validation
|
||||
attr_accessor :source_attributes
|
||||
|
||||
after_initialize :build_source
|
||||
|
||||
scope :from_credit_card, -> { where(source_type: 'Spree::CreditCard') }
|
||||
scope :with_state, ->(s) { where(state: s.to_s) }
|
||||
scope :completed, -> { with_state('completed') }
|
||||
scope :pending, -> { with_state('pending') }
|
||||
scope :failed, -> { with_state('failed') }
|
||||
scope :valid, -> { where('state NOT IN (?)', %w(failed invalid)) }
|
||||
|
||||
# order state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
|
||||
state_machine initial: :checkout do
|
||||
# With card payments, happens before purchase or authorization happens
|
||||
event :started_processing do
|
||||
transition from: [:checkout, :pending, :completed, :processing], to: :processing
|
||||
end
|
||||
# When processing during checkout fails
|
||||
event :failure do
|
||||
transition from: [:pending, :processing], to: :failed
|
||||
end
|
||||
# With card payments this represents authorizing the payment
|
||||
event :pend do
|
||||
transition from: [:checkout, :processing], to: :pending
|
||||
end
|
||||
# With card payments this represents completing a purchase or capture transaction
|
||||
event :complete do
|
||||
transition from: [:processing, :pending, :checkout], to: :completed
|
||||
end
|
||||
event :void do
|
||||
transition from: [:pending, :completed, :checkout], to: :void
|
||||
end
|
||||
# when the card brand isnt supported
|
||||
event :invalidate do
|
||||
transition from: [:checkout], to: :invalid
|
||||
end
|
||||
end
|
||||
|
||||
def money
|
||||
Spree::Money.new(amount, currency: currency)
|
||||
end
|
||||
alias display_amount money
|
||||
|
||||
def offsets_total
|
||||
offsets.pluck(:amount).sum
|
||||
end
|
||||
|
||||
def credit_allowed
|
||||
amount - offsets_total
|
||||
end
|
||||
|
||||
def can_credit?
|
||||
credit_allowed.positive?
|
||||
end
|
||||
|
||||
def build_source
|
||||
return if source_attributes.nil?
|
||||
return unless payment_method.andand.payment_source_class
|
||||
|
||||
self.source = payment_method.payment_source_class.new(source_attributes)
|
||||
source.payment_method_id = payment_method.id
|
||||
source.user_id = order.user_id if order
|
||||
end
|
||||
|
||||
# Pin payments lacks void and credit methods, but it does have refund
|
||||
# Here we swap credit out for refund and remove void as a possible action
|
||||
def actions
|
||||
return [] unless payment_source&.respond_to?(:actions)
|
||||
|
||||
actions = payment_source.actions.select do |action|
|
||||
!payment_source.respond_to?("can_#{action}?") ||
|
||||
payment_source.__send__("can_#{action}?", self)
|
||||
end
|
||||
|
||||
if payment_method.is_a? Gateway::Pin
|
||||
actions << 'refund' if actions.include? 'credit'
|
||||
actions.reject! { |a| ['credit', 'void'].include? a }
|
||||
end
|
||||
|
||||
actions
|
||||
end
|
||||
|
||||
def payment_source
|
||||
res = source.is_a?(Payment) ? source.source : source
|
||||
res || payment_method
|
||||
end
|
||||
|
||||
def ensure_correct_adjustment
|
||||
revoke_adjustment_eligibility if ['failed', 'invalid'].include?(state)
|
||||
return if adjustment.try(:finalized?)
|
||||
|
||||
if adjustment
|
||||
adjustment.originator = payment_method
|
||||
adjustment.label = adjustment_label
|
||||
adjustment.save
|
||||
else
|
||||
payment_method.create_adjustment(adjustment_label, order, self, true)
|
||||
association(:adjustment).reload
|
||||
end
|
||||
end
|
||||
|
||||
def adjustment_label
|
||||
I18n.t('payment_method_fee')
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Don't charge fees for invalid or failed payments.
|
||||
# This is called twice for failed payments, because the persistence of the 'failed'
|
||||
# state is acheived through some trickery using an after_rollback callback on the
|
||||
# payment model. See Spree::Payment#persist_invalid
|
||||
def revoke_adjustment_eligibility
|
||||
return unless adjustment.try(:reload)
|
||||
return if adjustment.finalized?
|
||||
|
||||
adjustment.update_attribute(:eligible, false)
|
||||
adjustment.finalize!
|
||||
end
|
||||
|
||||
def validate_source
|
||||
if source && !skip_source_validation && !source.valid?
|
||||
source.errors.each do |field, error|
|
||||
field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{field}")
|
||||
errors.add(Spree.t(source.class.to_s.demodulize.underscore), "#{field_name} #{error}")
|
||||
end
|
||||
end
|
||||
errors.blank?
|
||||
end
|
||||
|
||||
def profiles_supported?
|
||||
payment_method.respond_to?(:payment_profiles_supported?) &&
|
||||
payment_method.payment_profiles_supported?
|
||||
end
|
||||
|
||||
def create_payment_profile
|
||||
return unless source.is_a?(CreditCard)
|
||||
return unless source.try(:save_requested_by_customer?)
|
||||
return unless source.number || source.gateway_payment_profile_id
|
||||
return unless source.gateway_customer_profile_id.nil?
|
||||
|
||||
payment_method.create_profile(self)
|
||||
rescue ActiveMerchant::ConnectionError => e
|
||||
gateway_error e
|
||||
end
|
||||
|
||||
# Makes newly entered payments invalidate previously entered payments so the most recent payment
|
||||
# is used by the gateway.
|
||||
def invalidate_old_payments
|
||||
order.payments.with_state('checkout').where.not(id: id).each do |payment|
|
||||
# Using update_column skips validations and so it skips validate_source. As we are just
|
||||
# invalidating past payments here, we don't want to validate all of them at this stage.
|
||||
payment.update_column(:state, 'invalid')
|
||||
payment.ensure_correct_adjustment
|
||||
end
|
||||
end
|
||||
|
||||
def update_order
|
||||
order.payments.reload
|
||||
order.update!
|
||||
end
|
||||
|
||||
# Necessary because some payment gateways will refuse payments with
|
||||
# duplicate IDs. We *were* using the Order number, but that's set once and
|
||||
# is unchanging. What we need is a unique identifier on a per-payment basis,
|
||||
# and this is it. Related to #1998.
|
||||
# See https://github.com/spree/spree/issues/1998#issuecomment-12869105
|
||||
def set_unique_identifier
|
||||
self.identifier = generate_identifier while self.class.exists?(identifier: identifier)
|
||||
end
|
||||
|
||||
def generate_identifier
|
||||
Array.new(8){ IDENTIFIER_CHARS.sample }.join
|
||||
end
|
||||
end
|
||||
end
|
||||
277
app/models/spree/payment/processing.rb
Normal file
277
app/models/spree/payment/processing.rb
Normal file
@@ -0,0 +1,277 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class Payment < ActiveRecord::Base
|
||||
module Processing
|
||||
def process!
|
||||
return unless payment_method&.source_required?
|
||||
|
||||
raise Core::GatewayError, Spree.t(:payment_processing_failed) unless source
|
||||
|
||||
return if processing?
|
||||
|
||||
unless payment_method.supports?(source)
|
||||
invalidate!
|
||||
raise Core::GatewayError, Spree.t(:payment_method_not_supported)
|
||||
end
|
||||
|
||||
if payment_method.auto_capture?
|
||||
purchase!
|
||||
else
|
||||
authorize!
|
||||
end
|
||||
end
|
||||
|
||||
def authorize!
|
||||
started_processing!
|
||||
gateway_action(source, :authorize, :pend)
|
||||
end
|
||||
|
||||
def purchase!
|
||||
started_processing!
|
||||
gateway_action(source, :purchase, :complete)
|
||||
end
|
||||
|
||||
def capture!
|
||||
return true if completed?
|
||||
|
||||
started_processing!
|
||||
protect_from_connection_error do
|
||||
check_environment
|
||||
|
||||
response = if payment_method.payment_profiles_supported?
|
||||
# Gateways supporting payment profiles will need access to credit
|
||||
# card object because this stores the payment profile information
|
||||
# so supply the authorization itself as well as the credit card,
|
||||
# rather than just the authorization code
|
||||
payment_method.capture(self, source, gateway_options)
|
||||
else
|
||||
# Standard ActiveMerchant capture usage
|
||||
payment_method.capture(money.money.cents,
|
||||
response_code,
|
||||
gateway_options)
|
||||
end
|
||||
|
||||
handle_response(response, :complete, :failure)
|
||||
end
|
||||
end
|
||||
|
||||
def void_transaction!
|
||||
return true if void?
|
||||
|
||||
protect_from_connection_error do
|
||||
check_environment
|
||||
|
||||
response = if payment_method.payment_profiles_supported?
|
||||
# Gateways supporting payment profiles will need access to credit
|
||||
# card object because this stores the payment profile information
|
||||
# so supply the authorization itself as well as the credit card,
|
||||
# rather than just the authorization code
|
||||
payment_method.void(response_code, source, gateway_options)
|
||||
else
|
||||
# Standard ActiveMerchant void usage
|
||||
payment_method.void(response_code, gateway_options)
|
||||
end
|
||||
|
||||
record_response(response)
|
||||
|
||||
if response.success?
|
||||
self.response_code = response.authorization
|
||||
void
|
||||
else
|
||||
gateway_error(response)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def credit!(credit_amount = nil)
|
||||
protect_from_connection_error do
|
||||
check_environment
|
||||
|
||||
credit_amount = calculate_refund_amount(credit_amount)
|
||||
|
||||
response = if payment_method.payment_profiles_supported?
|
||||
payment_method.credit(
|
||||
(credit_amount * 100).round,
|
||||
source,
|
||||
response_code,
|
||||
gateway_options
|
||||
)
|
||||
else
|
||||
payment_method.credit(
|
||||
(credit_amount * 100).round,
|
||||
response_code,
|
||||
gateway_options
|
||||
)
|
||||
end
|
||||
|
||||
record_response(response)
|
||||
|
||||
if response.success?
|
||||
self.class.create!(
|
||||
order: order,
|
||||
source: self,
|
||||
payment_method: payment_method,
|
||||
amount: credit_amount.abs * -1,
|
||||
response_code: response.authorization,
|
||||
state: 'completed',
|
||||
skip_source_validation: true
|
||||
)
|
||||
else
|
||||
gateway_error(response)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def refund!(refund_amount = nil)
|
||||
protect_from_connection_error do
|
||||
check_environment
|
||||
|
||||
refund_amount = calculate_refund_amount(refund_amount)
|
||||
|
||||
response = if payment_method.payment_profiles_supported?
|
||||
payment_method.refund(
|
||||
(refund_amount * 100).round,
|
||||
source,
|
||||
response_code,
|
||||
gateway_options
|
||||
)
|
||||
else
|
||||
payment_method.refund(
|
||||
(refund_amount * 100).round,
|
||||
response_code,
|
||||
gateway_options
|
||||
)
|
||||
end
|
||||
|
||||
record_response(response)
|
||||
|
||||
if response.success?
|
||||
self.class.create!(
|
||||
order: order,
|
||||
source: self,
|
||||
payment_method: payment_method,
|
||||
amount: refund_amount.abs * -1,
|
||||
response_code: response.authorization,
|
||||
state: 'completed',
|
||||
skip_source_validation: true
|
||||
)
|
||||
else
|
||||
gateway_error(response)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def partial_credit(amount)
|
||||
return if amount > credit_allowed
|
||||
|
||||
started_processing!
|
||||
credit!(amount)
|
||||
end
|
||||
|
||||
def gateway_options
|
||||
options = { email: order.email,
|
||||
customer: order.email,
|
||||
ip: order.last_ip_address,
|
||||
# Need to pass in a unique identifier here to make some
|
||||
# payment gateways happy.
|
||||
#
|
||||
# For more information, please see Spree::Payment#set_unique_identifier
|
||||
order_id: gateway_order_id }
|
||||
|
||||
options.merge!({ shipping: order.ship_total * 100,
|
||||
tax: order.tax_total * 100,
|
||||
subtotal: order.item_total * 100,
|
||||
discount: order.promo_total * 100,
|
||||
currency: currency })
|
||||
|
||||
options.merge!({ billing_address: order.bill_address.try(:active_merchant_hash),
|
||||
shipping_address: order.ship_address.try(:active_merchant_hash) })
|
||||
|
||||
options
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def calculate_refund_amount(refund_amount = nil)
|
||||
refund_amount ||= if credit_allowed >= order.outstanding_balance.abs
|
||||
order.outstanding_balance.abs
|
||||
else
|
||||
credit_allowed.abs
|
||||
end
|
||||
refund_amount.to_f
|
||||
end
|
||||
|
||||
def gateway_action(source, action, success_state)
|
||||
protect_from_connection_error do
|
||||
check_environment
|
||||
|
||||
response = payment_method.public_send(
|
||||
action,
|
||||
(amount * 100).round,
|
||||
source,
|
||||
gateway_options
|
||||
)
|
||||
handle_response(response, success_state, :failure)
|
||||
end
|
||||
end
|
||||
|
||||
def handle_response(response, success_state, failure_state)
|
||||
record_response(response)
|
||||
|
||||
if response.success?
|
||||
unless response.authorization.nil?
|
||||
self.response_code = response.authorization
|
||||
self.avs_response = response.avs_result['code']
|
||||
|
||||
if response.cvv_result
|
||||
self.cvv_response_code = response.cvv_result['code']
|
||||
self.cvv_response_message = response.cvv_result['message']
|
||||
end
|
||||
end
|
||||
__send__("#{success_state}!")
|
||||
else
|
||||
__send__(failure_state)
|
||||
gateway_error(response)
|
||||
end
|
||||
end
|
||||
|
||||
def record_response(response)
|
||||
log_entries.create(details: response.to_yaml)
|
||||
end
|
||||
|
||||
def protect_from_connection_error
|
||||
yield
|
||||
rescue ActiveMerchant::ConnectionError => e
|
||||
gateway_error(e)
|
||||
end
|
||||
|
||||
def gateway_error(error)
|
||||
text = if error.is_a? ActiveMerchant::Billing::Response
|
||||
error.params['message'] || error.params['response_reason_text'] || error.message
|
||||
elsif error.is_a? ActiveMerchant::ConnectionError
|
||||
Spree.t(:unable_to_connect_to_gateway)
|
||||
else
|
||||
error.to_s
|
||||
end
|
||||
logger.error(Spree.t(:gateway_error))
|
||||
logger.error(" #{error.to_yaml}")
|
||||
raise Core::GatewayError, text
|
||||
end
|
||||
|
||||
# Saftey check to make sure we're not accidentally performing operations on a live gateway.
|
||||
# Ex. When testing in staging environment with a copy of production data.
|
||||
def check_environment
|
||||
return if payment_method.environment == Rails.env
|
||||
|
||||
message = Spree.t(:gateway_config_unavailable) + " - #{Rails.env}"
|
||||
raise Core::GatewayError, message
|
||||
end
|
||||
|
||||
# The unique identifier to be passed in to the payment gateway
|
||||
def gateway_order_id
|
||||
"#{order.number}-#{identifier}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,117 +0,0 @@
|
||||
require 'spree/localized_number'
|
||||
|
||||
module Spree
|
||||
Payment.class_eval do
|
||||
extend Spree::LocalizedNumber
|
||||
|
||||
delegate :line_items, to: :order
|
||||
|
||||
has_one :adjustment, as: :source, dependent: :destroy
|
||||
|
||||
after_save :ensure_correct_adjustment, :update_order
|
||||
|
||||
localize_number :amount
|
||||
|
||||
# We bypass this after_rollback callback that is setup in Spree::Payment
|
||||
# The issues the callback fixes are not experienced in OFN:
|
||||
# if a payment fails on checkout the state "failed" is persisted correctly
|
||||
def persist_invalid; end
|
||||
|
||||
def ensure_correct_adjustment
|
||||
revoke_adjustment_eligibility if ['failed', 'invalid'].include?(state)
|
||||
return if adjustment.try(:finalized?)
|
||||
|
||||
if adjustment
|
||||
adjustment.originator = payment_method
|
||||
adjustment.label = adjustment_label
|
||||
adjustment.save
|
||||
else
|
||||
payment_method.create_adjustment(adjustment_label, order, self, true)
|
||||
association(:adjustment).reload
|
||||
end
|
||||
end
|
||||
|
||||
def adjustment_label
|
||||
I18n.t('payment_method_fee')
|
||||
end
|
||||
|
||||
# Pin payments lacks void and credit methods, but it does have refund
|
||||
# Here we swap credit out for refund and remove void as a possible action
|
||||
def actions_with_pin_payment_adaptations
|
||||
actions = actions_without_pin_payment_adaptations
|
||||
if payment_method.is_a? Gateway::Pin
|
||||
actions << 'refund' if actions.include? 'credit'
|
||||
actions.reject! { |a| ['credit', 'void'].include? a }
|
||||
end
|
||||
actions
|
||||
end
|
||||
alias_method_chain :actions, :pin_payment_adaptations
|
||||
|
||||
def refund!(refund_amount = nil)
|
||||
protect_from_connection_error do
|
||||
check_environment
|
||||
|
||||
refund_amount = calculate_refund_amount(refund_amount)
|
||||
|
||||
if payment_method.payment_profiles_supported?
|
||||
response = payment_method.refund((refund_amount * 100).round, source, response_code, gateway_options)
|
||||
else
|
||||
response = payment_method.refund((refund_amount * 100).round, response_code, gateway_options)
|
||||
end
|
||||
|
||||
record_response(response)
|
||||
|
||||
if response.success?
|
||||
self.class.create(order: order,
|
||||
source: self,
|
||||
payment_method: payment_method,
|
||||
amount: refund_amount.abs * -1,
|
||||
response_code: response.authorization,
|
||||
state: 'completed')
|
||||
else
|
||||
gateway_error(response)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Import from future Spree v.2.3.0 d470b31798f37
|
||||
def build_source
|
||||
return if source_attributes.nil?
|
||||
return unless payment_method.andand.payment_source_class
|
||||
|
||||
self.source = payment_method.payment_source_class.new(source_attributes)
|
||||
source.payment_method_id = payment_method.id
|
||||
source.user_id = order.user_id if order
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def calculate_refund_amount(refund_amount = nil)
|
||||
refund_amount ||= credit_allowed >= order.outstanding_balance.abs ? order.outstanding_balance.abs : credit_allowed.abs
|
||||
refund_amount.to_f
|
||||
end
|
||||
|
||||
def create_payment_profile
|
||||
return unless source.is_a?(CreditCard)
|
||||
return unless source.try(:save_requested_by_customer?)
|
||||
return unless source.number || source.gateway_payment_profile_id
|
||||
return unless source.gateway_customer_profile_id.nil?
|
||||
|
||||
payment_method.create_profile(self)
|
||||
rescue ActiveMerchant::ConnectionError => e
|
||||
gateway_error e
|
||||
end
|
||||
|
||||
# Don't charge fees for invalid or failed payments.
|
||||
# This is called twice for failed payments, because the persistence of the 'failed'
|
||||
# state is acheived through some trickery using an after_rollback callback on the
|
||||
# payment model. See Spree::Payment#persist_invalid
|
||||
def revoke_adjustment_eligibility
|
||||
return unless adjustment.try(:reload)
|
||||
return if adjustment.finalized?
|
||||
|
||||
adjustment.update_attribute(:eligible, false)
|
||||
adjustment.finalize!
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -63,8 +63,7 @@ Spree::Product.class_eval do
|
||||
scope :visible_for, lambda { |enterprise|
|
||||
joins('LEFT OUTER JOIN spree_variants AS o_spree_variants ON (o_spree_variants.product_id = spree_products.id)').
|
||||
joins('LEFT OUTER JOIN inventory_items AS o_inventory_items ON (o_spree_variants.id = o_inventory_items.variant_id)').
|
||||
where('o_inventory_items.enterprise_id = (?) AND visible = (?)', enterprise, true).
|
||||
select('DISTINCT spree_products.*')
|
||||
where('o_inventory_items.enterprise_id = (?) AND visible = (?)', enterprise, true)
|
||||
}
|
||||
|
||||
# -- Scopes
|
||||
|
||||
58
app/models/spree/stock_item.rb
Normal file
58
app/models/spree/stock_item.rb
Normal file
@@ -0,0 +1,58 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Spree
|
||||
class StockItem < ActiveRecord::Base
|
||||
acts_as_paranoid
|
||||
|
||||
belongs_to :stock_location, class_name: 'Spree::StockLocation'
|
||||
belongs_to :variant, class_name: 'Spree::Variant'
|
||||
has_many :stock_movements, dependent: :destroy
|
||||
|
||||
validates :stock_location, :variant, presence: true
|
||||
validates :variant_id, uniqueness: { scope: [:stock_location_id, :deleted_at] }
|
||||
validates :count_on_hand, numericality: { greater_than_or_equal_to: 0, unless: :backorderable? }
|
||||
|
||||
delegate :weight, to: :variant
|
||||
delegate :name, to: :variant, prefix: true
|
||||
|
||||
def backordered_inventory_units
|
||||
Spree::InventoryUnit.backordered_for_stock_item(self)
|
||||
end
|
||||
|
||||
def adjust_count_on_hand(value)
|
||||
with_lock do
|
||||
self.count_on_hand = count_on_hand + value
|
||||
process_backorders if in_stock?
|
||||
|
||||
save!
|
||||
end
|
||||
end
|
||||
|
||||
def in_stock?
|
||||
count_on_hand.positive?
|
||||
end
|
||||
|
||||
# Tells whether it's available to be included in a shipment
|
||||
def available?
|
||||
in_stock? || backorderable?
|
||||
end
|
||||
|
||||
def variant
|
||||
Spree::Variant.unscoped { super }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def count_on_hand=(value)
|
||||
self[:count_on_hand] = value
|
||||
end
|
||||
|
||||
def process_backorders
|
||||
backordered_inventory_units.each do |unit|
|
||||
break unless in_stock?
|
||||
|
||||
unit.fill_backorder
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,9 +1,6 @@
|
||||
Spree::Taxon.class_eval do
|
||||
has_many :classifications, dependent: :destroy
|
||||
|
||||
attachment_definitions[:icon][:path] = 'public/images/spree/taxons/:id/:style/:basename.:extension'
|
||||
attachment_definitions[:icon][:url] = '/images/spree/taxons/:id/:style/:basename.:extension'
|
||||
|
||||
# Indicate which filters should be used for this taxon
|
||||
def applicable_filters
|
||||
fs = []
|
||||
|
||||
@@ -34,10 +34,6 @@ module Spree
|
||||
|
||||
# We use the same options as Spree and add :confirmable
|
||||
devise :confirmable, reconfirmable: true
|
||||
# TODO: Later versions of devise have a dedicated after_confirmation callback, so use that
|
||||
after_update :welcome_after_confirm, if: lambda {
|
||||
confirmation_token_changed? && confirmation_token.nil?
|
||||
}
|
||||
|
||||
class DestroyWithOrdersError < StandardError; end
|
||||
|
||||
@@ -49,14 +45,14 @@ module Spree
|
||||
has_spree_role?('admin')
|
||||
end
|
||||
|
||||
def send_reset_password_instructions
|
||||
generate_reset_password_token!
|
||||
UserMailer.reset_password_instructions(id).deliver
|
||||
end
|
||||
# handle_asynchronously will define send_reset_password_instructions_with_delay.
|
||||
# If handle_asynchronously is called twice, we get an infinite job loop.
|
||||
handle_asynchronously :send_reset_password_instructions unless method_defined? :send_reset_password_instructions_with_delay
|
||||
|
||||
def regenerate_reset_password_token
|
||||
set_reset_password_token
|
||||
end
|
||||
|
||||
def known_users
|
||||
if admin?
|
||||
Spree::User.where(nil)
|
||||
@@ -82,9 +78,9 @@ module Spree
|
||||
customers.find_by(enterprise_id: enterprise)
|
||||
end
|
||||
|
||||
def welcome_after_confirm
|
||||
# Send welcome email if we are confirming an user's email
|
||||
# Note: this callback only runs on email confirmation
|
||||
# This is a Devise Confirmable callback that runs on email confirmation
|
||||
# It sends a welcome email after the user email is confirmed
|
||||
def after_confirmation
|
||||
return unless confirmed? && unconfirmed_email.nil? && !unconfirmed_email_changed?
|
||||
|
||||
send_signup_confirmation
|
||||
|
||||
@@ -30,9 +30,10 @@ class Api::Admin::ForOrderCycle::EnterpriseSerializer < ActiveModel::Serializer
|
||||
def products_scope
|
||||
products_relation = object.supplied_products
|
||||
if order_cycle.prefers_product_selection_from_coordinator_inventory_only?
|
||||
products_relation = products_relation.visible_for(order_cycle.coordinator)
|
||||
products_relation = products_relation.
|
||||
visible_for(order_cycle.coordinator)
|
||||
end
|
||||
products_relation.order(:name)
|
||||
products_relation
|
||||
end
|
||||
|
||||
def products
|
||||
|
||||
@@ -4,7 +4,9 @@ module Api
|
||||
class OpenStreetMapConfigSerializer < ActiveModel::Serializer
|
||||
attributes :open_street_map_enabled,
|
||||
:open_street_map_provider_name,
|
||||
:open_street_map_provider_options
|
||||
:open_street_map_provider_options,
|
||||
:open_street_map_default_latitude,
|
||||
:open_street_map_default_longitude
|
||||
|
||||
def open_street_map_enabled
|
||||
ContentConfig.open_street_map_enabled
|
||||
@@ -17,5 +19,13 @@ module Api
|
||||
def open_street_map_provider_options
|
||||
ContentConfig.open_street_map_provider_options.to_json
|
||||
end
|
||||
|
||||
def open_street_map_default_latitude
|
||||
ContentConfig.open_street_map_default_latitude
|
||||
end
|
||||
|
||||
def open_street_map_default_longitude
|
||||
ContentConfig.open_street_map_default_longitude
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
class Api::TaxonImageSerializer < ActiveModel::Serializer
|
||||
attributes :id, :alt, :small_url, :large_url
|
||||
|
||||
def small_url
|
||||
object.attachment.url(:small, false)
|
||||
end
|
||||
|
||||
def large_url
|
||||
object.attachment.url(:large, false)
|
||||
end
|
||||
end
|
||||
@@ -2,9 +2,5 @@ class Api::TaxonSerializer < ActiveModel::Serializer
|
||||
cached
|
||||
delegate :cache_key, to: :object
|
||||
|
||||
attributes :id, :name, :permalink, :icon, :pretty_name, :position, :parent_id, :taxonomy_id
|
||||
|
||||
def icon
|
||||
object.icon(:original)
|
||||
end
|
||||
attributes :id, :name, :permalink, :pretty_name, :position, :parent_id, :taxonomy_id
|
||||
end
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
class AdvanceOrderService
|
||||
attr_reader :order
|
||||
|
||||
def initialize(order)
|
||||
@order = order
|
||||
end
|
||||
|
||||
def call
|
||||
advance_order(advance_order_options)
|
||||
end
|
||||
|
||||
def call!
|
||||
advance_order!(advance_order_options)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def advance_order_options
|
||||
shipping_method_id = order.shipping_method.id if order.shipping_method.present?
|
||||
{ shipping_method_id: shipping_method_id }
|
||||
end
|
||||
|
||||
def advance_order(options)
|
||||
until order.state == "complete"
|
||||
break unless order.next
|
||||
|
||||
after_transition_hook(options)
|
||||
end
|
||||
end
|
||||
|
||||
def advance_order!(options)
|
||||
until order.completed?
|
||||
order.next!
|
||||
after_transition_hook(options)
|
||||
end
|
||||
end
|
||||
|
||||
def after_transition_hook(options)
|
||||
if order.state == "delivery"
|
||||
order.select_shipping_method(options[:shipping_method_id]) if options[:shipping_method_id]
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -57,11 +57,12 @@ class OrderAdjustmentsFetcher
|
||||
if adjustments_eager_loaded?
|
||||
adjustment_scope = public_send("#{scope}_scope")
|
||||
|
||||
# Adjustments are already loaded here, this block is using `Array#select`
|
||||
adjustments.select do |adjustment|
|
||||
match_by_scope(adjustment, adjustment_scope)
|
||||
match_by_scope(adjustment, adjustment_scope) && match_by_scope(adjustment, eligible_scope)
|
||||
end
|
||||
else
|
||||
adjustments.where(nil).public_send scope
|
||||
adjustments.where(nil).eligible.public_send scope
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
79
app/services/order_workflow.rb
Normal file
79
app/services/order_workflow.rb
Normal file
@@ -0,0 +1,79 @@
|
||||
class OrderWorkflow
|
||||
attr_reader :order
|
||||
|
||||
def initialize(order)
|
||||
@order = order
|
||||
end
|
||||
|
||||
def complete
|
||||
advance_order(advance_order_options)
|
||||
end
|
||||
|
||||
def complete!
|
||||
advance_order!(advance_order_options)
|
||||
end
|
||||
|
||||
def next(options = {})
|
||||
result = advance_order_one_step
|
||||
|
||||
after_transition_hook(options)
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def advance_order_options
|
||||
shipping_method_id = order.shipping_method.id if order.shipping_method.present?
|
||||
{ shipping_method_id: shipping_method_id }
|
||||
end
|
||||
|
||||
def advance_order(options)
|
||||
until order.state == "complete"
|
||||
break unless order.next
|
||||
|
||||
after_transition_hook(options)
|
||||
end
|
||||
end
|
||||
|
||||
def advance_order!(options)
|
||||
until order.completed?
|
||||
order.next!
|
||||
after_transition_hook(options)
|
||||
end
|
||||
end
|
||||
|
||||
def advance_order_one_step
|
||||
tries ||= 3
|
||||
order.next
|
||||
rescue ActiveRecord::StaleObjectError
|
||||
retry unless (tries -= 1).zero?
|
||||
false
|
||||
end
|
||||
|
||||
def after_transition_hook(options)
|
||||
if order.state == "delivery"
|
||||
order.select_shipping_method(options[:shipping_method_id]) if options[:shipping_method_id]
|
||||
end
|
||||
|
||||
persist_all_payments if order.state == "payment"
|
||||
end
|
||||
|
||||
# When a payment fails, the order state machine stays in 'payment' and rollbacks all transactions
|
||||
# This rollback also reverts the payment state from 'failed', 'void' or 'invalid' to 'pending'
|
||||
# Despite the rollback, the in-memory payment still has the correct state, so we persist it
|
||||
def persist_all_payments
|
||||
order.payments.each do |payment|
|
||||
in_memory_payment_state = payment.state
|
||||
if different_from_db_payment_state?(in_memory_payment_state, payment.id)
|
||||
payment.reload.update(state: in_memory_payment_state)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Verifies if the in-memory payment state is different from the one stored in the database
|
||||
# This is be done without reloading the payment so that in-memory data is not changed
|
||||
def different_from_db_payment_state?(in_memory_payment_state, payment_id)
|
||||
in_memory_payment_state != Spree::Payment.find(payment_id).state
|
||||
end
|
||||
end
|
||||
@@ -11,6 +11,7 @@ module PermittedAttributes
|
||||
|
||||
@params.require(:order_cycle).permit(
|
||||
:name, :orders_open_at, :orders_close_at, :coordinator_id,
|
||||
:preferred_product_selection_from_coordinator_inventory_only,
|
||||
incoming_exchanges: permitted_exchange_attributes,
|
||||
outgoing_exchanges: permitted_exchange_attributes,
|
||||
schedule_ids: [], coordinator_fee_ids: []
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
%a.button{ href: main_app.admin_subscriptions_path, ng: { show: "['details','review'].indexOf(view) >= 0" } }= t(:cancel)
|
||||
%input{ type: "button", value: t(:back), ng: { click: 'back()', show: '!!backCallbacks[view]'} }
|
||||
%input.red{ type: "button", value: t(:next), ng: { click: 'next()', show: '!!nextCallbacks[view]' } }
|
||||
%input.red{ type: "submit", value: t('admin.subscriptions.create'), ng: { show: "view == 'review'" } }
|
||||
%input.red{ type: "submit", value: t('.create'), ng: { show: "view == 'review'" } }
|
||||
%div{ ng: { show: 'subscription.id' } }
|
||||
%a.button{ href: main_app.admin_subscriptions_path }= t(:close)
|
||||
%input.red{ type: "button", value: t(:review), ng: { click: "setView('review')", show: "view != 'review'" } }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
- content_for :page_title do
|
||||
=t('admin.subscriptions.edit')
|
||||
=t('.title')
|
||||
|
||||
-# - content_for :page_actions do
|
||||
-# %li= button_link_to "Back to subscriptions list", main_app.admin_subscriptions_path, icon: 'icon-arrow-left'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.subscriptions.subscriptions')
|
||||
= t('.title')
|
||||
|
||||
- content_for :main_ng_app_name do
|
||||
= "admin.subscriptions"
|
||||
@@ -7,7 +7,7 @@
|
||||
- content_for :page_actions do
|
||||
%li
|
||||
%a.button.icon-plus#new-subscription{ href: "javascript:void(0)", "new-subscription-dialog" => true }
|
||||
= t('admin.subscriptions.new')
|
||||
= t('.new')
|
||||
|
||||
= render :partial => 'spree/admin/shared/order_sub_menu'
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
-# = render :partial => 'spree/shared/error_messages', :locals => { :target => @enterprise }
|
||||
|
||||
- content_for :page_title do
|
||||
=t('admin.subscriptions.new')
|
||||
=t('.title')
|
||||
|
||||
-# - content_for :page_actions do
|
||||
-# %li= button_link_to "Back to subscriptions list", main_app.admin_subscriptions_path, icon: 'icon-arrow-left'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
%h1.text-center.margin-bottom-30= t('admin.subscription.subscriptions')
|
||||
%h1.text-center.margin-bottom-30= t('.title')
|
||||
|
||||
.row
|
||||
.four.columns.alpha
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
- bugsnag_js_key = ENV['BUGSNAG_JS_KEY'] || ENV['BUGSNAG_API_KEY']
|
||||
- if bugsnag_js_key.present?
|
||||
%script{src: "//d2wy8f7a9ursnm.cloudfront.net/v6/bugsnag.min.js"}
|
||||
%script{src: "//d2wy8f7a9ursnm.cloudfront.net/v7/bugsnag.min.js"}
|
||||
:javascript
|
||||
window.bugsnagClient = bugsnag({
|
||||
Bugsnag.start({
|
||||
apiKey: "#{bugsnag_js_key}",
|
||||
beforeSend: function (report) {
|
||||
report.app.releaseStage = "#{Rails.env}"
|
||||
}
|
||||
});
|
||||
releaseStage: "#{Rails.env}"
|
||||
})
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
%meta{name: "robots", content: "noindex"}
|
||||
%title= content_for?(:title) ? "#{yield(:title)} - #{t(:title)}".html_safe : "#{t(:welcome_to)} #{t(:title)}"
|
||||
- if Rails.env.production?
|
||||
= favicon_link_tag
|
||||
= favicon_link_tag "/favicon.ico"
|
||||
- else
|
||||
= favicon_link_tag "/favicon-staging.ico"
|
||||
%link{href: "https://fonts.googleapis.com/css?family=Roboto:400,300italic,400italic,300,700,700italic|Oswald:300,400,700", rel: "stylesheet", type: "text/css"}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
%title= content_for?(:title) ? "#{yield(:title)} - #{Spree::Config[:site_name]}" : "#{t(:welcome_to)} #{Spree::Config[:site_name]}"
|
||||
- if Rails.env.production?
|
||||
= favicon_link_tag
|
||||
= favicon_link_tag "/favicon.ico"
|
||||
- else
|
||||
= favicon_link_tag "/favicon-staging.ico"
|
||||
%link{href: "https://fonts.googleapis.com/css?family=Roboto:400,300italic,400italic,300,700,700italic|Oswald:300,400,700", rel: "stylesheet", type: "text/css"}
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
%p.trans-sentence
|
||||
%div
|
||||
%span.fat-taxons{"ng-repeat" => "taxon in producer.supplied_taxons"}
|
||||
%render-svg{path: "{{taxon.icon}}"}
|
||||
%span{"ng-bind" => "::taxon.name"}
|
||||
%div
|
||||
%span.fat-properties{"ng-repeat" => "property in producer.supplied_properties"}
|
||||
@@ -79,8 +78,8 @@
|
||||
.row.cta-container
|
||||
.columns.small-12
|
||||
%a.cta-hub{"ng-repeat" => "hub in producer.hubs | orderBy:'-active'",
|
||||
"ng-href" => "{{::hub.path}}", "ng-attr-target" => "_blank",
|
||||
"ng-class" => "::{primary: hub.active, secondary: !hub.active}", "target" => "_blank"}
|
||||
"ng-href" => "{{::hub.path}}", "ng-attr-target" => "{{ embedded_layout ? '_blank' : undefined }}",
|
||||
"ng-class" => "::{primary: hub.active, secondary: !hub.active}"}
|
||||
%i.ofn-i_068-shop-reversed{"ng-if" => "::hub.active"}
|
||||
%i.ofn-i_068-shop-reversed{"ng-if" => "::!hub.active"}
|
||||
.hub-name{"ng-bind" => "::hub.name"}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
%span{"ng-if" => "::producer.is_distributor" }
|
||||
.row.vertical-align-middle
|
||||
.columns.small-12
|
||||
%a.is_distributor{"ng-href" => "{{::producer.path}}", "ng-attr-target" => "_blank", "data-is-link" => "true", "target" => "_blank"}
|
||||
%a.is_distributor{"ng-href" => "{{::producer.path}}", "ng-attr-target" => "{{ embedded_layout ? '_blank' : undefined}}", "data-is-link" => "true"}
|
||||
%i{ng: {class: "::producer.producer_icon_font"}}
|
||||
%span.margin-top
|
||||
%strong{"ng-bind" => "::producer.name"}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.expanding-sidebar.cart-sidebar{ng: {controller: 'CartCtrl', show: 'showCartSidebar', class: "{'shown': showCartSidebar, 'hidden': !showCartSidebar}"}}
|
||||
.expanding-sidebar.cart-sidebar{ng: {controller: 'CartCtrl', class: "{'shown': showCartSidebar}"}}
|
||||
.background{ng: {click: 'toggleCartSidebar()'}}
|
||||
.sidebar
|
||||
.cart-header
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
type: 'search',
|
||||
placeholder: t(:products_search),
|
||||
"ng-debounce" => "200",
|
||||
"ofn-disable-enter" => true}
|
||||
"disable-enter-with-blur" => true}
|
||||
%a.clear{type: 'button', ng: {show: 'query', click: 'clearQuery()'}, 'focus-search' => true}
|
||||
= image_tag "icn-close.png"
|
||||
|
||||
|
||||
@@ -18,4 +18,3 @@
|
||||
%span{"ng-bind" => "::enterprise.name"}
|
||||
.small-2.medium-2.large-1.columns.text-center
|
||||
.taxon-flag
|
||||
%render-svg{path: "{{::product.primary_taxon.icon}}"}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
.trans-sentence
|
||||
%div
|
||||
%span.fat-taxons{"ng-repeat" => "taxon in hub.taxons"}
|
||||
%render-svg{path: "{{taxon.icon}}"}
|
||||
%span{"ng-bind" => "::taxon.name"}
|
||||
%div
|
||||
%span.fat-properties{"ng-repeat" => "property in hub.distributed_properties"}
|
||||
|
||||
@@ -5,4 +5,4 @@
|
||||
-# of the views we are using, so the warning below wasn't displaying without this override.
|
||||
|
||||
#paypal-warning
|
||||
%strong= t('no_payment_via_admin_backend', :scope => 'paypal')
|
||||
%strong= t('.no_payment_via_admin_backend', :scope => 'paypal')
|
||||
|
||||
@@ -12,11 +12,6 @@
|
||||
%br/
|
||||
= @taxon.permalink.split("/")[0...-1].join("/") + "/"
|
||||
= text_field_tag :permalink_part, @permalink_part
|
||||
= f.field_container :icon do
|
||||
= f.label :icon, t(:icon)
|
||||
%br/
|
||||
= f.file_field :icon
|
||||
%img{src: @taxon.icon(:original)}
|
||||
= f.field_container :meta_title do
|
||||
= f.label :meta_title, t(:meta_title)
|
||||
%br/
|
||||
|
||||
@@ -66,4 +66,4 @@
|
||||
%div{"data-hook" => "admin_footer_scripts"}
|
||||
|
||||
%script
|
||||
= raw "Spree.api_key = \"#{try_spree_current_user.try(:spree_api_key).to_s}\";"
|
||||
= raw "Spree.api_key = \"#{spree_current_user.try(:spree_api_key).to_s}\";"
|
||||
|
||||
30
app/views/spree/shipment_mailer/shipped_email.html.haml
Normal file
30
app/views/spree/shipment_mailer/shipped_email.html.haml
Normal file
@@ -0,0 +1,30 @@
|
||||
%p
|
||||
= t('.dear_customer')
|
||||
%p
|
||||
= t('.instructions')
|
||||
|
||||
%p
|
||||
= "============================================================"
|
||||
%br
|
||||
= t('.shipment_summary')
|
||||
%br
|
||||
= "============================================================"
|
||||
|
||||
%p
|
||||
- @shipment.manifest.each do |item|
|
||||
= item.variant.sku
|
||||
= item.variant.product.name
|
||||
= item.variant.options_text
|
||||
%br
|
||||
= "============================================================"
|
||||
|
||||
- if @shipment.tracking
|
||||
%p
|
||||
= t('.track_information', tracking: @shipment.tracking)
|
||||
|
||||
- if @shipment.tracking_url
|
||||
%p
|
||||
= t('.track_link', url: @shipment.tracking_url)
|
||||
|
||||
%p
|
||||
= t('.thanks')
|
||||
4
app/views/spree/test_mailer/test_email.html.haml
Normal file
4
app/views/spree/test_mailer/test_email.html.haml
Normal file
@@ -0,0 +1,4 @@
|
||||
= t('.greeting')
|
||||
= "================"
|
||||
|
||||
= t('.message')
|
||||
@@ -90,10 +90,6 @@ Devise.setup do |config|
|
||||
# Time interval to unlock the account if :time is enabled as unlock_strategy.
|
||||
# config.unlock_in = 1.hour
|
||||
|
||||
# ==> Configuration for :token_authenticatable
|
||||
# Defines name of the authentication token params key
|
||||
config.token_authentication_key = :auth_token
|
||||
|
||||
# ==> Scopes configuration
|
||||
# Turn scoped views on. Before rendering 'sessions/new', it will first check for
|
||||
# 'users/sessions/new'. It's turned off by default because it's slower if you
|
||||
@@ -141,3 +137,8 @@ Devise.setup do |config|
|
||||
|
||||
config.case_insensitive_keys = [:email]
|
||||
end
|
||||
|
||||
Devise::TokenAuthenticatable.setup do |config|
|
||||
# Defines name of the authentication token params key
|
||||
config.token_authentication_key = :auth_token
|
||||
end
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
# In order to initialize a setting do:
|
||||
# config.setting_name = 'new value'
|
||||
|
||||
require "spree/core/environment"
|
||||
require 'spree/product_filters'
|
||||
|
||||
# Due to a bug in ActiveRecord we need to load the tagging code in Gateway which
|
||||
@@ -30,8 +31,6 @@ Spree.config do |config|
|
||||
config.auto_capture = true
|
||||
#config.override_actionmailer_config = false
|
||||
|
||||
config.order_updater_decorator = OrderUpdater
|
||||
|
||||
# S3 settings
|
||||
config.s3_bucket = ENV['S3_BUCKET'] if ENV['S3_BUCKET']
|
||||
config.s3_access_key = ENV['S3_ACCESS_KEY'] if ENV['S3_ACCESS_KEY']
|
||||
|
||||
@@ -13,6 +13,7 @@ ar:
|
||||
email: الايميل الالكتروني للعميل
|
||||
spree/payment:
|
||||
amount: القيمة
|
||||
state: ولاية
|
||||
spree/product:
|
||||
primary_taxon: "نوع المنتج "
|
||||
supplier: "المورد"
|
||||
@@ -1020,10 +1021,13 @@ ar:
|
||||
name: "ملخص رسوم الشركات"
|
||||
description: "ملخص رسوم الشركات التي تم جمعها"
|
||||
subscriptions:
|
||||
subscriptions: الاشتراكات
|
||||
new: اشتراك جديد
|
||||
create: إنشاء اشتراك
|
||||
edit: تحرير الاشتراك
|
||||
index:
|
||||
title: "الاشتراكات"
|
||||
new: "اشتراك جديد"
|
||||
new:
|
||||
title: "اشتراك جديد"
|
||||
edit:
|
||||
title: "تحرير الاشتراك"
|
||||
table:
|
||||
edit_subscription: تحرير الاشتراك
|
||||
pause_subscription: وقف مؤقت الاشتراك
|
||||
@@ -1032,6 +1036,7 @@ ar:
|
||||
filters:
|
||||
query_placeholder: "البحث عن طريق البريد الإلكتروني ..."
|
||||
setup_explanation:
|
||||
title: "الاشتراكات"
|
||||
just_a_few_more_steps: 'فقط بضع خطوات أخرى قبل أن تبدأ:'
|
||||
enable_subscriptions: "تمكين الاشتراكات في واحد على الأقل من المتاجر الخاصة بك"
|
||||
enable_subscriptions_step_1_html: 1. انتقل إلى صفحة %{enterprises_link} ، وابحث عن متجرك ، وانقر على "إدارة"
|
||||
@@ -1045,6 +1050,8 @@ ar:
|
||||
create_at_least_one_schedule_step_3: 3. انقر فوق "+ جدول جديد" ، واملأ النموذج
|
||||
once_you_are_done_you_can_html: بمجرد الانتهاء من ذلك ، يمكنك %{reload_this_page_link}
|
||||
reload_this_page: اعد تحميل هذه الصفحة
|
||||
form:
|
||||
create: "إنشاء اشتراك"
|
||||
steps:
|
||||
details: 1. التفاصيل الأساسية
|
||||
address: 2. العنوان
|
||||
@@ -1280,6 +1287,8 @@ ar:
|
||||
cart_updating: "جارٍ تحديث العربة ..."
|
||||
cart_empty: "السلة فارغة"
|
||||
cart_edit: "تعديل عربة التسوق"
|
||||
item: "بند"
|
||||
qty: "الكمية"
|
||||
card_number: رقم البطاقة
|
||||
card_securitycode: "رمز الحماية"
|
||||
card_expiry_date: تاريخ الانتهاء
|
||||
@@ -1934,6 +1943,7 @@ ar:
|
||||
supplier: "المورد"
|
||||
product_name: "اسم المنتج"
|
||||
product_description: "وصف المنتج"
|
||||
shipping_categories: "فئات الشحن"
|
||||
units: "حجم الوحدة"
|
||||
coordinator: "منسق"
|
||||
distributor: "الموزع"
|
||||
@@ -2030,6 +2040,7 @@ ar:
|
||||
remove_tax: "إزالة الضريبة"
|
||||
first_name_begins_with: "الاسم الأول يبدأ بـ"
|
||||
last_name_begins_with: "اسم العائلة يبدأ بـ"
|
||||
new_order: "طلب جديد"
|
||||
enterprise_tos_link: "شروط المؤسسة لخدمة الرابط"
|
||||
enterprise_tos_message: "نريد العمل مع أشخاص يشاركوننا أهدافنا وقيمنا. على هذا النحو ، نطلب من المؤسسات الجديدة الموافقة على"
|
||||
enterprise_tos_link_text: "شروط الخدمة."
|
||||
@@ -3241,6 +3252,27 @@ ar:
|
||||
invoice_email:
|
||||
hi: "مرحبًا %{name}"
|
||||
invoice_attached_text: يرجى الاطلاع على فاتورة مرفقة لطلبك الأخير من
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
تم تقديم طلب لإعادة تعيين كلمة المرور الخاصة بك.
|
||||
إذا لم تقدم هذا الطلب ، ببساطة تجاهل هذا البريد الإلكتروني.
|
||||
link_text: >
|
||||
إذا قمت بهذا الطلب ، فما عليك سوى النقر فوق الرابط أدناه:
|
||||
issue_text: |
|
||||
إذا لم يعمل عنوان URL أعلاه ، فحاول نسخه ولصقه في متصفحك.
|
||||
إذا كنت لا تزال تواجه مشاكل ، فلا تتردد في الاتصال بنا.
|
||||
confirmation_instructions:
|
||||
subject: "يرجى تأكيد حسابك OFN"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "عزيزي العميل،"
|
||||
instructions: "تم شحن طلبك"
|
||||
shipment_summary: "ملخص الشحن"
|
||||
subject: "إشعار الشحن"
|
||||
thanks: "شكرا لك على اعمالك."
|
||||
track_information: "معلومات التتبع : %{tracking}"
|
||||
track_link: "رابط التتبع: %{url}"
|
||||
order_state:
|
||||
address: العنوان
|
||||
adjustments: التعديلات
|
||||
@@ -3262,18 +3294,6 @@ ar:
|
||||
ended: انتهى
|
||||
paused: التعليق
|
||||
canceled: الالغاء
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
تم تقديم طلب لإعادة تعيين كلمة المرور الخاصة بك.
|
||||
إذا لم تقدم هذا الطلب ، ببساطة تجاهل هذا البريد الإلكتروني.
|
||||
link_text: >
|
||||
إذا قمت بهذا الطلب ، فما عليك سوى النقر فوق الرابط أدناه:
|
||||
issue_text: |
|
||||
إذا لم يعمل عنوان URL أعلاه ، فحاول نسخه ولصقه في متصفحك.
|
||||
إذا كنت لا تزال تواجه مشاكل ، فلا تتردد في الاتصال بنا.
|
||||
confirmation_instructions:
|
||||
subject: يرجى تأكيد حسابك OFN
|
||||
users:
|
||||
form:
|
||||
account_settings: إعدادت الحساب
|
||||
|
||||
@@ -13,6 +13,8 @@ ca:
|
||||
email: Correu electrònic de la consumidora
|
||||
spree/payment:
|
||||
amount: Import
|
||||
state: Estat
|
||||
source: Source
|
||||
spree/product:
|
||||
primary_taxon: "Categoria del producte"
|
||||
supplier: "Proveïdora"
|
||||
@@ -271,6 +273,9 @@ ca:
|
||||
on hand: "Disponibles"
|
||||
ship: "Enviament"
|
||||
shipping_category: "Categoria d'enviament"
|
||||
height: "Alçada"
|
||||
width: "Amplada"
|
||||
depth: "Profunditat"
|
||||
actions:
|
||||
create_and_add_another: "Crea i afegeix-ne una altra"
|
||||
create: "Crear"
|
||||
@@ -1037,10 +1042,13 @@ ca:
|
||||
name: "Resum de les comissions de l'organització"
|
||||
description: "Resum de les comissions de l'organització recollides"
|
||||
subscriptions:
|
||||
subscriptions: Subscripcions
|
||||
new: Nova subscripció
|
||||
create: Crea una subscripció
|
||||
edit: Edita la subscripció
|
||||
index:
|
||||
title: "Subscripcions"
|
||||
new: "Nova subscripció"
|
||||
new:
|
||||
title: "Nova subscripció"
|
||||
edit:
|
||||
title: "Edita la subscripció"
|
||||
table:
|
||||
edit_subscription: Edita la subscripció
|
||||
pause_subscription: Pausa la subscripció
|
||||
@@ -1049,6 +1057,7 @@ ca:
|
||||
filters:
|
||||
query_placeholder: "Cerca per correu electrònic ..."
|
||||
setup_explanation:
|
||||
title: "Subscripcions"
|
||||
just_a_few_more_steps: 'Només uns quants passos més abans de començar:'
|
||||
enable_subscriptions: "Activa les subscripcions d'almenys una de les teves botigues"
|
||||
enable_subscriptions_step_1_html: 1. Aneu a la pàgina %{enterprises_link}, cerqueu la vostra botiga i feu clic a "Gestionar"
|
||||
@@ -1062,6 +1071,8 @@ ca:
|
||||
create_at_least_one_schedule_step_3: 3. Fes clic a '+ Nova programació' i omple el formulari
|
||||
once_you_are_done_you_can_html: Un cop hagueu acabat, podeu %{reload_this_page_link}
|
||||
reload_this_page: tornar a carregar aquesta pàgina
|
||||
form:
|
||||
create: "Crea una subscripció"
|
||||
steps:
|
||||
details: 1. Detalls bàsics
|
||||
address: 2. Adreça
|
||||
@@ -1306,6 +1317,8 @@ ca:
|
||||
cart_updating: "Actualitzant la cistella..."
|
||||
cart_empty: "Cistella buida"
|
||||
cart_edit: "Edita la teva cistella"
|
||||
item: "Article"
|
||||
qty: "quant."
|
||||
card_number: Número de targeta
|
||||
card_securitycode: "Codi de seguretat"
|
||||
card_expiry_date: Data de caducitat
|
||||
@@ -1527,7 +1540,7 @@ ca:
|
||||
shopping_contact_social: "Segueix"
|
||||
shopping_groups_part_of: "forma part de:"
|
||||
shopping_producers_of_hub: "Productores de%{hub}:"
|
||||
enterprises_next_closing: "Tancament de la comanda següent"
|
||||
enterprises_next_closing: "La següent comanda tanca"
|
||||
enterprises_ready_for: "Llest per"
|
||||
enterprises_choose: "Escull quan vols la teva comanda:"
|
||||
maps_open: "Obert"
|
||||
@@ -1936,7 +1949,7 @@ ca:
|
||||
admin_enterprise_groups: "Grups d'organització"
|
||||
admin_enterprise_groups_name: "Nom"
|
||||
admin_enterprise_groups_owner: "Propietària"
|
||||
admin_enterprise_groups_on_front_page: "A la primera pàgina?"
|
||||
admin_enterprise_groups_on_front_page: "Visible a la web"
|
||||
admin_enterprise_groups_enterprise: "Organitzacions"
|
||||
admin_enterprise_groups_data_powertip: "La usuària principal responsable d'aquest grup."
|
||||
admin_enterprise_groups_data_powertip_logo: "Això és el logotip del grup"
|
||||
@@ -1961,6 +1974,8 @@ ca:
|
||||
supplier: "Proveïdora"
|
||||
product_name: "Nom del producte"
|
||||
product_description: "Descripció del producte"
|
||||
permalink: "Enllaç permanent"
|
||||
shipping_categories: "Tipus d'enviament"
|
||||
units: "Mida d'unitat"
|
||||
coordinator: "Coordinador"
|
||||
distributor: "Distribuïdora"
|
||||
@@ -2057,6 +2072,8 @@ ca:
|
||||
remove_tax: "Suprimeix comissions"
|
||||
first_name_begins_with: "El nom comença amb"
|
||||
last_name_begins_with: "El cognom comença amb"
|
||||
shipping_method: "Mètode d'enviament"
|
||||
new_order: "Nova comanda"
|
||||
enterprise_tos_link: "Enllaç a les condicions d'ús de l'organització"
|
||||
enterprise_tos_message: "Volem treballar amb persones que comparteixen els nostres objectius i valors. Com a tal, demanem a les noves organitzacions que acceptin la nostra"
|
||||
enterprise_tos_link_text: "Termes del servei."
|
||||
@@ -3172,6 +3189,8 @@ ca:
|
||||
stripe:
|
||||
error_saving_payment: Error en desar el pagament
|
||||
submitting_payment: S'està lliurant el pagament...
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Els pagaments amb Paypal no es poden capturar des de l'administració
|
||||
products:
|
||||
image_upload_error: "No s'ha reconegut la imatge del producte. Carregueu una imatge en format PNG o JPG."
|
||||
new:
|
||||
@@ -3349,6 +3368,27 @@ ca:
|
||||
invoice_email:
|
||||
hi: "Hola %{name}"
|
||||
invoice_attached_text: Trobareu adjunta un comprovant de la compra per a la vostra comanda recent
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
S'ha fet una sol·licitud per restablir la teva contrasenya.
|
||||
Si no has fet aquesta sol·licitud, simplement ignora aquest correu electrònic.
|
||||
link_text: >
|
||||
Si has fet aquesta sol·licitud, fes clic a l'enllaç següent:
|
||||
issue_text: |
|
||||
Si l'URL anterior no funciona, prova de copiar-lo i enganxar-lo al navegador.
|
||||
Si continues tenint problemes, no dubtis en contactar-nos.
|
||||
confirmation_instructions:
|
||||
subject: "Si us plau confirma el teu compte d'OFN"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "Benvolguda consumidora:"
|
||||
instructions: "La vostra comanda s'ha enviat"
|
||||
shipment_summary: "Resum de l'enviament"
|
||||
subject: "Notificació d'enviament"
|
||||
thanks: "Gràcies per la teva compra."
|
||||
track_information: "Informació del seguiment: %{tracking}"
|
||||
track_link: "Enllaç del seguiment: %{url}"
|
||||
order_state:
|
||||
address: adreça
|
||||
adjustments: ajustaments
|
||||
@@ -3370,18 +3410,6 @@ ca:
|
||||
ended: acabat
|
||||
paused: en pausa
|
||||
canceled: cancel·lat
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
S'ha fet una sol·licitud per restablir la teva contrasenya.
|
||||
Si no has fet aquesta sol·licitud, simplement ignora aquest correu electrònic.
|
||||
link_text: >
|
||||
Si has fet aquesta sol·licitud, fes clic a l'enllaç següent:
|
||||
issue_text: |
|
||||
Si l'URL anterior no funciona, prova de copiar-lo i enganxar-lo al navegador.
|
||||
Si continues tenint problemes, no dubtis en contactar-nos.
|
||||
confirmation_instructions:
|
||||
subject: Si us plau confirma el teu compte d'OFN
|
||||
users:
|
||||
form:
|
||||
account_settings: Configuració del compte
|
||||
|
||||
@@ -13,6 +13,7 @@ de_DE:
|
||||
email: E-Mail des Kunden
|
||||
spree/payment:
|
||||
amount: Betrag
|
||||
state: Status
|
||||
spree/product:
|
||||
primary_taxon: "Produktkategorie"
|
||||
supplier: "Anbieter"
|
||||
@@ -1028,10 +1029,13 @@ de_DE:
|
||||
name: "Unternehmensgebühr Zusammenfassung"
|
||||
description: "Zusammenfassung der erhobenen Zuschläge"
|
||||
subscriptions:
|
||||
subscriptions: Abonnements
|
||||
new: Neues Abonnement
|
||||
create: Abonnement erstellen
|
||||
edit: Abonnement bearbeiten
|
||||
index:
|
||||
title: "Abonnements"
|
||||
new: "Neues Abonnement"
|
||||
new:
|
||||
title: "Neues Abonnement"
|
||||
edit:
|
||||
title: "Abonnement bearbeiten"
|
||||
table:
|
||||
edit_subscription: Abonnement bearbeiten
|
||||
pause_subscription: Abonement pausieren
|
||||
@@ -1040,6 +1044,7 @@ de_DE:
|
||||
filters:
|
||||
query_placeholder: "Suche per E-Mail ..."
|
||||
setup_explanation:
|
||||
title: "Abonnements"
|
||||
just_a_few_more_steps: 'Nur noch ein paar Schritte bevor Sie beginnen können:'
|
||||
enable_subscriptions: "Aktivieren Sie Abonnements für mindestens einen Ihrer Läden"
|
||||
enable_subscriptions_step_1_html: 1. Gehen Sie zur Seite %{enterprises_link}, suchen Sie Ihren Laden und klicken Sie auf "Verwalten"
|
||||
@@ -1053,6 +1058,8 @@ de_DE:
|
||||
create_at_least_one_schedule_step_3: 3. Klicken Sie auf "+ Neuer Zeitplan" und füllen Sie das Formular aus
|
||||
once_you_are_done_you_can_html: Sobald Sie fertig sind, können Sie %{reload_this_page_link}
|
||||
reload_this_page: diese Seite neu laden
|
||||
form:
|
||||
create: "Abonnement erstellen"
|
||||
steps:
|
||||
details: 1. Grundlegendes
|
||||
address: 2. Adresse
|
||||
@@ -1285,6 +1292,8 @@ de_DE:
|
||||
cart_updating: "Warenkorb aktualisieren..."
|
||||
cart_empty: "Warenkorb leer"
|
||||
cart_edit: "Warenkorb bearbeiten"
|
||||
item: "Artikel"
|
||||
qty: "Menge"
|
||||
card_number: Kartennummer
|
||||
card_securitycode: "Sicherheitscode"
|
||||
card_expiry_date: Ablaufdatum
|
||||
@@ -1930,6 +1939,7 @@ de_DE:
|
||||
supplier: "Anbieter"
|
||||
product_name: "Produktname"
|
||||
product_description: "Produktbeschreibung"
|
||||
shipping_categories: "Versandkategorien"
|
||||
units: "Einheitsgröße"
|
||||
coordinator: "Koordinator"
|
||||
distributor: "Verteiler"
|
||||
@@ -3257,6 +3267,27 @@ de_DE:
|
||||
invoice_email:
|
||||
hi: "Hallo %{name}"
|
||||
invoice_attached_text: Im Anhang findest Du eine Rechnung für die letzte Bestellung vom
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
Es wurde angefragt, das Passwort zurückzusetzen.
|
||||
Sollte kein neues Passwort angefordert werden, bitte dieses E-Mail ignorieren.
|
||||
link_text: >
|
||||
Sollte ein neues Passwort angefordert werden, bitte den folgenden Aktivierungslink
|
||||
bestätigen.
|
||||
issue_text: |
|
||||
Falls die URL nicht funktioniert, bitte den Link kopieren und in die Adresszeile Ihres Browsers einfügen
|
||||
confirmation_instructions:
|
||||
subject: "Bitte OFN-Konto bestätigen"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "Sehr geehrter Kunde,"
|
||||
instructions: "Ihre Bestellung wurde versandt"
|
||||
shipment_summary: "Übersicht"
|
||||
subject: "Versandbenachrichtigung"
|
||||
thanks: "Danke für Ihren Einkauf."
|
||||
track_information: "Tracking-Informationen: %{tracking}"
|
||||
track_link: "Tracking-Link: %{url}"
|
||||
order_state:
|
||||
address: Adresse
|
||||
adjustments: Verbesserungen
|
||||
@@ -3278,18 +3309,6 @@ de_DE:
|
||||
ended: beendet
|
||||
paused: pausiert
|
||||
canceled: storniert
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
Es wurde angefragt, das Passwort zurückzusetzen.
|
||||
Sollte kein neues Passwort angefordert werden, bitte dieses E-Mail ignorieren.
|
||||
link_text: >
|
||||
Sollte ein neues Passwort angefordert werden, bitte den folgenden Aktivierungslink
|
||||
bestätigen.
|
||||
issue_text: |
|
||||
Falls die URL nicht funktioniert, bitte den Link kopieren und in die Adresszeile Ihres Browsers einfügen
|
||||
confirmation_instructions:
|
||||
subject: Bitte OFN-Konto bestätigen
|
||||
users:
|
||||
form:
|
||||
account_settings: Konto Einstellungen
|
||||
|
||||
@@ -34,6 +34,8 @@ en:
|
||||
email: Customer E-Mail
|
||||
spree/payment:
|
||||
amount: Amount
|
||||
state: State
|
||||
source: Source
|
||||
spree/product:
|
||||
primary_taxon: "Product Category"
|
||||
supplier: "Supplier"
|
||||
@@ -303,6 +305,9 @@ en:
|
||||
"on hand": "On Hand"
|
||||
ship: "Ship"
|
||||
shipping_category: "Shipping Category"
|
||||
height: "Height"
|
||||
width: "Width"
|
||||
depth: "Depth"
|
||||
|
||||
actions:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
@@ -1091,10 +1096,13 @@ en:
|
||||
name: "Enterprise Fee Summary"
|
||||
description: "Summary of Enterprise Fees collected"
|
||||
subscriptions:
|
||||
subscriptions: Subscriptions
|
||||
new: New Subscription
|
||||
create: Create Subscription
|
||||
edit: Edit Subscription
|
||||
index:
|
||||
title: "Subscriptions"
|
||||
new: "New Subscription"
|
||||
new:
|
||||
title: "New Subscription"
|
||||
edit:
|
||||
title: "Edit Subscription"
|
||||
table:
|
||||
edit_subscription: Edit Subscription
|
||||
pause_subscription: Pause Subscription
|
||||
@@ -1103,6 +1111,7 @@ en:
|
||||
filters:
|
||||
query_placeholder: "Search by email..."
|
||||
setup_explanation:
|
||||
title: "Subscriptions"
|
||||
just_a_few_more_steps: 'Just a few more steps before you can begin:'
|
||||
enable_subscriptions: "Enable subscriptions for at least one of your shops"
|
||||
enable_subscriptions_step_1_html: 1. Go to the %{enterprises_link} page, find your shop, and click "Manage"
|
||||
@@ -1116,6 +1125,8 @@ en:
|
||||
create_at_least_one_schedule_step_3: 3. Click '+ New Schedule', and fill out the form
|
||||
once_you_are_done_you_can_html: Once you are done, you can %{reload_this_page_link}
|
||||
reload_this_page: reload this page
|
||||
form:
|
||||
create: "Create Subscription"
|
||||
steps:
|
||||
details: 1. Basic Details
|
||||
address: 2. Address
|
||||
@@ -1384,6 +1395,8 @@ en:
|
||||
cart_updating: "Updating cart..."
|
||||
cart_empty: "Cart empty"
|
||||
cart_edit: "Edit your cart"
|
||||
item: "Item"
|
||||
qty: "Qty"
|
||||
|
||||
card_number: Card Number
|
||||
card_securitycode: "Security Code"
|
||||
@@ -2088,6 +2101,8 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
supplier: "Supplier"
|
||||
product_name: "Product Name"
|
||||
product_description: "Product Description"
|
||||
permalink: "Permalink"
|
||||
shipping_categories: "Shipping Categories"
|
||||
units: "Unit Size"
|
||||
coordinator: "Coordinator"
|
||||
distributor: "Distributor"
|
||||
@@ -2184,6 +2199,8 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
remove_tax: "Remove tax"
|
||||
first_name_begins_with: "First name begins with"
|
||||
last_name_begins_with: "Last name begins with"
|
||||
shipping_method: "Shipping method"
|
||||
new_order: "New Order"
|
||||
|
||||
enterprise_tos_link: "Enterprise Terms of Service link"
|
||||
enterprise_tos_message: "We want to work with people that share our aims and values. As such we ask new enterprises to agree to our "
|
||||
@@ -3331,6 +3348,8 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
stripe:
|
||||
error_saving_payment: Error saving payment
|
||||
submitting_payment: Submitting payment...
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Paypal payments cannot be captured in the Backoffice
|
||||
products:
|
||||
image_upload_error: "The product image was not recognised. Please upload an image in PNG or JPG format."
|
||||
new:
|
||||
@@ -3508,6 +3527,32 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
invoice_email:
|
||||
hi: "Hi %{name}"
|
||||
invoice_attached_text: Please find attached an invoice for your recent order from
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: "Please confirm your OFN account"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "Dear Customer,"
|
||||
instructions: "Your order has been shipped"
|
||||
shipment_summary: "Shipment Summary"
|
||||
subject: "Shipment Notification"
|
||||
thanks: "Thank you for your business."
|
||||
track_information: ! "Tracking Information: %{tracking}"
|
||||
track_link: ! "Tracking Link: %{url}"
|
||||
test_mailer:
|
||||
test_email:
|
||||
greeting: "Congratulations!"
|
||||
message: "If you have received this email, then your email settings are correct."
|
||||
subject: "Test Mail"
|
||||
order_state:
|
||||
address: address
|
||||
adjustments: adjustments
|
||||
@@ -3529,18 +3574,6 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
ended: ended
|
||||
paused: paused
|
||||
canceled: cancelled
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: Please confirm your OFN account
|
||||
users:
|
||||
form:
|
||||
account_settings: Account Settings
|
||||
|
||||
@@ -13,6 +13,7 @@ en_AU:
|
||||
email: Customer E-Mail
|
||||
spree/payment:
|
||||
amount: Amount
|
||||
state: State
|
||||
spree/product:
|
||||
primary_taxon: "Product Category"
|
||||
supplier: "Supplier"
|
||||
@@ -1027,10 +1028,13 @@ en_AU:
|
||||
name: "Enterprise Fee Summary"
|
||||
description: "Summary of Enterprise Fees collected"
|
||||
subscriptions:
|
||||
subscriptions: Subscriptions
|
||||
new: New Subscription
|
||||
create: Create Subscription
|
||||
edit: Edit Subscription
|
||||
index:
|
||||
title: "Subscriptions"
|
||||
new: "New Subscription"
|
||||
new:
|
||||
title: "New Subscription"
|
||||
edit:
|
||||
title: "Edit Subscription"
|
||||
table:
|
||||
edit_subscription: Edit Subscription
|
||||
pause_subscription: Pause Subscription
|
||||
@@ -1039,6 +1043,7 @@ en_AU:
|
||||
filters:
|
||||
query_placeholder: "Search by email..."
|
||||
setup_explanation:
|
||||
title: "Subscriptions"
|
||||
just_a_few_more_steps: 'Just a few more steps before you can begin:'
|
||||
enable_subscriptions: "Enable subscriptions for at least one of your shops"
|
||||
enable_subscriptions_step_1_html: 1. Go to the %{enterprises_link} page, find your shop, and click "Manage"
|
||||
@@ -1052,6 +1057,8 @@ en_AU:
|
||||
create_at_least_one_schedule_step_3: 3. Click '+ New Schedule', and fill out the form
|
||||
once_you_are_done_you_can_html: Once you are done, you can %{reload_this_page_link}
|
||||
reload_this_page: reload this page
|
||||
form:
|
||||
create: "Create Subscription"
|
||||
steps:
|
||||
details: 1. Basic Details
|
||||
address: 2. Address
|
||||
@@ -1284,6 +1291,8 @@ en_AU:
|
||||
cart_updating: "Updating cart..."
|
||||
cart_empty: "Cart empty"
|
||||
cart_edit: "Edit your cart"
|
||||
item: "Item"
|
||||
qty: "Qty"
|
||||
card_number: Card Number
|
||||
card_securitycode: "Security Code"
|
||||
card_expiry_date: Expiry Date
|
||||
@@ -1927,6 +1936,7 @@ en_AU:
|
||||
supplier: "Supplier"
|
||||
product_name: "Product Name"
|
||||
product_description: "Product Description"
|
||||
shipping_categories: "Shipping Categories"
|
||||
units: "Unit Size"
|
||||
coordinator: "Coordinator"
|
||||
distributor: "Distributor"
|
||||
@@ -2022,6 +2032,7 @@ en_AU:
|
||||
remove_tax: "Remove tax"
|
||||
first_name_begins_with: "First name begins with"
|
||||
last_name_begins_with: "Last name begins with"
|
||||
new_order: "New Order"
|
||||
enterprise_tos_link: "Enterprise Terms of Service link"
|
||||
enterprise_tos_message: "We want to work with people that share our aims and values. As such we ask new enterprises to agree to our "
|
||||
enterprise_tos_link_text: "Terms of Service."
|
||||
@@ -3184,6 +3195,27 @@ en_AU:
|
||||
invoice_email:
|
||||
hi: "Hi %{name}"
|
||||
invoice_attached_text: Please find attached an invoice for your recent order from
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: "Please confirm your OFN account"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "Dear Customer,"
|
||||
instructions: "Your order has been shipped"
|
||||
shipment_summary: "Shipment Summary"
|
||||
subject: "Shipment Notification"
|
||||
thanks: "Thank you for your business."
|
||||
track_information: "Tracking Information: %{tracking}"
|
||||
track_link: "Tracking Link: %{url}"
|
||||
order_state:
|
||||
address: address
|
||||
adjustments: adjustments
|
||||
@@ -3205,18 +3237,6 @@ en_AU:
|
||||
ended: ended
|
||||
paused: paused
|
||||
canceled: cancelled
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: Please confirm your OFN account
|
||||
users:
|
||||
form:
|
||||
account_settings: Account Settings
|
||||
|
||||
@@ -13,6 +13,7 @@ en_BE:
|
||||
email: Customer E-Mail
|
||||
spree/payment:
|
||||
amount: Amount
|
||||
state: State
|
||||
spree/product:
|
||||
primary_taxon: "Product Category"
|
||||
supplier: "Supplier"
|
||||
@@ -990,10 +991,13 @@ en_BE:
|
||||
name: "Enterprise Fee Summary"
|
||||
description: "Summary of Enterprise Fees collected"
|
||||
subscriptions:
|
||||
subscriptions: Subscriptions
|
||||
new: New Subscription
|
||||
create: Create Subscription
|
||||
edit: Edit Subscription
|
||||
index:
|
||||
title: "Subscriptions"
|
||||
new: "New Subscription"
|
||||
new:
|
||||
title: "New Subscription"
|
||||
edit:
|
||||
title: "Edit Subscription"
|
||||
table:
|
||||
edit_subscription: Edit Subscription
|
||||
pause_subscription: Pause Subscription
|
||||
@@ -1002,6 +1006,7 @@ en_BE:
|
||||
filters:
|
||||
query_placeholder: "Search by email..."
|
||||
setup_explanation:
|
||||
title: "Subscriptions"
|
||||
just_a_few_more_steps: 'Just a few more steps before you can begin:'
|
||||
enable_subscriptions: "Enable subscriptions for at least one of your shops"
|
||||
enable_subscriptions_step_1_html: 1. Go to the %{enterprises_link} page, find your shop, and click "Manage"
|
||||
@@ -1015,6 +1020,8 @@ en_BE:
|
||||
create_at_least_one_schedule_step_3: 3. Click '+ New Schedule', and fill out the form
|
||||
once_you_are_done_you_can_html: Once you are done, you can %{reload_this_page_link}
|
||||
reload_this_page: reload this page
|
||||
form:
|
||||
create: "Create Subscription"
|
||||
steps:
|
||||
details: 1. Basic Details
|
||||
address: 2. Address
|
||||
@@ -1245,6 +1252,8 @@ en_BE:
|
||||
cart_updating: "Updating cart..."
|
||||
cart_empty: "Cart empty"
|
||||
cart_edit: "Edit your cart"
|
||||
item: "Item"
|
||||
qty: "Qty"
|
||||
card_number: Card Number
|
||||
card_securitycode: "Security Code"
|
||||
card_expiry_date: Expiry Date
|
||||
@@ -1887,6 +1896,7 @@ en_BE:
|
||||
supplier: "Supplier"
|
||||
product_name: "Product Name"
|
||||
product_description: "Product Description"
|
||||
shipping_categories: "Shipping Categories"
|
||||
units: "Unit Size"
|
||||
coordinator: "Coordinator"
|
||||
distributor: "Distributor"
|
||||
@@ -1982,6 +1992,7 @@ en_BE:
|
||||
remove_tax: "Remove tax"
|
||||
first_name_begins_with: "First name begins with"
|
||||
last_name_begins_with: "Last name begins with"
|
||||
new_order: "New Order"
|
||||
enterprise_tos_link: "Enterprise Terms of Service link"
|
||||
enterprise_tos_message: "We want to work with people that share our aims and values. As such we ask new enterprises to agree to our "
|
||||
enterprise_tos_link_text: "Terms of Service."
|
||||
@@ -3093,6 +3104,27 @@ en_BE:
|
||||
invoice_email:
|
||||
hi: "Hi %{name}"
|
||||
invoice_attached_text: Please find attached an invoice for your recent order from
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: "Please confirm your OFN account"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "Dear Customer,"
|
||||
instructions: "Your order has been shipped"
|
||||
shipment_summary: "Shipment Summary"
|
||||
subject: "Shipment Notification"
|
||||
thanks: "Thank you for your business."
|
||||
track_information: "Tracking Information: %{tracking}"
|
||||
track_link: "Tracking Link: %{url}"
|
||||
order_state:
|
||||
address: address
|
||||
adjustments: adjustments
|
||||
@@ -3114,18 +3146,6 @@ en_BE:
|
||||
ended: ended
|
||||
paused: paused
|
||||
canceled: cancelled
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: Please confirm your OFN account
|
||||
users:
|
||||
form:
|
||||
account_settings: Account Settings
|
||||
|
||||
@@ -13,6 +13,8 @@ en_CA:
|
||||
email: Customer E-Mail
|
||||
spree/payment:
|
||||
amount: Amount
|
||||
state: State
|
||||
source: Source
|
||||
spree/product:
|
||||
primary_taxon: "Product Category"
|
||||
supplier: "Supplier"
|
||||
@@ -271,6 +273,9 @@ en_CA:
|
||||
on hand: "On Hand"
|
||||
ship: "Ship"
|
||||
shipping_category: "Shipping Category"
|
||||
height: "Height"
|
||||
width: "Width"
|
||||
depth: "Depth"
|
||||
actions:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
@@ -1034,10 +1039,13 @@ en_CA:
|
||||
name: "Enterprise Fee Summary"
|
||||
description: "Summary of Enterprise Fees collected"
|
||||
subscriptions:
|
||||
subscriptions: Subscriptions
|
||||
new: New Subscription
|
||||
create: Create Subscription
|
||||
edit: Edit Subscription
|
||||
index:
|
||||
title: "Subscriptions"
|
||||
new: "New Subscription"
|
||||
new:
|
||||
title: "New Subscription"
|
||||
edit:
|
||||
title: "Edit Subscription"
|
||||
table:
|
||||
edit_subscription: Edit Subscription
|
||||
pause_subscription: Pause Subscription
|
||||
@@ -1046,6 +1054,7 @@ en_CA:
|
||||
filters:
|
||||
query_placeholder: "Search by email..."
|
||||
setup_explanation:
|
||||
title: "Subscriptions"
|
||||
just_a_few_more_steps: 'Just a few more steps before you can begin:'
|
||||
enable_subscriptions: "Enable subscriptions for at least one of your shops"
|
||||
enable_subscriptions_step_1_html: 1. Go to the %{enterprises_link} page, find your shop, and click "Manage"
|
||||
@@ -1059,6 +1068,8 @@ en_CA:
|
||||
create_at_least_one_schedule_step_3: 3. Click '+ New Schedule', and fill out the form
|
||||
once_you_are_done_you_can_html: Once you are done, you can %{reload_this_page_link}
|
||||
reload_this_page: reload this page
|
||||
form:
|
||||
create: "Create Subscription"
|
||||
steps:
|
||||
details: 1. Basic Details
|
||||
address: 2. Address
|
||||
@@ -1161,7 +1172,7 @@ en_CA:
|
||||
mobile_menu:
|
||||
cart: "Cart"
|
||||
register_call:
|
||||
selling_on_ofn: "Interested in getting on the Open Food Network?"
|
||||
selling_on_ofn: "Interested in selling on the Open Food Network?"
|
||||
register: "Register here"
|
||||
footer:
|
||||
footer_secure: "Secure and trusted."
|
||||
@@ -1303,6 +1314,8 @@ en_CA:
|
||||
cart_updating: "Updating cart..."
|
||||
cart_empty: "Cart empty"
|
||||
cart_edit: "Edit your cart"
|
||||
item: "Item"
|
||||
qty: "Qty"
|
||||
card_number: Card Number
|
||||
card_securitycode: "Security Code"
|
||||
card_expiry_date: Expiry Date
|
||||
@@ -1958,6 +1971,8 @@ en_CA:
|
||||
supplier: "Supplier"
|
||||
product_name: "Product Name"
|
||||
product_description: "Product Description"
|
||||
permalink: "Permalink"
|
||||
shipping_categories: "Shipping Categories"
|
||||
units: "Unit Size"
|
||||
coordinator: "Coordinator"
|
||||
distributor: "Distributor"
|
||||
@@ -2054,6 +2069,8 @@ en_CA:
|
||||
remove_tax: "Remove tax"
|
||||
first_name_begins_with: "First name begins with"
|
||||
last_name_begins_with: "Last name begins with"
|
||||
shipping_method: "Shipping method"
|
||||
new_order: "New Order"
|
||||
enterprise_tos_link: "Enterprise Terms of Service link"
|
||||
enterprise_tos_message: "We want to work with people that share our aims and values. As such we ask new enterprises to agree to our "
|
||||
enterprise_tos_link_text: "Terms of Service."
|
||||
@@ -3165,6 +3182,8 @@ en_CA:
|
||||
stripe:
|
||||
error_saving_payment: Error saving payment
|
||||
submitting_payment: Submitting payment...
|
||||
paypal:
|
||||
no_payment_via_admin_backend: Paypal payments cannot be captured in the backoffice.
|
||||
products:
|
||||
image_upload_error: "The product image was not recognised. Please upload an image in PNG or JPG format."
|
||||
new:
|
||||
@@ -3342,6 +3361,32 @@ en_CA:
|
||||
invoice_email:
|
||||
hi: "Hi %{name}"
|
||||
invoice_attached_text: Please find attached an invoice for your recent order from
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: "Please confirm your OFN account"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "Dear Customer, "
|
||||
instructions: "Your order has been shipped or picked up."
|
||||
shipment_summary: "Shipment/Pick Up Summary"
|
||||
subject: "Shipment/Pick Up Notification"
|
||||
thanks: "Thank you for your business."
|
||||
track_information: "Tracking Information: %{tracking}"
|
||||
track_link: "Tracking Link: %{url}"
|
||||
test_mailer:
|
||||
test_email:
|
||||
greeting: "Congratulations!"
|
||||
message: "If you have received this email, then your OFN email settings are correct."
|
||||
subject: "Test Mail"
|
||||
order_state:
|
||||
address: address
|
||||
adjustments: adjustments
|
||||
@@ -3363,18 +3408,6 @@ en_CA:
|
||||
ended: ended
|
||||
paused: paused
|
||||
canceled: cancelled
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: Please confirm your OFN account
|
||||
users:
|
||||
form:
|
||||
account_settings: Account Settings
|
||||
|
||||
@@ -13,6 +13,7 @@ en_DE:
|
||||
email: Customer E-Mail
|
||||
spree/payment:
|
||||
amount: Amount
|
||||
state: State
|
||||
spree/product:
|
||||
primary_taxon: "Product Category"
|
||||
supplier: "Supplier"
|
||||
@@ -998,10 +999,13 @@ en_DE:
|
||||
name: "Enterprise Fee Summary"
|
||||
description: "Summary of Enterprise Fees collected"
|
||||
subscriptions:
|
||||
subscriptions: Subscriptions
|
||||
new: New Subscription
|
||||
create: Create Subscription
|
||||
edit: Edit Subscription
|
||||
index:
|
||||
title: "Subscriptions"
|
||||
new: "New Subscription"
|
||||
new:
|
||||
title: "New Subscription"
|
||||
edit:
|
||||
title: "Edit Subscription"
|
||||
table:
|
||||
edit_subscription: Edit Subscription
|
||||
pause_subscription: Pause Subscription
|
||||
@@ -1010,6 +1014,7 @@ en_DE:
|
||||
filters:
|
||||
query_placeholder: "Search by email..."
|
||||
setup_explanation:
|
||||
title: "Subscriptions"
|
||||
just_a_few_more_steps: 'Just a few more steps before you can begin:'
|
||||
enable_subscriptions: "Enable subscriptions for at least one of your shops"
|
||||
enable_subscriptions_step_1_html: 1. Go to the %{enterprises_link} page, find your shop, and click "Manage"
|
||||
@@ -1023,6 +1028,8 @@ en_DE:
|
||||
create_at_least_one_schedule_step_3: 3. Click '+ New Schedule', and fill out the form
|
||||
once_you_are_done_you_can_html: Once you are done, you can %{reload_this_page_link}
|
||||
reload_this_page: reload this page
|
||||
form:
|
||||
create: "Create Subscription"
|
||||
steps:
|
||||
details: 1. Basic Details
|
||||
address: 2. Address
|
||||
@@ -1255,6 +1262,8 @@ en_DE:
|
||||
cart_updating: "Updating cart..."
|
||||
cart_empty: "Cart empty"
|
||||
cart_edit: "Edit your cart"
|
||||
item: "Item"
|
||||
qty: "Qty"
|
||||
card_number: Card Number
|
||||
card_securitycode: "Security Code"
|
||||
card_expiry_date: Expiry Date
|
||||
@@ -1897,6 +1906,7 @@ en_DE:
|
||||
supplier: "Supplier"
|
||||
product_name: "Product Name"
|
||||
product_description: "Product Description"
|
||||
shipping_categories: "Shipping Categories"
|
||||
units: "Unit Size"
|
||||
coordinator: "Coordinator"
|
||||
distributor: "Distributor"
|
||||
@@ -1992,6 +2002,7 @@ en_DE:
|
||||
remove_tax: "Remove tax"
|
||||
first_name_begins_with: "First name begins with"
|
||||
last_name_begins_with: "Last name begins with"
|
||||
new_order: "New Order"
|
||||
enterprise_tos_link: "Enterprise Terms of Service link"
|
||||
enterprise_tos_message: "We want to work with people that share our aims and values. As such we ask new enterprises to agree to our "
|
||||
enterprise_tos_link_text: "Terms of Service."
|
||||
@@ -3110,6 +3121,27 @@ en_DE:
|
||||
invoice_email:
|
||||
hi: "Hi %{name}"
|
||||
invoice_attached_text: Please find attached an invoice for your recent order from
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: "Please confirm your OFN account"
|
||||
shipment_mailer:
|
||||
shipped_email:
|
||||
dear_customer: "Dear Customer,"
|
||||
instructions: "Your order has been shipped"
|
||||
shipment_summary: "Shipment Summary"
|
||||
subject: "Shipment Notification"
|
||||
thanks: "Thank you for your business."
|
||||
track_information: "Tracking Information: %{tracking}"
|
||||
track_link: "Tracking Link: %{url}"
|
||||
order_state:
|
||||
address: address
|
||||
adjustments: adjustments
|
||||
@@ -3131,18 +3163,6 @@ en_DE:
|
||||
ended: ended
|
||||
paused: paused
|
||||
canceled: cancelled
|
||||
user_mailer:
|
||||
reset_password_instructions:
|
||||
request_sent_text: |
|
||||
A request to reset your password has been made.
|
||||
If you did not make this request, simply ignore this email.
|
||||
link_text: >
|
||||
If you did make this request just click the link below:
|
||||
issue_text: |
|
||||
If the above URL does not work try copying and pasting it into your browser.
|
||||
If you continue to have problems please feel free to contact us.
|
||||
confirmation_instructions:
|
||||
subject: Please confirm your OFN account
|
||||
users:
|
||||
form:
|
||||
account_settings: Account Settings
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user