UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

134 lines (133 loc) 6.96 kB
"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 }; }); }