@chevre/domain 24.1.0-alpha.3 → 24.1.0-alpha.30

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 (105) hide show
  1. package/README.md +0 -2
  2. package/lib/chevre/repo/acceptedOffer.d.ts +14 -13
  3. package/lib/chevre/repo/acceptedOffer.js +135 -51
  4. package/lib/chevre/repo/acceptedOfferInReserve.d.ts +30 -0
  5. package/lib/chevre/repo/acceptedOfferInReserve.js +78 -0
  6. package/lib/chevre/repo/accountingReport.d.ts +9 -2
  7. package/lib/chevre/repo/accountingReport.js +6 -34
  8. package/lib/chevre/repo/action/actionProcess.d.ts +1 -1
  9. package/lib/chevre/repo/assetTransaction/reserve.d.ts +0 -1
  10. package/lib/chevre/repo/assetTransaction/reserve.js +4 -50
  11. package/lib/chevre/repo/event.js +12 -8
  12. package/lib/chevre/repo/factory/acceptedOffer/reserveTransaction2itemOffered.d.ts +7 -0
  13. package/lib/chevre/repo/factory/acceptedOffer/reserveTransaction2itemOffered.js +74 -0
  14. package/lib/chevre/repo/factory/reservation/createMongoConditions.js +155 -180
  15. package/lib/chevre/repo/mongoose/schemas/accountingReport.js +42 -42
  16. package/lib/chevre/repo/mongoose/schemas/order.js +108 -108
  17. package/lib/chevre/repo/mongoose/schemas/reservation.d.ts +3 -1
  18. package/lib/chevre/repo/mongoose/schemas/reservation.js +128 -146
  19. package/lib/chevre/repo/order.d.ts +2 -83
  20. package/lib/chevre/repo/order.js +171 -364
  21. package/lib/chevre/repo/orderInTransaction.d.ts +39 -3
  22. package/lib/chevre/repo/orderInTransaction.js +43 -1
  23. package/lib/chevre/repo/reservation.d.ts +20 -7
  24. package/lib/chevre/repo/reservation.js +14 -10
  25. package/lib/chevre/repo/role.d.ts +1 -15
  26. package/lib/chevre/repo/role.js +7 -14
  27. package/lib/chevre/repo/transaction.d.ts +6 -6
  28. package/lib/chevre/service/aggregation/event/aggregateOffers.js +22 -26
  29. package/lib/chevre/service/assetTransaction/cancelReservation/factory.js +14 -11
  30. package/lib/chevre/service/assetTransaction/cancelReservation/start.d.ts +1 -1
  31. package/lib/chevre/service/assetTransaction/cancelReservation/start.js +1 -1
  32. package/lib/chevre/service/assetTransaction/reserve/start/factory/createReservation.js +0 -12
  33. package/lib/chevre/service/assetTransaction/reserve/start/factory/price.d.ts +1 -1
  34. package/lib/chevre/service/delivery/factory.d.ts +6 -1
  35. package/lib/chevre/service/delivery/factory.js +1 -1
  36. package/lib/chevre/service/delivery/reservation/factory.d.ts +1 -3
  37. package/lib/chevre/service/delivery/reservation/factory.js +0 -17
  38. package/lib/chevre/service/notification/notifyAbortedTasksByEmail.d.ts +1 -1
  39. package/lib/chevre/service/notification/notifyAbortedTasksByEmail.js +1 -1
  40. package/lib/chevre/service/offer/any.d.ts +6 -1
  41. package/lib/chevre/service/offer/event/authorize/factory.d.ts +6 -3
  42. package/lib/chevre/service/offer/event/authorize/factory.js +4 -7
  43. package/lib/chevre/service/offer/event/authorize.d.ts +6 -0
  44. package/lib/chevre/service/offer/event/authorize.js +11 -3
  45. package/lib/chevre/service/offer/eventServiceByCOA/authorize/factory.d.ts +1 -3
  46. package/lib/chevre/service/order/createAccountingReportIfNotExist.d.ts +1 -3
  47. package/lib/chevre/service/order/createAccountingReportIfNotExist.js +67 -72
  48. package/lib/chevre/service/order/deleteOrder.js +21 -44
  49. package/lib/chevre/service/order/onAssetTransactionStatusChanged/paymentDue2Processing.js +9 -11
  50. package/lib/chevre/service/order/onOrderStatusChanged/onOrderDeliveredPartially/factory.d.ts +6 -1
  51. package/lib/chevre/service/order/onOrderStatusChanged/onOrderInTransit.js +1 -1
  52. package/lib/chevre/service/order/onOrderStatusChanged/onOrderProcessing.js +2 -1
  53. package/lib/chevre/service/order/placeOrder/factory/orderedItem.d.ts +1 -1
  54. package/lib/chevre/service/order/placeOrder/factory/orderedItem.js +0 -5
  55. package/lib/chevre/service/order/placeOrder/factory.d.ts +1 -1
  56. package/lib/chevre/service/order/sendOrder.js +2 -4
  57. package/lib/chevre/service/payment/creditCard/authorize.js +3 -3
  58. package/lib/chevre/service/payment/creditCard/payCreditCard.js +1 -1
  59. package/lib/chevre/service/payment/creditCard/refundCreditCard.js +1 -1
  60. package/lib/chevre/service/payment/creditCard/searchGMOTrade.js +1 -1
  61. package/lib/chevre/service/payment/creditCard/voidTransaction.js +1 -1
  62. package/lib/chevre/service/payment/factory/createPayObjectServiceOutput.d.ts +8 -1
  63. package/lib/chevre/service/payment/factory/createPayObjectServiceOutput.js +1 -1
  64. package/lib/chevre/service/payment/movieTicket/payMovieTicket.js +1 -1
  65. package/lib/chevre/service/payment/movieTicket/processPurchaseNumberAuth.js +1 -1
  66. package/lib/chevre/service/payment/movieTicket/refundMovieTicket.js +2 -2
  67. package/lib/chevre/service/reserve/confirmReservation.js +7 -7
  68. package/lib/chevre/service/reserve/factory.js +2 -1
  69. package/lib/chevre/service/reserve/findByCode.d.ts +1 -1
  70. package/lib/chevre/service/reserve/findByCode.js +2 -1
  71. package/lib/chevre/service/reserve/findReservations.d.ts +4 -4
  72. package/lib/chevre/service/reserve/findReservations.js +16 -26
  73. package/lib/chevre/service/reserve/potentialActions/onReservationConfirmed.d.ts +4 -3
  74. package/lib/chevre/service/reserve/potentialActions/onReservationConfirmed.js +1 -9
  75. package/lib/chevre/service/reserve/searchByOrder.js +8 -3
  76. package/lib/chevre/service/reserve/useReservation.d.ts +1 -1
  77. package/lib/chevre/service/reserve/useReservation.js +20 -24
  78. package/lib/chevre/service/task/acceptCOAOffer.js +2 -2
  79. package/lib/chevre/service/task/authorizePayment.js +1 -1
  80. package/lib/chevre/service/task/cancelPendingReservation.js +1 -1
  81. package/lib/chevre/service/task/checkMovieTicket.js +1 -1
  82. package/lib/chevre/service/task/confirmReserveTransaction.js +3 -2
  83. package/lib/chevre/service/task/createAccountingReport.js +7 -9
  84. package/lib/chevre/service/task/importEventCapacitiesFromCOA.js +1 -1
  85. package/lib/chevre/service/task/importEventsFromCOA.js +1 -1
  86. package/lib/chevre/service/task/importOffersFromCOA.js +1 -1
  87. package/lib/chevre/service/task/pay.js +1 -1
  88. package/lib/chevre/service/task/payment/payByTask.js +3 -2
  89. package/lib/chevre/service/task/refund.js +1 -1
  90. package/lib/chevre/service/task/returnReserveTransaction.js +1 -1
  91. package/lib/chevre/service/task/syncResourcesFromCOA.js +1 -1
  92. package/lib/chevre/service/task/useReservation.d.ts +2 -2
  93. package/lib/chevre/service/task/useReservation.js +6 -18
  94. package/lib/chevre/service/task/voidPayment.js +1 -1
  95. package/lib/chevre/service/task/voidReserveTransaction.js +1 -1
  96. package/lib/chevre/service/taskHandler.js +1 -0
  97. package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateInvoiceReferencesOrder.d.ts +1 -1
  98. package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateMovieTicket.d.ts +1 -1
  99. package/lib/chevre/service/transaction/placeOrder/confirm/validation.d.ts +2 -2
  100. package/lib/chevre/service/transaction/placeOrder/confirm.js +5 -2
  101. package/lib/chevre/service/transaction/returnOrder/preStart.js +2 -4
  102. package/lib/chevre/service/validation/validateOrder.js +5 -79
  103. package/lib/chevre/settings.d.ts +15 -16
  104. package/lib/chevre/settings.js +53 -19
  105. package/package.json +2 -2
package/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # Chevre Domain Library for Node.js
2
2
 
3
3
  [![npm (scoped)](https://img.shields.io/npm/v/@chevre/domain.svg)](https://www.npmjs.com/package/@chevre/domain)
4
- [![CircleCI](https://circleci.com/gh/chevre-jp/domain.svg?style=svg)](https://circleci.com/gh/chevre-jp/domain)
5
- [![Coverage Status](https://coveralls.io/repos/github/chevre-jp/domain/badge.svg?branch=master)](https://coveralls.io/github/chevre-jp/domain?branch=master)
6
4
  [![Known Vulnerabilities](https://snyk.io/test/github/chevre-jp/domain/badge.svg)](https://snyk.io/test/github/chevre-jp/domain)
7
5
  [![npm](https://img.shields.io/npm/dm/@chevre/domain.svg)](https://nodei.co/npm/@chevre/domain/)
8
6
 
@@ -1,12 +1,10 @@
1
1
  import type { Connection } from 'mongoose';
2
2
  import { factory } from '../factory';
3
+ import { AcceptedOfferInReserveRepo, IAcceptedOffer } from './acceptedOfferInReserve';
3
4
  type IProjection4searchWithUnwoundAcceptedOffers = {
4
5
  [key in keyof factory.order.IOrder]?: 1;
5
- } & {
6
- _id?: 0 | 1;
7
- };
8
- type IDistinctField = 'acceptedOffers.id' | 'acceptedOffers.itemOffered.reservationNumber' | 'acceptedOffers.itemOffered.reservationFor.id' | 'acceptedOffers.itemOffered.issuedThrough.id' | 'acceptedOffers.itemOffered.typeOf' | 'acceptedOffers.serialNumber' | 'acceptedOffers.offeredThrough.identifier' | 'acceptedOffers.itemOffered.reservationFor.superEvent.location.branchCode' | 'acceptedOffers.itemOffered.object.pendingTransaction.transactionNumber';
9
- type IAcceptedOffer = factory.order.IAcceptedOffer;
6
+ } & {};
7
+ type IDistinctField = 'acceptedOffers.id' | 'acceptedOffers.itemOffered.reservationNumber' | 'acceptedOffers.itemOffered.reservationFor.id' | 'acceptedOffers.serialNumber' | 'acceptedOffers.offeredThrough.identifier' | 'acceptedOffers.itemOffered.reservationFor.superEvent.location.branchCode';
10
8
  interface ISearchSlicedAcceptedOffersResult {
11
9
  acceptedOffers: IAcceptedOffer[];
12
10
  numAcceptedOffers: number;
@@ -14,15 +12,18 @@ interface ISearchSlicedAcceptedOffersResult {
14
12
  /**
15
13
  * 注文オファーリポジトリ
16
14
  */
17
- export declare class AcceptedOfferRepo {
15
+ export declare class AcceptedOfferRepo extends AcceptedOfferInReserveRepo {
18
16
  private readonly orderModel;
19
17
  constructor(connection: Connection);
20
18
  /**
21
19
  * オファー展開の注文検索
22
20
  */
23
21
  searchWithUnwoundAcceptedOffers(params: factory.order.ISearchConditions, projection: IProjection4searchWithUnwoundAcceptedOffers, options: {
24
- useLimitAfterSkip: boolean;
25
- }): Promise<factory.order.IOrder[]>;
22
+ useReserveTransaction: boolean;
23
+ }): Promise<(factory.order.IOrder & {
24
+ acceptedOffers: [IAcceptedOffer];
25
+ _id?: never;
26
+ })[]>;
26
27
  aggreateOwnershipInfosByOrder(filter: {
27
28
  orderNumber: {
28
29
  $eq: string;
@@ -36,7 +37,6 @@ export declare class AcceptedOfferRepo {
36
37
  searchAcceptedOffersByOrderNumber(filter: {
37
38
  limit?: number;
38
39
  page?: number;
39
- $slice?: [number, number];
40
40
  orderNumber: {
41
41
  $eq: string;
42
42
  };
@@ -53,9 +53,6 @@ export declare class AcceptedOfferRepo {
53
53
  id?: {
54
54
  $eq?: string;
55
55
  };
56
- typeOf?: {
57
- $in?: factory.order.IItemOffered['typeOf'][];
58
- };
59
56
  reservationFor?: {
60
57
  id?: {
61
58
  $in?: string[];
@@ -70,7 +67,9 @@ export declare class AcceptedOfferRepo {
70
67
  };
71
68
  };
72
69
  };
73
- }, inclusion?: (keyof IAcceptedOffer)[]): Promise<IAcceptedOffer[]>;
70
+ }, options: {
71
+ useReserveTransaction: boolean;
72
+ }): Promise<IAcceptedOffer[]>;
74
73
  /**
75
74
  * 注文オファーをsliceして検索する(2024-01-10~)
76
75
  */
@@ -84,6 +83,8 @@ export declare class AcceptedOfferRepo {
84
83
  $eq: string;
85
84
  };
86
85
  };
86
+ }, options: {
87
+ useReserveTransaction: boolean;
87
88
  }): Promise<ISearchSlicedAcceptedOffersResult>;
88
89
  countByOrderNumber(filter: {
89
90
  orderNumber: {
@@ -3,23 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AcceptedOfferRepo = void 0;
4
4
  const factory_1 = require("../factory");
5
5
  const order_1 = require("./mongoose/schemas/order");
6
+ const acceptedOfferInReserve_1 = require("./acceptedOfferInReserve");
6
7
  const order_2 = require("./order");
7
8
  const settings_1 = require("../settings");
9
+ // const debug = createDebug('chevre-domain:repo:acceptedOffer');
8
10
  /**
9
11
  * 注文オファーリポジトリ
10
12
  */
11
- class AcceptedOfferRepo {
13
+ class AcceptedOfferRepo extends acceptedOfferInReserve_1.AcceptedOfferInReserveRepo {
12
14
  orderModel;
13
15
  constructor(connection) {
16
+ super(connection);
14
17
  this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)());
15
18
  }
16
19
  /**
17
20
  * オファー展開の注文検索
18
21
  */
19
22
  async searchWithUnwoundAcceptedOffers(params, projection, options) {
20
- const { useLimitAfterSkip } = options;
21
23
  const conditions = order_2.OrderRepo.CREATE_MONGO_CONDITIONS(params);
22
24
  const aggregate = this.orderModel.aggregate();
25
+ // unwind->matchでは遅い
26
+ // match->unwind->matchにする(2026-05-08~)
27
+ conditions.forEach((c) => {
28
+ aggregate.match(c);
29
+ });
23
30
  // pipelineの順序に注意
24
31
  // @see https://docs.mongodb.com/manual/reference/operator/aggregation/sort/
25
32
  /* istanbul ignore else */
@@ -32,35 +39,70 @@ class AcceptedOfferRepo {
32
39
  });
33
40
  aggregate.project({
34
41
  ...projection,
42
+ _id: 0, // hide _id(2026-05-16~)
35
43
  acceptedOffers: ['$acceptedOffers']
36
44
  });
37
45
  if (typeof params.limit === 'number' && params.limit > 0) {
38
46
  const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
39
47
  // support skip -> limit(2025-07-09~)
40
- if (useLimitAfterSkip) {
41
- aggregate.skip(params.limit * (page - 1))
42
- .limit(params.limit);
43
- }
44
- else {
45
- aggregate.limit(params.limit * page)
46
- .skip(params.limit * (page - 1));
47
- }
48
+ aggregate.skip(params.limit * (page - 1))
49
+ .limit(params.limit);
48
50
  }
49
- return aggregate
50
- // .allowDiskUse(true) // false化(2023-11-30~)
51
+ const orders = await aggregate
51
52
  .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
52
53
  .exec();
54
+ // 予約取引を参照(2026-05-17~)
55
+ const offeredThroughIdentifier = orders.at(0)?.acceptedOffers[0].offeredThrough?.identifier;
56
+ const useReserveTransaction = options.useReserveTransaction === true
57
+ && offeredThroughIdentifier !== factory_1.factory.service.webAPI.Identifier.COA; // COAでは予約取引を参照しない
58
+ if (useReserveTransaction) {
59
+ const reservationNumbers = [...new Set(orders.map((order) => String(order.acceptedOffers[0].serialNumber)))];
60
+ let acceptedOffersByReserveTransaction = [];
61
+ if (reservationNumbers.length > 0) {
62
+ acceptedOffersByReserveTransaction = await this.findAcceptedOffersByReservationNumbers({ reservationNumbers });
63
+ }
64
+ return orders.map((order) => {
65
+ const acceptedOffer = order.acceptedOffers[0];
66
+ const acceptedOfferByReserveTransaction = acceptedOffersByReserveTransaction.find(((offer) => offer.itemOffered.id === acceptedOffer.itemOffered.id));
67
+ // 予約は必ず存在するはず
68
+ if (acceptedOfferByReserveTransaction === undefined) {
69
+ console.error('repo:acceptedOffer: searchWithUnwoundAcceptedOffers: acceptedOfferByReserveTransaction: undefined!!!', acceptedOffer.itemOffered.id);
70
+ }
71
+ const priceSpecByReserveTransaction = acceptedOfferByReserveTransaction?.priceSpecification;
72
+ // 予約の価格は必ず存在するはず
73
+ if (priceSpecByReserveTransaction === undefined) {
74
+ console.error('repo:acceptedOffer: searchWithUnwoundAcceptedOffers: priceSpecByReserveTransaction: undefined!!!', acceptedOffer.itemOffered.id);
75
+ }
76
+ const { priceSpecification: _originalPriceSpec, // 注文ドキュメントのpriceSpecificationはもう採用しない(2026-05-21~)
77
+ ...acceptedOfferWithoutPrice } = acceptedOffer;
78
+ return {
79
+ ...order,
80
+ acceptedOffers: [
81
+ {
82
+ ...acceptedOfferWithoutPrice,
83
+ ...((priceSpecByReserveTransaction !== undefined) && { priceSpecification: priceSpecByReserveTransaction }) // 予約取引参照の値で上書き
84
+ // ...(priceSpecByReserveTransaction !== undefined)
85
+ // ? { priceSpecification: priceSpecByReserveTransaction } // 予約取引参照の値で上書き
86
+ // : { priceSpecification } // 万が一予約取引に存在しなければ注文ドキュメントの値を採用
87
+ }
88
+ ]
89
+ };
90
+ });
91
+ }
92
+ else {
93
+ return orders;
94
+ }
53
95
  }
54
96
  async aggreateOwnershipInfosByOrder(filter) {
55
97
  const aggregate = this.orderModel.aggregate([
98
+ { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
99
+ { $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } },
56
100
  {
57
101
  $unwind: {
58
102
  path: '$acceptedOffers',
59
103
  includeArrayIndex: 'acceptedOfferIndex'
60
104
  }
61
105
  },
62
- { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
63
- { $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } },
64
106
  {
65
107
  $project: {
66
108
  _id: 0,
@@ -81,22 +123,35 @@ class AcceptedOfferRepo {
81
123
  /**
82
124
  * 注文オファーを展開して検索する
83
125
  */
84
- async searchAcceptedOffersByOrderNumber(filter, inclusion) {
85
- const matchStages = [
126
+ async searchAcceptedOffersByOrderNumber(filter,
127
+ // inclusion?: (keyof IAcceptedOffer)[], // 分かりにくいので廃止(2026-05-17~)
128
+ options) {
129
+ /**
130
+ * unwind前に1ドキュメントを特定するためのstage
131
+ */
132
+ const matchStagesOneDocument = [
86
133
  { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
87
134
  { $match: { 'project.id': { $eq: filter.project.id.$eq } } },
88
135
  { $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } }
89
136
  ];
137
+ /**
138
+ * unwind後にオファー内容で絞るstage
139
+ */
140
+ const matchStages = [
141
+ // { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }, // matchStagesOneDocumentへ移行(2026-05-12~)
142
+ // { $match: { 'project.id': { $eq: filter.project.id.$eq } } }, // matchStagesOneDocumentへ移行(2026-05-12~)
143
+ // { $match: { typeOf: { $eq: factory.order.OrderType.Order } } } // matchStagesOneDocumentへ移行(2026-05-12~)
144
+ ];
90
145
  const itemOfferedIdEq = filter.acceptedOffers?.itemOffered?.id?.$eq;
91
146
  if (typeof itemOfferedIdEq === 'string') {
92
147
  matchStages.push({ $match: { 'acceptedOffers.itemOffered.id': { $exists: true, $eq: itemOfferedIdEq } } });
93
148
  }
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
- }
149
+ // const itemOfferedTypeOfIn = filter.acceptedOffers?.itemOffered?.typeOf?.$in;
150
+ // if (Array.isArray(itemOfferedTypeOfIn)) {
151
+ // matchStages.push({
152
+ // $match: { 'acceptedOffers.itemOffered.typeOf': { $exists: true, $in: itemOfferedTypeOfIn } }
153
+ // });
154
+ // }
100
155
  const resevationForIdIn = filter.acceptedOffers?.itemOffered?.reservationFor?.id?.$in;
101
156
  if (Array.isArray(resevationForIdIn)) {
102
157
  matchStages.push({
@@ -114,9 +169,7 @@ class AcceptedOfferRepo {
114
169
  });
115
170
  }
116
171
  const aggregate = this.orderModel.aggregate([
117
- // if (typeof params.sort?.orderDate === 'number') {
118
- // aggregate.sort({ orderDate: params.sort.orderDate });
119
- // }
172
+ ...matchStagesOneDocument,
120
173
  {
121
174
  $unwind: {
122
175
  path: '$acceptedOffers'
@@ -125,40 +178,60 @@ class AcceptedOfferRepo {
125
178
  },
126
179
  ...matchStages
127
180
  ]);
128
- if (Array.isArray(inclusion) && inclusion.length > 0) {
129
- const specifiedProjection = {
130
- _id: 0
131
- };
132
- inclusion.forEach((key) => {
133
- specifiedProjection[key] = `$acceptedOffers.${key}`;
134
- });
135
- aggregate.project(specifiedProjection);
136
- }
137
- else {
138
- aggregate.project({
139
- _id: 0,
140
- itemOffered: '$acceptedOffers.itemOffered',
141
- priceSpecification: '$acceptedOffers.priceSpecification',
142
- typeOf: '$acceptedOffers.typeOf',
143
- id: '$acceptedOffers.id',
144
- offeredThrough: '$acceptedOffers.offeredThrough',
145
- name: '$acceptedOffers.name',
146
- serialNumber: '$acceptedOffers.serialNumber'
147
- });
148
- }
181
+ // if (Array.isArray(inclusion) && inclusion.length > 0) {
182
+ // const specifiedProjection: Record<string, string | 0> = {
183
+ // _id: 0
184
+ // };
185
+ // inclusion.forEach((key) => {
186
+ // specifiedProjection[key] = `$acceptedOffers.${key}`;
187
+ // });
188
+ // aggregate.project(specifiedProjection);
189
+ // } else {
190
+ // aggregate.project({
191
+ // _id: 0,
192
+ // itemOffered: '$acceptedOffers.itemOffered',
193
+ // priceSpecification: '$acceptedOffers.priceSpecification',
194
+ // typeOf: '$acceptedOffers.typeOf',
195
+ // id: '$acceptedOffers.id',
196
+ // offeredThrough: '$acceptedOffers.offeredThrough',
197
+ // name: '$acceptedOffers.name',
198
+ // serialNumber: '$acceptedOffers.serialNumber'
199
+ // });
200
+ // }
201
+ aggregate.project({
202
+ _id: 0,
203
+ itemOffered: '$acceptedOffers.itemOffered',
204
+ priceSpecification: '$acceptedOffers.priceSpecification',
205
+ typeOf: '$acceptedOffers.typeOf',
206
+ id: '$acceptedOffers.id',
207
+ offeredThrough: '$acceptedOffers.offeredThrough',
208
+ name: '$acceptedOffers.name',
209
+ serialNumber: '$acceptedOffers.serialNumber'
210
+ });
149
211
  if (typeof filter.limit === 'number' && filter.limit > 0) {
150
212
  const page = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1;
151
- aggregate.limit(filter.limit * page)
152
- .skip(filter.limit * (page - 1));
213
+ // support skip -> limit(2026-05-12~)
214
+ // aggregate.limit(filter.limit * page)
215
+ // .skip(filter.limit * (page - 1));
216
+ aggregate.skip(filter.limit * (page - 1))
217
+ .limit(filter.limit);
153
218
  }
154
- return aggregate
219
+ const acceptedOffers = await aggregate
155
220
  .option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
156
221
  .exec();
222
+ // 予約取引を参照(2026-05-18~)
223
+ const useReserveTransaction = options?.useReserveTransaction === true;
224
+ if (useReserveTransaction) {
225
+ return this.addAcceptedOffersDetails(acceptedOffers);
226
+ }
227
+ else {
228
+ return acceptedOffers;
229
+ }
157
230
  }
158
231
  /**
159
232
  * 注文オファーをsliceして検索する(2024-01-10~)
160
233
  */
161
- async searchSlicedAcceptedOffersByOrderNumber(filter) {
234
+ async searchSlicedAcceptedOffersByOrderNumber(filter, options) {
162
235
  const aggregate = this.orderModel.aggregate([
163
236
  { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
164
237
  { $match: { 'project.id': { $eq: filter.project.id.$eq } } },
@@ -177,7 +250,18 @@ class AcceptedOfferRepo {
177
250
  if (result === undefined) {
178
251
  throw new factory_1.factory.errors.NotFound(factory_1.factory.order.OrderType.Order);
179
252
  }
180
- return result;
253
+ const { acceptedOffers, numAcceptedOffers } = result;
254
+ // 予約取引を参照(2026-05-18~)
255
+ const useReserveTransaction = options?.useReserveTransaction === true;
256
+ if (useReserveTransaction) {
257
+ return {
258
+ acceptedOffers: await this.addAcceptedOffersDetails(acceptedOffers),
259
+ numAcceptedOffers
260
+ };
261
+ }
262
+ else {
263
+ return result;
264
+ }
181
265
  }
182
266
  async countByOrderNumber(filter) {
183
267
  const aggregate = this.orderModel.aggregate([
@@ -0,0 +1,30 @@
1
+ import type { Connection } from 'mongoose';
2
+ import { factory } from '../factory';
3
+ import { IModel } from './mongoose/schemas/assetTransaction';
4
+ import { IAcceptedOfferByReserveTransaction } from './factory/acceptedOffer/reserveTransaction2itemOffered';
5
+ export type IAcceptedOffer = Omit<factory.order.IAcceptedOffer, 'priceSpecification'> & {
6
+ /**
7
+ * COA以外では注文ドキュメントにpriceSpecificationが存在しないのでIFを補完
8
+ */
9
+ priceSpecification?: factory.order.ITicketPriceSpecification;
10
+ };
11
+ /**
12
+ * 予約取引に依存した注文オファーリポジトリ
13
+ */
14
+ export declare class AcceptedOfferInReserveRepo {
15
+ protected readonly reserveTransactionModel: IModel;
16
+ constructor(connection: Connection);
17
+ /**
18
+ * 予約番号指定で予約取引から注文オファーを生成する
19
+ */
20
+ protected findAcceptedOffersByReservationNumbers(params: {
21
+ /**
22
+ * 予約番号リスト
23
+ */
24
+ reservationNumbers: string[];
25
+ }): Promise<IAcceptedOfferByReserveTransaction[]>;
26
+ /**
27
+ * 予約取引からオファー詳細情報を付加する
28
+ */
29
+ protected addAcceptedOffersDetails(acceptedOffers: IAcceptedOffer[]): Promise<IAcceptedOffer[]>;
30
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AcceptedOfferInReserveRepo = void 0;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const factory_1 = require("../factory");
9
+ const assetTransaction_1 = require("./mongoose/schemas/assetTransaction");
10
+ const reserveTransaction2itemOffered_1 = require("./factory/acceptedOffer/reserveTransaction2itemOffered");
11
+ const debug = (0, debug_1.default)('chevre-domain:repo:acceptedOffer');
12
+ /**
13
+ * 予約取引に依存した注文オファーリポジトリ
14
+ */
15
+ class AcceptedOfferInReserveRepo {
16
+ reserveTransactionModel;
17
+ constructor(connection) {
18
+ this.reserveTransactionModel = connection.model(assetTransaction_1.modelName, (0, assetTransaction_1.createSchema)());
19
+ }
20
+ /**
21
+ * 予約番号指定で予約取引から注文オファーを生成する
22
+ */
23
+ async findAcceptedOffersByReservationNumbers(params) {
24
+ const { reservationNumbers } = params;
25
+ if (!Array.isArray(reservationNumbers) || reservationNumbers.length === 0) {
26
+ throw new factory_1.factory.errors.ArgumentNull('reservationNumbers');
27
+ }
28
+ const reserveTransactions = await this.reserveTransactionModel.find({
29
+ transactionNumber: { $in: reservationNumbers },
30
+ typeOf: { $eq: factory_1.factory.assetTransactionType.Reserve }
31
+ }, {
32
+ object: 1
33
+ })
34
+ .lean()
35
+ .exec();
36
+ debug('findSubReservationsByReservationNumbers: reservationNumbers.length === reserveTransactions.length?', reservationNumbers.length === reserveTransactions.length);
37
+ return reserveTransactions.reduce((a, b) => {
38
+ return [...a, ...(0, reserveTransaction2itemOffered_1.reserveTransaction2itemOffered)(b)];
39
+ }, []);
40
+ }
41
+ /**
42
+ * 予約取引からオファー詳細情報を付加する
43
+ */
44
+ async addAcceptedOffersDetails(acceptedOffers) {
45
+ const offeredThroughIdentifier = acceptedOffers.at(0)?.offeredThrough?.identifier;
46
+ if (offeredThroughIdentifier === factory_1.factory.service.webAPI.Identifier.COA) {
47
+ // COAでは予約取引を参照しない
48
+ return acceptedOffers;
49
+ }
50
+ const reservationNumbers = [...new Set(acceptedOffers.map((acceptedOffer) => String(acceptedOffer.serialNumber)))];
51
+ let acceptedOffersByReserveTransaction = [];
52
+ if (reservationNumbers.length > 0) {
53
+ acceptedOffersByReserveTransaction = await this.findAcceptedOffersByReservationNumbers({ reservationNumbers });
54
+ }
55
+ return acceptedOffers.map((acceptedOffer) => {
56
+ const acceptedOfferByReserveTransaction = acceptedOffersByReserveTransaction.find(((offer) => offer.itemOffered.id === acceptedOffer.itemOffered.id));
57
+ // 予約は必ず存在するはず
58
+ if (acceptedOfferByReserveTransaction === undefined) {
59
+ console.error('repo:acceptedOffer: addAcceptedOffersDetails: acceptedOfferByReserveTransaction: undefined!!!', acceptedOffer.itemOffered.id);
60
+ }
61
+ const priceSpecByReserveTransaction = acceptedOfferByReserveTransaction?.priceSpecification;
62
+ // 予約の価格は必ず存在するはず
63
+ if (priceSpecByReserveTransaction === undefined) {
64
+ console.error('repo:acceptedOffer: addAcceptedOffersDetails: priceSpecByReserveTransaction: undefined!!!', acceptedOffer.itemOffered.id);
65
+ }
66
+ const { priceSpecification: _originalPriceSpec, // 注文ドキュメントのpriceSpecificationはもう採用しない(2026-05-21~)
67
+ ...acceptedOfferWithoutPrice } = acceptedOffer;
68
+ return {
69
+ ...acceptedOfferWithoutPrice,
70
+ ...((priceSpecByReserveTransaction !== undefined) && { priceSpecification: priceSpecByReserveTransaction }) // 予約取引参照の値で上書き
71
+ // ...(priceSpecByReserveTransaction !== undefined)
72
+ // ? { priceSpecification: priceSpecByReserveTransaction } // 予約取引参照の値で上書き
73
+ // : { priceSpecification } // 万が一予約取引に存在しなければ注文ドキュメントの値を採用
74
+ };
75
+ });
76
+ }
77
+ }
78
+ exports.AcceptedOfferInReserveRepo = AcceptedOfferInReserveRepo;
@@ -2,6 +2,11 @@ import type { Connection, PipelineStage } from 'mongoose';
2
2
  import { factory } from '../factory';
3
3
  import { IDocType } from './mongoose/schemas/accountingReport';
4
4
  type IMatchStage = PipelineStage.Match;
5
+ type IReportAsFindResult = Pick<factory.report.accountingReport.IReport, 'mainEntity'> & {
6
+ isPartOf: {
7
+ mainEntity: factory.report.accountingReport.IOrderAsMainEntity;
8
+ };
9
+ };
5
10
  /**
6
11
  * 経理レポートリポジトリ
7
12
  */
@@ -35,11 +40,13 @@ export declare class AccountingReportRepo {
35
40
  };
36
41
  hasPart: factory.report.accountingReport.IChildReport;
37
42
  }): Promise<void>;
38
- search(params: factory.report.accountingReport.ISearchConditions & {
43
+ findAccountingReports(params: factory.report.accountingReport.ISearchConditions & {
39
44
  seller?: {
40
45
  id?: string;
41
46
  };
42
- }): Promise<any[]>;
47
+ limit: number;
48
+ page: number;
49
+ }): Promise<IReportAsFindResult[]>;
43
50
  unsetUnnecessaryFields(params: {
44
51
  filter: any;
45
52
  $unset: any;
@@ -4,7 +4,6 @@ exports.AccountingReportRepo = void 0;
4
4
  const errorHandler_1 = require("../errorHandler");
5
5
  const factory_1 = require("../factory");
6
6
  const accountingReport_1 = require("./mongoose/schemas/accountingReport");
7
- const DEFAULT_SEARCH_LIMIT = 100;
8
7
  /**
9
8
  * 経理レポートリポジトリ
10
9
  */
@@ -49,30 +48,6 @@ class AccountingReportRepo {
49
48
  $match: { 'mainEntity.orderDate': { $lte: orderDateLte } }
50
49
  });
51
50
  }
52
- // discontinue(2026-05-01~)
53
- // const reservationForStartDateGte = params.order?.acceptedOffers?.itemOffered?.reservationFor?.startDate?.$gte;
54
- // if (reservationForStartDateGte instanceof Date) {
55
- // matchStages.push({
56
- // $match: {
57
- // 'mainEntity.acceptedOffers.itemOffered.reservationFor.startDate': {
58
- // $exists: true,
59
- // $gte: reservationForStartDateGte
60
- // }
61
- // }
62
- // });
63
- // }
64
- // discontinue(2026-05-01~)
65
- // const reservationForStartDateLte = params.order?.acceptedOffers?.itemOffered?.reservationFor?.startDate?.$lte;
66
- // if (reservationForStartDateLte instanceof Date) {
67
- // matchStages.push({
68
- // $match: {
69
- // 'mainEntity.acceptedOffers.itemOffered.reservationFor.startDate': {
70
- // $exists: true,
71
- // $lte: reservationForStartDateLte
72
- // }
73
- // }
74
- // });
75
- // }
76
51
  return matchStages;
77
52
  }
78
53
  async syncMainEntity(params) {
@@ -137,18 +112,16 @@ class AccountingReportRepo {
137
112
  throw new factory_1.factory.errors.NotFound(this.accountingReportModel.modelName);
138
113
  }
139
114
  }
140
- async search(params) {
141
- const limit = (typeof params.limit === 'number') ? Math.min(params.limit, DEFAULT_SEARCH_LIMIT) : DEFAULT_SEARCH_LIMIT;
142
- const page = (typeof params.page === 'number') ? Math.max(params.page, 1) : 1;
143
- const unwindAcceptedOffers = params.$unwindAcceptedOffers === '1';
115
+ async findAccountingReports(params) {
116
+ const { limit, page } = params;
144
117
  const matchStages = AccountingReportRepo.CREATE_MONGO_CONDITIONS(params);
145
118
  const aggregate = this.accountingReportModel.aggregate([
119
+ ...matchStages,
146
120
  // pipelineの順序に注意
147
121
  // @see https://docs.mongodb.com/manual/reference/operator/aggregation/sort/
148
122
  { $sort: { 'mainEntity.orderDate': factory_1.factory.sortType.Descending } },
149
123
  { $unwind: '$hasPart' },
150
- ...(unwindAcceptedOffers) ? [{ $unwind: '$mainEntity.acceptedOffers' }] : [],
151
- ...matchStages,
124
+ // hasPart内に対する検索条件は存在しないため、unwind後のmatchは不要
152
125
  {
153
126
  $project: {
154
127
  _id: 0,
@@ -159,10 +132,9 @@ class AccountingReportRepo {
159
132
  }
160
133
  }
161
134
  ]);
162
- return aggregate.allowDiskUse(true)
163
- .limit(limit * page)
135
+ return aggregate
164
136
  .skip(limit * (page - 1))
165
- // .setOptions({ maxTimeMS: 10000 })
137
+ .limit(limit)
166
138
  .exec();
167
139
  }
168
140
  async unsetUnnecessaryFields(params) {
@@ -30,7 +30,7 @@ export type IRecipeAsActionAttributes<T extends factory.recipe.RecipeCategory> =
30
30
  export type IMinimizedPurchaseNumberAuthResult = Pick<factory.action.check.paymentMethod.movieTicket.IPurchaseNumberAuthResult, 'mkknmiNumSum' | 'resultInfo' | 'ykknmiNumSum'> & {
31
31
  knyknrNoInfoOut: Omit<factory.action.check.paymentMethod.movieTicket.IPurchaseNumberInfo, 'ykknInfo' | 'mkknInfo'>[] | null;
32
32
  };
33
- export type IKeyOfProjection = keyof IAction<factory.actionType> | keyof IAction<factory.actionType.AuthorizeAction> | keyof IAction<factory.actionType.MoneyTransfer> | keyof IAction<factory.actionType.ReplaceAction> | 'identifier';
33
+ export type IKeyOfProjection = keyof IAction<factory.actionType> | keyof IAction<factory.actionType.AuthorizeAction> | keyof IAction<factory.actionType.ReplaceAction> | 'identifier';
34
34
  export declare const AVAILABLE_PROJECT_FIELDS: IKeyOfProjection[];
35
35
  /**
36
36
  * アクション状態管理リポジトリ
@@ -1,7 +1,6 @@
1
1
  import type { Connection } from 'mongoose';
2
2
  import { factory } from '../../factory';
3
3
  type ISubReservationAsFindResult = Pick<factory.reservation.eventReservation.IReservation, 'underName' | 'id'> & {
4
- price?: factory.reservation.eventReservation.IPrice;
5
4
  reservedTicket?: Pick<factory.reservation.eventReservation.IReservedTicket, 'ticketType'>;
6
5
  reservationFor?: factory.assetTransaction.reserve.IReservationFor;
7
6
  };