export interface IOffer {
    itemOffered?: {
        serviceOutput?: {
            /**
             * 予約ID
             */
            id?: string;
        };
    };
    seatSection: string;
    seatNumber: string;
}
export interface ILockKey {
    project: {
        id: string;
    };
    /**
     * required(2025-04-30~)
     * = event.organizer.id
     */
    provider: {
        id: string;
    };
    eventId: string;
    startDate: Date;
    hasTicketedSeat: boolean;
    offers: IOffer[];
    expires: Date;
    holder: string;
    /**
     * required(2025-04-24~)
     * = reserveTransaction.startDate
     */
    bookingTime: Date;
}
export interface IUnlockKey {
    project: {
        id: string;
    };
    eventId: string;
    startDate: Date;
    hasTicketedSeat: boolean;
    offer: IOffer;
    holder: string;
}
export type IGetHolderResult = string | null;
/**
 * 抽象ストックホルダーリポジトリ
 */
export declare abstract class AbstractStockHolderRepo {
    /**
     * 座席をロックする(maxキャパシティチェック有)
     */
    abstract lockIfNotLimitExceeded(lockKey: ILockKey, maximum: number): Promise<void>;
    /**
     * 座席をロックする
     */
    abstract lock(lockKey: ILockKey): Promise<void>;
    /**
     * 座席ロックを解除する
     */
    abstract unlock(params: IUnlockKey): Promise<void>;
    /**
     * 空席でない座席をカウントする
     */
    abstract countUnavailableOffers(params: {
        project: {
            id: string;
        };
        event: {
            id: string;
            startDate: Date;
            hasTicketedSeat: boolean;
        };
    }): Promise<number>;
    /**
     * 保持者を取得する
     */
    abstract getHolder(params: Omit<IUnlockKey, 'holder'>): Promise<string | null | undefined>;
    abstract searchHolders(params: {
        project: {
            id: string;
        };
        eventId: string;
        startDate: Date;
        hasTicketedSeat: boolean;
        offers: IOffer[];
    }): Promise<IGetHolderResult[]>;
}
