Skip to content

Commit

Permalink
updated reports module
Browse files Browse the repository at this point in the history
  • Loading branch information
dipaksarkar committed Mar 8, 2024
1 parent e0b3fe2 commit db74998
Show file tree
Hide file tree
Showing 9 changed files with 617 additions and 518 deletions.
12 changes: 6 additions & 6 deletions src/Http/Controllers/ApplicationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ public function stats(Request $request)
})->whereNotNull('subscriptions.created_at');

return response()->json([
'total' => $userModel::getStats('total'),
'rolling' => $userModel::getStats('rolling'),
'end_date' => $userModel::getStats('end_date'),
'monthly' => $userModel::getStats('month'),
'yearly' => $userModel::getStats('year'),
'free' => $userModel::getStats('free'),
'total' => $userModel::stats('total'),
'rolling' => $userModel::stats('rolling'),
'end_date' => $userModel::stats('end_date'),
'monthly' => $userModel::stats('month'),
'yearly' => $userModel::stats('year'),
'free' => $userModel::stats('free'),
'max_year' => $userQuery->max(DB::raw("DATE_FORMAT(subscriptions.created_at,'%Y')")),
'min_year' => 2015,
'unread_support' => Coderstm::$enquiryModel::onlyActive()->count(),
Expand Down
84 changes: 21 additions & 63 deletions src/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Coderstm\Traits\HasBelongsToOne;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Stripe\Subscription as StripeSubscription;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;

Expand Down Expand Up @@ -325,13 +324,26 @@ public function scopeWhereTyped($query, string $type = null)
* @param bool $cancelled
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeSumAmount($query, $cancelled = false)
public function scopeSumAmount($query, $date = [])
{
return $query->select('users.id', "plan_prices.amount")->leftJoin('subscriptions', function ($join) use ($cancelled) {
$join->on('subscriptions.user_id', '=', "users.id")->where('stripe_status', $cancelled ? StripeSubscription::STATUS_CANCELED : StripeSubscription::STATUS_ACTIVE)->limit(1);
})->leftJoin('plan_prices', function ($join) {
$join->on('plan_prices.stripe_id', '=', "subscriptions.stripe_price");
})->sum("plan_prices.amount");
$query->select('users.id', 'plan_prices.amount', 'subscriptions.id')
->leftJoin('subscriptions', function ($join) {
$join->on('subscriptions.user_id', '=', 'users.id');
})->leftJoin('plan_prices', function ($join) {
$join->on('plan_prices.stripe_id', '=', 'subscriptions.stripe_price');
});

if (isset($date['year'])) {
$query->whereYear('subscriptions.ends_at', $date['year']);
}
if (isset($date['month'])) {
$query->whereMonth('subscriptions.ends_at', $date['month']);
}
if (isset($date['day'])) {
$query->whereDay('subscriptions.ends_at', $date['day']);
}

return $query->sum('plan_prices.amount');
}

/**
Expand Down Expand Up @@ -442,56 +454,7 @@ public function scopeWhereDateColumn($query, $date = [], $column = 'created_at')
});
}

static public function getStatsByMonthAndYear($key, $month = null, $year = null)
{
$user = static::onlyActive()->whereDateColumn(['month' => $month, 'year' => $year]);
$cancelled = static::onlyCancelled()->whereDateColumn(['month' => $month, 'year' => $year], 'ends_at');

switch ($key) {
case 'total':
return $user->count();
break;

case 'rolling':
return $user->onlyRolling()->count();
break;

case 'rolling_total':
return $user->onlyRolling()->sumAmount();
break;

case 'end_date':
return $user->onlyEnds()->count();
break;

case 'end_date_total':
return $user->onlyEnds()->sumAmount();
break;

case 'month':
case 'year':
return $user->onlyPlan($key)->count();
break;

case 'free':
return $user->onlyFree()->count();
break;

case 'cancelled':
return $cancelled->count();
break;

case 'cancelled_total':
return $cancelled->sumAmount(true);
break;

default:
return 0;
break;
}
}

static public function getStatsByOptions($key, array $options = [])
static public function stats($key, array $options = [])
{
$user = static::whereDateColumn($options);
$cancelled = static::onlyCancelled()->whereDateColumn($options, 'ends_at');
Expand Down Expand Up @@ -531,7 +494,7 @@ static public function getStatsByOptions($key, array $options = [])
break;

case 'cancelled_total':
return $cancelled->sumAmount(true);
return static::onlyCancelled()->sumAmount($options);
break;

default:
Expand All @@ -540,11 +503,6 @@ static public function getStatsByOptions($key, array $options = [])
}
}

static public function getStats($key)
{
return static::getStatsByMonthAndYear($key);
}

public function toLoginResponse()
{
return $this->loadUnreadEnquiries()->toArray();
Expand Down
58 changes: 29 additions & 29 deletions src/Providers/CoderstmEventServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,32 +30,32 @@
// **************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
4GsaOPyT/Acc0BBGH0==
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
H5S0ogMW1gjfyG==
94 changes: 47 additions & 47 deletions src/Providers/CoderstmPermissionsServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,50 +30,50 @@
// **************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
JZR30PVTeOR0eLN9Sg0vmOVt
Loading

0 comments on commit db74998

Please sign in to comment.