@chevre/domain 21.25.0-alpha.2 → 21.25.0-alpha.3

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.
@@ -0,0 +1,80 @@
1
+ // tslint:disable:no-console
2
+ import * as mongoose from 'mongoose';
3
+
4
+ import { chevre } from '../../../lib/index';
5
+
6
+ // const project = { id: String(process.env.PROJECT_ID) };
7
+
8
+ // tslint:disable-next-line:max-func-body-length
9
+ async function main() {
10
+ await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });
11
+
12
+ const ownershipInfoRepo = await chevre.repository.OwnershipInfo.createInstance(mongoose.connection);
13
+
14
+ const cursor = ownershipInfoRepo.getCursor(
15
+ {
16
+ 'ownedBy.typeOf': { $eq: chevre.factory.creativeWorkType.WebApplication }
17
+ },
18
+ {
19
+ }
20
+ );
21
+ console.log('infos found');
22
+
23
+ let i = 0;
24
+ let updateCount = 0;
25
+ await cursor.eachAsync(async (doc) => {
26
+ i += 1;
27
+ const ownershipInfo: Pick<
28
+ chevre.factory.ownershipInfo.IOwnershipInfo<chevre.factory.ownershipInfo.IGood>,
29
+ 'id' | 'project' | 'identifier' | 'ownedBy' | 'ownedFrom' | 'ownedThrough'
30
+ > = doc.toObject();
31
+
32
+ let noNeedToDelete = true;
33
+ let ownedById: string | undefined;
34
+ let ownedByTypeOf: string;
35
+ if (Array.isArray(ownershipInfo.ownedBy)) {
36
+ ownedByTypeOf = ownershipInfo.ownedBy[0].typeOf;
37
+ if (ownershipInfo.ownedBy.every(({ typeOf }) => typeOf === chevre.factory.creativeWorkType.WebApplication)) {
38
+ noNeedToDelete = false;
39
+ ownedById = ownershipInfo.ownedBy[0].id;
40
+ }
41
+ } else {
42
+ ownedByTypeOf = ownershipInfo.ownedBy.typeOf;
43
+ if (ownershipInfo.ownedBy.typeOf === chevre.factory.creativeWorkType.WebApplication) {
44
+ noNeedToDelete = false;
45
+ ownedById = ownershipInfo.ownedBy.id;
46
+ }
47
+ }
48
+
49
+ if (noNeedToDelete) {
50
+ console.log(
51
+ 'noNeedToDelete.',
52
+ ownershipInfo.project.id, ownershipInfo.identifier, ownershipInfo.id, ownedByTypeOf, ownershipInfo.ownedFrom,
53
+ i, updateCount);
54
+ } else {
55
+ console.log(
56
+ 'deleting...',
57
+ ownershipInfo.project.id, ownershipInfo.identifier, ownershipInfo.id, ownedByTypeOf, ownershipInfo.ownedFrom,
58
+ i, updateCount);
59
+ if (typeof ownedById === 'string') {
60
+ await ownershipInfoRepo.deleteByIdAndOwnedById({
61
+ project: { id: ownershipInfo.project.id },
62
+ id: ownershipInfo.id,
63
+ ownedBy: { id: ownedById }
64
+ });
65
+ }
66
+ updateCount += 1;
67
+ console.log(
68
+ 'deleted.',
69
+ ownershipInfo.project.id, ownershipInfo.identifier, ownershipInfo.id, ownedByTypeOf, ownershipInfo.ownedFrom,
70
+ i, updateCount);
71
+ }
72
+ });
73
+
74
+ console.log(i, 'infos checked');
75
+ console.log(updateCount, 'infos updated');
76
+ }
77
+
78
+ main()
79
+ .then()
80
+ .catch(console.error);
@@ -10,11 +10,14 @@ type IOrderInTransaction = Pick<factory.order.IOrder, 'orderNumber' | 'project'>
10
10
  export declare class MongoRepository {
11
11
  private readonly orderModel;
12
12
  constructor(connection: Connection);
13
- searchByOrderNumber(params: {
13
+ /**
14
+ * 取引進行中の注文からacceptedOffersを検索する
15
+ */
16
+ findAcceptedOffersByOrderNumber(params: {
14
17
  orderNumber: {
15
18
  $eq: string;
16
19
  };
17
- }): Promise<IOrderInTransaction[]>;
20
+ }): Promise<factory.order.IAcceptedOffer<factory.order.IItemOffered>[]>;
18
21
  /**
19
22
  * 注文を受注する
20
23
  */
@@ -32,15 +32,21 @@ class MongoRepository {
32
32
  constructor(connection) {
33
33
  this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)());
34
34
  }
35
- searchByOrderNumber(params) {
35
+ /**
36
+ * 取引進行中の注文からacceptedOffersを検索する
37
+ */
38
+ findAcceptedOffersByOrderNumber(params) {
36
39
  return __awaiter(this, void 0, void 0, function* () {
37
- // typeOf:PlaceOrderのドキュメントが存在すれば、typeOf:Orderに変更する
38
- return this.orderModel.find({
40
+ const doc = yield this.orderModel.findOne({
39
41
  orderNumber: { $eq: params.orderNumber.$eq },
40
42
  typeOf: { $eq: factory.transactionType.PlaceOrder }
41
- })
42
- .exec()
43
- .then((docs) => docs.map((doc) => doc.toObject()));
43
+ }, { acceptedOffers: 1 })
44
+ .lean()
45
+ .exec();
46
+ if (doc === null) {
47
+ throw new factory.errors.NotFound('orderInTransaction');
48
+ }
49
+ return doc.acceptedOffers;
44
50
  });
45
51
  }
46
52
  /**
@@ -13,6 +13,15 @@ export declare function createActionAttributes(params: {
13
13
  transaction: factory.transaction.ITransaction<factory.transactionType.PlaceOrder>;
14
14
  transactionNumber: string;
15
15
  }): factory.action.authorize.offer.product.IAttributes;
16
+ type IResultAcceptedOffer = factory.action.authorize.offer.product.IResultAcceptedOffer;
17
+ export declare function responseBody2resultAcceptedOffer(params: {
18
+ project: {
19
+ id: string;
20
+ typeOf: factory.organizationType.Project;
21
+ };
22
+ responseBody: factory.assetTransaction.registerService.ITransaction;
23
+ acceptedOffer: factory.action.authorize.offer.product.IObject;
24
+ }): IResultAcceptedOffer;
16
25
  export declare function createResult(params: {
17
26
  project: {
18
27
  id: string;
@@ -22,3 +31,4 @@ export declare function createResult(params: {
22
31
  responseBody: factory.assetTransaction.registerService.ITransaction;
23
32
  acceptedOffer: factory.action.authorize.offer.product.IObject;
24
33
  }): factory.action.authorize.offer.product.IResult;
34
+ export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createResult = exports.createActionAttributes = exports.createRegisterServiceStartParams = void 0;
3
+ exports.createResult = exports.responseBody2resultAcceptedOffer = exports.createActionAttributes = exports.createRegisterServiceStartParams = void 0;
4
4
  const moment = require("moment");
5
5
  const factory = require("../../../factory");
6
6
  function createRegisterServiceStartParams(params) {
@@ -150,6 +150,7 @@ function responseBody2resultAcceptedOffer(params) {
150
150
  }
151
151
  return acceptedOffers;
152
152
  }
153
+ exports.responseBody2resultAcceptedOffer = responseBody2resultAcceptedOffer;
153
154
  function createResult(params) {
154
155
  const acceptedOffers4result = responseBody2resultAcceptedOffer(params);
155
156
  // 金額計算
@@ -147,11 +147,12 @@ function authorize(params) {
147
147
  });
148
148
  requestBody = startParams;
149
149
  responseBody = yield RegisterServiceTransaction.start(startParams)(repos);
150
+ const acceptedOffers4result = (0, factory_1.responseBody2resultAcceptedOffer)({ project: action.project, responseBody, acceptedOffer });
150
151
  result = (0, factory_1.createResult)({ project: action.project, requestBody, responseBody, acceptedOffer });
151
152
  yield (0, any_1.acceptOffer)({
152
153
  project: transaction.project,
153
154
  purpose: { id: transaction.id },
154
- acceptedOffers: result.acceptedOffers
155
+ acceptedOffers: acceptedOffers4result
155
156
  })(repos);
156
157
  }
157
158
  catch (error) {
@@ -2,6 +2,7 @@ import type { MongoRepository as ActionRepo } from '../../../repo/action';
2
2
  import type { MongoRepository as CodeRepo } from '../../../repo/code';
3
3
  import type { RedisRepository as ConfirmationNumberRepo } from '../../../repo/confirmationNumber';
4
4
  import type { MongoRepository as EmailMessageRepo } from '../../../repo/emailMessage';
5
+ import type { MongoRepository as OrderInTransactionRepo } from '../../../repo/orderInTransaction';
5
6
  import type { RedisRepository as OrderNumberRepo } from '../../../repo/orderNumber';
6
7
  import type { MongoRepository as ProjectRepo } from '../../../repo/project';
7
8
  import type { MongoRepository as TransactionRepo } from '../../../repo/transaction';
@@ -13,6 +14,7 @@ interface IConfirmOperationRepos {
13
14
  emailMessage?: EmailMessageRepo;
14
15
  project: ProjectRepo;
15
16
  transaction: TransactionRepo;
17
+ orderInTransaction: OrderInTransactionRepo;
16
18
  orderNumber: OrderNumberRepo;
17
19
  confirmationNumber: ConfirmationNumberRepo;
18
20
  }
@@ -8,22 +8,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- var __rest = (this && this.__rest) || function (s, e) {
12
- var t = {};
13
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
- t[p] = s[p];
15
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
- t[p[i]] = s[p[i]];
19
- }
20
- return t;
21
- };
22
11
  Object.defineProperty(exports, "__esModule", { value: true });
23
12
  exports.confirm = void 0;
24
13
  const moment = require("moment");
25
14
  const errorHandler_1 = require("../../../errorHandler");
26
15
  const factory = require("../../../factory");
16
+ const availableProductTypes_1 = require("../../../factory/availableProductTypes");
27
17
  const potentialActions_1 = require("./potentialActions");
28
18
  const publishCode_1 = require("./publishCode");
29
19
  const publishConfirmationNumberIfNotExist_1 = require("./publishConfirmationNumberIfNotExist");
@@ -78,7 +68,10 @@ function confirm(params) {
78
68
  expiresInSeconds: publishCodeExpiresInSeconds
79
69
  })(repos);
80
70
  }
81
- const { result, eventId, reservationIds } = createResult(Object.assign(Object.assign({}, params), { orderNumber, transaction: transaction, authorizeActions: completedAuthorizeActions, code }));
71
+ // const acceptedOffers = await repos.orderInTransaction.findAcceptedOffersByOrderNumber({ orderNumber: { $eq: orderNumber } });
72
+ const { acceptedOffers } = dissolveAuthorizeActions(completedAuthorizeActions);
73
+ const { result, eventId, reservationIds } = createResult(Object.assign(Object.assign({}, params), { orderNumber, transaction: transaction, authorizeActions: completedAuthorizeActions, code,
74
+ acceptedOffers }));
82
75
  // デフォルトEメールメッセージを検索
83
76
  let emailMessageOnOrderSent;
84
77
  if (repos.emailMessage !== undefined) {
@@ -125,7 +118,52 @@ function confirm(params) {
125
118
  });
126
119
  }
127
120
  exports.confirm = confirm;
128
- function createReservationIdsResult(order) {
121
+ function dissolveAuthorizeActions(completedAuthorizeActions) {
122
+ const authorizeEventServiceOfferActions = completedAuthorizeActions
123
+ .filter((a) => (!Array.isArray(a.object))
124
+ && a.object.typeOf === factory.action.authorize.offer.eventService.ObjectType.SeatReservation);
125
+ const authorizeProductOfferActions = completedAuthorizeActions
126
+ .filter((a) => Array.isArray(a.object)
127
+ && a.object.length > 0
128
+ && a.object.every(({ typeOf }) => typeOf === factory.offerType.Offer)
129
+ && a.object.every(({ itemOffered }) => availableProductTypes_1.availableProductTypes.indexOf(itemOffered.typeOf) >= 0));
130
+ const authorizeMoneyTansferActions = completedAuthorizeActions
131
+ .filter((a) => {
132
+ var _a;
133
+ return (!Array.isArray(a.object))
134
+ && a.object.typeOf === factory.offerType.Offer
135
+ && ((_a = a.object.itemOffered) === null || _a === void 0 ? void 0 : _a.typeOf) === factory.actionType.MoneyTransfer;
136
+ });
137
+ const acceptedOffers = [];
138
+ authorizeEventServiceOfferActions.forEach((action) => {
139
+ var _a;
140
+ const acceptedOffersByAuthorizeAction = (_a = action.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
141
+ if (Array.isArray(acceptedOffersByAuthorizeAction)) {
142
+ acceptedOffers.push(...acceptedOffersByAuthorizeAction);
143
+ }
144
+ });
145
+ authorizeProductOfferActions.forEach((action) => {
146
+ var _a;
147
+ const acceptedOffersByAuthorizeAction = (_a = action.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
148
+ if (Array.isArray(acceptedOffersByAuthorizeAction)) {
149
+ acceptedOffers.push(...acceptedOffersByAuthorizeAction);
150
+ }
151
+ });
152
+ authorizeMoneyTansferActions.forEach((action) => {
153
+ var _a;
154
+ const acceptedOffersByAuthorizeAction = (_a = action.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
155
+ if (Array.isArray(acceptedOffersByAuthorizeAction)) {
156
+ acceptedOffers.push(...acceptedOffersByAuthorizeAction);
157
+ }
158
+ });
159
+ return {
160
+ acceptedOffers,
161
+ authorizeEventServiceOfferActions,
162
+ authorizeProductOfferActions,
163
+ authorizeMoneyTansferActions
164
+ };
165
+ }
166
+ function createReservationIdsResult(order, acceptedOffers) {
129
167
  var _a;
130
168
  let eventId = '';
131
169
  const reservationIds = [];
@@ -137,8 +175,8 @@ function createReservationIdsResult(order) {
137
175
  // イベントIDが1つのみに対応
138
176
  if (eventIdsByOrder.length === 1) {
139
177
  eventId = eventIdsByOrder[0];
140
- if (Array.isArray(order.acceptedOffers)) {
141
- order.acceptedOffers.forEach((o) => {
178
+ if (Array.isArray(acceptedOffers)) {
179
+ acceptedOffers.forEach((o) => {
142
180
  if (o.itemOffered.typeOf === factory.reservationType.EventReservation
143
181
  || o.itemOffered.typeOf === factory.reservationType.BusReservation) {
144
182
  reservationIds.push(o.itemOffered.id);
@@ -149,10 +187,31 @@ function createReservationIdsResult(order) {
149
187
  }
150
188
  return { eventId, reservationIds };
151
189
  }
190
+ // tslint:disable-next-line:max-func-body-length
152
191
  function createResult(params) {
153
192
  const transaction = params.transaction;
193
+ const eventReservationAcceptedOffers = [];
194
+ const productAcceptedOffers = [];
195
+ const moneyTransferAcceptedOffers = [];
196
+ params.acceptedOffers.forEach((acceptedOffer) => {
197
+ const itemOfferedTypeOf = acceptedOffer.itemOffered.typeOf;
198
+ switch (itemOfferedTypeOf) {
199
+ case factory.reservationType.BusReservation:
200
+ case factory.reservationType.EventReservation:
201
+ eventReservationAcceptedOffers.push(acceptedOffer);
202
+ break;
203
+ case factory.permit.PermitType.Permit:
204
+ productAcceptedOffers.push(acceptedOffer);
205
+ break;
206
+ case factory.actionType.MoneyTransfer:
207
+ moneyTransferAcceptedOffers.push(acceptedOffer);
208
+ break;
209
+ default:
210
+ throw new factory.errors.NotImplemented(`${itemOfferedTypeOf} not implemented`);
211
+ }
212
+ });
154
213
  // 取引の確定条件が全て整っているかどうか確認
155
- (0, validation_1.validateTransaction)(transaction, params.authorizeActions);
214
+ (0, validation_1.validateTransaction)(transaction, params.authorizeActions, eventReservationAcceptedOffers);
156
215
  // 注文作成
157
216
  const order = (0, result_1.createOrder)({
158
217
  orderNumber: params.orderNumber,
@@ -160,7 +219,10 @@ function createResult(params) {
160
219
  orderDate: params.result.order.orderDate,
161
220
  orderStatus: factory.orderStatus.OrderPaymentDue,
162
221
  isGift: false,
163
- authorizeActions: params.authorizeActions
222
+ authorizeActions: params.authorizeActions,
223
+ eventReservationAcceptedOffers,
224
+ productAcceptedOffers,
225
+ moneyTransferAcceptedOffers
164
226
  });
165
227
  (0, validation_1.validateEventOffers)({
166
228
  transaction: transaction,
@@ -170,7 +232,8 @@ function createResult(params) {
170
232
  // 注文オファー検証
171
233
  (0, validation_1.validateNumItems)({
172
234
  order: order,
173
- result: params.result
235
+ result: params.result,
236
+ acceptedOffers: params.acceptedOffers
174
237
  });
175
238
  // 注文アイテム検証(2024-01-20~)
176
239
  (0, validation_1.validateOrderedItem)({
@@ -188,19 +251,20 @@ function createResult(params) {
188
251
  order.identifier = identifier;
189
252
  order.url = url;
190
253
  const authorizeActions = params.authorizeActions.map(({ id }) => ({ id }));
191
- const { acceptedOffers } = order, orderWithoutAcceptedOffers = __rest(order, ["acceptedOffers"]);
192
- const orderAsResult = orderWithoutAcceptedOffers;
254
+ // const { acceptedOffers, ...orderWithoutAcceptedOffers } = order;
255
+ // const orderAsResult: factory.transaction.placeOrder.IOrderAsResult = order;
193
256
  let eventId;
194
257
  let reservationIds;
195
258
  if (params.options.expectsReservationIds) {
196
259
  // ttts対応として予約IDリストとイベントIDを返却
197
- const reservationIdsResult = createReservationIdsResult(order);
260
+ const reservationIdsResult = createReservationIdsResult(order, params.acceptedOffers);
198
261
  eventId = reservationIdsResult.eventId;
199
262
  reservationIds = reservationIdsResult.reservationIds;
200
263
  }
201
264
  return {
202
- orderWithAcceptedOffers: order,
203
- result: Object.assign({ order: orderAsResult, authorizeActions, numAcceptedOffers: order.acceptedOffers.length, options: {
265
+ // orderWithAcceptedOffers: order,
266
+ result: Object.assign({ order,
267
+ authorizeActions, numAcceptedOffers: params.acceptedOffers.length, options: {
204
268
  ignoreAccpetedOffersFromResult: true
205
269
  } }, (typeof params.code === 'string') ? { code: params.code } : undefined),
206
270
  eventId,
@@ -2,24 +2,17 @@ import * as factory from '../../../../factory';
2
2
  export type IAuthorizeMoneyTransferOffer = factory.action.authorize.offer.moneyTransfer.IAction;
3
3
  export type IAuthorizeSeatReservationOffer = factory.action.authorize.offer.eventService.IAction<factory.service.webAPI.Identifier>;
4
4
  export declare function createReservationAcceptedOffers(params: {
5
- transaction: factory.transaction.placeOrder.ITransaction;
6
- authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[];
5
+ eventReservationAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[];
7
6
  }): {
8
- reservationAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[];
9
7
  reservationOrderItems: factory.order.IOrderedItem[];
10
8
  };
11
9
  export declare function createProductItems(params: {
12
- transaction: factory.transaction.placeOrder.ITransaction;
13
- authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[];
14
- }): {
15
10
  productAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IPermit>[];
11
+ }): {
16
12
  productOrderItems: factory.order.IOrderedItem[];
17
13
  };
18
- export declare function createMoneyTransferAcceptedOffers(params: {
19
- transaction: factory.transaction.placeOrder.ITransaction;
20
- seller: factory.order.ISeller;
21
- authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[];
22
- }): {
14
+ export declare function createMoneyTransferAcceptedOffers(__: {
23
15
  moneyTransferAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IMoneyTransfer>[];
16
+ }): {
24
17
  moneyTransferOrderItems: factory.order.IOrderedItem[];
25
18
  };
@@ -2,35 +2,36 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createMoneyTransferAcceptedOffers = exports.createProductItems = exports.createReservationAcceptedOffers = void 0;
4
4
  const factory = require("../../../../factory");
5
- const availableProductTypes_1 = require("../../../../factory/availableProductTypes");
6
5
  function createReservationAcceptedOffers(params) {
7
- const acceptedOffers = [];
6
+ // const acceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[] = [];
8
7
  const orderedItems = [];
9
8
  // 座席予約に対する承認アクション取り出す
10
- const seatReservationAuthorizeActions = params.authorizeActions
11
- .filter((a) => a.object.typeOf === factory.action.authorize.offer.eventService.ObjectType.SeatReservation);
9
+ // const seatReservationAuthorizeActions = <IAuthorizeSeatReservationOffer[]>params.authorizeActions
10
+ // .filter((a) => a.object.typeOf === factory.action.authorize.offer.eventService.ObjectType.SeatReservation);
12
11
  const eventIds = [];
13
- seatReservationAuthorizeActions.forEach((authorizeSeatReservationAction) => {
14
- var _a;
15
- const resultAcceptedOffers = (_a = authorizeSeatReservationAction.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
16
- if (Array.isArray(resultAcceptedOffers) && resultAcceptedOffers.length > 0) {
17
- acceptedOffers.push(...resultAcceptedOffers);
18
- // プロダクトIDで最適化する
19
- const reservationFor = resultAcceptedOffers[0].itemOffered.reservationFor;
20
- const issuedThrough = resultAcceptedOffers[0].itemOffered.issuedThrough;
21
- if (typeof (issuedThrough === null || issuedThrough === void 0 ? void 0 : issuedThrough.typeOf) === 'string') {
22
- if (!eventIds.includes(String(reservationFor.id))) {
23
- eventIds.push(String(reservationFor.id));
24
- const orderedItem = reservationOffers2orderedItem({ reservationFor, issuedThrough });
25
- orderedItems.push({
26
- typeOf: 'OrderItem',
27
- orderedItem
28
- });
29
- }
12
+ // seatReservationAuthorizeActions.forEach((authorizeSeatReservationAction) => {
13
+ // const resultAcceptedOffers = authorizeSeatReservationAction.result?.acceptedOffers;
14
+ // });
15
+ if (Array.isArray(params.eventReservationAcceptedOffers) && params.eventReservationAcceptedOffers.length > 0) {
16
+ // acceptedOffers.push(...resultAcceptedOffers);
17
+ // プロダクトIDで最適化する
18
+ const reservationFor = params.eventReservationAcceptedOffers[0].itemOffered.reservationFor;
19
+ const issuedThrough = params.eventReservationAcceptedOffers[0].itemOffered.issuedThrough;
20
+ if (typeof (issuedThrough === null || issuedThrough === void 0 ? void 0 : issuedThrough.typeOf) === 'string') {
21
+ if (!eventIds.includes(String(reservationFor.id))) {
22
+ eventIds.push(String(reservationFor.id));
23
+ const orderedItem = reservationOffers2orderedItem({ reservationFor, issuedThrough });
24
+ orderedItems.push({
25
+ typeOf: 'OrderItem',
26
+ orderedItem
27
+ });
30
28
  }
31
29
  }
32
- });
33
- return { reservationAcceptedOffers: acceptedOffers, reservationOrderItems: orderedItems };
30
+ }
31
+ return {
32
+ // reservationAcceptedOffers: acceptedOffers,
33
+ reservationOrderItems: orderedItems
34
+ };
34
35
  }
35
36
  exports.createReservationAcceptedOffers = createReservationAcceptedOffers;
36
37
  function reservationOffers2orderedItem(params) {
@@ -82,85 +83,61 @@ function reservationOffers2orderedItem(params) {
82
83
  }
83
84
  }
84
85
  function createProductItems(params) {
85
- const acceptedOffers = [];
86
+ var _a;
87
+ // const acceptedOffers: factory.order.IAcceptedOffer<factory.order.IPermit>[] = [];
86
88
  const orderedItems = [];
87
- const authorizePaymentCardOfferActions = params.authorizeActions
88
- .filter((a) => Array.isArray(a.object)
89
- && a.object.length > 0
90
- && a.object[0].typeOf === factory.offerType.Offer
91
- && availableProductTypes_1.availableProductTypes.indexOf(a.object[0].itemOffered.typeOf) >= 0);
89
+ // const authorizePaymentCardOfferActions = (<factory.action.authorize.offer.product.IAction[]>params.authorizeActions)
90
+ // .filter((a) =>
91
+ // Array.isArray(a.object)
92
+ // && a.object.length > 0
93
+ // && a.object[0].typeOf === factory.offerType.Offer
94
+ // && availableProductTypes.indexOf(a.object[0].itemOffered.typeOf) >= 0
95
+ // );
92
96
  const productIds = [];
93
- authorizePaymentCardOfferActions.forEach((a) => {
94
- var _a, _b;
95
- const resultAcceptedOffers = (_a = a.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
96
- if (Array.isArray(resultAcceptedOffers) && resultAcceptedOffers.length > 0) {
97
- acceptedOffers.push(...resultAcceptedOffers);
98
- // プロダクトIDで最適化する
99
- const issuedThrough = resultAcceptedOffers[0].itemOffered.issuedThrough;
100
- if (typeof (issuedThrough === null || issuedThrough === void 0 ? void 0 : issuedThrough.id) === 'string') {
101
- if (!productIds.includes(issuedThrough.id)) {
102
- productIds.push(issuedThrough.id);
103
- orderedItems.push({
104
- typeOf: 'OrderItem',
105
- orderedItem: Object.assign({ id: String(issuedThrough.id), typeOf: issuedThrough.typeOf }, (typeof ((_b = issuedThrough.serviceType) === null || _b === void 0 ? void 0 : _b.typeOf) === 'string')
106
- ? { serviceType: issuedThrough.serviceType }
107
- : undefined)
108
- });
109
- }
97
+ // authorizePaymentCardOfferActions.forEach((a) => {
98
+ // const resultAcceptedOffers = a.result?.acceptedOffers;
99
+ // });
100
+ if (Array.isArray(params.productAcceptedOffers) && params.productAcceptedOffers.length > 0) {
101
+ // acceptedOffers.push(...resultAcceptedOffers);
102
+ // プロダクトIDで最適化する
103
+ const issuedThrough = params.productAcceptedOffers[0].itemOffered.issuedThrough;
104
+ if (typeof (issuedThrough === null || issuedThrough === void 0 ? void 0 : issuedThrough.id) === 'string') {
105
+ if (!productIds.includes(issuedThrough.id)) {
106
+ productIds.push(issuedThrough.id);
107
+ orderedItems.push({
108
+ typeOf: 'OrderItem',
109
+ orderedItem: Object.assign({ id: String(issuedThrough.id), typeOf: issuedThrough.typeOf }, (typeof ((_a = issuedThrough.serviceType) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string')
110
+ ? { serviceType: issuedThrough.serviceType }
111
+ : undefined)
112
+ });
110
113
  }
111
114
  }
112
- });
113
- return { productAcceptedOffers: acceptedOffers, productOrderItems: orderedItems };
115
+ }
116
+ return {
117
+ // productAcceptedOffers: acceptedOffers,
118
+ productOrderItems: orderedItems
119
+ };
114
120
  }
115
121
  exports.createProductItems = createProductItems;
116
- function createMoneyTransferAcceptedOffers(params) {
122
+ function createMoneyTransferAcceptedOffers(__) {
117
123
  // 通貨転送承認アクション
118
- const authorizeMoneyTansferActions = params.authorizeActions
119
- .filter((a) => a.object.typeOf === factory.offerType.Offer)
120
- .filter((a) => { var _a; return ((_a = a.object.itemOffered) === null || _a === void 0 ? void 0 : _a.typeOf) === factory.actionType.MoneyTransfer; });
121
- const acceptedOffers = [];
124
+ // const authorizeMoneyTansferActions = (<IAuthorizeMoneyTransferOffer[]>params.authorizeActions)
125
+ // .filter((a) => a.object.typeOf === factory.offerType.Offer)
126
+ // .filter((a) => a.object.itemOffered?.typeOf === factory.actionType.MoneyTransfer);
127
+ // const acceptedOffers: factory.order.IAcceptedOffer<factory.order.IMoneyTransfer>[] = [];
122
128
  const orderedItems = [];
123
- authorizeMoneyTansferActions.forEach((authorizeMoneyTansferAction) => {
124
- var _a;
125
- if (authorizeMoneyTansferAction.result === undefined) {
126
- throw new factory.errors.Argument('Transaction', 'authorize money transfer offer result does not exist');
127
- }
128
- const resultAcceptedOffers = (_a = authorizeMoneyTansferAction.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
129
- if (Array.isArray(resultAcceptedOffers) && resultAcceptedOffers.length > 0) {
130
- acceptedOffers.push(...resultAcceptedOffers);
131
- }
132
- // const pendingTransaction = authorizeMoneyTansferAction.result.responseBody;
133
- // if (pendingTransaction !== undefined) {
134
- // const amountValue = pendingTransaction.object.amount.value;
135
- // const currency = pendingTransaction.object.amount.currency;
136
- // const itemOffered: factory.order.IMoneyTransfer = {
137
- // typeOf: factory.actionType.MoneyTransfer,
138
- // amount: {
139
- // typeOf: 'MonetaryAmount',
140
- // value: amountValue,
141
- // currency
142
- // },
143
- // toLocation: {
144
- // typeOf: authorizeMoneyTansferAction.object.itemOffered.toLocation.typeOf,
145
- // // いったんマスク
146
- // identifier: 'xxx',
147
- // issuedThrough: { id: authorizeMoneyTansferAction.object.itemOffered.toLocation.issuedThrough?.id }
148
- // },
149
- // object: {
150
- // pendingTransaction: {
151
- // typeOf: pendingTransaction.typeOf,
152
- // // MonetaryAmountの識別子として、MoneyTransfer取引番号をセットする
153
- // transactionNumber: String(pendingTransaction.transactionNumber)
154
- // }
155
- // },
156
- // name: `${amountValue} ${currency}`
157
- // };
158
- // acceptedOffers.push({
159
- // typeOf: factory.offerType.Offer,
160
- // itemOffered
161
- // });
162
- // }
163
- });
164
- return { moneyTransferAcceptedOffers: acceptedOffers, moneyTransferOrderItems: orderedItems };
129
+ // authorizeMoneyTansferActions.forEach((authorizeMoneyTansferAction) => {
130
+ // if (authorizeMoneyTansferAction.result === undefined) {
131
+ // throw new factory.errors.Argument('Transaction', 'authorize money transfer offer result does not exist');
132
+ // }
133
+ // const resultAcceptedOffers = authorizeMoneyTansferAction.result?.acceptedOffers;
134
+ // if (Array.isArray(resultAcceptedOffers) && resultAcceptedOffers.length > 0) {
135
+ // acceptedOffers.push(...resultAcceptedOffers);
136
+ // }
137
+ // });
138
+ return {
139
+ // moneyTransferAcceptedOffers: acceptedOffers,
140
+ moneyTransferOrderItems: orderedItems
141
+ };
165
142
  }
166
143
  exports.createMoneyTransferAcceptedOffers = createMoneyTransferAcceptedOffers;
@@ -10,6 +10,7 @@ export declare function createOrder(params: {
10
10
  orderStatus: factory.orderStatus;
11
11
  isGift: boolean;
12
12
  authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[];
13
- }): factory.transaction.placeOrder.IOrderAsResult & {
14
- acceptedOffers: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
15
- };
13
+ eventReservationAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[];
14
+ productAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IPermit>[];
15
+ moneyTransferAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IMoneyTransfer>[];
16
+ }): factory.transaction.placeOrder.IOrderAsResult & {};
@@ -11,23 +11,28 @@ function createOrder(params) {
11
11
  const seller = createSeller({ transaction: params.transaction });
12
12
  const customer = createCustomer({ transaction: params.transaction });
13
13
  // 予約がある場合
14
- const { reservationAcceptedOffers, reservationOrderItems } = (0, acceptedOffers_1.createReservationAcceptedOffers)(params);
14
+ // const { reservationAcceptedOffers, reservationOrderItems } = createReservationAcceptedOffers(params);
15
+ const { reservationOrderItems } = (0, acceptedOffers_1.createReservationAcceptedOffers)(params);
15
16
  // 通貨転送がある場合
16
- const { moneyTransferAcceptedOffers, moneyTransferOrderItems } = (0, acceptedOffers_1.createMoneyTransferAcceptedOffers)(Object.assign(Object.assign({}, params), { seller: seller }));
17
+ // const { moneyTransferAcceptedOffers, moneyTransferOrderItems } = createMoneyTransferAcceptedOffers({ ...params, seller: seller });
18
+ const { moneyTransferOrderItems } = (0, acceptedOffers_1.createMoneyTransferAcceptedOffers)(params);
17
19
  // プロダクトがある場合
18
- const { productAcceptedOffers, productOrderItems } = (0, acceptedOffers_1.createProductItems)(params);
19
- const acceptedOffers = [
20
- ...reservationAcceptedOffers,
21
- ...moneyTransferAcceptedOffers,
22
- ...productAcceptedOffers
23
- ];
20
+ // const { productAcceptedOffers, productOrderItems } = createProductItems(params);
21
+ const { productOrderItems } = (0, acceptedOffers_1.createProductItems)(params);
22
+ // const acceptedOffers: factory.order.IAcceptedOffer<factory.order.IItemOffered>[] = [
23
+ // ...reservationAcceptedOffers,
24
+ // ...moneyTransferAcceptedOffers,
25
+ // ...productAcceptedOffers
26
+ // ];
24
27
  const orderedItems = [...reservationOrderItems, ...moneyTransferOrderItems, ...productOrderItems];
25
28
  // 決済方法をセット
26
29
  const { paymentMethods, price } = createPaymentMethods({ transaction: params.transaction, authorizeActions: params.authorizeActions });
27
30
  const discounts = [];
28
31
  const name = (typeof params.transaction.object.name === 'string') ? params.transaction.object.name : undefined;
29
32
  const broker = (typeof ((_a = params.transaction.object.broker) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string') ? params.transaction.object.broker : undefined;
30
- return Object.assign(Object.assign({ project: params.transaction.project, typeOf: factory.order.OrderType.Order, seller: seller, customer: customer, price: price, priceCurrency: factory.priceCurrency.JPY, paymentMethods: paymentMethods, discounts: discounts, confirmationNumber: '', orderNumber: params.orderNumber, orderedItem: orderedItems, acceptedOffers: acceptedOffers, url: '', orderStatus: params.orderStatus, orderDate: params.orderDate, identifier: [], isGift: params.isGift }, (typeof name === 'string') ? { name } : undefined), (typeof (broker === null || broker === void 0 ? void 0 : broker.typeOf) === 'string') ? { broker } : undefined);
33
+ return Object.assign(Object.assign({ project: params.transaction.project, typeOf: factory.order.OrderType.Order, seller: seller, customer: customer, price: price, priceCurrency: factory.priceCurrency.JPY, paymentMethods: paymentMethods, discounts: discounts, confirmationNumber: '', orderNumber: params.orderNumber, orderedItem: orderedItems,
34
+ // acceptedOffers: acceptedOffers,
35
+ url: '', orderStatus: params.orderStatus, orderDate: params.orderDate, identifier: [], isGift: params.isGift }, (typeof name === 'string') ? { name } : undefined), (typeof (broker === null || broker === void 0 ? void 0 : broker.typeOf) === 'string') ? { broker } : undefined);
31
36
  }
32
37
  exports.createOrder = createOrder;
33
38
  function createSeller(params) {
@@ -1,5 +1,20 @@
1
1
  import * as factory from '../../../../factory';
2
2
  /**
3
- * 座席予約オファー承認に対してムビチケ承認条件が整っているかどうか検証する
3
+ * 興行オファー承認に対して決済承認条件が整っているかどうか検証する
4
+ * 決済方法区分ごとに検証
4
5
  */
5
- export declare function validateMovieTicket(paymentMethodType: string, transaction: factory.transaction.placeOrder.ITransaction, authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[]): void;
6
+ export declare function validateMovieTicket(
7
+ /**
8
+ * 決済方法区分
9
+ */
10
+ paymentMethodType: string, transaction: {
11
+ id: string;
12
+ },
13
+ /**
14
+ * 決済承認アクション
15
+ */
16
+ authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[],
17
+ /**
18
+ * 受け入れられた興行オファー
19
+ */
20
+ eventReservationAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[]): void;
@@ -6,11 +6,25 @@ exports.validateMovieTicket = void 0;
6
6
  */
7
7
  const createDebug = require("debug");
8
8
  const factory = require("../../../../factory");
9
- const debug = createDebug('cinerino-domain:service:validateMovieTicket');
9
+ const debug = createDebug('chevre-domain:service:validateMovieTicket');
10
10
  /**
11
- * 座席予約オファー承認に対してムビチケ承認条件が整っているかどうか検証する
11
+ * 興行オファー承認に対して決済承認条件が整っているかどうか検証する
12
+ * 決済方法区分ごとに検証
12
13
  */
13
- function validateMovieTicket(paymentMethodType, transaction, authorizeActions) {
14
+ // tslint:disable-next-line:max-func-body-length
15
+ function validateMovieTicket(
16
+ /**
17
+ * 決済方法区分
18
+ */
19
+ paymentMethodType, transaction,
20
+ /**
21
+ * 決済承認アクション
22
+ */
23
+ authorizeActions,
24
+ /**
25
+ * 受け入れられた興行オファー
26
+ */
27
+ eventReservationAcceptedOffers) {
14
28
  const authorizeMovieTicketActions = authorizeActions.filter((a) => {
15
29
  var _a, _b;
16
30
  const resultAsInvoice = (Array.isArray(a.result))
@@ -22,11 +36,14 @@ function validateMovieTicket(paymentMethodType, transaction, authorizeActions) {
22
36
  && ((_b = resultAsInvoice === null || resultAsInvoice === void 0 ? void 0 : resultAsInvoice.paymentMethodAsObject) === null || _b === void 0 ? void 0 : _b.typeOf) === paymentMethodType;
23
37
  // && a.result?.paymentMethod === paymentMethodType
24
38
  });
25
- const seatReservationAuthorizeActions = authorizeActions.filter((a) => a.object.typeOf === factory.action.authorize.offer.eventService.ObjectType.SeatReservation);
39
+ // const seatReservationAuthorizeActions = (<IAuthorizeSeatReservationOffer[]>authorizeActions).filter(
40
+ // (a) => a.object.typeOf === factory.action.authorize.offer.eventService.ObjectType.SeatReservation
41
+ // );
26
42
  // 予約によって必要とされるMovieTicket
27
43
  const requiredMovieTickets = authorizeSeatReservationActions2requiredMovieTickets({
28
44
  paymentMethodType,
29
- seatReservationAuthorizeActions
45
+ // seatReservationAuthorizeActions
46
+ acceptedOffers: eventReservationAcceptedOffers
30
47
  });
31
48
  debug(requiredMovieTickets.length, 'movie tickets required', 'transaction:', transaction.id);
32
49
  const authorizedMovieTickets = [];
@@ -105,76 +122,71 @@ function validateAppliesToMovieTicketIdentifiers(params) {
105
122
  }
106
123
  });
107
124
  }
108
- // tslint:disable-next-line:max-func-body-length
125
+ /**
126
+ * 予約オファーリストから必要なmovieTicketsを生成する
127
+ */
109
128
  function authorizeSeatReservationActions2requiredMovieTickets(params) {
110
129
  const paymentMethodType = params.paymentMethodType;
111
- const seatReservationAuthorizeActions = params.seatReservationAuthorizeActions;
130
+ // const seatReservationAuthorizeActions = params.seatReservationAuthorizeActions;
112
131
  // ムビチケオファーを受け付けた座席予約を検索する
113
132
  const requiredMovieTickets = [];
114
133
  // tslint:disable-next-line:max-func-body-length
115
- seatReservationAuthorizeActions.forEach((action) => {
116
- var _a;
117
- const event = action.object.event;
118
- // ↓実際ありえないフロー
119
- if (event === undefined || event === null) {
120
- throw new factory.errors.ServiceUnavailable('Authorized event undefined');
121
- }
122
- // a.objectではなくa.resultを使用する(2022-06-04~)
123
- // 予約の複数適用決済カードに対応する(2022-07-28~)
124
- const acceptedOffers = (_a = action.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
125
- if (Array.isArray(acceptedOffers)) {
126
- acceptedOffers.forEach((offer) => {
127
- var _a, _b, _c, _d, _e;
128
- let offeredTicketedSeat;
129
- const acceptedTicketedSeatByItemOffered = (_b = (_a = offer.itemOffered) === null || _a === void 0 ? void 0 : _a.reservedTicket) === null || _b === void 0 ? void 0 : _b.ticketedSeat;
130
- if (typeof (acceptedTicketedSeatByItemOffered === null || acceptedTicketedSeatByItemOffered === void 0 ? void 0 : acceptedTicketedSeatByItemOffered.typeOf) === 'string') {
131
- offeredTicketedSeat = acceptedTicketedSeatByItemOffered;
134
+ // seatReservationAuthorizeActions.forEach((action) => {
135
+ // const acceptedOffers = action.result?.acceptedOffers;
136
+ // });
137
+ if (Array.isArray(params.acceptedOffers)) {
138
+ params.acceptedOffers.forEach((offer) => {
139
+ var _a, _b, _c, _d;
140
+ let offeredTicketedSeat;
141
+ const acceptedTicketedSeatByItemOffered = (_b = (_a = offer.itemOffered) === null || _a === void 0 ? void 0 : _a.reservedTicket) === null || _b === void 0 ? void 0 : _b.ticketedSeat;
142
+ if (typeof (acceptedTicketedSeatByItemOffered === null || acceptedTicketedSeatByItemOffered === void 0 ? void 0 : acceptedTicketedSeatByItemOffered.typeOf) === 'string') {
143
+ offeredTicketedSeat = acceptedTicketedSeatByItemOffered;
144
+ }
145
+ if (typeof (offeredTicketedSeat === null || offeredTicketedSeat === void 0 ? void 0 : offeredTicketedSeat.typeOf) === 'string') {
146
+ const ticketedSeat4MovieTicket = offeredTicketedSeat;
147
+ const eventOfferedThroughIdentifier = (_c = offer.offeredThrough) === null || _c === void 0 ? void 0 : _c.identifier;
148
+ if (typeof eventOfferedThroughIdentifier !== 'string') {
149
+ throw new factory.errors.NotFound('offer.offeredThrough.identifier', `offer.offeredThrough.identifier undefined [serialNumber:${offer.serialNumber}]`);
132
150
  }
133
- if (typeof (offeredTicketedSeat === null || offeredTicketedSeat === void 0 ? void 0 : offeredTicketedSeat.typeOf) === 'string') {
134
- const ticketedSeat4MovieTicket = offeredTicketedSeat;
135
- // Chevre or COAでrequiredMovieTicketsの取り出し方が異なる
136
- const eventOfferedThroughIdentifier = (_d = (_c = event.offers) === null || _c === void 0 ? void 0 : _c.offeredThrough) === null || _d === void 0 ? void 0 : _d.identifier;
137
- // シンプルに単価仕様のappliesToMovieTicketを参照してrequiredMovieTicketsを作成する(2022-07-28~)
138
- const unitPriceSpec = (_e = offer.priceSpecification) === null || _e === void 0 ? void 0 : _e.priceComponent.find((component) => {
139
- return component.typeOf === factory.priceSpecificationType.UnitPriceSpecification
140
- && (!Array.isArray(component.appliesToAddOn));
151
+ // シンプルに単価仕様のappliesToMovieTicketを参照してrequiredMovieTicketsを作成する(2022-07-28~)
152
+ const unitPriceSpec = (_d = offer.priceSpecification) === null || _d === void 0 ? void 0 : _d.priceComponent.find((component) => {
153
+ return component.typeOf === factory.priceSpecificationType.UnitPriceSpecification
154
+ && (!Array.isArray(component.appliesToAddOn));
155
+ });
156
+ if (unitPriceSpec === undefined) {
157
+ throw new factory.errors.NotFound('UnitPriceSpecification of acceptedOffer');
158
+ }
159
+ if (offer.itemOffered.reservationFor.typeOf !== factory.eventType.ScreeningEvent) {
160
+ throw new factory.errors.NotImplemented(`offer.itemOffered.reservationFor.typeOf not imelemented [${offer.itemOffered.reservationFor.typeOf}]`);
161
+ }
162
+ const reservationFor4movieTicket = {
163
+ typeOf: offer.itemOffered.reservationFor.typeOf,
164
+ id: offer.itemOffered.reservationFor.id
165
+ // offers: { offeredThrough: { identifier: eventOfferedThroughIdentifier } }
166
+ };
167
+ // 指定された決済方法の適用決済カードリスト
168
+ let appliesToMovieTickets4paymentMethod = [];
169
+ const appliesToMovieTickets4reservation = unitPriceSpec.appliesToMovieTicket;
170
+ if (Array.isArray(appliesToMovieTickets4reservation)) {
171
+ appliesToMovieTickets4paymentMethod = appliesToMovieTickets4reservation.filter((a) => {
172
+ return a.serviceOutput.typeOf === paymentMethodType;
141
173
  });
142
- if (unitPriceSpec === undefined) {
143
- throw new factory.errors.NotFound('UnitPriceSpecification of acceptedOffer');
144
- }
145
- // 指定された決済方法の適用決済カードリスト
146
- let appliesToMovieTickets4paymentMethod = [];
147
- const appliesToMovieTickets4reservation = unitPriceSpec.appliesToMovieTicket;
148
- if (Array.isArray(appliesToMovieTickets4reservation)) {
149
- appliesToMovieTickets4paymentMethod = appliesToMovieTickets4reservation.filter((a) => {
150
- return a.serviceOutput.typeOf === paymentMethodType;
151
- });
152
- // Array以外への考慮自体を廃止(2023-09-01~)
153
- // } else if (typeof appliesToMovieTickets4reservation?.identifier === 'string') {
154
- // // Arrayでない場合を廃止(2022-08-01~)
155
- // throw new factory.errors.NotImplemented('appliesToMovieTickets.typeOf as string not implemented');
156
- }
157
- if (Array.isArray(appliesToMovieTickets4paymentMethod) && appliesToMovieTickets4paymentMethod.length > 0) {
158
- appliesToMovieTickets4paymentMethod.forEach((appliesToMovieTicket) => {
159
- requiredMovieTickets.push({
160
- // project: action.project,
161
- typeOf: paymentMethodType,
162
- identifier: String(appliesToMovieTicket.identifier),
163
- serviceType: appliesToMovieTicket.serviceType,
164
- serviceOutput: {
165
- reservationFor: {
166
- typeOf: event.typeOf,
167
- id: event.id,
168
- offers: { offeredThrough: { identifier: eventOfferedThroughIdentifier } }
169
- },
170
- reservedTicket: { ticketedSeat: ticketedSeat4MovieTicket }
171
- }
172
- });
174
+ }
175
+ if (Array.isArray(appliesToMovieTickets4paymentMethod) && appliesToMovieTickets4paymentMethod.length > 0) {
176
+ appliesToMovieTickets4paymentMethod.forEach((appliesToMovieTicket) => {
177
+ requiredMovieTickets.push({
178
+ typeOf: paymentMethodType,
179
+ identifier: String(appliesToMovieTicket.identifier),
180
+ serviceType: appliesToMovieTicket.serviceType,
181
+ serviceOutput: {
182
+ reservationFor: reservationFor4movieTicket,
183
+ reservedTicket: { ticketedSeat: ticketedSeat4MovieTicket }
184
+ }
173
185
  });
174
- }
186
+ });
175
187
  }
176
- });
177
- }
178
- });
188
+ }
189
+ });
190
+ }
179
191
  return requiredMovieTickets;
180
192
  }
@@ -8,15 +8,14 @@ export type IUnitPriceSpecification = factory.priceSpecification.IPriceSpecifica
8
8
  /**
9
9
  * 取引が確定可能な状態かどうかをチェックする
10
10
  */
11
- export declare function validateTransaction(transaction: factory.transaction.placeOrder.ITransaction, authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[]): void;
11
+ export declare function validateTransaction(transaction: factory.transaction.placeOrder.ITransaction, authorizeActions: factory.action.authorize.IAction<factory.action.authorize.IAttributes<any, any>>[], eventReservationAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[]): void;
12
12
  export type IOrderURLGenerator = (order: factory.order.IOrder) => string;
13
13
  export declare function validateNumItems(params: {
14
- order: factory.transaction.placeOrder.IOrderAsResult & {
15
- acceptedOffers: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
16
- };
14
+ order: factory.transaction.placeOrder.IOrderAsResult;
17
15
  result: {
18
16
  order: PlaceOrderFactory.IResultOrderParams;
19
17
  };
18
+ acceptedOffers: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
20
19
  }): void;
21
20
  export declare function validateOrderedItem(params: {
22
21
  order: factory.transaction.placeOrder.IOrderAsResult;
@@ -12,18 +12,17 @@ const validateMovieTicket_1 = require("./validation/validateMovieTicket");
12
12
  /**
13
13
  * 取引が確定可能な状態かどうかをチェックする
14
14
  */
15
- function validateTransaction(transaction, authorizeActions) {
15
+ function validateTransaction(transaction, authorizeActions, eventReservationAcceptedOffers) {
16
16
  validateProfile(transaction);
17
17
  validatePrice(transaction, authorizeActions);
18
18
  // 利用可能な通貨単位に対して取引検証
19
19
  validateMonetaryAmount(authorizeActions);
20
20
  // 利用可能なMovieTicketIF決済方法タイプに対して動的にコーディング
21
- // 検証すべきMovieTicketIF決済方法タイプのリストは、決済承認アクションのresult.issuedThrough.typeOf: MovieTicketで抽出できるのでは?
22
- const movieTicketPaymentMethodTypes = findMovieTicketPaymentMethodTypesFromTransaction(authorizeActions);
21
+ const movieTicketPaymentMethodTypes = findMovieTicketPaymentMethodTypesFromTransaction(authorizeActions, eventReservationAcceptedOffers);
23
22
  if (Array.isArray(movieTicketPaymentMethodTypes) && movieTicketPaymentMethodTypes.length > 0) {
24
23
  movieTicketPaymentMethodTypes.forEach((paymentMethodType) => {
25
24
  try {
26
- (0, validateMovieTicket_1.validateMovieTicket)(paymentMethodType, transaction, authorizeActions);
25
+ (0, validateMovieTicket_1.validateMovieTicket)(paymentMethodType, { id: transaction.id }, authorizeActions, eventReservationAcceptedOffers);
27
26
  }
28
27
  catch (error) {
29
28
  // 検証結果をlog(2022-06-04~)
@@ -37,7 +36,7 @@ function validateTransaction(transaction, authorizeActions) {
37
36
  validatePaymentUrl(transaction, authorizeActions);
38
37
  }
39
38
  exports.validateTransaction = validateTransaction;
40
- function findMovieTicketPaymentMethodTypesFromTransaction(authorizeActions) {
39
+ function findMovieTicketPaymentMethodTypesFromTransaction(authorizeActions, eventReservationAcceptedOffers) {
41
40
  const authorizeMovieTicketPaymentActions = authorizeActions.filter((a) => {
42
41
  var _a;
43
42
  const resultAsInvoice = (Array.isArray(a.result))
@@ -46,23 +45,23 @@ function findMovieTicketPaymentMethodTypesFromTransaction(authorizeActions) {
46
45
  return (resultAsInvoice === null || resultAsInvoice === void 0 ? void 0 : resultAsInvoice.typeOf) === factory.action.authorize.paymentMethod.any.ResultType.Payment
47
46
  && (resultAsInvoice === null || resultAsInvoice === void 0 ? void 0 : resultAsInvoice.issuedThrough.typeOf) === factory.service.paymentService.PaymentServiceType.MovieTicket;
48
47
  });
49
- const seatReservationAuthorizeActions = authorizeActions.filter((a) => a.object.typeOf === factory.action.authorize.offer.eventService.ObjectType.SeatReservation);
50
- // MovieTicketオファーを受け付けた予約承認から抽出
48
+ // const seatReservationAuthorizeActions = (<IAuthorizeSeatReservationOffer[]>authorizeActions).filter(
49
+ // (a) => a.object.typeOf === factory.action.authorize.offer.eventService.ObjectType.SeatReservation
50
+ // );
51
+ // MovieTicketオファーを受け付けた予約から抽出
51
52
  const requiredMovieTicketPaymentMethodTypes = [];
52
- seatReservationAuthorizeActions.forEach((action) => {
53
+ // seatReservationAuthorizeActions.forEach((action) => {
54
+ // const acceptedOffers = action.result?.acceptedOffers;
55
+ // });
56
+ eventReservationAcceptedOffers.forEach((offer) => {
53
57
  var _a;
54
- // a.objectではなくa.resultを使用する(2022-06-04~)
55
- const acceptedOffers = (_a = action.result) === null || _a === void 0 ? void 0 : _a.acceptedOffers;
56
- acceptedOffers === null || acceptedOffers === void 0 ? void 0 : acceptedOffers.forEach((offer) => {
57
- var _a;
58
- (_a = offer.priceSpecification) === null || _a === void 0 ? void 0 : _a.priceComponent.forEach((component) => {
59
- var _a, _b;
60
- // MovieTicketTypeChargeSpecificationがあれば検証リストに追加
61
- if (component.typeOf === factory.priceSpecificationType.MovieTicketTypeChargeSpecification
62
- && typeof ((_b = (_a = component.appliesToMovieTicket) === null || _a === void 0 ? void 0 : _a.serviceOutput) === null || _b === void 0 ? void 0 : _b.typeOf) === 'string') {
63
- requiredMovieTicketPaymentMethodTypes.push(component.appliesToMovieTicket.serviceOutput.typeOf);
64
- }
65
- });
58
+ (_a = offer.priceSpecification) === null || _a === void 0 ? void 0 : _a.priceComponent.forEach((component) => {
59
+ var _a, _b;
60
+ // MovieTicketTypeChargeSpecificationがあれば検証リストに追加
61
+ if (component.typeOf === factory.priceSpecificationType.MovieTicketTypeChargeSpecification
62
+ && typeof ((_b = (_a = component.appliesToMovieTicket) === null || _a === void 0 ? void 0 : _a.serviceOutput) === null || _b === void 0 ? void 0 : _b.typeOf) === 'string') {
63
+ requiredMovieTicketPaymentMethodTypes.push(component.appliesToMovieTicket.serviceOutput.typeOf);
64
+ }
66
65
  });
67
66
  });
68
67
  const paymentMethodTypes = [
@@ -219,24 +218,24 @@ function validateMonetaryAmount(authorizeActions) {
219
218
  }
220
219
  function validateNumItems(params) {
221
220
  var _a, _b;
222
- if (!Array.isArray(params.order.acceptedOffers)) {
221
+ if (!Array.isArray(params.acceptedOffers)) {
223
222
  throw new factory.errors.Argument('order.acceptedOffers', 'must be array');
224
223
  }
225
224
  // 注文アイテム数制限確認
226
225
  const numItemsMaxValue = (_a = params.result.order.numItems) === null || _a === void 0 ? void 0 : _a.maxValue;
227
226
  const numItemsMinValue = (_b = params.result.order.numItems) === null || _b === void 0 ? void 0 : _b.minValue;
228
227
  if (typeof numItemsMaxValue === 'number') {
229
- if (params.order.acceptedOffers.length > numItemsMaxValue) {
228
+ if (params.acceptedOffers.length > numItemsMaxValue) {
230
229
  throw new factory.errors.Argument('Transaction', (0, util_1.format)('Number of order items must be less than or equal to %s', numItemsMaxValue));
231
230
  }
232
231
  }
233
232
  if (typeof numItemsMinValue === 'number') {
234
- if (params.order.acceptedOffers.length < numItemsMinValue) {
233
+ if (params.acceptedOffers.length < numItemsMinValue) {
235
234
  throw new factory.errors.Argument('Transaction', (0, util_1.format)('Number of order items must be more than equal to %s', numItemsMinValue));
236
235
  }
237
236
  }
238
237
  // itemOffered.typeOf数検証(2024-01-31~)
239
- const itemOfferedTypeOfs = [...new Set(params.order.acceptedOffers.map((offer) => offer.itemOffered.typeOf))];
238
+ const itemOfferedTypeOfs = [...new Set(params.acceptedOffers.map((offer) => offer.itemOffered.typeOf))];
240
239
  if (itemOfferedTypeOfs.length > 1) {
241
240
  throw new factory.errors.Argument('Transaction', `different itemOffered.typeOfs contained. [${itemOfferedTypeOfs.join(',')}]`);
242
241
  }
package/package.json CHANGED
@@ -110,5 +110,5 @@
110
110
  "postversion": "git push origin --tags",
111
111
  "prepublishOnly": "npm run clean && npm run build && npm test && npm run doc"
112
112
  },
113
- "version": "21.25.0-alpha.2"
113
+ "version": "21.25.0-alpha.3"
114
114
  }