From 9f87d809e339d459aa29c6aa62f3033a7c978ee7 Mon Sep 17 00:00:00 2001 From: cesartalves Date: Tue, 4 May 2021 10:59:05 -0300 Subject: Introduce Installment OrderCreator configuration This adds both SolidusSubscriptions.configuration.order_creation_class and SolidusSubscriptions.configuration.order_creation_extra attributes, so that users can add attributes to each Installment Order at Checkout or even override how the Order is created --- .../install/templates/initializer.rb | 14 ++++++++++++ lib/solidus_subscriptions.rb | 1 + lib/solidus_subscriptions/checkout.rb | 12 +++------- lib/solidus_subscriptions/configuration.rb | 13 +++++++---- lib/solidus_subscriptions/order_creator.rb | 26 ++++++++++++++++++++++ 5 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 lib/solidus_subscriptions/order_creator.rb diff --git a/lib/generators/solidus_subscriptions/install/templates/initializer.rb b/lib/generators/solidus_subscriptions/install/templates/initializer.rb index 3632f08..0abefc9 100644 --- a/lib/generators/solidus_subscriptions/install/templates/initializer.rb +++ b/lib/generators/solidus_subscriptions/install/templates/initializer.rb @@ -96,4 +96,18 @@ SolidusSubscriptions.configure do |config| # with new subscription cycles by clearing any past failed installment when a new one is created # config.clear_past_installments = true + + # ==================================== Custom Order Creation ===================================== + # + # This settings allows the customization of the creation of each Installment Order and / or + # adding additional attributes to the Order + # + # config.order_creation_class = 'SolidusSubscriptions::OrderCreator' + # + # this class is initialized and called on the creation of the Order for each Subscription Installment + # along with a customizable hash of extra attributes that can also be configured, like below: + # config.order_creation_extra_attributes = { channel: 'subscriptions' } + # + # + # config.order_creation_extra_attributes = { } end diff --git a/lib/solidus_subscriptions.rb b/lib/solidus_subscriptions.rb index d5e3d73..9d6457f 100644 --- a/lib/solidus_subscriptions.rb +++ b/lib/solidus_subscriptions.rb @@ -26,6 +26,7 @@ require 'solidus_subscriptions/dispatcher/failure_dispatcher' require 'solidus_subscriptions/dispatcher/out_of_stock_dispatcher' require 'solidus_subscriptions/dispatcher/payment_failed_dispatcher' require 'solidus_subscriptions/dispatcher/success_dispatcher' +require 'solidus_subscriptions/order_creator' module SolidusSubscriptions class << self diff --git a/lib/solidus_subscriptions/checkout.rb b/lib/solidus_subscriptions/checkout.rb index b71a7b2..15f1a26 100644 --- a/lib/solidus_subscriptions/checkout.rb +++ b/lib/solidus_subscriptions/checkout.rb @@ -32,14 +32,8 @@ module SolidusSubscriptions private def create_order - ::Spree::Order.create( - user: installment.subscription.user, - email: installment.subscription.user.email, - store: installment.subscription.store || ::Spree::Store.default, - subscription_order: true, - subscription: installment.subscription, - currency: installment.subscription.currency - ) + extra_attributes = SolidusSubscriptions.configuration.order_creation_extra_attributes + SolidusSubscriptions.configuration.order_creation_class.new(installment, extra_attributes).call end def populate_order(order) @@ -61,7 +55,7 @@ module SolidusSubscriptions order.payments.create( payment_method: installment.subscription.payment_method_to_use, source: installment.subscription.payment_source_to_use, - amount: order.total, + amount: order.total ) end diff --git a/lib/solidus_subscriptions/configuration.rb b/lib/solidus_subscriptions/configuration.rb index 2606272..5b9aed9 100644 --- a/lib/solidus_subscriptions/configuration.rb +++ b/lib/solidus_subscriptions/configuration.rb @@ -4,14 +4,14 @@ module SolidusSubscriptions class Configuration attr_accessor( :maximum_total_skips, :maximum_reprocessing_time, :churn_buster_account_id, - :churn_buster_api_key, :clear_past_installments, :processing_error_handler, + :churn_buster_api_key, :clear_past_installments, :processing_error_handler, :order_creation_extra_attributes ) attr_writer( :success_dispatcher_class, :failure_dispatcher_class, :payment_failed_dispatcher_class, :out_of_stock_dispatcher, :maximum_successive_skips, :reprocessing_interval, :minimum_cancellation_notice, :processing_queue, :subscription_line_item_attributes, - :subscription_attributes, :subscribable_class, + :subscription_attributes, :subscribable_class, :order_creation_class ) def success_dispatcher_class @@ -57,7 +57,7 @@ module SolidusSubscriptions :subscribable_id, :interval_length, :interval_units, - :end_date, + :end_date ] end @@ -69,7 +69,7 @@ module SolidusSubscriptions { shipping_address_attributes: Spree::PermittedAttributes.address_attributes, billing_address_attributes: Spree::PermittedAttributes.address_attributes - }, + } ] end @@ -81,5 +81,10 @@ module SolidusSubscriptions def churn_buster? churn_buster_account_id.present? && churn_buster_api_key.present? end + + def order_creation_class + @order_creation_class ||= 'SolidusSubscriptions::OrderCreator' + @order_creation_class.constantize + end end end diff --git a/lib/solidus_subscriptions/order_creator.rb b/lib/solidus_subscriptions/order_creator.rb new file mode 100644 index 0000000..97b858a --- /dev/null +++ b/lib/solidus_subscriptions/order_creator.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module SolidusSubscriptions + class OrderCreator + def initialize(installment, extra_attributes) + @installment = installment + @extra_attributes = (extra_attributes || {}).symbolize_keys + end + + def call + ::Spree::Order.create( + user: installment.subscription.user, + email: installment.subscription.user.email, + store: installment.subscription.store || ::Spree::Store.default, + subscription_order: true, + subscription: installment.subscription, + currency: installment.subscription.currency, + **extra_attributes + ) + end + + protected + + attr_reader :installment, :extra_attributes + end +end -- cgit v1.2.3 From 42caa88a89748767555a9d284cdd7b7c53191dcb Mon Sep 17 00:00:00 2001 From: cesartalves Date: Wed, 5 May 2021 09:33:45 -0300 Subject: Installment OrderCreator configuration: keep extra attributes inside the OrderCreator class and remove it from the configuration. --- .../install/templates/initializer.rb | 15 +++++++-------- lib/solidus_subscriptions/checkout.rb | 3 +-- lib/solidus_subscriptions/configuration.rb | 10 +++++----- lib/solidus_subscriptions/order_creator.rb | 9 ++++++--- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lib/generators/solidus_subscriptions/install/templates/initializer.rb b/lib/generators/solidus_subscriptions/install/templates/initializer.rb index 0abefc9..de1d081 100644 --- a/lib/generators/solidus_subscriptions/install/templates/initializer.rb +++ b/lib/generators/solidus_subscriptions/install/templates/initializer.rb @@ -99,15 +99,14 @@ SolidusSubscriptions.configure do |config| # ==================================== Custom Order Creation ===================================== # - # This settings allows the customization of the creation of each Installment Order and / or - # adding additional attributes to the Order + # This settings allows the customization of the creation of each Installment Order by means of + # providing a class that can be switched / inherited # - # config.order_creation_class = 'SolidusSubscriptions::OrderCreator' # - # this class is initialized and called on the creation of the Order for each Subscription Installment - # along with a customizable hash of extra attributes that can also be configured, like below: - # config.order_creation_extra_attributes = { channel: 'subscriptions' } + # the order_creator_class is initialized and called on the creation of the Order for each Subscription + # Installment. + # If you want to add simple extra attributes to the Order (such as a channel), that can be done by + # overriding the `extra_attributes` method on a subclass # - # - # config.order_creation_extra_attributes = { } + # config.order_creator_class = 'SolidusSubscriptions::OrderCreator' end diff --git a/lib/solidus_subscriptions/checkout.rb b/lib/solidus_subscriptions/checkout.rb index 15f1a26..7bed823 100644 --- a/lib/solidus_subscriptions/checkout.rb +++ b/lib/solidus_subscriptions/checkout.rb @@ -32,8 +32,7 @@ module SolidusSubscriptions private def create_order - extra_attributes = SolidusSubscriptions.configuration.order_creation_extra_attributes - SolidusSubscriptions.configuration.order_creation_class.new(installment, extra_attributes).call + SolidusSubscriptions.configuration.order_creator_class.new(installment).call end def populate_order(order) diff --git a/lib/solidus_subscriptions/configuration.rb b/lib/solidus_subscriptions/configuration.rb index 5b9aed9..9d6c3d2 100644 --- a/lib/solidus_subscriptions/configuration.rb +++ b/lib/solidus_subscriptions/configuration.rb @@ -4,14 +4,14 @@ module SolidusSubscriptions class Configuration attr_accessor( :maximum_total_skips, :maximum_reprocessing_time, :churn_buster_account_id, - :churn_buster_api_key, :clear_past_installments, :processing_error_handler, :order_creation_extra_attributes + :churn_buster_api_key, :clear_past_installments, :processing_error_handler ) attr_writer( :success_dispatcher_class, :failure_dispatcher_class, :payment_failed_dispatcher_class, :out_of_stock_dispatcher, :maximum_successive_skips, :reprocessing_interval, :minimum_cancellation_notice, :processing_queue, :subscription_line_item_attributes, - :subscription_attributes, :subscribable_class, :order_creation_class + :subscription_attributes, :subscribable_class, :order_creator_class ) def success_dispatcher_class @@ -82,9 +82,9 @@ module SolidusSubscriptions churn_buster_account_id.present? && churn_buster_api_key.present? end - def order_creation_class - @order_creation_class ||= 'SolidusSubscriptions::OrderCreator' - @order_creation_class.constantize + def order_creator_class + @order_creator_class ||= 'SolidusSubscriptions::OrderCreator' + @order_creator_class.constantize end end end diff --git a/lib/solidus_subscriptions/order_creator.rb b/lib/solidus_subscriptions/order_creator.rb index 97b858a..edb68e4 100644 --- a/lib/solidus_subscriptions/order_creator.rb +++ b/lib/solidus_subscriptions/order_creator.rb @@ -2,9 +2,8 @@ module SolidusSubscriptions class OrderCreator - def initialize(installment, extra_attributes) + def initialize(installment) @installment = installment - @extra_attributes = (extra_attributes || {}).symbolize_keys end def call @@ -21,6 +20,10 @@ module SolidusSubscriptions protected - attr_reader :installment, :extra_attributes + def extra_attributes + {} + end + + attr_reader :installment end end -- cgit v1.2.3 From d6e36547107c741c7e0867531e1da22295980247 Mon Sep 17 00:00:00 2001 From: cesartalves Date: Thu, 6 May 2021 09:19:20 -0300 Subject: Change accessiblity of SolidusSubscriptions::OrderCreator from protected to private --- lib/solidus_subscriptions/order_creator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/solidus_subscriptions/order_creator.rb b/lib/solidus_subscriptions/order_creator.rb index edb68e4..a2db8ce 100644 --- a/lib/solidus_subscriptions/order_creator.rb +++ b/lib/solidus_subscriptions/order_creator.rb @@ -18,7 +18,7 @@ module SolidusSubscriptions ) end - protected + private def extra_attributes {} -- cgit v1.2.3