cabloy 5.1.124 → 5.1.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cabloy-version +1 -1
- package/.claude/skills/cabloy-backend-scaffold/SKILL.md +1 -1
- package/.claude/skills/cabloy-backend-scaffold/evals/evals.json +6 -0
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +13 -4
- package/.claude/skills/cabloy-workflow/SKILL.md +4 -2
- package/.claude/skills/cabloy-workflow/evals/evals.json +14 -2
- package/.claude/skills/cabloy-worktree-environment/SKILL.md +206 -0
- package/.claude/skills/cabloy-worktree-environment/evals/evals.json +77 -0
- package/.github/workflows/vona-test-pg.yml +3 -0
- package/.github/workflows/vona-test-sqlite3.yml +3 -0
- package/CHANGELOG.md +21 -0
- package/CLAUDE.md +1 -1
- package/cabloy-docs/.vitepress/config.mjs +2 -0
- package/cabloy-docs/ai/playbook-technical-blog-authoring.md +158 -0
- package/cabloy-docs/backend/backend-contract-emission-specimen.md +2 -2
- package/cabloy-docs/backend/dto-guide.md +10 -7
- package/cabloy-docs/backend/dto-infer-generation.md +127 -7
- package/cabloy-docs/backend/foundation.md +1 -1
- package/cabloy-docs/backend/introduction.md +1 -0
- package/cabloy-docs/backend/module-dependencies.md +104 -0
- package/cabloy-docs/backend/serialization-guide.md +6 -0
- package/cabloy-docs/fullstack/parallel-worktree-environment.md +72 -34
- package/cabloy-docs/fullstack/suites-and-modules.md +1 -0
- package/cabloy-docs/reference/package-map.md +1 -0
- package/e2e/specs/a-commerce/commerce.spec.ts +89 -0
- package/package.json +2 -1
- package/scripts/init.ts +7 -12
- package/scripts/initAppName.test.ts +72 -0
- package/scripts/initAppName.ts +50 -0
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +48 -146
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressMineCreate.tsx +6 -27
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressMineItem.tsx +6 -31
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressMineUpdate.tsx +6 -2
- package/vona/src/suite/a-commerce/modules/commerce-member/src/lib/addressMine.ts +16 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/service/address.ts +4 -17
- package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +63 -19
- package/vona/src/suite/a-commerce/modules/commerce-payment/package.json +2 -1
- package/vona/src/suite/a-commerce/modules/commerce-payment/src/bean/payScene.commerceOrder.ts +11 -2
- package/vona/src/suite/a-commerce/modules/commerce-payment/src/service/commercePayScene.ts +26 -0
- package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentAttempt.test.ts +19 -2
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/config/locale/en-us.ts +5 -2
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/config/locale/zh-cn.ts +5 -2
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/dto/couponTemplateCreate.tsx +26 -35
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/dto/couponTemplateUpdate.tsx +6 -1
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/entity/couponTemplate.tsx +40 -4
- package/vona/src/suite/a-commerce/modules/commerce-promotion/test/couponTemplateFormLayout.test.ts +85 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +1 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/order.ts +3 -5
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderSummary.tsx +7 -40
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/shipmentView.tsx +6 -15
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/lib/order.ts +9 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/order.ts +121 -11
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/order.test.ts +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/paymentOutcome.test.ts +19 -2
- package/vona/src/suite/a-training/modules/training-record/src/dto/detailRecordSubjectResItem.tsx +6 -1
- package/vona/src/suite/a-training/modules/training-record/src/dto/recordSelectResItem.tsx +3 -1
- package/vona/src/suite/a-training/modules/training-record/src/dto/recordView.tsx +4 -1
- package/vona/src/suite/a-training/modules/training-record/test/record.test.ts +45 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/detailRecordResItem.tsx +6 -1
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +5 -23
- package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +37 -5
- package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +29 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.index.ts +3 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.redlock.ts +3 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.version.ts +7 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/queue.outboxDispatch.ts +9 -4
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/schedule.providerOperationDispatch.ts +11 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/outboxEvent.tsx +11 -4
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/providerOperation.tsx +12 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/webhookInbox.tsx +6 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/outbox.ts +12 -5
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/paymentSession.ts +1 -37
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/providerOperation.ts +355 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/refundOperation.ts +226 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/webhook.ts +148 -50
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/types/payScene.ts +2 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/.metadata/index.ts +39 -22
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/bean/payProvider.mock.ts +42 -13
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/controller/mockPayment.ts +11 -0
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/dto/mockRefundComplete.tsx +13 -0
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/dto/mockRefundReceipt.tsx +16 -0
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/service/payMock.ts +56 -0
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +2 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/bean/payProvider.paypal.ts +117 -8
- package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/package.json +5 -5
- package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGet.ts +5 -5
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +54 -12
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +625 -64
- package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/types.ts +55 -15
- package/zova/src/suite/a-commerce/modules/commerce-trade/cli/openapi.config.ts +1 -1
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/commerceTradeOrder.ts +15 -17
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +12 -8
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +111 -26
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/apiSchema/commerceTradeOrder.ts +3 -3
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionRefund/controller.tsx +1 -8
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/order.ts +5 -9
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +1 -1
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +301 -17
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +5461 -1788
- package/vona/src/suite-vendor/a-pay/modules/a-pay/test/outbox.test.ts +0 -209
- package/vona/src/suite-vendor/a-pay/modules/a-pay/test/paymentSession.test.ts +0 -153
- package/vona/src/suite-vendor/a-pay/modules/a-pay/test/webhook.test.ts +0 -278
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/test/payMock.test.ts +0 -141
|
@@ -2133,6 +2133,7 @@ export interface components {
|
|
|
2133
2133
|
pageNo: number;
|
|
2134
2134
|
};
|
|
2135
2135
|
'commerce-member.dto.addressMineItem': {
|
|
2136
|
+
/** @description ID */
|
|
2136
2137
|
id: number | string;
|
|
2137
2138
|
/** @description Recipient Name */
|
|
2138
2139
|
recipientName: string;
|
|
@@ -2153,6 +2154,7 @@ export interface components {
|
|
|
2153
2154
|
};
|
|
2154
2155
|
'commerce-member.dto.addressMineView_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
2155
2156
|
| {
|
|
2157
|
+
/** @description ID */
|
|
2156
2158
|
id: number | string;
|
|
2157
2159
|
/** @description Recipient Name */
|
|
2158
2160
|
recipientName: string;
|
|
@@ -2432,20 +2434,39 @@ export interface components {
|
|
|
2432
2434
|
reason: string;
|
|
2433
2435
|
};
|
|
2434
2436
|
'commerce-promotion.dto.couponTemplateCreate': {
|
|
2437
|
+
/** @description Name */
|
|
2435
2438
|
name: string;
|
|
2436
|
-
/**
|
|
2439
|
+
/**
|
|
2440
|
+
* @description Template State
|
|
2441
|
+
* @enum {string}
|
|
2442
|
+
*/
|
|
2437
2443
|
state: 'draft' | 'active';
|
|
2438
|
-
/**
|
|
2444
|
+
/**
|
|
2445
|
+
* @description Currency
|
|
2446
|
+
* @enum {string}
|
|
2447
|
+
*/
|
|
2439
2448
|
currency: 'USD';
|
|
2449
|
+
/** @description Fixed Discount */
|
|
2440
2450
|
discountCents: number;
|
|
2451
|
+
/** @description Minimum Spend */
|
|
2441
2452
|
minSpendCents: number;
|
|
2442
|
-
/**
|
|
2453
|
+
/**
|
|
2454
|
+
* Format: date-time
|
|
2455
|
+
* @description Valid From
|
|
2456
|
+
*/
|
|
2443
2457
|
validFrom: Date;
|
|
2444
|
-
/**
|
|
2458
|
+
/**
|
|
2459
|
+
* Format: date-time
|
|
2460
|
+
* @description Valid Until
|
|
2461
|
+
*/
|
|
2445
2462
|
validUntil: Date;
|
|
2463
|
+
/** @description Total Issue Limit */
|
|
2446
2464
|
totalIssueLimit?: number | undefined;
|
|
2465
|
+
/** @description Total Usage Limit */
|
|
2447
2466
|
totalUsageLimit?: number | undefined;
|
|
2467
|
+
/** @description Per-customer Issue Limit */
|
|
2448
2468
|
perCustomerIssueLimit?: number | undefined;
|
|
2469
|
+
/** @description Description */
|
|
2449
2470
|
description?: string | undefined;
|
|
2450
2471
|
};
|
|
2451
2472
|
'commerce-promotion.dto.couponTemplateSelectRes': {
|
|
@@ -2490,9 +2511,9 @@ export interface components {
|
|
|
2490
2511
|
* @enum {string}
|
|
2491
2512
|
*/
|
|
2492
2513
|
currency: 'USD';
|
|
2493
|
-
/** @description Fixed Discount
|
|
2514
|
+
/** @description Fixed Discount */
|
|
2494
2515
|
discountCents: number;
|
|
2495
|
-
/** @description Minimum Spend
|
|
2516
|
+
/** @description Minimum Spend */
|
|
2496
2517
|
minSpendCents: number;
|
|
2497
2518
|
/**
|
|
2498
2519
|
* Format: date-time
|
|
@@ -2555,9 +2576,9 @@ export interface components {
|
|
|
2555
2576
|
* @enum {string}
|
|
2556
2577
|
*/
|
|
2557
2578
|
currency: 'USD';
|
|
2558
|
-
/** @description Fixed Discount
|
|
2579
|
+
/** @description Fixed Discount */
|
|
2559
2580
|
discountCents: number;
|
|
2560
|
-
/** @description Minimum Spend
|
|
2581
|
+
/** @description Minimum Spend */
|
|
2561
2582
|
minSpendCents: number;
|
|
2562
2583
|
/**
|
|
2563
2584
|
* Format: date-time
|
|
@@ -2642,6 +2663,12 @@ export interface components {
|
|
|
2642
2663
|
pageNo: number;
|
|
2643
2664
|
};
|
|
2644
2665
|
'commerce-trade.dto.orderSummary': {
|
|
2666
|
+
/**
|
|
2667
|
+
* Format: date-time
|
|
2668
|
+
* @description Created At
|
|
2669
|
+
*/
|
|
2670
|
+
createdAt: Date;
|
|
2671
|
+
/** @description ID */
|
|
2645
2672
|
id: number | string;
|
|
2646
2673
|
/** @enum {string} */
|
|
2647
2674
|
state:
|
|
@@ -2657,8 +2684,6 @@ export interface components {
|
|
|
2657
2684
|
/** @enum {string} */
|
|
2658
2685
|
currency: 'USD';
|
|
2659
2686
|
payableTotalCents: number;
|
|
2660
|
-
/** Format: date-time */
|
|
2661
|
-
createdAt: Date;
|
|
2662
2687
|
};
|
|
2663
2688
|
'commerce-trade.dto.orderDetail_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
2664
2689
|
| {
|
|
@@ -2720,6 +2745,7 @@ export interface components {
|
|
|
2720
2745
|
| undefined;
|
|
2721
2746
|
'commerce-trade.dto.shipmentView_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
2722
2747
|
| {
|
|
2748
|
+
/** @description ID */
|
|
2723
2749
|
id: number | string;
|
|
2724
2750
|
carrier: string;
|
|
2725
2751
|
trackingNumber: string;
|
|
@@ -2759,6 +2785,7 @@ export interface components {
|
|
|
2759
2785
|
idempotencyKey: string;
|
|
2760
2786
|
};
|
|
2761
2787
|
'commerce-trade.dto.shipmentView': {
|
|
2788
|
+
/** @description ID */
|
|
2762
2789
|
id: number | string;
|
|
2763
2790
|
carrier: string;
|
|
2764
2791
|
trackingNumber: string;
|
|
@@ -3634,7 +3661,7 @@ export interface components {
|
|
|
3634
3661
|
/** @description Description */
|
|
3635
3662
|
description?: string | undefined;
|
|
3636
3663
|
/** @description # */
|
|
3637
|
-
_lineNumber
|
|
3664
|
+
_lineNumber?: number | undefined;
|
|
3638
3665
|
/** @description Operations */
|
|
3639
3666
|
_operationsRow?: unknown;
|
|
3640
3667
|
};
|
|
@@ -3689,6 +3716,12 @@ export interface components {
|
|
|
3689
3716
|
dossierFileIds?: (number | string)[] | undefined;
|
|
3690
3717
|
/** @description Description */
|
|
3691
3718
|
description?: string | undefined;
|
|
3719
|
+
student?: {
|
|
3720
|
+
/** @description ID */
|
|
3721
|
+
id: number | string;
|
|
3722
|
+
/** @description Student Name */
|
|
3723
|
+
name: string;
|
|
3724
|
+
};
|
|
3692
3725
|
sceneImages?: components['schemas']['a-image.dto.imageView'][] | undefined;
|
|
3693
3726
|
/** @description Dossier Files */
|
|
3694
3727
|
dossierFiles?: components['schemas']['a-file.dto.fileView'][] | undefined;
|
|
@@ -3762,6 +3795,12 @@ export interface components {
|
|
|
3762
3795
|
dossierFileIds?: (number | string)[] | undefined;
|
|
3763
3796
|
/** @description Description */
|
|
3764
3797
|
description?: string | undefined;
|
|
3798
|
+
student?: {
|
|
3799
|
+
/** @description ID */
|
|
3800
|
+
id: number | string;
|
|
3801
|
+
/** @description Student Name */
|
|
3802
|
+
name: string;
|
|
3803
|
+
};
|
|
3765
3804
|
/** @description Student Training Record Details */
|
|
3766
3805
|
trainingRecordSubjects: {
|
|
3767
3806
|
/**
|
|
@@ -3974,7 +4013,7 @@ export interface components {
|
|
|
3974
4013
|
}[]
|
|
3975
4014
|
| undefined;
|
|
3976
4015
|
/** @description # */
|
|
3977
|
-
_lineNumber
|
|
4016
|
+
_lineNumber?: number | undefined;
|
|
3978
4017
|
/** @description Operations */
|
|
3979
4018
|
_operationsRow?: unknown;
|
|
3980
4019
|
};
|
|
@@ -4245,17 +4284,18 @@ export interface components {
|
|
|
4245
4284
|
};
|
|
4246
4285
|
'training-student.dto.studentSummary_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
4247
4286
|
| {
|
|
4287
|
+
/** @description ID */
|
|
4248
4288
|
id: number | string;
|
|
4249
4289
|
/** @description Student Name */
|
|
4250
4290
|
name: string;
|
|
4291
|
+
/** @description Description */
|
|
4292
|
+
description?: string | undefined;
|
|
4251
4293
|
/** @description Mobile */
|
|
4252
4294
|
mobile: string;
|
|
4253
4295
|
/** @description Training Stage */
|
|
4254
|
-
level:
|
|
4296
|
+
level: 1 | 2 | 3;
|
|
4255
4297
|
/** @description Level Title */
|
|
4256
4298
|
levelTitle: string;
|
|
4257
|
-
/** @description Description */
|
|
4258
|
-
description?: string | undefined;
|
|
4259
4299
|
/** @description Description Length */
|
|
4260
4300
|
descriptionLength: number;
|
|
4261
4301
|
/** @description Summary */
|
|
@@ -16,7 +16,7 @@ export default function (): ZovaOpenapiConfigModule {
|
|
|
16
16
|
'CommerceTradeOrder_requestRefund',
|
|
17
17
|
'CommerceTradeOrder_approveRefund',
|
|
18
18
|
'CommerceTradeOrder_rejectRefund',
|
|
19
|
-
'
|
|
19
|
+
'CommerceTradeOrder_executeRefund',
|
|
20
20
|
'CommerceTradeOrder_mine',
|
|
21
21
|
'CommerceTradeOrder_viewMine',
|
|
22
22
|
],
|
|
@@ -63,18 +63,16 @@ export type ApiApiCommerceTradeOrderrejectRefundRequestBody =
|
|
|
63
63
|
export type ApiApiCommerceTradeOrderrejectRefundResponseBody =
|
|
64
64
|
paths[ApiApiCommerceTradeOrderrejectRefundPath][ApiApiCommerceTradeOrderrejectRefundMethod]['responses']['200']['content']['application/json']['data'];
|
|
65
65
|
|
|
66
|
-
/**
|
|
67
|
-
export const
|
|
68
|
-
'/api/commerce/trade/order/{id}/
|
|
69
|
-
export type
|
|
70
|
-
'/api/commerce/trade/order/{id}/
|
|
71
|
-
export type
|
|
72
|
-
export type
|
|
73
|
-
paths[
|
|
74
|
-
export type
|
|
75
|
-
|
|
76
|
-
export type ApiApiCommerceTradeOrderrefundOutcomeResponseBody =
|
|
77
|
-
paths[ApiApiCommerceTradeOrderrefundOutcomePath][ApiApiCommerceTradeOrderrefundOutcomeMethod]['responses']['200']['content']['application/json']['data'];
|
|
66
|
+
/** CommerceTradeOrder_executeRefund */
|
|
67
|
+
export const ApiApiCommerceTradeOrderexecuteRefundPath =
|
|
68
|
+
'/api/commerce/trade/order/{id}/executeRefund';
|
|
69
|
+
export type ApiApiCommerceTradeOrderexecuteRefundPath =
|
|
70
|
+
'/api/commerce/trade/order/{id}/executeRefund';
|
|
71
|
+
export type ApiApiCommerceTradeOrderexecuteRefundMethod = 'post';
|
|
72
|
+
export type ApiApiCommerceTradeOrderexecuteRefundRequestParams =
|
|
73
|
+
paths[ApiApiCommerceTradeOrderexecuteRefundPath][ApiApiCommerceTradeOrderexecuteRefundMethod]['parameters']['path'];
|
|
74
|
+
export type ApiApiCommerceTradeOrderexecuteRefundResponseBody =
|
|
75
|
+
paths[ApiApiCommerceTradeOrderexecuteRefundPath][ApiApiCommerceTradeOrderexecuteRefundMethod]['responses']['200']['content']['application/json']['data'];
|
|
78
76
|
|
|
79
77
|
/** CommerceTradeOrder_ship */
|
|
80
78
|
export const ApiApiCommerceTradeOrdershipPath = '/api/commerce/trade/order/{id}/ship';
|
|
@@ -168,14 +166,14 @@ export class ApiCommerceTradeOrder extends BeanApiBase {
|
|
|
168
166
|
);
|
|
169
167
|
}
|
|
170
168
|
|
|
171
|
-
|
|
172
|
-
body:
|
|
169
|
+
executeRefund(
|
|
170
|
+
body: undefined,
|
|
173
171
|
options: {
|
|
174
|
-
params:
|
|
172
|
+
params: ApiApiCommerceTradeOrderexecuteRefundRequestParams;
|
|
175
173
|
} & IApiActionOptions,
|
|
176
174
|
) {
|
|
177
|
-
return this.$fetch.post<any,
|
|
178
|
-
this.$pathTranslate(
|
|
175
|
+
return this.$fetch.post<any, ApiApiCommerceTradeOrderexecuteRefundResponseBody>(
|
|
176
|
+
this.$pathTranslate(ApiApiCommerceTradeOrderexecuteRefundPath, options.params),
|
|
179
177
|
body,
|
|
180
178
|
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
181
179
|
);
|
|
@@ -95,10 +95,10 @@ export type ApiSchemaCommercePromotionDtoCouponTemplateSelectResItem =
|
|
|
95
95
|
components['schemas']['commerce-promotion.dto.couponTemplateSelectResItem'];
|
|
96
96
|
export type ApiSchemaCommercePromotionDtoCouponTemplateSelectResItemPartial =
|
|
97
97
|
Partial<ApiSchemaCommercePromotionDtoCouponTemplateSelectResItem>;
|
|
98
|
-
export type
|
|
99
|
-
components['schemas']['commerce-promotion.dto.
|
|
100
|
-
export type
|
|
101
|
-
Partial<
|
|
98
|
+
export type ApiSchemaCommercePromotionDtoCouponTemplateView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_91abd8df366c0c4d47021b38af2a356349ee178b =
|
|
99
|
+
components['schemas']['commerce-promotion.dto.couponTemplateView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_91abd8df366c0c4d47021b38af2a356349ee178b'];
|
|
100
|
+
export type ApiSchemaCommercePromotionDtoCouponTemplateView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_91abd8df366c0c4d47021b38af2a356349ee178bPartial =
|
|
101
|
+
Partial<ApiSchemaCommercePromotionDtoCouponTemplateView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_91abd8df366c0c4d47021b38af2a356349ee178b>;
|
|
102
102
|
export type ApiSchemaCommercePromotionDtoCouponTemplateUpdate =
|
|
103
103
|
components['schemas']['commerce-promotion.dto.couponTemplateUpdate'];
|
|
104
104
|
export type ApiSchemaCommercePromotionDtoCouponTemplateUpdatePartial =
|
|
@@ -165,10 +165,6 @@ export type ApiSchemaCommerceTradeDtoRefundReview =
|
|
|
165
165
|
components['schemas']['commerce-trade.dto.refundReview'];
|
|
166
166
|
export type ApiSchemaCommerceTradeDtoRefundReviewPartial =
|
|
167
167
|
Partial<ApiSchemaCommerceTradeDtoRefundReview>;
|
|
168
|
-
export type ApiSchemaCommerceTradeDtoRefundOutcomeCreate =
|
|
169
|
-
components['schemas']['commerce-trade.dto.refundOutcomeCreate'];
|
|
170
|
-
export type ApiSchemaCommerceTradeDtoRefundOutcomeCreatePartial =
|
|
171
|
-
Partial<ApiSchemaCommerceTradeDtoRefundOutcomeCreate>;
|
|
172
168
|
export type ApiSchemaCommerceTradeDtoShipmentView =
|
|
173
169
|
components['schemas']['commerce-trade.dto.shipmentView'];
|
|
174
170
|
export type ApiSchemaCommerceTradeDtoShipmentViewPartial =
|
|
@@ -461,6 +457,14 @@ export type ApiSchemaPayMockDtoMockPaymentComplete =
|
|
|
461
457
|
components['schemas']['pay-mock.dto.mockPaymentComplete'];
|
|
462
458
|
export type ApiSchemaPayMockDtoMockPaymentCompletePartial =
|
|
463
459
|
Partial<ApiSchemaPayMockDtoMockPaymentComplete>;
|
|
460
|
+
export type ApiSchemaPayMockDtoMockRefundReceipt =
|
|
461
|
+
components['schemas']['pay-mock.dto.mockRefundReceipt'];
|
|
462
|
+
export type ApiSchemaPayMockDtoMockRefundReceiptPartial =
|
|
463
|
+
Partial<ApiSchemaPayMockDtoMockRefundReceipt>;
|
|
464
|
+
export type ApiSchemaPayMockDtoMockRefundComplete =
|
|
465
|
+
components['schemas']['pay-mock.dto.mockRefundComplete'];
|
|
466
|
+
export type ApiSchemaPayMockDtoMockRefundCompletePartial =
|
|
467
|
+
Partial<ApiSchemaPayMockDtoMockRefundComplete>;
|
|
464
468
|
export type ApiSchemaAPaypalEntityPaypalRecord =
|
|
465
469
|
components['schemas']['a-paypal.entity.paypalRecord'];
|
|
466
470
|
export type ApiSchemaAPaypalEntityPaypalRecordPartial = Partial<ApiSchemaAPaypalEntityPaypalRecord>;
|
|
@@ -623,7 +623,7 @@ export interface paths {
|
|
|
623
623
|
patch?: never;
|
|
624
624
|
trace?: never;
|
|
625
625
|
};
|
|
626
|
-
'/api/commerce/trade/order/{id}/
|
|
626
|
+
'/api/commerce/trade/order/{id}/executeRefund': {
|
|
627
627
|
parameters: {
|
|
628
628
|
query?: never;
|
|
629
629
|
header?: never;
|
|
@@ -632,7 +632,7 @@ export interface paths {
|
|
|
632
632
|
};
|
|
633
633
|
get?: never;
|
|
634
634
|
put?: never;
|
|
635
|
-
post: operations['
|
|
635
|
+
post: operations['CommerceTradeOrder_executeRefund'];
|
|
636
636
|
delete?: never;
|
|
637
637
|
options?: never;
|
|
638
638
|
head?: never;
|
|
@@ -1264,6 +1264,22 @@ export interface paths {
|
|
|
1264
1264
|
patch?: never;
|
|
1265
1265
|
trace?: never;
|
|
1266
1266
|
};
|
|
1267
|
+
'/api/pay/mock/payment-session/refund-operation/{id}/complete': {
|
|
1268
|
+
parameters: {
|
|
1269
|
+
query?: never;
|
|
1270
|
+
header?: never;
|
|
1271
|
+
path?: never;
|
|
1272
|
+
cookie?: never;
|
|
1273
|
+
};
|
|
1274
|
+
get?: never;
|
|
1275
|
+
put?: never;
|
|
1276
|
+
post: operations['PayMockPayment_completeRefund'];
|
|
1277
|
+
delete?: never;
|
|
1278
|
+
options?: never;
|
|
1279
|
+
head?: never;
|
|
1280
|
+
patch?: never;
|
|
1281
|
+
trace?: never;
|
|
1282
|
+
};
|
|
1267
1283
|
'/api/paypal/getRecord/{recordId}': {
|
|
1268
1284
|
parameters: {
|
|
1269
1285
|
query?: never;
|
|
@@ -2133,6 +2149,7 @@ export interface components {
|
|
|
2133
2149
|
pageNo: number;
|
|
2134
2150
|
};
|
|
2135
2151
|
'commerce-member.dto.addressMineItem': {
|
|
2152
|
+
/** @description ID */
|
|
2136
2153
|
id: number | string;
|
|
2137
2154
|
/** @description Recipient Name */
|
|
2138
2155
|
recipientName: string;
|
|
@@ -2153,6 +2170,7 @@ export interface components {
|
|
|
2153
2170
|
};
|
|
2154
2171
|
'commerce-member.dto.addressMineView_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
2155
2172
|
| {
|
|
2173
|
+
/** @description ID */
|
|
2156
2174
|
id: number | string;
|
|
2157
2175
|
/** @description Recipient Name */
|
|
2158
2176
|
recipientName: string;
|
|
@@ -2432,20 +2450,39 @@ export interface components {
|
|
|
2432
2450
|
reason: string;
|
|
2433
2451
|
};
|
|
2434
2452
|
'commerce-promotion.dto.couponTemplateCreate': {
|
|
2453
|
+
/** @description Name */
|
|
2435
2454
|
name: string;
|
|
2436
|
-
/**
|
|
2455
|
+
/**
|
|
2456
|
+
* @description Template State
|
|
2457
|
+
* @enum {string}
|
|
2458
|
+
*/
|
|
2437
2459
|
state: 'draft' | 'active';
|
|
2438
|
-
/**
|
|
2460
|
+
/**
|
|
2461
|
+
* @description Currency
|
|
2462
|
+
* @enum {string}
|
|
2463
|
+
*/
|
|
2439
2464
|
currency: 'USD';
|
|
2465
|
+
/** @description Fixed Discount (Cents) */
|
|
2440
2466
|
discountCents: number;
|
|
2467
|
+
/** @description Minimum Spend (Cents) */
|
|
2441
2468
|
minSpendCents: number;
|
|
2442
|
-
/**
|
|
2469
|
+
/**
|
|
2470
|
+
* Format: date-time
|
|
2471
|
+
* @description Valid From
|
|
2472
|
+
*/
|
|
2443
2473
|
validFrom: Date;
|
|
2444
|
-
/**
|
|
2474
|
+
/**
|
|
2475
|
+
* Format: date-time
|
|
2476
|
+
* @description Valid Until
|
|
2477
|
+
*/
|
|
2445
2478
|
validUntil: Date;
|
|
2479
|
+
/** @description Total Issue Limit */
|
|
2446
2480
|
totalIssueLimit?: number | undefined;
|
|
2481
|
+
/** @description Total Usage Limit */
|
|
2447
2482
|
totalUsageLimit?: number | undefined;
|
|
2483
|
+
/** @description Per-customer Issue Limit */
|
|
2448
2484
|
perCustomerIssueLimit?: number | undefined;
|
|
2485
|
+
/** @description Description */
|
|
2449
2486
|
description?: string | undefined;
|
|
2450
2487
|
};
|
|
2451
2488
|
'commerce-promotion.dto.couponTemplateSelectRes': {
|
|
@@ -2519,7 +2556,7 @@ export interface components {
|
|
|
2519
2556
|
/** @description Operations */
|
|
2520
2557
|
_operationsRow?: unknown;
|
|
2521
2558
|
};
|
|
2522
|
-
'commerce-promotion.dto.
|
|
2559
|
+
'commerce-promotion.dto.couponTemplateView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_91abd8df366c0c4d47021b38af2a356349ee178b':
|
|
2523
2560
|
| {
|
|
2524
2561
|
/**
|
|
2525
2562
|
* Format: date-time
|
|
@@ -2642,6 +2679,12 @@ export interface components {
|
|
|
2642
2679
|
pageNo: number;
|
|
2643
2680
|
};
|
|
2644
2681
|
'commerce-trade.dto.orderSummary': {
|
|
2682
|
+
/**
|
|
2683
|
+
* Format: date-time
|
|
2684
|
+
* @description Created At
|
|
2685
|
+
*/
|
|
2686
|
+
createdAt: Date;
|
|
2687
|
+
/** @description ID */
|
|
2645
2688
|
id: number | string;
|
|
2646
2689
|
/** @enum {string} */
|
|
2647
2690
|
state:
|
|
@@ -2657,8 +2700,6 @@ export interface components {
|
|
|
2657
2700
|
/** @enum {string} */
|
|
2658
2701
|
currency: 'USD';
|
|
2659
2702
|
payableTotalCents: number;
|
|
2660
|
-
/** Format: date-time */
|
|
2661
|
-
createdAt: Date;
|
|
2662
2703
|
};
|
|
2663
2704
|
'commerce-trade.dto.orderDetail_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
2664
2705
|
| {
|
|
@@ -2720,6 +2761,7 @@ export interface components {
|
|
|
2720
2761
|
| undefined;
|
|
2721
2762
|
'commerce-trade.dto.shipmentView_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
2722
2763
|
| {
|
|
2764
|
+
/** @description ID */
|
|
2723
2765
|
id: number | string;
|
|
2724
2766
|
carrier: string;
|
|
2725
2767
|
trackingNumber: string;
|
|
@@ -2753,12 +2795,8 @@ export interface components {
|
|
|
2753
2795
|
reason: string;
|
|
2754
2796
|
idempotencyKey: string;
|
|
2755
2797
|
};
|
|
2756
|
-
'commerce-trade.dto.refundOutcomeCreate': {
|
|
2757
|
-
/** @enum {string} */
|
|
2758
|
-
outcome: 'succeeded' | 'failed';
|
|
2759
|
-
idempotencyKey: string;
|
|
2760
|
-
};
|
|
2761
2798
|
'commerce-trade.dto.shipmentView': {
|
|
2799
|
+
/** @description ID */
|
|
2762
2800
|
id: number | string;
|
|
2763
2801
|
carrier: string;
|
|
2764
2802
|
trackingNumber: string;
|
|
@@ -3634,7 +3672,7 @@ export interface components {
|
|
|
3634
3672
|
/** @description Description */
|
|
3635
3673
|
description?: string | undefined;
|
|
3636
3674
|
/** @description # */
|
|
3637
|
-
_lineNumber
|
|
3675
|
+
_lineNumber?: number | undefined;
|
|
3638
3676
|
/** @description Operations */
|
|
3639
3677
|
_operationsRow?: unknown;
|
|
3640
3678
|
};
|
|
@@ -3689,6 +3727,12 @@ export interface components {
|
|
|
3689
3727
|
dossierFileIds?: (number | string)[] | undefined;
|
|
3690
3728
|
/** @description Description */
|
|
3691
3729
|
description?: string | undefined;
|
|
3730
|
+
student?: {
|
|
3731
|
+
/** @description ID */
|
|
3732
|
+
id: number | string;
|
|
3733
|
+
/** @description Student Name */
|
|
3734
|
+
name: string;
|
|
3735
|
+
};
|
|
3692
3736
|
sceneImages?: components['schemas']['a-image.dto.imageView'][] | undefined;
|
|
3693
3737
|
/** @description Dossier Files */
|
|
3694
3738
|
dossierFiles?: components['schemas']['a-file.dto.fileView'][] | undefined;
|
|
@@ -3762,6 +3806,12 @@ export interface components {
|
|
|
3762
3806
|
dossierFileIds?: (number | string)[] | undefined;
|
|
3763
3807
|
/** @description Description */
|
|
3764
3808
|
description?: string | undefined;
|
|
3809
|
+
student?: {
|
|
3810
|
+
/** @description ID */
|
|
3811
|
+
id: number | string;
|
|
3812
|
+
/** @description Student Name */
|
|
3813
|
+
name: string;
|
|
3814
|
+
};
|
|
3765
3815
|
/** @description Student Training Record Details */
|
|
3766
3816
|
trainingRecordSubjects: {
|
|
3767
3817
|
/**
|
|
@@ -3974,7 +4024,7 @@ export interface components {
|
|
|
3974
4024
|
}[]
|
|
3975
4025
|
| undefined;
|
|
3976
4026
|
/** @description # */
|
|
3977
|
-
_lineNumber
|
|
4027
|
+
_lineNumber?: number | undefined;
|
|
3978
4028
|
/** @description Operations */
|
|
3979
4029
|
_operationsRow?: unknown;
|
|
3980
4030
|
};
|
|
@@ -4245,17 +4295,18 @@ export interface components {
|
|
|
4245
4295
|
};
|
|
4246
4296
|
'training-student.dto.studentSummary_2d063d28bc7243bed02ebd8bddf1212a93c6305b':
|
|
4247
4297
|
| {
|
|
4298
|
+
/** @description ID */
|
|
4248
4299
|
id: number | string;
|
|
4249
4300
|
/** @description Student Name */
|
|
4250
4301
|
name: string;
|
|
4302
|
+
/** @description Description */
|
|
4303
|
+
description?: string | undefined;
|
|
4251
4304
|
/** @description Mobile */
|
|
4252
4305
|
mobile: string;
|
|
4253
4306
|
/** @description Training Stage */
|
|
4254
|
-
level:
|
|
4307
|
+
level: 1 | 2 | 3;
|
|
4255
4308
|
/** @description Level Title */
|
|
4256
4309
|
levelTitle: string;
|
|
4257
|
-
/** @description Description */
|
|
4258
|
-
description?: string | undefined;
|
|
4259
4310
|
/** @description Description Length */
|
|
4260
4311
|
descriptionLength: number;
|
|
4261
4312
|
/** @description Summary */
|
|
@@ -4443,6 +4494,14 @@ export interface components {
|
|
|
4443
4494
|
/** @enum {string} */
|
|
4444
4495
|
outcome: 'succeeded' | 'failed' | 'cancelled';
|
|
4445
4496
|
};
|
|
4497
|
+
'pay-mock.dto.mockRefundReceipt': {
|
|
4498
|
+
refundOperationId: number | string;
|
|
4499
|
+
accepted: boolean;
|
|
4500
|
+
};
|
|
4501
|
+
'pay-mock.dto.mockRefundComplete': {
|
|
4502
|
+
/** @enum {string} */
|
|
4503
|
+
outcome: 'succeeded' | 'failed' | 'cancelled';
|
|
4504
|
+
};
|
|
4446
4505
|
'a-paypal.entity.paypalRecord': {
|
|
4447
4506
|
/**
|
|
4448
4507
|
* Format: date-time
|
|
@@ -5851,7 +5910,7 @@ export interface operations {
|
|
|
5851
5910
|
'application/json': {
|
|
5852
5911
|
code: string;
|
|
5853
5912
|
message: string;
|
|
5854
|
-
data?: components['schemas']['commerce-promotion.dto.
|
|
5913
|
+
data?: components['schemas']['commerce-promotion.dto.couponTemplateView_2d063d28bc7243bed02ebd8bddf1212a93c6305b_91abd8df366c0c4d47021b38af2a356349ee178b'];
|
|
5855
5914
|
};
|
|
5856
5915
|
};
|
|
5857
5916
|
};
|
|
@@ -6233,7 +6292,7 @@ export interface operations {
|
|
|
6233
6292
|
};
|
|
6234
6293
|
authToken: true;
|
|
6235
6294
|
};
|
|
6236
|
-
|
|
6295
|
+
CommerceTradeOrder_executeRefund: {
|
|
6237
6296
|
parameters: {
|
|
6238
6297
|
query?: never;
|
|
6239
6298
|
header?: never;
|
|
@@ -6242,11 +6301,7 @@ export interface operations {
|
|
|
6242
6301
|
};
|
|
6243
6302
|
cookie?: never;
|
|
6244
6303
|
};
|
|
6245
|
-
requestBody
|
|
6246
|
-
content: {
|
|
6247
|
-
'application/json': components['schemas']['commerce-trade.dto.refundOutcomeCreate'];
|
|
6248
|
-
};
|
|
6249
|
-
};
|
|
6304
|
+
requestBody?: never;
|
|
6250
6305
|
responses: {
|
|
6251
6306
|
200: {
|
|
6252
6307
|
headers: {
|
|
@@ -7814,6 +7869,36 @@ export interface operations {
|
|
|
7814
7869
|
};
|
|
7815
7870
|
authToken: true;
|
|
7816
7871
|
};
|
|
7872
|
+
PayMockPayment_completeRefund: {
|
|
7873
|
+
parameters: {
|
|
7874
|
+
query?: never;
|
|
7875
|
+
header?: never;
|
|
7876
|
+
path: {
|
|
7877
|
+
id: number | string;
|
|
7878
|
+
};
|
|
7879
|
+
cookie?: never;
|
|
7880
|
+
};
|
|
7881
|
+
requestBody: {
|
|
7882
|
+
content: {
|
|
7883
|
+
'application/json': components['schemas']['pay-mock.dto.mockRefundComplete'];
|
|
7884
|
+
};
|
|
7885
|
+
};
|
|
7886
|
+
responses: {
|
|
7887
|
+
200: {
|
|
7888
|
+
headers: {
|
|
7889
|
+
[name: string]: unknown;
|
|
7890
|
+
};
|
|
7891
|
+
content: {
|
|
7892
|
+
'application/json': {
|
|
7893
|
+
code: string;
|
|
7894
|
+
message: string;
|
|
7895
|
+
data: components['schemas']['pay-mock.dto.mockRefundReceipt'];
|
|
7896
|
+
};
|
|
7897
|
+
};
|
|
7898
|
+
};
|
|
7899
|
+
};
|
|
7900
|
+
authToken: true;
|
|
7901
|
+
};
|
|
7817
7902
|
Paypal_getRecord: {
|
|
7818
7903
|
parameters: {
|
|
7819
7904
|
query?: never;
|
package/zova/src/suite/a-commerce/modules/commerce-trade/src/apiSchema/commerceTradeOrder.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
ApiApiCommerceTradeOrderrequestRefundPath,
|
|
10
10
|
ApiApiCommerceTradeOrderapproveRefundPath,
|
|
11
11
|
ApiApiCommerceTradeOrderrejectRefundPath,
|
|
12
|
-
|
|
12
|
+
ApiApiCommerceTradeOrderexecuteRefundPath,
|
|
13
13
|
ApiApiCommerceTradeOrdershipPath,
|
|
14
14
|
ApiApiCommerceTradeOrderselectPath,
|
|
15
15
|
ApiApiCommerceTradeOrderviewPath,
|
|
@@ -37,8 +37,8 @@ export class ApiSchemaCommerceTradeOrder extends BeanBase {
|
|
|
37
37
|
return this.$sdk.createApiSchemas(ApiApiCommerceTradeOrderrejectRefundPath, 'post', options);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
return this.$sdk.createApiSchemas(
|
|
40
|
+
executeRefund(options?: IApiSchemaOptions) {
|
|
41
|
+
return this.$sdk.createApiSchemas(ApiApiCommerceTradeOrderexecuteRefundPath, 'post', options);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
ship(options?: IApiSchemaOptions) {
|
|
@@ -24,7 +24,6 @@ export class ControllerTableCellActionRefund extends BeanControllerBase {
|
|
|
24
24
|
confirmed = false;
|
|
25
25
|
approveIdempotencyKey?: string;
|
|
26
26
|
rejectIdempotencyKey?: string;
|
|
27
|
-
outcomeIdempotencyKey?: string;
|
|
28
27
|
|
|
29
28
|
private async _approve() {
|
|
30
29
|
const reason = this.reason.trim();
|
|
@@ -49,13 +48,7 @@ export class ControllerTableCellActionRefund extends BeanControllerBase {
|
|
|
49
48
|
private async _execute() {
|
|
50
49
|
if (!this.confirmed) return;
|
|
51
50
|
const orderId = this.$$renderContext.cellContext.row.id as TableIdentity;
|
|
52
|
-
|
|
53
|
-
this.outcomeIdempotencyKey = idempotencyKey;
|
|
54
|
-
await this.$$modelOrder.refundOutcome(orderId).mutateAsync({
|
|
55
|
-
outcome: 'succeeded',
|
|
56
|
-
idempotencyKey,
|
|
57
|
-
});
|
|
58
|
-
this.outcomeIdempotencyKey = undefined;
|
|
51
|
+
await this.$$modelOrder.executeRefund(orderId).mutateAsync(undefined);
|
|
59
52
|
}
|
|
60
53
|
|
|
61
54
|
protected render() {
|
|
@@ -7,7 +7,6 @@ import { BeanModelBase, Model } from 'zova-module-a-model';
|
|
|
7
7
|
|
|
8
8
|
import type {
|
|
9
9
|
ApiApiCommerceTradeOrderapproveRefundRequestBody,
|
|
10
|
-
ApiApiCommerceTradeOrderrefundOutcomeRequestBody,
|
|
11
10
|
ApiApiCommerceTradeOrderrejectRefundRequestBody,
|
|
12
11
|
ApiApiCommerceTradeOrdershipRequestBody,
|
|
13
12
|
} from '../api/commerceTradeOrder.js';
|
|
@@ -67,15 +66,12 @@ export class ModelOrder extends BeanModelBase {
|
|
|
67
66
|
});
|
|
68
67
|
}
|
|
69
68
|
|
|
70
|
-
|
|
71
|
-
return this.$$modelResource.mutationItem<
|
|
72
|
-
unknown,
|
|
73
|
-
ApiApiCommerceTradeOrderrefundOutcomeRequestBody
|
|
74
|
-
>({
|
|
69
|
+
executeRefund(id: TableIdentity) {
|
|
70
|
+
return this.$$modelResource.mutationItem<unknown, undefined>({
|
|
75
71
|
id,
|
|
76
|
-
action: '
|
|
77
|
-
mutationFn: async
|
|
78
|
-
return await this.scope.api.commerceTradeOrder.
|
|
72
|
+
action: 'executeRefund',
|
|
73
|
+
mutationFn: async () => {
|
|
74
|
+
return await this.scope.api.commerceTradeOrder.executeRefund(undefined, { params: { id } });
|
|
79
75
|
},
|
|
80
76
|
});
|
|
81
77
|
}
|