@chevre/domain 23.2.0-alpha.0 → 23.2.0-alpha.10

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.
Files changed (32) hide show
  1. package/example/src/chevre/actions/checkAuthorizePaymentActions.ts +55 -0
  2. package/example/src/chevre/eventSeries/migrateEventSeriesOffers.ts +75 -0
  3. package/example/src/chevre/place/migrateSectionIdentifier.ts +92 -0
  4. package/example/src/chevre/roles/addAdminEventSeriesReadPermissionIfNotExists.ts +49 -0
  5. package/example/src/chevre/roles/addAdminMovieReadPermissionIfNotExists.ts +49 -0
  6. package/example/src/chevre/roles/addAdminSeatReadPermissionIfNotExists.ts +33 -0
  7. package/example/src/chevre/roles/addAdminSeatWritePermissionIfNotExists.ts +33 -0
  8. package/lib/chevre/repo/acceptedPaymentMethod.js +14 -10
  9. package/lib/chevre/repo/creativeWork.js +9 -5
  10. package/lib/chevre/repo/mongoose/schemas/creativeWork.js +10 -9
  11. package/lib/chevre/repo/place/screeningRoom.d.ts +35 -31
  12. package/lib/chevre/repo/place/screeningRoom.js +20 -20
  13. package/lib/chevre/repo/place/seat.d.ts +16 -45
  14. package/lib/chevre/repo/place/seat.js +25 -47
  15. package/lib/chevre/repo/place/section.d.ts +28 -29
  16. package/lib/chevre/repo/place/section.js +86 -39
  17. package/lib/chevre/service/assetTransaction/pay/validateAcceptedPaymentMethodIfNeeded.d.ts +6 -1
  18. package/lib/chevre/service/assetTransaction/pay/validateAcceptedPaymentMethodIfNeeded.js +26 -4
  19. package/lib/chevre/service/assetTransaction/pay.d.ts +3 -0
  20. package/lib/chevre/service/payment/any/factory.d.ts +5 -0
  21. package/lib/chevre/service/payment/any/factory.js +11 -2
  22. package/lib/chevre/service/payment/any.d.ts +8 -0
  23. package/lib/chevre/service/payment/any.js +3 -2
  24. package/lib/chevre/service/task/authorizePayment.js +3 -1
  25. package/lib/chevre/service/task/publishPaymentUrl.js +3 -1
  26. package/lib/chevre/service/task/syncResourcesFromCOA.d.ts +6 -0
  27. package/lib/chevre/service/task/syncResourcesFromCOA.js +299 -0
  28. package/lib/chevre/service/taskHandler.js +1 -0
  29. package/lib/chevre/service/transaction/placeOrder/confirm/validation/factory.d.ts +2 -2
  30. package/lib/chevre/service/transaction/placeOrder/confirm/validation.js +3 -1
  31. package/lib/chevre/service/transaction/placeOrder/confirm.js +3 -1
  32. package/package.json +2 -2
@@ -19,14 +19,18 @@ const debug = createDebug('chevre-domain:service:assetTransaction:pay');
19
19
  /**
20
20
  * 必要あらば関連リソースの対応決済方法を検証する
21
21
  */
22
+ // tslint:disable-next-line:max-func-body-length
22
23
  function validateAcceptedPaymentMethodIfNeeded(params) {
24
+ // tslint:disable-next-line:max-func-body-length
23
25
  return (repos) => __awaiter(this, void 0, void 0, function* () {
24
26
  var _a, _b;
27
+ const now = new Date();
25
28
  /**
26
29
  * 検証対象のイベントIDリスト
27
30
  */
28
31
  let checkingEventIds;
29
32
  const paymentServiceType = params.object.typeOf;
33
+ const paymentServiceId = params.object.id;
30
34
  // CreditCard or MovieTicket?
31
35
  if (paymentServiceType === factory.service.paymentService.PaymentServiceType.CreditCard) {
32
36
  // クレジットカードIF決済の場合、objectに注文アイテム指定があればそちらで検証する
@@ -77,10 +81,28 @@ function validateAcceptedPaymentMethodIfNeeded(params) {
77
81
  }
78
82
  if (((_b = eventSeries.offers) === null || _b === void 0 ? void 0 : _b.typeOf) === factory.offerType.AggregateOffer) {
79
83
  // 対応決済方法オファーIDの指定が必要
80
- throw new factory.errors.ArgumentNull('acceptedPaymentMethodOfferId');
81
- // if (paymentAccepted !== true) {
82
- // throw new factory.errors.Argument('recipient', `payment not accepted [${paymentMethodType}]`);
83
- // }
84
+ const acceptedPaymentMethodOfferIds = [];
85
+ params.instrument.forEach((instrument) => {
86
+ if (instrument.typeOf === factory.offerType.Offer) {
87
+ acceptedPaymentMethodOfferIds.push(instrument.id);
88
+ }
89
+ });
90
+ if (acceptedPaymentMethodOfferIds.length === 0) {
91
+ throw new factory.errors.ArgumentNull('acceptedPaymentMethodOfferIds');
92
+ }
93
+ // 全施設コンテンツについて有効な対応決済方法オファーの存在を検証
94
+ const validAcceptedPaymentMethodOffer = (yield repos.acceptedPaymentMethod.findAcceptedPaymentMethods({
95
+ limit: 1,
96
+ page: 1,
97
+ id: { $in: acceptedPaymentMethodOfferIds }, // 指定されたIDで
98
+ itemOffered: { id: { $eq: eventSeriesId } }, // リソースに対して
99
+ acceptedPaymentMethod: { id: { $eq: paymentServiceId } }, // 決済方法を許可
100
+ validFrom: { $lte: now }, // 現在有効
101
+ validThrough: { $gte: now } // 現在有効
102
+ }, ['identifier'])).shift();
103
+ if (validAcceptedPaymentMethodOffer === undefined) {
104
+ throw new factory.errors.NotFound(factory.offerType.Offer, `payment not accepted. eventSeriesId: ${eventSeriesId}`);
105
+ }
84
106
  }
85
107
  else {
86
108
  // 集約オファーでなければ検証の必要なし
@@ -5,6 +5,7 @@ import * as GMO from '@motionpicture/gmo-service';
5
5
  import * as factory from '../../factory';
6
6
  import { Settings } from '../../settings';
7
7
  import type { AcceptedOfferRepo } from '../../repo/acceptedOffer';
8
+ import type { AcceptedPaymentMethodRepo } from '../../repo/acceptedPaymentMethod';
8
9
  import type { AccountingReportRepo } from '../../repo/accountingReport';
9
10
  import type { ActionRepo } from '../../repo/action';
10
11
  import type { AssetTransactionRepo } from '../../repo/assetTransaction';
@@ -21,6 +22,7 @@ import type { TaskRepo } from '../../repo/task';
21
22
  import * as CreditCardPayment from '../payment/creditCard';
22
23
  import * as MovieTicketPayment from '../payment/movieTicket';
23
24
  export interface IStartOperationRepos {
25
+ acceptedPaymentMethod: AcceptedPaymentMethodRepo;
24
26
  accountingReport: AccountingReportRepo;
25
27
  action: ActionRepo;
26
28
  credentials: CredentialsRepo;
@@ -62,6 +64,7 @@ export type ICheckOperation<T> = (repos: {
62
64
  paymentServiceProvider: PaymentServiceProviderRepo;
63
65
  }, settings: Settings) => Promise<T>;
64
66
  export type IPublishPaymentUrlOperation<T> = (repos: {
67
+ acceptedPaymentMethod: AcceptedPaymentMethodRepo;
65
68
  action: ActionRepo;
66
69
  event: EventRepo;
67
70
  eventSeries: EventSeriesRepo;
@@ -16,6 +16,7 @@ export declare function creatPublishPaymentUrlParams(params: {
16
16
  * 決済採用に使用される決済方法チケットトークン
17
17
  */
18
18
  ticketToken?: string;
19
+ instrument: factory.action.trade.pay.IAcceptedPaymentMethodOfferAsInstrument[];
19
20
  }): Pick<factory.assetTransaction.pay.IStartParamsWithoutDetail, 'agent' | 'location' | 'project' | 'recipient' | 'transactionNumber' | 'typeOf'> & {
20
21
  object: factory.action.accept.pay.IPayObject;
21
22
  identifier?: string;
@@ -40,6 +41,10 @@ export declare function creatPayTransactionStartParams(params: {
40
41
  * 決済方法チケット
41
42
  */
42
43
  ticketToken?: string;
44
+ /**
45
+ * ツールとしての対応決済方法オファー
46
+ */
47
+ instrument: factory.action.trade.pay.IAcceptedPaymentMethodOfferAsInstrument[];
43
48
  }): factory.assetTransaction.pay.IStartParamsWithoutDetail & {
44
49
  instrument: factory.action.trade.pay.IPlaceOrderRelatedInstrument[];
45
50
  };
@@ -28,7 +28,15 @@ function creatPublishPaymentUrlParams(params) {
28
28
  referencesOrder: params.object.referencesOrder
29
29
  }
30
30
  };
31
+ const instrument = [];
31
32
  const ticketAsInstrument = (typeof params.ticketToken === 'string') ? { ticketToken: params.ticketToken, typeOf: 'Ticket' } : undefined;
33
+ if (ticketAsInstrument !== undefined) {
34
+ instrument.push(ticketAsInstrument);
35
+ }
36
+ // instrumentを対応決済方法オファーに対応(2025-12-14~)
37
+ if (Array.isArray(params.instrument)) {
38
+ instrument.push(...params.instrument);
39
+ }
32
40
  return Object.assign(Object.assign(Object.assign({ project: { id: params.transaction.project.id, typeOf: factory.organizationType.Project }, typeOf: factory.assetTransactionType.Pay, transactionNumber: params.transactionNumber, agent: {
33
41
  typeOf: params.transaction.seller.typeOf,
34
42
  id: params.transaction.seller.id,
@@ -43,7 +51,7 @@ function creatPublishPaymentUrlParams(params) {
43
51
  typeOf: params.transaction.seller.typeOf
44
52
  }, object }, (typeof ((_d = params.location) === null || _d === void 0 ? void 0 : _d.typeOf) === 'string')
45
53
  ? { location: params.location }
46
- : undefined), { instrument: (ticketAsInstrument !== undefined) ? [ticketAsInstrument] : [] }), (typeof params.identifier === 'string')
54
+ : undefined), { instrument }), (typeof params.identifier === 'string')
47
55
  ? { identifier: params.identifier }
48
56
  : undefined);
49
57
  }
@@ -71,7 +79,8 @@ function creatPayTransactionStartParams(params) {
71
79
  const instrument = [
72
80
  { id: params.action.id, typeOf: params.action.typeOf },
73
81
  { orderNumber, typeOf: factory.order.OrderType.Order },
74
- ...(ticketAsInstrument !== undefined) ? [ticketAsInstrument] : [] // add ticketAsInstrument(2025-11-25~)
82
+ ...(ticketAsInstrument !== undefined) ? [ticketAsInstrument] : [], // add ticketAsInstrument(2025-11-25~)
83
+ ...(Array.isArray(params.instrument)) ? params.instrument : [] // instrumentを対応決済方法オファーに対応(2025-12-14~)
75
84
  ];
76
85
  return Object.assign({ project: { id: params.transaction.project.id, typeOf: factory.organizationType.Project }, typeOf: factory.assetTransactionType.Pay, transactionNumber: params.transactionNumber, agent: {
77
86
  typeOf: params.transaction.seller.typeOf,
@@ -1,5 +1,6 @@
1
1
  import * as factory from '../../factory';
2
2
  import { Settings } from '../../settings';
3
+ import type { AcceptedPaymentMethodRepo } from '../../repo/acceptedPaymentMethod';
3
4
  import type { AccountingReportRepo } from '../../repo/accountingReport';
4
5
  import type { ActionRepo, IMinimizedPurchaseNumberAuthResult } from '../../repo/action';
5
6
  import type { AssetTransactionRepo } from '../../repo/assetTransaction';
@@ -79,6 +80,7 @@ declare function processVoidPayTransaction(params: factory.task.IData<factory.ta
79
80
  transaction: TransactionRepo;
80
81
  }) => Promise<void>;
81
82
  interface IAuthorizeRepos {
83
+ acceptedPaymentMethod: AcceptedPaymentMethodRepo;
82
84
  accountingReport: AccountingReportRepo;
83
85
  action: ActionRepo;
84
86
  assetTransaction: AssetTransactionRepo;
@@ -101,6 +103,7 @@ interface IAuthorizeRepos {
101
103
  }
102
104
  type IAuthorizeOperation<T> = (repos: IAuthorizeRepos, settings: Settings) => Promise<T>;
103
105
  interface IPublishPaymentUrlRepos {
106
+ acceptedPaymentMethod: AcceptedPaymentMethodRepo;
104
107
  action: ActionRepo;
105
108
  assetTransaction: AssetTransactionRepo;
106
109
  authorization: AuthorizationRepo;
@@ -143,6 +146,7 @@ declare function publishPaymentUrl(params: {
143
146
  * add identifier for an unique index(2025-02-25~)
144
147
  */
145
148
  identifier?: string;
149
+ instrument: factory.action.trade.pay.IAcceptedPaymentMethodOfferAsInstrument[];
146
150
  }): IPublishPaymentUrlOperation<Pick<PayTransactionService.IPublishPaymentUrlResult, 'paymentMethodId' | 'paymentUrl'>>;
147
151
  /**
148
152
  * 決済承認
@@ -173,6 +177,10 @@ declare function authorize(params: {
173
177
  */
174
178
  id: string;
175
179
  };
180
+ /**
181
+ * ツールとしての対応決済方法オファー
182
+ */
183
+ instrument: factory.action.trade.pay.IAcceptedPaymentMethodOfferAsInstrument[];
176
184
  }): IAuthorizeOperation<{
177
185
  /**
178
186
  * 承認アクションID
@@ -366,7 +366,7 @@ function publishPaymentUrl(params) {
366
366
  referencesOrder: (((_a = params.object.referencesOrder) === null || _a === void 0 ? void 0 : _a.typeOf) === factory.order.OrderType.Order)
367
367
  ? params.object.referencesOrder
368
368
  : { typeOf: factory.order.OrderType.Order } });
369
- const startParams = (0, factory_1.creatPublishPaymentUrlParams)(Object.assign(Object.assign({ object: authorizeObject, paymentServiceType, transaction: transaction, transactionNumber: transactionNumber, location: params.location }, (typeof params.identifier === 'string') ? { identifier: params.identifier } : undefined), (typeof ticketToken === 'string') ? { ticketToken } : undefined));
369
+ const startParams = (0, factory_1.creatPublishPaymentUrlParams)(Object.assign(Object.assign({ object: authorizeObject, paymentServiceType, transaction: transaction, transactionNumber: transactionNumber, location: params.location, instrument: params.instrument }, (typeof params.identifier === 'string') ? { identifier: params.identifier } : undefined), (typeof ticketToken === 'string') ? { ticketToken } : undefined));
370
370
  const taskId = (_b = params.sameAs) === null || _b === void 0 ? void 0 : _b.id;
371
371
  result = yield PayTransactionService.publishPaymentUrl(startParams, {
372
372
  purposeAsTransaction: { id: transaction.id },
@@ -539,7 +539,8 @@ function authorize(params) {
539
539
  // orderNumber required(2025-02-14~)
540
540
  order: { confirmationNumber, orderNumber },
541
541
  action: { id: action.id, typeOf: action.typeOf },
542
- ticketToken
542
+ ticketToken,
543
+ instrument: params.instrument
543
544
  });
544
545
  payTransaction = yield PayTransactionService.start(startParams, Object.assign({
545
546
  // useCheckByIdentifierIfNotYet: params.options.useCheckByIdentifierIfNotYet,
@@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.call = call;
13
13
  const factory = require("../../factory");
14
+ const acceptedPaymentMethod_1 = require("../../repo/acceptedPaymentMethod");
14
15
  const accountingReport_1 = require("../../repo/accountingReport");
15
16
  const action_1 = require("../../repo/action");
16
17
  const assetTransaction_1 = require("../../repo/assetTransaction");
@@ -52,8 +53,9 @@ function call(params) {
52
53
  const useCredentialsRepo = typeof paymentServiceId === 'string' && paymentServiceId !== ''
53
54
  && typeof credentialsExpireInSeconds === 'number' && credentialsExpireInSeconds > 0;
54
55
  try {
55
- yield (0, any_1.authorize)(Object.assign(Object.assign({}, params.data), { sameAs: { id: params.id } // タスクIDを関連付け(2024-04-20~)
56
+ yield (0, any_1.authorize)(Object.assign(Object.assign({}, params.data), { instrument: (Array.isArray(params.data.instrument)) ? params.data.instrument : [], sameAs: { id: params.id } // タスクIDを関連付け(2024-04-20~)
56
57
  }))({
58
+ acceptedPaymentMethod: new acceptedPaymentMethod_1.AcceptedPaymentMethodRepo(connection),
57
59
  accountingReport: new accountingReport_1.AccountingReportRepo(connection),
58
60
  action: actionRepo,
59
61
  assetTransaction: new assetTransaction_1.AssetTransactionRepo(connection),
@@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.call = call;
13
13
  const factory = require("../../factory");
14
+ const acceptedPaymentMethod_1 = require("../../repo/acceptedPaymentMethod");
14
15
  const action_1 = require("../../repo/action");
15
16
  const assetTransaction_1 = require("../../repo/assetTransaction");
16
17
  const authorization_1 = require("../../repo/authorization");
@@ -41,7 +42,8 @@ function call(params) {
41
42
  const actionRepo = new action_1.ActionRepo(connection);
42
43
  // const transactionProcessRepo = new TransactionProcessRepo(redisClient, { lockExpiresInSeconds: 120 });
43
44
  try {
44
- yield (0, any_1.publishPaymentUrl)(Object.assign(Object.assign({}, params.data), { sameAs: { id: params.id } }))({
45
+ yield (0, any_1.publishPaymentUrl)(Object.assign(Object.assign({}, params.data), { instrument: (Array.isArray(params.data.instrument)) ? params.data.instrument : [], sameAs: { id: params.id } }))({
46
+ acceptedPaymentMethod: new acceptedPaymentMethod_1.AcceptedPaymentMethodRepo(connection),
45
47
  action: actionRepo,
46
48
  assetTransaction: new assetTransaction_1.AssetTransactionRepo(connection),
47
49
  authorization: new authorization_1.AuthorizationRepo(connection),
@@ -0,0 +1,6 @@
1
+ import * as factory from '../../factory';
2
+ import type { ICallResult, IExecutableTaskKeys, IOperationExecute } from '../taskHandler';
3
+ /**
4
+ * タスク実行関数
5
+ */
6
+ export declare function call(params: Pick<factory.task.syncResourcesFromCOA.ITask, IExecutableTaskKeys>): IOperationExecute<ICallResult>;
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.call = call;
13
+ const COA = require("@motionpicture/coa-service");
14
+ const moment = require("moment-timezone");
15
+ const factory = require("../../factory");
16
+ const action_1 = require("../../repo/action");
17
+ const categoryCode_1 = require("../../repo/categoryCode");
18
+ const creativeWork_1 = require("../../repo/creativeWork");
19
+ const credentials_1 = require("../../repo/credentials");
20
+ const event_1 = require("../../repo/event");
21
+ const eventSeries_1 = require("../../repo/eventSeries");
22
+ const movieTheater_1 = require("../../repo/place/movieTheater");
23
+ const screeningRoom_1 = require("../../repo/place/screeningRoom");
24
+ const reserveInterface_1 = require("../../repo/reserveInterface");
25
+ const saveScreeningEvents_1 = require("../event/saveScreeningEvents");
26
+ const saveScreeningEventSeries_1 = require("../event/saveScreeningEventSeries");
27
+ let coaAuthClient;
28
+ /**
29
+ * タスク実行関数
30
+ */
31
+ function call(params) {
32
+ // tslint:disable-next-line:max-func-body-length
33
+ return (_a, options_1) => __awaiter(this, [_a, options_1], void 0, function* ({ connection, redisClient, settings }, options) {
34
+ var _b, _c, _d;
35
+ if (redisClient === undefined) {
36
+ throw new factory.errors.Argument('settings', 'redisClient required');
37
+ }
38
+ // 遅延実行(executeByName)には対応しない
39
+ if (!options.executeById) {
40
+ return;
41
+ }
42
+ const reserveInterfaceRepo = new reserveInterface_1.ReserveInterfaceRepo(connection);
43
+ const coaAPI = yield reserveInterfaceRepo.findOne({ project: { id: { $eq: params.project.id } } });
44
+ if (typeof (coaAPI === null || coaAPI === void 0 ? void 0 : coaAPI.id) !== 'string') {
45
+ throw new factory.errors.NotFound('WebAPI');
46
+ }
47
+ const credentials = (_b = coaAPI.availableChannel) === null || _b === void 0 ? void 0 : _b.credentials;
48
+ if (typeof (credentials === null || credentials === void 0 ? void 0 : credentials.refreshToken) !== 'string') {
49
+ throw new factory.errors.NotFound('WebAPI');
50
+ }
51
+ if (coaAuthClient === undefined) {
52
+ let credentialsRepo;
53
+ const credentialsExpireInSeconds = (_d = (_c = coaAPI.availableChannel) === null || _c === void 0 ? void 0 : _c.credentials) === null || _d === void 0 ? void 0 : _d.expireInSeconds;
54
+ if (typeof credentialsExpireInSeconds === 'number') {
55
+ // set credentialsRepo(2024-11-20~)
56
+ credentialsRepo = new credentials_1.CredentialsRepo(redisClient, {
57
+ scope: `COA:${coaAPI.id}`,
58
+ expireInSeconds: credentialsExpireInSeconds
59
+ });
60
+ }
61
+ coaAuthClient = new COA.auth.RefreshToken(Object.assign(Object.assign({}, credentials), (credentialsRepo !== undefined) ? { credentialsRepo } : undefined));
62
+ }
63
+ const actionRepo = new action_1.ActionRepo(connection);
64
+ try {
65
+ const masterService = new COA.service.Master({
66
+ endpoint: coaAuthClient.options.endpoint, // same as authClient(2024-07-17~)
67
+ auth: coaAuthClient
68
+ }, { timeout: settings.coa.timeout });
69
+ const { agent, object } = params.data;
70
+ if (object.typeOf === factory.eventType.ScreeningEventSeries) {
71
+ yield syncEventSeries({
72
+ project: { id: params.project.id },
73
+ agent,
74
+ object,
75
+ sameAs: { id: params.id }
76
+ })({
77
+ action: actionRepo,
78
+ categoryCode: new categoryCode_1.CategoryCodeRepo(connection),
79
+ creativeWork: new creativeWork_1.CreativeWorkRepo(connection),
80
+ eventSeries: new eventSeries_1.EventSeriesRepo(connection),
81
+ movieTheater: new movieTheater_1.MovieTheaterRepo(connection),
82
+ masterService
83
+ });
84
+ }
85
+ else if (object.typeOf === factory.eventType.ScreeningEvent) {
86
+ yield syncEvents({
87
+ project: { id: params.project.id },
88
+ agent,
89
+ object,
90
+ sameAs: { id: params.id }
91
+ })({
92
+ action: actionRepo,
93
+ categoryCode: new categoryCode_1.CategoryCodeRepo(connection),
94
+ creativeWork: new creativeWork_1.CreativeWorkRepo(connection),
95
+ event: new event_1.EventRepo(connection),
96
+ eventSeries: new eventSeries_1.EventSeriesRepo(connection),
97
+ movieTheater: new movieTheater_1.MovieTheaterRepo(connection),
98
+ screeningRoom: new screeningRoom_1.ScreeningRoomRepo(connection),
99
+ masterService
100
+ });
101
+ }
102
+ }
103
+ catch (error) {
104
+ let throwsError = true;
105
+ // アクションが存在すればタスクを実行済扱いにする
106
+ const action = (yield actionRepo.searchBySameAs({
107
+ sameAs: { id: { $eq: params.id } },
108
+ typeOf: { $eq: factory.actionType.ReplaceAction }
109
+ })).shift();
110
+ if (typeof (action === null || action === void 0 ? void 0 : action.id) === 'string') {
111
+ throwsError = false;
112
+ }
113
+ if (throwsError) {
114
+ throw error;
115
+ }
116
+ }
117
+ finally {
118
+ // no op
119
+ }
120
+ });
121
+ }
122
+ function syncEventSeries(params) {
123
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
124
+ const { locationBranchCode, titleBranchNum, titleCode } = params.object;
125
+ const actionAttributes = {
126
+ project: { typeOf: factory.organizationType.Project, id: params.project.id },
127
+ typeOf: factory.actionType.ReplaceAction,
128
+ agent: params.agent,
129
+ // tslint:disable-next-line:no-suspicious-comment
130
+ // TODO define object
131
+ object: Object.assign(Object.assign({}, params.object), { typeOf: factory.eventType.ScreeningEventSeries }),
132
+ // instrument,
133
+ targetCollection: { typeOf: factory.eventType.ScreeningEventSeries },
134
+ sameAs: { id: params.sameAs.id, typeOf: 'Task' }
135
+ };
136
+ const action = yield repos.action.start(actionAttributes);
137
+ let saveResult;
138
+ try {
139
+ const movieTheater = (yield repos.movieTheater.projectFields({
140
+ limit: 1,
141
+ page: 1,
142
+ project: { id: { $eq: params.project.id } },
143
+ branchCode: { $eq: locationBranchCode }
144
+ }, ['id', 'typeOf', 'branchCode', 'name', 'kanaName', 'parentOrganization']
145
+ // []
146
+ )).shift();
147
+ if (movieTheater === undefined) {
148
+ throw new factory.errors.NotFound(factory.placeType.MovieTheater);
149
+ }
150
+ // console.log('movieTheater:', movieTheater);
151
+ saveResult = yield (0, saveScreeningEventSeries_1.saveScreeningEventSeries)({
152
+ project: { id: params.project.id, typeOf: factory.organizationType.Project },
153
+ seller: { id: movieTheater.parentOrganization.id },
154
+ movieTheater,
155
+ locationBranchCode,
156
+ saveScreeningEventSeries: true,
157
+ saveScreeningEventSeriesPeriodInMonth: 3
158
+ }, {
159
+ filterFilmsFromCOA: {
160
+ titleBranchNum,
161
+ titleCode
162
+ }
163
+ })(repos);
164
+ // console.log(
165
+ // 'result:',
166
+ // saveResult.savedEventsCount,
167
+ // saveResult.screeningEventSerieses.length
168
+ // );
169
+ }
170
+ catch (error) {
171
+ try {
172
+ yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error });
173
+ }
174
+ catch (__) {
175
+ // no op
176
+ }
177
+ throw error;
178
+ }
179
+ const result = saveResult.screeningEventSerieses.map((eventSeries) => {
180
+ return {
181
+ id: eventSeries.id,
182
+ typeOf: eventSeries.typeOf
183
+ };
184
+ });
185
+ yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result });
186
+ });
187
+ }
188
+ // tslint:disable-next-line:max-func-body-length
189
+ function syncEvents(params) {
190
+ // tslint:disable-next-line:max-func-body-length
191
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
192
+ const { locationBranchCode, titleBranchNum, titleCode, roomCode, startDate } = params.object;
193
+ const actionAttributes = {
194
+ project: { typeOf: factory.organizationType.Project, id: params.project.id },
195
+ typeOf: factory.actionType.ReplaceAction,
196
+ agent: params.agent,
197
+ // tslint:disable-next-line:no-suspicious-comment
198
+ // TODO define object
199
+ object: Object.assign(Object.assign({}, params.object), { typeOf: factory.eventType.ScreeningEvent }),
200
+ // instrument,
201
+ targetCollection: { typeOf: factory.eventType.ScreeningEvent },
202
+ sameAs: { id: params.sameAs.id, typeOf: 'Task' }
203
+ };
204
+ const action = yield repos.action.start(actionAttributes);
205
+ let saveResult;
206
+ try {
207
+ const movieTheater = (yield repos.movieTheater.projectFields({
208
+ limit: 1,
209
+ page: 1,
210
+ project: { id: { $eq: params.project.id } },
211
+ branchCode: { $eq: locationBranchCode }
212
+ }, ['id', 'typeOf', 'branchCode', 'name', 'kanaName', 'parentOrganization']
213
+ // []
214
+ )).shift();
215
+ if (movieTheater === undefined) {
216
+ throw new factory.errors.NotFound(factory.placeType.MovieTheater);
217
+ }
218
+ // console.log('movieTheater:', movieTheater);
219
+ const screeningRoom = (yield repos.screeningRoom.searchScreeningRooms({
220
+ project: { id: { $eq: params.project.id } },
221
+ containedInPlace: { branchCode: { $eq: movieTheater.branchCode } },
222
+ branchCode: { $eq: roomCode }
223
+ })).shift();
224
+ if (screeningRoom === undefined) {
225
+ throw new factory.errors.NotFound(factory.placeType.ScreeningRoom);
226
+ }
227
+ // console.log(screeningRoom);
228
+ const eventSeriesId = (0, saveScreeningEventSeries_1.createScreeningEventSeriesId)({
229
+ theaterCode: locationBranchCode,
230
+ titleCode,
231
+ titleBranchNum
232
+ });
233
+ const eventSeries = (yield repos.eventSeries.projectEventSeriesFields({
234
+ id: { $eq: eventSeriesId },
235
+ project: { id: { $eq: params.project.id } }
236
+ }, [
237
+ 'project', 'typeOf', 'eventStatus', 'identifier',
238
+ 'name', 'kanaName', 'alternativeHeadline', 'location',
239
+ 'organizer', 'videoFormat', 'soundFormat', 'workPerformed',
240
+ 'duration', 'endDate', 'startDate', 'coaInfo',
241
+ 'offers', 'additionalProperty'
242
+ ])).shift();
243
+ if (eventSeries === undefined) {
244
+ throw new factory.errors.NotFound(factory.eventType.ScreeningEventSeries);
245
+ }
246
+ // console.log(eventSeries);
247
+ const targetImportFrom = moment(startDate)
248
+ .tz('Asia/Tokyo')
249
+ .startOf('day');
250
+ const targetImportThrough = moment(startDate)
251
+ .tz('Asia/Tokyo')
252
+ .endOf('day');
253
+ const begin = moment(targetImportFrom)
254
+ .add(-1, 'day') // 深夜帯スケジュールが前日検索の結果に含まれるため
255
+ .tz('Asia/Tokyo')
256
+ .format('YYYYMMDD'); // COAは日本時間で判断
257
+ const end = moment(targetImportThrough)
258
+ // .add(-1, 'day')
259
+ .tz('Asia/Tokyo')
260
+ .format('YYYYMMDD'); // COAは日本時間で判断
261
+ // console.log('importing screening events...', targetImportFrom, targetImportThrough, begin, end);
262
+ saveResult = yield (0, saveScreeningEvents_1.saveScreeningEvents)({
263
+ project: { id: params.project.id, typeOf: factory.organizationType.Project },
264
+ seller: { id: movieTheater.parentOrganization.id },
265
+ movieTheater,
266
+ screeningRooms: [screeningRoom],
267
+ screeningEventSerieses: [eventSeries],
268
+ targetImportFrom: targetImportFrom.toDate(),
269
+ targetImportThrough: targetImportThrough.toDate(),
270
+ instrument: {
271
+ theaterCode: locationBranchCode,
272
+ begin, // debug(2024-04-24~)
273
+ end, // debug(2024-04-24~)
274
+ typeOf: 'WebAPI',
275
+ identifier: factory.service.webAPI.Identifier.COA
276
+ }
277
+ }, {
278
+ filterSchedulesFromCOA: { titleBranchNum, titleCode, roomCode }
279
+ })(repos);
280
+ // console.log('saveResult:', saveResult.length, 'events');
281
+ }
282
+ catch (error) {
283
+ try {
284
+ yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error });
285
+ }
286
+ catch (__) {
287
+ // no op
288
+ }
289
+ throw error;
290
+ }
291
+ const result = saveResult.map((event) => {
292
+ return {
293
+ id: event.id,
294
+ typeOf: event.typeOf
295
+ };
296
+ });
297
+ yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result });
298
+ });
299
+ }
@@ -69,6 +69,7 @@ function executeTask(task, next) {
69
69
  case factory.taskName.ReturnPayTransaction:
70
70
  case factory.taskName.ReturnReserveTransaction:
71
71
  case factory.taskName.SendEmailMessage:
72
+ case factory.taskName.SyncResourcesFromCOA:
72
73
  case factory.taskName.TriggerWebhook:
73
74
  callResult = yield call(task)(settings, options);
74
75
  break;
@@ -3,7 +3,7 @@ export type IAcceptPayAction = Pick<factory.action.accept.pay.IAction, 'object'
3
3
  export type IAuthorizeEventServiceOffer = factory.action.authorize.offer.eventService.IAction;
4
4
  export type IAuthorizeProductOffer = factory.action.authorize.offer.product.IAction;
5
5
  export type IAuthorizeMoneyTransferOffer = factory.action.authorize.offer.moneyTransfer.IAction;
6
- export type IAuthorizePaymentAction = Pick<factory.action.authorize.paymentMethod.any.IAction, 'id' | 'result' | 'endDate' | 'instrument'> & {
7
- object: Pick<factory.action.authorize.paymentMethod.any.IObject, 'typeOf'>;
6
+ export type IAuthorizePaymentAction = Pick<factory.action.authorize.paymentMethod.any.IAction, 'id' | 'result' | 'endDate'> & {
7
+ object: Pick<factory.action.authorize.paymentMethod.any.IObject, 'typeOf' | 'paymentMethodId'>;
8
8
  };
9
9
  export type IPayTransaction = Pick<factory.assetTransaction.pay.ITransaction, 'object'>;
@@ -47,7 +47,9 @@ function validateTransaction(transaction, acceptPayActions, authorizePaymentActi
47
47
  // authorizeMovieTicketActions.forEach((a) => {
48
48
  // authorizedMovieTickets.push(...(Array.isArray(a.object.movieTickets)) ? a.object.movieTickets : []);
49
49
  // });
50
- const payTransactionNumbers = authorizeMovieTicketActions.map(({ instrument }) => instrument.transactionNumber);
50
+ // 決済承認アクションのinstrument依存をobject依存へ変更(2025-12-14~)
51
+ const payTransactionNumbers = authorizeMovieTicketActions.map((authorizeAction) => authorizeAction.object.paymentMethodId);
52
+ // const payTransactionNumbers = authorizeMovieTicketActions.map(({ instrument }) => instrument.transactionNumber);
51
53
  payTransactions.filter(({ object }) => payTransactionNumbers.includes(object.paymentMethodId))
52
54
  .forEach(({ object }) => {
53
55
  if (Array.isArray(object.paymentMethod.movieTickets)) {
@@ -106,7 +106,9 @@ function confirm(params, options) {
106
106
  .filter(({ serialNumber }) => typeof serialNumber === 'string' && serialNumbers.includes(serialNumber));
107
107
  // authorizePaymentActionsからpayTransactionsを参照(2024-06-20~)
108
108
  let payTransactions = [];
109
- const payTransactionNumbers = authorizePaymentActions.map(({ instrument }) => instrument.transactionNumber);
109
+ // 決済承認アクションのinstrument依存をobject依存へ変更(2025-12-14~)
110
+ const payTransactionNumbers = authorizePaymentActions.map((authorizeAction) => authorizeAction.object.paymentMethodId);
111
+ // const payTransactionNumbers = authorizePaymentActions.map(({ instrument }) => instrument.transactionNumber);
110
112
  if (payTransactionNumbers.length > 0) {
111
113
  payTransactions = yield repos.assetTransaction.search({
112
114
  typeOf: factory.assetTransactionType.Pay,
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "dependencies": {
12
12
  "@aws-sdk/client-cognito-identity-provider": "3.600.0",
13
13
  "@aws-sdk/credential-providers": "3.600.0",
14
- "@chevre/factory": "5.4.0-alpha.3",
14
+ "@chevre/factory": "5.4.0-alpha.9",
15
15
  "@cinerino/sdk": "12.12.1",
16
16
  "@motionpicture/coa-service": "9.6.0",
17
17
  "@motionpicture/gmo-service": "5.4.0-alpha.1",
@@ -115,5 +115,5 @@
115
115
  "postversion": "git push origin --tags",
116
116
  "prepublishOnly": "npm run clean && npm run build && npm test && npm run doc"
117
117
  },
118
- "version": "23.2.0-alpha.0"
118
+ "version": "23.2.0-alpha.10"
119
119
  }