diff --git a/app/jobs/subscription_confirm_job.rb b/app/jobs/subscription_confirm_job.rb index 9ed8223d0e..acf241e4e0 100644 --- a/app/jobs/subscription_confirm_job.rb +++ b/app/jobs/subscription_confirm_job.rb @@ -45,27 +45,33 @@ class SubscriptionConfirmJob def confirm_order!(order) record_order(order) - if process_payment!(order) - send_confirmation_email(order) - else + process_payment!(order) + send_confirmation_email(order) + rescue StandardError => e + if order.errors.any? send_failed_payment_email(order) + else + Bugsnag.notify(e, order: order) + send_failed_payment_email(order, e.message) end end + # Process the order payment and raise if it's not successful def process_payment!(order) - return false if order.errors.present? - return true unless order.payment_required? + raise if order.errors.present? + return unless order.payment_required? + prepare_for_payment!(order) + order.process_payments! + raise if order.errors.any? + end + + def prepare_for_payment!(order) setup_payment!(order) - return false if order.errors.any? + raise if order.errors.any? authorize_payment!(order) - return false if order.errors.any? - - order.process_payments! - return false if order.errors.any? - - true + raise if order.errors.any? end def setup_payment!(order) @@ -87,9 +93,11 @@ class SubscriptionConfirmJob SubscriptionMailer.confirmation_email(order).deliver end - def send_failed_payment_email(order) + def send_failed_payment_email(order, error_message = nil) order.update! - record_and_log_error(:failed_payment, order) + record_and_log_error(:failed_payment, order, error_message) SubscriptionMailer.failed_payment_email(order).deliver + rescue StandardError => e + Bugsnag.notify(e, order: order, error_message: error_message) end end diff --git a/app/jobs/subscription_placement_job.rb b/app/jobs/subscription_placement_job.rb index 320c7b199a..b15947895b 100644 --- a/app/jobs/subscription_placement_job.rb +++ b/app/jobs/subscription_placement_job.rb @@ -29,10 +29,16 @@ class SubscriptionPlacementJob def place_order_for(proxy_order) JobLogger.logger.info("Placing Order for Proxy Order #{proxy_order.id}") - proxy_order.initialise_order! + initialise_order(proxy_order) place_order(proxy_order.order) end + def initialise_order(proxy_order) + proxy_order.initialise_order! + rescue StandardError => e + Bugsnag.notify(e, subscription: proxy_order.subscription, proxy_order: proxy_order) + end + def place_order(order) record_order(order) return record_issue(:complete, order) if order.completed? @@ -42,8 +48,9 @@ class SubscriptionPlacementJob move_to_completion(order) send_placement_email(order, changes) - rescue StateMachine::InvalidTransition - record_and_log_error(:processing, order) + rescue StandardError => e + record_and_log_error(:processing, order, e.message) + Bugsnag.notify(e, order: order) end def cap_quantity_and_store_changes(order) diff --git a/engines/order_management/app/services/order_management/subscriptions/summarizer.rb b/engines/order_management/app/services/order_management/subscriptions/summarizer.rb index 8029716338..f591295d1c 100644 --- a/engines/order_management/app/services/order_management/subscriptions/summarizer.rb +++ b/engines/order_management/app/services/order_management/subscriptions/summarizer.rb @@ -22,12 +22,15 @@ module OrderManagement summary_for(order).record_issue(type, order, message) end - def record_and_log_error(type, order) + def record_and_log_error(type, order, error_message = nil) return record_issue(type, order) unless order.errors.any? error = "Subscription#{type.to_s.camelize}Error" line1 = "#{error}: Cannot process order #{order.number} due to errors" - line2 = "Errors: #{order.errors.full_messages.join(', ')}" + + error_message ||= order.errors.full_messages.join(', ') + line2 = "Errors: #{error_message}" + JobLogger.logger.info("#{line1}\n#{line2}") record_issue(type, order, line2) end diff --git a/spec/jobs/subscription_confirm_job_spec.rb b/spec/jobs/subscription_confirm_job_spec.rb index 96f718efd1..87b3db0fd9 100644 --- a/spec/jobs/subscription_confirm_job_spec.rb +++ b/spec/jobs/subscription_confirm_job_spec.rb @@ -216,7 +216,7 @@ describe SubscriptionConfirmJob do it "records and logs an error and sends the email" do expect(order).to receive(:update!) - expect(job).to receive(:record_and_log_error).with(:failed_payment, order).once + expect(job).to receive(:record_and_log_error).with(:failed_payment, order, nil).once job.send(:send_failed_payment_email, order) expect(SubscriptionMailer).to have_received(:failed_payment_email).with(order) expect(mail_mock).to have_received(:deliver)