@chevre/domain 23.1.0 → 23.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,14 +9,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.saveScreeningEvents = exports.saveScreeningEventSeries = void 0;
12
13
  exports.importFromCOA = importFromCOA;
13
- exports.createScreeningEventIdFromCOA = createScreeningEventIdFromCOA;
14
14
  const createDebug = require("debug");
15
15
  // @ts-ignore
16
16
  const difference = require("lodash.difference");
17
17
  // import { google } from 'googleapis';
18
18
  const moment = require("moment-timezone");
19
19
  const factory = require("../factory");
20
+ const processUpdateMovieTheater_1 = require("./event/processUpdateMovieTheater");
21
+ const saveScreeningEvents_1 = require("./event/saveScreeningEvents");
22
+ Object.defineProperty(exports, "saveScreeningEvents", { enumerable: true, get: function () { return saveScreeningEvents_1.saveScreeningEvents; } });
23
+ const saveScreeningEventSeries_1 = require("./event/saveScreeningEventSeries");
24
+ Object.defineProperty(exports, "saveScreeningEventSeries", { enumerable: true, get: function () { return saveScreeningEventSeries_1.saveScreeningEventSeries; } });
25
+ // const customsearch = google.customsearch('v1');
20
26
  const debug = createDebug('chevre-domain:service:event');
21
27
  /**
22
28
  * イベントをインポートする
@@ -25,7 +31,7 @@ function importFromCOA(params) {
25
31
  // tslint:disable-next-line:max-func-body-length
26
32
  return (repos) => __awaiter(this, void 0, void 0, function* () {
27
33
  // 施設更新アクションを分離(2024-04-26~)
28
- const { seller, movieTheater, screeningRooms } = yield processUpdateMovieTheater(params)(repos);
34
+ const { seller, movieTheater, screeningRooms } = yield (0, processUpdateMovieTheater_1.processUpdateMovieTheater)(params)(repos);
29
35
  // const targetImportFrom = moment(`${moment(params.importFrom)
30
36
  // .tz('Asia/Tokyo')
31
37
  // .format('YYYY-MM-DD')}T00:00:00+09:00`);
@@ -74,14 +80,14 @@ function importFromCOA(params) {
74
80
  try {
75
81
  let screeningEventSerieses;
76
82
  if (params.saveScreeningEventSeries === true) {
77
- const saveScreeningEventSeriesResult = yield saveScreeningEventSeries({
83
+ const saveScreeningEventSeriesResult = yield (0, saveScreeningEventSeries_1.saveScreeningEventSeries)({
78
84
  locationBranchCode: params.locationBranchCode,
79
85
  movieTheater,
80
86
  project: params.project,
81
87
  saveScreeningEventSeries: params.saveScreeningEventSeries,
82
88
  saveScreeningEventSeriesPeriodInMonth: params.saveScreeningEventSeriesPeriodInMonth,
83
89
  seller: { id: seller.id }
84
- })(repos);
90
+ }, {})(repos);
85
91
  screeningEventSerieses = saveScreeningEventSeriesResult.screeningEventSerieses;
86
92
  savedScreeningEventSeriesCount = saveScreeningEventSeriesResult.savedEventsCount;
87
93
  }
@@ -91,8 +97,8 @@ function importFromCOA(params) {
91
97
  try {
92
98
  // イベント永続化
93
99
  const processStart = process.hrtime.bigint();
94
- const screeningEvents = yield saveScreeningEvents(Object.assign({ movieTheater,
95
- screeningRooms, project: params.project, targetImportFrom: targetImportFrom.toDate(), targetImportThrough: targetImportThrough.toDate(), seller: { id: seller.id }, instrument }, (Array.isArray(screeningEventSerieses)) ? { screeningEventSerieses } : undefined))(repos);
100
+ const screeningEvents = yield (0, saveScreeningEvents_1.saveScreeningEvents)(Object.assign({ movieTheater,
101
+ screeningRooms, project: params.project, targetImportFrom: targetImportFrom.toDate(), targetImportThrough: targetImportThrough.toDate(), seller: { id: seller.id }, instrument }, (Array.isArray(screeningEventSerieses)) ? { screeningEventSerieses } : undefined), {})(repos);
96
102
  savedScreeningEventsCount = screeningEvents.length;
97
103
  // COAから削除されたイベントをキャンセル済ステータスへ変更
98
104
  cancelledIds = yield cancelDeletedEvents({
@@ -139,324 +145,6 @@ function importFromCOA(params) {
139
145
  yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result: actionResult });
140
146
  });
141
147
  }
142
- // tslint:disable-next-line:max-func-body-length
143
- function processUpdateMovieTheater(params) {
144
- return (repos) => __awaiter(this, void 0, void 0, function* () {
145
- const actionAttributes = {
146
- project: { typeOf: factory.organizationType.Project, id: params.project.id },
147
- typeOf: factory.actionType.ReplaceAction,
148
- agent: { typeOf: factory.organizationType.Project, id: params.project.id },
149
- object: Object.assign(Object.assign({}, params), { branchCode: params.locationBranchCode, typeOf: factory.placeType.MovieTheater }),
150
- instrument: {
151
- theaterCode: params.locationBranchCode,
152
- typeOf: 'WebAPI',
153
- identifier: factory.service.webAPI.Identifier.COA
154
- },
155
- targetCollection: { typeOf: factory.placeType.MovieTheater }
156
- };
157
- const action = yield repos.action.start(actionAttributes);
158
- let seller;
159
- let movieTheater;
160
- let screeningRooms;
161
- let processTime;
162
- try {
163
- // 同ブランチコードの販売者を検索する
164
- const sellersWithSameBranchCode = yield repos.seller.projectFields({
165
- limit: 1,
166
- page: 1,
167
- project: { id: { $eq: params.project.id } },
168
- branchCode: { $eq: params.locationBranchCode }
169
- }, ['id']);
170
- const sellerWithSameBranchCode = sellersWithSameBranchCode.shift();
171
- if (typeof (sellerWithSameBranchCode === null || sellerWithSameBranchCode === void 0 ? void 0 : sellerWithSameBranchCode.id) !== 'string') {
172
- throw new factory.errors.NotFound('Seller', `Seller with branchCode '${params.locationBranchCode}' not found`);
173
- }
174
- seller = { id: sellerWithSameBranchCode.id };
175
- // saveMovieTheater:trueの場合のみ、施設保管(2022-10-10~)
176
- if (params.saveMovieTheater === true) {
177
- const processStart = process.hrtime.bigint();
178
- const savingMovieTheater = createMovieTheaterFromCOA(params.project, { id: seller.id }, yield repos.masterService.theater({ theaterCode: params.locationBranchCode }), yield repos.masterService.screen({ theaterCode: params.locationBranchCode }));
179
- yield repos.movieTheater.saveMovieTheaterByBranchCode4coa(savingMovieTheater);
180
- yield repos.screeningRoom.saveScreeningRooms4coa(savingMovieTheater);
181
- const processEnd = process.hrtime.bigint();
182
- processTime = processEnd - processStart;
183
- }
184
- const movieTheaters = yield repos.movieTheater.projectFields({
185
- limit: 1,
186
- page: 1,
187
- project: { id: { $eq: params.project.id } },
188
- branchCode: { $eq: params.locationBranchCode }
189
- }, ['id', 'typeOf', 'branchCode', 'name', 'kanaName']
190
- // []
191
- );
192
- movieTheater = movieTheaters.shift();
193
- if (movieTheater === undefined) {
194
- throw new factory.errors.NotFound(factory.placeType.MovieTheater);
195
- }
196
- screeningRooms = yield repos.screeningRoom.searchScreeningRooms({
197
- project: { id: { $eq: params.project.id } },
198
- containedInPlace: { branchCode: { $eq: movieTheater.branchCode } }
199
- });
200
- }
201
- catch (error) {
202
- try {
203
- yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error });
204
- }
205
- catch (__) {
206
- // 失敗したら仕方ない
207
- }
208
- throw error;
209
- }
210
- const actionResult = Object.assign({ screeningRoomsCount: screeningRooms.length }, (processTime !== undefined) ? { processTime } : undefined);
211
- yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result: actionResult });
212
- return { seller, movieTheater, screeningRooms };
213
- });
214
- }
215
- function saveScreeningEventSeries(params) {
216
- // tslint:disable-next-line:max-func-body-length
217
- return (repos) => __awaiter(this, void 0, void 0, function* () {
218
- const { importingIds } = params;
219
- const project = params.project;
220
- // COAから作品取得
221
- const filmsFromCOA = yield repos.masterService.title({
222
- theaterCode: params.locationBranchCode
223
- });
224
- // COAから区分マスター抽出
225
- const eirinKubuns = yield repos.masterService.kubunName({
226
- theaterCode: params.locationBranchCode,
227
- kubunClass: '044'
228
- });
229
- const eizouKubuns = yield repos.masterService.kubunName({
230
- theaterCode: params.locationBranchCode,
231
- kubunClass: '042'
232
- });
233
- const joueihousikiKubuns = yield repos.masterService.kubunName({
234
- theaterCode: params.locationBranchCode,
235
- kubunClass: '045'
236
- });
237
- const jimakufukikaeKubuns = yield repos.masterService.kubunName({
238
- theaterCode: params.locationBranchCode,
239
- kubunClass: '043'
240
- });
241
- debug('kubunNames found.');
242
- const availablePaymentMethodTypes = yield repos.categoryCode.projectCategoryCodeFields({
243
- project: { id: { $eq: params.project.id } },
244
- inCodeSet: { identifier: { $eq: factory.categoryCode.CategorySetIdentifier.PaymentMethodType } }
245
- }, ['additionalProperty', 'codeValue']);
246
- const screeningEventSerieses = filmsFromCOA.map((filmFromCOA) => {
247
- return createScreeningEventSeriesFromCOA({
248
- project: project,
249
- filmFromCOA: filmFromCOA,
250
- movieTheater: params.movieTheater,
251
- eirinKubuns: eirinKubuns,
252
- eizouKubuns: eizouKubuns,
253
- joueihousikiKubuns: joueihousikiKubuns,
254
- jimakufukikaeKubuns: jimakufukikaeKubuns,
255
- availablePaymentMethodTypes,
256
- seller: params.seller
257
- });
258
- });
259
- const COA_IMPORT_SCREENING_EVENT_SERIES_PERIOD_IN_MONTH = (typeof params.saveScreeningEventSeriesPeriodInMonth === 'number')
260
- ? params.saveScreeningEventSeriesPeriodInMonth
261
- // tslint:disable-next-line:no-magic-numbers
262
- : 3;
263
- let savedEventsCount = 0;
264
- // saveScreeningEventSeries:trueの場合のみ保管(2022-10-10~)
265
- if (params.saveScreeningEventSeries === true) {
266
- let saveParams;
267
- if (Array.isArray(importingIds) && importingIds.length > 0) {
268
- saveParams = screeningEventSerieses
269
- .filter((screeningEventSeries) => importingIds.includes(screeningEventSeries.id))
270
- .map((screeningEventSeries) => {
271
- return {
272
- id: screeningEventSeries.id,
273
- attributes: screeningEventSeries,
274
- upsert: true
275
- };
276
- });
277
- }
278
- else {
279
- // 更新対象が無限に増えるのを防ぐためにstartDateでフィルター
280
- const someMonthsAgo = moment()
281
- .add(-COA_IMPORT_SCREENING_EVENT_SERIES_PERIOD_IN_MONTH, 'months');
282
- saveParams = screeningEventSerieses
283
- .filter((screeningEventSeries) => {
284
- return moment(screeningEventSeries.startDate)
285
- .isAfter(someMonthsAgo);
286
- })
287
- .map((screeningEventSeries) => {
288
- return {
289
- id: screeningEventSeries.id,
290
- attributes: screeningEventSeries,
291
- upsert: true
292
- };
293
- });
294
- }
295
- debug('saving', saveParams.length, 'ScreeningEventSeries...');
296
- yield repos.eventSeries.upsertManyEventSeriesById4sskts(saveParams);
297
- debug('saved', saveParams.length, 'ScreeningEventSeries');
298
- savedEventsCount = saveParams.length;
299
- // コンテンツ永続化(2023-10-23~)
300
- try {
301
- debug('saving', saveParams.length, 'movies...');
302
- yield repos.creativeWork.upsertMoviesByIdentifier(saveParams.map((saveScreeningEventSeriesParams) => {
303
- var _a;
304
- return {
305
- $set: Object.assign(Object.assign({ typeOf: factory.creativeWorkType.Movie, project: params.project, identifier: saveScreeningEventSeriesParams.attributes.workPerformed.identifier, name: { ja: (_a = saveScreeningEventSeriesParams.attributes.workPerformed.name) === null || _a === void 0 ? void 0 : _a.ja }, offers: { typeOf: factory.offerType.Offer } }, (typeof saveScreeningEventSeriesParams.attributes.workPerformed.contentRating === 'string')
306
- ? { contentRating: saveScreeningEventSeriesParams.attributes.workPerformed.contentRating }
307
- : undefined), (typeof saveScreeningEventSeriesParams.attributes.workPerformed.duration === 'string')
308
- ? { duration: saveScreeningEventSeriesParams.attributes.workPerformed.duration }
309
- : undefined)
310
- };
311
- }));
312
- debug('saved', saveParams.length, 'movies');
313
- }
314
- catch (error) {
315
- // tslint:disable-next-line:no-console
316
- console.error('failed in upsertMoviesByIdentifier', error);
317
- }
318
- }
319
- return { screeningEventSerieses, savedEventsCount };
320
- });
321
- }
322
- function saveScreeningEvents(params) {
323
- return (repos) => __awaiter(this, void 0, void 0, function* () {
324
- const screeningEvents = yield createScreeningEvents(params)(repos);
325
- // 永続化
326
- debug(`storing ${screeningEvents.length} screeningEvents...`);
327
- const saveParams = [];
328
- for (const screeningEvent of screeningEvents) {
329
- try {
330
- const attributes = screeningEvent;
331
- saveParams.push({
332
- id: screeningEvent.id,
333
- attributes: attributes,
334
- upsert: true
335
- });
336
- }
337
- catch (error) {
338
- // no op
339
- }
340
- }
341
- yield repos.event.saveManyEvents(saveParams);
342
- debug(`${screeningEvents.length} screeningEvents stored.`);
343
- return screeningEvents;
344
- });
345
- }
346
- function createScreeningEvents(params) {
347
- // tslint:disable-next-line:max-func-body-length
348
- return (repos) => __awaiter(this, void 0, void 0, function* () {
349
- const project = params.project;
350
- if (typeof params.instrument.begin !== 'string') {
351
- throw new factory.errors.ArgumentNull('instrument.begin');
352
- }
353
- if (typeof params.instrument.end !== 'string') {
354
- throw new factory.errors.ArgumentNull('instrument.end');
355
- }
356
- // COAからイベント取得;
357
- const schedulesFromCOA = yield repos.masterService.schedule({
358
- theaterCode: params.instrument.theaterCode,
359
- begin: params.instrument.begin, // COAは日本時間で判断
360
- end: params.instrument.end // COAは日本時間で判断
361
- });
362
- // COAから区分マスター抽出
363
- const serviceKubuns = yield repos.masterService.kubunName({
364
- theaterCode: params.instrument.theaterCode,
365
- kubunClass: '009'
366
- });
367
- const acousticKubuns = yield repos.masterService.kubunName({
368
- theaterCode: params.instrument.theaterCode,
369
- kubunClass: '046'
370
- });
371
- let screeningEventSerieses;
372
- if (Array.isArray(params.screeningEventSerieses)) {
373
- screeningEventSerieses = params.screeningEventSerieses;
374
- }
375
- else {
376
- // 指定がなければDBから検索する(2024-09-09~)
377
- const importingEventSeriesIds = [...new Set(schedulesFromCOA.map((scheduleFromCOA) => {
378
- return createScreeningEventSeriesId({
379
- theaterCode: params.instrument.theaterCode,
380
- titleCode: scheduleFromCOA.titleCode,
381
- titleBranchNum: scheduleFromCOA.titleBranchNum
382
- });
383
- }))];
384
- debug('searching eventSeries... importingEventSeriesIds:', importingEventSeriesIds);
385
- if (importingEventSeriesIds.length > 0) {
386
- screeningEventSerieses = yield repos.eventSeries.projectEventSeriesFields({
387
- id: { $in: importingEventSeriesIds },
388
- project: { id: { $eq: params.project.id } }
389
- }, [
390
- 'project', 'typeOf', 'eventStatus', 'identifier',
391
- 'name', 'kanaName', 'alternativeHeadline', 'location',
392
- 'organizer', 'videoFormat', 'soundFormat', 'workPerformed',
393
- 'duration', 'endDate', 'startDate', 'coaInfo',
394
- 'offers', 'additionalProperty'
395
- ]);
396
- debug(screeningEventSerieses.length, 'screeningEventSerieses for importing events found.');
397
- // 万が一未インポートの施設コンテンツがあれば強制的にインポート(2024-09-09~)
398
- if (screeningEventSerieses.length < importingEventSeriesIds.length) {
399
- const saveScreeningEventSeriesResult = yield saveScreeningEventSeries({
400
- locationBranchCode: params.instrument.theaterCode,
401
- movieTheater: params.movieTheater,
402
- project: params.project,
403
- saveScreeningEventSeries: true,
404
- saveScreeningEventSeriesPeriodInMonth: 0, // importingIds指定するので0でok
405
- seller: { id: params.seller.id },
406
- importingIds: importingEventSeriesIds
407
- })(repos);
408
- screeningEventSerieses = saveScreeningEventSeriesResult.screeningEventSerieses;
409
- }
410
- }
411
- else {
412
- screeningEventSerieses = [];
413
- }
414
- }
415
- // イベントごとに永続化トライ
416
- const screeningEvents = [];
417
- schedulesFromCOA.forEach((scheduleFromCOA) => {
418
- const screeningEventSeriesId = createScreeningEventSeriesId({
419
- theaterCode: params.instrument.theaterCode,
420
- titleCode: scheduleFromCOA.titleCode,
421
- titleBranchNum: scheduleFromCOA.titleBranchNum
422
- });
423
- // ルーム存在チェック
424
- const screenRoom = params.screeningRooms.find((place) => place.branchCode === scheduleFromCOA.screenCode);
425
- // const screenRoom = <factory.place.screeningRoom.IPlace | undefined>movieTheater.containsPlace.find(
426
- // (place) => place.branchCode === scheduleFromCOA.screenCode
427
- // );
428
- if (screenRoom === undefined) {
429
- // tslint:disable-next-line:no-console
430
- console.error('screenRoom not found.', scheduleFromCOA.screenCode);
431
- return;
432
- }
433
- // イベントシリーズ取得
434
- const screeningEventSeries = screeningEventSerieses.find((e) => e.id === screeningEventSeriesId);
435
- if (screeningEventSeries === undefined) {
436
- // tslint:disable-next-line:no-console
437
- console.error('screeningEventSeries not found.', screeningEventSeriesId);
438
- return;
439
- }
440
- const screeningEvent = createScreeningEventFromCOA({
441
- project: project,
442
- performanceFromCOA: scheduleFromCOA,
443
- screenRoom: screenRoom,
444
- superEvent: screeningEventSeries,
445
- serviceKubuns: serviceKubuns,
446
- acousticKubuns: acousticKubuns,
447
- seller: params.seller
448
- });
449
- // インポート期間で確実に絞る(2024-04-25~)
450
- const isStartDateInTarget = moment(screeningEvent.startDate)
451
- .isBetween(params.targetImportFrom, params.targetImportThrough, 'second', '[]');
452
- if (isStartDateInTarget) {
453
- screeningEvents.push(screeningEvent);
454
- }
455
- });
456
- debug('createScreeningEvents processed', params.targetImportFrom, params.targetImportThrough, params.instrument.begin, params.instrument.end, 'schedulesFromCOA.length:', schedulesFromCOA.length, 'screeningEvents.length:', screeningEvents.length);
457
- return screeningEvents;
458
- });
459
- }
460
148
  function cancelDeletedEvents(params) {
461
149
  return (repos) => __awaiter(this, void 0, void 0, function* () {
462
150
  // distinctでidのみ取得(2023-01-25~)
@@ -488,377 +176,3 @@ function cancelDeletedEvents(params) {
488
176
  return cancelledIds;
489
177
  });
490
178
  }
491
- function minimizeSuperEvent(params) {
492
- const { workPerformed, videoFormat, startDate, soundFormat, name, location, kanaName, identifier, endDate, duration, coaInfo, alternativeHeadline,
493
- // additionalProperty,
494
- typeOf, id
495
- // project,
496
- // organizer,
497
- // offers,
498
- // eventStatus
499
- } = params.superEvent;
500
- return {
501
- workPerformed, videoFormat, startDate, soundFormat,
502
- name, location, kanaName, identifier,
503
- endDate, duration, coaInfo, alternativeHeadline,
504
- // additionalProperty,
505
- typeOf, id
506
- };
507
- }
508
- /**
509
- * コアデータからイベントを作成する
510
- */
511
- function createScreeningEventFromCOA(params) {
512
- const id = createScreeningEventIdFromCOA({
513
- theaterCode: params.superEvent.location.branchCode,
514
- titleCode: params.superEvent.workPerformed.identifier,
515
- titleBranchNum: params.performanceFromCOA.titleBranchNum,
516
- dateJouei: params.performanceFromCOA.dateJouei,
517
- screenCode: params.performanceFromCOA.screenCode,
518
- timeBegin: params.performanceFromCOA.timeBegin
519
- });
520
- // COA情報を整形して開始日時と終了日時を作成('2500'のような日またぎの時刻入力に対応)
521
- const DAY = 2400;
522
- let timeBegin = params.performanceFromCOA.timeBegin;
523
- let timeEnd = params.performanceFromCOA.timeEnd;
524
- let addDay4startDate = 0;
525
- let addDay4endDate = 0;
526
- try {
527
- addDay4startDate += Math.floor(Number(timeBegin) / DAY);
528
- // tslint:disable-next-line:no-magic-numbers
529
- timeBegin = `0000${Number(timeBegin) % DAY}`.slice(-4);
530
- addDay4endDate += Math.floor(Number(timeEnd) / DAY);
531
- // tslint:disable-next-line:no-magic-numbers
532
- timeEnd = `0000${Number(timeEnd) % DAY}`.slice(-4);
533
- }
534
- catch (error) {
535
- // no op
536
- }
537
- let endDate = moment(`${params.performanceFromCOA.dateJouei} ${timeEnd} +09:00`, 'YYYYMMDD HHmm Z')
538
- .add(addDay4endDate, 'days')
539
- .toDate();
540
- const startDate = moment(`${params.performanceFromCOA.dateJouei} ${timeBegin} +09:00`, 'YYYYMMDD HHmm Z')
541
- .add(addDay4startDate, 'days')
542
- .toDate();
543
- // startDateの方が大きければ日またぎイベントなので調整
544
- // tslint:disable-next-line:no-single-line-block-comment
545
- /* istanbul ignore if */
546
- if (moment(startDate)
547
- .isAfter(moment(endDate))) {
548
- endDate = moment(endDate)
549
- .add(1, 'day')
550
- .toDate();
551
- }
552
- const offers = {
553
- typeOf: factory.offerType.Offer,
554
- offeredThrough: {
555
- typeOf: 'WebAPI',
556
- identifier: factory.service.webAPI.Identifier.COA
557
- },
558
- eligibleQuantity: {
559
- typeOf: 'QuantitativeValue',
560
- unitCode: factory.unitCode.C62,
561
- maxValue: Number(params.performanceFromCOA.availableNum)
562
- },
563
- itemOffered: {
564
- serviceOutput: {
565
- reservedTicket: {
566
- typeOf: 'Ticket',
567
- ticketedSeat: { typeOf: factory.placeType.Seat } // 必ず指定席
568
- }
569
- }
570
- },
571
- seller: {
572
- typeOf: factory.organizationType.Corporation,
573
- id: params.seller.id,
574
- // name: params.sellerFromDB.name,
575
- makesOffer: []
576
- }
577
- };
578
- const { additionalProperty, coaInfo } = createScreeningEventAdditionalPropertyFromCOA(params);
579
- const superEvent = minimizeSuperEvent({ superEvent: params.superEvent }); // optimize superEvent(2024-09-10~)
580
- return {
581
- project: { typeOf: params.project.typeOf, id: params.project.id },
582
- typeOf: factory.eventType.ScreeningEvent,
583
- id: id,
584
- identifier: id,
585
- name: params.superEvent.name,
586
- eventStatus: factory.eventStatusType.EventScheduled,
587
- location: {
588
- typeOf: params.screenRoom.typeOf,
589
- branchCode: params.screenRoom.branchCode,
590
- name: params.screenRoom.name
591
- },
592
- endDate: endDate,
593
- startDate: startDate,
594
- superEvent,
595
- coaInfo,
596
- offers: offers,
597
- checkInCount: 0,
598
- attendeeCount: 0,
599
- maximumAttendeeCapacity: params.screenRoom.maximumAttendeeCapacity,
600
- remainingAttendeeCapacity: params.screenRoom.maximumAttendeeCapacity,
601
- additionalProperty,
602
- organizer: { id: params.seller.id }
603
- };
604
- }
605
- function createScreeningEventAdditionalPropertyFromCOA(params) {
606
- const coaInfo = {
607
- theaterCode: params.superEvent.location.branchCode,
608
- dateJouei: params.performanceFromCOA.dateJouei,
609
- titleCode: params.performanceFromCOA.titleCode,
610
- titleBranchNum: params.performanceFromCOA.titleBranchNum,
611
- timeBegin: params.performanceFromCOA.timeBegin,
612
- timeEnd: params.performanceFromCOA.timeEnd,
613
- screenCode: params.performanceFromCOA.screenCode,
614
- trailerTime: params.performanceFromCOA.trailerTime,
615
- kbnService: params.serviceKubuns.filter((kubun) => kubun.kubunCode === params.performanceFromCOA.kbnService)[0],
616
- kbnAcoustic: params.acousticKubuns.filter((kubun) => kubun.kubunCode === params.performanceFromCOA.kbnAcoustic)[0],
617
- nameServiceDay: params.performanceFromCOA.nameServiceDay,
618
- availableNum: params.performanceFromCOA.availableNum,
619
- rsvStartDate: params.performanceFromCOA.rsvStartDate,
620
- rsvEndDate: params.performanceFromCOA.rsvEndDate,
621
- flgEarlyBooking: params.performanceFromCOA.flgEarlyBooking
622
- };
623
- return {
624
- coaInfo,
625
- additionalProperty: [
626
- { name: 'coaInfo', value: JSON.stringify(coaInfo) }
627
- ]
628
- };
629
- }
630
- /**
631
- * 作品抽出結果から施設コンテンツを作成する
632
- */
633
- function createScreeningEventSeriesFromCOA(params) {
634
- const endDate = (moment(`${params.filmFromCOA.dateEnd} +09:00`, 'YYYYMMDD Z')
635
- .isValid())
636
- ? moment(`${params.filmFromCOA.dateEnd} +09:00`, 'YYYYMMDD Z')
637
- .toDate()
638
- : moment('2118-01-01T00:00:00+09:00') // 値がない場合、十分に長く
639
- .toDate();
640
- const startDate = (moment(`${params.filmFromCOA.dateBegin} +09:00`, 'YYYYMMDD Z')
641
- .isValid())
642
- ? moment(`${params.filmFromCOA.dateBegin} +09:00`, 'YYYYMMDD Z')
643
- .toDate()
644
- : moment('2018-01-01T00:00:00+09:00') // 値がない場合、十分に長く
645
- .toDate();
646
- // title_codeは施設をまたいで共有、title_branch_numは施設毎に管理
647
- const id = createScreeningEventSeriesId({
648
- theaterCode: params.movieTheater.branchCode,
649
- titleCode: params.filmFromCOA.titleCode,
650
- titleBranchNum: params.filmFromCOA.titleBranchNum
651
- });
652
- const { additionalProperty, coaInfo } = createScreeningEventSeriesAdditionalPropertyFromCOA(params);
653
- const { unacceptedPaymentMethod } = createScreeningEventSeriesUnacceptedPaymentMethodFromCOA(params);
654
- const workPerformed = Object.assign({
655
- // id: `${params.movieTheater.branchCode}-${params.filmFromCOA.titleCode}`, // discontinue(2025-01-03~)
656
- identifier: params.filmFromCOA.titleCode, name: {
657
- ja: params.filmFromCOA.titleNameOrig
658
- }, duration: moment.duration(params.filmFromCOA.showTime, 'm')
659
- .toISOString(), contentRating: params.eirinKubuns.filter((kubun) => kubun.kubunCode === params.filmFromCOA.kbnEirin)[0], typeOf: factory.creativeWorkType.Movie }, (typeof params.filmFromCOA.titleBranchNum === 'string' && params.filmFromCOA.titleBranchNum.length > 0)
660
- ? { version: params.filmFromCOA.titleBranchNum } // add version(2024-01-31~)
661
- : undefined);
662
- // redefine videoFormat(2024-09-18~)
663
- // const videoFormat: factory.event.screeningEventSeries.ICOAKubun =
664
- // params.eizouKubuns.filter((kubun) => kubun.kubunCode === params.filmFromCOA.kbnEizou)[0];
665
- const videoFormat = params.joueihousikiKubuns.filter(({ kubunCode }) => kubunCode === params.filmFromCOA.kbnJoueihousiki)
666
- .map(({ kubunCode }) => ({ typeOf: kubunCode, name: kubunCode }));
667
- return {
668
- project: { typeOf: params.project.typeOf, id: params.project.id },
669
- typeOf: factory.eventType.ScreeningEventSeries,
670
- eventStatus: factory.eventStatusType.EventScheduled,
671
- id: id,
672
- identifier: id,
673
- name: {
674
- ja: params.filmFromCOA.titleName,
675
- en: params.filmFromCOA.titleNameEng
676
- },
677
- kanaName: params.filmFromCOA.titleNameKana,
678
- alternativeHeadline: params.filmFromCOA.titleNameShort,
679
- location: {
680
- id: (params.movieTheater.id !== undefined) ? params.movieTheater.id : '',
681
- branchCode: params.movieTheater.branchCode,
682
- name: params.movieTheater.name,
683
- // 廃止(2024-03-05~)
684
- // kanaName: params.movieTheater.kanaName,
685
- typeOf: params.movieTheater.typeOf
686
- },
687
- // 必須化(2023-07-12~)
688
- organizer: { id: params.seller.id },
689
- videoFormat,
690
- soundFormat: [],
691
- workPerformed,
692
- duration: moment.duration(params.filmFromCOA.showTime, 'm')
693
- .toISOString(),
694
- endDate: endDate,
695
- startDate: startDate,
696
- coaInfo,
697
- offers: Object.assign({ typeOf: factory.offerType.Offer }, (Array.isArray(unacceptedPaymentMethod)) ? { unacceptedPaymentMethod: unacceptedPaymentMethod } : undefined),
698
- additionalProperty
699
- };
700
- }
701
- function createScreeningEventSeriesAdditionalPropertyFromCOA(params) {
702
- const coaInfo = Object.assign(Object.assign(Object.assign({ titleBranchNum: params.filmFromCOA.titleBranchNum, kbnEirin: params.eirinKubuns.filter((k) => k.kubunCode === params.filmFromCOA.kbnEirin)[0], kbnEizou: params.eizouKubuns.filter((k) => k.kubunCode === params.filmFromCOA.kbnEizou)[0], kbnJoueihousiki: params.joueihousikiKubuns.filter((k) => k.kubunCode === params.filmFromCOA.kbnJoueihousiki)[0], kbnJimakufukikae: params.jimakufukikaeKubuns.filter((k) => k.kubunCode === params.filmFromCOA.kbnJimakufukikae)[0], flgMvtkUse: params.filmFromCOA.flgMvtkUse, dateMvtkBegin: params.filmFromCOA.dateMvtkBegin }, (typeof params.filmFromCOA.flgMgtkUse === 'string') ? { flgMgtkUse: params.filmFromCOA.flgMgtkUse } : undefined), (typeof params.filmFromCOA.dateMgtkBegin === 'string') ? { dateMgtkBegin: params.filmFromCOA.dateMgtkBegin } : undefined), (typeof params.filmFromCOA.flgNotDiscount === 'string') ? { flgNotDiscount: params.filmFromCOA.flgNotDiscount } : undefined);
703
- return {
704
- coaInfo,
705
- additionalProperty: [
706
- // { name: 'coaInfo', value: JSON.stringify(coaInfo) } // discontinue(2024-09-13~)
707
- ]
708
- };
709
- }
710
- function createScreeningEventSeriesUnacceptedPaymentMethodFromCOA(params) {
711
- let unacceptedPaymentMethod;
712
- // flgMvtkUseはムビチケ、MGチケットの両方に適用される(<-flgMgtkUseが追加されるまで)(~2024-03-05)
713
- if (params.filmFromCOA.flgMvtkUse === '1') {
714
- // no op
715
- }
716
- else {
717
- if (!Array.isArray(unacceptedPaymentMethod)) {
718
- unacceptedPaymentMethod = [];
719
- }
720
- // flgMvtkUseで決済方法区分から動的に
721
- unacceptedPaymentMethod.push(...params.availablePaymentMethodTypes.filter(({ additionalProperty }) => { var _a; return ((_a = additionalProperty === null || additionalProperty === void 0 ? void 0 : additionalProperty.find(({ name }) => name === 'flgMvtkUse')) === null || _a === void 0 ? void 0 : _a.value) === '1'; })
722
- .map(({ codeValue }) => codeValue));
723
- }
724
- if (params.filmFromCOA.flgMgtkUse === '0') {
725
- if (!Array.isArray(unacceptedPaymentMethod)) {
726
- unacceptedPaymentMethod = [];
727
- }
728
- // flgMgtkUseで決済方法区分から動的に
729
- unacceptedPaymentMethod.push(...params.availablePaymentMethodTypes.filter(({ additionalProperty }) => { var _a; return ((_a = additionalProperty === null || additionalProperty === void 0 ? void 0 : additionalProperty.find(({ name }) => name === 'flgMgtkUse')) === null || _a === void 0 ? void 0 : _a.value) === '1'; })
730
- .map(({ codeValue }) => codeValue));
731
- }
732
- if (Array.isArray(unacceptedPaymentMethod)) {
733
- // 重複排除
734
- unacceptedPaymentMethod = [...new Set(unacceptedPaymentMethod)];
735
- }
736
- return { unacceptedPaymentMethod };
737
- }
738
- /**
739
- * COA情報からイベントIDを作成する
740
- */
741
- function createScreeningEventIdFromCOA(params) {
742
- return [
743
- createScreeningEventSeriesId(params),
744
- params.dateJouei,
745
- params.screenCode,
746
- params.timeBegin
747
- ].join('');
748
- }
749
- /**
750
- * COA情報からイベント識別子を作成する
751
- */
752
- // tslint:disable-next-line:no-single-line-block-comment
753
- /* istanbul ignore next */
754
- function createScreeningEventSeriesId(params) {
755
- return [
756
- params.theaterCode,
757
- params.titleCode,
758
- params.titleBranchNum
759
- ].join('');
760
- }
761
- /**
762
- * コアマスター抽出結果から作成する
763
- */
764
- // tslint:disable-next-line:no-single-line-block-comment
765
- /* istanbul ignore next */
766
- function createMovieTheaterFromCOA(project, seller, theaterFromCOA, screensFromCOA) {
767
- // const id = `MovieTheater-${theaterFromCOA.theaterCode}`;
768
- return {
769
- project: { typeOf: project.typeOf, id: project.id },
770
- // id: id,
771
- // screenCount: screensFromCOA.length,
772
- branchCode: theaterFromCOA.theaterCode,
773
- name: {
774
- ja: theaterFromCOA.theaterName,
775
- en: theaterFromCOA.theaterNameEng
776
- },
777
- kanaName: theaterFromCOA.theaterNameKana,
778
- containsPlace: screensFromCOA.map((screenFromCOA) => {
779
- return createScreeningRoomFromCOA(project, seller, screenFromCOA);
780
- }),
781
- typeOf: factory.placeType.MovieTheater,
782
- telephone: theaterFromCOA.theaterTelNum,
783
- offers: {
784
- // project: { typeOf: project.typeOf, id: project.id }, // optimize(2023-11-06~)
785
- // priceCurrency: factory.priceCurrency.JPY, // optimize(2023-11-06~)
786
- typeOf: factory.offerType.Offer,
787
- eligibleQuantity: {
788
- typeOf: 'QuantitativeValue',
789
- maxValue: 6,
790
- unitCode: factory.unitCode.C62
791
- },
792
- availabilityStartsGraceTime: {
793
- typeOf: 'QuantitativeValue',
794
- value: -2,
795
- unitCode: factory.unitCode.Day
796
- },
797
- availabilityEndsGraceTime: {
798
- typeOf: 'QuantitativeValue',
799
- value: 1200,
800
- unitCode: factory.unitCode.Sec
801
- },
802
- availabilityStartsGraceTimeOnPOS: {
803
- typeOf: 'QuantitativeValue',
804
- value: -93,
805
- unitCode: factory.unitCode.Day
806
- },
807
- availabilityEndsGraceTimeOnPOS: {
808
- typeOf: 'QuantitativeValue',
809
- value: 2678400,
810
- unitCode: factory.unitCode.Sec
811
- }
812
- },
813
- parentOrganization: { id: seller.id, typeOf: factory.organizationType.Corporation }
814
- };
815
- }
816
- /**
817
- * コアスクリーン抽出結果からルームを作成する
818
- */
819
- // tslint:disable-next-line:no-single-line-block-comment
820
- /* istanbul ignore next */
821
- function createScreeningRoomFromCOA(project, seller, screenFromCOA) {
822
- const sections = [];
823
- const sectionCodes = [];
824
- screenFromCOA.listSeat.forEach((seat) => {
825
- if (sectionCodes.indexOf(seat.seatSection) < 0) {
826
- sectionCodes.push(seat.seatSection);
827
- sections.push({
828
- project: { typeOf: project.typeOf, id: project.id },
829
- branchCode: seat.seatSection,
830
- name: {
831
- ja: `セクション${seat.seatSection}`,
832
- en: `section${seat.seatSection}`
833
- },
834
- containsPlace: [],
835
- typeOf: factory.placeType.ScreeningRoomSection
836
- });
837
- }
838
- sections[sectionCodes.indexOf(seat.seatSection)].containsPlace.push({
839
- project: { typeOf: project.typeOf, id: project.id },
840
- branchCode: seat.seatNum,
841
- typeOf: factory.placeType.Seat,
842
- additionalProperty: [
843
- { name: 'flgFree', value: String(seat.flgFree) },
844
- { name: 'flgHc', value: String(seat.flgHc) },
845
- { name: 'flgPair', value: String(seat.flgPair) },
846
- { name: 'flgSpare', value: String(seat.flgSpare) },
847
- { name: 'flgSpecial', value: String(seat.flgSpecial) }
848
- ]
849
- });
850
- });
851
- return {
852
- project: { typeOf: project.typeOf, id: project.id },
853
- containsPlace: sections,
854
- branchCode: screenFromCOA.screenCode,
855
- name: {
856
- ja: screenFromCOA.screenName,
857
- en: screenFromCOA.screenNameEng
858
- },
859
- typeOf: factory.placeType.ScreeningRoom,
860
- maximumAttendeeCapacity: sections[0].containsPlace.length,
861
- // 必須化(2023-07-14~)
862
- parentOrganization: { id: seller.id, typeOf: factory.organizationType.Corporation }
863
- };
864
- }