@chevre/domain 24.1.0-alpha.20 → 24.1.0-alpha.21

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.
@@ -20,6 +20,10 @@ export declare class AcceptedOfferRepo {
20
20
  * 予約番号指定で予約取引からitemOfferedを生成する
21
21
  */
22
22
  private findSubReservationsByReservationNumbers;
23
+ /**
24
+ * 予約取引からオファー詳細情報を付加する
25
+ */
26
+ private addAcceptedOffersDetails;
23
27
  /**
24
28
  * オファー展開の注文検索
25
29
  */
@@ -73,7 +77,7 @@ export declare class AcceptedOfferRepo {
73
77
  };
74
78
  };
75
79
  };
76
- }, options?: {
80
+ }, options: {
77
81
  useReserveTransaction: boolean;
78
82
  }): Promise<IAcceptedOffer[]>;
79
83
  /**
@@ -89,6 +93,8 @@ export declare class AcceptedOfferRepo {
89
93
  $eq: string;
90
94
  };
91
95
  };
96
+ }, options: {
97
+ useReserveTransaction: boolean;
92
98
  }): Promise<ISearchSlicedAcceptedOffersResult>;
93
99
  countByOrderNumber(filter: {
94
100
  orderNumber: {
@@ -1,12 +1,17 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.AcceptedOfferRepo = void 0;
7
+ const debug_1 = __importDefault(require("debug"));
4
8
  const factory_1 = require("../factory");
5
9
  const order_1 = require("./mongoose/schemas/order");
6
10
  const assetTransaction_1 = require("./mongoose/schemas/assetTransaction");
7
11
  const reserveTransaction2itemOffered_1 = require("./factory/acceptedOffer/reserveTransaction2itemOffered");
8
12
  const order_2 = require("./order");
9
13
  const settings_1 = require("../settings");
14
+ const debug = (0, debug_1.default)('chevre-domain:repo:acceptedOffer');
10
15
  /**
11
16
  * 注文オファーリポジトリ
12
17
  */
@@ -37,6 +42,42 @@ class AcceptedOfferRepo {
37
42
  return [...a, ...(0, reserveTransaction2itemOffered_1.reserveTransaction2itemOffered)(b)];
38
43
  }, []);
39
44
  }
45
+ /**
46
+ * 予約取引からオファー詳細情報を付加する
47
+ */
48
+ async addAcceptedOffersDetails(acceptedOffers) {
49
+ const offeredThroughIdentifier = acceptedOffers.at(0)?.offeredThrough?.identifier;
50
+ if (offeredThroughIdentifier === factory_1.factory.service.webAPI.Identifier.COA) {
51
+ // COAでは予約取引を参照しない
52
+ return acceptedOffers;
53
+ }
54
+ const reservationNumbers = [...new Set(acceptedOffers.map((acceptedOffer) => String(acceptedOffer.serialNumber)))];
55
+ debug('addAcceptedOffersDetails:', reservationNumbers.length, 'reservationNumbers found.');
56
+ let subReservations = [];
57
+ if (reservationNumbers.length > 0) {
58
+ subReservations = await this.findSubReservationsByReservationNumbers({ reservationNumbers });
59
+ }
60
+ debug('addAcceptedOffersDetails: reservationNumbers.length === subReservations.length?', reservationNumbers.length === subReservations.length);
61
+ return acceptedOffers.map((acceptedOffer) => {
62
+ const subReservation = subReservations.find(((reservation) => reservation.id === acceptedOffer.itemOffered.id));
63
+ // 予約は必ず存在するはず
64
+ if (subReservation === undefined) {
65
+ console.error('addAcceptedOffersDetails: subReservation: undefined!!!', acceptedOffer.itemOffered.id);
66
+ }
67
+ const priceSpecByReserveTransaction = subReservation?.price;
68
+ // 予約の価格は必ず存在するはず
69
+ if (priceSpecByReserveTransaction === undefined) {
70
+ console.error('addAcceptedOffersDetails: priceSpecByReserveTransaction: undefined!!!', acceptedOffer.itemOffered.id);
71
+ }
72
+ const { priceSpecification, ...acceptedOfferWithoutPrice } = acceptedOffer;
73
+ return {
74
+ ...acceptedOfferWithoutPrice,
75
+ ...(priceSpecByReserveTransaction !== undefined)
76
+ ? { priceSpecification: priceSpecByReserveTransaction } // 予約取引参照の値で上書き
77
+ : { priceSpecification } // 万が一予約取引に存在しなければ注文ドキュメントの値を採用
78
+ };
79
+ });
80
+ }
40
81
  /**
41
82
  * オファー展開の注文検索
42
83
  */
@@ -81,12 +122,12 @@ class AcceptedOfferRepo {
81
122
  && offeredThroughIdentifier !== factory_1.factory.service.webAPI.Identifier.COA; // COAでは予約取引を参照しない
82
123
  if (useReserveTransaction) {
83
124
  const reservationNumbers = [...new Set(orders.map((order) => String(order.acceptedOffers[0].serialNumber)))];
84
- // console.log(reservationNumbers.length, 'reservationNumbers found')
125
+ debug('searchWithUnwoundAcceptedOffers:', reservationNumbers.length, 'reservationNumbers found.');
85
126
  let subReservations = [];
86
127
  if (reservationNumbers.length > 0) {
87
128
  subReservations = await this.findSubReservationsByReservationNumbers({ reservationNumbers });
88
129
  }
89
- // console.log(subReservations.length, 'subReservations found');
130
+ debug('searchWithUnwoundAcceptedOffers: reservationNumbers.length === subReservations.length?', reservationNumbers.length === subReservations.length);
90
131
  return orders.map((order) => {
91
132
  const acceptedOffer = order.acceptedOffers[0];
92
133
  const subReservation = subReservations.find(((reservation) => reservation.id === acceptedOffer.itemOffered.id));
@@ -243,37 +284,10 @@ class AcceptedOfferRepo {
243
284
  const acceptedOffers = await aggregate
244
285
  .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
245
286
  .exec();
246
- // 予約取引を参照(2026-05-17~)
247
- const offeredThroughIdentifier = acceptedOffers.at(0)?.offeredThrough?.identifier;
248
- const useReserveTransaction = options?.useReserveTransaction === true
249
- && offeredThroughIdentifier !== factory_1.factory.service.webAPI.Identifier.COA; // COAでは予約取引を参照しない
287
+ // 予約取引を参照(2026-05-18~)
288
+ const useReserveTransaction = options?.useReserveTransaction === true;
250
289
  if (useReserveTransaction) {
251
- const reservationNumbers = [...new Set(acceptedOffers.map((acceptedOffer) => String(acceptedOffer.serialNumber)))];
252
- // console.log(reservationNumbers.length, 'reservationNumbers found')
253
- let subReservations = [];
254
- if (reservationNumbers.length > 0) {
255
- subReservations = await this.findSubReservationsByReservationNumbers({ reservationNumbers });
256
- }
257
- // console.log(subReservations.length, 'subReservations found');
258
- return acceptedOffers.map((acceptedOffer) => {
259
- const subReservation = subReservations.find(((reservation) => reservation.id === acceptedOffer.itemOffered.id));
260
- // 予約は必ず存在するはず
261
- if (subReservation === undefined) {
262
- console.error('searchAcceptedOffersByOrderNumber: subReservation: undefined!!!', acceptedOffer.itemOffered.id);
263
- }
264
- const priceSpecByReserveTransaction = subReservation?.price;
265
- // 予約の価格は必ず存在するはず
266
- if (priceSpecByReserveTransaction === undefined) {
267
- console.error('searchAcceptedOffersByOrderNumber: priceSpecByReserveTransaction: undefined!!!', acceptedOffer.itemOffered.id);
268
- }
269
- const { priceSpecification, ...acceptedOfferWithoutPrice } = acceptedOffer;
270
- return {
271
- ...acceptedOfferWithoutPrice,
272
- ...(priceSpecByReserveTransaction !== undefined)
273
- ? { priceSpecification: priceSpecByReserveTransaction } // 予約取引参照の値で上書き
274
- : { priceSpecification } // 万が一予約取引に存在しなければ注文ドキュメントの値を採用
275
- };
276
- });
290
+ return this.addAcceptedOffersDetails(acceptedOffers);
277
291
  }
278
292
  else {
279
293
  return acceptedOffers;
@@ -282,7 +296,7 @@ class AcceptedOfferRepo {
282
296
  /**
283
297
  * 注文オファーをsliceして検索する(2024-01-10~)
284
298
  */
285
- async searchSlicedAcceptedOffersByOrderNumber(filter) {
299
+ async searchSlicedAcceptedOffersByOrderNumber(filter, options) {
286
300
  const aggregate = this.orderModel.aggregate([
287
301
  { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
288
302
  { $match: { 'project.id': { $eq: filter.project.id.$eq } } },
@@ -301,7 +315,18 @@ class AcceptedOfferRepo {
301
315
  if (result === undefined) {
302
316
  throw new factory_1.factory.errors.NotFound(factory_1.factory.order.OrderType.Order);
303
317
  }
304
- return result;
318
+ const { acceptedOffers, numAcceptedOffers } = result;
319
+ // 予約取引を参照(2026-05-18~)
320
+ const useReserveTransaction = options?.useReserveTransaction === true;
321
+ if (useReserveTransaction) {
322
+ return {
323
+ acceptedOffers: await this.addAcceptedOffersDetails(acceptedOffers),
324
+ numAcceptedOffers
325
+ };
326
+ }
327
+ else {
328
+ return result;
329
+ }
305
330
  }
306
331
  async countByOrderNumber(filter) {
307
332
  const aggregate = this.orderModel.aggregate([
@@ -96,7 +96,8 @@ function deleteReservationsByOrder(order) {
96
96
  acceptedOffers: {
97
97
  // itemOffered: { typeOf: { $in: [factory.reservationType.EventReservation] } }
98
98
  }
99
- });
99
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
100
+ );
100
101
  const reservationIds = acceptedOffers.map((o) => String(o.itemOffered.id));
101
102
  if (reservationIds.length > 0) {
102
103
  await repos.reservation.deleteByIds({ project: { id: order.project.id }, ids: reservationIds });
@@ -102,7 +102,8 @@ function sendOrder(params) {
102
102
  $slice: [offerIndexBase, limit],
103
103
  orderNumber: { $eq: order.orderNumber },
104
104
  project: { id: { $eq: order.project.id } }
105
- });
105
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
106
+ );
106
107
  acceptedOffers = searchSlicedAcceptedOffersResult.acceptedOffers;
107
108
  debug('delivering...', order.orderNumber, acceptedOffers.map((offer) => `${offer.itemOffered.id}`), // eslint-disable-line @typescript-eslint/no-explicit-any
108
109
  params.object.acceptedOffers, 'offerIndexBase:', offerIndexBase);
@@ -39,7 +39,8 @@ function findByCode(params) {
39
39
  // typeOf?: { $in?: factory.order.IItemOffered['typeOf'][] };
40
40
  }
41
41
  }
42
- })).shift();
42
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
43
+ )).shift();
43
44
  if (acceptedOffer === undefined) {
44
45
  throw new factory_1.factory.errors.NotFound('acceptedOffer');
45
46
  }
@@ -1,13 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.findReservations = findReservations;
7
- const debug_1 = __importDefault(require("debug"));
8
- // import { isDeepStrictEqual } from 'util';
9
4
  const factory_1 = require("../../factory");
10
- const debug = (0, debug_1.default)('chevre-domain:service:reserve:findReservations');
11
5
  /**
12
6
  * 予約を検索する
13
7
  */
@@ -30,8 +24,6 @@ function findReservations(params, options) {
30
24
  const subReservations = await repos.assetTransaction.reserve.findSubReservationsById({
31
25
  ids: reservationIds
32
26
  });
33
- // 予約取引から参照した予約数と同じはず
34
- debug('useReserveTransaction: true. reservations.length === subReservations.length?', rawReservations.length === subReservations.length);
35
27
  return rawReservations.map((reservation) => {
36
28
  const subReservationByTransaction = subReservations.find((s) => s.id === reservation.id);
37
29
  const priceByTransaction = subReservationByTransaction?.price;
@@ -16,7 +16,8 @@ function searchByOrder(params) {
16
16
  // typeOf: { $in: [reservationType] }
17
17
  }
18
18
  }
19
- });
19
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
20
+ );
20
21
  const reservationIds = acceptedOffers.map((offer) => {
21
22
  if (offer.itemOffered.typeOf === reservationType) {
22
23
  return offer.itemOffered.id;
@@ -137,7 +137,8 @@ function fixOrderAsPurpose(params) {
137
137
  const acceptedOffers = await repos.acceptedOffer.searchAcceptedOffersByOrderNumber({
138
138
  orderNumber: { $eq: order.orderNumber },
139
139
  project: { id: { $eq: params.project.id } }
140
- });
140
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
141
+ );
141
142
  return {
142
143
  ...order,
143
144
  acceptedOffers
@@ -77,7 +77,8 @@ function fixOrderAsPurpose(params, transaction) {
77
77
  reservedTicket: { ticketedSeat: { seatNumber: { $in: seatNumbers } } }
78
78
  }
79
79
  }
80
- });
80
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
81
+ );
81
82
  }
82
83
  return {
83
84
  ...orderWithoutAcceptedOffers,
@@ -141,13 +141,11 @@ function fixOrders(params) {
141
141
  const eventIds = await repos.acceptedOffer.distinctValues({
142
142
  orderNumber: { $in: [params.object.order[0].orderNumber] }
143
143
  }, 'acceptedOffers.itemOffered.reservationFor.id');
144
- // const acceptedOffers = await repos.acceptedOffer.searchAcceptedOffersByOrderNumbers({
145
- // orderNumber: { $in: [params.object.order[0].orderNumber] }
146
- // });
147
144
  const acceptedOffers = await repos.acceptedOffer.searchAcceptedOffersByOrderNumber({
148
145
  orderNumber: { $eq: params.object.order[0].orderNumber },
149
146
  project: { id: { $eq: params.project.id } }
150
- });
147
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
148
+ );
151
149
  return { acceptedOffers, eventIds, offerIds, orders };
152
150
  };
153
151
  }
@@ -10,47 +10,6 @@ const factory_1 = require("../../factory");
10
10
  const factory_2 = require("../offer/event/authorize/factory");
11
11
  // import { acceptedOffers2amount as acceptedOffers2amount4product } from '../offer/product/factory';
12
12
  const validateMovieTicket_1 = require("../transaction/placeOrder/confirm/validation/validateMovieTicket");
13
- // const debug = createDebug('chevre-domain:service:validation');
14
- // type ICreatingCheckEventTask = Pick<
15
- // factory.task.checkResource.IAttributes,
16
- // 'data' | 'executionResults' | 'name' | 'numberOfTried' | 'project' | 'remainingNumberOfTries' | 'runsAt' | 'status' | 'description'
17
- // > & {
18
- // description: string;
19
- // };
20
- // function createCheckEventTasks(params: {
21
- // order: Pick<factory.order.IOrder, 'orderNumber' | 'typeOf'>;
22
- // project: { id: string };
23
- // reservationForIds: string[];
24
- // }): ICreatingCheckEventTask[] {
25
- // const { order, project, reservationForIds } = params;
26
- // const runsAt = new Date();
27
- // return reservationForIds.map((reservationForId) => {
28
- // const object: factory.task.checkResource.IResourceAsEvent = { id: reservationForId, typeOf: factory.eventType.ScreeningEvent };
29
- // const data: factory.task.checkResource.IData = {
30
- // object,
31
- // project: { id: project.id, typeOf: factory.organizationType.Project },
32
- // typeOf: factory.actionType.CheckAction
33
- // };
34
- // const description: string = util.format(
35
- // '%s:%s:%s:%s',
36
- // order.typeOf,
37
- // order.orderNumber,
38
- // factory.eventType.ScreeningEvent,
39
- // reservationForId
40
- // );
41
- // return {
42
- // description,
43
- // project: { id: project.id, typeOf: factory.organizationType.Project },
44
- // name: factory.taskName.CheckResource,
45
- // status: factory.taskStatus.Ready,
46
- // runsAt,
47
- // remainingNumberOfTries: 3,
48
- // numberOfTried: 0,
49
- // executionResults: [],
50
- // data
51
- // };
52
- // });
53
- // }
54
13
  function validateOrder(params) {
55
14
  return async (repos) => {
56
15
  const order = await repos.order.projectFieldsByOrderNumber({
@@ -63,7 +22,8 @@ function validateOrder(params) {
63
22
  const acceptedOffers = await repos.acceptedOffer.searchAcceptedOffersByOrderNumber({
64
23
  orderNumber: { $eq: params.orderNumber },
65
24
  project: { id: { $eq: params.project.id } }
66
- });
25
+ }, { useReserveTransaction: true } // 予約取引参照(2026-05-18~)
26
+ );
67
27
  let payTransactions = [];
68
28
  if (order.paymentMethods.length > 0) {
69
29
  payTransactions = await repos.assetTransaction.search({
@@ -101,14 +61,8 @@ function validateOrder(params) {
101
61
  throw new Error(`invalid acceptedOffer.priceSpecification.priceComponent [${typeof priceSpecification.priceComponent}]`);
102
62
  }
103
63
  }
104
- // 旧メンバーシップ&ペイメントカードを例外として除外(互換性維持対応をしていないため)
105
- if ((0, moment_1.default)(order.orderDate)
106
- .isAfter((0, moment_1.default)('2023-09-30T15:00:00Z'))
107
- // || typeOf !== factory.permit.PermitType.Permit
108
- ) {
109
- if (typeof serialNumber !== 'string' || serialNumber.length === 0) {
110
- throw new Error(`invalid acceptedOffer.serialNumber [${typeof serialNumber}]`);
111
- }
64
+ if (typeof serialNumber !== 'string' || serialNumber.length === 0) {
65
+ throw new Error(`invalid acceptedOffer.serialNumber [${typeof serialNumber}]`);
112
66
  }
113
67
  });
114
68
  let reservationForIds = [];
@@ -176,21 +130,8 @@ function validateOrder(params) {
176
130
  }
177
131
  break;
178
132
  }
179
- // case factory.permit.PermitType.Permit: {
180
- // numOrderedItemExpected = acceptedOffers.length;
181
- // const permitAcceptedOffers = acceptedOffers as factory.order.IAcceptedOffer<factory.order.IPermit>[];
182
- // priceExpected = acceptedOffers2amount4product({
183
- // acceptedOffers: permitAcceptedOffers
184
- // });
185
- // break;
186
- // }
187
- // case factory.actionType.MoneyTransfer:
188
- // break;
189
133
  default:
190
- if ((0, moment_1.default)(order.orderDate)
191
- .isAfter((0, moment_1.default)('2024-02-01T15:00:00Z'))) {
192
- throw new Error(`invalid itemOfferedTypeOf [${itemOfferedTypeOf}]`);
193
- }
134
+ throw new Error(`invalid itemOfferedTypeOf [${itemOfferedTypeOf}]`);
194
135
  }
195
136
  // orderedItem検証
196
137
  if (order.orderedItem.length !== numOrderedItemExpected) {
@@ -225,20 +166,5 @@ function validateOrder(params) {
225
166
  throw new Error(`invalid ticketIdentifiers.length:${reservationReservedTicketIdentifiers.length} [expected:${acceptedOffers.length}]`);
226
167
  }
227
168
  }
228
- // useMongoAsStockHolderProjectsの場合のイベント検証タスク作成を廃止(もう十分検証したので)(2025-07-11~)
229
- // add check event task(2025-05-01~)
230
- // const setting = <Pick<ISetting, 'useMongoAsStockHolderProjects'> | null>
231
- // await repos.setting.findOne({ project: { id: { $eq: '*' } } }, ['useMongoAsStockHolderProjects']);
232
- // const useMongoAsStockHolderProjects = setting?.useMongoAsStockHolderProjects;
233
- // if (Array.isArray(useMongoAsStockHolderProjects) && useMongoAsStockHolderProjects.includes(params.project.id)) {
234
- // const creatingCheckResourceTask = createCheckEventTasks({
235
- // order: { orderNumber: order.orderNumber, typeOf: factory.order.OrderType.Order },
236
- // project: { id: params.project.id },
237
- // reservationForIds
238
- // });
239
- // if (creatingCheckResourceTask.length > 0) {
240
- // await repos.task.saveMany(creatingCheckResourceTask, { emitImmediately: true });
241
- // }
242
- // }
243
169
  };
244
170
  }
package/package.json CHANGED
@@ -91,5 +91,5 @@
91
91
  "postversion": "git push origin --tags",
92
92
  "prepublishOnly": "npm run clean && npm run build"
93
93
  },
94
- "version": "24.1.0-alpha.20"
94
+ "version": "24.1.0-alpha.21"
95
95
  }