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:
parent
a3f680964c
commit
676f921d66
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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'
|
||||
|
||||
|
@ -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!
|
||||
|
Loading…
x
Reference in New Issue
Block a user