where('type', 'manual') ->where('status', TransactionStatus::PENDING->value) ->whereNull('proof_image'); } public static function expiresAt(Transaction $draft): CarbonInterface { return $draft->created_at->copy()->addMinutes(self::TTL_MINUTES); } public static function isExpired(Transaction $draft): bool { return self::expiresAt($draft)->isPast(); } public static function expiredQuery(): Builder { return self::query()->where('created_at', '<=', now()->subMinutes(self::TTL_MINUTES)); } public static function discard(Transaction $draft): bool { return DB::transaction(function () use ($draft) { $locked = self::query()->whereKey($draft->getKey())->lockForUpdate()->first(); return $locked ? (bool) $locked->forceDelete() : false; }); } }