UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

163 lines (162 loc) 10.2 kB
"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.validateMovieTicket = validateMovieTicket; const createDebug = require("debug"); const factory = require("../../../factory"); const processPurchaseNumberAuth_1 = require("./processPurchaseNumberAuth"); const debug = createDebug('chevre-domain:service:payment'); function validateMovieTicket(params, paymentServiceId, // useCheckByIdentifierIfNotYet: boolean, checkedAction, purpose) { // tslint:disable-next-line:max-func-body-length return (repos, settings) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; const movieTickets = (_a = params.object.paymentMethod) === null || _a === void 0 ? void 0 : _a.movieTickets; if (!Array.isArray(movieTickets)) { throw new factory.errors.Argument('movieTickets', 'object.paymentMethod.movieTickets must be an array'); } // イベント1つのみ許可 const eventIds = [...new Set(movieTickets.map((t) => t.serviceOutput.reservationFor.id))]; if (eventIds.length !== 1) { throw new factory.errors.Argument('movieTickets', 'Number of events must be 1'); } // 決済カードidentifierは1つのみ許可 const movieTicketIdentifiers = [...new Set(movieTickets.map((t) => t.identifier))]; if (movieTicketIdentifiers.length !== 1) { throw new factory.errors.Argument('movieTickets', 'Number of movie ticket identifiers must be 1'); } const movieTicketIdentifier = movieTicketIdentifiers[0]; // 決済カードaccessCodeは1つのみ許可(2023-06-23~) const accessCodes = [...new Set(movieTickets.map((t) => t.accessCode))]; if (accessCodes.length !== 1) { throw new factory.errors.Argument('movieTickets', 'Number of movie ticket accessCodes must be 1'); } // ムビチケ系統の決済方法タイプは動的 const paymentMethodType = (_b = params.object.paymentMethod) === null || _b === void 0 ? void 0 : _b.identifier; if (typeof paymentMethodType !== 'string') { throw new factory.errors.ArgumentNull('object.paymentMethod.identifier'); } // イベント取得属性最適化(2023-01-23~) const screeningEvent = yield repos.event.projectEventFieldsById({ id: eventIds[0] }, [ 'typeOf', 'project', 'coaInfo', 'startDate', 'offers.offeredThrough', 'superEvent.workPerformed.identifier' ] // optimize(2024-07-18~) ); // 販売者からムビチケ決済情報取得 const sellerId = (_c = params.recipient) === null || _c === void 0 ? void 0 : _c.id; if (typeof sellerId !== 'string') { throw new factory.errors.ArgumentNull('recipient.id'); } // const sellers = <Pick<factory.seller.ISeller, 'id' | 'paymentAccepted' | 'project'>[]>await repos.seller.search( // { // limit: 1, // page: 1, // id: { $eq: sellerId } // }, // ['paymentAccepted', 'project'], // [] // ); // const seller = sellers.shift(); // if (seller === undefined) { // throw new factory.errors.NotFound(factory.organizationType.Corporation); // } // const paymentAccepted = seller.paymentAccepted?.some((a) => a.paymentMethodType === paymentMethodType); const paymentAccepted = yield repos.paymentAccepted.isAcceptedBySeller({ seller: { id: sellerId }, codeValue: paymentMethodType }); if (paymentAccepted !== true) { throw new factory.errors.Argument('recipient', `payment not accepted [${paymentMethodType}]`); } const checkResult = yield checkByIdentifierIfNotYet({ movieTicketIdentifier, movieTickets: movieTickets, seller: { id: sellerId }, screeningEvent: screeningEvent, paymentServiceId, // useCheckByIdentifierIfNotYet, checkedAction, purpose })(repos, settings); const accountsReceivablesByServiceType = []; // 券種ごとに枚数が足りているか const serviceTypes = [...new Set(movieTickets.map((t) => t.serviceType))]; serviceTypes.forEach((serviceType) => { var _a, _b; const requiredMovieTicketsCountByServiceType = movieTickets.filter((t) => t.serviceType === serviceType).length; let availableMovieTicketsCountByServiceType = 0; const ykknInfos = (_b = (_a = checkResult.purchaseNumberAuthResult.knyknrNoInfoOut) === null || _a === void 0 ? void 0 : _a.find((knyknrNoInfoOut) => knyknrNoInfoOut.knyknrNo === movieTicketIdentifier)) === null || _b === void 0 ? void 0 : _b.ykknInfo; const ykknInfoOfServiceType = ykknInfos === null || ykknInfos === void 0 ? void 0 : ykknInfos.find((ykknInfo) => ykknInfo.ykknshTyp === serviceType); const ykknKnshbtsmiNum = ykknInfoOfServiceType === null || ykknInfoOfServiceType === void 0 ? void 0 : ykknInfoOfServiceType.ykknKnshbtsmiNum; if (typeof ykknKnshbtsmiNum === 'string') { availableMovieTicketsCountByServiceType = Number(ykknKnshbtsmiNum); } if (availableMovieTicketsCountByServiceType < requiredMovieTicketsCountByServiceType) { const shortNumber = requiredMovieTicketsCountByServiceType - availableMovieTicketsCountByServiceType; throw new factory.errors.Argument('movieTickets', `${shortNumber} movie tickets by service type ${serviceType} short`); } // checkResultから計上金額を取得 const accountsReceivableByResponse = ykknInfoOfServiceType === null || ykknInfoOfServiceType === void 0 ? void 0 : ykknInfoOfServiceType.kijUnip; accountsReceivablesByServiceType.push(Object.assign({ serviceType }, (typeof accountsReceivableByResponse === 'string') ? { accountsReceivable: Number(accountsReceivableByResponse) } : undefined)); }); return { accountsReceivablesByServiceType }; }); } function checkByIdentifierIfNotYet(params) { return (repos, settings) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; let checkResult; let alreadyCheckedAction; // すでにCheckActionが存在すれば認証しない(2023-06-06~) const placeOrderId = params.purpose.id; if (typeof placeOrderId === 'string') { // no op } const specifiedCheckedActionId = (_a = params.checkedAction) === null || _a === void 0 ? void 0 : _a.id; if (typeof specifiedCheckedActionId === 'string' && specifiedCheckedActionId !== '') { alreadyCheckedAction = (yield repos.action.search(Object.assign({ limit: 1, page: 1, id: { $in: [specifiedCheckedActionId] }, actionStatus: { $in: [factory.actionStatusType.CompletedActionStatus] } }, (typeof placeOrderId === 'string') ? { purpose: { id: { $in: [placeOrderId] } } } : undefined), ['id'])).shift(); if (alreadyCheckedAction === undefined) { throw new factory.errors.NotFound(factory.actionType.CheckAction); } } else { alreadyCheckedAction = (yield repos.action.search(Object.assign({ limit: 1, page: 1, sort: { startDate: factory.sortType.Descending }, typeOf: { $eq: factory.actionType.CheckAction }, actionStatus: { $in: [factory.actionStatusType.CompletedActionStatus] }, object: { typeOf: { $eq: factory.service.paymentService.PaymentServiceType.MovieTicket }, id: { $eq: params.paymentServiceId }, // 指定の決済サービスにおいて movieTickets: { identifier: { $eq: params.movieTicketIdentifier }, // 指定の決済カードコードを serviceOutput: { reservationFor: { id: { $eq: params.screeningEvent.id } } // 指定のイベントにおいて } } } }, (typeof placeOrderId === 'string') ? { purpose: { id: { $in: [placeOrderId] } } } : undefined), ['id'])).shift(); } if (alreadyCheckedAction !== undefined) { const recipe = yield repos.action.findRecipeByAction({ project: { id: params.screeningEvent.project.id }, recipeFor: { id: alreadyCheckedAction.id } }); const directionPurchaseNumberAuth = (_c = (_b = recipe === null || recipe === void 0 ? void 0 : recipe.step[0]) === null || _b === void 0 ? void 0 : _b.itemListElement[0]) === null || _c === void 0 ? void 0 : _c.itemListElement[0]; if (directionPurchaseNumberAuth !== undefined) { const { beforeMedia, afterMedia } = directionPurchaseNumberAuth; if (beforeMedia !== undefined && afterMedia !== undefined) { checkResult = { purchaseNumberAuthIn: beforeMedia, purchaseNumberAuthResult: afterMedia }; } } } if (checkResult === undefined) { debug('checkByIdentifier processing because movieTickets not checked yet...', checkResult); checkResult = yield (0, processPurchaseNumberAuth_1.processPurchaseNumberAuth)(params)(repos, settings); } return checkResult; }); }