import type { COAFactory } from '@coasystems/factory'; import { IEvent as IBaseEvent, ISearchConditions as IBaseSearchConditions, ISortOrder } from '../event'; import { IEvent as IEventSeries, IUnacceptedPaymentMethodType } from './eventSeries'; import { EventType } from '../eventType'; import { OfferType } from '../offerType'; import { PlaceType } from '../placeType'; import { ProductType } from '../product'; import { TicketType } from '../reservation'; import { ReservationType } from '../reservationType'; import { Identifier as WebAPIIdentifier, IService as IWebAPIService } from '../service/webAPI'; import { IAggregateReservation, IOfferWithAggregateReservation, IAggregateOffer, IOfferAvailableAtOrFrom, ISellerMakesOffer, IServiceType, IOfferedThrough, ISeller, IEligibleQuantity, ILocation, IName, ISellerMakesOffer4create, ISeller4create, IAttributes as IAnyEventAttributes } from './anyEvent'; export { IAggregateReservation, IOfferWithAggregateReservation, IAggregateOffer, IOfferAvailableAtOrFrom, ISellerMakesOffer, IServiceType, IOfferedThrough, ISeller, IEligibleQuantity, ILocation, IName, ISellerMakesOffer4create, ISeller4create }; export interface IServiceOutput { typeOf: ReservationType.EventReservation; reservedTicket?: { typeOf: TicketType; /** * チケットに割り当てられる座席 * 指定席でない場合、存在しない */ ticketedSeat?: { typeOf: PlaceType.Seat; }; }; } /** * 興行 */ export interface IItemOffered { /** * 興行ID */ id: string; /** * プロダクト名称 */ name?: { ja?: string; }; /** * サービス区分 */ serviceType?: IServiceType; /** * サービスアウトプット */ serviceOutput?: IServiceOutput; typeOf: ProductType.EventService; availableChannel?: never; } /** * イベントに対するオファー */ export interface IOffer { typeOf: OfferType.Offer; eligibleQuantity: IEligibleQuantity; /** * オファー供給サービス */ offeredThrough?: IOfferedThrough; unacceptedPaymentMethod?: IUnacceptedPaymentMethodType[]; seller: ISeller; itemOffered: IItemOffered; identifier?: never; } /** * 拡張可能なイベントオファー * 実質的なアプリケーションオファーは別管理のイベントオファーに従う */ export interface IExtensibleEventOffer { /** * support AggregateOffer(2025-11-11~) */ typeOf: OfferType.AggregateOffer; eligibleQuantity: IEligibleQuantity; unacceptedPaymentMethod?: IUnacceptedPaymentMethodType[]; seller: ISeller; itemOffered: IItemOffered; offeredThrough?: never; identifier?: never; } export type ISeller4COA = Pick; export type IOffer4COA = Pick & { offeredThrough: Pick, 'identifier' | 'typeOf'>; seller: ISeller4COA; itemOffered: { serviceOutput: Pick; id?: never; serviceType?: never; availableChannel?: never; }; unacceptedPaymentMethod?: never; identifier?: never; }; export type ICOAKubun = COAFactory.master.IKubunNameResult; export type ICOAInfo = Pick & { theaterCode: string; /** * サービス区分 * 「通常興行」「レイトショー」など */ kbnService?: ICOAKubun; /** * 音響区分 */ kbnAcoustic?: ICOAKubun; }; /** * COA券種情報 */ export type ICOAOffer = COAFactory.reserve.IUpdReserveTicket & { /** * チケット名 */ ticketName: string; /** * チケット名(カナ) */ ticketNameKana: string; /** * チケット名(英) */ ticketNameEng: string; /** * ポイント割引の場合の消費ポイント */ usePoint: number; }; export type ISuperEvent = Pick & { startDate?: Date; endDate?: Date; }; /** * イベント属性 */ export interface IAttributes extends Pick { /** * 親イベント * 施設コンテンツに相当 */ superEvent: ISuperEvent; /** * 販売情報 */ offers: IOffer | IOffer4COA | IExtensibleEventOffer; /** * その他COA情報 * 基本的にsskts対応 */ coaInfo?: ICOAInfo; typeOf: EventType.ScreeningEvent; } /** * イベント */ export type IEvent = IBaseEvent; export type IOffers4create = Pick & { /** * 最大予約数を指定 */ eligibleQuantity: Pick; /** * 興行ID */ itemOffered: Pick; /** * アプリケーション設定 */ seller: ISeller4create; }; export type ICreateParams = Pick & { location?: never; superEvent?: never; offers: IOffers4create; }; export type IOffer4update = Pick & { /** * 興行IDを指定 */ itemOffered: Pick & { serviceOutput?: never; }; seller?: never; }; /** * 単一イベント編集パラメータ */ export type IUpdateByIdParams = Pick & { location?: never; offers: IOffer4update; }; /** * 識別子によるイベント編集パラメータ */ export type IUpdateByIdentifierParams = Pick & { /** * イベント識別子 */ identifier: string; offers: Pick & { /** * アプリケーション設定 */ seller: Pick; }; location?: never; superEvent?: never; }; /** * ソート条件 */ export { ISortOrder }; export interface IOfferSearchConditions { /** * apiリクエストクライアントがseller.makesOffer.$elemMatchに含まれるものを検索 */ availableFrom?: Date; /** * apiリクエストクライアントがseller.makesOffer.$elemMatchに含まれるものを検索 */ availableThrough?: Date; /** * apiリクエストクライアントがseller.makesOffer.$elemMatchに含まれるものを検索 */ validFrom?: Date; /** * apiリクエストクライアントがseller.makesOffer.$elemMatchに含まれるものを検索 */ validThrough?: Date; itemOffered?: { id?: { $in?: string[]; }; serviceType?: { ids?: string[]; }; serviceOutput?: { reservedTicket?: { ticketedSeat?: { typeOfs?: string[]; }; }; }; }; seller?: { makesOffer?: { $elemMatch?: { availabilityEnds?: { $gte?: Date; $lte?: Date; }; availabilityStarts?: { $gte?: Date; $lte?: Date; }; validFrom?: { $gte?: Date; $lte?: Date; }; validThrough?: { $gte?: Date; $lte?: Date; }; 'availableAtOrFrom.id'?: { $eq?: string; }; }; }; }; } /** * イベント検索条件 */ export interface ISearchConditions extends IBaseSearchConditions { location?: { /** * ルームコード */ branchCode?: { $eq?: string; $in?: string[]; }; }; /** * 販売情報 */ offers?: IOfferSearchConditions; superEvent?: { ids?: string[]; location?: { id?: { $eq?: string; }; }; /** * 施設コンテンツの施設コードリスト */ locationBranchCodes?: string[]; /** * 施設コンテンツのコンテンツコードリスト */ workPerformedIdentifiers?: string[]; }; }