@chevre/domain
Version:
Chevre Domain Library for Node.js
134 lines (133 loc) • 6.96 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.placeOrder = placeOrder;
const factory = require("../../factory");
const onAssetTransactionStatusChanged_1 = require("./onAssetTransactionStatusChanged");
const onOrderStatusChanged_1 = require("./onOrderStatusChanged");
const createPlacingOrderFromExistingTransaction_1 = require("./placeOrder/createPlacingOrderFromExistingTransaction");
const voidAcceptedOfferIfNecessary_1 = require("./placeOrder/voidAcceptedOfferIfNecessary");
/**
* 注文を作成する
*/
function placeOrder(params) {
// tslint:disable-next-line:max-func-body-length
return (repos, settings) => __awaiter(this, void 0, void 0, function* () {
var _a;
if (typeof params.useOnOrderStatusChanged !== 'boolean') {
throw new factory.errors.Argument('useOnOrderStatusChanged', 'must be boolean');
}
// 注文番号から取引と注文をfixする
const { order, placeOrderTransaction, serialNumbers } = yield (0, createPlacingOrderFromExistingTransaction_1.createPlacingOrderFromExistingTransaction)({
project: { id: params.project.id },
confirmationNumber: params.object.confirmationNumber,
orderNumber: params.object.orderNumber
})(repos);
// USE_ORDER_PAYMENT_DUE_ON_PLACED設定を廃止したので、必ずOrderPaymentDueのはず(2024-01-10~)
if (order.orderStatus !== factory.orderStatus.OrderPaymentDue) {
throw new factory.errors.Internal(`orderStatus must be ${factory.orderStatus.OrderPaymentDue}`);
}
const simpleOrder = {
typeOf: order.typeOf,
// seller: {
// id: order.seller.id,
// typeOf: order.seller.typeOf,
// name: order.seller.name
// }, // 廃止(2024-03-06~)
// customer: { typeOf: maskedCustomer.typeOf, id: maskedCustomer.id }, // 廃止(2024-03-06~)
orderNumber: order.orderNumber,
// price: order.price,
// priceCurrency: order.priceCurrency,
orderDate: order.orderDate
};
const orderActionPurpose = {
typeOf: placeOrderTransaction.typeOf, id: placeOrderTransaction.id
};
const orderActionAttributes = {
agent: (typeof ((_a = params.agent) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string') ? params.agent : placeOrderTransaction.project,
object: simpleOrder,
// potentialActions: {}, // discontinue(2024-06-28~)
project: placeOrderTransaction.project,
purpose: orderActionPurpose,
typeOf: factory.actionType.OrderAction
};
// 冪等性を担保(2023-05-31~)
const completedActions = yield repos.action.search({
limit: 1,
page: 1,
actionStatus: { $in: [factory.actionStatusType.CompletedActionStatus] },
typeOf: { $eq: orderActionAttributes.typeOf },
object: { orderNumber: { $in: [orderActionAttributes.object.orderNumber] } },
purpose: {
id: { $in: [orderActionPurpose.id] },
typeOf: { $in: [orderActionPurpose.typeOf] }
}
}, ['id']);
if (completedActions.length === 0) {
const action = yield repos.action.start(orderActionAttributes);
try {
// 冗長なオファーを除外する(念のため)
yield (0, voidAcceptedOfferIfNecessary_1.voidAcceptedOfferIfNecessary)({
object: { orderNumber: order.orderNumber },
// purpose: placeOrderTransaction,
serialNumbers
})(repos);
yield repos.orderInTransaction.placeOrder(order);
}
catch (error) {
try {
yield repos.action.giveUp({ typeOf: orderActionAttributes.typeOf, id: action.id, error });
}
catch (__) {
// 失敗したら仕方ない
}
throw error;
}
yield repos.action.completeWithVoid({ typeOf: orderActionAttributes.typeOf, id: action.id, result: {} });
}
if (params.useOnOrderStatusChanged) {
// 経理レポートを保管->CreateAccountingReportへ移行(2024-02-02~)
// PaymentDueであればonOrderStatusChangedを実行(2023-08-23~)
if (order.orderStatus === factory.orderStatus.OrderPaymentDue) {
yield (0, onOrderStatusChanged_1.onOrderPaymentDue)({
order: {
paymentMethods: order.paymentMethods,
project: placeOrderTransaction.project,
orderNumber: order.orderNumber,
confirmationNumber: order.confirmationNumber,
orderDate: order.orderDate,
seller: order.seller,
typeOf: order.typeOf,
price: order.price,
priceCurrency: order.priceCurrency,
orderStatus: order.orderStatus
}
})({
task: repos.task
});
}
else {
throw new factory.errors.NotImplemented(`placing an order on the status '${order.orderStatus}' not implemented`);
}
// paymentMethods.length: 0の場合を考慮(2023-08-24~)
if (order.paymentMethods.length === 0) {
// paymentMethods.length: 0の場合に、confirmPayTransactionは実行されないので、ここで強制的にpaymentDue2Processingを実行する必要がある
yield (0, onAssetTransactionStatusChanged_1.paymentDue2Processing)({
project: { id: placeOrderTransaction.project.id },
confirmationNumber: order.confirmationNumber,
orderNumber: order.orderNumber,
useOnOrderStatusChanged: params.useOnOrderStatusChanged === true
})(repos, settings);
}
}
return { order };
});
}