@chevre/domain
Version:
Chevre Domain Library for Node.js
208 lines (207 loc) • 10.5 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.createAuthorizeSeatReservationActionAttributes = createAuthorizeSeatReservationActionAttributes;
exports.offers2resultPrice = offers2resultPrice;
exports.responseBody2acceptedOffers4result = responseBody2acceptedOffers4result;
const moment = require("moment");
const util = require("util");
const factory = require("../../../../factory");
function createAuthorizeSeatReservationActionAttributes(params) {
var _a;
const transaction = params.transaction;
// 最適化(2022-06-07~)
const authorizeObjectEvent = {
id: params.event.id,
// イベント提供サービスを識別できるようにするために追加(2022-06-04~)
// offers: { // discontinue(2024-06-22~)
// offeredThrough: {
// identifier: factory.service.webAPI.Identifier.COA,
// typeOf: 'WebAPI'
// }
// },
typeOf: params.event.typeOf
};
const authorizeObject = {
typeOf: factory.action.authorize.offer.eventService.ObjectType.SeatReservation,
id: params.acceptAction.id,
// acceptedOffer: params.acceptedOffers, // discontinue acceptedOffers(2024-06-21~)
event: authorizeObjectEvent,
pendingTransaction: params.pendingTransaction
// useResultAcceptedOffers: false // discontinue(2024-06-24~)
};
const instrument = {
// typeOf: 'WebAPI',
typeOf: factory.assetTransactionType.COAReserveTransaction, // 変更(2024-03-08~)
// identifier: factory.service.webAPI.Identifier.COA,// discontinue(2025-01-02~)
transactionNumber: params.pendingTransaction.transactionNumber
};
return {
project: transaction.project,
typeOf: factory.actionType.AuthorizeAction,
object: authorizeObject,
agent: {
id: transaction.seller.id,
typeOf: transaction.seller.typeOf,
name: (typeof transaction.seller.name === 'string')
? transaction.seller.name
: String((_a = transaction.seller.name) === null || _a === void 0 ? void 0 : _a.ja)
},
recipient: {
typeOf: transaction.agent.typeOf,
id: transaction.agent.id
},
purpose: { typeOf: transaction.typeOf, id: transaction.id },
instrument
};
}
/**
* 供給情報から承認アクションの価格を導き出す
*/
function offers2resultPrice(offers) {
const price = offers.reduce((a, b) => a + b.price, 0);
// discontinue eligibleMonetaryAmount(2025-01-03~)
// const eligibleMonetaryAmount = offers.reduce<factory.offer.IEligibleMonetaryAmount[]>(
// (a, b) => {
// if (Array.isArray(b.eligibleMonetaryAmount)) {
// return [...a, ...b.eligibleMonetaryAmount];
// } else {
// return a;
// }
// },
// []
// );
return { price, eligibleMonetaryAmount: [] };
}
/**
* COA仮予約結果から注文アイテムを生成する
*/
function responseBody2acceptedOffers4result(params) {
const acceptedOffers4result = [];
const event = params.event;
const reservationNumber = String(params.responseBody.tmpReserveNum);
// 座席仮予約からオファー情報を生成する
// tslint:disable-next-line:max-func-body-length
acceptedOffers4result.push(...params.responseBody.listTmpReserve.map((tmpReserve, index) => {
var _a, _b, _c, _d;
const requestedOffer = params.acceptedOffer.find((o) => {
var _a, _b, _c, _d;
return ((_d = (_c = (_b = (_a = o.itemOffered) === null || _a === void 0 ? void 0 : _a.serviceOutput) === null || _b === void 0 ? void 0 : _b.reservedTicket) === null || _c === void 0 ? void 0 : _c.ticketedSeat) === null || _d === void 0 ? void 0 : _d.seatNumber) === tmpReserve.seatNum
&& o.itemOffered.serviceOutput.reservedTicket.ticketedSeat.seatSection === tmpReserve.seatSection;
});
if (requestedOffer === undefined) {
throw new factory.errors.Argument('offers', '要求された供給情報と仮予約結果が一致しません');
}
const coaInfo = event.coaInfo;
if (coaInfo === undefined) {
throw new factory.errors.NotFound('Event COA Info');
}
// チケットトークン(QRコード文字列)を作成
const ticketToken = [
coaInfo.theaterCode,
coaInfo.dateJouei,
// tslint:disable-next-line:no-magic-numbers
(`00000000${reservationNumber}`).slice(-8),
// tslint:disable-next-line:no-magic-numbers
(`000${index + 1}`).slice(-3)
].join('');
// reimplement id(2024-12-31~)
// const reservationId = `${reservationNumber}-${index.toString()}`;
const reservationId = `${params.project.id}:${ticketToken}`;
const workPerformed = Object.assign({ identifier: event.superEvent.workPerformed.identifier, name: event.superEvent.workPerformed.name, duration: event.superEvent.workPerformed.duration, typeOf: event.superEvent.workPerformed.typeOf }, (typeof event.superEvent.workPerformed.id === 'string')
? { id: event.superEvent.workPerformed.id }
: undefined // redefine(2025-01-03~)
);
const reservationFor = Object.assign(Object.assign({ typeOf: event.typeOf, coaInfo: event.coaInfo }, (event.doorTime !== undefined)
? {
doorTime: moment(event.doorTime)
.toDate()
}
: undefined), { endDate: moment(event.endDate)
.toDate(), identifier: event.identifier, location: {
typeOf: event.location.typeOf,
branchCode: event.location.branchCode,
name: event.location.name
}, name: event.name, startDate: moment(event.startDate)
.toDate(), superEvent: {
typeOf: event.superEvent.typeOf,
id: event.superEvent.id,
identifier: event.superEvent.identifier,
name: event.superEvent.name,
alternativeHeadline: event.superEvent.alternativeHeadline,
location: event.superEvent.location,
videoFormat: event.superEvent.videoFormat,
soundFormat: event.superEvent.soundFormat,
workPerformed: workPerformed,
duration: event.superEvent.duration,
coaInfo: event.superEvent.coaInfo
}, id: event.id });
const ticketNumber = util.format('%s:%s:%s', reservationFor.id, tmpReserve.seatSection, tmpReserve.seatNum);
const ticketedSeat = {
typeOf: factory.placeType.Seat,
seatNumber: tmpReserve.seatNum,
seatRow: '',
seatSection: tmpReserve.seatSection
};
const ticketType = {
typeOf: factory.offerType.Offer,
id: requestedOffer.id,
identifier: requestedOffer.identifier,
name: requestedOffer.name
};
const reservedTicket = {
typeOf: 'Ticket',
coaTicketInfo: requestedOffer.ticketInfo,
// 予約取引確定パラメータ生成のためcoaReserveAmountを追加(2022-05-24~)
coaReserveAmount: params.totalPrice,
dateIssued: params.bookingTime,
ticketedSeat,
identifier: ticketNumber, // チケット識別子追加(2024-04-15~)
// ticketNumber: ticketToken,
ticketNumber, // チケット識別子に変更(2024-04-15~)
ticketToken: ticketToken,
ticketType
};
const additionalProperty = (_b = (_a = requestedOffer.itemOffered) === null || _a === void 0 ? void 0 : _a.serviceOutput) === null || _b === void 0 ? void 0 : _b.additionalProperty;
const additionalTicketText = (_d = (_c = requestedOffer.itemOffered) === null || _c === void 0 ? void 0 : _c.serviceOutput) === null || _d === void 0 ? void 0 : _d.additionalTicketText;
const issuedThrough = {
typeOf: factory.product.ProductType.EventService,
// id: '', // discontinue(2025-01-02~)
availableChannel: {
typeOf: 'ServiceChannel',
serviceLocation: {
typeOf: reservationFor.location.typeOf,
branchCode: reservationFor.location.branchCode,
name: reservationFor.location.name,
containedInPlace: {
typeOf: reservationFor.superEvent.location.typeOf,
id: reservationFor.superEvent.location.id,
branchCode: reservationFor.superEvent.location.branchCode,
name: reservationFor.superEvent.location.name
}
}
}
};
const reservation = Object.assign(Object.assign(Object.assign({ typeOf: factory.reservationType.EventReservation, id: reservationId, issuedThrough }, (Array.isArray(additionalProperty)) ? { additionalProperty } : undefined), (typeof additionalTicketText === 'string') ? { additionalTicketText } : undefined), { reservationFor: reservationFor, reservationNumber: reservationNumber, reservedTicket: reservedTicket });
if (requestedOffer.priceSpecification === undefined) {
throw new factory.errors.NotFound('acceptedOffer.priceSpecification');
}
const priceSpecification = {
typeOf: requestedOffer.priceSpecification.typeOf,
priceCurrency: requestedOffer.priceSpecification.priceCurrency,
valueAddedTaxIncluded: requestedOffer.priceSpecification.valueAddedTaxIncluded,
priceComponent: requestedOffer.priceSpecification.priceComponent
};
// tslint:disable-next-line:no-unnecessary-local-variable
const resultAcceptedOffer = {
typeOf: factory.offerType.Offer,
id: requestedOffer.id,
name: requestedOffer.name,
itemOffered: reservation,
offeredThrough: { typeOf: 'WebAPI', identifier: factory.service.webAPI.Identifier.COA },
priceSpecification,
serialNumber: reservationNumber
};
return resultAcceptedOffer;
}));
return acceptedOffers4result;
}
;