Class: Billy::LemonSqueezy::Subscription
- Inherits:
-
Object
- Object
- Billy::LemonSqueezy::Subscription
- Defined in:
- lib/billy/lemon_squeezy/subscription.rb
Instance Attribute Summary collapse
-
#billy_subscription ⇒ Object
readonly
Returns the value of attribute billy_subscription.
Class Method Summary collapse
Instance Method Summary collapse
- #cancel ⇒ Object
- #cancel_now! ⇒ Object
-
#initialize(billy_subscription) ⇒ Subscription
constructor
A new instance of Subscription.
- #pause ⇒ Object
- #resume ⇒ Object
- #subscription(**options) ⇒ Object
- #swap(plan) ⇒ Object
Constructor Details
#initialize(billy_subscription) ⇒ Subscription
Returns a new instance of Subscription.
7 8 9 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 7 def initialize(billy_subscription) @billy_subscription = billy_subscription end |
Instance Attribute Details
#billy_subscription ⇒ Object (readonly)
Returns the value of attribute billy_subscription.
5 6 7 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 5 def billy_subscription @billy_subscription end |
Class Method Details
.sync(lemon_squeezy_id:, object: nil) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 29 def self.sync(lemon_squeezy_id:, object: nil) # Passthrough is not return from this API, so we can't use that order = Billy::LemonSqueezy.client.orders.get(id: lemon_squeezy_id) customer = Billy::LemonSqueezy.client.customers.list(email: object.user_email).data.first billy_account = Billy::Account.find_by(processor: :lemon_squeezy, processor_id: customer.id) # If passthrough exists (only on webhooks) we can use it to create the Pay::Customer if billy_account.nil? && object.passthrough owner = Billy::LemonSqueezy.owner_from_passthrough(object.passthrough) return unless owner # billy_account = owner.billy_accounts.create processor: :lemon_squeezy, processor_id: customer.id # billy_account.make_default! billy_account = owner&.set_billy_account(:lemon_squeezy, processor_id: customer.id) end return unless billy_account plan = Billy::Plan.find_by(processor_id: order.attributes.first_order_item.product_id) attributes = { processor: "lemon_squeezy", processor_id: lemon_squeezy_id, # paddle_cancel_url: object.cancel_url, # paddle_update_url: object.update_url, plan: plan, status: object.status } # If paused or delete while on trial, set ends_at to match case attributes[:status] when "paused", "deleted" attributes[:ends_at] = Time.zone.parse(object.ends_at) end # Update or create the subscription if (billy_subscription = billy_account.subscriptions.find_by(processor: "lemon_squeezy", processor_id: object.id)) billy_subscription.with_lock do billy_subscription.update!(attributes) end billy_subscription else sub = billy_account.subscriptions.create!(attributes.merge(processor: "lemon_squeezy", processor_id: object.id)) sub.make_default! end end |
Instance Method Details
#cancel ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 86 def cancel ends_at = if on_trial? trial_ends_at elsif paused? paused_from else processor_subscription.next_payment&.fetch(:date) || Time.current end Billy::Paddle.client.users.cancel(subscription_id: processor_id) billy_subscription.update(status: :cancelled, ends_at: ends_at) # Remove payment methods since customer cannot be reused after cancelling Billy::PaymentMethod.where(account_id: billy_subscription.account_id).destroy_all rescue ::Paddle::Error => e raise Billy::Errors::PaddleError, e end |
#cancel_now! ⇒ Object
104 105 106 107 108 109 110 111 112 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 104 def cancel_now! Billy::Paddle.client.users.cancel(subscription_id: processor_id) billy_subscription.update(status: :cancelled, ends_at: Time.current) # Remove payment methods since customer cannot be reused after cancelling Billy::PaymentMethod.where(account_id: billy_subscription.account_id).destroy_all rescue ::Paddle::Error => e raise Billy::Errors::PaddleError, e end |
#pause ⇒ Object
114 115 116 117 118 119 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 114 def pause response = Billy::Paddle.client.users.update(subscription_id: processor_id, pause: true) pay_subscription.update(paused_from: response.next_payment.date) rescue ::Paddle::Error => e raise Billy::Errors::PaddleError, e end |
#resume ⇒ Object
121 122 123 124 125 126 127 128 129 130 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 121 def resume unless paused? raise StandardError, "You can only resume paused subscriptions." end Billy::Paddle.client.users.update(subscription_id: processor_id, pause: false) pay_subscription.update(status: :active, paused_from: nil) rescue ::Paddle::Error => e raise Billy::Errors::PaddleError, e end |
#subscription(**options) ⇒ Object
79 80 81 82 83 |
# File 'lib/billy/lemon_squeezy/subscription.rb', line 79 def subscription(**) Billy::LemonSqueezy.client.subscriptions.list(subscription_id: processor_id).data.first rescue ::LemonSqueezy::Error => e raise Billy::Errors::LemonSqueezyError, e end |