@chevre/domain 24.0.0-alpha.44 → 24.0.0-alpha.46
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/lib/chevre/repo/assetTransaction/reserve.d.ts +29 -0
- package/lib/chevre/repo/assetTransaction/reserve.js +126 -0
- package/lib/chevre/repo/reservation.d.ts +13 -3
- package/lib/chevre/repo/reservation.js +3 -3
- package/lib/chevre/repository.d.ts +7 -0
- package/lib/chevre/repository.js +16 -2
- package/lib/chevre/service/assetTransaction/reserve/start/factory/createReservation.d.ts +2 -5
- package/lib/chevre/service/assetTransaction/reserve/start/factory/price.d.ts +1 -1
- package/lib/chevre/service/reserve/cancelReservation.d.ts +1 -1
- package/lib/chevre/service/reserve/cancelReservation.js +5 -4
- package/lib/chevre/service/reserve/confirmReservation.js +20 -3
- package/lib/chevre/service/reserve/findByCode.d.ts +3 -1
- package/lib/chevre/service/reserve/findByCode.js +38 -6
- package/lib/chevre/service/reserve/potentialActions/onReservationConfirmed.d.ts +5 -3
- package/lib/chevre/service/reserve/searchByOrder.js +3 -2
- package/lib/chevre/service/reserve/useReservation.js +6 -5
- package/lib/chevre/service/transaction/returnOrder/preStart.js +3 -2
- package/package.json +3 -3
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Connection } from 'mongoose';
|
|
2
|
+
import * as factory from '../../factory';
|
|
3
|
+
type ISubReservationAsFindResult = Pick<factory.reservation.eventReservation.IReservation, 'price' | 'underName' | 'id'> & {
|
|
4
|
+
reservedTicket?: Pick<factory.reservation.eventReservation.IReservedTicket, 'ticketType'>;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* 予約取引リポジトリ
|
|
8
|
+
*/
|
|
9
|
+
export declare class ReserveTransactionRepo {
|
|
10
|
+
private readonly transactionModel;
|
|
11
|
+
constructor(connection: Connection);
|
|
12
|
+
/**
|
|
13
|
+
* 予約取引から予約を検索する
|
|
14
|
+
*/
|
|
15
|
+
findSubReservationsByReservationNumber(params: {
|
|
16
|
+
reservationNumber: string;
|
|
17
|
+
}): Promise<ISubReservationAsFindResult[]>;
|
|
18
|
+
/**
|
|
19
|
+
* 予約取引から予約を検索する
|
|
20
|
+
* limitはしない
|
|
21
|
+
*/
|
|
22
|
+
findSubReservationsById(params: {
|
|
23
|
+
/**
|
|
24
|
+
* 予約IDリスト
|
|
25
|
+
*/
|
|
26
|
+
ids: string[];
|
|
27
|
+
}): Promise<ISubReservationAsFindResult[]>;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ReserveTransactionRepo = void 0;
|
|
27
|
+
const assetTransaction_1 = require("../mongoose/schemas/assetTransaction");
|
|
28
|
+
const factory = __importStar(require("../../factory"));
|
|
29
|
+
const settings_1 = require("../../settings");
|
|
30
|
+
/**
|
|
31
|
+
* 予約取引リポジトリ
|
|
32
|
+
*/
|
|
33
|
+
class ReserveTransactionRepo {
|
|
34
|
+
transactionModel;
|
|
35
|
+
constructor(connection) {
|
|
36
|
+
this.transactionModel = connection.model(assetTransaction_1.modelName, (0, assetTransaction_1.createSchema)());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 予約取引から予約を検索する
|
|
40
|
+
*/
|
|
41
|
+
async findSubReservationsByReservationNumber(params) {
|
|
42
|
+
const aggregate = this.transactionModel.aggregate([
|
|
43
|
+
{
|
|
44
|
+
$match: {
|
|
45
|
+
typeOf: { $eq: factory.assetTransactionType.Reserve },
|
|
46
|
+
transactionNumber: { $eq: params.reservationNumber }
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
$unwind: {
|
|
51
|
+
path: '$object.subReservation'
|
|
52
|
+
// includeArrayIndex: 'elementIndex'
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
// {
|
|
56
|
+
// $match: {
|
|
57
|
+
// typeOf: { $eq: factory.assetTransactionType.Reserve },
|
|
58
|
+
// transactionNumber: { $eq: params.reservationNumber }
|
|
59
|
+
// }
|
|
60
|
+
// },
|
|
61
|
+
{
|
|
62
|
+
$project: {
|
|
63
|
+
_id: 0,
|
|
64
|
+
id: '$object.subReservation.id',
|
|
65
|
+
price: '$object.subReservation.price',
|
|
66
|
+
underName: '$object.underName',
|
|
67
|
+
reservedTicket: {
|
|
68
|
+
ticketType: '$object.subReservation.reservedTicket.ticketType',
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
]);
|
|
73
|
+
// if (typeof filter.limit === 'number' && filter.limit > 0) {
|
|
74
|
+
// const page: number = (typeof filter.page === 'number' && filter.page > 0) ? filter.page : 1;
|
|
75
|
+
// aggregate.limit(filter.limit * page)
|
|
76
|
+
// .skip(filter.limit * (page - 1));
|
|
77
|
+
// }
|
|
78
|
+
return aggregate
|
|
79
|
+
.option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
|
|
80
|
+
.exec();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 予約取引から予約を検索する
|
|
84
|
+
* limitはしない
|
|
85
|
+
*/
|
|
86
|
+
async findSubReservationsById(params) {
|
|
87
|
+
const { ids } = params;
|
|
88
|
+
if (!Array.isArray(ids) || ids.length === 0) {
|
|
89
|
+
throw new factory.errors.ArgumentNull('ids');
|
|
90
|
+
}
|
|
91
|
+
const aggregate = this.transactionModel.aggregate([
|
|
92
|
+
{
|
|
93
|
+
$match: {
|
|
94
|
+
typeOf: { $eq: factory.assetTransactionType.Reserve },
|
|
95
|
+
'object.subReservation.id': { $exists: true, $in: ids }
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
$unwind: {
|
|
100
|
+
path: '$object.subReservation'
|
|
101
|
+
// includeArrayIndex: 'elementIndex'
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
$match: {
|
|
106
|
+
'object.subReservation.id': { $exists: true, $in: ids }
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
$project: {
|
|
111
|
+
_id: 0,
|
|
112
|
+
id: '$object.subReservation.id',
|
|
113
|
+
price: '$object.subReservation.price',
|
|
114
|
+
underName: '$object.underName',
|
|
115
|
+
reservedTicket: {
|
|
116
|
+
ticketType: '$object.subReservation.reservedTicket.ticketType',
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
]);
|
|
121
|
+
return aggregate
|
|
122
|
+
.option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
|
|
123
|
+
.exec();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.ReserveTransactionRepo = ReserveTransactionRepo;
|
|
@@ -13,7 +13,17 @@ export type ICreatingReservation<T extends factory.reservationType> = T extends
|
|
|
13
13
|
type IKeyOfProjection = keyof factory.reservation.IReservation<factory.reservationType.EventReservation> | 'reservedTicket.dateUsed' | 'reservationFor.id' | 'reservationFor.typeOf';
|
|
14
14
|
export type IAttendedReservation = Pick<factory.reservation.IReservation<factory.reservationType.EventReservation>, 'id' | 'typeOf' | 'project' | 'modifiedTime'> & {
|
|
15
15
|
reservationFor: Pick<factory.reservation.IReservationFor<factory.reservationType.EventReservation>, 'id' | 'typeOf'>;
|
|
16
|
-
reservedTicket: Pick<factory.reservation.
|
|
16
|
+
reservedTicket: Pick<factory.reservation.eventReservation.IReservedTicket, 'dateUsed'>;
|
|
17
|
+
};
|
|
18
|
+
export type IReservationAsFindResult = Omit<factory.reservation.eventReservation.IReservation, 'price' | 'underName'> & {
|
|
19
|
+
/**
|
|
20
|
+
* 実データとしてはまだ存在しているが型から廃止(2026-03-26~)
|
|
21
|
+
*/
|
|
22
|
+
price?: never;
|
|
23
|
+
/**
|
|
24
|
+
* 実データとしてはまだ存在しているが型から廃止(2026-03-26~)
|
|
25
|
+
*/
|
|
26
|
+
underName?: never;
|
|
17
27
|
};
|
|
18
28
|
/**
|
|
19
29
|
* 予約リポジトリ
|
|
@@ -28,9 +38,9 @@ export declare class ReservationRepo {
|
|
|
28
38
|
count<T extends factory.reservationType>(params: factory.reservation.ISearchConditions<T>): Promise<number>;
|
|
29
39
|
/**
|
|
30
40
|
* 予約検索
|
|
31
|
-
*
|
|
41
|
+
* TODO reimplement
|
|
32
42
|
*/
|
|
33
|
-
|
|
43
|
+
findReservations(params: factory.reservation.eventReservation.ISearchConditions, inclusion?: Partial<Record<IKeyOfProjection, 1>>): Promise<IReservationAsFindResult[]>;
|
|
34
44
|
projectFieldsById<T extends factory.reservationType>(params: {
|
|
35
45
|
id: string;
|
|
36
46
|
inclusion?: IKeyOfProjection[];
|
|
@@ -791,9 +791,9 @@ class ReservationRepo {
|
|
|
791
791
|
}
|
|
792
792
|
/**
|
|
793
793
|
* 予約検索
|
|
794
|
-
*
|
|
794
|
+
* TODO reimplement
|
|
795
795
|
*/
|
|
796
|
-
async
|
|
796
|
+
async findReservations(params, inclusion) {
|
|
797
797
|
const conditions = ReservationRepo.CREATE_MONGO_CONDITIONS(params);
|
|
798
798
|
let projection;
|
|
799
799
|
if (inclusion !== undefined && inclusion !== null) {
|
|
@@ -884,7 +884,7 @@ class ReservationRepo {
|
|
|
884
884
|
switch (subReservation.typeOf) {
|
|
885
885
|
case factory.reservationType.EventReservation:
|
|
886
886
|
setOnInsert = {
|
|
887
|
-
...subReservation,
|
|
887
|
+
...subReservation, // priceは廃止予定だが、互換性維持対応としてひとまず型を強制的に合わせる
|
|
888
888
|
_id: subReservation.id,
|
|
889
889
|
bookingTime: params.bookingTime,
|
|
890
890
|
checkedIn: false,
|
|
@@ -27,6 +27,7 @@ import type { AggregateOrderRepo } from './repo/aggregateOrder';
|
|
|
27
27
|
import type { AggregateReservationRepo } from './repo/aggregateReservation';
|
|
28
28
|
import type { AggregationRepo } from './repo/aggregation';
|
|
29
29
|
import type { AssetTransactionRepo } from './repo/assetTransaction';
|
|
30
|
+
import type { ReserveTransactionRepo } from './repo/assetTransaction/reserve';
|
|
30
31
|
import type { AuthorizationRepo } from './repo/authorization';
|
|
31
32
|
import type { CategoryCodeRepo } from './repo/categoryCode';
|
|
32
33
|
import type { CommentRepo } from './repo/comment';
|
|
@@ -211,6 +212,12 @@ export type AssetTransaction = AssetTransactionRepo;
|
|
|
211
212
|
export declare namespace AssetTransaction {
|
|
212
213
|
function createInstance(...params: ConstructorParameters<typeof AssetTransactionRepo>): Promise<AssetTransactionRepo>;
|
|
213
214
|
}
|
|
215
|
+
export declare namespace assetTransaction {
|
|
216
|
+
type Reserve = ReserveTransactionRepo;
|
|
217
|
+
namespace Reserve {
|
|
218
|
+
function createInstance(...params: ConstructorParameters<typeof ReserveTransactionRepo>): Promise<ReserveTransactionRepo>;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
214
221
|
export type CategoryCode = CategoryCodeRepo;
|
|
215
222
|
export declare namespace CategoryCode {
|
|
216
223
|
function createInstance(...params: ConstructorParameters<typeof CategoryCodeRepo>): Promise<CategoryCodeRepo>;
|
package/lib/chevre/repository.js
CHANGED
|
@@ -23,8 +23,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
27
|
-
exports.WebSite = exports.rateLimit = exports.Trip = exports.TransactionProcess = exports.TransactionNumber = exports.transaction = exports.Transaction = exports.Ticket = exports.Task = exports.StockHolder = exports.setting = exports.Setting = exports.ServiceOutputIdentifier = exports.ServiceOutput = exports.ServiceAvailableHour = exports.SellerReturnPolicy = exports.SellerPaymentAccepted = exports.SellerMakesOffer = exports.Seller = exports.Schedule = exports.Role = exports.ReserveInterface = exports.Reservation = exports.ProjectMakesOffer = exports.Project = exports.ProductOffer = exports.ProductModel = exports.ProductHasOfferCatalog = exports.Product = exports.PriceSpecification = exports.PotentialAction = exports.place = exports.Permit = exports.Person = exports.paymentMethod = exports.PendingReservation = exports.PaymentServiceProvider = void 0;
|
|
26
|
+
exports.PaymentService = exports.Passport = exports.OwnershipInfo = exports.OrderNumber = exports.OrderInTransaction = exports.Order = exports.Offer = exports.OfferItemCondition = exports.OfferCatalogItem = exports.OfferCatalog = exports.NoteAboutOrder = exports.Note = exports.MovieTicketType = exports.Message = exports.MerchantReturnPolicy = exports.MemberProgram = exports.Member = exports.Issuer = exports.IdentityProvider = exports.Identity = exports.EventSeries = exports.EventSellerMakesOffer = exports.EventOffer = exports.Event = exports.EmailMessage = exports.CustomerType = exports.Customer = exports.Credentials = exports.CreativeWork = exports.ConfirmationNumber = exports.Comment = exports.Authorization = exports.CategoryCode = exports.assetTransaction = exports.AssetTransaction = exports.Aggregation = exports.AggregateReservation = exports.AggregateOrder = exports.AggregateOffer = exports.AggregateAction = exports.AdvanceBookingRequirement = exports.AdditionalProperty = exports.action = exports.Action = exports.AccountTransaction = exports.AccountTitle = exports.AccountingReport = exports.Account = exports.AcceptedPaymentMethod = exports.AcceptedOffer = void 0;
|
|
27
|
+
exports.WebSite = exports.rateLimit = exports.Trip = exports.TransactionProcess = exports.TransactionNumber = exports.transaction = exports.Transaction = exports.Ticket = exports.Task = exports.StockHolder = exports.setting = exports.Setting = exports.ServiceOutputIdentifier = exports.ServiceOutput = exports.ServiceAvailableHour = exports.SellerReturnPolicy = exports.SellerPaymentAccepted = exports.SellerMakesOffer = exports.Seller = exports.Schedule = exports.Role = exports.ReserveInterface = exports.Reservation = exports.ProjectMakesOffer = exports.Project = exports.ProductOffer = exports.ProductModel = exports.ProductHasOfferCatalog = exports.Product = exports.PriceSpecification = exports.PotentialAction = exports.place = exports.Permit = exports.Person = exports.paymentMethod = exports.PendingReservation = exports.PaymentServiceProvider = exports.PaymentServiceChannel = void 0;
|
|
28
28
|
var AcceptedOffer;
|
|
29
29
|
(function (AcceptedOffer) {
|
|
30
30
|
let repo;
|
|
@@ -314,6 +314,20 @@ var AssetTransaction;
|
|
|
314
314
|
}
|
|
315
315
|
AssetTransaction.createInstance = createInstance;
|
|
316
316
|
})(AssetTransaction || (exports.AssetTransaction = AssetTransaction = {}));
|
|
317
|
+
var assetTransaction;
|
|
318
|
+
(function (assetTransaction) {
|
|
319
|
+
let Reserve;
|
|
320
|
+
(function (Reserve) {
|
|
321
|
+
let repo;
|
|
322
|
+
async function createInstance(...params) {
|
|
323
|
+
if (repo === undefined) {
|
|
324
|
+
repo = (await Promise.resolve().then(() => __importStar(require('./repo/assetTransaction/reserve')))).ReserveTransactionRepo;
|
|
325
|
+
}
|
|
326
|
+
return new repo(...params);
|
|
327
|
+
}
|
|
328
|
+
Reserve.createInstance = createInstance;
|
|
329
|
+
})(Reserve = assetTransaction.Reserve || (assetTransaction.Reserve = {}));
|
|
330
|
+
})(assetTransaction || (exports.assetTransaction = assetTransaction = {}));
|
|
317
331
|
var CategoryCode;
|
|
318
332
|
(function (CategoryCode) {
|
|
319
333
|
let repo;
|
|
@@ -2,10 +2,7 @@ import * as factory from '../../../../../factory';
|
|
|
2
2
|
import { IMinimizedIndividualEvent } from '../../../../../factory/event';
|
|
3
3
|
import { IAcceptedAddOn } from './price';
|
|
4
4
|
type IObjectSubReservation = factory.assetTransaction.reserve.IObjectSubReservation;
|
|
5
|
-
|
|
6
|
-
* 確定時予約のITicket
|
|
7
|
-
*/
|
|
8
|
-
type IReservedTicket = Pick<factory.reservation.ITicket, 'identifier' | 'issuedBy' | 'ticketType' | 'ticketedSeat' | 'typeOf'>;
|
|
5
|
+
type IReservedTicket = Pick<factory.assetTransaction.reserve.ISubReservationReservedTicket, 'identifier' | 'issuedBy' | 'ticketType' | 'ticketedSeat' | 'typeOf'>;
|
|
9
6
|
declare function createReservedTicket(params: {
|
|
10
7
|
id: string;
|
|
11
8
|
acceptedOffer: factory.assetTransaction.reserve.IAcceptedTicketOfferWithoutDetail;
|
|
@@ -43,7 +40,7 @@ declare function createReservation(params: {
|
|
|
43
40
|
};
|
|
44
41
|
id: string;
|
|
45
42
|
reservationFor: IMinimizedIndividualEvent;
|
|
46
|
-
reservedTicket:
|
|
43
|
+
reservedTicket: factory.assetTransaction.reserve.ISubReservationReservedTicket;
|
|
47
44
|
additionalProperty?: factory.propertyValue.IPropertyValue<string>[];
|
|
48
45
|
additionalTicketText?: string;
|
|
49
46
|
ticketOffer: factory.product.ITicketOffer;
|
|
@@ -14,4 +14,4 @@ export declare function createPrice(params: {
|
|
|
14
14
|
seatPriceComponent: factory.place.seat.IPriceComponent[];
|
|
15
15
|
acceptedAddOns: IAcceptedAddOn[];
|
|
16
16
|
appliesToMovieTicket?: factory.assetTransaction.reserve.IAcceptedAppliesToMovieTicket;
|
|
17
|
-
}): factory.reservation.
|
|
17
|
+
}): factory.reservation.eventReservation.IPrice;
|
|
@@ -36,7 +36,7 @@ declare function processUnlockOfferRateLimit(params: {
|
|
|
36
36
|
};
|
|
37
37
|
reservation: {
|
|
38
38
|
reservationNumber: string;
|
|
39
|
-
reservedTicket: factory.reservation.
|
|
39
|
+
reservedTicket: factory.reservation.eventReservation.IReservedTicket;
|
|
40
40
|
};
|
|
41
41
|
reservationFor: factory.assetTransaction.reserve.IReservationFor;
|
|
42
42
|
}): (repos: {
|
|
@@ -319,10 +319,11 @@ function cancelReservation(actionAttributesList) {
|
|
|
319
319
|
const reservationNumber = actionAttributes.object.reservationNumber;
|
|
320
320
|
if (typeof reservationNumber === 'string' && reservationNumber.length > 0) {
|
|
321
321
|
// 最新のconfirmedReservationsを検索
|
|
322
|
-
canceledReservations = await repos.reservation.
|
|
322
|
+
canceledReservations = await repos.reservation.findReservations({
|
|
323
323
|
reservationNumber: { $eq: reservationNumber },
|
|
324
324
|
typeOf: factory.reservationType.EventReservation
|
|
325
|
-
}, { project: 1, typeOf: 1, modifiedTime: 1, reservationNumber: 1 })
|
|
325
|
+
}, { project: 1, typeOf: 1, modifiedTime: 1, reservationNumber: 1 } // 廃止属性の影響なし(2026-03-25~)
|
|
326
|
+
);
|
|
326
327
|
canceledReservations = canceledReservations.map((r) => {
|
|
327
328
|
// _idは不要であり、存在すると予期せぬ影響を及ぼす可能性がある
|
|
328
329
|
delete r._id;
|
|
@@ -421,8 +422,8 @@ function processUnlockSeat(params) {
|
|
|
421
422
|
function processUnlockOfferRateLimit(params) {
|
|
422
423
|
return async (repos) => {
|
|
423
424
|
const reservation = params.reservation;
|
|
424
|
-
const scope = reservation.reservedTicket.ticketType
|
|
425
|
-
const unitInSeconds = reservation.reservedTicket.ticketType
|
|
425
|
+
const scope = reservation.reservedTicket.ticketType?.validRateLimit?.scope;
|
|
426
|
+
const unitInSeconds = reservation.reservedTicket.ticketType?.validRateLimit?.unitInSeconds;
|
|
426
427
|
if (typeof scope === 'string' && typeof unitInSeconds === 'number') {
|
|
427
428
|
const rateLimitKey = {
|
|
428
429
|
project: { id: params.project.id },
|
|
@@ -45,7 +45,7 @@ function confirmReservation(params) {
|
|
|
45
45
|
// await onReservationConfirmedByAction(actionAttributes)({ task: repos.task });
|
|
46
46
|
// }
|
|
47
47
|
// }));
|
|
48
|
-
const actionAttributes = await reserveIfNotYet(params.potentialReserveAction, { byTask: params.byTask })(repos);
|
|
48
|
+
const { actionAttributes, reserveTransaction } = await reserveIfNotYet(params.potentialReserveAction, { byTask: params.byTask })(repos);
|
|
49
49
|
if (params.useOnReservationConfirmed) {
|
|
50
50
|
await (0, onReservationConfirmed_1.onReservationConfirmedByAction)(actionAttributes)({ task: repos.task });
|
|
51
51
|
}
|
|
@@ -55,13 +55,30 @@ function confirmReservation(params) {
|
|
|
55
55
|
const reservationNumber = params.potentialReserveAction.object.reservationNumber;
|
|
56
56
|
if (typeof reservationNumber === 'string' && reservationNumber.length > 0) {
|
|
57
57
|
// 最新のconfirmedReservationsを検索
|
|
58
|
-
|
|
58
|
+
const rawReservations = await repos.reservation.findReservations({
|
|
59
59
|
reservationNumber: { $eq: reservationNumber },
|
|
60
60
|
typeOf: factory.reservationType.EventReservation
|
|
61
61
|
}
|
|
62
62
|
// project all fields
|
|
63
63
|
// {}
|
|
64
64
|
);
|
|
65
|
+
// price,underName,ticketTypeは予約取引から補完する(2026-03-25~)
|
|
66
|
+
confirmedReservations = rawReservations.map((rawReservation) => {
|
|
67
|
+
const subReservationByTransaction = reserveTransaction.object.subReservation?.find((s) => s.id === rawReservation.id);
|
|
68
|
+
const priceByTransaction = subReservationByTransaction?.price;
|
|
69
|
+
const underNameByTransaction = reserveTransaction.object.underName;
|
|
70
|
+
const ticketTypeByTransaction = subReservationByTransaction?.reservedTicket.ticketType;
|
|
71
|
+
console.log('creating confirmedReservation...', rawReservation, priceByTransaction, underNameByTransaction, ticketTypeByTransaction);
|
|
72
|
+
return {
|
|
73
|
+
...rawReservation,
|
|
74
|
+
...(priceByTransaction) ? { price: priceByTransaction } : undefined,
|
|
75
|
+
...(underNameByTransaction !== undefined) ? { underName: underNameByTransaction } : undefined,
|
|
76
|
+
reservedTicket: {
|
|
77
|
+
...rawReservation.reservedTicket,
|
|
78
|
+
...(ticketTypeByTransaction !== undefined) ? { ticketType: ticketTypeByTransaction } : undefined
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
});
|
|
65
82
|
confirmedReservations = confirmedReservations.map((r) => {
|
|
66
83
|
// _idは不要であり、存在すると予期せぬ影響を及ぼす可能性がある
|
|
67
84
|
delete r._id;
|
|
@@ -211,6 +228,6 @@ params, options) {
|
|
|
211
228
|
const actionResult = {};
|
|
212
229
|
await repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result: actionResult });
|
|
213
230
|
}
|
|
214
|
-
return actionAttributes;
|
|
231
|
+
return { actionAttributes, reserveTransaction };
|
|
215
232
|
};
|
|
216
233
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import * as factory from '../../factory';
|
|
2
|
+
import type { AcceptedOfferRepo } from '../../repo/acceptedOffer';
|
|
2
3
|
import type { AuthorizationRepo } from '../../repo/authorization';
|
|
3
4
|
import type { OrderRepo } from '../../repo/order';
|
|
4
5
|
import type { ReservationRepo } from '../../repo/reservation';
|
|
5
6
|
type AvailableReservationType = factory.reservationType.EventReservation;
|
|
6
7
|
type IReservationResult = Pick<factory.reservation.IReservation<AvailableReservationType>, 'id' | 'additionalTicketText' | 'checkedIn' | 'reservationStatus'> & {
|
|
7
8
|
reservedTicket: {
|
|
8
|
-
ticketType: Pick<factory.reservation.ITicketType
|
|
9
|
+
ticketType: Pick<factory.reservation.eventReservation.ITicketType, 'identifier'> & {
|
|
9
10
|
name: {
|
|
10
11
|
ja?: string;
|
|
11
12
|
};
|
|
@@ -28,6 +29,7 @@ declare function findByCode(params: {
|
|
|
28
29
|
id?: string;
|
|
29
30
|
};
|
|
30
31
|
}): (repos: {
|
|
32
|
+
acceptedOffer: AcceptedOfferRepo;
|
|
31
33
|
authorization: AuthorizationRepo;
|
|
32
34
|
order: OrderRepo;
|
|
33
35
|
reservation: ReservationRepo;
|
|
@@ -38,6 +38,7 @@ function findByCode(params) {
|
|
|
38
38
|
project: { id: params.project.id },
|
|
39
39
|
code: params.code
|
|
40
40
|
});
|
|
41
|
+
let ticketType;
|
|
41
42
|
switch (authorization.object.typeOf) {
|
|
42
43
|
case factory.order.OrderType.Order: {
|
|
43
44
|
const { orderNumber } = authorization.object;
|
|
@@ -49,6 +50,32 @@ function findByCode(params) {
|
|
|
49
50
|
reservationId,
|
|
50
51
|
seller: params.seller
|
|
51
52
|
});
|
|
53
|
+
const acceptedOffer = (await repos.acceptedOffer.searchAcceptedOffersByOrderNumber({
|
|
54
|
+
limit: 1,
|
|
55
|
+
page: 1,
|
|
56
|
+
// $slice?: [number, number];
|
|
57
|
+
orderNumber: { $eq: orderNumber },
|
|
58
|
+
project: { id: { $eq: params.project.id } },
|
|
59
|
+
acceptedOffers: {
|
|
60
|
+
itemOffered: {
|
|
61
|
+
id: { $eq: reservationId }
|
|
62
|
+
// typeOf?: { $in?: factory.order.IItemOffered['typeOf'][] };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}, ['itemOffered'])).shift();
|
|
66
|
+
if (acceptedOffer === undefined) {
|
|
67
|
+
throw new factory.errors.NotFound('acceptedOffer');
|
|
68
|
+
}
|
|
69
|
+
if (acceptedOffer.itemOffered.typeOf !== factory.reservationType.EventReservation) {
|
|
70
|
+
throw new factory.errors.Argument('id', `itemOffered.typeOf must be ${factory.reservationType.EventReservation}`);
|
|
71
|
+
}
|
|
72
|
+
ticketType = {
|
|
73
|
+
identifier: acceptedOffer.itemOffered.reservedTicket.ticketType.identifier,
|
|
74
|
+
name: { ja: acceptedOffer.itemOffered.reservedTicket.ticketType.name?.ja }
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new factory.errors.NotFound('orderNumber');
|
|
52
79
|
}
|
|
53
80
|
break;
|
|
54
81
|
}
|
|
@@ -57,16 +84,21 @@ function findByCode(params) {
|
|
|
57
84
|
}
|
|
58
85
|
const reservationFromRepo = await repos.reservation.projectFieldsById({
|
|
59
86
|
id: reservationId,
|
|
60
|
-
inclusion: [
|
|
87
|
+
inclusion: [
|
|
88
|
+
'additionalTicketText', 'checkedIn', 'reservationStatus',
|
|
89
|
+
// 'reservedTicket'
|
|
90
|
+
]
|
|
61
91
|
});
|
|
62
|
-
const { id, additionalTicketText, checkedIn, reservationStatus
|
|
92
|
+
const { id, additionalTicketText, checkedIn, reservationStatus } = reservationFromRepo;
|
|
63
93
|
const reservation = {
|
|
64
94
|
id, reservationStatus,
|
|
65
95
|
reservedTicket: {
|
|
66
|
-
ticketType
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
96
|
+
// ticketTypeは注文を参照する(2026-03-25~)
|
|
97
|
+
// ticketType: {
|
|
98
|
+
// identifier: reservedTicket.ticketType.identifier,
|
|
99
|
+
// name: { ja: reservedTicket.ticketType.name?.ja }
|
|
100
|
+
// },
|
|
101
|
+
ticketType
|
|
70
102
|
},
|
|
71
103
|
...(typeof additionalTicketText === 'string') ? { additionalTicketText } : undefined,
|
|
72
104
|
...(typeof checkedIn === 'boolean') ? { checkedIn } : undefined
|
|
@@ -5,16 +5,18 @@ import * as factory from '../../../factory';
|
|
|
5
5
|
import { AuthorizationRepo } from '../../../repo/authorization';
|
|
6
6
|
import type { SettingRepo } from '../../../repo/setting';
|
|
7
7
|
import type { TaskRepo } from '../../../repo/task';
|
|
8
|
-
type
|
|
8
|
+
export type IConfirmedReservation = Omit<factory.reservation.eventReservation.IReservation, 'price' | 'underName'> & {
|
|
9
|
+
price?: factory.reservation.eventReservation.IPrice;
|
|
10
|
+
underName?: factory.reservation.IUnderName<factory.reservationType.EventReservation>;
|
|
11
|
+
};
|
|
9
12
|
/**
|
|
10
13
|
* 予約確定後のアクション
|
|
11
14
|
*/
|
|
12
15
|
export declare function onReservationConfirmedByAction(actionAttributes: Pick<factory.action.reserve.IAttributes, 'potentialActions'>): (repos: {
|
|
13
16
|
task: TaskRepo;
|
|
14
17
|
}) => Promise<void>;
|
|
15
|
-
export declare function onReservationConfirmed(confirmedReservations:
|
|
18
|
+
export declare function onReservationConfirmed(confirmedReservations: IConfirmedReservation[], reserveAction: Pick<factory.action.reserve.IAttributes, 'instrument'>): (repos: {
|
|
16
19
|
code: AuthorizationRepo;
|
|
17
20
|
setting: SettingRepo;
|
|
18
21
|
task: TaskRepo;
|
|
19
22
|
}) => Promise<void>;
|
|
20
|
-
export {};
|
|
@@ -104,11 +104,12 @@ function searchByOrder(params) {
|
|
|
104
104
|
break;
|
|
105
105
|
}
|
|
106
106
|
default:
|
|
107
|
-
reservations = await repos.reservation.
|
|
107
|
+
reservations = await repos.reservation.findReservations({
|
|
108
108
|
project: { id: { $eq: params.project.id } },
|
|
109
109
|
typeOf: reservationType,
|
|
110
110
|
id: { $in: reservationIds }
|
|
111
|
-
}, { id: 1, additionalTicketText: 1, reservationStatus: 1 })
|
|
111
|
+
}, { id: 1, additionalTicketText: 1, reservationStatus: 1 } // 廃止属性の影響なし(2026-03-25~)
|
|
112
|
+
);
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
115
|
return { reservations };
|
|
@@ -73,11 +73,12 @@ function useReservation(params) {
|
|
|
73
73
|
reservationFor: { id: reservation.reservationFor.id, typeOf: reservation.reservationFor.typeOf },
|
|
74
74
|
reservedTicket: {
|
|
75
75
|
typeOf: reservedTicket.typeOf,
|
|
76
|
-
ticketType
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
76
|
+
// discontinue ticketType(2026-03-25~)
|
|
77
|
+
// ticketType: {
|
|
78
|
+
// identifier: reservedTicket.ticketType.identifier,
|
|
79
|
+
// typeOf: reservedTicket.ticketType.typeOf,
|
|
80
|
+
// ...(typeof reservedTicket.ticketType.id === 'string') ? { id: reservedTicket.ticketType.id } : undefined
|
|
81
|
+
// },
|
|
81
82
|
...(typeof reservedTicket.identifier === 'string') ? { identifier: reservedTicket.identifier } : undefined,
|
|
82
83
|
...(typeof reservedTicket.ticketedSeat?.typeOf === 'string') ? { ticketedSeat: reservedTicket.ticketedSeat } : undefined
|
|
83
84
|
}
|
|
@@ -196,13 +196,14 @@ function checkUsedReservationExists(params) {
|
|
|
196
196
|
}, 'acceptedOffers.itemOffered.reservationNumber');
|
|
197
197
|
if (reservationNumbers.length > 0) {
|
|
198
198
|
// 使用済の予約がひとつでもあれば不可
|
|
199
|
-
const existingUsedReservations = await repos.reservation.
|
|
199
|
+
const existingUsedReservations = await repos.reservation.findReservations({
|
|
200
200
|
limit: 1,
|
|
201
201
|
page: 1,
|
|
202
202
|
typeOf: factory.reservationType.EventReservation,
|
|
203
203
|
reservationNumber: { $in: reservationNumbers },
|
|
204
204
|
attended: true
|
|
205
|
-
}, { id: 1 })
|
|
205
|
+
}, { id: 1 } // 廃止属性の影響なし(2026-03-25~)
|
|
206
|
+
);
|
|
206
207
|
if (existingUsedReservations.length > 0) {
|
|
207
208
|
usedReservationExists = true;
|
|
208
209
|
}
|
package/package.json
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@aws-sdk/client-cognito-identity-provider": "3.600.0",
|
|
13
13
|
"@aws-sdk/credential-providers": "3.600.0",
|
|
14
|
-
"@chevre/factory": "6.0.0-alpha.
|
|
15
|
-
"@cinerino/sdk": "13.
|
|
14
|
+
"@chevre/factory": "6.0.0-alpha.9",
|
|
15
|
+
"@cinerino/sdk": "13.3.0",
|
|
16
16
|
"@motionpicture/coa-service": "9.6.0",
|
|
17
17
|
"@motionpicture/gmo-service": "5.4.0-alpha.1",
|
|
18
18
|
"@sendgrid/client": "8.1.4",
|
|
@@ -99,5 +99,5 @@
|
|
|
99
99
|
"postversion": "git push origin --tags",
|
|
100
100
|
"prepublishOnly": "npm run clean && npm run build"
|
|
101
101
|
},
|
|
102
|
-
"version": "24.0.0-alpha.
|
|
102
|
+
"version": "24.0.0-alpha.46"
|
|
103
103
|
}
|