@chevre/domain
Version:
Chevre Domain Library for Node.js
125 lines (124 loc) • 5.95 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.onOrderPaymentDue = onOrderPaymentDue;
/**
* 注文決済時処理
*/
const createDebug = require("debug");
const factory = require("../../../factory");
// import { createMaskedCustomer } from '../../../factory/order';
const debug = createDebug('chevre-domain:service:order');
function onOrderPaymentDue(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
debug('onOrderStatusChanged called.', params.order.orderNumber, params.order.orderStatus, params.order.orderDate);
let tasks = [];
// const maskedCustomer = createMaskedCustomer(params.order, { noProfile: true });
const simpleOrder = {
typeOf: params.order.typeOf,
// seller: {
// id: params.order.seller.id,
// typeOf: params.order.seller.typeOf,
// name: params.order.seller.name
// }, // 廃止(2024-03-06~)
// customer: { typeOf: maskedCustomer.typeOf, id: maskedCustomer.id }, // 廃止(2024-03-06~)
orderNumber: params.order.orderNumber,
// price: params.order.price,
// priceCurrency: params.order.priceCurrency,
orderDate: params.order.orderDate
};
switch (params.order.orderStatus) {
// OrderPaymentDueを追加(2023-08-23~)
case factory.orderStatus.OrderPaymentDue:
tasks = [
...yield createConfirmPayTransactionTasks(params.order, simpleOrder)(repos),
...createCreateAccountingReportTask(params.order) // 経理レポート作成タスク(2024-02-02~)
];
break;
default:
throw new factory.errors.NotImplemented(`${params.order.orderStatus} not implemented`);
}
yield repos.task.saveMany(tasks, { emitImmediately: true });
});
}
function createConfirmPayTransactionTasks(order, simpleOrder) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const taskRunsAt = new Date();
const tasks = [];
yield Promise.all(order.paymentMethods.map((invoice) => __awaiter(this, void 0, void 0, function* () {
// PaymentAutomaticallyAppliedであれば、自動決済処理を実行(2023-08-24~)
if (invoice.paymentStatus !== factory.paymentStatusType.PaymentAutomaticallyApplied) {
return;
}
// 冗長なタスク作成を回避
const existingTasks = yield repos.task.projectFields({
limit: 1,
page: 1,
project: { id: { $eq: order.project.id } },
name: factory.taskName.ConfirmPayTransaction,
data: {
object: { transactionNumber: { $eq: invoice.paymentMethodId } },
purpose: { orderNumber: { $eq: order.orderNumber } }
}
}, ['id']
// {
// data: 0, executionResults: 0, name: 0, numberOfTried: 0,
// remainingNumberOfTries: 0, runsAt: 0, status: 0
// }
);
if (existingTasks.length === 0) {
const data = {
project: order.project,
typeOf: factory.actionType.ConfirmAction,
object: [{ typeOf: factory.assetTransactionType.Pay, transactionNumber: invoice.paymentMethodId }],
agent: order.project,
purpose: Object.assign(Object.assign({}, simpleOrder), { confirmationNumber: order.confirmationNumber }),
// 廃止(2024-03-12~)
// instrument: {
// typeOf: factory.assetTransactionType.Pay, // 産取引化(2024-03-11~)
// identifier: factory.action.authorize.paymentMethod.any.ServiceIdentifier.Chevre,
// transactionNumber: invoice.paymentMethodId
// },
processOrder: order.orderStatus === factory.orderStatus.OrderPaymentDue, // OrderPaymentDueの場合、processOrderを実行する
useOnOrderStatusChanged: true
};
tasks.push({
project: order.project,
name: factory.taskName.ConfirmPayTransaction,
status: factory.taskStatus.Ready,
runsAt: taskRunsAt,
remainingNumberOfTries: 10,
numberOfTried: 0,
executionResults: [],
data
});
}
})));
return tasks;
});
}
function createCreateAccountingReportTask(order) {
const taskRunsAt = new Date();
const task = {
project: order.project,
name: factory.taskName.CreateAccountingReport,
status: factory.taskStatus.Ready,
runsAt: taskRunsAt,
remainingNumberOfTries: 10,
numberOfTried: 0,
executionResults: [],
data: {
object: { mainEntity: { orderNumber: order.orderNumber } },
project: { id: order.project.id }
}
};
return [task];
}
;