UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

208 lines (207 loc) 10.5 kB
"use strict"; 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; }