@chevre/domain
Version:
Chevre Domain Library for Node.js
168 lines (167 loc) • 8.06 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.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;
});
}
;