@chevre/domain 24.1.0-alpha.13 → 24.1.0-alpha.15

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.
@@ -36,7 +36,6 @@ export declare class AcceptedOfferRepo {
36
36
  searchAcceptedOffersByOrderNumber(filter: {
37
37
  limit?: number;
38
38
  page?: number;
39
- $slice?: [number, number];
40
39
  orderNumber: {
41
40
  $eq: string;
42
41
  };
@@ -53,9 +52,6 @@ export declare class AcceptedOfferRepo {
53
52
  id?: {
54
53
  $eq?: string;
55
54
  };
56
- typeOf?: {
57
- $in?: factory.order.IItemOffered['typeOf'][];
58
- };
59
55
  reservationFor?: {
60
56
  id?: {
61
57
  $in?: string[];
@@ -53,14 +53,14 @@ class AcceptedOfferRepo {
53
53
  }
54
54
  async aggreateOwnershipInfosByOrder(filter) {
55
55
  const aggregate = this.orderModel.aggregate([
56
+ { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
57
+ { $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } },
56
58
  {
57
59
  $unwind: {
58
60
  path: '$acceptedOffers',
59
61
  includeArrayIndex: 'acceptedOfferIndex'
60
62
  }
61
63
  },
62
- { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
63
- { $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } },
64
64
  {
65
65
  $project: {
66
66
  _id: 0,
@@ -82,21 +82,32 @@ class AcceptedOfferRepo {
82
82
  * 注文オファーを展開して検索する
83
83
  */
84
84
  async searchAcceptedOffersByOrderNumber(filter, inclusion) {
85
- const matchStages = [
85
+ /**
86
+ * unwind前に1ドキュメントを特定するためのstage
87
+ */
88
+ const matchStagesOneDocument = [
86
89
  { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
87
90
  { $match: { 'project.id': { $eq: filter.project.id.$eq } } },
88
91
  { $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } }
89
92
  ];
93
+ /**
94
+ * unwind後にオファー内容で絞るstage
95
+ */
96
+ const matchStages = [
97
+ // { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }, // matchStagesOneDocumentへ移行(2026-05-12~)
98
+ // { $match: { 'project.id': { $eq: filter.project.id.$eq } } }, // matchStagesOneDocumentへ移行(2026-05-12~)
99
+ // { $match: { typeOf: { $eq: factory.order.OrderType.Order } } } // matchStagesOneDocumentへ移行(2026-05-12~)
100
+ ];
90
101
  const itemOfferedIdEq = filter.acceptedOffers?.itemOffered?.id?.$eq;
91
102
  if (typeof itemOfferedIdEq === 'string') {
92
103
  matchStages.push({ $match: { 'acceptedOffers.itemOffered.id': { $exists: true, $eq: itemOfferedIdEq } } });
93
104
  }
94
- const itemOfferedTypeOfIn = filter.acceptedOffers?.itemOffered?.typeOf?.$in;
95
- if (Array.isArray(itemOfferedTypeOfIn)) {
96
- matchStages.push({
97
- $match: { 'acceptedOffers.itemOffered.typeOf': { $exists: true, $in: itemOfferedTypeOfIn } }
98
- });
99
- }
105
+ // const itemOfferedTypeOfIn = filter.acceptedOffers?.itemOffered?.typeOf?.$in;
106
+ // if (Array.isArray(itemOfferedTypeOfIn)) {
107
+ // matchStages.push({
108
+ // $match: { 'acceptedOffers.itemOffered.typeOf': { $exists: true, $in: itemOfferedTypeOfIn } }
109
+ // });
110
+ // }
100
111
  const resevationForIdIn = filter.acceptedOffers?.itemOffered?.reservationFor?.id?.$in;
101
112
  if (Array.isArray(resevationForIdIn)) {
102
113
  matchStages.push({
@@ -114,9 +125,7 @@ class AcceptedOfferRepo {
114
125
  });
115
126
  }
116
127
  const aggregate = this.orderModel.aggregate([
117
- // if (typeof params.sort?.orderDate === 'number') {
118
- // aggregate.sort({ orderDate: params.sort.orderDate });
119
- // }
128
+ ...matchStagesOneDocument,
120
129
  {
121
130
  $unwind: {
122
131
  path: '$acceptedOffers'
@@ -148,8 +157,11 @@ class AcceptedOfferRepo {
148
157
  }
149
158
  if (typeof filter.limit === 'number' && filter.limit > 0) {
150
159
  const page = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1;
151
- aggregate.limit(filter.limit * page)
152
- .skip(filter.limit * (page - 1));
160
+ // support skip -> limit(2026-05-12~)
161
+ // aggregate.limit(filter.limit * page)
162
+ // .skip(filter.limit * (page - 1));
163
+ aggregate.skip(filter.limit * (page - 1))
164
+ .limit(filter.limit);
153
165
  }
154
166
  return aggregate
155
167
  .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
@@ -6,8 +6,17 @@ type IOrderInTransaction = Pick<factory.order.IOrder, 'orderNumber' | 'project'>
6
6
  acceptedOffers: factory.order.IAcceptedOffer[];
7
7
  customer?: factory.order.ICustomer;
8
8
  };
9
+ /**
10
+ * typeOf: Orderへドキュメント変換時の編集フィールド
11
+ */
9
12
  export type IPlacingOrder = Pick<factory.order.IOrder, 'broker' | 'confirmationNumber' | 'identifier' | 'isGift' | 'name' | 'orderDate' | 'orderNumber' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'price' | 'priceCurrency' | 'seller' | 'typeOf' | 'url'> & {
13
+ /**
14
+ * 上書きしてはいけない
15
+ */
10
16
  acceptedOffers?: never;
17
+ /**
18
+ * 上書きしてはいけない
19
+ */
11
20
  customer?: never;
12
21
  };
13
22
  /**
@@ -15,7 +24,9 @@ export type IPlacingOrder = Pick<factory.order.IOrder, 'broker' | 'confirmationN
15
24
  */
16
25
  export declare class OrderInTransactionRepo {
17
26
  private readonly orderModel;
27
+ private readonly reserveTransactionModel;
18
28
  constructor(connection: Connection);
29
+ private findSubReservationsByReservationNumbers;
19
30
  /**
20
31
  * 取引進行中の注文からacceptedOffersを検索する
21
32
  */
@@ -26,6 +37,7 @@ export declare class OrderInTransactionRepo {
26
37
  }): Promise<factory.order.IAcceptedOffer[]>;
27
38
  /**
28
39
  * 注文を受注する
40
+ * typeOf: PlaceOrder -> typeOf: Order
29
41
  */
30
42
  placeOrder(order: IPlacingOrder): Promise<void>;
31
43
  /**
@@ -1,15 +1,47 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OrderInTransactionRepo = void 0;
4
+ const util_1 = require("util");
4
5
  const factory_1 = require("../factory");
5
6
  const order_1 = require("./mongoose/schemas/order");
7
+ const assetTransaction_1 = require("./mongoose/schemas/assetTransaction");
6
8
  /**
7
9
  * 取引中注文リポジトリ
8
10
  */
9
11
  class OrderInTransactionRepo {
10
12
  orderModel;
13
+ reserveTransactionModel;
11
14
  constructor(connection) {
12
15
  this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)());
16
+ this.reserveTransactionModel = connection.model(assetTransaction_1.modelName, (0, assetTransaction_1.createSchema)());
17
+ }
18
+ async findSubReservationsByReservationNumbers(params) {
19
+ const { reservationNumbers } = params;
20
+ if (!Array.isArray(reservationNumbers) || reservationNumbers.length === 0) {
21
+ throw new factory_1.factory.errors.ArgumentNull('reservationNumbers');
22
+ }
23
+ const aggregate = this.reserveTransactionModel.aggregate([
24
+ {
25
+ $match: {
26
+ typeOf: { $eq: factory_1.factory.assetTransactionType.Reserve },
27
+ transactionNumber: { $in: reservationNumbers }
28
+ }
29
+ },
30
+ {
31
+ $unwind: {
32
+ path: '$object.subReservation'
33
+ // includeArrayIndex: 'elementIndex'
34
+ }
35
+ },
36
+ {
37
+ $project: {
38
+ _id: 0,
39
+ id: '$object.subReservation.id',
40
+ price: '$object.subReservation.price',
41
+ }
42
+ }
43
+ ]);
44
+ return aggregate.exec();
13
45
  }
14
46
  /**
15
47
  * 取引進行中の注文からacceptedOffersを検索する
@@ -24,10 +56,28 @@ class OrderInTransactionRepo {
24
56
  if (doc === null) {
25
57
  throw new factory_1.factory.errors.NotFound('orderInTransaction');
26
58
  }
27
- return doc.acceptedOffers;
59
+ // priceSpecificationを予約取引から補完する(2026-05-12~)
60
+ const reservationNumbers = [...new Set(doc.acceptedOffers.map((aceptedOffer) => aceptedOffer.itemOffered.reservationNumber))];
61
+ let subReservations = [];
62
+ if (reservationNumbers.length > 0) {
63
+ subReservations = await this.findSubReservationsByReservationNumbers({ reservationNumbers });
64
+ }
65
+ return doc.acceptedOffers.map(({ priceSpecification, ...acceptedOfferWithoutPrice }) => {
66
+ const priceBySubReservation = subReservations.find((subReservation) => subReservation.id === acceptedOfferWithoutPrice.itemOffered.id)?.price;
67
+ const priceSpecMatched = (0, util_1.isDeepStrictEqual)(priceSpecification, priceBySubReservation);
68
+ console.log('findAcceptedOffersByOrderNumber: priceSpecMatched?', priceSpecMatched);
69
+ if (!priceSpecMatched) {
70
+ console.error('findAcceptedOffersByOrderNumber: priceSpecMatched: false!!!', acceptedOfferWithoutPrice.itemOffered.id, params.orderNumber.$eq);
71
+ }
72
+ return {
73
+ ...acceptedOfferWithoutPrice,
74
+ ...((priceBySubReservation !== undefined) && { priceSpecification: priceBySubReservation })
75
+ };
76
+ });
28
77
  }
29
78
  /**
30
79
  * 注文を受注する
80
+ * typeOf: PlaceOrder -> typeOf: Order
31
81
  */
32
82
  async placeOrder(order) {
33
83
  if (!(order.orderDate instanceof Date)) {
@@ -302,7 +302,6 @@ function responseBody2acceptedOffers4result(params) {
302
302
  * 注文データの予約を生成する
303
303
  */
304
304
  function createReservation(params) {
305
- // const { itemOffered, event, reservationFor } = params;
306
305
  const { itemOffered } = params;
307
306
  const event = params.reservationFor;
308
307
  let reservationItem;
@@ -367,19 +366,17 @@ function createReservation(params) {
367
366
  if (params.issuedThrough.typeOf !== factory_1.factory.product.ProductType.EventService) {
368
367
  throw new factory_1.factory.errors.Argument('issuedThrough', `issuedThrough.typeOf must be ${factory_1.factory.product.ProductType.EventService}`);
369
368
  }
369
+ const { additionalProperty, additionalTicketText, programMembershipUsed } = itemOffered;
370
370
  reservationItem = {
371
371
  typeOf: itemOffered.typeOf,
372
- additionalProperty: itemOffered.additionalProperty,
373
- additionalTicketText: itemOffered.additionalTicketText,
374
372
  id: itemOffered.id,
375
373
  issuedThrough: params.issuedThrough,
376
374
  reservationNumber: params.reservationNumber,
377
375
  reservationFor,
378
376
  reservedTicket,
379
- // 使用メンバーシップがあれば追加
380
- ...(typeof itemOffered.programMembershipUsed?.typeOf === 'string')
381
- ? { programMembershipUsed: itemOffered.programMembershipUsed }
382
- : undefined
377
+ ...((Array.isArray(additionalProperty)) && { additionalProperty }),
378
+ ...((typeof additionalTicketText === 'string') && { additionalTicketText }),
379
+ ...((typeof programMembershipUsed?.typeOf === 'string') && { programMembershipUsed }) // 使用メンバーシップがあれば追加
383
380
  };
384
381
  }
385
382
  else {
@@ -94,7 +94,7 @@ function deleteReservationsByOrder(order) {
94
94
  orderNumber: { $eq: order.orderNumber },
95
95
  project: { id: { $eq: order.project.id } },
96
96
  acceptedOffers: {
97
- itemOffered: { typeOf: { $in: [factory_2.factory.reservationType.EventReservation] } }
97
+ // itemOffered: { typeOf: { $in: [factory.reservationType.EventReservation] } }
98
98
  }
99
99
  });
100
100
  const reservationIds = acceptedOffers.map((o) => String(o.itemOffered.id));
@@ -3,6 +3,6 @@ import { factory } from '../../../../factory';
3
3
  * 受入オファーを注文アイテムに変換する
4
4
  */
5
5
  declare function acceptedOffers2orderedItem(params: {
6
- eventReservationAcceptedOffers: factory.order.IAcceptedOffer[];
6
+ eventReservationAcceptedOffers: Pick<factory.order.IAcceptedOffer, 'itemOffered'>[];
7
7
  }): factory.order.IOrderedItem[];
8
8
  export { acceptedOffers2orderedItem };
@@ -9,11 +9,6 @@ function acceptedOffers2orderedItem(params) {
9
9
  // 予約がある場合
10
10
  const { reservationOrderItems } = createReservationAcceptedOffers(params);
11
11
  // 通貨転送がある場合
12
- // const { moneyTransferOrderItems } = createMoneyTransferAcceptedOffers(params);
13
- // プロダクトがある場合
14
- // const { productOrderItems } = createProductItems(params);
15
- // return [...reservationOrderItems, ...moneyTransferOrderItems, ...productOrderItems];
16
- // return [...reservationOrderItems, ...productOrderItems];
17
12
  return reservationOrderItems;
18
13
  }
19
14
  function createReservationAcceptedOffers(params) {
@@ -1,7 +1,7 @@
1
1
  import type { IPlacingOrder } from '../../../repo/orderInTransaction';
2
2
  import { factory } from '../../../factory';
3
3
  type IPlaceOrderTransaction = Pick<factory.transaction.placeOrder.ITransaction, 'id' | 'project' | 'typeOf' | 'result' | 'object' | 'seller'>;
4
- type IOrderAcceptedOffer = factory.order.IAcceptedOffer;
4
+ type IOrderAcceptedOffer = Pick<factory.order.IAcceptedOffer, 'itemOffered' | 'serialNumber'>;
5
5
  declare function createPaymentMethods(params: {
6
6
  authorizePaymentActions: Pick<factory.action.authorize.paymentMethod.any.IAction, 'result'>[];
7
7
  }): {
@@ -11,14 +11,18 @@ function searchByOrder(params) {
11
11
  page: params.page,
12
12
  project: { id: { $eq: params.project.id } },
13
13
  orderNumber: { $eq: params.orderNumber },
14
- acceptedOffers: { itemOffered: { typeOf: { $in: [reservationType] } } }
14
+ acceptedOffers: {
15
+ itemOffered: {
16
+ // typeOf: { $in: [reservationType] }
17
+ }
18
+ }
15
19
  }, ['itemOffered']);
16
20
  const reservationIds = acceptedOffers.map((offer) => {
17
21
  if (offer.itemOffered.typeOf === reservationType) {
18
22
  return offer.itemOffered.id;
19
23
  }
20
24
  else {
21
- // 検索条件にreservationTypeを含めているので、ありえないケース
25
+ // EventReservationしか存在しないので、ありえないケース
22
26
  throw new factory_1.factory.errors.Internal(`unexpected itemOffered.typeOf ${offer.itemOffered.typeOf}`);
23
27
  }
24
28
  });
@@ -71,7 +71,7 @@ function fixOrderAsPurpose(params, transaction) {
71
71
  project: { id: { $eq: transaction.project.id } },
72
72
  acceptedOffers: {
73
73
  itemOffered: {
74
- typeOf: { $in: [factory_1.factory.reservationType.EventReservation] },
74
+ // typeOf: { $in: [factory.reservationType.EventReservation] }, // EventReservationしか存在しないので不要(2026-05-12~)
75
75
  // movieTicketsに結合されたイベントID,座席コードで絞る
76
76
  reservationFor: { id: { $in: [reservationForId] } },
77
77
  reservedTicket: { ticketedSeat: { seatNumber: { $in: seatNumbers } } }
@@ -4,5 +4,5 @@ declare function validateInvoiceReferencesOrder(authorizePaymentActions: IAuthor
4
4
  /**
5
5
  * 受け入れられた興行オファー
6
6
  */
7
- eventReservationAcceptedOffers: factory.order.IAcceptedOffer[]): void;
7
+ eventReservationAcceptedOffers: Pick<factory.order.IAcceptedOffer, 'itemOffered'>[]): void;
8
8
  export { validateInvoiceReferencesOrder };
@@ -18,4 +18,4 @@ authorizedMovieTickets: IMovieTicket4validate[],
18
18
  /**
19
19
  * 受け入れられた興行オファー
20
20
  */
21
- eventReservationAcceptedOffers: factory.order.IAcceptedOffer[]): void;
21
+ eventReservationAcceptedOffers: Pick<factory.order.IAcceptedOffer, 'itemOffered' | 'priceSpecification'>[]): void;
@@ -5,7 +5,7 @@ export { IAcceptPayAction, IAuthorizeEventServiceOffer, IAuthorizePaymentAction,
5
5
  /**
6
6
  * 取引が確定可能な状態かどうかをチェックする
7
7
  */
8
- export declare function validateTransaction(transaction: Pick<factory.transaction.placeOrder.ITransaction, 'id' | 'object'>, acceptPayActions: IAcceptPayAction[], authorizePaymentActions: IAuthorizePaymentAction[], authorizeEventServiceOfferActions: Pick<IAuthorizeEventServiceOffer, 'id' | 'result'>[], eventReservationAcceptedOffers: factory.order.IAcceptedOffer[], payTransactions: IPayTransaction[], customer: factory.order.ICustomer): void;
8
+ export declare function validateTransaction(transaction: Pick<factory.transaction.placeOrder.ITransaction, 'id' | 'object'>, acceptPayActions: IAcceptPayAction[], authorizePaymentActions: IAuthorizePaymentAction[], authorizeEventServiceOfferActions: Pick<IAuthorizeEventServiceOffer, 'id' | 'result'>[], eventReservationAcceptedOffers: Pick<factory.order.IAcceptedOffer, 'itemOffered' | 'priceSpecification'>[], payTransactions: IPayTransaction[], customer: factory.order.ICustomer): void;
9
9
  export type IOrderURLGenerator = (order: factory.order.IOrder) => string;
10
10
  /**
11
11
  * 注文オファー数検証
@@ -14,7 +14,7 @@ export declare function validateAcceptedOffers(params: {
14
14
  result: {
15
15
  order: PlaceOrderFactory.IResultOrderParams;
16
16
  };
17
- acceptedOffers: factory.order.IAcceptedOffer[];
17
+ acceptedOffers: (Pick<factory.order.IAcceptedOffer, 'itemOffered' | 'offeredThrough' | 'serialNumber'>)[];
18
18
  }): void;
19
19
  export declare function validateOrderedItem(params: {
20
20
  order: Pick<factory.order.IOrder, 'orderedItem'>;
@@ -288,7 +288,7 @@ function createResult(params, options) {
288
288
  const itemOfferedTypeOf = acceptedOffer.itemOffered.typeOf;
289
289
  switch (itemOfferedTypeOf) {
290
290
  case factory_1.factory.reservationType.EventReservation:
291
- eventReservationAcceptedOffers.push(acceptedOffer);
291
+ eventReservationAcceptedOffers.push((acceptedOffer));
292
292
  break;
293
293
  // case factory.permit.PermitType.Permit:
294
294
  // productAcceptedOffers.push((acceptedOffer as factory.order.IAcceptedOffer<factory.order.IPermit>));
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.13"
94
+ "version": "24.1.0-alpha.15"
95
95
  }