Current File : /home/getxxhzo/app.genicards.com/app/Repositories/DashboardRepository.php |
<?php
namespace App\Repositories;
use App\Models\Enquiry;
use App\Models\Plan;
use App\Models\ScheduleAppointment;
use App\Models\Subscription;
use App\Models\Transaction;
use App\Models\User;
use App\Models\Vcard;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Illuminate\Database\Eloquent\Collection;
/**
* Class CityRepository
*
* @version July 31, 2021, 7:41 am UTC
*/
class DashboardRepository
{
/**
* @return \App\Models\Builder|User|User[]|\Illuminate\Database\Eloquent\Builder|Collection
*/
public function getUsers()
{
return User::whereHas('roles', function ($q) {
$q->where('name', '!=', 'super_admin');
})->get();
}
/**
* @return Vcard[]|Collection
*/
public function getVcards()
{
return Vcard::all();
}
/**
* @return Plan[]|Collection
*/
public function getPlans()
{
return Plan::all();
}
/**
* @return mixed
*/
public function getVcardsCount()
{
return Vcard::where('tenant_id', auth()->user()->tenant_id)->get();
}
/**
* @return mixed
*/
public function getEnquiryCountAttribute()
{
$vcardIds = Vcard::where('tenant_id', auth()->user()->tenant_id)->select('id');
return Enquiry::whereIn('vcard_id', $vcardIds)->whereDate('created_at', \Carbon\Carbon::today())->count();
}
/**
* @return mixed
*/
public function getAppointmentCountAttribute()
{
$vcardIds = Vcard::where('tenant_id', auth()->user()->tenant_id)->select('id');
$today = Carbon::now()->format('Y-m-d');
return ScheduleAppointment::whereIn('vcard_id', $vcardIds)->whereDate('date', $today)->count();
}
/**
* @return mixed
*/
public function usersData($input)
{
if (isset($input['day'])) {
$data = User::whereRaw('Date(created_at) = CURDATE()')->orderBy('created_at', 'DESC')
->paginate(5);
return $data;
}
if (isset($input['week'])) {
$now = Carbon::now();
$weekStartDate = $now->startOfWeek()->format('Y-m-d H:i');
$weekEndDate = $now->endOfWeek()->format('Y-m-d H:i');
$data = User::whereBetween('created_at', [$weekStartDate, $weekEndDate])
->orderBy('created_at', 'DESC')
->paginate(5);
return $data;
}
if (isset($input['month'])) {
$data = User::whereMonth('created_at', Carbon::now()->month)
->orderBy('created_at', 'DESC')
->paginate(5);
return $data;
}
}
public function planChartData(): array
{
$plans = Plan::withCount([
'subscriptions' => function ($q) {
$q->where('status', true);
},
])->pluck('subscriptions_count', 'name')->toArray();
$totalSubsPlan = array_sum($plans);
$data = [];
foreach ($plans as $name => $planCount) {
$data['labels'][] = $name;
$data['breakDown'][] = number_format($planCount * 100 / $totalSubsPlan, 2);
}
return $data;
}
public function incomeChartData($input)
{
if ($input) {
$startDate = $input['start_date'];
$endDate = $input['end_date'];
$startDate = Carbon::parse($startDate);
$endDate = Carbon::parse($endDate);
$manualPayment = Subscription::wherePaymentType('paid')
->whereYear('created_at', Carbon::now()->year)->get()
->groupBy(function ($q) {
return Carbon::parse($q->created_at)->isoFormat('MMM');
});
$transactions = Transaction::whereStatus(1)
->whereBetween('created_at', [$startDate, $endDate])
->get()
->groupBy(function ($q) {
return Carbon::parse($q->created_at)->format('Y-m');
});
$data = $labels = $dataset = $colors = $borderColors = [];
$periods = CarbonPeriod::create($startDate->startOfYear(), '1 month', $endDate->endOfYear());
foreach ($periods as $key => $period) {
$month = $period->format('Y-m');
$labels[] = $period->isoFormat('MMM');
$colors[] = getBGColors($key) . ')';
$borderColors[] = getBGColors($key) . ', 0.75)';
$amounts = isset($transactions[$month])
? $transactions[$month]->pluck('amount')->toArray() : [0];
$amounts = isset($manualPayment[$month])
? array_merge($amounts, $manualPayment[$month]->pluck('payable_amount')->toArray()) : $amounts;
$dataset[] = removeCommaFromNumbers(number_format(array_sum($amounts), 2));
}
$data['labels'] = $labels;
$data['breakDown'][] = [
'label' => __('messages.common.total_amount'),
'data' => $dataset,
'backgroundColor' => $colors,
'borderColor' => $borderColors,
'lineTension' => 0.5,
'radius' => 4,
];
return $data;
}
}
}