That's strange. Are you using a custom model ?
Subscription::discount() undefined in Prod - Works Localhost
I am using Cashier for Stripe, and the Subscription class called App\Models\Subscription::discount(). In localhost/dev, this works just fine with zero issues. In Production, with the code being the same, I get a 500 error with the following error:
production.ERROR: Call to undefined method App\Models\Subscription::discount() {"userId":2,"exception":"[object] (BadMethodCallException(code: 0): Call to undefined method App\Models\Subscription::discount() at /var/www/blackdiamond/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php:71)
[stacktrace]
Here is the method in the SubscriptionController.php:
public function getSubscriptions()
{
$user = Auth::user();
//$subscriptions = $user->subscriptions()->active()->get();
$subscriptions = Subscription::where('user_id', '=', $user->id)->where('stripe_status', '=', 'active')->get();
//print($subscriptions);
if (count($subscriptions) > 1) {
$hasAddons = true;
} else {
$hasAddons = false;
}
$addons = [];
$addon_prices = [];
foreach ($subscriptions AS $key => $subscription) {
if ($subscription->name == 'license') {
$plan = Plan::where('plan_id', '=', $subscription->stripe_price)->first();
$plan_price = Price::where('price_id', '=', $subscription->stripe_price)->first();
$sub_stripe = Cashier::stripe()->subscriptions->retrieve($subscription->stripe_id);
$plan_discount = ($sub_stripe->discount != null) ? $subscription->discount()->coupon() : false;
} else {
$addon_plan = Plan::where('plan_id', '=', $subscription->stripe_price)->first();
$addons = Arr::add($addons, $key, array($addon_plan, 'subscription' => $subscription->stripe_id));
$addon_price = Price::where('price_id', '=', $subscription->stripe_price)->first();
$sub_stripe = Cashier::stripe()->subscriptions->retrieve($subscription->stripe_id);
$discount = ($sub_stripe->discount != null) ? $subscription->discount()->coupon() : false;
$addon_prices = Arr::add($addon_prices, $key, array($addon_price, 'discount' => $discount, 'subscription' => $subscription->stripe_id));
}
}
//return $addons;
return view('stripe.view-subscriptions', [
'subscriptions' => $subscriptions
, 'hasAddons' => $hasAddons
, 'plan' => $plan
, 'addons' => $addons
, 'plan_price' => $plan_price
, 'addon_prices' => $addon_prices
, 'plan_discount' => $plan_discount
]);
}
public function decreaseAddonQuantity($subscription_id)
{
$user = Auth::user();
foreach ($user->subscriptions AS $sub) {
if ($sub->stripe_id == $subscription_id)
{
$addon_subscription = $sub;
}
}
switch ($addon_subscription->name) {
case "addon-connection":
$type = "Connections";
break;
case "addon-user":
$type = "Users";
break;
}
//return $addon_subscription;
return view ('stripe.decrease-addon-qty', ['addon_subscription' => $addon_subscription, 'type' => $type]);
}
@netgeek88 The discount() method is available for the subscriptions and for the customers. But if you create a custom subscription model, as mentioned in the documentation, you should extend the custom Subscription model from CashierSubscription and not from Model.
use Laravel\Cashier\Subscription as CashierSubscription;
class Subscription extends CashierSubscription
{
// ...
}
https://laravel.com/docs/10.x/billing#using-custom-models
Why do you have a custom subscription model ? Have you created specific methods inside it ?
Please or to participate in this conversation.