import { EventType } from '../eventType'; import { IOffer } from '../offer'; import { OfferType } from '../offerType'; import { OrganizationType } from '../organizationType'; import { SortType } from '../sortType'; interface IOfferAvailableAtOrFrom { /** * アプリケーションコード */ identifier: string; } interface ISeller { id: string; typeOf: OrganizationType.Corporation; } /** * 拡張可能なイベントオファー * イベント(itemOffered)とアプリケーション(availableAtOrFrom)に対して有効期間を明確に定義する * イベントIF内にもアプリケーションごとのオファー定義(makesOffer)が存在するが、そちらとのAND条件として検証される * オファーコードはプロジェクトが任意に定義する(ただし、イベントID内でユニーク) * 有効期間外のオファーは予告なく自動的に削除される */ interface IEventOffer extends Pick { project: { id: string; typeOf: OrganizationType.Project; }; seller: ISeller; typeOf: OfferType.Offer; /** * いつから承認可能か */ validFrom: Date; /** * いつまで承認可能か */ validThrough: Date; /** * 利用可能アプリケーション */ availableAtOrFrom: IOfferAvailableAtOrFrom; id: string; /** * オファーコード * イベントID内でユニーク必須 */ identifier: string; /** * イベント */ itemOffered: { /** * イベントID */ id: string; typeOf: EventType.ScreeningEvent; }; /** * A pointer to the organization or person making the offer. * オファー提供者(外部組織)が定義された場合、オファー承認時にオファー提供者によって署名されたオファートークンが必須 * その場合、有効期間、適用数量、対応アプリケーションはオファートークンのpayloadに従う */ offeredBy?: { /** * オファートークン発行者コード */ identifier?: string; }; validForMemberTier?: never; availabilityEnds?: never; availabilityStarts?: never; } interface ISearchConditions { limit?: number; page?: number; sort?: { validFrom?: SortType; }; project?: { id?: { $eq?: string; }; }; id?: { $eq?: string; }; /** * オファーコード */ identifier?: { $eq?: string; $in?: string[]; }; itemOffered?: { /** * イベントID */ id?: { $eq?: string; $in?: string[]; }; }; availableAtOrFrom?: { identifier?: { $eq?: string; }; }; offeredBy?: { /** * オファー提供者コード */ identifier?: { $eq?: string; }; }; seller?: { /** * 提供販売者ID */ id?: { $eq?: string; }; }; validFrom?: { $lte?: Date; }; validThrough?: { $gte?: Date; }; } export { IEventOffer, ISearchConditions };