format('Y'); $prefix = 'HD-'.$year.'-'; $this->lockReferenceSeries($prefix); $lastReference = Ticket::query() ->where('reference', 'like', $prefix.'%') ->orderByDesc('reference') ->value('reference'); $next = $lastReference === null ? 1 : ((int) substr((string) $lastReference, -5)) + 1; return $prefix.str_pad((string) $next, 5, '0', STR_PAD_LEFT); } /** * Lock the current ticket reference series for the active transaction. */ private function lockReferenceSeries(string $prefix): void { if (DB::connection()->getDriverName() !== 'pgsql') { return; } DB::select('select pg_advisory_xact_lock(hashtext(?))', [ 'helpdesk-ticket-reference:'.$prefix, ]); } }