@chevre/domain
Version:
Chevre Domain Library for Node.js
103 lines (102 loc) • 5.86 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.searchByOrder = searchByOrder;
const google_libphonenumber_1 = require("google-libphonenumber");
const factory = require("../../factory");
function searchByOrder(params) {
// tslint:disable-next-line:max-func-body-length
return (repos) => __awaiter(this, void 0, void 0, function* () {
const reservationType = params.typeOf;
const acceptedOffers = yield repos.acceptedOffer.searchAcceptedOffersByOrderNumber({
limit: params.limit,
page: params.page,
project: { id: { $eq: params.project.id } },
orderNumber: { $eq: params.orderNumber },
acceptedOffers: { itemOffered: { typeOf: { $in: [reservationType] } } }
}, ['itemOffered']);
const reservationIds = acceptedOffers.map((offer) => {
if (offer.itemOffered.typeOf === reservationType) {
return offer.itemOffered.id;
}
else {
// 検索条件にreservationTypeを含めているので、ありえないケース
throw new factory.errors.Internal(`unexpected itemOffered.typeOf ${offer.itemOffered.typeOf}`);
}
});
const offeredThroughIdentifier = (yield repos.acceptedOffer.distinctValues({
orderNumber: { $in: [params.orderNumber] }
}, 'acceptedOffers.offeredThrough.identifier')).shift();
let reservations = [];
if (reservationIds.length > 0) {
switch (offeredThroughIdentifier) {
// COA対応
case factory.service.webAPI.Identifier.COA:
const order = (yield repos.order.projectFields({
limit: 1,
page: 1,
orderNumbers: [params.orderNumber]
}, { inclusion: ['customer'] })).shift();
if (order === undefined) {
throw new factory.errors.NotFound(factory.order.OrderType.Order);
}
const phoneUtil = google_libphonenumber_1.PhoneNumberUtil.getInstance();
const phoneNumber = phoneUtil.parse(order.customer.telephone, 'JP');
let telNum = phoneUtil.format(phoneNumber, google_libphonenumber_1.PhoneNumberFormat.NATIONAL);
// COAでは数字のみ受け付けるので数字以外を除去
telNum = telNum.replace(/[^\d]/g, '');
const reservationNumber = (yield repos.acceptedOffer.distinctValues({
orderNumber: { $in: [params.orderNumber] }
}, 'acceptedOffers.itemOffered.reservationNumber')).shift();
const superEventLocationBranchCode = (yield repos.acceptedOffer.distinctValues({
orderNumber: { $in: [params.orderNumber] }
}, 'acceptedOffers.itemOffered.reservationFor.superEvent.location.branchCode')).shift();
if (typeof reservationNumber !== 'string') {
throw new factory.errors.NotFound('acceptedOffers.itemOffered.reservationNumber');
}
if (typeof superEventLocationBranchCode !== 'string') {
throw new factory.errors.NotFound('acceptedOffers.itemOffered.reservationFor.superEvent.location.branchCode');
}
const stateReserveResult = yield repos.reserveService.stateReserve({
theaterCode: superEventLocationBranchCode,
reserveNum: reservationNumber,
telNum
});
const listTicket = stateReserveResult === null || stateReserveResult === void 0 ? void 0 : stateReserveResult.listTicket;
if (Array.isArray(listTicket)) {
reservations = listTicket.map((ticket, key) => {
return {
id: reservationIds[key],
reservationStatus: factory.reservationStatusType.ReservationConfirmed,
additionalTicketText: ticket.seatQrcode
};
});
}
else {
reservations = reservationIds.map((reservationId) => {
return {
id: reservationId,
reservationStatus: factory.reservationStatusType.ReservationCancelled
};
});
}
break;
default:
reservations = yield repos.reservation.projectFields({
project: { id: { $eq: params.project.id } },
typeOf: reservationType,
id: { $in: reservationIds }
}, { id: 1, additionalTicketText: 1, reservationStatus: 1 });
}
}
return { reservations };
});
}