@floristcloud/api-lib 1.2.120 → 1.2.123
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/build/commands/product/multiplicity-option/create-product-multiplicity-option.command.js +1 -0
- package/build/commands/product/multiplicity-option/update-product-multiplicity-option.command.js +1 -0
- package/build/schemas/discount-rules/discount-rules.schema.js +8 -3
- package/build/schemas/index.js +1 -0
- package/build/schemas/order-product/order-product-multiplicity-optiom.schema.js +3 -0
- package/build/schemas/product/product-multiplicity-option-for-client.schema.js +23 -0
- package/build/schemas/product/product-multiplicity-option.schema.js +2 -0
- package/build/schemas/product/product.schema.js +10 -1
- package/commands/product/multiplicity-option/create-product-multiplicity-option.command.ts +1 -0
- package/commands/product/multiplicity-option/update-product-multiplicity-option.command.ts +1 -0
- package/package.json +1 -1
- package/schemas/discount-rules/discount-rules.schema.ts +8 -3
- package/schemas/index.ts +1 -0
- package/schemas/order-product/order-product-multiplicity-optiom.schema.ts +3 -0
- package/schemas/product/product-multiplicity-option-for-client.schema.ts +21 -0
- package/schemas/product/product-multiplicity-option.schema.ts +2 -0
- package/schemas/product/product.schema.ts +10 -1
package/build/commands/product/multiplicity-option/create-product-multiplicity-option.command.js
CHANGED
|
@@ -9,6 +9,7 @@ const CreateProductMultiplicityOptionRequestSchema = zod_1.z.object({
|
|
|
9
9
|
optionMultiplicity: zod_1.z.coerce.number().int().min(1),
|
|
10
10
|
optionPrice: non_negative_money_schema_1.NonNegativeMoneySchema.nullable().optional(),
|
|
11
11
|
rank: zod_1.z.coerce.number().int().min(0).default(0).optional(),
|
|
12
|
+
isDiscountAllowed: zod_1.z.coerce.boolean().optional(),
|
|
12
13
|
});
|
|
13
14
|
const CreateProductMultiplicityOptionResponseSchema = zod_1.z.object({
|
|
14
15
|
message: zod_1.z.string().optional(),
|
package/build/commands/product/multiplicity-option/update-product-multiplicity-option.command.js
CHANGED
|
@@ -10,6 +10,7 @@ const UpdateProductMultiplicityOptionRequestSchema = zod_1.z
|
|
|
10
10
|
optionMultiplicity: zod_1.z.coerce.number().int().min(1),
|
|
11
11
|
optionPrice: non_negative_money_schema_1.NonNegativeMoneySchema.nullable(),
|
|
12
12
|
rank: zod_1.z.coerce.number().int().min(0).default(0),
|
|
13
|
+
isDiscountAllowed: zod_1.z.coerce.boolean(),
|
|
13
14
|
})
|
|
14
15
|
.partial();
|
|
15
16
|
const UpdateProductMultiplicityOptionResponseSchema = zod_1.z.object({
|
|
@@ -17,8 +17,10 @@ exports.discountRulesModeSchema = zod_1.z.discriminatedUnion('typeDiscount', [
|
|
|
17
17
|
}),
|
|
18
18
|
]);
|
|
19
19
|
// Rules schemas other data
|
|
20
|
+
// Проценты ограничены так же, как в discountRulesModeSchema выше: за 100 % скидка уводит цену
|
|
21
|
+
// в минус, отрицательная — наценка под видом скидки.
|
|
20
22
|
const DiscountRulesPersonalDiscountDataSchema = zod_1.z.object({
|
|
21
|
-
discountPercent: zod_1.z.number(),
|
|
23
|
+
discountPercent: zod_1.z.number().min(0).max(100),
|
|
22
24
|
});
|
|
23
25
|
const DiscountRulesMonthlyOrderSumDataSchema = zod_1.z.object({
|
|
24
26
|
range: zod_1.z
|
|
@@ -26,11 +28,14 @@ const DiscountRulesMonthlyOrderSumDataSchema = zod_1.z.object({
|
|
|
26
28
|
.array()
|
|
27
29
|
.length(2)
|
|
28
30
|
.refine(([min, max]) => min <= max),
|
|
29
|
-
discountPercent: zod_1.z.number(),
|
|
31
|
+
discountPercent: zod_1.z.number().min(0).max(100),
|
|
30
32
|
});
|
|
31
33
|
const DiscountRulesQuantityBasedDataSchema = zod_1.z
|
|
32
34
|
.object({
|
|
33
|
-
multipleQuantity
|
|
35
|
+
// Кратность — целое положительное. При нуле `quantity % multipleQuantity` даёт NaN, и два
|
|
36
|
+
// потребителя расходятся: getPriceCalcDiscountOrderProductHelper считает условие
|
|
37
|
+
// выполненным всегда, splitQuantityProduct — не выполненным никогда.
|
|
38
|
+
multipleQuantity: zod_1.z.number().int().positive(),
|
|
34
39
|
})
|
|
35
40
|
.and(exports.discountRulesModeSchema);
|
|
36
41
|
const DiscountRulesItemDiscountDataSchema = exports.discountRulesModeSchema;
|
package/build/schemas/index.js
CHANGED
|
@@ -78,6 +78,7 @@ __exportStar(require("./report/sales-by-client-row.schema"), exports);
|
|
|
78
78
|
__exportStar(require("./action-log/index"), exports);
|
|
79
79
|
__exportStar(require("./delivery-route/delivery-route.schema"), exports);
|
|
80
80
|
__exportStar(require("./product/product-multiplicity-option.schema"), exports);
|
|
81
|
+
__exportStar(require("./product/product-multiplicity-option-for-client.schema"), exports);
|
|
81
82
|
__exportStar(require("./pre-order/pre-order-copy.schema"), exports);
|
|
82
83
|
__exportStar(require("./pre-order-collection-item/pre-order-collection-item-multiplicity-option.schema"), exports);
|
|
83
84
|
__exportStar(require("./message"), exports);
|
|
@@ -8,4 +8,7 @@ exports.OrderProductMultiplicityOptionSchema = zod_1.z.object({
|
|
|
8
8
|
title: zod_1.z.string().nullable(),
|
|
9
9
|
optionMultiplicity: zod_1.z.coerce.number(),
|
|
10
10
|
optionPrice: money_schema_1.MoneySchema.nullable(),
|
|
11
|
+
// Применять ли скидки клиента к цене этой кратности. Позиция заказа несёт флаг вместе с самой
|
|
12
|
+
// кратностью: панель считает цену сама и без него применит скидку к уже специальной цене.
|
|
13
|
+
isDiscountAllowed: zod_1.z.boolean(),
|
|
11
14
|
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProductMultiplicityOptionForClientSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const money_schema_1 = require("../money.schema");
|
|
6
|
+
const product_multiplicity_option_schema_1 = require("./product-multiplicity-option.schema");
|
|
7
|
+
/**
|
|
8
|
+
* Кратность товара в клиентских ответах — с уже посчитанной ценой.
|
|
9
|
+
*
|
|
10
|
+
* Витрина и мобильное приложение не считают скидку сами: правила живут на бэке и меняются там же,
|
|
11
|
+
* а любой пересчёт на клиенте означал бы выкатку клиента вслед за каждой правкой правил. Поэтому
|
|
12
|
+
* цена приезжает готовой.
|
|
13
|
+
*
|
|
14
|
+
* Поля необязательные, потому что та же схема товара обслуживает корзину
|
|
15
|
+
* (`OrderProductClientExtendedResponseModel`), где скидок нет вовсе — там позиция несёт свою
|
|
16
|
+
* зафиксированную цену. На каталожных ответах (`/webshop/product/...`) поля заполнены всегда.
|
|
17
|
+
*/
|
|
18
|
+
exports.ProductMultiplicityOptionForClientSchema = product_multiplicity_option_schema_1.ProductMultiplicityOptionSchema.extend({
|
|
19
|
+
/** Цена этой кратности после скидки клиента. `null` — скидка к ней неприменима. */
|
|
20
|
+
optionPriceWithDiscount: money_schema_1.MoneySchema.nullable().optional(),
|
|
21
|
+
/** Ложь, если продавец запретил скидку на этой кратности или у клиента её нет. */
|
|
22
|
+
isDiscountApplicable: zod_1.z.boolean().optional(),
|
|
23
|
+
});
|
|
@@ -9,4 +9,6 @@ exports.ProductMultiplicityOptionSchema = zod_1.z.object({
|
|
|
9
9
|
optionMultiplicity: zod_1.z.number(),
|
|
10
10
|
optionPrice: money_schema_1.MoneySchema.nullable(),
|
|
11
11
|
rank: zod_1.z.number(),
|
|
12
|
+
// Применять ли скидки клиента к цене этой кратности.
|
|
13
|
+
isDiscountAllowed: zod_1.z.boolean(),
|
|
12
14
|
});
|
|
@@ -9,6 +9,7 @@ const consignment_schema_1 = require("../consignment/consignment.schema");
|
|
|
9
9
|
const enum_1 = require("../../enum");
|
|
10
10
|
const discount_rules_schema_1 = require("../discount-rules/discount-rules.schema");
|
|
11
11
|
const __1 = require("../..");
|
|
12
|
+
const product_multiplicity_option_for_client_schema_1 = require("./product-multiplicity-option-for-client.schema");
|
|
12
13
|
const money_schema_1 = require("../money.schema");
|
|
13
14
|
exports.ProductSchema = zod_1.z.object({
|
|
14
15
|
uuid: zod_1.z.uuid(),
|
|
@@ -89,7 +90,7 @@ exports.ProductExtendedForClientSchema = exports.ProductForClientSchema.merge(zo
|
|
|
89
90
|
deliveryDate: zod_1.z.date(),
|
|
90
91
|
isInStock: zod_1.z.boolean(),
|
|
91
92
|
}),
|
|
92
|
-
multiplicityOptions: zod_1.z.array(
|
|
93
|
+
multiplicityOptions: zod_1.z.array(product_multiplicity_option_for_client_schema_1.ProductMultiplicityOptionForClientSchema).optional(),
|
|
93
94
|
discountDataList: zod_1.z
|
|
94
95
|
.object({
|
|
95
96
|
discountRulesUUID: zod_1.z.string(),
|
|
@@ -100,6 +101,14 @@ exports.ProductExtendedForClientSchema = exports.ProductForClientSchema.merge(zo
|
|
|
100
101
|
})
|
|
101
102
|
.array()
|
|
102
103
|
.optional(),
|
|
104
|
+
/**
|
|
105
|
+
* Лучшая цена базового тарифа после скидки. `null` — скидка неприменима.
|
|
106
|
+
*
|
|
107
|
+
* Отдельное поле, потому что «лучшая» — это выбор, а не порядок: раньше клиент брал
|
|
108
|
+
* `discountDataList[0]`, полагаясь на сортировку бэка, которая нигде не зафиксирована.
|
|
109
|
+
* Выбор делает бэк, `discountDataList` остаётся для показа самих правил.
|
|
110
|
+
*/
|
|
111
|
+
priceWithBestDiscount: money_schema_1.MoneySchema.nullable().optional(),
|
|
103
112
|
}));
|
|
104
113
|
exports.ProductExtendedForAdminSchema = exports.ProductExtendedSchema.merge(zod_1.z.object({
|
|
105
114
|
consignment: consignment_schema_1.ConsignmentSchema,
|
|
@@ -7,6 +7,7 @@ const CreateProductMultiplicityOptionRequestSchema = z.object({
|
|
|
7
7
|
optionMultiplicity: z.coerce.number().int().min(1),
|
|
8
8
|
optionPrice: NonNegativeMoneySchema.nullable().optional(),
|
|
9
9
|
rank: z.coerce.number().int().min(0).default(0).optional(),
|
|
10
|
+
isDiscountAllowed: z.coerce.boolean().optional(),
|
|
10
11
|
});
|
|
11
12
|
|
|
12
13
|
const CreateProductMultiplicityOptionResponseSchema = z.object({
|
|
@@ -8,6 +8,7 @@ const UpdateProductMultiplicityOptionRequestSchema = z
|
|
|
8
8
|
optionMultiplicity: z.coerce.number().int().min(1),
|
|
9
9
|
optionPrice: NonNegativeMoneySchema.nullable(),
|
|
10
10
|
rank: z.coerce.number().int().min(0).default(0),
|
|
11
|
+
isDiscountAllowed: z.coerce.boolean(),
|
|
11
12
|
})
|
|
12
13
|
.partial();
|
|
13
14
|
|
package/package.json
CHANGED
|
@@ -16,8 +16,10 @@ export const discountRulesModeSchema = z.discriminatedUnion('typeDiscount', [
|
|
|
16
16
|
]);
|
|
17
17
|
|
|
18
18
|
// Rules schemas other data
|
|
19
|
+
// Проценты ограничены так же, как в discountRulesModeSchema выше: за 100 % скидка уводит цену
|
|
20
|
+
// в минус, отрицательная — наценка под видом скидки.
|
|
19
21
|
const DiscountRulesPersonalDiscountDataSchema = z.object({
|
|
20
|
-
discountPercent: z.number(),
|
|
22
|
+
discountPercent: z.number().min(0).max(100),
|
|
21
23
|
});
|
|
22
24
|
|
|
23
25
|
const DiscountRulesMonthlyOrderSumDataSchema = z.object({
|
|
@@ -26,12 +28,15 @@ const DiscountRulesMonthlyOrderSumDataSchema = z.object({
|
|
|
26
28
|
.array()
|
|
27
29
|
.length(2)
|
|
28
30
|
.refine(([min, max]) => min <= max),
|
|
29
|
-
discountPercent: z.number(),
|
|
31
|
+
discountPercent: z.number().min(0).max(100),
|
|
30
32
|
});
|
|
31
33
|
|
|
32
34
|
const DiscountRulesQuantityBasedDataSchema = z
|
|
33
35
|
.object({
|
|
34
|
-
multipleQuantity
|
|
36
|
+
// Кратность — целое положительное. При нуле `quantity % multipleQuantity` даёт NaN, и два
|
|
37
|
+
// потребителя расходятся: getPriceCalcDiscountOrderProductHelper считает условие
|
|
38
|
+
// выполненным всегда, splitQuantityProduct — не выполненным никогда.
|
|
39
|
+
multipleQuantity: z.number().int().positive(),
|
|
35
40
|
})
|
|
36
41
|
.and(discountRulesModeSchema);
|
|
37
42
|
|
package/schemas/index.ts
CHANGED
|
@@ -62,6 +62,7 @@ export * from './report/sales-by-client-row.schema';
|
|
|
62
62
|
export * from './action-log/index';
|
|
63
63
|
export * from './delivery-route/delivery-route.schema';
|
|
64
64
|
export * from './product/product-multiplicity-option.schema';
|
|
65
|
+
export * from './product/product-multiplicity-option-for-client.schema';
|
|
65
66
|
export * from './pre-order/pre-order-copy.schema';
|
|
66
67
|
export * from './pre-order-collection-item/pre-order-collection-item-multiplicity-option.schema';
|
|
67
68
|
export * from './message';
|
|
@@ -6,4 +6,7 @@ export const OrderProductMultiplicityOptionSchema = z.object({
|
|
|
6
6
|
title: z.string().nullable(),
|
|
7
7
|
optionMultiplicity: z.coerce.number(),
|
|
8
8
|
optionPrice: MoneySchema.nullable(),
|
|
9
|
+
// Применять ли скидки клиента к цене этой кратности. Позиция заказа несёт флаг вместе с самой
|
|
10
|
+
// кратностью: панель считает цену сама и без него применит скидку к уже специальной цене.
|
|
11
|
+
isDiscountAllowed: z.boolean(),
|
|
9
12
|
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MoneySchema } from '../money.schema';
|
|
3
|
+
import { ProductMultiplicityOptionSchema } from './product-multiplicity-option.schema';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Кратность товара в клиентских ответах — с уже посчитанной ценой.
|
|
7
|
+
*
|
|
8
|
+
* Витрина и мобильное приложение не считают скидку сами: правила живут на бэке и меняются там же,
|
|
9
|
+
* а любой пересчёт на клиенте означал бы выкатку клиента вслед за каждой правкой правил. Поэтому
|
|
10
|
+
* цена приезжает готовой.
|
|
11
|
+
*
|
|
12
|
+
* Поля необязательные, потому что та же схема товара обслуживает корзину
|
|
13
|
+
* (`OrderProductClientExtendedResponseModel`), где скидок нет вовсе — там позиция несёт свою
|
|
14
|
+
* зафиксированную цену. На каталожных ответах (`/webshop/product/...`) поля заполнены всегда.
|
|
15
|
+
*/
|
|
16
|
+
export const ProductMultiplicityOptionForClientSchema = ProductMultiplicityOptionSchema.extend({
|
|
17
|
+
/** Цена этой кратности после скидки клиента. `null` — скидка к ней неприменима. */
|
|
18
|
+
optionPriceWithDiscount: MoneySchema.nullable().optional(),
|
|
19
|
+
/** Ложь, если продавец запретил скидку на этой кратности или у клиента её нет. */
|
|
20
|
+
isDiscountApplicable: z.boolean().optional(),
|
|
21
|
+
});
|
|
@@ -6,6 +6,7 @@ import { ConsignmentSchema } from '../consignment/consignment.schema';
|
|
|
6
6
|
import { DiscountRulesTypeEnum, ProductMarkEnum, SalesUnitEnum } from '../../enum';
|
|
7
7
|
import { discountRulesModeSchema } from '../discount-rules/discount-rules.schema';
|
|
8
8
|
import { ProductMultiplicityOptionSchema } from '../..';
|
|
9
|
+
import { ProductMultiplicityOptionForClientSchema } from './product-multiplicity-option-for-client.schema';
|
|
9
10
|
import { MoneySchema } from '../money.schema';
|
|
10
11
|
|
|
11
12
|
export const ProductSchema = z.object({
|
|
@@ -96,7 +97,7 @@ export const ProductExtendedForClientSchema = ProductForClientSchema.merge(
|
|
|
96
97
|
deliveryDate: z.date(),
|
|
97
98
|
isInStock: z.boolean(),
|
|
98
99
|
}),
|
|
99
|
-
multiplicityOptions: z.array(
|
|
100
|
+
multiplicityOptions: z.array(ProductMultiplicityOptionForClientSchema).optional(),
|
|
100
101
|
discountDataList: z
|
|
101
102
|
.object({
|
|
102
103
|
discountRulesUUID: z.string(),
|
|
@@ -107,6 +108,14 @@ export const ProductExtendedForClientSchema = ProductForClientSchema.merge(
|
|
|
107
108
|
})
|
|
108
109
|
.array()
|
|
109
110
|
.optional(),
|
|
111
|
+
/**
|
|
112
|
+
* Лучшая цена базового тарифа после скидки. `null` — скидка неприменима.
|
|
113
|
+
*
|
|
114
|
+
* Отдельное поле, потому что «лучшая» — это выбор, а не порядок: раньше клиент брал
|
|
115
|
+
* `discountDataList[0]`, полагаясь на сортировку бэка, которая нигде не зафиксирована.
|
|
116
|
+
* Выбор делает бэк, `discountDataList` остаётся для показа самих правил.
|
|
117
|
+
*/
|
|
118
|
+
priceWithBestDiscount: MoneySchema.nullable().optional(),
|
|
110
119
|
}),
|
|
111
120
|
);
|
|
112
121
|
|