@chevre/domain 23.1.0-alpha.2 → 23.1.0-alpha.20

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 (66) hide show
  1. package/example/src/chevre/assetTransaction/processReserve.ts +8 -3
  2. package/example/src/chevre/authorizeEventServiceOffer.ts +7 -5
  3. package/example/src/chevre/eventOffer/adminEventOffers.ts +67 -0
  4. package/example/src/chevre/eventOffer/publishEventOfferToken.ts +98 -0
  5. package/example/src/chevre/member/migrateMemberIdentifier.ts +99 -0
  6. package/example/src/chevre/project/unsetProjectSettings.ts +67 -0
  7. package/example/src/chevre/reIndex.ts +2 -2
  8. package/lib/chevre/repo/authorization.d.ts +3 -2
  9. package/lib/chevre/repo/authorization.js +13 -5
  10. package/lib/chevre/repo/event.d.ts +2 -1
  11. package/lib/chevre/repo/event.js +4 -4
  12. package/lib/chevre/repo/eventOffer.d.ts +1 -1
  13. package/lib/chevre/repo/eventOffer.js +14 -8
  14. package/lib/chevre/repo/member.d.ts +18 -1
  15. package/lib/chevre/repo/member.js +14 -8
  16. package/lib/chevre/repo/mongoose/schemas/eventOffer.js +39 -35
  17. package/lib/chevre/repo/mongoose/schemas/member.js +10 -0
  18. package/lib/chevre/service/assetTransaction/pay/factory.js +8 -3
  19. package/lib/chevre/service/assetTransaction/pay.d.ts +1 -0
  20. package/lib/chevre/service/assetTransaction/pay.js +1 -1
  21. package/lib/chevre/service/assetTransaction/reserve/start.d.ts +6 -0
  22. package/lib/chevre/service/assetTransaction/reserve/start.js +5 -1
  23. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/fixExtendedEventOffer.d.ts +22 -0
  24. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/fixExtendedEventOffer.js +63 -0
  25. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateIssuedOfferIfExists.d.ts +7 -2
  26. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateIssuedOfferIfExists.js +32 -32
  27. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateMemberTierIfExists.d.ts +1 -1
  28. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/validateMemberTierIfExists.js +10 -54
  29. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/verifyTicketTokenAsNeeded.d.ts +23 -0
  30. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest/verifyTicketTokenAsNeeded.js +62 -0
  31. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest.d.ts +36 -1
  32. package/lib/chevre/service/assetTransaction/reserve/validateStartRequest.js +23 -27
  33. package/lib/chevre/service/offer/event/authorize/factory.d.ts +0 -3
  34. package/lib/chevre/service/offer/event/authorize/factory.js +4 -3
  35. package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre/requestedProgramMembershipUsed2permit.js +42 -25
  36. package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.d.ts +4 -0
  37. package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.js +4 -4
  38. package/lib/chevre/service/offer/event/authorize.d.ts +3 -0
  39. package/lib/chevre/service/offer/event/authorize.js +10 -5
  40. package/lib/chevre/service/offer/event/issueEventOfferTicket.d.ts +48 -0
  41. package/lib/chevre/service/offer/event/issueEventOfferTicket.js +123 -0
  42. package/lib/chevre/service/offer/event.d.ts +2 -1
  43. package/lib/chevre/service/offer/event.js +3 -1
  44. package/lib/chevre/service/payment/any/authorize/fixTransactionNumber.d.ts +5 -0
  45. package/lib/chevre/service/payment/any/authorize/fixTransactionNumber.js +18 -11
  46. package/lib/chevre/service/payment/any/authorize/handlePrePublishedPaymentMethodIdOnAuthorizing.d.ts +19 -2
  47. package/lib/chevre/service/payment/any/authorize/handlePrePublishedPaymentMethodIdOnAuthorizing.js +87 -9
  48. package/lib/chevre/service/payment/any/factory.d.ts +14 -1
  49. package/lib/chevre/service/payment/any/factory.js +22 -5
  50. package/lib/chevre/service/payment/any/publishPaymentUrl/fixTransactionNumberOnPublishPaymentUrl.d.ts +4 -0
  51. package/lib/chevre/service/payment/any/publishPaymentUrl/fixTransactionNumberOnPublishPaymentUrl.js +15 -11
  52. package/lib/chevre/service/payment/any/verifyTicketTokenAsNeeded.d.ts +6 -3
  53. package/lib/chevre/service/payment/any/verifyTicketTokenAsNeeded.js +19 -27
  54. package/lib/chevre/service/payment/any.d.ts +1 -1
  55. package/lib/chevre/service/payment/any.js +20 -12
  56. package/lib/chevre/service/transaction/placeOrder/confirm/publishCode.js +1 -1
  57. package/lib/chevre/service/transaction/placeOrder/confirm/validation/factory.d.ts +9 -0
  58. package/lib/chevre/service/transaction/placeOrder/confirm/validation/factory.js +2 -0
  59. package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateInvoiceReferencesOrder.d.ts +8 -0
  60. package/lib/chevre/service/transaction/placeOrder/confirm/validation/validateInvoiceReferencesOrder.js +45 -0
  61. package/lib/chevre/service/transaction/placeOrder/confirm/validation/validatePrice.d.ts +3 -0
  62. package/lib/chevre/service/transaction/placeOrder/confirm/validation/validatePrice.js +38 -0
  63. package/lib/chevre/service/transaction/placeOrder/confirm/validation.d.ts +2 -8
  64. package/lib/chevre/service/transaction/placeOrder/confirm/validation.js +5 -35
  65. package/package.json +3 -3
  66. package/example/src/chevre/upsertManyEventsByAdditionalProperty.ts +0 -193
@@ -0,0 +1,48 @@
1
+ import * as factory from '../../../factory';
2
+ import type { ActionRepo } from '../../../repo/action';
3
+ import type { AuthorizationRepo } from '../../../repo/authorization';
4
+ import type { EventRepo } from '../../../repo/event';
5
+ import type { EventOfferRepo } from '../../../repo/eventOffer';
6
+ import type { IssuerRepo } from '../../../repo/issuer';
7
+ import type { MemberRepo } from '../../../repo/member';
8
+ import type { MemberProgramRepo } from '../../../repo/memberProgram';
9
+ import type { ProductOfferRepo } from '../../../repo/productOffer';
10
+ import type { TicketRepo } from '../../../repo/ticket';
11
+ import type { TransactionRepo } from '../../../repo/transaction';
12
+ declare function issueEventOfferTicket(params: {
13
+ now: Date;
14
+ audience: Pick<factory.action.authorize.offer.eventService.IPurpose, 'id'>;
15
+ /**
16
+ * イベントID
17
+ */
18
+ eventId: string;
19
+ /**
20
+ * 拡張イベントオファーID
21
+ */
22
+ eventOfferId?: string;
23
+ ticketedOffer?: Pick<factory.authorization.IOfferAsObject, 'token' | 'validForMemberTier'>;
24
+ author: Pick<factory.authorization.IAuthor, 'id' | 'typeOf'>;
25
+ project: {
26
+ id: string;
27
+ };
28
+ instrument: {
29
+ /**
30
+ * アプリケーションID
31
+ */
32
+ id: string;
33
+ };
34
+ }): (repos: {
35
+ action: ActionRepo;
36
+ authorization: AuthorizationRepo;
37
+ event: EventRepo;
38
+ eventOffer: EventOfferRepo;
39
+ issuer: IssuerRepo;
40
+ member: MemberRepo;
41
+ memberProgram: MemberProgramRepo;
42
+ productOffer: ProductOfferRepo;
43
+ ticket: TicketRepo;
44
+ transaction: TransactionRepo;
45
+ }) => Promise<{
46
+ ticketToken: string;
47
+ }>;
48
+ export { issueEventOfferTicket };
@@ -0,0 +1,123 @@
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.issueEventOfferTicket = issueEventOfferTicket;
13
+ const moment = require("moment");
14
+ const factory = require("../../../factory");
15
+ const validateStartRequest_1 = require("../../assetTransaction/reserve/validateStartRequest");
16
+ function createOfferTicket(params) {
17
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
18
+ var _a;
19
+ const { audience, expiresInSeconds, issuedBy, object, validFrom, author, project, instrument } = params;
20
+ const actionAttributes = {
21
+ project: { id: project.id, typeOf: factory.organizationType.Project },
22
+ typeOf: factory.actionType.AuthorizeAction,
23
+ agent: author,
24
+ recipient: author,
25
+ object: [object],
26
+ instrument: {
27
+ typeOf: factory.creativeWorkType.WebApplication,
28
+ id: instrument.id
29
+ }
30
+ };
31
+ const action = yield repos.action.start(actionAttributes);
32
+ let authorizations;
33
+ try {
34
+ authorizations = yield repos.authorization.issueAuthorization([{
35
+ project: { id: project.id, typeOf: factory.organizationType.Project },
36
+ object,
37
+ validFrom,
38
+ expiresInSeconds,
39
+ author,
40
+ issuedBy,
41
+ audience
42
+ }]);
43
+ }
44
+ catch (error) {
45
+ try {
46
+ yield repos.action.giveUp({ typeOf: action.typeOf, id: action.id, error });
47
+ }
48
+ catch (__) {
49
+ // 失敗したら仕方ない
50
+ }
51
+ throw error;
52
+ }
53
+ const result = authorizations.map(({ code, typeOf }) => ({ code, typeOf }));
54
+ yield repos.action.completeWithVoid({ typeOf: action.typeOf, id: action.id, result: result });
55
+ const ticketToken = (_a = authorizations.shift()) === null || _a === void 0 ? void 0 : _a.code;
56
+ if (typeof ticketToken !== 'string') {
57
+ // 基本的にありえないフロー
58
+ throw new factory.errors.Internal('code not published by an unexpected reason');
59
+ }
60
+ // チケット作成
61
+ yield repos.ticket.issueByTicketToken({
62
+ project: { id: project.id },
63
+ ticketToken,
64
+ issuedBy
65
+ });
66
+ return { ticketToken };
67
+ });
68
+ }
69
+ function issueEventOfferTicket(params) {
70
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
71
+ var _a, _b;
72
+ const { now, audience, eventId, eventOfferId, ticketedOffer, author, project, instrument } = params;
73
+ // 取引は存在するか
74
+ const transaction = yield repos.transaction.projectFieldsInProgressById({ typeOf: factory.transactionType.PlaceOrder, id: audience.id }, ['expires', 'typeOf', 'seller']);
75
+ // イベントは存在するか
76
+ const event = yield repos.event.projectEventFieldsById({ id: eventId }, ['project', 'offers', 'identifier']);
77
+ // 取引番号発行
78
+ // const { transactionNumber } = await transactionNumberRepo.publishByTimestamp({ startDate: now });
79
+ const { seller } = transaction;
80
+ // 承認作成
81
+ const issuedBy = Object.assign({ id: seller.id, typeOf: seller.typeOf }, (typeof seller.name.ja === 'string') ? { name: seller.name.ja } : undefined);
82
+ const validForMemberTierToken = (_a = ticketedOffer === null || ticketedOffer === void 0 ? void 0 : ticketedOffer.validForMemberTier) === null || _a === void 0 ? void 0 : _a.token;
83
+ const validForMemberProgramIdentifier = (_b = ticketedOffer === null || ticketedOffer === void 0 ? void 0 : ticketedOffer.validForMemberTier) === null || _b === void 0 ? void 0 : _b.isTierOf.identifier;
84
+ const authorizationObject = Object.assign(Object.assign(Object.assign({ typeOf: factory.offerType.Offer, itemOffered: {
85
+ typeOf: factory.product.ProductType.EventService,
86
+ serviceOutput: {
87
+ typeOf: factory.reservationType.ReservationPackage,
88
+ reservationFor: { id: eventId }
89
+ }
90
+ } }, (typeof eventOfferId === 'string' && eventOfferId !== '') ? { id: eventOfferId } : undefined), (typeof (ticketedOffer === null || ticketedOffer === void 0 ? void 0 : ticketedOffer.token) === 'string' && ticketedOffer.token !== '')
91
+ ? { token: ticketedOffer.token }
92
+ : undefined), (typeof validForMemberTierToken === 'string' && validForMemberTierToken !== ''
93
+ && typeof validForMemberProgramIdentifier === 'string' && validForMemberProgramIdentifier !== '')
94
+ ? {
95
+ validForMemberTier: {
96
+ token: validForMemberTierToken,
97
+ isTierOf: { identifier: validForMemberProgramIdentifier }
98
+ }
99
+ }
100
+ : undefined);
101
+ // validations(eventId,eventOfferIdentifier,offerToken...)
102
+ yield (0, validateStartRequest_1.validEventOfferByApplicationExists)({
103
+ event,
104
+ now,
105
+ availableAt: { id: instrument.id },
106
+ acceptedEventOffer: authorizationObject,
107
+ numAcceptedOffers: 0 // オファーチケット発行時は予約数を検証しないので0でok
108
+ })(repos);
109
+ const expiresInSeconds = moment(transaction.expires)
110
+ .diff(now, 'seconds');
111
+ const { ticketToken } = yield createOfferTicket({
112
+ object: authorizationObject,
113
+ validFrom: now,
114
+ expiresInSeconds,
115
+ issuedBy,
116
+ audience: { id: transaction.id, typeOf: transaction.typeOf },
117
+ author,
118
+ project,
119
+ instrument
120
+ })(repos);
121
+ return { ticketToken };
122
+ });
123
+ }
@@ -1,8 +1,9 @@
1
1
  import { authorize } from './event/authorize';
2
2
  import { importCategoryCodesFromCOA, importFromCOA } from './event/importFromCOA';
3
+ import { issueEventOfferTicket } from './event/issueEventOfferTicket';
3
4
  import { searchEventTicketOffers } from './event/searchEventTicketOffers';
4
5
  import { searchOfferAppliesToMovieTicket } from './event/searchOfferAppliesToMovieTicket';
5
6
  import { searchOfferCatalogItemAvailability } from './event/searchOfferCatalogItemAvailability';
6
7
  import { searchOfferCatalogItems } from './event/searchOfferCatalogItems';
7
8
  import { voidTransaction } from './event/voidTransaction';
8
- export { authorize, importCategoryCodesFromCOA, importFromCOA, voidTransaction, searchEventTicketOffers, searchOfferAppliesToMovieTicket, searchOfferCatalogItemAvailability, searchOfferCatalogItems };
9
+ export { authorize, importCategoryCodesFromCOA, importFromCOA, issueEventOfferTicket, voidTransaction, searchEventTicketOffers, searchOfferAppliesToMovieTicket, searchOfferCatalogItemAvailability, searchOfferCatalogItems };
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.searchOfferCatalogItems = exports.searchOfferCatalogItemAvailability = exports.searchOfferAppliesToMovieTicket = exports.searchEventTicketOffers = exports.voidTransaction = exports.importFromCOA = exports.importCategoryCodesFromCOA = exports.authorize = void 0;
3
+ exports.searchOfferCatalogItems = exports.searchOfferCatalogItemAvailability = exports.searchOfferAppliesToMovieTicket = exports.searchEventTicketOffers = exports.voidTransaction = exports.issueEventOfferTicket = exports.importFromCOA = exports.importCategoryCodesFromCOA = exports.authorize = void 0;
4
4
  const authorize_1 = require("./event/authorize");
5
5
  Object.defineProperty(exports, "authorize", { enumerable: true, get: function () { return authorize_1.authorize; } });
6
6
  const importFromCOA_1 = require("./event/importFromCOA");
7
7
  Object.defineProperty(exports, "importCategoryCodesFromCOA", { enumerable: true, get: function () { return importFromCOA_1.importCategoryCodesFromCOA; } });
8
8
  Object.defineProperty(exports, "importFromCOA", { enumerable: true, get: function () { return importFromCOA_1.importFromCOA; } });
9
+ const issueEventOfferTicket_1 = require("./event/issueEventOfferTicket");
10
+ Object.defineProperty(exports, "issueEventOfferTicket", { enumerable: true, get: function () { return issueEventOfferTicket_1.issueEventOfferTicket; } });
9
11
  const searchEventTicketOffers_1 = require("./event/searchEventTicketOffers");
10
12
  Object.defineProperty(exports, "searchEventTicketOffers", { enumerable: true, get: function () { return searchEventTicketOffers_1.searchEventTicketOffers; } });
11
13
  const searchOfferAppliesToMovieTicket_1 = require("./event/searchOfferAppliesToMovieTicket");
@@ -5,6 +5,7 @@ import type { TicketRepo } from '../../../../repo/ticket';
5
5
  import type { ITransactionInProgress, TransactionRepo } from '../../../../repo/transaction';
6
6
  import type { TransactionNumberRepo } from '../../../../repo/transactionNumber';
7
7
  import * as PayTransactionService from '../../../assetTransaction/pay';
8
+ import { IInvoiceByTicketToken } from '../factory';
8
9
  interface IFixTransactionNumberRepos {
9
10
  action: ActionRepo;
10
11
  authorization: AuthorizationRepo;
@@ -27,6 +28,10 @@ declare function fixTransactionNumber(params: {
27
28
  transactionNumber: string;
28
29
  pendingPaymentAgencyTransaction?: PayTransactionService.IPaymentAgencyTransaction;
29
30
  creditCard?: factory.action.authorize.paymentMethod.any.ICreditCard;
31
+ /**
32
+ * 承認時に指定のチケット、あるいは、決済採用時に指定のチケット
33
+ */
34
+ invoiceByTicketToken?: IInvoiceByTicketToken;
30
35
  permitOrInvoice?: never;
31
36
  id?: never;
32
37
  } | {
@@ -18,13 +18,15 @@ const handlePrePublishedPaymentMethodIdOnAuthorizing_1 = require("./handlePrePub
18
18
  */
19
19
  function fixTransactionNumber(params) {
20
20
  return (repos) => __awaiter(this, void 0, void 0, function* () {
21
+ var _a, _b, _c, _d, _e, _f;
21
22
  const { paymentServiceType, transaction, object } = params;
22
23
  // 取引番号生成
23
24
  let transactionNumber;
24
25
  let pendingPaymentAgencyTransaction;
25
26
  let creditCard = object.creditCard;
27
+ let invoiceByTicketToken;
26
28
  // ticketTokenを解釈(2024-08-13~)
27
- const { permitOrInvoice } = yield (0, verifyTicketTokenAsNeeded_1.verifyTicketTokenAsNeeded)({
29
+ const { verifyPaymentMethodTicketResult } = yield (0, verifyTicketTokenAsNeeded_1.verifyTicketTokenAsNeeded)({
28
30
  project: { id: transaction.project.id },
29
31
  object: object,
30
32
  paymentServiceType,
@@ -34,18 +36,20 @@ function fixTransactionNumber(params) {
34
36
  * ticketTokenによって指定された決済方法ID
35
37
  */
36
38
  let paymentMethodIdByTicketToken;
37
- if ((permitOrInvoice === null || permitOrInvoice === void 0 ? void 0 : permitOrInvoice.typeOf) === factory.permit.PermitType.Permit) {
38
- paymentMethodIdByTicketToken = permitOrInvoice === null || permitOrInvoice === void 0 ? void 0 : permitOrInvoice.identifier;
39
- if (typeof paymentMethodIdByTicketToken === 'string') {
40
- transactionNumber = paymentMethodIdByTicketToken; // メンバーシップ指定の場合、取引番号に適用(2024-08-13~)
41
- }
39
+ if (((_a = verifyPaymentMethodTicketResult === null || verifyPaymentMethodTicketResult === void 0 ? void 0 : verifyPaymentMethodTicketResult.invoiceByTicketToken) === null || _a === void 0 ? void 0 : _a.typeOf) === factory.permit.PermitType.Permit) {
40
+ throw new factory.errors.Argument('ticketToken', `typeOfGood.typeOf ${(_b = verifyPaymentMethodTicketResult === null || verifyPaymentMethodTicketResult === void 0 ? void 0 : verifyPaymentMethodTicketResult.invoiceByTicketToken) === null || _b === void 0 ? void 0 : _b.typeOf} discontinued`);
41
+ // paymentMethodIdByTicketToken = permitOrInvoice?.identifier;
42
+ // if (typeof paymentMethodIdByTicketToken === 'string') {
43
+ // transactionNumber = paymentMethodIdByTicketToken; // メンバーシップ指定の場合、取引番号に適用(2024-08-13~)
44
+ // }
42
45
  }
43
- else if ((permitOrInvoice === null || permitOrInvoice === void 0 ? void 0 : permitOrInvoice.typeOf) === 'Invoice') {
46
+ else if (((_c = verifyPaymentMethodTicketResult === null || verifyPaymentMethodTicketResult === void 0 ? void 0 : verifyPaymentMethodTicketResult.invoiceByTicketToken) === null || _c === void 0 ? void 0 : _c.typeOf) === 'Invoice') {
44
47
  // support paymentServiceType.MovieTicket(2024-11-23~)
45
- if (typeof (permitOrInvoice === null || permitOrInvoice === void 0 ? void 0 : permitOrInvoice.paymentMethodId) === 'string') {
46
- paymentMethodIdByTicketToken = permitOrInvoice === null || permitOrInvoice === void 0 ? void 0 : permitOrInvoice.paymentMethodId;
48
+ if (typeof ((_d = verifyPaymentMethodTicketResult.invoiceByTicketToken) === null || _d === void 0 ? void 0 : _d.paymentMethodId) === 'string') {
49
+ paymentMethodIdByTicketToken = (_e = verifyPaymentMethodTicketResult.invoiceByTicketToken) === null || _e === void 0 ? void 0 : _e.paymentMethodId;
47
50
  if (typeof paymentMethodIdByTicketToken === 'string') {
48
51
  transactionNumber = paymentMethodIdByTicketToken;
52
+ invoiceByTicketToken = verifyPaymentMethodTicketResult.invoiceByTicketToken;
49
53
  }
50
54
  }
51
55
  }
@@ -63,14 +67,17 @@ function fixTransactionNumber(params) {
63
67
  transaction
64
68
  })(repos);
65
69
  if (existingCompletedAuthorizeAction !== undefined) {
70
+ // 既に承認済であれば何もしない
66
71
  return { id: existingCompletedAuthorizeAction.id };
67
72
  }
68
73
  else if (authorizeParams !== undefined) {
69
74
  // creditCardを決済URL発行時の情報で上書き(2024-01-08~)
70
- // creditCard = authorizeParams.paymentMethodByTransaction.paymentMethod?.creditCard;
71
75
  creditCard = authorizeParams.creditCard;
72
76
  transactionNumber = object.paymentMethodId;
73
77
  pendingPaymentAgencyTransaction = authorizeParams.pendingPaymentAgencyTransaction;
78
+ if (typeof ((_f = authorizeParams.acceptAction2ticketResult) === null || _f === void 0 ? void 0 : _f.ticketToken) === 'string') {
79
+ invoiceByTicketToken = authorizeParams.acceptAction2ticketResult.invoiceByTicketToken;
80
+ }
74
81
  }
75
82
  else {
76
83
  throw new factory.errors.NotImplemented('pendingPaymentAgencyTransaction required on paymentMethodId specified');
@@ -81,7 +88,7 @@ function fixTransactionNumber(params) {
81
88
  const publishTransactionNumberResult = yield repos.transactionNumber.publishByTimestamp({ startDate: new Date() });
82
89
  transactionNumber = publishTransactionNumberResult.transactionNumber;
83
90
  }
84
- return Object.assign(Object.assign({ transactionNumber }, (pendingPaymentAgencyTransaction !== undefined) ? { pendingPaymentAgencyTransaction } : undefined), (creditCard !== undefined) ? { creditCard } : undefined
91
+ return Object.assign(Object.assign(Object.assign({ transactionNumber }, (pendingPaymentAgencyTransaction !== undefined) ? { pendingPaymentAgencyTransaction } : undefined), (creditCard !== undefined) ? { creditCard } : undefined), (invoiceByTicketToken !== undefined) ? { invoiceByTicketToken } : undefined
85
92
  // ...(permitOrInvoice !== undefined) ? { permitOrInvoice } : undefined
86
93
  );
87
94
  });
@@ -1,23 +1,40 @@
1
1
  import * as factory from '../../../../factory';
2
2
  import type { ActionRepo } from '../../../../repo/action';
3
+ import type { AuthorizationRepo } from '../../../../repo/authorization';
4
+ import type { TicketRepo } from '../../../../repo/ticket';
3
5
  import type { ITransactionInProgress, TransactionRepo } from '../../../../repo/transaction';
4
6
  import * as PayTransactionService from '../../../assetTransaction/pay';
7
+ import type { IInvoiceByTicketToken } from '../factory';
5
8
  type IObjectWithoutDetail = factory.action.authorize.paymentMethod.any.IObjectWithoutDetail;
9
+ interface IAcceptAction2ticketResult {
10
+ invoiceByTicketToken: IInvoiceByTicketToken;
11
+ ticketToken: string;
12
+ }
13
+ /**
14
+ * 決済承認前の決済採用アクションを参照する
15
+ */
6
16
  declare function handlePrePublishedPaymentMethodIdOnAuthorizing(params: {
7
- object: Pick<IObjectWithoutDetail, 'amount' | 'issuedThrough' | 'paymentMethod'>;
17
+ object: Pick<IObjectWithoutDetail, 'amount' | 'issuedThrough' | 'paymentMethod' | 'referencesOrder'>;
8
18
  prePublishedPaymentMethodId: string;
9
19
  transaction: Pick<ITransactionInProgress<factory.transactionType.PlaceOrder>, 'agent' | 'expires' | 'id' | 'typeOf' | 'project' | 'seller'>;
10
20
  }): (repos: {
11
21
  action: ActionRepo;
22
+ authorization: AuthorizationRepo;
23
+ ticket: TicketRepo;
12
24
  transaction: TransactionRepo;
13
25
  }) => Promise<{
14
26
  authorizeParams?: {
15
27
  creditCard: factory.action.authorize.paymentMethod.any.ICreditCard;
16
28
  paymentMethodByTransaction: factory.transaction.placeOrder.IPaymentMethodByPaymentUrl;
17
29
  pendingPaymentAgencyTransaction: PayTransactionService.IPaymentAgencyTransaction;
30
+ acceptAction2ticketResult?: IAcceptAction2ticketResult;
18
31
  };
19
- existingCompletedAuthorizeAction?: {
32
+ existingCompletedAuthorizeAction?: never;
33
+ } | {
34
+ existingCompletedAuthorizeAction: {
20
35
  id: string;
21
36
  };
37
+ authorizeParams?: never;
38
+ acceptAction2ticketResult?: never;
22
39
  }>;
23
40
  export { handlePrePublishedPaymentMethodIdOnAuthorizing };
@@ -47,17 +47,73 @@ function recipe2paymentAgencyTransaction(actionRecipe) {
47
47
  }
48
48
  return { entryTranArgs, entryTranResult, execTranArgs, execTranResult };
49
49
  }
50
+ /**
51
+ * 決済採用アクションから決済方法チケットを参照する
52
+ */
53
+ function acceptAction2ticket(params) {
54
+ // tslint:disable-next-line:cyclomatic-complexity
55
+ return (repos) => __awaiter(this, void 0, void 0, function* () {
56
+ var _a, _b;
57
+ const { acceptPayAction, project } = params;
58
+ const ticketToken = (_b = (_a = acceptPayAction.instrument) === null || _a === void 0 ? void 0 : _a.find((ticketAsInstrument) => ticketAsInstrument.typeOf === 'Ticket')) === null || _b === void 0 ? void 0 : _b.ticketToken;
59
+ let acceptAction2ticketResult;
60
+ if (typeof ticketToken === 'string' && ticketToken !== '') {
61
+ const ticket = (yield repos.ticket.projectFields({
62
+ limit: 1,
63
+ page: 1,
64
+ project: { id: { $eq: project.id } },
65
+ ticketToken: { $eq: ticketToken }
66
+ }, ['ticketToken'])).shift();
67
+ if (ticket === undefined) {
68
+ throw new factory.errors.NotFound('Ticket');
69
+ }
70
+ // 承認を参照
71
+ const validAuthorization = yield repos.authorization.findValidOneByCode({
72
+ project: { id: params.project.id },
73
+ code: ticket.ticketToken
74
+ });
75
+ const authorizedObject = validAuthorization.object;
76
+ if (authorizedObject.typeOf === 'OwnershipInfo') {
77
+ const { typeOfGood } = authorizedObject;
78
+ if (typeOfGood.typeOf === factory.service.paymentService.PaymentServiceType.CreditCard
79
+ || typeOfGood.typeOf === factory.service.paymentService.PaymentServiceType.MovieTicket
80
+ || typeOfGood.typeOf === factory.service.paymentService.PaymentServiceType.FaceToFace) {
81
+ if (acceptPayAction.object.transactionNumber !== typeOfGood.serviceOutput.paymentMethodId) {
82
+ // 念のため決済方法IDの一致検証
83
+ throw new factory.errors.Internal('acceptPayAction.object.transactionNumber must be the same as typeOfGood.serviceOutput.paymentMethodId');
84
+ }
85
+ acceptAction2ticketResult = {
86
+ invoiceByTicketToken: typeOfGood.serviceOutput,
87
+ ticketToken
88
+ };
89
+ }
90
+ else {
91
+ throw new factory.errors.Argument('ticketToken', `invalid typeOfGood.typeOf ${typeOfGood.typeOf}`);
92
+ }
93
+ }
94
+ else {
95
+ throw new factory.errors.Argument('ticketToken', 'must be OwnershipInfo');
96
+ }
97
+ }
98
+ return { acceptAction2ticketResult };
99
+ });
100
+ }
101
+ /**
102
+ * 決済承認前の決済採用アクションを参照する
103
+ */
104
+ // tslint:disable-next-line:max-func-body-length
50
105
  function handlePrePublishedPaymentMethodIdOnAuthorizing(params) {
51
106
  return (repos) => __awaiter(this, void 0, void 0, function* () {
52
107
  let creditCard;
53
108
  let pendingPaymentAgencyTransaction;
54
109
  let existingCompletedAuthorizeAction;
110
+ let acceptPayAction;
55
111
  // transaction.objectへのアクセス回避(2024-05-30~)
56
112
  // const paymentMethodByTransaction = transaction.object.paymentMethods;
57
113
  const paymentMethodByTransaction = yield repos.transaction.findInProgressPaymentMethodId({ id: params.transaction.id });
58
114
  if (params.prePublishedPaymentMethodId === (paymentMethodByTransaction === null || paymentMethodByTransaction === void 0 ? void 0 : paymentMethodByTransaction.paymentMethodId)) {
59
115
  // check existence of acceptAction when authorizing payment(2024-06-01~)
60
- const acceptPayAction = (yield repos.action.search({
116
+ acceptPayAction = (yield repos.action.search({
61
117
  limit: 1,
62
118
  page: 1,
63
119
  project: { id: { $eq: params.transaction.project.id } },
@@ -68,7 +124,7 @@ function handlePrePublishedPaymentMethodIdOnAuthorizing(params) {
68
124
  transactionNumber: { $eq: params.prePublishedPaymentMethodId },
69
125
  typeOf: { $eq: factory.assetTransactionType.Pay }
70
126
  }
71
- }, ['object', 'result'])).shift();
127
+ }, ['object', 'result', 'instrument'])).shift();
72
128
  if (acceptPayAction === undefined) {
73
129
  throw new factory.errors.NotFound(factory.actionType.AcceptAction);
74
130
  }
@@ -113,10 +169,17 @@ function handlePrePublishedPaymentMethodIdOnAuthorizing(params) {
113
169
  });
114
170
  existingCompletedAuthorizeAction = existingCompletedAuthorizeActions.shift();
115
171
  if (existingCompletedAuthorizeAction !== undefined) {
116
- return { existingCompletedAuthorizeAction: { id: existingCompletedAuthorizeAction.id } };
172
+ return {
173
+ existingCompletedAuthorizeAction: { id: existingCompletedAuthorizeAction.id }
174
+ };
117
175
  }
176
+ // 採用アクションのinstrumentから、決済方法チケットを参照する(2025-11-23~)
177
+ const { acceptAction2ticketResult } = yield acceptAction2ticket({
178
+ project: { id: params.transaction.project.id },
179
+ acceptPayAction
180
+ })(repos);
118
181
  return {
119
- authorizeParams: { creditCard, pendingPaymentAgencyTransaction, paymentMethodByTransaction }
182
+ authorizeParams: { creditCard, pendingPaymentAgencyTransaction, paymentMethodByTransaction, acceptAction2ticketResult }
120
183
  };
121
184
  }
122
185
  else {
@@ -126,16 +189,13 @@ function handlePrePublishedPaymentMethodIdOnAuthorizing(params) {
126
189
  });
127
190
  }
128
191
  /**
129
- * 注文取引に保管された決済情報を承認しようとしている決済の整合性を検証する
192
+ * 決済採用と決済承認の整合性を検証する
130
193
  */
131
194
  function validatePaymentMethodByTransaction(params) {
132
- var _a, _b;
195
+ var _a, _b, _c, _d;
133
196
  const paymentServiceIdByObject = params.object.issuedThrough.id;
134
197
  const amountByObject = params.object.amount;
135
198
  const paymentMethodTypeByObject = params.object.paymentMethod;
136
- // const paymentServiceIdByTransaction = params.paymentMethodByTransaction.issuedThrough.id;
137
- // const amountByTransaction = params.paymentMethodByTransaction.paymentMethod?.amount;
138
- // const paymentMethodTypeByTransaction = params.paymentMethodByTransaction.paymentMethod?.identifier;
139
199
  const paymentServiceIdByTransaction = params.acceptObject.object.id;
140
200
  const amountByTransaction = (_a = params.acceptObject.object.paymentMethod) === null || _a === void 0 ? void 0 : _a.amount;
141
201
  const paymentMethodTypeByTransaction = (_b = params.acceptObject.object.paymentMethod) === null || _b === void 0 ? void 0 : _b.identifier;
@@ -151,4 +211,22 @@ function validatePaymentMethodByTransaction(params) {
151
211
  if (paymentMethodTypeByObject !== paymentMethodTypeByTransaction) {
152
212
  throw new factory.errors.Argument('object.paymentMethod', 'paymentMethod must match the target of the paymentUrl');
153
213
  }
214
+ // 注文アイテム検証(2025-11-25)
215
+ let eventIdsMustBe = [];
216
+ let eventIdsByAuthorizeAction = [];
217
+ const orderedItemsByAcceptAction = (_c = params.acceptObject.object.serviceOutput) === null || _c === void 0 ? void 0 : _c.referencesOrder.orderedItem;
218
+ const orderedItemsByAuthorizeAction = (_d = params.object.referencesOrder) === null || _d === void 0 ? void 0 : _d.orderedItem;
219
+ if (Array.isArray(orderedItemsByAcceptAction)) {
220
+ eventIdsMustBe = orderedItemsByAcceptAction.map((orderedItem) => orderedItem.orderedItem.serviceOutput.reservationFor.id);
221
+ }
222
+ if (Array.isArray(orderedItemsByAuthorizeAction)) {
223
+ eventIdsByAuthorizeAction =
224
+ orderedItemsByAuthorizeAction.map((orderedItem) => orderedItem.orderedItem.serviceOutput.reservationFor.id);
225
+ }
226
+ debug('validatePaymentMethodByTransaction: eventIdsMustBe,eventIdsByAuthorizeAction:', JSON.stringify(eventIdsMustBe), JSON.stringify(eventIdsByAuthorizeAction));
227
+ const eventIdsMatched = eventIdsMustBe.length === eventIdsByAuthorizeAction.length
228
+ && eventIdsMustBe.every((eventIdMustExist) => eventIdsByAuthorizeAction.includes(eventIdMustExist));
229
+ if (!eventIdsMatched) {
230
+ throw new factory.errors.Argument('id', `referencesOrder.orderedItem between authorze and accept not matched.`);
231
+ }
154
232
  }
@@ -1,16 +1,25 @@
1
1
  import * as factory from '../../../factory';
2
+ /**
3
+ * 決済方法チケットによって表現された請求情報
4
+ */
5
+ export type IInvoiceByTicketToken = factory.authorization.IInvoiceAsPaymentMethodServiceOutput;
2
6
  export type INotification = factory.notification.payAction.IPayAction4inform | factory.notification.refundAction.IRefundAction4inform;
3
7
  export declare function creatPublishPaymentUrlParams(params: {
4
8
  accountId?: string;
5
- object: Pick<factory.action.authorize.paymentMethod.any.IObjectIncludingPaymentMethodDetails, 'amount' | 'creditCard' | 'issuedThrough' | 'method' | 'paymentMethod'>;
9
+ object: Pick<factory.action.authorize.paymentMethod.any.IObjectIncludingPaymentMethodDetails, 'amount' | 'creditCard' | 'issuedThrough' | 'method' | 'paymentMethod' | 'referencesOrder'>;
6
10
  paymentServiceType: factory.service.paymentService.PaymentServiceType;
7
11
  transaction: Pick<factory.transaction.ITransaction<factory.transactionType.PlaceOrder>, 'expires' | 'seller' | 'project'>;
8
12
  transactionNumber: string;
9
13
  location?: factory.action.trade.pay.ILocation;
10
14
  identifier?: string;
15
+ /**
16
+ * 決済採用に使用される決済方法チケットトークン
17
+ */
18
+ ticketToken?: string;
11
19
  }): Pick<factory.assetTransaction.pay.IStartParamsWithoutDetail, 'agent' | 'location' | 'project' | 'recipient' | 'transactionNumber' | 'typeOf'> & {
12
20
  object: factory.action.accept.pay.IPayObject;
13
21
  identifier?: string;
22
+ instrument: factory.action.accept.pay.IInstrument[];
14
23
  };
15
24
  export declare function creatPayTransactionStartParams(params: {
16
25
  accountId?: string;
@@ -34,6 +43,10 @@ export declare function createMovieTicket(params: factory.action.trade.pay.IMovi
34
43
  export declare function createAuthorizeResult(params: {
35
44
  object: factory.action.authorize.paymentMethod.any.IObjectIncludingPaymentMethodDetails;
36
45
  payTransaction: Pick<factory.assetTransaction.pay.ITransaction, 'object'>;
46
+ /**
47
+ * 決済方法チケットの承認対象
48
+ */
49
+ invoiceByTicketToken?: IInvoiceByTicketToken;
37
50
  }): factory.action.authorize.paymentMethod.any.IResult;
38
51
  /**
39
52
  * 通知対象としてのアクションを最適化
@@ -22,9 +22,14 @@ function creatPublishPaymentUrlParams(params) {
22
22
  const object = {
23
23
  typeOf: params.paymentServiceType,
24
24
  id: issuedThroughId,
25
- paymentMethod
25
+ paymentMethod,
26
+ serviceOutput: {
27
+ typeOf: 'Invoice',
28
+ referencesOrder: params.object.referencesOrder
29
+ }
26
30
  };
27
- return Object.assign(Object.assign({ project: { id: params.transaction.project.id, typeOf: factory.organizationType.Project }, typeOf: factory.assetTransactionType.Pay, transactionNumber: params.transactionNumber, agent: {
31
+ const ticketAsInstrument = (typeof params.ticketToken === 'string') ? { ticketToken: params.ticketToken, typeOf: 'Ticket' } : undefined;
32
+ return Object.assign(Object.assign(Object.assign({ project: { id: params.transaction.project.id, typeOf: factory.organizationType.Project }, typeOf: factory.assetTransactionType.Pay, transactionNumber: params.transactionNumber, agent: {
28
33
  typeOf: params.transaction.seller.typeOf,
29
34
  id: params.transaction.seller.id,
30
35
  name: (typeof params.transaction.seller.name === 'string')
@@ -38,7 +43,7 @@ function creatPublishPaymentUrlParams(params) {
38
43
  typeOf: params.transaction.seller.typeOf
39
44
  }, object }, (typeof ((_d = params.location) === null || _d === void 0 ? void 0 : _d.typeOf) === 'string')
40
45
  ? { location: params.location }
41
- : undefined), (typeof params.identifier === 'string')
46
+ : undefined), { instrument: (ticketAsInstrument !== undefined) ? [ticketAsInstrument] : [] }), (typeof params.identifier === 'string')
42
47
  ? { identifier: params.identifier }
43
48
  : undefined);
44
49
  }
@@ -89,7 +94,11 @@ function creatPayTransactionStartParams(params) {
89
94
  }, object: {
90
95
  typeOf: params.paymentServiceType,
91
96
  id: issuedThroughId,
92
- paymentMethod: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ identifier: params.object.paymentMethod, amount: params.object.amount, additionalProperty: (Array.isArray(params.object.additionalProperty)) ? params.object.additionalProperty : [] }, (typeof params.object.method === 'string') ? { method: params.object.method } : undefined), (typeof params.object.name === 'string') ? { name: params.object.name } : undefined), (typeof accountId === 'string') ? { accountId } : undefined), (typeof params.object.description === 'string') ? { description: params.object.description } : undefined), (typeof params.object.fromLocation === 'string') ? { fromLocation: params.object.fromLocation } : undefined), (params.object.creditCard !== undefined) ? { creditCard: params.object.creditCard } : undefined), (Array.isArray(movieTickets)) ? { movieTickets } : undefined)
97
+ paymentMethod: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ identifier: params.object.paymentMethod, amount: params.object.amount, additionalProperty: (Array.isArray(params.object.additionalProperty)) ? params.object.additionalProperty : [] }, (typeof params.object.method === 'string') ? { method: params.object.method } : undefined), (typeof params.object.name === 'string') ? { name: params.object.name } : undefined), (typeof accountId === 'string') ? { accountId } : undefined), (typeof params.object.description === 'string') ? { description: params.object.description } : undefined), (typeof params.object.fromLocation === 'string') ? { fromLocation: params.object.fromLocation } : undefined), (params.object.creditCard !== undefined) ? { creditCard: params.object.creditCard } : undefined), (Array.isArray(movieTickets)) ? { movieTickets } : undefined),
98
+ serviceOutput: {
99
+ typeOf: 'Invoice',
100
+ referencesOrder: params.object.referencesOrder
101
+ }
93
102
  }, expires: expires, purpose: {
94
103
  typeOf: factory.order.OrderType.Order,
95
104
  confirmationNumber,
@@ -156,6 +165,13 @@ function createAuthorizeResult(params) {
156
165
  paymentStatus = factory.paymentStatusType.PaymentDue;
157
166
  }
158
167
  }
168
+ let invoiceOrderItems;
169
+ if (params.object.referencesOrder.typeOf === factory.order.OrderType.Order) {
170
+ if (Array.isArray(params.object.referencesOrder.orderedItem)) {
171
+ invoiceOrderItems = params.object.referencesOrder.orderedItem;
172
+ }
173
+ }
174
+ const referencesOrder = Object.assign({ typeOf: factory.order.OrderType.Order }, (Array.isArray(invoiceOrderItems) && invoiceOrderItems.length > 0) ? { orderedItem: invoiceOrderItems } : undefined);
159
175
  // Array対応(2023-09-02~)
160
176
  const resultAsInvoice = {
161
177
  accountId: (typeof ((_e = payTransactionObject.paymentMethod) === null || _e === void 0 ? void 0 : _e.accountId) === 'string')
@@ -174,7 +190,8 @@ function createAuthorizeResult(params) {
174
190
  : params.object.paymentMethod,
175
191
  totalPaymentDue: totalPaymentDue,
176
192
  additionalProperty: (Array.isArray(params.object.additionalProperty)) ? params.object.additionalProperty : [],
177
- typeOf: factory.action.authorize.paymentMethod.any.ResultType.Payment
193
+ typeOf: factory.action.authorize.paymentMethod.any.ResultType.Payment,
194
+ referencesOrder // add(2025-11-23~)
178
195
  };
179
196
  // tslint:disable-next-line:no-suspicious-comment
180
197
  // TODO 保留 resultにメンバーシップを追加(2024-08-13~)
@@ -21,5 +21,9 @@ declare function fixTransactionNumberOnPublishPaymentUrl(params: {
21
21
  paymentServiceType: factory.service.paymentService.PaymentServiceType;
22
22
  }): IFixTransactionNumberOperation<{
23
23
  transactionNumber: string;
24
+ /**
25
+ * 決済採用に使用される決済方法チケットトークン
26
+ */
27
+ ticketToken?: string;
24
28
  }>;
25
29
  export { fixTransactionNumberOnPublishPaymentUrl };