@chevre/domain
Version:
Chevre Domain Library for Node.js
165 lines (164 loc) • 8.74 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.processOrder = processOrder;
/**
* 注文処理時処理
*/
const createDebug = require("debug");
const util = require("util");
const factory = require("../../../../factory");
const factory_1 = require("./factory");
const debug = createDebug('chevre-domain:service:order');
function processOrder(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
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
};
if (params.order.itemOfferedTypeOf === factory.actionType.MoneyTransfer) {
yield createConfirmMoneyTransferTasksIfNotExist(params.order, simpleOrder)(repos);
}
else if (params.order.itemOfferedTypeOf === factory.reservationType.BusReservation
|| params.order.itemOfferedTypeOf === factory.reservationType.EventReservation) {
// 冗長なconfirmReserveTransactionタスク作成を回避(2023-08-25~)
yield createConfirmReserveTransactionTasksIfNotExist(params.order, simpleOrder, params.options)(repos);
}
else if (params.order.itemOfferedTypeOf === factory.permit.PermitType.Permit) {
yield createConfirmRegisterServiceTasksIfNotExist(params.order, simpleOrder)(repos);
}
});
}
function createConfirmReserveTransactionTasksIfNotExist(order, simpleOrder, options) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const { numTryConfirmReserveTransaction } = options;
const taskRunsAt = new Date();
const taskRunsAt4coa = new Date();
let confirmObjects;
if (order.offeredThroughIdentifier === factory.service.webAPI.Identifier.COA) {
confirmObjects = (0, factory_1.createConfirmReservationActionObject4COAByOrder)({ order });
}
else {
confirmObjects = (0, factory_1.createConfirmReservationActionObject4ChevreByOrder)({ order });
}
yield Promise.all(confirmObjects.map((confirmObject) => __awaiter(this, void 0, void 0, function* () {
const data = {
project: order.project,
typeOf: factory.actionType.ConfirmAction,
object: confirmObject,
agent: order.project,
purpose: simpleOrder
// instrument廃止(2024-03-13~)
};
const taskIdentifier = util.format('%s:%s:%s:%s:%s:%s', data.project.id, factory.taskName.ConfirmReserveTransaction, data.purpose.typeOf, data.purpose.orderNumber, data.object.typeOf, data.object.transactionNumber);
const confirmReserveTransactionTask = {
alternateName: taskIdentifier,
identifier: taskIdentifier,
project: order.project,
name: factory.taskName.ConfirmReserveTransaction,
status: factory.taskStatus.Ready,
runsAt: (confirmObject.typeOf === factory.assetTransactionType.COAReserveTransaction) ? taskRunsAt4coa : taskRunsAt,
remainingNumberOfTries: numTryConfirmReserveTransaction, // COA性能を考慮して多めに
numberOfTried: 0,
executionResults: [],
data
};
yield repos.task.createIfNotExistByAlternateName(confirmReserveTransactionTask, { emitImmediately: true });
if (options.force === true) {
const existingTask = yield repos.task.findByIdentifier({
identifier: taskIdentifier,
name: confirmReserveTransactionTask.name,
project: { id: confirmReserveTransactionTask.project.id }
});
if (typeof (existingTask === null || existingTask === void 0 ? void 0 : existingTask.id) === 'string') {
const retryResult = yield repos.task.retryForciblyIfAborted({
id: existingTask.id,
remainingNumberOfTries: numTryConfirmReserveTransaction
});
debug('retryResult:', retryResult, 'taskIdentifier:', taskIdentifier);
}
}
})));
});
}
function createConfirmMoneyTransferTasksIfNotExist(order, simpleOrder) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const taskRunsAt = new Date();
yield Promise.all(order.serialNumbers.map((moneyTransferTransactionNumber) => __awaiter(this, void 0, void 0, function* () {
const data = {
project: order.project,
typeOf: factory.actionType.ConfirmAction,
object: {
// pendingTransaction: { id: '' }, // 空文字であれば、transactionNumberで処理される
transactionNumber: moneyTransferTransactionNumber,
typeOf: factory.assetTransactionType.MoneyTransfer
},
agent: order.project,
purpose: simpleOrder
};
const taskIdentifier = util.format('%s:%s:%s:%s:%s:%s', data.project.id, factory.taskName.ConfirmMoneyTransfer, data.purpose.typeOf, simpleOrder.orderNumber, data.object.typeOf, data.object.transactionNumber);
const confirmMoneyTransferTransactionTask = {
alternateName: taskIdentifier,
identifier: taskIdentifier,
project: order.project,
name: factory.taskName.ConfirmMoneyTransfer,
status: factory.taskStatus.Ready,
runsAt: taskRunsAt,
remainingNumberOfTries: 10,
numberOfTried: 0,
executionResults: [],
data
};
yield repos.task.createIfNotExistByAlternateName(confirmMoneyTransferTransactionTask, { emitImmediately: true });
})));
});
}
function createConfirmRegisterServiceTasksIfNotExist(order, simpleOrder) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const taskRunsAt = new Date();
yield Promise.all(order.serialNumbers.map((registerServiceTransactionNumber) => __awaiter(this, void 0, void 0, function* () {
const data = {
project: order.project,
typeOf: factory.actionType.ConfirmAction,
object: {
endDate: order.orderDate,
transactionNumber: registerServiceTransactionNumber,
typeOf: factory.assetTransactionType.RegisterService
},
agent: order.project,
purpose: simpleOrder
};
const taskIdentifier = util.format('%s:%s:%s:%s:%s:%s', data.project.id, factory.taskName.ConfirmRegisterService, data.purpose.typeOf, simpleOrder.orderNumber, data.object.typeOf, data.object.transactionNumber);
const confirmRegisterServiceTask = {
alternateName: taskIdentifier,
identifier: taskIdentifier,
project: order.project,
name: factory.taskName.ConfirmRegisterService,
status: factory.taskStatus.Ready,
runsAt: taskRunsAt,
remainingNumberOfTries: 10,
numberOfTried: 0,
executionResults: [],
data
};
yield repos.task.createIfNotExistByAlternateName(confirmRegisterServiceTask, { emitImmediately: true });
})));
});
}