@chevre/domain 20.7.0-alpha.7 → 20.7.0-alpha.8

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.
@@ -1,3 +1,4 @@
1
+ import * as factory from '../../../factory';
1
2
  import { MongoRepository as OfferRepo } from '../../../repo/offer';
2
3
  import { IAcceptedOffer4COA } from './factory';
3
4
  /**
@@ -13,6 +14,7 @@ declare function validateAcceptedOffers(params: {
13
14
  project: {
14
15
  id: string;
15
16
  };
17
+ availablePaymentMethodTypes: factory.categoryCode.ICategoryCode[];
16
18
  }): (repos: {
17
19
  offer: OfferRepo;
18
20
  }) => Promise<{
@@ -12,6 +12,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.validateAcceptedOffers = void 0;
13
13
  const factory = require("../../../factory");
14
14
  const MENBERSHIP_COUPON_PAYMENT_METHOD_TYPE = 'MembershipCoupon'; // ひとまず固定
15
+ function createAppliesToMovieTicket(params) {
16
+ const isMvtkOrMG = typeof params.ticketInfo.mvtkNum === 'string' && params.ticketInfo.mvtkNum.length > 0;
17
+ let movieTicketTypeChargePriceSpec;
18
+ let appliesToMovieTicket;
19
+ if (isMvtkOrMG) {
20
+ // kbnMgtkから動的にavailablePaymentMethodを設定
21
+ let kbnMgtk = params.ticketInfo.kbnMgtk;
22
+ if (typeof kbnMgtk !== 'string') {
23
+ kbnMgtk = '';
24
+ }
25
+ const availablePaymentMethodType = params.availablePaymentMethodTypes.find((categoryCode) => { var _a, _b; return ((_b = (_a = categoryCode.additionalProperty) === null || _a === void 0 ? void 0 : _a.find((property) => property.name === 'kbnMgtk')) === null || _b === void 0 ? void 0 : _b.value) === kbnMgtk; });
26
+ if (availablePaymentMethodType === undefined) {
27
+ throw new factory.errors.Argument('offer', `available payment method type not found for kbnMgtk: ${kbnMgtk}`);
28
+ }
29
+ const availablePaymentMethod = availablePaymentMethodType.codeValue;
30
+ movieTicketTypeChargePriceSpec = {
31
+ project: { typeOf: factory.organizationType.Project, id: params.project.id },
32
+ typeOf: factory.priceSpecificationType.MovieTicketTypeChargeSpecification,
33
+ name: { ja: params.ticketInfo.ticketName, en: params.ticketInfo.ticketNameEng },
34
+ price: Number(params.ticketInfo.addPrice),
35
+ priceCurrency: factory.priceCurrency.JPY,
36
+ valueAddedTaxIncluded: true,
37
+ appliesToMovieTicket: {
38
+ typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
39
+ serviceType: params.ticketInfo.mvtkKbnKensyu,
40
+ serviceOutput: { typeOf: availablePaymentMethod }
41
+ },
42
+ appliesToVideoFormat: params.ticketInfo.kbnEisyahousiki
43
+ };
44
+ appliesToMovieTicket = {
45
+ typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
46
+ identifier: params.ticketInfo.mvtkNum,
47
+ serviceType: params.ticketInfo.mvtkKbnKensyu,
48
+ serviceOutput: { typeOf: availablePaymentMethod }
49
+ };
50
+ }
51
+ return { movieTicketTypeChargePriceSpec, appliesToMovieTicket };
52
+ }
15
53
  /**
16
54
  * 受け入れらたオファーの内容を検証
17
55
  */
@@ -29,7 +67,7 @@ function validateAcceptedOffers(params) {
29
67
  project: { id: { $eq: params.project.id } }
30
68
  });
31
69
  }
32
- // 利用可能なチケットオファーであれば受け入れる
70
+ // tslint:disable-next-line:max-func-body-length
33
71
  const acceptedOffers = params.object.acceptedOffer.map((acceptedOffer) => {
34
72
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
35
73
  const availableUnitPriceOffer = availableUnitPriceOffers.find((unitPriceOffer) => unitPriceOffer.id === acceptedOffer.id);
@@ -40,6 +78,18 @@ function validateAcceptedOffers(params) {
40
78
  if (priceSpecification === undefined) {
41
79
  throw new factory.errors.NotFound('priceSpecification');
42
80
  }
81
+ const unitPriceSpecByRequest = priceSpecification.priceComponent.find((component) => component.typeOf === factory.priceSpecificationType.UnitPriceSpecification);
82
+ if (unitPriceSpecByRequest === undefined) {
83
+ throw new factory.errors.ArgumentNull('offer.priceSpecification.priceComponent');
84
+ }
85
+ // appliesToMovieTicket.serviceOutput.typeOfを自動補完(2023-03-13~)
86
+ const { appliesToMovieTicket, movieTicketTypeChargePriceSpec } = createAppliesToMovieTicket({
87
+ project: { id: params.project.id },
88
+ ticketInfo,
89
+ availablePaymentMethodTypes: params.availablePaymentMethodTypes
90
+ });
91
+ let surfrockChargePriceSpec;
92
+ let appliesToMovieTicket4surfrock;
43
93
  // appliesToSurfrockの指定があれば強制的にMovieTicket決済
44
94
  let eligibleMonetaryAmount;
45
95
  const surfrockIdentifier = (_b = (_a = acceptedOffer.priceSpecification) === null || _a === void 0 ? void 0 : _a.appliesToSurfrock) === null || _b === void 0 ? void 0 : _b.identifier;
@@ -49,7 +99,7 @@ function validateAcceptedOffers(params) {
49
99
  if (typeof serviceType !== 'string') {
50
100
  throw new factory.errors.NotFound('ticketCode of unitPriceOffer');
51
101
  }
52
- const surfrockChargePriceSpec = {
102
+ surfrockChargePriceSpec = {
53
103
  appliesToMovieTicket: {
54
104
  typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
55
105
  serviceOutput: { typeOf: MENBERSHIP_COUPON_PAYMENT_METHOD_TYPE },
@@ -62,22 +112,12 @@ function validateAcceptedOffers(params) {
62
112
  typeOf: factory.priceSpecificationType.MovieTicketTypeChargeSpecification,
63
113
  valueAddedTaxIncluded: true
64
114
  };
65
- // priceComponentに追加
66
- priceSpecification.priceComponent = priceSpecification.priceComponent.map((component) => {
67
- if (component.typeOf === factory.priceSpecificationType.UnitPriceSpecification) {
68
- if (!Array.isArray(component.appliesToMovieTicket)) {
69
- component.appliesToMovieTicket = [];
70
- }
71
- component.appliesToMovieTicket.push({
72
- typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
73
- identifier: surfrockIdentifier,
74
- serviceOutput: { typeOf: MENBERSHIP_COUPON_PAYMENT_METHOD_TYPE },
75
- serviceType
76
- });
77
- }
78
- return component;
79
- });
80
- priceSpecification.priceComponent.push(surfrockChargePriceSpec);
115
+ appliesToMovieTicket4surfrock = {
116
+ typeOf: factory.service.paymentService.PaymentServiceType.MovieTicket,
117
+ identifier: surfrockIdentifier,
118
+ serviceOutput: { typeOf: MENBERSHIP_COUPON_PAYMENT_METHOD_TYPE },
119
+ serviceType
120
+ };
81
121
  }
82
122
  else {
83
123
  // appliesToSurfrockの指定がなければ単価オファーの適用通貨条件を強制適用
@@ -85,6 +125,21 @@ function validateAcceptedOffers(params) {
85
125
  eligibleMonetaryAmount = availableUnitPriceOffer.eligibleMonetaryAmount;
86
126
  }
87
127
  }
128
+ const unitPriceSpec = Object.assign({ typeOf: factory.priceSpecificationType.UnitPriceSpecification, name: unitPriceSpecByRequest.name, price: unitPriceSpecByRequest.price, priceCurrency: factory.priceCurrency.JPY, referenceQuantity: unitPriceSpecByRequest.referenceQuantity, valueAddedTaxIncluded: true }, (appliesToMovieTicket !== undefined || appliesToMovieTicket4surfrock !== undefined)
129
+ ? {
130
+ appliesToMovieTicket: [
131
+ ...(appliesToMovieTicket !== undefined) ? [appliesToMovieTicket] : [],
132
+ ...(appliesToMovieTicket4surfrock !== undefined) ? [appliesToMovieTicket4surfrock] : []
133
+ ]
134
+ }
135
+ : undefined);
136
+ // priceComponentを再生成
137
+ const priceComponent = [
138
+ unitPriceSpec,
139
+ ...(movieTicketTypeChargePriceSpec !== undefined) ? [movieTicketTypeChargePriceSpec] : [],
140
+ ...(surfrockChargePriceSpec !== undefined) ? [surfrockChargePriceSpec] : []
141
+ ];
142
+ priceSpecification.priceComponent = priceComponent;
88
143
  return Object.assign(Object.assign({ additionalProperty,
89
144
  itemOffered,
90
145
  name,
@@ -1,16 +1,19 @@
1
1
  import { MongoRepository as ActionRepo } from '../../repo/action';
2
+ import { MongoRepository as CategoryCodeRepo } from '../../repo/categoryCode';
2
3
  import { MongoRepository as EventRepo } from '../../repo/event';
3
4
  import { MongoRepository as OfferRepo } from '../../repo/offer';
4
5
  import { MongoRepository as TransactionRepo } from '../../repo/transaction';
5
6
  import { IAcceptedOffer4COA } from './eventServiceByCOA/factory';
6
7
  import * as factory from '../../factory';
7
8
  export import WebAPIIdentifier = factory.service.webAPI.Identifier;
8
- export declare type IAuthorizeOperation<T> = (repos: {
9
+ interface IAuthorizeRepos {
9
10
  action: ActionRepo;
11
+ categoryCode: CategoryCodeRepo;
10
12
  event: EventRepo;
11
13
  offer: OfferRepo;
12
14
  transaction: TransactionRepo;
13
- }) => Promise<T>;
15
+ }
16
+ export declare type IAuthorizeOperation<T> = (repos: IAuthorizeRepos) => Promise<T>;
14
17
  export declare type IAuthorizeOfferAction = factory.action.authorize.offer.seatReservation.IAction<WebAPIIdentifier.COA>;
15
18
  /**
16
19
  * COA興行オファー承認
@@ -29,16 +29,20 @@ function authorize(params) {
29
29
  throw new factory.errors.Forbidden('Transaction not yours');
30
30
  }
31
31
  // イベント取得属性最適化(2023-01-23~)
32
- // const screeningEvent = await repos.event.findById<factory.eventType.ScreeningEvent>({ id: params.object.event.id });
33
32
  const screeningEvent = yield repos.event.findMinimizedIndividualEventById({
34
33
  id: params.object.event.id
35
34
  });
35
+ const availablePaymentMethodTypes = yield repos.categoryCode.search({
36
+ project: { id: { $eq: transaction.project.id } },
37
+ inCodeSet: { identifier: { $eq: factory.categoryCode.CategorySetIdentifier.PaymentMethodType } }
38
+ });
36
39
  // COA仮予約後にリクエストが来る前提
37
40
  // validate acceptedOffer(2023-03-09~)
38
41
  // const acceptedOffer = params.object.acceptedOffer;
39
42
  const { acceptedOffers } = yield (0, validateAcceptedOffers_1.validateAcceptedOffers)({
40
43
  object: params.object,
41
- project: { id: transaction.project.id }
44
+ project: { id: transaction.project.id },
45
+ availablePaymentMethodTypes
42
46
  })(repos);
43
47
  const updTmpReserveSeatArgs = params.result.requestBody;
44
48
  const updTmpReserveSeatResult = params.result.responseBody;
@@ -145,16 +149,20 @@ function changeOffers(params) {
145
149
  }
146
150
  validate4changeOffer({ action: authorizeAction, object: params.object });
147
151
  // イベント取得属性最適化(2023-01-23~)
148
- // const screeningEvent = await repos.event.findById<factory.eventType.ScreeningEvent>({ id: params.object.event.id });
149
152
  const screeningEvent = yield repos.event.findMinimizedIndividualEventById({
150
153
  id: params.object.event.id
151
154
  });
155
+ const availablePaymentMethodTypes = yield repos.categoryCode.search({
156
+ project: { id: { $eq: transaction.project.id } },
157
+ inCodeSet: { identifier: { $eq: factory.categoryCode.CategorySetIdentifier.PaymentMethodType } }
158
+ });
152
159
  // COA仮予約後にリクエストが来る前提
153
160
  // validate acceptedOffer(2023-03-09~)
154
161
  // const acceptedOffer = params.object.acceptedOffer;
155
162
  const { acceptedOffers } = yield (0, validateAcceptedOffers_1.validateAcceptedOffers)({
156
163
  object: params.object,
157
- project: { id: transaction.project.id }
164
+ project: { id: transaction.project.id },
165
+ availablePaymentMethodTypes
158
166
  })(repos);
159
167
  // 供給情報と価格を変更してからDB更新
160
168
  authorizeAction.object.acceptedOffer = acceptedOffers;
package/package.json CHANGED
@@ -120,5 +120,5 @@
120
120
  "postversion": "git push origin --tags",
121
121
  "prepublishOnly": "npm run clean && npm run build && npm test && npm run doc"
122
122
  },
123
- "version": "20.7.0-alpha.7"
123
+ "version": "20.7.0-alpha.8"
124
124
  }