diff --git a/.env b/.env
index 3182c162266..fe9b06d4ff1 100644
--- a/.env
+++ b/.env
@@ -10,10 +10,10 @@ TIMEZONE="Melbourne"
DEFAULT_COUNTRY_CODE="AU"
# Locale for translation.
-LOCALE="en"
+LOCALE="en_AU"
# For multilingual - ENV doesn't have array so pass it as string with commas
-AVAILABLE_LOCALES="en,es"
+AVAILABLE_LOCALES="en_AU,es"
# Spree zone.
CHECKOUT_ZONE="Australia"
@@ -42,14 +42,6 @@ SMTP_PASSWORD="f00d"
# Javascript error reporting via Bugsnag.
# BUGSNAG_JS_KEY=""
-# SingleSignOn login for Discourse
-#
-# DISCOURSE_SSO_SECRET should be a random string. It must be the same as provided to your Discourse instance.
-# DISCOURSE_SSO_SECRET=""
-#
-# DISCOURSE_URL must be the URL of your Discourse instance.
-# DISCOURSE_URL="https://noticeboard.openfoodnetwork.org.au"
-
# see="https://developers.google.com/maps/documentation/javascript/get-api-key
# GOOGLE_MAPS_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# see https://developers.google.com/maps/documentation/javascript/localization#Region
diff --git a/.env.development b/.env.development
index 1605f8ffbab..68640acf212 100644
--- a/.env.development
+++ b/.env.development
@@ -5,6 +5,11 @@
#
# cp .env.development .env.local
+# Locale for translation. Using a locale other than `en` tests the
+# successful fallback to `en`. You will also see up-to-date text used
+# in production
+LOCALE="en_AU"
+
VERBOSE_QUERY_LOGS=true
SECRET_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
diff --git a/.env.test b/.env.test
index 09881648aa9..c0097a0416f 100644
--- a/.env.test
+++ b/.env.test
@@ -1,6 +1,9 @@
# ENV vars for the test environment
# Override locally with `.env.test.local`
+# Locale for translation.
+LOCALE="en_TEST"
+
OFN_REDIS_JOBS_URL="redis://localhost:6379/2"
SECRET_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
diff --git a/.github/ISSUE_TEMPLATE/release.md b/.github/ISSUE_TEMPLATE/release.md
index caf9fb39b87..7ff900d243f 100644
--- a/.github/ISSUE_TEMPLATE/release.md
+++ b/.github/ISSUE_TEMPLATE/release.md
@@ -45,7 +45,7 @@ The full process is described at https://github.com/openfoodfoundation/openfoodn
[Ready To Go]: https://github.com/orgs/openfoodfoundation/projects/8?filterQuery=status%3A%22Ready+to+go+%F0%9F%9A%80%22
[Transifex pull request]: https://github.com/openfoodfoundation/openfoodnetwork/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+head%3Atransifex
-[Draft new release]: https://github.com/openfoodfoundation/openfoodnetwork/releases/new?tag=v&title=v+Code+Name&body=Congrats%0A%0ADescription%0A%0A
+[Draft new release]: https://github.com/openfoodfoundation/openfoodnetwork/releases/new?title=v+Code+Name&body=Congrats%0A%0ADescription%0A%0A
[releases]: https://github.com/openfoodfoundation/openfoodnetwork/releases
[#instance-managers]: https://app.slack.com/client/T02G54U79/CG7NJ966B
[#testing]: https://openfoodnetwork.slack.com/app_redirect?channel=C02TZ6X00
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 846f781c71d..66f7d5a3ccd 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -55,6 +55,7 @@ jobs:
with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
+ # JS is required in order for webpacker to compile, in order to render templates containing image urls
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
@@ -64,8 +65,7 @@ jobs:
- name: Set up database
run: |
- bundle exec rake db:create
- bundle exec rake db:schema:load
+ bin/rake db:create db:schema:load
- name: Run tests
env:
@@ -83,7 +83,7 @@ jobs:
KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/controllers/**/*_spec.rb}"
run: |
git show --no-patch # the commit being tested (which is often a merge due to actions/checkout@v3)
- bundle exec rake knapsack_pro:rspec
+ bin/rake knapsack_pro:rspec
models:
runs-on: ubuntu-22.04
@@ -106,10 +106,10 @@ jobs:
# [n] - where the n is a number of parallel jobs you want to run your tests on.
# Use a higher number if you have slow tests to split them between more parallel jobs.
# Remember to update the value of the `ci_node_index` below to (0..n-1).
- ci_node_total: [5]
+ ci_node_total: [4]
# Indexes for parallel jobs (starting from zero).
# E.g. use [0, 1] for 2 parallel jobs, [0, 1, 2] for 3 parallel jobs, etc.
- ci_node_index: [0, 1, 2, 3, 4]
+ ci_node_index: [0, 1, 2, 3]
steps:
- uses: actions/checkout@v3
@@ -123,20 +123,11 @@ jobs:
with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- - uses: actions/setup-node@v3
- with:
- node-version-file: .node-version
-
- - name: Install JS dependencies
- run: yarn install --frozen-lockfile
-
- name: Set up database
run: |
- bundle exec rake db:create
- bundle exec rake db:schema:load
+ bin/rake db:create db:schema:load
- name: Run tests
-
env:
KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: 09476e2ce491c12083df62768667c674
KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }}
@@ -150,9 +141,8 @@ jobs:
# https://knapsackpro.com/faq/question/how-to-split-slow-rspec-test-files-by-test-examples-by-individual-it
#KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES: true
KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/models/**/*_spec.rb}"
-
run: |
- bundle exec rake knapsack_pro:rspec
+ bin/rake knapsack_pro:rspec
system_admin:
runs-on: ubuntu-22.04
@@ -175,10 +165,10 @@ jobs:
# [n] - where the n is a number of parallel jobs you want to run your tests on.
# Use a higher number if you have slow tests to split them between more parallel jobs.
# Remember to update the value of the `ci_node_index` below to (0..n-1).
- ci_node_total: [13]
+ ci_node_total: [14]
# Indexes for parallel jobs (starting from zero).
# E.g. use [0, 1] for 2 parallel jobs, [0, 1, 2] for 3 parallel jobs, etc.
- ci_node_index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+ ci_node_index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
steps:
- uses: actions/checkout@v3
@@ -201,8 +191,7 @@ jobs:
- name: Set up database
run: |
- bundle exec rake db:create
- bundle exec rake db:schema:load
+ bin/rake db:create db:schema:load
- name: Run tests
@@ -221,7 +210,7 @@ jobs:
KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/system/admin/**/*_spec.rb}"
run: |
- bundle exec rake knapsack_pro:queue:rspec
+ bin/rake knapsack_pro:queue:rspec
- name: Archive failed tests screenshots
if: failure()
@@ -279,8 +268,7 @@ jobs:
- name: Set up database
run: |
- bundle exec rake db:create
- bundle exec rake db:schema:load
+ bin/rake db:create db:schema:load
- name: Run tests
@@ -299,7 +287,7 @@ jobs:
KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/system/consumer/**/*_spec.rb}"
run: |
- bundle exec rake knapsack_pro:queue:rspec
+ bin/rake knapsack_pro:queue:rspec
- name: Archive failed tests screenshots
if: failure()
@@ -348,6 +336,7 @@ jobs:
with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
+ # JS is required in order for webpacker to compile, in order to render templates linking to mail.css
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
@@ -357,8 +346,7 @@ jobs:
- name: Set up database
run: |
- bundle exec rake db:create
- bundle exec rake db:schema:load
+ bin/rake db:create db:schema:load
- name: Run tests
@@ -377,7 +365,7 @@ jobs:
KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/lib/**/*_spec.rb,spec/migrations/**/*_spec.rb,spec/serializers/**/*_spec.rb,engines/**/*_spec.rb}"
run: |
- bundle exec rake knapsack_pro:rspec
+ bin/rake knapsack_pro:rspec
- name: Archive failed tests screenshots
if: failure()
@@ -426,6 +414,7 @@ jobs:
with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
+ # JS is required in order for webpacker to compile, in order to render templates linking to mail.css
- uses: actions/setup-node@v3
with:
node-version-file: .node-version
@@ -435,11 +424,9 @@ jobs:
- name: Set up database
run: |
- bundle exec rake db:create
- bundle exec rake db:schema:load
+ bin/rake db:create db:schema:load
- name: Run tests
-
env:
KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: e3b8800198d2d89b70c7edbdd85f8fd8
KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }}
@@ -453,10 +440,8 @@ jobs:
# https://knapsackpro.com/faq/question/how-to-split-slow-rspec-test-files-by-test-examples-by-individual-it
#KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES: true
KNAPSACK_PRO_TEST_FILE_EXCLUDE_PATTERN: "{engines/**/*_spec.rb,spec/models/**/*_spec.rb,spec/controllers/**/*_spec.rb,spec/serializers/**/*_spec.rb,spec/lib/**/*_spec.rb,spec/migrations/**/*_spec.rb,spec/system/**/*_spec.rb}"
-
-
run: |
- bundle exec rake knapsack_pro:rspec
+ bin/rake knapsack_pro:rspec
non_knapsack_jest_karma:
runs-on: ubuntu-22.04
@@ -476,11 +461,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- - name: Setup redis
- uses: supercharge/redis-github-action@1.4.0
- with:
- redis-version: 6
-
+ # Rails is required for the Karma rake script
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
@@ -493,12 +474,8 @@ jobs:
- name: Install JS dependencies
run: yarn install --frozen-lockfile
- - name: Set up database
- run: |
- bundle exec rake db:create
- bundle exec rake db:schema:load
- name: Run JS tests
- run: bundle exec rake karma:run
+ run: bin/rake karma:run
- name: Run jest tests
run: yarn jest
diff --git a/.rspec b/.rspec
new file mode 100644
index 00000000000..eb81da86cfe
--- /dev/null
+++ b/.rspec
@@ -0,0 +1 @@
+--require base_spec_helper
diff --git a/.rubocop.yml b/.rubocop.yml
index 937a2acf170..93d9f9bd819 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -5,8 +5,12 @@
# The configuration is split into three files. Look into those files for more details.
#
require:
+ - rubocop-capybara
+ - rubocop-factory_bot
- rubocop-rails
- rubocop-rspec
+ - rubocop-rspec_rails
+
inherit_from:
# The automatically generated todo list to ignore all current violations.
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 8ed82cc4a71..7d398188f31 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1,15 +1,39 @@
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400 --no-auto-gen-timestamp`
-# using RuboCop version 1.62.1.
+# using RuboCop version 1.64.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EmptyLineBetweenMethodDefs, EmptyLineBetweenClassDefs, EmptyLineBetweenModuleDefs, DefLikeMacros, AllowAdjacentOneLineDefs, NumberOfEmptyLines.
+Layout/EmptyLineBetweenDefs:
+ Exclude:
+ - 'app/services/products_renderer.rb'
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+Layout/EmptyLines:
+ Exclude:
+ - 'app/services/products_renderer.rb'
+
+# Offense count: 6
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyle, IndentationWidth.
+# SupportedStyles: aligned, indented, indented_relative_to_receiver
+Layout/MultilineMethodCallIndentation:
+ Exclude:
+ - 'app/services/products_renderer.rb'
+
# Offense count: 2
-Lint/DuplicateMethods:
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyle, IndentationWidth.
+# SupportedStyles: aligned, indented
+Layout/MultilineOperationIndentation:
Exclude:
- - 'lib/discourse/single_sign_on.rb'
+ - 'app/services/products_renderer.rb'
# Offense count: 16
# Configuration parameters: AllowComments, AllowEmptyLambdas.
@@ -27,11 +51,10 @@ Lint/EmptyBlock:
- 'spec/jobs/subscription_placement_job_spec.rb'
- 'spec/models/product_import/entry_validator_spec.rb'
-# Offense count: 6
+# Offense count: 4
# Configuration parameters: AllowComments.
Lint/EmptyClass:
Exclude:
- - 'spec/controllers/spree/admin/base_controller_spec.rb'
- 'spec/lib/reports/report_loader_spec.rb'
# Offense count: 1
@@ -85,7 +108,7 @@ Lint/UselessMethodDefinition:
Exclude:
- 'app/models/spree/gateway.rb'
-# Offense count: 26
+# Offense count: 24
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
Metrics/AbcSize:
Exclude:
@@ -104,11 +127,9 @@ Metrics/AbcSize:
- 'app/models/spree/order/checkout.rb'
- 'app/models/spree/preferences/preferable_class_methods.rb'
- 'app/models/spree/return_authorization.rb'
- - 'lib/discourse/single_sign_on.rb'
- 'lib/open_food_network/order_cycle_form_applicator.rb'
- 'lib/open_food_network/order_cycle_permissions.rb'
- 'lib/spree/core/controller_helpers/order.rb'
- - 'lib/tasks/enterprises.rake'
- 'spec/services/orders/checkout_restart_service_spec.rb'
# Offense count: 9
@@ -129,7 +150,7 @@ Metrics/BlockNesting:
Exclude:
- 'app/models/spree/payment/processing.rb'
-# Offense count: 46
+# Offense count: 47
# Configuration parameters: CountComments, Max, CountAsOne.
Metrics/ClassLength:
Exclude:
@@ -164,6 +185,7 @@ Metrics/ClassLength:
- 'app/models/spree/user.rb'
- 'app/models/spree/variant.rb'
- 'app/models/spree/zone.rb'
+ - 'app/reflexes/admin/orders_reflex.rb'
- 'app/reflexes/products_reflex.rb'
- 'app/serializers/api/cached_enterprise_serializer.rb'
- 'app/serializers/api/enterprise_shopfront_serializer.rb'
@@ -180,7 +202,7 @@ Metrics/ClassLength:
- 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
- 'lib/reporting/reports/xero_invoices/base.rb'
-# Offense count: 34
+# Offense count: 32
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
Metrics/CyclomaticComplexity:
Exclude:
@@ -190,7 +212,6 @@ Metrics/CyclomaticComplexity:
- 'app/helpers/checkout_helper.rb'
- 'app/helpers/order_cycles_helper.rb'
- 'app/helpers/spree/admin/navigation_helper.rb'
- - 'app/models/enterprise.rb'
- 'app/models/enterprise_relationship.rb'
- 'app/models/product_import/entry_validator.rb'
- 'app/models/spree/ability.rb'
@@ -204,7 +225,6 @@ Metrics/CyclomaticComplexity:
- 'app/models/spree/tax_rate.rb'
- 'app/models/spree/variant.rb'
- 'app/models/spree/zone.rb'
- - 'lib/discourse/single_sign_on.rb'
- 'lib/open_food_network/enterprise_issue_validator.rb'
- 'lib/reporting/reports/xero_invoices/base.rb'
- 'lib/spree/core/controller_helpers/order.rb'
@@ -212,7 +232,7 @@ Metrics/CyclomaticComplexity:
- 'lib/spree/localized_number.rb'
- 'spec/models/product_importer_spec.rb'
-# Offense count: 25
+# Offense count: 24
# Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns.
Metrics/MethodLength:
Exclude:
@@ -226,7 +246,6 @@ Metrics/MethodLength:
- 'app/models/spree/order/checkout.rb'
- 'app/models/spree/payment/processing.rb'
- 'app/models/spree/preferences/preferable_class_methods.rb'
- - 'lib/discourse/single_sign_on.rb'
- 'lib/open_food_network/order_cycle_form_applicator.rb'
- 'lib/open_food_network/order_cycle_permissions.rb'
- 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
@@ -398,7 +417,6 @@ RSpecRails/HaveHttpStatus:
- 'spec/controllers/user_registrations_controller_spec.rb'
- 'spec/requests/admin/images_spec.rb'
- 'spec/requests/api/routes_spec.rb'
- - 'spec/requests/checkout/failed_checkout_spec.rb'
- 'spec/requests/checkout/stripe_sca_spec.rb'
- 'spec/requests/home_controller_spec.rb'
- 'spec/requests/omniauth_callbacks_controller_spec.rb'
@@ -414,7 +432,7 @@ RSpecRails/HttpStatus:
- 'spec/controllers/spree/admin/products_controller_spec.rb'
- 'spec/requests/api/orders_spec.rb'
-# Offense count: 146
+# Offense count: 144
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Inferences.
RSpecRails/InferredSpecType:
@@ -518,7 +536,6 @@ RSpecRails/InferredSpecType:
- 'spec/helpers/navigation_helper_spec.rb'
- 'spec/helpers/order_cycles_helper_spec.rb'
- 'spec/helpers/serializer_helper_spec.rb'
- - 'spec/helpers/shared_helper_spec.rb'
- 'spec/helpers/shop_helper_spec.rb'
- 'spec/helpers/spree/admin/base_helper_spec.rb'
- 'spec/helpers/spree/admin/general_settings_helper_spec.rb'
@@ -552,7 +569,6 @@ RSpecRails/InferredSpecType:
- 'spec/requests/api/routes_spec.rb'
- 'spec/requests/api/v1/customers_spec.rb'
- 'spec/requests/api_docs_spec.rb'
- - 'spec/requests/checkout/failed_checkout_spec.rb'
- 'spec/requests/checkout/paypal_spec.rb'
- 'spec/requests/checkout/routes_spec.rb'
- 'spec/requests/checkout/stripe_sca_spec.rb'
@@ -565,17 +581,6 @@ RSpecRails/InferredSpecType:
- 'spec/requests/voucher_adjustments_spec.rb'
- 'spec/routing/stripe_spec.rb'
-# Offense count: 11
-# Configuration parameters: Include.
-# Include: app/models/**/*.rb
-Rails/HasManyOrHasOneDependent:
- Exclude:
- - 'app/models/enterprise.rb'
- - 'app/models/spree/address.rb'
- - 'app/models/spree/stock_item.rb'
- - 'app/models/spree/tax_rate.rb'
- - 'app/models/spree/variant.rb'
-
# Offense count: 22
# Configuration parameters: IgnoreScopes, Include.
# Include: app/models/**/*.rb
@@ -660,27 +665,6 @@ Rails/RedundantActiveRecordAllMethod:
- 'app/models/spree/variant.rb'
- 'spec/system/admin/product_import_spec.rb'
-# Offense count: 20
-# This cop supports unsafe autocorrection (--autocorrect-all).
-Rails/RedundantPresenceValidationOnBelongsTo:
- Exclude:
- - 'app/models/enterprise_fee.rb'
- - 'app/models/exchange.rb'
- - 'app/models/inventory_item.rb'
- - 'app/models/order_cycle.rb'
- - 'app/models/spree/address.rb'
- - 'app/models/spree/line_item.rb'
- - 'app/models/spree/order.rb'
- - 'app/models/spree/product_property.rb'
- - 'app/models/spree/return_authorization.rb'
- - 'app/models/spree/state.rb'
- - 'app/models/spree/stock_item.rb'
- - 'app/models/spree/stock_movement.rb'
- - 'app/models/spree/tax_rate.rb'
- - 'app/models/subscription_line_item.rb'
- - 'app/models/tag_rule.rb'
- - 'app/models/variant_override.rb'
-
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/RelativeDateConstant:
@@ -762,17 +746,6 @@ Rails/UnknownEnv:
Exclude:
- 'app/models/spree/app_configuration.rb'
-# Offense count: 7
-# Configuration parameters: Severity.
-Rails/UnusedRenderContent:
- Exclude:
- - 'app/controllers/admin/bulk_line_items_controller.rb'
- - 'app/controllers/admin/tag_rules_controller.rb'
- - 'app/controllers/api/v0/enterprise_fees_controller.rb'
- - 'app/controllers/api/v0/products_controller.rb'
- - 'app/controllers/api/v0/taxons_controller.rb'
- - 'app/controllers/api/v0/variants_controller.rb'
-
# Offense count: 1
Security/Open:
Exclude:
@@ -797,7 +770,7 @@ Style/CaseEquality:
Exclude:
- 'spec/models/spree/payment_spec.rb'
-# Offense count: 25
+# Offense count: 23
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: nested, compact
@@ -824,10 +797,9 @@ Style/ClassAndModuleChildren:
- 'app/serializers/api/taxon_serializer.rb'
- 'app/serializers/api/variant_serializer.rb'
- 'lib/open_food_network/locking.rb'
- - 'spec/controllers/spree/admin/base_controller_spec.rb'
- 'spec/models/spree/payment_method_spec.rb'
-# Offense count: 1
+# Offense count: 2
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: always, always_true, never
@@ -877,12 +849,6 @@ Style/HashEachMethods:
- 'spec/models/product_importer_spec.rb'
- 'spec/support/cancan_helper.rb'
-# Offense count: 1
-# Configuration parameters: MinBranchesCount.
-Style/HashLikeCase:
- Exclude:
- - 'app/models/enterprise.rb'
-
# Offense count: 4
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/MapToHash:
@@ -971,19 +937,6 @@ Style/RedundantInitialize:
Exclude:
- 'spec/models/spree/gateway_spec.rb'
-# Offense count: 2
-# This cop supports unsafe autocorrection (--autocorrect-all).
-Style/RedundantInterpolation:
- Exclude:
- - 'lib/tasks/karma.rake'
- - 'spec/base_spec_helper.rb'
-
-# Offense count: 8
-# This cop supports safe autocorrection (--autocorrect).
-Style/RedundantLineContinuation:
- Exclude:
- - 'lib/reporting/reports/enterprise_fee_summary/scope.rb'
-
# Offense count: 19
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: AllowedMethods, AllowedPatterns.
@@ -1026,36 +979,10 @@ Style/Send:
- 'spec/services/variant_units/option_value_namer_spec.rb'
- 'spec/support/localized_number_helper.rb'
-# Offense count: 4
+# Offense count: 3
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/SlicingWithRange:
Exclude:
- 'app/helpers/spree/admin/navigation_helper.rb'
- 'app/services/embedded_page_service.rb'
- 'engines/order_management/app/services/order_management/subscriptions/validator.rb'
- - 'lib/discourse/single_sign_on.rb'
-
-# Offense count: 25
-# This cop supports unsafe autocorrection (--autocorrect-all).
-# Configuration parameters: Mode.
-Style/StringConcatenation:
- Exclude:
- - 'app/controllers/admin/stripe_connect_settings_controller.rb'
- - 'app/helpers/discourse_helper.rb'
- - 'app/helpers/enterprises_helper.rb'
- - 'app/helpers/spree/admin/base_helper.rb'
- - 'app/mailers/spree/user_mailer.rb'
- - 'app/models/enterprise.rb'
- - 'app/models/spree/credit_card.rb'
- - 'app/models/spree/payment_method.rb'
- - 'app/serializers/api/cached_enterprise_serializer.rb'
- - 'app/serializers/api/enterprise_shopfront_list_serializer.rb'
- - 'app/services/embedded_page_service.rb'
- - 'app/services/products_renderer.rb'
- - 'lib/spree/api/controller_setup.rb'
- - 'lib/spree/core/environment_extension.rb'
- - 'spec/models/spree/line_item_spec.rb'
- - 'spec/models/spree/product_spec.rb'
- - 'spec/services/embedded_page_service_spec.rb'
- - 'spec/support/features/datepicker_helper.rb'
- - 'spec/system/admin/products_spec.rb'
diff --git a/Gemfile b/Gemfile
index d4eea771b03..94f0e62398e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -19,7 +19,6 @@ gem 'angular-rails-templates', '>= 0.3.0'
gem 'awesome_nested_set'
gem 'ransack', '~> 4.1.0'
gem 'responders'
-gem 'rexml'
gem 'webpacker', '~> 5'
gem 'i18n'
@@ -103,8 +102,10 @@ gem 'redis'
gem 'sidekiq'
gem 'sidekiq-scheduler'
-gem "cable_ready", "5.0.1"
-gem "stimulus_reflex", "3.5.0.rc3"
+gem "cable_ready"
+gem "stimulus_reflex"
+
+gem "turbo-rails"
gem 'combine_pdf'
gem 'wicked_pdf'
@@ -164,7 +165,7 @@ group :test, :development do
gem 'rspec-sql'
gem 'rswag'
gem 'shoulda-matchers'
- gem 'stimulus_reflex_testing'
+ gem 'stimulus_reflex_testing', github: "podia/stimulus_reflex_testing", branch: :main
gem 'timecop'
end
diff --git a/Gemfile.lock b/Gemfile.lock
index e272c63b0c5..69516dca6d0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -17,6 +17,14 @@ GIT
sass-rails
thor (>= 0.14)
+GIT
+ remote: https://github.com/podia/stimulus_reflex_testing.git
+ revision: abac2ee34de347c589795b4d1a8e83e0baafb201
+ branch: main
+ specs:
+ stimulus_reflex_testing (0.3.1)
+ stimulus_reflex (>= 3.3.0)
+
PATH
remote: engines/catalog
specs:
@@ -165,17 +173,17 @@ GEM
awesome_nested_set (3.6.0)
activerecord (>= 4.0.0, < 7.2)
aws-eventstream (1.3.0)
- aws-partitions (1.914.0)
- aws-sdk-core (3.192.0)
+ aws-partitions (1.929.0)
+ aws-sdk-core (3.196.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.79.0)
- aws-sdk-core (~> 3, >= 3.191.0)
+ aws-sdk-kms (1.81.0)
+ aws-sdk-core (~> 3, >= 3.193.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.147.0)
- aws-sdk-core (~> 3, >= 3.192.0)
+ aws-sdk-s3 (1.151.0)
+ aws-sdk-core (~> 3, >= 3.194.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0)
@@ -194,10 +202,11 @@ GEM
bullet (7.1.6)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.11)
- cable_ready (5.0.1)
+ cable_ready (5.0.5)
actionpack (>= 5.2)
actionview (>= 5.2)
activesupport (>= 5.2)
+ observer (~> 0.1)
railties (>= 5.2)
thread-local (>= 1.1.0)
cancancan (1.15.0)
@@ -230,14 +239,15 @@ GEM
combine_pdf (1.0.26)
matrix
ruby-rc4 (>= 0.1.5)
- concurrent-ruby (1.2.3)
+ concurrent-ruby (1.3.1)
connection_pool (2.4.1)
crack (1.0.0)
bigdecimal
rexml
crass (1.0.6)
- css_parser (1.16.0)
+ css_parser (1.17.1)
addressable
+ csv (3.3.0)
cuprite (0.15)
capybara (~> 3.0)
ferrum (~> 0.14.0)
@@ -262,14 +272,14 @@ GEM
warden (~> 1.2.3)
devise-encryptable (0.2.0)
devise (>= 2.1.0)
- devise-i18n (1.12.0)
+ devise-i18n (1.12.1)
devise (>= 4.9.0)
devise-token_authenticatable (1.1.0)
devise (>= 4.0.0, < 5.0.0)
diff-lcs (1.5.1)
digest (3.1.1)
docile (1.4.0)
- dotenv (3.1.0)
+ dotenv (3.1.2)
drb (2.2.0)
ruby2_keywords
email_validator (2.2.4)
@@ -297,16 +307,17 @@ GEM
websocket-driver (>= 0.6, < 0.8)
ffaker (2.23.0)
ffi (1.16.3)
- flipper (0.26.2)
+ flipper (1.3.0)
concurrent-ruby (< 2)
- flipper-active_record (0.26.2)
+ flipper-active_record (1.3.0)
activerecord (>= 4.2, < 8)
- flipper (~> 0.26.2)
- flipper-ui (0.26.2)
+ flipper (~> 1.3.0)
+ flipper-ui (1.3.0)
erubi (>= 1.0.0, < 2.0.0)
- flipper (~> 0.26.2)
- rack (>= 1.4, < 3)
- rack-protection (>= 1.5.3, <= 4.0.0)
+ flipper (~> 1.3.0)
+ rack (>= 1.4, < 4)
+ rack-protection (>= 1.5.3, < 5.0.0)
+ rack-session (>= 1.0.2, < 3.0.0)
sanitize (< 7)
fog-aws (2.0.1)
fog-core (~> 1.38)
@@ -331,7 +342,9 @@ GEM
fuubar (2.5.1)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
- geocoder (1.8.2)
+ geocoder (1.8.3)
+ base64 (>= 0.1.0)
+ csv (>= 3.0.0)
globalid (1.2.1)
activesupport (>= 6.1)
gmaps4rails (2.1.2)
@@ -347,7 +360,7 @@ GEM
hashie (5.0.0)
highline (2.0.3)
htmlentities (4.3.4)
- i18n (1.14.4)
+ i18n (1.14.5)
concurrent-ruby (~> 1.0)
i18n-js (3.9.2)
i18n (>= 0.6.6)
@@ -395,7 +408,7 @@ GEM
activesupport (>= 4.2)
jwt (2.8.1)
base64
- knapsack_pro (6.0.4)
+ knapsack_pro (7.4.0)
rake
language_server-protocol (3.17.0.3)
launchy (3.0.0)
@@ -417,7 +430,7 @@ GEM
net-smtp
marcel (1.0.2)
matrix (0.4.2)
- method_source (1.0.0)
+ method_source (1.1.0)
mime-types (3.5.2)
mime-types-data (~> 3.2015)
mime-types-data (3.2023.1205)
@@ -427,7 +440,7 @@ GEM
mini_magick (4.11.0)
mini_mime (1.1.5)
mini_portile2 (2.8.6)
- minitest (5.22.3)
+ minitest (5.23.1)
monetize (1.13.0)
money (~> 6.12)
money (6.16.0)
@@ -447,22 +460,25 @@ GEM
timeout
net-smtp (0.5.0)
net-protocol
- newrelic_rpm (9.8.0)
+ newrelic_rpm (9.9.0)
nio4r (2.7.0)
- nokogiri (1.16.4)
+ nokogiri (1.16.5)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
+ nokogiri-html5-inference (0.3.0)
+ nokogiri (~> 1.14)
oauth2 (1.4.11)
faraday (>= 0.17.3, < 3.0)
jwt (>= 1.0, < 3.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 4)
+ observer (0.1.2)
omniauth (2.1.2)
hashie (>= 3.4.6)
rack (>= 2.2.3)
rack-protection
- omniauth-rails_csrf_protection (1.0.1)
+ omniauth-rails_csrf_protection (1.0.2)
actionpack (>= 4.2)
omniauth (~> 2.0)
omniauth_openid_connect (0.7.1)
@@ -490,7 +506,7 @@ GEM
parallel (1.24.0)
paranoia (2.6.3)
activerecord (>= 5.1, < 7.2)
- parser (3.3.0.5)
+ parser (3.3.2.0)
ast (~> 2.4.1)
racc
paypal-sdk-core (0.3.4)
@@ -511,14 +527,14 @@ GEM
method_source (~> 1.0)
psych (5.1.2)
stringio
- public_suffix (5.0.4)
+ public_suffix (5.0.5)
puma (6.4.2)
nio4r (~> 2.0)
query_count (1.1.1)
activerecord (>= 4.2)
railties (>= 4.2)
raabro (1.4.0)
- racc (1.7.3)
+ racc (1.8.0)
rack (2.2.9)
rack-mini-profiler (2.3.4)
rack (>= 1.2.0)
@@ -602,9 +618,9 @@ GEM
redcarpet (3.6.0)
redis (5.2.0)
redis-client (>= 0.22.0)
- redis-client (0.22.0)
+ redis-client (0.22.1)
connection_pool
- regexp_parser (2.9.0)
+ regexp_parser (2.9.2)
reline (0.5.0)
io-console (~> 0.5)
request_store (1.5.1)
@@ -612,11 +628,12 @@ GEM
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
- rexml (3.2.6)
- roadie (5.2.0)
+ rexml (3.2.8)
+ strscan (>= 3.0.9)
+ roadie (5.2.1)
css_parser (~> 1.4)
nokogiri (~> 1.15)
- roadie-rails (3.1.0)
+ roadie-rails (3.2.0)
railties (>= 5.1, < 8.0)
roadie (~> 5.0)
rodf (1.2.0)
@@ -666,7 +683,7 @@ GEM
rswag-ui (2.13.0)
actionpack (>= 3.1, < 7.2)
railties (>= 3.1, < 7.2)
- rubocop (1.63.2)
+ rubocop (1.64.1)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
@@ -677,8 +694,8 @@ GEM
rubocop-ast (>= 1.31.1, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
- rubocop-ast (1.31.2)
- parser (>= 3.3.0.4)
+ rubocop-ast (1.31.3)
+ parser (>= 3.3.1.0)
rubocop-capybara (2.20.0)
rubocop (~> 1.41)
rubocop-factory_bot (2.25.1)
@@ -688,12 +705,12 @@ GEM
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
rubocop-ast (>= 1.31.1, < 2.0)
- rubocop-rspec (2.29.1)
+ rubocop-rspec (2.29.2)
rubocop (~> 1.40)
rubocop-capybara (~> 2.17)
rubocop-factory_bot (~> 2.22)
rubocop-rspec_rails (~> 2.28)
- rubocop-rspec_rails (2.28.2)
+ rubocop-rspec_rails (2.28.3)
rubocop (~> 1.40)
ruby-graphviz (1.2.5)
rexml
@@ -705,7 +722,7 @@ GEM
rubyzip (2.3.2)
rufus-scheduler (3.8.2)
fugit (~> 1.1, >= 1.1.6)
- sanitize (6.0.2)
+ sanitize (6.1.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
sass (3.4.25)
@@ -719,7 +736,7 @@ GEM
semantic_range (3.0.0)
shoulda-matchers (6.2.0)
activesupport (>= 5.2.0)
- sidekiq (7.2.2)
+ sidekiq (7.2.4)
concurrent-ruby (< 2)
connection_pool (>= 2.3.0)
rack (>= 2.2.4)
@@ -737,7 +754,7 @@ GEM
spreadsheet_architect (5.0.0)
caxlsx (>= 3.3.0, < 4)
rodf (>= 1.0.0, < 2)
- spring (4.2.0)
+ spring (4.2.1)
spring-commands-rspec (1.0.4)
spring (>= 0.9.1)
spring-commands-rubocop (0.4.0)
@@ -756,21 +773,21 @@ GEM
state_machines-activerecord (0.9.0)
activerecord (>= 6.0)
state_machines-activemodel (>= 0.9.0)
- stimulus_reflex (3.5.0.rc3)
+ stimulus_reflex (3.5.1)
actioncable (>= 5.2, < 8)
actionpack (>= 5.2, < 8)
actionview (>= 5.2, < 8)
activesupport (>= 5.2, < 8)
cable_ready (~> 5.0)
nokogiri (~> 1.0)
+ nokogiri-html5-inference (~> 0.3)
rack (>= 2, < 4)
railties (>= 5.2, < 8)
redis (>= 4.0, < 6.0)
- stimulus_reflex_testing (0.3.0)
- stimulus_reflex (>= 3.3.0)
stringex (2.8.6)
stringio (3.1.0)
stripe (11.1.0)
+ strscan (3.1.0)
swd (2.0.3)
activesupport (>= 3)
attr_required (>= 0.0.5)
@@ -783,6 +800,10 @@ GEM
timecop (0.9.8)
timeout (0.4.1)
ttfunk (1.7.0)
+ turbo-rails (2.0.5)
+ actionpack (>= 6.0.0)
+ activejob (>= 6.0.0)
+ railties (>= 6.0.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
@@ -797,7 +818,7 @@ GEM
validates_lengths_from_database (0.8.0)
activerecord (>= 4)
vcr (6.2.0)
- view_component (3.12.0)
+ view_component (3.12.1)
activesupport (>= 5.2.0, < 8.0)
concurrent-ruby (~> 1.0)
method_source (~> 1.0)
@@ -818,7 +839,7 @@ GEM
activesupport
faraday (~> 2.0)
faraday-follow_redirects
- webmock (3.23.0)
+ webmock (3.23.1)
addressable (>= 2.8.0)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
@@ -835,11 +856,11 @@ GEM
chronic (>= 0.6.3)
wicked_pdf (2.6.3)
activesupport
- wkhtmltopdf-binary (0.12.6.6)
+ wkhtmltopdf-binary (0.12.6.7)
xml-simple (1.1.8)
xpath (3.2.0)
nokogiri (~> 1.8)
- zeitwerk (2.6.13)
+ zeitwerk (2.6.15)
PLATFORMS
ruby
@@ -865,7 +886,7 @@ DEPENDENCIES
bootsnap
bugsnag
bullet
- cable_ready (= 5.0.1)
+ cable_ready
cancancan (~> 1.15.0)
capybara
catalog!
@@ -944,7 +965,6 @@ DEPENDENCIES
redcarpet
redis
responders
- rexml
roadie-rails
roo
rspec-rails (>= 3.5.2)
@@ -967,11 +987,12 @@ DEPENDENCIES
spring-commands-rspec
spring-commands-rubocop
state_machines-activerecord
- stimulus_reflex (= 3.5.0.rc3)
- stimulus_reflex_testing
+ stimulus_reflex
+ stimulus_reflex_testing!
stringex (~> 2.8.5)
stripe
timecop
+ turbo-rails
valid_email2
validates_lengths_from_database
vcr
diff --git a/app/assets/javascripts/admin/index_utils/services/columns.js.coffee b/app/assets/javascripts/admin/index_utils/services/columns.js.coffee
index 2d7abfcab79..aeb1a3e3b61 100644
--- a/app/assets/javascripts/admin/index_utils/services/columns.js.coffee
+++ b/app/assets/javascripts/admin/index_utils/services/columns.js.coffee
@@ -31,7 +31,7 @@ angular.module("admin.indexUtils").factory 'Columns', ($rootScope, $http, $injec
savePreferences: (action_name) =>
$http
method: "PUT"
- url: "/admin/column_preferences/bulk_update"
+ url: "/admin/column_preferences/bulk_update.json"
data:
action_name: action_name
column_preferences: (preference for column_name, preference of @columns)
diff --git a/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee
index 5145c05ea12..7d38de19dac 100644
--- a/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee
+++ b/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee
@@ -42,8 +42,17 @@ angular.module('Darkswarm').controller "RegistrationCtrl", ($scope, Registration
$scope.toggleAddressConfirmed = ->
$scope.addressConfirmed = !$scope.addressConfirmed
if $scope.addressConfirmed
+ $scope.setLatLongIfUsingOpenStreetMap()
$scope.enterprise.address.latitude = $scope.latLong.latitude
$scope.enterprise.address.longitude = $scope.latLong.longitude
else
$scope.enterprise.address.latitude = null
$scope.enterprise.address.longitude = null
+
+ # When OpenStreetMaps is enabled the latitude and longitude are calculated via a Stimulus
+ # controller, so they need to be read from data properties to be accessible here.
+ $scope.setLatLongIfUsingOpenStreetMap = ->
+ openStreetMap = document.getElementById("open-street-map")
+ if !$scope.latLong && openStreetMap && openStreetMap.dataset.latitude && openStreetMap.dataset.longitude
+ $scope.latLong = { latitude: openStreetMap.dataset.latitude, longitude: openStreetMap.dataset.longitude }
+
diff --git a/app/assets/javascripts/templates/admin/columns_dropdown.html.haml b/app/assets/javascripts/templates/admin/columns_dropdown.html.haml
index 61f42974dbc..7895d7070eb 100644
--- a/app/assets/javascripts/templates/admin/columns_dropdown.html.haml
+++ b/app/assets/javascripts/templates/admin/columns_dropdown.html.haml
@@ -5,8 +5,9 @@
%div.menu{ 'ng-show' => "expanded" }
.menu_items
.menu_item{ "ng-repeat": "column in columns", "ng-click": "toggle(column);" }
- %input.redesigned-input{ type: "checkbox", "ng-checked": "column.visible" }
- {{ column.name }}
+ %input{ type: "checkbox", "ng-checked": "column.visible" }
+ %span
+ {{ column.name }}
%hr
%div.menu_item.text-center
%input.fullwidth.orange{ type: "button", "ng-value": "saved() ? 'Saved': 'Saving'", "ng-show": "saved() || saving", "ng-disabled": "saved()" }
diff --git a/app/components/help_modal_component.rb b/app/components/help_modal_component.rb
index 297ff347650..fef42131aad 100644
--- a/app/components/help_modal_component.rb
+++ b/app/components/help_modal_component.rb
@@ -2,6 +2,6 @@
class HelpModalComponent < ModalComponent
def initialize(id:, close_button: true)
- super(id:, close_button:)
+ super
end
end
diff --git a/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml b/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml
index 8dedce27ca9..c9c0abebec9 100644
--- a/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml
+++ b/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml
@@ -9,5 +9,5 @@
%div.menu_items
- @options.each do |option|
%label.menu_item{ "data-multiple-checked-select-target": "option", "data-value": option[1], "data-label": option[0] }
- %input.redesigned-input{ type: "checkbox", checked: @selected.include?(option[1]), name: "#{@name}[]", value: option[1] }
- = option[0]
+ %input{ type: "checkbox", checked: @selected.include?(option[1]), name: "#{@name}[]", value: option[1] }
+ %span= option[0]
diff --git a/app/components/searchable_dropdown_component.rb b/app/components/searchable_dropdown_component.rb
new file mode 100644
index 00000000000..9a53155085b
--- /dev/null
+++ b/app/components/searchable_dropdown_component.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+class SearchableDropdownComponent < ViewComponent::Base
+ REMOVED_SEARCH_PLUGIN = { 'tom-select-options-value': '{ "plugins": [] }' }.freeze
+ MINIMUM_OPTIONS_FOR_SEARCH_FIELD = 11 # at least 11 options are required for the search field
+
+ def initialize(
+ form:,
+ name:,
+ options:,
+ selected_option:,
+ placeholder_value:,
+ include_blank: false,
+ aria_label: ''
+ )
+ @f = form
+ @name = name
+ @options = options
+ @selected_option = selected_option
+ @placeholder_value = placeholder_value
+ @include_blank = include_blank
+ @aria_label = aria_label
+ end
+
+ private
+
+ attr_reader :f, :name, :options, :selected_option, :placeholder_value, :include_blank, :aria_label
+
+ def classes
+ "fullwidth #{remove_search_plugin? ? 'no-input' : ''}"
+ end
+
+ def data
+ {
+ controller: "tom-select",
+ 'tom-select-placeholder-value': placeholder_value
+ }.merge(remove_search_plugin? ? REMOVED_SEARCH_PLUGIN : {})
+ end
+
+ def remove_search_plugin?
+ @remove_search_plugin ||= options.count < MINIMUM_OPTIONS_FOR_SEARCH_FIELD
+ end
+end
diff --git a/app/components/searchable_dropdown_component/searchable_dropdown_component.html.haml b/app/components/searchable_dropdown_component/searchable_dropdown_component.html.haml
new file mode 100644
index 00000000000..10043eaa299
--- /dev/null
+++ b/app/components/searchable_dropdown_component/searchable_dropdown_component.html.haml
@@ -0,0 +1 @@
+= f.select name, options_for_select(options, selected_option), { include_blank: }, class: classes, data:, 'aria-label': aria_label
diff --git a/app/controllers/admin/bulk_line_items_controller.rb b/app/controllers/admin/bulk_line_items_controller.rb
index 9537756a6c9..c1d966e545d 100644
--- a/app/controllers/admin/bulk_line_items_controller.rb
+++ b/app/controllers/admin/bulk_line_items_controller.rb
@@ -35,7 +35,7 @@ def update
order.with_lock do
if order.contents.update_item(@line_item, line_item_params)
# No Content, does not trigger ng resource auto-update
- render body: nil, status: :no_content
+ head :no_content
else
render json: { errors: @line_item.errors }, status: :precondition_failed
end
@@ -49,7 +49,7 @@ def destroy
authorize! :update, order
order.contents.remove(@line_item.variant)
- render body: nil, status: :no_content # No Content, does not trigger ng resource auto-update
+ head :no_content # No Content, does not trigger ng resource auto-update
end
private
diff --git a/app/controllers/admin/column_preferences_controller.rb b/app/controllers/admin/column_preferences_controller.rb
index fcf627f1b79..5403a9a5eef 100644
--- a/app/controllers/admin/column_preferences_controller.rb
+++ b/app/controllers/admin/column_preferences_controller.rb
@@ -4,17 +4,25 @@ module Admin
class ColumnPreferencesController < Admin::ResourceController
before_action :load_collection, only: [:bulk_update]
- respond_to :json
-
def bulk_update
@cp_set.collection.each { |cp| authorize! :bulk_update, cp }
- if @cp_set.save
- render json: @cp_set.collection, each_serializer: Api::Admin::ColumnPreferenceSerializer
- elsif @cp_set.errors.present?
- render json: { errors: @cp_set.errors }, status: :bad_request
- else
- render body: nil, status: :internal_server_error
+ respond_to do |format|
+ if @cp_set.save
+ format.json {
+ render json: @cp_set.collection, each_serializer: Api::Admin::ColumnPreferenceSerializer
+ }
+ format.turbo_stream {
+ flash.now[:success] = t('.success')
+ render :bulk_update, locals: { action: permitted_params[:action_name] }
+ }
+ else
+ format.json { render json: { errors: @cp_set.errors }, status: :bad_request }
+ format.turbo_stream {
+ flash.now[:error] = @cp_set.errors.full_messages.to_sentence
+ render :bulk_update, locals: { action: permitted_params[:action_name] }
+ }
+ end
end
end
@@ -28,11 +36,26 @@ def permitted_params
end
def load_collection
- collection_hash = Hash[permitted_params[:column_preferences].
- each_with_index.map { |cp, i| [i, cp] }]
- collection_hash.select!{ |_i, cp| cp[:action_name] == permitted_params[:action_name] }
- @cp_set = Sets::ColumnPreferenceSet.new(@column_preferences,
- collection_attributes: collection_hash)
+ collection_attributes = nil
+
+ respond_to do |format|
+ format.json do
+ collection_attributes = Hash[permitted_params[:column_preferences].
+ each_with_index.map { |cp, i| [i, cp] }]
+ collection_attributes.select!{ |_i, cp|
+ cp[:action_name] == permitted_params[:action_name]
+ }
+ end
+ format.all do
+ # Inject action name and user ID for each column_preference
+ collection_attributes = permitted_params[:column_preferences].to_h.each_value { |cp|
+ cp[:action_name] = permitted_params[:action_name]
+ cp[:user_id] = spree_current_user.id
+ }
+ end
+ end
+
+ @cp_set = Sets::ColumnPreferenceSet.new(@column_preferences, collection_attributes:)
end
def collection
diff --git a/app/controllers/admin/connected_apps_controller.rb b/app/controllers/admin/connected_apps_controller.rb
new file mode 100644
index 00000000000..2cbaca7c9bd
--- /dev/null
+++ b/app/controllers/admin/connected_apps_controller.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Admin
+ class ConnectedAppsController < ApplicationController
+ def create
+ authorize! :admin, enterprise
+
+ app = ConnectedApp.create!(enterprise_id: enterprise.id)
+
+ ConnectAppJob.perform_later(
+ app, spree_current_user.spree_api_key,
+ channel: SessionChannel.for_request(request),
+ )
+
+ render_panel
+ end
+
+ def destroy
+ authorize! :admin, enterprise
+
+ app = enterprise.connected_apps.first
+ app.destroy
+
+ WebhookDeliveryJob.perform_later(
+ app.data["destroy"],
+ "disconnect-app",
+ nil
+ )
+
+ render_panel
+ end
+
+ private
+
+ def enterprise
+ @enterprise ||= Enterprise.find(params.require(:enterprise_id))
+ end
+
+ def render_panel
+ redirect_to "#{edit_admin_enterprise_path(enterprise)}#/connected_apps_panel"
+ end
+ end
+end
diff --git a/app/controllers/admin/dfc_product_imports_controller.rb b/app/controllers/admin/dfc_product_imports_controller.rb
index 1b3f8dfb880..c1076ea775e 100644
--- a/app/controllers/admin/dfc_product_imports_controller.rb
+++ b/app/controllers/admin/dfc_product_imports_controller.rb
@@ -20,7 +20,7 @@ def index
catalog_url = params.require(:catalog_url)
- json_catalog = DfcRequest.new(spree_current_user).get(catalog_url)
+ json_catalog = fetch_catalog(catalog_url)
graph = DfcIo.import(json_catalog)
# * First step: import all products for given enterprise.
@@ -34,6 +34,16 @@ def index
private
+ def fetch_catalog(url)
+ if url =~ /food-data-collaboration/
+ fdc_json = FdcRequest.new(spree_current_user).call(url)
+ fdc_message = JSON.parse(fdc_json)
+ fdc_message["products"]
+ else
+ DfcRequest.new(spree_current_user).call(url)
+ end
+ end
+
# Most of this code is the same as in the DfcProvider::SuppliedProductsController.
def import_product(subject, enterprise)
return unless subject.is_a? DataFoodConsortium::Connector::SuppliedProduct
diff --git a/app/controllers/admin/products_v3_controller.rb b/app/controllers/admin/products_v3_controller.rb
index 667706aeba9..2954094d6d2 100644
--- a/app/controllers/admin/products_v3_controller.rb
+++ b/app/controllers/admin/products_v3_controller.rb
@@ -1,13 +1,16 @@
# frozen_string_literal: true
+# rubocop:disable Metrics/ClassLength
module Admin
class ProductsV3Controller < Spree::Admin::BaseController
+ helper ProductsHelper
+
before_action :init_filters_params
before_action :init_pagination_params
def index
fetch_products
- render "index", locals: { producers:, categories:, flash: }
+ render "index", locals: { producers:, categories:, tax_category_options:, flash: }
end
def bulk_update
@@ -24,7 +27,44 @@ def bulk_update
elsif product_set.errors.present?
@error_counts = { saved: product_set.saved_count, invalid: product_set.invalid.count }
- render "index", status: :unprocessable_entity, locals: { producers:, categories:, flash: }
+ render "index", status: :unprocessable_entity,
+ locals: { producers:, categories:, tax_category_options:, flash: }
+ end
+ end
+
+ def destroy
+ @record = ProductScopeQuery.new(
+ spree_current_user,
+ { id: params[:id] }
+ ).find_product
+
+ status = :ok
+ if @record.destroy
+ flash.now[:success] = t('.delete_product.success')
+ else
+ flash.now[:error] = t('.delete_product.error')
+ status = :internal_server_error
+ end
+
+ respond_with do |format|
+ format.turbo_stream { render :destroy_product_variant, status: }
+ end
+ end
+
+ def destroy_variant
+ @record = Spree::Variant.active.find(params[:id])
+ authorize! :delete, @record
+
+ status = :ok
+ if VariantDeleter.new.delete(@record)
+ flash.now[:success] = t('.delete_variant.success')
+ else
+ flash.now[:error] = t('.delete_variant.error')
+ status = :internal_server_error
+ end
+
+ respond_with do |format|
+ format.turbo_stream { render :destroy_product_variant, status: }
end
end
@@ -47,6 +87,7 @@ def init_pagination_params
# prority is given to element dataset (if present) over url params
@page = params[:page].presence || 1
@per_page = params[:per_page].presence || 15
+ @q = params.permit(q: {})[:q] || { s: 'name asc' }
end
def producers
@@ -59,6 +100,10 @@ def categories
Spree::Taxon.order(:name).map { |c| [c.name, c.id] }
end
+ def tax_category_options
+ Spree::TaxCategory.order(:name).pluck(:name, :id)
+ end
+
def fetch_products
product_query = OpenFoodNetwork::Permissions.new(spree_current_user)
.editable_products.merge(product_scope).ransack(ransack_query).result
@@ -84,6 +129,8 @@ def ransack_query
query.merge!(Spree::Variant::SEARCH_KEY => @search_term)
end
query.merge!(variants_primary_taxon_id_in: @category_id) if @category_id.present?
+ query.merge!(@q) if @q
+
query
end
@@ -137,3 +184,4 @@ def products_bulk_params
end
end
end
+# rubocop:enable Metrics/ClassLength
diff --git a/app/controllers/admin/resource_controller.rb b/app/controllers/admin/resource_controller.rb
index b47336f0d16..b15a576f408 100644
--- a/app/controllers/admin/resource_controller.rb
+++ b/app/controllers/admin/resource_controller.rb
@@ -146,7 +146,7 @@ def parent
return nil if parent_data.blank?
@parent ||= parent_data[:model_class].
- public_send("find_by", parent_data[:find_by] => params["#{model_name}_id"])
+ find_by(parent_data[:find_by] => params["#{model_name}_id"])
instance_variable_set("@#{model_name}", @parent)
end
diff --git a/app/controllers/admin/stripe_connect_settings_controller.rb b/app/controllers/admin/stripe_connect_settings_controller.rb
index 54128e6bb08..11a5a2dc698 100644
--- a/app/controllers/admin/stripe_connect_settings_controller.rb
+++ b/app/controllers/admin/stripe_connect_settings_controller.rb
@@ -37,7 +37,7 @@ def redirect_to_edit
def obfuscated_secret_key
key = Stripe.api_key
- key.first(8) + "****" + key.last(4)
+ "#{key.first(8)}****#{key.last(4)}"
end
def settings_params
diff --git a/app/controllers/admin/tag_rules_controller.rb b/app/controllers/admin/tag_rules_controller.rb
index fd00ea66be3..d7a749a3a79 100644
--- a/app/controllers/admin/tag_rules_controller.rb
+++ b/app/controllers/admin/tag_rules_controller.rb
@@ -5,7 +5,7 @@ class TagRulesController < Admin::ResourceController
respond_to :json
respond_override destroy: { json: {
- success: lambda { render body: nil, status: :no_content }
+ success: lambda { head :no_content }
} }
def map_by_tag
diff --git a/app/controllers/api/v0/enterprise_fees_controller.rb b/app/controllers/api/v0/enterprise_fees_controller.rb
index 45957672a7e..25b696349d9 100644
--- a/app/controllers/api/v0/enterprise_fees_controller.rb
+++ b/app/controllers/api/v0/enterprise_fees_controller.rb
@@ -9,7 +9,7 @@ def destroy
authorize! :destroy, enterprise_fee
if enterprise_fee.destroy
- render plain: I18n.t(:successfully_removed), status: :no_content
+ head :no_content
else
render plain: enterprise_fee.errors.full_messages.first, status: :forbidden
end
diff --git a/app/controllers/api/v0/products_controller.rb b/app/controllers/api/v0/products_controller.rb
index eead37ca494..a85b1986d95 100644
--- a/app/controllers/api/v0/products_controller.rb
+++ b/app/controllers/api/v0/products_controller.rb
@@ -42,8 +42,9 @@ def destroy
authorize! :delete, Spree::Product
@product = product_finder.find_product
authorize! :delete, @product
+ @product.destroyed_by = current_api_user
@product.destroy
- render json: @product, serializer: Api::Admin::ProductSerializer, status: :no_content
+ head :no_content
end
def bulk_products
diff --git a/app/controllers/api/v0/taxons_controller.rb b/app/controllers/api/v0/taxons_controller.rb
index c6b889af434..75e85f54351 100644
--- a/app/controllers/api/v0/taxons_controller.rb
+++ b/app/controllers/api/v0/taxons_controller.rb
@@ -55,7 +55,7 @@ def update
def destroy
authorize! :delete, Spree::Taxon
taxon.destroy
- render json: taxon, serializer: Api::TaxonSerializer, status: :no_content
+ head :no_content
end
private
diff --git a/app/controllers/api/v0/variants_controller.rb b/app/controllers/api/v0/variants_controller.rb
index bac05797107..33131f67371 100644
--- a/app/controllers/api/v0/variants_controller.rb
+++ b/app/controllers/api/v0/variants_controller.rb
@@ -44,7 +44,7 @@ def destroy
authorize! :delete, @variant
VariantDeleter.new.delete(@variant)
- render json: @variant, serializer: Api::VariantSerializer, status: :no_content
+ head :no_content
end
private
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index f0bc1c02550..c31e748a302 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -28,7 +28,6 @@ class ApplicationController < ActionController::Base
helper 'injection'
helper 'markdown'
helper 'footer_links'
- helper 'discourse'
helper 'checkout'
helper 'link'
helper 'terms_and_conditions'
@@ -61,7 +60,7 @@ def redirect_to(options = {}, response_status = {})
rescue StandardError
'unknown'
end}")
- super(options, response_status)
+ super
end
def set_checkout_redirect
diff --git a/app/controllers/discourse_sso_controller.rb b/app/controllers/discourse_sso_controller.rb
deleted file mode 100644
index 8ac609e9311..00000000000
--- a/app/controllers/discourse_sso_controller.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'discourse/single_sign_on'
-
-class DiscourseSsoController < ApplicationController
- include SharedHelper
- include DiscourseHelper
-
- before_action :require_config
-
- def login
- if require_activation?
- redirect_to discourse_url
- else
- redirect_to discourse_login_url
- end
- end
-
- def sso
- if spree_current_user
- begin
- redirect_to sso_url
- rescue TypeError
- render plain: "Bad SingleSignOn request.", status: :bad_request
- end
- else
- redirect_to login_path
- end
- end
-
- private
-
- def sso_url
- secret = discourse_sso_secret!
- sso = Discourse::SingleSignOn.parse(request.query_string, secret)
- sso.email = spree_current_user.email
- sso.username = spree_current_user.login
- sso.external_id = spree_current_user.id
- sso.sso_secret = secret
- sso.admin = admin_user?
- sso.require_activation = require_activation?
- sso.to_url(discourse_sso_url)
- end
-
- def require_config
- raise ActionController::RoutingError, 'Not Found' unless discourse_configured?
- end
-
- def require_activation?
- !admin_user? && !spree_current_user.confirmed?
- end
-end
diff --git a/app/controllers/spree/admin/images_controller.rb b/app/controllers/spree/admin/images_controller.rb
index 0e0890a229e..cb1ebe40ac1 100644
--- a/app/controllers/spree/admin/images_controller.rb
+++ b/app/controllers/spree/admin/images_controller.rb
@@ -3,6 +3,8 @@
module Spree
module Admin
class ImagesController < ::Admin::ResourceController
+ helper ::Admin::ProductsHelper
+
# This will make resource controller redirect correctly after deleting product images.
# This can be removed after upgrading to Spree 2.1.
# See here https://github.com/spree/spree/commit/334a011d2b8e16355e4ae77ae07cd93f7cbc8fd1
@@ -17,7 +19,10 @@ def index
def new
@url_filters = ::ProductFilters.new.extract(request.query_parameters)
- render layout: !request.xhr?
+ respond_with do |format|
+ format.turbo_stream { render :edit }
+ format.all { render layout: !request.xhr? }
+ end
end
def edit
@@ -32,13 +37,14 @@ def create
if @object.save
flash[:success] = flash_message_for(@object, :successfully_created)
- redirect_to location_after_save
+
+ respond_to do |format|
+ format.html { redirect_to location_after_save }
+ format.turbo_stream { render :update }
+ end
else
- respond_with(@object)
+ respond_with_error(@object.errors)
end
- rescue ActiveStorage::IntegrityError
- @object.errors.add :attachment, :integrity_error
- respond_with(@object)
end
def update
@@ -47,13 +53,14 @@ def update
if @object.update(permitted_resource_params)
flash[:success] = flash_message_for(@object, :successfully_updated)
- redirect_to location_after_save
+
+ respond_to do |format|
+ format.html { redirect_to location_after_save }
+ format.turbo_stream
+ end
else
- respond_with(@object)
+ respond_with_error(@object.errors)
end
- rescue ActiveStorage::IntegrityError
- @object.errors.add :attachment, :integrity_error
- respond_with(@object)
end
def destroy
@@ -103,6 +110,14 @@ def permitted_resource_params
:attachment, :viewable_id, :alt
)
end
+
+ def respond_with_error(errors)
+ @errors = errors.map(&:full_message)
+ respond_to do |format|
+ format.html { respond_with(@object) }
+ format.turbo_stream { render :edit }
+ end
+ end
end
end
end
diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb
index 8fa92475a3c..701652e0312 100644
--- a/app/controllers/spree/admin/invoices_controller.rb
+++ b/app/controllers/spree/admin/invoices_controller.rb
@@ -19,8 +19,13 @@ def show
def generate
@order = Order.find_by(number: params[:order_id])
- authorize! :invoice, @order
- ::Orders::GenerateInvoiceService.new(@order).generate_or_update_latest_invoice
+ if @order.distributor.can_invoice?
+ authorize! :invoice, @order
+ ::Orders::GenerateInvoiceService.new(@order).generate_or_update_latest_invoice
+ else
+ flash[:error] = t(:must_have_valid_business_number,
+ enterprise_name: @order.distributor.name)
+ end
redirect_back(fallback_location: spree.admin_dashboard_path)
end
diff --git a/app/helpers/admin/enterprises_helper.rb b/app/helpers/admin/enterprises_helper.rb
index e78029c7622..e9d337c7c08 100644
--- a/app/helpers/admin/enterprises_helper.rb
+++ b/app/helpers/admin/enterprises_helper.rb
@@ -14,6 +14,10 @@ def select_only_item(producers)
producers.size == 1 ? producers.first.id : nil
end
+ def managed_by_user?(enterprise)
+ enterprise.in?(spree_current_user.enterprises)
+ end
+
def enterprise_side_menu_items(enterprise)
is_shop = enterprise.sells != "none"
show_properties = !!enterprise.is_primary_producer
diff --git a/app/helpers/admin/orders_helper.rb b/app/helpers/admin/orders_helper.rb
index 4e82a417391..3ef8ef34a52 100644
--- a/app/helpers/admin/orders_helper.rb
+++ b/app/helpers/admin/orders_helper.rb
@@ -11,9 +11,25 @@ module OrdersHelper
def order_adjustments_for_display(order)
order.adjustments +
voucher_included_tax_representations(order) +
+ additional_tax_total_representation(order) +
order.all_adjustments.payment_fee.eligible
end
+ def additional_tax_total_representation(order)
+ adjustment = Spree::Adjustment.additional.tax.where(
+ order_id: order.id, adjustable_type: 'Spree::Adjustment'
+ ).sum(:amount)
+
+ return [] unless adjustment != 0
+
+ [
+ AdjustmentData.new(
+ I18n.t("admin.orders.edit.tax_on_fees"),
+ adjustment
+ )
+ ]
+ end
+
def voucher_included_tax_representations(order)
return [] unless VoucherAdjustmentsService.new(order).voucher_included_tax.negative?
diff --git a/app/helpers/admin/products_helper.rb b/app/helpers/admin/products_helper.rb
new file mode 100644
index 00000000000..e29b3783428
--- /dev/null
+++ b/app/helpers/admin/products_helper.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Admin
+ module ProductsHelper
+ def product_image_form_path(product)
+ if product.image.present?
+ edit_admin_product_image_path(product.id, product.image.id)
+ else
+ new_admin_product_image_path(product.id)
+ end
+ end
+ end
+end
diff --git a/app/helpers/bulk_form_builder.rb b/app/helpers/bulk_form_builder.rb
index dcb45ae3bc4..cd1da4e54eb 100644
--- a/app/helpers/bulk_form_builder.rb
+++ b/app/helpers/bulk_form_builder.rb
@@ -8,6 +8,6 @@ def text_field(field, **opts)
opts[:class] = "#{opts[:class]} changed".strip
end
- super(field, **opts)
+ super
end
end
diff --git a/app/helpers/discourse_helper.rb b/app/helpers/discourse_helper.rb
deleted file mode 100644
index 28b45209a20..00000000000
--- a/app/helpers/discourse_helper.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-module DiscourseHelper
- def discourse_configured?
- discourse_url.present?
- end
-
- def discourse_url
- ENV.fetch('DISCOURSE_URL', nil)
- end
-
- def discourse_login_url
- discourse_url + '/login'
- end
-
- def discourse_sso_url
- discourse_url + '/session/sso_login'
- end
-
- def discourse_url!
- discourse_url || raise('Missing Discourse URL')
- end
-
- def discourse_sso_secret!
- ENV['DISCOURSE_SSO_SECRET'] || raise('Missing SSO secret')
- end
-end
diff --git a/app/helpers/enterprises_helper.rb b/app/helpers/enterprises_helper.rb
index 4a7c6ae817d..367b69b690e 100644
--- a/app/helpers/enterprises_helper.rb
+++ b/app/helpers/enterprises_helper.rb
@@ -31,7 +31,7 @@ def editable_enterprises
def enterprises_options(enterprises)
enterprises.map { |enterprise|
- [enterprise.name + ": " + enterprise.address.address1 + ", " + enterprise.address.city,
+ ["#{enterprise.name}: #{enterprise.address.address1}, #{enterprise.address.city}",
enterprise.id.to_i]
}
end
diff --git a/app/helpers/map_helper.rb b/app/helpers/map_helper.rb
index bc3b66c49cb..5952187077d 100644
--- a/app/helpers/map_helper.rb
+++ b/app/helpers/map_helper.rb
@@ -2,7 +2,9 @@
module MapHelper
def using_google_maps?
- ENV["GOOGLE_MAPS_API_KEY"].present? || google_maps_configured_with_geocoder_api_key?
+ !ContentConfig.open_street_map_enabled && (
+ ENV["GOOGLE_MAPS_API_KEY"].present? || google_maps_configured_with_geocoder_api_key?
+ )
end
private
diff --git a/app/helpers/spree/admin/base_helper.rb b/app/helpers/spree/admin/base_helper.rb
index 4d46a8e297e..badeb0783de 100644
--- a/app/helpers/spree/admin/base_helper.rb
+++ b/app/helpers/spree/admin/base_helper.rb
@@ -108,7 +108,7 @@ def preference_fields(object, form)
object.preferences.keys.map { |key|
preference_label = form.label("preferred_#{key}",
- Spree.t(key.to_s.gsub("_from_list", "")) + ": ")
+ "#{Spree.t(key.to_s.gsub('_from_list', ''))}: ")
preference_field = preference_field_for(
form,
"preferred_#{key}",
@@ -120,7 +120,7 @@ def preference_fields(object, form)
def link_to_add_fields(name, target, options = {})
name = '' if options[:no_text]
- css_classes = options[:class] ? options[:class] + " spree_add_fields" : "spree_add_fields"
+ css_classes = options[:class] ? "#{options[:class]} spree_add_fields" : "spree_add_fields"
link_to_with_icon('icon-plus',
name,
'javascript:',
diff --git a/app/helpers/spree/admin/orders_helper.rb b/app/helpers/spree/admin/orders_helper.rb
index 71970c53d38..fc4f21baa82 100644
--- a/app/helpers/spree/admin/orders_helper.rb
+++ b/app/helpers/spree/admin/orders_helper.rb
@@ -34,6 +34,10 @@ def order_links(order)
links
end
+ def order_shipment_ready?(order)
+ order.ready_to_ship?
+ end
+
private
def complete_order_links(order)
diff --git a/app/jobs/connect_app_job.rb b/app/jobs/connect_app_job.rb
index 43d273f1551..2474343a292 100644
--- a/app/jobs/connect_app_job.rb
+++ b/app/jobs/connect_app_job.rb
@@ -17,7 +17,7 @@ def perform(app, token, channel: nil)
return unless channel
- selector = "#edit_enterprise_#{enterprise.id} #connected-app-discover-regen"
+ selector = "#connected-app-discover-regen.enterprise_#{enterprise.id}"
html = ApplicationController.render(
partial: "admin/enterprises/form/connected_apps",
locals: { enterprise: },
diff --git a/app/mailers/spree/user_mailer.rb b/app/mailers/spree/user_mailer.rb
index 02e24194bcd..3797fcd9b42 100644
--- a/app/mailers/spree/user_mailer.rb
+++ b/app/mailers/spree/user_mailer.rb
@@ -25,7 +25,7 @@ def signup_confirmation(user)
@user = user
I18n.with_locale valid_locale(@user) do
mail(to: user.email,
- subject: t(:welcome_to) + ' ' + Spree::Config[:site_name])
+ subject: "#{t(:welcome_to)} #{Spree::Config[:site_name]}")
end
end
diff --git a/app/models/concerns/file_preferences.rb b/app/models/concerns/file_preferences.rb
index 68682b3263a..00dedce4961 100644
--- a/app/models/concerns/file_preferences.rb
+++ b/app/models/concerns/file_preferences.rb
@@ -22,7 +22,7 @@ def preference_type(key)
if has_preference?("#{key}_blob_id")
:file
else
- super(key)
+ super
end
end
diff --git a/app/models/concerns/log_destroy_performer.rb b/app/models/concerns/log_destroy_performer.rb
new file mode 100644
index 00000000000..d53d8ce3bdd
--- /dev/null
+++ b/app/models/concerns/log_destroy_performer.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'active_support/concern'
+
+module LogDestroyPerformer
+ extend ActiveSupport::Concern
+ included do
+ attr_accessor :destroyed_by
+
+ after_destroy :log_who_destroyed
+
+ def log_who_destroyed
+ return if destroyed_by.nil?
+
+ Rails.logger.info "#{self.class} #{id} deleted by #{destroyed_by.id}"
+ end
+ end
+end
diff --git a/app/models/enterprise.rb b/app/models/enterprise.rb
index 22a18473a9f..5a1ec12d23c 100644
--- a/app/models/enterprise.rb
+++ b/app/models/enterprise.rb
@@ -43,25 +43,31 @@ class Enterprise < ApplicationRecord
foreign_key: 'supplier_id',
dependent: :destroy
has_many :supplied_variants, through: :supplied_products, source: :variants
- has_many :distributed_orders, class_name: 'Spree::Order', foreign_key: 'distributor_id'
+ has_many :distributed_orders, class_name: 'Spree::Order',
+ foreign_key: 'distributor_id',
+ dependent: :restrict_with_exception
belongs_to :address, class_name: 'Spree::Address'
belongs_to :business_address, optional: true, class_name: 'Spree::Address', dependent: :destroy
- has_many :enterprise_fees
+ has_many :enterprise_fees, dependent: :restrict_with_exception
has_many :enterprise_roles, dependent: :destroy
has_many :users, through: :enterprise_roles
belongs_to :owner, class_name: 'Spree::User',
inverse_of: :owned_enterprises
has_many :distributor_payment_methods,
- inverse_of: :distributor, foreign_key: :distributor_id
+ inverse_of: :distributor,
+ foreign_key: :distributor_id,
+ dependent: :restrict_with_exception
has_many :distributor_shipping_methods,
- inverse_of: :distributor, foreign_key: :distributor_id
+ inverse_of: :distributor,
+ foreign_key: :distributor_id,
+ dependent: :restrict_with_exception
has_many :payment_methods, through: :distributor_payment_methods
has_many :shipping_methods, through: :distributor_shipping_methods
has_many :customers, dependent: :destroy
has_many :inventory_items, dependent: :destroy
has_many :tag_rules, dependent: :destroy
has_one :stripe_account, dependent: :destroy
- has_many :vouchers
+ has_many :vouchers, dependent: :restrict_with_exception
has_many :connected_apps, dependent: :destroy
has_one :custom_tab, dependent: :destroy
@@ -128,6 +134,7 @@ class Enterprise < ApplicationRecord
after_create :set_default_contact
after_create :relate_to_owners_enterprises
+
after_rollback :restore_permalink
after_touch :touch_distributors
after_create_commit :send_welcome_email
@@ -240,6 +247,16 @@ def self.distinct_count
count(distinct: true)
end
+ # Remove any unsupported HTML.
+ def long_description
+ HtmlSanitizer.sanitize(super)
+ end
+
+ # Remove any unsupported HTML.
+ def long_description=(html)
+ super(HtmlSanitizer.sanitize(html))
+ end
+
def contact
contact = users.where(enterprise_roles: { receives_notifications: true }).first
contact || owner
@@ -359,7 +376,7 @@ def is_hub
def category
# Make this crazy logic human readable so we can argue about it sanely.
cat = is_primary_producer ? "producer_" : "non_producer_"
- cat << ("sells_" + sells)
+ cat << ("sells_#{sells}")
# Map backend cases to front end cases.
case cat
@@ -493,7 +510,7 @@ def strip_url(url)
end
def correct_whatsapp_url(phone_number)
- phone_number && ("https://wa.me/" + phone_number.tr('+ ', ''))
+ phone_number && "https://wa.me/#{phone_number.tr('+ ', '')}"
end
def correct_instagram_url(url)
diff --git a/app/models/enterprise_fee.rb b/app/models/enterprise_fee.rb
index a4bcdd272d2..16f61a3cd32 100644
--- a/app/models/enterprise_fee.rb
+++ b/app/models/enterprise_fee.rb
@@ -21,7 +21,6 @@ class EnterpriseFee < ApplicationRecord
validates :fee_type, inclusion: { in: FEE_TYPES }
validates :name, presence: true
- validates :enterprise_id, presence: true
before_save :ensure_valid_tax_category_settings
diff --git a/app/models/enterprise_group.rb b/app/models/enterprise_group.rb
index c6160fb404b..47a0ef43030 100644
--- a/app/models/enterprise_group.rb
+++ b/app/models/enterprise_group.rb
@@ -74,6 +74,16 @@ def to_param
permalink
end
+ # Remove any unsupported HTML.
+ def long_description
+ HtmlSanitizer.sanitize(super)
+ end
+
+ # Remove any unsupported HTML.
+ def long_description=(html)
+ super(HtmlSanitizer.sanitize(html))
+ end
+
private
def sanitize_permalink
diff --git a/app/models/exchange.rb b/app/models/exchange.rb
index 796a251ed1a..32aa3237abc 100644
--- a/app/models/exchange.rb
+++ b/app/models/exchange.rb
@@ -10,8 +10,6 @@
# shopfront (outgoing products). But the set of shown products can be smaller
# than all incoming products.
class Exchange < ApplicationRecord
- self.belongs_to_required_by_default = false
-
acts_as_taggable
belongs_to :order_cycle
@@ -24,7 +22,6 @@ class Exchange < ApplicationRecord
has_many :exchange_fees, dependent: :destroy
has_many :enterprise_fees, through: :exchange_fees
- validates :order_cycle, :sender, :receiver, presence: true
validates :sender_id, uniqueness: { scope: [:order_cycle_id, :receiver_id, :incoming] }
before_destroy :delete_related_exchange_variants, prepend: true
diff --git a/app/models/inventory_item.rb b/app/models/inventory_item.rb
index d013ea52f23..8d90a4271f0 100644
--- a/app/models/inventory_item.rb
+++ b/app/models/inventory_item.rb
@@ -1,14 +1,10 @@
# frozen_string_literal: true
class InventoryItem < ApplicationRecord
- self.belongs_to_required_by_default = false
-
belongs_to :enterprise
belongs_to :variant, class_name: "Spree::Variant"
validates :variant_id, uniqueness: { scope: :enterprise_id }
- validates :enterprise, presence: true
- validates :variant, presence: true
validates :visible,
inclusion: { in: [true, false], message: I18n.t(:inventory_item_visibility_error) }
diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb
index e6b0d1dff1a..060f75e4f06 100644
--- a/app/models/order_cycle.rb
+++ b/app/models/order_cycle.rb
@@ -3,8 +3,6 @@
require 'open_food_network/scope_variant_to_hub'
class OrderCycle < ApplicationRecord
- self.belongs_to_required_by_default = false
-
searchable_attributes :orders_open_at, :orders_close_at, :coordinator_id
searchable_scopes :active, :inactive, :active_or_complete, :upcoming, :closed, :not_closed,
:dated, :undated, :soonest_opening, :soonest_closing, :most_recently_closed
@@ -44,7 +42,7 @@ class OrderCycle < ApplicationRecord
before_update :reset_processed_at, if: :will_save_change_to_orders_close_at?
after_save :sync_subscriptions, if: :opening?
- validates :name, :coordinator_id, presence: true
+ validates :name, presence: true
validate :orders_close_at_after_orders_open_at?
preference :product_selection_from_coordinator_inventory_only, :boolean, default: false
@@ -255,7 +253,7 @@ def receival_instructions_for(supplier)
end
def pickup_time_for(distributor)
- exchange_for_distributor(distributor)&.pickup_time || distributor.next_collection_at
+ exchange_for_distributor(distributor)&.pickup_time
end
def pickup_instructions_for(distributor)
diff --git a/app/models/spree/ability.rb b/app/models/spree/ability.rb
index 037bfecdb6b..381d0b8502c 100644
--- a/app/models/spree/ability.rb
+++ b/app/models/spree/ability.rb
@@ -192,7 +192,7 @@ def add_product_management_abilities(user)
OpenFoodNetwork::Permissions.new(user).managed_product_enterprises.include? product.supplier
end
- can [:admin, :index], :products_v3
+ can [:admin, :index, :bulk_update, :destroy, :destroy_variant], :products_v3
can [:create], Spree::Variant
can [:admin, :index, :read, :edit,
diff --git a/app/models/spree/address.rb b/app/models/spree/address.rb
index 59363374f1a..9d7cac881f1 100644
--- a/app/models/spree/address.rb
+++ b/app/models/spree/address.rb
@@ -4,19 +4,17 @@ module Spree
class Address < ApplicationRecord
include AddressDisplay
- self.belongs_to_required_by_default = false
-
searchable_attributes :firstname, :lastname, :phone, :full_name, :full_name_reversed,
:full_name_with_comma, :full_name_with_comma_reversed
searchable_associations :country, :state
belongs_to :country, class_name: "Spree::Country"
- belongs_to :state, class_name: "Spree::State"
+ belongs_to :state, class_name: "Spree::State", optional: true
has_one :enterprise, dependent: :restrict_with_exception
- has_many :shipments
+ has_many :shipments, dependent: :restrict_with_exception
- validates :address1, :city, :country, :phone, presence: true
+ validates :address1, :city, :phone, presence: true
validates :company, presence: true, unless: -> { first_name.blank? || last_name.blank? }
validates :firstname, :lastname, presence: true, if: -> do
company.blank? || company == 'unused'
diff --git a/app/models/spree/credit_card.rb b/app/models/spree/credit_card.rb
index 35a43ee8283..74e40596a03 100644
--- a/app/models/spree/credit_card.rb
+++ b/app/models/spree/credit_card.rb
@@ -30,7 +30,7 @@ class CreditCard < ApplicationRecord
def expiry=(expiry)
self[:month], self[:year] = expiry.split(" / ")
- self[:year] = "20" + self[:year]
+ self[:year] = "20#{self[:year]}"
end
def number=(num)
diff --git a/app/models/spree/line_item.rb b/app/models/spree/line_item.rb
index 74d3acdc7e1..eed6741b310 100644
--- a/app/models/spree/line_item.rb
+++ b/app/models/spree/line_item.rb
@@ -7,8 +7,6 @@ class LineItem < ApplicationRecord
include VariantUnits::VariantAndLineItemNaming
include LineItemStockChanges
- self.belongs_to_required_by_default = false
-
searchable_attributes :price, :quantity, :order_id, :variant_id, :tax_category_id
searchable_associations :order, :order_cycle, :variant, :product, :supplier, :tax_category
searchable_scopes :with_tax, :without_tax
@@ -19,7 +17,7 @@ class LineItem < ApplicationRecord
belongs_to :variant, -> { with_deleted }, class_name: "Spree::Variant"
has_one :product, through: :variant
has_one :supplier, through: :product
- belongs_to :tax_category, class_name: "Spree::TaxCategory"
+ belongs_to :tax_category, class_name: "Spree::TaxCategory", optional: true
has_many :adjustments, as: :adjustable, dependent: :destroy
@@ -28,7 +26,6 @@ class LineItem < ApplicationRecord
before_validation :copy_tax_category
before_validation :copy_dimensions
- validates :variant, presence: true
validates :quantity, numericality: {
only_integer: true,
greater_than: -1,
diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb
index 03fdf5208cc..e8974272c4a 100644
--- a/app/models/spree/order.rb
+++ b/app/models/spree/order.rb
@@ -8,8 +8,6 @@ class Order < ApplicationRecord
include Balance
include SetUnusedAddressFields
- self.belongs_to_required_by_default = false
-
searchable_attributes :number, :state, :shipment_state, :payment_state, :distributor_id,
:order_cycle_id, :email, :total, :customer_id
searchable_associations :shipping_method, :bill_address, :distributor
@@ -33,13 +31,13 @@ class Order < ApplicationRecord
token_resource
- belongs_to :user, class_name: "Spree::User"
- belongs_to :created_by, class_name: "Spree::User"
+ belongs_to :user, class_name: "Spree::User", optional: true
+ belongs_to :created_by, class_name: "Spree::User", optional: true
- belongs_to :bill_address, class_name: 'Spree::Address'
+ belongs_to :bill_address, class_name: 'Spree::Address', optional: true
alias_attribute :billing_address, :bill_address
- belongs_to :ship_address, class_name: 'Spree::Address'
+ belongs_to :ship_address, class_name: 'Spree::Address', optional: true
alias_attribute :shipping_address, :ship_address
has_many :state_changes, as: :stateful, dependent: :destroy
@@ -70,9 +68,9 @@ def states
dependent: :destroy
has_many :invoices, dependent: :restrict_with_exception
- belongs_to :order_cycle
- belongs_to :distributor, class_name: 'Enterprise'
- belongs_to :customer
+ belongs_to :order_cycle, optional: true
+ belongs_to :distributor, class_name: 'Enterprise', optional: true
+ belongs_to :customer, optional: true
has_one :proxy_order, dependent: :destroy
has_one :subscription, through: :proxy_order
diff --git a/app/models/spree/payment.rb b/app/models/spree/payment.rb
index 6479694df9c..e10920d4b84 100644
--- a/app/models/spree/payment.rb
+++ b/app/models/spree/payment.rb
@@ -155,6 +155,7 @@ def ensure_correct_adjustment
if adjustment
adjustment.originator = payment_method
adjustment.label = adjustment_label
+ adjustment.amount = payment_method.compute_amount(self)
adjustment.save
elsif !processing_refund? && payment_method.present?
payment_method.create_adjustment(adjustment_label, self, true)
diff --git a/app/models/spree/payment_method.rb b/app/models/spree/payment_method.rb
index a7295710665..b66d8d239be 100644
--- a/app/models/spree/payment_method.rb
+++ b/app/models/spree/payment_method.rb
@@ -118,7 +118,7 @@ def has_distributor?(distributor)
end
def self.clean_name
- i18n_key = "spree.admin.payment_methods.providers." + name.demodulize.downcase
+ i18n_key = "spree.admin.payment_methods.providers.#{name.demodulize.downcase}"
I18n.t(i18n_key)
end
diff --git a/app/models/spree/payment_method/check.rb b/app/models/spree/payment_method/check.rb
index 9f4378830c0..839698bebcf 100644
--- a/app/models/spree/payment_method/check.rb
+++ b/app/models/spree/payment_method/check.rb
@@ -25,6 +25,10 @@ def void(*_args)
ActiveMerchant::Billing::Response.new(true, "", {}, {})
end
+ def payment_source_class
+ nil
+ end
+
def source_required?
false
end
diff --git a/app/models/spree/price.rb b/app/models/spree/price.rb
index 668f53b6b91..0c2d12c285f 100644
--- a/app/models/spree/price.rb
+++ b/app/models/spree/price.rb
@@ -24,10 +24,6 @@ def price
amount
end
- def price_changed?
- amount_changed?
- end
-
def price=(price)
self[:amount] = parse_price(price)
end
diff --git a/app/models/spree/product.rb b/app/models/spree/product.rb
index 4fd670f90e5..1f79ebf95c8 100755
--- a/app/models/spree/product.rb
+++ b/app/models/spree/product.rb
@@ -23,6 +23,7 @@
module Spree
class Product < ApplicationRecord
include ProductStock
+ include LogDestroyPerformer
self.belongs_to_required_by_default = false
@@ -303,6 +304,16 @@ def variant_unit_with_scale=(variant_unit_with_scale)
)
end
+ # Remove any unsupported HTML.
+ def description
+ HtmlSanitizer.sanitize(super)
+ end
+
+ # Remove any unsupported HTML.
+ def description=(html)
+ super(HtmlSanitizer.sanitize(html))
+ end
+
private
def update_units
diff --git a/app/models/spree/product_property.rb b/app/models/spree/product_property.rb
index 653c4464644..64736a4c398 100644
--- a/app/models/spree/product_property.rb
+++ b/app/models/spree/product_property.rb
@@ -2,12 +2,9 @@
module Spree
class ProductProperty < ApplicationRecord
- self.belongs_to_required_by_default = false
-
belongs_to :product, class_name: "Spree::Product", touch: true
belongs_to :property, class_name: 'Spree::Property'
- validates :property, presence: true
validates :value, length: { maximum: 255 }
default_scope -> { order("#{table_name}.position") }
diff --git a/app/models/spree/return_authorization.rb b/app/models/spree/return_authorization.rb
index 1b18b9ea4fa..9d7a7dea2d3 100644
--- a/app/models/spree/return_authorization.rb
+++ b/app/models/spree/return_authorization.rb
@@ -2,8 +2,6 @@
module Spree
class ReturnAuthorization < ApplicationRecord
- self.belongs_to_required_by_default = false
-
acts_as_paranoid
belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations
@@ -13,7 +11,6 @@ class ReturnAuthorization < ApplicationRecord
before_save :force_positive_amount
before_create :generate_number
- validates :order, presence: true
validates :amount, numericality: true
validate :must_have_shipped_units
diff --git a/app/models/spree/state.rb b/app/models/spree/state.rb
index cbbd159a557..1d310636daa 100644
--- a/app/models/spree/state.rb
+++ b/app/models/spree/state.rb
@@ -2,11 +2,9 @@
module Spree
class State < ApplicationRecord
- self.belongs_to_required_by_default = false
-
belongs_to :country, class_name: 'Spree::Country'
- validates :country, :name, presence: true
+ validates :name, presence: true
def self.find_all_by_name_or_abbr(name_or_abbr)
where('name = ? OR abbr = ?', name_or_abbr, name_or_abbr)
diff --git a/app/models/spree/stock_item.rb b/app/models/spree/stock_item.rb
index 192a154b3de..a89a44975e6 100644
--- a/app/models/spree/stock_item.rb
+++ b/app/models/spree/stock_item.rb
@@ -2,15 +2,12 @@
module Spree
class StockItem < ApplicationRecord
- self.belongs_to_required_by_default = false
-
acts_as_paranoid
belongs_to :stock_location, class_name: 'Spree::StockLocation', inverse_of: :stock_items
belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant'
- has_many :stock_movements
+ 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? }
diff --git a/app/models/spree/stock_movement.rb b/app/models/spree/stock_movement.rb
index 1cf432df5cb..4de0dea3a0f 100644
--- a/app/models/spree/stock_movement.rb
+++ b/app/models/spree/stock_movement.rb
@@ -2,22 +2,15 @@
module Spree
class StockMovement < ApplicationRecord
- self.belongs_to_required_by_default = false
-
belongs_to :stock_item, class_name: 'Spree::StockItem'
- belongs_to :originator, polymorphic: true
+ belongs_to :originator, polymorphic: true, optional: true
after_create :update_stock_item_quantity
- validates :stock_item, presence: true
validates :quantity, presence: true
scope :recent, -> { order('created_at DESC') }
- def readonly?
- !new_record?
- end
-
private
def update_stock_item_quantity
diff --git a/app/models/spree/tax_rate.rb b/app/models/spree/tax_rate.rb
index 62dade25b18..af8d82f12d0 100644
--- a/app/models/spree/tax_rate.rb
+++ b/app/models/spree/tax_rate.rb
@@ -14,17 +14,14 @@ def validate(record)
module Spree
class TaxRate < ApplicationRecord
- self.belongs_to_required_by_default = false
-
acts_as_paranoid
include CalculatedAdjustments
- belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates
+ belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates, optional: true
belongs_to :tax_category, class_name: "Spree::TaxCategory", inverse_of: :tax_rates
- has_many :adjustments, as: :originator
+ has_many :adjustments, as: :originator, dependent: nil
validates :amount, presence: true, numericality: true
- validates :tax_category, presence: true
validates_with DefaultTaxZoneValidator
scope :by_zone, ->(zone) { where(zone_id: zone) }
diff --git a/app/models/spree/variant.rb b/app/models/spree/variant.rb
index c5f93e0de9e..18b7cb0d244 100644
--- a/app/models/spree/variant.rb
+++ b/app/models/spree/variant.rb
@@ -32,8 +32,8 @@ class Variant < ApplicationRecord
delegate :name, :name=, :description, :description=, :meta_keywords, to: :product
- has_many :inventory_units, inverse_of: :variant
- has_many :line_items, inverse_of: :variant
+ has_many :inventory_units, inverse_of: :variant, dependent: nil
+ has_many :line_items, inverse_of: :variant, dependent: nil
has_many :stock_items, dependent: :destroy, inverse_of: :variant
has_many :stock_locations, through: :stock_items
@@ -49,11 +49,11 @@ class Variant < ApplicationRecord
has_many :prices,
class_name: 'Spree::Price',
dependent: :destroy
- delegate :display_price, :display_amount, :price, :price_changed?, :price=,
+ delegate :display_price, :display_amount, :price, :price=,
:currency, :currency=,
to: :find_or_build_default_price
- has_many :exchange_variants
+ has_many :exchange_variants, dependent: nil
has_many :exchanges, through: :exchange_variants
has_many :variant_overrides, dependent: :destroy
has_many :inventory_items, dependent: :destroy
@@ -199,6 +199,11 @@ def amount_in(currency)
price_in(currency).try(:amount)
end
+ def changed?
+ # We consider the variant changed if associated price is changed (it is saved after_save)
+ super || default_price.changed?
+ end
+
# can_supply? is implemented in VariantStock
def in_stock?(quantity = 1)
can_supply?(quantity)
diff --git a/app/models/subscription_line_item.rb b/app/models/subscription_line_item.rb
index a4a0b1ede59..20a98d7ceb9 100644
--- a/app/models/subscription_line_item.rb
+++ b/app/models/subscription_line_item.rb
@@ -1,13 +1,9 @@
# frozen_string_literal: true
class SubscriptionLineItem < ApplicationRecord
- self.belongs_to_required_by_default = false
-
belongs_to :subscription, inverse_of: :subscription_line_items
belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant'
- validates :subscription, presence: true
- validates :variant, presence: true
validates :quantity, presence: true, numericality: { only_integer: true }
default_scope { order('id ASC') }
diff --git a/app/models/tag_rule.rb b/app/models/tag_rule.rb
index cdff7315b04..a6b5ae4bb6f 100644
--- a/app/models/tag_rule.rb
+++ b/app/models/tag_rule.rb
@@ -1,14 +1,10 @@
# frozen_string_literal: true
class TagRule < ApplicationRecord
- self.belongs_to_required_by_default = false
-
belongs_to :enterprise
preference :customer_tags, :string, default: ""
- validates :enterprise, presence: true
-
scope :for, ->(enterprise) { where(enterprise_id: enterprise) }
scope :prioritised, -> { order('priority ASC') }
diff --git a/app/models/variant_override.rb b/app/models/variant_override.rb
index af0dbd92fbc..ea5dca61b27 100644
--- a/app/models/variant_override.rb
+++ b/app/models/variant_override.rb
@@ -6,15 +6,11 @@ class VariantOverride < ApplicationRecord
extend Spree::LocalizedNumber
include StockSettingsOverrideValidation
- self.belongs_to_required_by_default = false
-
acts_as_taggable
belongs_to :hub, class_name: 'Enterprise'
belongs_to :variant, class_name: 'Spree::Variant'
- validates :hub, presence: true
- validates :variant, presence: true
# Default stock can be nil, indicating stock should not be reset or zero, meaning reset to zero.
# Need to ensure this can be set by the user.
validates :default_stock, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true
diff --git a/app/reflexes/admin/connected_app_reflex.rb b/app/reflexes/admin/connected_app_reflex.rb
deleted file mode 100644
index ecfb974d969..00000000000
--- a/app/reflexes/admin/connected_app_reflex.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-module Admin
- class ConnectedAppReflex < ApplicationReflex
- def create
- authorize! :admin, enterprise
-
- app = ConnectedApp.create!(enterprise_id: enterprise.id)
-
- # Avoid race condition by sending before enqueuing job:
- broadcast_partial
-
- ConnectAppJob.perform_later(
- app, current_user.spree_api_key,
- channel: SessionChannel.for_request(request),
- )
- morph :nothing
- end
-
- def destroy
- authorize! :admin, enterprise
-
- app = enterprise.connected_apps.first
- app.destroy
-
- broadcast_partial
-
- WebhookDeliveryJob.perform_later(
- app.data["destroy"],
- "disconnect-app",
- nil
- )
- morph :nothing
- end
-
- private
-
- def enterprise
- @enterprise ||= Enterprise.find(element.dataset.enterprise_id)
- end
-
- def broadcast_partial
- selector = "#edit_enterprise_#{enterprise.id} #connected-app-discover-regen"
- html = ApplicationController.render(
- partial: "admin/enterprises/form/connected_apps",
- locals: { enterprise: },
- )
-
- # Avoid race condition by sending before enqueuing job:
- cable_ready.morph(selector:, html:).broadcast
- end
- end
-end
diff --git a/app/reflexes/admin/orders_reflex.rb b/app/reflexes/admin/orders_reflex.rb
index b52136391e0..dedf46cdf28 100644
--- a/app/reflexes/admin/orders_reflex.rb
+++ b/app/reflexes/admin/orders_reflex.rb
@@ -21,7 +21,8 @@ def capture
def ship
@order.send_shipment_email = false unless params[:send_shipment_email]
if @order.ship
- return set_param_for_controller if request.url.match?('edit')
+ paths = %w[edit customer payments adjustments invoices return_authorizations].freeze
+ return set_param_for_controller if Regexp.union(paths).match? request.url
morph dom_id(@order), render(partial: "spree/admin/orders/table_row",
locals: { order: @order.reload, success: true })
diff --git a/app/reflexes/products_reflex.rb b/app/reflexes/products_reflex.rb
index 9cad290331d..a2feef4d281 100644
--- a/app/reflexes/products_reflex.rb
+++ b/app/reflexes/products_reflex.rb
@@ -21,46 +21,6 @@ def clear_search
fetch_and_render_products_with_flash
end
- def delete_product
- id = current_id_from_element(element)
- product = product_finder(id).find_product
- authorize! :delete, product
-
- if product.destroy
- flash[:success] = I18n.t('admin.products_v3.delete_product.success')
- else
- flash[:error] = I18n.t('admin.products_v3.delete_product.error')
- end
-
- fetch_and_render_products_with_flash
- end
-
- def delete_variant
- id = current_id_from_element(element)
- variant = Spree::Variant.active.find(id)
- authorize! :delete, variant
-
- if VariantDeleter.new.delete(variant)
- flash[:success] = I18n.t('admin.products_v3.delete_variant.success')
- else
- flash[:error] = I18n.t('admin.products_v3.delete_variant.error')
- end
-
- fetch_and_render_products_with_flash
- end
-
- def edit_image
- id = current_id_from_element(element)
- product = product_finder(id).find_product
- image = product.image
-
- image = Spree::Image.new(viewable: product) if product.image.blank?
-
- morph "#modal-component",
- render(partial: "admin/products_v3/edit_image",
- locals: { product:, image:, return_url: url })
- end
-
private
def init_filters_params
@@ -89,8 +49,8 @@ def render_products
html: render(partial: "admin/products_v3/content",
locals: { products: @products, pagy: @pagy, search_term: @search_term,
producer_options: producers, producer_id: @producer_id,
- category_options: categories, category_id: @category_id,
- flashes: flash })
+ category_options: categories, tax_category_options:,
+ category_id: @category_id, flashes: flash })
)
cable_ready.replace_state(
@@ -125,6 +85,10 @@ def categories
Spree::Taxon.order(:name).map { |c| [c.name, c.id] }
end
+ def tax_category_options
+ Spree::TaxCategory.order(:name).pluck(:name, :id)
+ end
+
def fetch_products
product_query = OpenFoodNetwork::Permissions.new(current_user)
.editable_products.merge(product_scope).ransack(ransack_query).result(distinct: true)
@@ -210,12 +174,4 @@ def products_bulk_params
params.permit(products: ::PermittedAttributes::Product.attributes)
.to_h.with_indifferent_access
end
-
- def product_finder(id)
- ProductScopeQuery.new(current_user, { id: })
- end
-
- def current_id_from_element(element)
- element.dataset.current_id
- end
end
diff --git a/app/serializers/api/cached_enterprise_serializer.rb b/app/serializers/api/cached_enterprise_serializer.rb
index bef58f0c77a..d9e08a01559 100644
--- a/app/serializers/api/cached_enterprise_serializer.rb
+++ b/app/serializers/api/cached_enterprise_serializer.rb
@@ -131,7 +131,7 @@ def icon
producer_shop: "map_003-producer-shop.svg",
producer: "map_001-producer-only.svg",
}
- "/map_icons/" + (icons[enterprise.category] || "map_001-producer-only.svg")
+ "/map_icons/#{icons[enterprise.category] || 'map_001-producer-only.svg'}"
end
# Choose regular icon font for enterprises.
diff --git a/app/serializers/api/enterprise_shopfront_list_serializer.rb b/app/serializers/api/enterprise_shopfront_list_serializer.rb
index 8cd95c1547a..6d99d3de57c 100644
--- a/app/serializers/api/enterprise_shopfront_list_serializer.rb
+++ b/app/serializers/api/enterprise_shopfront_list_serializer.rb
@@ -21,7 +21,7 @@ def icon
producer_shop: "map_003-producer-shop.svg",
producer: "map_001-producer-only.svg",
}
- "/map_icons/" + (icons[enterprise.category] || "map_001-producer-only.svg")
+ "/map_icons/#{icons[enterprise.category] || 'map_001-producer-only.svg'}"
end
def icon_font
diff --git a/app/services/embedded_page_service.rb b/app/services/embedded_page_service.rb
index 1d4f3443841..52fc4b98c4e 100644
--- a/app/services/embedded_page_service.rb
+++ b/app/services/embedded_page_service.rb
@@ -59,7 +59,7 @@ def set_embedding_domain
def set_logout_redirect
return unless enterprise_slug
- @session[:shopfront_redirect] = '/' + enterprise_slug + '/shop?embedded_shopfront=true'
+ @session[:shopfront_redirect] = "/#{enterprise_slug}/shop?embedded_shopfront=true"
end
def enterprise_slug
diff --git a/app/services/html_sanitizer.rb b/app/services/html_sanitizer.rb
new file mode 100644
index 00000000000..84d78f6f5cd
--- /dev/null
+++ b/app/services/html_sanitizer.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+# Keeps only allowed HTML.
+#
+# We store some rich text as HTML in attributes of models like Enterprise.
+# We offer an editor which supports certain tags but you can't insert just any
+# HTML, which would be dangerous.
+class HtmlSanitizer
+ # div is required by Trix editor
+ ALLOWED_TAGS = %w[h1 h2 h3 h4 div p br b i u a strong em del pre blockquote ul ol li hr
+ figure].freeze
+ ALLOWED_ATTRIBUTES = %w[href target].freeze
+ ALLOWED_TRIX_DATA_ATTRIBUTES = %w[data-trix-attachment].freeze
+
+ def self.sanitize(html)
+ @sanitizer ||= Rails::HTML5::SafeListSanitizer.new
+ @sanitizer.sanitize(
+ html, tags: ALLOWED_TAGS, attributes: (ALLOWED_ATTRIBUTES + ALLOWED_TRIX_DATA_ATTRIBUTES)
+ )
+ end
+end
diff --git a/app/services/products_renderer.rb b/app/services/products_renderer.rb
index d7296e9fa16..57608f849a4 100644
--- a/app/services/products_renderer.rb
+++ b/app/services/products_renderer.rb
@@ -68,23 +68,26 @@ def distributed_products
end
def products_order
- if (distributor.preferred_shopfront_product_sorting_method == "by_producer") &&
- distributor.preferred_shopfront_producer_order.present?
- distributor
- .preferred_shopfront_producer_order
- .split(",").map { |id| "spree_products.supplier_id=#{id} DESC" }
- .join(", ") + ", spree_products.name ASC, spree_products.id ASC"
+ if distributor.preferred_shopfront_product_sorting_method == "by_producer" &&
+ distributor.preferred_shopfront_producer_order.present?
+ order_by_producer = distributor
+ .preferred_shopfront_producer_order
+ .split(",").map { |id| "spree_products.supplier_id=#{id} DESC" }
+ .join(", ")
+ "#{order_by_producer}, spree_products.name ASC, spree_products.id ASC"
elsif distributor.preferred_shopfront_product_sorting_method == "by_category" &&
- distributor.preferred_shopfront_taxon_order.present?
- distributor
- .preferred_shopfront_taxon_order
- .split(",").map { |id| "first_variant.primary_taxon_id=#{id} DESC" }
- .join(", ") + ", spree_products.name ASC, spree_products.id ASC"
+ distributor.preferred_shopfront_taxon_order.present?
+ order_by_category = distributor
+ .preferred_shopfront_taxon_order
+ .split(",").map { |id| "first_variant.primary_taxon_id=#{id} DESC" }
+ .join(", ")
+ "#{order_by_category}, spree_products.name ASC, spree_products.id ASC"
else
"spree_products.name ASC, spree_products.id"
end
end
+
def variants_for_shop
@variants_for_shop ||= begin
scoper = OpenFoodNetwork::ScopeVariantToHub.new(distributor)
diff --git a/app/services/sets/product_set.rb b/app/services/sets/product_set.rb
index ba3fb402404..04138eedbc3 100644
--- a/app/services/sets/product_set.rb
+++ b/app/services/sets/product_set.rb
@@ -67,11 +67,12 @@ def update_product_only_attributes(product, attributes)
product.assign_attributes(product_related_attrs)
+ return true unless product.changed?
+
validate_presence_of_unit_value_in_product(product)
- changed = product.changed?
success = product.errors.empty? && product.save
- count_result(success && changed)
+ count_result(success)
success
end
@@ -104,7 +105,8 @@ def update_variants_attributes(product, variants_attributes)
def create_or_update_variant(product, variant_attributes)
variant = find_model(product.variants, variant_attributes[:id])
if variant.present?
- variant.update(variant_attributes.except(:id))
+ variant.assign_attributes(variant_attributes.except(:id))
+ variant.save if variant.changed?
else
variant = create_variant(product, variant_attributes)
end
diff --git a/app/views/admin/column_preferences/_form.html.haml b/app/views/admin/column_preferences/_form.html.haml
new file mode 100644
index 00000000000..6296444b02e
--- /dev/null
+++ b/app/views/admin/column_preferences/_form.html.haml
@@ -0,0 +1,23 @@
+= form_with url: bulk_update_admin_column_preferences_path, method: :put,
+ id: :bulk_admin_column_preferences_form, class: "column-preferences",
+ html: { 'data-controller': "column-preferences" } do |f|
+ = hidden_field_tag :action_name, action
+
+ / DC: this makes my Chrome DevTools crash when inspecting the element. If problem continues, we need to use a different method.
+ %details.ofn-drop-down.ofn-drop-down-v2.right{ 'data-controller': "dropdown" }
+ %summary.ofn-drop-down-label
+ = t('admin.columns')
+ %span.icon-caret
+
+ .menu
+ .menu_items
+ - ColumnPreference.for(spree_current_user, action).each_with_index do |column_preference, index|
+ = f.fields_for("column_preferences", column_preference, index:) do |cp_form|
+ = cp_form.hidden_field :id
+ = cp_form.hidden_field :column_name
+ %label.menu_item
+ = cp_form.check_box :visible, 'data-column-name': column_preference.column_name
+ %span= t("admin.products_page.columns." + column_preference.column_name)
+
+ .actions
+ = f.submit t('admin.column_save_as_default'), class: "secondary fullwidth"
diff --git a/app/views/admin/column_preferences/bulk_update.turbo_stream.haml b/app/views/admin/column_preferences/bulk_update.turbo_stream.haml
new file mode 100644
index 00000000000..70836e46575
--- /dev/null
+++ b/app/views/admin/column_preferences/bulk_update.turbo_stream.haml
@@ -0,0 +1,3 @@
+= turbo_stream.replace "bulk_admin_column_preferences_form" do
+ = render partial: "admin/shared/flashes", locals: { flashes: flash } if defined? flash
+ = render partial: 'form', locals: { action: }
diff --git a/app/views/admin/enterprises/_form.html.haml b/app/views/admin/enterprises/_form.html.haml
index dcaae1a149c..71a9b2378b3 100644
--- a/app/views/admin/enterprises/_form.html.haml
+++ b/app/views/admin/enterprises/_form.html.haml
@@ -9,6 +9,11 @@
%fieldset.alpha.no-border-bottom{ id: "#{item[:name]}_panel", data: { "tabs-and-panels-target": "panel" }}
%legend= t(".#{ item[:name] }.legend")
+ - when 'connected_apps'
+ -# Don't render this item here in the main form.
+ -# The panel contains its own form and we can't nest forms in forms.
+ -# Otherwise we add multiple authenticity tokens and Rails denies updates.
+
- else
%fieldset.alpha.no-border-bottom{ id: "#{item[:name]}_panel", data: { "tabs-and-panels-target": "panel" }}
%legend= t(".#{ item[:form_name] || item[:name] }.legend")
diff --git a/app/views/admin/enterprises/_ng_form.html.haml b/app/views/admin/enterprises/_ng_form.html.haml
index 3ea83f8fbda..5fd3d9b541e 100644
--- a/app/views/admin/enterprises/_ng_form.html.haml
+++ b/app/views/admin/enterprises/_ng_form.html.haml
@@ -11,11 +11,4 @@
%input.red{ type: "button", value: t(:update), "ng-click": "submit()", "ng-disabled": "!enterprise_form.$dirty" }
%input{ type: "button", "ng-value": "enterprise_form.$dirty ? '#{t(:cancel)}' : '#{t(:close)}'", "ng-click": "cancel('#{main_app.admin_enterprises_path}')" }
- .row{ data: {
- controller: "tabs-and-panels", "tabs-and-panels-class-name-value": "selected" }}
- .sixteen.columns.alpha
- .four.columns.alpha
- = render 'admin/shared/side_menu'
- .one.column
- .eleven.columns.omega.fullwidth_inputs
- = render 'form', f: f
+ = render 'form', f: f
diff --git a/app/views/admin/enterprises/edit.html.haml b/app/views/admin/enterprises/edit.html.haml
index 0e6a9162b87..90fd8201c9a 100644
--- a/app/views/admin/enterprises/edit.html.haml
+++ b/app/views/admin/enterprises/edit.html.haml
@@ -13,4 +13,14 @@
= render 'admin/enterprises/form_data'
-= render 'admin/enterprises/ng_form', action: 'edit'
+.row{ data: { controller: "tabs-and-panels", "tabs-and-panels-class-name-value": "selected" }}
+ .sixteen.columns.alpha
+ .four.columns.alpha
+ = render 'admin/shared/side_menu'
+ .one.column
+ .eleven.columns.omega.fullwidth_inputs
+ = render 'admin/enterprises/ng_form', action: 'edit'
+
+ %fieldset.alpha.no-border-bottom{ id: "connected_apps_panel", data: { "tabs-and-panels-target": "panel" }}
+ %legend= t("admin.enterprises.form.connected_apps.legend")
+ = render "admin/enterprises/form/connected_apps", enterprise: @enterprise
diff --git a/app/views/admin/enterprises/form/_connected_apps.html.haml b/app/views/admin/enterprises/form/_connected_apps.html.haml
index c60a7da1a1b..2ffbceee81d 100644
--- a/app/views/admin/enterprises/form/_connected_apps.html.haml
+++ b/app/views/admin/enterprises/form/_connected_apps.html.haml
@@ -1,21 +1,20 @@
-- enterprise ||= f.object
-#connected-app-discover-regen
+%div{ id: "connected-app-discover-regen", class: "enterprise_#{enterprise.id}" }
.connected-app__head
%div
%h3= t ".title"
%p= t ".tagline"
%div
- if enterprise.connected_apps.empty?
- %button{ data: {reflex: "click->Admin::ConnectedApp#create", enterprise_id: enterprise.id} }
- = t ".enable"
+ = button_to t(".enable"), admin_enterprise_connected_apps_path(enterprise.id), method: :post, disabled: !managed_by_user?(enterprise)
+ -# This is only seen by super-admins:
+ %em= t(".need_to_be_manager") unless managed_by_user?(enterprise)
- elsif enterprise.connected_apps.connecting.present?
%button{ disabled: true }
%i.spinner.fa.fa-spin.fa-circle-o-notch
= t ".loading"
- else
- %button{ data: {reflex: "click->Admin::ConnectedApp#destroy", enterprise_id: enterprise.id} }
- = t ".disable"
+ = button_to t(".disable"), admin_enterprise_connected_app_path(0, enterprise_id: enterprise.id), method: :delete
.connected-app__connection
- if enterprise.connected_apps.ready.present?
diff --git a/app/views/admin/products_v3/_content.html.haml b/app/views/admin/products_v3/_content.html.haml
index dcb29e945fe..0a9459abae9 100644
--- a/app/views/admin/products_v3/_content.html.haml
+++ b/app/views/admin/products_v3/_content.html.haml
@@ -15,7 +15,7 @@
.container.results
.sixteen.columns
= render partial: 'sort', locals: { pagy: pagy, search_term: search_term, producer_id: producer_id, category_id: category_id }
- = render partial: 'table', locals: { products: products }
+ = render partial: 'table', locals: { products:, producer_options:, category_options:, tax_category_options: }
- if pagy.present? && pagy.pages > 1
= render partial: 'admin/shared/stimulus_pagination', locals: { pagy: pagy }
- else
diff --git a/app/views/admin/products_v3/_delete_modal.html.haml b/app/views/admin/products_v3/_delete_modal.html.haml
index 40b6fbd32d6..87208c5dbe1 100644
--- a/app/views/admin/products_v3/_delete_modal.html.haml
+++ b/app/views/admin/products_v3/_delete_modal.html.haml
@@ -5,8 +5,8 @@
cancel_button_text: t("#{base_translation_key}.cancellation_text"),
confirm_button_class: :red,
actions_alignment_class: 'justify-end',
- confirm_reflexes: "click->products#delete_#{object_type}",
- confirm_actions: "click->modal#close",
+ controller: "products",
+ confirm_actions: "click->products#delete_#{object_type} click->modal#close",
)
= render delete_modal do
%h2.margin-bottom-20.black-text
diff --git a/app/views/admin/products_v3/_edit_image.html.haml b/app/views/admin/products_v3/_edit_image.html.haml
deleted file mode 100644
index 57fccaac764..00000000000
--- a/app/views/admin/products_v3/_edit_image.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-= render ModalComponent.new id: "#modal_edit_product_image_#{image.id}", instant: true, close_button: false, modal_class: :fit do
- %h2= t(".title")
-
- -# Display image in the same way it appears in the shopfront popup
- %p= image_tag image.persisted? ? image.url(:large) : Spree::Image.default_image_url(:large), width: 433, height: 433
-
- -# Submit to controller, because StimulusReflex doesn't support file uploads
- = form_for [:admin, product, image],
- html: { multipart: true }, data: { controller: "form" } do |f|
- %input{ type: :hidden, name: :return_url, value: return_url}
- = f.hidden_field :viewable_id, value: product.id
-
- .modal-actions.justify-end
- %input{ class: "secondary relaxed", type: 'button', value: t('.close'), "data-action": "click->modal#close" }
- -# label.button provides a handy shortcut to open the file selector on click. Unfortunately this trick isn't keyboard accessible though..
- = f.label :attachment, t(".upload"), class: "button primary relaxed icon-upload-alt"
- = f.file_field :attachment, accept: "image/*", style: "display: none", "data-action": "change->form#submit"
diff --git a/app/views/admin/products_v3/_filters.html.haml b/app/views/admin/products_v3/_filters.html.haml
index 2a0aa554288..4b90628c7c5 100644
--- a/app/views/admin/products_v3/_filters.html.haml
+++ b/app/views/admin/products_v3/_filters.html.haml
@@ -1,6 +1,7 @@
= form_with url: admin_products_path, id: "filters", method: :get, data: { "search-target": "form", 'turbo-frame': "_self" } do
= hidden_field_tag :page, nil, class: "page"
= hidden_field_tag :per_page, nil, class: "per-page"
+ = hidden_field_tag '[q][s]', params.dig(:q, :s) || 'name asc', class: 'sort', 'data-default': 'name asc'
.query
.search-input
diff --git a/app/views/admin/products_v3/_product_image.html.haml b/app/views/admin/products_v3/_product_image.html.haml
new file mode 100644
index 00000000000..cc3e77d1416
--- /dev/null
+++ b/app/views/admin/products_v3/_product_image.html.haml
@@ -0,0 +1,3 @@
+%a.image-field{ href: product_image_form_path(product), 'data-turbo-stream': true }
+ = image_tag product.image&.url(:mini) || Spree::Image.default_image_url(:mini), width: 40, height: 40
+ .button.secondary.mini= t('admin.products_page.image.edit')
diff --git a/app/views/admin/products_v3/_product_row.html.haml b/app/views/admin/products_v3/_product_row.html.haml
index 5e11301a5eb..48636dc92e3 100644
--- a/app/views/admin/products_v3/_product_row.html.haml
+++ b/app/views/admin/products_v3/_product_row.html.haml
@@ -1,15 +1,13 @@
-%td.with-image
- %a.image-field{ href: admin_product_images_path(product), data: { controller: "modal", reflex: "click->products#edit_image", "current-id": product.id} }
- = image_tag product.image&.url(:mini) || Spree::Image.default_image_url(:mini), width: 40, height: 40
- .button.secondary.mini= t('admin.products_page.image.edit')
-%td.field.align-left.header.naked_inputs
+%td.col-image.with-image{ id: "image-#{product.id}" }
+ = render partial: "product_image", locals: { product: }
+%td.col-name.field.align-left.header.naked_inputs
= f.hidden_field :id
= f.text_field :name, 'aria-label': t('admin.products_page.columns.name')
= error_message_on product, :name
-%td.field.naked_inputs
+%td.col-sku.field.naked_inputs
= f.text_field :sku, 'aria-label': t('admin.products_page.columns.sku')
= error_message_on product, :sku
-%td.multi-field.naked_inputs{ 'data-controller': 'toggle-control', 'data-toggle-control-match-value': 'items' }
+%td.col-unit_scale.field.naked_inputs{ 'data-controller': 'toggle-control', 'data-toggle-control-match-value': 'items' }
= f.hidden_field :variant_unit
= f.hidden_field :variant_unit_scale
= f.select :variant_unit_with_scale,
@@ -21,18 +19,23 @@
.field
= f.text_field :variant_unit_name, 'aria-label': t('items'), 'data-toggle-control-target': 'control', style: (product.variant_unit == "items" ? "" : "display: none")
= error_message_on product, :variant_unit_name, 'data-toggle-control-target': 'control'
-%td.align-right
+%td.col-unit.align-right
-# empty
-%td.align-right
+%td.col-price.align-right
-# empty
-%td.align-right
+%td.col-on_hand.align-right
-# empty
-%td.align-left
- .content= product.supplier&.name
-%td.align-left
+%td.col-producer.naked_inputs
+ = render(SearchableDropdownComponent.new(form: f,
+ name: :supplier_id,
+ aria_label: t('.producer_field_name'),
+ options: producer_options,
+ selected_option: product.supplier_id,
+ placeholder_value: t('admin.products_v3.filters.search_for_producers')))
+%td.col-category.align-left
-# empty
-%td.align-left
-%td.align-left
+%td.col-tax_category.align-left
+%td.col-inherits_properties.align-left
.content= product.inherits_properties ? 'YES' : 'NO' #TODO: consider using https://github.com/RST-J/human_attribute_values, else use I18n.t (also below)
%td.align-right
= render(VerticalEllipsisMenu::Component.new) do
@@ -40,5 +43,5 @@
= link_to t('admin.products_page.actions.clone'), clone_admin_product_path(product), 'data-turbo': false
%a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open",
"data-modal-link-target-value": "product-delete-modal", "class": "delete",
- "data-modal-link-modal-dataset-value": {'data-current-id': product.id}.to_json }
+ "data-modal-link-modal-dataset-value": {'data-delete-path': admin_product_destroy_path(product)}.to_json }
= t('admin.products_page.actions.delete')
diff --git a/app/views/admin/products_v3/_sort.html.haml b/app/views/admin/products_v3/_sort.html.haml
index f53eec4e76a..6749b3b07a4 100644
--- a/app/views/admin/products_v3/_sort.html.haml
+++ b/app/views/admin/products_v3/_sort.html.haml
@@ -1,5 +1,5 @@
#sort
- %div
+ %div.pagination-description
- if pagy.present?
= t(".pagination.total_html", total: pagy.count, from: pagy.from, to: pagy.to)
@@ -13,3 +13,6 @@
options_for_select([15, 25, 50, 100].collect{|i| [t('.pagination.per_page.per_page', num: i), i]}, pagy&.items),
class: "no-input per-page",
data: { controller: "tom-select search", action: "change->search#changePerPage", "tom-select-options-value": '{ "plugins": [] }'}
+
+ / Columns dropdown
+ = render partial: "admin/column_preferences/form", locals: { action: "products_v3_index" }
diff --git a/app/views/admin/products_v3/_table.html.haml b/app/views/admin/products_v3/_table.html.haml
index 78d32be8b2c..0b8cc98b796 100644
--- a/app/views/admin/products_v3/_table.html.haml
+++ b/app/views/admin/products_v3/_table.html.haml
@@ -13,20 +13,21 @@
= hidden_field_tag :producer_id, @producer_id
= hidden_field_tag :category_id, @category_id
- %table.products
+ %table.products{ 'data-column-preferences-target': "table" }
%colgroup
- %col{ width:"56" }= # Img (size + padding)
- %col= # (grow to fill) Name
- %col{ width:"5%"}
- %col{ width:"8%"}
- %col{ width:"8%"}
- %col{ width:"5%"}
- %col{ width:"10%"}
- %col{ width:"15%"}= # Producer
- %col{ width:"8%"}
- %col{ width:"8%"}
- %col{ width:"8%"}
- %col{ width:"8%"}= # Actions
+ -# The `min-width` property works in Chrome but not Firefox so is considered progressive enhancement.
+ %col.col-image{ width:"56px" }= # (image size + padding)
+ %col.col-name{ style:"min-width: 6em" }= # (grow to fill)
+ %col.col-sku{ width:"8%", style:"min-width: 6em" }
+ %col.col-unit_scale{ width:"8%" }
+ %col.col-unit{ width:"8%" }
+ %col.col-price{ width:"5%", style:"min-width: 5em" }
+ %col.col-on_hand{ width:"10%"}
+ %col.col-producer{ style:"min-width: 6em" }= # (grow to fill)
+ %col.col-category{ width:"8%" }
+ %col.col-tax_category{ width:"8%" }
+ %col.col-inherits_properties{ width:"5%" }
+ %col{ width:"5%", style:"min-width: 3em"}= # Actions
%thead
%tr
%td.form-actions-wrapper{ colspan: 12 }
@@ -48,35 +49,36 @@
= t('.reset')
= form.submit t('.save'), class: "medium"
%tr
- %th.align-left= # image
- %th.align-left.with-input= t('admin.products_page.columns.name')
- %th.align-left.with-input= t('admin.products_page.columns.sku')
- %th.align-left.with-input= t('admin.products_page.columns.unit_scale')
- %th.align-left.with-input= t('admin.products_page.columns.unit')
- %th.align-left.with-input= t('admin.products_page.columns.price')
- %th.align-left.with-input= t('admin.products_page.columns.on_hand')
- %th.align-left= t('admin.products_page.columns.producer')
- %th.align-left= t('admin.products_page.columns.category')
- %th.align-left= t('admin.products_page.columns.tax_category')
- %th.align-left= t('admin.products_page.columns.inherits_properties')
+ %th.col-image.align-left= # image
+ = render partial: 'spree/admin/shared/stimulus_sortable_header',
+ locals: { column: :name, sorted: params.dig(:q, :s), default: 'name asc' }
+ %th.align-left.col-sku.with-input= t('admin.products_page.columns.sku')
+ %th.align-left.col-unit_scale.with-input= t('admin.products_page.columns.unit_scale')
+ %th.align-left.col-unit.with-input= t('admin.products_page.columns.unit')
+ %th.align-left.col-price.with-input= t('admin.products_page.columns.price')
+ %th.align-left.col-on_hand.with-input= t('admin.products_page.columns.on_hand')
+ %th.align-left.col-producer= t('admin.products_page.columns.producer')
+ %th.align-left.col-category= t('admin.products_page.columns.category')
+ %th.align-left.col-tax_category= t('admin.products_page.columns.tax_category')
+ %th.align-left.col-inherits_properties= t('admin.products_page.columns.inherits_properties')
%th.align-right= t('admin.products_page.columns.actions')
- products.each_with_index do |product, product_index|
= form.fields_for("products", product, index: product_index) do |product_form|
- %tbody.relaxed{ data: { 'record-id': product_form.object.id,
+ %tbody.relaxed{ id: dom_id(product), data: { 'record-id': product_form.object.id,
controller: "nested-form product",
- action: 'rails-nested-form:add->bulk-form#registerElements' } }
+ action: 'rails-nested-form:add->bulk-form#registerElements rails-nested-form:remove->bulk-form#toggleFormChanged' } }
%tr
- = render partial: 'product_row', locals: { product:, f: product_form }
+ = render partial: 'product_row', locals: { f: product_form, product:, producer_options: }
- product.variants.each_with_index do |variant, variant_index|
= form.fields_for("products][#{product_index}][variants_attributes][", variant, index: variant_index) do |variant_form|
- %tr.condensed{ 'data-controller': "variant" }
- = render partial: 'variant_row', locals: { variant:, f: variant_form }
+ %tr.condensed{ id: dom_id(variant), 'data-controller': "variant", 'class': "nested-form-wrapper", 'data-new-record': variant.new_record? ? "true" : false }
+ = render partial: 'variant_row', locals: { variant:, f: variant_form, category_options:, tax_category_options: }
= form.fields_for("products][#{product_index}][variants_attributes][NEW_RECORD", product.variants.build) do |new_variant_form|
%template{ 'data-nested-form-target': "template" }
- %tr.condensed{ 'data-controller': "variant" }
- = render partial: 'variant_row', locals: { variant: new_variant_form.object, f: new_variant_form }
+ %tr.condensed{ 'data-controller': "variant", 'class': "nested-form-wrapper", 'data-new-record': "true" }
+ = render partial: 'variant_row', locals: { variant: new_variant_form.object, f: new_variant_form, category_options:, tax_category_options: }
%tr{ 'data-nested-form-target': "target" }
%tr.condensed
diff --git a/app/views/admin/products_v3/_variant_row.html.haml b/app/views/admin/products_v3/_variant_row.html.haml
index 97646ec1ba1..311b833e041 100644
--- a/app/views/admin/products_v3/_variant_row.html.haml
+++ b/app/views/admin/products_v3/_variant_row.html.haml
@@ -1,15 +1,15 @@
-%td
+%td.col-image
-# empty
-%td.field.naked_inputs
+%td.col-name.field.naked_inputs
= f.hidden_field :id
= f.text_field :display_name, 'aria-label': t('admin.products_page.columns.name'), placeholder: variant.product.name
= error_message_on variant, :display_name
-%td.field.naked_inputs
+%td.col-sku.field.naked_inputs
= f.text_field :sku, 'aria-label': t('admin.products_page.columns.sku')
= error_message_on variant, :sku
-%td
+%td.col-unit_scale
-# empty
-%td.field.popout{'data-controller': "popout", 'data-popout-update-display-value': "false"}
+%td.col-unit.field.popout{'data-controller': "popout", 'data-popout-update-display-value': "false"}
= f.button :unit_to_display, class: "popout__button", 'aria-label': t('admin.products_page.columns.unit'), 'data-popout-target': "button" do
= variant.unit_to_display # Show the generated summary of unit values
%div.popout__container{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" }
@@ -25,10 +25,10 @@
= f.label :display_as, t('admin.products_page.columns.display_as')
= f.text_field :display_as, placeholder: VariantUnits::OptionValueNamer.new(variant).name
= error_message_on variant, :unit_value
-%td.field.naked_inputs
+%td.col-price.field.naked_inputs
= f.text_field :price, 'aria-label': t('admin.products_page.columns.price'), value: number_to_currency(variant.price, unit: '')&.strip # TODO: add a spec to prove that this formatting is necessary. If so, it should be in a shared form helper for currency inputs
= error_message_on variant, :price
-%td.field.popout{'data-controller': "popout"}
+%td.col-on_hand.field.popout{'data-controller': "popout"}
%button.popout__button{'data-popout-target': "button", 'aria-label': t('admin.products_page.columns.on_hand')}
= variant.on_demand ? t(:on_demand) : variant.on_hand
%div.popout__container{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" }
@@ -39,20 +39,35 @@
= f.label :on_demand do
= f.check_box :on_demand, 'data-action': 'change->toggle-control#disableIfPresent change->popout#closeIfChecked'
= t(:on_demand)
-%td.align-left
- .content= variant.product.supplier&.name # same as product
-%td.align-left
- .content= variant.primary_taxon&.name
-%td.align-left
- .content= (variant.tax_category_id ? variant.tax_category&.name : t('.none_tax_category')) # TODO: convert to dropdown
-%td.align-left
+%td.col-producer.align-left
+ -# empty producer name
+%td.col-category.field.naked_inputs
+ = render(SearchableDropdownComponent.new(form: f,
+ name: :primary_taxon_id,
+ options: category_options,
+ selected_option: variant.primary_taxon_id,
+ aria_label: t('.category_field_name'),
+ placeholder_value: t('admin.products_v3.filters.search_for_categories')))
+%td.col-tax_category.field.naked_inputs
+ = render(SearchableDropdownComponent.new(form: f,
+ name: :tax_category_id,
+ options: tax_category_options,
+ selected_option: variant.tax_category_id,
+ include_blank: t('.none_tax_category'),
+ aria_label: t('.tax_category_field_name'),
+ placeholder_value: t('.search_for_tax_categories')))
+ = error_message_on variant, :tax_category
+%td.col-inherits_properties.align-left
-# empty
%td.align-right
- - if variant.persisted?
- = render(VerticalEllipsisMenu::Component.new) do
+ = render(VerticalEllipsisMenu::Component.new) do
+ - if variant.persisted?
= link_to t('admin.products_page.actions.edit'), edit_admin_product_variant_path(variant.product, variant)
- if variant.product.variants.size > 1
%a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open",
"data-modal-link-target-value": "variant-delete-modal", "class": "delete",
- "data-modal-link-modal-dataset-value": {'data-current-id': variant.id}.to_json }
+ "data-modal-link-modal-dataset-value": {'data-delete-path': admin_destroy_variant_path(variant)}.to_json }
= t('admin.products_page.actions.delete')
+ - else
+ %a{ 'data-action': "nested-form#remove", class: 'delete' }
+ = t('admin.products_page.actions.remove')
diff --git a/app/views/admin/products_v3/destroy_product_variant.turbo_stream.haml b/app/views/admin/products_v3/destroy_product_variant.turbo_stream.haml
new file mode 100644
index 00000000000..645b265c410
--- /dev/null
+++ b/app/views/admin/products_v3/destroy_product_variant.turbo_stream.haml
@@ -0,0 +1,5 @@
+- # @record can either be Product or Variant
+- unless flash[:error]
+ = turbo_stream.remove(dom_id(@record))
+= turbo_stream.append "flashes" do
+ = render(partial: 'admin/shared/flashes', locals: { flashes: flash })
diff --git a/app/views/admin/products_v3/index.html.haml b/app/views/admin/products_v3/index.html.haml
index 4200cd01768..668a8527a4b 100644
--- a/app/views/admin/products_v3/index.html.haml
+++ b/app/views/admin/products_v3/index.html.haml
@@ -15,8 +15,8 @@
= render partial: "content", locals: { products: @products, pagy: @pagy, search_term: @search_term,
producer_options: producers, producer_id: @producer_id,
category_options: categories, category_id: @category_id,
- flashes: flash }
+ tax_category_options:, flashes: flash }
- %w[product variant].each do |object_type|
= render partial: 'delete_modal', locals: { object_type: }
#modal-component
-
+ #edit_image_modal
diff --git a/app/views/admin/reports/_date_range_form.html.haml b/app/views/admin/reports/_date_range_form.html.haml
index 0afa600caea..040344e6224 100644
--- a/app/views/admin/reports/_date_range_form.html.haml
+++ b/app/views/admin/reports/_date_range_form.html.haml
@@ -7,7 +7,8 @@
.row.date-range-filter
.alpha.two.columns= label_tag nil, t(:date_range)
.omega.fourteen.columns
- = f.text_field "#{field}_gt", :class => 'datetimepicker datepicker-from', :placeholder => t(:start), data: { controller: "flatpickr", "flatpickr-enable-time-value": true, "flatpickr-default-date-value": "startOfDay" }, value: start_date
- %span.range-divider
- %i.icon-arrow-right
- = f.text_field "#{field}_lt", :class => 'datetimepicker datepicker-to', :placeholder => t(:stop), data: { controller: "flatpickr", "flatpickr-enable-time-value": true, "flatpickr-default-date-value": "endOfDay" }, value: end_date
+ .field-block.omega.four.columns
+ .date-range-fields{ data: { controller: "flatpickr", "flatpickr-mode-value": "range", "flatpickr-enable-time-value": true , "flatpickr-default-hour": 0 } }
+ = text_field_tag nil, nil, class: "datepicker fullwidth", data: { "flatpickr-target": "instance", action: "flatpickr_clear@window->flatpickr#clear" }
+ = text_field_tag "q[#{field}_gt]", nil, data: { "flatpickr-target": "start" }, style: "display: none", value: start_date
+ = text_field_tag "q[#{field}_lt]", nil, data: { "flatpickr-target": "end" }, style: "display: none", value: end_date
diff --git a/app/views/checkout/_details.html.haml b/app/views/checkout/_details.html.haml
index b837e528128..56146d19c09 100644
--- a/app/views/checkout/_details.html.haml
+++ b/app/views/checkout/_details.html.haml
@@ -95,12 +95,7 @@
%div.checkout-input{"data-shippingmethod-target": "shippingMethodDescription", "data-shippingmethodid": shipping_method.id , style: "display: #{ship_method_is_selected ? 'block' : 'none'}" }
#distributor_address.panel
- if shipping_method.description.present?
- %span #{shipping_method.description}
- %br/
- %br/
- - if @order.order_cycle.pickup_time_for(@order.distributor)
- = t :checkout_ready_for
- = @order.order_cycle.pickup_time_for(@order.distributor)
+ = simple_format(html_escape(shipping_method.description))
= f.error_message_on :shipping_method, standalone: true
diff --git a/app/views/checkout/_payment.html.haml b/app/views/checkout/_payment.html.haml
index 656a246efe2..516d2025bb4 100644
--- a/app/views/checkout/_payment.html.haml
+++ b/app/views/checkout/_payment.html.haml
@@ -29,7 +29,7 @@
.paymentmethod-container{"data-paymentmethod-id": "#{payment_method.id}", style: "display: #{payment_method.id == selected_payment_method ? "block" : "none"}"}
- if payment_method.description && !payment_method.description.empty?
.paymentmethod-description.panel
- #{payment_method.description}
+ = simple_format(html_escape(payment_method.description))
.paymentmethod-form
= render partial: "checkout/payment/#{payment_method.method_type}", locals: { payment_method: payment_method, f: f }
diff --git a/app/views/registration/steps/_details.html.haml b/app/views/registration/steps/_details.html.haml
index 45fb0e56b7d..eee82d4ee38 100644
--- a/app/views/registration/steps/_details.html.haml
+++ b/app/views/registration/steps/_details.html.haml
@@ -57,7 +57,10 @@
%span.error{ "ng-show": "details.state.$error.required && submitted" }
= t(".state_field_error")
- = render 'registration/steps/location_map' if using_google_maps?
+ - if using_google_maps?
+ = render 'registration/steps/location_map_google'
+ - elsif ContentConfig.open_street_map_enabled
+ = render 'registration/steps/location_map_osm'
.row.buttons
.small-12.columns
diff --git a/app/views/registration/steps/_location_map.html.haml b/app/views/registration/steps/_location_map_google.html.haml
similarity index 100%
rename from app/views/registration/steps/_location_map.html.haml
rename to app/views/registration/steps/_location_map_google.html.haml
diff --git a/app/views/registration/steps/_location_map_osm.html.haml b/app/views/registration/steps/_location_map_osm.html.haml
new file mode 100644
index 00000000000..c60ffa74f7e
--- /dev/null
+++ b/app/views/registration/steps/_location_map_osm.html.haml
@@ -0,0 +1,18 @@
+%div{ data: {
+ controller: "open-street-map",
+ "open-street-map-default-latitude-value": ContentConfig.open_street_map_default_latitude,
+ "open-street-map-default-longitude-value": ContentConfig.open_street_map_default_longitude,
+ "open-street-map-provider-name-value": ContentConfig.open_street_map_provider_name,
+ "open-street-map-provider-options-value": ContentConfig.open_street_map_provider_options
+ }
+ }
+ .center
+ %input.button.primary{ data: { action: "click->open-street-map#locateAddress" }, type: "button", value: "{{'registration.steps.details.locate_address' | t}}" }
+ .center{ data: { "open-street-map-target": "dragPinNote" }, style: "display: none" }
+ %strong {{'registration.steps.details.drag_pin' | t}}
+ #open-street-map.map-container--registration
+
+ .center{ data: { "open-street-map-target": "confirmAddressField" }, style: "display: none" }
+ .field
+ %input{ type: 'checkbox', id: 'confirm_address', name: 'confirm_address', "ng-click": 'toggleAddressConfirmed()' }
+ %label{ for: 'confirm_address' } {{'registration.steps.details.confirm_address' | t}}
diff --git a/app/views/shared/menu/_signed_in.html.haml b/app/views/shared/menu/_signed_in.html.haml
index 34b7bcfc066..059580c1a24 100644
--- a/app/views/shared/menu/_signed_in.html.haml
+++ b/app/views/shared/menu/_signed_in.html.haml
@@ -1,9 +1,3 @@
-- if discourse_configured?
- %li
- %a{href: main_app.discourse_login_path, target: '_blank'}
- %span.nav-primary
- = t 'label_notices'
-
%li.user-menu.has-dropdown.not-click
%a{href: "#", class: "top-bar--menu-item-with-icon"}
diff --git a/app/views/shared/menu/_signed_in_offcanvas.html.haml b/app/views/shared/menu/_signed_in_offcanvas.html.haml
index c6f0e6be8a9..e5ec28bef4f 100644
--- a/app/views/shared/menu/_signed_in_offcanvas.html.haml
+++ b/app/views/shared/menu/_signed_in_offcanvas.html.haml
@@ -1,10 +1,3 @@
-- if discourse_configured?
- %li.li-menu
- %a{href: main_app.discourse_login_path, target: '_blank'}
- %span.nav-primary
- %i.ofn-i_025-notepad
- = t 'label_notices'
-
- if admin_user? or enterprise_user?
%li
%a{href: spree.admin_dashboard_path, target:'_blank'}
diff --git a/app/views/spree/admin/images/edit.turbo_stream.haml b/app/views/spree/admin/images/edit.turbo_stream.haml
new file mode 100644
index 00000000000..b3ca87329b2
--- /dev/null
+++ b/app/views/spree/admin/images/edit.turbo_stream.haml
@@ -0,0 +1,25 @@
+= turbo_stream.update "edit_image_modal" do
+ = render ModalComponent.new id: "#modal_edit_product_image", instant: true, close_button: false, modal_class: :fit do
+ %h2= t(".title")
+
+ -# Display image in the same way it appears in the shopfront popup
+ - if defined?(@errors) && !@errors.empty?
+ - @errors.each do |error|
+ %p
+ = error
+ - else
+ %p= image_tag @image.persisted? ? @image.url(:large) : Spree::Image.default_image_url(:large), width: 433, height: 433
+
+
+ -# Submit as turbo stream to avoid full page reload.
+ -# TODO: show loading indicator.
+ = form_for [:admin, @product, @image],
+ html: { multipart: true }, data: { controller: "form" } do |f|
+ %input{ type: :hidden, name: :return_url, value: request.referer }
+ = f.hidden_field :viewable_id, value: @product.id
+
+ .modal-actions.justify-end
+ %input{ class: "secondary relaxed", type: 'button', value: t('.close'), "data-action": "click->modal#close" }
+ -# label.button provides a handy shortcut to open the file selector on click. Unfortunately this trick isn't keyboard accessible though..
+ = f.label :attachment, t(".upload"), class: "button primary relaxed icon-upload-alt"
+ = f.file_field :attachment, accept: "image/*", style: "display: none", "data-action": "change->form#submit change->modal#close"
diff --git a/app/views/spree/admin/images/update.turbo_stream.haml b/app/views/spree/admin/images/update.turbo_stream.haml
new file mode 100644
index 00000000000..169bf5c89ff
--- /dev/null
+++ b/app/views/spree/admin/images/update.turbo_stream.haml
@@ -0,0 +1,3 @@
+= turbo_stream.update "image-#{@product.id}" do
+ = render partial: "admin/products_v3/product_image", locals: { product: @product }
+ = render partial: "admin/shared/flashes", locals: { flashes: flash } if defined? flash
diff --git a/app/views/spree/admin/orders/_form/_adjustments.html.haml b/app/views/spree/admin/orders/_form/_adjustments.html.haml
index 5f3e9f215e0..771723c99e7 100644
--- a/app/views/spree/admin/orders/_form/_adjustments.html.haml
+++ b/app/views/spree/admin/orders/_form/_adjustments.html.haml
@@ -6,7 +6,7 @@
%tr
%th= Spree.t('name')
%th= Spree.t('amount')
- %tbody.with-border
+ %tbody.with-border#order_adjustments
- adjustments.each do |adjustment|
%tr.total
%td.strong= adjustment.label + ":"
diff --git a/app/views/spree/admin/shared/_head.html.haml b/app/views/spree/admin/shared/_head.html.haml
index 97336242ce2..cd1fa4cda34 100644
--- a/app/views/spree/admin/shared/_head.html.haml
+++ b/app/views/spree/admin/shared/_head.html.haml
@@ -7,7 +7,7 @@
- if content_for? :html_title
= yield :html_title
- else
- = t(controller.controller_name, :default => controller.controller_name.titleize)
+ = t("spree.admin.tab.#{controller.controller_name}", :default => controller.controller_name.titleize)
= " - OFN #{t(:administration)}"
%link{:href => "https://fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,400,600&subset=latin,cyrillic,greek,vietnamese", :rel => "stylesheet", :type => "text/css"}
diff --git a/app/views/spree/admin/shared/_order_links.html.haml b/app/views/spree/admin/shared/_order_links.html.haml
index 9af75fffd8a..a79cf3b2f51 100644
--- a/app/views/spree/admin/shared/_order_links.html.haml
+++ b/app/views/spree/admin/shared/_order_links.html.haml
@@ -19,3 +19,6 @@
%span=link[:name]
= render 'spree/admin/shared/custom-confirm'
+- if order_shipment_ready?(@order)
+ %form
+ = render ShipOrderComponent.new(order: @order)
diff --git a/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml b/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml
index 46443016ce2..051ffa1f4fa 100644
--- a/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml
+++ b/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml
@@ -1,5 +1,5 @@
-%th
- %a{ "data-action": "click->search#changeSorting", "data-column": "#{column}", "data-current": sorted.to_s }
+%th{ class: "col-#{column}" }
+ %a{ "data-controller": "search", "data-action": "click->search#changeSorting", "data-column": "#{column}", "data-current": (sorted || default).to_s }
= t("spree.admin.shared.sortable_header.#{column.to_s}")
- if sorted == "#{column} asc" || sorted.blank? && local_assigns[:default] == "#{column} asc"
diff --git a/app/views/spree/admin/tax_settings/edit.html.haml b/app/views/spree/admin/tax_settings/edit.html.haml
index 18f4c36aa92..9ba2c99880c 100644
--- a/app/views/spree/admin/tax_settings/edit.html.haml
+++ b/app/views/spree/admin/tax_settings/edit.html.haml
@@ -7,8 +7,9 @@
.field.align-center
= hidden_field_tag 'preferences[products_require_tax_category]', '0'
- = check_box_tag 'preferences[products_require_tax_category]', '1', Spree::Config[:products_require_tax_category]
- = label_tag nil, t(:products_require_tax_category)
+ %label
+ = check_box_tag 'preferences[products_require_tax_category]', '1', Spree::Config[:products_require_tax_category]
+ = t(:products_require_tax_category)
.form-buttons
= button t(:update), 'icon-refresh'
diff --git a/app/views/spree/admin/variants/_form.html.haml b/app/views/spree/admin/variants/_form.html.haml
index 76a1ebfafc3..f90f15c1f7b 100644
--- a/app/views/spree/admin/variants/_form.html.haml
+++ b/app/views/spree/admin/variants/_form.html.haml
@@ -65,7 +65,7 @@
= f.number_field field, value: value, class: 'fullwidth', step: 0.01
.field
- = f.label :tax_category_id, t(:tax_category)
+ = f.label :tax_category, t(:tax_category), for: :tax_category_id
= f.collection_select(:tax_category_id, @tax_categories, :id, :name, { include_blank: t(:none) }, { class: 'select2 fullwidth' })
.field
diff --git a/app/views/spree/orders/edit.html.haml b/app/views/spree/orders/edit.html.haml
index fb50b995eb3..30811833b94 100644
--- a/app/views/spree/orders/edit.html.haml
+++ b/app/views/spree/orders/edit.html.haml
@@ -13,8 +13,6 @@
%strong
- if @order.order_cycle
= pickup_time @order.order_cycle
- - else
- = @order.distributor.next_collection_at
- content_for :ordercycle_sidebar do
.show-for-large-up.large-4.columns
diff --git a/app/webpacker/controllers/application_controller.js b/app/webpacker/controllers/application_controller.js
index 3065427cf43..50f5e57269e 100644
--- a/app/webpacker/controllers/application_controller.js
+++ b/app/webpacker/controllers/application_controller.js
@@ -47,7 +47,7 @@ export default class extends Controller {
console.error(reflex + ":\n " + error);
// show error message
- alert(I18n.t("errors.stimulus_reflex_error"));
+ alert(I18n.t("errors.general_error.message"));
}
reflexForbidden(element, reflex, noop, reflexId) {
diff --git a/app/webpacker/controllers/bulk_form_controller.js b/app/webpacker/controllers/bulk_form_controller.js
index 602f7c0127e..bd1ab3b8545 100644
--- a/app/webpacker/controllers/bulk_form_controller.js
+++ b/app/webpacker/controllers/bulk_form_controller.js
@@ -63,7 +63,7 @@ export default class BulkFormController extends Controller {
// For each record, check if any fields are changed
// TODO: optimise basd on current state. if field is changed, but form already changed, no need to update (and vice versa)
const changedRecordCount = Object.values(this.recordElements).filter((elements) =>
- elements.some(this.#isChanged),
+ elements.some(this.#checkIsChanged.bind(this)),
).length;
this.formChanged = changedRecordCount > 0 || this.errorValue;
@@ -131,14 +131,32 @@ export default class BulkFormController extends Controller {
});
}
+ // Check if changed, and mark with class if it is.
+ #checkIsChanged(element) {
+ if(!element.isConnected) return false;
+
+ const changed = this.#isChanged(element);
+ element.classList.toggle("changed", changed);
+ return changed;
+ }
+
#isChanged(element) {
- if (element.type == "checkbox") {
+ if (element.type == "checkbox") {
return element.defaultChecked !== undefined && element.checked != element.defaultChecked;
+
} else if (element.type == "select-one") {
+ // (weird) Behavior of select element's include_blank option in Rails:
+ // If a select field has include_blank option selected (its value will be ''),
+ // its respective option doesn't have the selected attribute
+ // but selectedOptions have that option present
const defaultSelected = Array.from(element.options).find((opt) =>
opt.hasAttribute("selected"),
);
- return element.selectedOptions[0] != defaultSelected;
+ const selectedOption = element.selectedOptions[0];
+ const areBothBlank = selectedOption.value === '' && defaultSelected === undefined
+
+ return !areBothBlank && selectedOption !== defaultSelected;
+
} else {
return element.defaultValue !== undefined && element.value != element.defaultValue;
}
diff --git a/app/webpacker/controllers/column_preferences_controller.js b/app/webpacker/controllers/column_preferences_controller.js
new file mode 100644
index 00000000000..9b55a961dc2
--- /dev/null
+++ b/app/webpacker/controllers/column_preferences_controller.js
@@ -0,0 +1,43 @@
+import { Controller } from "stimulus";
+
+// Manage column visibility according to checkbox selection
+//
+export default class ColumnPreferencesController extends Controller {
+ connect() {
+ this.table = document.querySelector('table[data-column-preferences-target="table"]');
+ this.cols = Array.from(this.table.querySelectorAll('col'));
+ this.colSpanCells = this.table.querySelectorAll('th[colspan],td[colspan]');
+ // Initialise data-default-col-span
+ this.colSpanCells.forEach((cell)=> {
+ cell.dataset.defaultColSpan ||= cell.colSpan;
+ });
+
+ this.checkboxes = Array.from(this.element.querySelectorAll("input[type=checkbox]"));
+ for (const element of this.checkboxes) {
+ // On initial load
+ this.#showHideColumn(element);
+ // On checkbox changed
+ element.addEventListener("change", this.#showHideColumn.bind(this));
+ }
+ }
+
+ // private
+
+ #showHideColumn(e) {
+ const element = e.target || e;
+ const name = element.dataset.columnName;
+
+ this.table.classList.toggle(`hide-${name}`, !element.checked);
+
+ // Reset cell colspans
+ const hiddenColCount = this.checkboxes.filter((checkbox)=> !checkbox.checked).length;
+ for(const cell of this.colSpanCells) {
+ const span = parseInt(cell.dataset.defaultColSpan, 10) - hiddenColCount;
+ cell.colSpan = span;
+ };
+ }
+
+ #showHideElement(element, show) {
+ element.style.display = show ? "" : "none";
+ }
+}
diff --git a/app/webpacker/controllers/dropdown_controller.js b/app/webpacker/controllers/dropdown_controller.js
index 844289e12c1..701fdf27a78 100644
--- a/app/webpacker/controllers/dropdown_controller.js
+++ b/app/webpacker/controllers/dropdown_controller.js
@@ -1,5 +1,6 @@
import { Controller } from "stimulus";
+// Close a element when click outside
export default class extends Controller {
connect() {
diff --git a/app/webpacker/controllers/form_controller.js b/app/webpacker/controllers/form_controller.js
index aaac9db4ecf..54354d340f5 100644
--- a/app/webpacker/controllers/form_controller.js
+++ b/app/webpacker/controllers/form_controller.js
@@ -2,6 +2,8 @@ import { Controller } from "stimulus";
export default class FormController extends Controller {
submit() {
- this.element.submit();
+ // Validate and submit the form, using the default submit button. Raises JS events.
+ // Ref: https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/requestSubmit
+ this.element.requestSubmit();
}
}
diff --git a/app/webpacker/controllers/open_street_map_controller.js b/app/webpacker/controllers/open_street_map_controller.js
new file mode 100644
index 00000000000..38103565df1
--- /dev/null
+++ b/app/webpacker/controllers/open_street_map_controller.js
@@ -0,0 +1,108 @@
+import { Controller } from "stimulus";
+import L from "leaflet";
+import LeafetProviders from "leaflet-providers";
+import { OpenStreetMapProvider } from 'leaflet-geosearch';
+
+export default class extends Controller {
+ static targets = ["confirmAddressField", "dragPinNote"];
+ static values = {
+ defaultLatitude: Number,
+ defaultLongitude: Number,
+ providerName: String,
+ providerOptions: Object
+ };
+
+ connect() {
+ this.zoomLevel = 6;
+ this.#displayMapWhenAtRegistrationDetailsStep();
+ }
+
+ disconnect() {
+ this.map.remove();
+ }
+
+ async locateAddress() {
+ const results = await this.provider.search({ query: this.#addressQuery() });
+ if(results.length > 0) {
+ const result = results[0];
+ this.#setLatitudeLongitude(result.y, result.x);
+ this.#addMarker(result.y, result.x);
+ this.map.setView([result.y, result.x], this.zoomLevel);
+ this.confirmAddressFieldTarget.style.display = "block";
+ this.dragPinNoteTarget.style.display = "block";
+ }
+ }
+
+ #addressQuery() {
+ const stateField = document.getElementById("enterprise_state");
+ const state = stateField.options[stateField.selectedIndex]?.label;
+ const countryField = document.getElementById("enterprise_country");
+ const country = countryField.options[countryField.selectedIndex]?.label;
+ const city = document.getElementById("enterprise_city")?.value;
+ const zipcode = document.getElementById("enterprise_zipcode")?.value;
+ const addressLine1 = document.getElementById("enterprise_address")?.value;
+ const addressLine2 = document.getElementById("enterprise_address2")?.value;
+
+ // If someone clicks the locate address on map button without filling in their address the
+ // geocoded address will not be very accurate so don't zoom in too close so it's easier for
+ // people to see where the marker is.
+ if(!addressLine1 && !city && !zipcode) {
+ this.zoomLevel = 6;
+ } else {
+ this.zoomLevel = 14;
+ }
+
+ return [addressLine1, addressLine2, city, state, zipcode, country].filter((value) => !!value).join(", ")
+ }
+
+ #addMarker(latitude, longitude) {
+ const icon = L.icon({ iconUrl: "/map_icons/map_003-producer-shop.svg" });
+ this.marker = L.marker([latitude, longitude], {
+ draggable: true,
+ icon: icon,
+ });
+
+ this.marker.on("dragend", (event) => {
+ const position = event.target.getLatLng();
+ this.#setLatitudeLongitude(position.lat, position.lng);
+ });
+
+ this.marker.addTo(this.map);
+ }
+
+ #displayMap() {
+ // Don't initialise map in test environment because that could possibly abuse OSM tile servers
+ if(process.env.RAILS_ENV == "test") {
+ return false;
+ }
+
+ this.map = L.map('open-street-map')
+ L.tileLayer.provider(this.providerNameValue, this.providerOptionsValue).addTo(this.map)
+ this.map.setView([this.defaultLatitudeValue, this.defaultLongitudeValue], this.zoomLevel)
+ this.provider = new OpenStreetMapProvider();
+ }
+
+ // The connect() method is called before the registration details step is visible, this
+ // causes the map tiles to render incorrectly. To fix this only display the map when the
+ // registration details step has been reached.
+ #displayMapWhenAtRegistrationDetailsStep() {
+ const observer = new IntersectionObserver(
+ ([intersectionObserverEntry]) => {
+ if(intersectionObserverEntry.target.offsetParent !== null) {
+ this.#displayMap();
+ observer.disconnect()
+ }
+ },
+ { threshold: [0] }
+ );
+ observer.observe(document.getElementById("registration-details"));
+ }
+
+ // The registration process uses Angular, set latitude and longitude data properties so the
+ // Angular RegistrationCtrl controller can read and add them to the parameters it uses to create
+ // new enterprises.
+ #setLatitudeLongitude(latitude, longitude) {
+ document.getElementById("open-street-map").dataset.latitude = latitude;
+ document.getElementById("open-street-map").dataset.longitude = longitude;
+ }
+}
diff --git a/app/webpacker/controllers/products_controller.js b/app/webpacker/controllers/products_controller.js
index 9ec3ac1a865..720b1813827 100644
--- a/app/webpacker/controllers/products_controller.js
+++ b/app/webpacker/controllers/products_controller.js
@@ -17,6 +17,14 @@ export default class extends ApplicationController {
this.hideLoading();
}
+ delete_product() {
+ this.#deleteByRecordType('product');
+ }
+
+ delete_variant() {
+ this.#deleteByRecordType('variant');
+ }
+
showLoading = () => {
if (this.getLoadingController()) {
this.getLoadingController().showLoading();
@@ -39,4 +47,46 @@ export default class extends ApplicationController {
"loading"
));
};
+
+ // +recordType+ can either be 'product' or 'variant'
+ #deleteByRecordType(recordType) {
+ const deletePath = document.querySelector(`#${recordType}-delete-modal #modal-confirm-button`).getAttribute('data-delete-path');
+ const elementToBeRemoved = this.#getElementToBeRemoved(deletePath, recordType);
+
+ const handleSlideOutAnimationEnd = async () => {
+ // in case of test env, we won't be having csrf token
+ const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
+
+ try {
+ const response = await fetch(deletePath, {
+ method: 'DELETE',
+ headers: {
+ Accept: 'text/vnd.turbo-stream.html',
+ 'X-CSRF-Token': csrfToken,
+ }
+ });
+ // need to render the turboStream message, that's why not throwing error here
+ if(response.status === 500) elementToBeRemoved.classList.remove('slide-out');
+
+ const responseTurboStream = await response.text();
+ Turbo.renderStreamMessage(responseTurboStream);
+ } catch(error) {
+ console.error(error.message);
+ elementToBeRemoved.classList.remove('slide-out');
+ }
+ finally {
+ elementToBeRemoved.removeEventListener('animationend', handleSlideOutAnimationEnd);
+ }
+ };
+
+ elementToBeRemoved.classList.add('slide-out');
+ elementToBeRemoved.addEventListener('animationend', handleSlideOutAnimationEnd);
+ };
+
+ #getElementToBeRemoved(path, recordType) {
+ const recordId = path.substring(path.lastIndexOf('/') + 1);
+ const elementDomId = `${recordType}_${recordId}`;
+
+ return document.getElementById(elementDomId);
+ };
}
diff --git a/app/webpacker/css/admin/components/input.scss b/app/webpacker/css/admin/components/input.scss
index 1c1a847e567..2b390bce6d1 100644
--- a/app/webpacker/css/admin/components/input.scss
+++ b/app/webpacker/css/admin/components/input.scss
@@ -6,32 +6,3 @@
}
}
}
-
-input[type="checkbox"].redesigned-input {
- position: relative;
- top: 1px;
- -moz-appearance: none;
- -webkit-appearance: none;
- -o-appearance: none;
- appearance: none;
- outline: none;
- content: none;
- cursor: pointer;
-
- &:before {
- font-family: "FontAwesome";
- content: "\f00c";
- font-size: 15px;
- color: transparent !important;
- background: transparent !important;
- display: block;
- width: 15px;
- height: 15px;
- border: 1px solid #809cb1;
- margin-right: 7px;
- }
-
- &:checked:before {
- color: $color-txt-text !important;
- }
-}
diff --git a/app/webpacker/css/admin/products_v3.scss b/app/webpacker/css/admin/products_v3.scss
index 8cb8ccbce2d..576e6d8af14 100644
--- a/app/webpacker/css/admin/products_v3.scss
+++ b/app/webpacker/css/admin/products_v3.scss
@@ -96,7 +96,8 @@
// "Naked" inputs. Row hover helps reveal them.
.naked_inputs {
- input:not([type="checkbox"]), .ts-control {
+ input:not([type="checkbox"]),
+ .ts-control {
background-color: $color-tbl-cell-bg;
}
}
@@ -170,16 +171,27 @@
.field {
padding: 0;
}
- .multi-field {
- // Allow wrap with small gap
- display: flex;
- flex-wrap: wrap;
- gap: 3px;
+
+ .fullwidth + .field {
+ // Assume wrap, so add small gap
+ margin-top: 3px;
}
.ts-control {
z-index: 0; // Avoid hovering over thead
}
+
+ // Hide columns
+ $columns:
+ "image", "name", "sku", "unit_scale", "unit", "price", "on_hand", "producer", "category",
+ "tax_category", "inherits_properties";
+ @each $col in $columns {
+ &.hide-#{$col} {
+ .col-#{$col} {
+ display: none;
+ }
+ }
+ }
}
#no-products {
@@ -215,6 +227,10 @@
display: none;
}
+ .pagination-description {
+ flex-grow: 1; // Grow to fill space
+ }
+
.with-dropdown {
display: flex;
justify-content: space-between;
@@ -222,7 +238,11 @@
gap: 10px;
}
.per-page {
- width: 10em;
+ width: 9em;
+ }
+
+ .column-preferences .ofn-drop-down-label {
+ width: 13em;
}
}
@@ -371,7 +391,7 @@
border-radius: $border-radius;
box-shadow: 0px 0px 8px 0px rgba($near-black, 0.25);
- .field{
+ .field {
margin-bottom: 0.75em;
&:last-child {
@@ -414,4 +434,19 @@
}
}
}
+
+ @keyframes slideOutLeft {
+ from {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ to {
+ transform: translateX(-100%);
+ opacity: 0;
+ }
+ }
+
+ .slide-out {
+ animation: slideOutLeft 0.5s forwards;
+ }
}
diff --git a/app/webpacker/css/admin_v3/components/dropdown.scss b/app/webpacker/css/admin_v3/components/dropdown.scss
index 8a101d1c8d9..6f8bd99c8a4 100644
--- a/app/webpacker/css/admin_v3/components/dropdown.scss
+++ b/app/webpacker/css/admin_v3/components/dropdown.scss
@@ -101,8 +101,6 @@
> span {
width: auto;
- text-transform: uppercase;
- font-size: 85%;
font-weight: 600;
}
@@ -113,7 +111,7 @@
top: 100%;
left: 0px;
padding: 5px 0px;
- border: 1px solid #adadad;
+ border-radius: $border-radius;
background-color: #ffffff;
box-shadow: 1px 3px 10px #888888;
z-index: 100;
@@ -181,6 +179,25 @@
}
}
+ summary:after {
+ content: "\f078";
+ font-family: FontAwesome;
+ position: relative;
+ top: 3px;
+ font-size: 13px;
+ }
+
+
+ &[open] >,
+ details[open] > {
+ summary:after {
+ content: "\f077";
+ font-family: FontAwesome;
+ }
+ }
+}
+
+.ofn-drop-down:not(.ofn-dropdown-v2) {
> details {
margin: -7px -15px;
padding: 7px 15px;
@@ -190,21 +207,14 @@
display: inline-block;
list-style: none;
width: auto;
- text-transform: uppercase;
- font-size: 85%;
- font-weight: 600;
margin: -8px -15px;
padding: 8px 15px;
- }
-
- > details > summary:after {
- content: "\f0d7";
- font-family: FontAwesome;
- }
- > details[open] > summary:after {
- content: "\f0d8";
- font-family: FontAwesome;
+ &:after {
+ position: relative;
+ top: -1px;
+ font-size: 12px;
+ }
}
}
@@ -212,8 +222,11 @@
border: 1px solid $lighter-grey;
background-color: $lighter-grey;
padding: 0px;
+ line-height: normal;
+ @include border-radius($border-radius);
- &:hover {
+ &:hover,
+ &.expanded {
border-color: $lighter-grey;
}
@@ -263,17 +276,22 @@
cursor: pointer;
padding-top: 4px;
padding-bottom: 5px;
- text-transform: uppercase;
- font-size: 85%;
+ font-size: inherit;
+
+ // Align checkbox and text
+ & > * {
+ vertical-align: middle;
+ }
}
}
-}
-.ofn-drop-down.ofn-drop-down-v2 {
- // Add very specific styling here for components that are in transition:
- // ie. the ones using the two classes above
- .ofn-drop-down-label {
- padding-top: 7px;
- padding-bottom: 7px;
+ .actions {
+ margin-top: 5px;
+ margin-right: 15px; // Compensate for scrollbar on menu_items
+ padding: 2px 10px;
+
+ &:hover {
+ background-color: inherit;
+ }
}
}
diff --git a/app/webpacker/css/admin_v3/components/tom_select.scss b/app/webpacker/css/admin_v3/components/tom_select.scss
index ddae48cd71c..5f0eb481e21 100644
--- a/app/webpacker/css/admin_v3/components/tom_select.scss
+++ b/app/webpacker/css/admin_v3/components/tom_select.scss
@@ -194,6 +194,13 @@
}
}
+// Errors
+.field_with_errors .ts-wrapper {
+ .ts-control {
+ border-color: $color-error;
+ }
+}
+
// Display as "changed" if sibling select is marked as changed.
select.changed + .ts-wrapper {
&.single, &.multi {
diff --git a/app/webpacker/js/turbo.js b/app/webpacker/js/turbo.js
new file mode 100644
index 00000000000..4451810c939
--- /dev/null
+++ b/app/webpacker/js/turbo.js
@@ -0,0 +1,14 @@
+import "@hotwired/turbo";
+
+document.addEventListener("turbo:frame-missing", (event) => {
+ // don't replace frame contents
+ event.preventDefault();
+
+ // show error message instead
+ status = event.detail.response.status;
+ if(status == 401) {
+ alert(I18n.t("errors.unauthorized.message"));
+ } else {
+ alert(I18n.t("errors.general_error.message"));
+ }
+});
diff --git a/app/webpacker/packs/admin.js b/app/webpacker/packs/admin.js
index 81735d3040d..dbb68bafc29 100644
--- a/app/webpacker/packs/admin.js
+++ b/app/webpacker/packs/admin.js
@@ -1,6 +1,6 @@
import "controllers";
import "channels";
-import "@hotwired/turbo";
+import "../js/turbo";
import "../js/hotkeys";
import "../js/mrujs";
import "../js/matomo";
@@ -17,3 +17,4 @@ import Trix from "trix";
document.addEventListener("trix-file-accept", (event) => {
event.preventDefault();
});
+
diff --git a/app/webpacker/packs/application.js b/app/webpacker/packs/application.js
index 5ee6a3b0660..f8263d1830a 100644
--- a/app/webpacker/packs/application.js
+++ b/app/webpacker/packs/application.js
@@ -1,5 +1,5 @@
import "controllers";
-import "@hotwired/turbo";
+import "../js/turbo";
import "../js/hotkeys";
import "../js/mrujs";
import "../js/matomo";
diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb
index 4a4aecaf259..446ac3ee703 100644
--- a/config/initializers/flipper.rb
+++ b/config/initializers/flipper.rb
@@ -2,8 +2,23 @@
require "flipper/adapters/active_record"
require "open_food_network/feature_toggle"
-Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? }
+Rails.application.configure do
+ # Disable Flipper's built-in test helper.
+ # It fails in CI and feature don't get activated.
+ config.flipper.test_help = false
+end
+
+Flipper.configure do |flipper|
+ # Still use recommended test setup with faster memory adapter:
+ if Rails.env.test?
+ # Use a shared Memory adapter for all tests. The adapter is instantiated
+ # outside of the block so the same instance is returned in new threads.
+ adapter = Flipper::Adapters::Memory.new
+ flipper.adapter { adapter }
+ end
+end
+Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? }
Flipper::UI.configure do |config|
config.descriptions_source = ->(_keys) do
# return has to be hash of {String key => String description}
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index be4307484d6..c8b774b0704 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -477,6 +477,7 @@ ar:
edit: تعديل
clone: استنساخ
delete: حذف
+ remove: إزالة
image:
edit: تعديل
adjustments:
@@ -706,8 +707,12 @@ ar:
clear_search: مسح البحث
table:
new_variant: نوع جديد
- edit_image:
- close: عودة
+ variant_row:
+ none_tax_category: لا شيء
+ category_field_name: "الفئة"
+ tax_category_field_name: "الفئة الضريبية"
+ product_row:
+ producer_field_name: "المنتج"
product_import:
title: استيراد المنتج
file_not_found: لم يتم العثور على الملف أو تعذر فتحه
@@ -1127,7 +1132,16 @@ ar:
add_new: اضف جديد
no_voucher_yet: لا قسائم حتى الآن
connected_apps:
+ tagline: "By clicking ‘Allow data sharing’, you are sharing data between Open Food Network and the Discover Regenerative Portal, and agreeing to make specific data public on the Portal, which will also be publicly available on the API.\nIMPORTANT: Before you stop sharing and remove your listing, please first contact hello@regenerative.org.au to request a copy of your Discover Regenerative data."
loading: "جار التحميل"
+ description_html: |
+
+ Discover Regenerative is a showcase of Australia’s Regenerative Farmers, their produce/products, outcomes and achievements. It simplifies how business-to-business (B2B) / wholesale buyers can find regenerative produce and directly connect with Producers.
+
+
+ Visit Discover Regenerative
+
+
actions:
edit_profile: الإعدادات
properties: الخصائص
@@ -1881,7 +1895,6 @@ ar:
label_account: "الحساب"
label_more: "أظهر المزيد"
label_less: "عرض أقل"
- label_notices: "إشعارات"
cart_items: "العناصر"
cart_headline: "سلة التسوق الخاصة بك"
total: "مجموع"
@@ -3828,6 +3841,9 @@ ar:
validation:
must_be_int: "يجب أن يكون رقما صحيحا"
admin:
+ images:
+ edit:
+ close: عودة
mail_methods:
send_testmail: "إرسال بريد إلكتروني تجريبي"
testmail:
@@ -3855,6 +3871,10 @@ ar:
customers: "العملاء"
groups: "مجموعات"
oidc_settings: "إعدادات OIDC"
+ overview: "نظرة عامة"
+ product_import: "استيراد"
+ enterprise_roles: "الأدوار"
+ payment_methods: "طرق الدفع"
product_properties:
index:
inherits_properties_checkbox_hint: "وراثة الخصائص من %{supplier}؟ (ما لم يتم تجاوزه أعلاه)"
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 1522484fc1e..4a1c94853e2 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -108,7 +108,8 @@ ca:
message_html: "Si us plau, torna a provar Pot ser un problema temporal. Si us plau, clica al botó de tornar enrere per a tornar a la pantalla anterior o torna a l'Inici i prova una altra vegada.
Ho estem intentant Si has vist aquest problema abans, probablement ja estem assabentats i estem treballant per a solucionar-lo. Registrem tots els errors que apareixen.
Contacte de suport Si el problema persisteix o és urgent, si us plau informa'ns. Busca com fer-ho a la pàgina Open Food Network Local.
Ens ajuda molt que ens proporcionis tants detalls com sigui possible de què estaves fent quan es va aparèixer aquest error.
"
unprocessable_entity:
message_html: "El canvi que volies va ser rebutjat. Potser heu intentat canviar alguna cosa a la qual no teniu accés.
"
- stimulus_reflex_error: "Ens sap greu, però alguna cosa ha anat malament.\n\n Pot ser que sigui un problema temporal, així que si us plau, torna-ho a provar o torna a carregar la pàgina.\n Enregistrem tots els errors i és possible que estiguem treballant en una solució.\n Si el problema persisteix o és urgent, poseu-vos en contacte amb nosaltres."
+ general_error:
+ message: "Ens sap greu, però alguna cosa ha anat malament.\n\n Pot ser que sigui un problema temporal, així que si us plau, torna-ho a provar o torna a carregar la pàgina.\n Enregistrem tots els errors i és possible que estiguem treballant en una solució.\n Si el problema persisteix o és urgent, poseu-vos en contacte amb nosaltres."
stripe:
error_code:
incorrect_number: "El número de la targeta és incorrecte."
@@ -504,6 +505,7 @@ ca:
edit: Editar
clone: Clonar
delete: Suprimir
+ remove: Eliminar
image:
edit: Editar
adjustments:
@@ -725,6 +727,7 @@ ca:
index:
header:
title: Edició de productes en bloc
+ content:
loading: Carregant els vostres productes
delete_modal:
delete_product_modal:
@@ -770,8 +773,12 @@ ca:
new_variant: Nova variant
bulk_update:
success: Canvis guardats
- edit_image:
- close: Enrere
+ variant_row:
+ none_tax_category: Cap
+ category_field_name: "Categoria"
+ tax_category_field_name: "Categoria d'impostos"
+ product_row:
+ producer_field_name: "Productora"
product_import:
title: Importació de productes
file_not_found: No s'ha trobat el fitxer o no s'ha pogut obrir
@@ -1897,7 +1904,6 @@ ca:
label_account: "Compte"
label_more: "Mostrar més"
label_less: "Mostra menys"
- label_notices: "Avisos"
cart_items: "articles"
cart_headline: "La teva cistella"
total: "Total"
@@ -3710,6 +3716,9 @@ ca:
validation:
must_be_int: "ha de ser un nombre enter"
admin:
+ images:
+ edit:
+ close: Enrere
mail_methods:
send_testmail: "Enviar correu electrònic de prova"
testmail:
@@ -3736,6 +3745,10 @@ ca:
enterprise_relationships: "Permisos"
customers: "Consumidores"
groups: "Grups"
+ overview: "Visió general"
+ product_import: "Importa"
+ enterprise_roles: "Rols"
+ payment_methods: "Mètodes de Pagament"
product_properties:
index:
inherits_properties_checkbox_hint: "heredar propietats de %{supplier}? (llevat que es sobreescrigui a dalt)"
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 2d774a500f9..f6c7a9260e5 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -137,7 +137,8 @@ cy:
unprocessable_entity:
title: "Gwrthodwyd y newid roeddech chi am ei wneud (422)"
message_html: "Gwrthodwyd y newid roeddech chi am ei wneud. Hwyrach ichi geisio newid rhywbeth nad oes gennych fynediad ato.
"
- stimulus_reflex_error: "Mae’n ddrwg gennym, ond aeth rhywbeth o’i le. \n\nGall fod yn broblem dros dro, felly gofynnir ichi roi cynnig arall neu ail-lwytho’r dudalen.\n Byddwn yn cofnodi pob gwall, a hwyrach ein bod yn gweithio i’w datrys. \nOs bydd y broblem yn parhau, neu os taw mater brys yw, cysylltwch â ni."
+ general_error:
+ message: "Mae’n ddrwg gennym, ond aeth rhywbeth o’i le. \n\nGall fod yn broblem dros dro, felly gofynnir ichi roi cynnig arall neu ail-lwytho’r dudalen.\n Byddwn yn cofnodi pob gwall, a hwyrach ein bod yn gweithio i’w datrys. \nOs bydd y broblem yn parhau, neu os taw mater brys yw, cysylltwch â ni."
stripe:
error_code:
incorrect_number: "Mae rhif y cerdyn yn anghywir"
@@ -534,6 +535,7 @@ cy:
edit: Golygu
clone: Clôn
delete: Dileu
+ remove: Dileu
image:
edit: Golygu
adjustments:
@@ -755,6 +757,7 @@ cy:
index:
header:
title: Cynhyrchion Golygu Swmp
+ content:
loading: Yn llwytho eich cynnyrch
delete_modal:
delete_product_modal:
@@ -802,16 +805,18 @@ cy:
new_variant: Amrywiolyn newydd
bulk_update:
success: Cadwyd y newidiadau
- edit_image:
- title: Golygu llun y cynnyrch
- close: Yn ôl
- upload: Lanlwytho llun
delete_product:
success: Llwyddwyd i ddileu’r cynnyrch
error: Yn methu dileu’r cynnyrch
delete_variant:
success: Llwyddwyd i ddileu’r amrywiolyn
error: Yn methu dileu’r amrywiolyn
+ variant_row:
+ none_tax_category: Dim
+ category_field_name: "Categori"
+ tax_category_field_name: "Categori Treth"
+ product_row:
+ producer_field_name: "Cynhyrchydd"
product_import:
title: Mewnforio Cynnyrch
file_not_found: Ni ddaethpwyd o hyd i ffeil neu ni ellid ei hagor
@@ -2030,7 +2035,6 @@ cy:
label_account: "Cyfrif"
label_more: "Dangos mwy"
label_less: "Dangos llai"
- label_notices: "Hysbysiadau"
cart_items: "eitemau"
cart_headline: "Eich troli siopa"
total: "Cyfanswm"
@@ -3951,6 +3955,11 @@ cy:
validation:
must_be_int: "mae'n rhaid cael cyfanrif"
admin:
+ images:
+ edit:
+ title: Golygu llun y cynnyrch
+ close: Yn ôl
+ upload: Lanlwytho llun
mail_methods:
send_testmail: "Anfon ebost prawf"
testmail:
@@ -3978,6 +3987,10 @@ cy:
customers: "Cwsmeriaid"
groups: "Grwpiau"
oidc_settings: "OIDC Settings"
+ overview: "Trosolwg"
+ product_import: "Mewnforio"
+ enterprise_roles: "Rolau"
+ payment_methods: "Dulliau Talu"
product_properties:
index:
inherits_properties_checkbox_hint: "Etifeddu eiddo gan %{supplier}? (oni bai ei fod yn cael ei ddiystyru uchod)"
diff --git a/config/locales/de_CH.yml b/config/locales/de_CH.yml
index 64385cd440c..4417189b699 100644
--- a/config/locales/de_CH.yml
+++ b/config/locales/de_CH.yml
@@ -471,6 +471,7 @@ de_CH:
edit: Bearbeiten
clone: Duplizieren
delete: Löschen
+ remove: Löschen
image:
edit: Bearbeiten
adjustments:
@@ -697,8 +698,12 @@ de_CH:
no_products_found: Keine Produkte gefunden.
table:
new_variant: Neue Produktvariante
- edit_image:
- close: Zurück
+ variant_row:
+ none_tax_category: Keine
+ category_field_name: "Kategorie"
+ tax_category_field_name: "Steuerkategorie"
+ product_row:
+ producer_field_name: "Produzent"
product_import:
title: Produkte importieren
file_not_found: Die Datei konnte nicht gefunden oder nicht geöffnet werden.
@@ -1099,6 +1104,7 @@ de_CH:
email_confirmed: "E-Mail-Adresse bestätigt"
email_not_confirmed: "E-Mail-Adresse nicht bestätigt"
vouchers:
+ voucher_code: Gutschein-Code
rate: Steuersatz
customers: Kunde
active: Aktiv?
@@ -1534,6 +1540,7 @@ de_CH:
new:
back: Zurück
save: Speichern
+ voucher_code: Gutschein-Code
voucher_amount: Betrag
controllers:
enterprises:
@@ -1619,6 +1626,10 @@ de_CH:
explaination: Sie können Ihre Bestellung im nächsten Schritt überprüfen und die endgültigen Kosten bestätigen.
submit: Weiter - Bestellübersicht
cancel: Zurück - Ihre Daten
+ voucher:
+ apply_voucher: Gutschein einlösen
+ apply: Einlösen
+ placeholder: Gutschein-Code eingeben
step3:
delivery_details:
title: Lieferdetails
@@ -1729,6 +1740,7 @@ de_CH:
abn: "MWST nr."
acn: "St.-Nr.:"
invoice_issued_on: "Rechnungsdatum:"
+ order_number: "Bestellnummer:"
date_of_transaction: "Bestelldatum:"
menu_1_title: "Einkaufen"
menu_1_url: "/shops"
@@ -1811,7 +1823,6 @@ de_CH:
label_account: "Konto"
label_more: "Mehr anzeigen"
label_less: "Weniger anzeigen"
- label_notices: "Ankündigungen"
cart_items: "Artikel"
cart_headline: "Ihr Warenkorb"
total: "Summe"
@@ -2684,6 +2695,7 @@ de_CH:
report_header_total_tax: "Summe Steuern (%{currency_symbol})"
report_header_total_excl_tax: "Summe exkl. Steuern (%{currency_symbol})"
report_header_total_incl_tax: "Summe inkl. Steuern (%{currency_symbol})"
+ report_header_total_orders: "Anzahl der Bestellungen"
report_header_enterprise: Unternehmen
report_header_enterprise_fee_name: Name
report_header_enterprise_fee_type: Art
@@ -3632,6 +3644,9 @@ de_CH:
validation:
must_be_int: "muss eine ganze Zahl sein"
admin:
+ images:
+ edit:
+ close: Zurück
mail_methods:
send_testmail: "Test-E-Mail senden"
testmail:
@@ -3658,6 +3673,10 @@ de_CH:
enterprise_relationships: "Berechtigungen"
customers: "Kunden"
groups: "Gruppen"
+ overview: "Einführung"
+ product_import: "Importieren"
+ enterprise_roles: "Rollen"
+ payment_methods: "Zahlungsarten"
product_properties:
index:
inherits_properties_checkbox_hint: "Übernahme der Eigenschaften von %{supplier} (ausser oben überschrieben)?"
@@ -3747,6 +3766,7 @@ de_CH:
from: "Von"
to: "Rechnungsempfänger"
shipping: "Lieferung"
+ order_number: "Bestellnummer"
payments_list:
date_time: "Datum/Uhrzeit"
payment_method: "Zahlungsart"
diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml
index fde7a15eb12..de859639d50 100644
--- a/config/locales/de_DE.yml
+++ b/config/locales/de_DE.yml
@@ -137,7 +137,8 @@ de_DE:
unprocessable_entity:
title: "Die gewünschte Änderung wurde abgelehnt (422). "
message_html: "Die gewünschte Änderung wurde abgelehnt. Vielleicht haben Sie versucht, etwas zu ändern, auf das Sie keinen Zugriff haben.
"
- stimulus_reflex_error: "Es tut uns leid, etwas ist schief gelaufen. \n\nDies könnte ein vorübergehendes Problem sein. Bitte versuchen Sie es erneut oder laden Sie die Seite neu. \nWir erfassen alle Fehler und arbeiten möglicherweise bereits an einer Lösung. \nWenn das Problem weiterhin besteht oder Ihr Anliegen dringend ist, kontaktieren Sie uns bitte."
+ general_error:
+ message: "Es tut uns leid, etwas ist schief gelaufen. \n\nDies könnte ein vorübergehendes Problem sein. Bitte versuchen Sie es erneut oder laden Sie die Seite neu. \nWir erfassen alle Fehler und arbeiten möglicherweise bereits an einer Lösung. \nWenn das Problem weiterhin besteht oder Ihr Anliegen dringend ist, kontaktieren Sie uns bitte."
stripe:
error_code:
incorrect_number: "Die Kreditkartennummer ist fehlerhaft."
@@ -534,6 +535,7 @@ de_DE:
edit: Bearbeiten
clone: Duplizieren
delete: Löschen
+ remove: Löschen
image:
edit: Bearbeiten
adjustments:
@@ -755,6 +757,7 @@ de_DE:
index:
header:
title: Produkte verwalten
+ content:
loading: Produkte werden geladen...
filters:
search_products: Nach Produkten suchen
@@ -792,8 +795,12 @@ de_DE:
new_variant: Neue Produktvariante
bulk_update:
success: Die Änderungen wurden gespeichert.
- edit_image:
- close: Zurück
+ variant_row:
+ none_tax_category: Nichts
+ category_field_name: "Kategorie"
+ tax_category_field_name: "Steuerkategorie"
+ product_row:
+ producer_field_name: "Produzent"
product_import:
title: Produkte importieren
file_not_found: Die Datei konnte nicht gefunden oder nicht geöffnet werden.
@@ -2013,7 +2020,6 @@ de_DE:
label_account: "Konto"
label_more: "Mehr anzeigen"
label_less: "Weniger anzeigen"
- label_notices: "Ankündigungen"
cart_items: "Artikel"
cart_headline: "Ihr Warenkorb"
total: "Summe"
@@ -3890,6 +3896,9 @@ de_DE:
validation:
must_be_int: "muss eine ganze Zahl sein"
admin:
+ images:
+ edit:
+ close: Zurück
mail_methods:
send_testmail: "Test-E-Mail senden"
testmail:
@@ -3917,6 +3926,10 @@ de_DE:
customers: "Kunden"
groups: "Gruppen"
oidc_settings: "OIDC-Einstellungen"
+ overview: "Übersicht"
+ product_import: "Importieren"
+ enterprise_roles: "Rollen"
+ payment_methods: "Zahlungsarten"
product_properties:
index:
inherits_properties_checkbox_hint: "Übernahme der Eigenschaften von %{supplier} (außer oben überschrieben)?"
diff --git a/config/locales/el.yml b/config/locales/el.yml
index f8e2a3864d5..9d86099491a 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -384,6 +384,7 @@ el:
edit: Επεξεργασία
clone: Κλώνος
delete: Διαγραφή
+ remove: Αφαίρεση
image:
edit: Επεξεργασία
adjustments:
@@ -592,8 +593,12 @@ el:
producers:
label: Παραγωγοί
search: Αναζήτηση
- edit_image:
- close: Πίσω
+ variant_row:
+ none_tax_category: Κανένας
+ category_field_name: "Κατηγορία"
+ tax_category_field_name: "Φορολογική Κατηγορία"
+ product_row:
+ producer_field_name: "Παραγωγός"
product_import:
title: Είσαγωγή Προϊόντος
file_not_found: Το αρχείο δεν βρέθηκε ή δεν μπόρεσε να φορτωθεί
@@ -1561,7 +1566,6 @@ el:
label_account: "Λογαριασμός"
label_more: "Εμφάνισε κι άλλα"
label_less: "Εμφάνισε λιγότερα"
- label_notices: "Ειδοποίηση"
cart_items: "προϊόντα"
cart_headline: "Το καλάθι αγορών σου"
total: "Σύνολο"
@@ -3258,6 +3262,9 @@ el:
validation:
must_be_int: "πρέπει να είναι ακέραιος"
admin:
+ images:
+ edit:
+ close: Πίσω
mail_methods:
send_testmail: "Αποστολή δοκιμαστικού email"
testmail:
@@ -3284,6 +3291,8 @@ el:
enterprise_relationships: "Άδειες"
customers: "Πελάτες"
groups: "Ομάδες"
+ product_import: "Εισαγωγή"
+ payment_methods: "Τρόποι πληρωμής"
product_properties:
index:
inherits_properties_checkbox_hint: "Κληρονομεί ιδιότητες από %{supplier}; (εκτός αν παρακαμφθεί παραπάνω)"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index e20236b1d9a..e4be4f68434 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -29,6 +29,8 @@ en:
spree/product: Product
spree/shipping_method: Shipping Method
attributes:
+ spree/image:
+ attachment: Attachment
spree/order/ship_address:
address1: "Shipping address (Street + House number)"
address2: "Shipping address line 2"
@@ -175,14 +177,15 @@ en:
message_html: "The change you wanted was rejected. Maybe you tried to change something you don't have access to.
"
- stimulus_reflex_error: "We're sorry, but something went wrong.
+ general_error:
+ message: "We're sorry, but something went wrong.
- This might be a temporary problem, so please try again or reload the page.
+ This might be a temporary problem, so please try again or reload the page.
- We record all errors and may be working on a fix.
+ We record all errors and may be working on a fix.
- If the problem persists or is urgent, please contact us."
+ If the problem persists or is urgent, please contact us."
stripe:
error_code:
incorrect_number: "The card number is incorrect."
@@ -570,6 +573,7 @@ en:
per_page: "%{count} items per page"
colums: Columns
columns:
+ image: Image
name: Name
unit_scale: Unit scale
unit: Unit
@@ -600,6 +604,7 @@ en:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
adjustments:
@@ -659,7 +664,7 @@ en:
choose: "Choose..."
please_select: Please select...
- column_save_as_default: Save As Default
+ column_save_as_default: Save as default
columns: Columns
actions: Actions
viewing: "Viewing: %{current_view_name}"
@@ -758,6 +763,9 @@ en:
balance_due: "Balance Due"
destroy:
has_associated_subscriptions: "Delete failed: This customer has active subscriptions. Cancel them first."
+ column_preferences:
+ bulk_update:
+ success: "Column preferences saved"
contents:
edit:
title: Content
@@ -897,10 +905,6 @@ en:
new_variant: New variant
bulk_update:
success: Changes saved
- edit_image:
- title: Edit product photo
- close: Back
- upload: Upload photo
delete_product:
success: Successfully deleted the product
error: Unable to delete the product
@@ -909,6 +913,11 @@ en:
error: Unable to delete the variant
variant_row:
none_tax_category: None
+ search_for_tax_categories: "Search for tax categories"
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1058,6 +1067,7 @@ en:
edit:
order_sure_want_to: Are you sure you want to %{event} this order?
voucher_tax_included_in_price: "%{label} (tax included in voucher)"
+ tax_on_fees: "Tax on fees"
invoice_email_sent: 'Invoice email has been sent'
order_email_resent: 'Order email has been resent'
bulk_management:
@@ -1350,6 +1360,7 @@ en:
enable: "Allow data sharing"
disable: "Stop sharing"
loading: "Loading"
+ need_to_be_manager: "Only managers can connect apps."
note: |
Your Open Food Network account is connected to Discover Regenerative.
Add or update information on your Discover Regenerative listing here.
@@ -2185,7 +2196,6 @@ en:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
@@ -4141,6 +4151,11 @@ See the %{link} to find out more about %{sitename}'s features and to start using
must_be_int: "must be an integer"
admin:
+ images:
+ edit:
+ title: Edit product photo
+ close: Back
+ upload: Upload photo
mail_methods:
send_testmail: "Send test email"
testmail:
@@ -4168,6 +4183,10 @@ See the %{link} to find out more about %{sitename}'s features and to start using
customers: "Customers"
groups: "Groups"
oidc_settings: "OIDC Settings"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_AU.yml b/config/locales/en_AU.yml
index 553225c8464..4c1fa3fd903 100644
--- a/config/locales/en_AU.yml
+++ b/config/locales/en_AU.yml
@@ -346,6 +346,7 @@ en_AU:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
begins_at: Begins At
@@ -556,8 +557,12 @@ en_AU:
clear_search: Clear search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -939,7 +944,16 @@ en_AU:
customers: Customer
active: Active?
connected_apps:
+ tagline: "By clicking ‘Allow data sharing’, you are sharing data between Open Food Network and the Discover Regenerative Portal, and agreeing to make specific data public on the Portal, which will also be publicly available on the API.\nIMPORTANT: Before you stop sharing and remove your listing, please first contact hello@regenerative.org.au to request a copy of your Discover Regenerative data."
loading: "Loading"
+ description_html: |
+
+ Discover Regenerative is a showcase of Australia’s Regenerative Farmers, their produce/products, outcomes and achievements. It simplifies how business-to-business (B2B) / wholesale buyers can find regenerative produce and directly connect with Producers.
+
+
+ Visit Discover Regenerative
+
+
actions:
edit_profile: Settings
properties: Properties
@@ -1583,7 +1597,6 @@ en_AU:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3306,6 +3319,9 @@ en_AU:
header:
store: Store
admin:
+ images:
+ edit:
+ close: Back
subscriptions:
number: "Number"
tab:
@@ -3326,6 +3342,10 @@ en_AU:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_BE.yml b/config/locales/en_BE.yml
index 3eedba8b4ee..a46d2ec8072 100644
--- a/config/locales/en_BE.yml
+++ b/config/locales/en_BE.yml
@@ -320,6 +320,7 @@ en_BE:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
begins_at: Begins At
@@ -517,8 +518,12 @@ en_BE:
search: Search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1468,7 +1473,6 @@ en_BE:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3023,6 +3027,9 @@ en_BE:
header:
store: Store
admin:
+ images:
+ edit:
+ close: Back
subscriptions:
number: "Number"
tab:
@@ -3043,6 +3050,10 @@ en_BE:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_CA.yml b/config/locales/en_CA.yml
index 29a11fa88f7..58e7bfb041a 100644
--- a/config/locales/en_CA.yml
+++ b/config/locales/en_CA.yml
@@ -141,7 +141,8 @@ en_CA:
unprocessable_entity:
title: "The change you wanted was rejected (422)"
message_html: "The change you wanted was rejected. Maybe you tried to change something you don't have access to.
"
- stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all erros and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
+ general_error:
+ message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all erros and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
stripe:
error_code:
incorrect_number: "The card number is incorrect."
@@ -222,12 +223,16 @@ en_CA:
not_available_to_shop: "is not available to %{shop}"
card_details: "Card details"
card_type: "Card type"
+ card_type_is: "Card type is"
+ unrecognized_card_type: "Unrecognized card type"
+ use_new_cc: "Use a new credit card"
+ what_is_this: "What is this?"
cardholder_name: "Cardholder name"
community_forum_url: "Community forum URL"
customer_instructions: "Customer instructions"
additional_information: "Additional information"
connect_app:
- url: "https://n8n.opernfoodnetwork.org/webhook/regen-CAN/connect-enterprise"
+ url: "https://n8n.openfoodnetwork.org/webhook/foodjustice/connect-enterprise"
devise:
passwords:
spree_user:
@@ -546,6 +551,7 @@ en_CA:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
adjustments:
@@ -650,6 +656,7 @@ en_CA:
status: Status
ok: Ok
instance_secret_key: Instance Secret Key
+ instance_publishable_key: Instance Publishable Key
account_id: Account ID
business_name: Business Name
charges_enabled: Charges Enabled
@@ -771,6 +778,7 @@ en_CA:
index:
header:
title: Bulk Edit Products
+ content:
loading: Loading your products
delete_modal:
delete_product_modal:
@@ -821,16 +829,19 @@ en_CA:
new_variant: New variant
bulk_update:
success: Changes saved
- edit_image:
- title: Edit product photo
- close: Back
- upload: Upload photo
delete_product:
success: Successfully deleted the product
error: Unable to delete the product
delete_variant:
success: Successfully deleted the variant
error: Unable to delete the variant
+ variant_row:
+ none_tax_category: None
+ search_for_tax_categories: "Search for tax categories"
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1269,8 +1280,8 @@ en_CA:
custom_tab_content: "Content for custom tab"
connected_apps:
legend: "Connected apps"
- title: "Discover Regenerative"
- tagline: "Allow Discover Regenerative to publish your enterprise information."
+ title: "Discover Food Justice"
+ tagline: "Allow OFN Canada to publish your enterprise information."
enable: "Allow data sharing"
disable: "Stop sharing"
loading: "Loading"
@@ -1279,15 +1290,12 @@ en_CA:
Add or update information on your Discover Regenerative listing here.
link_label: "Manage listing"
description_html: |
-
- Eligible producers can showcase their regenerative credentials,
- farming practices, and more through a profile listing.
- This simplifies how buyers can find regenerative products and connect
- with producers of interest.
+
+ Eligible producers can showcase call to actions to Volunteer Local, Buy Local, or Donate Local.
+ This simplifies how producers can connect in the Waterloo region around food justice and sovereignty.
- Learn more about Discover Regenerative
+ Learn more about the Waterloo Food Commons Project
actions:
@@ -2080,7 +2088,6 @@ en_CA:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -2492,6 +2499,7 @@ en_CA:
orders_bought_already_confirmed: "* already confirmed"
orders_confirm_cancel: "Are you sure you want to cancel this order?"
order_processed_successfully: "Your order has been processed successfully"
+ thank_you_for_your_order: "Thank you for your order"
products_cart_distributor_choice: "Distributor for your order:"
products_cart_distributor_change: "Your distributor for this order will be changed to %{name} if you add this product to your cart."
products_cart_distributor_is: "Your distributor for this order is %{name}."
@@ -3715,6 +3723,7 @@ en_CA:
editing_tax_category: "Editing tax category"
editing_tax_rate: "Editing tax rate"
editing_zone: "Editing zone"
+ editing_state: "Editing Province"
expiration: "Expiration"
invalid_payment_provider: "Invalid payment provider"
items_cannot_be_shipped: "Items cannot be shipped"
@@ -3753,6 +3762,7 @@ en_CA:
resend: "Resend"
back_to_orders_list: "Back to Orders List"
back_to_payments_list: "Back To Payments List"
+ back_to_states_list: "Back To Provinces List"
return_authorizations: "Return Authoriations"
cannot_create_returns: "Cannot create returns as this order has no shipped units"
select_stock: "Select stock"
@@ -3955,6 +3965,11 @@ en_CA:
validation:
must_be_int: "must be an integer"
admin:
+ images:
+ edit:
+ title: Edit product photo
+ close: Back
+ upload: Upload photo
mail_methods:
send_testmail: "Send test email"
testmail:
@@ -3982,6 +3997,10 @@ en_CA:
customers: "Customers"
groups: "Groups"
oidc_settings: "OIDC Settings"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_DE.yml b/config/locales/en_DE.yml
index 80ac27c6ed4..9168b2148ab 100644
--- a/config/locales/en_DE.yml
+++ b/config/locales/en_DE.yml
@@ -325,6 +325,7 @@ en_DE:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
begins_at: Begins At
@@ -522,8 +523,12 @@ en_DE:
search: Search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1478,7 +1483,6 @@ en_DE:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3036,6 +3040,9 @@ en_DE:
header:
store: Store
admin:
+ images:
+ edit:
+ close: Back
subscriptions:
number: "Number"
tab:
@@ -3056,6 +3063,10 @@ en_DE:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_FR.yml b/config/locales/en_FR.yml
index 1a50fd62679..3212f8e7bf0 100644
--- a/config/locales/en_FR.yml
+++ b/config/locales/en_FR.yml
@@ -141,7 +141,8 @@ en_FR:
unprocessable_entity:
title: "The change you wanted was rejected (422)"
message_html: " The change you wanted was rejected. Maybe you tried to change something you don't have access to.
"
- stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
+ general_error:
+ message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
stripe:
error_code:
incorrect_number: "The card number is incorrect."
@@ -550,6 +551,7 @@ en_FR:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
adjustments:
@@ -776,6 +778,7 @@ en_FR:
index:
header:
title: Bulk Edit Products
+ content:
loading: Loading your products
delete_modal:
delete_product_modal:
@@ -826,16 +829,19 @@ en_FR:
new_variant: New variant
bulk_update:
success: Changes saved
- edit_image:
- title: Edit product photo
- close: Back
- upload: Upload photo
delete_product:
success: Successfully deleted the product
error: Unable to delete the product
delete_variant:
success: Successfully deleted the variant
error: Unable to delete the variant
+ variant_row:
+ none_tax_category: None
+ search_for_tax_categories: "Search for tax categories"
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -984,6 +990,7 @@ en_FR:
edit:
order_sure_want_to: Are you sure you want to %{event} this order?
voucher_tax_included_in_price: "%{label} (tax included in voucher)"
+ tax_on_fees: "Tax on fees"
invoice_email_sent: 'Invoice email has been sent'
order_email_resent: 'Order email has been resent'
bulk_management:
@@ -1279,6 +1286,7 @@ en_FR:
enable: "Allow data sharing"
disable: "Stop sharing"
loading: "Loading"
+ need_to_be_manager: "Only managers can connect apps."
note: |
Your Open Food Network account is connected to Discover Regenerative.
Add or update information on your Discover Regenerative listing here.
@@ -2085,7 +2093,6 @@ en_FR:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3964,6 +3971,11 @@ en_FR:
validation:
must_be_int: "must be an integer"
admin:
+ images:
+ edit:
+ title: Edit product photo
+ close: Back
+ upload: Upload photo
mail_methods:
send_testmail: "Send test email"
testmail:
@@ -3991,6 +4003,10 @@ en_FR:
customers: "Customers"
groups: "Groups"
oidc_settings: "OIDC Settings"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml
index 3530fc640f9..0f9a7175e00 100644
--- a/config/locales/en_GB.yml
+++ b/config/locales/en_GB.yml
@@ -138,7 +138,8 @@ en_GB:
unprocessable_entity:
title: "The change you wanted was rejected (422)"
message_html: "The change you wanted was rejected. Maybe you tried to change something you don't have access to.
"
- stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
+ general_error:
+ message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
stripe:
error_code:
incorrect_number: "The card number is incorrect."
@@ -538,6 +539,7 @@ en_GB:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
adjustments:
@@ -762,6 +764,7 @@ en_GB:
index:
header:
title: Bulk Edit Products
+ content:
loading: Loading your products
delete_modal:
delete_product_modal:
@@ -809,16 +812,18 @@ en_GB:
new_variant: New variant
bulk_update:
success: Changes saved
- edit_image:
- title: Edit product photo
- close: Back
- upload: Upload photo
delete_product:
success: Successfully deleted the product
error: Unable to delete the product
delete_variant:
success: Successfully deleted the variant
error: Unable to delete the variant
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -2065,7 +2070,6 @@ en_GB:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Community Forum"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -2240,7 +2244,7 @@ en_GB:
email_so_placement_intro_html: "You have a new order with %{distributor}"
email_so_placement_details_html: "Here are the details of your order for %{distributor}:"
email_so_placement_changes: "Unfortunately, not all products that you requested were available. The original quantities that you requested appear crossed-out below."
- email_so_payment_success_intro_html: "An automatic payment has been processed for your order from %{distributor}."
+ email_so_payment_success_intro_html: "Your subscription order from %{distributor} has been processed. \nIf you chose to pay for your subscription via card, you will now be charged."
email_so_placement_explainer_html: "This order was automatically created for you."
email_so_edit_true_html: "You can make changes until orders close on %{orders_close_at}."
email_so_edit_false_html: "You can view details of this order at any time."
@@ -3947,6 +3951,11 @@ en_GB:
validation:
must_be_int: "must be an integer"
admin:
+ images:
+ edit:
+ title: Edit product photo
+ close: Back
+ upload: Upload photo
mail_methods:
send_testmail: "Send test email"
testmail:
@@ -3974,6 +3983,10 @@ en_GB:
customers: "Customers"
groups: "Groups"
oidc_settings: "OIDC Settings"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_IE.yml b/config/locales/en_IE.yml
index d58402827c9..4e2b0771a76 100644
--- a/config/locales/en_IE.yml
+++ b/config/locales/en_IE.yml
@@ -141,7 +141,8 @@ en_IE:
unprocessable_entity:
title: "The change you wanted was rejected (422)"
message_html: "The change you wanted was rejected. Maybe you tried to change something you don't have access to.
"
- stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
+ general_error:
+ message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us."
stripe:
error_code:
incorrect_number: "The card number is incorrect."
@@ -540,6 +541,7 @@ en_IE:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
adjustments:
@@ -761,6 +763,7 @@ en_IE:
index:
header:
title: Bulk Edit Products
+ content:
loading: Loading your products
delete_modal:
delete_product_modal:
@@ -811,16 +814,18 @@ en_IE:
new_variant: New variant
bulk_update:
success: Changes saved
- edit_image:
- title: Edit product photo
- close: Back
- upload: Upload photo
delete_product:
success: Successfully deleted the product
error: Unable to delete the product
delete_variant:
success: Successfully deleted the variant
error: Unable to delete the variant
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -2067,7 +2072,6 @@ en_IE:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Community Forum"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3949,6 +3953,11 @@ en_IE:
validation:
must_be_int: "must be an integer"
admin:
+ images:
+ edit:
+ title: Edit product photo
+ close: Back
+ upload: Upload photo
mail_methods:
send_testmail: "Send test email"
testmail:
@@ -3976,6 +3985,10 @@ en_IE:
customers: "Customers"
groups: "Groups"
oidc_settings: "OIDC Settings"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_IN.yml b/config/locales/en_IN.yml
index 64b8d02c11c..554bfff26ef 100644
--- a/config/locales/en_IN.yml
+++ b/config/locales/en_IN.yml
@@ -333,6 +333,7 @@ en_IN:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
begins_at: Begins At
@@ -540,8 +541,12 @@ en_IN:
clear_search: Clear search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1535,7 +1540,6 @@ en_IN:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Community Forum"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3222,6 +3226,9 @@ en_IN:
header:
store: Store
admin:
+ images:
+ edit:
+ close: Back
subscriptions:
number: "Number"
tab:
@@ -3242,6 +3249,10 @@ en_IN:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_NZ.yml b/config/locales/en_NZ.yml
index 0abd85c023b..89ce78b137e 100644
--- a/config/locales/en_NZ.yml
+++ b/config/locales/en_NZ.yml
@@ -468,6 +468,7 @@ en_NZ:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
adjustments:
@@ -693,8 +694,12 @@ en_NZ:
clear_search: Clear search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1809,7 +1814,6 @@ en_NZ:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3554,6 +3558,9 @@ en_NZ:
header:
store: Store
admin:
+ images:
+ edit:
+ close: Back
subscriptions:
number: "Number"
tab:
@@ -3574,6 +3581,10 @@ en_NZ:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_PH.yml b/config/locales/en_PH.yml
index c492d71a9f5..e17980febf5 100644
--- a/config/locales/en_PH.yml
+++ b/config/locales/en_PH.yml
@@ -332,6 +332,7 @@ en_PH:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
begins_at: Begins At
@@ -532,8 +533,12 @@ en_PH:
search: Search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1514,7 +1519,6 @@ en_PH:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3168,6 +3172,9 @@ en_PH:
header:
store: Store
admin:
+ images:
+ edit:
+ close: Back
subscriptions:
number: "Number"
tab:
@@ -3188,6 +3195,10 @@ en_PH:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_TEST.yml b/config/locales/en_TEST.yml
new file mode 100644
index 00000000000..6aa6e4e7ec2
--- /dev/null
+++ b/config/locales/en_TEST.yml
@@ -0,0 +1,12 @@
+# Test language file
+# ---------------------
+#
+# All production environments set their own locale. The source locale `en.yml`
+# is used as a fallback but no server is using it directly.
+#
+# Using this test locale reflects that setup more realistically and means that
+# we include fallback translations in our tests.
+#
+en:
+ # Overridden here due to a bug in spree i18n (Issue #870, and issue #1800)
+ language_name: "English" # Localised name of this language
diff --git a/config/locales/en_US.yml b/config/locales/en_US.yml
index 58e3454eba9..f1ba7d41aa9 100644
--- a/config/locales/en_US.yml
+++ b/config/locales/en_US.yml
@@ -446,6 +446,7 @@ en_US:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
adjustments:
@@ -671,8 +672,12 @@ en_US:
clear_search: Clear search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1761,7 +1766,6 @@ en_US:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Notices"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3563,6 +3567,9 @@ en_US:
validation:
must_be_int: "must be an integer"
admin:
+ images:
+ edit:
+ close: Back
mail_methods:
send_testmail: "Send test email"
testmail:
@@ -3589,6 +3596,10 @@ en_US:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/en_ZA.yml b/config/locales/en_ZA.yml
index 0d920527ad1..3511b7ae8fe 100644
--- a/config/locales/en_ZA.yml
+++ b/config/locales/en_ZA.yml
@@ -332,6 +332,7 @@ en_ZA:
edit: Edit
clone: Clone
delete: Delete
+ remove: Remove
image:
edit: Edit
begins_at: Begins At
@@ -536,8 +537,12 @@ en_ZA:
clear_search: Clear search
table:
new_variant: New variant
- edit_image:
- close: Back
+ variant_row:
+ none_tax_category: None
+ category_field_name: "Category"
+ tax_category_field_name: "Tax Category"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: Product Import
file_not_found: File not found or could not be opened
@@ -1516,7 +1521,6 @@ en_ZA:
label_account: "Account"
label_more: "Show more"
label_less: "Show less"
- label_notices: "Community Forum"
cart_items: "items"
cart_headline: "Your shopping cart"
total: "Total"
@@ -3098,6 +3102,9 @@ en_ZA:
header:
store: Store
admin:
+ images:
+ edit:
+ close: Back
subscriptions:
number: "Number"
tab:
@@ -3118,6 +3125,10 @@ en_ZA:
enterprise_relationships: "Permissions"
customers: "Customers"
groups: "Groups"
+ overview: "Overview"
+ product_import: "Import"
+ enterprise_roles: "Roles"
+ payment_methods: "Payment Methods"
product_properties:
index:
inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)"
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 7c3473f7c2a..96dcab40fe6 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -478,6 +478,7 @@ es:
edit: Editar
clone: Duplicar
delete: Borrar
+ remove: Eliminar
image:
edit: Editar
adjustments:
@@ -694,6 +695,7 @@ es:
index:
header:
title: Editar varios Productos
+ content:
loading: Cargando tus productos
filters:
producers:
@@ -711,8 +713,12 @@ es:
reset: Desechar Cambios
save: Guardar Cambios
new_variant: Nueva variante
- edit_image:
- close: Atrás
+ variant_row:
+ none_tax_category: Ninguno
+ category_field_name: "Categoría"
+ tax_category_field_name: "Categoría de impuestos"
+ product_row:
+ producer_field_name: "Productora"
product_import:
title: Importación de productos
file_not_found: Archivo no encontrado o no se pudo abrir
@@ -1860,7 +1866,6 @@ es:
label_account: "Cuenta"
label_more: "Mostrar más"
label_less: "Mostrar menos"
- label_notices: "Noticias"
cart_items: "elementos"
cart_headline: "Su carrito de compras"
total: "Total"
@@ -3705,6 +3710,9 @@ es:
validation:
must_be_int: "debe ser un entero"
admin:
+ images:
+ edit:
+ close: Atrás
mail_methods:
send_testmail: "Enviar correo electrónico de prueba"
testmail:
@@ -3731,6 +3739,10 @@ es:
enterprise_relationships: "Permisos"
customers: "Consumidoras"
groups: "Redes"
+ overview: "Visión general"
+ product_import: "Importar"
+ enterprise_roles: "Roles"
+ payment_methods: "Métodos de Pago"
product_properties:
index:
inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)"
diff --git a/config/locales/es_CO.yml b/config/locales/es_CO.yml
index 964ea1c945e..599cc1115b3 100644
--- a/config/locales/es_CO.yml
+++ b/config/locales/es_CO.yml
@@ -356,6 +356,7 @@ es_CO:
edit: Editar
clone: Duplicar
delete: Borrar
+ remove: Eliminar
image:
edit: Editar
begins_at: Empieza en
@@ -560,8 +561,12 @@ es_CO:
search: Buscar
table:
new_variant: Nueva variante
- edit_image:
- close: Atrás
+ variant_row:
+ none_tax_category: Ninguno
+ category_field_name: "Categoría"
+ tax_category_field_name: "Categoría de impuestos"
+ product_row:
+ producer_field_name: "Productor"
product_import:
title: Importe de producto
file_not_found: Archivo no encontrado o no se pudo abrir
@@ -1563,7 +1568,6 @@ es_CO:
label_account: "Cuenta"
label_more: "Mostrar más"
label_less: "Mostrar menos"
- label_notices: "Noticias"
cart_items: "Elementos"
cart_headline: "Su carrito de compras"
total: "Total"
@@ -3278,6 +3282,9 @@ es_CO:
header:
store: Tienda
admin:
+ images:
+ edit:
+ close: Atrás
subscriptions:
number: "Número"
tab:
@@ -3298,6 +3305,10 @@ es_CO:
enterprise_relationships: "Permisos"
customers: "Cliente"
groups: "Grupos"
+ overview: "Vista general"
+ product_import: "Importar"
+ enterprise_roles: "Roles"
+ payment_methods: "Métodos de Pago"
product_properties:
index:
inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)"
diff --git a/config/locales/es_CR.yml b/config/locales/es_CR.yml
index 3b903b274c4..35a5fc90d93 100644
--- a/config/locales/es_CR.yml
+++ b/config/locales/es_CR.yml
@@ -468,6 +468,7 @@ es_CR:
edit: Editar
clone: Duplicar
delete: Borrar
+ remove: Eliminar
image:
edit: Editar
adjustments:
@@ -697,8 +698,12 @@ es_CR:
clear_search: Borrar búsqueda
table:
new_variant: Nueva variante
- edit_image:
- close: Atrás
+ variant_row:
+ none_tax_category: Ninguno
+ category_field_name: "Categoría"
+ tax_category_field_name: "Categoría de impuestos"
+ product_row:
+ producer_field_name: "Productor"
product_import:
title: Importe de producto
file_not_found: Archivo no encontrado o no se pudo abrir
@@ -1818,7 +1823,6 @@ es_CR:
label_account: "Cuenta"
label_more: "Mostrar más"
label_less: "Mostrar menos"
- label_notices: "Noticias"
cart_items: "Elementos"
cart_headline: "Su carrito de compras"
total: "Total"
@@ -3624,6 +3628,9 @@ es_CR:
header:
store: Tienda
admin:
+ images:
+ edit:
+ close: Atrás
unit_price_tooltip: "El precio unitario aumenta la transparencia al permitir que sus clientes comparen fácilmente los precios entre diferentes productos y tamaños de empaque. Tenga en cuenta que el precio unitario final que se muestra en la tienda puede diferir, ya que incluye impuestos y tarifas."
subscriptions:
number: "Número"
@@ -3645,6 +3652,10 @@ es_CR:
enterprise_relationships: "Permisos"
customers: "Cliente"
groups: "Grupos"
+ overview: "Vista general"
+ product_import: "Importar"
+ enterprise_roles: "Roles"
+ payment_methods: "Métodos de pago"
product_properties:
index:
inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)"
diff --git a/config/locales/es_US.yml b/config/locales/es_US.yml
index 35e2dc488b0..033369229a2 100644
--- a/config/locales/es_US.yml
+++ b/config/locales/es_US.yml
@@ -445,6 +445,7 @@ es_US:
edit: Editar
clone: Duplicar
delete: Borrar
+ remove: Eliminar
image:
edit: Editar
adjustments:
@@ -669,8 +670,12 @@ es_US:
clear_search: Limpiar la búsqueda
table:
new_variant: Nueva variante
- edit_image:
- close: Atrás
+ variant_row:
+ none_tax_category: Ninguno
+ category_field_name: "Categoría"
+ tax_category_field_name: "Categoría del impuesto"
+ product_row:
+ producer_field_name: "Productora"
product_import:
title: Importación de productos
file_not_found: Archivo no encontrado o no se pudo abrir
@@ -1719,7 +1724,6 @@ es_US:
label_account: "Cuenta"
label_more: "Mostrar más"
label_less: "Mostrar menos"
- label_notices: "Noticias"
cart_items: "elementos"
cart_headline: "Su carrito de compras"
total: "Total"
@@ -3514,6 +3518,9 @@ es_US:
validation:
must_be_int: "debe ser un entero"
admin:
+ images:
+ edit:
+ close: Atrás
mail_methods:
send_testmail: "Enviar email de prueba"
testmail:
@@ -3540,6 +3547,10 @@ es_US:
enterprise_relationships: "Permisos"
customers: "Consumidoras"
groups: "Redes"
+ overview: "Visión general"
+ product_import: "Importar"
+ enterprise_roles: "Roles"
+ payment_methods: "Métodos de Pago"
product_properties:
index:
inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)"
diff --git a/config/locales/fil_PH.yml b/config/locales/fil_PH.yml
index 13c709fda43..29aae4c87fa 100644
--- a/config/locales/fil_PH.yml
+++ b/config/locales/fil_PH.yml
@@ -332,6 +332,7 @@ fil_PH:
edit: i-edit
clone: Gayahin
delete: Tanggalin
+ remove: Tanggalin
image:
edit: i-edit
begins_at: nagsimula sa
@@ -533,8 +534,12 @@ fil_PH:
search: hanapin
table:
new_variant: bagong uri
- edit_image:
- close: bumalik
+ variant_row:
+ none_tax_category: wala
+ category_field_name: "kategorya"
+ tax_category_field_name: "kategorya ng tax"
+ product_row:
+ producer_field_name: "Producer"
product_import:
title: paglipat ng produkto
file_not_found: 'ang file ay hindi mahanap o mabuksan '
@@ -1516,7 +1521,6 @@ fil_PH:
label_account: "Account"
label_more: "ipakita ang iba pa"
label_less: "huwag ipakita ang lahat"
- label_notices: "mga abiso"
cart_items: "mga item"
cart_headline: "Ang iyong shopping cart"
total: "kabuuan"
@@ -3180,6 +3184,9 @@ fil_PH:
header:
store: tindahan
admin:
+ images:
+ edit:
+ close: bumalik
subscriptions:
number: "Bilang"
tab:
@@ -3200,6 +3207,10 @@ fil_PH:
enterprise_relationships: "mga pahintulot"
customers: "mga customer"
groups: "mga grupo"
+ overview: "pangkalahatang ideya"
+ product_import: "ilipat"
+ enterprise_roles: "mga tungkulin"
+ payment_methods: "Mga Paraan ng Pagbabayad"
product_properties:
index:
inherits_properties_checkbox_hint: "kopyahin ang mga katangian mula sa%{supplier}? (maliban kung napatungan ang nasa itaas)"
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 74a8d86f471..407cb26ebc9 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -141,7 +141,8 @@ fr:
unprocessable_entity:
title: "La modification réalisée a été rejetée (erreur 422)"
message_html: " La modification souhaitée a été refusée. Peut-être avez-vous essayé de faire quelque chose sans avoir les droits d'accès suffisants ?
"
- stimulus_reflex_error: "Nous sommes désolés mais quelque chose s'est mal passé. \n\nC'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter."
+ general_error:
+ message: "Nous sommes désolés mais quelque chose s'est mal passé. \n\nC'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter."
stripe:
error_code:
incorrect_number: "Le numéro de carte bancaire est incorrect."
@@ -549,6 +550,7 @@ fr:
edit: Modifier
clone: Dupliquer
delete: Supprimer
+ remove: Supprimer
image:
edit: Modifier
adjustments:
@@ -775,6 +777,7 @@ fr:
index:
header:
title: Gestion du catalogue produits
+ content:
loading: Vos produits sont en cours de chargement
delete_modal:
delete_product_modal:
@@ -826,16 +829,19 @@ fr:
new_variant: Nouvelle variante
bulk_update:
success: Changements sauvegardés
- edit_image:
- title: Modifier la photo du produit
- close: Retour
- upload: Télécharger la photo
delete_product:
success: Le produit a bien été supprimé
error: Le produit n'a pas pu être supprimé
delete_variant:
success: La variante a bien été supprimée
error: La variante n'a pas pu être supprimée
+ variant_row:
+ none_tax_category: Aucun
+ search_for_tax_categories: "Chercher les catégories de taxes"
+ category_field_name: "Catégorie"
+ tax_category_field_name: "TVA applicable"
+ product_row:
+ producer_field_name: "Producteur"
product_import:
title: Import liste produits
file_not_found: Fichier non trouvé ou impossible à ouvrir
@@ -984,6 +990,7 @@ fr:
edit:
order_sure_want_to: Êtes-vous sûr de vouloir %{event} cette commande ?
voucher_tax_included_in_price: "%{label} (taxe inclue dans le bon de réduction)"
+ tax_on_fees: "Taxe sur les frais"
invoice_email_sent: 'L''email de facturation a bien été envoyé'
order_email_resent: 'L''email de commande a de nouveau été envoyé'
bulk_management:
@@ -1280,6 +1287,7 @@ fr:
enable: "Autoriser le partage de données"
disable: "Arrêter le partage"
loading: "Chargement en cours"
+ need_to_be_manager: "Seuls les gestionnaires peuvent connecter des applications."
note: |
Votre compte Open Food Network est connecté à Discover Regenerative.
Ajouter et mettre à jour les informations sur votre liste Discover Regenerative ici.
@@ -2090,7 +2098,6 @@ fr:
label_account: "Compte"
label_more: "Afficher plus"
label_less: "Masquer"
- label_notices: "Informations"
cart_items: "Produits"
cart_headline: "Votre panier"
total: "Total"
@@ -4021,6 +4028,11 @@ fr:
validation:
must_be_int: "doit être un entier"
admin:
+ images:
+ edit:
+ title: Modifier la photo du produit
+ close: Retour
+ upload: Télécharger la photo
mail_methods:
send_testmail: "Envoyer un e-mail de test"
testmail:
@@ -4048,6 +4060,10 @@ fr:
customers: "Acheteurs"
groups: "Groupes"
oidc_settings: "OIDC"
+ overview: "Aperçu"
+ product_import: "Importer"
+ enterprise_roles: "Roles"
+ payment_methods: "Méthodes de paiement"
product_properties:
index:
inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)"
diff --git a/config/locales/fr_BE.yml b/config/locales/fr_BE.yml
index 4e08d7b657b..ed48f6004de 100644
--- a/config/locales/fr_BE.yml
+++ b/config/locales/fr_BE.yml
@@ -95,6 +95,7 @@ fr_BE:
on_demand_but_count_on_hand_set: "doit être vide si à la demande"
limited_stock_but_no_count_on_hand: "doit être spécifié car le stock limité est forcé"
messages:
+ confirmation: "ne correspond pas à %{attribute}"
blank: "Champ obligatoire"
errors:
messages:
@@ -113,8 +114,8 @@ fr_BE:
dimension_width_equal_to: "la largeur doit être égale au pixel %{length} ."
dimension_height_equal_to: "la hauteur doit être égale au pixel %{length} ."
aspect_ratio_not_square: "doit être une image carrée"
- aspect_ratio_not_portrait: "doit être une image de portrait"
- aspect_ratio_not_landscape: "doit être une image de paysage"
+ aspect_ratio_not_portrait: "doit être une image en format portrait"
+ aspect_ratio_not_landscape: "doit être une image en format paysage"
aspect_ratio_is_not: "doit avoir un rapport hauteur / largeur de %{aspect_ratio}"
aspect_ratio_unknown: "a un rapport hauteur/largeur inconnu"
image_not_processable: "n'est pas une image valide"
@@ -127,7 +128,8 @@ fr_BE:
unprocessable_entity:
title: "Le changement que vous souhaitiez a été rejeté (422)"
message_html: "Le changement que vous souhaitiez a été rejeté. Peut-être avez-vous essayé de modifier quelque chose auquel vous n'avez pas accès.
"
- stimulus_reflex_error: "Nous sommes désolés, une erreur s'est produite. Il s'agit peut-être d'un problème temporaire, veuillez donc réessayer ou recharger la page. Nous enregistrons toutes les erreurs et travaillons peut-être sur un correctif. Si le problème persiste ou est urgent, veuillez nous contacter."
+ general_error:
+ message: "Nous sommes désolés, une erreur s'est produite. Il s'agit peut-être d'un problème temporaire, veuillez donc réessayer ou recharger la page. Nous enregistrons toutes les erreurs et travaillons peut-être sur un correctif. Si le problème persiste ou est urgent, veuillez nous contacter."
stripe:
error_code:
incorrect_number: "Le numéro de carte est incorrect."
@@ -214,6 +216,7 @@ fr_BE:
signed_up_but_unconfirmed: "Un message avec un lien de confirmation a été envoyé à l'adresse email indiquée. Veuillez cliquer sur ce lien pour activer votre compte."
unknown_error: "Une erreur s'est glissée lors de la création de votre compte. Vérifiez votre adresse email et recommencez."
failure:
+ disabled: "Votre compte a été désactivé. Veuillez contacter un administrateur pour résoudre ce problème."
invalid: |
Email / mot de passe incorrect.
Créez votre compte ou réinitialisez votre mot de passe.
@@ -233,6 +236,8 @@ fr_BE:
models:
order_cycle:
cloned_order_cycle_name: "Copie de %{order_cycle}"
+ tax_rate:
+ included_in_price: "Inclus dans le prix"
open_street_map_enabled: "Open Street Map activé"
resume_order: "Reprendre la commande"
sku: "Référence produit"
@@ -245,6 +250,10 @@ fr_BE:
integer_array_validator:
not_array_error: "doit être un array"
invalid_element_error: "doit contenir uniquement des nombres entiers"
+ report_job:
+ report_failed: |
+ Ce rapport a échoué. C'est peut-être trop lourd à traiter.
+ Nous allons examiner la question, mais n'hésitez pas à nous faire savoir si le problème persiste.
enterprise_mailer:
confirmation_instructions:
subject: "Confirmez l'adresse email pour %{enterprise}"
@@ -267,6 +276,8 @@ fr_BE:
report_ready:
subject: "Rapport prêt"
heading: "Rapport prêt à télécharger"
+ intro: |
+ Le lien ci-dessous expirera après une semaine.
shipment_mailer:
shipped_email:
dear_customer: "Cher Client,"
@@ -332,6 +343,7 @@ fr_BE:
confirm_resend_order_confirmation: "Etes-vous sûr de vouloir renvoyer le mail de confirmation de commande ?"
invoice: "Facture"
active: "Actif"
+ download: "Télécharger"
cancelled: "Annulée"
more: "Plus"
say_no: "Non"
@@ -400,7 +412,7 @@ fr_BE:
copy: Copier
change_my_password: "Changer mon mot de passe"
update_password: "Mise à jour du mot de passe"
- password_confirmation: confirmation du mot de passe
+ password_confirmation: Confirmation du mot de passe
reset_password_token: Réinitialisation du mot de passe
expired: a expiré, veuillez en demander un nouveau
back_to_payments_list: "Retour à la liste des paiements"
@@ -442,6 +454,7 @@ fr_BE:
name: Nom
unit: Unité
unit_value: Valeur unitaire
+ display_as: Unité d'affichage comme
price: Prix
producer: Producteur·trice
category: Catégorie
@@ -467,6 +480,7 @@ fr_BE:
edit: Modifier
clone: Dupliquer
delete: Supprimer
+ remove: Supprimer
image:
edit: Modifier
adjustments:
@@ -547,6 +561,7 @@ fr_BE:
terms_of_service: "Conditions d'utilisation"
delete: "Supprimer le fichier"
confirm_delete: "Voulez-vous vraiment supprimer le fichier actuel des conditions d'utilisation ?"
+ attachment: "Pièce jointe"
create_terms_of_service: "Créer un fichier de conditions d'utilisation"
number_localization:
number_localization_settings: "Gestion localisation des nombres"
@@ -581,6 +596,7 @@ fr_BE:
matomo_tag_manager_url: "URL de l'instance sur Matomo"
info_html: "Matomo est un site web est une application mobile analytique . Vous pouvez heberger matomo sur place ou heberger dans le cloud. Voyez matomo.org pour plus d'information."
config_instructions_html: "Pour utiliser Matomo, vous devez configurer l'intégration avec Open Food France. L'URL de l'instance sur Matomo correspond à l'url du site internet visé par le suivi de la navigation utilisateur. Si le champ est vide, Matomo n'effectuera aucune analyse sur ce site. L'ID de l'instance sur Matomo n'est pas obligatoire, mais nécessaire si vous souhaitez analyser plusieurs sites web sur une seule instance Matomo. Cet ID peut être trouvé sur l'espace administrateur Matomo."
+ config_instructions_tag_manager_html: "La définition de l'URL de Matomo Tag Manager active la fonctionnalité \"Matomo Tag Manager\". Cet outil vous permet de configurer des événements d'analyse. L'URL de Matomo Tag Manager est copiée à partir de la section \"Code d'installation\" de Matomo Tag Manager. Assurez-vous de sélectionner le bon conteneur et le bon environnement, car ces options modifient l'URL."
customers:
index:
new_customer: "Nouvel acheteur"
@@ -671,7 +687,7 @@ fr_BE:
infinity: "Infinité"
to_order_tip: "Les articles fabriqués sur commande n'ont pas un niveau de stock défini, comme des pains faits à la main."
back_to_products_list: "Retour à la liste produits"
- editing_product: "Edition de produits"
+ editing_product: "Éditer le produit"
tabs:
product_details: "Détails du produit"
group_buy_options: "Options d'achat par lot"
@@ -693,8 +709,12 @@ fr_BE:
clear_search: Effacer recherche
table:
new_variant: Nouvelle variante
- edit_image:
- close: Retour
+ variant_row:
+ none_tax_category: Aucun
+ category_field_name: "Catégorie"
+ tax_category_field_name: "TVA applicable"
+ product_row:
+ producer_field_name: "Producteur·trice"
product_import:
title: Import liste produits
file_not_found: Fichier non trouvé ou impossible à ouvrir
@@ -850,6 +870,7 @@ fr_BE:
order_date: "Complété à "
max: "Max"
product_unit: "Produit: Unité"
+ weight_volume: "Poids/Volume (g)"
ask: "Demander?"
page_title: "Gestion des commandes"
actions_delete: "Supprimer la sélection"
@@ -1114,7 +1135,7 @@ fr_BE:
white_label_logo_link_label: "Lien pour le logo utilisé en vitrine"
hide_groups_tab: "Masquer l'onglet des groupes dans la vitrine"
create_custom_tab: "Créer un onglet personnalisé dans la vitrine"
- custom_tab_title: "Titre de l'onglet personnalisé"
+ custom_tab_title: "Titre de l'onglet personnalisé (max. 20 caractères)"
custom_tab_content: "Contenu de l'onglet personnalisé"
connected_apps:
loading: "Chargement en cours"
@@ -1265,9 +1286,9 @@ fr_BE:
add_distributor: 'Ajouter un distributeur'
advanced_settings:
automatic_notifications: Notifications automatiques
- automatic_notifications_tip: Envoi un email automatiquement à tous les producteurs lorsque le cycle de vente ferme.
+ automatic_notifications_tip: Envoie un email automatiquement à tous les producteurs lorsque le cycle de vente ferme.
title: Paramétrages avancés
- choose_product_tip: Vous pouvez limiter les produits entrants et sortants à l'inventaire uniquement%{inventory}.
+ choose_product_tip: Vous pouvez limiter les produits entrants et sortants uniquement à ceux sélectionnés dans le catalogue du comptoir "%{inventory} ".
preferred_product_selection_from_coordinator_inventory_only_here: Uniquement les produits du catalogue magasin
preferred_product_selection_from_coordinator_inventory_only_all: Tous les produits disponibles dans les catalogues producteurs
save_reload: Sauvegarder et rafraichir la page
@@ -1398,11 +1419,14 @@ fr_BE:
pack_by_customer: Préparation des commandes par Acheteur·euse
pack_by_supplier: Préparation des commandes par Producteur·trice
pack_by_product: Préparation des commandes par produit
+ download:
+ button: "Télécharger le rapport"
show:
report_taking_longer: >
Désolé, ce rapport a pris trop de temps à traiter. Il peut contenir beaucoup
de données ou nous sommes occupés par d'autres rapports. Vous pouvez réessayer
plus tard.
+ report_link_label: Télécharger le rapport (si disponible)
revenues_by_hub:
name: CA par comptoir
description: CA par comptoir
@@ -1467,7 +1491,7 @@ fr_BE:
name: "Rapports de préparation des paniers"
subscriptions:
index:
- title: "commandes récurrantes"
+ title: "Commandes récurrentes"
new: "Nouvel abonnement"
new:
title: "Nouvel abonnement"
@@ -1481,7 +1505,7 @@ fr_BE:
filters:
query_placeholder: "Recherche par email ..."
setup_explanation:
- title: "commandes récurrantes"
+ title: "Commandes récurrentes"
just_a_few_more_steps: 'Encore quelques étapes avant de pouvoir commencer:'
enable_subscriptions: "Activez la fonction abonnements pour au moins une de vos comptoirs"
enable_subscriptions_step_1_html: 1. Allez à %{enterprises_link}, trouvez votre comptoir, et cliquez sur "Gérer"
@@ -1567,6 +1591,8 @@ fr_BE:
voucher_code: Code du bon d'achat
voucher_amount: Quantité
voucher_type: Type de bon d'achat
+ flat_rate: Montant fixe
+ percentage_rate: Pourcentage (%)
controllers:
enterprises:
stripe_connect_cancelled: "La connexion avec Stripe a été annulée"
@@ -1587,7 +1613,7 @@ fr_BE:
enterprise_terms_and_conditions:
destroy_attachment_does_not_exist: "Le fichier des termes et conditions n'existe pas"
orders:
- failed_to_update: "Annulation de la mise à jour la commande"
+ failed_to_update: "Annulation de la mise à jour de la commande"
checkout:
failed: "La vente a échouée. Veuillez nous le faire savoir afin que nous puissions traiter votre commande."
payment_cancelled_due_to_stock: "Paiement annulé : la commande n'a pas pu être finalisée en raison d'un problème de stock."
@@ -1673,9 +1699,10 @@ fr_BE:
submit: Finaliser la commande
cancel: Retour à Mode de paiement
errors:
+ saving_failed: "L'enregistrement a échoué, veuillez mettre à jour les champs en surbrillance."
terms_not_accepted: Veuillez accepter les termes et conditions
required: Le champ ne peut pas être vide
- invalid_number: "s'il vous plaît entrer un numéro de téléphone valide"
+ invalid_number: "S'il vous plaît, entrez un numéro de téléphone valide"
invalid_email: "Veuillez entrer un email valide"
select_a_shipping_method: Sélectionnez une méthode d'expédition ou de retrait
select_a_payment_method: Choisissez une méthode de paiement
@@ -1746,6 +1773,7 @@ fr_BE:
invoice_column_price: "Prix"
invoice_column_item: "Produit"
invoice_column_qty: "Qté"
+ invoice_column_weight_volume: "Poids / Vol."
invoice_column_unit_price_with_taxes: "Prix unitaire TTC"
invoice_column_unit_price_without_taxes: "Prix unitaire HT"
invoice_column_price_with_taxes: "Prix total TTC"
@@ -1840,7 +1868,6 @@ fr_BE:
label_account: "Compte"
label_more: "Afficher plus"
label_less: "Masquer"
- label_notices: "Informations"
cart_items: "Produits"
cart_headline: "Votre panier"
total: "Total"
@@ -2050,6 +2077,7 @@ fr_BE:
producer_mail_order_text: "Voilà la liste et les quantités des produits commandés vous concernant:"
producer_mail_delivery_instructions: "Modalités de livraison des produits:"
producer_mail_signoff: "Merci et belle fin de journée!"
+ producer_mail_order_customer_text: "Voici un récapitulatif des commandes regroupées par clients"
shopping_oc_closed: Le comptoir est actuellement fermé
shopping_oc_closed_description: "Veuillez attendre l'ouverture du prochain cycle de vente (ou contactez directement le comptoir pour voir si nous pouvons accepter une commande tardive)."
shopping_oc_last_closed: "Le dernier cycle de vente s'est terminé il y a %{distance_of_time}"
@@ -2442,6 +2470,7 @@ fr_BE:
shipping_method_destroy_error: "Cette méthode de livraison ne peut pas être supprimée car elle est référencée dans une commande : %{number}."
fees: "Frais"
fee_name: "Nom de la commission "
+ fee_owner: "Propriétaire de la commission"
item_cost: "Coût du produit"
bulk: "Vrac"
shop_variant_quantity_min: "min"
@@ -2485,7 +2514,7 @@ fr_BE:
admin_enterprise_relationships_button_create: "Créer"
admin_enterprise_relationships_to: "vers"
admin_enterprise_groups: "Groupes d'entreprises"
- admin_enterprise_groups_name: "Produit/Variante"
+ admin_enterprise_groups_name: "NOM DU GROUPE"
admin_enterprise_groups_owner: "Manager principal"
admin_enterprise_groups_on_front_page: "Sur la page d'accueil?"
admin_enterprise_groups_enterprise: "Entreprises"
@@ -2510,7 +2539,7 @@ fr_BE:
supplier: "Fournisseurs"
product_name: "Nom du Produit"
product_description: "Description du Produit"
- permalink: "permalien"
+ permalink: "Permalien : Nom pour URL (sans espace)"
shipping_categories: "Condition de transport"
units: "Unité de mesure"
coordinator: "Coordinateur"
@@ -2719,6 +2748,7 @@ fr_BE:
report_header_total_tax: "Total TVA (%{currency_symbol})"
report_header_total_excl_tax: "Total HT (%{currency_symbol})"
report_header_total_incl_tax: "Total TTC (%{currency_symbol})"
+ report_header_total_orders: "Nombre total de commandes"
report_header_enterprise: Entreprise
report_header_enterprise_fee_name: Nom
report_header_enterprise_fee_type: Catégorie
@@ -2763,6 +2793,7 @@ fr_BE:
report_header_delivery_postcode: Code Postal Livraison
report_header_bulk_unit_size: Quantité totale du lot
report_header_weight: Poids
+ report_header_final_weight_volume: Final (Poids/Volume)
report_header_height: Taille
report_header_width: largeur
report_header_depth: profondeur
@@ -2817,6 +2848,11 @@ fr_BE:
report_header_total_untaxable_admin: Total ajustements non taxables
report_header_total_taxable_admin: Total ajustments soumis à TVA (inclut TVA)
report_line_line_items: Ces articles
+ report_header_last_completed_order_date: Date de la dernière commande terminée
+ initial_invoice_number: "Numéro de facture initial"
+ invoice_date: "Date de facture"
+ due_date: "Date d'échéance"
+ account_code: "Code du compte"
equals: "Egal"
contains: "contient"
discount: "Réduction"
@@ -3238,7 +3274,7 @@ fr_BE:
order_cycles:
create_failure: "La création du cycle de vente a échoué"
update_success: 'Votre cycle de vente a été mis à jour.'
- update_failure: "La mise à jour du cycle de vente à échoué"
+ update_failure: "La mise à jour du cycle de vente a échoué"
no_distributors: Il n'y a pas de distributeur·trice pour ce cycle de vente. Il ne sera pas visible aux acheteur·euse·s tant qu'il n'y aura pas de distributeur·trice. Voulez-vous tout de même sauvegarder ce cycle de vente ?
enterprises:
producer: "Producteur·trice"
@@ -3365,8 +3401,10 @@ fr_BE:
category: "Catégorie"
created_successfully: "Créé avec succès"
credit: "Crédit"
- editing_tax_category: "Modification de la catégorie de taxe"
- editing_tax_rate: "Modification du taux de taxe"
+ editing_tax_category: "Éditer la catégorie de taxe"
+ editing_tax_rate: "Éditer le taux de taxe"
+ editing_zone: "Éditer la zone"
+ editing_state: "Éditer la province"
expiration: "Expiration"
invalid_payment_provider: "Fournisseur de paiement invalide"
items_cannot_be_shipped: "Les articles ne peuvent pas être expédiés"
@@ -3380,12 +3418,14 @@ fr_BE:
notice_messages:
variant_deleted: "Variante supprimée"
start_date: "Date de début"
+ taxonomy_tree_instruction: "Faites un clic droit sur un élément pour ajouter, renommer, supprimer ou modifier."
updating: "Mettre à jour"
your_order_is_empty_add_product: "Votre commande est vide, merci de chercher et d'ajouter un des produits ci-dessus"
add_product: "Ajoutez un produit"
name_or_sku: "Nom ou N° d'article (entrer au moins 4 lettres du nom du produit) "
resend: "Renvoyer"
back_to_orders_list: "Retour vers la liste des commandes "
+ back_to_states_list: "Retour à la liste des provinces"
return_authorizations: "Autorisations de retour"
cannot_create_returns: "Impossible de créer des retours car cette commande n'a pas d'unités expédiées."
select_stock: "Selectionner stock"
@@ -3405,6 +3445,7 @@ fr_BE:
no_tracking_present: "Pas de traçage des données fournies."
order_total: "Total commande "
customer_details: "Données client·e"
+ customer_details_updated: "Détails du client mis à jour"
customer_search: "Recherche client"
choose_a_customer: "Choisir un client"
account: "Compte"
@@ -3456,7 +3497,7 @@ fr_BE:
send_mails_as: "Envoyer les mails comme "
smtp_send_all_emails_as_from_following_address: "Envoyer tous les mails comme de l'adresse suivante."
send_copy_of_all_mails_to: "Envoyez une copie de tous les mails à "
- smtp_send_copy_to_this_addresses: "Envoit une copie de tous les mails sortants vers cette adresse. En cas de plusieurs adresses, séparer par une virgule."
+ smtp_send_copy_to_this_addresses: "Envoie une copie de tous les mails sortants vers cette adresse. En cas de plusieurs adresses, séparer par une virgule."
tax_categories: "TVA applicable"
listing_tax_categories: "Liste catégories TVA"
back_to_tax_categories_list: "Retour à la liste des catégories de TVA"
@@ -3480,7 +3521,7 @@ fr_BE:
listing_countries: "Liste des pays"
iso_name: "Nom ISO"
states_required: "Provinces requises"
- editing_country: "Pays d'édition"
+ editing_country: "Éditer le pays"
back_to_countries_list: "Retouner vers la liste des pays"
states: "Provinces"
abbreviation: "Abréviation"
@@ -3497,6 +3538,7 @@ fr_BE:
shipping_categories: "Condition de transport"
new_shipping_category: "Nouvelle catégorie d'expédition "
back_to_shipping_categories: "Retour vers les catégories d'expédition"
+ editing_shipping_category: "Éditer la catégorie d'expédition"
name: "Nom"
description: "Description"
type: "Catégorie"
@@ -3515,8 +3557,8 @@ fr_BE:
amount: "Quantité"
currency: "Devise"
first_item: "Coût du premier article "
- additional_item: "Coût d'objet supplémentaire"
- max_items: "Articles maximum"
+ additional_item: "Coût supplémentaire par article"
+ max_items: "Nb d'articles maximum (au delà duquel il n'y a plus de coût supplémentaire)"
minimal_amount: "Montant minimal"
normal_amount: "Montant normal"
discount_amount: "Montant de la remise"
@@ -3553,7 +3595,12 @@ fr_BE:
cancel: "Annuler"
shared:
error_messages:
- there_were_problems_with_the_following_fields: "Il y a u des erreur avec les champs suivant"
+ errors_prohibited_this_record_from_being_saved:
+ one: "1 erreur a empêché la sauvegarde de cet enregistrement :"
+ few: "Les %{count} erreurs ont empêché la sauvegarde de cet enregistrement :"
+ many: "Les %{count} erreurs ont empêché la sauvegarde de cet enregistrement :"
+ other: "Les %{count} erreurs ont empêché la sauvegarde de cet enregistrement :"
+ there_were_problems_with_the_following_fields: "Il y a eu des erreurs concernant les champs suivants"
payments_list:
date_time: "Date/Temps"
amount: "Quantité"
@@ -3568,6 +3615,13 @@ fr_BE:
header:
store: Aperçu
admin:
+ images:
+ edit:
+ close: Retour
+ mail_methods:
+ send_testmail: "Envoyer un e-mail de test"
+ testmail:
+ error: "Une erreur s'est produite lors de la tentative d'envoi de l'e-mail de test."
unit_price_tooltip: "Le prix unitaire permet aux acheteurs de comparer les prix entre les produits et/ou les conditionnements. Attention, le prix final observé par l'acheteur peut être différent si des marges et/ou commissions sont appliquées."
subscriptions:
number: "N° commande"
@@ -3589,6 +3643,10 @@ fr_BE:
enterprise_relationships: "Permissions"
customers: "Acheteur·euse·s"
groups: "Groupes"
+ overview: "Aperçu"
+ product_import: "Importer"
+ enterprise_roles: "Roles"
+ payment_methods: "Méthodes de paiement"
product_properties:
index:
inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)"
@@ -3766,7 +3824,7 @@ fr_BE:
back_to_payment_methods_list: "Retour à la liste des paiements"
edit:
new: "Nouveau"
- editing_payment_method: "Modification des méthodes de paiement en cours"
+ editing_payment_method: "Éditer les méthodes de paiement"
back_to_payment_methods_list: "Retour à la liste des paiements"
stripe_connect:
enterprise_select_placeholder: Choisir...
@@ -3805,6 +3863,7 @@ fr_BE:
no_payment_via_admin_backend: Les payement paypal ne savent pas etre prit dans le Backoffice
products:
image_upload_error: "Veuillez télécharger l'image au format JPG, PNG, GIF, SVG ou WEBP."
+ image_not_processable: "L’image jointe n’est pas une image valide."
new:
title: "Nouveau Produit"
new_product: "Nouveau Produit"
@@ -3866,7 +3925,7 @@ fr_BE:
search: "Rechercher"
email: "Email"
edit:
- editing_user: "Utilisateur·trice d'édition"
+ editing_user: "Éditer l'utilisateur.rice"
back_to_users_list: "Retour vers la liste des utilisateur·trice·s"
general_settings: "Réglages Généraux"
form:
@@ -3920,7 +3979,7 @@ fr_BE:
taxons:
form:
name: Nom
- permalink: permalien
+ permalink: 'Permalien : Nom pour URL (sans espace)'
description: Description
general_settings:
edit:
@@ -4113,6 +4172,8 @@ fr_BE:
shipment:
cannot_ready: "Impossible de préparer l'expédition."
invalid_taxonomy_id: "Id taxonomique invalide."
+ unit: unité
+ per_unit: Montant par unité
datetime:
distance_in_words:
about_x_hours:
diff --git a/config/locales/fr_CA.yml b/config/locales/fr_CA.yml
index 7f9b2fe62cc..32e382dc7ec 100644
--- a/config/locales/fr_CA.yml
+++ b/config/locales/fr_CA.yml
@@ -141,7 +141,8 @@ fr_CA:
unprocessable_entity:
title: "La modification réalisée a été rejetée (erreur 422)"
message_html: " La modification souhaitée a été refusée. Peut-être avez-vous essayé de faire quelque chose sans avoir les droits d'accès suffisants ?
"
- stimulus_reflex_error: "Nous sommes désolés mais quelque chose s'est mal passé.\n\n C'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter.\n "
+ general_error:
+ message: "Nous sommes désolés mais quelque chose s'est mal passé.\n\n C'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter.\n "
stripe:
error_code:
incorrect_number: "e numéro de carte bancaire est incorrect."
@@ -222,12 +223,16 @@ fr_CA:
not_available_to_shop: "n'est pas disponible pour %{shop}"
card_details: "Détalis de la carte"
card_type: "Type de carte"
+ card_type_is: "Type de carte"
+ unrecognized_card_type: "Type de carte non reconnu"
+ use_new_cc: "Utilisez une nouvelle carte bancaire"
+ what_is_this: "Qu'est-ce que c'est ?"
cardholder_name: "Titulaire de la carte"
community_forum_url: "Lien vers le forum"
customer_instructions: "Précisions pour l'acheteur"
additional_information: "Informations additionnelles"
connect_app:
- url: "https://n8n.openfoodnetwork.org/webhook/regen-CAN/connect-enterprise"
+ url: "https://n8n.openfoodnetwork.org/webhook-test/food-justice/connect-enterprise"
devise:
passwords:
spree_user:
@@ -546,6 +551,7 @@ fr_CA:
edit: Modifier
clone: Dupliquer
delete: Supprimer
+ remove: Supprimer
image:
edit: Modifier
adjustments:
@@ -650,6 +656,7 @@ fr_CA:
status: Statut
ok: Ok
instance_secret_key: Clé Secrète de l'Instance
+ instance_publishable_key: Clé publique de l'instance
account_id: Identifiant Compte
business_name: Nom de l'entreprise
charges_enabled: Frais activés
@@ -771,6 +778,7 @@ fr_CA:
index:
header:
title: Gestion du catalogue produits
+ content:
loading: Vos produits sont en cours de chargement
delete_modal:
delete_product_modal:
@@ -822,16 +830,19 @@ fr_CA:
new_variant: Nouvelle variante
bulk_update:
success: Changements sauvegardés
- edit_image:
- title: Modifier la photo du produit
- close: Retour
- upload: Télécharger la photo
delete_product:
success: Le produit a bien été supprimé
error: Le produit n'a pas pu être supprimé
delete_variant:
success: La variante a bien été supprimée
error: La variante n'a pas pu être supprimée
+ variant_row:
+ none_tax_category: Aucun
+ search_for_tax_categories: "Chercher les catégories de taxes"
+ category_field_name: "Catégorie"
+ tax_category_field_name: "Type de taxe"
+ product_row:
+ producer_field_name: "Producteur"
product_import:
title: import produit
file_not_found: Fichier non trouvé ou impossible à ouvrir
@@ -2086,7 +2097,6 @@ fr_CA:
label_account: "Compte"
label_more: "Afficher plus"
label_less: "Masquer"
- label_notices: "Informations"
cart_items: "Produits"
cart_headline: "Votre panier"
total: "Total"
@@ -2498,6 +2508,7 @@ fr_CA:
orders_bought_already_confirmed: "* déjà confirmé"
orders_confirm_cancel: "Voulez-vous vraiment annuler cette commande ?"
order_processed_successfully: "Votre commande a été traitée avec succès"
+ thank_you_for_your_order: "Merci pour votre commande"
products_cart_distributor_choice: "Distributeur pour votre commande:"
products_cart_distributor_change: "Vore distributeur pour cette commande sera dorénavant %{name} si vous ajoutez ce produit à votre panier."
products_cart_distributor_is: "Votre distributeur pour cette commande est %{name}."
@@ -3758,6 +3769,7 @@ fr_CA:
editing_tax_category: "Modifier une catégorie de taxe"
editing_tax_rate: "Modifier un taux"
editing_zone: "Modifier une zone"
+ editing_state: "Editer la province"
expiration: "Expiration"
invalid_payment_provider: "Fournisseur de paiement invalide"
items_cannot_be_shipped: "Les produits ne peuvent pas être envoyés"
@@ -3796,6 +3808,7 @@ fr_CA:
resend: "Renvoyer"
back_to_orders_list: "Retour à la liste des commandes"
back_to_payments_list: "Retour à la liste des paiements"
+ back_to_states_list: "Retour à la liste des provinces"
return_authorizations: "Autorisations de retours"
cannot_create_returns: "Impossible de créer une autorisation de retour car aucun produit n'a été livré pour cette commande."
select_stock: "Sélectionner le stock"
@@ -3998,6 +4011,11 @@ fr_CA:
validation:
must_be_int: "doit être un entier"
admin:
+ images:
+ edit:
+ title: Modifier la photo du produit
+ close: Retour
+ upload: Télécharger la photo
mail_methods:
send_testmail: "Envoyer un e-mail de test"
testmail:
@@ -4025,6 +4043,10 @@ fr_CA:
customers: "Acheteurs"
groups: "Groupes"
oidc_settings: "OIDC"
+ overview: "Aperçu"
+ product_import: "Importer"
+ enterprise_roles: "Roles"
+ payment_methods: "Méthodes de paiement"
product_properties:
index:
inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier}? (non applicable si information de remplacement déjà saisie)"
diff --git a/config/locales/fr_CH.yml b/config/locales/fr_CH.yml
index f89193fb84f..005351987ef 100644
--- a/config/locales/fr_CH.yml
+++ b/config/locales/fr_CH.yml
@@ -467,6 +467,7 @@ fr_CH:
edit: Modifier
clone: Dupliquer
delete: Supprimer
+ remove: Supprimer
image:
edit: Modifier
adjustments:
@@ -691,8 +692,12 @@ fr_CH:
clear_search: Annuler la recherche
table:
new_variant: Nouvelle variante
- edit_image:
- close: Retour
+ variant_row:
+ none_tax_category: Aucun
+ category_field_name: "Catégorie"
+ tax_category_field_name: "TVA applicable"
+ product_row:
+ producer_field_name: "Producteur"
product_import:
title: Import liste produits
file_not_found: Fichier non trouvé ou impossible à ouvrir
@@ -1804,7 +1809,6 @@ fr_CH:
label_account: "Compte"
label_more: "Afficher plus"
label_less: "Masquer"
- label_notices: "Informations"
cart_items: "Produits"
cart_headline: "Votre panier"
total: "Total"
@@ -3669,6 +3673,9 @@ fr_CH:
validation:
must_be_int: "doit être un entier"
admin:
+ images:
+ edit:
+ close: Retour
mail_methods:
send_testmail: "Envoyer un e-mail de test"
testmail:
@@ -3695,6 +3702,10 @@ fr_CH:
enterprise_relationships: "Permissions"
customers: "Acheteurs"
groups: "Groupes"
+ overview: "Aperçu"
+ product_import: "Importer"
+ enterprise_roles: "Roles"
+ payment_methods: "Méthodes de paiement"
product_properties:
index:
inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)"
diff --git a/config/locales/fr_CM.yml b/config/locales/fr_CM.yml
index 981cbe5f31c..b17ad8e5aba 100644
--- a/config/locales/fr_CM.yml
+++ b/config/locales/fr_CM.yml
@@ -404,6 +404,7 @@ fr_CM:
edit: Modifier
clone: Dupliquer
delete: Supprimer
+ remove: Supprimer
image:
edit: Modifier
adjustments:
@@ -628,8 +629,12 @@ fr_CM:
clear_search: Annuler la recherche
table:
new_variant: Nouvelle variante
- edit_image:
- close: Retour
+ variant_row:
+ none_tax_category: Aucun
+ category_field_name: "Catégorie"
+ tax_category_field_name: "TVA applicable"
+ product_row:
+ producer_field_name: "Producteur"
product_import:
title: Import liste produits
file_not_found: Fichier non trouvé ou impossible à ouvrir
@@ -1714,7 +1719,6 @@ fr_CM:
label_account: "Compte"
label_more: "Afficher plus"
label_less: "Masquer"
- label_notices: "Informations"
cart_items: "Produits"
cart_headline: "Votre panier"
total: "Total"
@@ -3563,6 +3567,9 @@ fr_CM:
validation:
must_be_int: "doit être un entier"
admin:
+ images:
+ edit:
+ close: Retour
mail_methods:
send_testmail: "Envoyer un e-mail de test"
testmail:
@@ -3589,6 +3596,10 @@ fr_CM:
enterprise_relationships: "Permissions"
customers: "Acheteurs"
groups: "Groupes"
+ overview: "Aperçu"
+ product_import: "Importer"
+ enterprise_roles: "Roles"
+ payment_methods: "Méthodes de paiement"
product_properties:
index:
inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)"
diff --git a/config/locales/hi.yml b/config/locales/hi.yml
index 182872feb81..6958aec8f7b 100644
--- a/config/locales/hi.yml
+++ b/config/locales/hi.yml
@@ -137,7 +137,8 @@ hi:
unprocessable_entity:
title: "जो परिवर्तन आप चाहते थे वह नामंजूर कर दिया गया था (422)"
message_html: "जो परिवर्तन आप चाहते थे वह नामंजूर कर दिया गया था। शायद आपने ऐसा परिवर्तित करने की कोशिश की हो, जिस तक आपका एक्सेस नहीं है।
"
- stimulus_reflex_error: "हमें माफ करें, लेकिन कुछ गलत हो गया।\n\nयह एक अस्थायी समस्या हो सकती है, इसलिए कृपया फिर से कोशिश करें या पेज को फिर से लोड करें।\nहम सभी त्रुटियों को रिकॉर्ड करते हैं और सम्भावित है की हम इसे ठीक करने पर काम कर रहे हों।\nयदि समस्या बनी रहती है या अत्यावश्यक है, तो कृपया हमसे संपर्क करें।"
+ general_error:
+ message: "हमें माफ करें, लेकिन कुछ गलत हो गया।\n\nयह एक अस्थायी समस्या हो सकती है, इसलिए कृपया फिर से कोशिश करें या पेज को फिर से लोड करें।\nहम सभी त्रुटियों को रिकॉर्ड करते हैं और सम्भावित है की हम इसे ठीक करने पर काम कर रहे हों।\nयदि समस्या बनी रहती है या अत्यावश्यक है, तो कृपया हमसे संपर्क करें।"
stripe:
error_code:
incorrect_number: "कार्ड नंबर गलत है।"
@@ -534,6 +535,7 @@ hi:
edit: एडिट करें
clone: क्लोन
delete: हटाएं
+ remove: मिटाएँ
image:
edit: एडिट करें
adjustments:
@@ -752,6 +754,7 @@ hi:
index:
header:
title: बल्क उत्पाद एडिट करें
+ content:
loading: अपने उत्पादों को लोड कर रहा है
filters:
search_products: उत्पादों के लिए सर्च करें
@@ -787,8 +790,12 @@ hi:
reset: परिवर्तनों को अस्वीकार करें
save: परिवर्तन सेव करें
new_variant: नया वैरिएंट
- edit_image:
- close: वापस जाएं
+ variant_row:
+ none_tax_category: कोई नहीं
+ category_field_name: "श्रेणी"
+ tax_category_field_name: "टैक्स श्रेणी"
+ product_row:
+ producer_field_name: "उत्पादक"
product_import:
title: उत्पाद इम्पोर्ट करें
file_not_found: फ़ाइल नहीं मिली या खोली नहीं जा सकी
@@ -2005,7 +2012,6 @@ hi:
label_account: "अकाउंट"
label_more: "और दिखाएं"
label_less: "कम दिखाएं"
- label_notices: "नोटिस"
cart_items: "आइटम्स"
cart_headline: "आपका शॉपिंग कार्ट"
total: "कुल"
@@ -3875,6 +3881,9 @@ hi:
validation:
must_be_int: "पूर्णांक होना ही चाहिए"
admin:
+ images:
+ edit:
+ close: वापस जाएं
mail_methods:
send_testmail: "टेस्ट ईमेल भेजें"
testmail:
@@ -3902,6 +3911,10 @@ hi:
customers: "ग्राहक"
groups: "ग्रुप्स"
oidc_settings: "OIDC सेटिंग्स"
+ overview: "अवलोकन"
+ product_import: "इम्पोर्ट करें"
+ enterprise_roles: "भूमिकाएँ"
+ payment_methods: "भुगतान की विधियाँ"
product_properties:
index:
inherits_properties_checkbox_hint: "%{supplier} से प्रॉपर्टीज़ इन्हेरिट करें? (जब तक कि ऊपर ओवरराइड न किया गया हो)"
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index a1a84a4054f..33ebc4d329e 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -1,5 +1,8 @@
hu:
language_name: "Angol"
+ time:
+ formats:
+ long: "%B %d, %Y %-l:%M %p"
activerecord:
models:
spree/product: Termék
@@ -8,12 +11,12 @@ hu:
spree/order/ship_address:
address1: "Szállítási cím (utca és házszám)"
address2: "Szállítási cím 2. sor"
- city: "Szállítási cím város"
- country: "Szállítási cím ország"
+ city: "Szállítási cím Város"
+ country: "Szállítási cím Ország"
phone: "Telefonszám"
firstname: "Keresztnév"
lastname: "Vezetéknév"
- zipcode: "Szállítási cím irányítószám"
+ zipcode: "Szállítási cím Irányítószám"
spree/order/bill_address:
address1: "Számlázási cím (Utca és Házszám)"
zipcode: "Számlázási cím Irányítószám"
@@ -29,8 +32,8 @@ hu:
enterprise_fee:
fee_type: Díjtípus
spree/order:
- payment_state: Fizetési állapot
- shipment_state: Szállítási állapot
+ payment_state: Fizetési státusz
+ shipment_state: Szállítási státusz
completed_at: 'Elkészült:'
number: Szám
state: Ország
@@ -40,12 +43,12 @@ hu:
state: Ország
source: Forrás
spree/product:
- name: "termék név"
+ name: "Termék Név"
price: "Ár"
primary_taxon: "Termékkategória"
supplier: "Termelő"
shipping_category_id: "Szállítási mód"
- variant_unit: "Változatos egység"
+ variant_unit: "Változat egysége"
variant_unit_name: "Változat egység neve"
unit_value: "Egység értéke"
spree/variant:
@@ -58,19 +61,27 @@ hu:
verification_value: "Ellenőrző érték"
year: "Év"
order_cycle:
- orders_close_at: Lezárási dátum
+ orders_close_at: Lezárás dátuma
variant_override:
count_on_hand: "Készlet"
+ spree/payment_method/calculator:
+ preferred_additional_item: "További tételek kalkulált költsége:"
+ enterprise:
+ white_label_logo_link: "A főoldalon használt logo linkje"
errors:
models:
+ spree/image:
+ attributes:
+ attachment:
+ integrity_error: "a betöltés nem sikerült. Kérjük, ellenőrizd, hogy a fájl nem sérült-e, és próbáld meg újra."
spree/user:
attributes:
email:
- taken: "Már létezik fiók ehhez az e-mailhez. Kérjük, jelentkezzen be, vagy állítsa vissza jelszavát."
+ taken: "Már létezik fiók ehhez az e-mailhez. Kérjük, jelentkezz be, vagy állítsd vissza a jelszavad."
reset_password_token:
invalid: érvénytelen
spree/order:
- no_card: Nincsenek engedélyezett hitelkártyák a terhelésre
+ no_card: Nincsenek engedélyezett hitelkártyák a terhelés elvégzésére
spree/credit_card:
attributes:
base:
@@ -86,14 +97,40 @@ hu:
limited_stock_but_no_count_on_hand: "meg kell adni, mert korlátozott a készlet"
messages:
blank: "nem lehet üres"
+ too_short: "túl rövid (minimum %{count}karakter)"
errors:
messages:
- file_size_out_of_range: "a 1%{file_size} mérete nem esik bele a kívánt tartományba"
+ content_type_invalid: "érvénytelen tartalom típus"
+ file_size_out_of_range: "a %{file_size} mérete nem esik bele a kívánt tartományba"
limit_out_of_range: "az összmenyiség kívül esik a megengedett tartományon"
image_metadata_missing: "nem használható kép"
+ dimension_min_inclusion: "legyen nagyobb vagy egyenlő %{width} x %{height} pixel"
+ dimension_max_inclusion: "legyen kisebb vagy egyenlő %{width} x %{height} pixel"
+ dimension_width_inclusion: "a szélesség nincs %{min} és %{max} pixel közt"
+ dimension_height_inclusion: "magasság nincs %{min} és %{max} pixel között"
+ dimension_width_greater_than_or_equal_to: "a szélesség legyen nagyobb vagy egyenlő %{length} pixel"
+ dimension_height_greater_than_or_equal_to: "a magasság legyen nagyobb vagy egyenlő %{length} pixel"
+ dimension_width_less_than_or_equal_to: "a szélesség legyen kisebb vagy egyenlő %{length} pixel"
+ dimension_height_less_than_or_equal_to: "a magasság legyen kisebb vagy egyenlő %{length} pixel"
+ dimension_width_equal_to: "a szélesség legyen egyenlő %{length} pixel"
+ dimension_height_equal_to: "a magasság legyen egyenlő %{length} pixel"
aspect_ratio_not_square: "négyzet alakú képnek kell lennie"
aspect_ratio_not_portrait: "portré képnek kell lennie"
+ aspect_ratio_not_landscape: "fekvő tájolású kép legyen"
+ aspect_ratio_is_not: "%{aspect_ratio} arányú legyen"
+ aspect_ratio_unknown: "ismeretlen arány"
image_not_processable: "nem használható kép"
+ not_found:
+ title: "A keresett oldal nem található! (404)"
+ message_html: "Kérlek, próbáld újra!Ez lehet egy átmeneti probléma. Kérlek, kattints a vissza gombra, hogy visszatérj az előző képernyőre, vagy menj vissza a(z) Kezdőlapra és próbáld újra.
Fordulj az Ügyfélszolgálathoz. Ha a probléma továbbra is fennáll, vagy sürgős, kérjük, értesíts minket róla. Elérhetőségeinket a globális Open Food Network helyi oldalán találod.
Nagy segítség, ha minél több részletet meg tudsz adni a nem található oldalról.
"
+ internal_server_error:
+ title: "Sajnáljuk! Hiba történt (500)"
+ message_html: "Kérjük, próbáld újra. Ez lehet egy átmeneti probléma. Kérjük, kattints a Vissza gombra, hogy visszatérj az előző képernyőre, vagy menjen vissza a Kezdőlapra és próbáld újra. Dolgozunk rajta
Ha már korábban is találkoztál ezzel a problémával, valószínűleg már tudunk róla és dolgozunk a megoldáson. Minden felmerülő hibát rögzítünk.
Fordulj az Ügyfélszolgálathoz Ha a probléma továbbra is fennáll, vagy sürgős, kérjük, értesíts minket róla. Elérhetőségeinket a helyi Open Food Network oldalon találod.
Nagy segítség, ha minél több részletet meg tudsz adni arról, hogy mit csinált, amikor ez a hiba felmerült.
"
+ unprocessable_entity:
+ title: "A művelet nem végrehajtható (422)"
+ message_html: "A művelet nem végrehajtható. Lehet, hogy olyan műveletet szeretnél végrehajtani, amihez nincs jogosultságod.
"
+ general_error:
+ message: "Sajnáljuk! Hiba történt.\n\nEz lehet egy átmeneti probléma. Kérjük, próbáld újra, vagy frissítsd az oldalt.\nMinden felmerülő hibát rögzítünk és valószínűleg már dolgozunk rajta.\nHa a probléma továbbra is fennáll, vagy sürgős, kérjük, értesíts minket róla. "
stripe:
error_code:
incorrect_number: "A kártyaszám hibás."
@@ -124,7 +161,7 @@ hu:
invalid_account: "A kártya vagy fiók, amelyhez a kártya kapcsolódik, érvénytelen."
invalid_amount: "A befizetés összege érvénytelen, vagy meghaladja a megengedett összeget."
invalid_pin: "A megadott PIN-kód helytelen. Ez az elutasító kód csak a kártyaolvasóval történő fizetésekre vonatkozik."
- issuer_not_available: "kártyakibocsátót nem sikerült elérni, így a fizetést nem sikerült engedélyezni."
+ issuer_not_available: "A kártyakibocsátót nem sikerült elérni, így a fizetést nem sikerült engedélyezni."
lost_card: "A fizetést elutasították, mert a kártya elveszett."
merchant_blacklist: "A fizetést elutasították, mert megegyezik a Stripe felhasználó tiltólistáján szereplő értékkel."
new_account_information_available: "A kártya vagy fiók, amelyhez a kártya kapcsolódik, érvénytelen."
@@ -133,7 +170,7 @@ hu:
offline_pin_required: "A kártyát elutasították, mivel PIN kódot igényel."
online_or_offline_pin_required: "A kártyát elutasították, mivel PIN kódot igényel."
pickup_card: "A kártya nem használható erre a fizetésre (lehetséges, hogy elveszett vagy ellopták)."
- pin_try_exceeded: "Túllépte a PIN-kód próbálkozások megengedett számát."
+ pin_try_exceeded: "Túllépted a PIN-kód próbálkozások megengedett számát."
reenter_transaction: "A kifizetést a kibocsátó ismeretlen okból nem tudta feldolgozni."
restricted_card: "A kártya nem használható erre a fizetésre (lehetséges, hogy elveszett vagy ellopták)."
revocation_of_all_authorizations: "A kártyát ismeretlen okból elutasították."
@@ -146,6 +183,9 @@ hu:
transaction_not_allowed: "A kártyát ismeretlen okból elutasították."
try_again_later: "A kártyát ismeretlen okból elutasították."
withdrawal_count_limit_exceeded: "Az ügyfél túllépte a kártyáján rendelkezésre álló egyenleget vagy hitelkeretet."
+ disconnect_failure: "Sikertelen a Stripe kapcsolat megszakítása."
+ success_code:
+ disconnected: "A Stripe fiók kapcsolat megszakadt."
activemodel:
errors:
messages:
@@ -154,7 +194,7 @@ hu:
order_management/subscriptions/validator:
attributes:
subscription_line_items:
- at_least_one_product: "^Kérjük, adjon hozzá legalább egy terméket"
+ at_least_one_product: "^Kérjük, adj hozzá legalább egy terméket"
not_available: "^%{name} nem érhető el a kiválasztott ütemezésből"
ends_at:
after_begins_at: "után kell lennie, ekkor kezdődik"
@@ -164,13 +204,17 @@ hu:
not_coordinated_by_shop: "nem a %{shop} koordinálja"
payment_method:
not_available_to_shop: "nem érhető el a %{shop} számára"
- invalid_type: "Cash vagy Stripe módszernek kell lennie"
+ invalid_type: "Készpénz vagy Stripe fizetési módnak kell lennie"
charges_not_allowed: "^Ez az ügyfél nem engedélyezi a hitelkártya-terhelést"
no_default_card: "^Ennél az ügyfélnél nem áll rendelkezésre alapértelmezett kártya"
shipping_method:
not_available_to_shop: "nem érhető el a %{shop} számára"
card_details: "A kártya adatai"
card_type: "Kártyatípus"
+ card_type_is: "A kártya típusa: "
+ unrecognized_card_type: "Nem azonosítható kártyatípus"
+ use_new_cc: "Használj egy másik bankkártyát"
+ what_is_this: "Mi ez?"
cardholder_name: "Kártyatulajdonos neve"
community_forum_url: "A közösségi fórum URL-je"
customer_instructions: "Vevői utasítások"
@@ -178,39 +222,41 @@ hu:
devise:
passwords:
spree_user:
- cannot_be_blank: "A felhasználói jelszó mező nem lehet üres. Adjon meg egy jelszót."
+ cannot_be_blank: "A felhasználói jelszó mező nem lehet üres. Adj meg egy jelszót."
confirmations:
- send_instructions: "Néhány percen belül e-mailt fog kapni a fiók megerősítéséhez szükséges utasításokkal."
+ send_instructions: "Néhány percen belül e-mailt fogsz kapni a fiók megerősítéséhez szükséges utasításokkal."
failed_to_send: "Hiba történt a megerősítő e-mail elküldése közben."
resend_confirmation_email: "Küldd újra a megerősítő email-t."
- confirmed: "Köszönjük, hogy megerősítette e-mailjét! Most már bejelentkezhet."
- not_confirmed: "Az e-mail címét nem sikerült megerősíteni. Talán már befejezte ezt a lépést?"
+ confirmed: "Köszönjük, hogy megerősítetted az e-mailedet! Most már bejelentkezhetsz."
+ not_confirmed: "Az e-mail címed nem sikerült megerősíteni. Talán már befejezted ezt a lépést?"
user_confirmations:
spree_user:
- send_instructions: "Néhány percen belül e-mailt fog kapni a fiók megerősítéséhez szükséges utasításokkal."
+ send_instructions: "Néhány percen belül e-mailt fogsz kapni a fiók megerősítéséhez szükséges utasításokkal."
confirmation_sent: "E-mail visszaigazolás elküldve"
confirmation_not_sent: "Hiba a megerősítő e-mail küldésekor"
user_registrations:
spree_user:
signed_up_but_unconfirmed: "Megerősítő linket tartalmazó üzenetet küldtünk az e-mail címedre. Kérjük, nyisd meg a linket a fiók aktiválásához."
- unknown_error: "Hiba történt a fiók létrehozásakor. Ellenőrizze e-mail címét, és próbálja újra."
+ unknown_error: "Hiba történt a fiók létrehozásakor. Ellenőrizd e-mail címed, és próbáld újra."
failure:
disabled: "A fiókot inaktiváltuk. Kérünk fordulj munkatársunkhoz, hogy feloldjuk."
invalid: |
- Invalid email or password.: Rossz email cím vagy jelszó.
- Were you a guest last time? Perhaps you need to create an account or reset your password.: Vendég voltál legutóbb? Lehet, hogy fiókot kell létrehoznia, vagy vissza kell állítania jelszavát.
- unconfirmed: "A folytatás előtt meg kell erősítenie fiókját."
- already_registered: "Ez az email cím már regisztrálva van. Kérjük, jelentkezzen be a folytatáshoz, vagy lépjen vissza, és használjon másik e-mail címet."
+ Rossz email cím vagy jelszó.
+ Legutóbb is vendégként használtad a felületet? Talán létre kell hoznod egy fiókot vagy vissza kell állítanod a jelszavad:
+ unconfirmed: "A folytatás előtt meg kell erősítened a fiókod."
+ already_registered: "Ez az email cím már regisztrálva van. Kérjük, jelentkezz be a folytatáshoz, vagy lépj vissza, és használj másik e-mail címet."
success:
logged_in_succesfully: "Sikeresen bejelentkeztél"
sessions:
- signed_out: "Sikeresen kijelentkezett."
- already_signed_out: "Sikeresen kijelentkezett."
+ signed_out: "Sikeresen kijelentkeztél."
+ already_signed_out: "Sikeresen kijelentkeztél."
user_passwords:
spree_user:
- updated_not_active: "Jelszava visszaállításra került, de e-mail-címét még nem erősítették meg."
+ updated_not_active: "Jelszavad visszaállításra került, de az e-mail-címed még nem erősítették meg."
updated: "Jelszavad sikeresen megváltozott, és bejelentkeztél."
- send_instructions: "Néhány percen belül e-mailt fog kapni a fiók megerősítéséhez szükséges utasításokkal."
+ send_instructions: "Néhány percen belül e-mailt fogsz kapni a fiók megerősítéséhez szükséges utasításokkal."
+ oidc:
+ failure: "Nem tudtál bejelentkezni: %{error}"
home_page_alert_html: "Kezdőlap figyelmeztető HTML"
hub_signup_case_studies_html: "Átvételi pont regisztrációs esettanulmányok HTML"
hub_signup_detail_html: "Átvételi pont regisztrációs részletek HTML"
@@ -228,18 +274,18 @@ hu:
menu_7_icon_name: "7. menü ikon neve"
models:
order_cycle:
- cloned_order_cycle_name: "%{order_cycle} MÁSOLA"
+ cloned_order_cycle_name: "%{order_cycle} MÁSOLATA"
tax_rate:
included_in_price: "Az ár tartalmazza"
- open_street_map_enabled: "Az Utcatérkép megnyitása engedélyezve"
- open_street_map_default_latitude: "Nyissa meg az Utcatérkép alapértelmezett szélességi fokát"
- open_street_map_default_longitude: "Nyissa meg az Utcatérkép alapértelmezett hosszúságát"
- open_street_map_provider_name: "Nyissa meg az Utcatérkép-szolgáltató nevét"
- open_street_map_provider_options: "Nyissa meg az Utcatérkép-szolgáltató beállításait"
+ open_street_map_enabled: "Az Open Street Map megnyitása engedélyezve"
+ open_street_map_default_latitude: "Open Street Map alapértelmezett szélességi fok"
+ open_street_map_default_longitude: "Open Street Map alapértelmezett hosszúsági fok"
+ open_street_map_provider_name: " Open Street Map szolgáltató neve"
+ open_street_map_provider_options: "Open Street Map szolgáltató beállításai"
producer_signup_case_studies_html: "Termelői regisztrációs esettanulmányok HTML"
- producer_signup_detail_html: "Termelői regisztrációs részletek HTML"
+ producer_signup_detail_html: "Termelői regisztráció részletek HTML"
producer_signup_pricing_table_html: "Termelői regisztrációs ártáblázat HTML"
- producers_social: "Szociális szövetkezetek"
+ producers_social: "Termelői szövetkezet"
resume_order: "Rendelés folytatása"
sku: "SKU"
subtotal: "Részösszeg"
@@ -251,18 +297,22 @@ hu:
integer_array_validator:
not_array_error: "tömbnek kell lennie"
invalid_element_error: "csak érvényes egész számokat tartalmazhat"
+ report_job:
+ report_failed: |
+ Ez a lekérdezés nem sikerült. Lehet, hogy túl nagy a feldolgozáshoz.
+ Megvizsgáljuk, de kérjük, értesíts minket, ha a probléma továbbra is fennáll.
enterprise_mailer:
confirmation_instructions:
- subject: "Kérjük, erősítse meg %{enterprise} e-mail címét"
+ subject: "Kérjük, erősítsd meg %{enterprise} e-mail címét"
welcome:
subject: "%{enterprise} most itt van: %{sitename}"
- email_welcome: "Üdvözöljük"
+ email_welcome: "Üdvözlünk"
email_registered: "most része"
email_userguide_html: "A Termelő vagy Átvételi pont beállításához szükséges részletes támogatást tartalmazó felhasználói útmutató itt található: %{link}"
- userguide: "Nyissa meg a Food Network felhasználói kézikönyvét"
- email_admin_html: "Fiókját úgy kezelheti, hogy bejelentkezik a %{link} oldalra, vagy kattintson a kezdőlap jobb felső sarkában lévő fogaskerékre, és válaszd az Adminisztráció lehetőséget."
+ userguide: "Nyissa meg az Open Food Network felhasználói kézikönyvét"
+ email_admin_html: "Fiókod úgy kezelheted, hogy bejelentkezel a %{link} oldalra, vagy kattints a kezdőlap jobb felső sarkában lévő fogaskerékre, és válaszd az Adminisztráció lehetőséget."
admin_panel: "Adminisztrációs Panel"
- email_community_html: "Van egy online fórumunk is az OFN szoftverrel és az élelmiszeripari vállalkozás vezetésének egyedi kihívásaival kapcsolatos közösségi vitákhoz. Arra biztatjuk, hogy csatlakozzon. Folyamatosan fejlődünk, és az Ön hozzájárulása ehhez a fórumhoz meghatározza, hogy mi történik ezután. %{link}"
+ email_community_html: "Van egy online fórumunk is az OFN szoftverrel és az élelmiszeripari vállalkozás vezetésének egyedi kihívásaival kapcsolatos közösségi vitákhoz. Arra bíztatunk, hogy csatlakozz. Folyamatosan fejlődünk, és a Te hozzájárulásod ehhez a fórumhoz meghatározza, hogy mi történik ezután. %{link}"
join_community: "Csatlakozz a közösséghez"
invite_manager:
subject: "%{enterprise} meghívott téged menedzsernek"
@@ -274,13 +324,16 @@ hu:
report_ready:
subject: "A jelentés kész"
heading: "A jelentés letöltésre kész"
+ intro: |
+ Az alábbi link egy hét múlva érvényét veszti.
+ link_label: "%{name}"
shipment_mailer:
shipped_email:
- dear_customer: "Tisztelt Ügyfelünk,"
- instructions: "Megrendelését kiszállították"
+ dear_customer: "Kedves Ügyfelünk,"
+ instructions: "Megrendelésed kiszállították"
shipment_summary: "Szállítási összefoglaló"
subject: "Szállítási értesítés"
- thanks: "Köszönjük csatlakozását."
+ thanks: "Köszönjük, hogy csatlakoztál!"
track_information: "Nyomon követési információ: %{tracking}"
track_link: "Nyomon követési link: %{url}"
subscription_mailer:
@@ -294,8 +347,8 @@ hu:
intro: "Az alábbiakban összefoglaljuk azokat az előfizetési rendeléseket, amelyeket most véglegesítettek a %{shop} számára."
summary_overview:
total: Összesen %{count} előfizetést jelöltek meg automatikus feldolgozásra.
- success_zero: Ezeknek a,egyiket sem sikerült feldolgozni.
- success_some: Ezeknek a, %{count} sikeresen feldolgozva.
+ success_zero: Egyiket sem sikerült feldolgozni.
+ success_some: Ezeknek a, %{count}-a sikeresen feldolgozva.
success_all: Mindegyik sikeresen feldolgozásra került.
issues: A felmerült problémák részleteit alább közöljük.
summary_detail:
@@ -305,7 +358,7 @@ hu:
explainer: Ezeket a rendeléseket feldolgoztuk, de néhány kért cikkhez nem állt rendelkezésre elegendő készlet
empty:
title: Nincs raktáron (%{count} rendelés)
- explainer: Ezeket a rendeléseket nem tudtuk feldolgozni, mert nem volt készlet a kért cikkekhez
+ explainer: Ezeket a rendeléseket nem tudtuk feldolgozni, mert nem volt készlet a kért termékekből
complete:
title: Már feldolgozva (%{count} rendelés)
explainer: Ezeket a rendeléseket már késznek jelölték, és ezért érintetlenül maradtak
@@ -314,16 +367,16 @@ hu:
explainer: Ezen rendelések automatikus feldolgozása hiba miatt meghiúsult. A hiba lehetőség szerint fel lett sorolva.
failed_payment:
title: Sikertelen fizetés (%{count} megrendelés)
- explainer: Ezen rendelések fizetésének automatikus feldolgozása hiba miatt meghiúsult. A hiba lehetőség szerint fel lett sorolva.
+ explainer: Ezen rendelések fizetésének automatikus feldolgozása hiba miatt meghiúsult. A hiba feltüntetésre került, ahol lehetséges.
other:
title: Egyéb hiba (%{count} rendelés)
- explainer: megrendelések automatikus feldolgozása ismeretlen okból meghiúsult. Ennek nem szabadna előfordulnia," kérjük lépjen kapcsolatba velünk, ha ezt látja.
+ explainer: A megrendelések automatikus feldolgozása ismeretlen okból meghiúsult. Ennek nem szabadna előfordulnia, kérjük lépj kapcsolatba velünk, ha ezt látod.
home: "OFN"
title: "Open Food Network"
welcome_to: "Üdvözli az"
- site_meta_description: "Az alapoktól kezdjük. A gazdálkodókkal és termelőkkel, akik készen állnak arra, hogy büszkén és őszintén elmondják történeteiket. A forgalmazókkal, akik készen állnak arra, hogy tisztességesen és becsületesen összekapcsolják az embereket a termékekkel. Azokkal a vásárlókkal, akik hisznek abban, hogy jobb heti vásárlási döntések…"
+ site_meta_description: "Az alapoktól kezdjük. A gazdálkodókkal, akiknek fontos, hogy közösen, egy fenntartható és mindenki számára átlátható, hazai élelemrendszert hozzunk létre. A bevásárlóközösségekkel, fogyasztói csoportokkal, forgalmazókkal, akik összekapcsolják az embereket a termelőkkel és a termékekkel, és biztosítani szeretnék, hogy a termelők tisztességes díjazásban részesüljenek. Azokkal a fogyasztókkal, akik hisznek abban, hogy döntéseiknek hatása van."
search_by_name: Keresés név vagy település szerint...
- producers_join: Az ausztrál termelők most már csatlakozhatnak az Open Food Networkhöz.
+ producers_join: Az magyar termelők most már csatlakozhatnak az Open Food hálózatához.
charges_sales_tax: Áfaköteles?
business_address: "Vállalkozás címe"
print_invoice: "Számla nyomtatása"
@@ -336,31 +389,35 @@ hu:
ship_order: "Szállítási rendelés"
cancel_order: "Megrendelés visszavonása"
confirm_send_invoice: "Erről a megrendelésről számlát küldünk a vásárlónak. Biztos, hogy akarod folytatni?"
- confirm_resend_order_confirmation: "Biztos, hogy újra el akarja küldeni a rendelést visszaigazoló e-mailt?"
+ confirm_resend_order_confirmation: "Biztos, hogy újra el akarod küldeni a rendelést visszaigazoló e-mailt?"
+ must_have_valid_business_number: "%{enterprise_name}a számlázás igénybevételéhez érvényes ABN-nel kell rendelkeznie."
invoice: "Számla"
+ invoices: "Számlák"
+ file: "File"
active: "Aktív"
+ download: "Letöltés"
cancelled: "Törölve"
more: "Több"
say_no: "Nem"
say_yes: "Igen"
ongoing: Folyamatban lévő
- bill_address: számlázási cím
- ship_address: szállítási cím
- sort_order_cycles_on_shopfront_by: "Rendezési ciklusok rendezése a átvételi pontban:"
+ bill_address: Számlázási cím
+ ship_address: Szállítási cím
+ sort_order_cycles_on_shopfront_by: "Rendelési ciklusok rendezése a átvételi pontban az alábbi szerint:"
required_fields: A kötelező mezőket csillag jelöli
- select_continue: Válassz a fentiek közül és kattints
- remove: Távolítsa el
+ select_continue: Válassz és Folytasd
+ remove: Eltávolítás
collapse_all: Mindet összecsuk
expand_all: Az összes kibontása
loading: Betöltés...
show_more: Mutass többet
show_all: Mutasd az összeset
show_all_with_more: "Az összes megjelenítése (további %{num})"
- cancel: Vissza
+ cancel: Törlés
edit: Szerkesztés
clone: Klón
distributors: Forgalmazók
- distribution: terjesztés
+ distribution: Forgalmazás
order_cycles: Rendelési ciklusok
bulk_order_management: Tömeges megrendelés kezelése
enterprises: Vállalkozások
@@ -390,30 +447,31 @@ hu:
'no': "Nem"
y: 'Y'''
n: 'N'''
- powered_by: Powered by
- blocked_cookies_alert: "Előfordulhat, hogy az Ön böngészője blokkolja az oldal használatához szükséges cookie-kat. Kattintson az alábbi gombra a cookie-k engedélyezéséhez és az oldal újratöltéséhez."
+ powered_by: 'Készült a '
+ blocked_cookies_alert: "Előfordulhat, hogy a böngésződ blokkolja az oldal használatához szükséges cookie-kat. Kattints az alábbi gombra a cookie-k engedélyezéséhez és az oldal újratöltéséhez."
allow_cookies: "Cookie-k engedélyezése"
none: Egyik sem
notes: Megjegyzések
error: Hiba
+ voucher: Utalvány
processing_payment: "Fizetés feldolgozása..."
no_pending_payments: "Nincsenek függőben lévő kifizetések"
- invalid_payment_state: "Érvénytelen fizetési állapot: %{state}"
+ invalid_payment_state: "Érvénytelen fizetési státusz: %{state}"
filter_results: Eredmények szűrése
clear_filters: Szűrők törlése
quantity: Mennyiség
pick_up: Átvétel
- ok: rendben
+ ok: OK
copy: Másolat
- change_my_password: "Változtasd meg a jelszavamat"
- update_password: "Frissítse a jelszót"
+ change_my_password: "Jelszó megváltoztatása"
+ update_password: "Frissítsd a jelszót"
password_confirmation: Jelszó megerősítése
reset_password_token: Jelszó token visszaállítása
- expired: lejárt, kérjen újat
+ expired: lejárt, kérj újat
back_to_payments_list: "Vissza a fizetési listához"
maestro_or_solo_cards: "Maestro/Solo kártyák"
backordered: "Hátrarendelt"
- on_hand: "Készlet"
+ on_hand: "Raktáron"
on hand: "Készlet"
ship: "Szállítás"
shipping_category: "Szállítási mód"
@@ -425,8 +483,8 @@ hu:
actions:
create_and_add_another: "Hozz létre és adj hozzá egy másikat"
create: "Létrehozás"
- cancel: "Vissza"
- resume: "Vissza"
+ cancel: "Törlés"
+ resume: "Összefoglaló"
save: "Mentés"
edit: "Szerkesztés"
update: "Frissítés"
@@ -442,18 +500,22 @@ hu:
filters:
categories:
title: Kategóriák
+ selected_categories: "%{count}kategóriák kiválasztva"
producers:
title: Termelők
+ selected_producers: "%{count}termelő kiválasztva"
+ per_page: "%{count}item/oldal"
colums: Oszlopok
columns:
name: Név
unit: Mértékegység
unit_value: Egység értéke
+ display_as: Egység megjelenítése mint
price: Ár
producer: Termelő
category: Kategória
- sku: SKU
- on_hand: "Készlet"
+ sku: SKU kód
+ on_hand: "Raktáron"
on_demand: "Igény szerint"
tax_category: "Adókategória"
inherits_properties: "Megörökli az tulajdonságokat?"
@@ -464,8 +526,8 @@ hu:
price: Ár
producer: Termelő
category: Kategória
- sku: SKU
- on_hand: "Készlet"
+ sku: SKU kód
+ on_hand: "Raktáron"
on_demand: "Igény szerint"
tax_category: "Adókategória"
inherits_properties: "Megörökli az tulajdonságokat?"
@@ -474,10 +536,11 @@ hu:
edit: Szerkesztés
clone: Klón
delete: Töröl
+ remove: Eltávolítás
image:
edit: Szerkesztés
adjustments:
- skipped_changing_canceled_order: "A törölt rendelést nem módosíthatja."
+ skipped_changing_canceled_order: "A törölt rendelést nem módosíthatod."
begins_at: 'Kezdete:'
begins_on: Kezdődik
bill_address: "Számla címe"
@@ -518,17 +581,17 @@ hu:
clear_all: Mindent kitöröl
start_date: "Kezdő dátum"
end_date: "Befejezés dátuma"
- unsaved_changes: "Nem mentett módosításai vannak"
+ unsaved_changes: "Nem mentett módosításaid vannak"
form_invalid: "Az űrlap hiányzó vagy érvénytelen mezőket tartalmaz"
clear_filters: Szűrők törlése
clear: Törlés
save: Mentés
- cancel: Vissza
+ cancel: Törlés
back: Vissza
show_more: Mutass többet
show_n_more: 'További %{num} '
- choose: "Választ..."
- please_select: Kérlek, válassz...
+ choose: "Választás..."
+ please_select: Kérjük, válassz...
column_save_as_default: Mentés alapértelmezettként
columns: Oszlopok
actions: Akciók
@@ -538,15 +601,18 @@ hu:
tag_has_rules: "Meglévő szabályok ehhez a címkéhez: %{num}"
has_one_rule: "egy szabálya van"
has_n_rules: "%{num} szabálya van"
- unsaved_confirm_leave: "Ezen az oldalon vannak nem mentett módosítások. Folytatás mentés nélkül?"
+ unsaved_confirm_leave: "Ezen az oldalon vannak nem mentett módosítások. Folytatod mentés nélkül?"
available_units: "Rendelkezésre álló egységek"
+ terms_of_service_have_been_updated_html: "Az Open Food Network Általános Szerződési Feltételek frissítésre kerültek: %{tos_link}"
+ terms_of_service: Olvasd el az Általános Szerződési Feltételeket
+ accept_terms_of_service: Az Általános Szerződési Feltételek elfogadása
shopfront_settings:
embedded_shopfront_settings: "Beágyazott kirakatbeállítások"
enable_embedded_shopfronts: "Beágyazott kirakatok engedélyezése"
embedded_shopfronts_whitelist: "Külső domainek engedélyezési listája"
terms_of_service_files:
create:
- select_file: "Kérjük, először válasszon egy fájlt."
+ select_file: "Kérjük, először válassz egy fájlt."
show:
title: "Szolgáltatási feltételek fájlok"
no_files: "Még nem töltöttek fel szolgáltatási feltételeket."
@@ -572,10 +638,10 @@ hu:
stripe_connect_enabled: Engedélyezi az átadópontok számára a fizetés elfogadását a Stripe Connect használatával?
no_api_key_msg: Ehhez a vállalkozáshoz nem tartozik Stripe-fiók.
configuration_explanation_html: A Stripe Connect integráció konfigurálására vonatkozó részletes utasításokért, kérjük, olvasd el ezt az útmutatót.
- status: Állapot
+ status: Státusz
ok: Rendben
instance_secret_key: Példány titkos kulcsa
- account_id: felhasználónév
+ account_id: Felhasználónév
business_name: Vállalkozás neve
charges_enabled: Díjak engedélyezve
charges_enabled_warning: "Figyelmeztetés: A terhelések nem engedélyezettek az Ön fiókjában"
@@ -595,11 +661,11 @@ hu:
new_customer: "Új vevő"
code: Kód
duplicate_code: "Ez a kód már használatban van."
- bill_address: "számlázási cím"
- ship_address: "szállítási cím"
- balance: "Egyensúly"
+ bill_address: "Számlázási cím"
+ ship_address: "Szállítási cím"
+ balance: "Mérleg"
update_address_success: "A cím sikeresen frissítve."
- update_address_error: "Sajnálom! Kérjük, töltse ki az összes kötelező mezőt!"
+ update_address_error: "Sajnáljuk! Kérjük, töltsd ki az összes kötelező mezőt!"
edit_bill_address: "Számlázási cím szerkesztése"
edit_ship_address: "Szállítási cím szerkesztése"
required_fileds: "A kötelező mezőket csillag jelöli"
@@ -627,6 +693,10 @@ hu:
your_content: Az Ön tartalma
user_guide: Használati útmutató
map: Térkép
+ dfc_product_imports:
+ index:
+ title: "DFC termékkatalógus importálása"
+ imported_products: "Importált termékek:"
enterprise_fees:
index:
title: "Vállalkozási díjak"
@@ -634,10 +704,10 @@ hu:
fee_type: "Díjtípus"
name: "Név"
tax_category: "Adókategória"
- calculator: "Kiszámítási mód"
- calculator_values: "Kiszámítási mód"
+ calculator: "Kalkulátor"
+ calculator_values: "Kalkulátor értékei"
search: "Keresés"
- name_placeholder: "pl csomagolási díj"
+ name_placeholder: "pl. csomagolási díj"
enterprise_groups:
index:
new_button: Új vállalkozási csoport
@@ -671,19 +741,19 @@ hu:
upload_an_image: Tölts fel egy képet
seo:
product_search_keywords: "Termékkeresési kulcsszavak"
- product_search_tip: "Írjon be olyan szavakat, amelyek megkönnyítik a termékek keresését az oldalon. Használjon szóközt az egyes kulcsszavak elválasztásához."
- seo_tip: "Írjon be olyan szavakat, amelyek megkönnyítik termékei keresését az interneten. Használjon szóközt az egyes kulcsszavak elválasztásához."
+ product_search_tip: "Írj be olyan szavakat, amelyek megkönnyítik a termékek keresését az oldalon. Használj szóközt az egyes kulcsszavak elválasztásához."
+ seo_tip: "Írj be olyan szavakat, amelyek megkönnyítik termékek keresését az interneten. Használj szóközt az egyes kulcsszavak elválasztásához."
search: "Keresés"
properties:
property_name: "Tulajdonság neve"
inherited_property: "Öröklött tulajdonság"
variants:
- infinity: "végtelenség"
- to_order_tip: "rendelésre készült termékeknek nincs meghatározott készletszintjük, például a rendelésre frissen készült kenyérnek."
+ infinity: "Végtelen"
+ to_order_tip: "A megrendelésre készült termékeknek nincs meghatározott készletszintjük, például a rendelésre frissen készült kenyérnek."
back_to_products_list: "Vissza a termékek listájához"
editing_product: "Termék szerkesztése"
tabs:
- product_details: "termék leírás"
+ product_details: "Termék leírás"
group_buy_options: "Csoportos vásárlási lehetőségek"
images: "Képek"
variants: "Változatok"
@@ -692,14 +762,25 @@ hu:
index:
header:
title: Termékek tömeges szerkesztése
+ content:
+ loading: Termékeid betöltése
delete_modal:
delete_product_modal:
heading: "Termék törlése"
+ prompt: "Ezzel véglegesen eltávolítod a listáról."
confirmation_text: "Termék törlése"
+ cancellation_text: "A termék megtartása"
delete_variant_modal:
heading: "Változat törlése"
+ prompt: "Ezzel véglegesen eltávolítod a listáról."
confirmation_text: "Változat törlése"
+ cancellation_text: "Változat megtartása"
filters:
+ search_products: Keresés a termékek között
+ search_for_producers: Keresés termelőre
+ all_producers: Minden termelő
+ search_for_categories: Keresés termékkategóriára
+ all_categories: Minden kategória
producers:
label: Termelők
categories:
@@ -707,29 +788,46 @@ hu:
search: Keresés
sort:
pagination:
+ total_html: "%{total} terméket találtunk a keresési feltételek alapján. %{from}-től %{to}-ig mutat."
+ per_page:
+ show: Mutasd
+ per_page: "%{num}per oldal"
clear_search: Keresés törlése
+ no_products:
+ no_products_found: Nem találtunk termékeket
+ import_products: Több termék importálása
+ no_products_found_for_search: Nem találtunk a keresési feltételeknek megfelelő termékeket
table:
+ changed_summary:
+ one: "%{count} termék módosítva."
+ other: "%{count} termék módosítva."
error_summary:
saved:
- one: "a termék helyesen lett elmentve, de"
- other: "a termékek helyesen lettek elmentve, de"
+ one: "%{count}termék helyesen lett elmentve, de"
+ other: "%{count} termékek helyesen lettek elmentve, de"
+ reset: Változások elvetése
save: Változások mentése
new_variant: Új variáns
bulk_update:
success: Változtatások mentve
- edit_image:
- close: Vissza
delete_product:
success: Sikeresen törölte a terméket
error: A terméket nem lehet törölni
delete_variant:
- success: Sikeresen törölte a terméket
+ success: Sikeresen törölte a termék változatot
error: A változatot nem lehet törölni
+ variant_row:
+ none_tax_category: Egyik sem
+ search_for_tax_categories: "Keresés adókategóriára."
+ category_field_name: "Kategória"
+ tax_category_field_name: "Adókategória"
+ product_row:
+ producer_field_name: "Termelő"
product_import:
title: Termék importálása
file_not_found: A fájl nem található vagy nem nyitható meg
no_data: Nem található adat a táblázatban
- confirm_reset: "Ezzel nullára állítja a készletszintet az n vállalkozás összes olyan termékénél, amely nem szerepel a feltöltött fájlban"
+ confirm_reset: "Ezzel nullára állítod a készletszintet az \nvállalkozás összes olyan termékénél, amely nem szerepel a feltöltött fájlban"
model:
no_file: "hiba: nincs fájl feltöltve"
could_not_process: "nem sikerült feldolgozni a fájlt: érvénytelen fájltípus"
@@ -737,13 +835,15 @@ hu:
conditional_blank: nem lehet üres, ha a unit_type mező üres
no_product: nem talált egy terméket sem az adatbázisban
not_found: nem található az adatbázisban
+ category_not_found: nem felel meg az engedélyezett kategóriáknak. Nézd meg a helyes kategóriákat, amelyek közül választhatsz a termékimport oldalról, vagy ellenőrizd, hogy nincs-e helyesírási hiba.
not_updatable: nem frissíthető a meglévő termékeken termékimporttal
+ values_must_be_same: azonos név alatt azonos terméknek kell szerepelnie
blank: nem lehet üres
products_no_permission: nincs engedélye a vállalkozás termékeinek kezelésére
inventory_no_permission: nincs engedélye készlet létrehozására ehhez a termelőhöz
none_saved: egyetlen terméket sem mentett sikeresen
line_number: "%{number}. sor:"
- encoding_error: "Kérjük, ellenőrizze a forrásfájl nyelvi beállítását, és győződjön meg arról, hogy UTF-8 kódolással mentette"
+ encoding_error: "Kérjük, ellenőrizd a forrásfájl nyelvi beállítását, és győződj meg arról, hogy UTF-8 kódolással mentette"
unexpected_error: "A termékimportálás váratlan hibát észlelt a fájl megnyitásakor: %{error_message}"
malformed_csv: "A termékimportálás hibás formátumú CSV-fájlt észlelt: %{error_message}"
index:
@@ -766,6 +866,7 @@ hu:
shipping_categories: Szállítási módok
dfc_import_form:
enterprise: "Vállalkozás"
+ catalog_url: "DFC katalógus URL"
import: "Importálás"
import:
review: Felülvizsgálat
@@ -776,23 +877,23 @@ hu:
no_valid_entries: Nem található érvényes bejegyzés
none_to_save: Nincsenek menthető bejegyzések
some_invalid_entries: Az importált fájl érvénytelen bejegyzéseket tartalmaz
- fix_before_import: Kérjük, javítsa ki ezeket a hibákat, és próbálja újra importálni a fájlt
- save_valid?: Egyelőre menti az érvényes bejegyzéseket, és elveti a többit?
+ fix_before_import: Kérjük, javítsd ki ezeket a hibákat, és próbáld újra importálni a fájlt
+ save_valid?: Mented az érvényes bejegyzéseket, és elveted a többit?
no_errors: Nem észleltek hibát!
- save_all_imported?: Menti az összes importált terméket?
+ save_all_imported?: Mented az összes importált terméket?
options_and_defaults: Beállítások és alapértelmezett beállítások importálása
no_permission: nincs engedélye ennek a vállalkozásnak a kezelésére
not_found: vállalkozás nem található az adatbázisban
no_name: Névtelen
blank_enterprise: egyes termékekhez nincs definiálva a vállalkozás
reset_absent?: Hiányzó termékek visszaállítása
- reset_absent_tip: Állítsa a készletet nullára minden olyan olyan terméknél, amely nem szerepel a fájlban
+ reset_absent_tip: Állítsd a készletet nullára minden olyan olyan terméknél, amely nem szerepel a fájlban
overwrite_all: Az összes felülírása
overwrite_empty: Ha üres, írja felül
- default_stock: Állítsa be a készletszintet
+ default_stock: Állítsd be a készletet
default_tax_cat: Adókategória beállítása
default_shipping_cat: Szállítási mód beállítása
- default_available_date: Állítsa be az elérhető dátumot
+ default_available_date: Állítsd be az elérhetőségi dátumot
validation_overview: Az importálás ellenőrzésének áttekintése
entries_found: Bejegyzések találhatók az importált fájlban
entries_with_errors: Az elemek hibákat tartalmaznak, és nem importálhatók
@@ -805,7 +906,7 @@ hu:
line: Vonal
item_line: Tételsor
import_review:
- not_updatable_tip: "következő mezők nem frissíthetők tömeges importálással meglévő termékek esetén:"
+ not_updatable_tip: "A következő mezők nem frissíthetők tömeges importálással meglévő termékek esetén:"
fields_ignored: Ezeket a mezőket a rendszer figyelmen kívül hagyja az importált termékek mentésekor.
entries_table:
not_updatable: Ez a mező nem frissíthető tömeges importálással meglévő termékeken
@@ -846,49 +947,49 @@ hu:
title: Leltár
description: Ezen az oldalon kezelheted vállalkozásod készleteit. Az itt beállított termékadatok felülírják a „Termékek” oldalon megadottakat
enable_reset?: Engedélyezi a készlet visszaállítását?
- default_stock: "Alapértelmezett részvény"
+ default_stock: "Alapértelmezett készlet"
inherit?: Örököl?
add: Hozzáadás
hide: Elrejt
import_date: Importált
select_a_shop: Válaszd az A árusítóhely lehetőséget
- review_now: Tekintse át most
+ review_now: Tekintsd át most
new_products_alert_message: '%{new_product_count} új termék áll rendelkezésre, amelyet hozzáadhat készletéhez.'
- currently_empty: A készlet jelenleg üres
- no_matching_products: Nem található megfelelő termék a készletében
- no_hidden_products: Egyetlen termék sincs elrejtve ebből a készletből
+ currently_empty: A leltár jelenleg üres
+ no_matching_products: Nem található megfelelő termék a leltárban
+ no_hidden_products: Egyetlen termék sincs elrejtve ebből a leltárból
no_matching_hidden_products: Egyetlen rejtett termék sem felel meg a keresési feltételeknek
no_new_products: Nincsenek új termékek, amelyeket hozzáadhatnának ehhez a készlethez
no_matching_new_products: Egyetlen új termék sem felel meg a keresési feltételeknek
- inventory_powertip: Ez az Ön termékkészlete. Termékek hozzáadásához a készlethez, a Megtekintés legördülő menüből válaszd az „Új termékek” lehetőséget.
+ inventory_powertip: Ez az Ön termékkészlete. Termékek hozzáadásához a készlethez, a Megtekintés legördülő menüből válaszd az „Új termék” lehetőséget.
hidden_powertip: Ezeket a termékeket elrejtette a készletéből, és nem lesz elérhető az oldalon. A "Hozzáadás" gombra kattintva hozzáadhat egy terméket a készletéhez.
- new_powertip: Ezeket a termékeket felveheti a készletébe. Kattintson a "Hozzáadás" gombra egy termék hozzáadásához a készlethez", vagy az „Elrejtés” lehetőséget választva elrejtheti a látás elől. Később bármikor meggondolhatod magad!
+ new_powertip: Ezeket a termékeket hozzáadhatja a készletéhez. Kattintson a 'Hozzáadás' gombra, ha hozzá szeretne adni egy terméket a készletéhez, vagy a 'Elrejtés' gombra, ha el szeretné rejteni a terméket. Később bármikor meggondolhatja magát!
controls:
back_to_my_inventory: Vissza a leltárhoz
orders:
edit:
order_sure_want_to: Biztosan %{event} akarja ezt a megrendelést?
invoice_email_sent: 'Számla e-mail elküldve'
- order_email_resent: 'megrendelés e-mailje újra el lett küldve'
+ order_email_resent: 'A megrendelési e-mail újra el lett küldve'
bulk_management:
- tip: "Ezen az oldalon módosíthatja a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből."
+ tip: "Ezen az oldalon módosíthatod a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből."
shared: "Megosztott erőforrás?"
- order_no: "Rendelési szám."
+ order_no: "Rendelési szám"
order_date: "Elkészült:"
max: "Max"
product_unit: "Termék: Egység"
weight_volume: "Súly/térfogat (kg)"
- ask: "Kérdez?"
+ ask: "Kérdés?"
page_title: "Tömeges megrendelés kezelése"
actions_delete: "Kiválasztottak törlése"
loading: "Megrendelések betöltése"
no_results: "Nem található megrendelés."
- group_buy_unit_size: "Csoportos vásárlási mértékegység"
+ group_buy_unit_size: "Csoportos vásárlási egység mérete"
total_qtt_ordered: "Teljes rendelt mennyiség"
max_qtt_ordered: "Maximális rendelt mennyiség"
current_fulfilled_units: "Jelenleg teljesített egységek"
max_fulfilled_units: "Maximális teljesített egységek"
- order_error: "A rendelések frissítése előtt bizonyos hibákat meg kell oldani.nMinden piros szegélyű mező hibát tartalmaz."
+ order_error: "A rendelések frissítése előtt bizonyos hibákat meg kell oldani.\nMinden piros szegélyű mező hibát tartalmaz."
variants_without_unit_value: "FIGYELMEZTETÉS: Egyes változatok nem rendelkeznek egységértékkel"
all: "Minden"
select_variant: "Válasszon egy változatot"
@@ -903,19 +1004,20 @@ hu:
new_enterprise: Új vállalkozás
producer?: "Termelő?"
package: Csomag
- status: Állapot
- manage: 'Beállítások:'
+ status: Státusz
+ manage: Beállítások
form:
about_us:
legend: "Rólunk"
desc_short: Rövid leírás
desc_short_placeholder: Meséljen egy-két mondatban vállalkozásáról
desc_long: Rólunk
- desc_long_placeholder: Mesélj magadról az ügyfeleknek. Ez az információ az Ön nyilvános profilodban jelenik meg.
+ desc_long_placeholder: Mesélj magadról az ügyfeleknek. Ez az információ a nyilvános profilodon jelenik meg.
address:
legend: "Cím"
business_details:
legend: "Vállalkozás adatai"
+ upload: 'feltöltés'
abn: LÉGI ÚTON SZÁLLÍTOTT
abn_placeholder: például. 99 123 456 789
acn: Adószám
@@ -935,22 +1037,22 @@ hu:
business_address:
company_legal_name: A cég hivatalos neve
company_placeholder: Példa Inc.
- address1: Legális cím
+ address1: Hivatalos cím
address1_placeholder: 123 High St.
address2: Cím (folyt.)
- legal_phone_number: Jogi telefonszám
+ legal_phone_number: Hivatalos telefonszám
phone_placeholder: "98 123 4565"
select_country: "Válassz országot"
- select_state: "Válaszd az Állam lehetőséget"
+ select_state: "Válassz államot"
contact:
legend: "Kapcsolat"
name: Név
- name_placeholder: például. Gustav Plum
+ name_placeholder: pl. Példa János
email_address: Nyilvános e-mail cím
- email_address_placeholder: például. inquiries@fresh-food.com
+ email_address_placeholder: például kapcsolat@frisszoldseg.hu
email_address_tip: "Ez az e-mail cím megjelenik nyilvános profilodban"
phone: Telefon
- phone_placeholder: például. 98 7654 3210
+ phone_placeholder: például 98 7654 3210
whatsapp_phone: WhatsApp telefonszám
whatsapp_phone_placeholder: pl. +36-20-123-45-67
whatsapp_phone_tip: "A telefonszám a nyilvános profilodban látszódni fog mint WhatsApp link."
@@ -969,6 +1071,7 @@ hu:
images:
legend: "Képek"
logo: Logó
+ logo_size: "300 x 300 pixel"
promo_image_placeholder: 'Ez a kép a "Rólunk" részben látható.'
promo_image_note1: 'FIGYELEM:'''
promo_image_note2: Minden ide feltöltött promóciós kép 1200 x 260-ra lesz levágva.
@@ -986,7 +1089,7 @@ hu:
preferred_product_selection_from_inventory_only_yes: Új termékek kerülhetnek a kirakatomba (ajánlott)
preferred_product_selection_from_inventory_only_no: Új termékeket kell hozzáadnom a készletemhez, mielőtt a átvételi pontomba kerülhetnék
payment_methods:
- legend: "fizetési módok"
+ legend: "Fizetési módok"
name: Név
applies: Érvényes?
manage: Fizetési módok kezelése
@@ -998,10 +1101,10 @@ hu:
name: Név
name_placeholder: például. Plum professzor biodinamikus szarvasgombája
groups: Csoportok
- groups_tip: Válaszd ki azokat a csoportokat vagy régiókat, amelyeknek tagja. Ez segít az ügyfeleknek megtalálni az Ön vállalkozását.
- groups_placeholder: Kezdjen el gépelni az elérhető csoportok kereséséhez...
+ groups_tip: Válaszd ki azokat a csoportokat vagy régiókat, amelyeknek tagja vagy. Ez segít az ügyfeleknek megtalálni a vállalkozásod
+ groups_placeholder: Kezdj el gépelni az elérhető csoportok kereséséhez...
primary_producer: Termelő?
- primary_producer_tip: Termelő vagy, ha termeszted, tenyészted, főzöd, sütöd, erjeszted, stb. a termékeidet.
+ primary_producer_tip: Válaszd a 'Termelő'-t, ha termeszted, tenyészted, főzöd, sütöd, erjeszted, stb. a termékeidet.
producer: Termelő
any: Bármi
none: Egyik sem
@@ -1033,12 +1136,12 @@ hu:
shop_preferences:
legend: "Átvételi ponti beállítások"
shopfront_requires_login: "Nyilvánosan látható kirakat?"
- shopfront_requires_login_tip: "Válaszd ki, hogy az ügyfeleknek be kell-e jelentkezniük a kirakat megtekintéséhez, vagy azt mindenki láthatja."
+ shopfront_requires_login_tip: "Válaszd ki, hogy az ügyfeleknek be kell-e jelentkezniük a profilod megtekintéséhez, vagy azt mindenki láthatja."
shopfront_requires_login_false: "Nyilvános"
shopfront_requires_login_true: "Csak regisztrált vásárlók számára látható"
recommend_require_login: "Javasoljuk, hogy a felhasználók bejelentkezést kérjenek, amikor a rendelés módosítható."
allow_guest_orders: "Vendégrendelések"
- allow_guest_orders_tip: "Engedélyezze a vendégként való fizetést, vagy kérjen regisztrált felhasználót."
+ allow_guest_orders_tip: "Engedélyezd a vendégként való fizetést, vagy kérj felhasználói regisztrációt."
allow_guest_orders_false: "A megrendeléshez bejelentkezés szükséges"
allow_guest_orders_true: "Vendég fizetés engedélyezése"
allow_order_changes: "Megrendelések módosítása"
@@ -1056,26 +1159,26 @@ hu:
shopfront_message: "Kirakatüzenet"
shopfront_message_placeholder: >
Opcionális üzenet, amely üdvözli az ügyfeleket, és elmagyarázza, hogyan
- vásárolhatnak Önnél. Ha itt szöveget ír be, az megjelenik a kezdőlapon,
- amikor az ügyfelek először érkeznek az áruító oldalára.
- shopfront_message_link_tooltip: "Hivatkozás beszúrása/szerkesztése"
+ vásárolhatnak Nálad. Ha itt szöveget írsz be, az megjelenik a kezdőlapon,
+ amikor az ügyfelek először érkeznek az oldaladra.
+ shopfront_message_link_tooltip: "Hivatkozás beszúrása / szerkesztése"
shopfront_message_link_prompt: "Kérjük, adjon meg egy URL-t a beszúráshoz"
shopfront_closed_message: "Kirakat zárt üzenet"
shopfront_closed_message_placeholder: >
- Üzenet a vásárlóknak az árusító oldalán, ha nincs aktív rendelési ciklusa
- (azaz az üzlet zárva van). Írja le mikor várható a következő rendelési
+ Üzenet a vásárlóknak az oldaladon, ha épp nincs aktív rendelési ciklus
+ (azaz az üzlet zárva van). Írd le mikor várható a következő rendelési
ciklus.
shopfront_category_ordering: "Kirakati kategória rendelése"
shopfront_category_ordering_note: "(fentről lefelé)"
- open_date: "Megnyitás dátuma"
- close_date: "Bezárás dátuma"
+ open_date: "Nyitás dátuma"
+ close_date: "Zárás dátuma"
display_ordering_in_shopfront: "Rendelés megjelenítése a kirakatban:"
shopfront_sort_by_category: "Kategória szerint"
shopfront_sort_by_producer: "A termelő által"
shopfront_sort_by_category_placeholder: "Kategória"
shopfront_sort_by_producer_placeholder: "Termelő"
display_remaining_stock: "Mutassa az elérhető készletet az oldalon, ha már kifogyóban van"
- display_remaining_stock_tip: "Mutassa, amikor már háromnál kevesebb maradt belőle."
+ display_remaining_stock_tip: "Tudassa a vásárlókkal, amikor háromnál kevesebb darab van már csak."
enabled: "Engedélyezve"
disabled: "Tiltva"
social:
@@ -1085,17 +1188,17 @@ hu:
facebook_placeholder: "például. www.facebook.com/PageNameItt"
linkedin_placeholder: "például. www.linkedin.com/in/YourNameItt"
stripe_connect:
- connect_with_stripe: "Csatlakozzon a Stripe-hoz"
+ connect_with_stripe: "Csatlakozz a Stripe-al"
stripe_connect_intro: "Ha hitelkártyás fizetést szeretnél elfogadni, össze kell kapcsolnod Stripe fiókodat az Open Food Network hálózattal. A kezdéshez használd a jobb oldali gombot."
stripe_account_connected: "Stripe fiók csatlakoztatva."
disconnect: "Fiók leválasztása"
confirm_modal:
- title: Csatlakozzon a Stripe-hoz
+ title: Csatlakozz a Stripe-al
part1: A Stripe egy fizetésfeldolgozó szolgáltatás, amely lehetővé teszi az OFN oldalai számára, hogy elfogadják az ügyfelek hitelkártyás fizetését.
- part2: Ennek a funkciónak a használatához," csatlakoztatnod kell a Stripe-fiókját az OFN-hez. Az alábbi „Elfogadom” gombra kattintva átirányítod Önt a Stripe webhelyére, ahol meglévő Stripe fiókot csatlakoztathatsz, vagy hozz létre egy újat, ha még nem rendelkezel ilyennel.
- part3: Ez lehetővé teszi, hogy az Open Food Network elfogadja az ügyfelek hitelkártyás fizetését az Ön nevében. Felhívjuk figyelmét, hogy saját Stripe-fiókot kell fenntartania"," fizesse ki a Stripe által felszámított díjakat, és maga kezelje a visszaterheléseket és az ügyfélszolgálatot.
+ part2: Ennek a funkciónak a használatához, csatlakoztatnod kell a Stripe-fiókod az OFN-hez. Az alábbi „Elfogadom” gombra kattintva átirányítunk téged a Stripe webhelyére, ahol meglévő Stripe fiókot csatlakoztathatsz, vagy hozz létre egy újat, ha még nem rendelkezel ilyennel.
+ part3: Ez lehetővé teszi, hogy az Open Food Network elfogadja az ügyfelek hitelkártyás fizetését a nevedben. Felhívjuk figyelmed, hogy ehhez a funkcióhoz saját Stripe-fiókot kell fenntartanod, a Stripe által felszámított díjakat magadnak kell fizetned, és te kezeled a visszatérítéseket és az ügyfelek kéréseit is.
i_agree: Egyetértek
- cancel: Vissza
+ cancel: Törlés
tag_rules:
legend: "Címkeszabályok"
default_rules:
@@ -1122,7 +1225,7 @@ hu:
managers: Menedzserek
managers_tip: A többi felhasználó, aki jogosult a vállalkozás kezelésére.
invite_manager: "Menedzser meghívása"
- invite_manager_tip: "Hívjon meg egy nem regisztrált felhasználót, hogy regisztráljon, és legyen a vállalkozás vezetője."
+ invite_manager_tip: "Hívj meg egy nem regisztrált felhasználót, hogy regisztráljon, és legyen a tagja az Open Food Network hálózatának."
add_unregistered_user: "Nem regisztrált felhasználó hozzáadása"
email_confirmed: "E-mail megerősítve"
email_not_confirmed: "Az e-mail cím nincs megerősítve"
@@ -1130,12 +1233,29 @@ hu:
rate: Mérték
customers: Vevő
active: Aktív?
+ add_new: Új hozzáadása
+ white_label:
+ remove_logo: "Logo eltávolítása"
+ remove_logo_confirm: "Biztos vagy benne, hogy eltávolítod ezt a logo-t?"
+ remove_logo_success: "Logo eltávolítva"
+ white_label_logo_link_label: "A főoldalon használt logo linkje"
connected_apps:
+ enable: "Adatmegosztás engedélyezése"
+ disable: "Megosztás leállítása"
loading: "Betöltés"
+ link_label: "Listázás kezelése"
+ description_html: |
+
+ Termelők bemutathatják bio gazdálkodási tanúsítványukat, egyéb gazdálkodási gyakorlatukat és tevékenységeiket a profiljukban. Ez egyszerűsíti a fogyasztók számára, hogy megtalálják a fenntartható gyakorlatokkal előállított termékeket, és kapcsolatba lépjenek a termelőkkel.
+
+ Tudj meg többet a Regeneratív gyakorlatokról.
+
+
actions:
edit_profile: Beállítások
properties: Tulajdonságok
- payment_methods: fizetési módok
+ payment_methods: Fizetési módok
payment_methods_tip: Ennek a vállalkozásnak nincs fizetési módja
shipping_methods: Szállítási módok
shipping_methods_tip: Ennek a vállalkozásnak vannak szállítási módjai
@@ -1158,10 +1278,10 @@ hu:
producer_shop_description_text2: A Termelői átvételi pont kizárólag a saját termékeid értékesítésére szolgál. Ha más termékeit szeretnéd értékesíteni, válaszd a „Termelő Átvételi pont” lehetőséget.
producer_hub: Termelő Átvételi pont
producer_hub_text: Saját és mások termékeinek értékesítése
- producer_hub_description_text: Termelői átvételi pontként értékesítheted saját termékeidet, valamint más vállalkozásoktól átvett termékeket is az Open Food Network oldalán.
+ producer_hub_description_text: 'Az Open Food Network gerincét az átvételi pontok adják. Amennyiben termelő vagy, átvételi pontként értékesítheted saját termékeidet, de más termelőktől, vállalkozásoktól átvett termékeket is. '
profile: Csak profil
get_listing: Szerezzen listát
- profile_description_text: Az emberek megtalálhatják és kapcsolatba léphetnek Önnel az Open Food Network-en. Vállalkozása látható lesz a térképen, és kereshető lesz a listákban.
+ profile_description_text: Az Open Food Network-ön keresztül megtalálnak a fogyasztók és kapcsolatba is léphetnek veled. Vállalkozásod látható lesz a térképen, és kereshető lesz a listákban.
hub_shop: Átvételi pont árusítóhely
hub_shop_text: Adj el másoktól származó termékeket
hub_shop_description_text: Termelői átvételi pontként értékesítheted saját termékeidet, valamint más vállalkozásoktól átvett termékeket is az Open Food Network oldalán.
@@ -1175,7 +1295,7 @@ hu:
manage_link: Beállítások
producer?: "Termelő?"
package: "Csomag"
- status: "Állapot"
+ status: "Státusz"
new_form:
owner: Tulajdonos
owner_tip: A vállalkozásért felelős elsődleges felhasználó.
@@ -1188,7 +1308,7 @@ hu:
title: Új Vállalkozás
back_link: Vissza a vállalkozások listájához
welcome:
- welcome_title: Üdvözöljük az Open Food Networkben!
+ welcome_title: Üdvözölünk az Open Food Network-ben!
welcome_text: Sikeresen létrehozta a
next_step: Következő lépés
choose_starting_point: 'Válaszd ki csomagját:'''
@@ -1203,21 +1323,21 @@ hu:
loading: BETÖLTÉS...
new:
create: "Létrehozás"
- cancel: "Megszüntet"
+ cancel: "Törlés"
back_to_list: "Vissza a listához"
create:
- success: 'Rendelési ciklusa létrejött.'''
+ success: 'Rendelési ciklusa létrejött.'
update:
- success: 'Megrendelési ciklusa frissült.'''
+ success: 'Megrendelési ciklusa frissült.'
clone:
- success: "Rendelési ciklusát %{name} klónozták."
+ success: "Rendelési ciklusát %{name} klónozásra került."
notify_producers:
success: 'A termelőknek küldendő e-mailek sorba kerültek küldés céljából.'
edit:
save: "Mentés"
save_and_next: "Mentés és Tovább"
next: "Következő"
- cancel: "Megszüntet"
+ cancel: "Törlés"
back_to_list: "Vissza a listához"
save_and_back_to_list: "Mentés és Vissza a listához"
choose_products_from: "Válasszon termékeket a következők közül:"
@@ -1232,24 +1352,24 @@ hu:
save: "Mentés"
save_and_next: "Mentés és Tovább"
next: "Következő"
- cancel: "Vissza"
+ cancel: "Törlés"
back_to_list: "Vissza a listához"
outgoing:
outgoing: "Kimenő"
distributor: "Elosztó"
products: "Termékek"
tags: "Címkék"
- delivery_details: "szállítás részletei"
+ delivery_details: "Szállítás részletei"
fees: "Díjak"
next: "Következő"
previous: "Előző"
save: "Mentés"
save_and_next: "Mentés és Tovább"
- cancel: "Vissza"
+ cancel: "Törlés"
back_to_list: "Vissza a listához"
checkout_options:
back_end: "Csak back office"
- cancel: "Vissza"
+ cancel: "Törlés"
checkout_options: "Fizetési lehetőségek"
distributor: "Elosztó"
no_payment_methods: Ebben a rendelési ciklusban minden forgalmazónak szüksége van legalább egy fizetési módra.
@@ -1334,7 +1454,7 @@ hu:
no_data: Hm, valami elromlott. Nem található rendelési ciklus adat.
date_warning:
msg: Ez a rendelési ciklus %{n} nyitott előfizetéses megrendeléshez kapcsolódik. A dátum módosítása nem érinti a már leadott rendeléseket, de lehetőség szerint kerülni kell. Biztosan folytatja?
- cancel: Vissza
+ cancel: Törlés
proceed: Folytassa
status:
undated: keltezetlen
@@ -1429,7 +1549,7 @@ hu:
name: Termékek és készlet
users_and_enterprises:
name: Felhasználók és Vállalkozások
- description: Vállalkozási tulajdonjog és állapot
+ description: Vállalkozási tulajdonjog és státusz
order_cycle_management:
name: Rendelési ciklus kezelése
sales_tax:
@@ -1472,6 +1592,9 @@ hu:
formatted_data: Formázott adatok
packing:
name: "Összekészítési jelentések"
+ oidc_settings:
+ index:
+ title: "OIDC Beállítások"
subscriptions:
index:
title: "Előfizetések"
@@ -1538,7 +1661,7 @@ hu:
no_open_or_upcoming_order_cycle: "Nincs közelgő rendelési ciklus"
products_panel:
save: "MENTÉS"
- saving: "MEGTAKARÍTÁS"
+ saving: "MENTÉS"
saved: "MENTETT"
product_already_in_order: Ez a termék már felkerült a rendelésre. Kérjük, módosítsa közvetlenül a mennyiséget.
stock:
@@ -1597,9 +1720,9 @@ hu:
failed_to_update: "Nem sikerült frissíteni a rendelést"
checkout:
failed: "A fizetés nem sikerült. Kérjük, jelezze felénk, hogy feldolgozhassuk megrendelését."
- payment_cancelled_due_to_stock: "Fizetés törölve: a pénztár készlethiba miatt nem fejezhető be."
+ payment_cancelled_due_to_stock: "Fizetés törölve: a fizetés készlethiba miatt nem fejezhető be."
order_not_loaded: "Nem található érvényes rendelés a fizetés feldolgozásához"
- your_details_without_number: Személyes adatok
+ your_details_without_number: Az adataid
payment_method_without_number: Fizetési mód
order_summary_without_number: Megrendelés-összesítő
already_ordered:
@@ -1607,6 +1730,7 @@ hu:
message_html: "Már van rendelése ehhez a rendelési ciklushoz. Tekintse meg a %{kosarat}, hogy megtekinthesse a korábban megrendelt tételeket. A tételeket törölheti is, amíg a rendelési ciklus nyitva van."
step1:
contact_information:
+ title: Kapcsolat
email:
label: Email
phone:
@@ -1642,7 +1766,7 @@ hu:
label: Kártyaszám
placeholder: pl. 4242 4242 4242 4242
card_verification_value:
- label: CVC
+ label: CVC kód
card_month:
label: Hónap
card_year:
@@ -1652,18 +1776,21 @@ hu:
use_new_card: Adja meg kártyaazonosítóit
save_card: Mentse el a kártyát későbbi használatra
create_new_card: vagy adja meg alább az új kártyaadatokat
- explaination: Megrendelését a következő lépésben tekintheti át és erősítheti meg, amely tartalmazza a végső költségeket.
+ explaination: A következő lépésben megtekintheted és megerősítheted megrendelésedet, amely tartalmazza a várható költségeket. Amennyiben "valtozoar" jelölésű terméket rendeltél, a végösszeg a pontos súly függvényében változhat.
submit: Következő - Megrendelés összegzése
- cancel: Vissza az Ön adataihoz
+ cancel: Vissza az adataidhoz
step3:
delivery_details:
title: Szállítás részletei
edit: Szerkesztés
address: Szállítási cím
+ instructions: Megjegyzések
payment_method:
title: Fizetési mód
edit: Szerkesztés
+ instructions: Megjegyzések
order:
+ title: A megrendelés részletei
edit: Szerkesztés
terms_and_conditions:
message_html: "Elfogadom az eladó %{terms_and_conditions_link} feltételeit."
@@ -1673,17 +1800,17 @@ hu:
all_terms_and_conditions:
message_html: "Elfogadom az eladó %{terms_and_conditions_link} és a platform %{tos_link} feltételeit."
terms_and_conditions: "Felhasználási feltételek"
- submit: Teljes rendelés
+ submit: Rendelés elküldése
cancel: Vissza a Fizetési módhoz
errors:
- saving_failed: "A mentés nem sikerült, kérjük, frissítse a kiemelt mezőket."
+ saving_failed: "A mentés nem sikerült, kérjük, frissítsd a kiemelt mezőket."
terms_not_accepted: Kérjük, fogadja el az Általános Szerződési Feltételeket
required: A mező nem lehet üres
invalid_number: "Adjon meg egy érvényes telefonszámot"
invalid_email: "Kérjük valós e-mail címet adjon meg"
- select_a_shipping_method: Válasszon szállítási módot
+ select_a_shipping_method: Válassz szállítási módot!
select_a_payment_method: Válassz fizetési módot
- no_shipping_methods_available: Szállítási lehetőségek hiánya miatt a fizetés nem lehetséges. Kérjük, lépjen kapcsolatba az üzlet tulajdonosával.
+ no_shipping_methods_available: Átvételi és szállítási lehetőségek hiánya miatt a fizetés nem lehetséges. Kérjük, lépjen kapcsolatba az üzlet tulajdonosával.
voucher_not_found: Nem található
shops:
hubs:
@@ -1714,13 +1841,13 @@ hu:
selling_on_ofn: "Érdekel az Open Food Network?"
register: "Itt regisztrálj"
footer:
- footer_secure: "Biztonságos és megbízható."
- footer_secure_text: "Az Open Food Network mindenhol SSL-titkosítást (2048 bites RSA) használ, hogy vásárlási és fizetési adatait bizalmasan kezelje. Szervereink nem tárolják hitelkártyaadatait, és a fizetéseket PCI-kompatibilis szolgáltatások dolgozzák fel."
+ footer_secure: "Biztonságos és felelős adatkezelés."
+ footer_secure_text: "Az Open Food Network mindenhol SSL-titkosítást (2048 bites RSA) használ, hogy vásárlási és fizetési adataidat bizalmasan kezelje. Szervereink nem tárolják hitelkártya adataidat, és a fizetéseket PCI-kompatibilis szolgáltatások dolgozzák fel."
footer_contact_headline: "Kapcsolat"
footer_contact_email: "Küldj egy emailt nekünk"
footer_nav_headline: "Navigáció"
footer_join_headline: "Csatlakozz hozzánk"
- footer_join_body: "Hozz létre egy listát, üzletet vagy csoportkönyvtárat az Open Food Networkön."
+ footer_join_body: "Hozz létre egy termelői profilt, élelmiszerközösséget, vagy fogyasztói csoportot az Open Food Network oldalán."
footer_join_cta: "Tovább olvasok!"
footer_legal_call: "Olvasd el a mi"
footer_legal_visit: "Elérhetőségünk"
@@ -1757,6 +1884,7 @@ hu:
invoice_column_price_without_taxes: "Teljes ár (adó nélkül)"
invoice_column_tax_rate: "Adókulcs"
invoice_tax_total: "GST összesen:"
+ invoice_cancel_and_replace_invoice: "érvényteleníti és cseréli a számlát"
tax_invoice: "ADÓSZÁMLA"
tax_total: "Teljes adó (%{rate}):"
invoice_shipping_category_delivery: "Szállítás"
@@ -1766,6 +1894,7 @@ hu:
abn: "LÉGI ÚTON SZÁLLÍTOTT:"
acn: "Adószám:"
invoice_issued_on: "Kiállított számla:"
+ order_number: "Rendelés sorszáma:"
date_of_transaction: "A tranzakció dátuma:"
menu_1_title: "Átadópontok"
menu_1_url: "/shops"
@@ -1776,7 +1905,7 @@ hu:
menu_4_title: "Csoportok"
menu_4_url: "/groups"
menu_5_title: "Rólunk"
- menu_5_url: "https://about.openfoodnetwork.org.au/"
+ menu_5_url: "https://pecsikosar.hu/iranytu/"
menu_6_title: "Csatlakozás"
menu_6_url: "https://openfoodnetwork.org/au/connect/"
menu_7_title: "Tanul"
@@ -1848,7 +1977,6 @@ hu:
label_account: "fiók"
label_more: "Mutass többet"
label_less: "Mutass kevesebbet"
- label_notices: "Megjegyzések"
cart_items: "tételeket"
cart_headline: "Kosár"
total: "Összesen"
@@ -1896,7 +2024,7 @@ hu:
cookie_matomo_heatmap_desc: "Matomo Heatmap & Session Recording cookie."
cookie_matomo_ignore_desc: "A cookie-k segítségével kizárják a felhasználót a nyomon követésből."
disabling_cookies_header: "Figyelmeztetés a cookie-k letiltására"
- disabling_cookies_desc: "Felhasználóként bármikor engedélyezheti, blokkolhatja vagy törölheti az Open Food Network vagy bármely más webhely cookie-jait, amikor csak akarja, a böngésző beállítási vezérlőjén keresztül. Minden böngészőnek más operátora van. Itt vannak a linkek:"
+ disabling_cookies_desc: "Felhasználóként bármikor engedélyezheted, blokkolhatod vagy törölheted az Open Food Network vagy bármely más webhely cookie-jait a böngésző beállításaiban. Minden böngészőnek más a működése. Itt vannak a linkek:"
disabling_cookies_firefox_link: "https://support.mozilla.org/en-US/kb/enable-and-disable-cookies-website-preferences"
disabling_cookies_chrome_link: "https://support.google.com/chrome/answer/95647"
disabling_cookies_ie_link: "https://support.microsoft.com/en-us/help/17442/windows-internet-explorer-delete-manage-cookies"
@@ -1910,24 +2038,24 @@ hu:
cookies_policy_link: "cookie-kra vonatkozó szabályzat"
cookies_accept_button: "Cookie-k elfogadása"
home_shop: Tovább a termelőkhöz, átvételi pontokhoz.
- brandstory_headline: "Helyi, biztonságos élelmiszer."
- brandstory_intro: "Szolidáris élelmiszerrendszert építünk."
- brandstory_part1: "Az alapoktól kezdjük. A gazdálkodókkal és termelőkkel, akik készen állnak arra, hogy büszkén és őszintén elmondják történeteiket. A forgalmazókkal, akik készen állnak arra, hogy tisztességesen és becsületesen összekapcsolják az embereket a termékekkel. Azokkal a vásárlókkal, akik hisznek abban, hogy a jobb heti vásárlási döntések komolyan megváltoztathatják a világot."
- brandstory_part2: "Akkor szükségünk van egy módra, hogy valósággá tegyük. Egy módja annak, hogy mindenkit megerősítsen, aki élelmiszert termeszt, ad el és vásárol. Egy módja annak, hogy elmeséljük az összes történetet, kezeljük az összes logisztikát. Egy módja annak, hogy a tranzakciót minden nap átalakulássá alakítsa."
- brandstory_part3: "Ezért olyan online piacteret építünk, amely kiegyenlíti a versenyfeltételeket. Átlátszó, így valódi kapcsolatokat hoz létre. Nyílt forráskódú, tehát mindenki tulajdonában van. Régiókra és nemzetekre skálázódik, így az emberek világszerte elindítják a verziókat."
- brandstory_part4: "Mindenhol működik. Mindent megváltoztat."
- brandstory_part5_strong: "Nyílt élelmiszerhálózatnak hívjuk."
- brandstory_part6: "Mindannyian szeretjük az ételt. Most már az élelmezési rendszerünket is szerethetjük."
+ brandstory_headline: "Együtt, az élelem önrendelkezésért!"
+ brandstory_intro: "Közösség által irányított élelmiszerrendszert építünk."
+ brandstory_part1: "Az alapoktól kezdjük. A gazdálkodókkal, akiknek fontos, hogy közösen, egy fenntartható és mindenki számára átlátható, hazai élelemrendszert hozzunk létre. \nA bevásárlóközösségekkel, fogyasztói csoportokkal, forgalmazókkal, akik összekapcsolják az embereket a termelőkkel és a termékekkel, és biztosítani szeretnék, hogy a termelők tisztességes díjazásban részesüljenek. \nAzokkal a fogyasztókkal, akik hisznek abban, hogy döntéseiknek hatása van."
+ brandstory_part2: "Ahhoz, hogy ezt valósággá tegyük, szükségünk van egy eszközre, ami minden résztvevőt megerősít, aki élelmiszert termeszt, ad el, szervez, tervez, fogyaszt. \nEgy eszközre, amely láthatóvá teszi a gazdákat, a közösségeket, a termesztési módszereket, és képes kezelni a logisztikát. \nEz az Open Food Network platformja, amely országonként saját közösségi irányítás alatt áll, ugyanakkor globális erőforrásainkat összeadva fejlesztjük."
+ brandstory_part3: "Egy olyan piacteret hozunk így létre, amely átlátható, közvetlen kapcsolatokon alapul, láthatóvá teszi a rövid ellátási lánc szemeit.\nKifejezetten az élelmiszerek értékesítésére készült, így képes kezelni a trükkös méréseket vagy készletszinteket, amelyek csak az élelmiszerek esetében fordulnak elő.\nA termelők létrehozhatnak saját profilt, beszedhetik a fizetéseket, a platformon lévő más átadópontokon keresztül is értékesíthetnek, kiszállíthatnak, vagy akár futárszolgálattal is dolgozhatnak.\nA közösségek összefoghatják a helyi termelőket, hogy virtuális termelői piacokat vagy bevásárlóközösségeket hozzanak létre, és ezáltal rugalmas helyi élelmiszer-gazdaságot építsenek"
+ brandstory_part4: "És ami legalább olyan fontos, mint maga a szoftver, azok az értékek, amelyek a szoftver alapját képezik.\nHa élelmiszert értékesítesz – akár mint gazdálkodó, akár mint termelői piac, vagy termelői szövetkezet vagy élelmiszer-központ -, akkor olyan szoftvert válassz, amely összhangban van az értékeiddel, az emberek és a bolygó érdekével, nem pedig a profit érdekében tevékenykedik. "
+ brandstory_part5_strong: "Open Food Network – a Szabad Élelmiszerhálózat"
+ brandstory_part6: "Csatlakozz te is!"
system_headline: "A vásárlás lépései"
system_step1: "1. Keresés"
- system_step1_text: "Böngészhetsz közvetlenül a gazdák, vagy a bevásárlóközösségek kínálatában. Kereshetsz a lakhelyed, a termelő, élelmiszertípus és termesztési mód szerint."
+ system_step1_text: "Böngészhetsz közvetlenül a gazdák, vagy a bevásárlóközösségek kínálatában. Kereshetsz a lakhelyed, a termelő, élelmiszertípus, és termesztési mód szerint."
system_step2: "2. Vásárlás"
- system_step2_text: "Pakold meg a bevásárlókosarad helyi termelőktől származó termékekkel. Vásárolj olyan élelmiszert, amelynek ismered az eredetét, és tudod hogyan állították elő."
+ system_step2_text: "Alakítsd át a fogyasztási szokásaidat! Pakold meg a bevásárlókosarad helyi termelőktől származó termékekkel. Vásárolj olyan élelmiszert, amelynek ismered az eredetét, és tudod, hogyan állították elő."
system_step3: "3. Átvétel / kiszállítás"
- system_step3_text: "Válaszd a kiszállítást, vagy a személyesebb kapcsolat érdekében, keresd fel a termelőt, vagy az átvételi pontot."
- cta_headline: "Bevásárlás, amellyel jobb hellyé teszed a világot."
+ system_step3_text: "Válaszd a kiszállítást, vagy a személyesebb kapcsolat érdekében keresd fel a termelőt, vagy az átvételi pontot."
+ cta_headline: "A jövőnk fenntartható élelmiszerhálózata."
cta_label: "Tovább a termelőkhöz, átvételi pontokhoz."
- stats_headline: "Termelők és vásárlók közösségét építjük."
+ stats_headline: "Termelők és fogyasztók közösségét építjük."
stats_producers: "élelmiszer-termelők"
stats_shops: "élelmiszerátvételi pontok"
stats_shoppers: "élelmiszervásárlók"
@@ -1937,7 +2065,7 @@ hu:
checkout_order_ready: Átvételi időpont
checkout_hide: Elrejt
checkout_expand: Kinyit
- checkout_headline: "Rendben, készen áll a fizetésre?"
+ checkout_headline: "Rendben, készen állsz a fizetésre?"
checkout_as_guest: "Rendelés regisztráció nélkül"
checkout_details: "Személyes adatok"
checkout_billing: "Számlázási információ"
@@ -1964,7 +2092,7 @@ hu:
order_delivery_on: Kiszállítás
order_delivery_address: Szállítási cím
order_delivery_time: Szállítási idő
- order_special_instructions: "Az Ön megjegyzései:"
+ order_special_instructions: "Megjegyzés:"
order_pickup_time: Átvétel időpontja
order_pickup_instructions: Átvételi információk
order_produce: Összesen
@@ -1974,10 +2102,10 @@ hu:
order_includes_tax: (adót tartalmaz)
order_payment_paypal_successful: PayPal-on keresztüli fizetését sikeresen feldolgoztuk.
order_hub_info: Átvételi pont Info
- order_back_to_store: Vissza a átvételi pontba
+ order_back_to_store: Vissza az átvételi pontba
order_back_to_cart: Vissza a kosárba
- order_back_to_website: Vissza a Webhelyre
- bom_tip: "Ezen az oldalon módosíthatja a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből."
+ order_back_to_website: Vissza az Átadó pont oldalára
+ bom_tip: "Ezen az oldalon módosíthatod a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből."
unsaved_changes_warning: "A nem mentett módosítások léteznek, és ha folytatja, elvesznek."
unsaved_changes_error: "A piros szegélyű mezők hibákat tartalmaznak."
products: "Termékek"
@@ -1991,7 +2119,7 @@ hu:
email_confirmation_click_link: "Kérjük, kattintson az alábbi linkre az e-mail-cím megerősítéséhez és a profil beállításának folytatásához."
email_confirmation_link_label: "Erősítse meg ezt az e-mail címet »"
email_confirmation_help_html: "Az e-mail-cím megerősítése után hozzáférhet a vállalkozás adminisztrációs fiókjához. Tekintse meg a %{link} webhelyet, hogy többet megtudjon %{sitename} szolgáltatásairól, és elkezdhesse használni profilját vagy online áruházát."
- email_confirmation_notice_unexpected: "Azért kaptad ezt az üzenetet, mert regisztráltál a(z) %{sitename} webhelyen, vagy egy olyan személy, akit valószínűleg ismersz, meghívta a regisztrációra. Ha nem érti, miért kapta ezt az e-mailt, kérjük, írjon a %{contact} címre."
+ email_confirmation_notice_unexpected: "Azért kaptad ezt az üzenetet, mert regisztráltál a(z) %{sitename} webhelyen, vagy egy olyan személy, akit valószínűleg ismersz, meghívott. Ha nem érted, miért kaptad ezt az e-mailt, kérjük, írj a %{contact} címre."
email_social: "Kapcsolatba lép velünk:"
email_contact: "Küldj egy emailt nekünk:"
email_signoff: "Egészségére,"
@@ -2014,6 +2142,7 @@ hu:
email_payment_paid: FIZETETT
email_payment_not_paid: NEM FIZETETT
email_payment_description: Fizetési információk
+ email_payment_summary: Fizetési összesítő
email_payment_method: "Fizetés:"
email_so_placement_intro_html: "Új rendelése van a %{distributor}-nál"
email_so_placement_details_html: "Megrendelés részletei:"
@@ -2039,7 +2168,7 @@ hu:
email_shipping_collection_details: Gyűjtemény részletei
email_shipping_collection_time: "Átvétel időpontja:"
email_shipping_collection_instructions: "Átvételi információk:"
- email_special_instructions: "Az Ön megjegyzései:"
+ email_special_instructions: "Megjegyzés:"
email_signup_greeting: Helló!
email_signup_welcome: "Üdvözöljük a %{sitename} oldalon!"
email_signup_confirmed_email: "Köszönjük, hogy megerősítette e-mailjét."
@@ -2051,7 +2180,7 @@ hu:
invited_to_manage: "Meghívást kaptál, hogy kezeld a(z) %{enterprise} %{instance} szolgáltatást."
confirm_your_email: "Egy megerősítő linket tartalmazó e-mailt kellett volna kapnia, vagy hamarosan kapni fog. Addig nem férhetsz hozzá %{enterprise} profiljához, amíg meg nem erősíted az e-mail címedet."
set_a_password: "Ezután a rendszer kéri, hogy állítson be egy jelszót, mielőtt felügyelheti a vállalkozásot."
- mistakenly_sent: "Nem tudja, miért kapta ezt az e-mailt? További információért forduljon %{owner_email}-hoz."
+ mistakenly_sent: "Nem tudod, miért kaptad ezt az e-mailt? További információért fordulj %{owner_email}-hoz."
producer_mail_greeting: "kedves"
producer_mail_text_before: "Alább megtalálja a rendelési ciklusra vonatkozó frissítést:"
producer_mail_order_text: "Íme a termékei megrendelésének összefoglalása:"
@@ -2059,7 +2188,7 @@ hu:
producer_mail_signoff: "Köszönet és jókívánságok"
producer_mail_order_customer_text: "Itt található a rendelések összegzése ügyfelek szerint csoportosítva"
shopping_oc_closed: A rendelések lezárva
- shopping_oc_closed_description: "Kérjük, várja meg, amíg a következő ciklus megnyílik (vagy lépjen kapcsolatba velünk közvetlenül, hogy tudjuk-e fogadni a késedelmes rendeléseket)"
+ shopping_oc_closed_description: "Kérjük, várd meg, amíg a következő ciklus megnyílik (vagy lépj kapcsolatba velünk közvetlenül, hogy tudjuk-e fogadni a a ciklus zárása utáni rendeléseket)"
shopping_oc_last_closed: "Az utolsó ciklus %{distance_of_time} előtt zárult"
shopping_oc_next_open: "A következő ciklus %{distance_of_time} múlva kezdődik"
shopping_oc_select: "Válassz..."
@@ -2073,7 +2202,7 @@ hu:
shopping_contact_web: "Kapcsolat"
shopping_contact_social: "Kövesse"
shopping_groups_part_of: "része:"
- shopping_producers_of_hub: "%{hub}termelői:"
+ shopping_producers_of_hub: "%{hub} termelői:"
enterprises_next_closing: "A következő rendelés lezárása"
enterprises_currently_open: "A rendelések jelenleg nyitva vannak"
enterprises_ready_for: "Nyitás"
@@ -2146,7 +2275,7 @@ hu:
groups_contact_email: Küldj egy emailt nekünk
groups_contact_website: Látogasd meg weboldalunkat
groups_contact_facebook: Kövess minket Facebookon
- groups_signup_title: Regisztráljon csoportként
+ groups_signup_title: Regisztrálj csoportként
groups_signup_headline: Csoportok regisztráció
groups_signup_intro: "Egyedülálló platform vagyunk az együttműködésen alapuló marketinghez, amely a legegyszerűbb módja annak, hogy tagjai és érdekelt felei új piacokat érjenek el. Mi non-profit, megfizethető és egyszerű szervezet vagyunk."
groups_signup_email: Küldj egy emailt nekünk
@@ -2176,7 +2305,7 @@ hu:
producers_filter_property: Tulajdonság
producers_title: Termelők
producers_headline: Keress helyi termelőket
- producers_signup_title: Regisztráljon termelőként
+ producers_signup_title: Regisztrálj termelőként
producers_signup_headline: Élelmiszer-termelők, felhatalmazott.
producers_signup_motivation: Adja el ételeit, és mesélje el történeteit változatos új piacokon. Takarítson meg időt és pénzt minden rezsinél. Kockázat nélkül támogatjuk az innovációt. Kiegyenlítettük a játékteret.
producers_signup_send: Csatlakozz most
@@ -2196,22 +2325,22 @@ hu:
name_or_sku: "NÉV VAGY Cikkszám"
register_title: Regisztráció
sell_title: "Regisztráció"
- sell_headline: "Csatlakozzon az Open Food Network-hez!"
- sell_motivation: "Mutasd be gyönyörű ételeidet."
+ sell_headline: "Legyél Te is a hálózat tagja!"
+ sell_motivation: "Mutasd be termékeidet, tedd elérhetővé a fogyasztók számára."
sell_producers: "Termelők"
sell_hubs: "Átvételi pontok"
sell_groups: "Csoportok"
- sell_producers_detail: "Hozz létre profilt vállalkozásod számára az OFN-en percek alatt. Bármikor frissítheted profilod egy online áruházra, és közvetlenül ajánlhatod termékeidet a vásárlóknak."
- sell_hubs_detail: "Hozz létre profilt a vállalkozásod számára az OFN-en. Bármikor frissítheted egy többtermelős átvételi pontra."
- sell_groups_detail: "Hozz létre egy személyre szabott cégjegyzéket (termelők és egyéb élelmiszeripari vállalkozások) régiója vagy szervezete számára."
- sell_user_guide: "Tudjon meg többet használati útmutatónkban."
- sell_listing_price: "A listázás az OFN-en ingyenes. Egy üzlet megnyitása és működtetése az OFN-en ingyenes havi 500 USD-ig. Ha többet ad el, akkor az árbevétel 1%-a és 3%-a között választhatja meg közösségi hozzájárulását. Az árakkal kapcsolatos további részletekért keresse fel a Szoftverplatform részt a felső menü Névjegy linkjén keresztül."
- sell_embed: "Ezenkívül beágyazhatunk egy OFN üzletet saját, személyre szabott webhelyébe, vagy személyre szabott helyi élelmiszer-hálózati webhelyet készíthetünk az Ön régiójában."
- sell_ask_services: "Kérdezzen minket az OFN szolgáltatásairól."
+ sell_producers_detail: "Őstermelő, kistermelő, családi gazdálkodó, vagy épp kisválllalkozás vagy? Hozz létre termelői profilt az OFN-en percek alatt. Bármikor frissítheted profilod egy online áruházra, és közvetlenül ajánlhatod termékeidet a fogyasztóknak."
+ sell_hubs_detail: "Bevásárlóközösséget indítanál? Vagy csak összefognál a termelőtársakkal és közösen szólítanátok meg a fogyasztókat? Hozz létre új profilt, vagy bármikor frissítheted a profilodat egy többtermelős átvételi pontra."
+ sell_groups_detail: "Hozz létre egy személyre szabott jegyzéket (termelők és egyéb élelmiszeripari vállalkozások) régiója vagy szervezete számára."
+ sell_user_guide: "Tudj meg többet használati útmutatónkból."
+ sell_listing_price: "A termelői regisztráció az OFN-en ingyenes, és az is marad. A platformon történő értékesítés volumenétől függően azonban közösségi hozzájárulást kérünk, a szoftver üzemeltetéshez és IT support biztosításához . \nRészletek hamarosan. "
+ sell_embed: "Ezenkívül beágyazhatunk egy OFN profilt saját, személyre szabott webhelyedbe, vagy személyre szabott helyi élelmiszerközösségi webhelyet készíthetünk számodra."
+ sell_ask_services: "Kérdezz bátran egyéb szolgáltatásainkról. "
shops_title: Átadópontok
- shops_headline: Bevásárlás, másképpen.
+ shops_headline: Bevásárlás újragondolva.
shops_text: Rendelési ciklusokban dolgozunk. A növénytermesztés, az állattenyésztés, az élelem előállítása ciklikus folyamat. Így nálunk az áruátadás is ciklusokban történik, pont ahogy a növények is hétről hétre, és eltérő ütemben fejlődnek. Ha lezárt rendelési ciklust találsz valahol, nézd meg, ki van-e írva a rendelési ciklus nyitásának időpontja. Ha nem, látogass vissza később az adott termelőhöz, közösséghez.
- shops_signup_title: Regisztráljon átvételi pontként
+ shops_signup_title: Regisztrálj átvételi pontként
shops_signup_headline: Élelmiszer-központok, korlátlan.
shops_signup_motivation: Bármi legyen is a modelled, támogatunk téged. Azonban változol, veled vagyunk. Mi non-profit, független," és nyílt forráskódú. Mi vagyunk azok a szoftverpartnerek, akikről álmodott.
shops_signup_action: Csatlakozz most
@@ -2307,7 +2436,7 @@ hu:
november: "november"
december: "december"
email_not_found: "Az e-mail cím nem található"
- email_unconfirmed: "A jelszó visszaállítása előtt meg kell erősítenie e-mail címét."
+ email_unconfirmed: "A jelszó visszaállítása előtt meg kell erősítened az e-mail címed."
email_required: "Meg kell adnia egy e-mail címet"
logging_in: "Várjon egy kicsit, bejelentkezünk"
signup_email: "Az email címed"
@@ -2380,7 +2509,7 @@ hu:
question: "Termelő vagy?"
yes_producer: "Igen, termelő vagyok"
no_producer: "Nem, nem vagyok termelő"
- producer_field_error: "Kérem, válasszon egyet. Termelő vagy?"
+ producer_field_error: "Kérjük, válassz egyet. Termelő vagy?"
yes_producer_help: "Akkor vagy termelő, ha termeszted, tenyészted, főzöd, sütöd, erjeszted, stb. a termékeidet."
no_producer_help: "Ha nem vagy termelő, akkor valószínűleg olyan valaki vagy, aki élelmiszert ad el, vagy ad át. Lehetsz egy csomópont, szövetkezet, vásárlási csoport, kiskereskedő, nagykereskedő, stb. megbízottja / képviselője."
create_profile: "Profil létrehozása"
@@ -2476,8 +2605,8 @@ hu:
balance: "Egyensúly"
transaction: "Tranzakció"
transaction_date: "A dátum #Tranzakció csak a :dátummal való ütközés elkerülése érdekében kulcsfontosságú"
- payment_state: "Fizetési állapot"
- shipping_state: "Szállítási állapot"
+ payment_state: "Fizetési státusz"
+ shipping_state: "Szállítási státusz"
value: "Mennyiség"
balance_due: "Fizetendő összeg"
credit: "Hitel"
@@ -2529,7 +2658,7 @@ hu:
distributor: "Elosztó"
enterprise_fees: "Vállalkozási díjak"
process_my_order: "Rendelésem feldolgozása"
- delivery_instructions: Szállítási útmutató
+ delivery_instructions: Szállítási utasítások
delivery_method: szállítási mód
fee_type: "Díjtípus"
tax_category: "Adókategória"
@@ -2585,7 +2714,7 @@ hu:
spree_admin_single_enterprise_alert_mail_confirmation: "Kérjük, erősítse meg az e-mail címet"
spree_admin_single_enterprise_alert_mail_sent: "E-mailt küldtünk a címre"
spree_admin_overview_action_required: "Cselekvést kíván"
- spree_admin_overview_check_your_inbox: "Kérjük, nézze meg beérkezett üzeneteit a további utasításokért. Köszönjük!"
+ spree_admin_overview_check_your_inbox: "Kérjük, nézd meg beérkezett üzeneteid a további utasításokért. Köszönjük!"
spree_admin_unit_value: Egységérték
spree_admin_unit_description: Egység leírása
spree_admin_variant_unit: Változatos egység
@@ -2672,7 +2801,7 @@ hu:
report_header_order_cycle: Rendelési ciklus
report_header_user: Felhasználó
report_header_email: Email
- report_header_status: Állapot
+ report_header_status: Státusz
report_header_comments: Hozzászólások
report_header_first_name: Keresztnév
report_header_last_name: Vezetéknév
@@ -2723,9 +2852,10 @@ hu:
report_header_total_tax: "Összes adó (%{currency_symbol})"
report_header_total_excl_tax: "Összesen, kivéve adó (%{currency_symbol})"
report_header_total_incl_tax: "Összesen, beleértve adó (%{currency_symbol})"
+ report_header_total_orders: "Össz Rendelésszám"
report_header_enterprise: Vállalkozás
report_header_enterprise_fee_name: Név
- report_header_enterprise_fee_type: típus
+ report_header_enterprise_fee_type: Típus
report_header_enterprise_fee_owner: Tulajdonos
report_header_customer: Vevő
report_header_customer_first_name: Keresztnév
@@ -2733,6 +2863,7 @@ hu:
report_header_customer_code: Ügyfélkód
report_header_product: Termék
report_header_product_properties: Termék tulajdonságai
+ report_header_product_tax_category: Termék Adó kategóriája
report_header_quantity: Mennyiség
report_header_max_quantity: Max Mennyiség
report_header_variant: Változat
@@ -2745,6 +2876,7 @@ hu:
report_header_supplier: Termelő
report_header_producer: Termelő
report_header_producer_suburb: Termelő település
+ report_header_producer_tax_status: Termelő adókategóriája
report_header_unit: Mértékegység
report_header_group_buy_unit_quantity: Csoportos vásárlási egység mennyisége
report_header_cost: Költség
@@ -2760,6 +2892,7 @@ hu:
report_header_distributor_address: Forgalmazó címe
report_header_distributor_city: Forgalmazó város
report_header_distributor_postcode: Forgalmazó irányítószáma
+ report_header_distributor_tax_status: A Forgalmazó Adózási státusza
report_header_delivery_address: Szállítási cím
report_header_delivery_postcode: Szállítási irányítószám
report_header_bulk_unit_size: Tömeges mértékegység
@@ -2781,7 +2914,7 @@ hu:
report_header_customer_email: Ügyfél e-mail
report_header_customer_phone: Ügyfél telefon
report_header_customer_city: Ügyfél városa
- report_header_payment_state: Fizetési állapot
+ report_header_payment_state: Fizetési státusz
report_header_payment_type: Fizetési mód
report_header_item_price: "Tétel (%{currency})"
report_header_item_fees_price: "Tétel + díjak (%{currency})"
@@ -2817,6 +2950,9 @@ hu:
report_header_transaction_fee: Tranzakciós díj (adó nélkül)
report_header_total_untaxable_admin: Összes adózhatatlan rendszergazdai korrekció (adó nélkül)
report_header_total_taxable_admin: Összes adóköteles rendszergazdai korrekció (adóval együtt)
+ report_line_cost_of_produce: Termékek költsége
+ report_line_line_items: tételsor
+ report_header_last_completed_order_date: Utolsó teljesített rendelés dátuma
report_xero_configuration: Xero konfiguráció
initial_invoice_number: "Kezdeti számlaszám"
invoice_date: "Számla kiállítási dátuma"
@@ -2828,7 +2964,7 @@ hu:
filter_products: "Termékek szűrése"
delete_product_variant: "Az utolsó változat nem törölhető!"
progress: "előrehalad"
- saving: "Megtakarítás.."
+ saving: "Mentés..."
success: "siker"
failure: "kudarc"
unsaved_changes_confirmation: "A nem mentett módosítások elvesznek. Mindenképp folytatni?"
@@ -2905,14 +3041,18 @@ hu:
no_orders_found: "Nem található rendelés"
order_information: "Rendelési információ"
new_payment: "Új fizetés"
+ create_or_update_invoice: "Számla Létrehozása vagy Frissítése"
date_completed: "Teljesítés dátuma"
amount: "Összeg"
+ invoice_number: "A számla sorszáma"
+ invoice_file: "File"
+ invalid_url: "%{url}érvénytelen URL"
state_names:
ready: Kész
pending: Függőben levő
- shipped: Kiszállított
+ shipped: Kiszállítva
js:
- saving: 'Megtakarítás...'''
+ saving: 'Mentés...'
changes_saved: 'Változtatások elmentve.'''
authorising: "Engedélyezés..."
save_changes_first: Először mentse a változtatásokat.
@@ -2942,9 +3082,10 @@ hu:
deleting_item_will_cancel_order: "Ez a művelet egy vagy több üres rendelést eredményez, amelyek törlésre kerülnek. Szeretné folytatni?"
modals:
got_it: "Megvan"
+ confirm: "Megerősítés"
close: "Bezárás"
continue: "Tovább"
- cancel: "Vissza"
+ cancel: "Törlés"
invite: "Meghívás"
invite_title: "Nem regisztrált felhasználó meghívása"
tag_rule_help:
@@ -2978,7 +3119,7 @@ hu:
panels:
save: MENTÉS
saved: MENTETT
- saving: MEGTAKARÍTÁS
+ saving: MENTÉS
enterprise_package:
hub_profile: Átvételi pont profil
hub_profile_cost: "KÖLTSÉG: MINDIG INGYENES"
@@ -3071,16 +3212,12 @@ hu:
is adhatnak át a vásárlóknak az átadóponton.
non_producer: Nem termelő
non_producer_text1: >
- Non-termelős do not produce any food themselves, meaning that they cannot
- create: A nem termelők maguk nem állítanak elő élelmiszert, vagyis nem
- tudnak létrehozni their own products for sale through the Open Food
- Network.: saját termékeiket az Open Food Networkön keresztül értékesítik.
+ A nem-termelők maguk nem állítanak elő élelmiszert, vagyis nem tudják
+ feltölteni saját termékeiket, és az Open Food Networkön keresztül értékesíteni.
non_producer_text2: >
- Instead, non-termelős specialise in linking termelős to the end eater,
- whether it: Helyette," nem termelők arra specializálódtak, hogy összekapcsolják
- a termelőket a végfogyasztóval", hogy az be by aggregating, grading,
- packing, selling or delivering food.: összesítésével legyen, osztályozás,
- csomagolás, élelmiszer értékesítése vagy szállítása.
+ A nem-termelők arra specializálódtak, hogy összekapcsolják a termelőket
+ a fogyasztóval akár olyan módon, hogy összegyűjtik a rendeléseket, vagy
+ szortírozzák, csomagolják, szállítják.
producer_desc: Élelmiszer termelők
producer_example: például. TERMELŐK, PÉKEK, SÖRÖZŐK, KÉSZÍTŐK
non_producer_desc: Minden más élelmiszeripari vállalkozás
@@ -3096,6 +3233,8 @@ hu:
select_all_variants: "Válaszd ki az összes %{total_number_of_variants} változatot"
variants_loaded: "%{num_of_variants_loaded}/%{total_number_of_variants} változat betöltve"
loading_variants: "Változatok betöltése"
+ no_variants: "Nincs elérhető termékváltozat ehhez a termékhez (a készletbeállításokban rejtett státuszúak)."
+ some_variants_hidden: "(Egyes termékváltozatok a leltárbeállítások miatt rejtve maradhatnak)"
tag_rules:
shipping_method_tagged_top: "Szállítási módok felcímkézve"
shipping_method_tagged_bottom: "vannak:"
@@ -3138,7 +3277,7 @@ hu:
partial: "részleges"
pending: "függőben levő"
ready: "kész"
- shipped: "kiszállított"
+ shipped: "kiszállítva"
canceled: "törölve"
payment_states:
balance_due: "fizetendő összeg"
@@ -3237,7 +3376,7 @@ hu:
no_authorisation: "Nem sikerült felhatalmazást kapnom a módosítások mentésére, így azok mentés nélkül maradnak."
some_trouble: "Problémáim akadtak a mentésnél: %{errors}"
changing_on_hand_stock: Változás a kézi készletszinten...
- stock_reset: A részvények visszaállnak az alapértelmezett értékekre.
+ stock_reset: A készletek visszaállnak az alapértelmezett értékekre.
tag_rules:
show_hide_variants: 'Változatok megjelenítése vagy elrejtése a kirakatomban'
show_hide_shipping: 'Szállítási módok megjelenítése vagy elrejtése fizetéskor'
@@ -3263,7 +3402,7 @@ hu:
create_failure: "Nem sikerült létrehozni a rendelési ciklust"
update_success: 'Megrendelési ciklusa frissült.'''
update_failure: "Nem sikerült frissíteni a rendelési ciklust"
- no_distributors: Ebben a rendelési ciklusban nincsenek forgalmazók. Ez a rendelési ciklus nem lesz látható az ügyfelek számára, amíg nem ad hozzá egyet. Szeretné folytatni a rendelési ciklus mentését?'
+ no_distributors: Ebben a rendelési ciklusban nincsenek forgalmazók. Ez a rendelési ciklus nem lesz látható az ügyfelek számára, amíg nem adsz hozzá forgalmazót. Szeretnéd folytatni a rendelési ciklus mentését?'
enterprises:
producer: "Termelő"
non_producer: "Nem termelő"
@@ -3278,8 +3417,8 @@ hu:
users:
order: "Rendelés"
registration:
- welcome_to_ofn: "Üdvözöljük az Open Food Networkben!"
- signup_or_login: "Kezdje regisztrációval (vagy bejelentkezéssel)"
+ welcome_to_ofn: "Üdvözöljük az Open Food Network-ben!"
+ signup_or_login: "Kezd a regisztrációval (vagy bejelentkezéssel)"
have_an_account: "Már van fiókja?"
action_login: "Jelentkezzen be most."
stripe_elements:
@@ -3441,7 +3580,7 @@ hu:
account: "fiók"
logout: "Kijelentkezés"
date_range: "Időintervallum"
- status: "állapot"
+ status: "státusz"
new: "Új"
start: "Kezdete"
end: "Vége"
@@ -3450,6 +3589,7 @@ hu:
previous: "Előző"
last: "Utolsó"
spree:
+ order_updated: "Rendelés frissült"
add_country: "Ország hozzáadása"
add_state: "Állapot hozzáadása"
adjustment: "Beállítás"
@@ -3477,7 +3617,7 @@ hu:
new_taxon: "Új taxon"
new_user: "Új felhasználó"
no_pending_payments: "Nincsenek függőben lévő kifizetések"
- remove: "eltávolítás"
+ remove: "Eltávolítás"
none: "Egyik sem"
not_found: "Nem található"
notice_messages:
@@ -3489,9 +3629,12 @@ hu:
server_error: "Szerver hiba"
shipping_method_names:
UPS Ground: "UPS föld"
+ pick_up: "Átvétel a gazdaságban"
start_date: "Kezdő dátum"
successfully_removed: "Sikeresen eltávolítva"
taxonomy_edit: "Termék kategória szerkesztés"
+ taxonomy_tree_error: "Hiba lépett fel a Kategória-fa frissítésében."
+ taxonomy_tree_instruction: "Kattints a jobb gombbal egy elemre a hozzáadáshoz, átnevezéshez, eltávolításhoz vagy szerkesztéshez."
tree: "Fa"
updating: "Frissítés"
your_order_is_empty_add_product: "Rendelése üres, kérjük keressen és adjon hozzá egy terméket fent"
@@ -3501,7 +3644,7 @@ hu:
back_to_orders_list: "Vissza a rendelési listához"
back_to_payments_list: "Vissza a fizetési listához"
return_authorizations: "Visszaküldési engedélyek"
- cannot_create_returns: "Nem hozható létre visszaküldés, mivel ebben a rendelésben nincsenek kiszállított egységek."
+ cannot_create_returns: "Nem tudsz visszárut létrehozni, mivel a rendelésnek nincsenek kiszállított egységei."
select_stock: "Válasszon részvényt"
location: "Elhelyezkedés"
count_on_hand: "Count On Hand"
@@ -3544,6 +3687,7 @@ hu:
credit_card: "Hitelkártya"
new_payment: "Új fizetés"
capture: "Elfog"
+ capture_and_complete_order: "A rendelés rögzítése és lezárása"
void: "Üres"
login: "Belépés"
password: "Jelszó"
@@ -3570,6 +3714,7 @@ hu:
display_currency: "Megjelenítési pénznem"
choose_currency: "válasszon pénznemet"
mail_method_settings: "Levelezési mód beállításai"
+ mail_settings_notice_html: "Az itt végrehajtott módosítások csak ideiglenesek, hibakeresés céljából történnek, és a jövőben visszaállíthatók.
A végleges változtatásokat a biztonsági adatok frissítésével és az ofn-install segítségével történő telepítéssel lehet elvégezni. További részletekért forduljon az OFN globális csapatához."
general: "Tábornok"
enable_mail_delivery: "Levélkézbesítés engedélyezése"
send_mails_as: "Levelek küldése másként"
@@ -3612,10 +3757,11 @@ hu:
shipping_method: "Szállítási Mód"
shipment: "Szállítás"
payment: "Fizetés"
- status: "Állapot"
+ status: "Státusz"
shipping_categories: "Szállítási módok"
new_shipping_category: "Új szállítási mód"
back_to_shipping_categories: "Vissza a szállítási módokhoz"
+ editing_shipping_category: "Szállítási kategória szerkesztése"
name: "Név"
description: "Leírás"
type: "típus"
@@ -3660,7 +3806,7 @@ hu:
cannot_create_payment_without_payment_methods: "Fizetési módok megadása nélkül nem hozhat létre fizetést egy rendelésre."
please_define_payment_methods: "Kérjük, először határozzon meg néhány fizetési módot."
options: "Opciók"
- has_no_shipped_units: "nincs szállított egysége"
+ has_no_shipped_units: "nincsenek kiszállított egységek"
successfully_created: '%{resource} sikeresen létrehozva!'
successfully_updated: '%{resource} sikeresen frissítve!'
payment_method: "Fizetési mód"
@@ -3672,7 +3818,7 @@ hu:
out_of_stock: '%{item} elfogyott.'
actions:
update: "Frissítés"
- cancel: "Vissza"
+ cancel: "Törlés"
shared:
error_messages:
errors_prohibited_this_record_from_being_saved:
@@ -3685,7 +3831,7 @@ hu:
date_time: "Dátum idő"
amount: "Összeg"
payment_method: "Fizetési mód"
- payment_state: "Fizetési állapot"
+ payment_state: "Fizetési Státusz"
errors:
messages:
included_price_validation: "nem választható ki, hacsak nem állított be egy alapértelmezett adózónát"
@@ -3698,6 +3844,11 @@ hu:
validation:
must_be_int: "egész számnak kell lennie"
admin:
+ images:
+ edit:
+ title: Termékkép szerkesztése
+ close: Vissza
+ upload: Fotó feltöltése
mail_methods:
send_testmail: "Küldj teszt e-mailt"
testmail:
@@ -3724,6 +3875,11 @@ hu:
enterprise_relationships: "Engedélyek"
customers: "Ügyfelek"
groups: "Csoportok"
+ oidc_settings: "OIDC Beállítások"
+ overview: "Áttekintés"
+ product_import: "Importálás"
+ enterprise_roles: "Szerepek"
+ payment_methods: "Fizetési módok"
product_properties:
index:
inherits_properties_checkbox_hint: "Tulajdonságokat örököl a következőtől: %{supplier}? (hacsak nincs felülírva)"
@@ -3748,9 +3904,9 @@ hu:
return_authorizations: "Visszaküldési engedélyek"
back_to_orders_list: "Vissza a rendelési listához"
rma_number: "RMA szám"
- status: "Állapot"
+ status: "Státusz"
amount: "Összeg"
- cannot_create_returns: "Nem hozható létre visszaküldés, mivel ebben a rendelésben nincsenek kiszállított egységek."
+ cannot_create_returns: "Nem tudsz visszárut létrehozni, mivel a rendelésnek nincsenek kiszállított egységei."
continue: "Tovább"
new:
new_return_authorization: "Új visszaküldési engedély"
@@ -3762,7 +3918,7 @@ hu:
return_authorization: "Visszaküldési engedély"
form:
product: "Termék"
- quantity_shipped: "Szállított mennyiség"
+ quantity_shipped: "Kiszállított mennyiség"
quantity_returned: "Visszaadott mennyiség"
return_quantity: "Visszaküldési mennyiség"
amount: "Összeg"
@@ -3781,6 +3937,9 @@ hu:
add_product:
cannot_add_item_to_canceled_order: "A törölt rendeléshez nem lehet tételt hozzáadni"
include_out_of_stock_variants: "Tartalmazza azokat a változatokat, amelyeknél nincs raktárkészlet"
+ shipment:
+ mark_as_shipped_message_html: "Ezzel a megrendelést KISZÁLLÍTVA-ként jelölöd meg. Biztos, hogy folytatni szeretnéd?"
+ mark_as_shipped_label_message: "Szállítási/átvételi értesítő e-mail küldése az ügyfélnek."
index:
listing_orders: "Megrendelések listája"
new_order: "Új rend"
@@ -3798,10 +3957,18 @@ hu:
results_found: "%{number} találat."
viewing: "%{start} – %{end} megtekintése."
print_invoices: "Számlák nyomtatása"
+ cancel_orders: "Rendelések törlése"
resend_confirmation: "Visszaigazolás újraküldése"
+ resend_confirmation_confirm_html: "Ezzel újra elküldöd a visszaigazoló e-mailt az ügyfélnek. Biztos, hogy folytatni szeretnéd?"
+ send_invoice: "Számlák kiküldése"
+ send_invoice_confirm_html: "Ez a funkció az összes kiválasztott KÉSZ (státuszú) megrendelésről szóló számlát elküldi a vásárlónak e-mailben.
Biztos, hogy folytatni szeretnéd?"
+ selected:
+ zero: "Nincs kiválasztott rendelés"
+ one: "1 rendelés kiválasztva"
+ other: "%{count}rendelés kiválasztva"
sortable_header:
- payment_state: "Fizetési állapot"
- shipment_state: "Szállítási állapot"
+ payment_state: "Fizetési státusz"
+ shipment_state: "Szállítási Státusz"
completed_at: "Elkészült:"
number: "Szám"
state: "Ország"
@@ -3812,9 +3979,12 @@ hu:
code: "Kód"
to: "Bill to"
shipping: "Szállítás"
+ order_number: "Rendelési sorszám"
+ invoice_number: "A számla sorszáma"
payments_list:
- date_time: "Dátum idő"
+ date_time: "Dátum/idő"
payment_method: "Fizetési mód"
+ payment_state: "Fizetési Státusz"
amount: "Összeg"
note:
note_label: "Megjegyzés:"
@@ -3827,9 +3997,12 @@ hu:
line_item_adjustments: "Sorok korrekciói"
order_adjustments: "Rendelési módosítások"
order_total: "Rendelés Összesen"
+ invoices:
+ index:
+ order_has_changed: "A rendelés megváltozott a legutóbbi számlafrissítés óta. Előfordulhat, hogy az itt megjelenített számla már nem aktuális."
overview:
enterprises_header:
- ofn_with_tip: A vállalkozások termelők és/vagy központok, és az Open Food Network szervezeti egységei.
+ ofn_with_tip: A termelők, kisvállalkozások, élelmiszer központok, élelmiszer közösségek, termelői piacok az Open Food Network szervezeti egységei.
enterprise_row:
has_no_enterprise_fees: "nincs vállalkozási díja"
has_no_payment_methods: "nincs fizetési mód"
@@ -3907,7 +4080,7 @@ hu:
account_missing_msg: Ehhez a vállalkozáshoz nem tartozik Stripe-fiók.
connect_one: Connect One
access_revoked_msg: Stripe-fiókhoz való hozzáférést visszavonták," kérjük, csatlakoztassa újra fiókját.
- status: Állapot
+ status: Státusz
connected: csatlakoztatva
account_id: felhasználónév
business_name: Vállalkozás neve
@@ -3939,6 +4112,7 @@ hu:
paypal:
no_payment_via_admin_backend: A Paypal fizetések nem rögzíthetők a Backoffice-ban
products:
+ image_upload_error: "Kérjük, a képet JPG, PNG, GIF, SVG vagy WEBP formátumban töltsd fel."
new:
title: "Új termék"
new_product: "Új termék"
@@ -3983,11 +4157,16 @@ hu:
bulk_unit_size: Tömeges mértékegység
display_as:
display_as: Megjelenítés mint
+ clone:
+ success: A termék klónozva lett
reports:
table:
select_and_search: "Válaszd ki a szűrőket, és kattintson a %{option} elemre az adatok eléréséhez."
customer_names_message:
customer_names_tip: "Ha az Ön által szállított rendeléseknél a vásárlók nevei el vannak rejtve, felveheti a kapcsolatot a forgalmazóval, és megkérdezheti, hogy frissítheti-e átvételi ponti beállításait, hogy beszállítóik megtekinthessék a vásárlók nevét."
+ products_and_inventory:
+ all_products:
+ message: "Felhívjuk a figyelmed arra, hogy a megadott készletszintek csak a beszállítói terméklistákból származnak. Ha a készletmennyiségek kezelésére a Készletnyilvántartást használod, akkor ezeket az értékeket a jelentés nem veszi figyelembe."
users:
index:
listing_users: "Felhasználók listázása"
@@ -4006,6 +4185,7 @@ hu:
enterprise_limit: "Vállalkozási korlát"
confirm_password: "Jelszó megerősítése"
password: "Jelszó"
+ locale: "Nyelv"
email_confirmation:
confirmation_pending: "Az e-mail megerősítés függőben van. Megerősítő e-mailt küldtünk a következő címre: %{address}."
variants:
@@ -4041,9 +4221,9 @@ hu:
name: "Név"
number: "Szám"
completed_at: "Elkészült:"
- state: "Állapot"
- payment_state: "Fizetési állapot"
- shipment_state: "Szállítási állapot"
+ state: "Státusz"
+ payment_state: "Fizetési Státusz"
+ shipment_state: "Szállítási Státusz"
email: "Email"
total: "Összesen"
billing_address_name: "Név"
@@ -4051,7 +4231,11 @@ hu:
form:
name: Név
permalink: Permalink
+ meta_title: Meta Cím (SEO cím)
+ meta_description: Meta Leírás
+ meta_keywords: Meta Kulcsszavak
description: Leírás
+ dfc_id: DFC URI
general_settings:
edit:
legal_settings: "Jogi beállítások"
@@ -4096,7 +4280,7 @@ hu:
partial: részleges
pending: függőben levő
ready: kész
- shipped: kiszállított
+ shipped: kiszállítva
canceled: törölve
payment_states:
balance_due: fizetendő összeg
@@ -4116,16 +4300,16 @@ hu:
customer_greeting: "Kedves %{name}!"
instructions_html: "Megrendelését a(z) %{distributor}-tól TÖRÖLTE. Kérjük, őrizze meg ezt a törlési információt saját nyilvántartása céljából."
dont_cancel: "Ha meggondoltad magad, vagy nem szeretnéd lemondani ezt a rendelést, fordulj a %{email}"
- order_summary_canceled_html: "Megrendelés összegzése"
+ order_summary_canceled_html: "Megrendelés összegzése #%{number}[TÖRÖLVE] "
details: "Itt vannak a megrendelt termékek részletei:"
- unpaid_order: "Megrendelését nem fizették ki, így a visszatérítés nem történt"
- paid_order: "Megrendelését kifizették, így %{distributor} visszatérítette a teljes összeget"
+ unpaid_order: "Megrendelésed nem lett kifizetve, így visszatérítés nem történt"
+ paid_order: "Megrendelésed fizetésre került, így %{distributor} visszatérítette a teljes összeget"
credit_order: "Megrendelését kifizették, így jóváírásra került a számláján"
subject: "Megrendelés törlése"
cancel_email_for_shop:
greeting: "Kedves %{name}!"
subject: "Megrendelés törlése"
- intro: "Egy ügyfél törölte a"
+ intro: "Egy ügyfél törölte a rendelését #%{number}"
view_cancelled_order: "A törölt rendelés megtekintése"
confirm_email:
subject: "Megrendelés visszaigazolás"
@@ -4155,12 +4339,14 @@ hu:
shipment_mailer:
shipped_email:
dear_customer: "Tisztelt Ügyfelünk,"
- instructions: "Megrendelését a(z) %{distributor}-tól elküldtük"
+ instructions: "Megrendelésed a(z) %{distributor}-tól elküldtük"
shipment_summary: "Szállítási összefoglaló"
subject: "Szállítási értesítés"
thanks: "Köszönjük üzletét."
track_information: "Követési információ: %{tracking}"
track_link: "! Követő link: %{url}"
+ picked_up_instructions: "Az Ön megrendelését %{distributor}termelőtől felvettük."
+ picked_up_subject: "Átvételi értesítés/megjegyzés"
test_mailer:
test_email:
greeting: "Gratulálunk!"
@@ -4208,10 +4394,24 @@ hu:
users:
api_keys:
regenerate_key: "Kulcs újragenerálása"
+ title: API kulcs
+ webhook_endpoints:
+ title: Webhook végpontok
+ description: A rendszerben bekövetkező események webhookokat indíthatnak külső rendszerek felé.
+ event_types:
+ order_cycle_opened: Rendelési ciklus megnyitva
+ event_type:
+ header: Esemény típusa
+ url:
+ header: Végpont URL
+ create_placeholder: Adja meg a távoli webhook végpont URL-címét
+ developer_settings:
+ title: Fejlesztői beállítások
form:
account_settings: Fiók beállítások
show:
tabs:
+ developer_settings: Fejlesztői beállítások
orders: Megrendelések
cards: Bankkártyák
transactions: Tranzakciók
@@ -4231,7 +4431,7 @@ hu:
items: Tételek
total: Összesen
edit: Szerkesztés
- cancel: Vissza
+ cancel: Törlés
closed: Zárva
until: Amíg
past_orders:
@@ -4241,7 +4441,8 @@ hu:
items: Tételek
total: Összesen
paid?: Fizetett?
- status: Állapot
+ status: Státusz
+ completed: Elkészült
cancelled: Törölve
saved_cards:
default?: Alapértelmezett?
@@ -4253,6 +4454,7 @@ hu:
authorised_shops:
shop_name: "Átvételi pont neve"
allow_charges?: "Engedélyezi a terhelést az alapértelmezett kártyára?"
+ no_default_saved_cards_tooltip: Egy hitelkártyát alapértelmezettként kell megjelölnie a terhelések engedélyezéséhez.
localized_number:
invalid_format: formátuma érvénytelen. Kérjük, adjon meg egy számot.
api:
@@ -4269,14 +4471,16 @@ hu:
key_generated: "Kulcs generálva"
key_cleared: "Kulcs törölve"
shipment:
- cannot_ready: "Nem lehet kész a szállítás."
+ cannot_ready: "Nem áll készen a szállításra."
invalid_taxonomy_id: "Érvénytelen termék kategória azonosító."
+ toggle_api_key_view: "API-kulcs nézet megjelenítése a felhasználó számára"
activerecord:
models:
spree/payment:
one: Fizetés
other: Kifizetések
- unit: Mértékegység
+ unit: mértékegység
+ per_unit: egységenként
datetime:
distance_in_words:
about_x_hours:
@@ -4317,10 +4521,16 @@ hu:
one: "1 év"
other: "%{count} év"
components:
+ multiple_checked_select:
+ filter_placeholder: "Szűrési lehetőségek"
search_input:
placeholder: Keresés
selector_with_filter:
+ selected_items: "%{count}kiválasztva"
search_placeholder: Keresés
pagination:
next: Következő
previous: Előző
+ invisible_captcha:
+ sentence_for_humans: "Kérjük hagyja üresen"
+ timestamp_error_message: "Kérjük, próbáld meg 5 másodperc múlva."
diff --git a/config/locales/it.yml b/config/locales/it.yml
index c5ad8a82e2c..b422787326f 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -498,6 +498,7 @@ it:
edit: Modifica
clone: Duplica
delete: Annulla
+ remove: Rimuovi
image:
edit: Modifica
adjustments:
@@ -727,8 +728,12 @@ it:
clear_search: Pulisci ricerca
table:
new_variant: Nuova variante
- edit_image:
- close: Indietro
+ variant_row:
+ none_tax_category: Nessuno
+ category_field_name: "Categoria"
+ tax_category_field_name: "Categoria d'imposta"
+ product_row:
+ producer_field_name: "Produttore"
product_import:
title: Importa prodotto
file_not_found: Documento non trovato o non disponibile
@@ -1870,7 +1875,6 @@ it:
label_account: "Account"
label_more: "Mostra di più"
label_less: "Mostra meno"
- label_notices: "Avvisi"
cart_items: "articoli"
cart_headline: "Il tuo carrello"
total: "Totale"
@@ -3741,6 +3745,9 @@ it:
validation:
must_be_int: "deve essere un numero intero"
admin:
+ images:
+ edit:
+ close: Indietro
mail_methods:
send_testmail: "Invia mail prova"
testmail:
@@ -3768,6 +3775,10 @@ it:
customers: "Clienti"
groups: "Reti"
oidc_settings: "Impoostazioni"
+ overview: "Panoramica"
+ product_import: "Importazione"
+ enterprise_roles: "Ruoli"
+ payment_methods: "Metodi di Pagamento"
product_properties:
index:
inherits_properties_checkbox_hint: "Eredita le proprietà da %{supplier}? (se non sovrascritto)"
diff --git a/config/locales/it_CH.yml b/config/locales/it_CH.yml
index ea951827a5a..a4710118645 100644
--- a/config/locales/it_CH.yml
+++ b/config/locales/it_CH.yml
@@ -445,6 +445,7 @@ it_CH:
edit: Modifica
clone: Duplica
delete: Annulla
+ remove: Rimuovi
image:
edit: Modifica
adjustments:
@@ -669,8 +670,12 @@ it_CH:
clear_search: Pulisci ricerca
table:
new_variant: Nuova variante
- edit_image:
- close: Indietro
+ variant_row:
+ none_tax_category: Nessuno
+ category_field_name: "Categoria"
+ tax_category_field_name: "Categoria di imposta"
+ product_row:
+ producer_field_name: "Produttore"
product_import:
title: Importa prodotto
file_not_found: Documento non trovato o non disponibile
@@ -1769,7 +1774,6 @@ it_CH:
label_account: "Account"
label_more: "Mostra di più"
label_less: "Mostra meno"
- label_notices: "Avvisi"
cart_items: "articoli"
cart_headline: "Il tuo carrello"
total: "Totale"
@@ -3598,6 +3602,9 @@ it_CH:
validation:
must_be_int: "deve essere un numero intero"
admin:
+ images:
+ edit:
+ close: Indietro
mail_methods:
send_testmail: "Invia mail prova"
testmail:
@@ -3624,6 +3631,10 @@ it_CH:
enterprise_relationships: "permessi"
customers: "Clienti"
groups: "Reti"
+ overview: "Panoramica"
+ product_import: "Importazione"
+ enterprise_roles: "Ruoli"
+ payment_methods: "Metodi di pagamento"
product_properties:
index:
inherits_properties_checkbox_hint: "Eredita le proprietà da %{supplier}? (se non sovrascritto)"
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 2484c4f61fd..d12529c8252 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -468,6 +468,7 @@ ko:
edit: 편집
clone: 복사
delete: 삭제
+ remove: 제거
image:
edit: 편집
adjustments:
@@ -692,8 +693,12 @@ ko:
clear_search: 검색 지우기
table:
new_variant: 새로운 변경사항
- edit_image:
- close: 뒤로
+ variant_row:
+ none_tax_category: None
+ category_field_name: "목록"
+ tax_category_field_name: "세금 목록"
+ product_row:
+ producer_field_name: "제공자"
product_import:
title: 제품 가져오기
file_not_found: 파일을 찾을 수 없거나 열 수 없습니다.
@@ -1798,7 +1803,6 @@ ko:
label_account: "계정"
label_more: "더 보기"
label_less: "적게 표시"
- label_notices: "공지사항"
cart_items: "항목"
cart_headline: "당신의 쇼핑 카트"
total: "총합"
@@ -3564,6 +3568,9 @@ ko:
validation:
must_be_int: "정수여야 합니다"
admin:
+ images:
+ edit:
+ close: 뒤로
mail_methods:
send_testmail: "테스트 이메일 보내기"
testmail:
@@ -3590,6 +3597,10 @@ ko:
enterprise_relationships: "사용 권한"
customers: "소비자"
groups: "그룹"
+ overview: "개요"
+ product_import: "수입"
+ enterprise_roles: "역할"
+ payment_methods: "결제 방법"
product_properties:
index:
inherits_properties_checkbox_hint: "%{supplier} 속성을 상속하시겠습니까? (위에서 재정의하지 않는 경우)"
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 7126238da96..15a9234e9ab 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -137,7 +137,8 @@ ml:
unprocessable_entity:
title: "നിങ്ങൾ ആഗ്രഹിച്ച മാറ്റം നിരസിക്കപ്പെട്ടു (422)"
message_html: "നിങ്ങൾ ആഗ്രഹിച്ച മാറ്റം നിരസിക്കപ്പെട്ടു. നിങ്ങൾക്ക് അനുമതി ഇല്ലാത്ത എന്തെങ്കിലും മാറ്റാൻ നിങ്ങൾ ശ്രമിച്ചിരിക്കാം.
"
- stimulus_reflex_error: "ക്ഷമിക്കണം, എന്തോ കുഴപ്പം സംഭവിച്ചു.\n\n ഇതൊരു താൽക്കാലിക പ്രശ്നമായിരിക്കാം, അതിനാൽ ദയവായി വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ പേജ് റീലോഡ് ചെയ്യുക.\n ഞങ്ങൾ എല്ലാ പ്രശ്നങ്ങളും രേഖപ്പെടുത്തുന്നുണ്ട്, ചിലപ്പോൾ ഒരു പരിഹാരത്തിനായി പ്രവർത്തിച്ചുകൊണ്ടിരിക്കുകയും ആകാം\n പ്രശ്നം നിലനിൽക്കുന്നുവെങ്കിലോ അല്ലെങ്കിൽ ആത്യാവശ്യമോ ആണെങ്കിൽ, ദയവായി ഞങ്ങളുമായി ബന്ധപ്പെടുക. "
+ general_error:
+ message: "ക്ഷമിക്കണം, എന്തോ കുഴപ്പം സംഭവിച്ചു.\n\n ഇതൊരു താൽക്കാലിക പ്രശ്നമായിരിക്കാം, അതിനാൽ ദയവായി വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ പേജ് റീലോഡ് ചെയ്യുക.\n ഞങ്ങൾ എല്ലാ പ്രശ്നങ്ങളും രേഖപ്പെടുത്തുന്നുണ്ട്, ചിലപ്പോൾ ഒരു പരിഹാരത്തിനായി പ്രവർത്തിച്ചുകൊണ്ടിരിക്കുകയും ആകാം\n പ്രശ്നം നിലനിൽക്കുന്നുവെങ്കിലോ അല്ലെങ്കിൽ ആത്യാവശ്യമോ ആണെങ്കിൽ, ദയവായി ഞങ്ങളുമായി ബന്ധപ്പെടുക. "
stripe:
error_code:
incorrect_number: "കാർഡ് നമ്പർ തെറ്റാണ്."
@@ -534,6 +535,7 @@ ml:
edit: എഡിറ്റ് ചെയ്യുക
clone: ക്ലോൺ
delete: ഡിലീറ്റ് ചെയ്യുക
+ remove: നീക്കം ചെയ്യുക
image:
edit: എഡിറ്റ് ചെയ്യുക
adjustments:
@@ -755,6 +757,7 @@ ml:
index:
header:
title: ഉൽപ്പന്നങ്ങൾ മൊത്തമായി തിരുത്തുക
+ content:
loading: നിങ്ങളുടെ ഉൽപ്പന്നങ്ങൾ ലോഡ് ചെയ്യുന്നു
filters:
search_products: ഉൽപ്പന്നങ്ങൾക്കായി തിരയുക
@@ -792,8 +795,12 @@ ml:
new_variant: പുതിയ വേരിയന്റ്
bulk_update:
success: മാറ്റങ്ങൾ സേവ് ചെയ്തു.
- edit_image:
- close: തിരികെ
+ variant_row:
+ none_tax_category: ഒന്നുമില്ല
+ category_field_name: "വിഭാഗം"
+ tax_category_field_name: "നികുതി വിഭാഗം"
+ product_row:
+ producer_field_name: "പ്രൊഡ്യൂസർ"
product_import:
title: ഉൽപ്പന്ന ഇറക്കുമതി
file_not_found: ഫയൽ കണ്ടെത്തിയില്ല അല്ലെങ്കിൽ തുറക്കാൻ കഴിഞ്ഞില്ല
@@ -2018,7 +2025,6 @@ ml:
label_account: "അക്കൗണ്ട്"
label_more: "കൂടുതൽ കാണിക്കുക"
label_less: "കുറച്ചുമാത്രം കാണിക്കുക"
- label_notices: "അറിയിപ്പുകൾ"
cart_items: "ഇനങ്ങൾ"
cart_headline: "നിങ്ങളുടെ ഷോപ്പിംഗ് കാർട്ട്"
total: "ആകെ"
@@ -3899,6 +3905,9 @@ ml:
validation:
must_be_int: "ഒരു പൂർണ്ണസംഖ്യ ആയിരിക്കണം"
admin:
+ images:
+ edit:
+ close: തിരികെ
mail_methods:
send_testmail: "ടെസ്റ്റ് ഇമെയിൽ അയയ്ക്കുക"
testmail:
@@ -3926,6 +3935,10 @@ ml:
customers: "ഉപഭോക്താക്കൾ"
groups: "ഗ്രൂപ്പുകൾ"
oidc_settings: "ഓഐഡിസി ക്രമീകരണങ്ങൾ"
+ overview: "അവലോകനം"
+ product_import: "ഇറക്കുമതി ചെയ്യുക"
+ enterprise_roles: "കർത്തവ്യങ്ങൾ"
+ payment_methods: "പേയ്മെന്റ് രീതികൾ"
product_properties:
index:
inherits_properties_checkbox_hint: "%{supplier} ൽ നിന്ന് പ്രോപ്പർട്ടികൾ അവകാശമാക്കണോ? (മുകളിൽ അസാധുവായില്ലെങ്കിൽ)"
diff --git a/config/locales/mr.yml b/config/locales/mr.yml
index df80ca985cb..9a80956de5f 100644
--- a/config/locales/mr.yml
+++ b/config/locales/mr.yml
@@ -137,7 +137,8 @@ mr:
unprocessable_entity:
title: "तुम्हाला हवा असलेला बदल नाकारण्यात आला (422)"
message_html: "तुम्हाला हवा असलेला बदल नाकारण्यात आला. कदाचित तुम्ही असे काहीतरी बदलण्याचा प्रयत्न केला आहे ज्यामध्ये तुम्हाला प्रवेश नाही.
"
- stimulus_reflex_error: "क्षमस्व, पण काहीतरी चुकले आहे.\n\n ही एक तात्पुरती समस्या असू शकते, म्हणून कृपया पुन्हा प्रयत्न करा किंवा पृष्ठ रीलोड करा.\n आम्ही सर्व एरर रेकॉर्ड करतो आणि कदाचित निराकरण करण्यासाठी कार्य करत आहोत.\n समस्या कायम राहिल्यास किंवा तातडीची असल्यास, कृपया आमच्याशी संपर्क साधा."
+ general_error:
+ message: "क्षमस्व, पण काहीतरी चुकले आहे.\n\n ही एक तात्पुरती समस्या असू शकते, म्हणून कृपया पुन्हा प्रयत्न करा किंवा पृष्ठ रीलोड करा.\n आम्ही सर्व एरर रेकॉर्ड करतो आणि कदाचित निराकरण करण्यासाठी कार्य करत आहोत.\n समस्या कायम राहिल्यास किंवा तातडीची असल्यास, कृपया आमच्याशी संपर्क साधा."
stripe:
error_code:
incorrect_number: "कार्ड क्रमांक चुकीचा आहे."
@@ -751,7 +752,6 @@ mr:
index:
header:
title: मोठ्या प्रमाणात उत्पादने संपादित करा
- loading: तुमची उत्पादने लोड करत आहे
filters:
search_products: उत्पादने शोधा
all_producers: सर्व उत्पादक
@@ -785,6 +785,11 @@ mr:
other: "%{count} उत्पादने जतन करणे शक्य नाही. कृपया एरर्सचे पुनरावलोकन करा आणि पुन्हा प्रयत्न करा."
reset: बदल जतन करू नका
save: बदल जतन करा
+ variant_row:
+ none_tax_category: कोणतेही नाही
+ category_field_name: "श्रेणी"
+ product_row:
+ producer_field_name: "उत्पादक"
product_import:
title: उत्पादन आयात
file_not_found: फाइल सापडली नाही किंवा उघडता आली नाही
@@ -1936,7 +1941,6 @@ mr:
label_account: "खाते"
label_more: "अजून दाखवा"
label_less: "कमी दाखवा"
- label_notices: "नोटीस"
cart_items: "वस्तू"
cart_headline: "तुमची शॉपिंग कार्ट"
total: "एकूण"
@@ -3832,6 +3836,8 @@ mr:
customers: "ग्राहक"
groups: "गट"
oidc_settings: "OIDC सेटिंग्ज"
+ product_import: "Import करा"
+ payment_methods: "पेमेंट पद्धती"
product_properties:
index:
inherits_properties_checkbox_hint: "%{supplier} कडून गुणधर्म मिळवायचे? (वर ओव्हरराईड केल्याशिवाय)"
diff --git a/config/locales/nb.yml b/config/locales/nb.yml
index 3fe54ffd612..86837fac94c 100644
--- a/config/locales/nb.yml
+++ b/config/locales/nb.yml
@@ -141,7 +141,8 @@ nb:
unprocessable_entity:
title: "Endringen du ønsket ble avvist (422)"
message_html: "Endringen du ønsket ble avvist. Kanskje du prøvde å endre noe du ikke har tilgang til.
"
- stimulus_reflex_error: "Vi beklager, men noe gikk galt.\n\nDette kan være et midlertidig problem, så prøv igjen eller last inn siden på nytt.\nVi registrerer alle feil og jobber kanskje med å fikse.\nHvis problemet vedvarer eller haster, vennligst kontakt oss."
+ general_error:
+ message: "Vi beklager, men noe gikk galt.\n\nDette kan være et midlertidig problem, så prøv igjen eller last inn siden på nytt.\nVi registrerer alle feil og jobber kanskje med å fikse.\nHvis problemet vedvarer eller haster, vennligst kontakt oss."
stripe:
error_code:
incorrect_number: "Kortnummeret er feil."
@@ -194,6 +195,9 @@ nb:
transaction_not_allowed: "Kortet har blitt avvist av ukjent årsak."
try_again_later: "Kortet har blitt avvist av ukjent årsak."
withdrawal_count_limit_exceeded: "Kunden har overskredet saldoen eller kredittgrensen som er tilgjengelig på kortet sitt."
+ disconnect_failure: "Kunne ikke koble fra Stripe."
+ success_code:
+ disconnected: "Stripe-kontoen er koblet fra."
activemodel:
errors:
messages:
@@ -219,10 +223,16 @@ nb:
not_available_to_shop: "er ikke tilgjengelig for %{shop}"
card_details: "Kortdetaljer"
card_type: "Korttype"
+ card_type_is: "Korttype er"
+ unrecognized_card_type: "Ukjent korttype"
+ use_new_cc: "Bruk et nytt kredittkort"
+ what_is_this: "Hva er dette?"
cardholder_name: "Kortholders navn"
community_forum_url: "URL for diskusjonsforum"
customer_instructions: "Kundeinstruksjoner"
additional_information: "Tilleggsinformasjon"
+ connect_app:
+ url: "https://n8n.openfoodnetwork.org/webhook/regen/connect-enterprise"
devise:
passwords:
spree_user:
@@ -512,8 +522,10 @@ nb:
colums: Kolonner
columns:
name: Navn
+ unit_scale: Enhetsskala
unit: Enhet
unit_value: Enhetsverdi
+ display_as: Vis enhet som
price: Pris
producer: Produsent
category: Kategori
@@ -539,6 +551,7 @@ nb:
edit: Rediger
clone: Klon
delete: Slett
+ remove: Fjern
image:
edit: Rediger
adjustments:
@@ -643,6 +656,7 @@ nb:
status: Status
ok: Ok
instance_secret_key: Instans Secret Key
+ instance_publishable_key: Instans Publiserbar nøkkel
account_id: Konto-ID
business_name: Bedriftsnavn
charges_enabled: Avgifter Aktivert
@@ -695,6 +709,10 @@ nb:
your_content: Ditt innhold
user_guide: Brukermanual
map: Kart
+ dfc_product_imports:
+ index:
+ title: "Importere en DFC-produktkatalog"
+ imported_products: "Importerte produkter:"
enterprise_fees:
index:
title: "Bedriftsavgifter"
@@ -760,6 +778,7 @@ nb:
index:
header:
title: Endre produkter i bulk
+ content:
loading: Laster inn produktene dine
delete_modal:
delete_product_modal:
@@ -810,16 +829,19 @@ nb:
new_variant: Ny variant
bulk_update:
success: Endringer lagret
- edit_image:
- title: Rediger produktbilde
- close: Tilbake
- upload: Last opp bilde
delete_product:
success: Produktet ble slettet
error: Kan ikke slette produktet
delete_variant:
success: Varianten ble slettet
error: Kan ikke slette varianten
+ variant_row:
+ none_tax_category: Ingen
+ search_for_tax_categories: "Søk etter avgiftskategorier"
+ category_field_name: "Kategori"
+ tax_category_field_name: "Avgiftskategori"
+ product_row:
+ producer_field_name: "Produsent"
product_import:
title: Produktimport
file_not_found: Filen ble ikke funnet eller kunne ikke åpnes
@@ -862,7 +884,9 @@ nb:
tax_categories: Avgiftskategorier
shipping_categories: Fraktkategorier
dfc_import_form:
+ title: "Importer fra DFC-katalogen"
enterprise: "Bedrift"
+ catalog_url: "DFC-katalog-URL"
import: "Import"
import:
review: Anmeldelse
@@ -1172,6 +1196,7 @@ nb:
open_date: "Åpningsdato"
close_date: "Stengedato"
display_ordering_in_shopfront: "Vis sortering i butikken:"
+ shopfront_sort_by_product: "Etter produkt"
shopfront_sort_by_category: "Etter kategori"
shopfront_sort_by_producer: "Etter produsent"
shopfront_sort_by_category_placeholder: "Kategori"
@@ -1260,6 +1285,7 @@ nb:
enable: "Tillat datadeling"
disable: "Stopp deling"
loading: "Laster"
+ need_to_be_manager: "Bare ledere kan koble til apper."
note: |
Open Food Network-kontoen din er koblet til Discover Regenerativ.
Legg til eller oppdater informasjon om Discover Regenerativ-oppføringen din her.
@@ -2066,7 +2092,6 @@ nb:
label_account: "Konto"
label_more: "Vis mer"
label_less: "Vis mindre"
- label_notices: "Meldinger"
cart_items: "Elementer"
cart_headline: "Din handlekurv"
total: "Sum"
@@ -2478,6 +2503,7 @@ nb:
orders_bought_already_confirmed: "* allerede bekreftet"
orders_confirm_cancel: "Er du sikker på at du vil avbryte denne bestillingen?"
order_processed_successfully: "Behandlingen av din bestilling var vellykket"
+ thank_you_for_your_order: "Takk for din bestilling"
products_cart_distributor_choice: "Distributør for bestillingen:"
products_cart_distributor_change: "Din distributør for denne ordren vil bli endret til %{name} hvis du legger til dette produktet i handlekurven din."
products_cart_distributor_is: "Din distributør for denne ordren er %{name}."
@@ -3699,6 +3725,7 @@ nb:
editing_tax_category: "Redigering av avgiftskategori"
editing_tax_rate: "Redigering av avgiftssats"
editing_zone: "Redigeringssone"
+ editing_state: "Redigerer regioner"
expiration: "Utløp"
invalid_payment_provider: "Ugyldig betalingsleverandør"
items_cannot_be_shipped: "Varer kan ikke sendes"
@@ -3727,6 +3754,8 @@ nb:
start_date: "Startdato"
successfully_removed: "Fjernet OK"
taxonomy_edit: "Rediger kategori"
+ taxonomy_tree_error: "Det oppsto en feil under oppdatering av kategoritreet."
+ taxonomy_tree_instruction: "Høyreklikk på et element for å legge til, gi nytt navn, fjerne eller redigere."
tree: "Tre"
updating: "Oppdaterer"
your_order_is_empty_add_product: "Bestillingen din er tom, vennligst søk etter og legg til et produkt over"
@@ -3735,6 +3764,7 @@ nb:
resend: "Send på nytt"
back_to_orders_list: "Tilbake til Bestillingsliste"
back_to_payments_list: "Tilbake til betalingsliste"
+ back_to_states_list: "Tilbake til liste over regioner"
return_authorizations: "Returautorisasjoner"
cannot_create_returns: "Kan ikke opprette retur da denne bestillingen ikke har noen sendte elementer."
select_stock: "Velg lager"
@@ -3937,6 +3967,11 @@ nb:
validation:
must_be_int: "må være et heltall"
admin:
+ images:
+ edit:
+ title: Rediger produktbilde
+ close: Tilbake
+ upload: Last opp bilde
mail_methods:
send_testmail: "Send test-epost"
testmail:
@@ -3964,6 +3999,10 @@ nb:
customers: "Kunder"
groups: "Grupper"
oidc_settings: "OIDC-innstillinger"
+ overview: "Oversikt"
+ product_import: "Import"
+ enterprise_roles: "Roller"
+ payment_methods: "Betalingsmetoder"
product_properties:
index:
inherits_properties_checkbox_hint: "Arve egenskaper fra %{supplier}? (med mindre overstyrt over)"
diff --git a/config/locales/nl_BE.yml b/config/locales/nl_BE.yml
index df9de41f92b..a91597ee5e1 100644
--- a/config/locales/nl_BE.yml
+++ b/config/locales/nl_BE.yml
@@ -341,6 +341,7 @@ nl_BE:
edit: bewerking
clone: Kloon
delete: 'Uitwissen '
+ remove: Verwijderen
image:
edit: bewerking
begins_at: Begint Bij
@@ -549,8 +550,12 @@ nl_BE:
clear_search: Verwijder zoektermen
table:
new_variant: Nieuw variant
- edit_image:
- close: achterstevoren
+ variant_row:
+ none_tax_category: Geen enkele
+ category_field_name: "Categorie"
+ tax_category_field_name: "Belastingcategorie"
+ product_row:
+ producer_field_name: "Producent"
product_import:
title: Importeren van producten
file_not_found: Bestand niet gevonden of kon niet worden geopend
@@ -1415,8 +1420,8 @@ nl_BE:
cart_sidebar:
checkout: "Kassa"
edit_cart: "Winkelwagen aanpassen"
- items_in_cart_singular: "%{num}items in uw winkelkwagentje"
- items_in_cart_plural: "%{num}items in uw winkelkwagentje"
+ items_in_cart_singular: "%{num} items in uw winkelwagentje"
+ items_in_cart_plural: "%{num} items in uw winkelwagentje"
close: "Sluit"
cart_empty: "Uw winkelwagen is leeg"
take_me_shopping: "Neem me shoppen!"
@@ -1556,7 +1561,6 @@ nl_BE:
label_account: "Account"
label_more: "Toon meer"
label_less: "Toon minder"
- label_notices: "Info"
cart_items: "Artikels"
cart_headline: "Je winkelwagentje"
total: "Totaal"
@@ -3176,6 +3180,9 @@ nl_BE:
header:
store: Zicht koper
admin:
+ images:
+ edit:
+ close: achterstevoren
subscriptions:
number: "Nummer"
tab:
@@ -3196,6 +3203,10 @@ nl_BE:
enterprise_relationships: "Toelatingen"
customers: "Klanten"
groups: "Groepen"
+ overview: "Overzicht"
+ product_import: "Importeren"
+ enterprise_roles: "Rollen"
+ payment_methods: "Betalingsmethode"
product_properties:
index:
inherits_properties_checkbox_hint: "De kenmerken van 1%{supplier} krijgen ? (niet ter toepassing in geval van invoer van de vervanging)"
diff --git a/config/locales/pa.yml b/config/locales/pa.yml
index 426a2276551..59aea3be316 100644
--- a/config/locales/pa.yml
+++ b/config/locales/pa.yml
@@ -134,7 +134,8 @@ pa:
unprocessable_entity:
title: "ਜੋ ਬਦਲਾਅ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਸੀ ਉਹ ਰੱਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਸੀ (422)"
message_html: "ਜੋ ਬਦਲਾਅ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਸੀ ਉਹ ਰੱਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਸੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਕਿਸੇ ਅਜਿਹੀ ਚੀਜ਼ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੋਵੇ ਜਿਸ ਤੱਕ ਤੁਹਾਡੀ ਪਹੁੰਚ ਨਹੀਂ ਹੈ।
"
- stimulus_reflex_error: "ਸਾਨੂੰ ਅਫਸੋਸ ਹੈ, ਪਰ ਕੁਝ ਗਲਤ ਹੋਇਆ ਹੈ।\\n\\nਇਹ ਇੱਕ ਅਸਥਾਈ ਸਮੱਸਿਆ ਹੋ ਸਕਦੀ ਹੈ, ਇਸ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਪੰਨੇ ਨੂੰ ਦੋਬਾਰਾ ਲੋਡ ਕਰੋ।\\nਅਸੀਂ ਸਾਰੀਆਂ ਤਰੁੱਟੀਆਂ ਨੂੰ ਰਿਕਾਰਡ ਕਰਦੇ ਹਾਂ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਅਸੀਂ ਉਨਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਤੇ ਕੰਮ ਰਹੇ ਹੋਈਏ।\\nਜੇਕਰ ਸਮੱਸਿਆ ਬਣੀ ਰਹਿੰਦੀ ਹੈ ਜਾਂ ਜ਼ਰੂਰੀ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"
+ general_error:
+ message: "ਸਾਨੂੰ ਅਫਸੋਸ ਹੈ, ਪਰ ਕੁਝ ਗਲਤ ਹੋਇਆ ਹੈ।\\n\\nਇਹ ਇੱਕ ਅਸਥਾਈ ਸਮੱਸਿਆ ਹੋ ਸਕਦੀ ਹੈ, ਇਸ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਪੰਨੇ ਨੂੰ ਦੋਬਾਰਾ ਲੋਡ ਕਰੋ।\\nਅਸੀਂ ਸਾਰੀਆਂ ਤਰੁੱਟੀਆਂ ਨੂੰ ਰਿਕਾਰਡ ਕਰਦੇ ਹਾਂ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਅਸੀਂ ਉਨਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਤੇ ਕੰਮ ਰਹੇ ਹੋਈਏ।\\nਜੇਕਰ ਸਮੱਸਿਆ ਬਣੀ ਰਹਿੰਦੀ ਹੈ ਜਾਂ ਜ਼ਰੂਰੀ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"
stripe:
error_code:
incorrect_number: "ਕਾਰਡ ਨੰਬਰ ਗਲਤ ਹੈ।"
@@ -527,6 +528,7 @@ pa:
edit: ਸੰਪਾਦਿਤ ਕਰੋ
clone: ਕਲੋਨ
delete: ਹਟਾਓ
+ remove: Remove
image:
edit: ਸੰਪਾਦਿਤ ਕਰੋ
adjustments:
@@ -744,6 +746,7 @@ pa:
index:
header:
title: ਥੋਕ ਸੰਪਾਦਿਤ ਉਤਪਾਦ
+ content:
loading: ਤੁਹਾਡੇ ਉਤਪਾਦ ਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ
filters:
search_products: ਉਤਪਾਦਾਂ ਦੀ ਖੋਜ ਕਰੋ
@@ -771,8 +774,12 @@ pa:
new_variant: ਨਵਾਂ ਵੇਰੀਐਂਟ
bulk_update:
success: ਬਦਲਾਵ ਸੇਵ ਕੀਤੇ ਗਏ।'
- edit_image:
- close: ਵਾਪਸ
+ variant_row:
+ none_tax_category: ਕੋਈ ਨਹੀਂ
+ category_field_name: "ਸ਼੍ਰੇਣੀ"
+ tax_category_field_name: "ਟੈਕਸ ਸ਼੍ਰੇਣੀ"
+ product_row:
+ producer_field_name: "ਉਤਪਾਦਕ"
product_import:
title: ਉਤਪਾਦ ਦਾ ਇਮਪੋਰਟ
file_not_found: ਫ਼ਾਈਲ ਨਹੀਂ ਮਿਲੀ ਜਾਂ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ
@@ -1980,7 +1987,6 @@ pa:
label_account: "ਖਾਤਾ"
label_more: "ਹੋਰ ਵਿਖਾਓ"
label_less: "ਘੱਟ ਵਿਖਾਓ"
- label_notices: "ਨੋਟਿਸ"
cart_items: "ਆਈਟਮਾਂ"
cart_headline: "ਤੁਹਾਡਾ ਸ਼ਾਪਿੰਗ ਕਾਰਟ"
total: "ਕੁੱਲ"
@@ -3769,6 +3775,9 @@ pa:
validation:
must_be_int: "ਇੱਕ ਪੂਰਨ ਅੰਕ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ"
admin:
+ images:
+ edit:
+ close: ਵਾਪਸ
mail_methods:
send_testmail: "ਟੈਸਟ ਈਮੇਲ ਭੇਜੋ"
testmail:
@@ -3796,6 +3805,10 @@ pa:
customers: "ਗਾਹਕ"
groups: "ਸਮੂਹ"
oidc_settings: "OIDC ਸੈਟਿੰਗਾਂ"
+ overview: "ਸੰਖੇਪ ਜਾਣਕਾਰੀ"
+ product_import: "ਇਮਪੋਰਟ"
+ enterprise_roles: "ਭੂਮਿਕਾਵਾਂ"
+ payment_methods: "ਭੁਗਤਾਨ ਦੇ ਢੰਗ"
product_properties:
index:
inherits_properties_checkbox_hint: "%{supplier} ਤੋਂ ਪ੍ਰੋਪੇਰਟੀਜ਼ ਅਪਣਾਓ? (ਜਦੋਂ ਤੱਕ ਕਿ ਉਪਰ ਓਵਰਰਾਈਡ ਨਾ ਕੀਤਾ ਗਿਆ ਹੋਵੇ)"
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 8348a751382..21d8f6bc9f5 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -337,6 +337,7 @@ pl:
edit: Edytuj
clone: Kopiuj
delete: Usuń
+ remove: Usuń
image:
edit: Edytuj
begins_at: Początek o
@@ -523,8 +524,12 @@ pl:
producers:
label: Producenci
search: Szukaj
- edit_image:
- close: Wstecz
+ variant_row:
+ none_tax_category: Nic
+ category_field_name: "Kategoria"
+ tax_category_field_name: "Kategoria podatku"
+ product_row:
+ producer_field_name: "Producent"
product_import:
title: Import produktów
file_not_found: Nie znaleziono pliku lub nie można go otworzyć
@@ -1446,7 +1451,6 @@ pl:
label_account: "Konto"
label_more: "Pokaż więcej"
label_less: "Pokaż mniej"
- label_notices: "Powiadomienia"
cart_items: "przedmiotów"
cart_headline: "Twój Koszyk"
total: "Razem"
@@ -3159,6 +3163,9 @@ pl:
header:
store: Sklep
admin:
+ images:
+ edit:
+ close: Wstecz
subscriptions:
number: "Numer zamówienia"
tab:
@@ -3179,6 +3186,8 @@ pl:
enterprise_relationships: "Uprawnienia"
customers: "Klienci"
groups: "Grupy"
+ product_import: "Import"
+ payment_methods: "Metody płatności"
product_properties:
index:
inherits_properties_checkbox_hint: "Odziedziczyć właściwości z %{supplier}? (chyba że zastąpiono powyżej)"
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 00ab7fc455d..31b97e968c7 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -378,6 +378,7 @@ pt:
edit: Editar
clone: Clonar
delete: Apagar
+ remove: Remover
image:
edit: Editar
begins_at: Começa às
@@ -585,8 +586,12 @@ pt:
search: Procurar
table:
new_variant: Nova variante
- edit_image:
- close: Voltar
+ variant_row:
+ none_tax_category: Nenhum
+ category_field_name: "Categoria"
+ tax_category_field_name: "Categoria de Imposto"
+ product_row:
+ producer_field_name: "Produtor/a"
product_import:
title: Importação de Produtos
file_not_found: O ficheiro não foi encontrado ou não pôde ser aberto
@@ -1573,7 +1578,6 @@ pt:
label_account: "Conta"
label_more: "Mostrar mais"
label_less: "Mostrar menos"
- label_notices: "Avisos"
cart_items: "itens"
cart_headline: "O seu carrinho de compras"
total: "Total"
@@ -3168,6 +3172,9 @@ pt:
header:
store: Loja
admin:
+ images:
+ edit:
+ close: Voltar
subscriptions:
number: "Número"
tab:
@@ -3188,6 +3195,10 @@ pt:
enterprise_relationships: "Permissões"
customers: "Consumidores/as"
groups: "Grupos"
+ overview: "Visão geral"
+ product_import: "Importar"
+ enterprise_roles: "Papeis"
+ payment_methods: "Métodos de pagamento"
product_properties:
index:
inherits_properties_checkbox_hint: "Herdar propriedades de %{supplier}? (excepto se já alterado em cima)"
diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml
index 01c66c961e8..7551be99ca2 100644
--- a/config/locales/pt_BR.yml
+++ b/config/locales/pt_BR.yml
@@ -406,6 +406,7 @@ pt_BR:
edit: Editar
clone: Cópia
delete: Deletar
+ remove: Remover
image:
edit: Editar
adjustments:
@@ -626,8 +627,12 @@ pt_BR:
sort:
pagination:
clear_search: Nova busca
- edit_image:
- close: Voltar
+ variant_row:
+ none_tax_category: Nenhum
+ category_field_name: "Categoria"
+ tax_category_field_name: "Categoria de taxa"
+ product_row:
+ producer_field_name: "Produtor"
product_import:
title: Importação de produtos
file_not_found: O arquivo não foi encontrado ou não pôde ser aberto
@@ -1653,7 +1658,6 @@ pt_BR:
label_account: "Conta"
label_more: "Mostrar mais"
label_less: "Mostrar menos"
- label_notices: "Avisos"
cart_items: "itens"
cart_headline: "seu carrinho de compras"
total: "Total"
@@ -3455,6 +3459,9 @@ pt_BR:
validation:
must_be_int: "deve ser um número integral "
admin:
+ images:
+ edit:
+ close: Voltar
mail_methods:
send_testmail: "Enviar email de teste"
testmail:
@@ -3481,6 +3488,10 @@ pt_BR:
enterprise_relationships: "Permissões"
customers: "Compradores"
groups: "Grupos"
+ overview: "Visão geral"
+ product_import: "Importar"
+ enterprise_roles: "Funções"
+ payment_methods: "Métodos de pagamento"
product_properties:
index:
inherits_properties_checkbox_hint: "Herdar propriedades de %{supplier}? (a menos que substituído acima)"
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 76076fc356c..a48c8467219 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -141,7 +141,8 @@ ru:
unprocessable_entity:
title: "Требуемое изменение было отклонено (422)"
message_html: "Требуемое изменение было отклонено. Возможно, вы пытались изменить что-то, к чему у вас нет доступа.
"
- stimulus_reflex_error: "Нам очень жаль, но что-то пошло не так.\n\n Возможно, это временная проблема, поэтому повторите попытку или перезагрузите страницу.\n Мы записываем все ошибки и возможно уже работаем над их исправлением.\n Если проблема не устранена или срочная, пожалуйста, свяжитесь с нами."
+ general_error:
+ message: "Нам очень жаль, но что-то пошло не так.\n\n Возможно, это временная проблема, поэтому повторите попытку или перезагрузите страницу.\n Мы записываем все ошибки и возможно уже работаем над их исправлением.\n Если проблема не устранена или срочная, пожалуйста, свяжитесь с нами."
stripe:
error_code:
incorrect_number: "Номер карты неверный."
@@ -542,6 +543,7 @@ ru:
edit: Изменить
clone: Клонировать
delete: Удалить
+ remove: Удалить
image:
edit: Изменить
adjustments:
@@ -767,6 +769,7 @@ ru:
index:
header:
title: Массовое редактирование товаров
+ content:
loading: Загрузка ваших товаров
delete_modal:
delete_product_modal:
@@ -819,16 +822,18 @@ ru:
new_variant: Новый вариант
bulk_update:
success: Изменения сохранены
- edit_image:
- title: Изменить фотографию товара
- close: Назад
- upload: Загрузить фото
delete_product:
success: Товар успешно удален
error: Невозможно удалить товар
delete_variant:
success: Вариант успешно удален.
error: Невозможно удалить вариант
+ variant_row:
+ none_tax_category: Нет
+ category_field_name: "Категория"
+ tax_category_field_name: "Налоговая Категория"
+ product_row:
+ producer_field_name: "Производитель"
product_import:
title: Импорт Товара
file_not_found: Файл не найден или не может быть открыт
@@ -2073,7 +2078,6 @@ ru:
label_account: "Профиль"
label_more: "Показать больше"
label_less: "Показать меньше"
- label_notices: "Уведомления"
cart_items: "позиции"
cart_headline: "Ваша корзина"
total: "Всего"
@@ -4004,6 +4008,11 @@ ru:
validation:
must_be_int: "должно быть целым числом"
admin:
+ images:
+ edit:
+ title: Изменить фотографию товара
+ close: Назад
+ upload: Загрузить фото
mail_methods:
send_testmail: "Отправить тестовое письмо"
testmail:
@@ -4031,6 +4040,10 @@ ru:
customers: "Клиенты"
groups: "Группы"
oidc_settings: "Настройки OIDC"
+ overview: "Введение"
+ product_import: "Импорт"
+ enterprise_roles: "Роли"
+ payment_methods: "Способы Оплаты"
product_properties:
index:
inherits_properties_checkbox_hint: "Наследовать свойства от %{supplier}? (если не отменено выше)"
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 78f53f39ab9..881e1d637c3 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -176,6 +176,7 @@ sv:
inherits_properties: "Ärva egenskaper?"
actions:
edit: Redigera
+ remove: Ta bort
image:
edit: Redigera
customer: Kund
@@ -325,8 +326,12 @@ sv:
producers:
label: 'Producenter '
search: Sök
- edit_image:
- close: Backa
+ variant_row:
+ none_tax_category: Ingen
+ category_field_name: "Kategori"
+ tax_category_field_name: "Skattekategori"
+ product_row:
+ producer_field_name: "Producent"
product_import:
file_not_found: Filen hittades inte eller kunde inte öppnas
no_data: Ingen data hittades i kalkylbladet
@@ -984,7 +989,6 @@ sv:
label_account: "Konto"
label_more: "Visa mer"
label_less: "Visa mindre"
- label_notices: "Anmälan"
cart_headline: "Din varukorg"
total: "Summa "
cart_updating: "Uppdatera din varukorg"
@@ -2193,6 +2197,9 @@ sv:
messages:
blank: "kan inte vara blank"
admin:
+ images:
+ edit:
+ close: Backa
tab:
dashboard: "Panel"
bulk_order_management: "Hantera flera beställningar"
@@ -2206,6 +2213,9 @@ sv:
enterprises: "Företag"
customers: "Kunder"
groups: "Grupper"
+ overview: "Översikt"
+ enterprise_roles: "Uppgifter"
+ payment_methods: "Betalningssätt"
properties:
index:
properties: "Egenskaper"
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 121265018a8..4d58cb5e1ac 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -386,6 +386,7 @@ tr:
edit: Düzenle
clone: Kopyala
delete: Sil
+ remove: Kaldır
image:
edit: Düzenle
adjustments:
@@ -610,8 +611,12 @@ tr:
clear_search: Aramayı temizle
table:
new_variant: Yeni Çeşit
- edit_image:
- close: Geri
+ variant_row:
+ none_tax_category: SATIŞ YAPMIYOR
+ category_field_name: "Kategori"
+ tax_category_field_name: "Vergi Kategorisi"
+ product_row:
+ producer_field_name: "ÜRETİCİ"
product_import:
title: Ürün Aktarımı
file_not_found: Dosya bulunamadı veya açılamadı
@@ -1663,7 +1668,6 @@ tr:
label_account: "Hesap"
label_more: "Daha fazla göster"
label_less: "Daha az göster"
- label_notices: "Uyarılar"
cart_items: "Ürünler"
cart_headline: "Alışveriş sepetiniz"
total: "Toplam"
@@ -3453,6 +3457,9 @@ tr:
validation:
must_be_int: "tam sayı olmak zorunda"
admin:
+ images:
+ edit:
+ close: Geri
mail_methods:
send_testmail: "Deneme e-postası gönder"
testmail:
@@ -3479,6 +3486,10 @@ tr:
enterprise_relationships: "İZİNLER"
customers: "MÜŞTERİLER"
groups: "AĞLAR"
+ overview: "genel bakış"
+ product_import: "Aktar"
+ enterprise_roles: "Roller"
+ payment_methods: "ÖDEME YÖNTEMLERİ"
product_properties:
index:
inherits_properties_checkbox_hint: "Özellikler %{supplier}'den devralınsın mı? (yukarıda geçersiz kılınmadıkça)"
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 210e77f1345..bb439ae6dec 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -468,6 +468,7 @@ uk:
edit: Редагувати
clone: Клонувати
delete: Видалити
+ remove: Видалити
image:
edit: Редагувати
adjustments:
@@ -695,8 +696,12 @@ uk:
clear_search: Очистити пошук
table:
new_variant: Новий варіант
- edit_image:
- close: Назад
+ variant_row:
+ none_tax_category: Жодного
+ category_field_name: "Категорія"
+ tax_category_field_name: "Категорія податку"
+ product_row:
+ producer_field_name: "Виробник"
product_import:
title: Імпорт продукту
file_not_found: Файл не знайдено або не вдалося відкрити
@@ -1816,7 +1821,6 @@ uk:
label_account: "Обліковий запис"
label_more: "Показати більше"
label_less: "Показувати менше"
- label_notices: "Повідомлення"
cart_items: "Товари"
cart_headline: "Ваш кошик для покупок"
total: "Всього"
@@ -3679,6 +3683,9 @@ uk:
validation:
must_be_int: "має бути цілим числом"
admin:
+ images:
+ edit:
+ close: Назад
mail_methods:
send_testmail: "Надіслати тестовий електронний лист"
testmail:
@@ -3705,6 +3712,10 @@ uk:
enterprise_relationships: "Дозволи"
customers: "Клієнти"
groups: "Групи"
+ overview: "Огляд"
+ product_import: "Імпорт"
+ enterprise_roles: "Ролі"
+ payment_methods: "Методи оплати"
product_properties:
index:
inherits_properties_checkbox_hint: "Успадкувати властивості від %{supplier}? (якщо не перевизначено вище)"
diff --git a/config/routes.rb b/config/routes.rb
index ba182c96076..7537dd46155 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -11,9 +11,6 @@
get "/login", to: redirect("/#/login")
get '/unauthorized', :to => 'home#unauthorized', :as => :unauthorized
- get "/discourse/login", to: "discourse_sso#login"
- get "/discourse/sso", to: "discourse_sso#sso"
-
get "/map", to: "map#index", as: :map
get "/sell", to: "home#sell", as: :sell
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 1a7ca8c3ccf..4016f8a695b 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -35,6 +35,8 @@
patch :register
end
+ resources :connected_apps, only: [:create, :destroy]
+
resources :producer_properties do
post :update_positions, on: :collection
end
@@ -73,6 +75,9 @@
# This might be easier to arrange once we rename the controller to plain old "products"
post '/products/bulk_update', to: 'products_v3#bulk_update'
get '/products', to: 'products_v3#index'
+ # we already have DELETE admin/products/:id here
+ delete 'products_v3/:id', to: 'products_v3#destroy', as: 'product_destroy'
+ delete 'products_v3/destroy_variant/:id', to: 'products_v3#destroy_variant', as: 'destroy_variant'
end
resources :variant_overrides do
@@ -90,7 +95,7 @@
resource :contents
- resources :column_preferences, only: [], format: :json do
+ resources :column_preferences, only: [] do
put :bulk_update, on: :collection
end
diff --git a/db/migrate/20240222192158_change_flipper_gates_value_to_text.rb b/db/migrate/20240222192158_change_flipper_gates_value_to_text.rb
new file mode 100644
index 00000000000..67fabe7d4ef
--- /dev/null
+++ b/db/migrate/20240222192158_change_flipper_gates_value_to_text.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class ChangeFlipperGatesValueToText < ActiveRecord::Migration[7.0]
+ def up
+ # Ensure this incremental update migration is idempotent
+ return unless connection.column_exists? :flipper_gates, :value, :string
+
+ if index_exists? :flipper_gates, [:feature_key, :key, :value]
+ remove_index :flipper_gates, [:feature_key, :key, :value]
+ end
+ change_column :flipper_gates, :value, :text
+ add_index :flipper_gates, [:feature_key, :key, :value], unique: true, length: { value: 255 }
+ end
+
+ def down
+ change_column :flipper_gates, :value, :string
+ end
+end
diff --git a/db/migrate/20240422140057_require_order_cycle_and_sender_and_receiver_on_exchange.rb b/db/migrate/20240422140057_require_order_cycle_and_sender_and_receiver_on_exchange.rb
new file mode 100644
index 00000000000..b159516a3a8
--- /dev/null
+++ b/db/migrate/20240422140057_require_order_cycle_and_sender_and_receiver_on_exchange.rb
@@ -0,0 +1,7 @@
+class RequireOrderCycleAndSenderAndReceiverOnExchange < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :exchanges, :order_cycle_id, false
+ change_column_null :exchanges, :sender_id, false
+ change_column_null :exchanges, :receiver_id, false
+ end
+end
diff --git a/db/migrate/20240422145353_require_name_and_coordinator_on_order_cycle.rb b/db/migrate/20240422145353_require_name_and_coordinator_on_order_cycle.rb
new file mode 100644
index 00000000000..a58db5462d3
--- /dev/null
+++ b/db/migrate/20240422145353_require_name_and_coordinator_on_order_cycle.rb
@@ -0,0 +1,6 @@
+class RequireNameAndCoordinatorOnOrderCycle < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :order_cycles, :name, false
+ change_column_null :order_cycles, :coordinator_id, false
+ end
+end
diff --git a/db/migrate/20240422150502_require_address1_and_city_and_phone_and_country_and_on_address.rb b/db/migrate/20240422150502_require_address1_and_city_and_phone_and_country_and_on_address.rb
new file mode 100644
index 00000000000..f200225349e
--- /dev/null
+++ b/db/migrate/20240422150502_require_address1_and_city_and_phone_and_country_and_on_address.rb
@@ -0,0 +1,8 @@
+class RequireAddress1AndCityAndPhoneAndCountryAndOnAddress < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_addresses, :address1, false
+ change_column_null :spree_addresses, :city, false
+ change_column_null :spree_addresses, :phone, false
+ change_column_null :spree_addresses, :country_id, false
+ end
+end
diff --git a/db/migrate/20240424075646_require_property_on_product_property.rb b/db/migrate/20240424075646_require_property_on_product_property.rb
new file mode 100644
index 00000000000..d8f8502e127
--- /dev/null
+++ b/db/migrate/20240424075646_require_property_on_product_property.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RequirePropertyOnProductProperty < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_product_properties, :property_id, false
+ end
+end
diff --git a/db/migrate/20240424113354_require_order_on_return_authorization.rb b/db/migrate/20240424113354_require_order_on_return_authorization.rb
new file mode 100644
index 00000000000..13aaea40aac
--- /dev/null
+++ b/db/migrate/20240424113354_require_order_on_return_authorization.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RequireOrderOnReturnAuthorization < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_return_authorizations, :order_id, false
+ end
+end
diff --git a/db/migrate/20240424121221_require_country_on_state.rb b/db/migrate/20240424121221_require_country_on_state.rb
new file mode 100644
index 00000000000..b2862c4898e
--- /dev/null
+++ b/db/migrate/20240424121221_require_country_on_state.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RequireCountryOnState < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_states, :country_id, false
+ end
+end
diff --git a/db/migrate/20240430075133_require_product_on_product_property.rb b/db/migrate/20240430075133_require_product_on_product_property.rb
new file mode 100644
index 00000000000..4dd309ce0ac
--- /dev/null
+++ b/db/migrate/20240430075133_require_product_on_product_property.rb
@@ -0,0 +1,5 @@
+class RequireProductOnProductProperty < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_product_properties, :product_id, false
+ end
+end
diff --git a/db/migrate/20240501072547_require_variant_and_stock_location_on_stock_item.rb b/db/migrate/20240501072547_require_variant_and_stock_location_on_stock_item.rb
new file mode 100644
index 00000000000..c68cd74d0db
--- /dev/null
+++ b/db/migrate/20240501072547_require_variant_and_stock_location_on_stock_item.rb
@@ -0,0 +1,6 @@
+class RequireVariantAndStockLocationOnStockItem < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_stock_items, :stock_location_id, false
+ change_column_null :spree_stock_items, :variant_id, false
+ end
+end
diff --git a/db/migrate/20240501075735_require_stock_item_and_quantity_on_stock_movement.rb b/db/migrate/20240501075735_require_stock_item_and_quantity_on_stock_movement.rb
new file mode 100644
index 00000000000..52d21d7f6da
--- /dev/null
+++ b/db/migrate/20240501075735_require_stock_item_and_quantity_on_stock_movement.rb
@@ -0,0 +1,6 @@
+class RequireStockItemAndQuantityOnStockMovement < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_stock_movements, :stock_item_id, false
+ change_column_null :spree_stock_movements, :quantity, false
+ end
+end
diff --git a/db/migrate/20240502035220_update_n8n_url.rb b/db/migrate/20240502035220_update_n8n_url.rb
new file mode 100644
index 00000000000..df2aaf16e7b
--- /dev/null
+++ b/db/migrate/20240502035220_update_n8n_url.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+# We got a new n8n server.
+# But we still have some database rows with a URL to the old server.
+class UpdateN8nUrl < ActiveRecord::Migration[7.0]
+ def up
+ execute <<~SQL.squish
+ UPDATE connected_apps
+ SET data = replace(
+ data::text,
+ 'n8n.openfoodnetwork.org.uk',
+ 'n8n.openfoodnetwork.org'
+ )::jsonb
+ WHERE data IS NOT NULL;
+ SQL
+ end
+end
diff --git a/db/migrate/20240510040639_remove_distributor_info_from_enterprises.rb b/db/migrate/20240510040639_remove_distributor_info_from_enterprises.rb
new file mode 100644
index 00000000000..3ead73c8a76
--- /dev/null
+++ b/db/migrate/20240510040639_remove_distributor_info_from_enterprises.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveDistributorInfoFromEnterprises < ActiveRecord::Migration[7.0]
+ def change
+ remove_column :enterprises, :distributor_info, :text
+ end
+end
diff --git a/db/migrate/20240510041114_remove_pickup_times_from_enterprises.rb b/db/migrate/20240510041114_remove_pickup_times_from_enterprises.rb
new file mode 100644
index 00000000000..bfe62525a6e
--- /dev/null
+++ b/db/migrate/20240510041114_remove_pickup_times_from_enterprises.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemovePickupTimesFromEnterprises < ActiveRecord::Migration[7.0]
+ def change
+ remove_column :enterprises, :pickup_times, :text
+ end
+end
diff --git a/db/migrate/20240510041829_remove_next_collection_at_from_enterprises.rb b/db/migrate/20240510041829_remove_next_collection_at_from_enterprises.rb
new file mode 100644
index 00000000000..bce671833f3
--- /dev/null
+++ b/db/migrate/20240510041829_remove_next_collection_at_from_enterprises.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveNextCollectionAtFromEnterprises < ActiveRecord::Migration[7.0]
+ def change
+ remove_column :enterprises, :next_collection_at, :string
+ end
+end
diff --git a/db/migrate/20240517121235_require_tax_category_on_tax_rate.rb b/db/migrate/20240517121235_require_tax_category_on_tax_rate.rb
new file mode 100644
index 00000000000..4bc80ca713a
--- /dev/null
+++ b/db/migrate/20240517121235_require_tax_category_on_tax_rate.rb
@@ -0,0 +1,5 @@
+class RequireTaxCategoryOnTaxRate < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_tax_rates, :tax_category_id, false
+ end
+end
diff --git a/db/migrate/20240529081209_require_order_and_variant_on_line_item.rb b/db/migrate/20240529081209_require_order_and_variant_on_line_item.rb
new file mode 100644
index 00000000000..8d2920147ae
--- /dev/null
+++ b/db/migrate/20240529081209_require_order_and_variant_on_line_item.rb
@@ -0,0 +1,6 @@
+class RequireOrderAndVariantOnLineItem < ActiveRecord::Migration[7.0]
+ def change
+ change_column_null :spree_line_items, :order_id, false
+ change_column_null :spree_line_items, :variant_id, false
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 51491dce7fe..70feb4b8e7e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.0].define(version: 2024_02_13_044159) do
+ActiveRecord::Schema[7.0].define(version: 2024_05_29_081209) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_stat_statements"
enable_extension "plpgsql"
@@ -204,11 +204,8 @@
t.string "abn", limit: 255
t.string "acn", limit: 255
t.integer "address_id"
- t.text "pickup_times"
- t.string "next_collection_at", limit: 255
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
- t.text "distributor_info"
t.string "facebook", limit: 255
t.string "instagram", limit: 255
t.string "linkedin", limit: 255
@@ -258,9 +255,9 @@
end
create_table "exchanges", id: :serial, force: :cascade do |t|
- t.integer "order_cycle_id"
- t.integer "sender_id"
- t.integer "receiver_id"
+ t.integer "order_cycle_id", null: false
+ t.integer "sender_id", null: false
+ t.integer "receiver_id", null: false
t.text "pickup_time"
t.text "pickup_instructions"
t.datetime "created_at", precision: nil, null: false
@@ -282,7 +279,7 @@
create_table "flipper_gates", id: :serial, force: :cascade do |t|
t.string "feature_key", null: false
t.string "key", null: false
- t.string "value"
+ t.text "value"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true
@@ -330,10 +327,10 @@
end
create_table "order_cycles", id: :serial, force: :cascade do |t|
- t.string "name", limit: 255
+ t.string "name", limit: 255, null: false
t.datetime "orders_open_at", precision: nil
t.datetime "orders_close_at", precision: nil
- t.integer "coordinator_id"
+ t.integer "coordinator_id", null: false
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.datetime "processed_at", precision: nil
@@ -420,15 +417,15 @@
create_table "spree_addresses", id: :serial, force: :cascade do |t|
t.string "firstname", limit: 255
t.string "lastname", limit: 255
- t.string "address1", limit: 255
+ t.string "address1", limit: 255, null: false
t.string "address2", limit: 255
- t.string "city", limit: 255
+ t.string "city", limit: 255, null: false
t.string "zipcode", limit: 255
- t.string "phone", limit: 255
+ t.string "phone", limit: 255, null: false
t.string "state_name", limit: 255
t.string "alternative_phone", limit: 255
t.integer "state_id"
- t.integer "country_id"
+ t.integer "country_id", null: false
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.string "company", limit: 255
@@ -544,8 +541,8 @@
end
create_table "spree_line_items", id: :serial, force: :cascade do |t|
- t.integer "order_id"
- t.integer "variant_id"
+ t.integer "order_id", null: false
+ t.integer "variant_id", null: false
t.integer "quantity", null: false
t.decimal "price", precision: 10, scale: 2, null: false
t.datetime "created_at", precision: nil, null: false
@@ -674,8 +671,8 @@
create_table "spree_product_properties", id: :serial, force: :cascade do |t|
t.string "value", limit: 255
- t.integer "product_id"
- t.integer "property_id"
+ t.integer "product_id", null: false
+ t.integer "property_id", null: false
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.integer "position", default: 0
@@ -718,7 +715,7 @@
t.string "number", limit: 255
t.string "state", limit: 255
t.decimal "amount", precision: 10, scale: 2, default: "0.0", null: false
- t.integer "order_id"
+ t.integer "order_id", null: false
t.text "reason"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
@@ -814,12 +811,12 @@
create_table "spree_states", id: :serial, force: :cascade do |t|
t.string "name", limit: 255
t.string "abbr", limit: 255
- t.integer "country_id"
+ t.integer "country_id", null: false
end
create_table "spree_stock_items", id: :serial, force: :cascade do |t|
- t.integer "stock_location_id"
- t.integer "variant_id"
+ t.integer "stock_location_id", null: false
+ t.integer "variant_id", null: false
t.integer "count_on_hand", default: 0, null: false
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
@@ -849,8 +846,8 @@
end
create_table "spree_stock_movements", id: :serial, force: :cascade do |t|
- t.integer "stock_item_id"
- t.integer "quantity", default: 0
+ t.integer "stock_item_id", null: false
+ t.integer "quantity", default: 0, null: false
t.string "action", limit: 255
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
@@ -871,7 +868,7 @@
create_table "spree_tax_rates", id: :serial, force: :cascade do |t|
t.decimal "amount", precision: 8, scale: 5
t.integer "zone_id"
- t.integer "tax_category_id"
+ t.integer "tax_category_id", null: false
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.boolean "included_in_price", default: false
diff --git a/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb b/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb
index 823ed5d6b15..c6d43be45f3 100644
--- a/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb
+++ b/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb
@@ -4,7 +4,7 @@
module Catalog
module ProductImport
- describe ProductsResetStrategy do
+ RSpec.describe ProductsResetStrategy do
let(:products_reset) { described_class.new(excluded_items_ids) }
describe '#reset' do
diff --git a/engines/dfc_provider/app/services/dfc_request.rb b/engines/dfc_provider/app/services/dfc_request.rb
index 8de0108d99f..949ec23bad7 100644
--- a/engines/dfc_provider/app/services/dfc_request.rb
+++ b/engines/dfc_provider/app/services/dfc_request.rb
@@ -13,33 +13,41 @@ def initialize(user)
@user = user
end
- def get(url)
- response = request(url)
+ def call(url, data = nil)
+ response = request(url, data)
- return response.body if response.status == 200
-
- return "" if @user.oidc_account.updated_at > 15.minutes.ago
-
- refresh_access_token!
+ if response.status >= 400 && token_stale?
+ refresh_access_token!
+ response = request(url, data)
+ end
- response = request(url)
response.body
end
private
- def request(url)
- connection = Faraday.new(
+ def request(url, data = nil)
+ only_public_connections do
+ if data
+ connection.post(url, data)
+ else
+ connection.get(url)
+ end
+ end
+ end
+
+ def token_stale?
+ @user.oidc_account.updated_at < 15.minutes.ago
+ end
+
+ def connection
+ Faraday.new(
request: { timeout: 30 },
headers: {
'Content-Type' => 'application/json',
'Authorization' => "Bearer #{@user.oidc_account.token}",
}
)
-
- only_public_connections do
- connection.get(url)
- end
end
def only_public_connections(&)
diff --git a/engines/dfc_provider/app/services/enterprise_builder.rb b/engines/dfc_provider/app/services/enterprise_builder.rb
index b2087c2601d..f29f79fca91 100644
--- a/engines/dfc_provider/app/services/enterprise_builder.rb
+++ b/engines/dfc_provider/app/services/enterprise_builder.rb
@@ -21,7 +21,9 @@ def self.enterprise(enterprise) # rubocop:disable Metrics/AbcSize
localizations: [address],
phoneNumbers: [enterprise.phone].compact,
socialMedias: SocialMediaBuilder.social_medias(enterprise),
- websites: [enterprise.website].compact,
+
+ # The model strips the protocol and we need to add it:
+ websites: [enterprise.website].compact_blank.map { |url| "https://#{url}" },
).tap do |e|
add_ofn_property(e, "ofn:long_description", enterprise.long_description)
diff --git a/engines/dfc_provider/app/services/fdc_request.rb b/engines/dfc_provider/app/services/fdc_request.rb
new file mode 100644
index 00000000000..5252cff85af
--- /dev/null
+++ b/engines/dfc_provider/app/services/fdc_request.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require "private_address_check"
+require "private_address_check/tcpsocket_ext"
+
+# Request a JSON document from the FDC API with authentication.
+#
+# Currently, the API doesn't quite comply with the DFC standard and we need
+# to authenticate a little bit differently.
+#
+# And then we get slightly different data as well.
+class FdcRequest < DfcRequest
+ # Override main method to POST authorization data.
+ def call(url, data = {})
+ response = request(url, auth_data.merge(data).to_json)
+
+ if response.status >= 400 && token_stale?
+ refresh_access_token!
+ response = request(url, auth_data.merge(data).to_json)
+ end
+
+ response.body
+ end
+
+ private
+
+ def auth_data
+ {
+ userId: @user.oidc_account.uid,
+ accessToken: @user.oidc_account.token,
+ }
+ end
+end
diff --git a/engines/dfc_provider/app/services/quantitative_value_builder.rb b/engines/dfc_provider/app/services/quantitative_value_builder.rb
index 37794631153..6baac1eecf9 100644
--- a/engines/dfc_provider/app/services/quantitative_value_builder.rb
+++ b/engines/dfc_provider/app/services/quantitative_value_builder.rb
@@ -33,7 +33,7 @@ def self.apply(quantity, product)
product.variant_unit = measure
product.variant_unit_name = unit_name if measure == "items"
product.variant_unit_scale = unit_scale
- product.unit_value = quantity.value * unit_scale
+ product.unit_value = quantity.value.to_f * unit_scale
end
# Map DFC units to OFN fields:
diff --git a/engines/dfc_provider/spec/requests/addresses_spec.rb b/engines/dfc_provider/spec/requests/addresses_spec.rb
index 21032e5df9f..9e8693b03c3 100644
--- a/engines/dfc_provider/spec/requests/addresses_spec.rb
+++ b/engines/dfc_provider/spec/requests/addresses_spec.rb
@@ -2,7 +2,7 @@
require_relative "../swagger_helper"
-describe "Addresses", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
+RSpec.describe "Addresses", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
let(:user) { create(:oidc_user) }
let(:address) { create(:address, id: 40_000) }
let(:result) { json_response }
diff --git a/engines/dfc_provider/spec/requests/catalog_items_spec.rb b/engines/dfc_provider/spec/requests/catalog_items_spec.rb
index f047812e005..1405a5b0a5b 100644
--- a/engines/dfc_provider/spec/requests/catalog_items_spec.rb
+++ b/engines/dfc_provider/spec/requests/catalog_items_spec.rb
@@ -2,8 +2,8 @@
require_relative "../swagger_helper"
-describe "CatalogItems", type: :request, swagger_doc: "dfc.yaml",
- rswag_autodoc: true do
+RSpec.describe "CatalogItems", type: :request, swagger_doc: "dfc.yaml",
+ rswag_autodoc: true do
let(:user) { create(:oidc_user, id: 12_345) }
let(:enterprise) {
create(
diff --git a/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb b/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb
index 4230fe2b29d..fdee727fa81 100644
--- a/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb
+++ b/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb
@@ -2,8 +2,8 @@
require_relative "../../swagger_helper"
-describe "EnterpriseGroups::AffiliatedBy", type: :request, swagger_doc: "dfc.yaml",
- rswag_autodoc: true do
+RSpec.describe "EnterpriseGroups::AffiliatedBy", type: :request, swagger_doc: "dfc.yaml",
+ rswag_autodoc: true do
let(:user) { create(:oidc_user, id: 12_345) }
let(:group) {
create(
diff --git a/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb b/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb
index 80f734d92e7..8b3f1618935 100644
--- a/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb
+++ b/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb
@@ -2,7 +2,7 @@
require_relative "../swagger_helper"
-describe "EnterpriseGroups", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
+RSpec.describe "EnterpriseGroups", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
let(:user) { create(:oidc_user, id: 12_345) }
let(:group) {
create(
diff --git a/engines/dfc_provider/spec/requests/enterprises_spec.rb b/engines/dfc_provider/spec/requests/enterprises_spec.rb
index 587971a2ec2..9785361aa67 100644
--- a/engines/dfc_provider/spec/requests/enterprises_spec.rb
+++ b/engines/dfc_provider/spec/requests/enterprises_spec.rb
@@ -2,7 +2,7 @@
require_relative "../swagger_helper"
-describe "Enterprises", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
+RSpec.describe "Enterprises", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
let!(:user) { create(:oidc_user) }
let!(:enterprise) do
create(
@@ -71,6 +71,7 @@
expect(json_response["@graph"][0]).to include(
"dfc-b:affiliates" => "http://test.host/api/dfc/enterprise_groups/60000",
+ "dfc-b:websitePage" => "https://openfoodnetwork.org",
)
# Insert static value to keep documentation deterministic:
diff --git a/engines/dfc_provider/spec/requests/offers_spec.rb b/engines/dfc_provider/spec/requests/offers_spec.rb
index 826df7be766..f309613c0c2 100644
--- a/engines/dfc_provider/spec/requests/offers_spec.rb
+++ b/engines/dfc_provider/spec/requests/offers_spec.rb
@@ -2,7 +2,7 @@
require_relative "../swagger_helper"
-describe "Offers", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
+RSpec.describe "Offers", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
let!(:user) { create(:oidc_user) }
let!(:enterprise) { create(:distributor_enterprise, id: 10_000, owner: user) }
let!(:product) {
diff --git a/engines/dfc_provider/spec/requests/persons_spec.rb b/engines/dfc_provider/spec/requests/persons_spec.rb
index 3af17b76e9d..a7ef52c0c49 100644
--- a/engines/dfc_provider/spec/requests/persons_spec.rb
+++ b/engines/dfc_provider/spec/requests/persons_spec.rb
@@ -2,7 +2,7 @@
require_relative "../swagger_helper"
-describe "Persons", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
+RSpec.describe "Persons", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
let(:user) { create(:oidc_user, id: 10_000) }
let(:other_user) { create(:oidc_user) }
diff --git a/engines/dfc_provider/spec/requests/social_medias_spec.rb b/engines/dfc_provider/spec/requests/social_medias_spec.rb
index 4211e5f4557..71e7bfdbee9 100644
--- a/engines/dfc_provider/spec/requests/social_medias_spec.rb
+++ b/engines/dfc_provider/spec/requests/social_medias_spec.rb
@@ -2,7 +2,7 @@
require_relative "../swagger_helper"
-describe "SocialMedias", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
+RSpec.describe "SocialMedias", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
let(:user) { create(:oidc_user) }
let(:enterprise) do
create(
diff --git a/engines/dfc_provider/spec/requests/supplied_products_spec.rb b/engines/dfc_provider/spec/requests/supplied_products_spec.rb
index d57d45c0f02..e72e13017f0 100644
--- a/engines/dfc_provider/spec/requests/supplied_products_spec.rb
+++ b/engines/dfc_provider/spec/requests/supplied_products_spec.rb
@@ -2,7 +2,7 @@
require_relative "../swagger_helper"
-describe "SuppliedProducts", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
+RSpec.describe "SuppliedProducts", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do
let!(:user) { create(:oidc_user) }
let!(:enterprise) { create(:distributor_enterprise, id: 10_000, owner: user) }
let!(:product) {
diff --git a/engines/dfc_provider/spec/services/address_builder_spec.rb b/engines/dfc_provider/spec/services/address_builder_spec.rb
index 134e08e998c..89020de3e78 100644
--- a/engines/dfc_provider/spec/services/address_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/address_builder_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe AddressBuilder do
+RSpec.describe AddressBuilder do
subject(:result) { described_class.address(address) }
let(:address) {
build(
diff --git a/engines/dfc_provider/spec/services/authorization_control_spec.rb b/engines/dfc_provider/spec/services/authorization_control_spec.rb
index 97cd646df3d..f5695f0cd6b 100644
--- a/engines/dfc_provider/spec/services/authorization_control_spec.rb
+++ b/engines/dfc_provider/spec/services/authorization_control_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe AuthorizationControl do
+RSpec.describe AuthorizationControl do
include AuthorizationHelper
let(:user) { create(:oidc_user) }
diff --git a/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb b/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb
index ed80ac34a17..7c1b4d2c0f2 100644
--- a/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe DfcBuilder do
+RSpec.describe DfcBuilder do
let(:variant) { build(:variant) }
describe ".catalog_item" do
diff --git a/engines/dfc_provider/spec/services/dfc_io_spec.rb b/engines/dfc_provider/spec/services/dfc_io_spec.rb
index e95801853ca..58194ce2041 100644
--- a/engines/dfc_provider/spec/services/dfc_io_spec.rb
+++ b/engines/dfc_provider/spec/services/dfc_io_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe DfcIo do
+RSpec.describe DfcIo do
let(:person) do
DataFoodConsortium::Connector::Person.new("Pete")
end
diff --git a/engines/dfc_provider/spec/services/dfc_loader_spec.rb b/engines/dfc_provider/spec/services/dfc_loader_spec.rb
index c36f05f75f8..93ae98de9df 100644
--- a/engines/dfc_provider/spec/services/dfc_loader_spec.rb
+++ b/engines/dfc_provider/spec/services/dfc_loader_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe DfcLoader do
+RSpec.describe DfcLoader do
it "prepares the DFC Connector to provide DFC object classes for export" do
tomato = DataFoodConsortium::Connector::SuppliedProduct.new(
"https://openfoodnetwork.org/tomato",
diff --git a/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb b/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb
index be4fa4342b5..191046c2940 100644
--- a/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb
+++ b/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe DfcProductTypeFactory do
+RSpec.describe DfcProductTypeFactory do
describe ".for" do
let(:dfc_id) {
"https://github.com/datafoodconsortium/taxonomies/releases/latest/download/productTypes.rdf#drink"
diff --git a/engines/dfc_provider/spec/services/dfc_request_spec.rb b/engines/dfc_provider/spec/services/dfc_request_spec.rb
index a4f0421fadc..ea17ae02afb 100644
--- a/engines/dfc_provider/spec/services/dfc_request_spec.rb
+++ b/engines/dfc_provider/spec/services/dfc_request_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe DfcRequest do
+RSpec.describe DfcRequest do
subject(:api) { DfcRequest.new(user) }
let(:user) { build(:oidc_user) }
@@ -12,7 +12,16 @@
stub_request(:get, "http://example.net/api").
to_return(status: 200, body: '{"@context":"/"}')
- expect(api.get("http://example.net/api")).to eq '{"@context":"/"}'
+ expect(api.call("http://example.net/api")).to eq '{"@context":"/"}'
+ end
+
+ it "posts a DFC document" do
+ json = '{"name":"new season apples"}'
+ stub_request(:post, "http://example.net/api").
+ with(body: json).
+ to_return(status: 201) # Created
+
+ expect(api.call("http://example.net/api", json)).to eq ""
end
it "refreshes the access token on fail", vcr: true do
@@ -30,7 +39,7 @@
account.updated_at = 1.day.ago
expect {
- api.get("http://example.net/api")
+ api.call("http://example.net/api")
}.to change {
account.token
}.and change {
@@ -44,7 +53,7 @@
user.oidc_account.updated_at = 1.minute.ago
- expect(api.get("http://example.net/api")).to eq ""
+ expect(api.call("http://example.net/api")).to eq ""
# Trying to reach the OIDC server via network request to refresh the token
# would raise errors because we didn't setup Webmock or VCR.
diff --git a/engines/dfc_provider/spec/services/enterprise_builder_spec.rb b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb
index 8e24ed4fd1d..cc26fe767bc 100644
--- a/engines/dfc_provider/spec/services/enterprise_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe EnterpriseBuilder do
+RSpec.describe EnterpriseBuilder do
subject(:builder) { described_class }
let(:enterprise) {
build(
diff --git a/engines/dfc_provider/spec/services/fdc_request_spec.rb b/engines/dfc_provider/spec/services/fdc_request_spec.rb
new file mode 100644
index 00000000000..c1f59d40f8d
--- /dev/null
+++ b/engines/dfc_provider/spec/services/fdc_request_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require_relative "../spec_helper"
+
+RSpec.describe FdcRequest do
+ subject(:api) { FdcRequest.new(user) }
+
+ let(:user) { build(:oidc_user) }
+ let(:account) { user.oidc_account }
+ let(:url) {
+ "https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com"
+ }
+
+ it "refreshes the access token and retrieves a catalog", vcr: true do
+ # A refresh is only attempted if the token is stale.
+ account.uid = "testdfc@protonmail.com"
+ account.refresh_token = ENV.fetch("OPENID_REFRESH_TOKEN")
+ account.updated_at = 1.day.ago
+
+ response = nil
+ expect {
+ response = api.call(url)
+ }.to change {
+ account.token
+ }.and change {
+ account.refresh_token
+ }
+
+ json = JSON.parse(response)
+ expect(json["message"]).to eq "Products retrieved successfully"
+
+ graph = DfcIo.import(json["products"])
+ products = graph.select { |s| s.semanticType == "dfc-b:SuppliedProduct" }
+ expect(products).to be_present
+ end
+end
diff --git a/engines/dfc_provider/spec/services/offer_builder_spec.rb b/engines/dfc_provider/spec/services/offer_builder_spec.rb
index 15ef9c4ddaa..0fd9732d474 100644
--- a/engines/dfc_provider/spec/services/offer_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/offer_builder_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe OfferBuilder do
+RSpec.describe OfferBuilder do
let(:variant) { build(:variant) }
describe ".offer" do
diff --git a/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb b/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb
index 39f2a8d8a77..f18a58b5611 100644
--- a/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe QuantitativeValueBuilder do
+RSpec.describe QuantitativeValueBuilder do
subject(:builder) { described_class }
let(:variant) { build(:variant, product:) }
let(:product) { build(:product, name: "Apple") }
@@ -104,6 +104,20 @@
expect(product.unit_value).to eq 0.005
end
+ it "interpretes values given as a string" do
+ quantity = DataFoodConsortium::Connector::QuantitativeValue.new(
+ unit: quantity_unit.KILOGRAM,
+ value: "0.4",
+ )
+
+ builder.apply(quantity, product)
+
+ expect(product.variant_unit).to eq "weight"
+ expect(product.variant_unit_name).to eq nil
+ expect(product.variant_unit_scale).to eq 1_000
+ expect(product.unit_value).to eq 400
+ end
+
it "knows imperial units" do
quantity = DataFoodConsortium::Connector::QuantitativeValue.new(
unit: quantity_unit.POUNDMASS,
diff --git a/engines/dfc_provider/spec/services/social_media_builder_spec.rb b/engines/dfc_provider/spec/services/social_media_builder_spec.rb
index 633ce732d84..85d440d0e05 100644
--- a/engines/dfc_provider/spec/services/social_media_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/social_media_builder_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe SocialMediaBuilder do
+RSpec.describe SocialMediaBuilder do
let(:enterprise) do
create(
:enterprise,
diff --git a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb
index 12bc49f518e..3e582a7aa48 100644
--- a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb
+++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb
@@ -2,7 +2,7 @@
require_relative "../spec_helper"
-describe SuppliedProductBuilder do
+RSpec.describe SuppliedProductBuilder do
include FileHelper
subject(:builder) { described_class }
diff --git a/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb b/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb
index afe866f15bd..338d938a1ad 100644
--- a/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb
+++ b/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Order
- describe StripeScaPaymentAuthorize do
+ RSpec.describe StripeScaPaymentAuthorize do
let(:order) { create(:order) }
let(:payment_authorize) {
OrderManagement::Order::StripeScaPaymentAuthorize.new(order)
diff --git a/engines/order_management/spec/services/order_management/order/updater_spec.rb b/engines/order_management/spec/services/order_management/order/updater_spec.rb
index 6c2542b9e06..4b1eb0689e2 100644
--- a/engines/order_management/spec/services/order_management/order/updater_spec.rb
+++ b/engines/order_management/spec/services/order_management/order/updater_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Order
- describe Updater do
+ RSpec.describe Updater do
let(:order) { create(:order) }
let(:updater) { OrderManagement::Order::Updater.new(order) }
diff --git a/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb b/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb
index ee93585dd65..9acc53675f1 100644
--- a/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Stock
- describe Coordinator do
+ RSpec.describe Coordinator do
let!(:order) do
build_stubbed(
:order_with_line_items,
diff --git a/engines/order_management/spec/services/order_management/stock/estimator_spec.rb b/engines/order_management/spec/services/order_management/stock/estimator_spec.rb
index 042b4958d23..0c31ebe454e 100644
--- a/engines/order_management/spec/services/order_management/stock/estimator_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/estimator_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Stock
- describe Estimator do
+ RSpec.describe Estimator do
let!(:shipping_method) { create(:shipping_method, zones: [create(:zone)] ) }
let(:package) { build(:stock_package_fulfilled) }
let(:order) { package.order }
diff --git a/engines/order_management/spec/services/order_management/stock/package_spec.rb b/engines/order_management/spec/services/order_management/stock/package_spec.rb
index 64a9fd46d31..22b97eb1ffb 100644
--- a/engines/order_management/spec/services/order_management/stock/package_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/package_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Stock
- describe Package do
+ RSpec.describe Package do
context "base tests" do
let(:variant) { build(:variant, weight: 25.0) }
let(:stock_location) { build(:stock_location) }
diff --git a/engines/order_management/spec/services/order_management/stock/packer_spec.rb b/engines/order_management/spec/services/order_management/stock/packer_spec.rb
index 80666eb3d4d..1b0895bc28c 100644
--- a/engines/order_management/spec/services/order_management/stock/packer_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/packer_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Stock
- describe Packer do
+ RSpec.describe Packer do
let(:distributor) { create(:distributor_enterprise) }
let(:order) { create(:order_with_line_items, line_items_count: 5, distributor:) }
let(:stock_location) { create(:stock_location) }
diff --git a/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb b/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb
index b1783eb7348..c521eaad84b 100644
--- a/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb
+++ b/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Stock
- describe Prioritizer do
+ RSpec.describe Prioritizer do
let(:order) { create(:order_with_line_items, line_items_count: 2) }
let(:stock_location) { build(:stock_location) }
let(:variant1) { order.line_items[0].variant }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb
index 75b4e471116..a8521309323 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe Count do
+ RSpec.describe Count do
let(:oc1) { create(:simple_order_cycle) }
let(:oc2) { create(:simple_order_cycle) }
let(:subscriptions_count) { Count.new(order_cycles) }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb
index 238aa8e3229..5a4c91f71d5 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe Estimator do
+ RSpec.describe Estimator do
describe "estimating prices for subscription line items" do
let!(:subscription) { create(:subscription, with_items: true) }
let!(:sli1) { subscription.subscription_line_items.first }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb
index 56122e12e6a..c915ff0e991 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe Form do
+ RSpec.describe Form do
describe "creating a new subscription" do
let!(:shop) { create(:distributor_enterprise) }
let!(:customer) { create(:customer, enterprise: shop) }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb
index 035021eb49a..297fc841a70 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe PaymentSetup do
+ RSpec.describe PaymentSetup do
let(:order) { create(:order) }
let(:payment_setup) { OrderManagement::Subscriptions::PaymentSetup.new(order) }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb
index fcf06793df0..91dcc2a32a3 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe ProxyOrderSyncer do
+ RSpec.describe ProxyOrderSyncer do
describe "initialization" do
let!(:subscription) { create(:subscription) }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb
index 9c4e97157c9..6db96cf112c 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe StripePaymentSetup do
+ RSpec.describe StripePaymentSetup do
let(:order) { create(:order) }
let(:payment_setup) { OrderManagement::Subscriptions::StripePaymentSetup.new(order) }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb
index 8333eda9062..a442a76f6fd 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe Summarizer do
+ RSpec.describe Summarizer do
let(:order) { create(:order) }
let(:summarizer) { OrderManagement::Subscriptions::Summarizer.new }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb
index 6aeb292bf23..5c877800a52 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe Summary do
+ RSpec.describe Summary do
let(:summary) { OrderManagement::Subscriptions::Summary.new(123) }
describe "#initialize" do
diff --git a/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb
index 55e4d28944b..2d76ac4acee 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe Validator do
+ RSpec.describe Validator do
let(:owner) { create(:user) }
let(:shop) { create(:enterprise, name: "Shop", owner:) }
diff --git a/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb
index dc51f14f8e0..bb95c0dc775 100644
--- a/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb
+++ b/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb
@@ -4,7 +4,7 @@
module OrderManagement
module Subscriptions
- describe VariantsList do
+ RSpec.describe VariantsList do
describe "variant eligibility for subscription" do
let!(:shop) { create(:distributor_enterprise) }
let!(:producer) { create(:supplier_enterprise) }
diff --git a/engines/web/spec/helpers/cookies_policy_helper_spec.rb b/engines/web/spec/helpers/cookies_policy_helper_spec.rb
index 02ff9910a0b..81a779c7ddc 100644
--- a/engines/web/spec/helpers/cookies_policy_helper_spec.rb
+++ b/engines/web/spec/helpers/cookies_policy_helper_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Web
- describe CookiesPolicyHelper, type: :helper do
+ RSpec.describe CookiesPolicyHelper, type: :helper do
# keeps global state unchanged
around do |example|
original_locale = I18n.locale
diff --git a/lib/discourse/single_sign_on.rb b/lib/discourse/single_sign_on.rb
deleted file mode 100644
index 5e2db794617..00000000000
--- a/lib/discourse/single_sign_on.rb
+++ /dev/null
@@ -1,107 +0,0 @@
-# frozen_string_literal: true
-
-# This class is the reference implementation of a SSO provider from Discourse.
-
-module Discourse
- class SingleSignOn
- ACCESSORS = [:nonce, :name, :username, :email, :avatar_url, :avatar_force_update,
- :require_activation, :about_me, :external_id, :return_sso_url, :admin, :moderator,
- :suppress_welcome_message].freeze
- FIXNUMS = [].freeze
- BOOLS = [:avatar_force_update, :admin, :moderator, :require_activation,
- :suppress_welcome_message].freeze
- NONCE_EXPIRY_TIME = 10.minutes
-
- attr_accessor(*ACCESSORS, :sso_secret, :sso_url)
-
- def self.sso_secret
- raise "sso_secret not implemented on class, be sure to set it on instance"
- end
-
- def self.sso_url
- raise "sso_url not implemented on class, be sure to set it on instance"
- end
-
- def self.parse(payload, sso_secret = nil)
- sso = new
- sso.sso_secret = sso_secret if sso_secret
-
- parsed = Rack::Utils.parse_query(payload)
- if sso.sign(parsed["sso"]) != parsed["sig"]
- diags = "\n\nsso: #{parsed['sso']}\n\nsig: #{parsed['sig']}\n\n" \
- "expected sig: #{sso.sign(parsed['sso'])}"
- raise "Bad signature for payload #{diags}" unless parsed["sso"] =~ %r{[^a-zA-Z0-9=\r\n/+]}m
-
- raise "The SSO field should be Base64 encoded, using only A-Z, a-z, 0-9, +, /, " \
- "and = characters. Your input contains characters we don't understand as Base64, " \
- "see http://en.wikipedia.org/wiki/Base64 #{diags}"
-
- end
-
- decoded = Base64.decode64(parsed["sso"])
- decoded_hash = Rack::Utils.parse_query(decoded)
-
- ACCESSORS.each do |k|
- val = decoded_hash[k.to_s]
- val = val.to_i if FIXNUMS.include? k
- if BOOLS.include? k
- val = ["true", "false"].include?(val) ? val == "true" : nil
- end
- sso.public_send("#{k}=", val)
- end
-
- decoded_hash.each do |k, v|
- # 1234567
- # custom.
- #
- if k[0..6] == "custom."
- field = k[7..-1]
- sso.custom_fields[field] = v
- end
- end
-
- sso
- end
-
- def sso_secret
- @sso_secret || self.class.sso_secret
- end
-
- def sso_url
- @sso_url || self.class.sso_url
- end
-
- def custom_fields
- @custom_fields ||= {}
- end
-
- def sign(payload)
- OpenSSL::HMAC.hexdigest("sha256", sso_secret, payload)
- end
-
- def to_url(base_url = nil)
- base = (base_url || sso_url).to_s
- "#{base}#{base.include?('?') ? '&' : '?'}#{payload}"
- end
-
- def payload
- payload = Base64.encode64(unsigned_payload)
- "sso=#{CGI.escape(payload)}&sig=#{sign(payload)}"
- end
-
- def unsigned_payload
- payload = {}
- ACCESSORS.each do |k|
- next if (val = public_send k).nil?
-
- payload[k] = val
- end
-
- @custom_fields&.each do |k, v|
- payload["custom.#{k}"] = v.to_s
- end
-
- Rack::Utils.build_query(payload)
- end
- end
-end
diff --git a/lib/open_food_network/column_preference_defaults.rb b/lib/open_food_network/column_preference_defaults.rb
index 9bb09b20616..f851efc7948 100644
--- a/lib/open_food_network/column_preference_defaults.rb
+++ b/lib/open_food_network/column_preference_defaults.rb
@@ -77,6 +77,24 @@ def products_index_columns
}
end
+ def products_v3_index_columns
+ I18n.with_options scope: 'admin.products_page.columns' do
+ {
+ image: { name: t(:image), visible: true },
+ name: { name: t(:name), visible: true },
+ sku: { name: t(:sku), visible: true },
+ unit: { name: t(:unit), visible: true },
+ unit_scale: { name: t(:unit_scale), visible: true },
+ price: { name: t(:price), visible: true },
+ on_hand: { name: t(:on_hand), visible: true },
+ producer: { name: t(:producer), visible: true },
+ category: { name: t(:category), visible: true },
+ tax_category: { name: t(:tax_category), visible: true },
+ inherits_properties: { name: t(:inherits_properties), visible: true },
+ }
+ end
+ end
+
def enterprises_index_columns
node = "admin.enterprises.index"
{
diff --git a/lib/reporting/queries/query_builder.rb b/lib/reporting/queries/query_builder.rb
index 02e908ab2d2..23697a68248 100644
--- a/lib/reporting/queries/query_builder.rb
+++ b/lib/reporting/queries/query_builder.rb
@@ -15,7 +15,7 @@ def initialize(model, grouping_fields = proc { [] })
end
def selecting(lambda)
- fields = instance_exec(&lambda).map{ |key, value| value.public_send(:as, key.to_s) }
+ fields = instance_exec(&lambda).map{ |key, value| value.as(key.to_s) }
reflect query.project(*fields)
end
diff --git a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb
index 2ea4a4db141..6b099060768 100644
--- a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb
+++ b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb
@@ -7,7 +7,7 @@ class EnterpriseFeesWithTaxReportByOrder < ReportTemplate
attr_accessor :parameters
def initialize(user, params = {}, render: false)
- super(user, params, render:)
+ super
end
def search
diff --git a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb
index 2760112f1ba..a9e487c2e70 100644
--- a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb
+++ b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb
@@ -7,7 +7,7 @@ class EnterpriseFeesWithTaxReportByProducer < ReportTemplate
attr_accessor :permissions
def initialize(user, params = {}, render: false)
- super(user, params, render:)
+ super
@permissions = Permissions.new(user)
end
diff --git a/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb b/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb
index c2fc14159bf..61679e445ed 100644
--- a/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb
+++ b/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb
@@ -7,7 +7,7 @@ class FeeSummary < ReportTemplate
attr_accessor :permissions, :parameters
def initialize(user, params = {}, render: false)
- super(user, params, render:)
+ super
@parameters = Parameters.new(params.fetch(:q, {}))
@parameters.validate!
@permissions = Permissions.new(user)
diff --git a/lib/reporting/reports/enterprise_fee_summary/parameters.rb b/lib/reporting/reports/enterprise_fee_summary/parameters.rb
index 26c0b1dc068..f5a6febb173 100644
--- a/lib/reporting/reports/enterprise_fee_summary/parameters.rb
+++ b/lib/reporting/reports/enterprise_fee_summary/parameters.rb
@@ -28,7 +28,7 @@ def initialize(attributes = {})
self.shipping_method_ids = []
self.payment_method_ids = []
- super(attributes)
+ super
cleanup_arrays
end
diff --git a/lib/reporting/reports/list.rb b/lib/reporting/reports/list.rb
index 0af1ab3f69b..a2dd38efc32 100644
--- a/lib/reporting/reports/list.rb
+++ b/lib/reporting/reports/list.rb
@@ -62,8 +62,7 @@ def enterprise_fee_summary
],
[
i18n_translate('enterprise_fees_with_tax_report_by_producer'),
- :enterprise_fees_with_tax_report_by_producer,
- { deprecated: true }, # Not supported until specific details are finalised.
+ :enterprise_fees_with_tax_report_by_producer
],
]
end
diff --git a/lib/spree/api/controller_setup.rb b/lib/spree/api/controller_setup.rb
index 010ce77b1e3..dcc49e15f9e 100644
--- a/lib/spree/api/controller_setup.rb
+++ b/lib/spree/api/controller_setup.rb
@@ -22,7 +22,7 @@ def self.included(klass)
include CanCan::ControllerAdditions
include Spree::Core::ControllerHelpers::Auth
- prepend_view_path Rails.root + "app/views"
+ prepend_view_path "#{Rails.root}app/views"
append_view_path File.expand_path("../../../app/views", File.dirname(__FILE__))
end
end
diff --git a/lib/spree/authentication_helpers.rb b/lib/spree/authentication_helpers.rb
index f463ebbdb41..d92febf78d4 100644
--- a/lib/spree/authentication_helpers.rb
+++ b/lib/spree/authentication_helpers.rb
@@ -3,9 +3,9 @@
module Spree
module AuthenticationHelpers
def self.included(receiver)
- receiver.public_send :helper_method, :spree_current_user
- receiver.public_send :helper_method, :spree_login_path
- receiver.public_send :helper_method, :spree_logout_path
+ receiver.helper_method :spree_current_user
+ receiver.helper_method :spree_login_path
+ receiver.helper_method :spree_logout_path
end
def spree_current_user
diff --git a/lib/spree/core/environment_extension.rb b/lib/spree/core/environment_extension.rb
index 56d54517eab..78f8bf8c126 100644
--- a/lib/spree/core/environment_extension.rb
+++ b/lib/spree/core/environment_extension.rb
@@ -9,11 +9,11 @@ def add_class(name)
instance_variable_set "@#{name}", Set.new
create_method( :"#{name}=" ) { |val|
- instance_variable_set( "@" + name, val)
+ instance_variable_set( "@#{name}", val)
}
create_method(name.to_sym) do
- instance_variable_get( "@" + name )
+ instance_variable_get( "@#{name}" )
end
end
diff --git a/lib/tasks/data/check_invalid_address_used.rake b/lib/tasks/data/check_invalid_address_used.rake
new file mode 100644
index 00000000000..2d831d265b1
--- /dev/null
+++ b/lib/tasks/data/check_invalid_address_used.rake
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+require 'csv'
+
+namespace :ofn do
+ namespace :data do
+ # Invalid address are define by having: address1, city, phone, or country_id set to null
+ desc 'Check if any invalid address are in use'
+ task check_invalid_address_used: :environment do # rubocop:disable Metrics/BlockLength
+ puts "Checking for invalid address"
+ invalid_addresses = Spree::Address
+ .where("address1 IS NULL OR city IS NULL OR phone IS NULL OR country_id IS NULL")
+ .pluck(:id)
+
+ if invalid_addresses.empty?
+ puts "No invalid address found"
+ next
+ end
+
+ puts "Checking if any of #{invalid_addresses.length} invalid addresses are in use"
+
+ # Customer :
+ # - bill_address
+ # - ship_address
+ customer_used_address = check_bill_ship_address(Customer, invalid_addresses)
+ p "Customers #{customer_used_address}"
+
+ # Subscription :
+ # - bill_address
+ # - ship_address
+ subscriptions_used_address = check_bill_ship_address(Subscription, invalid_addresses)
+ p "Subscriptions #{subscriptions_used_address}"
+
+ # EnterpriseGroup :
+ # - enterprise_group address
+ enterprise_group_used_address = check_address(EnterpriseGroup, invalid_addresses)
+ p "EnterpriseGroup #{enterprise_group_used_address}"
+
+ # User :
+ # - bill_address
+ # - ship_address
+ users_used_address = check_bill_ship_address(Spree::User, invalid_addresses)
+ p "User #{users_used_address}"
+
+ # Order :
+ # - bill_address
+ # - ship_address
+ orders_used_address = check_bill_ship_address(Spree::Order, invalid_addresses)
+ p "Order #{orders_used_address}"
+
+ # Shipment :
+ # - address
+ shipments_used_address = check_address(Spree::Shipment, invalid_addresses)
+ p "Shipments #{shipments_used_address}"
+
+ # Enterprise :
+ # - address
+ # - business_address
+ enterprises = Enterprise
+ .left_joins(:address, :business_address)
+ .where(
+ "address_id IN(?) OR business_address_id IN(?)", invalid_addresses, invalid_addresses
+ )
+ enterprise_used_address = enterprises.map do |e|
+ res = []
+ res << e.address_id if check_correct_address_id(e.address_id, invalid_addresses)
+ res << e.business_address_id if check_correct_address_id(
+ e.business_address_id, invalid_addresses
+ )
+ res
+ end.flatten
+ p "Enterprises #{enterprise_used_address}"
+
+ address_to_be_fixed = customer_used_address.union(
+ subscriptions_used_address, users_used_address, orders_used_address, shipments_used_address,
+ enterprise_used_address
+ )
+ address_to_be_deleted = invalid_addresses - address_to_be_fixed
+
+ puts "\n\n"
+ puts "#{address_to_be_deleted.length} addresses can be deleted:"
+ p address_to_be_deleted
+
+ if address_to_be_deleted.present?
+ puts "\n\n"
+ puts "Run the following code to delete the addresses:"
+ puts "Spree::Address.where(id: #{address_to_be_deleted}).delete_all"
+ end
+
+ puts "\n\n"
+ puts "#{address_to_be_fixed.length} addresses need to be fixed:"
+ p address_to_be_fixed
+ end
+
+ private
+
+ def check_bill_ship_address(klass, addresses)
+ objects = klass
+ .left_joins(:bill_address, :ship_address)
+ .where("bill_address_id in(?) OR ship_address_id in(?)", addresses, addresses)
+
+ objects.map do |o|
+ res = []
+ res << o.ship_address_id if check_correct_address_id(o.ship_address_id, addresses)
+ res << o.bill_address_id if check_correct_address_id(o.bill_address_id, addresses)
+ res
+ end.flatten
+ end
+
+ def check_address(klass, addresses)
+ klass.joins(:address).where(address: addresses).pluck(:address_id)
+ end
+
+ def check_correct_address_id(id, missing_ids)
+ !id.nil? && missing_ids.include?(id)
+ end
+ end
+end
diff --git a/lib/tasks/enterprises.rake b/lib/tasks/enterprises.rake
index bc975295478..fa735853c26 100644
--- a/lib/tasks/enterprises.rake
+++ b/lib/tasks/enterprises.rake
@@ -31,8 +31,8 @@ namespace :ofn do
def enterprise_header
['name', 'description', 'long_description', 'is_primary_producer', 'is_distributor',
- 'contact_name', 'phone', 'email', 'website', 'twitter', 'abn', 'acn', 'pickup_times',
- 'next_collection_at', 'distributor_info', 'visible', 'facebook', 'instagram', 'linkedin',
+ 'contact_name', 'phone', 'email', 'website', 'twitter', 'abn', 'acn',
+ 'visible', 'facebook', 'instagram', 'linkedin',
'address1', 'address2', 'city', 'zipcode', 'state', 'country']
end
@@ -40,8 +40,8 @@ namespace :ofn do
[enterprise.name, enterprise.description, enterprise.long_description,
enterprise.is_primary_producer, enterprise.is_distributor, enterprise.contact_name,
enterprise.phone, enterprise.email, enterprise.website, enterprise.twitter, enterprise.abn,
- enterprise.acn, enterprise.pickup_times, enterprise.next_collection_at,
- enterprise.distributor_info, enterprise.visible, enterprise.facebook, enterprise.instagram,
+ enterprise.acn,
+ enterprise.visible, enterprise.facebook, enterprise.instagram,
enterprise.linkedin, enterprise.address.address1, enterprise.address.address2,
enterprise.address.city, enterprise.address.zipcode, enterprise.address.state_name,
enterprise.address.country&.name]
diff --git a/lib/tasks/karma.rake b/lib/tasks/karma.rake
index 3ee505f7315..0c2183c6e99 100644
--- a/lib/tasks/karma.rake
+++ b/lib/tasks/karma.rake
@@ -39,6 +39,6 @@ namespace :karma do
I18n::JS::DEFAULT_EXPORT_DIR_PATH.replace('tmp/javascripts')
I18n::JS.export
- "#{Rails.root.join(I18n::JS::DEFAULT_EXPORT_DIR_PATH, 'translations.js')}"
+ Rails.root.join(I18n::JS::DEFAULT_EXPORT_DIR_PATH, 'translations.js').to_s
end
end
diff --git a/package.json b/package.json
index 888b14112cb..d4b52d637fb 100644
--- a/package.json
+++ b/package.json
@@ -10,26 +10,30 @@
"pretty-quick": "pretty-quick"
},
"dependencies": {
- "@floating-ui/dom": "^1.6.3",
+ "@floating-ui/dom": "^1.6.5",
+ "@hotwired/stimulus": "^3.2",
"@hotwired/turbo": "^8.0.4",
"@rails/webpacker": "5.4.4",
"@stimulus-components/rails-nested-form": "^5.0.0",
- "cable_ready": "5.0.1",
+ "cable_ready": "5.0.5",
"debounced": "^0.0.5",
"flatpickr": "^4.6.9",
"foundation-sites": "^5.5.3",
"hotkeys-js": "^3.13.7",
- "jquery-ui": "1.13.2",
+ "jquery-ui": "1.13.3",
"js-big-decimal": "^2.0.7",
+ "leaflet": "1.9.4",
+ "leaflet-geosearch": "4.0.0",
+ "leaflet-providers": "2.0.0",
"moment": "^2.30.1",
"mrujs": "^1.0.0",
"select2": "^4.0.13",
"shortcut-buttons-flatpickr": "^0.4.0",
"stimulus": "^3.2.2",
"stimulus-flatpickr": "^1.4.0",
- "stimulus_reflex": "3.5.0-rc3",
+ "stimulus_reflex": "3.5.1",
"tom-select": "^2.3.1",
- "trix": "^2.1.0",
+ "trix": "^2.1.1",
"webpack": "~4"
},
"devDependencies": {
diff --git a/public/invalid_image.jpg b/public/invalid_image.jpg
new file mode 100755
index 00000000000..1af492828fc
Binary files /dev/null and b/public/invalid_image.jpg differ
diff --git a/spec/base_spec_helper.rb b/spec/base_spec_helper.rb
index 1238281f003..8a6e29a22e2 100644
--- a/spec/base_spec_helper.rb
+++ b/spec/base_spec_helper.rb
@@ -32,7 +32,7 @@
WebMock.enable!
WebMock.disable_net_connect!(
allow_localhost: true,
- allow: ['chromedriver.storage.googleapis.com', 'api.knapsackpro.com']
+ allow: ['chromedriver.storage.googleapis.com']
)
# Requires supporting ruby files with custom matchers and macros, etc,
@@ -60,7 +60,7 @@
RSpec.configure do |config|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
- config.fixture_path = "#{Rails.root.join('spec/fixtures')}"
+ config.fixture_path = Rails.root.join('spec/fixtures').to_s
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
@@ -94,15 +94,58 @@
# Force use of expect (over should)
config.expect_with :rspec do |expectations|
expectations.syntax = :expect
+
+ # This option will default to `true` in RSpec 4. It makes the `description`
+ # and `failure_message` of custom matchers include text for helper methods
+ # defined using `chain`, e.g.:
+ # be_bigger_than(2).and_smaller_than(4).description
+ # # => "be bigger than 2 and smaller than 4"
+ # ...rather than:
+ # # => "be bigger than 2"
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
+ end
+
+ # rspec-mocks config goes here. You can use an alternate test double
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
+ config.mock_with :rspec do |mocks|
+ # We use too many mocks at the moment. Activating the following
+ # feature fails a lot of specs. We should clean it up over time.
+ #
+ # Prevents you from mocking or stubbing a method that does not exist on
+ # a real object. This is generally recommended, and will default to
+ # `true` in RSpec 4.
+ # mocks.verify_partial_doubles = true
+ end
+
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
+ # have no way to turn it off -- the option exists only for backwards
+ # compatibility in RSpec 3). It causes shared context metadata to be
+ # inherited by the metadata hash of host groups and examples, rather than
+ # triggering implicit auto-inclusion in groups with matching metadata.
+ config.shared_context_metadata_behavior = :apply_to_host_groups
+
+ # Limits the available syntax to the non-monkey patched syntax that is
+ # recommended. For more details, see:
+ # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/
+ config.disable_monkey_patching!
+
+ # Many RSpec users commonly either run the entire suite or an individual
+ # file, and it's useful to allow more verbose output when running an
+ # individual spec file.
+ if config.files_to_run.one?
+ # Use the documentation formatter for detailed output,
+ # unless a formatter has already been configured
+ # (e.g. via a command-line flag).
+ config.default_formatter = "doc"
end
# Reset locale for all specs.
config.around(:each) do |example|
- I18n.with_locale(:en) { example.run }
+ I18n.with_locale(:en_AU) { example.run }
end
# Reset all feature toggles to prevent leaking.
- config.before(:suite) do
+ config.before(:each) do
Flipper.features.each(&:remove)
OpenFoodNetwork::FeatureToggle.setup!
end
@@ -182,11 +225,6 @@
end
end
- # Geocoding
- config.before(:each) {
- allow_any_instance_of(Spree::Address).to receive(:geocode).and_return([1, 1])
- }
-
default_country_id = DefaultCountry.id
checkout_zone = Spree::Config[:checkout_zone]
currency = Spree::Config[:currency]
diff --git a/spec/components/distributor_title_component_spec.rb b/spec/components/distributor_title_component_spec.rb
index b678027f493..c88b76eb671 100644
--- a/spec/components/distributor_title_component_spec.rb
+++ b/spec/components/distributor_title_component_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe "DistributorTitle tests", type: :component do
+RSpec.describe "DistributorTitle tests", type: :component do
it "displays distributor title with its name" do
render_inline(DistributorTitleComponent.new(name: "Freddy's Farm Shop")) {}
expect(page).to have_selector "h3", text: "Freddy's Farm Shop"
diff --git a/spec/components/example_component_spec.rb b/spec/components/example_component_spec.rb
index f40eeb5ee8a..540d7a4364f 100644
--- a/spec/components/example_component_spec.rb
+++ b/spec/components/example_component_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe "ExampleComponent tests", type: :component do
+RSpec.describe "ExampleComponent tests", type: :component do
it "displays the h1 with the given parameter" do
render_inline(ExampleComponent.new(title: "Hello")) {}
expect(page).to have_selector "h1", text: "Hello"
diff --git a/spec/components/vertical_ellipsis_menu_component_spec.rb b/spec/components/vertical_ellipsis_menu_component_spec.rb
index cdbdea159f2..3f8a37bab18 100644
--- a/spec/components/vertical_ellipsis_menu_component_spec.rb
+++ b/spec/components/vertical_ellipsis_menu_component_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe VerticalEllipsisMenu::Component, type: :component do
+RSpec.describe VerticalEllipsisMenu::Component, type: :component do
it "displays the included links" do
content = "Edit"
render_inline(described_class.new.with_content(content.html_safe))
diff --git a/spec/constraints/feature_toggle_constraint_spec.rb b/spec/constraints/feature_toggle_constraint_spec.rb
index 4c9e477d17e..6738c64480b 100644
--- a/spec/constraints/feature_toggle_constraint_spec.rb
+++ b/spec/constraints/feature_toggle_constraint_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe FeatureToggleConstraint do
+RSpec.describe FeatureToggleConstraint do
subject { described_class.new("baking") }
let(:request) { double(env:) }
let(:env) { {} }
diff --git a/spec/controllers/admin/bulk_line_items_controller_spec.rb b/spec/controllers/admin/bulk_line_items_controller_spec.rb
index 15e540c97b4..1a3a4d28524 100644
--- a/spec/controllers/admin/bulk_line_items_controller_spec.rb
+++ b/spec/controllers/admin/bulk_line_items_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::BulkLineItemsController, type: :controller do
+RSpec.describe Admin::BulkLineItemsController, type: :controller do
describe '#index' do
render_views
diff --git a/spec/controllers/admin/column_preferences_controller_spec.rb b/spec/controllers/admin/column_preferences_controller_spec.rb
index 0c46af6ecd7..c29153534d7 100644
--- a/spec/controllers/admin/column_preferences_controller_spec.rb
+++ b/spec/controllers/admin/column_preferences_controller_spec.rb
@@ -2,20 +2,33 @@
require 'spec_helper'
-describe Admin::ColumnPreferencesController, type: :controller do
+RSpec.describe Admin::ColumnPreferencesController, type: :controller do
include AuthenticationHelper
describe "bulk_update" do
let!(:user1) { create(:user) }
let!(:user2) { create(:user) }
let!(:enterprise) { create(:enterprise, owner: user1, users: [user1, user2]) }
+ let!(:column_preference) {
+ ColumnPreference.create(user_id: user1.id, action_name: 'enterprises_index',
+ column_name: "name", visible: true)
+ }
- context "json" do
- let!(:column_preference) {
- ColumnPreference.create(user_id: user1.id, action_name: 'enterprises_index',
- column_name: "name", visible: true)
- }
+ shared_examples "where I own the preferences submitted" do
+ before do
+ allow(controller).to receive(:spree_current_user) { user1 }
+ end
+ it "allows me to update the column preferences" do
+ spree_put :bulk_update, format: request_format, action_name: "enterprises_index",
+ column_preferences: column_preference_params
+ expect(ColumnPreference.where(user_id: user1.id,
+ action_name: 'enterprises_index').count).to be 3
+ end
+ end
+
+ context "json" do
+ let(:request_format) { :json }
let(:column_preference_params) {
[
{ id: column_preference.id, user_id: user1.id, action_name: "enterprises_index",
@@ -27,28 +40,47 @@
]
}
+ it_behaves_like "where I own the preferences submitted"
+
context "where I don't own the preferences submitted" do
before do
allow(controller).to receive(:spree_current_user) { user2 }
end
it "prevents me from updating the column preferences" do
- spree_put :bulk_update, format: :json, action_name: "enterprises_index",
+ spree_put :bulk_update, format: request_format, action_name: "enterprises_index",
column_preferences: column_preference_params
expect(ColumnPreference.count).to be 1
end
end
+ end
- context "where I own the preferences submitted" do
+ context "turbo_stream" do
+ let(:request_format) { :turbo_stream }
+ let(:column_preference_params) {
+ {
+ '0': { id: column_preference.id, column_name: "name", visible: "0" },
+ '1': { id: nil, column_name: "producer", visible: "1" },
+ '2': { id: nil, column_name: "status", visible: "1" },
+ }
+ }
+
+ it_behaves_like "where I own the preferences submitted"
+
+ context "where I don't own the preferences submitted" do
before do
- allow(controller).to receive(:spree_current_user) { user1 }
+ allow(controller).to receive(:spree_current_user) { user2 }
end
- it "allows me to update the column preferences" do
- spree_put :bulk_update, format: :json, action_name: "enterprises_index",
- column_preferences: column_preference_params
- expect(ColumnPreference.where(user_id: user1.id,
- action_name: 'enterprises_index').count).to be 3
+ # This has the same effect as the JSON action, but due to differing implementation,
+ # it has different expections.
+ it "prevents me from updating the column preferences" do
+ expect {
+ spree_put :bulk_update, format: request_format, action_name: "enterprises_index",
+ column_preferences: column_preference_params
+ }.to raise_error(ActiveRecord::RecordNotUnique)
+
+ expect(column_preference.reload.visible).to eq true
end
end
end
diff --git a/spec/controllers/admin/customers_controller_spec.rb b/spec/controllers/admin/customers_controller_spec.rb
index f7397e58ab1..d8d464fcb05 100644
--- a/spec/controllers/admin/customers_controller_spec.rb
+++ b/spec/controllers/admin/customers_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Admin
- describe CustomersController, type: :controller do
+ RSpec.describe CustomersController, type: :controller do
include AuthenticationHelper
describe "index" do
diff --git a/spec/controllers/admin/enterprises_controller_spec.rb b/spec/controllers/admin/enterprises_controller_spec.rb
index 9c033da7069..4caf3e38d79 100644
--- a/spec/controllers/admin/enterprises_controller_spec.rb
+++ b/spec/controllers/admin/enterprises_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require 'open_food_network/order_cycle_permissions'
-describe Admin::EnterprisesController, type: :controller do
+RSpec.describe Admin::EnterprisesController, type: :controller do
let(:user) { create(:user) }
let(:admin_user) { create(:admin_user) }
let(:distributor_manager) { create(:user, enterprise_limit: 10, enterprises: [distributor]) }
diff --git a/spec/controllers/admin/inventory_items_controller_spec.rb b/spec/controllers/admin/inventory_items_controller_spec.rb
index cf29a2d39c0..8375a89bbd3 100644
--- a/spec/controllers/admin/inventory_items_controller_spec.rb
+++ b/spec/controllers/admin/inventory_items_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::InventoryItemsController, type: :controller do
+RSpec.describe Admin::InventoryItemsController, type: :controller do
describe "create" do
context "json" do
let(:format) { :json }
diff --git a/spec/controllers/admin/invoice_settings_controller_spec.rb b/spec/controllers/admin/invoice_settings_controller_spec.rb
index b575d822d42..de8edc2a626 100644
--- a/spec/controllers/admin/invoice_settings_controller_spec.rb
+++ b/spec/controllers/admin/invoice_settings_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::InvoiceSettingsController, type: :controller do
+RSpec.describe Admin::InvoiceSettingsController, type: :controller do
describe "#update" do
let(:params) {
{
diff --git a/spec/controllers/admin/matomo_settings_controller_spec.rb b/spec/controllers/admin/matomo_settings_controller_spec.rb
index 26b5f8d6047..f488bd96370 100644
--- a/spec/controllers/admin/matomo_settings_controller_spec.rb
+++ b/spec/controllers/admin/matomo_settings_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::MatomoSettingsController, type: :controller do
+RSpec.describe Admin::MatomoSettingsController, type: :controller do
describe "#update" do
let(:params) {
{
diff --git a/spec/controllers/admin/order_cycles_controller_spec.rb b/spec/controllers/admin/order_cycles_controller_spec.rb
index fd154b71181..aaeafbd8d75 100644
--- a/spec/controllers/admin/order_cycles_controller_spec.rb
+++ b/spec/controllers/admin/order_cycles_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Admin
- describe OrderCyclesController, type: :controller do
+ RSpec.describe OrderCyclesController, type: :controller do
let!(:distributor_owner) { create(:user) }
before do
diff --git a/spec/controllers/admin/product_import_controller_spec.rb b/spec/controllers/admin/product_import_controller_spec.rb
index 88f6793ad5a..404e4ed7631 100644
--- a/spec/controllers/admin/product_import_controller_spec.rb
+++ b/spec/controllers/admin/product_import_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::ProductImportController, type: :controller do
+RSpec.describe Admin::ProductImportController, type: :controller do
describe 'validate_file_path' do
context 'file extension' do
it 'should authorize csv extension' do
diff --git a/spec/controllers/admin/proxy_orders_controller_spec.rb b/spec/controllers/admin/proxy_orders_controller_spec.rb
index 6e505530b62..7882fd96c42 100644
--- a/spec/controllers/admin/proxy_orders_controller_spec.rb
+++ b/spec/controllers/admin/proxy_orders_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::ProxyOrdersController, type: :controller do
+RSpec.describe Admin::ProxyOrdersController, type: :controller do
include AuthenticationHelper
describe 'cancel' do
diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb
index 318682a8e89..5e80fe5f685 100644
--- a/spec/controllers/admin/reports_controller_spec.rb
+++ b/spec/controllers/admin/reports_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::ReportsController, type: :controller do
+RSpec.describe Admin::ReportsController, type: :controller do
# Given two distributors and two suppliers
let(:bill_address) { create(:address) }
let(:ship_address) { create(:address) }
diff --git a/spec/controllers/admin/schedules_controller_spec.rb b/spec/controllers/admin/schedules_controller_spec.rb
index 38b1f12e352..c47b9e7bc81 100644
--- a/spec/controllers/admin/schedules_controller_spec.rb
+++ b/spec/controllers/admin/schedules_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::SchedulesController, type: :controller do
+RSpec.describe Admin::SchedulesController, type: :controller do
include AuthenticationHelper
describe "index" do
diff --git a/spec/controllers/admin/stripe_accounts_controller_spec.rb b/spec/controllers/admin/stripe_accounts_controller_spec.rb
index a1b5df8d691..97aa99a8951 100644
--- a/spec/controllers/admin/stripe_accounts_controller_spec.rb
+++ b/spec/controllers/admin/stripe_accounts_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::StripeAccountsController, type: :controller do
+RSpec.describe Admin::StripeAccountsController, type: :controller do
let(:enterprise) { create(:distributor_enterprise) }
describe "#connect" do
diff --git a/spec/controllers/admin/stripe_connect_settings_controller_spec.rb b/spec/controllers/admin/stripe_connect_settings_controller_spec.rb
index c6e99d47a88..ac56335e2d6 100644
--- a/spec/controllers/admin/stripe_connect_settings_controller_spec.rb
+++ b/spec/controllers/admin/stripe_connect_settings_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::StripeConnectSettingsController, type: :controller do
+RSpec.describe Admin::StripeConnectSettingsController, type: :controller do
let(:user) { create(:user) }
let(:admin) { create(:admin_user) }
diff --git a/spec/controllers/admin/subscription_line_items_controller_spec.rb b/spec/controllers/admin/subscription_line_items_controller_spec.rb
index 1ac8b006d84..0a015046f20 100644
--- a/spec/controllers/admin/subscription_line_items_controller_spec.rb
+++ b/spec/controllers/admin/subscription_line_items_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::SubscriptionLineItemsController, type: :controller do
+RSpec.describe Admin::SubscriptionLineItemsController, type: :controller do
include AuthenticationHelper
describe "build" do
diff --git a/spec/controllers/admin/subscriptions_controller_spec.rb b/spec/controllers/admin/subscriptions_controller_spec.rb
index c00d8ae113a..3beaf5f5d55 100644
--- a/spec/controllers/admin/subscriptions_controller_spec.rb
+++ b/spec/controllers/admin/subscriptions_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::SubscriptionsController, type: :controller do
+RSpec.describe Admin::SubscriptionsController, type: :controller do
include AuthenticationHelper
describe 'index' do
diff --git a/spec/controllers/admin/tag_rules_controller_spec.rb b/spec/controllers/admin/tag_rules_controller_spec.rb
index 9f789c17841..66930b43cec 100644
--- a/spec/controllers/admin/tag_rules_controller_spec.rb
+++ b/spec/controllers/admin/tag_rules_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::TagRulesController, type: :controller do
+RSpec.describe Admin::TagRulesController, type: :controller do
describe "destroy" do
context "json" do
let(:format) { :json }
diff --git a/spec/controllers/admin/terms_of_service_files_controller_spec.rb b/spec/controllers/admin/terms_of_service_files_controller_spec.rb
index de6b0ba1746..dac296ea955 100644
--- a/spec/controllers/admin/terms_of_service_files_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service_files_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::TermsOfServiceFilesController, type: :controller do
+RSpec.describe Admin::TermsOfServiceFilesController, type: :controller do
context "a non-admin user" do
let(:user) { create(:user) }
diff --git a/spec/controllers/admin/variant_overrides_controller_spec.rb b/spec/controllers/admin/variant_overrides_controller_spec.rb
index 4224452fb1a..7e37e63d600 100644
--- a/spec/controllers/admin/variant_overrides_controller_spec.rb
+++ b/spec/controllers/admin/variant_overrides_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Admin::VariantOverridesController, type: :controller do
+RSpec.describe Admin::VariantOverridesController, type: :controller do
describe "bulk_update" do
context "json" do
let(:format) { :json }
diff --git a/spec/controllers/api/v0/base_controller_spec.rb b/spec/controllers/api/v0/base_controller_spec.rb
index ae578015508..e98ab3e4f69 100644
--- a/spec/controllers/api/v0/base_controller_spec.rb
+++ b/spec/controllers/api/v0/base_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Api::V0::BaseController do
+RSpec.describe Api::V0::BaseController do
render_views
controller(Api::V0::BaseController) do
skip_authorization_check only: :index
diff --git a/spec/controllers/api/v0/customers_controller_spec.rb b/spec/controllers/api/v0/customers_controller_spec.rb
index 83bd201b4f4..b232bdea45d 100644
--- a/spec/controllers/api/v0/customers_controller_spec.rb
+++ b/spec/controllers/api/v0/customers_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Api
- describe V0::CustomersController, type: :controller do
+ RSpec.describe V0::CustomersController, type: :controller do
include AuthenticationHelper
render_views
diff --git a/spec/controllers/api/v0/enterprise_fees_controller_spec.rb b/spec/controllers/api/v0/enterprise_fees_controller_spec.rb
index 40ed1e78e2b..06a7b564fe7 100644
--- a/spec/controllers/api/v0/enterprise_fees_controller_spec.rb
+++ b/spec/controllers/api/v0/enterprise_fees_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Api
- describe V0::EnterpriseFeesController, type: :controller do
+ RSpec.describe V0::EnterpriseFeesController, type: :controller do
include AuthenticationHelper
let!(:unreferenced_fee) { create(:enterprise_fee) }
diff --git a/spec/controllers/api/v0/enterprises_controller_spec.rb b/spec/controllers/api/v0/enterprises_controller_spec.rb
index b930acfeafc..d0529f3eeba 100644
--- a/spec/controllers/api/v0/enterprises_controller_spec.rb
+++ b/spec/controllers/api/v0/enterprises_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Api::V0::EnterprisesController, type: :controller do
+RSpec.describe Api::V0::EnterprisesController, type: :controller do
render_views
let(:enterprise) { create(:distributor_enterprise) }
diff --git a/spec/controllers/api/v0/exchange_products_controller_spec.rb b/spec/controllers/api/v0/exchange_products_controller_spec.rb
index 18c04f3825c..ea226a80f15 100644
--- a/spec/controllers/api/v0/exchange_products_controller_spec.rb
+++ b/spec/controllers/api/v0/exchange_products_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Api
- describe V0::ExchangeProductsController, type: :controller do
+ RSpec.describe V0::ExchangeProductsController, type: :controller do
include AuthenticationHelper
let(:order_cycle) { create(:order_cycle) }
diff --git a/spec/controllers/api/v0/logos_controller_spec.rb b/spec/controllers/api/v0/logos_controller_spec.rb
index 3d8c800ba08..323c11c4ea5 100644
--- a/spec/controllers/api/v0/logos_controller_spec.rb
+++ b/spec/controllers/api/v0/logos_controller_spec.rb
@@ -3,7 +3,7 @@
require "spec_helper"
module Api
- describe V0::LogosController, type: :controller do
+ RSpec.describe V0::LogosController, type: :controller do
include AuthenticationHelper
include FileHelper
diff --git a/spec/controllers/api/v0/order_cycles_controller_spec.rb b/spec/controllers/api/v0/order_cycles_controller_spec.rb
index a8640fa5813..c6c9257cfe7 100644
--- a/spec/controllers/api/v0/order_cycles_controller_spec.rb
+++ b/spec/controllers/api/v0/order_cycles_controller_spec.rb
@@ -3,7 +3,7 @@
require "spec_helper"
module Api
- describe V0::OrderCyclesController, type: :controller do
+ RSpec.describe V0::OrderCyclesController, type: :controller do
let!(:distributor) { create(:distributor_enterprise) }
let!(:order_cycle) { create(:simple_order_cycle, distributors: [distributor]) }
let!(:exchange) { order_cycle.exchanges.to_enterprises(distributor).outgoing.first }
diff --git a/spec/controllers/api/v0/orders_controller_spec.rb b/spec/controllers/api/v0/orders_controller_spec.rb
index d727221cfe7..5f955cd573d 100644
--- a/spec/controllers/api/v0/orders_controller_spec.rb
+++ b/spec/controllers/api/v0/orders_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Api
- describe V0::OrdersController, type: :controller do
+ RSpec.describe V0::OrdersController, type: :controller do
include AuthenticationHelper
render_views
diff --git a/spec/controllers/api/v0/product_images_controller_spec.rb b/spec/controllers/api/v0/product_images_controller_spec.rb
index 2c0a380bee8..d010e7b6152 100644
--- a/spec/controllers/api/v0/product_images_controller_spec.rb
+++ b/spec/controllers/api/v0/product_images_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Api::V0::ProductImagesController, type: :controller do
+RSpec.describe Api::V0::ProductImagesController, type: :controller do
include AuthenticationHelper
include FileHelper
render_views
diff --git a/spec/controllers/api/v0/products_controller_spec.rb b/spec/controllers/api/v0/products_controller_spec.rb
index 4abba9f3bd7..bd796be1ea8 100644
--- a/spec/controllers/api/v0/products_controller_spec.rb
+++ b/spec/controllers/api/v0/products_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require 'spree/core/product_duplicator'
-describe Api::V0::ProductsController, type: :controller do
+RSpec.describe Api::V0::ProductsController, type: :controller do
render_views
let(:supplier) { create(:supplier_enterprise) }
diff --git a/spec/controllers/api/v0/promo_images_controller_spec.rb b/spec/controllers/api/v0/promo_images_controller_spec.rb
index 76e7288ae11..0b3d173efb6 100644
--- a/spec/controllers/api/v0/promo_images_controller_spec.rb
+++ b/spec/controllers/api/v0/promo_images_controller_spec.rb
@@ -3,7 +3,7 @@
require "spec_helper"
module Api
- describe V0::PromoImagesController, type: :controller do
+ RSpec.describe V0::PromoImagesController, type: :controller do
include AuthenticationHelper
include FileHelper
diff --git a/spec/controllers/api/v0/reports/packing_report_spec.rb b/spec/controllers/api/v0/reports/packing_report_spec.rb
index a88a26c7d09..1b35ddbe663 100644
--- a/spec/controllers/api/v0/reports/packing_report_spec.rb
+++ b/spec/controllers/api/v0/reports/packing_report_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe Api::V0::ReportsController, type: :controller do
+RSpec.describe Api::V0::ReportsController, type: :controller do
let(:params) {
{
report_type: 'packing',
diff --git a/spec/controllers/api/v0/reports_controller_spec.rb b/spec/controllers/api/v0/reports_controller_spec.rb
index e50c55cbdc8..6c6000300d8 100644
--- a/spec/controllers/api/v0/reports_controller_spec.rb
+++ b/spec/controllers/api/v0/reports_controller_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe Api::V0::ReportsController, type: :controller do
+RSpec.describe Api::V0::ReportsController, type: :controller do
let(:enterprise_user) { create(:user, enterprises: [create(:enterprise)]) }
let(:params) {
{
diff --git a/spec/controllers/api/v0/shipments_controller_spec.rb b/spec/controllers/api/v0/shipments_controller_spec.rb
index add3d0c3bae..f7c9584e011 100644
--- a/spec/controllers/api/v0/shipments_controller_spec.rb
+++ b/spec/controllers/api/v0/shipments_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Api::V0::ShipmentsController, type: :controller do
+RSpec.describe Api::V0::ShipmentsController, type: :controller do
render_views
let!(:shipment) { create(:shipment) }
diff --git a/spec/controllers/api/v0/shops_controller_spec.rb b/spec/controllers/api/v0/shops_controller_spec.rb
index 2863aaef531..d1842ac53d0 100644
--- a/spec/controllers/api/v0/shops_controller_spec.rb
+++ b/spec/controllers/api/v0/shops_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Api::V0::ShopsController, type: :controller do
+RSpec.describe Api::V0::ShopsController, type: :controller do
include AuthenticationHelper
render_views
diff --git a/spec/controllers/api/v0/states_controller_spec.rb b/spec/controllers/api/v0/states_controller_spec.rb
index 19993200e23..e8f5267db8e 100644
--- a/spec/controllers/api/v0/states_controller_spec.rb
+++ b/spec/controllers/api/v0/states_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Api
- describe V0::StatesController do
+ RSpec.describe V0::StatesController do
render_views
let!(:state) { create(:state, name: "Victoria") }
diff --git a/spec/controllers/api/v0/statuses_controller_spec.rb b/spec/controllers/api/v0/statuses_controller_spec.rb
index 32ef605a51f..cf95869bace 100644
--- a/spec/controllers/api/v0/statuses_controller_spec.rb
+++ b/spec/controllers/api/v0/statuses_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Api
- describe V0::StatusesController, type: :controller do
+ RSpec.describe V0::StatusesController, type: :controller do
render_views
describe "job queue status" do
diff --git a/spec/controllers/api/v0/taxonomies_controller_spec.rb b/spec/controllers/api/v0/taxonomies_controller_spec.rb
index dfa5c2c25bc..3426342ed50 100644
--- a/spec/controllers/api/v0/taxonomies_controller_spec.rb
+++ b/spec/controllers/api/v0/taxonomies_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Api
- describe V0::TaxonomiesController do
+ RSpec.describe V0::TaxonomiesController do
render_views
let(:taxonomy) { create(:taxonomy) }
diff --git a/spec/controllers/api/v0/taxons_controller_spec.rb b/spec/controllers/api/v0/taxons_controller_spec.rb
index 6bd3fe8586e..8666749deb4 100644
--- a/spec/controllers/api/v0/taxons_controller_spec.rb
+++ b/spec/controllers/api/v0/taxons_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Api::V0::TaxonsController do
+RSpec.describe Api::V0::TaxonsController do
render_views
let(:taxonomy) { create(:taxonomy) }
diff --git a/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb b/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb
index 53596f7fd32..1ca17ec0d91 100644
--- a/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb
+++ b/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb
@@ -3,7 +3,7 @@
require "spec_helper"
module Api
- describe V0::TermsAndConditionsController, type: :controller do
+ RSpec.describe V0::TermsAndConditionsController, type: :controller do
include AuthenticationHelper
include FileHelper
diff --git a/spec/controllers/api/v0/variants_controller_spec.rb b/spec/controllers/api/v0/variants_controller_spec.rb
index 1a90dd704a0..496af4d6b4b 100644
--- a/spec/controllers/api/v0/variants_controller_spec.rb
+++ b/spec/controllers/api/v0/variants_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Api::V0::VariantsController, type: :controller do
+RSpec.describe Api::V0::VariantsController, type: :controller do
render_views
let(:supplier) { create(:supplier_enterprise) }
diff --git a/spec/controllers/base_controller_spec.rb b/spec/controllers/base_controller_spec.rb
index 5158dd1c3ce..0c9ff572ad9 100644
--- a/spec/controllers/base_controller_spec.rb
+++ b/spec/controllers/base_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe BaseController, type: :controller do
+RSpec.describe BaseController, type: :controller do
let(:oc) { instance_double(OrderCycle, id: 1) }
let(:order) { instance_double(Spree::Order) }
controller(BaseController) do
diff --git a/spec/controllers/cart_controller_spec.rb b/spec/controllers/cart_controller_spec.rb
index 70ef4fd4e50..07ac5c50e59 100644
--- a/spec/controllers/cart_controller_spec.rb
+++ b/spec/controllers/cart_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe CartController, type: :controller do
+RSpec.describe CartController, type: :controller do
let(:order) { create(:order) }
describe "basic behaviour" do
diff --git a/spec/controllers/checkout_controller_spec.rb b/spec/controllers/checkout_controller_spec.rb
index 4f948cdefae..ea761d876bd 100644
--- a/spec/controllers/checkout_controller_spec.rb
+++ b/spec/controllers/checkout_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe CheckoutController, type: :controller do
+RSpec.describe CheckoutController, type: :controller do
let(:user) { order.user }
let(:address) { create(:address) }
let(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) }
@@ -308,6 +308,57 @@
end
end
+ context "with no payment source" do
+ let(:checkout_params) do
+ {
+ order: {
+ payments_attributes: [
+ {
+ payment_method_id:,
+ source_attributes: {
+ first_name: "Jane",
+ last_name: "Doe",
+ month: "",
+ year: "",
+ cc_type: "",
+ last_digits: "",
+ gateway_payment_profile_id: ""
+ }
+ }
+ ]
+ },
+ commit: "Next - Order Summary"
+ }
+ end
+
+ context "with a cash/check payment method" do
+ let!(:payment_method_id) { payment_method.id }
+
+ it "updates and redirects to summary step" do
+ put(:update, params:)
+
+ expect(response.status).to be 302
+ expect(response).to redirect_to checkout_step_path(:summary)
+ expect(order.reload.state).to eq "confirmation"
+ end
+ end
+
+ context "with a StripeSCA payment method" do
+ let(:stripe_payment_method) {
+ create(:stripe_sca_payment_method, distributor_ids: [distributor.id],
+ environment: Rails.env)
+ }
+ let!(:payment_method_id) { stripe_payment_method.id }
+
+ it "updates and redirects to summary step" do
+ put(:update, params:)
+ expect(response.status).to eq 422
+ expect(flash[:error]).to match "Saving failed, please update the highlighted fields."
+ expect(order.reload.state).to eq "payment"
+ end
+ end
+ end
+
context "with payment fees" do
let(:payment_method_with_fee) do
create(:payment_method, :flat_rate, amount: "1.23", distributors: [distributor])
diff --git a/spec/controllers/concerns/address_transformation_spec.rb b/spec/controllers/concerns/address_transformation_spec.rb
index d8f9cf74c21..2f9f1d725e3 100644
--- a/spec/controllers/concerns/address_transformation_spec.rb
+++ b/spec/controllers/concerns/address_transformation_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe AddressTransformation do
+RSpec.describe AddressTransformation do
include AddressTransformation
describe "#transform_address!" do
diff --git a/spec/controllers/concerns/extra_fields_spec.rb b/spec/controllers/concerns/extra_fields_spec.rb
index 463427926bf..0c6d4a15697 100644
--- a/spec/controllers/concerns/extra_fields_spec.rb
+++ b/spec/controllers/concerns/extra_fields_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe ExtraFields do
+RSpec.describe ExtraFields do
let(:dummy_controller) { Api::V1::BaseController.new.extend ExtraFields }
describe "#invalid_query_param" do
diff --git a/spec/controllers/concerns/raising_parameters_spec.rb b/spec/controllers/concerns/raising_parameters_spec.rb
index 73008f20cf8..1a7badf85d0 100644
--- a/spec/controllers/concerns/raising_parameters_spec.rb
+++ b/spec/controllers/concerns/raising_parameters_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe RaisingParameters do
+RSpec.describe RaisingParameters do
describe "Parameters" do
let(:params) do
RaisingParameters::Parameters.new(
diff --git a/spec/controllers/enterprises_controller_spec.rb b/spec/controllers/enterprises_controller_spec.rb
index 3f50de9a397..014d21706b7 100644
--- a/spec/controllers/enterprises_controller_spec.rb
+++ b/spec/controllers/enterprises_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe EnterprisesController, type: :controller do
+RSpec.describe EnterprisesController, type: :controller do
describe "shopping for a distributor" do
let(:user) { create(:user) }
let(:order) { controller.current_order(true) }
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index 9240ba0cf8b..a7d91c3522e 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe GroupsController, type: :controller do
+RSpec.describe GroupsController, type: :controller do
render_views
let!(:enterprise) { create(:distributor_enterprise) }
diff --git a/spec/controllers/line_items_controller_spec.rb b/spec/controllers/line_items_controller_spec.rb
index 28db84cd07c..a825e77b353 100644
--- a/spec/controllers/line_items_controller_spec.rb
+++ b/spec/controllers/line_items_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe LineItemsController, type: :controller do
+RSpec.describe LineItemsController, type: :controller do
let(:user) { create(:user) }
let(:distributor) { create(:distributor_enterprise) }
let(:order_cycle) { create(:simple_order_cycle) }
diff --git a/spec/controllers/payment_gateways/paypal_controller_spec.rb b/spec/controllers/payment_gateways/paypal_controller_spec.rb
index d348054fde3..8eb2fb2191e 100644
--- a/spec/controllers/payment_gateways/paypal_controller_spec.rb
+++ b/spec/controllers/payment_gateways/paypal_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module PaymentGateways
- describe PaypalController, type: :controller do
+ RSpec.describe PaypalController, type: :controller do
context '#cancel' do
it 'redirects back to checkout' do
expect(get(:cancel)).to redirect_to checkout_path
diff --git a/spec/controllers/payment_gateways/stripe_controller_spec.rb b/spec/controllers/payment_gateways/stripe_controller_spec.rb
index 9b2e3233d92..5f7d086c9ad 100644
--- a/spec/controllers/payment_gateways/stripe_controller_spec.rb
+++ b/spec/controllers/payment_gateways/stripe_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module PaymentGateways
- describe StripeController, type: :controller do
+ RSpec.describe StripeController, type: :controller do
include StripeStubs
let!(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) }
diff --git a/spec/controllers/registration_controller_spec.rb b/spec/controllers/registration_controller_spec.rb
index 6fa9e867f44..bb87674ba99 100644
--- a/spec/controllers/registration_controller_spec.rb
+++ b/spec/controllers/registration_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe RegistrationController, type: :controller do
+RSpec.describe RegistrationController, type: :controller do
describe "redirecting when user not logged in" do
it "index" do
get :index
diff --git a/spec/controllers/shop_controller_spec.rb b/spec/controllers/shop_controller_spec.rb
index b072152e726..9431411a824 100644
--- a/spec/controllers/shop_controller_spec.rb
+++ b/spec/controllers/shop_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe ShopController, type: :controller do
+RSpec.describe ShopController, type: :controller do
let!(:pm) { create(:payment_method) }
let!(:sm) { create(:shipping_method) }
let(:distributor) {
diff --git a/spec/controllers/shops_controller_spec.rb b/spec/controllers/shops_controller_spec.rb
index 97cea60cb98..a12a9640382 100644
--- a/spec/controllers/shops_controller_spec.rb
+++ b/spec/controllers/shops_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe ShopsController, type: :controller do
+RSpec.describe ShopsController, type: :controller do
include WebHelper
render_views
diff --git a/spec/controllers/spree/admin/adjustments_controller_spec.rb b/spec/controllers/spree/admin/adjustments_controller_spec.rb
index a6ae8900714..93837dbfb84 100644
--- a/spec/controllers/spree/admin/adjustments_controller_spec.rb
+++ b/spec/controllers/spree/admin/adjustments_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
module Spree
- describe Admin::AdjustmentsController, type: :controller do
+ RSpec.describe Admin::AdjustmentsController, type: :controller do
include AuthenticationHelper
before { controller_login_as_admin }
diff --git a/spec/controllers/spree/admin/base_controller_spec.rb b/spec/controllers/spree/admin/base_controller_spec.rb
index 21dbc71a4e8..63844e98833 100644
--- a/spec/controllers/spree/admin/base_controller_spec.rb
+++ b/spec/controllers/spree/admin/base_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::BaseController, type: :controller do
+RSpec.describe Spree::Admin::BaseController, type: :controller do
controller(Spree::Admin::BaseController) do
def index
before_action :unauthorized
diff --git a/spec/controllers/spree/admin/countries_controller_spec.rb b/spec/controllers/spree/admin/countries_controller_spec.rb
index 87a9356f1ee..d5829a91493 100644
--- a/spec/controllers/spree/admin/countries_controller_spec.rb
+++ b/spec/controllers/spree/admin/countries_controller_spec.rb
@@ -4,7 +4,7 @@
module Spree
module Admin
- describe CountriesController, type: :controller do
+ RSpec.describe CountriesController, type: :controller do
include AuthenticationHelper
describe "#update" do
diff --git a/spec/controllers/spree/admin/general_settings_controller_spec.rb b/spec/controllers/spree/admin/general_settings_controller_spec.rb
index 3fff115d019..1a0e0b002f5 100644
--- a/spec/controllers/spree/admin/general_settings_controller_spec.rb
+++ b/spec/controllers/spree/admin/general_settings_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::GeneralSettingsController, type: :controller do
+RSpec.describe Spree::Admin::GeneralSettingsController, type: :controller do
include AuthenticationHelper
describe 'updating general settings' do
diff --git a/spec/controllers/spree/admin/mail_methods_controller_spec.rb b/spec/controllers/spree/admin/mail_methods_controller_spec.rb
index 43ff49f9f0f..163ec8f54be 100644
--- a/spec/controllers/spree/admin/mail_methods_controller_spec.rb
+++ b/spec/controllers/spree/admin/mail_methods_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::MailMethodsController do
+RSpec.describe Spree::Admin::MailMethodsController do
include AuthenticationHelper
before { controller_login_as_admin }
diff --git a/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb b/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb
index a19d2e942ef..44b595b8ab0 100644
--- a/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb
+++ b/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::Orders::CustomerDetailsController, type: :controller do
+RSpec.describe Spree::Admin::Orders::CustomerDetailsController, type: :controller do
include AuthenticationHelper
describe "#update" do
diff --git a/spec/controllers/spree/admin/orders/invoices_spec.rb b/spec/controllers/spree/admin/orders/invoices_spec.rb
index 2a7b3b00c1d..3eda9051a29 100644
--- a/spec/controllers/spree/admin/orders/invoices_spec.rb
+++ b/spec/controllers/spree/admin/orders/invoices_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::OrdersController, type: :controller do
+RSpec.describe Spree::Admin::OrdersController, type: :controller do
describe "#invoice" do
let!(:user) { create(:user) }
let!(:enterprise_user) { create(:user) }
@@ -106,7 +106,7 @@
end
end
-describe Spree::Admin::InvoicesController, type: :controller do
+RSpec.describe Spree::Admin::InvoicesController, type: :controller do
describe "#index" do
let(:user) { create(:user) }
let(:enterprise_user) { create(:user, enterprises: [create(:enterprise)]) }
@@ -158,6 +158,10 @@
let(:distributor) { order.distributor }
let(:params) { { order_id: order.number } }
+ before do
+ distributor.update_attribute(:abn, "123412341234")
+ end
+
context "as a normal user" do
before { allow(controller).to receive(:spree_current_user) { user } }
@@ -193,6 +197,22 @@
expect(response).to redirect_to spree.admin_dashboard_path
end
+
+ context "distributor didn't set an ABN" do
+ before do
+ distributor.update_attribute(:abn, "")
+ end
+
+ it "should not allow me to generate a new invoice for the order" do
+ expect do
+ spree_get :generate, params
+ end.to change{ Invoice.count }.by(0)
+
+ expect(response).to redirect_to spree.admin_dashboard_path
+ expect(flash[:error])
+ .to eq "#{distributor.name} must have a valid ABN before invoices can be used."
+ end
+ end
end
end
end
diff --git a/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb b/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb
index a6ed0be235a..1e3b1cf8c62 100644
--- a/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb
+++ b/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::PaymentsController, type: :controller do
+RSpec.describe Spree::Admin::PaymentsController, type: :controller do
include StripeHelper
include StripeStubs
diff --git a/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb b/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb
index 6478629e481..1917294fac5 100644
--- a/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb
+++ b/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::PaymentsController, type: :controller do
+RSpec.describe Spree::Admin::PaymentsController, type: :controller do
let!(:shop) { create(:enterprise) }
let!(:user) { shop.owner }
let!(:order) { create(:order, distributor: shop, state: 'complete') }
diff --git a/spec/controllers/spree/admin/orders_controller_spec.rb b/spec/controllers/spree/admin/orders_controller_spec.rb
index 0dc568430dc..d4dab4e0b21 100644
--- a/spec/controllers/spree/admin/orders_controller_spec.rb
+++ b/spec/controllers/spree/admin/orders_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::OrdersController, type: :controller do
+RSpec.describe Spree::Admin::OrdersController, type: :controller do
describe "#edit" do
let!(:order) { create(:order_with_totals_and_distribution, ship_address: create(:address)) }
diff --git a/spec/controllers/spree/admin/overview_controller_spec.rb b/spec/controllers/spree/admin/overview_controller_spec.rb
index 455f3b3ac90..cb5f218f240 100644
--- a/spec/controllers/spree/admin/overview_controller_spec.rb
+++ b/spec/controllers/spree/admin/overview_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::OverviewController, type: :controller do
+RSpec.describe Spree::Admin::OverviewController, type: :controller do
describe "#index" do
before do
allow(controller).to receive(:spree_current_user).and_return(user)
diff --git a/spec/controllers/spree/admin/payment_methods_controller_spec.rb b/spec/controllers/spree/admin/payment_methods_controller_spec.rb
index 37569b28ec5..e6d32886037 100644
--- a/spec/controllers/spree/admin/payment_methods_controller_spec.rb
+++ b/spec/controllers/spree/admin/payment_methods_controller_spec.rb
@@ -7,7 +7,7 @@ class GatewayWithPassword < PaymentMethod
preference :password, :string, default: "password"
end
- describe Admin::PaymentMethodsController, type: :controller do
+ RSpec.describe Admin::PaymentMethodsController, type: :controller do
let(:user) {
create(:user, enterprises: [create(:distributor_enterprise)])
}
diff --git a/spec/controllers/spree/admin/products_controller_spec.rb b/spec/controllers/spree/admin/products_controller_spec.rb
index 9dbf146f539..2e33fc3926c 100644
--- a/spec/controllers/spree/admin/products_controller_spec.rb
+++ b/spec/controllers/spree/admin/products_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::ProductsController, type: :controller do
+RSpec.describe Spree::Admin::ProductsController, type: :controller do
describe 'bulk_update' do
context "updating a product we do not have access to" do
let(:s_managed) { create(:enterprise) }
diff --git a/spec/controllers/spree/admin/return_authorizations_controller_spec.rb b/spec/controllers/spree/admin/return_authorizations_controller_spec.rb
index d8b0a1ca423..d76ee014bd4 100644
--- a/spec/controllers/spree/admin/return_authorizations_controller_spec.rb
+++ b/spec/controllers/spree/admin/return_authorizations_controller_spec.rb
@@ -4,7 +4,7 @@
module Spree
module Admin
- describe ReturnAuthorizationsController, type: :controller do
+ RSpec.describe ReturnAuthorizationsController, type: :controller do
include AuthenticationHelper
let(:order) { create(:shipped_order, distributor: create(:distributor_enterprise)) }
diff --git a/spec/controllers/spree/admin/search_controller_spec.rb b/spec/controllers/spree/admin/search_controller_spec.rb
index 53313e5521f..a62e38e6b99 100644
--- a/spec/controllers/spree/admin/search_controller_spec.rb
+++ b/spec/controllers/spree/admin/search_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::SearchController, type: :controller do
+RSpec.describe Spree::Admin::SearchController, type: :controller do
context "Distributor Enterprise User" do
let!(:owner) { create(:user, email: "test1@email.com" ) }
let!(:manager) { create(:user, email: "test2@email.com" ) }
diff --git a/spec/controllers/spree/admin/shipping_categories_controller_spec.rb b/spec/controllers/spree/admin/shipping_categories_controller_spec.rb
index 8a77bb78c65..e7df05f5f43 100644
--- a/spec/controllers/spree/admin/shipping_categories_controller_spec.rb
+++ b/spec/controllers/spree/admin/shipping_categories_controller_spec.rb
@@ -4,7 +4,7 @@
module Spree
module Admin
- describe ShippingCategoriesController, type: :controller do
+ RSpec.describe ShippingCategoriesController, type: :controller do
include AuthenticationHelper
describe "#create and #update" do
diff --git a/spec/controllers/spree/admin/shipping_methods_controller_spec.rb b/spec/controllers/spree/admin/shipping_methods_controller_spec.rb
index e93103e2d66..efdb46d78c5 100644
--- a/spec/controllers/spree/admin/shipping_methods_controller_spec.rb
+++ b/spec/controllers/spree/admin/shipping_methods_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::ShippingMethodsController, type: :controller do
+RSpec.describe Spree::Admin::ShippingMethodsController, type: :controller do
include AuthenticationHelper
describe "#update" do
diff --git a/spec/controllers/spree/admin/tax_rates_controller_spec.rb b/spec/controllers/spree/admin/tax_rates_controller_spec.rb
index 3ce91d9ebf0..ad9bc2cb72d 100644
--- a/spec/controllers/spree/admin/tax_rates_controller_spec.rb
+++ b/spec/controllers/spree/admin/tax_rates_controller_spec.rb
@@ -4,7 +4,7 @@
module Spree
module Admin
- describe TaxRatesController, type: :controller do
+ RSpec.describe TaxRatesController, type: :controller do
include AuthenticationHelper
let!(:default_tax_zone) { create(:zone, default_tax: true) }
diff --git a/spec/controllers/spree/admin/tax_settings_controller_spec.rb b/spec/controllers/spree/admin/tax_settings_controller_spec.rb
index dbb320b1c6a..e41d1825a43 100644
--- a/spec/controllers/spree/admin/tax_settings_controller_spec.rb
+++ b/spec/controllers/spree/admin/tax_settings_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::TaxSettingsController, type: :controller do
+RSpec.describe Spree::Admin::TaxSettingsController, type: :controller do
describe "#update" do
let(:params) { { preferences: { products_require_tax_category: "1" } } }
diff --git a/spec/controllers/spree/admin/taxons_controller_spec.rb b/spec/controllers/spree/admin/taxons_controller_spec.rb
index 8c19f14da86..3abc6669aa6 100644
--- a/spec/controllers/spree/admin/taxons_controller_spec.rb
+++ b/spec/controllers/spree/admin/taxons_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::TaxonsController do
+RSpec.describe Spree::Admin::TaxonsController do
render_views
let(:taxonomy) { create(:taxonomy) }
diff --git a/spec/controllers/spree/admin/users_controller_spec.rb b/spec/controllers/spree/admin/users_controller_spec.rb
index 96e7cc4df40..11d4b969c40 100644
--- a/spec/controllers/spree/admin/users_controller_spec.rb
+++ b/spec/controllers/spree/admin/users_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::Admin::UsersController do
+RSpec.describe Spree::Admin::UsersController do
context '#authorize_admin' do
let(:user) { create(:user) }
let(:test_user) { create(:user) }
diff --git a/spec/controllers/spree/admin/variants_controller_spec.rb b/spec/controllers/spree/admin/variants_controller_spec.rb
index 7bdfc7bcbe7..8585415d0e2 100644
--- a/spec/controllers/spree/admin/variants_controller_spec.rb
+++ b/spec/controllers/spree/admin/variants_controller_spec.rb
@@ -4,7 +4,7 @@
module Spree
module Admin
- describe VariantsController, type: :controller do
+ RSpec.describe VariantsController, type: :controller do
before { controller_login_as_admin }
describe "#index" do
diff --git a/spec/controllers/spree/api_keys_controller_spec.rb b/spec/controllers/spree/api_keys_controller_spec.rb
index 99faf439641..5b3162acc0e 100644
--- a/spec/controllers/spree/api_keys_controller_spec.rb
+++ b/spec/controllers/spree/api_keys_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::ApiKeysController, type: :controller, performance: true do
+RSpec.describe Spree::ApiKeysController, type: :controller, performance: true do
routes { Spree::Core::Engine.routes }
include AuthenticationHelper
diff --git a/spec/controllers/spree/credit_cards_controller_spec.rb b/spec/controllers/spree/credit_cards_controller_spec.rb
index 41e87d975ca..c5163163ed6 100644
--- a/spec/controllers/spree/credit_cards_controller_spec.rb
+++ b/spec/controllers/spree/credit_cards_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::CreditCardsController, type: :controller do
+RSpec.describe Spree::CreditCardsController, type: :controller do
describe "using VCR", :vcr, :stripe_version do
let(:user) { create(:user) }
diff --git a/spec/controllers/spree/orders_controller_spec.rb b/spec/controllers/spree/orders_controller_spec.rb
index 78ed96e16e9..f1f47762c2e 100644
--- a/spec/controllers/spree/orders_controller_spec.rb
+++ b/spec/controllers/spree/orders_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::OrdersController, type: :controller do
+RSpec.describe Spree::OrdersController, type: :controller do
include CheckoutHelper
include StripeStubs
diff --git a/spec/controllers/spree/user_sessions_controller_spec.rb b/spec/controllers/spree/user_sessions_controller_spec.rb
index 34053783b7e..5f035752637 100644
--- a/spec/controllers/spree/user_sessions_controller_spec.rb
+++ b/spec/controllers/spree/user_sessions_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::UserSessionsController, type: :controller do
+RSpec.describe Spree::UserSessionsController, type: :controller do
let(:user) { create(:user) }
before do
diff --git a/spec/controllers/spree/users_controller_spec.rb b/spec/controllers/spree/users_controller_spec.rb
index ee8de1d00fb..6eff295eb69 100644
--- a/spec/controllers/spree/users_controller_spec.rb
+++ b/spec/controllers/spree/users_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Spree::UsersController, type: :controller do
+RSpec.describe Spree::UsersController, type: :controller do
routes { Spree::Core::Engine.routes }
include AuthenticationHelper
diff --git a/spec/controllers/stripe/callbacks_controller_spec.rb b/spec/controllers/stripe/callbacks_controller_spec.rb
index de37d51cc83..b4a122620f2 100644
--- a/spec/controllers/stripe/callbacks_controller_spec.rb
+++ b/spec/controllers/stripe/callbacks_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Stripe::CallbacksController, type: :controller do
+RSpec.describe Stripe::CallbacksController, type: :controller do
let(:enterprise) { create(:distributor_enterprise) }
context "#index" do
diff --git a/spec/controllers/stripe/webhooks_controller_spec.rb b/spec/controllers/stripe/webhooks_controller_spec.rb
index 1369a6aa472..38ccaff7971 100644
--- a/spec/controllers/stripe/webhooks_controller_spec.rb
+++ b/spec/controllers/stripe/webhooks_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Stripe::WebhooksController, type: :controller do
+RSpec.describe Stripe::WebhooksController, type: :controller do
describe "#create" do
let(:params) do
{
diff --git a/spec/controllers/user_confirmations_controller_spec.rb b/spec/controllers/user_confirmations_controller_spec.rb
index dd4897c4e11..d276d4c8741 100644
--- a/spec/controllers/user_confirmations_controller_spec.rb
+++ b/spec/controllers/user_confirmations_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe UserConfirmationsController, type: :controller do
+RSpec.describe UserConfirmationsController, type: :controller do
let!(:user) { create(:user) }
let!(:confirmed_user) { create(:user, confirmed_at: nil) }
let!(:unconfirmed_user) { create(:user, confirmed_at: nil) }
diff --git a/spec/controllers/user_passwords_controller_spec.rb b/spec/controllers/user_passwords_controller_spec.rb
index 7ba17274b8c..594f5dbd79d 100644
--- a/spec/controllers/user_passwords_controller_spec.rb
+++ b/spec/controllers/user_passwords_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe UserPasswordsController, type: :controller do
+RSpec.describe UserPasswordsController, type: :controller do
render_views
let(:user) { create(:user) }
diff --git a/spec/controllers/user_registrations_controller_spec.rb b/spec/controllers/user_registrations_controller_spec.rb
index d25b811d694..23aa1e220a5 100644
--- a/spec/controllers/user_registrations_controller_spec.rb
+++ b/spec/controllers/user_registrations_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe UserRegistrationsController, type: :controller do
+RSpec.describe UserRegistrationsController, type: :controller do
before do
@request.env["devise.mapping"] = Devise.mappings[:spree_user]
end
diff --git a/spec/controllers/webhook_endpoints_controller_spec.rb b/spec/controllers/webhook_endpoints_controller_spec.rb
index e628710f72b..bd6ea079614 100644
--- a/spec/controllers/webhook_endpoints_controller_spec.rb
+++ b/spec/controllers/webhook_endpoints_controller_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require 'open_food_network/order_cycle_permissions'
-describe WebhookEndpointsController, type: :controller do
+RSpec.describe WebhookEndpointsController, type: :controller do
let(:user) { create(:admin_user) }
before { allow(controller).to receive(:spree_current_user) { user } }
diff --git a/spec/factories.rb b/spec/factories.rb
index 52c80704d5e..90675a7cbbe 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -94,6 +94,11 @@
transient { amount { 1 } }
calculator { build(:calculator_per_item, preferred_amount: amount) }
end
+
+ trait :flat_percent_per_item do
+ transient { amount { 1 } }
+ calculator { build(:calculator_flat_percent_per_item, preferred_flat_percent: amount) }
+ end
end
factory :adjustment_metadata, class: AdjustmentMetadata do
diff --git a/spec/factories/calculator_factory.rb b/spec/factories/calculator_factory.rb
index 91c571a8fe5..fd861e21ff7 100644
--- a/spec/factories/calculator_factory.rb
+++ b/spec/factories/calculator_factory.rb
@@ -14,6 +14,10 @@
preferred_amount { generate(:calculator_amount) }
end
+ factory :calculator_flat_percent_per_item, class: Calculator::FlatPercentPerItem do
+ preferred_flat_percent { generate(:calculator_amount) }
+ end
+
factory :weight_calculator, class: Calculator::Weight do
after(:build) { |c|
c.set_preference(:per_unit, 0.5)
diff --git a/spec/factories/payment_method_factory.rb b/spec/factories/payment_method_factory.rb
index 98e8d36a35c..c93657ef21d 100644
--- a/spec/factories/payment_method_factory.rb
+++ b/spec/factories/payment_method_factory.rb
@@ -24,4 +24,9 @@
distributors { [FactoryBot.create(:stripe_account).enterprise] }
preferred_enterprise_id { distributors.first.id }
end
+
+ factory :distributor_payment_method, class: DistributorPaymentMethod do
+ distributor { FactoryBot.create(:distributor_enterprise) }
+ payment_method { FactoryBot.create(:payment_method) }
+ end
end
diff --git a/spec/factories/shipping_method_factory.rb b/spec/factories/shipping_method_factory.rb
index d6957e78bdc..68b41106c47 100644
--- a/spec/factories/shipping_method_factory.rb
+++ b/spec/factories/shipping_method_factory.rb
@@ -68,4 +68,9 @@
distributors { [create(:distributor_enterprise_with_tax)] }
end
end
+
+ factory :distributor_shipping_method, class: DistributorShippingMethod do
+ shipping_method { FactoryBot.create(:shipping_method) }
+ distributor { FactoryBot.create(:distributor_enterprise) }
+ end
end
diff --git a/spec/fixtures/vcr_cassettes/DFC_Product_Import/imports_from_a_FDC_catalog.yml b/spec/fixtures/vcr_cassettes/DFC_Product_Import/imports_from_a_FDC_catalog.yml
new file mode 100644
index 00000000000..ad4af0b09bd
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/DFC_Product_Import/imports_from_a_FDC_catalog.yml
@@ -0,0 +1,206 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com
+ body:
+ encoding: UTF-8
+ string: '{"userId":"testdfc@protonmail.com","accessToken":""}'
+ headers:
+ Content-Type:
+ - application/json
+ Authorization:
+ - ""
+ User-Agent:
+ - Faraday v2.9.0
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 403
+ message: Forbidden
+ headers:
+ Server:
+ - Cowboy
+ Report-To:
+ - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716531220&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=GSiP%2FtCyGGyQZrjxJKzy4%2F8ZDbqeNOf8qWTTKv61%2FjQ%3D"}]}'
+ Reporting-Endpoints:
+ - heroku-nel=https://nel.heroku.com/reports?ts=1716531220&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=GSiP%2FtCyGGyQZrjxJKzy4%2F8ZDbqeNOf8qWTTKv61%2FjQ%3D
+ Nel:
+ - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}'
+ Connection:
+ - keep-alive
+ X-Powered-By:
+ - Express
+ Access-Control-Allow-Origin:
+ - "*"
+ Content-Type:
+ - application/json; charset=utf-8
+ Content-Length:
+ - '62'
+ Etag:
+ - W/"3e-3yNPCMU4MDQmKmieGPWfDcA/0Eg"
+ Date:
+ - Fri, 24 May 2024 06:13:41 GMT
+ Via:
+ - 1.1 vegur
+ body:
+ encoding: UTF-8
+ string: '{"message":"User access denied","error":"User not authorized"}'
+ recorded_at: Fri, 24 May 2024 06:13:41 GMT
+- request:
+ method: get
+ uri: https://login.lescommuns.org/auth/realms/data-food-consortium/.well-known/openid-configuration
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - SWD 2.0.3
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Fri, 24 May 2024 06:13:42 GMT
+ Content-Type:
+ - application/json;charset=UTF-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Vary:
+ - Accept-Encoding
+ Set-Cookie:
+ - AUTH_SESSION_ID=1716531223.827.7041.811327|6055218c9898cae39f8ffd531999e49a;
+ Path=/; Secure; HttpOnly
+ Cache-Control:
+ - no-cache, must-revalidate, no-transform, no-store
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Xss-Protection:
+ - 1; mode=block
+ body:
+ encoding: ASCII-8BIT
+ string: '{"issuer":"https://login.lescommuns.org/auth/realms/data-food-consortium","authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth","token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","end_session_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/logout","frontchannel_logout_session_supported":true,"frontchannel_logout_supported":true,"jwks_uri":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/certs","check_session_iframe":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/login-status-iframe.html","grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials","urn:openid:params:grant-type:ciba","urn:ietf:params:oauth:grant-type:device_code"],"acr_values_supported":["0","1"],"response_types_supported":["code","none","id_token","token","id_token
+ token","code id_token","code token","code id_token token"],"subject_types_supported":["public","pairwise"],"id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"id_token_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"id_token_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"userinfo_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"userinfo_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"request_object_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"request_object_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"request_object_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"response_modes_supported":["query","fragment","form_post","query.jwt","fragment.jwt","form_post.jwt","jwt"],"registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"token_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"introspection_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"introspection_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"authorization_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email","acr"],"claim_types_supported":["normal"],"claims_parameter_supported":true,"scopes_supported":["openid","microprofile-jwt","phone","roles","profile","email","address","web-origins","acr","offline_access"],"request_parameter_supported":true,"request_uri_parameter_supported":true,"require_request_uri_registration":true,"code_challenge_methods_supported":["plain","S256"],"tls_client_certificate_bound_access_tokens":true,"revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","revocation_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"revocation_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"backchannel_logout_supported":true,"backchannel_logout_session_supported":true,"device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","backchannel_token_delivery_modes_supported":["poll","ping"],"backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth","backchannel_authentication_request_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512"],"require_pushed_authorization_requests":false,"pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","mtls_endpoint_aliases":{"token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth"},"authorization_response_iss_parameter_supported":true}'
+ recorded_at: Fri, 24 May 2024 06:13:43 GMT
+- request:
+ method: post
+ uri: https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token
+ body:
+ encoding: UTF-8
+ string: grant_type=refresh_token&refresh_token=
+ headers:
+ User-Agent:
+ - Rack::OAuth2 (2.2.1)
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Fri, 24 May 2024 06:13:44 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Vary:
+ - Accept-Encoding
+ Set-Cookie:
+ - AUTH_SESSION_ID=1716531225.15.7041.192535|6055218c9898cae39f8ffd531999e49a;
+ Path=/; Secure; HttpOnly
+ Cache-Control:
+ - no-store
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Xss-Protection:
+ - 1; mode=block
+ body:
+ encoding: ASCII-8BIT
+ string: '{"access_token":"","expires_in":1800,"refresh_expires_in":31357813,"refresh_token":"","token_type":"Bearer","id_token":"","not-before-policy":0,"session_state":"cfaa4a60-c2aa-4590-9fdf-a117f23d564f","scope":"openid
+ profile email"}'
+ recorded_at: Fri, 24 May 2024 06:13:44 GMT
+- request:
+ method: post
+ uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com
+ body:
+ encoding: UTF-8
+ string: '{"userId":"testdfc@protonmail.com","accessToken":""}'
+ headers:
+ Content-Type:
+ - application/json
+ Authorization:
+ - ""
+ User-Agent:
+ - Faraday v2.9.0
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - Cowboy
+ Report-To:
+ - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716531225&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=zHpdjRNvPwW4u7pYofDRsdOcjztCveqnM3K9GcGjhMU%3D"}]}'
+ Reporting-Endpoints:
+ - heroku-nel=https://nel.heroku.com/reports?ts=1716531225&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=zHpdjRNvPwW4u7pYofDRsdOcjztCveqnM3K9GcGjhMU%3D
+ Nel:
+ - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}'
+ Connection:
+ - keep-alive
+ X-Powered-By:
+ - Express
+ Access-Control-Allow-Origin:
+ - "*"
+ Content-Type:
+ - application/json; charset=utf-8
+ Content-Length:
+ - '41161'
+ Etag:
+ - W/"a0c9-f4oAeN9fidSaWKNQXG3R8vniAac"
+ Date:
+ - Fri, 24 May 2024 06:13:49 GMT
+ Via:
+ - 1.1 vegur
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJwcm9kdWN0cyI6IntcIkBjb250ZXh0XCI6XCJodHRwczovL3d3dy5kYXRhZm9vZGNvbnNvcnRpdW0ub3JnXCIsXCJAZ3JhcGhcIjpbe1wiQGlkXCI6XCJfOmIxXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC40XCJ9LHtcIkBpZFwiOlwiXzpiMTBcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjIuODlcIn0se1wiQGlkXCI6XCJfOmIxMVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNFwifSx7XCJAaWRcIjpcIl86YjEyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIwLjk5XCJ9LHtcIkBpZFwiOlwiXzpiMTNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjNcIn0se1wiQGlkXCI6XCJfOmIxNFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMi45OVwifSx7XCJAaWRcIjpcIl86YjE1XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNC44XCJ9LHtcIkBpZFwiOlwiXzpiMTZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjE4Ljg1XCJ9LHtcIkBpZFwiOlwiXzpiMTdcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCI0LjhcIn0se1wiQGlkXCI6XCJfOmIxOFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNy40MlwifSx7XCJAaWRcIjpcIl86YjE5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNVwifSx7XCJAaWRcIjpcIl86YjJcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjIuMDlcIn0se1wiQGlkXCI6XCJfOmIyMFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTIuNjBcIn0se1wiQGlkXCI6XCJfOmIyMVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjQuOFwifSx7XCJAaWRcIjpcIl86YjIyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCI4Ljc2XCJ9LHtcIkBpZFwiOlwiXzpiMjNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIxLjA1XCJ9LHtcIkBpZFwiOlwiXzpiMjRcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEzLjA1XCJ9LHtcIkBpZFwiOlwiXzpiMjVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCI0LjhcIn0se1wiQGlkXCI6XCJfOmIyNlwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNi43NlwifSx7XCJAaWRcIjpcIl86YjI3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiM1wifSx7XCJAaWRcIjpcIl86YjI4XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxNS45MFwifSx7XCJAaWRcIjpcIl86YjI5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTJcIn0se1wiQGlkXCI6XCJfOmIzXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC40XCJ9LHtcIkBpZFwiOlwiXzpiMzBcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiMzFcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMlwifSx7XCJAaWRcIjpcIl86YjMyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMVwifSx7XCJAaWRcIjpcIl86YjMzXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTBcIn0se1wiQGlkXCI6XCJfOmIzNFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmIzNVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEyXCJ9LHtcIkBpZFwiOlwiXzpiMzZcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiMzdcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCI2XCJ9LHtcIkBpZFwiOlwiXzpiMzhcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiMzlcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMlwifSx7XCJAaWRcIjpcIl86YjRcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEuMTlcIn0se1wiQGlkXCI6XCJfOmI0MFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI0MVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEwXCJ9LHtcIkBpZFwiOlwiXzpiNDJcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiNVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNVwifSx7XCJAaWRcIjpcIl86YjZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEuNjlcIn0se1wiQGlkXCI6XCJfOmI3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC40XCJ9LHtcIkBpZFwiOlwiXzpiOFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMS4zOVwifSx7XCJAaWRcIjpcIl86YjlcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjE3NVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmRlc2NyaXB0aW9uXCI6XCI8dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHIgc3R5bGU9XFxcImJvcmRlcjogMHB4O1xcXCI+XFxuPHRkIGJnY29sb3I9XFxcIiNkNmZiZWRcXFwiIHN0eWxlPVxcXCJjb2xvcjogIzAwMDAwMDsgYm9yZGVyOiAwcHg7XFxcIj48c3Ryb25nPlRoZXkncmUgYmFjayE8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxwPjxzdHJvbmc+VGhpbmsgYmFrZWQgYmVhbnMgYXJlIEJyaXRpc2g/IFRoZXkgYXJlIG5vdyEgV2UgdXNlIG9ubHkgQnJpdGlzaC1ncm93biBmYXZhIGJlYW5zIC0gQnJpdGFpbidzIG9yaWdpbmFsIGJlYW4sIGdyb3duIGhlcmUgc2luY2UgdGhlIElyb24gQWdlLiBPdXIgQmFrZWQgQnJpdGlzaCBCZWFucyBhcmUgZGVsaWNpb3VzbHkgZGlmZmVyZW50LCB3aXRoIGxhcmdlIG1lYXR5IGZhdmEgYmVhbnMgaW4gYSB0YXN0eSB0b21hdG8gc2F1Y2UuPC9zdHJvbmc+PC9wPlxcbjxwPjxzdHJvbmc+PGEgdGl0bGU9XFxcIldoYXQgYXJlIGZhdmEgYmVhbnM/IEFyZW4ndCB0aGV5IGp1c3QgYnJvYWQgYmVhbnM/XFxcIiBocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiIGRhdGEtbWNlLWZyYWdtZW50PVxcXCIxXFxcIiBkYXRhLW1jZS1ocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiPldoYXQgYXJlIGZhdmEgYmVhbnM/IEZpbmQgb3V0IGhlcmUuLi48L2E+PC9zdHJvbmc+PC9wPlxcbjwhLS0gc3BsaXQgLS0+PGgzPkNvbXBsZXRlIFByb2R1Y3QgRGV0YWlsczwvaDM+PHA+T3VyIEJha2VkIEJyaXRpc2ggQmVhbnMgYXJlIGNvb2tlZCBhbmQgcmVhZHkgdG8gZWF0LCBob3Qgb3IgY29sZC4gVGhleSdyZSBnb29kIHNlcnZlZCBvbiB0b2FzdCBidXQgYWxzbyBkZWxpY2lvdXMgYWRkZWQgdG8gc3Rld3MsIGN1cnJpZXMgb3IgY2Fzc2Vyb2xlcy4gT3IgZXZlbiBpbiBhIHBpZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPjxzdHJvbmc+Q29va2luZyBvbiB0aGUgSG9iPC9zdHJvbmc+PGJyPkVtcHR5IGNvbnRlbnRzIGludG8gc2F1Y2VwYW4uIEhlYXQgZ2VudGx5IGZvciA0LTUgbWludXRlcyB3aGlsZSBzdGlycmluZy4gRm9yIGJlc3QgZmxhdm91ciBkbyBub3QgYm9pbCBvciBvdmVyY29vay4gRG8gbm90IHJlaGVhdC48L3A+XFxuPHA+PHN0cm9uZz5NaWNyb3dhdmUgQ29va2luZzwvc3Ryb25nPjxicj5FbXB0eSBjb250ZW50cyBpbnRvIGEgbm9uLW1ldGFsbGljIGJvd2wgYW5kIGNvdmVyLiBIZWF0IGZvciAyIHRvIDMgbWludXRlcywgc3RpcnJpbmcgaGFsZndheS4gQ2hlY2sgdGhlIGZvb2QgaXMgaG90LCBzdGlyIHdlbGwgYW5kIHNlcnZlLiBEbyBub3QgcmVoZWF0LjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5UbyBTdG9yZTwvaDU+XFxuPHA+U3RvcmUgaW4gYSBjb29sLCBkcnkgcGxhY2UuIE9uY2Ugb3BlbmVkLCB0cmFuc2ZlciBjb250ZW50cyB0byBhIG5vbi1tZXRhbGxpYyBjb250YWluZXIsIGNvdmVyIHJlZnJpZ2VyYXRlIGFuZCB1c2Ugd2l0aCAyIGRheXMuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD5GYXZhIEJlYW5zIChCcm9hZCBCZWFucykgKDQyJSksIFdhdGVyLCBUb21hdG8gUHVyZWUsIFN1Z2FyLCBNb2RpZmllZCBNYWl6ZSBTdGFyY2gsIFNhbHQsIEhlcmJzICZhbXA7IFNwaWNlcywgQ29uY2VudHJhdGVkIExlbW9uIEp1aWNlPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPk5vIEFsbGVyZ2VuczwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+Mjkya0ogKDY5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4wLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjEwLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+NC42ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+NGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC42ZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHA+RGVsaWNpb3VzLCBudXRyaXRpb3VzIGFuZCBnb29kIGZvciB0aGUgc29pbCwgZmF2YSBiZWFucyBhcmUgYSB2YXJpZXR5IG9mIGJyb2FkIGJlYW4sIFZpY2lhIGZhYmEsIGxlZnQgdG8gcmlwZW4gYW5kIGRyeSBiZWZvcmUgaGFydmVzdC4gVGhleeKAmXJlIGFsc28ga25vd24gYXMgZmllbGQgYmVhbnMsIGhvcnNlIGJlYW5zLCBXaW5kc29yIGJlYW5zIG9yIGZ1bC48L3A+XFxuPHA+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnM8L3A+XFxuXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9QYWNrLUNhbi1CYWtlZC1CZWFucy0xODAweDZfOTgzeDY1Nl81MTM3NThlNi0yNjE2LTQ2ODctYThiMi1iYTZkZGU4NjQ5MjMuanBnP3Y9MTY3Nzc2MDc3OFwiLFwiZGZjLWI6bmFtZVwiOlwiQmFrZWQgQnJpdGlzaCBCZWFucyAtIFJldGFpbCBjYW4sIDQwMGcgKGNhbilcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQi9UNFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjJcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjI5XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjMwXCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwM1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwM1wiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0ciBzdHlsZT1cXFwiYm9yZGVyOiAwcHg7XFxcIj5cXG48dGQgYmdjb2xvcj1cXFwiI2Q2ZmJlZFxcXCIgc3R5bGU9XFxcImNvbG9yOiAjMDAwMDAwOyBib3JkZXI6IDBweDtcXFwiPjxzdHJvbmc+VGhleSdyZSBiYWNrITwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+XFxuPHA+PHN0cm9uZz5UaGluayBiYWtlZCBiZWFucyBhcmUgQnJpdGlzaD8gVGhleSBhcmUgbm93ISBXZSB1c2Ugb25seSBCcml0aXNoLWdyb3duIGZhdmEgYmVhbnMgLSBCcml0YWluJ3Mgb3JpZ2luYWwgYmVhbiwgZ3Jvd24gaGVyZSBzaW5jZSB0aGUgSXJvbiBBZ2UuIE91ciBCYWtlZCBCcml0aXNoIEJlYW5zIGFyZSBkZWxpY2lvdXNseSBkaWZmZXJlbnQsIHdpdGggbGFyZ2UgbWVhdHkgZmF2YSBiZWFucyBpbiBhIHRhc3R5IHRvbWF0byBzYXVjZS48L3N0cm9uZz48L3A+XFxuPHA+PHN0cm9uZz48YSB0aXRsZT1cXFwiV2hhdCBhcmUgZmF2YSBiZWFucz8gQXJlbid0IHRoZXkganVzdCBicm9hZCBiZWFucz9cXFwiIGhyZWY9XFxcIi9ibG9ncy9uZXdzL3doYXQtYXJlLWZhdmEtYmVhbnMtYXJlLXRoZXktanVzdC1icm9hZC1iZWFuc1xcXCIgZGF0YS1tY2UtZnJhZ21lbnQ9XFxcIjFcXFwiIGRhdGEtbWNlLWhyZWY9XFxcIi9ibG9ncy9uZXdzL3doYXQtYXJlLWZhdmEtYmVhbnMtYXJlLXRoZXktanVzdC1icm9hZC1iZWFuc1xcXCI+V2hhdCBhcmUgZmF2YSBiZWFucz8gRmluZCBvdXQgaGVyZS4uLjwvYT48L3N0cm9uZz48L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz48cD5PdXIgQmFrZWQgQnJpdGlzaCBCZWFucyBhcmUgY29va2VkIGFuZCByZWFkeSB0byBlYXQsIGhvdCBvciBjb2xkLiBUaGV5J3JlIGdvb2Qgc2VydmVkIG9uIHRvYXN0IGJ1dCBhbHNvIGRlbGljaW91cyBhZGRlZCB0byBzdGV3cywgY3VycmllcyBvciBjYXNzZXJvbGVzLiBPciBldmVuIGluIGEgcGllLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+PHN0cm9uZz5Db29raW5nIG9uIHRoZSBIb2I8L3N0cm9uZz48YnI+RW1wdHkgY29udGVudHMgaW50byBzYXVjZXBhbi4gSGVhdCBnZW50bHkgZm9yIDQtNSBtaW51dGVzIHdoaWxlIHN0aXJyaW5nLiBGb3IgYmVzdCBmbGF2b3VyIGRvIG5vdCBib2lsIG9yIG92ZXJjb29rLiBEbyBub3QgcmVoZWF0LjwvcD5cXG48cD48c3Ryb25nPk1pY3Jvd2F2ZSBDb29raW5nPC9zdHJvbmc+PGJyPkVtcHR5IGNvbnRlbnRzIGludG8gYSBub24tbWV0YWxsaWMgYm93bCBhbmQgY292ZXIuIEhlYXQgZm9yIDIgdG8gMyBtaW51dGVzLCBzdGlycmluZyBoYWxmd2F5LiBDaGVjayB0aGUgZm9vZCBpcyBob3QsIHN0aXIgd2VsbCBhbmQgc2VydmUuIERvIG5vdCByZWhlYXQuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPlRvIFN0b3JlPC9oNT5cXG48cD5TdG9yZSBpbiBhIGNvb2wsIGRyeSBwbGFjZS4gT25jZSBvcGVuZWQsIHRyYW5zZmVyIGNvbnRlbnRzIHRvIGEgbm9uLW1ldGFsbGljIGNvbnRhaW5lciwgY292ZXIgcmVmcmlnZXJhdGUgYW5kIHVzZSB3aXRoIDIgZGF5cy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPkZhdmEgQmVhbnMgKEJyb2FkIEJlYW5zKSAoNDIlKSwgV2F0ZXIsIFRvbWF0byBQdXJlZSwgU3VnYXIsIE1vZGlmaWVkIE1haXplIFN0YXJjaCwgU2FsdCwgSGVyYnMgJmFtcDsgU3BpY2VzLCBDb25jZW50cmF0ZWQgTGVtb24gSnVpY2U8L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Tm8gQWxsZXJnZW5zPC9wPlxcbjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0cj5cXG48dGQ+PHN0cm9uZz5UeXBpY2FsIHZhbHVlczwvc3Ryb25nPjwvdGQ+XFxuPHRkPjxzdHJvbmc+UGVyIDEwMGc8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5FbmVyZ3k8L3RkPlxcbjx0ZD4yOTJrSiAoNjlrY2FsKTwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZhdDwvdGQ+XFxuPHRkPjAuNGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzYXR1cmF0ZXM8L3RkPlxcbjx0ZD4wLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+Q2FyYm9oeWRyYXRlPC90ZD5cXG48dGQ+MTAuMWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzdWdhcnM8L3RkPlxcbjx0ZD40LjZnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmlicmU8L3RkPlxcbjx0ZD41ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlByb3RlaW48L3RkPlxcbjx0ZD40ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlNhbHQ8L3RkPlxcbjx0ZD4wLjZnPC90ZD5cXG48L3RyPlxcbjwvdGJvZHk+XFxuPC90YWJsZT48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Nb3JlPC9oNT5cXG48cD5EZWxpY2lvdXMsIG51dHJpdGlvdXMgYW5kIGdvb2QgZm9yIHRoZSBzb2lsLCBmYXZhIGJlYW5zIGFyZSBhIHZhcmlldHkgb2YgYnJvYWQgYmVhbiwgVmljaWEgZmFiYSwgbGVmdCB0byByaXBlbiBhbmQgZHJ5IGJlZm9yZSBoYXJ2ZXN0LiBUaGV54oCZcmUgYWxzbyBrbm93biBhcyBmaWVsZCBiZWFucywgaG9yc2UgYmVhbnMsIFdpbmRzb3IgYmVhbnMgb3IgZnVsLjwvcD5cXG48cD5TdWl0YWJsZSBmb3IgdmVnYW5zIGFuZCB2ZWdldGFyaWFuczwvcD5cXG5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxNVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9QYWNrLUNhbi1CYWtlZC1CZWFucy0xODAweDZfOTgzeDY1Nl81MTM3NThlNi0yNjE2LTQ2ODctYThiMi1iYTZkZGU4NjQ5MjMuanBnP3Y9MTY3Nzc2MDc3OFwiLFwiZGZjLWI6bmFtZVwiOlwiQmFrZWQgQnJpdGlzaCBCZWFucyAtIENhc2UsIDEyIHggNDAwZyAoY2FuKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwMy9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwMy9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOQ0JCL0NEXCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwMy9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiMTZcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0ciBzdHlsZT1cXFwiYm9yZGVyOiAwcHg7XFxcIj5cXG48dGQgYmdjb2xvcj1cXFwiI2Q2ZmJlZFxcXCIgc3R5bGU9XFxcImNvbG9yOiAjMDAwMDAwOyBib3JkZXI6IDBweDtcXFwiPjxzdHJvbmc+U29ycnksIHN0YW5kYXJkIGJhcmxleSBmbGFrZXMgYXJlIG5vIGxvbmdlciBhdmFpbGFibGUgYnV0IG91ciBkZWxpY2lvdXMgIE9yZ2FuaWMgTmFrZWQgQmFybGV5IEZsYWtlcyBhcmUgYmFjay48L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxwPk91ciByaWNoIGFuZCBtYWx0eSBiYXJsZXkgZmxha2VzIGFyZSBhIHN0b3JlIGN1cGJvYXJkIHN0YXBsZS4gT3JnYW5pY2FsbHkgZ3Jvd24gYW5kIG1pbGxlZCBpbiB0aGUgVUssIHRoZXkgYWRkIHRleHR1cmUgdG8gZmxhcGphY2sgYW5kIGJpc2N1aXQgcmVjaXBlcywgb3IgdG8gbWFrZSBhIGhlYXJ0aWVyLCBydXN0aWMgcG9ycmlkZ2Ug4oCTIHRyeSBibGVuZGluZyB3aXRoIG91ciBvdGhlciBmbGFrZXM8L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz48bGkgaWQ9XFxcInRhYjFcXFwiIGNsYXNzPVxcXCJhY3RpdmVcXFwiPlxcbjxwPkJhcmxleSBmbGFrZXMgYXJlIGdyZWF0IGFkZGVkIHRvIG11ZXNsaSBvciBncmFub2xhLCBvciB1c2VkIGluIGJha2luZyBhcyBhIHRvcHBpbmcgb3IgbWl4ZWQgaW50byBkb3VnaC4gRWF0IHRoZW0gYXMgYSBjZXJlYWwsIGJha2Ugd2l0aCB0aGVtLCBvciBhZGQgdGhlbSB0byBzb3VwcyBhbmQgc3Rld3MgdG8gdGhpY2tlbiwgYm9vc3QgdGhlaXIgbnV0cml0aW9uIGFuZCBhZGQgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPlRvIGVhdCBhcyBhIG11ZXNsaSwgY29tYmluZSB3aXRoIG90aGVyIGNlcmVhbCBmbGFrZXMgYW5kIGVuam95LiBPciB1c2UgYXMgYW4gb2F0IHN1YnN0aXR1dGUgaW4gYW55IGJha2luZyByZWNpcGUuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD48Yj5CYXJsZXnCoDwvYj5GbGFrZXM8L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Rm9yIGFsbGVyZ2VucywgaW5jbHVkaW5nIGNlcmVhbHMgY29udGFpbmluZyBnbHV0ZW4sIHNlZSBpbmdyZWRpZW50cyBpbiA8c3Ryb25nPmJvbGQ8L3N0cm9uZz48L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjEsNDAxa0ogKDMzMmtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+Mi4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD41OC4zZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjEuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjE3LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjExLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1Plxcbjx1bD5cXG48bGk+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnNcXG48L2xpPlxcbjxsaT5ObyBhcnRpZmljaWFsIGluZ3JlZGllbnRzXFxuPC9saT5cXG48bGk+R00gZnJlZVxcbjwvbGk+XFxuPGxpPkhpZ2ggRmlicmVcXG48L2xpPlxcbjwvdWw+XFxuPC9saT5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI1XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0JhcmxleS1GbGFrZXMtMjQwMHgxNjAwX2MxMjE0MDdjLTZmZDItNDZjYS1hMTI0LWRiNWRmOTQ0MjM2OC5qcGc/dj0xNjc3NzYwNzgxXCIsXCJkZmMtYjpuYW1lXCI6XCJCYXJsZXkgRmxha2VzLCBPcmdhbmljIC0gUmV0YWlsIHBhY2ssIDUwMGdcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiT0tCQVI1XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxL3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzRcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyIHN0eWxlPVxcXCJib3JkZXI6IDBweDtcXFwiPlxcbjx0ZCBiZ2NvbG9yPVxcXCIjZDZmYmVkXFxcIiBzdHlsZT1cXFwiY29sb3I6ICMwMDAwMDA7IGJvcmRlcjogMHB4O1xcXCI+PHN0cm9uZz5Tb3JyeSwgc3RhbmRhcmQgYmFybGV5IGZsYWtlcyBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZSBidXQgb3VyIGRlbGljaW91cyAgT3JnYW5pYyBOYWtlZCBCYXJsZXkgRmxha2VzIGFyZSBiYWNrLjwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PHA+T3VyIHJpY2ggYW5kIG1hbHR5IGJhcmxleSBmbGFrZXMgYXJlIGEgc3RvcmUgY3VwYm9hcmQgc3RhcGxlLiBPcmdhbmljYWxseSBncm93biBhbmQgbWlsbGVkIGluIHRoZSBVSywgdGhleSBhZGQgdGV4dHVyZSB0byBmbGFwamFjayBhbmQgYmlzY3VpdCByZWNpcGVzLCBvciB0byBtYWtlIGEgaGVhcnRpZXIsIHJ1c3RpYyBwb3JyaWRnZSDigJMgdHJ5IGJsZW5kaW5nIHdpdGggb3VyIG90aGVyIGZsYWtlczwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPjxsaSBpZD1cXFwidGFiMVxcXCIgY2xhc3M9XFxcImFjdGl2ZVxcXCI+XFxuPHA+QmFybGV5IGZsYWtlcyBhcmUgZ3JlYXQgYWRkZWQgdG8gbXVlc2xpIG9yIGdyYW5vbGEsIG9yIHVzZWQgaW4gYmFraW5nIGFzIGEgdG9wcGluZyBvciBtaXhlZCBpbnRvIGRvdWdoLiBFYXQgdGhlbSBhcyBhIGNlcmVhbCwgYmFrZSB3aXRoIHRoZW0sIG9yIGFkZCB0aGVtIHRvIHNvdXBzIGFuZCBzdGV3cyB0byB0aGlja2VuLCBib29zdCB0aGVpciBudXRyaXRpb24gYW5kIGFkZCBmbGF2b3VyLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+VG8gZWF0IGFzIGEgbXVlc2xpLCBjb21iaW5lIHdpdGggb3RoZXIgY2VyZWFsIGZsYWtlcyBhbmQgZW5qb3kuIE9yIHVzZSBhcyBhbiBvYXQgc3Vic3RpdHV0ZSBpbiBhbnkgYmFraW5nIHJlY2lwZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPjxiPkJhcmxlecKgPC9iPkZsYWtlczwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5Gb3IgYWxsZXJnZW5zLCBpbmNsdWRpbmcgY2VyZWFscyBjb250YWluaW5nIGdsdXRlbiwgc2VlIGluZ3JlZGllbnRzIGluIDxzdHJvbmc+Ym9sZDwvc3Ryb25nPjwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+MSw0MDFrSiAoMzMya2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4yLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjU4LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+MS43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+MTcuM2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+MTEuNGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHVsPlxcbjxsaT5TdWl0YWJsZSBmb3IgdmVnYW5zIGFuZCB2ZWdldGFyaWFuc1xcbjwvbGk+XFxuPGxpPk5vIGFydGlmaWNpYWwgaW5ncmVkaWVudHNcXG48L2xpPlxcbjxsaT5HTSBmcmVlXFxuPC9saT5cXG48bGk+SGlnaCBGaWJyZVxcbjwvbGk+XFxuPC91bD5cXG48L2xpPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjE5XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0JhcmxleS1GbGFrZXMtMjQwMHgxNjAwX2MxMjE0MDdjLTZmZDItNDZjYS1hMTI0LWRiNWRmOTQ0MjM2OC5qcGc/dj0xNjc3NzYwNzgxXCIsXCJkZmMtYjpuYW1lXCI6XCJCYXJsZXkgRmxha2VzLCBPcmdhbmljIC0gU3RhbmRhcmQgY2FzZSwgMTAgeCA1MDBnXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1NjU5MzkvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9LQkFDWFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1NjU5Mzkvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjIwXCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmRlc2NyaXB0aW9uXCI6XCI8cD48c3Ryb25nPkZlcm1lbnRlZCB3aG9sZWdyYWluIG5ha2VkIGJhcmxleSzCoHRhc3R5IGFuZCBzdWNjdWxlbnTCoGdyYWlucyBvZiByaWNoIG1hbHR5IHVtYW1pIGZsYXZvdXIuPC9zdHJvbmc+PC9wPlxcbjxwPlRoZXNlIHdob2xlIGZlcm1lbnRlZCBiYXJsZXnCoGdyYWlucyBhcmUgcGFja2VkIHdpdGggZGVlcCBmbGF2b3VyIGFuZCBtYWtlIGEgZGVsaWNpb3VzIGFkZGl0aW9uIHRvIGJyZWFkLCByaXNvdHRvLCBzdGV3cywgc2FsYWRzIGFuZCBtb3JlLjwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPlxcbjxwPkFkZCBpbnRlbnNlbHkgZmxhdm91cmVkIG1hbHR5IGFuZCBzdWNjdWxlbnQgZ3JhaW5zwqBmdWxsIG9mIHVtYW1pIHJpY2huZXNzIHRvIGJyZWFkcywgcmlzb3R0bywgc3Rld3MsIHNvdXBzLCBhbmQgZXZlbiBzYWxhZHMuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkNvb2tpbmcgaW5zdHJ1Y3Rpb25zPC9oNT5cXG48cD5BZGQgYWJvdXQgaGFsZiBhIHRlYXNwb29uIHBlciBzZXJ2aW5nIHRvIGFsbW9zdCBhbnkgZGlzaCBmb3IgYWRkZWQgZGVwdGgsIHVtYW1pIHJpY2huZXNzIGFuZCBtYWx0eSBmbGF2b3VyLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5UbyBzdG9yZTwvaDU+XFxuPHA+S2VlcCByZWZyaWdlcmF0ZWQgYW5kIHVzZSB3aXRoaW4gNCB3ZWVrcyBvZiBvcGVuaW5nLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5JbmdyZWRpZW50czwvaDU+XFxuPHA+TmFrZWQgPHN0cm9uZz5CYXJsZXk8L3N0cm9uZz4sIFdhdGVyLCA8c3Ryb25nPldoZWF0PC9zdHJvbmc+IEZsb3VyLCBTYWx0LCBMaXZlIEN1bHR1cmVzKjxicj4gKjxlbT5MYWN0b2JhY2lsbHVzIGRlbGJydWVja2lpPC9lbT4sIDxlbT5Bc3BlcmdpbGx1cyBzb2phZTwvZW0+LCA8ZW0+Wnlnb3NhY2NoYXJvbXljZXMgcm91eGlpPC9lbT48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Q29udGFpbnMgPHN0cm9uZz5CYXJsZXkgKEdsdXRlbik8L3N0cm9uZz4sPHN0cm9uZz4gV2hlYXQgKEdsdXRlbik8L3N0cm9uZz48L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjUwMGtKICgxMTlrY2FsKTwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZhdDwvdGQ+XFxuPHRkPjEuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzYXR1cmF0ZXM8L3RkPlxcbjx0ZD4wLjVnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+Q2FyYm9oeWRyYXRlPC90ZD5cXG48dGQ+MTkuMWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzdWdhcnM8L3RkPlxcbjx0ZD4yLjdnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmlicmU8L3RkPlxcbjx0ZD41LjJnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjQuMmc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+OC41ZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHA+T3VyIEZlcm1lbnRlZCBXaG9sZWdyYWluIE5ha2VkIEJhcmxleSBpcyBmZXJtZW50ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIG1hbnkgc295YSBmZXJtZW50cyB1c2VkIGZvciBibGFjayBiZWFucywgYnV0IHVzaW5nwqBuYWtlZCBiYXJsZXkgZ3JhaW4gaW5zdGVhZCBvZiBzb3kgYmVhbnMuIEl0J3MgbWFkZSB3aXRoIGp1c3QgbmFrZWQgYmFybGV5IGdyYWlucywgd2F0ZXIgYW5kIHNhbHQsIGZlcm1lbnRlZCB3aXRoIGEgbGl2ZSBjdWx0dXJlIG9mIDxlbT5MYWN0b2JhY2lsbHVzIGRlbGJydWVja2lpPC9lbT4sIDxlbT5Bc3BlcmdpbGx1cyBzb2phZTwvZW0+IGFuZCA8ZW0+Wnlnb3NhY2NoYXJvbXljZXMgcm91eGlpPC9lbT4uPC9wPlxcbjxwPlN1aXRhYmxlIGZvciB2ZWdhbnMuPC9wPlxcbjxwPlBhY2tlZCBpbiByZWN5Y2xhYmxlIGdsYXNzIGphciB3aXRoIG1ldGFsIGxpZC48L3A+XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiOVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9GZXJtZW50ZWQtV2hvbGVncmFpbi1OYWtlZC1CYXJsZXktU3Bvb24tMTYwMHgxMDAwX2Q2ZmVhMDkyLWZkZTQtNGE5OC1iZWM4LWJiM2NhMGExZmQ0ZC5qcGc/dj0xNjc3NzYwODYwXCIsXCJkZmMtYjpuYW1lXCI6XCJGZXJtZW50ZWQgTmFrZWQgQmFybGV5IC0gUmV0YWlsIGphciwgMTc1ZyAoamFyKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOTU5CL0pGXCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiMTBcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjM3XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjM4XCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4M1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4M1wiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjxwPjxzdHJvbmc+RmVybWVudGVkIHdob2xlZ3JhaW4gbmFrZWQgYmFybGV5LMKgdGFzdHkgYW5kIHN1Y2N1bGVudMKgZ3JhaW5zIG9mIHJpY2ggbWFsdHkgdW1hbWkgZmxhdm91ci48L3N0cm9uZz48L3A+XFxuPHA+VGhlc2Ugd2hvbGUgZmVybWVudGVkIGJhcmxlecKgZ3JhaW5zIGFyZSBwYWNrZWQgd2l0aCBkZWVwIGZsYXZvdXIgYW5kIG1ha2UgYSBkZWxpY2lvdXMgYWRkaXRpb24gdG8gYnJlYWQsIHJpc290dG8sIHN0ZXdzLCBzYWxhZHMgYW5kIG1vcmUuPC9wPlxcbjwhLS0gc3BsaXQgLS0+PGgzPkNvbXBsZXRlIFByb2R1Y3QgRGV0YWlsczwvaDM+XFxuPHA+QWRkIGludGVuc2VseSBmbGF2b3VyZWQgbWFsdHkgYW5kIHN1Y2N1bGVudCBncmFpbnPCoGZ1bGwgb2YgdW1hbWkgcmljaG5lc3MgdG8gYnJlYWRzLCByaXNvdHRvLCBzdGV3cywgc291cHMsIGFuZCBldmVuIHNhbGFkcy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPkFkZCBhYm91dCBoYWxmIGEgdGVhc3Bvb24gcGVyIHNlcnZpbmcgdG8gYWxtb3N0IGFueSBkaXNoIGZvciBhZGRlZCBkZXB0aCwgdW1hbWkgcmljaG5lc3MgYW5kIG1hbHR5IGZsYXZvdXIuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPlRvIHN0b3JlPC9oNT5cXG48cD5LZWVwIHJlZnJpZ2VyYXRlZCBhbmQgdXNlIHdpdGhpbiA0IHdlZWtzIG9mIG9wZW5pbmcuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD5OYWtlZCA8c3Ryb25nPkJhcmxleTwvc3Ryb25nPiwgV2F0ZXIsIDxzdHJvbmc+V2hlYXQ8L3N0cm9uZz4gRmxvdXIsIFNhbHQsIExpdmUgQ3VsdHVyZXMqPGJyPiAqPGVtPkxhY3RvYmFjaWxsdXMgZGVsYnJ1ZWNraWk8L2VtPiwgPGVtPkFzcGVyZ2lsbHVzIHNvamFlPC9lbT4sIDxlbT5aeWdvc2FjY2hhcm9teWNlcyByb3V4aWk8L2VtPjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5Db250YWlucyA8c3Ryb25nPkJhcmxleSAoR2x1dGVuKTwvc3Ryb25nPiw8c3Ryb25nPiBXaGVhdCAoR2x1dGVuKTwvc3Ryb25nPjwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+NTAwa0ogKDExOWtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+MS43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuNWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD4xOS4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjIuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjUuMmc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+NC4yZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlNhbHQ8L3RkPlxcbjx0ZD44LjVnPC90ZD5cXG48L3RyPlxcbjwvdGJvZHk+XFxuPC90YWJsZT48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Nb3JlPC9oNT5cXG48cD5PdXIgRmVybWVudGVkIFdob2xlZ3JhaW4gTmFrZWQgQmFybGV5IGlzIGZlcm1lbnRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgbWFueSBzb3lhIGZlcm1lbnRzIHVzZWQgZm9yIGJsYWNrIGJlYW5zLCBidXQgdXNpbmfCoG5ha2VkIGJhcmxleSBncmFpbiBpbnN0ZWFkIG9mIHNveSBiZWFucy4gSXQncyBtYWRlIHdpdGgganVzdCBuYWtlZCBiYXJsZXkgZ3JhaW5zLCB3YXRlciBhbmQgc2FsdCwgZmVybWVudGVkIHdpdGggYSBsaXZlIGN1bHR1cmUgb2YgPGVtPkxhY3RvYmFjaWxsdXMgZGVsYnJ1ZWNraWk8L2VtPiwgPGVtPkFzcGVyZ2lsbHVzIHNvamFlPC9lbT4gYW5kIDxlbT5aeWdvc2FjY2hhcm9teWNlcyByb3V4aWk8L2VtPi48L3A+XFxuPHA+U3VpdGFibGUgZm9yIHZlZ2Fucy48L3A+XFxuPHA+UGFja2VkIGluIHJlY3ljbGFibGUgZ2xhc3MgamFyIHdpdGggbWV0YWwgbGlkLjwvcD5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIyM1wiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9GZXJtZW50ZWQtV2hvbGVncmFpbi1OYWtlZC1CYXJsZXktU3Bvb24tMTYwMHgxMDAwX2Q2ZmVhMDkyLWZkZTQtNGE5OC1iZWM4LWJiM2NhMGExZmQ0ZC5qcGc/dj0xNjc3NzYwODYwXCIsXCJkZmMtYjpuYW1lXCI6XCJGZXJtZW50ZWQgTmFrZWQgQmFybGV5IC0gQ2FzZSwgNiB4IDE3NWcgKGphcilcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzODE2ODMvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzODE2ODMvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTk1OQi9DNlwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzODE2ODMvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjI0XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNDQ4NTFcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxN1wiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9QYWNrLUNhbi1CYWtlZC1CZWFucy0xODAweDZfYTRkNTg0NTktYmY1Mi00OGE5LWJhZTctODA3ZjQwMzViODdmLmpwZz92PTE2Nzc3NjA3NzdcIixcImRmYy1iOm5hbWVcIjpcIkJha2VkIEJyaXRpc2ggQmVhbnMgKFRvTCkgLSBDYXNlIC0gMTIgeCA0MDBnIGNhbnNcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNDQ4NTEvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNDQ4NTEvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQkNEXCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiMThcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjNcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvUGFjay1DYW4tQmFrZWQtQmVhbnMtMTgwMHg2X2E0ZDU4NDU5LWJmNTItNDhhOS1iYWU3LTgwN2Y0MDM1Yjg3Zi5qcGc/dj0xNjc3NzYwNzc3XCIsXCJkZmMtYjpuYW1lXCI6XCJCYWtlZCBCcml0aXNoIEJlYW5zIChUb0wpIC0gU2luZ2xlIC0gNDAwZyBjYW5cIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQlQ0XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIjIwXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzJcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3MjQ0ODUxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMjVcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvV2hvbGUtRmF2YS1CZWFucy1PcmdhbmljLUNhbm5lZF9mY2I2NGZkNy04Y2EzLTQ2NWEtOGY1Ni00NDNjZjI4ZTBiNzEuanBnP3Y9MTY3Nzc2MDk3N1wiLFwiZGZjLWI6bmFtZVwiOlwiT3JnYW5pYyBXaG9sZSBGYXZhIEJlYW5zIGluIFdhdGVyIChUb0wpIC0gQ2FzZSAtIDEyIHggNDAwZyBjYW5zXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg3ODQ5NDcvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DRkJDRFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg3ODQ5NDcvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjI2XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxMVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9XaG9sZS1GYXZhLUJlYW5zLU9yZ2FuaWMtQ2FubmVkX2ZjYjY0ZmQ3LThjYTMtNDY1YS04ZjU2LTQ0M2NmMjhlMGI3MS5qcGc/dj0xNjc3NzYwOTc3XCIsXCJkZmMtYjpuYW1lXCI6XCJPcmdhbmljIFdob2xlIEZhdmEgQmVhbnMgaW4gV2F0ZXIgKFRvTCkgLSBTaW5nbGUgLSA0MDBnIGNhblwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPQ0ZCVDRcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmIxMlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzlcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDBcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiN1wiLFwiZGZjLWI6bmFtZVwiOlwiQ2FybGluIFBlYXMgaW4gV2F0ZXIsIE9yZ2FuaWMgKERJU1RSSUJVVE9SKSAtIFJldGFpbCBjYW4gKDQwMGcgY2FuKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPQ0NQVDRcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI4XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6Y29uc3VtZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzVcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIzNVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIzNlwiLFwiZGZjLWI6cHJvZHVjZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3RyYW5zZm9ybWF0aW9uXCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkVHJhbnNmb3JtYXRpb25cIixcImRmYy1iOmhhc0luY29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpoYXNPdXRjb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIyMVwiLFwiZGZjLWI6bmFtZVwiOlwiQ2FybGluIFBlYXMgaW4gV2F0ZXIsIE9yZ2FuaWMgKERJU1RSSUJVVE9SKSAtIFN0YW5kYXJkIGNhc2UgKDEyIHggNDAwZyBjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DQ1BDRFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjIyXCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxM1wiLFwiZGZjLWI6bmFtZVwiOlwiUm9hc3RlZCBGYXZhIEJlYW5zLCBMaWdodGx5IFNlYSBTYWx0ZWQgKERJU1RSSUJVVE9SKSAtIFJldGFpbCBwYWNrICgzMDBnKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOUkZTUjNcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmIxNFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDJcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjMvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMjdcIixcImRmYy1iOm5hbWVcIjpcIlJvYXN0ZWQgRmF2YSBCZWFucywgTGlnaHRseSBTZWEgU2FsdGVkIChESVNUUklCVVRPUikgLSBTdGFuZGFyZCBjYXNlICgxMCB4IDMwMGcpXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5SRlNDWFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjI4XCJ9fV19IiwibGFzdElkIjoiODE0NzI5MjI1ODYxMSIsInJlbWFpbmluZ1Byb2R1Y3RzQ291bnRBZnRlciI6MCwic3VjY2VzcyI6dHJ1ZSwibWVzc2FnZSI6IlByb2R1Y3RzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkifQ==
+ recorded_at: Fri, 24 May 2024 06:13:50 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/FdcRequest/refreshes_the_access_token_and_retrieves_a_catalog.yml b/spec/fixtures/vcr_cassettes/FdcRequest/refreshes_the_access_token_and_retrieves_a_catalog.yml
new file mode 100644
index 00000000000..636e0616907
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/FdcRequest/refreshes_the_access_token_and_retrieves_a_catalog.yml
@@ -0,0 +1,206 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com
+ body:
+ encoding: UTF-8
+ string: '{"userId":"testdfc@protonmail.com","accessToken":null}'
+ headers:
+ Content-Type:
+ - application/json
+ Authorization:
+ - ""
+ User-Agent:
+ - Faraday v2.9.0
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 403
+ message: Forbidden
+ headers:
+ Server:
+ - Cowboy
+ Report-To:
+ - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716515324&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=QHSHL9RlLovwwwatlK4mrZMZ6powGfrf8MG7QDavBV4%3D"}]}'
+ Reporting-Endpoints:
+ - heroku-nel=https://nel.heroku.com/reports?ts=1716515324&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=QHSHL9RlLovwwwatlK4mrZMZ6powGfrf8MG7QDavBV4%3D
+ Nel:
+ - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}'
+ Connection:
+ - keep-alive
+ X-Powered-By:
+ - Express
+ Access-Control-Allow-Origin:
+ - "*"
+ Content-Type:
+ - application/json; charset=utf-8
+ Content-Length:
+ - '62'
+ Etag:
+ - W/"3e-3yNPCMU4MDQmKmieGPWfDcA/0Eg"
+ Date:
+ - Fri, 24 May 2024 01:48:44 GMT
+ Via:
+ - 1.1 vegur
+ body:
+ encoding: UTF-8
+ string: '{"message":"User access denied","error":"User not authorized"}'
+ recorded_at: Fri, 24 May 2024 01:48:44 GMT
+- request:
+ method: get
+ uri: https://login.lescommuns.org/auth/realms/data-food-consortium/.well-known/openid-configuration
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - SWD 2.0.3
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Fri, 24 May 2024 01:48:46 GMT
+ Content-Type:
+ - application/json;charset=UTF-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Vary:
+ - Accept-Encoding
+ Set-Cookie:
+ - AUTH_SESSION_ID=1716515327.317.9431.725800|6055218c9898cae39f8ffd531999e49a;
+ Path=/; Secure; HttpOnly
+ Cache-Control:
+ - no-cache, must-revalidate, no-transform, no-store
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Xss-Protection:
+ - 1; mode=block
+ body:
+ encoding: ASCII-8BIT
+ string: '{"issuer":"https://login.lescommuns.org/auth/realms/data-food-consortium","authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth","token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","end_session_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/logout","frontchannel_logout_session_supported":true,"frontchannel_logout_supported":true,"jwks_uri":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/certs","check_session_iframe":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/login-status-iframe.html","grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials","urn:openid:params:grant-type:ciba","urn:ietf:params:oauth:grant-type:device_code"],"acr_values_supported":["0","1"],"response_types_supported":["code","none","id_token","token","id_token
+ token","code id_token","code token","code id_token token"],"subject_types_supported":["public","pairwise"],"id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"id_token_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"id_token_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"userinfo_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"userinfo_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"request_object_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"request_object_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"request_object_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"response_modes_supported":["query","fragment","form_post","query.jwt","fragment.jwt","form_post.jwt","jwt"],"registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"token_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"introspection_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"introspection_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"authorization_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email","acr"],"claim_types_supported":["normal"],"claims_parameter_supported":true,"scopes_supported":["openid","microprofile-jwt","phone","roles","profile","email","address","web-origins","acr","offline_access"],"request_parameter_supported":true,"request_uri_parameter_supported":true,"require_request_uri_registration":true,"code_challenge_methods_supported":["plain","S256"],"tls_client_certificate_bound_access_tokens":true,"revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","revocation_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"revocation_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"backchannel_logout_supported":true,"backchannel_logout_session_supported":true,"device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","backchannel_token_delivery_modes_supported":["poll","ping"],"backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth","backchannel_authentication_request_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512"],"require_pushed_authorization_requests":false,"pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","mtls_endpoint_aliases":{"token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth"},"authorization_response_iss_parameter_supported":true}'
+ recorded_at: Fri, 24 May 2024 01:48:46 GMT
+- request:
+ method: post
+ uri: https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token
+ body:
+ encoding: UTF-8
+ string: grant_type=refresh_token&refresh_token=
+ headers:
+ User-Agent:
+ - Rack::OAuth2 (2.2.1)
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Fri, 24 May 2024 01:48:47 GMT
+ Content-Type:
+ - application/json
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Vary:
+ - Accept-Encoding
+ Set-Cookie:
+ - AUTH_SESSION_ID=1716515328.538.9431.297717|6055218c9898cae39f8ffd531999e49a;
+ Path=/; Secure; HttpOnly
+ Cache-Control:
+ - no-store
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=15724800; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Xss-Protection:
+ - 1; mode=block
+ body:
+ encoding: ASCII-8BIT
+ string: '{"access_token":"","expires_in":1800,"refresh_expires_in":31373710,"refresh_token":"","token_type":"Bearer","id_token":"","not-before-policy":0,"session_state":"cfaa4a60-c2aa-4590-9fdf-a117f23d564f","scope":"openid
+ profile email"}'
+ recorded_at: Fri, 24 May 2024 01:48:47 GMT
+- request:
+ method: post
+ uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com
+ body:
+ encoding: UTF-8
+ string: '{"userId":"testdfc@protonmail.com","accessToken":""}'
+ headers:
+ Content-Type:
+ - application/json
+ Authorization:
+ - ""
+ User-Agent:
+ - Faraday v2.9.0
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - Cowboy
+ Report-To:
+ - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716515329&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=db8%2Bqll%2F9ViX4tDoArQRI69fIFO5okGU%2F86h1whY9lM%3D"}]}'
+ Reporting-Endpoints:
+ - heroku-nel=https://nel.heroku.com/reports?ts=1716515329&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=db8%2Bqll%2F9ViX4tDoArQRI69fIFO5okGU%2F86h1whY9lM%3D
+ Nel:
+ - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}'
+ Connection:
+ - keep-alive
+ X-Powered-By:
+ - Express
+ Access-Control-Allow-Origin:
+ - "*"
+ Content-Type:
+ - application/json; charset=utf-8
+ Content-Length:
+ - '41179'
+ Etag:
+ - W/"a0db-ySojxiWOF5gtH86VVAw3VoRbZ/o"
+ Date:
+ - Fri, 24 May 2024 01:48:49 GMT
+ Via:
+ - 1.1 vegur
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJwcm9kdWN0cyI6IntcIkBjb250ZXh0XCI6XCJodHRwczovL3d3dy5kYXRhZm9vZGNvbnNvcnRpdW0ub3JnXCIsXCJAZ3JhcGhcIjpbe1wiQGlkXCI6XCJfOmI0M1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNFwifSx7XCJAaWRcIjpcIl86YjQ0XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIyLjA5XCJ9LHtcIkBpZFwiOlwiXzpiNDVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjRcIn0se1wiQGlkXCI6XCJfOmI0NlwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMS4xOVwifSx7XCJAaWRcIjpcIl86YjQ3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC41XCJ9LHtcIkBpZFwiOlwiXzpiNDhcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEuNjlcIn0se1wiQGlkXCI6XCJfOmI0OVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNFwifSx7XCJAaWRcIjpcIl86YjUwXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxLjM5XCJ9LHtcIkBpZFwiOlwiXzpiNTFcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjE3NVwifSx7XCJAaWRcIjpcIl86YjUyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIyLjg5XCJ9LHtcIkBpZFwiOlwiXzpiNTNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjRcIn0se1wiQGlkXCI6XCJfOmI1NFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC45OVwifSx7XCJAaWRcIjpcIl86YjU1XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC4zXCJ9LHtcIkBpZFwiOlwiXzpiNTZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjIuOTlcIn0se1wiQGlkXCI6XCJfOmI1N1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjQuOFwifSx7XCJAaWRcIjpcIl86YjU4XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxOC44NVwifSx7XCJAaWRcIjpcIl86YjU5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNC44XCJ9LHtcIkBpZFwiOlwiXzpiNjBcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjcuNDJcIn0se1wiQGlkXCI6XCJfOmI2MVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjVcIn0se1wiQGlkXCI6XCJfOmI2MlwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTIuNjBcIn0se1wiQGlkXCI6XCJfOmI2M1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjQuOFwifSx7XCJAaWRcIjpcIl86YjY0XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCI4Ljc2XCJ9LHtcIkBpZFwiOlwiXzpiNjVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIxLjA1XCJ9LHtcIkBpZFwiOlwiXzpiNjZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEzLjA1XCJ9LHtcIkBpZFwiOlwiXzpiNjdcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCI0LjhcIn0se1wiQGlkXCI6XCJfOmI2OFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNi43NlwifSx7XCJAaWRcIjpcIl86YjY5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiM1wifSx7XCJAaWRcIjpcIl86YjcwXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxNS45MFwifSx7XCJAaWRcIjpcIl86YjcxXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTJcIn0se1wiQGlkXCI6XCJfOmI3MlwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI3M1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEyXCJ9LHtcIkBpZFwiOlwiXzpiNzRcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiNzVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMFwifSx7XCJAaWRcIjpcIl86Yjc2XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMVwifSx7XCJAaWRcIjpcIl86Yjc3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTJcIn0se1wiQGlkXCI6XCJfOmI3OFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI3OVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjZcIn0se1wiQGlkXCI6XCJfOmI4MFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI4MVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEyXCJ9LHtcIkBpZFwiOlwiXzpiODJcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiODNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMFwifSx7XCJAaWRcIjpcIl86Yjg0XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmRlc2NyaXB0aW9uXCI6XCI8dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHIgc3R5bGU9XFxcImJvcmRlcjogMHB4O1xcXCI+XFxuPHRkIGJnY29sb3I9XFxcIiNkNmZiZWRcXFwiIHN0eWxlPVxcXCJjb2xvcjogIzAwMDAwMDsgYm9yZGVyOiAwcHg7XFxcIj48c3Ryb25nPlRoZXkncmUgYmFjayE8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxwPjxzdHJvbmc+VGhpbmsgYmFrZWQgYmVhbnMgYXJlIEJyaXRpc2g/IFRoZXkgYXJlIG5vdyEgV2UgdXNlIG9ubHkgQnJpdGlzaC1ncm93biBmYXZhIGJlYW5zIC0gQnJpdGFpbidzIG9yaWdpbmFsIGJlYW4sIGdyb3duIGhlcmUgc2luY2UgdGhlIElyb24gQWdlLiBPdXIgQmFrZWQgQnJpdGlzaCBCZWFucyBhcmUgZGVsaWNpb3VzbHkgZGlmZmVyZW50LCB3aXRoIGxhcmdlIG1lYXR5IGZhdmEgYmVhbnMgaW4gYSB0YXN0eSB0b21hdG8gc2F1Y2UuPC9zdHJvbmc+PC9wPlxcbjxwPjxzdHJvbmc+PGEgdGl0bGU9XFxcIldoYXQgYXJlIGZhdmEgYmVhbnM/IEFyZW4ndCB0aGV5IGp1c3QgYnJvYWQgYmVhbnM/XFxcIiBocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiIGRhdGEtbWNlLWZyYWdtZW50PVxcXCIxXFxcIiBkYXRhLW1jZS1ocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiPldoYXQgYXJlIGZhdmEgYmVhbnM/IEZpbmQgb3V0IGhlcmUuLi48L2E+PC9zdHJvbmc+PC9wPlxcbjwhLS0gc3BsaXQgLS0+PGgzPkNvbXBsZXRlIFByb2R1Y3QgRGV0YWlsczwvaDM+PHA+T3VyIEJha2VkIEJyaXRpc2ggQmVhbnMgYXJlIGNvb2tlZCBhbmQgcmVhZHkgdG8gZWF0LCBob3Qgb3IgY29sZC4gVGhleSdyZSBnb29kIHNlcnZlZCBvbiB0b2FzdCBidXQgYWxzbyBkZWxpY2lvdXMgYWRkZWQgdG8gc3Rld3MsIGN1cnJpZXMgb3IgY2Fzc2Vyb2xlcy4gT3IgZXZlbiBpbiBhIHBpZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPjxzdHJvbmc+Q29va2luZyBvbiB0aGUgSG9iPC9zdHJvbmc+PGJyPkVtcHR5IGNvbnRlbnRzIGludG8gc2F1Y2VwYW4uIEhlYXQgZ2VudGx5IGZvciA0LTUgbWludXRlcyB3aGlsZSBzdGlycmluZy4gRm9yIGJlc3QgZmxhdm91ciBkbyBub3QgYm9pbCBvciBvdmVyY29vay4gRG8gbm90IHJlaGVhdC48L3A+XFxuPHA+PHN0cm9uZz5NaWNyb3dhdmUgQ29va2luZzwvc3Ryb25nPjxicj5FbXB0eSBjb250ZW50cyBpbnRvIGEgbm9uLW1ldGFsbGljIGJvd2wgYW5kIGNvdmVyLiBIZWF0IGZvciAyIHRvIDMgbWludXRlcywgc3RpcnJpbmcgaGFsZndheS4gQ2hlY2sgdGhlIGZvb2QgaXMgaG90LCBzdGlyIHdlbGwgYW5kIHNlcnZlLiBEbyBub3QgcmVoZWF0LjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5UbyBTdG9yZTwvaDU+XFxuPHA+U3RvcmUgaW4gYSBjb29sLCBkcnkgcGxhY2UuIE9uY2Ugb3BlbmVkLCB0cmFuc2ZlciBjb250ZW50cyB0byBhIG5vbi1tZXRhbGxpYyBjb250YWluZXIsIGNvdmVyIHJlZnJpZ2VyYXRlIGFuZCB1c2Ugd2l0aCAyIGRheXMuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD5GYXZhIEJlYW5zIChCcm9hZCBCZWFucykgKDQyJSksIFdhdGVyLCBUb21hdG8gUHVyZWUsIFN1Z2FyLCBNb2RpZmllZCBNYWl6ZSBTdGFyY2gsIFNhbHQsIEhlcmJzICZhbXA7IFNwaWNlcywgQ29uY2VudHJhdGVkIExlbW9uIEp1aWNlPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPk5vIEFsbGVyZ2VuczwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+Mjkya0ogKDY5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4wLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjEwLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+NC42ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+NGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC42ZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHA+RGVsaWNpb3VzLCBudXRyaXRpb3VzIGFuZCBnb29kIGZvciB0aGUgc29pbCwgZmF2YSBiZWFucyBhcmUgYSB2YXJpZXR5IG9mIGJyb2FkIGJlYW4sIFZpY2lhIGZhYmEsIGxlZnQgdG8gcmlwZW4gYW5kIGRyeSBiZWZvcmUgaGFydmVzdC4gVGhleeKAmXJlIGFsc28ga25vd24gYXMgZmllbGQgYmVhbnMsIGhvcnNlIGJlYW5zLCBXaW5kc29yIGJlYW5zIG9yIGZ1bC48L3A+XFxuPHA+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnM8L3A+XFxuXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDNcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvUGFjay1DYW4tQmFrZWQtQmVhbnMtMTgwMHg2Xzk4M3g2NTZfNTEzNzU4ZTYtMjYxNi00Njg3LWE4YjItYmE2ZGRlODY0OTIzLmpwZz92PTE2Nzc3NjA3NzhcIixcImRmYy1iOm5hbWVcIjpcIkJha2VkIEJyaXRpc2ggQmVhbnMgLSBSZXRhaWwgY2FuLCA0MDBnIChjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5DQkIvVDRcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI0NFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNzFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNzJcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyIHN0eWxlPVxcXCJib3JkZXI6IDBweDtcXFwiPlxcbjx0ZCBiZ2NvbG9yPVxcXCIjZDZmYmVkXFxcIiBzdHlsZT1cXFwiY29sb3I6ICMwMDAwMDA7IGJvcmRlcjogMHB4O1xcXCI+PHN0cm9uZz5UaGV5J3JlIGJhY2shPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjwvdGJvZHk+XFxuPC90YWJsZT5cXG48cD48c3Ryb25nPlRoaW5rIGJha2VkIGJlYW5zIGFyZSBCcml0aXNoPyBUaGV5IGFyZSBub3chIFdlIHVzZSBvbmx5IEJyaXRpc2gtZ3Jvd24gZmF2YSBiZWFucyAtIEJyaXRhaW4ncyBvcmlnaW5hbCBiZWFuLCBncm93biBoZXJlIHNpbmNlIHRoZSBJcm9uIEFnZS4gT3VyIEJha2VkIEJyaXRpc2ggQmVhbnMgYXJlIGRlbGljaW91c2x5IGRpZmZlcmVudCwgd2l0aCBsYXJnZSBtZWF0eSBmYXZhIGJlYW5zIGluIGEgdGFzdHkgdG9tYXRvIHNhdWNlLjwvc3Ryb25nPjwvcD5cXG48cD48c3Ryb25nPjxhIHRpdGxlPVxcXCJXaGF0IGFyZSBmYXZhIGJlYW5zPyBBcmVuJ3QgdGhleSBqdXN0IGJyb2FkIGJlYW5zP1xcXCIgaHJlZj1cXFwiL2Jsb2dzL25ld3Mvd2hhdC1hcmUtZmF2YS1iZWFucy1hcmUtdGhleS1qdXN0LWJyb2FkLWJlYW5zXFxcIiBkYXRhLW1jZS1mcmFnbWVudD1cXFwiMVxcXCIgZGF0YS1tY2UtaHJlZj1cXFwiL2Jsb2dzL25ld3Mvd2hhdC1hcmUtZmF2YS1iZWFucy1hcmUtdGhleS1qdXN0LWJyb2FkLWJlYW5zXFxcIj5XaGF0IGFyZSBmYXZhIGJlYW5zPyBGaW5kIG91dCBoZXJlLi4uPC9hPjwvc3Ryb25nPjwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPjxwPk91ciBCYWtlZCBCcml0aXNoIEJlYW5zIGFyZSBjb29rZWQgYW5kIHJlYWR5IHRvIGVhdCwgaG90IG9yIGNvbGQuIFRoZXkncmUgZ29vZCBzZXJ2ZWQgb24gdG9hc3QgYnV0IGFsc28gZGVsaWNpb3VzIGFkZGVkIHRvIHN0ZXdzLCBjdXJyaWVzIG9yIGNhc3Nlcm9sZXMuIE9yIGV2ZW4gaW4gYSBwaWUuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkNvb2tpbmcgaW5zdHJ1Y3Rpb25zPC9oNT5cXG48cD48c3Ryb25nPkNvb2tpbmcgb24gdGhlIEhvYjwvc3Ryb25nPjxicj5FbXB0eSBjb250ZW50cyBpbnRvIHNhdWNlcGFuLiBIZWF0IGdlbnRseSBmb3IgNC01IG1pbnV0ZXMgd2hpbGUgc3RpcnJpbmcuIEZvciBiZXN0IGZsYXZvdXIgZG8gbm90IGJvaWwgb3Igb3ZlcmNvb2suIERvIG5vdCByZWhlYXQuPC9wPlxcbjxwPjxzdHJvbmc+TWljcm93YXZlIENvb2tpbmc8L3N0cm9uZz48YnI+RW1wdHkgY29udGVudHMgaW50byBhIG5vbi1tZXRhbGxpYyBib3dsIGFuZCBjb3Zlci4gSGVhdCBmb3IgMiB0byAzIG1pbnV0ZXMsIHN0aXJyaW5nIGhhbGZ3YXkuIENoZWNrIHRoZSBmb29kIGlzIGhvdCwgc3RpciB3ZWxsIGFuZCBzZXJ2ZS4gRG8gbm90IHJlaGVhdC48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+VG8gU3RvcmU8L2g1PlxcbjxwPlN0b3JlIGluIGEgY29vbCwgZHJ5IHBsYWNlLiBPbmNlIG9wZW5lZCwgdHJhbnNmZXIgY29udGVudHMgdG8gYSBub24tbWV0YWxsaWMgY29udGFpbmVyLCBjb3ZlciByZWZyaWdlcmF0ZSBhbmQgdXNlIHdpdGggMiBkYXlzLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5JbmdyZWRpZW50czwvaDU+XFxuPHA+RmF2YSBCZWFucyAoQnJvYWQgQmVhbnMpICg0MiUpLCBXYXRlciwgVG9tYXRvIFB1cmVlLCBTdWdhciwgTW9kaWZpZWQgTWFpemUgU3RhcmNoLCBTYWx0LCBIZXJicyAmYW1wOyBTcGljZXMsIENvbmNlbnRyYXRlZCBMZW1vbiBKdWljZTwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5ObyBBbGxlcmdlbnM8L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjI5MmtKICg2OWtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+MC40ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuMWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD4xMC4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjQuNmc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjVnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjAuNmc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1PlxcbjxwPkRlbGljaW91cywgbnV0cml0aW91cyBhbmQgZ29vZCBmb3IgdGhlIHNvaWwsIGZhdmEgYmVhbnMgYXJlIGEgdmFyaWV0eSBvZiBicm9hZCBiZWFuLCBWaWNpYSBmYWJhLCBsZWZ0IHRvIHJpcGVuIGFuZCBkcnkgYmVmb3JlIGhhcnZlc3QuIFRoZXnigJlyZSBhbHNvIGtub3duIGFzIGZpZWxkIGJlYW5zLCBob3JzZSBiZWFucywgV2luZHNvciBiZWFucyBvciBmdWwuPC9wPlxcbjxwPlN1aXRhYmxlIGZvciB2ZWdhbnMgYW5kIHZlZ2V0YXJpYW5zPC9wPlxcblwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjU3XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL1BhY2stQ2FuLUJha2VkLUJlYW5zLTE4MDB4Nl85ODN4NjU2XzUxMzc1OGU2LTI2MTYtNDY4Ny1hOGIyLWJhNmRkZTg2NDkyMy5qcGc/dj0xNjc3NzYwNzc4XCIsXCJkZmMtYjpuYW1lXCI6XCJCYWtlZCBCcml0aXNoIEJlYW5zIC0gQ2FzZSwgMTIgeCA0MDBnIChjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MDA0MDMvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5DQkIvQ0RcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI1OFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyIHN0eWxlPVxcXCJib3JkZXI6IDBweDtcXFwiPlxcbjx0ZCBiZ2NvbG9yPVxcXCIjZDZmYmVkXFxcIiBzdHlsZT1cXFwiY29sb3I6ICMwMDAwMDA7IGJvcmRlcjogMHB4O1xcXCI+PHN0cm9uZz5Tb3JyeSwgc3RhbmRhcmQgYmFybGV5IGZsYWtlcyBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZSBidXQgb3VyIGRlbGljaW91cyAgT3JnYW5pYyBOYWtlZCBCYXJsZXkgRmxha2VzIGFyZSBiYWNrLjwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PHA+T3VyIHJpY2ggYW5kIG1hbHR5IGJhcmxleSBmbGFrZXMgYXJlIGEgc3RvcmUgY3VwYm9hcmQgc3RhcGxlLiBPcmdhbmljYWxseSBncm93biBhbmQgbWlsbGVkIGluIHRoZSBVSywgdGhleSBhZGQgdGV4dHVyZSB0byBmbGFwamFjayBhbmQgYmlzY3VpdCByZWNpcGVzLCBvciB0byBtYWtlIGEgaGVhcnRpZXIsIHJ1c3RpYyBwb3JyaWRnZSDigJMgdHJ5IGJsZW5kaW5nIHdpdGggb3VyIG90aGVyIGZsYWtlczwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPjxsaSBpZD1cXFwidGFiMVxcXCIgY2xhc3M9XFxcImFjdGl2ZVxcXCI+XFxuPHA+QmFybGV5IGZsYWtlcyBhcmUgZ3JlYXQgYWRkZWQgdG8gbXVlc2xpIG9yIGdyYW5vbGEsIG9yIHVzZWQgaW4gYmFraW5nIGFzIGEgdG9wcGluZyBvciBtaXhlZCBpbnRvIGRvdWdoLiBFYXQgdGhlbSBhcyBhIGNlcmVhbCwgYmFrZSB3aXRoIHRoZW0sIG9yIGFkZCB0aGVtIHRvIHNvdXBzIGFuZCBzdGV3cyB0byB0aGlja2VuLCBib29zdCB0aGVpciBudXRyaXRpb24gYW5kIGFkZCBmbGF2b3VyLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+VG8gZWF0IGFzIGEgbXVlc2xpLCBjb21iaW5lIHdpdGggb3RoZXIgY2VyZWFsIGZsYWtlcyBhbmQgZW5qb3kuIE9yIHVzZSBhcyBhbiBvYXQgc3Vic3RpdHV0ZSBpbiBhbnkgYmFraW5nIHJlY2lwZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPjxiPkJhcmxlecKgPC9iPkZsYWtlczwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5Gb3IgYWxsZXJnZW5zLCBpbmNsdWRpbmcgY2VyZWFscyBjb250YWluaW5nIGdsdXRlbiwgc2VlIGluZ3JlZGllbnRzIGluIDxzdHJvbmc+Ym9sZDwvc3Ryb25nPjwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+MSw0MDFrSiAoMzMya2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4yLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjU4LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+MS43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+MTcuM2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+MTEuNGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHVsPlxcbjxsaT5TdWl0YWJsZSBmb3IgdmVnYW5zIGFuZCB2ZWdldGFyaWFuc1xcbjwvbGk+XFxuPGxpPk5vIGFydGlmaWNpYWwgaW5ncmVkaWVudHNcXG48L2xpPlxcbjxsaT5HTSBmcmVlXFxuPC9saT5cXG48bGk+SGlnaCBGaWJyZVxcbjwvbGk+XFxuPC91bD5cXG48L2xpPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjQ3XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0JhcmxleS1GbGFrZXMtMjQwMHgxNjAwX2MxMjE0MDdjLTZmZDItNDZjYS1hMTI0LWRiNWRmOTQ0MjM2OC5qcGc/dj0xNjc3NzYwNzgxXCIsXCJkZmMtYjpuYW1lXCI6XCJCYXJsZXkgRmxha2VzLCBPcmdhbmljIC0gUmV0YWlsIHBhY2ssIDUwMGdcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiT0tCQVI1XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNDhcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86Yjc1XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86Yjc2XCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0ciBzdHlsZT1cXFwiYm9yZGVyOiAwcHg7XFxcIj5cXG48dGQgYmdjb2xvcj1cXFwiI2Q2ZmJlZFxcXCIgc3R5bGU9XFxcImNvbG9yOiAjMDAwMDAwOyBib3JkZXI6IDBweDtcXFwiPjxzdHJvbmc+U29ycnksIHN0YW5kYXJkIGJhcmxleSBmbGFrZXMgYXJlIG5vIGxvbmdlciBhdmFpbGFibGUgYnV0IG91ciBkZWxpY2lvdXMgIE9yZ2FuaWMgTmFrZWQgQmFybGV5IEZsYWtlcyBhcmUgYmFjay48L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxwPk91ciByaWNoIGFuZCBtYWx0eSBiYXJsZXkgZmxha2VzIGFyZSBhIHN0b3JlIGN1cGJvYXJkIHN0YXBsZS4gT3JnYW5pY2FsbHkgZ3Jvd24gYW5kIG1pbGxlZCBpbiB0aGUgVUssIHRoZXkgYWRkIHRleHR1cmUgdG8gZmxhcGphY2sgYW5kIGJpc2N1aXQgcmVjaXBlcywgb3IgdG8gbWFrZSBhIGhlYXJ0aWVyLCBydXN0aWMgcG9ycmlkZ2Ug4oCTIHRyeSBibGVuZGluZyB3aXRoIG91ciBvdGhlciBmbGFrZXM8L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz48bGkgaWQ9XFxcInRhYjFcXFwiIGNsYXNzPVxcXCJhY3RpdmVcXFwiPlxcbjxwPkJhcmxleSBmbGFrZXMgYXJlIGdyZWF0IGFkZGVkIHRvIG11ZXNsaSBvciBncmFub2xhLCBvciB1c2VkIGluIGJha2luZyBhcyBhIHRvcHBpbmcgb3IgbWl4ZWQgaW50byBkb3VnaC4gRWF0IHRoZW0gYXMgYSBjZXJlYWwsIGJha2Ugd2l0aCB0aGVtLCBvciBhZGQgdGhlbSB0byBzb3VwcyBhbmQgc3Rld3MgdG8gdGhpY2tlbiwgYm9vc3QgdGhlaXIgbnV0cml0aW9uIGFuZCBhZGQgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPlRvIGVhdCBhcyBhIG11ZXNsaSwgY29tYmluZSB3aXRoIG90aGVyIGNlcmVhbCBmbGFrZXMgYW5kIGVuam95LiBPciB1c2UgYXMgYW4gb2F0IHN1YnN0aXR1dGUgaW4gYW55IGJha2luZyByZWNpcGUuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD48Yj5CYXJsZXnCoDwvYj5GbGFrZXM8L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Rm9yIGFsbGVyZ2VucywgaW5jbHVkaW5nIGNlcmVhbHMgY29udGFpbmluZyBnbHV0ZW4sIHNlZSBpbmdyZWRpZW50cyBpbiA8c3Ryb25nPmJvbGQ8L3N0cm9uZz48L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjEsNDAxa0ogKDMzMmtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+Mi4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD41OC4zZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjEuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjE3LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjExLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1Plxcbjx1bD5cXG48bGk+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnNcXG48L2xpPlxcbjxsaT5ObyBhcnRpZmljaWFsIGluZ3JlZGllbnRzXFxuPC9saT5cXG48bGk+R00gZnJlZVxcbjwvbGk+XFxuPGxpPkhpZ2ggRmlicmVcXG48L2xpPlxcbjwvdWw+XFxuPC9saT5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI2MVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9CYXJsZXktRmxha2VzLTI0MDB4MTYwMF9jMTIxNDA3Yy02ZmQyLTQ2Y2EtYTEyNC1kYjVkZjk0NDIzNjguanBnP3Y9MTY3Nzc2MDc4MVwiLFwiZGZjLWI6bmFtZVwiOlwiQmFybGV5IEZsYWtlcywgT3JnYW5pYyAtIFN0YW5kYXJkIGNhc2UsIDEwIHggNTAwZ1wiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPS0JBQ1hcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI2MlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHA+PHN0cm9uZz5GZXJtZW50ZWQgd2hvbGVncmFpbiBuYWtlZCBiYXJsZXkswqB0YXN0eSBhbmQgc3VjY3VsZW50wqBncmFpbnMgb2YgcmljaCBtYWx0eSB1bWFtaSBmbGF2b3VyLjwvc3Ryb25nPjwvcD5cXG48cD5UaGVzZSB3aG9sZSBmZXJtZW50ZWQgYmFybGV5wqBncmFpbnMgYXJlIHBhY2tlZCB3aXRoIGRlZXAgZmxhdm91ciBhbmQgbWFrZSBhIGRlbGljaW91cyBhZGRpdGlvbiB0byBicmVhZCwgcmlzb3R0bywgc3Rld3MsIHNhbGFkcyBhbmQgbW9yZS48L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz5cXG48cD5BZGQgaW50ZW5zZWx5IGZsYXZvdXJlZCBtYWx0eSBhbmQgc3VjY3VsZW50IGdyYWluc8KgZnVsbCBvZiB1bWFtaSByaWNobmVzcyB0byBicmVhZHMsIHJpc290dG8sIHN0ZXdzLCBzb3VwcywgYW5kIGV2ZW4gc2FsYWRzLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+QWRkIGFib3V0IGhhbGYgYSB0ZWFzcG9vbiBwZXIgc2VydmluZyB0byBhbG1vc3QgYW55IGRpc2ggZm9yIGFkZGVkIGRlcHRoLCB1bWFtaSByaWNobmVzcyBhbmQgbWFsdHkgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+VG8gc3RvcmU8L2g1PlxcbjxwPktlZXAgcmVmcmlnZXJhdGVkIGFuZCB1c2Ugd2l0aGluIDQgd2Vla3Mgb2Ygb3BlbmluZy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPk5ha2VkIDxzdHJvbmc+QmFybGV5PC9zdHJvbmc+LCBXYXRlciwgPHN0cm9uZz5XaGVhdDwvc3Ryb25nPiBGbG91ciwgU2FsdCwgTGl2ZSBDdWx0dXJlcyo8YnI+ICo8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiwgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+PC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPkNvbnRhaW5zIDxzdHJvbmc+QmFybGV5IChHbHV0ZW4pPC9zdHJvbmc+LDxzdHJvbmc+IFdoZWF0IChHbHV0ZW4pPC9zdHJvbmc+PC9wPlxcbjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0cj5cXG48dGQ+PHN0cm9uZz5UeXBpY2FsIHZhbHVlczwvc3Ryb25nPjwvdGQ+XFxuPHRkPjxzdHJvbmc+UGVyIDEwMGc8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5FbmVyZ3k8L3RkPlxcbjx0ZD41MDBrSiAoMTE5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4xLjdnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC41ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjE5LjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+Mi43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NS4yZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlByb3RlaW48L3RkPlxcbjx0ZD40LjJnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjguNWc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1PlxcbjxwPk91ciBGZXJtZW50ZWQgV2hvbGVncmFpbiBOYWtlZCBCYXJsZXkgaXMgZmVybWVudGVkIGluIHRoZSBzYW1lIHdheSBhcyBtYW55IHNveWEgZmVybWVudHMgdXNlZCBmb3IgYmxhY2sgYmVhbnMsIGJ1dCB1c2luZ8KgbmFrZWQgYmFybGV5IGdyYWluIGluc3RlYWQgb2Ygc295IGJlYW5zLiBJdCdzIG1hZGUgd2l0aCBqdXN0IG5ha2VkIGJhcmxleSBncmFpbnMsIHdhdGVyIGFuZCBzYWx0LCBmZXJtZW50ZWQgd2l0aCBhIGxpdmUgY3VsdHVyZSBvZiA8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiBhbmQgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+LjwvcD5cXG48cD5TdWl0YWJsZSBmb3IgdmVnYW5zLjwvcD5cXG48cD5QYWNrZWQgaW4gcmVjeWNsYWJsZSBnbGFzcyBqYXIgd2l0aCBtZXRhbCBsaWQuPC9wPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjUxXCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0Zlcm1lbnRlZC1XaG9sZWdyYWluLU5ha2VkLUJhcmxleS1TcG9vbi0xNjAweDEwMDBfZDZmZWEwOTItZmRlNC00YTk4LWJlYzgtYmIzY2EwYTFmZDRkLmpwZz92PTE2Nzc3NjA4NjBcIixcImRmYy1iOm5hbWVcIjpcIkZlcm1lbnRlZCBOYWtlZCBCYXJsZXkgLSBSZXRhaWwgamFyLCAxNzVnIChqYXIpXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5NTkIvSkZcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI1MlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNzlcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiODBcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzgxNjgzXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzgxNjgzXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHA+PHN0cm9uZz5GZXJtZW50ZWQgd2hvbGVncmFpbiBuYWtlZCBiYXJsZXkswqB0YXN0eSBhbmQgc3VjY3VsZW50wqBncmFpbnMgb2YgcmljaCBtYWx0eSB1bWFtaSBmbGF2b3VyLjwvc3Ryb25nPjwvcD5cXG48cD5UaGVzZSB3aG9sZSBmZXJtZW50ZWQgYmFybGV5wqBncmFpbnMgYXJlIHBhY2tlZCB3aXRoIGRlZXAgZmxhdm91ciBhbmQgbWFrZSBhIGRlbGljaW91cyBhZGRpdGlvbiB0byBicmVhZCwgcmlzb3R0bywgc3Rld3MsIHNhbGFkcyBhbmQgbW9yZS48L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz5cXG48cD5BZGQgaW50ZW5zZWx5IGZsYXZvdXJlZCBtYWx0eSBhbmQgc3VjY3VsZW50IGdyYWluc8KgZnVsbCBvZiB1bWFtaSByaWNobmVzcyB0byBicmVhZHMsIHJpc290dG8sIHN0ZXdzLCBzb3VwcywgYW5kIGV2ZW4gc2FsYWRzLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+QWRkIGFib3V0IGhhbGYgYSB0ZWFzcG9vbiBwZXIgc2VydmluZyB0byBhbG1vc3QgYW55IGRpc2ggZm9yIGFkZGVkIGRlcHRoLCB1bWFtaSByaWNobmVzcyBhbmQgbWFsdHkgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+VG8gc3RvcmU8L2g1PlxcbjxwPktlZXAgcmVmcmlnZXJhdGVkIGFuZCB1c2Ugd2l0aGluIDQgd2Vla3Mgb2Ygb3BlbmluZy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPk5ha2VkIDxzdHJvbmc+QmFybGV5PC9zdHJvbmc+LCBXYXRlciwgPHN0cm9uZz5XaGVhdDwvc3Ryb25nPiBGbG91ciwgU2FsdCwgTGl2ZSBDdWx0dXJlcyo8YnI+ICo8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiwgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+PC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPkNvbnRhaW5zIDxzdHJvbmc+QmFybGV5IChHbHV0ZW4pPC9zdHJvbmc+LDxzdHJvbmc+IFdoZWF0IChHbHV0ZW4pPC9zdHJvbmc+PC9wPlxcbjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0cj5cXG48dGQ+PHN0cm9uZz5UeXBpY2FsIHZhbHVlczwvc3Ryb25nPjwvdGQ+XFxuPHRkPjxzdHJvbmc+UGVyIDEwMGc8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5FbmVyZ3k8L3RkPlxcbjx0ZD41MDBrSiAoMTE5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4xLjdnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC41ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjE5LjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+Mi43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NS4yZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlByb3RlaW48L3RkPlxcbjx0ZD40LjJnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjguNWc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1PlxcbjxwPk91ciBGZXJtZW50ZWQgV2hvbGVncmFpbiBOYWtlZCBCYXJsZXkgaXMgZmVybWVudGVkIGluIHRoZSBzYW1lIHdheSBhcyBtYW55IHNveWEgZmVybWVudHMgdXNlZCBmb3IgYmxhY2sgYmVhbnMsIGJ1dCB1c2luZ8KgbmFrZWQgYmFybGV5IGdyYWluIGluc3RlYWQgb2Ygc295IGJlYW5zLiBJdCdzIG1hZGUgd2l0aCBqdXN0IG5ha2VkIGJhcmxleSBncmFpbnMsIHdhdGVyIGFuZCBzYWx0LCBmZXJtZW50ZWQgd2l0aCBhIGxpdmUgY3VsdHVyZSBvZiA8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiBhbmQgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+LjwvcD5cXG48cD5TdWl0YWJsZSBmb3IgdmVnYW5zLjwvcD5cXG48cD5QYWNrZWQgaW4gcmVjeWNsYWJsZSBnbGFzcyBqYXIgd2l0aCBtZXRhbCBsaWQuPC9wPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjY1XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0Zlcm1lbnRlZC1XaG9sZWdyYWluLU5ha2VkLUJhcmxleS1TcG9vbi0xNjAweDEwMDBfZDZmZWEwOTItZmRlNC00YTk4LWJlYzgtYmIzY2EwYTFmZDRkLmpwZz92PTE2Nzc3NjA4NjBcIixcImRmYy1iOm5hbWVcIjpcIkZlcm1lbnRlZCBOYWtlZCBCYXJsZXkgLSBDYXNlLCA2IHggMTc1ZyAoamFyKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzgxNjgzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOTU5CL0M2XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNjZcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjU5XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL1BhY2stQ2FuLUJha2VkLUJlYW5zLTE4MDB4Nl9hNGQ1ODQ1OS1iZjUyLTQ4YTktYmFlNy04MDdmNDAzNWI4N2YuanBnP3Y9MTY3Nzc2MDc3N1wiLFwiZGZjLWI6bmFtZVwiOlwiQmFrZWQgQnJpdGlzaCBCZWFucyAoVG9MKSAtIENhc2UgLSAxMiB4IDQwMGcgY2Fuc1wiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3MjQ0ODUxL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOQ0JCQ0RcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3MjQ0ODUxL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI2MFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDVcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvUGFjay1DYW4tQmFrZWQtQmVhbnMtMTgwMHg2X2E0ZDU4NDU5LWJmNTItNDhhOS1iYWU3LTgwN2Y0MDM1Yjg3Zi5qcGc/dj0xNjc3NzYwNzc3XCIsXCJkZmMtYjpuYW1lXCI6XCJCYWtlZCBCcml0aXNoIEJlYW5zIChUb0wpIC0gU2luZ2xlIC0gNDAwZyBjYW5cIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQlQ0XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIjIwXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNDZcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjczXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86Yjc0XCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0N1wiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjY3XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL1dob2xlLUZhdmEtQmVhbnMtT3JnYW5pYy1DYW5uZWRfZmNiNjRmZDctOGNhMy00NjVhLThmNTYtNDQzY2YyOGUwYjcxLmpwZz92PTE2Nzc3NjA5NzdcIixcImRmYy1iOm5hbWVcIjpcIk9yZ2FuaWMgV2hvbGUgRmF2YSBCZWFucyBpbiBXYXRlciAoVG9MKSAtIENhc2UgLSAxMiB4IDQwMGcgY2Fuc1wiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0Ny9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0Ny9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPQ0ZCQ0RcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI2OFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNTNcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvV2hvbGUtRmF2YS1CZWFucy1PcmdhbmljLUNhbm5lZF9mY2I2NGZkNy04Y2EzLTQ2NWEtOGY1Ni00NDNjZjI4ZTBiNzEuanBnP3Y9MTY3Nzc2MDk3N1wiLFwiZGZjLWI6bmFtZVwiOlwiT3JnYW5pYyBXaG9sZSBGYXZhIEJlYW5zIGluIFdhdGVyIChUb0wpIC0gU2luZ2xlIC0gNDAwZyBjYW5cIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiT0NGQlQ0XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNTRcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjgxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjgyXCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0N1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjQ5XCIsXCJkZmMtYjpuYW1lXCI6XCJDYXJsaW4gUGVhcyBpbiBXYXRlciwgT3JnYW5pYyAoRElTVFJJQlVUT1IpIC0gUmV0YWlsIGNhbiAoNDAwZyBjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DQ1BUNFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjUwXCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6Y29uc3VtZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzVcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI3N1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI3OFwiLFwiZGZjLWI6cHJvZHVjZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3RyYW5zZm9ybWF0aW9uXCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkVHJhbnNmb3JtYXRpb25cIixcImRmYy1iOmhhc0luY29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpoYXNPdXRjb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI2M1wiLFwiZGZjLWI6bmFtZVwiOlwiQ2FybGluIFBlYXMgaW4gV2F0ZXIsIE9yZ2FuaWMgKERJU1RSSUJVVE9SKSAtIFN0YW5kYXJkIGNhc2UgKDEyIHggNDAwZyBjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DQ1BDRFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjY0XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI1NVwiLFwiZGZjLWI6bmFtZVwiOlwiUm9hc3RlZCBGYXZhIEJlYW5zLCBMaWdodGx5IFNlYSBTYWx0ZWQgKERJU1RSSUJVVE9SKSAtIFJldGFpbCBwYWNrICgzMDBnKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOUkZTUjNcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI1NlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiODNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiODRcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjMvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNjlcIixcImRmYy1iOm5hbWVcIjpcIlJvYXN0ZWQgRmF2YSBCZWFucywgTGlnaHRseSBTZWEgU2FsdGVkIChESVNUUklCVVRPUikgLSBTdGFuZGFyZCBjYXNlICgxMCB4IDMwMGcpXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5SRlNDWFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjcwXCJ9fV19IiwibGFzdElkIjoiODE0NzI5MjI1ODYxMSIsInJlbWFpbmluZ1Byb2R1Y3RzQ291bnRBZnRlciI6MCwic3VjY2VzcyI6dHJ1ZSwibWVzc2FnZSI6IlByb2R1Y3RzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkifQ==
+ recorded_at: Fri, 24 May 2024 01:48:50 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..a457dd85fea
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,632 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000006975&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_sojXClxhQQaFbW","request_duration_ms":394}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:59 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 22e0121b-31af-4767-b4ae-cd488f756d92
+ Original-Request:
+ - req_rLIXRkYVBfZDQW
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_rLIXRkYVBfZDQW
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hR9KuuB1fWySnujBh02U7",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "WoxwxVPUPcg0EjXW",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "6975",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871379,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:59 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_rLIXRkYVBfZDQW","request_duration_ms":453}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:59 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 78275c47-0297-4c0e-a239-98563992887d
+ Original-Request:
+ - req_GVnMFgqWxAysaQ
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_GVnMFgqWxAysaQ
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyekV1ShGBjY8G",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871379,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "84F0FD2D",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:59 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hR9KuuB1fWySnujBh02U7&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekV1ShGBjY8G&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_GVnMFgqWxAysaQ","request_duration_ms":429}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:23:00 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 162743d2-74b2-4292-a1ee-0bc2bb6a4801
+ Original-Request:
+ - req_zlPjMc54Tkbu9m
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_zlPjMc54Tkbu9m
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hR9KuuB1fWySn1nJd2Z0s",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871379,
+ "currency": "eur",
+ "customer": "cus_PyekV1ShGBjY8G",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hR9KuuB1fWySnujBh02U7",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:23:00 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR9KuuB1fWySn1nJd2Z0s/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_zlPjMc54Tkbu9m","request_duration_ms":487}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:23:01 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '5051'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 5a61ef34-70b9-4d94-a0d7-47616a39b2b4
+ Original-Request:
+ - req_fyMzG745GeHI6Y
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_fyMzG745GeHI6Y
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hR9KuuB1fWySn1n33UgF4",
+ "code": "card_declined",
+ "decline_code": "card_velocity_exceeded",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined for making repeated attempts too frequently or exceeding its amount limit.",
+ "payment_intent": {
+ "id": "pi_3P8hR9KuuB1fWySn1nJd2Z0s",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871379,
+ "currency": "eur",
+ "customer": "cus_PyekV1ShGBjY8G",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hR9KuuB1fWySn1n33UgF4",
+ "code": "card_declined",
+ "decline_code": "card_velocity_exceeded",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined for making repeated attempts too frequently or exceeding its amount limit.",
+ "payment_method": {
+ "id": "pm_1P8hR9KuuB1fWySnujBh02U7",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "WoxwxVPUPcg0EjXW",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "6975",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871379,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hR9KuuB1fWySn1n33UgF4",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hR9KuuB1fWySnujBh02U7",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "WoxwxVPUPcg0EjXW",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "6975",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871379,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_fyMzG745GeHI6Y?t=1713871380",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:23:01 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..077dc39ebc7
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,632 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000000069&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_M2EjGTJOmFPvjA","request_duration_ms":413}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:51 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 178dad88-b557-4875-bbfa-d9ecfdfb98b5
+ Original-Request:
+ - req_bqKC4w4oOMZvSc
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_bqKC4w4oOMZvSc
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hR1KuuB1fWySnbxi4nn24",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "qpQikrTL7IyNA2rE",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0069",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871371,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:51 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_bqKC4w4oOMZvSc","request_duration_ms":533}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:52 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 5835fb77-1637-4a76-ad9d-792b3db11f50
+ Original-Request:
+ - req_SfQyNVeNfePrtc
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_SfQyNVeNfePrtc
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyekuTW9G8teWh",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871371,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "0A1B36ED",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:52 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hR1KuuB1fWySnbxi4nn24&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekuTW9G8teWh&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_SfQyNVeNfePrtc","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:52 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 0a884fa9-98f8-4aa7-baaf-0c03ef7042ea
+ Original-Request:
+ - req_YNJjarvaZJsYcl
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_YNJjarvaZJsYcl
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hR2KuuB1fWySn2lcIMkzA",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871372,
+ "currency": "eur",
+ "customer": "cus_PyekuTW9G8teWh",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hR1KuuB1fWySnbxi4nn24",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:52 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR2KuuB1fWySn2lcIMkzA/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_YNJjarvaZJsYcl","request_duration_ms":510}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:53 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '4857'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - f6345948-00a4-4462-a7ad-6b2c14710441
+ Original-Request:
+ - req_a226IErp01tmAg
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_a226IErp01tmAg
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hR2KuuB1fWySn2Q4UrurZ",
+ "code": "expired_card",
+ "doc_url": "https://stripe.com/docs/error-codes/expired-card",
+ "message": "Your card has expired.",
+ "param": "exp_month",
+ "payment_intent": {
+ "id": "pi_3P8hR2KuuB1fWySn2lcIMkzA",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871372,
+ "currency": "eur",
+ "customer": "cus_PyekuTW9G8teWh",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hR2KuuB1fWySn2Q4UrurZ",
+ "code": "expired_card",
+ "doc_url": "https://stripe.com/docs/error-codes/expired-card",
+ "message": "Your card has expired.",
+ "param": "exp_month",
+ "payment_method": {
+ "id": "pm_1P8hR1KuuB1fWySnbxi4nn24",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "qpQikrTL7IyNA2rE",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0069",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871371,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hR2KuuB1fWySn2Q4UrurZ",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hR1KuuB1fWySnbxi4nn24",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "qpQikrTL7IyNA2rE",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0069",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871371,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_a226IErp01tmAg?t=1713871372",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:53 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..c1529614fc9
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,632 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000000002&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_jw6WIU0GBeVnT2","request_duration_ms":406}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:41 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - b7635034-0538-409f-8de4-029495aa738e
+ Original-Request:
+ - req_17rocy9XEkwQk7
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_17rocy9XEkwQk7
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQrKuuB1fWySnoJXDVbMV",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "IKC2ubfpSLuZKsVs",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0002",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871361,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:41 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_17rocy9XEkwQk7","request_duration_ms":445}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:41 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - ac92f435-bad8-453d-a832-6b6b01ea665d
+ Original-Request:
+ - req_hmFNjhNpTLnsD2
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_hmFNjhNpTLnsD2
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_Pyek1w8BYYKnV9",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871361,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "8824622E",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:41 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQrKuuB1fWySnoJXDVbMV&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyek1w8BYYKnV9&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_hmFNjhNpTLnsD2","request_duration_ms":503}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:42 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 24277f63-f991-44e9-a545-04e748071bf9
+ Original-Request:
+ - req_9auOceZoxHo5tE
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_9auOceZoxHo5tE
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQsKuuB1fWySn0dRsCAlk",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871362,
+ "currency": "eur",
+ "customer": "cus_Pyek1w8BYYKnV9",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQrKuuB1fWySnoJXDVbMV",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:42 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQsKuuB1fWySn0dRsCAlk/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_9auOceZoxHo5tE","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:43 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '4889'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - df30ad1c-4cf2-4fef-a887-03a948f403da
+ Original-Request:
+ - req_d5nQ4wPD4E7f6U
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_d5nQ4wPD4E7f6U
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hQsKuuB1fWySn02qML9H0",
+ "code": "card_declined",
+ "decline_code": "generic_decline",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined.",
+ "payment_intent": {
+ "id": "pi_3P8hQsKuuB1fWySn0dRsCAlk",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871362,
+ "currency": "eur",
+ "customer": "cus_Pyek1w8BYYKnV9",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hQsKuuB1fWySn02qML9H0",
+ "code": "card_declined",
+ "decline_code": "generic_decline",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined.",
+ "payment_method": {
+ "id": "pm_1P8hQrKuuB1fWySnoJXDVbMV",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "IKC2ubfpSLuZKsVs",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0002",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871361,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hQsKuuB1fWySn02qML9H0",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hQrKuuB1fWySnoJXDVbMV",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "IKC2ubfpSLuZKsVs",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0002",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871361,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_d5nQ4wPD4E7f6U?t=1713871362",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:43 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..20386adda17
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,632 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000000127&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_YNJjarvaZJsYcl","request_duration_ms":510}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:54 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 5be022b2-592a-457f-823e-4222727e3646
+ Original-Request:
+ - req_SogiZHLOYlhFRn
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_SogiZHLOYlhFRn
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hR3KuuB1fWySnQyTSkSEY",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "eWmxEL5j3bNdPnK5",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0127",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871374,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:54 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_SogiZHLOYlhFRn","request_duration_ms":443}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:54 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - d5888172-b4f9-4931-804d-a9e0743066f3
+ Original-Request:
+ - req_6VS5p3Zquah6Lb
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_6VS5p3Zquah6Lb
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_Pyek0DFHdMA6i4",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871374,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "95A6066A",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:54 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hR3KuuB1fWySnQyTSkSEY&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyek0DFHdMA6i4&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_6VS5p3Zquah6Lb","request_duration_ms":480}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:55 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - cf247e80-4e3b-444d-b26a-74c85e463dae
+ Original-Request:
+ - req_XZhN6FLRgLDom3
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_XZhN6FLRgLDom3
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hR4KuuB1fWySn1FYBXndE",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871374,
+ "currency": "eur",
+ "customer": "cus_Pyek0DFHdMA6i4",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hR3KuuB1fWySnQyTSkSEY",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:55 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR4KuuB1fWySn1FYBXndE/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_XZhN6FLRgLDom3","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:56 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '4883'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 856d1ab8-1e63-4ee5-8037-4b8ff021ddda
+ Original-Request:
+ - req_FXCmu1rrYkWjml
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_FXCmu1rrYkWjml
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hR4KuuB1fWySn1ONLa92O",
+ "code": "incorrect_cvc",
+ "doc_url": "https://stripe.com/docs/error-codes/incorrect-cvc",
+ "message": "Your card's security code is incorrect.",
+ "param": "cvc",
+ "payment_intent": {
+ "id": "pi_3P8hR4KuuB1fWySn1FYBXndE",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871374,
+ "currency": "eur",
+ "customer": "cus_Pyek0DFHdMA6i4",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hR4KuuB1fWySn1ONLa92O",
+ "code": "incorrect_cvc",
+ "doc_url": "https://stripe.com/docs/error-codes/incorrect-cvc",
+ "message": "Your card's security code is incorrect.",
+ "param": "cvc",
+ "payment_method": {
+ "id": "pm_1P8hR3KuuB1fWySnQyTSkSEY",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "fail"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "eWmxEL5j3bNdPnK5",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0127",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871374,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hR4KuuB1fWySn1ONLa92O",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hR3KuuB1fWySnQyTSkSEY",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "fail"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "eWmxEL5j3bNdPnK5",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0127",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871374,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_FXCmu1rrYkWjml?t=1713871375",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:56 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..23a3cf8bfa6
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,632 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000009995&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_9auOceZoxHo5tE","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:43 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - efb26086-55ca-4fed-96f9-712e811983b5
+ Original-Request:
+ - req_JFuZ8mpCSSE39O
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_JFuZ8mpCSSE39O
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQtKuuB1fWySnkWg8Yi12",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "O0I0muUGQBJy3p73",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9995",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871363,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:43 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_JFuZ8mpCSSE39O","request_duration_ms":485}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:44 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - d6655148-6ed2-47b6-ba01-38b8bb4a198d
+ Original-Request:
+ - req_f8LoVSm6ehzIOQ
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_f8LoVSm6ehzIOQ
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_Pyekp6fXoSyo4f",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871364,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "B923F253",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:44 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQtKuuB1fWySnkWg8Yi12&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyekp6fXoSyo4f&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_f8LoVSm6ehzIOQ","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:44 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - d797d3c9-2865-44b3-bf91-76176a96bf24
+ Original-Request:
+ - req_7nTlJ3fHIjzIPN
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_7nTlJ3fHIjzIPN
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQuKuuB1fWySn2YcCudO4",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871364,
+ "currency": "eur",
+ "customer": "cus_Pyekp6fXoSyo4f",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQtKuuB1fWySnkWg8Yi12",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:44 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQuKuuB1fWySn2YcCudO4/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_7nTlJ3fHIjzIPN","request_duration_ms":510}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:45 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '4915'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - f0b1f823-2b28-4b51-829e-030893bb1ce9
+ Original-Request:
+ - req_Ua7pnZevBRWYWv
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_Ua7pnZevBRWYWv
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hQuKuuB1fWySn2WZGczKx",
+ "code": "card_declined",
+ "decline_code": "insufficient_funds",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card has insufficient funds.",
+ "payment_intent": {
+ "id": "pi_3P8hQuKuuB1fWySn2YcCudO4",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871364,
+ "currency": "eur",
+ "customer": "cus_Pyekp6fXoSyo4f",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hQuKuuB1fWySn2WZGczKx",
+ "code": "card_declined",
+ "decline_code": "insufficient_funds",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card has insufficient funds.",
+ "payment_method": {
+ "id": "pm_1P8hQtKuuB1fWySnkWg8Yi12",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "O0I0muUGQBJy3p73",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9995",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871363,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hQuKuuB1fWySn2WZGczKx",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hQtKuuB1fWySnkWg8Yi12",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "O0I0muUGQBJy3p73",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9995",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871363,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_Ua7pnZevBRWYWv?t=1713871364",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:45 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..ace8a4fe2d5
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,632 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000009987&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_7nTlJ3fHIjzIPN","request_duration_ms":510}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:46 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - dd89d6d5-1928-425b-9e41-0d0ddbaabd66
+ Original-Request:
+ - req_qPbK8GWnufeusA
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_qPbK8GWnufeusA
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQwKuuB1fWySnnXjxt2Q5",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "hMDekBwrnWL1oLxe",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9987",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871366,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:46 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_qPbK8GWnufeusA","request_duration_ms":446}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:46 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 8fa0ce75-bb64-4ed0-be30-0937ff2b8d3e
+ Original-Request:
+ - req_29DQjMmwvNd48X
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_29DQjMmwvNd48X
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyekDsErN9ufoM",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871366,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "1AB5687C",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:46 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQwKuuB1fWySnnXjxt2Q5&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekDsErN9ufoM&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_29DQjMmwvNd48X","request_duration_ms":508}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:47 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - c99be1bc-4a15-4ef0-9097-fd46b3b284f1
+ Original-Request:
+ - req_aGW6Vn9eCXjmi7
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_aGW6Vn9eCXjmi7
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQxKuuB1fWySn1iZusZS1",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871367,
+ "currency": "eur",
+ "customer": "cus_PyekDsErN9ufoM",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQwKuuB1fWySnnXjxt2Q5",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:47 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQxKuuB1fWySn1iZusZS1/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_aGW6Vn9eCXjmi7","request_duration_ms":498}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:48 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '4877'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 2ee34069-f3f4-4ff7-b5dc-51348b21ddef
+ Original-Request:
+ - req_tE5NggyuH84Bwp
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_tE5NggyuH84Bwp
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hQxKuuB1fWySn1mkDmi3i",
+ "code": "card_declined",
+ "decline_code": "lost_card",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined.",
+ "payment_intent": {
+ "id": "pi_3P8hQxKuuB1fWySn1iZusZS1",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871367,
+ "currency": "eur",
+ "customer": "cus_PyekDsErN9ufoM",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hQxKuuB1fWySn1mkDmi3i",
+ "code": "card_declined",
+ "decline_code": "lost_card",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined.",
+ "payment_method": {
+ "id": "pm_1P8hQwKuuB1fWySnnXjxt2Q5",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "hMDekBwrnWL1oLxe",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9987",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871366,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hQxKuuB1fWySn1mkDmi3i",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hQwKuuB1fWySnnXjxt2Q5",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "hMDekBwrnWL1oLxe",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9987",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871366,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_tE5NggyuH84Bwp?t=1713871367",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:48 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..df960e5ab81
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,630 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000000119&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_XZhN6FLRgLDom3","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:56 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 4fde0975-18cb-4a02-9522-870f259bb1da
+ Original-Request:
+ - req_gd1J4ZPBCCug9x
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_gd1J4ZPBCCug9x
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hR6KuuB1fWySnbrsC9UJ6",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "9HWWxe4EyniQy61z",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0119",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871376,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:56 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_gd1J4ZPBCCug9x","request_duration_ms":535}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:57 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - d325710f-8b58-405e-9f71-bf77f88ab4b8
+ Original-Request:
+ - req_2YAwLlhn1Wwsms
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_2YAwLlhn1Wwsms
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyekmaUZEsfvMy",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871377,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "E9D00917",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:57 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hR6KuuB1fWySnbrsC9UJ6&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekmaUZEsfvMy&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_2YAwLlhn1Wwsms","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:57 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - c9d7fb8c-89f1-4453-bf7b-8d895ae3db51
+ Original-Request:
+ - req_sojXClxhQQaFbW
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_sojXClxhQQaFbW
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hR7KuuB1fWySn1TR0go8r",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871377,
+ "currency": "eur",
+ "customer": "cus_PyekmaUZEsfvMy",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hR6KuuB1fWySnbrsC9UJ6",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:57 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR7KuuB1fWySn1TR0go8r/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_sojXClxhQQaFbW","request_duration_ms":394}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:58 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '4917'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 58fced99-2bea-4f22-aeff-3c29242fc17c
+ Original-Request:
+ - req_D19RydovrPMO35
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_D19RydovrPMO35
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hR7KuuB1fWySn1QTbIwTK",
+ "code": "processing_error",
+ "doc_url": "https://stripe.com/docs/error-codes/processing-error",
+ "message": "An error occurred while processing your card. Try again in a little bit.",
+ "payment_intent": {
+ "id": "pi_3P8hR7KuuB1fWySn1TR0go8r",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871377,
+ "currency": "eur",
+ "customer": "cus_PyekmaUZEsfvMy",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hR7KuuB1fWySn1QTbIwTK",
+ "code": "processing_error",
+ "doc_url": "https://stripe.com/docs/error-codes/processing-error",
+ "message": "An error occurred while processing your card. Try again in a little bit.",
+ "payment_method": {
+ "id": "pm_1P8hR6KuuB1fWySnbrsC9UJ6",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "9HWWxe4EyniQy61z",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0119",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871376,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hR7KuuB1fWySn1QTbIwTK",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hR6KuuB1fWySnbrsC9UJ6",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "9HWWxe4EyniQy61z",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0119",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871376,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_D19RydovrPMO35?t=1713871377",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:58 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
new file mode 100644
index 00000000000..151fd5e6cea
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml
@@ -0,0 +1,632 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=4000000000009979&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_aGW6Vn9eCXjmi7","request_duration_ms":498}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:48 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '996'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 517ec7db-a996-4cba-9172-f86e41046730
+ Original-Request:
+ - req_h1DaNRQAhqFgz9
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_h1DaNRQAhqFgz9
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQyKuuB1fWySnCgvttCSO",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "1pjhEFFOW1eCi1AB",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9979",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871368,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:48 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_h1DaNRQAhqFgz9","request_duration_ms":413}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:49 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - cb7724a0-993d-47f7-960f-f63acaac72e2
+ Original-Request:
+ - req_sIi1TlK5XDpKSt
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_sIi1TlK5XDpKSt
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyekDa34UUgaBy",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871369,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "542CB18D",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:49 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQyKuuB1fWySnCgvttCSO&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekDa34UUgaBy&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_sIi1TlK5XDpKSt","request_duration_ms":522}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:49 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - e9749b76-4a91-4707-be17-a771d0f94596
+ Original-Request:
+ - req_M2EjGTJOmFPvjA
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_M2EjGTJOmFPvjA
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQzKuuB1fWySn2Tv4Uyhb",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871369,
+ "currency": "eur",
+ "customer": "cus_PyekDa34UUgaBy",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQyKuuB1fWySnCgvttCSO",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:49 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQzKuuB1fWySn2Tv4Uyhb/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_M2EjGTJOmFPvjA","request_duration_ms":413}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 402
+ message: Payment Required
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:50 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '4881'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 204e1661-6051-4cd8-a5e2-e8c923a871d0
+ Original-Request:
+ - req_SMrYdbWXABS1Ya
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_SMrYdbWXABS1Ya
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |
+ {
+ "error": {
+ "charge": "ch_3P8hQzKuuB1fWySn2DGsgH8G",
+ "code": "card_declined",
+ "decline_code": "stolen_card",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined.",
+ "payment_intent": {
+ "id": "pi_3P8hQzKuuB1fWySn2Tv4Uyhb",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {
+ }
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871369,
+ "currency": "eur",
+ "customer": "cus_PyekDa34UUgaBy",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": {
+ "charge": "ch_3P8hQzKuuB1fWySn2DGsgH8G",
+ "code": "card_declined",
+ "decline_code": "stolen_card",
+ "doc_url": "https://stripe.com/docs/error-codes/card-declined",
+ "message": "Your card was declined.",
+ "payment_method": {
+ "id": "pm_1P8hQyKuuB1fWySnCgvttCSO",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "1pjhEFFOW1eCi1AB",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9979",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871368,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "type": "card_error"
+ },
+ "latest_charge": "ch_3P8hQzKuuB1fWySn2DGsgH8G",
+ "livemode": false,
+ "metadata": {
+ },
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": null,
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_payment_method",
+ "transfer_data": null,
+ "transfer_group": null
+ },
+ "payment_method": {
+ "id": "pm_1P8hQyKuuB1fWySnCgvttCSO",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "visa",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "pass"
+ },
+ "country": "US",
+ "display_brand": "visa",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "1pjhEFFOW1eCi1AB",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "9979",
+ "networks": {
+ "available": [
+ "visa"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871368,
+ "customer": null,
+ "livemode": false,
+ "metadata": {
+ },
+ "type": "card"
+ },
+ "request_log_url": "https://dashboard.stripe.com/test/logs/req_SMrYdbWXABS1Ya?t=1713871370",
+ "type": "card_error"
+ }
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:51 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml
new file mode 100644
index 00000000000..3f6c5367307
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml
@@ -0,0 +1,905 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=378282246310005&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_WWwLrQp4sVqJV4","request_duration_ms":1003}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:34 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1009'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 4bd1d110-3526-486a-8c1f-e9deec2604d3
+ Original-Request:
+ - req_q3SMRET2pdEU3x
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_q3SMRET2pdEU3x
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hPlKuuB1fWySnRO8H7pVp",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "amex",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "american_express",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "zYCOiuhqkk4w2g2M",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0005",
+ "networks": {
+ "available": [
+ "amex"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": false
+ },
+ "wallet": null
+ },
+ "created": 1713871294,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:34 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_q3SMRET2pdEU3x","request_duration_ms":519}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:34 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 0f4ad5da-12eb-46f3-93f9-27728fff5b96
+ Original-Request:
+ - req_sO5qBMluUDTjVx
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_sO5qBMluUDTjVx
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejlhPSbHpRU7",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871294,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "1FD8C6AE",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:34 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hPlKuuB1fWySnRO8H7pVp&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejlhPSbHpRU7&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_sO5qBMluUDTjVx","request_duration_ms":410}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:35 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 30d95687-1376-4eb3-890c-9becd6c87be8
+ Original-Request:
+ - req_swH0esqzotIIDC
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_swH0esqzotIIDC
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPmKuuB1fWySn0I96SqZc",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871294,
+ "currency": "eur",
+ "customer": "cus_PyejlhPSbHpRU7",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:35 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_swH0esqzotIIDC","request_duration_ms":404}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:36 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - ce2ff524-3c64-4512-94eb-e683354019be
+ Original-Request:
+ - req_GtduzogqOBxFuM
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_GtduzogqOBxFuM
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPmKuuB1fWySn0I96SqZc",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871294,
+ "currency": "eur",
+ "customer": "cus_PyejlhPSbHpRU7",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:36 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_GtduzogqOBxFuM","request_duration_ms":1107}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:36 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_KxAzk5rtNpzTnE
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPmKuuB1fWySn0I96SqZc",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871294,
+ "currency": "eur",
+ "customer": "cus_PyejlhPSbHpRU7",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:36 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc/capture
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_KxAzk5rtNpzTnE","request_duration_ms":340}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:37 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - dbae392b-f0f0-4340-8072-bcd42a6f6be2
+ Original-Request:
+ - req_rQgUbXQNdBUTkf
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_rQgUbXQNdBUTkf
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPmKuuB1fWySn0I96SqZc",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871294,
+ "currency": "eur",
+ "customer": "cus_PyejlhPSbHpRU7",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:37 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_rQgUbXQNdBUTkf","request_duration_ms":1188}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:38 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_UddWo6oZ6xRVWD
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPmKuuB1fWySn0I96SqZc",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871294,
+ "currency": "eur",
+ "customer": "cus_PyejlhPSbHpRU7",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:38 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml
new file mode 100644
index 00000000000..89dcaddff6b
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml
@@ -0,0 +1,512 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=378282246310005&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_ZmshM8deU5LJ8a","request_duration_ms":394}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:31 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1009'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - e5a0531c-6e6e-44c8-8f5f-b20454feb897
+ Original-Request:
+ - req_zp9rWUux4NmCmn
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_zp9rWUux4NmCmn
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hPjKuuB1fWySnB1rKwJD0",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "amex",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "american_express",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "zYCOiuhqkk4w2g2M",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0005",
+ "networks": {
+ "available": [
+ "amex"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": false
+ },
+ "wallet": null
+ },
+ "created": 1713871291,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:31 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_zp9rWUux4NmCmn","request_duration_ms":438}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:31 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - a7047b65-30fd-4a71-afe8-8f3e8dbeed4f
+ Original-Request:
+ - req_VvION4praYlJd6
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_VvION4praYlJd6
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_Pyej8RAVLLQG5C",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871291,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "645B7506",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:31 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hPjKuuB1fWySnB1rKwJD0&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyej8RAVLLQG5C&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_VvION4praYlJd6","request_duration_ms":508}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:32 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 0174c247-8161-42c0-bf3f-877cd2f644f8
+ Original-Request:
+ - req_knV0kmLqcT8rO2
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_knV0kmLqcT8rO2
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPkKuuB1fWySn2fu1bxGF",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871292,
+ "currency": "eur",
+ "customer": "cus_Pyej8RAVLLQG5C",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPjKuuB1fWySnB1rKwJD0",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:32 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPkKuuB1fWySn2fu1bxGF/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_knV0kmLqcT8rO2","request_duration_ms":407}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:33 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 4efb4540-e365-4044-8eb2-784ae473d9e1
+ Original-Request:
+ - req_WWwLrQp4sVqJV4
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_WWwLrQp4sVqJV4
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPkKuuB1fWySn2fu1bxGF",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871292,
+ "currency": "eur",
+ "customer": "cus_Pyej8RAVLLQG5C",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPkKuuB1fWySn2NxNRLd1",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPjKuuB1fWySnB1rKwJD0",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:33 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml
new file mode 100644
index 00000000000..d14e8d7e581
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml
@@ -0,0 +1,905 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=6555900000604105&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_nanZFhzRIre71v","request_duration_ms":1077}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:13 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 07fd64c4-4b06-4b4d-83fb-9a6c5b1b21a5
+ Original-Request:
+ - req_h4FbCjxiOZzc6u
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_h4FbCjxiOZzc6u
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQOKuuB1fWySnId2Mzj5C",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "discover",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "discover",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "7NZ8adObS8Rw8HOq",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "4105",
+ "networks": {
+ "available": [
+ "discover"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871333,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:13 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_h4FbCjxiOZzc6u","request_duration_ms":521}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:13 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 30499760-19e8-4a21-b9ef-40b16c04b75d
+ Original-Request:
+ - req_u5y0Bhoihunvpp
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_u5y0Bhoihunvpp
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejGREjSBtXbR",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871333,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "F625C654",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:13 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQOKuuB1fWySnId2Mzj5C&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejGREjSBtXbR&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_u5y0Bhoihunvpp","request_duration_ms":428}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:14 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 79383762-a38a-4a9d-abf2-f770269aed52
+ Original-Request:
+ - req_nFRDi5kuAQt46x
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_nFRDi5kuAQt46x
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQPKuuB1fWySn2NE05rrF",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871333,
+ "currency": "eur",
+ "customer": "cus_PyejGREjSBtXbR",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:14 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_nFRDi5kuAQt46x","request_duration_ms":421}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:15 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - e6b09ac4-d1fe-4409-a3d6-3fdd579d36eb
+ Original-Request:
+ - req_063fZXRL9juaTV
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_063fZXRL9juaTV
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQPKuuB1fWySn2NE05rrF",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871333,
+ "currency": "eur",
+ "customer": "cus_PyejGREjSBtXbR",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:15 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_063fZXRL9juaTV","request_duration_ms":1167}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:15 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_PDviclwoOQJWDY
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQPKuuB1fWySn2NE05rrF",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871333,
+ "currency": "eur",
+ "customer": "cus_PyejGREjSBtXbR",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:15 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF/capture
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_PDviclwoOQJWDY","request_duration_ms":406}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:17 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - dab6f1ca-f281-4ed8-8539-b77a10083c01
+ Original-Request:
+ - req_TAyOFJqtk0XY4h
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_TAyOFJqtk0XY4h
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQPKuuB1fWySn2NE05rrF",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871333,
+ "currency": "eur",
+ "customer": "cus_PyejGREjSBtXbR",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:17 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_TAyOFJqtk0XY4h","request_duration_ms":1635}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:17 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_3Dn9T1aixPSePK
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQPKuuB1fWySn2NE05rrF",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871333,
+ "currency": "eur",
+ "customer": "cus_PyejGREjSBtXbR",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:17 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml
new file mode 100644
index 00000000000..2a07f9971ad
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml
@@ -0,0 +1,512 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=6555900000604105&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_wFzCMoF0mQD3Eo","request_duration_ms":315}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:10 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - d0482a80-5afc-44e9-9508-69dba3a1dd84
+ Original-Request:
+ - req_HfCWuNBUeFJHJ5
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_HfCWuNBUeFJHJ5
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQMKuuB1fWySnN4KTfpDk",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "discover",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "discover",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "7NZ8adObS8Rw8HOq",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "4105",
+ "networks": {
+ "available": [
+ "discover"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871330,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:10 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_HfCWuNBUeFJHJ5","request_duration_ms":415}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:10 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - ea256470-3297-4e6b-9052-5efcae4a7ffd
+ Original-Request:
+ - req_3gAE50rFEVax5i
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_3gAE50rFEVax5i
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejoBfFWODSMx",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871330,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "4A967218",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:10 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQMKuuB1fWySnN4KTfpDk&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejoBfFWODSMx&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_3gAE50rFEVax5i","request_duration_ms":524}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:11 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 17e39583-5976-4667-9d1a-223dedd14257
+ Original-Request:
+ - req_JJ9t7V8lKdZpqY
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_JJ9t7V8lKdZpqY
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQNKuuB1fWySn0piyeLve",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871331,
+ "currency": "eur",
+ "customer": "cus_PyejoBfFWODSMx",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQMKuuB1fWySnN4KTfpDk",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:11 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQNKuuB1fWySn0piyeLve/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_JJ9t7V8lKdZpqY","request_duration_ms":424}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:12 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 412cb586-8cff-44a6-b60b-3c9a0d6520ce
+ Original-Request:
+ - req_nanZFhzRIre71v
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_nanZFhzRIre71v
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQNKuuB1fWySn0piyeLve",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871331,
+ "currency": "eur",
+ "customer": "cus_PyejoBfFWODSMx",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQNKuuB1fWySn0Ub9RO8K",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQMKuuB1fWySnN4KTfpDk",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:12 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml
new file mode 100644
index 00000000000..755b43fc3ec
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml
@@ -0,0 +1,905 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=3056930009020004&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_F0PIDyr31udtJ2","request_duration_ms":1001}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:58 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 699acfe0-14ca-4d60-bf0e-95f24bb5dbe9
+ Original-Request:
+ - req_aMcxa09ry3qzsw
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_aMcxa09ry3qzsw
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQ9KuuB1fWySnYVsRisH4",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "diners",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "diners_club",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "8CvV2XFCUY7eGw6O",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0004",
+ "networks": {
+ "available": [
+ "diners"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": false
+ },
+ "wallet": null
+ },
+ "created": 1713871318,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:58 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_aMcxa09ry3qzsw","request_duration_ms":441}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:58 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 4a72f8a7-096b-4828-9483-fbeea0e6f79d
+ Original-Request:
+ - req_Y5bjaH6gkAKoVc
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_Y5bjaH6gkAKoVc
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejqoGIrbSloY",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871318,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "BCF7C75E",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:58 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQ9KuuB1fWySnYVsRisH4&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejqoGIrbSloY&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_Y5bjaH6gkAKoVc","request_duration_ms":500}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:59 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - b098ddc0-7aec-4d60-a9f6-b39e167e46e2
+ Original-Request:
+ - req_JvotoTPIJvFb62
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_JvotoTPIJvFb62
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQAKuuB1fWySn2Gw633z1",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871318,
+ "currency": "eur",
+ "customer": "cus_PyejqoGIrbSloY",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:59 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_JvotoTPIJvFb62","request_duration_ms":510}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:00 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - d49d4520-df0d-4f17-9539-e1a9f2497be8
+ Original-Request:
+ - req_MZZk8A3FLOZ2cj
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_MZZk8A3FLOZ2cj
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQAKuuB1fWySn2Gw633z1",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871318,
+ "currency": "eur",
+ "customer": "cus_PyejqoGIrbSloY",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:00 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_MZZk8A3FLOZ2cj","request_duration_ms":1102}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:00 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_dWgYeF8wvQey17
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQAKuuB1fWySn2Gw633z1",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871318,
+ "currency": "eur",
+ "customer": "cus_PyejqoGIrbSloY",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:00 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1/capture
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_dWgYeF8wvQey17","request_duration_ms":407}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:01 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - ea0e4c9f-d5ad-442f-b105-3c30b9a77760
+ Original-Request:
+ - req_rbJH0wjaebh0ma
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_rbJH0wjaebh0ma
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQAKuuB1fWySn2Gw633z1",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871318,
+ "currency": "eur",
+ "customer": "cus_PyejqoGIrbSloY",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:01 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_rbJH0wjaebh0ma","request_duration_ms":1225}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:02 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_xmdIy0xcA8ttbI
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQAKuuB1fWySn2Gw633z1",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871318,
+ "currency": "eur",
+ "customer": "cus_PyejqoGIrbSloY",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:02 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml
new file mode 100644
index 00000000000..6d81c41bc10
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml
@@ -0,0 +1,512 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=3056930009020004&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_p4PeKqmC2GcoAk","request_duration_ms":407}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:55 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 7fdcd9a1-34ee-4ce6-bbe0-759b5d7adf3a
+ Original-Request:
+ - req_ez8SRoPdvB73xw
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_ez8SRoPdvB73xw
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQ7KuuB1fWySnSVV0shzQ",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "diners",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "diners_club",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "8CvV2XFCUY7eGw6O",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "0004",
+ "networks": {
+ "available": [
+ "diners"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": false
+ },
+ "wallet": null
+ },
+ "created": 1713871315,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:55 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_ez8SRoPdvB73xw","request_duration_ms":434}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:55 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 3da20bb0-4fdd-4457-aa5a-c0482452f61d
+ Original-Request:
+ - req_DTfU4F1qwYuKyu
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_DTfU4F1qwYuKyu
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejNRkCBsUcCT",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871315,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "3BD04305",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:55 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQ7KuuB1fWySnSVV0shzQ&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejNRkCBsUcCT&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_DTfU4F1qwYuKyu","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:56 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - d1c04eb7-242d-49e0-a4b7-ce8b4b7c86d3
+ Original-Request:
+ - req_D4aNytWyNkrU1c
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_D4aNytWyNkrU1c
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQ8KuuB1fWySn0klY7sZZ",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871316,
+ "currency": "eur",
+ "customer": "cus_PyejNRkCBsUcCT",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ7KuuB1fWySnSVV0shzQ",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:56 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ8KuuB1fWySn0klY7sZZ/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_D4aNytWyNkrU1c","request_duration_ms":407}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:57 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 846d130a-be48-4026-9e59-8b0c31c4ca0d
+ Original-Request:
+ - req_F0PIDyr31udtJ2
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_F0PIDyr31udtJ2
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQ8KuuB1fWySn0klY7sZZ",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871316,
+ "currency": "eur",
+ "customer": "cus_PyejNRkCBsUcCT",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQ8KuuB1fWySn0sIkyJo1",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ7KuuB1fWySnSVV0shzQ",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:57 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml
new file mode 100644
index 00000000000..91f1d0046b1
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml
@@ -0,0 +1,905 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=36227206271667&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_y2bfu78HhF3dGA","request_duration_ms":1107}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:05 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 3148e7f5-db70-4dbb-9a75-194224932fca
+ Original-Request:
+ - req_iiefiwCR3youDU
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_iiefiwCR3youDU
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQHKuuB1fWySnutfeAg3o",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "diners",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "diners_club",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "gDlx6y9moRYkO83e",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "1667",
+ "networks": {
+ "available": [
+ "diners"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": false
+ },
+ "wallet": null
+ },
+ "created": 1713871325,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:05 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_iiefiwCR3youDU","request_duration_ms":521}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:06 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - e3c2de6d-f8be-479d-8ecf-71a3ef0d48ca
+ Original-Request:
+ - req_cVFNyy30EQtvcC
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_cVFNyy30EQtvcC
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejYA0TC3ECno",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871326,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "21AF6C51",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:06 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQHKuuB1fWySnutfeAg3o&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejYA0TC3ECno&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_cVFNyy30EQtvcC","request_duration_ms":448}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:06 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 5bceb53d-e5f4-49eb-bfc2-79ed634ad8f5
+ Original-Request:
+ - req_wFibir0ga44G9t
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_wFibir0ga44G9t
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQIKuuB1fWySn1V7vxE51",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871326,
+ "currency": "eur",
+ "customer": "cus_PyejYA0TC3ECno",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:06 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_wFibir0ga44G9t","request_duration_ms":415}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:07 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 77b39096-d434-42e4-a44a-1657bb9d9c30
+ Original-Request:
+ - req_NSbeTZUD4OBDv7
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_NSbeTZUD4OBDv7
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQIKuuB1fWySn1V7vxE51",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871326,
+ "currency": "eur",
+ "customer": "cus_PyejYA0TC3ECno",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:07 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_NSbeTZUD4OBDv7","request_duration_ms":1055}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:08 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_1QKMjLvP9QmP3M
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQIKuuB1fWySn1V7vxE51",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871326,
+ "currency": "eur",
+ "customer": "cus_PyejYA0TC3ECno",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:08 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51/capture
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_1QKMjLvP9QmP3M","request_duration_ms":293}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:09 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 56bdbdb0-1282-4790-b9c0-3f13314ec128
+ Original-Request:
+ - req_e6WjAta3RR7cDp
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_e6WjAta3RR7cDp
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQIKuuB1fWySn1V7vxE51",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871326,
+ "currency": "eur",
+ "customer": "cus_PyejYA0TC3ECno",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:09 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_e6WjAta3RR7cDp","request_duration_ms":1340}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:09 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_wFzCMoF0mQD3Eo
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQIKuuB1fWySn1V7vxE51",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871326,
+ "currency": "eur",
+ "customer": "cus_PyejYA0TC3ECno",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:09 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml
new file mode 100644
index 00000000000..5548728a170
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml
@@ -0,0 +1,512 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=36227206271667&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_xmdIy0xcA8ttbI","request_duration_ms":408}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:02 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 9e719516-d99d-4916-94dc-61f6f1c2fc81
+ Original-Request:
+ - req_UMNO0XHfcOP271
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_UMNO0XHfcOP271
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQEKuuB1fWySnM0FueQDF",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "diners",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "diners_club",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "gDlx6y9moRYkO83e",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "1667",
+ "networks": {
+ "available": [
+ "diners"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": false
+ },
+ "wallet": null
+ },
+ "created": 1713871322,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:03 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_UMNO0XHfcOP271","request_duration_ms":536}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:03 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 2181cbe0-9829-4395-89b9-3a0d98be464c
+ Original-Request:
+ - req_pzxTrEyqekgZUS
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_pzxTrEyqekgZUS
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejNJe0cHnW15",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871323,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "2415657D",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:03 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQEKuuB1fWySnM0FueQDF&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejNJe0cHnW15&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_pzxTrEyqekgZUS","request_duration_ms":440}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:03 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 55d32630-3ae8-4d1f-bf6a-da26931bb412
+ Original-Request:
+ - req_SNphmAy0Qmq6jg
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_SNphmAy0Qmq6jg
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQFKuuB1fWySn1Fs1vGsh",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871323,
+ "currency": "eur",
+ "customer": "cus_PyejNJe0cHnW15",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQEKuuB1fWySnM0FueQDF",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:03 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQFKuuB1fWySn1Fs1vGsh/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_SNphmAy0Qmq6jg","request_duration_ms":474}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:22:04 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 8310a181-52c7-47b1-9d1d-13b2359eff49
+ Original-Request:
+ - req_y2bfu78HhF3dGA
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_y2bfu78HhF3dGA
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQFKuuB1fWySn1Fs1vGsh",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871323,
+ "currency": "eur",
+ "customer": "cus_PyejNJe0cHnW15",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQFKuuB1fWySn1ChVQwX4",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQEKuuB1fWySnM0FueQDF",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:22:05 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml
new file mode 100644
index 00000000000..a700c19bfe6
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml
@@ -0,0 +1,905 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=6011111111111117&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_cKclt9jUdynwP8","request_duration_ms":1113}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:42 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 1ffe4335-3659-40c5-ba72-4b256d9055bc
+ Original-Request:
+ - req_Etu4Q54XyJuLfH
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_Etu4Q54XyJuLfH
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hPtKuuB1fWySnf5blcleZ",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "discover",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "discover",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "SJztPPlfyEUr9hdK",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "1117",
+ "networks": {
+ "available": [
+ "discover"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871302,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:42 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_Etu4Q54XyJuLfH","request_duration_ms":500}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:42 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 490666bd-00c7-483c-b2d8-a68000ecbe6c
+ Original-Request:
+ - req_SJPCUBIOA8rqPC
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_SJPCUBIOA8rqPC
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejzDOIBybDpN",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871302,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "FC09F1D5",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:42 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hPtKuuB1fWySnf5blcleZ&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejzDOIBybDpN&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_SJPCUBIOA8rqPC","request_duration_ms":502}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:43 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 719ad88e-70b3-4d82-8274-5806dc3437d4
+ Original-Request:
+ - req_ZGRZyXCxIUXC9E
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_ZGRZyXCxIUXC9E
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871302,
+ "currency": "eur",
+ "customer": "cus_PyejzDOIBybDpN",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:43 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_ZGRZyXCxIUXC9E","request_duration_ms":405}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:44 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - cac78d53-f544-464b-8303-e84ada269640
+ Original-Request:
+ - req_KCA2UUWiEUB4HJ
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_KCA2UUWiEUB4HJ
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871302,
+ "currency": "eur",
+ "customer": "cus_PyejzDOIBybDpN",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:44 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_KCA2UUWiEUB4HJ","request_duration_ms":1103}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:44 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_Da2a3MRFBmJh64
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871302,
+ "currency": "eur",
+ "customer": "cus_PyejzDOIBybDpN",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:44 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD/capture
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_Da2a3MRFBmJh64","request_duration_ms":405}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:46 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - a2b644d6-4fce-4089-a05b-857e4733a67b
+ Original-Request:
+ - req_qvfrJW5qxylQHr
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_qvfrJW5qxylQHr
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871302,
+ "currency": "eur",
+ "customer": "cus_PyejzDOIBybDpN",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:46 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_qvfrJW5qxylQHr","request_duration_ms":1533}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:46 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1383'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_SiTlYVqYvz9Aeu
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 100,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871302,
+ "currency": "eur",
+ "customer": "cus_PyejzDOIBybDpN",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "succeeded",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:46 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml
new file mode 100644
index 00000000000..9ac6da32c50
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml
@@ -0,0 +1,512 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=6011111111111117&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_UddWo6oZ6xRVWD","request_duration_ms":1}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:38 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1008'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 7a037dc0-3384-4056-bc3b-7781c6e8114f
+ Original-Request:
+ - req_ruQYEyMa7HE0IL
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_ruQYEyMa7HE0IL
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hPqKuuB1fWySnJhvcNWbe",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "discover",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "discover",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "SJztPPlfyEUr9hdK",
+ "funding": "credit",
+ "generated_from": null,
+ "last4": "1117",
+ "networks": {
+ "available": [
+ "discover"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871298,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:39 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_ruQYEyMa7HE0IL","request_duration_ms":547}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:39 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 047ca940-2eb5-4d2f-b864-52b2347968a1
+ Original-Request:
+ - req_RH8SZXNRYFoB3J
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_RH8SZXNRYFoB3J
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejNxKD3I5F0r",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871299,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "E003F017",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:39 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hPqKuuB1fWySnJhvcNWbe&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejNxKD3I5F0r&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_RH8SZXNRYFoB3J","request_duration_ms":508}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:39 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 15c862de-bd7f-4165-95fe-0a6ef281ec0c
+ Original-Request:
+ - req_2BrH7w6xCebHNe
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_2BrH7w6xCebHNe
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPrKuuB1fWySn1waDmlml",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871299,
+ "currency": "eur",
+ "customer": "cus_PyejNxKD3I5F0r",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPqKuuB1fWySnJhvcNWbe",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:39 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPrKuuB1fWySn1waDmlml/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_2BrH7w6xCebHNe","request_duration_ms":395}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:40 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - f54fb634-6d1b-415a-94a5-755e4b51fc40
+ Original-Request:
+ - req_cKclt9jUdynwP8
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_cKclt9jUdynwP8
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hPrKuuB1fWySn1waDmlml",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871299,
+ "currency": "eur",
+ "customer": "cus_PyejNxKD3I5F0r",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hPrKuuB1fWySn1yoLj8wA",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hPqKuuB1fWySnJhvcNWbe",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:41 GMT
+recorded_with: VCR 6.2.0
diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml
new file mode 100644
index 00000000000..e4457b59f77
--- /dev/null
+++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml
@@ -0,0 +1,905 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_methods
+ body:
+ encoding: UTF-8
+ string: type=card&card[number]=6011981111111113&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_zrfZPH2c8XapeS","request_duration_ms":1091}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:50 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1007'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 732f1c45-4d19-4494-a03b-d9725780b674
+ Original-Request:
+ - req_4TC4ObnZbMHhnk
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_4TC4ObnZbMHhnk
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pm_1P8hQ2KuuB1fWySnGpLVYFPe",
+ "object": "payment_method",
+ "allow_redisplay": "unspecified",
+ "billing_details": {
+ "address": {
+ "city": null,
+ "country": null,
+ "line1": null,
+ "line2": null,
+ "postal_code": null,
+ "state": null
+ },
+ "email": null,
+ "name": null,
+ "phone": null
+ },
+ "card": {
+ "brand": "discover",
+ "checks": {
+ "address_line1_check": null,
+ "address_postal_code_check": null,
+ "cvc_check": "unchecked"
+ },
+ "country": "US",
+ "display_brand": "discover",
+ "exp_month": 12,
+ "exp_year": 2025,
+ "fingerprint": "Y3EGIoTEEuDsD8eJ",
+ "funding": "debit",
+ "generated_from": null,
+ "last4": "1113",
+ "networks": {
+ "available": [
+ "discover"
+ ],
+ "preferred": null
+ },
+ "three_d_secure_usage": {
+ "supported": true
+ },
+ "wallet": null
+ },
+ "created": 1713871310,
+ "customer": null,
+ "livemode": false,
+ "metadata": {},
+ "type": "card"
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:50 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/customers
+ body:
+ encoding: UTF-8
+ string: name=Apple+Customer&email=applecustomer%40example.com
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_4TC4ObnZbMHhnk","request_duration_ms":562}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:51 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '649'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - b73a1262-166c-410f-bded-4088c4fd9ffd
+ Original-Request:
+ - req_4fHYiy7Ue9KK7M
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_4fHYiy7Ue9KK7M
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "cus_PyejYzVomzn5re",
+ "object": "customer",
+ "address": null,
+ "balance": 0,
+ "created": 1713871310,
+ "currency": null,
+ "default_source": null,
+ "delinquent": false,
+ "description": null,
+ "discount": null,
+ "email": "applecustomer@example.com",
+ "invoice_prefix": "2A75B94A",
+ "invoice_settings": {
+ "custom_fields": null,
+ "default_payment_method": null,
+ "footer": null,
+ "rendering_options": null
+ },
+ "livemode": false,
+ "metadata": {},
+ "name": "Apple Customer",
+ "next_invoice_sequence": 1,
+ "phone": null,
+ "preferred_locales": [],
+ "shipping": null,
+ "tax_exempt": "none",
+ "test_clock": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:51 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents
+ body:
+ encoding: UTF-8
+ string: amount=100¤cy=eur&payment_method=pm_1P8hQ2KuuB1fWySnGpLVYFPe&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejYzVomzn5re&setup_future_usage=off_session
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_4fHYiy7Ue9KK7M","request_duration_ms":507}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:51 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1368'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content;
+ default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none';
+ img-src 'self'; script-src 'self' 'report-sample'; style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - 27b3483e-3f44-4ad0-b677-9f9c8aa2c3b4
+ Original-Request:
+ - req_sRjhbgcqN2bsY7
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_sRjhbgcqN2bsY7
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQ3KuuB1fWySn0ZLWpymG",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 0,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871311,
+ "currency": "eur",
+ "customer": "cus_PyejYzVomzn5re",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": null,
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ2KuuB1fWySnGpLVYFPe",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_confirmation",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:51 GMT
+- request:
+ method: post
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ3KuuB1fWySn0ZLWpymG/confirm
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - ""
+ Content-Type:
+ - application/x-www-form-urlencoded
+ X-Stripe-Client-Telemetry:
+ - '{"last_request_metrics":{"request_id":"req_sRjhbgcqN2bsY7","request_duration_ms":509}}'
+ Stripe-Version:
+ - '2024-04-10'
+ X-Stripe-Client-User-Agent:
+ - ""
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Server:
+ - nginx
+ Date:
+ - Tue, 23 Apr 2024 11:21:52 GMT
+ Content-Type:
+ - application/json
+ Content-Length:
+ - '1390'
+ Connection:
+ - keep-alive
+ Access-Control-Allow-Credentials:
+ - 'true'
+ Access-Control-Allow-Methods:
+ - GET,HEAD,PUT,PATCH,POST,DELETE
+ Access-Control-Allow-Origin:
+ - "*"
+ Access-Control-Expose-Headers:
+ - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required,
+ X-Stripe-Privileged-Session-Required
+ Access-Control-Max-Age:
+ - '300'
+ Cache-Control:
+ - no-cache, no-store
+ Content-Security-Policy:
+ - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm;
+ block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action
+ 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample';
+ style-src 'self'
+ Cross-Origin-Opener-Policy-Report-Only:
+ - same-origin; report-to="coop"
+ Idempotency-Key:
+ - f79e14b1-a958-405c-bdd2-1d2fc538f322
+ Original-Request:
+ - req_bvdy3sBZtVigM0
+ Report-To:
+ - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}'
+ Reporting-Endpoints:
+ - coop="https://q.stripe.com/coop-report"
+ Request-Id:
+ - req_bvdy3sBZtVigM0
+ Stripe-Should-Retry:
+ - 'false'
+ Stripe-Version:
+ - '2024-04-10'
+ Vary:
+ - Origin
+ X-Stripe-Routing-Context-Priority-Tier:
+ - api-testmode
+ Strict-Transport-Security:
+ - max-age=63072000; includeSubDomains; preload
+ body:
+ encoding: UTF-8
+ string: |-
+ {
+ "id": "pi_3P8hQ3KuuB1fWySn0ZLWpymG",
+ "object": "payment_intent",
+ "amount": 100,
+ "amount_capturable": 100,
+ "amount_details": {
+ "tip": {}
+ },
+ "amount_received": 0,
+ "application": null,
+ "application_fee_amount": null,
+ "automatic_payment_methods": null,
+ "canceled_at": null,
+ "cancellation_reason": null,
+ "capture_method": "manual",
+ "client_secret": "",
+ "confirmation_method": "automatic",
+ "created": 1713871311,
+ "currency": "eur",
+ "customer": "cus_PyejYzVomzn5re",
+ "description": null,
+ "invoice": null,
+ "last_payment_error": null,
+ "latest_charge": "ch_3P8hQ3KuuB1fWySn07iKNKo0",
+ "livemode": false,
+ "metadata": {},
+ "next_action": null,
+ "on_behalf_of": null,
+ "payment_method": "pm_1P8hQ2KuuB1fWySnGpLVYFPe",
+ "payment_method_configuration_details": null,
+ "payment_method_options": {
+ "card": {
+ "installments": null,
+ "mandate_options": null,
+ "network": null,
+ "request_three_d_secure": "automatic"
+ }
+ },
+ "payment_method_types": [
+ "card"
+ ],
+ "processing": null,
+ "receipt_email": null,
+ "review": null,
+ "setup_future_usage": "off_session",
+ "shipping": null,
+ "source": null,
+ "statement_descriptor": null,
+ "statement_descriptor_suffix": null,
+ "status": "requires_capture",
+ "transfer_data": null,
+ "transfer_group": null
+ }
+ recorded_at: Tue, 23 Apr 2024 11:21:52 GMT
+- request:
+ method: get
+ uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ3KuuB1fWySn0ZLWpymG
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ User-Agent:
+ - Stripe/v1 RubyBindings/11.1.0
+ Authorization:
+ - "