@chevre/domain 24.0.0-alpha.32 → 24.0.0-alpha.33
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/factory/transaction.d.ts +0 -3
- package/lib/chevre/repo/action/actionProcess.d.ts +1 -1
- package/lib/chevre/repo/action.d.ts +1 -1
- package/lib/chevre/repo/mongoose/schemas/transaction.d.ts +1 -2
- package/lib/chevre/repo/passport.d.ts +1 -1
- package/lib/chevre/repo/task.d.ts +1 -1
- package/lib/chevre/repo/transaction.d.ts +1 -39
- package/lib/chevre/repository.d.ts +0 -10
- package/lib/chevre/repository.js +0 -22
- package/lib/chevre/service/delivery/factory.js +4 -4
- package/lib/chevre/service/offer/any.d.ts +1 -1
- package/lib/chevre/service/offer.d.ts +1 -2
- package/lib/chevre/service/offer.js +1 -3
- package/lib/chevre/service/order/onOrderStatusChanged/onOrderCancelled/factory.d.ts +1 -1
- package/lib/chevre/service/order/onOrderStatusChanged/onOrderDeliveredPartially/factory.d.ts +1 -1
- package/lib/chevre/service/order/onOrderStatusChanged/onOrderProcessing/processOrder.js +54 -36
- package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned/factory.d.ts +1 -1
- package/lib/chevre/service/order/onOrderStatusChanged/onOrderReturned.js +78 -64
- package/lib/chevre/service/order/placeOrder/factory/orderedItem.d.ts +0 -1
- package/lib/chevre/service/order/placeOrder/factory/orderedItem.js +3 -8
- package/lib/chevre/service/order/placeOrder/factory.js +5 -5
- package/lib/chevre/service/task/deletePerson.js +0 -1
- package/lib/chevre/service/task/deleteTransaction.js +0 -2
- package/lib/chevre/service/transaction/deleteTransaction.d.ts +0 -2
- package/lib/chevre/service/transaction/deleteTransaction.js +2 -47
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/factory.d.ts +0 -1
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validatePrice.d.ts +2 -2
- package/lib/chevre/service/transaction/placeOrder/confirm/validation/validatePrice.js +2 -3
- package/lib/chevre/service/transaction/placeOrder/confirm/validation.d.ts +3 -3
- package/lib/chevre/service/transaction/placeOrder/confirm/validation.js +2 -2
- package/lib/chevre/service/transaction/placeOrder/confirm.js +12 -17
- package/lib/chevre/service/transaction/placeOrder/exportTasks/factory.js +1 -15
- package/lib/chevre/service/transaction.d.ts +0 -4
- package/lib/chevre/service/transaction.js +1 -11
- package/lib/chevre/service/validation/validateOrder.js +2 -2
- package/package.json +3 -3
- package/lib/chevre/repo/action/authorizeMoneyTransferOffer.d.ts +0 -40
- package/lib/chevre/repo/action/authorizeMoneyTransferOffer.js +0 -61
- package/lib/chevre/repo/transaction/moneyTransfer.d.ts +0 -61
- package/lib/chevre/repo/transaction/moneyTransfer.js +0 -379
- package/lib/chevre/service/offer/moneyTransfer/authorize.d.ts +0 -38
- package/lib/chevre/service/offer/moneyTransfer/authorize.js +0 -250
- package/lib/chevre/service/offer/moneyTransfer/returnMoneyTransfer.d.ts +0 -16
- package/lib/chevre/service/offer/moneyTransfer/returnMoneyTransfer.js +0 -96
- package/lib/chevre/service/offer/moneyTransfer/settleTransaction.d.ts +0 -9
- package/lib/chevre/service/offer/moneyTransfer/settleTransaction.js +0 -91
- package/lib/chevre/service/offer/moneyTransfer/voidTransaction.d.ts +0 -10
- package/lib/chevre/service/offer/moneyTransfer/voidTransaction.js +0 -81
- package/lib/chevre/service/offer/moneyTransfer.d.ts +0 -5
- package/lib/chevre/service/offer/moneyTransfer.js +0 -11
- package/lib/chevre/service/task/confirmMoneyTransfer.d.ts +0 -6
- package/lib/chevre/service/task/confirmMoneyTransfer.js +0 -19
- package/lib/chevre/service/task/returnMoneyTransfer.d.ts +0 -6
- package/lib/chevre/service/task/returnMoneyTransfer.js +0 -55
- package/lib/chevre/service/task/voidMoneyTransferTransaction.d.ts +0 -6
- package/lib/chevre/service/task/voidMoneyTransferTransaction.js +0 -27
- package/lib/chevre/service/transaction/moneyTransfer/exportTasks/factory.d.ts +0 -9
- package/lib/chevre/service/transaction/moneyTransfer/exportTasks/factory.js +0 -138
- package/lib/chevre/service/transaction/moneyTransfer/factory.d.ts +0 -2
- package/lib/chevre/service/transaction/moneyTransfer/factory.js +0 -55
- package/lib/chevre/service/transaction/moneyTransfer/potentialActions.d.ts +0 -9
- package/lib/chevre/service/transaction/moneyTransfer/potentialActions.js +0 -65
- package/lib/chevre/service/transaction/moneyTransfer.d.ts +0 -72
- package/lib/chevre/service/transaction/moneyTransfer.js +0 -649
|
@@ -1,649 +0,0 @@
|
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.start = start;
|
|
30
|
-
exports.confirm = confirm;
|
|
31
|
-
exports.exportTasksById = exportTasksById;
|
|
32
|
-
/**
|
|
33
|
-
* 通貨転送取引サービス
|
|
34
|
-
*/
|
|
35
|
-
const moment_1 = __importDefault(require("moment"));
|
|
36
|
-
const factory = __importStar(require("../../factory"));
|
|
37
|
-
const order_1 = require("../../factory/order");
|
|
38
|
-
// import { Settings } from '../../settings';
|
|
39
|
-
const factory_1 = require("./moneyTransfer/exportTasks/factory");
|
|
40
|
-
const factory_2 = require("./moneyTransfer/factory");
|
|
41
|
-
const potentialActions_1 = require("./moneyTransfer/potentialActions");
|
|
42
|
-
const MoneyTransferAssetTransactionService = __importStar(require("../assetTransaction/moneyTransfer"));
|
|
43
|
-
/**
|
|
44
|
-
* 取引開始
|
|
45
|
-
* 通貨転送資産取引サービスを利用して転送取引を開始する
|
|
46
|
-
*/
|
|
47
|
-
function start(params) {
|
|
48
|
-
return async (repos
|
|
49
|
-
// credentials: {
|
|
50
|
-
// jwt: JWTCredentials;
|
|
51
|
-
// }
|
|
52
|
-
) => {
|
|
53
|
-
const { passport } = await repos.passport.validatePassportTokenIfExist(params);
|
|
54
|
-
const sellers = await repos.seller.projectFields({
|
|
55
|
-
limit: 1,
|
|
56
|
-
page: 1,
|
|
57
|
-
id: { $eq: params.seller.id }
|
|
58
|
-
}, ['name', 'typeOf']);
|
|
59
|
-
const seller = sellers.shift();
|
|
60
|
-
if (seller === undefined) {
|
|
61
|
-
throw new factory.errors.NotFound(factory.organizationType.Corporation);
|
|
62
|
-
}
|
|
63
|
-
// 金額をfix
|
|
64
|
-
const amount = params.object.amount;
|
|
65
|
-
if (typeof amount.value !== 'number') {
|
|
66
|
-
throw new factory.errors.ArgumentNull('amount.value');
|
|
67
|
-
}
|
|
68
|
-
// fromとtoをfix
|
|
69
|
-
const fromLocation = await fixFromLocation(params)(repos);
|
|
70
|
-
const toLocation = await fixToLocation(params)(repos);
|
|
71
|
-
// まず取引番号発行
|
|
72
|
-
const { transactionNumber } = await repos.transactionNumber.publishByTimestamp({ startDate: new Date() });
|
|
73
|
-
// 取引開始
|
|
74
|
-
const startParams = (0, factory_2.createStartParams)(params, passport, seller, amount, fromLocation, toLocation, transactionNumber);
|
|
75
|
-
const transaction = await repos.moneyTransfer.startMoneyTransfer(startParams);
|
|
76
|
-
await authorizePaymentCard({
|
|
77
|
-
transaction: {
|
|
78
|
-
...transaction,
|
|
79
|
-
object: startParams.object,
|
|
80
|
-
seller: startParams.seller,
|
|
81
|
-
agent: startParams.agent,
|
|
82
|
-
project: startParams.project,
|
|
83
|
-
typeOf: startParams.typeOf
|
|
84
|
-
}
|
|
85
|
-
})(repos);
|
|
86
|
-
return transaction;
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
function authorizePaymentCard(params) {
|
|
90
|
-
return async (repos
|
|
91
|
-
// credentials: {
|
|
92
|
-
// jwt: JWTCredentials;
|
|
93
|
-
// }
|
|
94
|
-
) => {
|
|
95
|
-
const transaction = params.transaction;
|
|
96
|
-
const fromLocation = transaction.object.fromLocation;
|
|
97
|
-
if (typeof transaction.object.toLocation.typeOf === 'string') {
|
|
98
|
-
const toLocation = transaction.object.toLocation;
|
|
99
|
-
// 転送取引
|
|
100
|
-
await processAuthorizePaymentCard({
|
|
101
|
-
project: { id: transaction.project.id },
|
|
102
|
-
agent: { id: transaction.agent.id },
|
|
103
|
-
object: {
|
|
104
|
-
project: { typeOf: transaction.project.typeOf, id: transaction.project.id },
|
|
105
|
-
typeOf: factory.offerType.AggregateOffer,
|
|
106
|
-
itemOffered: {
|
|
107
|
-
typeOf: factory.actionType.MoneyTransfer,
|
|
108
|
-
amount: {
|
|
109
|
-
typeOf: 'MonetaryAmount',
|
|
110
|
-
currency: transaction.object.amount.currency,
|
|
111
|
-
...(typeof transaction.object.amount.value === 'number')
|
|
112
|
-
? { value: transaction.object.amount.value }
|
|
113
|
-
: undefined
|
|
114
|
-
},
|
|
115
|
-
toLocation: toLocation,
|
|
116
|
-
object: {
|
|
117
|
-
pendingTransaction: {
|
|
118
|
-
typeOf: factory.assetTransactionType.MoneyTransfer,
|
|
119
|
-
// processAuthorizePaymentCard処理内で上書きされるので空でok
|
|
120
|
-
transactionNumber: ''
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
fromLocation: fromLocation,
|
|
125
|
-
seller: {
|
|
126
|
-
id: transaction.seller.id,
|
|
127
|
-
typeOf: transaction.seller.typeOf,
|
|
128
|
-
name: (typeof transaction.seller.name === 'string')
|
|
129
|
-
? transaction.seller.name
|
|
130
|
-
: String(transaction.seller.name?.ja)
|
|
131
|
-
},
|
|
132
|
-
price: 0,
|
|
133
|
-
priceCurrency: factory.priceCurrency.JPY,
|
|
134
|
-
...(typeof transaction.object.description === 'string') ? { description: transaction.object.description } : undefined
|
|
135
|
-
},
|
|
136
|
-
purpose: { typeOf: transaction.typeOf, id: transaction.id }
|
|
137
|
-
})(repos);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
throw new factory.errors.NotImplemented('Withdraw transaction not implemented');
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
function fixFromLocation(params) {
|
|
145
|
-
return async (__) => {
|
|
146
|
-
let fromLocation = params.object.fromLocation;
|
|
147
|
-
if (typeof fromLocation === 'string') {
|
|
148
|
-
// no op
|
|
149
|
-
}
|
|
150
|
-
else if (fromLocation.typeOf === factory.permit.PermitType.Permit) {
|
|
151
|
-
fromLocation = {
|
|
152
|
-
typeOf: factory.permit.PermitType.Permit,
|
|
153
|
-
identifier: fromLocation.identifier,
|
|
154
|
-
// ↓chevre/api側での制御に変更したので不要(2022-03-24~)
|
|
155
|
-
// ↓指定しないとPermitのチェックが実行される(注文口座にはPermitが存在しない)
|
|
156
|
-
// hasNoPermit: fromLocation.hasNoPermit,
|
|
157
|
-
issuedThrough: { id: fromLocation.issuedThrough?.id }
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
else if (fromLocation.typeOf === factory.order.OrderType.Order) {
|
|
161
|
-
// 注文口座対応
|
|
162
|
-
fromLocation = {
|
|
163
|
-
typeOf: factory.order.OrderType.Order,
|
|
164
|
-
confirmationNumber: fromLocation.confirmationNumber,
|
|
165
|
-
orderNumber: fromLocation.orderNumber
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
throw new factory.errors.Argument('fromLocation', 'location type must be specified');
|
|
170
|
-
}
|
|
171
|
-
return fromLocation;
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
function fixToLocation(params) {
|
|
175
|
-
return async (__) => {
|
|
176
|
-
let toLocation = params.object.toLocation;
|
|
177
|
-
if (typeof toLocation.typeOf === 'string') {
|
|
178
|
-
toLocation = {
|
|
179
|
-
typeOf: factory.permit.PermitType.Permit,
|
|
180
|
-
identifier: toLocation.identifier,
|
|
181
|
-
issuedThrough: { id: toLocation.issuedThrough?.id }
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
// toLocation = {
|
|
186
|
-
// ...toLocation
|
|
187
|
-
// // typeOf: toLocation.typeOf,
|
|
188
|
-
// // id: (typeof toLocation.id === 'string') ? toLocation.id : '',
|
|
189
|
-
// // name: (typeof toLocation.name === 'string') ? toLocation.name : ''
|
|
190
|
-
// };
|
|
191
|
-
}
|
|
192
|
-
return toLocation;
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* 口座残高差し押さえ
|
|
197
|
-
* 口座取引は、出金取引あるいは転送取引のどちらかを選択できます
|
|
198
|
-
*/
|
|
199
|
-
function processAuthorizePaymentCard(params) {
|
|
200
|
-
return async (repos
|
|
201
|
-
// credentials: {
|
|
202
|
-
// jwt: JWTCredentials;
|
|
203
|
-
// }
|
|
204
|
-
) => {
|
|
205
|
-
const transaction = await repos.moneyTransfer.findMoneyTransferInProgressById({
|
|
206
|
-
typeOf: factory.transactionType.MoneyTransfer,
|
|
207
|
-
id: params.purpose.id
|
|
208
|
-
}, ['agent', 'project', 'recipient', 'seller', 'typeOf', 'object']);
|
|
209
|
-
const recipient = {
|
|
210
|
-
typeOf: transaction.recipient.typeOf,
|
|
211
|
-
id: transaction.recipient.id,
|
|
212
|
-
name: (typeof transaction.recipient.name === 'string')
|
|
213
|
-
? transaction.recipient.name
|
|
214
|
-
: `A recipient of ${transaction.typeOf} Transaction ${transaction.id}`
|
|
215
|
-
};
|
|
216
|
-
const transactionNumber = transaction.object.pendingTransaction?.transactionNumber;
|
|
217
|
-
// ↓事前に取引番号を発行しているので、ありえないフロー
|
|
218
|
-
if (typeof transactionNumber !== 'string') {
|
|
219
|
-
throw new factory.errors.Internal('transaction.object.pendingTransaction.transactionNumber undefined');
|
|
220
|
-
}
|
|
221
|
-
// 承認アクションを開始する
|
|
222
|
-
const actionAttributes = createAuthorizeMoneyTransferOfferActionAttributes({
|
|
223
|
-
object: params.object,
|
|
224
|
-
recipient,
|
|
225
|
-
transaction,
|
|
226
|
-
transactionNumber
|
|
227
|
-
});
|
|
228
|
-
const action = await repos.authorizeMoneyTransferOfferAction.start(actionAttributes);
|
|
229
|
-
// 口座取引開始
|
|
230
|
-
let responseBody;
|
|
231
|
-
try {
|
|
232
|
-
responseBody = await processMoneyTransferTransaction({
|
|
233
|
-
project: params.project,
|
|
234
|
-
object: params.object,
|
|
235
|
-
recipient: recipient,
|
|
236
|
-
transaction: transaction,
|
|
237
|
-
transactionNumber
|
|
238
|
-
})(repos);
|
|
239
|
-
// アクションにchevre取引情報を保管
|
|
240
|
-
await repos.authorizeMoneyTransferOfferAction.saveAssetTransactionNumber({
|
|
241
|
-
id: action.id,
|
|
242
|
-
update: {
|
|
243
|
-
'object.itemOffered.amount.currency': params.object.itemOffered.amount.currency,
|
|
244
|
-
'object.itemOffered.object.pendingTransaction': {
|
|
245
|
-
typeOf: responseBody.typeOf,
|
|
246
|
-
id: responseBody.id,
|
|
247
|
-
transactionNumber: responseBody.transactionNumber
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
catch (error) {
|
|
253
|
-
try {
|
|
254
|
-
await repos.authorizeMoneyTransferOfferAction.giveUp({ typeOf: action.typeOf, id: action.id, error });
|
|
255
|
-
}
|
|
256
|
-
catch (__) {
|
|
257
|
-
// no op
|
|
258
|
-
}
|
|
259
|
-
throw error;
|
|
260
|
-
}
|
|
261
|
-
const result = {
|
|
262
|
-
price: 0,
|
|
263
|
-
priceCurrency: factory.priceCurrency.JPY,
|
|
264
|
-
// requestBody: requestBody,
|
|
265
|
-
responseBody: responseBody
|
|
266
|
-
// acceptedOffers: [] // PlaceOrderではないのでacceptedOffersとしては空 // discontinue(2024-06-17~)
|
|
267
|
-
};
|
|
268
|
-
await repos.authorizeMoneyTransferOfferAction.completeWithVoid({ typeOf: action.typeOf, id: action.id, result });
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
function createAuthorizeMoneyTransferOfferActionAttributes(params) {
|
|
272
|
-
const transaction = params.transaction;
|
|
273
|
-
const transactionNumber = params.transactionNumber;
|
|
274
|
-
const recipient = params.recipient;
|
|
275
|
-
return {
|
|
276
|
-
project: transaction.project,
|
|
277
|
-
typeOf: factory.actionType.AuthorizeAction,
|
|
278
|
-
instrument: {
|
|
279
|
-
typeOf: factory.assetTransactionType.MoneyTransfer,
|
|
280
|
-
transactionNumber
|
|
281
|
-
},
|
|
282
|
-
object: {
|
|
283
|
-
project: { typeOf: transaction.project.typeOf, id: transaction.project.id },
|
|
284
|
-
typeOf: factory.offerType.Offer,
|
|
285
|
-
itemOffered: {
|
|
286
|
-
typeOf: factory.actionType.MoneyTransfer,
|
|
287
|
-
amount: {
|
|
288
|
-
typeOf: 'MonetaryAmount',
|
|
289
|
-
currency: params.object.itemOffered.amount.currency,
|
|
290
|
-
...(typeof params.object.itemOffered.amount.value === 'number')
|
|
291
|
-
? { value: params.object.itemOffered.amount.value }
|
|
292
|
-
: undefined
|
|
293
|
-
},
|
|
294
|
-
toLocation: params.object.itemOffered.toLocation,
|
|
295
|
-
object: {
|
|
296
|
-
pendingTransaction: {
|
|
297
|
-
typeOf: factory.assetTransactionType.MoneyTransfer,
|
|
298
|
-
transactionNumber
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
},
|
|
302
|
-
seller: {
|
|
303
|
-
id: String(transaction.seller.id),
|
|
304
|
-
name: (typeof transaction.seller.name === 'string')
|
|
305
|
-
? transaction.seller.name
|
|
306
|
-
: String(transaction.seller.name?.ja),
|
|
307
|
-
typeOf: transaction.seller.typeOf
|
|
308
|
-
},
|
|
309
|
-
price: 0,
|
|
310
|
-
priceCurrency: factory.priceCurrency.JPY
|
|
311
|
-
},
|
|
312
|
-
agent: {
|
|
313
|
-
typeOf: transaction.agent.typeOf,
|
|
314
|
-
id: transaction.agent.id
|
|
315
|
-
},
|
|
316
|
-
recipient: recipient,
|
|
317
|
-
purpose: { typeOf: transaction.typeOf, id: transaction.id }
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
function processMoneyTransferTransaction(params) {
|
|
321
|
-
return async (repos
|
|
322
|
-
// credentials: {
|
|
323
|
-
// jwt: JWTCredentials;
|
|
324
|
-
// }
|
|
325
|
-
) => {
|
|
326
|
-
let pendingTransaction;
|
|
327
|
-
const transaction = params.transaction;
|
|
328
|
-
// Sellerに変更(2022-05-30~)
|
|
329
|
-
const agent = {
|
|
330
|
-
typeOf: transaction.seller.typeOf,
|
|
331
|
-
id: String(transaction.seller.id),
|
|
332
|
-
name: (typeof transaction.seller.name === 'string') ? transaction.seller.name : String(transaction.seller.name?.ja)
|
|
333
|
-
};
|
|
334
|
-
const recipient = {
|
|
335
|
-
typeOf: params.recipient.typeOf,
|
|
336
|
-
id: params.recipient.id,
|
|
337
|
-
name: (typeof params.recipient.name === 'string')
|
|
338
|
-
? params.recipient.name
|
|
339
|
-
: `${transaction.typeOf} Transaction ${transaction.id}`
|
|
340
|
-
};
|
|
341
|
-
const description = (typeof params.object.description === 'string') ? params.object.description : `${transaction.typeOf}:${transaction.id}`;
|
|
342
|
-
// 最大1ヵ月のオーソリ
|
|
343
|
-
const expires = (0, moment_1.default)()
|
|
344
|
-
.add(1, 'month')
|
|
345
|
-
.toDate();
|
|
346
|
-
// 発行サービスIDはfromLocationあるいはtoLocationのどちらかに存在するはず
|
|
347
|
-
const issuedThroughId = params.object.itemOffered.toLocation.issuedThrough.id;
|
|
348
|
-
if (params.object.fromLocation !== undefined && params.object.itemOffered.toLocation === undefined) {
|
|
349
|
-
throw new factory.errors.NotImplemented('Withdraw transaction not implemented');
|
|
350
|
-
}
|
|
351
|
-
else if (params.object.fromLocation !== undefined && params.object.itemOffered.toLocation !== undefined) {
|
|
352
|
-
const { fromLocation } = await validateFromLocation({ id: params.project.id }, params.object.fromLocation, { id: issuedThroughId })(repos);
|
|
353
|
-
const { toLocation } = await validateToLocation({ id: params.project.id }, {
|
|
354
|
-
typeOf: factory.permit.PermitType.Permit,
|
|
355
|
-
identifier: params.object.itemOffered.toLocation.identifier,
|
|
356
|
-
issuedThrough: { id: issuedThroughId }
|
|
357
|
-
}, { id: issuedThroughId })(repos);
|
|
358
|
-
// moneyTransferAssetTransactionで実装
|
|
359
|
-
pendingTransaction = await MoneyTransferAssetTransactionService.start({
|
|
360
|
-
transactionNumber: params.transactionNumber,
|
|
361
|
-
typeOf: factory.assetTransactionType.MoneyTransfer,
|
|
362
|
-
project: { typeOf: factory.organizationType.Project, id: params.project.id },
|
|
363
|
-
agent: agent,
|
|
364
|
-
expires: expires,
|
|
365
|
-
recipient: recipient,
|
|
366
|
-
object: {
|
|
367
|
-
amount: {
|
|
368
|
-
typeOf: 'MonetaryAmount',
|
|
369
|
-
value: (typeof params.object.itemOffered.amount.value === 'number') ? params.object.itemOffered.amount.value : 0,
|
|
370
|
-
currency: params.object.itemOffered.amount.currency
|
|
371
|
-
},
|
|
372
|
-
description: description,
|
|
373
|
-
fromLocation,
|
|
374
|
-
toLocation,
|
|
375
|
-
pendingTransaction: {
|
|
376
|
-
typeOf: factory.account.transactionType.Transfer,
|
|
377
|
-
transactionNumber: params.transactionNumber
|
|
378
|
-
},
|
|
379
|
-
force: false
|
|
380
|
-
},
|
|
381
|
-
// ユニークネスを保証するために識別子を指定する
|
|
382
|
-
...(transaction.typeOf === factory.transactionType.MoneyTransfer
|
|
383
|
-
&& typeof transaction.object.pendingTransaction?.identifier === 'string')
|
|
384
|
-
? { identifier: transaction.object.pendingTransaction.identifier }
|
|
385
|
-
: undefined
|
|
386
|
-
})(repos);
|
|
387
|
-
// pendingTransaction = await repos.moneyTransferAssetTransaction.start({
|
|
388
|
-
// // 既発行のtransactionNumberを引き継ぐ(2022-05-16~)
|
|
389
|
-
// transactionNumber: params.transactionNumber,
|
|
390
|
-
// typeOf: factory.assetTransactionType.MoneyTransfer,
|
|
391
|
-
// project: { typeOf: factory.organizationType.Project, id: params.project.id },
|
|
392
|
-
// agent: agent,
|
|
393
|
-
// expires: expires,
|
|
394
|
-
// recipient: recipient,
|
|
395
|
-
// object: {
|
|
396
|
-
// amount: {
|
|
397
|
-
// typeOf: 'MonetaryAmount',
|
|
398
|
-
// value: (typeof params.object.itemOffered.amount.value === 'number') ? params.object.itemOffered.amount.value : 0,
|
|
399
|
-
// currency: params.object.itemOffered.amount.currency
|
|
400
|
-
// },
|
|
401
|
-
// description: description,
|
|
402
|
-
// fromLocation: params.object.fromLocation,
|
|
403
|
-
// toLocation: {
|
|
404
|
-
// typeOf: factory.permit.PermitType.Permit,
|
|
405
|
-
// identifier: params.object.itemOffered.toLocation.identifier,
|
|
406
|
-
// issuedThrough: { id: params.object.itemOffered.toLocation.issuedThrough?.id }
|
|
407
|
-
// },
|
|
408
|
-
// pendingTransaction: { typeOf: factory.account.transactionType.Transfer, id: '' }
|
|
409
|
-
// },
|
|
410
|
-
// // ユニークネスを保証するために識別子を指定する
|
|
411
|
-
// ...(transaction.typeOf === factory.transactionType.MoneyTransfer
|
|
412
|
-
// && typeof transaction.object.pendingTransaction?.identifier === 'string')
|
|
413
|
-
// ? { identifier: transaction.object.pendingTransaction.identifier }
|
|
414
|
-
// : undefined
|
|
415
|
-
// });
|
|
416
|
-
}
|
|
417
|
-
else if (params.object.fromLocation === undefined && params.object.itemOffered.toLocation !== undefined) {
|
|
418
|
-
throw new factory.errors.NotImplemented('Deposit transaction not implemented');
|
|
419
|
-
}
|
|
420
|
-
else {
|
|
421
|
-
throw new factory.errors.Argument('Object', 'At least one of accounts from and to must be specified');
|
|
422
|
-
}
|
|
423
|
-
return pendingTransaction;
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
function validateFromLocation(project, fromLocationBeforeStart, issuedThrough) {
|
|
427
|
-
return async (repos
|
|
428
|
-
// credentials: {
|
|
429
|
-
// jwt: JWTCredentials;
|
|
430
|
-
// }
|
|
431
|
-
) => {
|
|
432
|
-
let fromLocation = fromLocationBeforeStart;
|
|
433
|
-
// discontinue token as fromLocation(ticketTokenへ移行するべき)(2024-12-18~)
|
|
434
|
-
if (typeof fromLocation === 'string') {
|
|
435
|
-
throw new factory.errors.NotImplemented('fromLocation as string not implemented');
|
|
436
|
-
// トークン化されたペイメントカード情報でリクエストされた場合、実ペイメントカード情報へ変換する
|
|
437
|
-
// const { authorizedObject } = await CodeService.verifyToken({
|
|
438
|
-
// project: { id: project.id },
|
|
439
|
-
// agent: { id: project.id, typeOf: factory.organizationType.Project },
|
|
440
|
-
// token: fromLocation
|
|
441
|
-
// })(repos);
|
|
442
|
-
// const paymentCardOwnershipInfo = authorizedObject;
|
|
443
|
-
// if (Array.isArray(paymentCardOwnershipInfo)) {
|
|
444
|
-
// throw new factory.errors.NotImplemented('fromLocation as an array not implemented');
|
|
445
|
-
// }
|
|
446
|
-
// if (paymentCardOwnershipInfo.typeOf !== 'OwnershipInfo') {
|
|
447
|
-
// throw new factory.errors.Argument('fromLocation', 'must be OwnershipInfo');
|
|
448
|
-
// }
|
|
449
|
-
// if (paymentCardOwnershipInfo.typeOfGood.typeOf !== factory.permit.PermitType.Permit) {
|
|
450
|
-
// throw new factory.errors.Argument('fromLocation', 'must be Permit');
|
|
451
|
-
// }
|
|
452
|
-
// if (paymentCardOwnershipInfo.typeOfGood.issuedThrough?.typeOf !== factory.product.ProductType.PaymentCard) {
|
|
453
|
-
// throw new factory.errors.Argument('fromLocation', 'must be issued through PaymentCard');
|
|
454
|
-
// }
|
|
455
|
-
// fromLocation = {
|
|
456
|
-
// typeOf: paymentCardOwnershipInfo.typeOfGood.typeOf,
|
|
457
|
-
// identifier: paymentCardOwnershipInfo.typeOfGood.identifier,
|
|
458
|
-
// issuedThrough: { id: paymentCardOwnershipInfo.typeOfGood.issuedThrough.id }
|
|
459
|
-
// };
|
|
460
|
-
}
|
|
461
|
-
else {
|
|
462
|
-
// fromLocationが注文の場合に対応
|
|
463
|
-
if (fromLocation.typeOf === factory.order.OrderType.Order) {
|
|
464
|
-
// 注文検索
|
|
465
|
-
const orders = await repos.order.projectFields({
|
|
466
|
-
limit: 1,
|
|
467
|
-
page: 1,
|
|
468
|
-
project: { id: { $eq: project.id } },
|
|
469
|
-
orderNumbers: [String(fromLocation.orderNumber)],
|
|
470
|
-
confirmationNumbers: [String(fromLocation.confirmationNumber)]
|
|
471
|
-
}, {
|
|
472
|
-
inclusion: ['identifier', 'orderStatus']
|
|
473
|
-
});
|
|
474
|
-
const order = orders.shift();
|
|
475
|
-
if (order === undefined) {
|
|
476
|
-
throw new factory.errors.NotFound('Order');
|
|
477
|
-
}
|
|
478
|
-
// OrderDeliveredのみ許可
|
|
479
|
-
if (order.orderStatus !== factory.orderStatus.OrderDelivered) {
|
|
480
|
-
throw new factory.errors.Argument('fromLocation', `Invalid order status '${order.orderStatus}''`);
|
|
481
|
-
}
|
|
482
|
-
let awardAccounts = [];
|
|
483
|
-
const awardAccounsValue = order.identifier?.find((i) => i.name === order_1.AWARD_ACCOUNTS_IDENTIFIER_NAME)?.value;
|
|
484
|
-
if (typeof awardAccounsValue === 'string' && awardAccounsValue.length > 0) {
|
|
485
|
-
awardAccounts = JSON.parse(awardAccounsValue);
|
|
486
|
-
}
|
|
487
|
-
// 注文口座にPermitは存在しないので、typeOfはAccountで固定のはず
|
|
488
|
-
const awardAccount = awardAccounts.shift();
|
|
489
|
-
if (awardAccount === undefined) {
|
|
490
|
-
throw new factory.errors.NotFound('award account');
|
|
491
|
-
}
|
|
492
|
-
fromLocation = {
|
|
493
|
-
typeOf: factory.permit.PermitType.Permit,
|
|
494
|
-
identifier: awardAccount.accountNumber,
|
|
495
|
-
// ↓指定しないとPermitのチェックが実行される(注文口座にはPermitが存在しない)
|
|
496
|
-
hasNoPermit: true,
|
|
497
|
-
issuedThrough: { id: issuedThrough.id }
|
|
498
|
-
};
|
|
499
|
-
}
|
|
500
|
-
else if (fromLocation.typeOf === factory.permit.PermitType.Permit) {
|
|
501
|
-
fromLocation = {
|
|
502
|
-
...fromLocation,
|
|
503
|
-
hasNoPermit: false
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
return { fromLocation };
|
|
508
|
-
};
|
|
509
|
-
}
|
|
510
|
-
function validateToLocation(project, toLocationBeforeStart, issuedThrough) {
|
|
511
|
-
return async (repos) => {
|
|
512
|
-
let toLocation = toLocationBeforeStart;
|
|
513
|
-
if (typeof toLocation === 'string') {
|
|
514
|
-
throw new factory.errors.Argument('toLocation', 'string not permitted');
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
// fromLocationが注文の場合に対応
|
|
518
|
-
if (toLocation.typeOf === factory.order.OrderType.Order) {
|
|
519
|
-
// 注文検索
|
|
520
|
-
const orders = await repos.order.projectFields({
|
|
521
|
-
limit: 1,
|
|
522
|
-
page: 1,
|
|
523
|
-
project: { id: { $eq: project.id } },
|
|
524
|
-
orderNumbers: [String(toLocation.orderNumber)],
|
|
525
|
-
confirmationNumbers: [String(toLocation.confirmationNumber)]
|
|
526
|
-
}, {
|
|
527
|
-
inclusion: [
|
|
528
|
-
'identifier'
|
|
529
|
-
]
|
|
530
|
-
});
|
|
531
|
-
const order = orders.shift();
|
|
532
|
-
if (order === undefined) {
|
|
533
|
-
throw new factory.errors.NotFound('Order');
|
|
534
|
-
}
|
|
535
|
-
let awardAccounts = [];
|
|
536
|
-
const awardAccounsValue = order.identifier?.find((i) => i.name === order_1.AWARD_ACCOUNTS_IDENTIFIER_NAME)?.value;
|
|
537
|
-
if (typeof awardAccounsValue === 'string' && awardAccounsValue.length > 0) {
|
|
538
|
-
awardAccounts = JSON.parse(awardAccounsValue);
|
|
539
|
-
}
|
|
540
|
-
// 注文口座にPermitは存在しないので、typeOfはAccountで固定のはず
|
|
541
|
-
const awardAccount = awardAccounts.shift();
|
|
542
|
-
if (awardAccount === undefined) {
|
|
543
|
-
throw new factory.errors.NotFound('award account');
|
|
544
|
-
}
|
|
545
|
-
toLocation = {
|
|
546
|
-
typeOf: factory.permit.PermitType.Permit,
|
|
547
|
-
identifier: awardAccount.accountNumber,
|
|
548
|
-
// ↓指定しないとPermitのチェックが実行される(注文口座にはPermitが存在しない)
|
|
549
|
-
hasNoPermit: true,
|
|
550
|
-
issuedThrough: { id: issuedThrough.id }
|
|
551
|
-
};
|
|
552
|
-
}
|
|
553
|
-
else if (toLocation.typeOf === factory.permit.PermitType.Permit) {
|
|
554
|
-
toLocation = {
|
|
555
|
-
...toLocation,
|
|
556
|
-
hasNoPermit: false
|
|
557
|
-
};
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
return { toLocation };
|
|
561
|
-
};
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* 取引確定
|
|
565
|
-
*/
|
|
566
|
-
function confirm(params) {
|
|
567
|
-
return async (repos) => {
|
|
568
|
-
const now = new Date();
|
|
569
|
-
const transaction = await repos.moneyTransfer.findMoneyTransferById({
|
|
570
|
-
typeOf: factory.transactionType.MoneyTransfer,
|
|
571
|
-
id: params.id
|
|
572
|
-
}, ['typeOf', 'status', 'project']);
|
|
573
|
-
if (transaction.status === factory.transactionStatusType.Confirmed) {
|
|
574
|
-
// すでに確定済の場合
|
|
575
|
-
return;
|
|
576
|
-
}
|
|
577
|
-
else if (transaction.status === factory.transactionStatusType.Expired) {
|
|
578
|
-
throw new factory.errors.Argument('transactionId', 'Transaction already expired');
|
|
579
|
-
}
|
|
580
|
-
else if (transaction.status === factory.transactionStatusType.Canceled) {
|
|
581
|
-
throw new factory.errors.Argument('transactionId', 'Transaction already canceled');
|
|
582
|
-
}
|
|
583
|
-
// if (transaction.agent.id !== params.agent.id) {
|
|
584
|
-
// throw new factory.errors.Forbidden('Transaction not yours');
|
|
585
|
-
// }
|
|
586
|
-
// 取引に対する全ての承認アクションをマージ
|
|
587
|
-
const authorizeActions = await searchAuthorizeActions({
|
|
588
|
-
transaction: transaction,
|
|
589
|
-
now: now
|
|
590
|
-
})(repos);
|
|
591
|
-
// ポストアクションを作成
|
|
592
|
-
const potentialActions = await (0, potentialActions_1.createPotentialActions)({ authorizeActions, transaction });
|
|
593
|
-
// 取引確定
|
|
594
|
-
await repos.moneyTransfer.confirmMoneyTransfer({
|
|
595
|
-
typeOf: factory.transactionType.MoneyTransfer,
|
|
596
|
-
id: transaction.id,
|
|
597
|
-
result: {},
|
|
598
|
-
potentialActions: potentialActions
|
|
599
|
-
});
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
function searchAuthorizeActions(params) {
|
|
603
|
-
return async (repos) => {
|
|
604
|
-
let authorizeActions = await repos.authorizeMoneyTransferOfferAction.findAuthorizeMoneyTransferOfferActionsByPurpose({
|
|
605
|
-
// typeOf: factory.actionType.AuthorizeAction,
|
|
606
|
-
purpose: {
|
|
607
|
-
typeOf: params.transaction.typeOf,
|
|
608
|
-
id: params.transaction.id
|
|
609
|
-
},
|
|
610
|
-
// Completedに絞る(2023-05-16~)
|
|
611
|
-
actionStatus: { $eq: factory.actionStatusType.CompletedActionStatus }
|
|
612
|
-
});
|
|
613
|
-
// 万が一このプロセス中に他処理が発生してもそれらを無視するように、endDateでフィルタリング
|
|
614
|
-
authorizeActions = authorizeActions.filter((a) => {
|
|
615
|
-
return (a.endDate instanceof Date) && (0, moment_1.default)(a.endDate)
|
|
616
|
-
.isBefore((0, moment_1.default)(params.now));
|
|
617
|
-
});
|
|
618
|
-
return authorizeActions;
|
|
619
|
-
};
|
|
620
|
-
}
|
|
621
|
-
/**
|
|
622
|
-
* 取引のタスク出力
|
|
623
|
-
*/
|
|
624
|
-
function exportTasksById(params) {
|
|
625
|
-
return async (repos
|
|
626
|
-
// settings: Settings
|
|
627
|
-
) => {
|
|
628
|
-
const transaction = await repos.moneyTransfer.findMoneyTransferById({
|
|
629
|
-
typeOf: factory.transactionType.MoneyTransfer,
|
|
630
|
-
id: params.id
|
|
631
|
-
}, ['endDate', 'status', 'project', 'startDate', 'typeOf', 'object', 'potentialActions']);
|
|
632
|
-
// タスク実行日時バッファの指定があれば調整
|
|
633
|
-
let taskRunsAt = new Date();
|
|
634
|
-
if (typeof params.runsTasksAfterInSeconds === 'number') {
|
|
635
|
-
taskRunsAt = (0, moment_1.default)(taskRunsAt)
|
|
636
|
-
.add(params.runsTasksAfterInSeconds, 'seconds')
|
|
637
|
-
.toDate();
|
|
638
|
-
}
|
|
639
|
-
// search settings
|
|
640
|
-
const setting = await repos.setting.findOne({ project: { id: { $eq: '*' } } }, ['storage']);
|
|
641
|
-
const taskAttributes = (0, factory_1.createTasks)({
|
|
642
|
-
transaction,
|
|
643
|
-
runsAt: taskRunsAt
|
|
644
|
-
}, setting
|
|
645
|
-
// settings
|
|
646
|
-
);
|
|
647
|
-
await repos.task.saveMany(taskAttributes, { emitImmediately: true });
|
|
648
|
-
};
|
|
649
|
-
}
|