@chevre/domain 21.29.0-alpha.0 → 21.29.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 (25) hide show
  1. package/example/src/chevre/unsetUnnecessaryFields.ts +8 -7
  2. package/lib/chevre/repo/mongoose/schemas/order.js +2 -14
  3. package/lib/chevre/repo/order.js +1 -1
  4. package/lib/chevre/repo/transaction.d.ts +6 -0
  5. package/lib/chevre/repo/transaction.js +6 -7
  6. package/lib/chevre/service/assetTransaction/reserve/factory.d.ts +4 -0
  7. package/lib/chevre/service/assetTransaction/reserve/factory.js +21 -1
  8. package/lib/chevre/service/assetTransaction/reserve.js +3 -2
  9. package/lib/chevre/service/offer/event/authorize.js +2 -2
  10. package/lib/chevre/service/offer/event/factory.js +4 -2
  11. package/lib/chevre/service/offer/eventServiceByCOA/factory.js +5 -1
  12. package/lib/chevre/service/order/placeOrder.js +3 -1
  13. package/lib/chevre/service/payment/any/factory.js +8 -2
  14. package/lib/chevre/service/reserve/cancelReservation.d.ts +1 -1
  15. package/lib/chevre/service/transaction/placeOrderInProgress/confirm.js +2 -1
  16. package/lib/chevre/service/transaction/placeOrderInProgress/publishConfirmationNumberIfNotExist.d.ts +4 -0
  17. package/lib/chevre/service/transaction/placeOrderInProgress/publishConfirmationNumberIfNotExist.js +9 -4
  18. package/lib/chevre/service/transaction/placeOrderInProgress/result.js +4 -2
  19. package/lib/chevre/service/transaction/placeOrderInProgress/validation/validateMovieTicket.d.ts +3 -3
  20. package/lib/chevre/service/transaction/placeOrderInProgress/validation/validateMovieTicket.js +56 -19
  21. package/lib/chevre/service/transaction/placeOrderInProgress/validation.d.ts +1 -1
  22. package/lib/chevre/service/transaction/placeOrderInProgress/validation.js +39 -3
  23. package/lib/chevre/settings.d.ts +1 -0
  24. package/lib/chevre/settings.js +2 -1
  25. package/package.json +2 -2
@@ -8,22 +8,23 @@ async function main() {
8
8
 
9
9
  let updateResult: any;
10
10
 
11
- const productRepo = await chevre.repository.Product.createInstance(mongoose.connection);
12
- updateResult = await productRepo.unsetUnnecessaryFields({
11
+ const orderRepo = await chevre.repository.Order.createInstance(mongoose.connection);
12
+ updateResult = await orderRepo.unsetUnnecessaryFields({
13
13
  filter: {
14
- 'serviceType.project': { $exists: true }
14
+ additionalProperty: { $exists: true }
15
15
  },
16
16
  $unset: {
17
- 'serviceType.project': 1
17
+ additionalProperty: 1
18
18
  }
19
19
  });
20
20
  console.log('unset processed.', updateResult);
21
- updateResult = await productRepo.unsetUnnecessaryFields({
21
+
22
+ updateResult = await orderRepo.unsetUnnecessaryFields({
22
23
  filter: {
23
- provider: { $exists: true }
24
+ orderNumber: { $exists: true }
24
25
  },
25
26
  $unset: {
26
- provider: 1
27
+ discounts: 1
27
28
  }
28
29
  });
29
30
  console.log('unset processed.', updateResult);
@@ -9,10 +9,7 @@ exports.modelName = modelName;
9
9
  const schemaDefinition = {
10
10
  broker: mongoose_1.SchemaTypes.Mixed,
11
11
  project: mongoose_1.SchemaTypes.Mixed,
12
- typeOf: {
13
- type: String,
14
- required: true
15
- },
12
+ typeOf: { type: String, required: true },
16
13
  identifier: [mongoose_1.SchemaTypes.Mixed],
17
14
  name: String,
18
15
  seller: mongoose_1.SchemaTypes.Mixed,
@@ -24,7 +21,7 @@ const schemaDefinition = {
24
21
  priceCurrency: String,
25
22
  acceptedOffers: [mongoose_1.SchemaTypes.Mixed],
26
23
  paymentMethods: [mongoose_1.SchemaTypes.Mixed],
27
- discounts: [mongoose_1.SchemaTypes.Mixed],
24
+ discounts: mongoose_1.SchemaTypes.Mixed,
28
25
  url: String,
29
26
  orderStatus: String,
30
27
  previousOrderStatus: String,
@@ -455,15 +452,6 @@ const indexes = [
455
452
  }
456
453
  }
457
454
  ],
458
- [
459
- { additionalProperty: 1, orderDate: -1 },
460
- {
461
- name: 'searchByAdditionalProperty',
462
- partialFilterExpression: {
463
- additionalProperty: { $exists: true }
464
- }
465
- }
466
- ],
467
455
  [
468
456
  { typeOf: 1, orderDate: -1 },
469
457
  { name: 'searchByTypeOf' }
@@ -1016,7 +1016,7 @@ class MongoRepository {
1016
1016
  }
1017
1017
  unsetUnnecessaryFields(params) {
1018
1018
  return __awaiter(this, void 0, void 0, function* () {
1019
- return this.orderModel.updateMany(params.filter, { $unset: params.$unset })
1019
+ return this.orderModel.updateMany(params.filter, { $unset: params.$unset }, { timestamps: false })
1020
1020
  .exec();
1021
1021
  });
1022
1022
  }
@@ -86,6 +86,9 @@ export declare class MongoRepository {
86
86
  */
87
87
  findInProgressConfirmationNumberById(params: {
88
88
  id: string;
89
+ status: {
90
+ $in: factory.transactionStatusType[];
91
+ };
89
92
  }): Promise<string | undefined>;
90
93
  /**
91
94
  * 取引進行者プロフィールを更新
@@ -209,6 +212,9 @@ export declare class MongoRepository {
209
212
  }): Promise<void>;
210
213
  saveConfirmationNumberIfNotExist(params: {
211
214
  id: string;
215
+ status: {
216
+ $in: factory.transactionStatusType[];
217
+ };
212
218
  confirmationNumber: string;
213
219
  }): Promise<void>;
214
220
  findByIdAndDelete(params: {
@@ -323,8 +323,7 @@ class MongoRepository {
323
323
  if (doc === null) {
324
324
  throw new factory.errors.NotFound(this.transactionModel.modelName);
325
325
  }
326
- const transaction = doc.toObject();
327
- return transaction.object.orderNumber;
326
+ return doc.toObject().object.orderNumber;
328
327
  });
329
328
  }
330
329
  /**
@@ -335,14 +334,13 @@ class MongoRepository {
335
334
  const doc = yield this.transactionModel.findOne({
336
335
  _id: { $eq: params.id },
337
336
  typeOf: { $eq: factory.transactionType.PlaceOrder },
338
- status: { $eq: factory.transactionStatusType.InProgress }
337
+ status: { $in: params.status.$in }
339
338
  }, { 'object.confirmationNumber': 1 })
340
339
  .exec();
341
340
  if (doc === null) {
342
341
  throw new factory.errors.NotFound(this.transactionModel.modelName);
343
342
  }
344
- const transaction = doc.toObject();
345
- return transaction.object.confirmationNumber;
343
+ return doc.toObject().object.confirmationNumber;
346
344
  });
347
345
  }
348
346
  /**
@@ -742,9 +740,10 @@ class MongoRepository {
742
740
  return __awaiter(this, void 0, void 0, function* () {
743
741
  yield this.transactionModel.updateOne({
744
742
  _id: { $eq: params.id },
745
- status: { $eq: factory.transactionStatusType.InProgress },
743
+ // status: { $eq: factory.transactionStatusType.InProgress },
744
+ status: { $in: params.status.$in },
746
745
  'object.confirmationNumber': { $exists: false }
747
- }, { 'object.confirmationNumber': params.confirmationNumber })
746
+ }, { $set: { 'object.confirmationNumber': params.confirmationNumber } })
748
747
  .exec();
749
748
  });
750
749
  }
@@ -25,9 +25,13 @@ export declare function createPointAward(params: {
25
25
  assetTransaction: factory.assetTransaction.reserve.ITransaction;
26
26
  }): factory.action.transfer.moneyTransfer.IPointAward | undefined;
27
27
  export declare function createReservedTicket(params: {
28
+ id: string;
28
29
  acceptedOffer: factory.assetTransaction.reserve.IAcceptedTicketOfferWithoutDetail;
29
30
  availableOffer: factory.unitPriceOffer.IUnitPriceOffer;
30
31
  dateIssued: Date;
32
+ reservationFor: {
33
+ id: string;
34
+ };
31
35
  reservedSeatsOnly: boolean;
32
36
  screeningRoomSections?: factory.place.screeningRoomSection.IPlace[];
33
37
  availableSeatOffers: factory.place.seat.IPlaceWithOffer[];
@@ -5,6 +5,7 @@ exports.createCancelPendingReservationAction = exports.createPotentialActions =
5
5
  * 予約取引ファクトリー
6
6
  */
7
7
  const moment = require("moment");
8
+ const util = require("util");
8
9
  const factory = require("../../../factory");
9
10
  const accountTransactionIdentifier_1 = require("../../../factory/accountTransactionIdentifier");
10
11
  const settings_1 = require("../../../settings");
@@ -64,6 +65,19 @@ function createPointAward(params) {
64
65
  return pointAward;
65
66
  }
66
67
  exports.createPointAward = createPointAward;
68
+ function createTicketIdentifier(params) {
69
+ var _a, _b, _c, _d;
70
+ // チケット識別子の規定値を作成
71
+ let ticketIdentifier = (typeof ((_a = params.ticketedSeat) === null || _a === void 0 ? void 0 : _a.seatNumber) === 'string')
72
+ ? util.format('%s:%s:%s', params.reservationFor.id, params.ticketedSeat.seatSection, params.ticketedSeat.seatNumber)
73
+ : util.format('%s:%s', params.reservationFor.id, params.id);
74
+ // 指定があれば採用
75
+ const ticketIdentifierByRequest = (_d = (_c = (_b = params.acceptedOffer.itemOffered) === null || _b === void 0 ? void 0 : _b.serviceOutput) === null || _c === void 0 ? void 0 : _c.reservedTicket) === null || _d === void 0 ? void 0 : _d.identifier;
76
+ if (typeof ticketIdentifierByRequest === 'string' && ticketIdentifierByRequest.length > 0) {
77
+ ticketIdentifier = ticketIdentifierByRequest;
78
+ }
79
+ return ticketIdentifier;
80
+ }
67
81
  function createReservedTicket(params) {
68
82
  var _a, _b, _c;
69
83
  let acceptedTicketedSeat;
@@ -120,7 +134,13 @@ function createReservedTicket(params) {
120
134
  }
121
135
  const ticketType = createTicketType({ availableOffer: params.availableOffer });
122
136
  const issuedBy = createIssuedBy({ acceptedOffer: params.acceptedOffer, availableOffer: params.availableOffer });
123
- return Object.assign({ dateIssued: params.dateIssued, issuedBy,
137
+ const ticketIdentifier = createTicketIdentifier({
138
+ acceptedOffer: params.acceptedOffer,
139
+ id: params.id,
140
+ reservationFor: params.reservationFor,
141
+ ticketedSeat
142
+ });
143
+ return Object.assign({ dateIssued: params.dateIssued, identifier: ticketIdentifier, issuedBy,
124
144
  ticketType, typeOf: 'Ticket' }, (ticketedSeat !== undefined) ? { ticketedSeat } : {});
125
145
  }
126
146
  exports.createReservedTicket = createReservedTicket;
@@ -352,6 +352,7 @@ function createReservations4transactionObject(params) {
352
352
  let reservationIndex = -1;
353
353
  for (const acceptedOffer of params.acceptedOffers) {
354
354
  reservationIndex += 1;
355
+ const reservationId = `${reservationNumber}-${reservationIndex}`;
355
356
  const ticketOffer = params.ticketOffers.find((t) => t.id === acceptedOffer.id);
356
357
  if (ticketOffer === undefined) {
357
358
  throw new factory.errors.NotFound('Ticket Offer');
@@ -372,10 +373,11 @@ function createReservations4transactionObject(params) {
372
373
  })(repos);
373
374
  // チケット作成
374
375
  const reservedTicket = (0, factory_1.createReservedTicket)({
376
+ id: reservationId,
375
377
  acceptedOffer: acceptedOffer,
376
378
  availableOffer: ticketType,
377
379
  dateIssued: params.now,
378
- // event: params.event,
380
+ reservationFor: { id: params.event.id },
379
381
  reservedSeatsOnly,
380
382
  availableSeatOffers: params.availableSeatOffers,
381
383
  ticketOffer: ticketOffer,
@@ -463,7 +465,6 @@ function createReservations4transactionObject(params) {
463
465
  // );
464
466
  }
465
467
  const subReservation = (_j = (_h = acceptedOffer.itemOffered) === null || _h === void 0 ? void 0 : _h.serviceOutput) === null || _j === void 0 ? void 0 : _j.subReservation;
466
- const reservationId = `${reservationNumber}-${reservationIndex}`;
467
468
  reservations.push((0, factory_1.createReservation)({
468
469
  project: params.transaction.project,
469
470
  id: reservationId,
@@ -290,13 +290,13 @@ function acceptedOfferWithoutDetail2acceptedOffer(params) {
290
290
  switch (typeOf) {
291
291
  case factory.reservationType.BusReservation:
292
292
  const serviceOutputAsBusReservation = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ typeOf }, (Array.isArray(additionalProperty)) ? { additionalProperty } : undefined), (typeof additionalTicketText === 'string') ? { additionalTicketText } : undefined), (programMembershipUsed !== undefined) ? { programMembershipUsed } : undefined), (Array.isArray(subReservation)) ? { subReservation } : undefined), (reservedTicket !== undefined) ? {
293
- reservedTicket: Object.assign({ typeOf: 'Ticket' }, (typeof (ticketedSeat === null || ticketedSeat === void 0 ? void 0 : ticketedSeat.typeOf) === 'string') ? { ticketedSeat } : undefined)
293
+ reservedTicket: Object.assign(Object.assign({ typeOf: 'Ticket' }, (typeof reservedTicket.identifier === 'string') ? { identifier: reservedTicket.identifier } : undefined), (typeof (ticketedSeat === null || ticketedSeat === void 0 ? void 0 : ticketedSeat.typeOf) === 'string') ? { ticketedSeat } : undefined)
294
294
  } : undefined);
295
295
  itemOfferedServiceOutput = serviceOutputAsBusReservation;
296
296
  break;
297
297
  case factory.reservationType.EventReservation:
298
298
  const serviceOutputAsEventReservation = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ typeOf }, (Array.isArray(additionalProperty)) ? { additionalProperty } : undefined), (typeof additionalTicketText === 'string') ? { additionalTicketText } : undefined), (programMembershipUsed !== undefined) ? { programMembershipUsed } : undefined), (Array.isArray(subReservation)) ? { subReservation } : undefined), (reservedTicket !== undefined) ? {
299
- reservedTicket: Object.assign({ typeOf: 'Ticket' }, (typeof (ticketedSeat === null || ticketedSeat === void 0 ? void 0 : ticketedSeat.typeOf) === 'string') ? { ticketedSeat } : undefined)
299
+ reservedTicket: Object.assign(Object.assign({ typeOf: 'Ticket' }, (typeof reservedTicket.identifier === 'string') ? { identifier: reservedTicket.identifier } : undefined), (typeof (ticketedSeat === null || ticketedSeat === void 0 ? void 0 : ticketedSeat.typeOf) === 'string') ? { ticketedSeat } : undefined)
300
300
  } : undefined);
301
301
  itemOfferedServiceOutput = serviceOutputAsEventReservation;
302
302
  break;
@@ -208,14 +208,16 @@ function createReservation(params) {
208
208
  const itemOffered = params.itemOffered;
209
209
  const event = params.event;
210
210
  let reservationItem;
211
- const reservedTicket = Object.assign({ typeOf: itemOffered.reservedTicket.typeOf, ticketType: {
211
+ const reservedTicket = Object.assign(Object.assign({ typeOf: itemOffered.reservedTicket.typeOf, ticketType: {
212
212
  typeOf: itemOffered.reservedTicket.ticketType.typeOf,
213
213
  id: itemOffered.reservedTicket.ticketType.id,
214
214
  identifier: itemOffered.reservedTicket.ticketType.identifier,
215
215
  name: itemOffered.reservedTicket.ticketType.name,
216
216
  description: itemOffered.reservedTicket.ticketType.description,
217
217
  additionalProperty: itemOffered.reservedTicket.ticketType.additionalProperty
218
- } }, (itemOffered.reservedTicket.ticketedSeat !== undefined)
218
+ } }, (typeof itemOffered.reservedTicket.identifier === 'string')
219
+ ? { identifier: itemOffered.reservedTicket.identifier }
220
+ : undefined), (itemOffered.reservedTicket.ticketedSeat !== undefined)
219
221
  ? { ticketedSeat: itemOffered.reservedTicket.ticketedSeat }
220
222
  : undefined);
221
223
  if (itemOffered.typeOf === factory.reservationType.EventReservation
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.responseBody2acceptedOffers4result = exports.offers2resultPrice = exports.createAuthorizeSeatReservationActionAttributes = exports.WebAPIIdentifier = void 0;
4
4
  const moment = require("moment");
5
+ const util = require("util");
5
6
  const factory = require("../../../factory");
6
7
  exports.WebAPIIdentifier = factory.service.webAPI.Identifier;
7
8
  function createAuthorizeSeatReservationActionAttributes(params) {
@@ -131,6 +132,7 @@ function responseBody2acceptedOffers4result(params) {
131
132
  duration: event.superEvent.duration,
132
133
  coaInfo: event.superEvent.coaInfo
133
134
  }, id: event.id });
135
+ const ticketNumber = util.format('%s:%s:%s', reservationFor.id, tmpReserve.seatSection, tmpReserve.seatNum);
134
136
  const reservedTicket = {
135
137
  typeOf: 'Ticket',
136
138
  coaTicketInfo: requestedOffer.ticketInfo,
@@ -143,7 +145,9 @@ function responseBody2acceptedOffers4result(params) {
143
145
  seatRow: '',
144
146
  seatSection: tmpReserve.seatSection
145
147
  },
146
- ticketNumber: ticketToken,
148
+ identifier: ticketNumber,
149
+ // ticketNumber: ticketToken,
150
+ ticketNumber,
147
151
  ticketToken: ticketToken,
148
152
  ticketType: {
149
153
  typeOf: factory.offerType.Offer,
@@ -92,7 +92,9 @@ function placeOrderWithoutTransaction(params) {
92
92
  };
93
93
  const action = yield repos.action.start(orderActionAttributes);
94
94
  try {
95
- yield repos.order.createIfNotExist(Object.assign(Object.assign({}, order), { discounts: [], acceptedOffers: [] }));
95
+ yield repos.order.createIfNotExist(Object.assign(Object.assign({}, order), {
96
+ // discounts: [], // 廃止(2024-04-16~)
97
+ acceptedOffers: [] }));
96
98
  }
97
99
  catch (error) {
98
100
  try {
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.optimizeAction4inform = exports.createAuthorizeResult = exports.creatPayTransactionStartParams = void 0;
4
4
  const moment = require("moment");
5
+ const util = require("util");
5
6
  const factory = require("../../../factory");
6
7
  function creatPayTransactionStartParams(params) {
7
8
  var _a, _b, _c, _d;
@@ -65,12 +66,19 @@ function creatPayTransactionStartParams(params) {
65
66
  exports.creatPayTransactionStartParams = creatPayTransactionStartParams;
66
67
  function createMovieTicket(params) {
67
68
  var _a;
69
+ let ticketIdentifier = util.format('%s:%s:%s', params.serviceOutput.reservationFor.id, params.serviceOutput.reservedTicket.ticketedSeat.seatSection, params.serviceOutput.reservedTicket.ticketedSeat.seatNumber);
70
+ // 指定があれば採用(2024-04-16~)
71
+ const ticketIdentifierByRequest = params.serviceOutput.reservedTicket.identifier;
72
+ if (typeof ticketIdentifierByRequest === 'string' && ticketIdentifierByRequest.length > 0) {
73
+ ticketIdentifier = ticketIdentifierByRequest;
74
+ }
68
75
  const serviceOutput = {
69
76
  reservationFor: {
70
77
  typeOf: params.serviceOutput.reservationFor.typeOf,
71
78
  id: params.serviceOutput.reservationFor.id
72
79
  },
73
80
  reservedTicket: {
81
+ identifier: ticketIdentifier,
74
82
  ticketedSeat: {
75
83
  typeOf: factory.placeType.Seat,
76
84
  seatNumber: params.serviceOutput.reservedTicket.ticketedSeat.seatNumber,
@@ -80,8 +88,6 @@ function createMovieTicket(params) {
80
88
  }
81
89
  };
82
90
  return {
83
- // optimize(2023-03-06~)
84
- // project: { id: params.project.id, typeOf: factory.organizationType.Project },
85
91
  typeOf: params.typeOf,
86
92
  identifier: params.identifier,
87
93
  accessCode: params.accessCode,
@@ -30,7 +30,7 @@ declare function cancelReservation(actionAttributesList: factory.action.cancel.r
30
30
  declare function processUnlockOfferRateLimit(params: {
31
31
  reservation: {
32
32
  reservationNumber: string;
33
- reservedTicket: factory.assetTransaction.reserve.IObjectSubReservationReservedTicket;
33
+ reservedTicket: factory.reservation.ITicket;
34
34
  };
35
35
  reservationFor: factory.assetTransaction.reserve.IReservationFor;
36
36
  }): (repos: {
@@ -32,6 +32,7 @@ function confirm(params) {
32
32
  // 確認番号を事前発行
33
33
  yield (0, publishConfirmationNumberIfNotExist_1.publishConfirmationNumberIfNotExist)({
34
34
  id: params.id,
35
+ status: { $in: [factory.transactionStatusType.Confirmed, factory.transactionStatusType.InProgress] },
35
36
  object: { orderDate: params.result.order.orderDate }
36
37
  })(repos);
37
38
  const transaction = yield repos.transaction.findById({
@@ -260,7 +261,7 @@ function createResult(params) {
260
261
  authorizeEventServiceOfferActions: params.authorizeEventServiceOfferActions
261
262
  });
262
263
  // 注文オファー検証
263
- (0, validation_1.validateNumItems)({
264
+ (0, validation_1.validateAcceptedOffers)({
264
265
  result: params.result,
265
266
  acceptedOffers: params.acceptedOffers
266
267
  });
@@ -1,5 +1,6 @@
1
1
  import type { RedisRepository as ConfirmationNumberRepo } from '../../../repo/confirmationNumber';
2
2
  import type { MongoRepository as TransactionRepo } from '../../../repo/transaction';
3
+ import * as factory from '../../../factory';
3
4
  /**
4
5
  * 未発行であれば、注文の確認番号を発行して取引に保管する
5
6
  */
@@ -8,6 +9,9 @@ declare function publishConfirmationNumberIfNotExist(params: {
8
9
  * 取引ID
9
10
  */
10
11
  id: string;
12
+ status: {
13
+ $in: factory.transactionStatusType[];
14
+ };
11
15
  object: {
12
16
  orderDate: Date;
13
17
  };
@@ -16,8 +16,10 @@ const factory = require("../../../factory");
16
16
  */
17
17
  function publishConfirmationNumberIfNotExist(params) {
18
18
  return (repos) => __awaiter(this, void 0, void 0, function* () {
19
- // 最適化(2023-02-03~)
20
- let confirmationNumber = yield repos.transaction.findInProgressConfirmationNumberById({ id: params.id });
19
+ let confirmationNumber = yield repos.transaction.findInProgressConfirmationNumberById({
20
+ id: params.id,
21
+ status: { $in: params.status.$in }
22
+ });
21
23
  // すでに発行済であれば何もしない
22
24
  if (typeof confirmationNumber === 'string') {
23
25
  return confirmationNumber;
@@ -27,11 +29,14 @@ function publishConfirmationNumberIfNotExist(params) {
27
29
  // 取引に存在しなければ保管
28
30
  yield repos.transaction.saveConfirmationNumberIfNotExist({
29
31
  id: params.id,
32
+ status: { $in: params.status.$in },
30
33
  confirmationNumber
31
34
  });
32
35
  // 確認番号を取引から再取得
33
- // 最適化(2023-02-03~)
34
- confirmationNumber = yield repos.transaction.findInProgressConfirmationNumberById({ id: params.id });
36
+ confirmationNumber = yield repos.transaction.findInProgressConfirmationNumberById({
37
+ id: params.id,
38
+ status: { $in: params.status.$in }
39
+ });
35
40
  // 万が一処理が想定通りでない場合confirmationNumberが存在しない
36
41
  if (typeof confirmationNumber !== 'string') {
37
42
  throw new factory.errors.ServiceUnavailable('transaction.object.confirmationNumber not found');
@@ -15,10 +15,12 @@ function createOrder(params) {
15
15
  const { paymentMethods, price } = createPaymentMethods({
16
16
  authorizePaymentActions: params.authorizePaymentActions
17
17
  });
18
- const discounts = [];
18
+ // const discounts: factory.order.IDiscount[] = [];
19
19
  const name = (typeof params.transaction.object.name === 'string') ? params.transaction.object.name : undefined;
20
20
  const broker = (typeof ((_a = params.transaction.object.broker) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string') ? params.transaction.object.broker : undefined;
21
- 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,
21
+ 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,
22
+ // discounts: discounts, // 廃止(2024-04-16~)
23
+ confirmationNumber: '', orderNumber: params.orderNumber, orderedItem: orderedItems,
22
24
  // acceptedOffers: acceptedOffers,
23
25
  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);
24
26
  }
@@ -1,7 +1,7 @@
1
1
  import * as factory from '../../../../factory';
2
- export type IMovieTicket4validate = Pick<factory.paymentMethod.paymentCard.movieTicket.IMovieTicket, 'identifier' | 'serviceOutput' | 'serviceType' | 'typeOf'> & {
3
- serviceOutput: factory.paymentMethod.paymentCard.movieTicket.IServiceOutput & {
4
- reservationFor: factory.paymentMethod.paymentCard.movieTicket.IReservationFor & {};
2
+ export type IMovieTicket4validate = Pick<factory.paymentMethod.paymentCard.movieTicket.IMovieTicketPaymentCard, 'identifier' | 'serviceOutput' | 'serviceType' | 'typeOf'> & {
3
+ serviceOutput: factory.paymentMethod.paymentCard.movieTicket.IMovieTicketServiceOutput & {
4
+ reservationFor: factory.paymentMethod.paymentCard.movieTicket.IMovieTicketReservationFor;
5
5
  };
6
6
  };
7
7
  /**
@@ -6,6 +6,7 @@ exports.validateMovieTicket = void 0;
6
6
  */
7
7
  const createDebug = require("debug");
8
8
  const factory = require("../../../../factory");
9
+ const settings_1 = require("../../../../settings");
9
10
  const debug = createDebug('chevre-domain:service:validateMovieTicket');
10
11
  /**
11
12
  * 興行オファー承認に対して決済承認条件が整っているかどうか検証する
@@ -58,9 +59,11 @@ eventReservationAcceptedOffers) {
58
59
  // イベントとムビチケ券種区分ごとに枚数OK?
59
60
  const eventIds = [...new Set(requiredMovieTickets.map((t) => t.serviceOutput.reservationFor.id))];
60
61
  debug('movie ticket event ids:', eventIds, 'transaction:', transaction.id);
62
+ // tslint:disable-next-line:max-func-body-length
61
63
  eventIds.forEach((eventId) => {
62
64
  const requiredMovieTicketsByEvent = requiredMovieTickets.filter((t) => t.serviceOutput.reservationFor.id === eventId);
63
65
  const authorizedMovieTicketsByEvent = authorizedMovieTickets.filter((t) => t.serviceOutput.reservationFor.id === eventId);
66
+ debug('validating authorizedMovieTicketsByEvent,requiredMovieTicketsByEvent by eventId...', eventId, authorizedMovieTicketsByEvent, requiredMovieTicketsByEvent);
64
67
  // 合計枚数OK?
65
68
  if (requiredMovieTicketsByEvent.length !== authorizedMovieTicketsByEvent.length) {
66
69
  throw new factory.errors.Argument('transactionId', `required movie tickets for the event '${eventId}' not satisfied`);
@@ -77,6 +80,22 @@ eventReservationAcceptedOffers) {
77
80
  if (!authorizedMovieTicketExists) {
78
81
  throw new factory.errors.Argument('transactionId', `required movie tickets for the event '${eventId}' not satisfied`);
79
82
  }
83
+ // チケット識別子での検証に対応(2024-04-16)
84
+ if (settings_1.USE_VALIDATE_MOVIE_TICKET_BY_TICKET_IDENTIFIER) {
85
+ const authorizedMovieTicketByTicketIdentifierExists = authorizedMovieTicketsByEvent.some((authorizedMovieTicket) => {
86
+ return authorizedMovieTicket.serviceType === requiredMovieTicket.serviceType
87
+ && authorizedMovieTicket.serviceOutput.reservedTicket.ticketedSeat.seatNumber
88
+ === requiredMovieTicket.serviceOutput.reservedTicket.ticketedSeat.seatNumber
89
+ && authorizedMovieTicket.serviceOutput.reservedTicket.ticketedSeat.seatSection
90
+ === requiredMovieTicket.serviceOutput.reservedTicket.ticketedSeat.seatSection
91
+ && typeof authorizedMovieTicket.serviceOutput.reservedTicket.identifier === 'string'
92
+ && authorizedMovieTicket.serviceOutput.reservedTicket.identifier
93
+ === requiredMovieTicket.serviceOutput.reservedTicket.identifier;
94
+ });
95
+ if (!authorizedMovieTicketByTicketIdentifierExists) {
96
+ throw new factory.errors.Argument('transactionId', `required movie tickets(reservedTicket.identifier) for the event '${eventId}' not satisfied`);
97
+ }
98
+ }
80
99
  });
81
100
  // 券種ごとに枚数が適切か確認
82
101
  const serviceTypesAuthorized = [...new Set(authorizedMovieTicketsByEvent.map(({ serviceType }) => serviceType))];
@@ -109,6 +128,26 @@ eventReservationAcceptedOffers) {
109
128
  throw new factory.errors.Argument('transactionId', `required movie tickets for seatNumber '${seatNumber}' not satisfied`);
110
129
  }
111
130
  });
131
+ if (settings_1.USE_VALIDATE_MOVIE_TICKET_BY_TICKET_IDENTIFIER) {
132
+ // チケット識別子リストが一致しているか確認
133
+ const reservedTicketIdentifierAuthorized = authorizedMovieTicketsByEvent.map(({ serviceOutput }) => serviceOutput.reservedTicket.identifier);
134
+ const reservedTicketIdentifiers = requiredMovieTicketsByEvent.map(({ serviceOutput }) => serviceOutput.reservedTicket.identifier);
135
+ if (reservedTicketIdentifierAuthorized.length !== reservedTicketIdentifiers.length) {
136
+ throw new factory.errors.Argument('transactionId', `required movie tickets(reservedTicket.identifier) for event '${eventId}' not satisfied`);
137
+ }
138
+ reservedTicketIdentifiers.forEach((reservedTicketIdentifier) => {
139
+ if (typeof reservedTicketIdentifier !== 'string') {
140
+ throw new factory.errors.Argument('transactionId', `reservedTicket.identifier for event '${eventId}' required`);
141
+ }
142
+ const requiredMovieTicketsByReservedTicketIdentifier = requiredMovieTicketsByEvent.filter((t) => t.serviceOutput.reservedTicket.identifier === reservedTicketIdentifier);
143
+ const authorizedMovieTicketsByReservedTicketIdentifier = authorizedMovieTicketsByEvent.filter((t) => {
144
+ return t.serviceOutput.reservedTicket.identifier === reservedTicketIdentifier;
145
+ });
146
+ if (requiredMovieTicketsByReservedTicketIdentifier.length !== authorizedMovieTicketsByReservedTicketIdentifier.length) {
147
+ throw new factory.errors.Argument('transactionId', `required movie tickets for reservedTicket.identifier '${reservedTicketIdentifier}' not satisfied`);
148
+ }
149
+ });
150
+ }
112
151
  validateAppliesToMovieTicketIdentifiers({
113
152
  requiredMovieTicketsByEvent,
114
153
  authorizedMovieTicketsByEvent,
@@ -145,30 +184,24 @@ function authorizeSeatReservationActions2requiredMovieTickets(params) {
145
184
  // });
146
185
  if (Array.isArray(params.acceptedOffers)) {
147
186
  params.acceptedOffers.forEach((offer) => {
148
- var _a, _b, _c, _d;
187
+ var _a, _b, _c;
149
188
  let offeredTicketedSeat;
150
189
  const acceptedTicketedSeatByItemOffered = (_b = (_a = offer.itemOffered) === null || _a === void 0 ? void 0 : _a.reservedTicket) === null || _b === void 0 ? void 0 : _b.ticketedSeat;
151
190
  if (typeof (acceptedTicketedSeatByItemOffered === null || acceptedTicketedSeatByItemOffered === void 0 ? void 0 : acceptedTicketedSeatByItemOffered.typeOf) === 'string') {
152
191
  offeredTicketedSeat = acceptedTicketedSeatByItemOffered;
153
192
  }
193
+ // シンプルに単価仕様のappliesToMovieTicketを参照してrequiredMovieTicketsを作成する(2022-07-28~)
194
+ const unitPriceSpec = (_c = offer.priceSpecification) === null || _c === void 0 ? void 0 : _c.priceComponent.find((component) => {
195
+ return component.typeOf === factory.priceSpecificationType.UnitPriceSpecification
196
+ && (!Array.isArray(component.appliesToAddOn));
197
+ });
198
+ // tslint:disable-next-line:no-single-line-block-comment
199
+ /* istanbul ignore if */
200
+ if (unitPriceSpec === undefined) {
201
+ throw new factory.errors.NotFound('UnitPriceSpecification of acceptedOffer');
202
+ }
154
203
  if (typeof (offeredTicketedSeat === null || offeredTicketedSeat === void 0 ? void 0 : offeredTicketedSeat.typeOf) === 'string') {
155
204
  const ticketedSeat4MovieTicket = offeredTicketedSeat;
156
- const eventOfferedThroughIdentifier = (_c = offer.offeredThrough) === null || _c === void 0 ? void 0 : _c.identifier;
157
- // tslint:disable-next-line:no-single-line-block-comment
158
- /* istanbul ignore if */
159
- if (typeof eventOfferedThroughIdentifier !== 'string') {
160
- throw new factory.errors.NotFound('offer.offeredThrough.identifier', `offer.offeredThrough.identifier undefined [serialNumber:${offer.serialNumber}]`);
161
- }
162
- // シンプルに単価仕様のappliesToMovieTicketを参照してrequiredMovieTicketsを作成する(2022-07-28~)
163
- const unitPriceSpec = (_d = offer.priceSpecification) === null || _d === void 0 ? void 0 : _d.priceComponent.find((component) => {
164
- return component.typeOf === factory.priceSpecificationType.UnitPriceSpecification
165
- && (!Array.isArray(component.appliesToAddOn));
166
- });
167
- // tslint:disable-next-line:no-single-line-block-comment
168
- /* istanbul ignore if */
169
- if (unitPriceSpec === undefined) {
170
- throw new factory.errors.NotFound('UnitPriceSpecification of acceptedOffer');
171
- }
172
205
  // tslint:disable-next-line:no-single-line-block-comment
173
206
  /* istanbul ignore if */
174
207
  if (offer.itemOffered.reservationFor.typeOf !== factory.eventType.ScreeningEvent) {
@@ -177,7 +210,6 @@ function authorizeSeatReservationActions2requiredMovieTickets(params) {
177
210
  const reservationFor4movieTicket = {
178
211
  typeOf: offer.itemOffered.reservationFor.typeOf,
179
212
  id: offer.itemOffered.reservationFor.id
180
- // offers: { offeredThrough: { identifier: eventOfferedThroughIdentifier } }
181
213
  };
182
214
  // 指定された決済方法の適用決済カードリスト
183
215
  let appliesToMovieTickets4paymentMethod = [];
@@ -195,7 +227,12 @@ function authorizeSeatReservationActions2requiredMovieTickets(params) {
195
227
  serviceType: appliesToMovieTicket.serviceType,
196
228
  serviceOutput: {
197
229
  reservationFor: reservationFor4movieTicket,
198
- reservedTicket: { ticketedSeat: ticketedSeat4MovieTicket }
230
+ reservedTicket: {
231
+ identifier: (typeof offer.itemOffered.reservedTicket.identifier === 'string')
232
+ ? offer.itemOffered.reservedTicket.identifier
233
+ : offer.itemOffered.id,
234
+ ticketedSeat: ticketedSeat4MovieTicket
235
+ }
199
236
  }
200
237
  });
201
238
  });
@@ -12,7 +12,7 @@ export type IOrderURLGenerator = (order: factory.order.IOrder) => string;
12
12
  /**
13
13
  * 注文オファー数検証
14
14
  */
15
- export declare function validateNumItems(params: {
15
+ export declare function validateAcceptedOffers(params: {
16
16
  result: {
17
17
  order: PlaceOrderFactory.IResultOrderParams;
18
18
  };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateEventOffers = exports.validatePaymentMethods = exports.validateOrderedItem = exports.validateNumItems = exports.validateTransaction = void 0;
3
+ exports.validateEventOffers = exports.validatePaymentMethods = exports.validateOrderedItem = exports.validateAcceptedOffers = exports.validateTransaction = void 0;
4
4
  /**
5
5
  * 注文取引バリデーション
6
6
  */
@@ -202,7 +202,7 @@ function validateMonetaryAmount(authorizePaymentActions, authorizeEventServiceOf
202
202
  /**
203
203
  * 注文オファー数検証
204
204
  */
205
- function validateNumItems(params) {
205
+ function validateAcceptedOffers(params) {
206
206
  var _a, _b, _c;
207
207
  if (!Array.isArray(params.acceptedOffers)) {
208
208
  throw new factory.errors.Argument('order.acceptedOffers', 'must be array');
@@ -241,8 +241,44 @@ function validateNumItems(params) {
241
241
  throw new factory.errors.Argument('Transaction', (0, util_1.format)('Number of reservationNumbers must be less than or equal to %s', maxNumCOAReservationNumbers));
242
242
  }
243
243
  }
244
+ // チケット識別子ユニークネス検証(2024-04-16~)
245
+ let ticketIdentifiers = [];
246
+ params.acceptedOffers.forEach(({ itemOffered }) => {
247
+ if (itemOffered.typeOf === factory.reservationType.BusReservation
248
+ || itemOffered.typeOf === factory.reservationType.EventReservation) {
249
+ if (typeof itemOffered.reservedTicket.identifier === 'string') {
250
+ ticketIdentifiers.push(itemOffered.reservedTicket.identifier);
251
+ }
252
+ }
253
+ });
254
+ if (ticketIdentifiers.length > 0) {
255
+ ticketIdentifiers = [...new Set(ticketIdentifiers)];
256
+ debug('ticketIdentifiers unique?', ticketIdentifiers.join(' '), 'numAcceptedOffers:', numAcceptedOffers);
257
+ // チケット識別子が注文内ユニークなので、注文オファー数に一致するはず
258
+ if (ticketIdentifiers.length !== numAcceptedOffers) {
259
+ throw new factory.errors.Argument('Transaction', 'ticketNumbers must be unique');
260
+ }
261
+ }
262
+ // チケット識別子ユニークネス検証(2024-04-15~)
263
+ let ticketNumbers = [];
264
+ params.acceptedOffers.forEach(({ itemOffered }) => {
265
+ if (itemOffered.typeOf === factory.reservationType.BusReservation
266
+ || itemOffered.typeOf === factory.reservationType.EventReservation) {
267
+ if (typeof itemOffered.reservedTicket.ticketNumber === 'string') {
268
+ ticketNumbers.push(itemOffered.reservedTicket.ticketNumber);
269
+ }
270
+ }
271
+ });
272
+ if (ticketNumbers.length > 0) {
273
+ ticketNumbers = [...new Set(ticketNumbers)];
274
+ debug('ticketNumbers unique?', ticketNumbers.join(' '), 'numAcceptedOffers:', numAcceptedOffers);
275
+ // チケット識別子が注文内ユニークなので、注文オファー数に一致するはず
276
+ if (ticketNumbers.length !== numAcceptedOffers) {
277
+ throw new factory.errors.Argument('Transaction', 'ticketNumbers must be unique');
278
+ }
279
+ }
244
280
  }
245
- exports.validateNumItems = validateNumItems;
281
+ exports.validateAcceptedOffers = validateAcceptedOffers;
246
282
  function validateOrderedItem(params) {
247
283
  var _a, _b;
248
284
  if (!Array.isArray(params.order.orderedItem)) {
@@ -43,6 +43,7 @@ export declare const USE_OWNERSHIP_INFO_BY_WEB_APPLICATION: boolean;
43
43
  export declare const USE_CHECK_RESOURCE_TASK: boolean;
44
44
  export declare const USE_OPTIMIZE_RESERVATION_EXCEPTIONS: string[];
45
45
  export declare const USE_OPTIMIZE_INFORM_EVENT: boolean;
46
+ export declare const USE_VALIDATE_MOVIE_TICKET_BY_TICKET_IDENTIFIER: boolean;
46
47
  export declare const MONGO_MAX_TIME_MS: number;
47
48
  export declare const MONGO_READ_PREFERENCE: string;
48
49
  export declare const MONGO_AUTO_INDEX: boolean;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.settings = exports.DELIVER_ORDER_LIMIT = exports.MONGO_AUTO_INDEX = exports.MONGO_READ_PREFERENCE = exports.MONGO_MAX_TIME_MS = exports.USE_OPTIMIZE_INFORM_EVENT = exports.USE_OPTIMIZE_RESERVATION_EXCEPTIONS = exports.USE_CHECK_RESOURCE_TASK = exports.USE_OWNERSHIP_INFO_BY_WEB_APPLICATION = exports.USE_SEND_EMAIL_MESSAGE_ON_ORDER_PROCESSING = exports.USE_FETCH_API = exports.USE_OPTIMIZE_TICKET_OFFER = exports.USE_DELETE_EVENT_BY_ORDER = exports.USE_ASSET_TRANSACTION_SYNC_PROCESSING = exports.DEFAULT_TASKS_EXPORT_AGENT_NAME = exports.DEFAULT_SENDER_EMAIL = exports.TRANSACTION_CANCELED_STORAGE_PERIOD_IN_DAYS = exports.TRANSACTION_CONFIRMED_STORAGE_PERIOD_IN_DAYS = exports.ASSET_TRANSACTION_STORAGE_PERIOD_IN_DAYS = exports.MAX_NUM_CREDIT_CARD_PAYMENT_METHOD = exports.ABORTED_TASKS_WITHOUT_REPORT = exports.MAXIMUM_RESERVATION_GRACE_PERIOD_IN_DAYS = exports.TRIGGER_WEBHOOK_RETRY_INTERVAL_IN_MS = exports.TRIGGER_WEBHOOK_MAX_RETRY_COUNT = void 0;
3
+ exports.settings = exports.DELIVER_ORDER_LIMIT = exports.MONGO_AUTO_INDEX = exports.MONGO_READ_PREFERENCE = exports.MONGO_MAX_TIME_MS = exports.USE_VALIDATE_MOVIE_TICKET_BY_TICKET_IDENTIFIER = exports.USE_OPTIMIZE_INFORM_EVENT = exports.USE_OPTIMIZE_RESERVATION_EXCEPTIONS = exports.USE_CHECK_RESOURCE_TASK = exports.USE_OWNERSHIP_INFO_BY_WEB_APPLICATION = exports.USE_SEND_EMAIL_MESSAGE_ON_ORDER_PROCESSING = exports.USE_FETCH_API = exports.USE_OPTIMIZE_TICKET_OFFER = exports.USE_DELETE_EVENT_BY_ORDER = exports.USE_ASSET_TRANSACTION_SYNC_PROCESSING = exports.DEFAULT_TASKS_EXPORT_AGENT_NAME = exports.DEFAULT_SENDER_EMAIL = exports.TRANSACTION_CANCELED_STORAGE_PERIOD_IN_DAYS = exports.TRANSACTION_CONFIRMED_STORAGE_PERIOD_IN_DAYS = exports.ASSET_TRANSACTION_STORAGE_PERIOD_IN_DAYS = exports.MAX_NUM_CREDIT_CARD_PAYMENT_METHOD = exports.ABORTED_TASKS_WITHOUT_REPORT = exports.MAXIMUM_RESERVATION_GRACE_PERIOD_IN_DAYS = exports.TRIGGER_WEBHOOK_RETRY_INTERVAL_IN_MS = exports.TRIGGER_WEBHOOK_MAX_RETRY_COUNT = void 0;
4
4
  const factory = require("./factory");
5
5
  const transactionWebhookUrls = (typeof process.env.INFORM_TRANSACTION_URL === 'string')
6
6
  ? process.env.INFORM_TRANSACTION_URL.split(' ')
@@ -69,6 +69,7 @@ exports.USE_OPTIMIZE_RESERVATION_EXCEPTIONS = (typeof process.env.USE_OPTIMIZE_R
69
69
  ? process.env.USE_OPTIMIZE_RESERVATION_EXCEPTIONS.split(' ')
70
70
  : [];
71
71
  exports.USE_OPTIMIZE_INFORM_EVENT = process.env.USE_OPTIMIZE_INFORM_EVENT === '1';
72
+ exports.USE_VALIDATE_MOVIE_TICKET_BY_TICKET_IDENTIFIER = process.env.USE_VALIDATE_MOVIE_TICKET_BY_TICKET_IDENTIFIER === '1';
72
73
  exports.MONGO_MAX_TIME_MS = (typeof process.env.MONGO_MAX_TIME_MS === 'string')
73
74
  ? Number(process.env.MONGO_MAX_TIME_MS)
74
75
  // tslint:disable-next-line:no-magic-numbers
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  ],
11
11
  "dependencies": {
12
12
  "@aws-sdk/credential-providers": "3.433.0",
13
- "@chevre/factory": "4.367.0-alpha.1",
13
+ "@chevre/factory": "4.367.0-alpha.6",
14
14
  "@cinerino/sdk": "5.17.1",
15
15
  "@motionpicture/coa-service": "9.4.0",
16
16
  "@motionpicture/gmo-service": "5.3.0",
@@ -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.29.0-alpha.0"
113
+ "version": "21.29.0-alpha.10"
114
114
  }