spree_core 6.0.0.beta4 → 6.0.0.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/app/helpers/spree/images_helper.rb +0 -57
- data/app/jobs/spree/base_job.rb +21 -0
- data/app/jobs/spree/carts/reap_expired_job.rb +2 -2
- data/app/jobs/spree/collections/regenerate_time_based_job.rb +6 -3
- data/app/jobs/spree/orders/finalize_stale_drafts_job.rb +8 -5
- data/app/jobs/spree/payments/cancel_unused_sessions_job.rb +61 -0
- data/app/jobs/spree/search_provider/index_job.rb +4 -0
- data/app/jobs/spree/seller_payouts/sweep_seller_job.rb +2 -0
- data/app/jobs/spree/uploads/purge_unattached_job.rb +49 -0
- data/app/mailers/spree/admin_user_mailer.rb +4 -19
- data/app/mailers/spree/base_mailer.rb +97 -13
- data/app/mailers/spree/email_template_mailer.rb +27 -0
- data/app/mailers/spree/export_mailer.rb +3 -4
- data/app/mailers/spree/import_mailer.rb +3 -4
- data/app/mailers/spree/invitation_mailer.rb +24 -7
- data/app/mailers/spree/seller_user_mailer.rb +4 -16
- data/app/mailers/spree/webhook_mailer.rb +2 -2
- data/app/models/concerns/spree/acted_by.rb +1 -1
- data/app/models/concerns/spree/admin_user_methods.rb +15 -1
- data/app/models/concerns/spree/api_typed.rb +91 -0
- data/app/models/concerns/spree/calculated_adjustments.rb +41 -13
- data/app/models/concerns/spree/calculator/currency_amounts.rb +1 -1
- data/app/models/concerns/spree/calculator/tiers.rb +63 -0
- data/app/models/concerns/spree/canonical_decimals.rb +61 -0
- data/app/models/concerns/spree/customer_methods.rb +23 -18
- data/app/models/concerns/spree/derived_number.rb +11 -13
- data/app/models/concerns/spree/email_template_identity.rb +52 -0
- data/app/models/concerns/spree/parameterizable_name.rb +2 -0
- data/app/models/concerns/spree/payment_session_transitions.rb +8 -2
- data/app/models/concerns/spree/post_sale/taxation.rb +54 -0
- data/app/models/concerns/spree/post_sale/taxed_line.rb +51 -0
- data/app/models/concerns/spree/preference_schema/json_schema.rb +139 -0
- data/app/models/concerns/spree/preference_schema.rb +62 -32
- data/app/models/concerns/spree/product_scopes.rb +16 -2
- data/app/models/concerns/spree/provider_listing.rb +41 -0
- data/app/models/concerns/spree/publishable.rb +82 -14
- data/app/models/concerns/spree/purchase/addresses.rb +23 -10
- data/app/models/concerns/spree/purchase/currency.rb +1 -1
- data/app/models/concerns/spree/purchase/deprecated_aliases.rb +87 -0
- data/app/models/concerns/spree/purchase/gift_cards.rb +10 -4
- data/app/models/concerns/spree/purchase/locale.rb +1 -1
- data/app/models/concerns/spree/purchase/payment_processing.rb +8 -4
- data/app/models/concerns/spree/purchase/purchase_order.rb +9 -4
- data/app/models/concerns/spree/purchase/store_credits.rb +36 -1
- data/app/models/concerns/spree/purchase/totals.rb +49 -8
- data/app/models/concerns/spree/ransackable_attributes.rb +46 -0
- data/app/models/concerns/spree/receivable.rb +1 -1
- data/app/models/concerns/spree/searchable.rb +0 -4
- data/app/models/concerns/spree/secret_preferences.rb +59 -0
- data/app/models/concerns/spree/signed_id_attachments.rb +54 -0
- data/app/models/concerns/spree/single_store_resource.rb +1 -1
- data/app/models/concerns/spree/stores/email_branding.rb +32 -0
- data/app/models/concerns/spree/stores/markets.rb +5 -2
- data/app/models/concerns/spree/type_labels.rb +38 -0
- data/app/models/concerns/spree/typed_adjustment_line.rb +5 -6
- data/app/models/concerns/spree/typed_associations.rb +12 -18
- data/app/models/concerns/spree/vat_price_calculation.rb +5 -6
- data/app/models/spree/address.rb +12 -2
- data/app/models/spree/adjusters/largest_remainder.rb +14 -1
- data/app/models/spree/adjusters/promotion.rb +4 -19
- data/app/models/spree/allowed_origin.rb +3 -1
- data/app/models/spree/api_key.rb +5 -6
- data/app/models/spree/authentication/strategies/oidc_strategy.rb +5 -5
- data/app/models/spree/base.rb +99 -22
- data/app/models/spree/calculator/flat_percent_item_total.rb +2 -4
- data/app/models/spree/calculator/flat_rate.rb +3 -5
- data/app/models/spree/calculator/flexi_rate.rb +4 -6
- data/app/models/spree/calculator/percent_on_line_item.rb +2 -2
- data/app/models/spree/calculator/price_sack.rb +5 -7
- data/app/models/spree/calculator/shipping/digital_delivery.rb +3 -5
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +7 -7
- data/app/models/spree/calculator/shipping/flat_rate.rb +5 -7
- data/app/models/spree/calculator/shipping/flexi_rate.rb +4 -6
- data/app/models/spree/calculator/shipping/per_item.rb +3 -5
- data/app/models/spree/calculator/shipping/price_sack.rb +5 -7
- data/app/models/spree/calculator/tiered_flat_rate.rb +7 -24
- data/app/models/spree/calculator/tiered_percent.rb +7 -25
- data/app/models/spree/cart.rb +78 -18
- data/app/models/spree/catalog.rb +1 -0
- data/app/models/spree/catalog_price.rb +0 -7
- data/app/models/spree/catalog_price_tier.rb +0 -8
- data/app/models/spree/category.rb +3 -1
- data/app/models/spree/channel/gating.rb +3 -2
- data/app/models/spree/channel.rb +6 -4
- data/app/models/spree/claim.rb +22 -1
- data/app/models/spree/claim_line_item.rb +41 -6
- data/app/models/spree/collection.rb +2 -1
- data/app/models/spree/collection_rule.rb +5 -21
- data/app/models/spree/commission_line.rb +1 -1
- data/app/models/spree/commission_rate.rb +7 -4
- data/app/models/spree/commission_rate_value.rb +1 -1
- data/app/models/spree/commission_rule.rb +4 -11
- data/app/models/spree/commission_rules/category_rule.rb +2 -5
- data/app/models/spree/commission_rules/item_total_rule.rb +2 -2
- data/app/models/spree/commission_rules/product_rule.rb +1 -1
- data/app/models/spree/commission_rules/seller_rule.rb +2 -5
- data/app/models/spree/company.rb +1 -0
- data/app/models/spree/company_invitation.rb +1 -0
- data/app/models/spree/consent_record.rb +0 -1
- data/app/models/spree/credit_card.rb +1 -1
- data/app/models/spree/current.rb +23 -0
- data/app/models/spree/custom_field.rb +2 -2
- data/app/models/spree/custom_field_definition.rb +20 -35
- data/app/models/spree/custom_fields/boolean.rb +1 -1
- data/app/models/spree/custom_fields/json.rb +1 -1
- data/app/models/spree/customer_group.rb +1 -0
- data/app/models/spree/data_feed/google.rb +0 -2
- data/app/models/spree/data_request.rb +2 -1
- data/app/models/spree/delivery_method.rb +36 -14
- data/app/models/spree/delivery_method_rule.rb +4 -11
- data/app/models/spree/delivery_method_rules/channel_rule.rb +2 -5
- data/app/models/spree/delivery_method_rules/item_total_rule.rb +2 -2
- data/app/models/spree/delivery_profile.rb +1 -0
- data/app/models/spree/delivery_rate.rb +7 -8
- data/app/models/spree/delivery_rate_provider/base.rb +1 -0
- data/app/models/spree/delivery_zone.rb +1 -2
- data/app/models/spree/delivery_zone_member.rb +4 -4
- data/app/models/spree/digital_asset.rb +7 -0
- data/app/models/spree/digital_asset_provider/base.rb +2 -0
- data/app/models/spree/digital_link.rb +2 -5
- data/app/models/spree/discount.rb +1 -1
- data/app/models/spree/email_template.rb +25 -0
- data/app/models/spree/email_template_draft.rb +13 -0
- data/app/models/spree/email_template_revision.rb +17 -0
- data/app/models/spree/email_templates/entry.rb +118 -0
- data/app/models/spree/email_templates/sample_record.rb +16 -0
- data/app/models/spree/emails/branding.rb +80 -0
- data/app/models/spree/exchange.rb +16 -1
- data/app/models/spree/exchange_line_item.rb +121 -5
- data/app/models/spree/export.rb +0 -1
- data/app/models/spree/exports/products.rb +10 -1
- data/app/models/spree/exports/report.rb +3 -3
- data/app/models/spree/fee.rb +4 -2
- data/app/models/spree/file_upload.rb +155 -0
- data/app/models/spree/fulfillment.rb +66 -30
- data/app/models/spree/fulfillment_changer.rb +2 -2
- data/app/models/spree/fulfillment_group.rb +6 -1
- data/app/models/spree/fulfillment_item.rb +0 -4
- data/app/models/spree/fulfillment_provider/base.rb +1 -0
- data/app/models/spree/gateway/bogus.rb +6 -0
- data/app/models/spree/gateway/custom_payment_source_method.rb +5 -0
- data/app/models/spree/gateway.rb +6 -2
- data/app/models/spree/gift_card.rb +18 -8
- data/app/models/spree/gift_card_batch.rb +3 -5
- data/app/models/spree/import.rb +5 -7
- data/app/models/spree/import_mapping.rb +1 -2
- data/app/models/spree/import_row.rb +2 -2
- data/app/models/spree/import_schemas/products.rb +1 -0
- data/app/models/spree/integration.rb +9 -19
- data/app/models/spree/invitation.rb +5 -5
- data/app/models/spree/line_item.rb +15 -4
- data/app/models/spree/locale.rb +11 -8
- data/app/models/spree/market.rb +8 -2
- data/app/models/spree/media.rb +1 -9
- data/app/models/spree/newsletter_subscriber.rb +4 -0
- data/app/models/spree/option_type.rb +2 -1
- data/app/models/spree/option_value.rb +2 -1
- data/app/models/spree/order.rb +60 -142
- data/app/models/spree/order_group.rb +18 -4
- data/app/models/spree/order_inventory.rb +10 -5
- data/app/models/spree/order_promotion.rb +1 -1
- data/app/models/spree/order_routing/has_strategy_preference.rb +1 -1
- data/app/models/spree/order_routing/strategy/base.rb +4 -2
- data/app/models/spree/order_routing/strategy/rules.rb +1 -1
- data/app/models/spree/order_routing_rule.rb +6 -22
- data/app/models/spree/package_type.rb +2 -2
- data/app/models/spree/payment/gateway_options.rb +15 -53
- data/app/models/spree/payment/processing.rb +2 -4
- data/app/models/spree/payment.rb +21 -13
- data/app/models/spree/payment_method/check.rb +2 -0
- data/app/models/spree/payment_method/session_instrumentation.rb +1 -0
- data/app/models/spree/payment_method/store_credit.rb +15 -13
- data/app/models/spree/payment_method.rb +78 -6
- data/app/models/spree/payment_session.rb +5 -1
- data/app/models/spree/payment_setup_session.rb +1 -0
- data/app/models/spree/payout_provider/base.rb +3 -1
- data/app/models/spree/pickup_point_provider/base.rb +2 -0
- data/app/models/spree/policy.rb +1 -0
- data/app/models/spree/price.rb +17 -14
- data/app/models/spree/price_adjustment_tier.rb +4 -0
- data/app/models/spree/price_list.rb +14 -9
- data/app/models/spree/price_rules/channel_rule.rb +3 -6
- data/app/models/spree/price_rules/customer_group_rule.rb +3 -6
- data/app/models/spree/price_rules/market_rule.rb +2 -5
- data/app/models/spree/price_rules/user_rule.rb +1 -3
- data/app/models/spree/product/channels.rb +9 -2
- data/app/models/spree/product.rb +54 -30
- data/app/models/spree/product_submission.rb +0 -12
- data/app/models/spree/product_type.rb +1 -1
- data/app/models/spree/promotion/actions/create_line_items.rb +28 -18
- data/app/models/spree/promotion/rules/category.rb +1 -5
- data/app/models/spree/promotion/rules/channel.rb +2 -9
- data/app/models/spree/promotion/rules/country.rb +3 -8
- data/app/models/spree/promotion/rules/currency.rb +1 -5
- data/app/models/spree/promotion/rules/customer_group.rb +2 -9
- data/app/models/spree/promotion/rules/first_order.rb +0 -4
- data/app/models/spree/promotion/rules/item_total.rb +6 -10
- data/app/models/spree/promotion/rules/market.rb +2 -9
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -4
- data/app/models/spree/promotion/rules/option_value.rb +2 -6
- data/app/models/spree/promotion/rules/product.rb +1 -5
- data/app/models/spree/promotion/rules/user.rb +0 -4
- data/app/models/spree/promotion/rules/user_logged_in.rb +0 -4
- data/app/models/spree/promotion.rb +36 -6
- data/app/models/spree/promotion_action.rb +7 -14
- data/app/models/spree/promotion_action_line_item.rb +1 -1
- data/app/models/spree/promotion_handler/coupon.rb +59 -27
- data/app/models/spree/promotion_rule.rb +7 -14
- data/app/models/spree/purchase_order.rb +3 -0
- data/app/models/spree/quantity_rule.rb +1 -1
- data/app/models/spree/refund.rb +41 -18
- data/app/models/spree/return.rb +31 -2
- data/app/models/spree/return_line_item.rb +65 -14
- data/app/models/spree/role.rb +7 -7
- data/app/models/spree/saved_report.rb +2 -1
- data/app/models/spree/search_provider/base.rb +4 -0
- data/app/models/spree/seller.rb +10 -2
- data/app/models/spree/seller_payout.rb +8 -0
- data/app/models/spree/seller_requirement.rb +5 -12
- data/app/models/spree/seller_requirement_custom_field.rb +1 -2
- data/app/models/spree/seller_requirement_submission.rb +3 -2
- data/app/models/spree/seller_requirements/accept_terms.rb +2 -3
- data/app/models/spree/seller_transfer.rb +6 -0
- data/app/models/spree/shipping_label.rb +2 -0
- data/app/models/spree/stock/availability_validator.rb +2 -2
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/packer.rb +2 -2
- data/app/models/spree/stock/splitter/weight.rb +1 -1
- data/app/models/spree/stock_level/custom_events.rb +6 -0
- data/app/models/spree/stock_level.rb +3 -1
- data/app/models/spree/stock_location.rb +1 -0
- data/app/models/spree/stock_movement.rb +1 -1
- data/app/models/spree/stock_receipt_item.rb +1 -1
- data/app/models/spree/stock_reservation.rb +2 -2
- data/app/models/spree/stock_transfer.rb +6 -2
- data/app/models/spree/store.rb +70 -19
- data/app/models/spree/store_credit.rb +13 -13
- data/app/models/spree/store_credit_event.rb +5 -5
- data/app/models/spree/supplier.rb +1 -0
- data/app/models/spree/tax_category.rb +1 -0
- data/app/models/spree/tax_exemption_certificate.rb +3 -0
- data/app/models/spree/tax_identifier.rb +3 -1
- data/app/models/spree/tax_line.rb +53 -3
- data/app/models/spree/tax_provider/base.rb +71 -14
- data/app/models/spree/tax_provider/internal.rb +70 -41
- data/app/models/spree/tax_provider/recorded_share.rb +114 -0
- data/app/models/spree/tax_rate.rb +30 -8
- data/app/models/spree/taxon.rb +1 -1
- data/app/models/spree/taxonomy.rb +0 -1
- data/app/models/spree/update_status.rb +25 -0
- data/app/models/spree/variant.rb +10 -12
- data/app/models/spree/variant_media.rb +1 -1
- data/app/models/spree/webhook_delivery.rb +1 -0
- data/app/models/spree/webhook_endpoint.rb +46 -13
- data/app/models/spree/wishlist.rb +1 -6
- data/app/models/spree/wishlist_item/custom_events.rb +6 -0
- data/app/presenters/spree/csv/customer_presenter.rb +1 -1
- data/app/presenters/spree/csv/newsletter_subscriber_presenter.rb +1 -1
- data/app/presenters/spree/csv/order_line_item_presenter.rb +10 -6
- data/app/presenters/spree/csv/price_list_price_presenter.rb +3 -8
- data/app/presenters/spree/csv/product_variant_presenter.rb +59 -20
- data/app/presenters/spree/csv/purchase_order_item_presenter.rb +1 -3
- data/app/serializers/spree/emails/base_serializer.rb +14 -0
- data/app/serializers/spree/emails/export_serializer.rb +13 -0
- data/app/serializers/spree/emails/import_serializer.rb +19 -0
- data/app/serializers/spree/emails/invitation_serializer.rb +28 -0
- data/app/serializers/spree/emails/store_serializer.rb +31 -0
- data/app/serializers/spree/emails/user_serializer.rb +12 -0
- data/app/serializers/spree/emails/webhook_endpoint_serializer.rb +16 -0
- data/app/services/spree/carts/create.rb +8 -2
- data/app/services/spree/carts/destroy.rb +2 -2
- data/app/services/spree/carts/remove_out_of_stock_items.rb +2 -2
- data/app/services/spree/carts/split_by_seller.rb +1 -1
- data/app/services/spree/carts/update.rb +22 -8
- data/app/services/spree/catalogs/set_product_terms.rb +1 -1
- data/app/services/spree/categories/add_products.rb +13 -31
- data/app/services/spree/categories/remove_products.rb +12 -51
- data/app/services/spree/checkout/advance.rb +1 -4
- data/app/services/spree/collections/add_products.rb +10 -23
- data/app/services/spree/collections/remove_products.rb +7 -43
- data/app/services/spree/coupon_codes/bulk_generate.rb +8 -14
- data/app/services/spree/data_requests/create.rb +1 -1
- data/app/services/spree/deliveries/destroy.rb +2 -2
- data/app/services/spree/email_templates/check.rb +58 -0
- data/app/services/spree/email_templates/no_sample_record.rb +7 -0
- data/app/services/spree/email_templates/preview.rb +99 -0
- data/app/services/spree/emails/file_system.rb +23 -0
- data/app/services/spree/emails/filters.rb +84 -0
- data/app/services/spree/emails/liquid_context.rb +48 -0
- data/app/services/spree/emails/rendered_email.rb +14 -0
- data/app/services/spree/emails/renderer.rb +125 -0
- data/app/services/spree/emails/template.rb +51 -0
- data/app/services/spree/emails/template_data.rb +23 -0
- data/app/services/spree/emails/template_resolver.rb +109 -0
- data/app/services/spree/emails/text_converter.rb +72 -0
- data/app/services/spree/emails/translation_inliner.rb +134 -0
- data/app/services/spree/imports/row_processors/price_list_price.rb +10 -10
- data/app/services/spree/imports/row_processors/product_variant.rb +77 -34
- data/app/services/spree/imports/row_processors/purchase_order.rb +13 -13
- data/app/services/spree/locales.rb +43 -10
- data/app/services/spree/newsletter/subscribe.rb +8 -12
- data/app/services/spree/orders/build_fulfillments.rb +3 -2
- data/app/services/spree/orders/create.rb +5 -4
- data/app/services/spree/orders/discounts/create.rb +14 -11
- data/app/services/spree/orders/discounts/destroy.rb +1 -0
- data/app/services/spree/orders/discounts/update.rb +1 -0
- data/app/services/spree/orders/fees/create.rb +1 -0
- data/app/services/spree/orders/fees/destroy.rb +1 -0
- data/app/services/spree/orders/fees/update.rb +1 -0
- data/app/services/spree/orders/remove_line_item.rb +13 -3
- data/app/services/spree/orders/update.rb +10 -6
- data/app/services/spree/orders/update_item.rb +6 -3
- data/app/services/spree/orders/update_statuses.rb +3 -1
- data/app/services/spree/prices/bulk_upsert.rb +32 -25
- data/app/services/spree/product_memberships.rb +61 -0
- data/app/services/spree/returns/eligibility_validator.rb +1 -1
- data/app/services/spree/search_provider/custom_field_schema.rb +2 -2
- data/app/services/spree/seeds/commission_rates.rb +1 -1
- data/app/services/spree/seeds/digital_delivery.rb +1 -1
- data/app/services/spree/seeds/payment_methods.rb +2 -2
- data/app/services/spree/seeds/saved_reports.rb +3 -3
- data/app/services/spree/seeds/stores.rb +1 -1
- data/app/services/spree/sellers/requirements.rb +1 -2
- data/app/services/spree/shipping_labels/confirm_refund.rb +1 -1
- data/app/services/spree/shipping_labels/store_file.rb +3 -3
- data/app/services/spree/stock_levels/correct.rb +3 -3
- data/app/services/spree/stock_reservations/reserve.rb +2 -3
- data/app/services/spree/store_credits/apply.rb +15 -13
- data/app/services/spree/stores/provision_defaults.rb +23 -25
- data/app/services/spree/update_check.rb +160 -0
- data/app/services/spree/uploads/assign_stores.rb +92 -0
- data/app/subscribers/spree/seller_onboarding_subscriber.rb +1 -1
- data/app/validators/spree/attachment_content_type_validator.rb +19 -2
- data/app/validators/spree/locale_codes_validator.rb +22 -0
- data/app/views/layouts/spree/base_mailer.html.erb +2 -43
- data/app/views/layouts/spree/base_mailer.liquid +79 -0
- data/app/views/spree/admin_user_mailer/password_reset_email.liquid +14 -0
- data/app/views/spree/export_mailer/export_done.liquid +12 -0
- data/app/views/spree/import_mailer/import_done.liquid +15 -0
- data/app/views/spree/invitation_mailer/invitation_accepted.liquid +9 -0
- data/app/views/spree/invitation_mailer/invitation_email.liquid +13 -0
- data/app/views/spree/seller_user_mailer/password_reset_email.liquid +14 -0
- data/app/views/spree/shared/_mailer_button.html.erb +4 -5
- data/app/views/spree/shared/_mailer_hero.html.erb +6 -5
- data/app/views/spree/shared/_summary_row.liquid +8 -0
- data/app/views/spree/webhook_mailer/endpoint_disabled.liquid +21 -0
- data/app/workflows/spree/carts/add_item.rb +4 -4
- data/app/workflows/spree/carts/complete.rb +13 -3
- data/app/workflows/spree/carts/merge.rb +1 -1
- data/app/workflows/spree/carts/recalculate_totals.rb +5 -0
- data/app/workflows/spree/carts/upsert_items.rb +18 -9
- data/app/workflows/spree/claims/approve.rb +5 -22
- data/app/workflows/spree/claims/cancel.rb +5 -21
- data/app/workflows/spree/claims/create.rb +15 -0
- data/app/workflows/spree/claims/deny.rb +7 -0
- data/app/workflows/spree/claims/resolve.rb +34 -31
- data/app/workflows/spree/customers/anonymize.rb +3 -4
- data/app/workflows/spree/customers/create.rb +1 -1
- data/app/workflows/spree/data_requests/fulfill.rb +2 -2
- data/app/workflows/spree/deliveries/update_tracking.rb +1 -1
- data/app/workflows/spree/email_templates/discard_draft.rb +20 -0
- data/app/workflows/spree/email_templates/publish.rb +70 -0
- data/app/workflows/spree/email_templates/restore_revision.rb +33 -0
- data/app/workflows/spree/email_templates/revert.rb +29 -0
- data/app/workflows/spree/email_templates/save_draft.rb +85 -0
- data/app/workflows/spree/exchanges/approve.rb +5 -22
- data/app/workflows/spree/exchanges/cancel.rb +5 -21
- data/app/workflows/spree/exchanges/create.rb +6 -0
- data/app/workflows/spree/exchanges/fulfill.rb +75 -51
- data/app/workflows/spree/exchanges/receive.rb +6 -65
- data/app/workflows/spree/fulfillments/cancel.rb +1 -1
- data/app/workflows/spree/fulfillments/create.rb +53 -49
- data/app/workflows/spree/fulfillments/fulfill.rb +23 -27
- data/app/workflows/spree/fulfillments/mark_delivered.rb +1 -1
- data/app/workflows/spree/fulfillments/replacements.rb +59 -0
- data/app/workflows/spree/gift_cards/apply.rb +2 -2
- data/app/workflows/spree/orders/add_item.rb +5 -1
- data/app/workflows/spree/orders/cancel.rb +3 -3
- data/app/workflows/spree/orders/complete.rb +16 -8
- data/app/workflows/spree/payments/capture.rb +20 -5
- data/app/workflows/spree/payments/process.rb +5 -3
- data/app/workflows/spree/post_sale/approval.rb +35 -0
- data/app/workflows/spree/post_sale/cancellation.rb +44 -0
- data/app/workflows/spree/post_sale/receipt.rb +92 -0
- data/app/workflows/spree/price_lists/update.rb +4 -4
- data/app/workflows/spree/products/nested_attributes.rb +1 -1
- data/app/workflows/spree/purchase_orders/cancel.rb +1 -1
- data/app/workflows/spree/purchase_orders/close.rb +3 -31
- data/app/workflows/spree/purchase_orders/create.rb +3 -1
- data/app/workflows/spree/purchase_orders/mark_draft.rb +2 -2
- data/app/workflows/spree/purchase_orders/mark_ordered.rb +2 -2
- data/app/workflows/spree/purchase_orders/receive.rb +1 -1
- data/app/workflows/spree/purchase_orders/update.rb +5 -34
- data/app/workflows/spree/receivables/closing_short.rb +46 -0
- data/app/workflows/spree/receivables/draft_editing.rb +48 -0
- data/app/workflows/spree/refunds/create.rb +5 -2
- data/app/workflows/spree/refunds/order_payments.rb +14 -2
- data/app/workflows/spree/refunds/tax_credit.rb +67 -0
- data/app/workflows/spree/returns/approve.rb +5 -22
- data/app/workflows/spree/returns/cancel.rb +5 -22
- data/app/workflows/spree/returns/create.rb +8 -0
- data/app/workflows/spree/returns/receive.rb +5 -76
- data/app/workflows/spree/returns/refund.rb +31 -8
- data/app/workflows/spree/seller_requirement_submissions/create.rb +1 -2
- data/app/workflows/spree/seller_transfers/reverse.rb +28 -1
- data/app/workflows/spree/shipping_labels/purchase.rb +8 -8
- data/app/workflows/spree/shipping_labels/record.rb +7 -7
- data/app/workflows/spree/shipping_labels/refund.rb +2 -2
- data/app/workflows/spree/stock_receipts/recording.rb +4 -4
- data/app/workflows/spree/stock_transfers/cancel.rb +2 -2
- data/app/workflows/spree/stock_transfers/close.rb +3 -30
- data/app/workflows/spree/stock_transfers/create.rb +3 -1
- data/app/workflows/spree/stock_transfers/mark_draft.rb +1 -1
- data/app/workflows/spree/stock_transfers/mark_in_transit.rb +3 -3
- data/app/workflows/spree/stock_transfers/mark_ready.rb +2 -2
- data/app/workflows/spree/stock_transfers/receive.rb +1 -1
- data/app/workflows/spree/stock_transfers/update.rb +5 -33
- data/config/currency_exponents.json +180 -0
- data/config/i18n-tasks.yml +32 -18
- data/config/initializers/alba.rb +7 -0
- data/config/language_names.csv +264 -0
- data/config/locales/ar.yml +811 -0
- data/config/locales/be.yml +855 -0
- data/config/locales/bg.yml +723 -0
- data/config/locales/ca.yml +689 -0
- data/config/locales/content_locales.rb +9 -0
- data/config/locales/cs.yml +855 -0
- data/config/locales/da.yml +771 -0
- data/config/locales/de-CH.yml +248 -0
- data/config/locales/de.yml +835 -0
- data/config/locales/el.yml +769 -0
- data/config/locales/en.yml +47 -505
- data/config/locales/es-CL.yml +301 -0
- data/config/locales/es-EC.yml +186 -0
- data/config/locales/es-MX.yml +334 -0
- data/config/locales/es.yml +831 -0
- data/config/locales/et.yml +644 -0
- data/config/locales/fa.yml +709 -0
- data/config/locales/fi.yml +771 -0
- data/config/locales/fr.yml +830 -0
- data/config/locales/hu.yml +751 -0
- data/config/locales/id.yml +756 -0
- data/config/locales/it.yml +833 -0
- data/config/locales/ja.yml +726 -0
- data/config/locales/km.yml +759 -0
- data/config/locales/ko.yml +575 -0
- data/config/locales/ku.yml +753 -0
- data/config/locales/lt.yml +821 -0
- data/config/locales/lv.yml +685 -0
- data/config/locales/nb.yml +824 -0
- data/config/locales/ne.yml +823 -0
- data/config/locales/nl.yml +826 -0
- data/config/locales/pl.yml +835 -0
- data/config/locales/pt-BR.yml +547 -0
- data/config/locales/pt.yml +636 -0
- data/config/locales/ro.yml +750 -0
- data/config/locales/ru.yml +834 -0
- data/config/locales/sk.yml +680 -0
- data/config/locales/sl-SI.yml +600 -0
- data/config/locales/sv.yml +827 -0
- data/config/locales/th.yml +745 -0
- data/config/locales/tr.yml +777 -0
- data/config/locales/uk.yml +836 -0
- data/config/locales/vi.yml +768 -0
- data/config/locales/zh-CN.yml +786 -0
- data/config/locales/zh-TW.yml +834 -0
- data/db/migrate/20260925000001_add_replacement_to_spree_fulfillment_items.rb +5 -0
- data/db/migrate/20261001000001_add_post_sale_tax.rb +30 -0
- data/db/migrate/20261001000001_convert_preferences_to_json.rb +166 -0
- data/db/migrate/20261001000001_create_spree_email_templates.rb +52 -0
- data/db/migrate/20261009000001_change_money_columns_to_decimal_19_4.rb +116 -0
- data/db/migrate/20261010000001_add_store_id_to_active_storage_blobs.rb +12 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +0 -9
- data/lib/generators/spree/dummy/templates/rails/test.rb +26 -0
- data/lib/spree/checkout/default_requirements.rb +37 -13
- data/lib/spree/core/configuration.rb +19 -1
- data/lib/spree/core/controller_helpers/store.rb +1 -1
- data/lib/spree/core/dependencies.rb +5 -4
- data/lib/spree/core/emails/escaped_output.rb +60 -0
- data/lib/spree/core/engine.rb +72 -165
- data/lib/spree/core/permissions/default_catalog.rb +5 -0
- data/lib/spree/core/preferences/invalid_preferences.rb +18 -0
- data/lib/spree/core/preferences/json_conversion.rb +186 -0
- data/lib/spree/core/preferences/masking.rb +55 -2
- data/lib/spree/core/preferences/preferable.rb +343 -103
- data/lib/spree/core/preferences/preferable_class_methods.rb +188 -136
- data/lib/spree/core/previews/import_preview.rb +10 -0
- data/lib/spree/core/ransack_configuration.rb +13 -2
- data/lib/spree/core/tax/provider_error.rb +37 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +91 -373
- data/lib/spree/emails/editable_templates.rb +82 -0
- data/lib/spree/events/catalog.rb +189 -0
- data/lib/spree/events.rb +21 -1
- data/lib/spree/hooks.rb +0 -17
- data/lib/spree/i18n.rb +32 -15
- data/lib/spree/iso_data.rb +7 -0
- data/lib/spree/localized_number.rb +6 -0
- data/lib/spree/migrations.rb +4 -1
- data/lib/spree/money.rb +196 -15
- data/lib/spree/reporting/adapters/base.rb +7 -6
- data/lib/spree/reporting/adapters/live.rb +6 -6
- data/lib/spree/reporting/default_vocabulary.rb +22 -10
- data/lib/spree/reporting/hydration.rb +1 -1
- data/lib/spree/reporting/query.rb +8 -0
- data/lib/spree/reporting/registry.rb +13 -0
- data/lib/spree/reporting/schema.rb +10 -10
- data/lib/spree/testing_support/editable_email_templates.rb +61 -0
- data/lib/spree/testing_support/emails.rb +22 -0
- data/lib/spree/testing_support/factories/cart_factory.rb +1 -1
- data/lib/spree/testing_support/factories/email_template_factory.rb +28 -0
- data/lib/spree/testing_support/factories/order_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_factory.rb +9 -0
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
- data/lib/spree/testing_support/i18n.rb +3 -94
- data/lib/spree/testing_support/lifecycle_events.rb +1 -1
- data/lib/spree/testing_support/order_walkthrough.rb +1 -1
- data/lib/spree/testing_support/preferences.rb +0 -5
- data/lib/spree/testing_support/store.rb +9 -1
- data/lib/spree/upgrades/5_6_to_6_0/manifest.yml +67 -1
- data/lib/spree/uploads.rb +101 -0
- data/lib/tasks/categories_and_collections.rake +3 -3
- data/lib/tasks/core.rake +6 -4
- data/lib/tasks/markets.rake +2 -1
- data/lib/tasks/media.rake +3 -3
- data/lib/tasks/migrate_users_to_customers.rake +23 -18
- data/lib/tasks/money.rake +46 -0
- data/lib/tasks/package_types.rake +1 -1
- data/lib/tasks/preferences_json.rake +101 -0
- data/lib/tasks/seller_sample_data.rake +2 -2
- data/lib/tasks/store_settings.rake +13 -6
- data/lib/tasks/typed_adjustments_migration.rake +1 -1
- data/lib/tasks/uploads.rake +19 -0
- data/spec/fixtures/mailer_views/custom_views_probe_mailer/welcome_email.html.erb +4 -0
- metadata +219 -46
- data/app/jobs/spree/products/touch_categories_job.rb +0 -15
- data/app/jobs/spree/products/touch_taxons_job.rb +0 -13
- data/app/models/acts_as_taggable_on/tag_decorator.rb +0 -10
- data/app/models/concerns/spree/has_image_alt_text.rb +0 -18
- data/app/models/spree/base_analytics_event_handler.rb +0 -54
- data/app/models/spree/invitations/store.rb +0 -6
- data/app/models/spree/preference.rb +0 -14
- data/app/models/spree/promotion_handler/page.rb +0 -25
- data/app/models/spree/promotion_handler/promotion_duplicator.rb +0 -60
- data/app/models/spree/stock/differentiator.rb +0 -45
- data/app/presenters/spree/filters/options_presenter.rb +0 -47
- data/app/services/spree/carts/empty.rb +0 -42
- data/app/services/spree/country_to_timezone.rb +0 -273
- data/app/services/spree/payments/create.rb +0 -92
- data/app/validators/spree/url_validator.rb +0 -23
- data/app/views/active_storage/blobs/_blob.html.erb +0 -14
- data/app/views/spree/admin_user_mailer/password_reset_email.html.erb +0 -8
- data/app/views/spree/export_mailer/export_done.html.erb +0 -7
- data/app/views/spree/import_mailer/import_done.html.erb +0 -12
- data/app/views/spree/invitation_mailer/invitation_accepted.html.erb +0 -4
- data/app/views/spree/invitation_mailer/invitation_email.html.erb +0 -12
- data/app/views/spree/seller_user_mailer/password_reset_email.html.erb +0 -8
- data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -19
- data/app/views/spree/shared/_base_mailer_header.html.erb +0 -8
- data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -399
- data/app/views/spree/shared/_mailer_logo.html.erb +0 -41
- data/app/views/spree/shared/_purchased_items_styles.html.erb +0 -119
- data/app/views/spree/webhook_mailer/endpoint_disabled.html.erb +0 -51
- data/app/views/spree/webhook_mailer/endpoint_disabled.text.erb +0 -10
- data/app/workflows/spree/fulfillments/purchase_label.rb +0 -40
- data/app/workflows/spree/returns/purchase_label.rb +0 -32
- data/lib/spree/analytics.rb +0 -11
- data/lib/spree/core/preferences/scoped_store.rb +0 -34
- data/lib/spree/core/preferences/store.rb +0 -105
- data/lib/spree/translation_migrations.rb +0 -52
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module Spree
|
|
2
2
|
class ImportRow < Spree.base_class
|
|
3
|
+
publishes_events :completed, :failed
|
|
4
|
+
|
|
3
5
|
has_prefix_id :imrow
|
|
4
6
|
|
|
5
7
|
# Set event prefix for ImportRow
|
|
@@ -41,8 +43,6 @@ module Spree
|
|
|
41
43
|
# Scopes
|
|
42
44
|
#
|
|
43
45
|
scope :pending_and_failed, -> { where(status: %i[pending failed]) }
|
|
44
|
-
scope :completed, -> { where(status: :completed) }
|
|
45
|
-
scope :failed, -> { where(status: :failed) }
|
|
46
46
|
scope :processed, -> { where(status: %i[completed failed]) }
|
|
47
47
|
# Rows still legitimately blocking import completion: `pending` (not started) or
|
|
48
48
|
# `processing` with a recent updated_at (worker still alive). Orphaned `processing`
|
|
@@ -25,6 +25,7 @@ module Spree
|
|
|
25
25
|
{ name: 'track_inventory', label: 'Track Inventory' },
|
|
26
26
|
{ name: 'inventory_count', label: 'Inventory Count' },
|
|
27
27
|
{ name: 'inventory_backorderable', label: 'Inventory Backorderable' },
|
|
28
|
+
{ name: 'stock_location', label: 'Stock Location' },
|
|
28
29
|
{ name: 'tax_category', label: 'Tax Category' },
|
|
29
30
|
{ name: 'product_type', label: 'Product Type' },
|
|
30
31
|
{ name: 'hs_code', label: 'HS Code' },
|
|
@@ -10,6 +10,9 @@ module Spree
|
|
|
10
10
|
|
|
11
11
|
include Spree::SingleStoreResource
|
|
12
12
|
include Spree::PreferenceSchema
|
|
13
|
+
include Spree::SecretPreferences
|
|
14
|
+
include Spree::ProviderListing
|
|
15
|
+
|
|
13
16
|
|
|
14
17
|
# Spree::Current.integrations snapshots the active set for the request;
|
|
15
18
|
# connecting or deactivating one mid-request (the activate-and-verify
|
|
@@ -58,25 +61,12 @@ module Spree
|
|
|
58
61
|
attr_accessor :connection_error_message
|
|
59
62
|
|
|
60
63
|
# Associates the integration to a group.
|
|
61
|
-
# The name
|
|
64
|
+
# The name is read as a translation key under +spree.+ to display the group name.
|
|
62
65
|
# Leave blank to leave the integration ungrouped.
|
|
63
66
|
def self.integration_group
|
|
64
67
|
nil
|
|
65
68
|
end
|
|
66
69
|
|
|
67
|
-
# Logo shown on the gallery card: an absolute URL to publicly hosted
|
|
68
|
-
# brand assets, or a `data:` URI for gems that want to be self-contained
|
|
69
|
-
# (works air-gapped, no CSP domain to allowlist). Anything an `<img src>`
|
|
70
|
-
# accepts. Deliberately not an asset-pipeline path — integration gems
|
|
71
|
-
# must not force an asset pipeline onto headless API hosts. Hosted logos
|
|
72
|
-
# are a courtesy, not a guarantee: the dashboard falls back to a letter
|
|
73
|
-
# avatar when unset or unreachable.
|
|
74
|
-
#
|
|
75
|
-
# @return [String, nil]
|
|
76
|
-
def self.logo_url
|
|
77
|
-
nil
|
|
78
|
-
end
|
|
79
|
-
|
|
80
70
|
# One-line marketing description shown on the integration's gallery card.
|
|
81
71
|
# Localize by shipping a Rails translation instead (or additionally):
|
|
82
72
|
# `spree.integrations.<api_type>.description` wins over this fallback.
|
|
@@ -92,7 +82,7 @@ module Spree
|
|
|
92
82
|
#
|
|
93
83
|
# @return [String, nil]
|
|
94
84
|
def self.human_description
|
|
95
|
-
|
|
85
|
+
I18n.t("spree.integrations.#{api_type}.description", default: description)
|
|
96
86
|
end
|
|
97
87
|
|
|
98
88
|
# Wire entries for the admin types-discovery endpoint — every registered
|
|
@@ -107,8 +97,8 @@ module Spree
|
|
|
107
97
|
name: klass.integration_name,
|
|
108
98
|
group: klass.integration_group,
|
|
109
99
|
description: klass.human_description,
|
|
110
|
-
|
|
111
|
-
|
|
100
|
+
**klass.provider_listing,
|
|
101
|
+
schema: klass.preference_json_schema
|
|
112
102
|
}
|
|
113
103
|
end.sort_by { |entry| entry[:name] }
|
|
114
104
|
end
|
|
@@ -172,7 +162,7 @@ module Spree
|
|
|
172
162
|
return if Spree.integrations.empty?
|
|
173
163
|
return if Spree.integrations.map(&:to_s).include?(type)
|
|
174
164
|
|
|
175
|
-
errors.add(:type, :integration_type_not_registered, message:
|
|
165
|
+
errors.add(:type, :integration_type_not_registered, message: I18n.t('spree.errors.messages.integration_type_not_registered'))
|
|
176
166
|
end
|
|
177
167
|
|
|
178
168
|
# On :base, not :active — the seller's message ("This api key is no
|
|
@@ -182,7 +172,7 @@ module Spree
|
|
|
182
172
|
def must_connect_when_activating
|
|
183
173
|
return if can_connect?
|
|
184
174
|
|
|
185
|
-
errors.add(:base, connection_error_message.presence ||
|
|
175
|
+
errors.add(:base, connection_error_message.presence || I18n.t('spree.errors.messages.integration_connection_failed'))
|
|
186
176
|
end
|
|
187
177
|
end
|
|
188
178
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module Spree
|
|
2
2
|
class Invitation < Spree.base_class
|
|
3
|
+
publishes_events :accepted, :created, :resent
|
|
4
|
+
|
|
3
5
|
has_prefix_id :inv
|
|
4
6
|
|
|
5
7
|
has_secure_token
|
|
@@ -32,8 +34,6 @@ module Spree
|
|
|
32
34
|
#
|
|
33
35
|
# Scopes
|
|
34
36
|
#
|
|
35
|
-
scope :pending, -> { where(status: 'pending') }
|
|
36
|
-
scope :accepted, -> { where(status: 'accepted') }
|
|
37
37
|
scope :not_expired, -> { where('expires_at > ?', Time.current) }
|
|
38
38
|
|
|
39
39
|
#
|
|
@@ -144,7 +144,7 @@ module Spree
|
|
|
144
144
|
|
|
145
145
|
def invitee_is_not_inviter
|
|
146
146
|
if invitee == inviter
|
|
147
|
-
errors.add(:invitee, :same_as_inviter, message:
|
|
147
|
+
errors.add(:invitee, :same_as_inviter, message: I18n.t('spree.errors.messages.same_as_inviter'))
|
|
148
148
|
end
|
|
149
149
|
end
|
|
150
150
|
|
|
@@ -154,7 +154,7 @@ module Spree
|
|
|
154
154
|
return if role.blank? || resource.blank?
|
|
155
155
|
return if role.resource == resource
|
|
156
156
|
|
|
157
|
-
errors.add(:role, :invitation_role_resource_mismatch, message:
|
|
157
|
+
errors.add(:role, :invitation_role_resource_mismatch, message: I18n.t('spree.invitation_role_resource_mismatch'))
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
def invitee_already_exists
|
|
@@ -165,7 +165,7 @@ module Spree
|
|
|
165
165
|
return if user_to_check.blank?
|
|
166
166
|
|
|
167
167
|
if resource.role_users.exists?(user: user_to_check)
|
|
168
|
-
errors.add(:email, :already_a_member, message:
|
|
168
|
+
errors.add(:email, :already_a_member, message: I18n.t('spree.errors.messages.already_a_member'))
|
|
169
169
|
end
|
|
170
170
|
end
|
|
171
171
|
|
|
@@ -63,7 +63,7 @@ module Spree
|
|
|
63
63
|
# https://github.com/spree/spree/issues/2695#issuecomment-143314161
|
|
64
64
|
validates :quantity, numericality: {
|
|
65
65
|
in: 0..DB_INTEGER_MAX,
|
|
66
|
-
only_integer: true, message:
|
|
66
|
+
only_integer: true, message: I18n.t('spree.validation.must_be_int')
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
validates :price, numericality: true
|
|
@@ -119,7 +119,7 @@ module Spree
|
|
|
119
119
|
|
|
120
120
|
self.whitelisted_ransackable_associations = %w[variant order tax_category]
|
|
121
121
|
self.whitelisted_ransackable_attributes = %w[variant_id order_id tax_category_id quantity
|
|
122
|
-
price cost_price
|
|
122
|
+
price cost_price adjustment_total
|
|
123
123
|
additional_tax_total discount_total included_tax_total
|
|
124
124
|
pre_tax_amount taxable_adjustment_total
|
|
125
125
|
non_taxable_adjustment_total]
|
|
@@ -231,7 +231,7 @@ module Spree
|
|
|
231
231
|
#
|
|
232
232
|
# @return [BigDecimal]
|
|
233
233
|
def amount
|
|
234
|
-
price * quantity
|
|
234
|
+
Spree::Money::Rounding.to_currency(price * quantity, currency)
|
|
235
235
|
end
|
|
236
236
|
|
|
237
237
|
# Returns the compare at amount (compare at price * quantity) of the line item
|
|
@@ -260,6 +260,17 @@ module Spree
|
|
|
260
260
|
alias discounted_money display_discounted_amount
|
|
261
261
|
alias discounted_amount taxable_amount
|
|
262
262
|
|
|
263
|
+
# What +units+ of this line cost the customer after discounts. Multiplied
|
|
264
|
+
# before dividing, so all of a line's units together come to the whole line.
|
|
265
|
+
#
|
|
266
|
+
# @param units [Integer]
|
|
267
|
+
# @return [BigDecimal] rounded to the currency, never negative
|
|
268
|
+
def discounted_amount_for(units)
|
|
269
|
+
return BigDecimal(0) if quantity.to_i.zero?
|
|
270
|
+
|
|
271
|
+
Spree::Money::Rounding.to_currency([discounted_amount, 0].max * units.to_i / quantity, currency)
|
|
272
|
+
end
|
|
273
|
+
|
|
263
274
|
# Returns the amount this line item is taxed on. Whole-order promotions
|
|
264
275
|
# are distributed to line-item Discount rows at application time, so the
|
|
265
276
|
# discounted amount already carries the line's share. Never negative.
|
|
@@ -485,7 +496,7 @@ module Spree
|
|
|
485
496
|
end
|
|
486
497
|
|
|
487
498
|
def exactly_one_owner
|
|
488
|
-
errors.add(:base, :exactly_one_of_cart_or_order, message:
|
|
499
|
+
errors.add(:base, :exactly_one_of_cart_or_order, message: I18n.t('spree.errors.messages.exactly_one_of_cart_or_order')) unless [order, cart].compact.one?
|
|
489
500
|
end
|
|
490
501
|
end
|
|
491
502
|
end
|
data/app/models/spree/locale.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'csv'
|
|
2
|
+
|
|
1
3
|
module Spree
|
|
2
4
|
# Virtual model for a supported locale. Wraps a locale +code+ and exposes its
|
|
3
5
|
# display name, layout direction, and whether it is a store's default — the
|
|
@@ -21,16 +23,17 @@ module Spree
|
|
|
21
23
|
code = self.code.to_s
|
|
22
24
|
|
|
23
25
|
if I18n.exists?('spree.i18n.this_file_language', locale: code, fallback: false)
|
|
24
|
-
return normalize_name(
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
if defined?(SpreeI18n::Locale) && (name = SpreeI18n::Locale.local_language_name(code))
|
|
28
|
-
return normalize_name(name)
|
|
26
|
+
return normalize_name(I18n.t('spree.i18n.this_file_language', locale: code))
|
|
29
27
|
end
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
name = self.class.language_names[code.downcase] || self.class.language_names[language_code]
|
|
30
|
+
name ? normalize_name(name) : code
|
|
31
|
+
end
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
# Each language's name in that language ("Deutsch", "日本語"), keyed by code.
|
|
34
|
+
# @return [Hash{String => String}]
|
|
35
|
+
def self.language_names
|
|
36
|
+
@language_names ||= ::CSV.read(File.expand_path('../../../config/language_names.csv', __dir__)).to_h { |row| [row[0], row[2]] }
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
# Select label, e.g. "EN — English".
|
|
@@ -88,7 +91,7 @@ module Spree
|
|
|
88
91
|
|
|
89
92
|
private
|
|
90
93
|
|
|
91
|
-
# Strip a trailing " (CODE)" suffix from
|
|
94
|
+
# Strip a trailing " (CODE)" suffix from a locale file's own name. Uses
|
|
92
95
|
# plain string ops rather than a regex to avoid polynomial backtracking on
|
|
93
96
|
# adversarial input (ReDoS).
|
|
94
97
|
def normalize_name(name)
|
data/app/models/spree/market.rb
CHANGED
|
@@ -8,6 +8,9 @@ module Spree
|
|
|
8
8
|
acts_as_paranoid
|
|
9
9
|
acts_as_list scope: :store_id
|
|
10
10
|
|
|
11
|
+
self.whitelisted_ransackable_attributes = %w[currency default_locale]
|
|
12
|
+
search_by :name
|
|
13
|
+
|
|
11
14
|
#
|
|
12
15
|
# Associations
|
|
13
16
|
#
|
|
@@ -69,11 +72,14 @@ module Spree
|
|
|
69
72
|
# An unregistered class name would only fail at checkout, when a customer is
|
|
70
73
|
# waiting on a total. The list is read at validation time so a provider gem
|
|
71
74
|
# loaded after boot still counts.
|
|
75
|
+
normalizes :tax_provider, with: ->(value) { Spree::ApiTyped.class_name_for(Spree.tax_providers, value) }
|
|
72
76
|
validates :tax_provider,
|
|
73
77
|
inclusion: { in: ->(_market) { Spree.tax_providers.map(&:to_s) } },
|
|
74
78
|
allow_blank: true
|
|
75
79
|
validates :currency, presence: true
|
|
80
|
+
normalizes :default_locale, with: ->(value) { value.to_s.strip.presence }
|
|
76
81
|
validates :default_locale, presence: true
|
|
82
|
+
validates_with Spree::LocaleCodesValidator, attributes: %i[default_locale supported_locales]
|
|
77
83
|
validates :countries, presence: true
|
|
78
84
|
|
|
79
85
|
#
|
|
@@ -141,7 +147,7 @@ module Spree
|
|
|
141
147
|
#
|
|
142
148
|
# @return [Array<String>]
|
|
143
149
|
def supported_locales_list
|
|
144
|
-
@supported_locales_list ||= (supported_locales.to_s.split(',').map(&:strip) << default_locale).
|
|
150
|
+
@supported_locales_list ||= (supported_locales.to_s.split(',').map(&:strip) << default_locale).compact_blank.uniq.sort
|
|
145
151
|
end
|
|
146
152
|
|
|
147
153
|
# Accepts an Array of locale codes and persists them as a comma-separated
|
|
@@ -152,7 +158,7 @@ module Spree
|
|
|
152
158
|
# @param value [Array<String>, String, nil]
|
|
153
159
|
def supported_locales=(value)
|
|
154
160
|
@supported_locales_list = nil
|
|
155
|
-
normalized = value.is_a?(Array) ? value.
|
|
161
|
+
normalized = value.is_a?(Array) ? value.map { |code| code.to_s.strip }.reject(&:empty?).uniq.join(',') : value
|
|
156
162
|
super(normalized)
|
|
157
163
|
end
|
|
158
164
|
|
data/app/models/spree/media.rb
CHANGED
|
@@ -31,15 +31,6 @@ module Spree
|
|
|
31
31
|
EXTERNAL_URL_CUSTOM_FIELD_KEY = 'external.url'
|
|
32
32
|
MEDIA_TYPES = %w[image video external_video].freeze
|
|
33
33
|
|
|
34
|
-
# Domain attributes a client may write, shared by every write path — the
|
|
35
|
-
# media endpoints and the inline `media:` list on a product. Each path adds
|
|
36
|
-
# its own transport keys (an upload's signed id, a row id) on top. Adding a
|
|
37
|
-
# field here reaches both, so it can't be dropped on the one a client uses.
|
|
38
|
-
WRITABLE_ATTRIBUTES = %i[
|
|
39
|
-
alt position media_type external_video_url poster_signed_id
|
|
40
|
-
focal_point_x focal_point_y
|
|
41
|
-
].freeze
|
|
42
|
-
|
|
43
34
|
after_initialize { self.media_type ||= 'image' }
|
|
44
35
|
|
|
45
36
|
belongs_to :viewable, polymorphic: true, touch: true, optional: true
|
|
@@ -93,6 +84,7 @@ module Spree
|
|
|
93
84
|
|
|
94
85
|
self.whitelisted_ransackable_attributes = %w[alt media_type created_at updated_at]
|
|
95
86
|
self.whitelisted_ransackable_scopes = %w[attached unattached filename_cont]
|
|
87
|
+
self.ransackable_scope_types = { 'attached' => 'boolean', 'unattached' => 'boolean' }
|
|
96
88
|
|
|
97
89
|
delegate :key, :attached?, :variant, :variable?, :blob, :filename, :variation, to: :attachment
|
|
98
90
|
|
|
@@ -6,6 +6,9 @@ module Spree
|
|
|
6
6
|
include Spree::SingleStoreResource
|
|
7
7
|
|
|
8
8
|
publishes_lifecycle_events
|
|
9
|
+
publishes_event :verified
|
|
10
|
+
publishes_events :subscription_requested, :unsubscribe_requested,
|
|
11
|
+
serializer: 'Spree::Api::V3::NewsletterSubscriberRequestEventSerializer'
|
|
9
12
|
|
|
10
13
|
has_secure_token :verification_token
|
|
11
14
|
|
|
@@ -45,6 +48,7 @@ module Spree
|
|
|
45
48
|
#
|
|
46
49
|
self.whitelisted_ransackable_attributes = %w[email verified_at]
|
|
47
50
|
self.whitelisted_ransackable_scopes = %w[verified unverified]
|
|
51
|
+
self.ransackable_scope_types = %w[verified unverified].index_with('boolean')
|
|
48
52
|
|
|
49
53
|
def accepts_email_marketing
|
|
50
54
|
return customer.accepts_email_marketing if customer.present?
|
|
@@ -24,7 +24,8 @@ module Spree
|
|
|
24
24
|
self.whitelisted_ransackable_scopes = %w[search_by_name]
|
|
25
25
|
# `label` is what admin surfaces display, so it has to be filterable —
|
|
26
26
|
# matching Spree::OptionValue, which already allows it.
|
|
27
|
-
self.whitelisted_ransackable_attributes = %w[label name]
|
|
27
|
+
self.whitelisted_ransackable_attributes = %w[label name kind]
|
|
28
|
+
search_by :name, :label
|
|
28
29
|
|
|
29
30
|
normalizes :name, with: ->(value) { value&.to_s&.squish&.presence }
|
|
30
31
|
|