@chevre/domain
Version:
Chevre Domain Library for Node.js
119 lines (118 loc) • 4.65 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.createOwnershipInfosFromOrder = createOwnershipInfosFromOrder;
const moment = require("moment-timezone");
const util = require("util");
const factory = require("../../factory");
const factory_1 = require("./product/factory");
const factory_2 = require("./reservation/factory");
/**
* 注文から所有権を作成する
*/
function createOwnershipInfosFromOrder(params) {
const ownershipInfos = [];
if (!Array.isArray(params.order.acceptedOffers)) {
throw new factory.errors.ArgumentNull('order.acceptedOffers');
}
params.order.acceptedOffers.forEach((acceptedOffer, offerIndex) => {
var _a;
const itemOffered = acceptedOffer.itemOffered;
let ownershipInfo;
const ownedFrom = moment(params.order.orderDate)
.toDate();
const identifier = createOwnershipInfoIdentifier({
order: params.order,
itemOffered,
offerIndex,
offerIndexBase: params.offerIndexBase
});
const acquiredFrom = createAcquiredFrom(params);
const ownedBy = createOwnedby(params);
const itemOfferedType = itemOffered.typeOf;
switch (itemOfferedType) {
case factory.reservationType.BusReservation:
case factory.reservationType.EventReservation:
const excludeCOAReservation = ((_a = acceptedOffer.offeredThrough) === null || _a === void 0 ? void 0 : _a.identifier) === factory.service.webAPI.Identifier.COA;
if (excludeCOAReservation) {
// bookingService:COAでは作成しない(2024-12-31~)
}
else {
ownershipInfo = (0, factory_2.createReservationOwnershipInfo)({
project: params.order.project,
ownedBy: ownedBy,
acceptedOffer: Object.assign(Object.assign({}, acceptedOffer), { itemOffered }),
ownedFrom: ownedFrom,
identifier: identifier,
acquiredFrom: acquiredFrom
});
}
break;
case factory.permit.PermitType.Permit:
ownershipInfo = (0, factory_1.createProductOwnershipInfo)({
project: params.order.project,
ownedBy: ownedBy,
acceptedOffer: Object.assign(Object.assign({}, acceptedOffer), { itemOffered }),
ownedFrom: ownedFrom,
identifier: identifier,
acquiredFrom: acquiredFrom
});
break;
case factory.actionType.MoneyTransfer:
// no op
// 所有権は発生しない
break;
default:
throw new factory.errors.NotImplemented(`Offered item type ${itemOfferedType} not implemented`);
}
if (ownershipInfo !== undefined) {
ownershipInfos.push(ownershipInfo);
}
});
return ownershipInfos;
}
function createOwnershipInfoIdentifier(params) {
return util.format('%s-%s-%s-%s', params.order.customer.id, params.itemOffered.typeOf, params.order.orderNumber, (params.offerIndexBase + params.offerIndex));
}
function createAcquiredFrom(params) {
// 最低限の情報に絞る
const seller = params.order.seller;
return {
// 最適化(2022-11-15~)
// project: { typeOf: params.order.project.typeOf, id: params.order.project.id },
id: seller.id,
typeOf: seller.typeOf,
name: (typeof seller.name === 'string')
? seller.name
: String(seller.typeOf)
};
}
function createOwnedby(params) {
// 最低限の情報に絞る
const customer = params.order.customer;
let owner;
// 顧客組織の場合
if (customer.typeOf === factory.organizationType.Organization) {
const ownerAsOrganization = {
// 個人情報排除するように
typeOf: customer.typeOf,
id: customer.id
};
owner = ownerAsOrganization;
}
else if (customer.typeOf === factory.personType.Person) {
const ownerAsPerson = {
// 個人情報排除するように
typeOf: customer.typeOf,
id: customer.id
};
owner = ownerAsPerson;
}
else {
owner = {
// 個人情報排除するように
typeOf: customer.typeOf,
id: customer.id
};
}
return [owner];
}
;