session()->get('user.business_id'); $this->authorizeProjectAccess($business_id, (int) $project_id); if (! $request->ajax() || ! $this->isTmsAvailable($business_id)) { abort(404); } if (! auth()->user()->can('tms.shipments.view')) { abort(403, 'Unauthorized action.'); } $statuses = $this->tmsUtil->shipmentStatuses(); $types = $this->tmsUtil->shipmentTypes(); $query = Shipment::where('business_id', $business_id) ->where('pjt_project_id', $project_id) ->with(['driver:id,name', 'vehicle:id,plate_number']) ->orderByDesc('created_at'); return DataTables::of($query) ->editColumn('status', fn ($row) => $statuses[$row->status] ?? $row->status) ->editColumn('shipment_type', fn ($row) => $types[$row->shipment_type] ?? $row->shipment_type) ->editColumn('freight_cost', fn ($row) => $this->commonUtil->num_f($row->freight_cost, true)) ->editColumn('scheduled_at', fn ($row) => $row->scheduled_at?->format('Y-m-d H:i') ?? '—') ->addColumn('driver_name', fn ($row) => $row->driver?->name ?? '—') ->addColumn('action', function ($row) { return ''; }) ->rawColumns(['action']) ->make(true); } protected function isTmsAvailable(int $business_id): bool { if (! \Module::has('Tms') || ! \Module::isEnabled('Tms')) { return false; } if (! $this->moduleUtil->isModuleInstalled('Tms')) { return false; } if ($this->moduleUtil->isSuperadminInstalled()) { return (bool) $this->moduleUtil->hasThePermissionInSubscription($business_id, 'tms_module'); } return true; } protected function authorizeProjectAccess(int $business_id, int $project_id): void { if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'project_module'))) { abort(403, 'Unauthorized action.'); } $query = Project::where('business_id', $business_id)->where('id', $project_id); if (! $this->commonUtil->is_admin(auth()->user(), $business_id)) { $user_id = auth()->user()->id; $query->whereHas('members', fn ($q) => $q->where('user_id', $user_id)); } $query->firstOrFail(); } }