UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

119 lines (118 loc) 4.65 kB
"use strict"; 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]; }