Files
GSB-Construction/app/Http/Middleware/HandleInertiaRequests.php
Ajjj ccbd23d474
Some checks failed
Tests / PHP 8.3 (push) Has been cancelled
Tests / PHP 8.4 (push) Has been cancelled
Tests / PHP 8.5 (push) Has been cancelled
feat: enhance module RBAC permissions, financial billing workflows, task evidence uploading, and role analytics
2026-08-13 18:46:26 +08:00

132 lines
5.7 KiB
PHP

<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Inertia\Middleware;
use Modules\ApprovalWorkflow\Models\ApprovalChain;
use Modules\ContractorManagement\Models\Contractor;
use Modules\MaterialLogistics\Models\MaterialRequisition;
use Modules\MaterialLogistics\Models\PurchaseOrder;
use Modules\ProjectManagement\Models\Project;
class HandleInertiaRequests extends Middleware
{
/**
* The root template that is loaded on the first page visit.
*
* @var string
*/
protected $rootView = 'app';
/**
* Determine the current asset version.
*/
public function version(Request $request): ?string
{
return parent::version($request);
}
/**
* Define the props that are shared by default.
*
* @return array<string, mixed>
*/
public function share(Request $request): array
{
return [
...parent::share($request),
'auth' => [
'user' => $request->user()?->load(['contractor', 'employeeProfile', 'customerProfile']),
'roles' => $request->user()?->getRoleNames() ?? [],
'permissions' => $request->user()?->getAllPermissions()->pluck('name') ?? [],
],
'flash' => [
'success' => $request->session()->get('success'),
'error' => $request->session()->get('error'),
],
'sidebarBadges' => fn () => $request->user() ? (function () use ($request) {
$user = $request->user();
// Drafts belong to their creator. Submitted requests are
// relevant only when the current user is an assigned approver.
$ownDraftRequisitions = MaterialRequisition::where('status', 'draft')
->where('requested_by', $user->id)
->count();
$assignedRequisitionApprovals = ApprovalChain::where('status', 'pending')
->where('type', 'material_requisition')
->whereHas('steps', function ($query) use ($user) {
$query->where('approver_id', $user->id)
->where('status', 'pending');
})
->count();
$ownDraftPurchaseOrders = PurchaseOrder::where('status', 'draft')
->where('requested_by', $user->id)
->count();
$assignedApprovals = ApprovalChain::where('status', 'pending')
->whereHas('steps', function ($query) use ($user) {
$query->where('approver_id', $user->id)
->where('status', 'pending');
})
->count();
return [
'pending_requisitions' => $ownDraftRequisitions + $assignedRequisitionApprovals,
'pending_purchase_orders' => $ownDraftPurchaseOrders,
'pending_approvals' => $assignedApprovals,
];
})() : null,
'projectOptions' => fn () => $request->user()
? Project::where('current_wizard_step', '>=', 7)
->whereHas('bidPackages')
->with('parentProject:id,ulid,name,code')
->get(['id', 'ulid', 'name', 'code', 'project_type', 'parent_project_id', 'status'])
: [],
'unconfirmed_payments' => fn () => $request->user() ? (function () use ($request) {
$visibleProjectIds = Project::query()->pluck('projects.id')->all();
$pendingInvoices = \Modules\FinancialManagement\Models\FinancialInvoice::with('project:id,name,code')
->whereIn('project_id', $visibleProjectIds)
->where('status', 'payment_sent')
->get(['id', 'ulid', 'invoice_number', 'project_id', 'total_amount', 'status'])
->map(fn ($inv) => [
'id' => 'inv_' . $inv->id,
'ulid' => $inv->ulid,
'number' => $inv->invoice_number,
'project_name' => $inv->project?->name ?? 'Project',
'amount' => (float) $inv->total_amount,
'type' => 'invoice',
'confirm_url' => route('finance.confirm-payment', $inv->ulid),
'view_url' => route('finance.show', $inv->ulid),
]);
$pendingRetentions = \Modules\FinancialManagement\Models\RetentionEntry::with('project:id,name,code')
->whereIn('project_id', $visibleProjectIds)
->where('type', 'credit')
->whereIn('status', ['payment_sent', 'submitted'])
->get(['id', 'ulid', 'project_id', 'amount', 'status', 'description'])
->map(fn ($ret) => [
'id' => 'ret_' . $ret->id,
'ulid' => $ret->ulid,
'number' => 'Retention Release',
'project_name' => $ret->project?->name ?? 'Project',
'amount' => (float) $ret->amount,
'type' => 'retention',
'status' => $ret->status,
'confirm_url' => route('retention.confirm', $ret->ulid),
'view_url' => route('retention.index'),
]);
$merged = $pendingInvoices->concat($pendingRetentions);
return [
'count' => $merged->count(),
'total_amount' => (float) $merged->sum('amount'),
'items' => $merged->values()->all(),
];
})() : ['count' => 0, 'total_amount' => 0, 'items' => []],
];
}
}