inspiren-sem-tool/app/Http/Controllers/DashboardController.php
brian-inspiren 221d3f8173
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
feat: sem codebase
2026-05-21 11:28:03 +08:00

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(),
]);
}
}