bpuig / laravel-subby

Laravel Plan and Subscriptions manager.
https://bpuig.github.io/laravel-subby
MIT License
102 stars 42 forks source link

Method isInGrace() + scope scopeFindInGracePeriod() #102

Closed boryn closed 2 years ago

boryn commented 2 years ago

I thought that we could need isInGrace() method?

And as well a scope scopeFindInGracePeriod() for getting the subscribers during the grace period ending in X days?

The both methods would be very helpful for displaying appropriate information to the user in the front or to send them email reminders.

bpuig commented 2 years ago

I'm unable to make the scope, because it would need very a specific mysql raw select with mysql date calculation methods. Since laravel installation accepts mysql, postgres and others I'm afraid i can't put it in the package.

I have not tested, but I think it would be something like:

/**
     * Scope subscriptions in grace period.
     *
     * @param \Illuminate\Database\Eloquent\Builder $builder
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeInGrace($query)
    {
        return $query->select(DB::raw('CASE grace_interval
                               WHEN "hour" THEN date_add(ends_at, INTERVAL grace_period HOUR)
                               WHEN "day" THEN date_add(ends_at, INTERVAL grace_period DAY)
                               WHEN "week" THEN date_add(ends_at, INTERVAL grace_period WEEK)
                               WHEN "month" THEN date_add(ends_at, INTERVAL grace_period MONTH)
                               END
                               AS grace_ends_at'))
            ->where('grace_period', '>', 0)
            ->where('grace_ends_at', '>=', Carbon::now());
    }
boryn commented 2 years ago

Hi @bpuig!

Maybe we could have a separate column grace_ends_at just as there is trial_ends_at?

Then for the scope we would just need a check if now() is greater than ends_at and lower than grace_ends_at? Similarly isInGrace() would be very easy to calculate.