@chevre/domain
Version:
Chevre Domain Library for Node.js
159 lines (158 loc) • 9.82 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.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`);
}
});
}