@chevre/domain 21.33.0-alpha.9 → 21.33.0

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.
Files changed (95) hide show
  1. package/example/src/chevre/findTransactionById.ts +8 -5
  2. package/example/src/chevre/migratePayCreditCardRecipes.ts +104 -0
  3. package/example/src/chevre/migratePayMovieTicketRecipes.ts +100 -0
  4. package/example/src/chevre/migrateTransactionObjectPaymentMethods.ts +147 -0
  5. package/example/src/chevre/reexportTasksByExportAction.ts +37 -0
  6. package/example/src/chevre/searchActionsBySameAs.ts +2 -1
  7. package/example/src/chevre/searchCheckMovieTicketResultYkknInfo.ts +26 -6
  8. package/example/src/chevre/searchTransactions.ts +1 -1
  9. package/example/src/chevre/unsetUnnecessaryFields.ts +3 -18
  10. package/lib/chevre/repo/action.d.ts +51 -0
  11. package/lib/chevre/repo/action.js +122 -2
  12. package/lib/chevre/repo/assetTransaction.d.ts +9 -2
  13. package/lib/chevre/repo/assetTransaction.js +48 -3
  14. package/lib/chevre/repo/mongoose/schemas/actionRecipe.d.ts +5 -0
  15. package/lib/chevre/repo/mongoose/schemas/actionRecipe.js +89 -0
  16. package/lib/chevre/repo/mongoose/schemas/assetTransaction.js +23 -25
  17. package/lib/chevre/repo/mongoose/schemas/transaction.js +5 -52
  18. package/lib/chevre/repo/transaction.d.ts +26 -11
  19. package/lib/chevre/repo/transaction.js +89 -17
  20. package/lib/chevre/service/assetTransaction/pay.d.ts +6 -2
  21. package/lib/chevre/service/assetTransaction/pay.js +49 -5
  22. package/lib/chevre/service/offer/event/voidTransaction.js +4 -6
  23. package/lib/chevre/service/offer/eventServiceByCOA/findAcceptAction.js +2 -1
  24. package/lib/chevre/service/offer/product.js +1 -1
  25. package/lib/chevre/service/payment/any/handlePrePublishedPaymentMethodIdOnAuthorizing.d.ts +23 -0
  26. package/lib/chevre/service/payment/any/handlePrePublishedPaymentMethodIdOnAuthorizing.js +155 -0
  27. package/lib/chevre/service/payment/any.d.ts +10 -2
  28. package/lib/chevre/service/payment/any.js +83 -114
  29. package/lib/chevre/service/payment/creditCard/authorize.d.ts +41 -0
  30. package/lib/chevre/service/payment/creditCard/authorize.js +216 -0
  31. package/lib/chevre/service/payment/creditCard/factory.d.ts +35 -0
  32. package/lib/chevre/service/payment/creditCard/factory.js +57 -0
  33. package/lib/chevre/service/payment/creditCard/getGMOInfoFromSeller.d.ts +20 -0
  34. package/lib/chevre/service/payment/creditCard/getGMOInfoFromSeller.js +47 -0
  35. package/lib/chevre/service/payment/creditCard/gmoError.d.ts +34 -0
  36. package/lib/chevre/service/payment/creditCard/gmoError.js +8 -0
  37. package/lib/chevre/service/payment/creditCard/payCreditCard.d.ts +20 -0
  38. package/lib/chevre/service/payment/creditCard/payCreditCard.js +151 -0
  39. package/lib/chevre/service/payment/creditCard/refundCreditCard.d.ts +26 -0
  40. package/lib/chevre/service/payment/creditCard/refundCreditCard.js +196 -0
  41. package/lib/chevre/service/payment/creditCard/searchGMOTrade.d.ts +13 -0
  42. package/lib/chevre/service/payment/creditCard/searchGMOTrade.js +62 -0
  43. package/lib/chevre/service/payment/creditCard/voidTransaction.d.ts +13 -0
  44. package/lib/chevre/service/payment/creditCard/voidTransaction.js +90 -0
  45. package/lib/chevre/service/payment/creditCard.d.ts +7 -106
  46. package/lib/chevre/service/payment/creditCard.js +12 -638
  47. package/lib/chevre/service/payment/faceToFace.d.ts +1 -1
  48. package/lib/chevre/service/payment/movieTicket/authorize.d.ts +38 -0
  49. package/lib/chevre/service/payment/movieTicket/authorize.js +71 -0
  50. package/lib/chevre/service/payment/movieTicket/checkMovieTicket.d.ts +22 -0
  51. package/lib/chevre/service/payment/movieTicket/checkMovieTicket.js +109 -0
  52. package/lib/chevre/service/payment/movieTicket/factory.d.ts +52 -1
  53. package/lib/chevre/service/payment/movieTicket/factory.js +114 -1
  54. package/lib/chevre/service/payment/movieTicket/payMovieTicket.d.ts +24 -0
  55. package/lib/chevre/service/payment/movieTicket/payMovieTicket.js +157 -0
  56. package/lib/chevre/service/payment/movieTicket/{checkByIdentifier.d.ts → processPurchaseNumberAuth.d.ts} +5 -6
  57. package/lib/chevre/service/payment/movieTicket/{checkByIdentifier.js → processPurchaseNumberAuth.js} +4 -8
  58. package/lib/chevre/service/payment/movieTicket/refundMovieTicket.d.ts +21 -0
  59. package/lib/chevre/service/payment/movieTicket/refundMovieTicket.js +248 -0
  60. package/lib/chevre/service/payment/movieTicket/validation.js +3 -3
  61. package/lib/chevre/service/payment/movieTicket/voidTransaction.d.ts +12 -0
  62. package/lib/chevre/service/payment/movieTicket/voidTransaction.js +74 -0
  63. package/lib/chevre/service/payment/movieTicket.d.ts +7 -75
  64. package/lib/chevre/service/payment/movieTicket.js +11 -567
  65. package/lib/chevre/service/payment/paymentCard.d.ts +1 -1
  66. package/lib/chevre/service/payment.d.ts +9 -1
  67. package/lib/chevre/service/payment.js +2 -1
  68. package/lib/chevre/service/task/acceptCOAOffer.js +2 -1
  69. package/lib/chevre/service/task/authorizePayment.js +2 -1
  70. package/lib/chevre/service/task/checkMovieTicket.js +1 -1
  71. package/lib/chevre/service/task/pay.d.ts +2 -2
  72. package/lib/chevre/service/task/pay.js +3 -2
  73. package/lib/chevre/service/task/publishPaymentUrl.js +2 -1
  74. package/lib/chevre/service/task/voidPayTransaction.d.ts +2 -2
  75. package/lib/chevre/service/task/voidPayTransaction.js +2 -4
  76. package/lib/chevre/service/task/voidPayment.js +0 -1
  77. package/lib/chevre/service/task.js +2 -0
  78. package/lib/chevre/service/transaction/moneyTransfer/exportTasks/factory.d.ts +1 -1
  79. package/lib/chevre/service/transaction/moneyTransfer/potentialActions.d.ts +1 -1
  80. package/lib/chevre/service/transaction/moneyTransfer.js +2 -2
  81. package/lib/chevre/service/transaction/placeOrder.js +2 -3
  82. package/lib/chevre/service/transaction/placeOrderInProgress/confirm.js +3 -2
  83. package/lib/chevre/service/transaction/placeOrderInProgress/potentialActions.d.ts +0 -1
  84. package/lib/chevre/service/transaction/placeOrderInProgress/result.d.ts +1 -1
  85. package/lib/chevre/service/transaction/placeOrderInProgress/validation.d.ts +1 -1
  86. package/lib/chevre/service/transaction/placeOrderInProgress/validation.js +4 -3
  87. package/lib/chevre/service/transaction/returnOrder/exportTasks/factory.d.ts +1 -1
  88. package/lib/chevre/service/transaction/returnOrder/potentialActions/returnPaymentMethod.d.ts +1 -1
  89. package/lib/chevre/service/transaction/returnOrder/potentialActions.d.ts +1 -1
  90. package/lib/chevre/service/transaction/returnOrder.js +2 -2
  91. package/lib/chevre/settings.d.ts +1 -0
  92. package/lib/chevre/settings.js +2 -1
  93. package/package.json +3 -3
  94. package/example/src/chevre/migrateOwnershipInfos2newUserPool.ts +0 -152
  95. package/example/src/chevre/migratePayTransactionReservedTicketIdentifier.ts +0 -95
@@ -0,0 +1,38 @@
1
+ import type { MongoRepository as AccountingReportRepo } from '../../../repo/accountingReport';
2
+ import type { MongoRepository as ActionRepo } from '../../../repo/action';
3
+ import type { MongoRepository as EventRepo } from '../../../repo/event';
4
+ import type { MongoRepository as PaymentServiceRepo } from '../../../repo/paymentService';
5
+ import type { MongoRepository as PaymentServiceProviderRepo } from '../../../repo/paymentServiceProvider';
6
+ import type { MongoRepository as PaymentAcceptedRepo } from '../../../repo/sellerPaymentAccepted';
7
+ import type { MongoRepository as TaskRepo } from '../../../repo/task';
8
+ import * as factory from '../../../factory';
9
+ interface IAuthorizeResult {
10
+ accountId: string;
11
+ accountsReceivablesByServiceType: factory.assetTransaction.pay.IAccountsReceivableByServiceType[];
12
+ payAction: factory.action.trade.pay.IAction;
13
+ }
14
+ /**
15
+ * 決済カード承認
16
+ * オーソリサービスが存在するわけではないので、実質着券する
17
+ */
18
+ declare function authorize(params: factory.assetTransaction.pay.IStartParamsWithoutDetail, transaction: factory.assetTransaction.pay.ITransaction, paymentServiceId: string, useCheckMovieTicketBeforePay: boolean, useCheckByIdentifierIfNotYet: boolean, options: {
19
+ /**
20
+ * 実行者
21
+ */
22
+ executor?: {
23
+ /**
24
+ * task ID
25
+ * taskによって実行されている場合値が存在する(taskName: authorizePayment)
26
+ */
27
+ id?: string;
28
+ };
29
+ }): (repos: {
30
+ action: ActionRepo;
31
+ accountingReport: AccountingReportRepo;
32
+ event: EventRepo;
33
+ paymentAccepted: PaymentAcceptedRepo;
34
+ paymentService: PaymentServiceRepo;
35
+ paymentServiceProvider: PaymentServiceProviderRepo;
36
+ task: TaskRepo;
37
+ }) => Promise<IAuthorizeResult>;
38
+ export { authorize };
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.authorize = void 0;
13
+ const errorHandler_1 = require("../../../errorHandler");
14
+ const factory = require("../../../factory");
15
+ const payMovieTicket_1 = require("./payMovieTicket");
16
+ const validation_1 = require("./validation");
17
+ /**
18
+ * 決済カード承認
19
+ * オーソリサービスが存在するわけではないので、実質着券する
20
+ */
21
+ function authorize(params, transaction, paymentServiceId, useCheckMovieTicketBeforePay, useCheckByIdentifierIfNotYet, options) {
22
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
23
+ var _a, _b;
24
+ let accountId;
25
+ let payAction;
26
+ let accountsReceivablesByServiceType = [];
27
+ try {
28
+ // MovieTicket決済の場合、認証
29
+ const validateMovieTicketResult = yield (0, validation_1.validateMovieTicket)(params, paymentServiceId, useCheckMovieTicketBeforePay, useCheckByIdentifierIfNotYet)(repos);
30
+ accountsReceivablesByServiceType = validateMovieTicketResult.accountsReceivablesByServiceType;
31
+ const paymentMethod = transaction.object.paymentMethod;
32
+ const paymentMethodType = String(paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.identifier);
33
+ const additionalProperty = paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.additionalProperty;
34
+ const paymentMethodId = transaction.object.paymentMethodId;
35
+ const paymentMethodName = (typeof (paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.name) === 'string') ? paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.name : paymentMethodType;
36
+ accountId = (Array.isArray(paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.movieTickets)) ? (_a = paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.movieTickets[0]) === null || _a === void 0 ? void 0 : _a.identifier : undefined;
37
+ if (typeof accountId !== 'string' || accountId.length === 0) {
38
+ throw new factory.errors.ArgumentNull('object.paymentMethod.movieTickets.identifier');
39
+ }
40
+ const payObject = {
41
+ typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
42
+ id: paymentServiceId,
43
+ paymentMethod: Object.assign({ additionalProperty: (Array.isArray(additionalProperty)) ? additionalProperty : [], name: paymentMethodName, paymentMethodId: paymentMethodId, totalPaymentDue: {
44
+ typeOf: 'MonetaryAmount',
45
+ currency: factory.unitCode.C62,
46
+ value: (Array.isArray(paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.movieTickets)) ? paymentMethod.movieTickets.length : 0
47
+ }, typeOf: paymentMethodType }, (typeof accountId === 'string') ? { accountId } : undefined),
48
+ movieTickets: paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.movieTickets
49
+ };
50
+ const payActionAttributes = Object.assign(Object.assign({ project: transaction.project, typeOf: factory.actionType.PayAction, object: [payObject], agent: transaction.project, recipient: transaction.recipient }, (params.purpose !== undefined)
51
+ ? { purpose: params.purpose }
52
+ : { purpose: { typeOf: transaction.typeOf, transactionNumber: transaction.transactionNumber, id: transaction.id } }), (typeof ((_b = options.executor) === null || _b === void 0 ? void 0 : _b.id) === 'string')
53
+ ? { sameAs: { id: options.executor.id, typeOf: 'Task' } } // link sameAs(2024-06-04~)
54
+ : undefined);
55
+ // 着券させざるをえないが、informPaymentはしない(注文がまだ存在しないため)
56
+ payAction = yield (0, payMovieTicket_1.payMovieTicket)(payActionAttributes)(repos);
57
+ }
58
+ catch (error) {
59
+ // アクション保管用のエラーと両方throw(2024-05-22~)
60
+ if (Array.isArray(error)) {
61
+ throw error;
62
+ }
63
+ else {
64
+ throw [(0, errorHandler_1.handleMvtkReserveError)(error), error];
65
+ }
66
+ // throw handleMvtkReserveError(error);
67
+ }
68
+ return { accountId, payAction, accountsReceivablesByServiceType };
69
+ });
70
+ }
71
+ exports.authorize = authorize;
@@ -0,0 +1,22 @@
1
+ import type { MongoRepository as ActionRepo } from '../../../repo/action';
2
+ import type { MongoRepository as EventRepo } from '../../../repo/event';
3
+ import type { MongoRepository as PaymentServiceRepo } from '../../../repo/paymentService';
4
+ import type { MongoRepository as PaymentServiceProviderRepo } from '../../../repo/paymentServiceProvider';
5
+ import type { MongoRepository as PaymentAcceptedRepo } from '../../../repo/sellerPaymentAccepted';
6
+ import * as factory from '../../../factory';
7
+ import { ICheckResult } from './processPurchaseNumberAuth';
8
+ interface ICheckOperationRepos {
9
+ action: ActionRepo;
10
+ event: EventRepo;
11
+ paymentAccepted: PaymentAcceptedRepo;
12
+ paymentService: PaymentServiceRepo;
13
+ paymentServiceProvider: PaymentServiceProviderRepo;
14
+ }
15
+ type ICheckOperation<T> = (repos: ICheckOperationRepos) => Promise<T>;
16
+ /**
17
+ * 決済カード認証
18
+ */
19
+ declare function checkMovieTicket(params: factory.action.check.paymentMethod.movieTicket.IAttributes): ICheckOperation<{
20
+ result: ICheckResult;
21
+ }>;
22
+ export { checkMovieTicket };
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.checkMovieTicket = void 0;
13
+ const errorHandler_1 = require("../../../errorHandler");
14
+ const factory = require("../../../factory");
15
+ const settings_1 = require("../../../settings");
16
+ const factory_1 = require("./factory");
17
+ const processPurchaseNumberAuth_1 = require("./processPurchaseNumberAuth");
18
+ /**
19
+ * 決済カード認証
20
+ */
21
+ function checkMovieTicket(params) {
22
+ // tslint:disable-next-line:max-func-body-length
23
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
24
+ var _a, _b, _c, _d, _e, _f;
25
+ // 不要な属性がリクエストに含まれているのでmovieTicketsを最適化(2024-03-15~)
26
+ let movieTickets = (_a = params.object[0]) === null || _a === void 0 ? void 0 : _a.movieTickets;
27
+ if (!Array.isArray(movieTickets)) {
28
+ throw new factory.errors.Argument('object.movieTickets must be an array');
29
+ }
30
+ movieTickets = movieTickets.map(({ accessCode, category, identifier, serviceOutput }) => {
31
+ return {
32
+ accessCode,
33
+ category,
34
+ identifier,
35
+ serviceOutput: { reservationFor: serviceOutput.reservationFor } // 最適化(2024-03-15~)
36
+ };
37
+ });
38
+ const optimizedCheckObject = params.object.map(({ id, typeOf, paymentMethod, seller }) => {
39
+ return {
40
+ id,
41
+ typeOf,
42
+ paymentMethod: { typeOf: paymentMethod.typeOf },
43
+ seller,
44
+ movieTickets
45
+ };
46
+ });
47
+ const paymentMethodType = (_b = optimizedCheckObject[0]) === null || _b === void 0 ? void 0 : _b.paymentMethod.typeOf; // 決済方法区分
48
+ const paymentServiceId = (_c = optimizedCheckObject[0]) === null || _c === void 0 ? void 0 : _c.id;
49
+ const taskId = (_d = params.sameAs) === null || _d === void 0 ? void 0 : _d.id;
50
+ const actionAttributes = Object.assign(Object.assign({ project: params.project, typeOf: factory.actionType.CheckAction, agent: params.agent, object: optimizedCheckObject }, (typeof ((_e = params.purpose) === null || _e === void 0 ? void 0 : _e.typeOf) === 'string') ? { purpose: params.purpose } : undefined), (typeof taskId === 'string')
51
+ ? { sameAs: { id: taskId, typeOf: 'Task' } } // タスク関連付け(2024-05-21~)
52
+ : undefined);
53
+ const action = yield repos.action.start(actionAttributes);
54
+ let processPurchaseNumberAuthResult;
55
+ try {
56
+ const eventIds = [...new Set(optimizedCheckObject.reduce((a, b) => [
57
+ ...a,
58
+ ...(Array.isArray(b.movieTickets)) ? b.movieTickets.map((ticket) => ticket.serviceOutput.reservationFor.id) : []
59
+ ], []))];
60
+ if (eventIds.length !== 1) {
61
+ throw new factory.errors.Argument('movieTickets', 'Number of events must be 1');
62
+ }
63
+ // イベント情報取得
64
+ let screeningEvent;
65
+ // イベント取得属性最適化(2023-01-23~)
66
+ screeningEvent = yield repos.event.findMinimizedIndividualEventById({ id: eventIds[0] });
67
+ const sellerId = (_f = optimizedCheckObject[0]) === null || _f === void 0 ? void 0 : _f.seller.id;
68
+ const paymentAccepted = yield repos.paymentAccepted.isAcceptedBySeller({
69
+ seller: { id: sellerId },
70
+ codeValue: paymentMethodType
71
+ });
72
+ if (paymentAccepted !== true) {
73
+ throw new factory.errors.Argument('transactionId', `payment not accepted [${paymentMethodType}]`);
74
+ }
75
+ processPurchaseNumberAuthResult = yield (0, processPurchaseNumberAuth_1.processPurchaseNumberAuth)({
76
+ movieTickets: movieTickets,
77
+ seller: { id: sellerId },
78
+ screeningEvent: screeningEvent,
79
+ paymentServiceId
80
+ })(repos);
81
+ // add recipe(2024-06-07~)
82
+ if (settings_1.USE_EXPERIMENTAL_FEATURE) {
83
+ yield repos.action.saveOneRecipe((0, factory_1.processPurchaseNumberAuthResult2checkRecipe)({
84
+ processPurchaseNumberAuthResult,
85
+ project: { id: params.project.id },
86
+ action: { id: action.id, typeOf: action.typeOf }
87
+ }));
88
+ }
89
+ }
90
+ catch (error) {
91
+ // アクション保管用のエラーと両方保管(2024-05-22~)
92
+ const errors = [(0, errorHandler_1.handleMvtkReserveError)(error), error];
93
+ try {
94
+ yield repos.action.giveUp({ typeOf: actionAttributes.typeOf, id: action.id, error: errors });
95
+ }
96
+ catch (__) {
97
+ // 失敗したら仕方ない
98
+ }
99
+ throw errors[0];
100
+ }
101
+ const result = {
102
+ purchaseNumberAuthIn: processPurchaseNumberAuthResult.purchaseNumberAuthIn,
103
+ purchaseNumberAuthResult: processPurchaseNumberAuthResult.purchaseNumberAuthResult
104
+ };
105
+ yield repos.action.completeWithVoid({ typeOf: actionAttributes.typeOf, id: action.id, result });
106
+ return { result: processPurchaseNumberAuthResult };
107
+ });
108
+ }
109
+ exports.checkMovieTicket = checkMovieTicket;
@@ -1,7 +1,7 @@
1
1
  import * as surfrock from '@surfrock/sdk';
2
2
  import * as factory from '../../../factory';
3
3
  import { IMinimizedIndividualEvent } from '../../../factory/event';
4
- export declare function createSeatInfoSyncIn(params: {
4
+ declare function createSeatInfoSyncIn(params: {
5
5
  paymentMethodType: string;
6
6
  paymentMethodId: string;
7
7
  movieTickets: factory.action.trade.pay.IMovieTicket[];
@@ -12,3 +12,54 @@ export declare function createSeatInfoSyncIn(params: {
12
12
  stCd: string;
13
13
  };
14
14
  }): surfrock.factory.service.seat.seatInfoSync.ISeatInfoSyncIn;
15
+ declare function createStartingPayAction(params: factory.task.pay.IPayActionData, seatInfoSyncIn: surfrock.factory.service.seat.seatInfoSync.ISeatInfoSyncIn): factory.action.trade.pay.IAttributes;
16
+ interface IProcessPurchaseNumberAuthResult {
17
+ purchaseNumberAuthIn?: factory.action.check.paymentMethod.movieTicket.IPurchaseNumberAuthIn;
18
+ purchaseNumberAuthResult?: factory.action.check.paymentMethod.movieTicket.IPurchaseNumberAuthResult;
19
+ }
20
+ interface IProcessSeatInfoSyncResult {
21
+ seatInfoSyncIn?: factory.action.trade.pay.ISeatInfoSyncIn;
22
+ seatInfoSyncResult?: factory.action.trade.pay.ISeatInfoSyncResult | factory.action.trade.refund.ISeatInfoSyncResultAsError;
23
+ }
24
+ interface IProcessSeatInfoSyncCancelResult {
25
+ seatInfoSyncCancelIn?: factory.action.trade.refund.ISeatInfoSyncCancelIn;
26
+ seatInfoSyncCancelResult?: factory.action.trade.refund.ISeatInfoSyncCancelResult;
27
+ }
28
+ declare function processPurchaseNumberAuthResult2checkRecipe(params: {
29
+ processPurchaseNumberAuthResult: IProcessPurchaseNumberAuthResult;
30
+ project: {
31
+ id: string;
32
+ };
33
+ action: {
34
+ id: string;
35
+ typeOf: factory.actionType;
36
+ };
37
+ }): factory.action.check.paymentMethod.movieTicket.IRecipe;
38
+ declare function processSeatInfoSyncResult2payRecipe(params: {
39
+ processSeatInfoSyncResult: IProcessSeatInfoSyncResult;
40
+ project: {
41
+ id: string;
42
+ };
43
+ action: {
44
+ id: string;
45
+ typeOf: factory.actionType;
46
+ };
47
+ }): factory.action.trade.pay.IPayMovieTicketRecipe;
48
+ declare function processSeatInfoSyncResult2refundRecipe(params: {
49
+ processSeatInfoSyncResult?: IProcessSeatInfoSyncResult;
50
+ processSeatInfoSyncCancelResult?: IProcessSeatInfoSyncCancelResult;
51
+ project: {
52
+ id: string;
53
+ };
54
+ action: {
55
+ id: string;
56
+ typeOf: factory.actionType;
57
+ };
58
+ }): factory.action.trade.refund.IRefundMovieTicketRecipe;
59
+ declare enum MovieticketReserveRequestErrorMessage {
60
+ AlreadyPaid = "\u65E2\u306B\u5B58\u5728\u3059\u308B\u8208\u884C\u30B7\u30B9\u30C6\u30E0\u5EA7\u5E2D\u4E88\u7D04\u756A\u53F7\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F\u3002",
61
+ NotFound = "\u5B58\u5728\u3057\u306A\u3044\u8208\u884C\u4F1A\u793E\u30B7\u30B9\u30C6\u30E0\u5EA7\u5E2D\u4E88\u7D04\u756A\u53F7\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F\u3002",
62
+ ReservationResult19 = "ReservationResult 19",
63
+ CancellationPeriodPassed = "\u5EA7\u5E2D\u4E88\u7D04\u53D6\u6D88\u53EF\u80FD\u671F\u9593\u3092\u904E\u304E\u3066\u3044\u307E\u3059\u3002"
64
+ }
65
+ export { createSeatInfoSyncIn, createStartingPayAction, processPurchaseNumberAuthResult2checkRecipe, processSeatInfoSyncResult2payRecipe, processSeatInfoSyncResult2refundRecipe, MovieticketReserveRequestErrorMessage, IProcessPurchaseNumberAuthResult, IProcessSeatInfoSyncResult, IProcessSeatInfoSyncCancelResult };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSeatInfoSyncIn = void 0;
3
+ exports.MovieticketReserveRequestErrorMessage = exports.processSeatInfoSyncResult2refundRecipe = exports.processSeatInfoSyncResult2payRecipe = exports.processPurchaseNumberAuthResult2checkRecipe = exports.createStartingPayAction = exports.createSeatInfoSyncIn = void 0;
4
4
  const surfrock = require("@surfrock/sdk");
5
5
  const moment = require("moment-timezone");
6
6
  const factory = require("../../../factory");
@@ -73,3 +73,116 @@ function createSeatInfoSyncIn(params) {
73
73
  };
74
74
  }
75
75
  exports.createSeatInfoSyncIn = createSeatInfoSyncIn;
76
+ function createStartingPayAction(params, seatInfoSyncIn) {
77
+ const instrument = {
78
+ typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
79
+ seatInfoSyncIn
80
+ };
81
+ return Object.assign(Object.assign({}, params), { object: params.object.map((o) => {
82
+ const movieTicketsWithMaskedAccessCode = (Array.isArray(o.movieTickets))
83
+ ? o.movieTickets.map((movieTicket) => {
84
+ return Object.assign(Object.assign({}, movieTicket), { accessCode: '****' // accessCodeを隠蔽(2023-02-08~)
85
+ });
86
+ })
87
+ : [];
88
+ return Object.assign(Object.assign({}, o), { movieTickets: movieTicketsWithMaskedAccessCode });
89
+ }),
90
+ // アクション開始前にseatInfoSyncInを生成してアクションに保管する
91
+ instrument });
92
+ }
93
+ exports.createStartingPayAction = createStartingPayAction;
94
+ function processPurchaseNumberAuthResult2checkRecipe(params) {
95
+ const { processPurchaseNumberAuthResult, project, action } = params;
96
+ const { purchaseNumberAuthIn, purchaseNumberAuthResult } = processPurchaseNumberAuthResult;
97
+ return {
98
+ project: { id: project.id, typeOf: factory.organizationType.Project },
99
+ typeOf: 'Recipe',
100
+ recipeCategory: factory.recipe.RecipeCategory.checkMovieTicket,
101
+ recipeFor: { id: action.id, typeOf: action.typeOf },
102
+ step: [{
103
+ typeOf: 'HowToSection',
104
+ itemListElement: [
105
+ {
106
+ typeOf: 'HowToStep',
107
+ identifier: factory.recipe.StepIdentifier.purchaseNumberAuth,
108
+ itemListElement: [Object.assign(Object.assign({ typeOf: 'HowToDirection' }, (purchaseNumberAuthIn !== undefined) ? { beforeMedia: purchaseNumberAuthIn } : undefined), (purchaseNumberAuthResult !== undefined) ? { afterMedia: purchaseNumberAuthResult } : undefined)]
109
+ }
110
+ ]
111
+ }]
112
+ };
113
+ }
114
+ exports.processPurchaseNumberAuthResult2checkRecipe = processPurchaseNumberAuthResult2checkRecipe;
115
+ function processSeatInfoSyncResult2payRecipe(params) {
116
+ const { processSeatInfoSyncResult, project, action } = params;
117
+ const { seatInfoSyncIn, seatInfoSyncResult } = processSeatInfoSyncResult;
118
+ return {
119
+ project: { id: project.id, typeOf: factory.organizationType.Project },
120
+ typeOf: 'Recipe',
121
+ recipeCategory: factory.recipe.RecipeCategory.payMovieTicket,
122
+ recipeFor: { id: action.id, typeOf: action.typeOf },
123
+ step: [{
124
+ typeOf: 'HowToSection',
125
+ itemListElement: [
126
+ {
127
+ typeOf: 'HowToStep',
128
+ identifier: factory.recipe.StepIdentifier.seatInfoSync,
129
+ itemListElement: [Object.assign(Object.assign({ typeOf: 'HowToDirection' }, (seatInfoSyncIn !== undefined) ? { beforeMedia: seatInfoSyncIn } : undefined), (seatInfoSyncResult !== undefined) ? { afterMedia: seatInfoSyncResult } : undefined)]
130
+ }
131
+ ]
132
+ }]
133
+ };
134
+ }
135
+ exports.processSeatInfoSyncResult2payRecipe = processSeatInfoSyncResult2payRecipe;
136
+ function processSeatInfoSyncResult2refundRecipe(params) {
137
+ const { processSeatInfoSyncResult, processSeatInfoSyncCancelResult, project, action } = params;
138
+ if (processSeatInfoSyncResult !== undefined) {
139
+ const { seatInfoSyncIn, seatInfoSyncResult } = processSeatInfoSyncResult;
140
+ return {
141
+ project: { id: project.id, typeOf: factory.organizationType.Project },
142
+ typeOf: 'Recipe',
143
+ recipeCategory: factory.recipe.RecipeCategory.refundMovieTicket,
144
+ recipeFor: { id: action.id, typeOf: action.typeOf },
145
+ step: [{
146
+ typeOf: 'HowToSection',
147
+ itemListElement: [
148
+ {
149
+ typeOf: 'HowToStep',
150
+ identifier: factory.recipe.StepIdentifier.seatInfoSync,
151
+ itemListElement: [Object.assign(Object.assign({ typeOf: 'HowToDirection' }, (seatInfoSyncIn !== undefined) ? { beforeMedia: seatInfoSyncIn } : undefined), (seatInfoSyncResult !== undefined) ? { afterMedia: seatInfoSyncResult } : undefined)]
152
+ }
153
+ ]
154
+ }]
155
+ };
156
+ }
157
+ else if (processSeatInfoSyncCancelResult !== undefined) {
158
+ const { seatInfoSyncCancelIn, seatInfoSyncCancelResult } = processSeatInfoSyncCancelResult;
159
+ return {
160
+ project: { id: project.id, typeOf: factory.organizationType.Project },
161
+ typeOf: 'Recipe',
162
+ recipeCategory: factory.recipe.RecipeCategory.refundMovieTicket,
163
+ recipeFor: { id: action.id, typeOf: action.typeOf },
164
+ step: [{
165
+ typeOf: 'HowToSection',
166
+ itemListElement: [
167
+ {
168
+ typeOf: 'HowToStep',
169
+ identifier: factory.recipe.StepIdentifier.seatInfoSyncCancel,
170
+ itemListElement: [Object.assign(Object.assign({ typeOf: 'HowToDirection' }, (seatInfoSyncCancelIn !== undefined) ? { beforeMedia: seatInfoSyncCancelIn } : undefined), (seatInfoSyncCancelResult !== undefined) ? { afterMedia: seatInfoSyncCancelResult } : undefined)]
171
+ }
172
+ ]
173
+ }]
174
+ };
175
+ }
176
+ else {
177
+ throw new factory.errors.ArgumentNull('', 'processSeatInfoSyncResult or processSeatInfoSyncCancelResult required');
178
+ }
179
+ }
180
+ exports.processSeatInfoSyncResult2refundRecipe = processSeatInfoSyncResult2refundRecipe;
181
+ var MovieticketReserveRequestErrorMessage;
182
+ (function (MovieticketReserveRequestErrorMessage) {
183
+ MovieticketReserveRequestErrorMessage["AlreadyPaid"] = "\u65E2\u306B\u5B58\u5728\u3059\u308B\u8208\u884C\u30B7\u30B9\u30C6\u30E0\u5EA7\u5E2D\u4E88\u7D04\u756A\u53F7\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F\u3002";
184
+ MovieticketReserveRequestErrorMessage["NotFound"] = "\u5B58\u5728\u3057\u306A\u3044\u8208\u884C\u4F1A\u793E\u30B7\u30B9\u30C6\u30E0\u5EA7\u5E2D\u4E88\u7D04\u756A\u53F7\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F\u3002";
185
+ MovieticketReserveRequestErrorMessage["ReservationResult19"] = "ReservationResult 19";
186
+ MovieticketReserveRequestErrorMessage["CancellationPeriodPassed"] = "\u5EA7\u5E2D\u4E88\u7D04\u53D6\u6D88\u53EF\u80FD\u671F\u9593\u3092\u904E\u304E\u3066\u3044\u307E\u3059\u3002";
187
+ })(MovieticketReserveRequestErrorMessage || (MovieticketReserveRequestErrorMessage = {}));
188
+ exports.MovieticketReserveRequestErrorMessage = MovieticketReserveRequestErrorMessage;
@@ -0,0 +1,24 @@
1
+ import type { MongoRepository as AccountingReportRepo } from '../../../repo/accountingReport';
2
+ import type { MongoRepository as ActionRepo } from '../../../repo/action';
3
+ import type { MongoRepository as EventRepo } from '../../../repo/event';
4
+ import type { MongoRepository as PaymentServiceRepo } from '../../../repo/paymentService';
5
+ import type { MongoRepository as PaymentServiceProviderRepo } from '../../../repo/paymentServiceProvider';
6
+ import type { MongoRepository as PaymentAcceptedRepo } from '../../../repo/sellerPaymentAccepted';
7
+ import type { MongoRepository as TaskRepo } from '../../../repo/task';
8
+ import * as factory from '../../../factory';
9
+ interface IPayOperationRepos {
10
+ action: ActionRepo;
11
+ accountingReport: AccountingReportRepo;
12
+ event: EventRepo;
13
+ paymentAccepted: PaymentAcceptedRepo;
14
+ paymentService: PaymentServiceRepo;
15
+ paymentServiceProvider: PaymentServiceProviderRepo;
16
+ task: TaskRepo;
17
+ }
18
+ type IPayOperation<T> = (repos: IPayOperationRepos) => Promise<T>;
19
+ type IPayAction = factory.action.trade.pay.IAction;
20
+ /**
21
+ * 決済カード決済
22
+ */
23
+ declare function payMovieTicket(params: factory.action.trade.pay.IAttributes): IPayOperation<IPayAction>;
24
+ export { payMovieTicket };
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.payMovieTicket = void 0;
13
+ const surfrock = require("@surfrock/sdk");
14
+ const http_status_1 = require("http-status");
15
+ const credentials_1 = require("../../../credentials");
16
+ const errorHandler_1 = require("../../../errorHandler");
17
+ const factory = require("../../../factory");
18
+ const onPaid_1 = require("../any/onPaid");
19
+ const factory_1 = require("./factory");
20
+ const getCredentials_1 = require("./getCredentials");
21
+ /**
22
+ * 決済カード決済
23
+ */
24
+ function payMovieTicket(params) {
25
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
26
+ var _a, _b, _c, _d, _e, _f, _g, _h;
27
+ const paymentMethodId = (_a = params.object[0]) === null || _a === void 0 ? void 0 : _a.paymentMethod.paymentMethodId;
28
+ const paymentServiceId = (_b = params.object[0]) === null || _b === void 0 ? void 0 : _b.id;
29
+ const seatInfoSyncIn = yield payActionParams2seatInfoSyncIn(params)(repos);
30
+ const startingAction = (0, factory_1.createStartingPayAction)(params, seatInfoSyncIn);
31
+ let action = yield repos.action.start(startingAction);
32
+ let processSeatInfoSyncResult;
33
+ try {
34
+ // 着券済に対する冪等性を確保する必要はあるが、
35
+ // その他のアクションとしての振る舞いは実行される必要もある
36
+ const completedPayAction = yield repos.action.findPayAction({ project: { id: params.project.id }, paymentMethodId });
37
+ let payRecipe;
38
+ if (completedPayAction !== undefined) {
39
+ payRecipe = yield repos.action.findRecipeByAction({
40
+ project: { id: params.project.id },
41
+ recipeFor: { id: completedPayAction.id }
42
+ });
43
+ }
44
+ // すでに決済済であれば、何もしない(決済開始時の着券)
45
+ // const seatInfoSyncResultFromCompletedAction = completedPayAction?.result?.seatInfoSyncResult;
46
+ const seatInfoSyncResultFromCompletedAction = (_e = (_d = (_c = payRecipe === null || payRecipe === void 0 ? void 0 : payRecipe.step[0]) === null || _c === void 0 ? void 0 : _c.itemListElement[0]) === null || _d === void 0 ? void 0 : _d.itemListElement[0]) === null || _e === void 0 ? void 0 : _e.afterMedia;
47
+ if (seatInfoSyncResultFromCompletedAction !== undefined) {
48
+ processSeatInfoSyncResult = { seatInfoSyncIn, seatInfoSyncResult: seatInfoSyncResultFromCompletedAction };
49
+ }
50
+ else {
51
+ const availableChannel = yield repos.paymentService.findAvailableChannel({
52
+ project: params.project,
53
+ typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
54
+ id: paymentServiceId
55
+ });
56
+ const mvtkReserveAuthClient = new surfrock.auth.ClientCredentials({
57
+ domain: String((_f = availableChannel.credentials) === null || _f === void 0 ? void 0 : _f.authorizeServerDomain),
58
+ clientId: String((_g = availableChannel.credentials) === null || _g === void 0 ? void 0 : _g.clientId),
59
+ clientSecret: String((_h = availableChannel.credentials) === null || _h === void 0 ? void 0 : _h.clientSecret),
60
+ scopes: [],
61
+ state: ''
62
+ });
63
+ const seatService = new surfrock.service.seat.SeatService({ endpoint: String(availableChannel.serviceUrl), auth: mvtkReserveAuthClient }, { timeout: credentials_1.credentials.movieticketReserve.timeout });
64
+ processSeatInfoSyncResult = yield processSeatInfoSync({ seatInfoSyncIn })({ seatService });
65
+ }
66
+ // add recipe(2024-06-03~)
67
+ yield repos.action.saveOneRecipe((0, factory_1.processSeatInfoSyncResult2payRecipe)({
68
+ processSeatInfoSyncResult,
69
+ project: { id: params.project.id },
70
+ action: { id: action.id, typeOf: action.typeOf }
71
+ }));
72
+ }
73
+ catch (error) {
74
+ // アクション保管用のエラーと両方保管(2024-05-22~)
75
+ const errors = [(0, errorHandler_1.handleMvtkReserveError)(error), error];
76
+ try {
77
+ yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error: errors });
78
+ }
79
+ catch (__) {
80
+ // 失敗したら仕方ない
81
+ }
82
+ throw errors;
83
+ }
84
+ const seatInfoSyncResult = processSeatInfoSyncResult.seatInfoSyncResult;
85
+ const result = Object.assign({}, (seatInfoSyncResult !== undefined
86
+ && seatInfoSyncResult.zskyykResult !== undefined)
87
+ ? { seatInfoSyncResult: seatInfoSyncResult }
88
+ : undefined);
89
+ action = (yield repos.action.complete({ typeOf: action.typeOf, id: action.id, result }));
90
+ yield (0, onPaid_1.onPaid)(action)(repos);
91
+ return action;
92
+ });
93
+ }
94
+ exports.payMovieTicket = payMovieTicket;
95
+ function payActionParams2seatInfoSyncIn(params) {
96
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
97
+ var _a, _b, _c, _d;
98
+ const paymentMethodType = (_a = params.object[0]) === null || _a === void 0 ? void 0 : _a.paymentMethod.typeOf;
99
+ const paymentMethodId = (_b = params.object[0]) === null || _b === void 0 ? void 0 : _b.paymentMethod.paymentMethodId;
100
+ const paymentServiceId = (_c = params.object[0]) === null || _c === void 0 ? void 0 : _c.id;
101
+ // イベントがひとつに特定されているかどうか確認
102
+ const eventIds = [...new Set(params.object.reduce((a, b) => [
103
+ ...a,
104
+ ...(Array.isArray(b.movieTickets)) ? b.movieTickets.map((ticket) => ticket.serviceOutput.reservationFor.id) : []
105
+ ], []))];
106
+ if (eventIds.length !== 1) {
107
+ throw new factory.errors.Argument('movieTickets', 'Number of events must be 1');
108
+ }
109
+ // イベント取得属性最適化(2023-01-23~)
110
+ const event = yield repos.event.findMinimizedIndividualEventById({ id: eventIds[0] });
111
+ const sellerId = String((_d = params.recipient) === null || _d === void 0 ? void 0 : _d.id);
112
+ // 全購入管理番号のMovieTicketをマージ
113
+ const movieTickets = params.object.reduce((a, b) => [...a, ...(Array.isArray(b.movieTickets)) ? b.movieTickets : []], []);
114
+ const sellerCredentials = yield (0, getCredentials_1.getCredentials)({
115
+ seller: { id: sellerId, project: { id: event.project.id } },
116
+ paymentServiceId
117
+ })(repos);
118
+ const paymentAccepted = yield repos.paymentAccepted.isAcceptedBySeller({
119
+ seller: { id: sellerId },
120
+ codeValue: paymentMethodType
121
+ });
122
+ if (paymentAccepted !== true) {
123
+ throw new factory.errors.Argument('transactionId', `payment not accepted [${paymentMethodType}]`);
124
+ }
125
+ return (0, factory_1.createSeatInfoSyncIn)({
126
+ paymentMethodType: paymentMethodType,
127
+ paymentMethodId: paymentMethodId,
128
+ movieTickets: movieTickets,
129
+ event: event,
130
+ purpose: params.purpose,
131
+ credentials: sellerCredentials
132
+ });
133
+ });
134
+ }
135
+ function processSeatInfoSync(params) {
136
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
137
+ let seatInfoSyncResult;
138
+ const { seatInfoSyncIn } = params;
139
+ try {
140
+ seatInfoSyncResult = yield repos.seatService.seatInfoSync(seatInfoSyncIn);
141
+ }
142
+ catch (error) {
143
+ let throwsError = true;
144
+ // 「既に存在する興行システム座席予約番号が入力されました」の場合、着券済なのでok
145
+ if (error.name === errorHandler_1.MOVIE_TICKET_RESERVE_REQUEST_ERROR_NAME) {
146
+ if (error.code === http_status_1.BAD_REQUEST && error.message === factory_1.MovieticketReserveRequestErrorMessage.AlreadyPaid) {
147
+ seatInfoSyncResult = error;
148
+ throwsError = false;
149
+ }
150
+ }
151
+ if (throwsError) {
152
+ throw error;
153
+ }
154
+ }
155
+ return { seatInfoSyncIn, seatInfoSyncResult };
156
+ });
157
+ }
@@ -8,15 +8,14 @@ interface ICheckResult {
8
8
  }
9
9
  interface ICheckByIdentifierParams {
10
10
  movieTickets: factory.action.check.paymentMethod.movieTicket.IMovieTicket[];
11
- seller: Pick<factory.seller.ISeller, 'id' | 'project'>;
11
+ seller: {
12
+ id: string;
13
+ };
12
14
  screeningEvent: IMinimizedIndividualEvent<factory.eventType.ScreeningEvent>;
13
15
  paymentServiceId: string;
14
16
  }
15
- /**
16
- * MovieTicket認証
17
- */
18
- declare function checkByIdentifier(params: ICheckByIdentifierParams): (repos: {
17
+ declare function processPurchaseNumberAuth(params: ICheckByIdentifierParams): (repos: {
19
18
  paymentService: PaymentServiceRepo;
20
19
  paymentServiceProvider: PaymentServiceProviderRepo;
21
20
  }) => Promise<ICheckResult>;
22
- export { ICheckByIdentifierParams, ICheckResult, checkByIdentifier };
21
+ export { ICheckByIdentifierParams, ICheckResult, processPurchaseNumberAuth };