Aknaproff/app/PackageSubscription.php
2023-09-21 13:45:08 +01:00

138 lines
4.5 KiB
PHP

<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
class PackageSubscription extends Model
{
use SoftDeletes;
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'package_details' => 'array',
];
public static function status()
{
$list = [
'approved' => __('messages.approved'),
'waiting' => __('messages.waiting'),
'declined' => __('messages.declined'),
];
return $list;
}
public static function createSubscription($user_id, $package_id, $paid_via, $payment_transaction_id, $status)
{
$package = Package::find($package_id);
$subscription_info['user_id'] = $user_id;
$subscription_info['package_id'] = $package->id;
$subscription_info['package_details'] = [
'name' => $package->name,
'description' => $package->description,
'no_of_active_forms' => $package->no_of_active_forms,
'is_form_downloadable' => $package->is_form_downloadable,
'price_interval' => $package->price_interval,
'interval' => $package->interval,
];
$subscription_info['package_price'] = $package->price;
$subscription_info['paid_via'] = $paid_via;
$subscription_info['payment_transaction_id'] = $payment_transaction_id;
$subscription_info['status'] = $status;
$start_date = self::subscriptionExpiredOn($user_id);
$end_date = self::subscriptionExpiredOn($user_id);
$subscription_info['start_date'] = $start_date->toDateTimeString();
if ($package->price_interval == 'days') {
$subscription_info['end_date'] = $end_date->addDays($package->interval)->toDateTimeString();
} elseif ($package->price_interval == 'months') {
$subscription_info['end_date'] = $end_date->addMonths($package->interval)->toDateTimeString();
} elseif ($package->price_interval == 'year') {
$subscription_info['end_date'] = $end_date->addYears($package->interval)->toDateTimeString();
}
$package_subscribed = self::create($subscription_info);
return $package_subscribed;
}
public static function activeSubscription($user_id)
{
$today = Carbon::today()->toDateString();
$subscription = self::where('user_id', $user_id)
->where('start_date', '<=', $today)
->where('end_date', '>=', $today)
->where('status', 'approved')
->first();
return $subscription;
}
public static function upcomingSubscriptions($user_id)
{
$today = Carbon::today()->toDateString();
$subscriptions = self::where('user_id', $user_id)
->where('start_date', '>', $today)
->where('end_date', '>', $today)
->where('status', 'approved')
->get();
return $subscriptions;
}
public static function waitingSubscriptions($user_id)
{
$today = Carbon::today()->toDateString();
$subscriptions = self::where('user_id', $user_id)
->where('start_date', '>', $today)
->where('end_date', '>', $today)
->where('status', 'waiting')
->get();
return $subscriptions;
}
public static function subscriptionExpiredOn($user_id)
{
$today = Carbon::today();
$subscription = self::where('user_id', $user_id)
->where('status', 'approved')
->select(DB::raw('MAX(end_date) as end_date'))
->first();
if (empty($subscription->end_date) || Carbon::parse($subscription->end_date)->lessThanOrEqualTo($today)) {
return $today;
} else {
return Carbon::parse($subscription->end_date)->addDay();
}
}
public static function disableAllPackagesForUser($user_id)
{
self::where('user_id', $user_id)
->where('end_date', '>', Carbon::today()->toDateString())
->update(['end_date' => Carbon::yesterday()->toDateString()]);
}
}