UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

168 lines (167 loc) 8.06 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.returnOrder = returnOrder; const createDebug = require("debug"); // import { createMaskedCustomer } from '../../factory/order'; const onOrderStatusChanged_1 = require("./onOrderStatusChanged"); const factory = require("../../factory"); // import { Settings } from '../../settings'; const debug = createDebug('chevre-domain:service:order'); function createReturnPolicy(params) { const { identifier, returnFees, restockingFee, typeOf } = params.returnOrderTransaction.object.returnPolicy; return Object.assign(Object.assign({ returnFees, typeOf }, (typeof identifier === 'string') ? { identifier } : undefined), (typeof (restockingFee === null || restockingFee === void 0 ? void 0 : restockingFee.value) === 'number') ? { restockingFee } : undefined); } function returnOrder(params) { // tslint:disable-next-line:max-func-body-length return (repos // settings: Settings ) => __awaiter(this, void 0, void 0, function* () { if (typeof params.useOnOrderStatusChanged !== 'boolean') { throw new factory.errors.Argument('useOnOrderStatusChanged', 'must be boolean'); } const orderNumber = params.object.orderNumber; const dateReturned = (params.object.dateReturned instanceof Date) ? params.object.dateReturned : new Date(); const returner = params.agent; const order = yield repos.order.projectFieldsByOrderNumber({ orderNumber, project: { id: params.project.id }, inclusion: [ 'project', 'typeOf', 'orderNumber', 'dateReturned', 'customer', 'returner', 'seller', 'price', 'priceCurrency', 'orderDate', 'orderStatus' ] }); // 注文ステータス検証(2024-01-10~) switch (order.orderStatus) { case factory.orderStatus.OrderDelivered: case factory.orderStatus.OrderReturned: break; default: // OrderDeliveredへの処理が進行中と考えられるので、ひとまず失敗させてリトライに期待 throw new factory.errors.Argument('object.orderNumber', `orderStatus not returnable: ${order.orderStatus}`); } // 返品取引検索 const returnOrderTransactions = yield repos.transaction.projectFields({ limit: 1, page: 1, project: { id: { $eq: order.project.id } }, typeOf: factory.transactionType.ReturnOrder, statuses: [factory.transactionStatusType.Confirmed], object: { order: { orderNumbers: [orderNumber] } }, inclusion: ['typeOf', 'potentialActions', 'object'] }); const returnOrderTransaction = returnOrderTransactions.shift(); if (returnOrderTransaction === undefined) { throw new factory.errors.NotFound(factory.transactionType.ReturnOrder); } const simpleOrder = { typeOf: order.typeOf, orderNumber: order.orderNumber, orderDate: order.orderDate, dateReturned }; const recipient = { id: order.seller.id, name: order.seller.name, typeOf: order.seller.typeOf }; const returnPolicyAsInstrument = createReturnPolicy({ returnOrderTransaction }); const returnOrderActionAttributes = { agent: returner, instrument: [returnPolicyAsInstrument], // add returnPolicy(2025-01-21~) object: simpleOrder, project: order.project, recipient, typeOf: factory.actionType.ReturnAction }; let returnedOwnershipInfos = []; let returnedOrder; const action = yield repos.action.start(returnOrderActionAttributes); try { returnedOwnershipInfos = yield processReturnOrder(order, dateReturned)({ acceptedOffer: repos.acceptedOffer, ownershipInfo: repos.ownershipInfo }); // 注文ステータス変更 returnedOrder = yield repos.order.returnOrder({ project: { id: order.project.id }, orderNumber, dateReturned, returner }); debug('repos.order.returnOrder processed. returnedOrder:', order); } catch (error) { try { yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error }); } catch (__) { // 失敗したら仕方ない } throw error; } const result = returnedOwnershipInfos; yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result }); if (params.useOnOrderStatusChanged) { yield (0, onOrderStatusChanged_1.onOrderReturned)({ order: { project: returnedOrder.project, typeOf: returnedOrder.typeOf, orderNumber: returnedOrder.orderNumber, dateReturned: returnedOrder.dateReturned, id: returnedOrder.id, customer: returnedOrder.customer, returner: returnedOrder.returner, seller: returnedOrder.seller, price: returnedOrder.price, priceCurrency: returnedOrder.priceCurrency, orderDate: returnedOrder.orderDate, orderStatus: factory.orderStatus.OrderReturned }, returnOrderTransaction, returnOrderAction: Object.assign(Object.assign({}, returnOrderActionAttributes), { id: action.id }) })(repos // settings ); } }); } function processReturnOrder(order, dateReturned) { return (repos) => __awaiter(this, void 0, void 0, function* () { const returnedOwnershipInfos = []; // 所有権の所有期間変更 // 注文オファーリポジトリから所有権識別子を検索する(2023-12-07~) const ownershipInfos = yield repos.acceptedOffer.aggreateOwnershipInfosByOrder({ orderNumber: { $eq: order.orderNumber } }); if (Array.isArray(ownershipInfos)) { yield Promise.all(ownershipInfos.map((ownershipInfo) => __awaiter(this, void 0, void 0, function* () { const ownershipInfoReturned = yield repos.ownershipInfo.findByIdentifierAndUpdateOwnedThrough({ project: { id: order.project.id }, identifier: String(ownershipInfo.identifier), ownedThrough: dateReturned }) .then((ownershipInfoByDB) => { // 存在しない場合は識別子のみ保管(customer.typeOfによって存在しないこともありうる) if (ownershipInfoByDB === undefined) { return ownershipInfo; } else { return ownershipInfoByDB; } }); returnedOwnershipInfos.push(ownershipInfoReturned); }))); } return returnedOwnershipInfos; }); }