116 lines
4.6 KiB
PHP
116 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Client;
|
|
use App\Models\ClientInvoice;
|
|
use App\Models\ClientProjectActivities;
|
|
use App\Services\UserHierarchyService;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
public function __construct(private UserHierarchyService $hierarchyService)
|
|
{
|
|
}
|
|
|
|
public function __invoke(Request $request): Response
|
|
{
|
|
$user = $request->user();
|
|
$visibleClients = $this->hierarchyService
|
|
->scopeClientsVisibleTo(
|
|
Client::query()->with(['invoices', 'invoiceAdjustments', 'customers']),
|
|
$user
|
|
)
|
|
->get();
|
|
$visibleClientIds = $visibleClients->pluck('id');
|
|
$visibleClientQuery = fn (): Builder => Client::query()->whereIn('id', $visibleClientIds);
|
|
$visibleInvoiceQuery = fn (): Builder => ClientInvoice::query()->whereIn('client_id', $visibleClientIds);
|
|
$unlinkedPendingInvoiceCount = $user->hasRole('Admin')
|
|
? ClientInvoice::query()->whereNull('approved_at')->whereNull('client_id')->count()
|
|
: 0;
|
|
|
|
$pendingInvoiceCount = $visibleInvoiceQuery()
|
|
->whereNull('approved_at')
|
|
->count() + $unlinkedPendingInvoiceCount;
|
|
|
|
$pendingActivities = ClientProjectActivities::query()
|
|
->whereIn('client_id', $visibleClientIds)
|
|
->whereNull('completed_at')
|
|
->whereNotNull('estimated_completed_at')
|
|
->count();
|
|
|
|
return Inertia::render('dashboard', [
|
|
'stats' => [
|
|
'totalClients' => $visibleClients->count(),
|
|
'pendingInvoices' => $pendingInvoiceCount,
|
|
'unlinkedPendingInvoices' => $unlinkedPendingInvoiceCount,
|
|
'pendingActivities' => $pendingActivities,
|
|
'clientsMissingSqlCode' => $visibleClientQuery()
|
|
->where(function (Builder $query) {
|
|
$query->whereNull('sql_acc_code')
|
|
->orWhere('sql_acc_code', '');
|
|
})
|
|
->whereDoesntHave('customers', function (Builder $query) {
|
|
$query->whereNotNull('sql_acc_code')
|
|
->where('sql_acc_code', '!=', '');
|
|
})
|
|
->count(),
|
|
],
|
|
'clientStatusCounts' => $visibleClients
|
|
->groupBy('status')
|
|
->map(fn ($clients) => $clients->count())
|
|
->sortKeys()
|
|
->toArray(),
|
|
'recentInvoices' => $visibleInvoiceQuery()
|
|
->with('client:id,name,customer_id')
|
|
->latest('id')
|
|
->limit(6)
|
|
->get([
|
|
'id',
|
|
'client_id',
|
|
'invoice_no',
|
|
'approved_at',
|
|
'management_fee',
|
|
'media_fee',
|
|
'nett_amount',
|
|
'created_at',
|
|
])
|
|
->map(fn (ClientInvoice $invoice) => [
|
|
'id' => $invoice->id,
|
|
'invoice_no' => $invoice->invoice_no,
|
|
'approved_at' => $invoice->approved_at?->toDateTimeString(),
|
|
'management_fee' => $invoice->management_fee,
|
|
'media_fee' => $invoice->media_fee,
|
|
'nett_amount' => $invoice->nett_amount,
|
|
'created_at' => $invoice->created_at?->toDateString(),
|
|
'client' => $invoice->client,
|
|
])
|
|
->values()
|
|
->all(),
|
|
'pendingActivities' => ClientProjectActivities::query()
|
|
->with(['client:id,name,customer_id', 'user:id,name'])
|
|
->whereIn('client_id', $visibleClientIds)
|
|
->whereNull('completed_at')
|
|
->whereNotNull('estimated_completed_at')
|
|
->orderBy('estimated_completed_at')
|
|
->limit(6)
|
|
->get()
|
|
->map(fn (ClientProjectActivities $activity) => [
|
|
'id' => $activity->id,
|
|
'activity_no' => $activity->activity_no,
|
|
'activity_type' => $activity->activity_type,
|
|
'task_description' => $activity->task_description,
|
|
'estimated_completed_at' => $activity->estimated_completed_at?->toDateString(),
|
|
'client' => $activity->client,
|
|
'assigned_person' => $activity->user?->name,
|
|
])
|
|
->values()
|
|
->all(),
|
|
]);
|
|
}
|
|
}
|