@chevre/domain 24.0.0-alpha.4 → 24.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/chevre/repo/mongoose/schemas/transaction.js +15 -0
- package/lib/chevre/repo/orderInTransaction.d.ts +4 -0
- package/lib/chevre/repo/orderInTransaction.js +12 -2
- package/lib/chevre/repo/orderNumber.js +12 -19
- package/lib/chevre/service/assetTransaction/pay/start/factory.d.ts +51 -3
- package/lib/chevre/service/assetTransaction/pay/start/factory.js +58 -21
- package/lib/chevre/service/assetTransaction/pay/start/preStart/fixPaymentService.d.ts +10 -0
- package/lib/chevre/service/assetTransaction/pay/start/preStart/fixPaymentService.js +88 -0
- package/lib/chevre/service/assetTransaction/pay/start/processAuthorize.d.ts +53 -0
- package/lib/chevre/service/assetTransaction/pay/start/processAuthorize.js +56 -0
- package/lib/chevre/service/assetTransaction/pay/start/processAuthorizeMovieTicket.d.ts +1 -1
- package/lib/chevre/service/assetTransaction/pay/start/processAuthorizeMovieTicket.js +1 -11
- package/lib/chevre/service/assetTransaction/pay/start.js +8 -132
- package/package.json +1 -1
|
@@ -163,6 +163,21 @@ const indexes = [
|
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
],
|
|
166
|
+
[
|
|
167
|
+
// 注文取引のobject.orderNumberも発行されている場合ユニークなはず(2026-02-21~)
|
|
168
|
+
{
|
|
169
|
+
typeOf: 1,
|
|
170
|
+
'object.orderNumber': 1
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: 'uniquePlacingOrderNumber',
|
|
174
|
+
unique: true,
|
|
175
|
+
partialFilterExpression: {
|
|
176
|
+
typeOf: factory.transactionType.PlaceOrder,
|
|
177
|
+
'object.orderNumber': { $exists: true }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
],
|
|
166
181
|
[
|
|
167
182
|
// ひとつの注文取引に対する確定返品取引はユニークなはず
|
|
168
183
|
{ 'object.order.orderNumber': 1 },
|
|
@@ -28,6 +28,10 @@ export declare class OrderInTransactionRepo {
|
|
|
28
28
|
* 注文を受注する
|
|
29
29
|
*/
|
|
30
30
|
placeOrder(order: IPlacingOrder): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* 注文documentがなければ作成し、受け入れられたオファーを追加する
|
|
33
|
+
* このメソッドでdocumentが初めて生成される(typeOf:PlaceOrderとして)
|
|
34
|
+
*/
|
|
31
35
|
acceptOffer(params: Pick<IOrderInTransaction, 'acceptedOffers' | 'orderNumber' | 'project'>): Promise<import("mongoose").UpdateWriteOpResult | undefined>;
|
|
32
36
|
/**
|
|
33
37
|
* serialNumberからオファーを除外する
|
|
@@ -66,6 +66,10 @@ class OrderInTransactionRepo {
|
|
|
66
66
|
}, { $set: setFields }, {})
|
|
67
67
|
.exec();
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* 注文documentがなければ作成し、受け入れられたオファーを追加する
|
|
71
|
+
* このメソッドでdocumentが初めて生成される(typeOf:PlaceOrderとして)
|
|
72
|
+
*/
|
|
69
73
|
async acceptOffer(params) {
|
|
70
74
|
if (!Array.isArray(params.acceptedOffers) || params.acceptedOffers.length === 0) {
|
|
71
75
|
return;
|
|
@@ -78,7 +82,10 @@ class OrderInTransactionRepo {
|
|
|
78
82
|
};
|
|
79
83
|
return this.orderModel.updateOne({
|
|
80
84
|
typeOf: { $eq: factory.transactionType.PlaceOrder },
|
|
81
|
-
orderNumber: { $eq: params.orderNumber }
|
|
85
|
+
orderNumber: { $eq: params.orderNumber },
|
|
86
|
+
// プロジェクトでもフィルター(注文番号重複バグがあったため)(2026-02-21~)
|
|
87
|
+
// 万が一異なるプロジェクトで同じ注文番号でオファーを受け入れようとしても、DBにインデックスによってDuplicateKey
|
|
88
|
+
'project.id': { $eq: params.project.id }
|
|
82
89
|
}, {
|
|
83
90
|
$setOnInsert: setOnInsert,
|
|
84
91
|
$push: {
|
|
@@ -130,7 +137,10 @@ class OrderInTransactionRepo {
|
|
|
130
137
|
const { customer, orderNumber, project } = params;
|
|
131
138
|
const filter = {
|
|
132
139
|
typeOf: { $eq: factory.transactionType.PlaceOrder },
|
|
133
|
-
orderNumber: { $eq: orderNumber }
|
|
140
|
+
orderNumber: { $eq: orderNumber },
|
|
141
|
+
// プロジェクトでもフィルター(注文番号重複バグがあったため)(2026-02-21~)
|
|
142
|
+
// 万が一異なるプロジェクトで同じ注文番号でオファーを受け入れようとしても、DBにインデックスによってDuplicateKey
|
|
143
|
+
'project.id': { $eq: project.id }
|
|
134
144
|
};
|
|
135
145
|
const setOnInsert = {
|
|
136
146
|
typeOf: factory.transactionType.PlaceOrder,
|
|
@@ -34,11 +34,6 @@ const setting_1 = require("./mongoose/schemas/setting");
|
|
|
34
34
|
const transactionNumber_2 = require("./mongoose/schemas/transactionNumber");
|
|
35
35
|
const transactionNumberCounter_1 = require("./transactionNumberCounter");
|
|
36
36
|
const ORDER_NUMBER_SEPARATOR = '-';
|
|
37
|
-
const defaultVersioningForceProjects = [
|
|
38
|
-
'HMX',
|
|
39
|
-
'SMT',
|
|
40
|
-
'KOJ'
|
|
41
|
-
];
|
|
42
37
|
/**
|
|
43
38
|
* 注文番号リポジトリ
|
|
44
39
|
*/
|
|
@@ -62,13 +57,16 @@ class OrderNumberRepo {
|
|
|
62
57
|
* タイムスタンプから発行する
|
|
63
58
|
*/
|
|
64
59
|
async publishByTimestamp(params) {
|
|
65
|
-
const { fpeSecret, version, validFrom, versioningForceProjects
|
|
60
|
+
const { fpeSecret, version, validFrom, versioningForceProjects
|
|
61
|
+
// versioningExceptionProjects
|
|
62
|
+
} = await this.findSetting();
|
|
66
63
|
const timestamp = (0, moment_timezone_1.default)(params.orderDate)
|
|
67
64
|
.valueOf()
|
|
68
65
|
.toString();
|
|
69
66
|
const projectPrefix = params.project.alternateName
|
|
70
67
|
.toUpperCase();
|
|
71
|
-
const dataFeedIdentifier = `${projectPrefix}:${timestamp}`;
|
|
68
|
+
// const dataFeedIdentifier = `${projectPrefix}:${timestamp}`;
|
|
69
|
+
const dataFeedIdentifier = timestamp; // reconsider increment scope(2026-02-21~)
|
|
72
70
|
const dataFeedExpires = (0, moment_timezone_1.default)(params.orderDate)
|
|
73
71
|
.add(1, 'minute') // ミリ秒でカウントしていくので、注文日時後1分で十分
|
|
74
72
|
.toDate();
|
|
@@ -78,14 +76,10 @@ class OrderNumberRepo {
|
|
|
78
76
|
expires: dataFeedExpires
|
|
79
77
|
});
|
|
80
78
|
let orderNumber;
|
|
81
|
-
|
|
79
|
+
const useVersioning = (validFrom instanceof Date && (0, moment_timezone_1.default)(validFrom)
|
|
82
80
|
.isSameOrBefore(params.orderDate))
|
|
83
81
|
// versioningForceProjectsであれば強制的にversioning(2026-02-05~)
|
|
84
82
|
|| versioningForceProjects.includes(projectPrefix);
|
|
85
|
-
// versioningExceptionProjectsであれば強制的にversioning不使用(2026-02-10~)
|
|
86
|
-
if (versioningExceptionProjects.includes(projectPrefix)) {
|
|
87
|
-
useVersioning = false;
|
|
88
|
-
}
|
|
89
83
|
if (typeof fpeSecret === 'string' && typeof version === 'string' && useVersioning) {
|
|
90
84
|
const transactionFactory = new transactionNumber_1.TransactionNumberFactory({ fpeSecret, version });
|
|
91
85
|
orderNumber = transactionFactory.generate(timestamp, incrReply);
|
|
@@ -138,11 +132,11 @@ class OrderNumberRepo {
|
|
|
138
132
|
.exec();
|
|
139
133
|
if (setting === null || setting.orderNumber === undefined) {
|
|
140
134
|
return {
|
|
141
|
-
versioningForceProjects: []
|
|
142
|
-
versioningExceptionProjects: []
|
|
135
|
+
versioningForceProjects: []
|
|
136
|
+
// versioningExceptionProjects: []
|
|
143
137
|
};
|
|
144
138
|
}
|
|
145
|
-
const { fpeSecret, version, validFrom, versioningForceProjects
|
|
139
|
+
const { fpeSecret, version, validFrom, versioningForceProjects } = setting.orderNumber;
|
|
146
140
|
if (typeof fpeSecret !== 'string' || fpeSecret === '') {
|
|
147
141
|
throw new factory.errors.NotFound('setting.orderNumber.secret');
|
|
148
142
|
}
|
|
@@ -155,10 +149,9 @@ class OrderNumberRepo {
|
|
|
155
149
|
return {
|
|
156
150
|
fpeSecret, version, validFrom,
|
|
157
151
|
versioningForceProjects: [
|
|
158
|
-
...(Array.isArray(versioningForceProjects)) ? versioningForceProjects : []
|
|
159
|
-
|
|
160
|
-
]
|
|
161
|
-
versioningExceptionProjects: (Array.isArray(versioningExceptionProjects)) ? versioningExceptionProjects : []
|
|
152
|
+
...(Array.isArray(versioningForceProjects)) ? versioningForceProjects : []
|
|
153
|
+
]
|
|
154
|
+
// versioningExceptionProjects: (Array.isArray(versioningExceptionProjects)) ? versioningExceptionProjects : []
|
|
162
155
|
};
|
|
163
156
|
}
|
|
164
157
|
}
|
|
@@ -2,11 +2,17 @@
|
|
|
2
2
|
* 決済取引ファクトリー
|
|
3
3
|
*/
|
|
4
4
|
import * as factory from '../../../../factory';
|
|
5
|
+
import type { IPaymentAgencyTransaction } from '../../../payment/creditCard';
|
|
6
|
+
/**
|
|
7
|
+
* 決済取引開始パラメータ生成
|
|
8
|
+
*/
|
|
5
9
|
export declare function createStartParams(params: factory.assetTransaction.pay.IStartParamsWithoutDetail & {
|
|
6
|
-
transactionNumber: string;
|
|
7
10
|
paymentServiceType: factory.service.paymentService.PaymentServiceType;
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
paymentService?: Pick<factory.service.paymentService.IService, 'availableChannel' | 'id' | 'serviceOutput' | 'serviceType'> | Pick<factory.product.IProduct, 'availableChannel' | 'id' | 'serviceOutput' | 'serviceType'> | {
|
|
12
|
+
typeOf: factory.service.paymentService.PaymentServiceType.FaceToFace;
|
|
13
|
+
id?: never;
|
|
14
|
+
serviceType?: never;
|
|
15
|
+
};
|
|
10
16
|
location?: factory.action.trade.pay.ILocation;
|
|
11
17
|
informActions: {
|
|
12
18
|
/**
|
|
@@ -20,3 +26,45 @@ export declare function createStartParams(params: factory.assetTransaction.pay.I
|
|
|
20
26
|
id: string;
|
|
21
27
|
};
|
|
22
28
|
}): factory.assetTransaction.IStartParams<factory.assetTransactionType.Pay>;
|
|
29
|
+
/**
|
|
30
|
+
* クレジットカード決済用の追加オプションを生成する
|
|
31
|
+
*/
|
|
32
|
+
export declare function createAuthorizeCreditCardOptions(options: {
|
|
33
|
+
executor?: {
|
|
34
|
+
id?: string;
|
|
35
|
+
};
|
|
36
|
+
pendingPaymentAgencyTransaction?: IPaymentAgencyTransaction;
|
|
37
|
+
}): {
|
|
38
|
+
pendingPaymentAgencyTransaction?: IPaymentAgencyTransaction | undefined;
|
|
39
|
+
executor: {
|
|
40
|
+
id: string;
|
|
41
|
+
} | {
|
|
42
|
+
id?: undefined;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* ムビチケ決済用の追加オプションを生成する
|
|
47
|
+
*/
|
|
48
|
+
export declare function createAuthorizeMovieTicketOptions(options: {
|
|
49
|
+
executor?: {
|
|
50
|
+
id?: string;
|
|
51
|
+
};
|
|
52
|
+
purpose: {
|
|
53
|
+
id?: string;
|
|
54
|
+
};
|
|
55
|
+
checkedAction: {
|
|
56
|
+
id: string;
|
|
57
|
+
};
|
|
58
|
+
}): {
|
|
59
|
+
executor: {
|
|
60
|
+
id: string;
|
|
61
|
+
} | {
|
|
62
|
+
id?: undefined;
|
|
63
|
+
};
|
|
64
|
+
purpose: {
|
|
65
|
+
id?: string;
|
|
66
|
+
};
|
|
67
|
+
checkedAction: {
|
|
68
|
+
id: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
@@ -24,11 +24,35 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.createStartParams = createStartParams;
|
|
27
|
+
exports.createAuthorizeCreditCardOptions = createAuthorizeCreditCardOptions;
|
|
28
|
+
exports.createAuthorizeMovieTicketOptions = createAuthorizeMovieTicketOptions;
|
|
27
29
|
/**
|
|
28
30
|
* 決済取引ファクトリー
|
|
29
31
|
*/
|
|
30
32
|
const factory = __importStar(require("../../../../factory"));
|
|
33
|
+
function createServiceOutputAsPayTransactionObject(params) {
|
|
34
|
+
return {
|
|
35
|
+
serviceOutput: (params.object.serviceOutput?.typeOf === 'Invoice')
|
|
36
|
+
? params.object.serviceOutput
|
|
37
|
+
: {
|
|
38
|
+
typeOf: 'Invoice',
|
|
39
|
+
referencesOrder: { typeOf: factory.order.OrderType.Order }
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 決済取引開始パラメータ生成
|
|
45
|
+
*/
|
|
31
46
|
function createStartParams(params, options) {
|
|
47
|
+
// 金額をfix
|
|
48
|
+
const amount = params.object.paymentMethod?.amount;
|
|
49
|
+
if (typeof amount !== 'number') {
|
|
50
|
+
throw new factory.errors.ArgumentNull('object.paymentMethod.amount');
|
|
51
|
+
}
|
|
52
|
+
const transactionNumber = params.transactionNumber;
|
|
53
|
+
if (typeof transactionNumber !== 'string' || transactionNumber.length === 0) {
|
|
54
|
+
throw new factory.errors.ArgumentNull('transactionNumber');
|
|
55
|
+
}
|
|
32
56
|
const { instrument } = params;
|
|
33
57
|
const paymentServiceId = (params.paymentService !== undefined)
|
|
34
58
|
? String(params.paymentService.id)
|
|
@@ -48,14 +72,14 @@ function createStartParams(params, options) {
|
|
|
48
72
|
totalPaymentDue = {
|
|
49
73
|
typeOf: 'MonetaryAmount',
|
|
50
74
|
currency: factory.priceCurrency.JPY,
|
|
51
|
-
value:
|
|
75
|
+
value: amount
|
|
52
76
|
};
|
|
53
77
|
break;
|
|
54
78
|
case factory.service.paymentService.PaymentServiceType.CreditCard:
|
|
55
79
|
totalPaymentDue = {
|
|
56
80
|
typeOf: 'MonetaryAmount',
|
|
57
81
|
currency: factory.priceCurrency.JPY,
|
|
58
|
-
value:
|
|
82
|
+
value: amount
|
|
59
83
|
};
|
|
60
84
|
accountId = ''; // 強制的に空文字化(2024-06-14~)
|
|
61
85
|
break;
|
|
@@ -109,7 +133,7 @@ function createStartParams(params, options) {
|
|
|
109
133
|
const paymentMethodAmount = {
|
|
110
134
|
typeOf: 'MonetaryAmount',
|
|
111
135
|
currency: paymentMethodCurrency,
|
|
112
|
-
value:
|
|
136
|
+
value: amount
|
|
113
137
|
};
|
|
114
138
|
const paymentMethod = {
|
|
115
139
|
additionalProperty: (Array.isArray(params.object.paymentMethod?.additionalProperty))
|
|
@@ -140,19 +164,14 @@ function createStartParams(params, options) {
|
|
|
140
164
|
? { paymentMethodId: params.transactionNumber } // 必要ないはずだが互換性維持対応(2024-06-14~)
|
|
141
165
|
: undefined
|
|
142
166
|
};
|
|
167
|
+
const { serviceOutput } = createServiceOutputAsPayTransactionObject(params);
|
|
143
168
|
const object = {
|
|
144
169
|
accountId: (typeof accountId === 'string') ? accountId : '',
|
|
145
170
|
paymentMethodId: params.transactionNumber,
|
|
146
171
|
typeOf: params.paymentServiceType,
|
|
147
172
|
id: paymentServiceId,
|
|
148
|
-
// onPaymentStatusChanged: { informPayment: params.informActions }, // discontinue(2025-02-09~)
|
|
149
173
|
paymentMethod,
|
|
150
|
-
serviceOutput
|
|
151
|
-
? params.object.serviceOutput
|
|
152
|
-
: {
|
|
153
|
-
typeOf: 'Invoice',
|
|
154
|
-
referencesOrder: { typeOf: factory.order.OrderType.Order }
|
|
155
|
-
},
|
|
174
|
+
serviceOutput, // support serviceOutput(2025-11-24~)
|
|
156
175
|
...(params.paymentServiceType === factory.service.paymentService.PaymentServiceType.MovieTicket)
|
|
157
176
|
? { checkedAction: { id: options.checkedAction.id } } // add checkedAction(2024-12-13~)
|
|
158
177
|
: undefined
|
|
@@ -178,14 +197,32 @@ function createStartParams(params, options) {
|
|
|
178
197
|
...(potentialAction.length > 0) ? { potentialAction } : undefined // add potentialAction(2025-02-05~)
|
|
179
198
|
};
|
|
180
199
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
//
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
200
|
+
/**
|
|
201
|
+
* 決済プロセッサに渡す実行者情報を生成する
|
|
202
|
+
*/
|
|
203
|
+
function createExecutor(options) {
|
|
204
|
+
return (typeof options.executor?.id === 'string')
|
|
205
|
+
? { id: options.executor.id }
|
|
206
|
+
: {}; // タスク関連付け(2024-05-18~)
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* クレジットカード決済用の追加オプションを生成する
|
|
210
|
+
*/
|
|
211
|
+
function createAuthorizeCreditCardOptions(options) {
|
|
212
|
+
return {
|
|
213
|
+
executor: createExecutor(options),
|
|
214
|
+
...(options.pendingPaymentAgencyTransaction !== undefined
|
|
215
|
+
? { pendingPaymentAgencyTransaction: options.pendingPaymentAgencyTransaction }
|
|
216
|
+
: {})
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* ムビチケ決済用の追加オプションを生成する
|
|
221
|
+
*/
|
|
222
|
+
function createAuthorizeMovieTicketOptions(options) {
|
|
223
|
+
return {
|
|
224
|
+
executor: createExecutor(options),
|
|
225
|
+
purpose: options.purpose,
|
|
226
|
+
checkedAction: options.checkedAction
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as factory from '../../../../../factory';
|
|
2
|
+
import type { PaymentServiceRepo } from '../../../../../repo/paymentService';
|
|
3
|
+
import type { ProductRepo } from '../../../../../repo/product';
|
|
4
|
+
export declare function fixPaymentService(params: factory.assetTransaction.pay.IStartParamsWithoutDetail): (repos: {
|
|
5
|
+
paymentService: PaymentServiceRepo;
|
|
6
|
+
product: ProductRepo;
|
|
7
|
+
}) => Promise<{
|
|
8
|
+
paymentServiceType: factory.service.paymentService.PaymentServiceType;
|
|
9
|
+
paymentService?: Pick<factory.product.IProduct, "availableChannel" | "id" | "serviceOutput" | "serviceType" | "potentialAction"> | Pick<factory.service.paymentService.IService, "availableChannel" | "id" | "serviceOutput" | "serviceType" | "potentialAction"> | undefined;
|
|
10
|
+
}>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.fixPaymentService = fixPaymentService;
|
|
27
|
+
const factory = __importStar(require("../../../../../factory"));
|
|
28
|
+
function getPaymentServiceId(params) {
|
|
29
|
+
let paymentServiceId = '';
|
|
30
|
+
const paymentServiceType = params.object?.typeOf;
|
|
31
|
+
if (typeof params.object.id === 'string' && params.object.id.length > 0) {
|
|
32
|
+
paymentServiceId = params.object.id;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
switch (paymentServiceType) {
|
|
36
|
+
case factory.service.paymentService.PaymentServiceType.FaceToFace:
|
|
37
|
+
// 対面決済は特に何もしない
|
|
38
|
+
break;
|
|
39
|
+
case factory.service.paymentService.PaymentServiceType.PaymentCard:
|
|
40
|
+
case factory.service.paymentService.PaymentServiceType.CreditCard:
|
|
41
|
+
case factory.service.paymentService.PaymentServiceType.MovieTicket:
|
|
42
|
+
// リクエストでの指定を必須化(2022-04-12~)
|
|
43
|
+
throw new factory.errors.ArgumentNull('object.id');
|
|
44
|
+
default:
|
|
45
|
+
throw new factory.errors.NotImplemented(`Payment service '${paymentServiceType}' not implemented`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return paymentServiceId;
|
|
49
|
+
}
|
|
50
|
+
function fixPaymentService(params) {
|
|
51
|
+
return async (repos) => {
|
|
52
|
+
const paymentServiceType = params.object?.typeOf;
|
|
53
|
+
let paymentService;
|
|
54
|
+
switch (paymentServiceType) {
|
|
55
|
+
case factory.service.paymentService.PaymentServiceType.FaceToFace:
|
|
56
|
+
// no op
|
|
57
|
+
// FaceToFaceの場合プロダクトは存在しない
|
|
58
|
+
break;
|
|
59
|
+
// PaymentCardの場合、プロダクト検索
|
|
60
|
+
case factory.service.paymentService.PaymentServiceType.PaymentCard:
|
|
61
|
+
paymentService = (await repos.product.projectFields({
|
|
62
|
+
limit: 1,
|
|
63
|
+
page: 1,
|
|
64
|
+
project: { id: { $eq: params.project.id } },
|
|
65
|
+
typeOf: { $eq: factory.product.ProductType.PaymentCard },
|
|
66
|
+
id: { $eq: getPaymentServiceId(params) }
|
|
67
|
+
}, ['availableChannel', 'serviceOutput', 'serviceType', 'potentialAction']
|
|
68
|
+
// []
|
|
69
|
+
)).shift();
|
|
70
|
+
if (paymentService === undefined) {
|
|
71
|
+
throw new factory.errors.NotFound('PaymentService');
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
default:
|
|
75
|
+
paymentService = (await repos.paymentService.projectFields({
|
|
76
|
+
limit: 1,
|
|
77
|
+
page: 1,
|
|
78
|
+
project: { id: { $eq: params.project.id } },
|
|
79
|
+
typeOf: { $eq: paymentServiceType },
|
|
80
|
+
id: { $eq: getPaymentServiceId(params) }
|
|
81
|
+
}, ['availableChannel', 'serviceOutput', 'serviceType', 'potentialAction'])).shift();
|
|
82
|
+
if (paymentService === undefined) {
|
|
83
|
+
throw new factory.errors.NotFound('PaymentService');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { paymentServiceType, paymentService };
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as factory from '../../../../factory';
|
|
2
|
+
import { Settings } from '../../../../settings';
|
|
3
|
+
import type { AccountingReportRepo } from '../../../../repo/accountingReport';
|
|
4
|
+
import type { ActionRepo } from '../../../../repo/action';
|
|
5
|
+
import type { AssetTransactionRepo } from '../../../../repo/assetTransaction';
|
|
6
|
+
import type { CredentialsRepo } from '../../../../repo/credentials';
|
|
7
|
+
import type { EventRepo } from '../../../../repo/event';
|
|
8
|
+
import type { PaymentServiceRepo } from '../../../../repo/paymentService';
|
|
9
|
+
import type { PaymentServiceProviderRepo } from '../../../../repo/paymentServiceProvider';
|
|
10
|
+
import type { ProductRepo } from '../../../../repo/product';
|
|
11
|
+
import type { SellerPaymentAcceptedRepo } from '../../../../repo/sellerPaymentAccepted';
|
|
12
|
+
import type { TaskRepo } from '../../../../repo/task';
|
|
13
|
+
import { IPaymentAgencyTransaction } from '../../../payment/creditCard';
|
|
14
|
+
export interface IProcessAuthorizeOperationRepos {
|
|
15
|
+
accountingReport: AccountingReportRepo;
|
|
16
|
+
action: ActionRepo;
|
|
17
|
+
credentials: CredentialsRepo;
|
|
18
|
+
event: EventRepo;
|
|
19
|
+
paymentAccepted: SellerPaymentAcceptedRepo;
|
|
20
|
+
paymentService: PaymentServiceRepo;
|
|
21
|
+
paymentServiceProvider: PaymentServiceProviderRepo;
|
|
22
|
+
product: ProductRepo;
|
|
23
|
+
assetTransaction: AssetTransactionRepo;
|
|
24
|
+
task: TaskRepo;
|
|
25
|
+
}
|
|
26
|
+
export type IProcessAuthorizeOperation<T> = (repos: IProcessAuthorizeOperationRepos, settings: Settings) => Promise<T>;
|
|
27
|
+
/**
|
|
28
|
+
* 開始した決済取引について、決済承認を実行する
|
|
29
|
+
*/
|
|
30
|
+
export declare function processAuthorize(params: factory.assetTransaction.pay.IStartParamsWithoutDetail & {
|
|
31
|
+
instrument: factory.action.trade.pay.IPlaceOrderRelatedInstrument[];
|
|
32
|
+
}, options: {
|
|
33
|
+
pendingPaymentAgencyTransaction?: IPaymentAgencyTransaction;
|
|
34
|
+
/**
|
|
35
|
+
* 実行者
|
|
36
|
+
*/
|
|
37
|
+
executor?: {
|
|
38
|
+
/**
|
|
39
|
+
* task ID
|
|
40
|
+
* taskによって実行されている場合値が存在する
|
|
41
|
+
*/
|
|
42
|
+
id?: string;
|
|
43
|
+
};
|
|
44
|
+
purpose: {
|
|
45
|
+
/**
|
|
46
|
+
* placeOrder ID
|
|
47
|
+
*/
|
|
48
|
+
id?: string;
|
|
49
|
+
};
|
|
50
|
+
checkedAction: {
|
|
51
|
+
id: string;
|
|
52
|
+
};
|
|
53
|
+
}, transactionBeforeAuthorize: factory.assetTransaction.pay.ITransaction, paymentServiceType: factory.service.paymentService.PaymentServiceType, paymentService: Pick<factory.product.IProduct, 'availableChannel' | 'id' | 'serviceOutput' | 'serviceType' | 'potentialAction'> | Pick<factory.service.paymentService.IService, 'availableChannel' | 'id' | 'serviceOutput' | 'serviceType' | 'potentialAction'> | undefined): IProcessAuthorizeOperation<Pick<factory.assetTransaction.pay.ITransaction, 'id' | 'object'>>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.processAuthorize = processAuthorize;
|
|
27
|
+
const factory = __importStar(require("../../../../factory"));
|
|
28
|
+
const factory_1 = require("./factory");
|
|
29
|
+
const processAuthorizeAccount_1 = require("./processAuthorizeAccount");
|
|
30
|
+
const processAuthorizeCreditCard_1 = require("./processAuthorizeCreditCard");
|
|
31
|
+
const processAuthorizeMovieTicket_1 = require("./processAuthorizeMovieTicket");
|
|
32
|
+
/**
|
|
33
|
+
* 開始した決済取引について、決済承認を実行する
|
|
34
|
+
*/
|
|
35
|
+
function processAuthorize(params, options, transactionBeforeAuthorize, paymentServiceType, paymentService) {
|
|
36
|
+
return async (repos, settings) => {
|
|
37
|
+
let transaction = transactionBeforeAuthorize;
|
|
38
|
+
switch (paymentServiceType) {
|
|
39
|
+
case factory.service.paymentService.PaymentServiceType.FaceToFace:
|
|
40
|
+
// 対面決済は特に何もしない
|
|
41
|
+
break;
|
|
42
|
+
case factory.service.paymentService.PaymentServiceType.PaymentCard:
|
|
43
|
+
transaction = await (0, processAuthorizeAccount_1.processAuthorizeAccount)(params, transactionBeforeAuthorize, String(paymentService?.id))(repos);
|
|
44
|
+
break;
|
|
45
|
+
case factory.service.paymentService.PaymentServiceType.CreditCard:
|
|
46
|
+
await (0, processAuthorizeCreditCard_1.processAuthorizeCreditCard)(params, transactionBeforeAuthorize, String(paymentService?.id), (0, factory_1.createAuthorizeCreditCardOptions)(options))(repos, settings);
|
|
47
|
+
break;
|
|
48
|
+
case factory.service.paymentService.PaymentServiceType.MovieTicket:
|
|
49
|
+
await (0, processAuthorizeMovieTicket_1.processAuthorizeMovieTicket)(params, transactionBeforeAuthorize, String(paymentService?.id), (0, factory_1.createAuthorizeMovieTicketOptions)(options))(repos, settings);
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
throw new factory.errors.NotImplemented(`Payment service '${paymentServiceType}' not implemented`);
|
|
53
|
+
}
|
|
54
|
+
return transaction;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -39,4 +39,4 @@ export declare function processAuthorizeMovieTicket(params: factory.assetTransac
|
|
|
39
39
|
paymentServiceProvider: PaymentServiceProviderRepo;
|
|
40
40
|
assetTransaction: AssetTransactionRepo;
|
|
41
41
|
task: TaskRepo;
|
|
42
|
-
}, settings: Settings) => Promise<
|
|
42
|
+
}, settings: Settings) => Promise<void>;
|
|
@@ -29,17 +29,7 @@ function processAuthorizeMovieTicket(params, transaction, paymentServiceId,
|
|
|
29
29
|
// useCheckByIdentifierIfNotYet: boolean,
|
|
30
30
|
options) {
|
|
31
31
|
return async (repos, settings) => {
|
|
32
|
-
// const { accountsReceivablesByServiceType } = await MovieTicketPayment.authorize(
|
|
33
|
-
// params, transaction, paymentServiceId, options
|
|
34
|
-
// )(repos, settings);
|
|
35
32
|
await MovieTicketPayment.authorize(params, transaction, paymentServiceId, options)(repos, settings);
|
|
36
|
-
return transaction;
|
|
37
|
-
// discontinue(2024-12-17~)
|
|
38
|
-
// return saveAuthorizeResult({
|
|
39
|
-
// id: transaction.id,
|
|
40
|
-
// update: {
|
|
41
|
-
// 'object.accountsReceivablesByServiceType': accountsReceivablesByServiceType // 認証レスポンスより計上金額を保管(2023-05-15~)
|
|
42
|
-
// }
|
|
43
|
-
// })(repos);
|
|
33
|
+
// return transaction;
|
|
44
34
|
};
|
|
45
35
|
}
|
|
@@ -1,162 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
3
|
exports.start = start;
|
|
27
|
-
const factory = __importStar(require("../../../factory"));
|
|
28
4
|
const fixInformAction_1 = require("../fixInformAction");
|
|
5
|
+
const fixPaymentService_1 = require("./start/preStart/fixPaymentService");
|
|
29
6
|
const validateAcceptedPaymentMethodIfNeeded_1 = require("./start/preStart/validateAcceptedPaymentMethodIfNeeded");
|
|
30
7
|
const validateSeller_1 = require("./start/preStart/validateSeller");
|
|
31
8
|
const factory_1 = require("./start/factory");
|
|
32
|
-
const
|
|
33
|
-
const processAuthorizeCreditCard_1 = require("./start/processAuthorizeCreditCard");
|
|
34
|
-
const processAuthorizeMovieTicket_1 = require("./start/processAuthorizeMovieTicket");
|
|
9
|
+
const processAuthorize_1 = require("./start/processAuthorize");
|
|
35
10
|
/**
|
|
36
11
|
* 取引開始
|
|
37
12
|
*/
|
|
38
13
|
function start(params, options) {
|
|
39
14
|
return async (repos, settings) => {
|
|
40
|
-
// 金額をfix
|
|
41
|
-
const amount = params.object.paymentMethod?.amount;
|
|
42
|
-
if (typeof amount !== 'number') {
|
|
43
|
-
throw new factory.errors.ArgumentNull('object.paymentMethod.amount');
|
|
44
|
-
}
|
|
45
|
-
const transactionNumber = params.transactionNumber;
|
|
46
|
-
if (typeof transactionNumber !== 'string' || transactionNumber.length === 0) {
|
|
47
|
-
throw new factory.errors.ArgumentNull('transactionNumber');
|
|
48
|
-
}
|
|
49
15
|
await (0, validateSeller_1.validateSeller)(params)(repos);
|
|
50
16
|
// リソースの対応決済方法検証(2025-12-02~)
|
|
51
17
|
await (0, validateAcceptedPaymentMethodIfNeeded_1.validateAcceptedPaymentMethodIfNeeded)(params)(repos);
|
|
52
18
|
// 決済サービス確認
|
|
53
|
-
const paymentServiceType = params
|
|
54
|
-
const paymentService = await fixPaymentService(params)(repos);
|
|
19
|
+
const { paymentServiceType, paymentService } = await (0, fixPaymentService_1.fixPaymentService)(params)(repos);
|
|
55
20
|
const informActions = await (0, fixInformAction_1.fixInformAction)({
|
|
56
21
|
paymentService,
|
|
57
22
|
project: { id: params.project.id }
|
|
58
23
|
})(repos);
|
|
59
24
|
// 取引開始
|
|
60
|
-
let transaction;
|
|
61
25
|
const startParams = (0, factory_1.createStartParams)({
|
|
62
26
|
...params,
|
|
63
|
-
transactionNumber,
|
|
27
|
+
// transactionNumber,
|
|
64
28
|
paymentServiceType,
|
|
65
|
-
amount,
|
|
29
|
+
// amount,
|
|
66
30
|
paymentService,
|
|
67
31
|
informActions
|
|
68
32
|
}, { checkedAction: options.checkedAction } // 連携(2024-12-13~)
|
|
69
33
|
);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// 対面決済は特に何もしない
|
|
74
|
-
break;
|
|
75
|
-
case factory.service.paymentService.PaymentServiceType.PaymentCard:
|
|
76
|
-
transaction = await (0, processAuthorizeAccount_1.processAuthorizeAccount)(params, transaction, String(paymentService?.id))(repos);
|
|
77
|
-
break;
|
|
78
|
-
case factory.service.paymentService.PaymentServiceType.CreditCard:
|
|
79
|
-
// transaction =
|
|
80
|
-
await (0, processAuthorizeCreditCard_1.processAuthorizeCreditCard)(params, transaction, String(paymentService?.id), {
|
|
81
|
-
executor: (typeof options.executor?.id === 'string') ? { id: options.executor.id } : {}, // タスク関連付け(2024-05-18~)
|
|
82
|
-
...(options.pendingPaymentAgencyTransaction !== undefined)
|
|
83
|
-
? { pendingPaymentAgencyTransaction: options.pendingPaymentAgencyTransaction }
|
|
84
|
-
: undefined
|
|
85
|
-
})(repos, settings);
|
|
86
|
-
break;
|
|
87
|
-
case factory.service.paymentService.PaymentServiceType.MovieTicket:
|
|
88
|
-
transaction = await (0, processAuthorizeMovieTicket_1.processAuthorizeMovieTicket)(params, transaction, String(paymentService?.id),
|
|
89
|
-
// options.useCheckByIdentifierIfNotYet,
|
|
90
|
-
{
|
|
91
|
-
executor: (typeof options.executor?.id === 'string') ? { id: options.executor.id } : {},
|
|
92
|
-
purpose: options.purpose,
|
|
93
|
-
checkedAction: options.checkedAction
|
|
94
|
-
})(repos, settings);
|
|
95
|
-
break;
|
|
96
|
-
default:
|
|
97
|
-
throw new factory.errors.NotImplemented(`Payment service '${paymentServiceType}' not implemented`);
|
|
98
|
-
}
|
|
99
|
-
return transaction;
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function getPaymentServiceId(params) {
|
|
103
|
-
let paymentServiceId = '';
|
|
104
|
-
const paymentServiceType = params.object?.typeOf;
|
|
105
|
-
if (typeof params.object.id === 'string' && params.object.id.length > 0) {
|
|
106
|
-
paymentServiceId = params.object.id;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
switch (paymentServiceType) {
|
|
110
|
-
case factory.service.paymentService.PaymentServiceType.FaceToFace:
|
|
111
|
-
// 対面決済は特に何もしない
|
|
112
|
-
break;
|
|
113
|
-
case factory.service.paymentService.PaymentServiceType.PaymentCard:
|
|
114
|
-
case factory.service.paymentService.PaymentServiceType.CreditCard:
|
|
115
|
-
case factory.service.paymentService.PaymentServiceType.MovieTicket:
|
|
116
|
-
// リクエストでの指定を必須化(2022-04-12~)
|
|
117
|
-
throw new factory.errors.ArgumentNull('object.id');
|
|
118
|
-
default:
|
|
119
|
-
throw new factory.errors.NotImplemented(`Payment service '${paymentServiceType}' not implemented`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return paymentServiceId;
|
|
123
|
-
}
|
|
124
|
-
function fixPaymentService(params) {
|
|
125
|
-
return async (repos) => {
|
|
126
|
-
const paymentServiceType = params.object?.typeOf;
|
|
127
|
-
let paymentService;
|
|
128
|
-
switch (paymentServiceType) {
|
|
129
|
-
case factory.service.paymentService.PaymentServiceType.FaceToFace:
|
|
130
|
-
// no op
|
|
131
|
-
// FaceToFaceの場合プロダクトは存在しない
|
|
132
|
-
break;
|
|
133
|
-
// PaymentCardの場合、プロダクト検索
|
|
134
|
-
case factory.service.paymentService.PaymentServiceType.PaymentCard:
|
|
135
|
-
paymentService = (await repos.product.projectFields({
|
|
136
|
-
limit: 1,
|
|
137
|
-
page: 1,
|
|
138
|
-
project: { id: { $eq: params.project.id } },
|
|
139
|
-
typeOf: { $eq: factory.product.ProductType.PaymentCard },
|
|
140
|
-
id: { $eq: getPaymentServiceId(params) }
|
|
141
|
-
}, ['availableChannel', 'serviceOutput', 'serviceType', 'potentialAction']
|
|
142
|
-
// []
|
|
143
|
-
)).shift();
|
|
144
|
-
if (paymentService === undefined) {
|
|
145
|
-
throw new factory.errors.NotFound('PaymentService');
|
|
146
|
-
}
|
|
147
|
-
break;
|
|
148
|
-
default:
|
|
149
|
-
paymentService = (await repos.paymentService.projectFields({
|
|
150
|
-
limit: 1,
|
|
151
|
-
page: 1,
|
|
152
|
-
project: { id: { $eq: params.project.id } },
|
|
153
|
-
typeOf: { $eq: paymentServiceType },
|
|
154
|
-
id: { $eq: getPaymentServiceId(params) }
|
|
155
|
-
}, ['availableChannel', 'serviceOutput', 'serviceType', 'potentialAction'])).shift();
|
|
156
|
-
if (paymentService === undefined) {
|
|
157
|
-
throw new factory.errors.NotFound('PaymentService');
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return paymentService;
|
|
34
|
+
const transactionBeforeAuthorize = await repos.assetTransaction.start(startParams);
|
|
35
|
+
// 決済代行等を利用して決済承認
|
|
36
|
+
return (0, processAuthorize_1.processAuthorize)(params, options, transactionBeforeAuthorize, paymentServiceType, paymentService)(repos, settings);
|
|
161
37
|
};
|
|
162
38
|
}
|
package/package.json
CHANGED