UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

371 lines (370 loc) 19 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createEventBySchedule = createEventBySchedule; const createDebug = require("debug"); // import * as fs from 'fs'; const moment = require("moment-timezone"); const factory = require("../../../factory"); // import { Settings } from '../../../settings'; const event_1 = require("../../event"); const debug = createDebug('chevre-domain:service:task'); function createEvents( // schedule: factory.schedule.ISchedule4ttts | factory.schedule.IEventWithSchedule, schedule, createDate) { // tslint:disable-next-line:cyclomatic-complexity max-func-body-length return (repos // settings: Settings ) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e, _f, _g, _h; // console.log(moment.duration(15, 'minute').toISOString()); // return; const eventServiceId = (_b = (_a = schedule.offers) === null || _a === void 0 ? void 0 : _a.itemOffered) === null || _b === void 0 ? void 0 : _b.id; const makesOffer = (_d = (_c = schedule.offers) === null || _c === void 0 ? void 0 : _c.seller) === null || _d === void 0 ? void 0 : _d.makesOffer; const applicationIds = (Array.isArray(makesOffer)) ? makesOffer.map(({ availableAtOrFrom }) => availableAtOrFrom.id) : []; const eventSeriesId = (_e = schedule.superEvent) === null || _e === void 0 ? void 0 : _e.id; if (typeof eventServiceId !== 'string' || eventServiceId === '') { throw new factory.errors.NotFound('schedule.offers.itemOffered.id'); } if (typeof eventSeriesId !== 'string' || eventSeriesId === '') { throw new factory.errors.NotFound('schedule.superEvent.id'); } const project = schedule.project; // 引数情報取得 if (schedule.eventSchedule === undefined) { throw new factory.errors.NotFound('eventSchedule'); } const targetInfo = getTargetInfoByEventWithSchedule(schedule, createDate); debug(targetInfo.length, 'targetInfos ->', targetInfo); // fs.writeFileSync( // `${__dirname}/../../../../../targetInfo_${schedule.eventSchedule?.typeOf}.json`, // JSON.stringify(targetInfo, null, ' ') // ); // return; // 施設コンテンツ検索 const screeningEventSeries = (yield repos.eventSeries.projectEventSeriesFields({ project: { id: { $eq: project.id } }, id: { $eq: eventSeriesId } }, [ 'location', 'additionalProperty', 'description', 'endDate', 'headline', 'kanaName', 'name', 'soundFormat', 'startDate', 'typeOf', 'videoFormat', 'workPerformed' ])).shift(); if (screeningEventSeries === undefined) { throw new factory.errors.NotFound(factory.eventType.ScreeningEventSeries); } const workPerformedIdentifier = screeningEventSeries.workPerformed.identifier; // 劇場検索 const movieTheaters = yield repos.movieTheater.projectFields({ limit: 1, page: 1, project: { id: { $eq: project.id } }, branchCode: { $eq: screeningEventSeries.location.branchCode } }, ['id', 'branchCode', 'offers', 'parentOrganization']); const movieTheater = movieTheaters.shift(); if (movieTheater === undefined) { throw new factory.errors.NotFound(factory.placeType.MovieTheater); } const seller = movieTheater.parentOrganization; const screeningRooms = yield repos.screeningRoom.searchScreeningRooms({ limit: 1, page: 1, project: { id: { $eq: project.id } }, containedInPlace: { id: { $eq: movieTheater.id } } }); const screeningRoom = screeningRooms.shift(); if (screeningRoom === undefined) { throw new factory.errors.NotFound(factory.placeType.ScreeningRoom); } // 興行検索 // const eventServiceProductID = schedule.eventServiceProductID; // 興行設定に変更(2023-09-24~) const searchEventServicesResult = yield repos.product.projectFields({ limit: 1, page: 1, project: { id: { $eq: project.id } }, id: { $eq: eventServiceId } // productID: { $eq: eventServiceProductID } }, ['name']); const eventService = searchEventServicesResult.shift(); if (typeof (eventService === null || eventService === void 0 ? void 0 : eventService.id) !== 'string') { throw new Error(`EventService ${eventServiceId} not found`); } let existingApplicationMembers = []; if (applicationIds.length > 0) { existingApplicationMembers = yield repos.member.searchCustomerMembers({ limit: 100, page: 1, project: { id: project.id }, member: { // typeOf: { // $eq: factory.creativeWorkType.WebApplication // }, id: { $in: applicationIds } } }); } // ロールで絞る(customer or pos) // existingApplicationMembers = existingApplicationMembers // .filter((m) => { // return Array.isArray(m.member.hasRole) && m.member.hasRole.some((r) => AVAILABLE_ROLE_NAMES.includes(r.roleName)); // }); for (const performanceInfo of targetInfo) { const id = [ // tslint:disable-next-line:no-magic-numbers performanceInfo.day.slice(-6), workPerformedIdentifier, movieTheater.branchCode, screeningRoom.branchCode, performanceInfo.start_time ].join(''); const maxValue = (_g = (_f = movieTheater.offers) === null || _f === void 0 ? void 0 : _f.eligibleQuantity) === null || _g === void 0 ? void 0 : _g.maxValue; const availabilityEnds = moment(performanceInfo.end_date) .tz('Asia/Tokyo') .endOf('date') .toDate(); const availabilityStarts = moment(performanceInfo.start_date) .tz('Asia/Tokyo') .startOf('date') // tslint:disable-next-line:no-magic-numbers .add(-3, 'months') .toDate(); const validThrough = moment(performanceInfo.end_date) .tz('Asia/Tokyo') .endOf('date') .toDate(); const validFrom = moment(performanceInfo.start_date) .tz('Asia/Tokyo') .startOf('date') // tslint:disable-next-line:no-magic-numbers .add(-3, 'months') .toDate(); const offersSeller = { typeOf: factory.organizationType.Corporation, id: String(seller === null || seller === void 0 ? void 0 : seller.id), // event.offersにseller.makesOfferを追加(2022-11-18~) makesOffer: existingApplicationMembers.map((a) => { return { typeOf: factory.offerType.Offer, availableAtOrFrom: { id: a.member.id }, // support no-array(2024-10-13~), availabilityEnds, availabilityStarts, validFrom, validThrough }; }) }; const offers = Object.assign({ typeOf: factory.offerType.Offer, eligibleQuantity: Object.assign({ typeOf: 'QuantitativeValue', unitCode: factory.unitCode.C62 }, (typeof maxValue === 'number') ? { maxValue } : undefined // ひとまず全座席予約可能なように ), itemOffered: Object.assign({ // 興行ID追加(2022-09-01~) id: eventService.id, serviceOutput: { typeOf: factory.reservationType.EventReservation, reservedTicket: { typeOf: 'Ticket', ticketedSeat: { typeOf: factory.placeType.Seat } } }, typeOf: factory.product.ProductType.EventService, availableChannel: { typeOf: 'ServiceChannel', serviceLocation: { typeOf: screeningRoom.typeOf, branchCode: screeningRoom.branchCode, name: screeningRoom.name, containedInPlace: Object.assign({ typeOf: screeningEventSeries.location.typeOf, id: screeningEventSeries.location.id, branchCode: screeningEventSeries.location.branchCode }, (screeningEventSeries.location.name !== undefined) ? { name: screeningEventSeries.location.name } : undefined) } } }, { name: { ja: (typeof eventService.name === 'string') ? eventService.name : String((_h = eventService.name) === null || _h === void 0 ? void 0 : _h.ja) } }), seller: offersSeller }, { // availabilityEnds, // discontinue(2024-10-16~) // availabilityStarts, // validThrough, // validFrom }); const screeningEventSuperEvent = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ typeOf: screeningEventSeries.typeOf, id: screeningEventSeries.id, videoFormat: screeningEventSeries.videoFormat, soundFormat: screeningEventSeries.soundFormat, workPerformed: screeningEventSeries.workPerformed, location: screeningEventSeries.location, kanaName: screeningEventSeries.kanaName, name: screeningEventSeries.name }, (Array.isArray(screeningEventSeries.additionalProperty)) ? { additionalProperty: screeningEventSeries.additionalProperty } : undefined), (screeningEventSeries.startDate !== undefined) ? { startDate: screeningEventSeries.startDate } : undefined), (screeningEventSeries.endDate !== undefined) ? { endDate: screeningEventSeries.endDate } : undefined), (screeningEventSeries.description !== undefined) ? { description: screeningEventSeries.description } : undefined), (screeningEventSeries.headline !== undefined) ? { headline: screeningEventSeries.headline } : undefined); // イベント作成 const eventAttributes = { project: { id: project.id, typeOf: factory.organizationType.Project }, typeOf: factory.eventType.ScreeningEvent, eventStatus: factory.eventStatusType.EventScheduled, name: screeningEventSeries.name, doorTime: performanceInfo.door_time, startDate: performanceInfo.start_date, endDate: performanceInfo.end_date, superEvent: screeningEventSuperEvent, location: Object.assign({ typeOf: screeningRoom.typeOf, branchCode: screeningRoom.branchCode, name: screeningRoom.name }, (screeningRoom.address !== undefined) ? { address: screeningRoom.address } : undefined), offers: offers, // checkInCount: undefined, // attendeeCount: undefined, // 旧フォーマットIDを追加特性に追加(2022-09-08~) additionalProperty: [ { name: 'tourNumber', value: String(performanceInfo.tour_number) }, { name: 'oldEventId', value: String(id) } ], // organizer追加(2023-07-12~) organizer: { id: seller.id } }; // domain.serviceで実装(2022-09-10~) debug('updating event...', id, eventAttributes.startDate); yield (0, event_1.updateEvent4ttts)({ oldEventId: id, attributes: eventAttributes, project: { id: eventAttributes.project.id }, agent: eventAttributes.project })(repos // settings ); debug('event update(updateEvent4ttts)', id, eventAttributes.startDate); } debug(targetInfo.length, 'events updated'); }); } /** * パフォーマンス作成・作成対象情報取得 */ // function getTargetInfoForCreateFromSetting( // settings: factory.schedule.ISchedule4ttts, // createDate: Date // ): ITargetPerformanceInfo[] { // const performanceInfos: ITargetPerformanceInfo[] = []; // const { days, duration, noPerformanceTimes, hours, minutes, tours } = settings; // // 本日日付+開始日までの日数から作成開始日セット // // 作成日数分の作成対象日付作成 // for (let index = 0; index < days; index = index + 1) { // const now = (createDate instanceof Date) // ? moment(createDate) // .add(index, 'days') // : moment() // .add(index, 'days'); // hours.forEach((hourStr) => { // // 2桁でない時は'0'詰め // // tslint:disable-next-line:no-magic-numbers // const hour = `0${hourStr}`.slice(-2); // minutes.forEach((minute, minuteIndex) => { // // ツアー情報作成 // const tourNumber = `${hour}${tours[minuteIndex]}`; // const startDate = moment( // `${now.tz('Asia/Tokyo') // .format('YYYYMMDD')} ${hour}:${minute}:00+09:00`, // 'YYYYMMDD HH:mm:ssZ' // ); // const endDate = moment(startDate) // .add(duration, 'minutes'); // const day = moment(startDate) // .tz('Asia/Tokyo') // .format('YYYYMMDD'); // const startTime = moment(startDate) // .tz('Asia/Tokyo') // .format('HHmm'); // const endTime = moment(endDate) // .tz('Asia/Tokyo') // .format('HHmm'); // // パフォーマンスを作成しない時刻に指定されていなかったら作成 // if (noPerformanceTimes.indexOf(`${hour}${minute}`) < 0) { // performanceInfos.push({ // day: day, // start_time: startTime, // end_time: endTime, // door_time: startDate.toDate(), // start_date: startDate.toDate(), // end_date: endDate.toDate(), // tour_number: tourNumber, // duration: moment.duration(duration, 'minutes') // .toISOString() // }); // } // }); // }); // } // return performanceInfos; // } function getTargetInfoByEventWithSchedule(settings, createDate) { const performanceInfos = []; const { eventSchedule } = settings; // 作成対象時間: 9,10,11など // const hours: string[] = ['9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22']; // const minutes = ['00', '15', '30', '45']; // const tours = ['1', '2', '3', '4']; // 1日分作成する const now = (createDate instanceof Date) ? moment(createDate) : moment(); let startDate = moment.tz(`${now.tz(eventSchedule.scheduleTimezone) .format('YYYYMMDD')} ${eventSchedule.startTime}`, 'YYYYMMDD HH:mm:ss', eventSchedule.scheduleTimezone); const startDateShouldBeLte = moment.tz(`${now.tz(eventSchedule.scheduleTimezone) .format('YYYYMMDD')} ${eventSchedule.endTime}`, 'YYYYMMDD HH:mm:ss', eventSchedule.scheduleTimezone); const frequencyInMinutes = moment.duration(eventSchedule.repeatFrequency) .asMinutes(); // tslint:disable-next-line:no-magic-numbers const repeatCountInHour = Math.floor(60 / frequencyInMinutes); let i = 0; while (startDate < startDateShouldBeLte) { i += 1; if (i > 1) { startDate = moment(startDate) .add(moment.duration(eventSchedule.repeatFrequency)); } const hour = `0${moment(startDate) .format('HH')}` // 2桁でない時は'0'詰め // tslint:disable-next-line:no-magic-numbers .slice(-2); let tourIndex = i % repeatCountInHour; if (tourIndex === 0) { tourIndex = repeatCountInHour; } const tourNumber = `${hour}${tourIndex}`; const endDate = moment(startDate) .add(moment.duration(eventSchedule.duration)); const day = moment(startDate) .tz(eventSchedule.scheduleTimezone) .format('YYYYMMDD'); const startTime = moment(startDate) .tz(eventSchedule.scheduleTimezone) .format('HHmm'); const endTime = moment(endDate) .tz(eventSchedule.scheduleTimezone) .format('HHmm'); performanceInfos.push({ day: day, start_time: startTime, end_time: endTime, door_time: startDate.toDate(), start_date: startDate.toDate(), end_date: endDate.toDate(), tour_number: tourNumber, duration: eventSchedule.duration }); } return performanceInfos; } function createEventBySchedule(params) { return (repos // settings: Settings ) => __awaiter(this, void 0, void 0, function* () { const schedule = yield repos.schedule.findOne({ id: { $eq: params.object.eventSchedule.id }, project: { id: { $eq: params.project.id } } }); if (schedule === null) { throw new factory.errors.NotFound('Schedule'); } yield createEvents(schedule, (params.object.startDate instanceof Date) ? params.object.startDate : new Date())(repos); }); }