@chevre/domain
Version:
Chevre Domain Library for Node.js
146 lines (145 loc) • 8.55 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.onRefundActionCompletedOrFailed = onRefundActionCompletedOrFailed;
/**
* 汎用決済サービス
*/
const factory = require("../../../factory");
const factory_1 = require("./factory");
const onPaymentStatusChanged_1 = require("./onPaymentStatusChanged");
/**
* 返金後のアクション
*/
function onRefundActionCompletedOrFailed(refundAction) {
// tslint:disable-next-line:max-func-body-length
return (repos) => __awaiter(this, void 0, void 0, function* () {
const aciton4inform = (0, factory_1.optimizeAction4inform)(refundAction);
const potentialActions = refundAction.potentialActions;
const now = new Date();
const taskAttributes = [];
const add2report = potentialActions === null || potentialActions === void 0 ? void 0 : potentialActions.add2report;
if (add2report === true) {
// 同期的に経理レポート連携する(2022-08-27~)
yield (0, onPaymentStatusChanged_1.onPaymentStatusChanged)(aciton4inform)(repos);
}
// FailedActionStatusに対応(経理レポート連携はするが、通知はしない)(2024-03-21~)
if (refundAction.actionStatus === factory.actionStatusType.FailedActionStatus) {
// no op
}
else if (refundAction.actionStatus === factory.actionStatusType.CompletedActionStatus) {
const informPayment = potentialActions === null || potentialActions === void 0 ? void 0 : potentialActions.informPayment;
// 手数料決済があれば処理
// CreditCardIFのみ(2023-06-29~)
const firstObject = refundAction.object[0];
const paymentServiceType = firstObject === null || firstObject === void 0 ? void 0 : firstObject.typeOf;
if (paymentServiceType === factory.service.paymentService.PaymentServiceType.CreditCard) {
const refundFee = firstObject === null || firstObject === void 0 ? void 0 : firstObject.refundFee;
if (typeof refundFee === 'number' && refundFee > 0) {
// purpose.typeOf:PlaceOrderは外部決済URL無効化における返金アクションのみなので、手数料決済から除外してよい(2024-03-19~)
// purpose.typeOf:Orderは決済カード承認時着券の取消なので、手数料決済から除外してよい
// 手数料決済は注文返品による返金アクションからしか発生しないはず(2024-06-13~)
if (refundAction.purpose.typeOf === factory.actionType.ReturnAction) {
const payReturnFeeObject = [{
typeOf: firstObject.typeOf,
id: firstObject.id,
paymentMethod: {
accountId: firstObject.paymentMethod.accountId,
additionalProperty: firstObject.paymentMethod.additionalProperty,
name: firstObject.paymentMethod.name,
paymentMethodId: firstObject.paymentMethod.paymentMethodId,
totalPaymentDue: {
typeOf: 'MonetaryAmount',
currency: factory.priceCurrency.JPY,
value: refundFee
},
typeOf: firstObject.paymentMethod.typeOf
}
}];
const instrument = [
{ id: refundAction.id, typeOf: refundAction.typeOf },
{ orderNumber: refundAction.purpose.object.orderNumber, typeOf: factory.order.OrderType.Order }
];
const payReturnFeeAction = {
typeOf: factory.actionType.PayAction,
object: payReturnFeeObject,
purpose: refundAction.purpose,
potentialActions: {
informPayment: (Array.isArray(informPayment)) ? informPayment : [],
add2report: true
},
instrument // add(2025-02-19~)
};
const payTask = {
project: refundAction.project,
name: factory.taskName.Pay,
status: factory.taskStatus.Ready,
runsAt: now,
remainingNumberOfTries: 10,
numberOfTried: 0,
executionResults: [],
data: payReturnFeeAction
};
taskAttributes.push(payTask);
}
}
}
if (Array.isArray(informPayment)) {
taskAttributes.push(...informPayment.map(({ purpose, id }) => {
let data;
if (typeof id === 'string' && id !== '') {
let about;
if (refundAction.purpose.typeOf === factory.actionType.ReturnAction) {
about = {
orderNumber: refundAction.purpose.object.orderNumber,
typeOf: factory.order.OrderType.Order
};
}
data = Object.assign(Object.assign({
// optimize(2024-07-01~)
// recipient, // discontinue recipient(2025-02-19~)
object: aciton4inform, id, typeOf: factory.actionType.InformAction }, (typeof (purpose === null || purpose === void 0 ? void 0 : purpose.typeOf) === 'string') ? { purpose } : undefined), (typeof (about === null || about === void 0 ? void 0 : about.typeOf) === 'string') ? { about } : undefined // add(2025-02-14~)
);
}
else {
throw new factory.errors.ArgumentNull('potentialActions.informPayment.id'); // 2025-02-09~
// data = {
// recipient,
// object: aciton4inform,
// target: {
// httpMethod: 'POST',
// encodingType: factory.encodingFormat.Application.json,
// typeOf: 'EntryPoint',
// urlTemplate: recipient.url
// },
// ...(typeof purpose?.typeOf === 'string') ? { purpose } : undefined
// };
}
return {
project: refundAction.project,
name: factory.taskName.TriggerWebhook,
status: factory.taskStatus.Ready,
runsAt: now, // なるはやで実行
remainingNumberOfTries: 30, // 通知先で429が散見されるので少し多めに
numberOfTried: 0,
executionResults: [],
data
};
}));
}
// タスク保管
yield repos.task.saveMany(taskAttributes, { emitImmediately: true });
}
else {
throw new factory.errors.NotImplemented(`actionStatus ${refundAction.actionStatus} not implemented`);
}
});
}
;