@chevre/domain
Version:
Chevre Domain Library for Node.js
371 lines (370 loc) • 19 kB
JavaScript
"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);
});
}