@chevre/domain 24.1.0-alpha.2 → 24.1.0-alpha.20
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.
- package/README.md +0 -2
- package/lib/chevre/repo/acceptedOffer.d.ts +16 -11
- package/lib/chevre/repo/acceptedOffer.js +172 -48
- package/lib/chevre/repo/accountingReport.d.ts +9 -2
- package/lib/chevre/repo/accountingReport.js +6 -34
- package/lib/chevre/repo/action/actionProcess.d.ts +1 -1
- package/lib/chevre/repo/aggregateReservation.d.ts +6 -0
- package/lib/chevre/repo/aggregateReservation.js +9 -0
- package/lib/chevre/repo/assetTransaction/reserve.d.ts +3 -1
- package/lib/chevre/repo/assetTransaction/reserve.js +3 -1
- package/lib/chevre/repo/event.js +12 -8
- package/lib/chevre/repo/factory/acceptedOffer/reserveTransaction2itemOffered.d.ts +9 -0
- package/lib/chevre/repo/factory/acceptedOffer/reserveTransaction2itemOffered.js +72 -0
- package/lib/chevre/repo/factory/reservation/createMongoConditions.js +155 -180
- package/lib/chevre/repo/mongoose/schemas/accountingReport.js +42 -42
- package/lib/chevre/repo/mongoose/schemas/order.js +108 -108
- package/lib/chevre/repo/mongoose/schemas/reservation.d.ts +3 -1
- package/lib/chevre/repo/mongoose/schemas/reservation.js +128 -146
- package/lib/chevre/repo/order.d.ts +2 -1
- package/lib/chevre/repo/order.js +171 -170
- package/lib/chevre/repo/orderInTransaction.d.ts +32 -2
- package/lib/chevre/repo/orderInTransaction.js +77 -0
- package/lib/chevre/repo/reservation.d.ts +20 -7
- package/lib/chevre/repo/reservation.js +14 -10
- package/lib/chevre/repo/role.d.ts +1 -15
- package/lib/chevre/repo/role.js +7 -14
- package/lib/chevre/repo/transaction.d.ts +6 -6
- package/lib/chevre/service/aggregation/event/aggregateOffers.js +22 -26
- package/lib/chevre/service/assetTransaction/cancelReservation/factory.js +14 -11
- package/lib/chevre/service/assetTransaction/cancelReservation/start.d.ts +1 -1
- package/lib/chevre/service/assetTransaction/cancelReservation/start.js +1 -1
- package/lib/chevre/service/assetTransaction/reserve/start/factory/createReservation.js +0 -12
- package/lib/chevre/service/assetTransaction/reserve/start/factory/price.d.ts +1 -1
- package/lib/chevre/service/offer/any.d.ts +3 -1
- package/lib/chevre/service/offer/event/authorize/factory.d.ts +2 -1
- package/lib/chevre/service/offer/event/authorize/factory.js +4 -7
- package/lib/chevre/service/offer/eventServiceByCOA/authorize/factory.d.ts +1 -0
- package/lib/chevre/service/order/createAccountingReportIfNotExist.d.ts +1 -3
- package/lib/chevre/service/order/createAccountingReportIfNotExist.js +67 -72
- package/lib/chevre/service/order/deleteOrder.js +19 -43
- package/lib/chevre/service/order/onAssetTransactionStatusChanged/paymentDue2Processing.js +9 -11
- package/lib/chevre/service/order/placeOrder/factory/orderedItem.d.ts +1 -1
- package/lib/chevre/service/order/placeOrder/factory/orderedItem.js +0 -5
- package/lib/chevre/service/order/placeOrder/factory.d.ts +1 -1
- package/lib/chevre/service/order/sendOrder.js +0 -3
- package/lib/chevre/service/reserve/confirmReservation.js +7 -7
- package/lib/chevre/service/reserve/factory.js +2 -1
- package/lib/chevre/service/reserve/findByCode.d.ts +1 -1
- package/lib/chevre/service/reserve/findByCode.js +1 -1
- package/lib/chevre/service/reserve/findReservations.d.ts +5 -2
- package/lib/chevre/service/reserve/findReservations.js +16 -2
- package/lib/chevre/service/reserve/potentialActions/onReservationConfirmed.d.ts +4 -3
- package/lib/chevre/service/reserve/potentialActions/onReservationConfirmed.js +1 -9
- package/lib/chevre/service/reserve/searchByOrder.js +7 -3
- package/lib/chevre/service/reserve/useReservation.d.ts +1 -1
- package/lib/chevre/service/reserve/useReservation.js +20 -24
- package/lib/chevre/service/task/confirmReserveTransaction.js +1 -1
- package/lib/chevre/service/task/createAccountingReport.js +7 -9
- package/lib/chevre/service/task/payment/payByTask.js +2 -2
- package/lib/chevre/service/task/useReservation.d.ts +2 -2
- package/lib/chevre/service/task/useReservation.js +6 -18
- package/lib/chevre/service/taskHandler.js +1 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateInvoiceReferencesOrder.d.ts +1 -1
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateMovieTicket.d.ts +1 -1
- package/lib/chevre/service/transaction/placeOrder/confirm/validation.d.ts +2 -2
- package/lib/chevre/service/transaction/placeOrder/confirm.js +5 -2
- 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
|
[](https://www.npmjs.com/package/@chevre/domain)
|
|
4
|
-
[](https://circleci.com/gh/chevre-jp/domain)
|
|
5
|
-
[](https://coveralls.io/github/chevre-jp/domain?branch=master)
|
|
6
4
|
[](https://snyk.io/test/github/chevre-jp/domain)
|
|
7
5
|
[](https://nodei.co/npm/@chevre/domain/)
|
|
8
6
|
|
|
@@ -2,10 +2,8 @@ import type { Connection } from 'mongoose';
|
|
|
2
2
|
import { factory } from '../factory';
|
|
3
3
|
type IProjection4searchWithUnwoundAcceptedOffers = {
|
|
4
4
|
[key in keyof factory.order.IOrder]?: 1;
|
|
5
|
-
} & {
|
|
6
|
-
|
|
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';
|
|
5
|
+
} & {};
|
|
6
|
+
type IDistinctField = 'acceptedOffers.id' | 'acceptedOffers.itemOffered.reservationNumber' | 'acceptedOffers.itemOffered.reservationFor.id' | 'acceptedOffers.serialNumber' | 'acceptedOffers.offeredThrough.identifier' | 'acceptedOffers.itemOffered.reservationFor.superEvent.location.branchCode';
|
|
9
7
|
type IAcceptedOffer = factory.order.IAcceptedOffer;
|
|
10
8
|
interface ISearchSlicedAcceptedOffersResult {
|
|
11
9
|
acceptedOffers: IAcceptedOffer[];
|
|
@@ -16,13 +14,22 @@ interface ISearchSlicedAcceptedOffersResult {
|
|
|
16
14
|
*/
|
|
17
15
|
export declare class AcceptedOfferRepo {
|
|
18
16
|
private readonly orderModel;
|
|
17
|
+
private readonly reserveTransactionModel;
|
|
19
18
|
constructor(connection: Connection);
|
|
19
|
+
/**
|
|
20
|
+
* 予約番号指定で予約取引からitemOfferedを生成する
|
|
21
|
+
*/
|
|
22
|
+
private findSubReservationsByReservationNumbers;
|
|
20
23
|
/**
|
|
21
24
|
* オファー展開の注文検索
|
|
22
25
|
*/
|
|
23
26
|
searchWithUnwoundAcceptedOffers(params: factory.order.ISearchConditions, projection: IProjection4searchWithUnwoundAcceptedOffers, options: {
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
useMatchBeforeUnwind: boolean;
|
|
28
|
+
useReserveTransaction: boolean;
|
|
29
|
+
}): Promise<(factory.order.IOrder & {
|
|
30
|
+
acceptedOffers: [factory.order.IAcceptedOffer];
|
|
31
|
+
_id?: never;
|
|
32
|
+
})[]>;
|
|
26
33
|
aggreateOwnershipInfosByOrder(filter: {
|
|
27
34
|
orderNumber: {
|
|
28
35
|
$eq: string;
|
|
@@ -36,7 +43,6 @@ export declare class AcceptedOfferRepo {
|
|
|
36
43
|
searchAcceptedOffersByOrderNumber(filter: {
|
|
37
44
|
limit?: number;
|
|
38
45
|
page?: number;
|
|
39
|
-
$slice?: [number, number];
|
|
40
46
|
orderNumber: {
|
|
41
47
|
$eq: string;
|
|
42
48
|
};
|
|
@@ -53,9 +59,6 @@ export declare class AcceptedOfferRepo {
|
|
|
53
59
|
id?: {
|
|
54
60
|
$eq?: string;
|
|
55
61
|
};
|
|
56
|
-
typeOf?: {
|
|
57
|
-
$in?: factory.order.IItemOffered['typeOf'][];
|
|
58
|
-
};
|
|
59
62
|
reservationFor?: {
|
|
60
63
|
id?: {
|
|
61
64
|
$in?: string[];
|
|
@@ -70,7 +73,9 @@ export declare class AcceptedOfferRepo {
|
|
|
70
73
|
};
|
|
71
74
|
};
|
|
72
75
|
};
|
|
73
|
-
},
|
|
76
|
+
}, options?: {
|
|
77
|
+
useReserveTransaction: boolean;
|
|
78
|
+
}): Promise<IAcceptedOffer[]>;
|
|
74
79
|
/**
|
|
75
80
|
* 注文オファーをsliceして検索する(2024-01-10~)
|
|
76
81
|
*/
|
|
@@ -3,6 +3,8 @@ 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 assetTransaction_1 = require("./mongoose/schemas/assetTransaction");
|
|
7
|
+
const reserveTransaction2itemOffered_1 = require("./factory/acceptedOffer/reserveTransaction2itemOffered");
|
|
6
8
|
const order_2 = require("./order");
|
|
7
9
|
const settings_1 = require("../settings");
|
|
8
10
|
/**
|
|
@@ -10,16 +12,45 @@ const settings_1 = require("../settings");
|
|
|
10
12
|
*/
|
|
11
13
|
class AcceptedOfferRepo {
|
|
12
14
|
orderModel;
|
|
15
|
+
reserveTransactionModel;
|
|
13
16
|
constructor(connection) {
|
|
14
17
|
this.orderModel = connection.model(order_1.modelName, (0, order_1.createSchema)());
|
|
18
|
+
this.reserveTransactionModel = connection.model(assetTransaction_1.modelName, (0, assetTransaction_1.createSchema)());
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 予約番号指定で予約取引からitemOfferedを生成する
|
|
22
|
+
*/
|
|
23
|
+
async findSubReservationsByReservationNumbers(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
|
+
return reserveTransactions.reduce((a, b) => {
|
|
37
|
+
return [...a, ...(0, reserveTransaction2itemOffered_1.reserveTransaction2itemOffered)(b)];
|
|
38
|
+
}, []);
|
|
15
39
|
}
|
|
16
40
|
/**
|
|
17
41
|
* オファー展開の注文検索
|
|
18
42
|
*/
|
|
19
43
|
async searchWithUnwoundAcceptedOffers(params, projection, options) {
|
|
20
|
-
const {
|
|
44
|
+
const { useMatchBeforeUnwind } = options;
|
|
21
45
|
const conditions = order_2.OrderRepo.CREATE_MONGO_CONDITIONS(params);
|
|
22
46
|
const aggregate = this.orderModel.aggregate();
|
|
47
|
+
if (useMatchBeforeUnwind) {
|
|
48
|
+
// unwind->matchでは遅い?
|
|
49
|
+
// match->unwind->matchにする(2026-05-08~)
|
|
50
|
+
conditions.forEach((c) => {
|
|
51
|
+
aggregate.match(c);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
23
54
|
// pipelineの順序に注意
|
|
24
55
|
// @see https://docs.mongodb.com/manual/reference/operator/aggregation/sort/
|
|
25
56
|
/* istanbul ignore else */
|
|
@@ -32,35 +63,70 @@ class AcceptedOfferRepo {
|
|
|
32
63
|
});
|
|
33
64
|
aggregate.project({
|
|
34
65
|
...projection,
|
|
66
|
+
_id: 0, // hide _id(2026-05-16~)
|
|
35
67
|
acceptedOffers: ['$acceptedOffers']
|
|
36
68
|
});
|
|
37
69
|
if (typeof params.limit === 'number' && params.limit > 0) {
|
|
38
70
|
const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
|
|
39
71
|
// support skip -> limit(2025-07-09~)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
.limit(params.limit);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
aggregate.limit(params.limit * page)
|
|
46
|
-
.skip(params.limit * (page - 1));
|
|
47
|
-
}
|
|
72
|
+
aggregate.skip(params.limit * (page - 1))
|
|
73
|
+
.limit(params.limit);
|
|
48
74
|
}
|
|
49
|
-
|
|
50
|
-
// .allowDiskUse(true) // false化(2023-11-30~)
|
|
75
|
+
const orders = await aggregate
|
|
51
76
|
.option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
|
|
52
77
|
.exec();
|
|
78
|
+
// 予約取引を参照(2026-05-17~)
|
|
79
|
+
const offeredThroughIdentifier = orders.at(0)?.acceptedOffers[0].offeredThrough?.identifier;
|
|
80
|
+
const useReserveTransaction = options.useReserveTransaction === true
|
|
81
|
+
&& offeredThroughIdentifier !== factory_1.factory.service.webAPI.Identifier.COA; // COAでは予約取引を参照しない
|
|
82
|
+
if (useReserveTransaction) {
|
|
83
|
+
const reservationNumbers = [...new Set(orders.map((order) => String(order.acceptedOffers[0].serialNumber)))];
|
|
84
|
+
// console.log(reservationNumbers.length, 'reservationNumbers found')
|
|
85
|
+
let subReservations = [];
|
|
86
|
+
if (reservationNumbers.length > 0) {
|
|
87
|
+
subReservations = await this.findSubReservationsByReservationNumbers({ reservationNumbers });
|
|
88
|
+
}
|
|
89
|
+
// console.log(subReservations.length, 'subReservations found');
|
|
90
|
+
return orders.map((order) => {
|
|
91
|
+
const acceptedOffer = order.acceptedOffers[0];
|
|
92
|
+
const subReservation = subReservations.find(((reservation) => reservation.id === acceptedOffer.itemOffered.id));
|
|
93
|
+
// 予約は必ず存在するはず
|
|
94
|
+
if (subReservation === undefined) {
|
|
95
|
+
console.error('searchWithUnwoundAcceptedOffers: subReservation: undefined!!!', acceptedOffer.itemOffered.id);
|
|
96
|
+
}
|
|
97
|
+
const priceSpecByReserveTransaction = subReservation?.price;
|
|
98
|
+
// 予約の価格は必ず存在するはず
|
|
99
|
+
if (priceSpecByReserveTransaction === undefined) {
|
|
100
|
+
console.error('searchWithUnwoundAcceptedOffers: priceSpecByReserveTransaction: undefined!!!', acceptedOffer.itemOffered.id);
|
|
101
|
+
}
|
|
102
|
+
const { priceSpecification, ...acceptedOfferWithoutPrice } = acceptedOffer;
|
|
103
|
+
return {
|
|
104
|
+
...order,
|
|
105
|
+
acceptedOffers: [
|
|
106
|
+
{
|
|
107
|
+
...acceptedOfferWithoutPrice,
|
|
108
|
+
...(priceSpecByReserveTransaction !== undefined)
|
|
109
|
+
? { priceSpecification: priceSpecByReserveTransaction } // 予約取引参照の値で上書き
|
|
110
|
+
: { priceSpecification } // 万が一予約取引に存在しなければ注文ドキュメントの値を採用
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return orders;
|
|
118
|
+
}
|
|
53
119
|
}
|
|
54
120
|
async aggreateOwnershipInfosByOrder(filter) {
|
|
55
121
|
const aggregate = this.orderModel.aggregate([
|
|
122
|
+
{ $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
|
|
123
|
+
{ $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } },
|
|
56
124
|
{
|
|
57
125
|
$unwind: {
|
|
58
126
|
path: '$acceptedOffers',
|
|
59
127
|
includeArrayIndex: 'acceptedOfferIndex'
|
|
60
128
|
}
|
|
61
129
|
},
|
|
62
|
-
{ $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
|
|
63
|
-
{ $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } },
|
|
64
130
|
{
|
|
65
131
|
$project: {
|
|
66
132
|
_id: 0,
|
|
@@ -81,22 +147,35 @@ class AcceptedOfferRepo {
|
|
|
81
147
|
/**
|
|
82
148
|
* 注文オファーを展開して検索する
|
|
83
149
|
*/
|
|
84
|
-
async searchAcceptedOffersByOrderNumber(filter,
|
|
85
|
-
|
|
150
|
+
async searchAcceptedOffersByOrderNumber(filter,
|
|
151
|
+
// inclusion?: (keyof IAcceptedOffer)[], // 分かりにくいので廃止(2026-05-17~)
|
|
152
|
+
options) {
|
|
153
|
+
/**
|
|
154
|
+
* unwind前に1ドキュメントを特定するためのstage
|
|
155
|
+
*/
|
|
156
|
+
const matchStagesOneDocument = [
|
|
86
157
|
{ $match: { orderNumber: { $eq: filter.orderNumber.$eq } } },
|
|
87
158
|
{ $match: { 'project.id': { $eq: filter.project.id.$eq } } },
|
|
88
159
|
{ $match: { typeOf: { $eq: factory_1.factory.order.OrderType.Order } } }
|
|
89
160
|
];
|
|
161
|
+
/**
|
|
162
|
+
* unwind後にオファー内容で絞るstage
|
|
163
|
+
*/
|
|
164
|
+
const matchStages = [
|
|
165
|
+
// { $match: { orderNumber: { $eq: filter.orderNumber.$eq } } }, // matchStagesOneDocumentへ移行(2026-05-12~)
|
|
166
|
+
// { $match: { 'project.id': { $eq: filter.project.id.$eq } } }, // matchStagesOneDocumentへ移行(2026-05-12~)
|
|
167
|
+
// { $match: { typeOf: { $eq: factory.order.OrderType.Order } } } // matchStagesOneDocumentへ移行(2026-05-12~)
|
|
168
|
+
];
|
|
90
169
|
const itemOfferedIdEq = filter.acceptedOffers?.itemOffered?.id?.$eq;
|
|
91
170
|
if (typeof itemOfferedIdEq === 'string') {
|
|
92
171
|
matchStages.push({ $match: { 'acceptedOffers.itemOffered.id': { $exists: true, $eq: itemOfferedIdEq } } });
|
|
93
172
|
}
|
|
94
|
-
const itemOfferedTypeOfIn = filter.acceptedOffers?.itemOffered?.typeOf?.$in;
|
|
95
|
-
if (Array.isArray(itemOfferedTypeOfIn)) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
173
|
+
// const itemOfferedTypeOfIn = filter.acceptedOffers?.itemOffered?.typeOf?.$in;
|
|
174
|
+
// if (Array.isArray(itemOfferedTypeOfIn)) {
|
|
175
|
+
// matchStages.push({
|
|
176
|
+
// $match: { 'acceptedOffers.itemOffered.typeOf': { $exists: true, $in: itemOfferedTypeOfIn } }
|
|
177
|
+
// });
|
|
178
|
+
// }
|
|
100
179
|
const resevationForIdIn = filter.acceptedOffers?.itemOffered?.reservationFor?.id?.$in;
|
|
101
180
|
if (Array.isArray(resevationForIdIn)) {
|
|
102
181
|
matchStages.push({
|
|
@@ -114,9 +193,7 @@ class AcceptedOfferRepo {
|
|
|
114
193
|
});
|
|
115
194
|
}
|
|
116
195
|
const aggregate = this.orderModel.aggregate([
|
|
117
|
-
|
|
118
|
-
// aggregate.sort({ orderDate: params.sort.orderDate });
|
|
119
|
-
// }
|
|
196
|
+
...matchStagesOneDocument,
|
|
120
197
|
{
|
|
121
198
|
$unwind: {
|
|
122
199
|
path: '$acceptedOffers'
|
|
@@ -125,35 +202,82 @@ class AcceptedOfferRepo {
|
|
|
125
202
|
},
|
|
126
203
|
...matchStages
|
|
127
204
|
]);
|
|
128
|
-
if (Array.isArray(inclusion) && inclusion.length > 0) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
205
|
+
// if (Array.isArray(inclusion) && inclusion.length > 0) {
|
|
206
|
+
// const specifiedProjection: Record<string, string | 0> = {
|
|
207
|
+
// _id: 0
|
|
208
|
+
// };
|
|
209
|
+
// inclusion.forEach((key) => {
|
|
210
|
+
// specifiedProjection[key] = `$acceptedOffers.${key}`;
|
|
211
|
+
// });
|
|
212
|
+
// aggregate.project(specifiedProjection);
|
|
213
|
+
// } else {
|
|
214
|
+
// aggregate.project({
|
|
215
|
+
// _id: 0,
|
|
216
|
+
// itemOffered: '$acceptedOffers.itemOffered',
|
|
217
|
+
// priceSpecification: '$acceptedOffers.priceSpecification',
|
|
218
|
+
// typeOf: '$acceptedOffers.typeOf',
|
|
219
|
+
// id: '$acceptedOffers.id',
|
|
220
|
+
// offeredThrough: '$acceptedOffers.offeredThrough',
|
|
221
|
+
// name: '$acceptedOffers.name',
|
|
222
|
+
// serialNumber: '$acceptedOffers.serialNumber'
|
|
223
|
+
// });
|
|
224
|
+
// }
|
|
225
|
+
aggregate.project({
|
|
226
|
+
_id: 0,
|
|
227
|
+
itemOffered: '$acceptedOffers.itemOffered',
|
|
228
|
+
priceSpecification: '$acceptedOffers.priceSpecification',
|
|
229
|
+
typeOf: '$acceptedOffers.typeOf',
|
|
230
|
+
id: '$acceptedOffers.id',
|
|
231
|
+
offeredThrough: '$acceptedOffers.offeredThrough',
|
|
232
|
+
name: '$acceptedOffers.name',
|
|
233
|
+
serialNumber: '$acceptedOffers.serialNumber'
|
|
234
|
+
});
|
|
149
235
|
if (typeof filter.limit === 'number' && filter.limit > 0) {
|
|
150
236
|
const page = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1;
|
|
151
|
-
|
|
152
|
-
|
|
237
|
+
// support skip -> limit(2026-05-12~)
|
|
238
|
+
// aggregate.limit(filter.limit * page)
|
|
239
|
+
// .skip(filter.limit * (page - 1));
|
|
240
|
+
aggregate.skip(filter.limit * (page - 1))
|
|
241
|
+
.limit(filter.limit);
|
|
153
242
|
}
|
|
154
|
-
|
|
243
|
+
const acceptedOffers = await aggregate
|
|
155
244
|
.option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
|
|
156
245
|
.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では予約取引を参照しない
|
|
250
|
+
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
|
+
});
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
return acceptedOffers;
|
|
280
|
+
}
|
|
157
281
|
}
|
|
158
282
|
/**
|
|
159
283
|
* 注文オファーをsliceして検索する(2024-01-10~)
|
|
@@ -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
|
-
|
|
43
|
+
findAccountingReports(params: factory.report.accountingReport.ISearchConditions & {
|
|
39
44
|
seller?: {
|
|
40
45
|
id?: string;
|
|
41
46
|
};
|
|
42
|
-
|
|
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
|
|
141
|
-
const
|
|
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
|
-
|
|
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
|
|
163
|
-
.limit(limit * page)
|
|
135
|
+
return aggregate
|
|
164
136
|
.skip(limit * (page - 1))
|
|
165
|
-
|
|
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.
|
|
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
|
* アクション状態管理リポジトリ
|
|
@@ -54,5 +54,11 @@ export declare class AggregateReservationRepo {
|
|
|
54
54
|
filter: any;
|
|
55
55
|
$unset: any;
|
|
56
56
|
}): Promise<import("mongoose").UpdateWriteOpResult>;
|
|
57
|
+
/**
|
|
58
|
+
* イベント開始日時が指定以前の集計を削除する
|
|
59
|
+
*/
|
|
60
|
+
deleteManyByEventStartDate(params: {
|
|
61
|
+
reservationForStartDateLte: Date;
|
|
62
|
+
}): Promise<import("mongodb").DeleteResult>;
|
|
57
63
|
}
|
|
58
64
|
export {};
|
|
@@ -132,5 +132,14 @@ class AggregateReservationRepo {
|
|
|
132
132
|
return this.aggregateReservationModel.updateMany(params.filter, { $unset: params.$unset }, { timestamps: false })
|
|
133
133
|
.exec();
|
|
134
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* イベント開始日時が指定以前の集計を削除する
|
|
137
|
+
*/
|
|
138
|
+
async deleteManyByEventStartDate(params) {
|
|
139
|
+
return this.aggregateReservationModel.deleteMany({
|
|
140
|
+
'reservationFor.startDate': { $lte: params.reservationForStartDateLte }
|
|
141
|
+
})
|
|
142
|
+
.exec();
|
|
143
|
+
}
|
|
135
144
|
}
|
|
136
145
|
exports.AggregateReservationRepo = AggregateReservationRepo;
|
|
@@ -1,9 +1,11 @@
|
|
|
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
|
-
|
|
4
|
+
numSeats?: number;
|
|
5
|
+
price?: factory.assetTransaction.reserve.IPrice;
|
|
5
6
|
reservedTicket?: Pick<factory.reservation.eventReservation.IReservedTicket, 'ticketType'>;
|
|
6
7
|
reservationFor?: factory.assetTransaction.reserve.IReservationFor;
|
|
8
|
+
issuedThrough?: factory.assetTransaction.reserve.IIssuedThrough;
|
|
7
9
|
};
|
|
8
10
|
/**
|
|
9
11
|
* 予約取引リポジトリ
|
|
@@ -91,12 +91,14 @@ class ReserveTransactionRepo {
|
|
|
91
91
|
$project: {
|
|
92
92
|
_id: 0,
|
|
93
93
|
id: '$object.subReservation.id',
|
|
94
|
+
numSeats: '$object.subReservation.numSeats',
|
|
94
95
|
price: '$object.subReservation.price',
|
|
95
96
|
underName: '$object.underName',
|
|
96
97
|
reservationFor: '$object.reservationFor',
|
|
97
98
|
reservedTicket: {
|
|
98
99
|
ticketType: '$object.subReservation.reservedTicket.ticketType',
|
|
99
|
-
}
|
|
100
|
+
},
|
|
101
|
+
issuedThrough: '$object.issuedThrough',
|
|
100
102
|
}
|
|
101
103
|
}
|
|
102
104
|
]);
|
package/lib/chevre/repo/event.js
CHANGED
|
@@ -798,22 +798,26 @@ class EventRepo {
|
|
|
798
798
|
.sort({ startDate: factory_1.factory.sortType.Descending })
|
|
799
799
|
.cursor();
|
|
800
800
|
}
|
|
801
|
-
//
|
|
801
|
+
// /**
|
|
802
|
+
// * アプリケーションオファー廃止用のメソッド
|
|
803
|
+
// */
|
|
804
|
+
// public async removeAvailableAtOrFrom(params: {
|
|
802
805
|
// id: string;
|
|
803
806
|
// offers: {
|
|
804
807
|
// seller: {
|
|
805
|
-
// makesOffer: factory.event.screeningEvent.ISellerMakesOffer
|
|
808
|
+
// makesOffer: Pick<factory.event.screeningEvent.ISellerMakesOffer, 'availableAtOrFrom'>;
|
|
806
809
|
// };
|
|
807
810
|
// };
|
|
808
|
-
// })
|
|
809
|
-
//
|
|
811
|
+
// }) {
|
|
812
|
+
// return this.eventModel.updateOne(
|
|
810
813
|
// { _id: { $eq: params.id } },
|
|
811
814
|
// {
|
|
812
|
-
// $
|
|
813
|
-
// 'offers.seller.makesOffer':
|
|
815
|
+
// $pull: {
|
|
816
|
+
// 'offers.seller.makesOffer': {
|
|
817
|
+
// 'availableAtOrFrom.id': { $eq: params.offers.seller.makesOffer.availableAtOrFrom.id }
|
|
818
|
+
// }
|
|
814
819
|
// }
|
|
815
|
-
// }
|
|
816
|
-
// { includeResultMetadata: true }
|
|
820
|
+
// }
|
|
817
821
|
// )
|
|
818
822
|
// .exec();
|
|
819
823
|
// }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { factory } from '../../../factory';
|
|
2
|
+
type IItemOfferedByReserveTransaction = factory.order.IEventReservation & {
|
|
3
|
+
price?: factory.assetTransaction.reserve.IPrice;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* 予約取引を注文のitemOfferedへ変換する
|
|
7
|
+
*/
|
|
8
|
+
declare function reserveTransaction2itemOffered(params: Pick<factory.assetTransaction.reserve.ITransaction, 'object'>): IItemOfferedByReserveTransaction[];
|
|
9
|
+
export { IItemOfferedByReserveTransaction, reserveTransaction2itemOffered };
|