belongsTo(File::class); } public static function getNextTtnNumber(): int { return Setting::getInt(Setting::KEY_TTN_NEXT_NUMBER, static::detectNextTtnNumber()) ?? 1; } public static function reserveNextTtnNumber(): int { return DB::transaction(static function (): int { $setting = Setting::query() ->lockForUpdate() ->firstOrNew(['key' => Setting::KEY_TTN_NEXT_NUMBER]); $nextNumber = (int) ($setting->value ?: static::detectNextTtnNumber()); $setting->value = (string) ($nextNumber + 1); $setting->save(); return $nextNumber; }); } private static function detectNextTtnNumber(): int { return (int) static::query() ->where('year', now()->year) ->max('ttn_number') + 1; } }