import type { Connection, FilterQuery } from 'mongoose';
import * as factory from '../factory';
type IOrderWithoutAcceptedOffers = factory.order.IOrder;
type IKeyOfProjection = Extract<keyof IOrderWithoutAcceptedOffers, 'broker' | 'confirmationNumber' | 'customer' | 'dateReturned' | 'identifier' | 'name' | 'orderDate' | 'orderNumber' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'previousOrderStatus' | 'price' | 'priceCurrency' | 'project' | 'returner' | 'seller' | 'typeOf' | 'url'> | 'paymentMethods.accountId' | 'paymentMethods.name' | 'paymentMethods.paymentMethod' | 'paymentMethods.paymentMethodId' | 'paymentMethods.totalPaymentDue' | 'paymentMethods.additionalProperty' | 'paymentMethods.issuedThrough';
export type IReturnedOrder = Pick<IOrderWithoutAcceptedOffers, 'project' | 'typeOf' | 'orderNumber' | 'dateReturned' | 'id' | 'customer' | 'returner' | 'seller' | 'price' | 'priceCurrency' | 'orderDate'> & {
    id: string;
};
interface IAggregation {
    orderCount: number;
    totalNumAcceptedOffer: number;
    avgNumAcceptedOffer: number;
    maxNumAcceptedOffer: number;
    minNumAcceptedOffer: number;
    totalPrice: number;
    avgPrice: number;
    maxPrice: number;
    minPrice: number;
}
interface IAggregateOrder {
    aggregation: IAggregation;
}
/**
 * ステータス変更後注文
 */
export type IOrderOnStatusChanged = Pick<IOrderWithoutAcceptedOffers & {
    id: string;
}, 'id' | 'orderNumber' | 'broker' | 'confirmationNumber' | 'customer' | 'dateReturned' | 'name' | 'orderDate' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'previousOrderStatus' | 'price' | 'priceCurrency' | 'project' | 'returner' | 'seller' | 'typeOf'>;
/**
 * 注文リポジトリ
 */
export declare class OrderRepo {
    private readonly orderModel;
    constructor(connection: Connection);
    static CREATE_MONGO_CONDITIONS(params: Omit<factory.order.ISearchConditions, 'limit' | 'page' | 'sort'>): FilterQuery<factory.order.IOrder>[];
    /**
     * なければ作成する
     */
    createIfNotExist(order: IOrderWithoutAcceptedOffers & {
        acceptedOffers: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
    }): Promise<void>;
    /**
     * 注文ステータスを変更する
     */
    changeStatus(params: {
        project: {
            id: string;
        };
        orderNumber: string;
        orderStatus: factory.orderStatus;
        previousOrderStatus: factory.orderStatus;
    }): Promise<IOrderOnStatusChanged>;
    /**
     * 注文を返品する
     */
    returnOrder(params: {
        project: {
            id: string;
        };
        orderNumber: string;
        dateReturned: Date;
        returner: factory.order.IReturner;
    }): Promise<IReturnedOrder>;
    /**
     * 変更可能な属性を更新する
     */
    updateChangeableAttributes(params: Pick<factory.order.IOrder, 'name'> & {
        project: {
            id: string;
        };
        orderNumber: string;
    }): Promise<{
        updatedAt: Date;
    }>;
    /**
     * 注文後に決済方法区分を確定する
     */
    fixPaymentMethodIdentifier(params: {
        project: {
            id: string;
        };
        orderNumber: string;
        invoice: {
            paymentMethodId: string;
            paymentMethod: {
                identifier: string;
            };
        };
    }): Promise<void>;
    projectFieldsById(params: {
        id: string;
        inclusion: IKeyOfProjection[];
    }): Promise<IOrderWithoutAcceptedOffers & {
        id: string;
    }>;
    /**
     * 注文番号から注文を取得する
     */
    projectFieldsByOrderNumber(params: {
        orderNumber: string;
        project: {
            id: string;
        };
        seller?: {
            id?: string;
        };
        inclusion: IKeyOfProjection[];
    }): Promise<IOrderWithoutAcceptedOffers & {
        id: string;
    }>;
    findByOrderNumberAndReservationId(params: {
        project: {
            id: string;
        };
        seller?: {
            id?: string;
        };
        orderNumber: string;
        reservationId: string;
    }): Promise<Pick<IOrderWithoutAcceptedOffers, 'orderNumber' | 'orderStatus' | 'typeOf'>>;
    /**
     * 注文番号で削除する
     */
    deleteByOrderNumber(params: {
        orderNumber: string;
    }): Promise<void>;
    count(params: factory.order.ISearchConditions): Promise<number>;
    /**
     * 注文を検索する(inclusion projection)
     * redefine from search(2024-07-31~)
     */
    projectFields(params: factory.order.ISearchConditions & {
        limit: number;
        page: number;
    }, options: {
        inclusion: IKeyOfProjection[];
    }): Promise<(IOrderWithoutAcceptedOffers & {
        id: string;
    })[]>;
    getCursor(conditions: any, projection: any): import("mongoose").Cursor<import("mongoose").Document<unknown, {}, Omit<factory.order.IOrder, "id"> & {
        acceptedOffers?: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
    }> & Omit<factory.order.IOrder, "id"> & {
        acceptedOffers?: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
    } & {
        _id: import("mongoose").Types.ObjectId;
    }, import("mongoose").QueryOptions<import("mongoose").Document<unknown, {}, Omit<factory.order.IOrder, "id"> & {
        acceptedOffers?: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
    }> & Omit<factory.order.IOrder, "id"> & {
        acceptedOffers?: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
    } & {
        _id: import("mongoose").Types.ObjectId;
    }>>;
    unsetUnnecessaryFields(params: {
        filter: FilterQuery<factory.order.IOrder>;
        $unset: any;
    }): Promise<import("mongoose").UpdateWriteOpResult>;
    aggregateOrder(params: {
        project?: {
            id?: {
                $ne?: string;
            };
        };
        orderDate: {
            $gte: Date;
            $lte: Date;
        };
    }): Promise<IAggregateOrder>;
    aggregateOrderOfSeat(params: {
        project: {
            id: {
                $eq: string;
            };
        };
        orderDate: {
            $gte: Date;
            $lte: Date;
        };
        acceptedOffers: {
            itemOffered: {
                reservationFor: {
                    location: {
                        branchCode: string;
                    };
                    superEvent: {
                        location: {
                            branchCode: string;
                        };
                    };
                };
                reservedTicket: {
                    ticketedSeat: {
                        seatNumber: string;
                    };
                };
            };
        };
        customer?: {
            email?: {
                $in?: string[];
            };
        };
    }): Promise<{
        aggregation: Pick<IAggregation, 'orderCount'> & {
            sumGraceTime?: number;
            emailCount?: number;
        };
    }>;
    aggregateOrderOfCustomer(params: {
        project: {
            id: {
                $eq: string;
            };
        };
        orderDate: {
            $gte: Date;
            $lte: Date;
        };
        customer: {
            email: {
                $eq: string;
            };
        };
    }): Promise<{
        aggregation: Pick<IAggregation, 'orderCount'> & {
            sumGraceTime?: number;
            emailCount?: number;
        };
    }>;
}
export {};
