Class: Pay::LemonSqueezy::Subscription
- Inherits:
-
Subscription
- Object
- Subscription
- Pay::LemonSqueezy::Subscription
- Defined in:
- app/models/pay/lemon_squeezy/subscription.rb
Class Method Summary collapse
Instance Method Summary collapse
- #api_record(**options) ⇒ Object
- #cancel(**options) ⇒ Object
- #cancel_now!(**options) ⇒ Object
- #change_quantity(quantity, **options) ⇒ Object
-
#on_grace_period? ⇒ Boolean
A subscription could be set to cancel or pause in the future It is considered on grace period until the cancel or pause time begins.
- #pause(**options) ⇒ Object
- #paused? ⇒ Boolean
- #portal_url ⇒ Object
- #resumable? ⇒ Boolean
- #resume ⇒ Object
-
#swap(plan, **options) ⇒ Object
Lemon Squeezy requires both the Product ID and Variant ID.
- #update_url ⇒ Object
Class Method Details
.sync(subscription_id, object: nil, name: Pay.default_product_name) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 4 def self.sync(subscription_id, object: nil, name: Pay.default_product_name) object ||= ::LemonSqueezy::Subscription.retrieve(id: subscription_id) pay_customer = Pay::Customer.find_by(processor: :lemon_squeezy, processor_id: object.customer_id) return unless pay_customer attributes = { current_period_end: object.renews_at, ends_at: (object.ends_at ? Time.parse(object.ends_at) : nil), pause_starts_at: (object.pause&.resumes_at ? Time.parse(object.pause.resumes_at) : nil), status: object.status, processor_plan: object.first_subscription_item.price_id, quantity: object.first_subscription_item.quantity, created_at: (object.created_at ? Time.parse(object.created_at) : nil), updated_at: (object.updated_at ? Time.parse(object.updated_at) : nil) } case attributes[:status] when "cancelled" # Remove payment methods since customer cannot be reused after cancelling Pay::PaymentMethod.where(customer_id: object.customer_id).destroy_all when "on_trial" attributes[:trial_ends_at] = Time.parse(object.trial_ends_at) when "paused" # attributes[:pause_starts_at] = Time.parse(object.paused_at) when "active", "past_due" attributes[:trial_ends_at] = nil attributes[:pause_starts_at] = nil attributes[:ends_at] = nil end # Update or create the subscription if (pay_subscription = find_by(customer: pay_customer, processor_id: object.id)) pay_subscription.with_lock { pay_subscription.update!(attributes) } pay_subscription else create!(attributes.merge(customer: pay_customer, name: name, processor_id: object.id)) end end |
Instance Method Details
#api_record(**options) ⇒ Object
44 45 46 47 48 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 44 def api_record(**) @api_record ||= ::LemonSqueezy::Subscription.retrieve(id: processor_id) rescue ::LemonSqueezy::Error => e raise Pay::LemonSqueezy::Error, e end |
#cancel(**options) ⇒ Object
58 59 60 61 62 63 64 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 58 def cancel(**) return if canceled? response = ::LemonSqueezy::Subscription.cancel(id: processor_id) update(status: response.status, ends_at: response.ends_at) rescue ::LemonSqueezy::Error => e raise Pay::LemonSqueezy::Error, e end |
#cancel_now!(**options) ⇒ Object
66 67 68 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 66 def cancel_now!(**) raise Pay::Error, "Lemon Squeezy does not support cancelling immediately through the API." end |
#change_quantity(quantity, **options) ⇒ Object
70 71 72 73 74 75 76 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 70 def change_quantity(quantity, **) subscription_item = api_record.first_subscription_item ::LemonSqueezy::SubscriptionItem.update(id: subscription_item.id, quantity: quantity) update(quantity: quantity) rescue ::LemonSqueezy::Error => e raise Pay::LemonSqueezy::Error, e end |
#on_grace_period? ⇒ Boolean
A subscription could be set to cancel or pause in the future It is considered on grace period until the cancel or pause time begins
80 81 82 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 80 def on_grace_period? (canceled? && Time.current < ends_at) || (paused? && pause_starts_at? && Time.current < pause_starts_at) end |
#pause(**options) ⇒ Object
88 89 90 91 92 93 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 88 def pause(**) response = ::LemonSqueezy::Subscription.pause(id: processor_id, **) update!(status: :paused, pause_starts_at: response.pause&.resumes_at) rescue ::LemonSqueezy::Error => e raise Pay::LemonSqueezy::Error, e end |
#paused? ⇒ Boolean
84 85 86 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 84 def paused? status == "paused" end |
#portal_url ⇒ Object
50 51 52 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 50 def portal_url api_record.urls.customer_portal end |
#resumable? ⇒ Boolean
95 96 97 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 95 def resumable? paused? || canceled? end |
#resume ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 99 def resume unless resumable? raise Error, "You can only resume paused or cancelled subscriptions" end if paused? && pause_starts_at? && Time.current < pause_starts_at ::LemonSqueezy::Subscription.unpause(id: processor_id) else ::LemonSqueezy::Subscription.uncancel(id: processor_id) end update(ends_at: nil, status: :active, pause_starts_at: nil) rescue ::LemonSqueezy::Error => e raise Pay::LemonSqueezy::Error, e end |
#swap(plan, **options) ⇒ Object
Lemon Squeezy requires both the Product ID and Variant ID. The Variant ID will be saved as the processor_plan
117 118 119 120 121 122 123 124 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 117 def swap(plan, **) raise Error, "A plan_id is required to swap a subscription" unless plan raise Error, "A variant_id is required to swap a subscription" unless [:variant_id] ::LemonSqueezy::Subscription.change_plan id: processor_id, plan_id: plan, variant_id: [:variant_id] update(processor_plan: [:variant_id], ends_at: nil, status: :active) end |
#update_url ⇒ Object
54 55 56 |
# File 'app/models/pay/lemon_squeezy/subscription.rb', line 54 def update_url api_record.urls.update_payment_method end |