UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

159 lines (158 loc) 9.82 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.payByTask = payByTask; exports.payTask2payActionAttributes = payTask2payActionAttributes; const createDebug = require("debug"); const factory = require("../../../factory"); const CreditCardPaymentService = require("../../payment/creditCard"); const FaceToFacePaymentService = require("../../payment/faceToFace"); const factory_1 = require("../../payment/factory"); const MovieTicketPaymentService = require("../../payment/movieTicket"); const PaymentCardPaymentService = require("../../payment/paymentCard"); const debug = createDebug('chevre-domain:service:payment'); function fixOrderAsPurpose(params, transaction) { return (repos) => __awaiter(this, void 0, void 0, function* () { var _a; const payPurposeConfirmationNumber = params.potentialActions.pay.purpose.confirmationNumber; const payPurposeOrderNumber = (_a = params.potentialActions.pay.purpose) === null || _a === void 0 ? void 0 : _a.orderNumber; const ordersWithoutAcceptedOffers = yield repos.order.projectFields({ limit: 1, page: 1, project: { id: { $eq: transaction.project.id } }, confirmationNumbers: [payPurposeConfirmationNumber], orderNumbers: [payPurposeOrderNumber] }, { inclusion: ['typeOf', 'confirmationNumber', 'orderNumber'] }); const orderWithoutAcceptedOffers = ordersWithoutAcceptedOffers.shift(); if (orderWithoutAcceptedOffers === undefined) { throw new factory.errors.NotFound('Order as purpose'); } // 必要なオファー検索のみ実行する(2024-01-18~) let acceptedOffersMovieTicketUsed = []; const movieTickets = transaction.object.paymentMethod.movieTickets; if (Array.isArray(movieTickets) && movieTickets.length > 0) { const reservationForId = movieTickets[0].serviceOutput.reservationFor.id; // イベントIDは決済取引ごとにひとつのみ許可なので、これで問題ない const seatNumbers = movieTickets.map(({ serviceOutput }) => serviceOutput.reservedTicket.ticketedSeat.seatNumber); acceptedOffersMovieTicketUsed = (yield repos.acceptedOffer.searchAcceptedOffersByOrderNumber({ orderNumber: { $eq: orderWithoutAcceptedOffers.orderNumber }, project: { id: { $eq: transaction.project.id } }, acceptedOffers: { itemOffered: { typeOf: { $in: [factory.reservationType.EventReservation] }, // movieTicketsに結合されたイベントID,座席コードで絞る reservationFor: { id: { $in: [reservationForId] } }, reservedTicket: { ticketedSeat: { seatNumber: { $in: seatNumbers } } } } } }, ['itemOffered', 'priceSpecification'])); } return Object.assign(Object.assign({}, orderWithoutAcceptedOffers), { acceptedOffersMovieTicketUsed }); }); } function payTask2payActionAttributes(params) { return (repos) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e; const { object, potentialActions, purpose, typeOf, instrument } = params; if (typeOf === factory.actionType.PayAction) { // 返金手数料決済の場合 const order = (yield repos.order.projectFields({ limit: 1, page: 1, orderNumbers: [params.purpose.object.orderNumber] }, { inclusion: ['seller', 'project'] })).shift(); if (order === undefined) { throw new factory.errors.NotFound(factory.order.OrderType.Order); } return Object.assign(Object.assign({ object, purpose, typeOf: factory.actionType.PayAction, agent: { id: order.project.id, typeOf: factory.organizationType.Project }, project: { id: order.project.id, typeOf: factory.organizationType.Project }, recipient: Object.assign({ id: order.seller.id, typeOf: order.seller.typeOf }, (typeof order.seller.name === 'string') ? { name: order.seller.name } : undefined), instrument: (Array.isArray(instrument)) ? instrument : [] }, (potentialActions !== undefined) ? { potentialActions } : undefined), (typeof ((_a = params.sameAs) === null || _a === void 0 ? void 0 : _a.id) === 'string') ? { sameAs: params.sameAs } : undefined); } else { // 最適化されたタスクに対応(2024-01-19~) let transaction; if (typeof params.object.paymentMethod.paymentMethodId === 'string') { transaction = yield repos.assetTransaction.findByTransactionNumber({ typeOf: factory.assetTransactionType.Pay, transactionNumber: params.object.paymentMethod.paymentMethodId }); if (transaction.status !== factory.transactionStatusType.Confirmed) { throw new factory.errors.Argument('object.paymentMethod.paymentMethodId', `invalid transaction status: ${transaction.transactionNumber} ${transaction.status}`); } } else { throw new factory.errors.ArgumentNull('object.paymentMethod.paymentMethodId'); } const order = yield fixOrderAsPurpose({ potentialActions: { pay: { purpose: params.purpose } } }, transaction)(repos); // 認証アクションのactionRecipeを検索(2024-12-13~) let checkResult; const checkedActionId = (_b = transaction.object.checkedAction) === null || _b === void 0 ? void 0 : _b.id; if (typeof checkedActionId === 'string' && checkedActionId !== '') { const recipe = yield repos.action.findRecipeByAction({ project: { id: transaction.project.id }, recipeFor: { id: checkedActionId } }); const directionPurchaseNumberAuth = (_d = (_c = recipe === null || recipe === void 0 ? void 0 : recipe.step[0]) === null || _c === void 0 ? void 0 : _c.itemListElement[0]) === null || _d === void 0 ? void 0 : _d.itemListElement[0]; if (directionPurchaseNumberAuth !== undefined) { const { beforeMedia, afterMedia } = directionPurchaseNumberAuth; if (beforeMedia !== undefined && afterMedia !== undefined) { checkResult = { purchaseNumberAuthIn: beforeMedia, purchaseNumberAuthResult: afterMedia }; } } debug('payTask2payActionAttributes: checkResult found.', checkResult); } const payOrderAction = (0, factory_1.createPayOrderAction)({ transaction: transaction, potentialActions: { pay: { purpose: params.purpose } }, order, checkResult }); return Object.assign(Object.assign({}, payOrderAction), (typeof ((_e = params.sameAs) === null || _e === void 0 ? void 0 : _e.id) === 'string') ? { sameAs: params.sameAs } : undefined); } }); } /** * 決済確定 */ function payByTask( // params: factory.task.pay.IData & { // sameAs?: { // /** // * 実行元タスクID // */ // id: string; // typeOf: 'Task'; // }; // } payActionAttributes) { return (repos, settings) => __awaiter(this, void 0, void 0, function* () { var _a; const paymentServiceType = (_a = payActionAttributes.object[0]) === null || _a === void 0 ? void 0 : _a.typeOf; switch (paymentServiceType) { case factory.service.paymentService.PaymentServiceType.FaceToFace: yield FaceToFacePaymentService.payFaceToFace(payActionAttributes)(repos); break; case factory.service.paymentService.PaymentServiceType.PaymentCard: yield PaymentCardPaymentService.payPaymentCard(payActionAttributes)(repos); break; case factory.service.paymentService.PaymentServiceType.CreditCard: yield CreditCardPaymentService.payCreditCard(payActionAttributes)(repos, settings); break; case factory.service.paymentService.PaymentServiceType.MovieTicket: // check purpose(2025-02-12~) const purpose = payActionAttributes.purpose; if ((purpose === null || purpose === void 0 ? void 0 : purpose.typeOf) !== factory.order.OrderType.Order) { throw new factory.errors.NotImplemented(`${purpose === null || purpose === void 0 ? void 0 : purpose.typeOf} not implemented`); } yield MovieTicketPaymentService.payMovieTicket(Object.assign(Object.assign({}, payActionAttributes), { purpose }), { callOnPayActionCompleted: true })(repos, settings); break; default: throw new factory.errors.NotImplemented(`Payment service '${paymentServiceType}' not implemented`); } }); }