1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-01-29 18:52:22 +01:00

fix some errors about stp subscription refacto + improved error handling

This commit is contained in:
Sylvain 2021-10-07 17:07:46 +02:00
parent a3f680964c
commit 676f921d66
5 changed files with 20 additions and 14 deletions

View File

@ -39,7 +39,7 @@ class API::PaymentsController < API::ApiController
post_save(gateway_item_id, gateway_item_type, res[:payment])
res[:payment].render_resource.merge(status: :created)
else
{ json: res[:errors], status: :unprocessable_entity }
{ json: res[:errors].drop_while(&:empty?), status: :unprocessable_entity }
end
end
end

View File

@ -69,10 +69,10 @@ class API::StripeController < API::PaymentsController
render json: { id: @intent.id, client_secret: @intent.client_secret }
end
def create_subscription
def setup_subscription
cart = shopping_cart
cart.items.each do |item|
raise InvalidSubscriptionError unless item.valid?(@items)
raise InvalidSubscriptionError unless item.valid?(cart.items)
raise InvalidSubscriptionError unless item.to_object.errors.empty?
end
@ -90,12 +90,15 @@ class API::StripeController < API::PaymentsController
def confirm_subscription
key = Setting.get('stripe_secret_key')
subscription = Stripe::Subscription.retrieve(params[:subscription_id], api_key: key)
subscription = Stripe::Subscription.retrieve(
{ id: params[:subscription_id], expand: %w[latest_invoice.payment_intent] },
{ api_key: key }
)
cart = shopping_cart
if subscription&.status == 'active'
res = on_payment_success(subscription, cart)
render generate_payment_response(subscription, res)
res = on_payment_success(subscription.latest_invoice.payment_intent, cart)
render generate_payment_response(subscription.latest_invoice.payment_intent, 'subscription', res)
end
rescue Stripe::InvalidRequestError => e
render json: e, status: :unprocessable_entity

View File

@ -64,8 +64,9 @@ class ShoppingCart
payment.post_save(payment_id)
end
success = objects.map(&:errors).flatten.map(&:empty?).all? && items.map(&:errors).map(&:empty?).all?
success = !payment.nil? && objects.map(&:errors).flatten.map(&:empty?).all? && items.map(&:errors).map(&:empty?).all?
errors = objects.map(&:errors).flatten.concat(items.map(&:errors))
errors.push('Unable to create the PaymentDocument') if payment.nil?
{ success: success, payment: payment, errors: errors }
end

View File

@ -182,7 +182,7 @@ Rails.application.routes.draw do
post 'stripe/confirm_payment' => 'stripe/confirm_payment'
get 'stripe/online_payment_status' => 'stripe/online_payment_status'
get 'stripe/setup_intent/:user_id' => 'stripe#setup_intent'
post 'stripe/create_subscription' => 'stripe/create_subscription'
post 'stripe/setup_subscription' => 'stripe/setup_subscription'
post 'stripe/confirm_subscription' => 'stripe#confirm_subscription'
post 'stripe/update_card' => 'stripe#update_card'

View File

@ -12,12 +12,13 @@ class Stripe::Service < Payment::Service
price_details = shopping_cart.total
payment_schedule = price_details[:schedule][:payment_schedule]
payment_schedule.payment_schedule_items = price_details[:schedule][:items]
first_item = price_details[:schedule][:items].min_by(&:due_date)
subscription = shopping_cart.items.find { |item| item.class == CartItem::Subscription }
reservable_stp_id = shopping_cart.items.find { |item| item.is_a?(CartItem::Reservation) }.to_object
.reservable&.payment_gateway_object&.gateway_object_id
WalletService.debit_user_wallet(payment_schedule, payment_schedule.invoicing_profile.user, transaction: false)
WalletService.debit_user_wallet(payment_schedule, shopping_cart.customer, transaction: false)
handle_wallet_transaction(payment_schedule)
price = create_price(first_item.details['recurring'],
@ -26,8 +27,10 @@ class Stripe::Service < Payment::Service
# other items (not recurring)
items = subscription_invoice_items(payment_schedule, subscription, first_item, reservable_stp_id)
stripe_key = Setting.get('stripe_secret_key')
Stripe::Subscription.create({
customer: payment_schedule.invoicing_profile.user.payment_gateway_object.gateway_object_id,
customer: shopping_cart.customer.payment_gateway_object.gateway_object_id,
cancel_at: (payment_schedule.payment_schedule_items.max_by(&:due_date).due_date + 1.month).to_i,
add_invoice_items: items,
coupon: payment_schedule.coupon&.code,
@ -39,12 +42,11 @@ class Stripe::Service < Payment::Service
}, { api_key: stripe_key })
end
def create_subscription(payment_schedule, subscription_id)
def create_subscription(payment_schedule, payment_intent_id)
stripe_key = Setting.get('stripe_secret_key')
handle_wallet_transaction(payment_schedule)
stp_subscription = Stripe::Subscription.retrieve(subscription_id, api_key: stripe_key)
pi = Stripe::PaymentIntent.retrieve({ id: payment_intent_id, expand: %w[invoice] }, { api_key: stripe_key })
stp_subscription = Stripe::Subscription.retrieve(pi.invoice.subscription, api_key: stripe_key)
pgo = PaymentGatewayObject.new(item: payment_schedule)
pgo.gateway_object = stp_subscription
pgo.save!