import type { Connection, FilterQuery } from 'mongoose';
import * as factory from '../factory';
type IKeyOfProjection<T extends factory.transactionType> = keyof Pick<factory.transaction.ITransaction<factory.transactionType>, 'agent' | 'endDate' | 'expires' | 'project' | 'startDate' | 'status' | 'typeOf'> | Exclude<keyof factory.transaction.ITransaction<T>, 'id'>;
interface IAggregationByStatus {
    transactionCount: number;
    avgDuration: number;
    maxDuration: number;
    minDuration: number;
    percentilesDuration: {
        name: string;
        value: number;
    }[];
}
interface IStatus {
    status: factory.transactionStatusType;
    aggregation: IAggregationByStatus;
}
export interface IAggregatePlaceOrder {
    statuses: IStatus[];
}
type IOmittedFieldsInProgress = 'tasksExportAction' | 'tasksExportedAt' | 'tasksExportationStatus';
export type ITransactionInProgress<T extends factory.transactionType> = T extends factory.transactionType.MoneyTransfer ? Omit<factory.transaction.moneyTransfer.ITransaction, IOmittedFieldsInProgress> : T extends factory.transactionType.PlaceOrder ? Omit<factory.transaction.placeOrder.ITransaction, IOmittedFieldsInProgress> : T extends factory.transactionType.ReturnOrder ? Omit<factory.transaction.returnOrder.ITransaction, IOmittedFieldsInProgress> : never;
type IStartedTransactionFields = 'expires' | 'id' | 'startDate' | 'status';
export type IStartedTransaction = Pick<factory.transaction.ITransaction<factory.transactionType>, IStartedTransactionFields>;
/**
 * 取引リポジトリ
 */
export declare class TransactionRepo {
    private readonly transactionModel;
    constructor(connection: Connection);
    static CREATE_MONGO_CONDITIONS(params: factory.transaction.ISearchConditions<factory.transactionType>): FilterQuery<import("@chevre/factory/lib/assetTransaction/cancelReservation").ITransaction | import("@chevre/factory/lib/assetTransaction/moneyTransfer").ITransaction | import("@chevre/factory/lib/assetTransaction/pay").ITransaction | import("@chevre/factory/lib/assetTransaction/refund").ITransaction | import("@chevre/factory/lib/assetTransaction/registerService").ITransaction | import("@chevre/factory/lib/assetTransaction/reserve").ITransaction>[];
    /**
     * 取引を開始する
     */
    start<T extends factory.transactionType>(params: factory.transaction.IStartParams<T>): Promise<IStartedTransaction>;
    /**
     * 特定取引検索
     */
    projectFieldsById<T extends factory.transactionType>(params: {
        typeOf: T;
        id: string;
    }, inclusion: IKeyOfProjection<T>[]): Promise<factory.transaction.ITransaction<T>>;
    /**
     * 進行中の取引を取得する
     */
    projectFieldsInProgressById<T extends factory.transactionType>(params: {
        typeOf: T;
        id: string;
    }, inclusion: IKeyOfProjection<T>[]): Promise<ITransactionInProgress<T>>;
    /**
     * 進行中取引に保管された採用済決済方法を検索する
     */
    findInProgressPaymentMethodId(params: {
        id: string;
    }): Promise<factory.transaction.placeOrder.IPaymentMethodByPaymentUrl | undefined>;
    /**
     * 取引の注文番号を検索する
     */
    findInProgressOrderNumberById(params: {
        id: string;
    }): Promise<string | undefined>;
    /**
     * 取引の確認番号を検索する
     */
    findInProgressConfirmationNumberById(params: {
        id: string;
        status: {
            $in: factory.transactionStatusType[];
        };
    }): Promise<string | undefined>;
    /**
     * 取引進行者プロフィールを更新
     */
    updateAgent<T extends factory.transactionType>(params: {
        typeOf: T;
        id: string;
        agent: Pick<factory.transaction.IAgent, 'id'>;
        object?: {
            customer?: factory.order.ICustomer;
        };
    }): Promise<void>;
    /**
     * 取引期限変更
     */
    updateExpires<T extends factory.transactionType>(params: {
        typeOf: T;
        id: string;
        expires: Date;
    }): Promise<void>;
    /**
     * 取引オブジェクトを更新
     * 注文名称など
     */
    updateObject<T extends factory.transactionType>(params: {
        typeOf: T;
        id: string;
        object?: {
            name?: string;
        };
    }): Promise<void>;
    /**
     * 取引を確定する
     */
    confirm<T extends factory.transactionType>(params: {
        typeOf: T;
        id: string;
        result: factory.transaction.IResult<T>;
        potentialActions: factory.transaction.IPotentialActions<T>;
    }): Promise<void>;
    countPotentiallyExportTasks(params: {
        endDate: {
            $lt: Date;
        };
        limit?: number;
    }): Promise<{
        count: number;
    }>;
    /**
     * タスク未エクスポートの取引をひとつ取得してエクスポートを開始する
     */
    startExportTasks(params: {
        status?: {
            $eq?: factory.transactionStatusType;
        };
        id?: string;
        tasksExportAction: {
            agent: {
                name: string;
            };
        };
        endDate: {
            $lt: Date;
        };
        sort?: {
            endDate?: factory.sortType;
            startDate?: factory.sortType;
        };
    }): Promise<Pick<factory.transaction.ITransaction<factory.transactionType>, 'id' | 'typeOf'> | null>;
    /**
     * tasksExportAction.actionStatusがActiveActionStatusのまま一定時間経過した取引について
     * PotentialActionStatusに変更する
     * 2025-03-10~
     */
    reExportAction(params: {
        startDate: {
            $lt: Date;
        };
    }): Promise<import("mongoose").UpdateWriteOpResult>;
    /**
     * タスクエクスポートの遅延している取引について明示的にemitTransactionStatusChangedを実行する
     */
    exportTasksMany(params: {
        now: Date;
        delayInSeconds: number;
        status: {
            $in: factory.transactionStatusType[];
        };
        limit: number;
    }): Promise<Pick<import("@chevre/factory/lib/transaction/moneyTransfer").ITransaction | import("@chevre/factory/lib/transaction/placeOrder").ITransaction | import("@chevre/factory/lib/transaction/returnOrder").ITransaction, "id" | "status" | "typeOf">[]>;
    /**
     * set task status exported by transaction id
     * IDでタスクをエクスポート済に変更する
     */
    setTasksExportedById(params: {
        id: string;
    }): Promise<void>;
    /**
     * add(2025-03-13~)
     */
    countPotentiallyExpired(params: {
        expires: {
            $lt: Date;
        };
        limit?: number;
    }): Promise<{
        count: number;
    }>;
    /**
     * add(2025-03-03~)
     */
    makeOneExpiredIfExists(params: {
        expires: {
            $lt: Date;
        };
    }): Promise<Pick<factory.transaction.ITransaction<factory.transactionType>, 'id' | 'typeOf'> | void>;
    /**
     * 取引を期限切れにする
     */
    makeExpired(params: {
        expires: {
            $lt: Date;
        };
        limit: number;
    }): Promise<Pick<factory.transaction.ITransaction<factory.transactionType>, 'id' | 'typeOf'>[]>;
    /**
     * 取引を中止する
     */
    cancel<T extends factory.transactionType>(params: {
        typeOf: T;
        id: string;
    }): Promise<void>;
    count<T extends factory.transactionType>(params: factory.transaction.ISearchConditions<T>): Promise<{
        count: number;
    }>;
    /**
     * 取引を検索する
     */
    projectFields<T extends factory.transactionType, F extends IKeyOfProjection<T>>(params: factory.transaction.ISearchConditions<T> & {
        inclusion: F[];
    }): Promise<(Pick<factory.transaction.ITransaction<T>, F> & {
        id: string;
    })[]>;
    /**
     * 特定の進行中取引を更新する(汎用)
     */
    findByIdAndUpdateInProgress(params: {
        id: string;
        update: {
            $set?: {
                'object.paymentMethods'?: factory.transaction.placeOrder.IPaymentMethodByPaymentUrl;
            };
        };
    }): Promise<void>;
    saveOrderNumberIfNotExist(params: {
        id: string;
        orderNumber: string;
    }): Promise<void>;
    saveConfirmationNumberIfNotExist(params: {
        id: string;
        status: {
            $in: factory.transactionStatusType[];
        };
        confirmationNumber: string;
    }): Promise<void>;
    findByIdAndDelete(params: {
        id: string;
    }): Promise<void>;
    unsetUnnecessaryFields(params: {
        filter: any;
        $unset: any;
    }): Promise<import("mongoose").UpdateWriteOpResult>;
    /**
     * 終了日時を一定期間過ぎたアクションを削除する
     */
    deleteEndDatePassedCertainPeriod(params: {
        typeOf: factory.transactionType;
        endDate: {
            $gte: Date;
            $lt: Date;
        };
    }): Promise<import("mongodb").DeleteResult>;
    getCursor(conditions: any, projection: any): import("mongoose").Cursor<import("mongoose").Document<unknown, {}, import("@chevre/factory/lib/transaction/moneyTransfer").ITransaction | import("@chevre/factory/lib/transaction/placeOrder").ITransaction | import("@chevre/factory/lib/transaction/returnOrder").ITransaction> & ((import("@chevre/factory/lib/transaction/moneyTransfer").IAttributes & {
        id: string;
    } & {
        _id: import("mongoose").Types.ObjectId;
    }) | (import("@chevre/factory/lib/transaction/placeOrder").IAttributes & {
        id: string;
    } & {
        _id: import("mongoose").Types.ObjectId;
    }) | (import("@chevre/factory/lib/transaction/returnOrder").IAttributes & {
        id: string;
    } & {
        _id: import("mongoose").Types.ObjectId;
    })), import("mongoose").QueryOptions<import("mongoose").Document<unknown, {}, import("@chevre/factory/lib/transaction/moneyTransfer").ITransaction | import("@chevre/factory/lib/transaction/placeOrder").ITransaction | import("@chevre/factory/lib/transaction/returnOrder").ITransaction> & ((import("@chevre/factory/lib/transaction/moneyTransfer").IAttributes & {
        id: string;
    } & {
        _id: import("mongoose").Types.ObjectId;
    }) | (import("@chevre/factory/lib/transaction/placeOrder").IAttributes & {
        id: string;
    } & {
        _id: import("mongoose").Types.ObjectId;
    }) | (import("@chevre/factory/lib/transaction/returnOrder").IAttributes & {
        id: string;
    } & {
        _id: import("mongoose").Types.ObjectId;
    }))>>;
    aggregatePlaceOrder(params: {
        project?: {
            id?: {
                $ne?: string;
            };
        };
        startFrom: Date;
        startThrough: Date;
        typeOf: factory.transactionType;
        clientId?: string;
    }): Promise<IAggregatePlaceOrder>;
    private agggregateByStatus;
}
export {};
