@chevre/domain
Version:
Chevre Domain Library for Node.js
163 lines (162 loc) • 10.2 kB
JavaScript
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;
});
}
;