@chevre/domain
Version:
Chevre Domain Library for Node.js
238 lines (237 loc) • 13.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.creatPublishPaymentUrlParams = creatPublishPaymentUrlParams;
exports.creatPayTransactionStartParams = creatPayTransactionStartParams;
exports.createMovieTicket = createMovieTicket;
exports.createAuthorizeResult = createAuthorizeResult;
exports.optimizeAction4inform = optimizeAction4inform;
const moment = require("moment");
const util = require("util");
const factory = require("../../../factory");
function creatPublishPaymentUrlParams(params) {
var _a, _b, _c, _d;
const issuedThroughId = (_a = params.object.issuedThrough) === null || _a === void 0 ? void 0 : _a.id;
// const accountId: string | undefined = (typeof params.accountId === 'string')
// ? params.accountId
// : (typeof params.object.accountId === 'string') ? params.object.accountId : undefined;
// const movieTickets: factory.action.trade.pay.IMovieTicket[] | undefined
// = (Array.isArray(params.object.movieTickets)) ? params.object.movieTickets.map(createMovieTicket) : undefined;
const paymentMethod = Object.assign(Object.assign({ identifier: params.object.paymentMethod, amount: params.object.amount }, (typeof params.object.method === 'string') ? { method: params.object.method } : undefined), (params.object.creditCard !== undefined) ? { creditCard: params.object.creditCard } : undefined
// ...(Array.isArray(movieTickets)) ? { movieTickets } : undefined
);
const object = {
typeOf: params.paymentServiceType,
id: issuedThroughId,
paymentMethod
};
return Object.assign(Object.assign({ project: { id: params.transaction.project.id, typeOf: factory.organizationType.Project }, typeOf: factory.assetTransactionType.Pay, transactionNumber: params.transactionNumber, agent: {
typeOf: params.transaction.seller.typeOf,
id: params.transaction.seller.id,
name: (typeof params.transaction.seller.name === 'string')
? params.transaction.seller.name
: String((_b = params.transaction.seller.name) === null || _b === void 0 ? void 0 : _b.ja)
}, recipient: {
id: params.transaction.seller.id,
name: (typeof params.transaction.seller.name === 'string')
? params.transaction.seller.name
: String((_c = params.transaction.seller.name) === null || _c === void 0 ? void 0 : _c.ja),
typeOf: params.transaction.seller.typeOf
}, object }, (typeof ((_d = params.location) === null || _d === void 0 ? void 0 : _d.typeOf) === 'string')
? { location: params.location }
: undefined), (typeof params.identifier === 'string')
? { identifier: params.identifier }
: undefined);
}
function creatPayTransactionStartParams(params) {
var _a, _b, _c, _d;
let expires = moment(params.transaction.expires)
.add(1, 'month')
.toDate(); // 余裕を持って
// 実験的にPaymentDueに対応(2023-08-30~)
if (params.paymentServiceType === factory.service.paymentService.PaymentServiceType.FaceToFace) {
if (params.object.paymentMethod.length === 0) {
expires = moment(params.transaction.expires)
.add(1, 'hour')
.toDate();
}
}
const { confirmationNumber, orderNumber } = params.order;
const issuedThroughId = (_a = params.object.issuedThrough) === null || _a === void 0 ? void 0 : _a.id;
const accountId = (typeof params.accountId === 'string')
? params.accountId
: (typeof params.object.accountId === 'string') ? params.object.accountId : undefined;
const movieTickets = (Array.isArray(params.object.movieTickets)) ? params.object.movieTickets.map(createMovieTicket) : undefined;
const instrument = [
{ id: params.action.id, typeOf: params.action.typeOf },
{ orderNumber, typeOf: factory.order.OrderType.Order }
];
return Object.assign({ project: { id: params.transaction.project.id, typeOf: factory.organizationType.Project }, typeOf: factory.assetTransactionType.Pay, transactionNumber: params.transactionNumber, agent: {
typeOf: params.transaction.seller.typeOf,
id: params.transaction.seller.id,
name: (typeof params.transaction.seller.name === 'string')
? params.transaction.seller.name
: String((_b = params.transaction.seller.name) === null || _b === void 0 ? void 0 : _b.ja)
// identifierを廃止(2024-03-05~)
// identifier: [
// { name: 'transaction', value: params.transaction.id },
// {
// name: 'transactionExpires',
// value: moment(params.transaction.expires)
// .toISOString()
// }
// ]
}, recipient: {
id: params.transaction.seller.id,
name: (typeof params.transaction.seller.name === 'string')
? params.transaction.seller.name
: String((_c = params.transaction.seller.name) === null || _c === void 0 ? void 0 : _c.ja),
typeOf: params.transaction.seller.typeOf
}, object: {
typeOf: params.paymentServiceType,
id: issuedThroughId,
paymentMethod: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ identifier: params.object.paymentMethod, amount: params.object.amount, additionalProperty: (Array.isArray(params.object.additionalProperty)) ? params.object.additionalProperty : [] }, (typeof params.object.method === 'string') ? { method: params.object.method } : undefined), (typeof params.object.name === 'string') ? { name: params.object.name } : undefined), (typeof accountId === 'string') ? { accountId } : undefined), (typeof params.object.description === 'string') ? { description: params.object.description } : undefined), (typeof params.object.fromLocation === 'string') ? { fromLocation: params.object.fromLocation } : undefined), (params.object.creditCard !== undefined) ? { creditCard: params.object.creditCard } : undefined), (Array.isArray(movieTickets)) ? { movieTickets } : undefined)
}, expires: expires, purpose: {
typeOf: factory.order.OrderType.Order,
confirmationNumber,
orderNumber
}, instrument }, (typeof ((_d = params.location) === null || _d === void 0 ? void 0 : _d.typeOf) === 'string')
? { location: params.location }
: undefined);
}
function createMovieTicket(params) {
var _a;
let ticketIdentifier = util.format('%s:%s:%s', params.serviceOutput.reservationFor.id, params.serviceOutput.reservedTicket.ticketedSeat.seatSection, params.serviceOutput.reservedTicket.ticketedSeat.seatNumber);
// 指定があれば採用(2024-04-16~)
const ticketIdentifierByRequest = params.serviceOutput.reservedTicket.identifier;
if (typeof ticketIdentifierByRequest === 'string' && ticketIdentifierByRequest.length > 0) {
ticketIdentifier = ticketIdentifierByRequest;
}
const serviceOutput = {
reservationFor: {
typeOf: params.serviceOutput.reservationFor.typeOf,
id: params.serviceOutput.reservationFor.id
},
reservedTicket: {
identifier: ticketIdentifier, // チケット識別子追加(2024-04-15~)
ticketedSeat: {
typeOf: factory.placeType.Seat,
seatNumber: params.serviceOutput.reservedTicket.ticketedSeat.seatNumber,
seatRow: params.serviceOutput.reservedTicket.ticketedSeat.seatRow,
seatSection: params.serviceOutput.reservedTicket.ticketedSeat.seatSection
}
}
};
return {
typeOf: params.typeOf,
identifier: params.identifier,
accessCode: params.accessCode,
category: { codeValue: (typeof ((_a = params.category) === null || _a === void 0 ? void 0 : _a.codeValue) === 'string') ? params.category.codeValue : '' },
serviceType: params.serviceType,
serviceOutput
};
}
function createAuthorizeResult(params) {
var _a, _b, _c, _d, _e, _f;
const payTransactionObject = params.payTransaction.object;
const totalPaymentDue = (_a = payTransactionObject.paymentMethod) === null || _a === void 0 ? void 0 : _a.totalPaymentDue;
if (typeof (totalPaymentDue === null || totalPaymentDue === void 0 ? void 0 : totalPaymentDue.typeOf) !== 'string') {
throw new factory.errors.Internal('payTransaction.object.paymentMethod.totalPaymentDue undefined');
}
const issuedThrough = {
typeOf: payTransactionObject.typeOf,
id: (typeof payTransactionObject.id === 'string') ? payTransactionObject.id : ''
};
// 決済取引から決済カード通貨区分を取り出す
const paymentMethodAmountCurrencyByPayTransaction = (typeof ((_b = payTransactionObject.paymentMethod) === null || _b === void 0 ? void 0 : _b.amount) !== 'number')
? (_d = (_c = payTransactionObject.paymentMethod) === null || _c === void 0 ? void 0 : _c.amount) === null || _d === void 0 ? void 0 : _d.currency
: undefined;
const paymentMethodAsObject = Object.assign({ typeOf: params.object.paymentMethod }, (payTransactionObject.typeOf === factory.service.paymentService.PaymentServiceType.CreditCard
&& typeof paymentMethodAmountCurrencyByPayTransaction === 'string')
? { amount: { currency: paymentMethodAmountCurrencyByPayTransaction } }
: undefined);
// FaceToFaceの場合、決済方法区分未指定に対応(2023-08-29~)
let paymentStatus = factory.paymentStatusType.PaymentAutomaticallyApplied;
if (issuedThrough.typeOf === factory.service.paymentService.PaymentServiceType.FaceToFace) {
if (paymentMethodAsObject.typeOf.length === 0) {
paymentStatus = factory.paymentStatusType.PaymentDue;
}
}
// Array対応(2023-09-02~)
const resultAsInvoice = {
accountId: (typeof ((_e = payTransactionObject.paymentMethod) === null || _e === void 0 ? void 0 : _e.accountId) === 'string')
? payTransactionObject.paymentMethod.accountId
: '',
issuedThrough,
// 完全廃止(paymentMethodAsObjectへ完全移行)(2023-08-16~)
// paymentMethod: params.object.paymentMethod,
paymentMethodAsObject,
paymentStatus,
paymentMethodId: (typeof payTransactionObject.paymentMethodId === 'string')
? payTransactionObject.paymentMethodId
: '',
name: (typeof ((_f = payTransactionObject.paymentMethod) === null || _f === void 0 ? void 0 : _f.name) === 'string')
? payTransactionObject.paymentMethod.name
: params.object.paymentMethod,
totalPaymentDue: totalPaymentDue,
additionalProperty: (Array.isArray(params.object.additionalProperty)) ? params.object.additionalProperty : [],
typeOf: factory.action.authorize.paymentMethod.any.ResultType.Payment
};
// tslint:disable-next-line:no-suspicious-comment
// TODO 保留 resultにメンバーシップを追加(2024-08-13~)
// let resultAsPermit: factory.action.authorize.paymentMethod.any.IResultAsPermit | undefined;
// if (typeof params.permit?.identifier === 'string') {
// resultAsPermit = {
// typeOf: factory.permit.PermitType.Permit,
// identifier: params.permit.identifier,
// issuedThrough: { serviceType: params.permit.issuedThrough?.serviceType }
// };
// }
// Arrayに統一(2023-09-04~)
// if (resultAsPermit !== undefined) {
// return [resultAsInvoice, resultAsPermit];
// } else {
// return [resultAsInvoice];
// }
return [resultAsInvoice];
}
function payActionObject2invoice(params) {
var _a;
return Object.assign({ paymentMethod: Object.assign({ id: params.id, typeOf: params.typeOf }, (Array.isArray(params.serviceOutput)) ? { serviceOutput: params.serviceOutput } : undefined), paymentMethodId: params.paymentMethod.paymentMethodId, typeOf: 'Invoice' }, (typeof ((_a = params.paymentMethod.totalPaymentDue) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string')
? { totalPaymentDue: params.paymentMethod.totalPaymentDue }
: undefined);
}
function refundActionObject2invoice(params) {
var _a;
return Object.assign({ paymentMethod: {
id: params.id,
typeOf: params.typeOf
}, paymentMethodId: params.paymentMethod.paymentMethodId, typeOf: 'Invoice' }, (typeof ((_a = params.paymentMethod.totalPaymentDue) === null || _a === void 0 ? void 0 : _a.typeOf) === 'string')
? { totalPaymentDue: params.paymentMethod.totalPaymentDue }
: undefined);
}
/**
* 通知対象としてのアクションを最適化
*/
function optimizeAction4inform(action) {
let optimizedAction;
const actionTypeOf = action.typeOf;
switch (actionTypeOf) {
case factory.actionType.PayAction:
optimizedAction = {
id: action.id,
object: action.object.map(payActionObject2invoice),
typeOf: action.typeOf
};
break;
case factory.actionType.RefundAction:
optimizedAction = {
id: action.id,
object: action.object.map(refundActionObject2invoice),
typeOf: action.typeOf
};
break;
default:
throw new factory.errors.NotImplemented(`action type '${actionTypeOf}' not implemented`);
}
return optimizedAction;
}