@floristcloud/api-lib 1.2.130 → 1.2.132
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/discount-rules/get-product-discount-price.query.js +20 -1
- package/build/schemas/action-log/pre-order-product-info.schema.js +9 -2
- package/build/schemas/action-log/pre-order-product-update-action-log.schema.js +2 -1
- package/build/schemas/product/product.schema.js +17 -0
- package/commands/discount-rules/get-product-discount-price.query.ts +20 -1
- package/package.json +1 -1
- package/schemas/action-log/pre-order-product-info.schema.ts +9 -2
- package/schemas/action-log/pre-order-product-update-action-log.schema.ts +2 -1
- package/schemas/product/product.schema.ts +17 -0
|
@@ -16,7 +16,9 @@ const GetProductDiscountPriceRequestSchema = zod_1.z.object({
|
|
|
16
16
|
*
|
|
17
17
|
* `discountValueData` описывает, чем правило обернулось для этого товара, а не как оно настроено:
|
|
18
18
|
* у правила от себестоимости это готовая цена, и самой наценки здесь нет.
|
|
19
|
-
|
|
19
|
+
*
|
|
20
|
+
* В списки попадают только варианты, которые действительно снижают цену: правило, оставляющее базу
|
|
21
|
+
* как есть, выбором не является.
|
|
20
22
|
*/
|
|
21
23
|
const ProductDiscountPriceItemSchema = zod_1.z.object({
|
|
22
24
|
discountRulesUUID: zod_1.z.string(),
|
|
@@ -44,8 +46,25 @@ const GetProductDiscountPriceResponseSchema = zod_1.z.object({
|
|
|
44
46
|
optionPrice: money_schema_1.MoneySchema.nullable(),
|
|
45
47
|
optionPriceWithDiscount: money_schema_1.MoneySchema.nullable(),
|
|
46
48
|
isDiscountApplicable: zod_1.z.boolean(),
|
|
49
|
+
/**
|
|
50
|
+
* Варианты по этой фасовке: те же правила, но посчитанные от её цены.
|
|
51
|
+
*
|
|
52
|
+
* Список свой у каждой кратности, потому что база у них разная — у правила нет
|
|
53
|
+
* одной цены на товар, пока не выбрана форма отгрузки. Пустой список означает
|
|
54
|
+
* «выбирать нечего»: скидки к этой кратности запрещены продавцом либо ни одно
|
|
55
|
+
* правило её цену не снижает.
|
|
56
|
+
*
|
|
57
|
+
* Порядок элементов не отсортирован по цене — он унаследован от сортировки правил
|
|
58
|
+
* товара, а база у фасовки другая. Лучшую цену берите из `optionPriceWithDiscount`,
|
|
59
|
+
* а не из первого элемента.
|
|
60
|
+
*/
|
|
61
|
+
discountDataList: ProductDiscountPriceItemSchema.array(),
|
|
47
62
|
})
|
|
48
63
|
.array(),
|
|
64
|
+
/**
|
|
65
|
+
* Варианты по базовой цене товара. Как и у фасовок, порядок не гарантирован: лучшую цену
|
|
66
|
+
* отдаёт `priceWithBestDiscount`.
|
|
67
|
+
*/
|
|
49
68
|
discountDataList: ProductDiscountPriceItemSchema.array(),
|
|
50
69
|
}),
|
|
51
70
|
});
|
|
@@ -3,12 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PreOrderProductInfoSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const action_log_money_schema_1 = require("./action-log-money.schema");
|
|
6
|
+
/**
|
|
7
|
+
* Снимок позиции предзаказа в журнале аудита.
|
|
8
|
+
*
|
|
9
|
+
* `name` и `price` — nullable: у позиции предзаказа наименование и цена появляются не сразу
|
|
10
|
+
* (в БД `pre_order_product.name` и `price` тоже nullable), и журнал фиксирует позицию такой,
|
|
11
|
+
* какой она была на момент события. Записи с `null` уже лежат в `action_log.payload`.
|
|
12
|
+
*/
|
|
6
13
|
exports.PreOrderProductInfoSchema = zod_1.z.object({
|
|
7
14
|
preOrderUUID: zod_1.z.string(),
|
|
8
15
|
preOrderProductUUID: zod_1.z.string(),
|
|
9
|
-
name: zod_1.z.string(),
|
|
16
|
+
name: zod_1.z.string().nullable(),
|
|
10
17
|
categoryName: zod_1.z.string().nullable(),
|
|
11
18
|
quantity: zod_1.z.coerce.number(),
|
|
12
|
-
price: action_log_money_schema_1.ActionLogMoneySchema,
|
|
19
|
+
price: action_log_money_schema_1.ActionLogMoneySchema.nullable(),
|
|
13
20
|
comment: zod_1.z.string().nullable(),
|
|
14
21
|
});
|
|
@@ -7,6 +7,7 @@ const action_log_money_schema_1 = require("./action-log-money.schema");
|
|
|
7
7
|
exports.PreOrderProductUpdateActionLogSchema = zod_1.z.object({
|
|
8
8
|
preOrderProduct: pre_order_product_info_schema_1.PreOrderProductInfoSchema,
|
|
9
9
|
newQuantity: zod_1.z.coerce.number(),
|
|
10
|
-
|
|
10
|
+
// Цену позиции предзаказа можно снять — новое значение бывает null, см. PreOrderProductInfoSchema.
|
|
11
|
+
newPrice: action_log_money_schema_1.ActionLogMoneySchema.nullable(),
|
|
11
12
|
newComment: zod_1.z.string().nullable(),
|
|
12
13
|
});
|
|
@@ -91,6 +91,23 @@ exports.ProductExtendedForClientSchema = exports.ProductForClientSchema.merge(zo
|
|
|
91
91
|
isInStock: zod_1.z.boolean(),
|
|
92
92
|
}),
|
|
93
93
|
multiplicityOptions: zod_1.z.array(product_multiplicity_option_for_client_schema_1.ProductMultiplicityOptionForClientSchema).optional(),
|
|
94
|
+
/**
|
|
95
|
+
* Правила клиента, снижающие **базовую цену товара**, — и только они.
|
|
96
|
+
*
|
|
97
|
+
* Правило, оставляющее цену как есть, в список не попадает: это не скидка, а «скидка» с
|
|
98
|
+
* той же ценой рядом. Так выходит у правила от себестоимости, когда «себестоимость +
|
|
99
|
+
* наценка» вышла выше прайса, и у скидки в 0 %. Отбор общий с панелью
|
|
100
|
+
* (`GetProductDiscountPriceContractQuery`) — правила отбираются одинаково.
|
|
101
|
+
*
|
|
102
|
+
* Список считается от базовой цены товара, поэтому пустой список **не означает**, что у
|
|
103
|
+
* клиента нет скидочных цен по этому товару вовсе: у кратности своя база, и правило может
|
|
104
|
+
* снижать цену фасовки, не снижая цену штуки. Цена каждой фасовки — в её собственных
|
|
105
|
+
* `optionPriceWithDiscount` и `isDiscountApplicable`, там результат уже посчитан от нужной
|
|
106
|
+
* базы. Пример: прайс 50, фасовка 80, «себестоимость + наценка» 60 — список пуст, а
|
|
107
|
+
* фасовка идёт по 60.
|
|
108
|
+
*
|
|
109
|
+
* Порядок не зафиксирован — лучшую цену базового тарифа берите из `priceWithBestDiscount`.
|
|
110
|
+
*/
|
|
94
111
|
discountDataList: zod_1.z
|
|
95
112
|
.object({
|
|
96
113
|
discountRulesUUID: zod_1.z.string(),
|
|
@@ -15,7 +15,9 @@ const GetProductDiscountPriceRequestSchema = z.object({
|
|
|
15
15
|
*
|
|
16
16
|
* `discountValueData` описывает, чем правило обернулось для этого товара, а не как оно настроено:
|
|
17
17
|
* у правила от себестоимости это готовая цена, и самой наценки здесь нет.
|
|
18
|
-
|
|
18
|
+
*
|
|
19
|
+
* В списки попадают только варианты, которые действительно снижают цену: правило, оставляющее базу
|
|
20
|
+
* как есть, выбором не является.
|
|
19
21
|
*/
|
|
20
22
|
const ProductDiscountPriceItemSchema = z.object({
|
|
21
23
|
discountRulesUUID: z.string(),
|
|
@@ -44,8 +46,25 @@ const GetProductDiscountPriceResponseSchema = z.object({
|
|
|
44
46
|
optionPrice: MoneySchema.nullable(),
|
|
45
47
|
optionPriceWithDiscount: MoneySchema.nullable(),
|
|
46
48
|
isDiscountApplicable: z.boolean(),
|
|
49
|
+
/**
|
|
50
|
+
* Варианты по этой фасовке: те же правила, но посчитанные от её цены.
|
|
51
|
+
*
|
|
52
|
+
* Список свой у каждой кратности, потому что база у них разная — у правила нет
|
|
53
|
+
* одной цены на товар, пока не выбрана форма отгрузки. Пустой список означает
|
|
54
|
+
* «выбирать нечего»: скидки к этой кратности запрещены продавцом либо ни одно
|
|
55
|
+
* правило её цену не снижает.
|
|
56
|
+
*
|
|
57
|
+
* Порядок элементов не отсортирован по цене — он унаследован от сортировки правил
|
|
58
|
+
* товара, а база у фасовки другая. Лучшую цену берите из `optionPriceWithDiscount`,
|
|
59
|
+
* а не из первого элемента.
|
|
60
|
+
*/
|
|
61
|
+
discountDataList: ProductDiscountPriceItemSchema.array(),
|
|
47
62
|
})
|
|
48
63
|
.array(),
|
|
64
|
+
/**
|
|
65
|
+
* Варианты по базовой цене товара. Как и у фасовок, порядок не гарантирован: лучшую цену
|
|
66
|
+
* отдаёт `priceWithBestDiscount`.
|
|
67
|
+
*/
|
|
49
68
|
discountDataList: ProductDiscountPriceItemSchema.array(),
|
|
50
69
|
}),
|
|
51
70
|
});
|
package/package.json
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { ActionLogMoneySchema } from './action-log-money.schema';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Снимок позиции предзаказа в журнале аудита.
|
|
6
|
+
*
|
|
7
|
+
* `name` и `price` — nullable: у позиции предзаказа наименование и цена появляются не сразу
|
|
8
|
+
* (в БД `pre_order_product.name` и `price` тоже nullable), и журнал фиксирует позицию такой,
|
|
9
|
+
* какой она была на момент события. Записи с `null` уже лежат в `action_log.payload`.
|
|
10
|
+
*/
|
|
4
11
|
export const PreOrderProductInfoSchema = z.object({
|
|
5
12
|
preOrderUUID: z.string(),
|
|
6
13
|
preOrderProductUUID: z.string(),
|
|
7
|
-
name: z.string(),
|
|
14
|
+
name: z.string().nullable(),
|
|
8
15
|
categoryName: z.string().nullable(),
|
|
9
16
|
quantity: z.coerce.number(),
|
|
10
|
-
price: ActionLogMoneySchema,
|
|
17
|
+
price: ActionLogMoneySchema.nullable(),
|
|
11
18
|
comment: z.string().nullable(),
|
|
12
19
|
});
|
|
@@ -5,6 +5,7 @@ import { ActionLogMoneySchema } from './action-log-money.schema';
|
|
|
5
5
|
export const PreOrderProductUpdateActionLogSchema = z.object({
|
|
6
6
|
preOrderProduct: PreOrderProductInfoSchema,
|
|
7
7
|
newQuantity: z.coerce.number(),
|
|
8
|
-
|
|
8
|
+
// Цену позиции предзаказа можно снять — новое значение бывает null, см. PreOrderProductInfoSchema.
|
|
9
|
+
newPrice: ActionLogMoneySchema.nullable(),
|
|
9
10
|
newComment: z.string().nullable(),
|
|
10
11
|
});
|
|
@@ -98,6 +98,23 @@ export const ProductExtendedForClientSchema = ProductForClientSchema.merge(
|
|
|
98
98
|
isInStock: z.boolean(),
|
|
99
99
|
}),
|
|
100
100
|
multiplicityOptions: z.array(ProductMultiplicityOptionForClientSchema).optional(),
|
|
101
|
+
/**
|
|
102
|
+
* Правила клиента, снижающие **базовую цену товара**, — и только они.
|
|
103
|
+
*
|
|
104
|
+
* Правило, оставляющее цену как есть, в список не попадает: это не скидка, а «скидка» с
|
|
105
|
+
* той же ценой рядом. Так выходит у правила от себестоимости, когда «себестоимость +
|
|
106
|
+
* наценка» вышла выше прайса, и у скидки в 0 %. Отбор общий с панелью
|
|
107
|
+
* (`GetProductDiscountPriceContractQuery`) — правила отбираются одинаково.
|
|
108
|
+
*
|
|
109
|
+
* Список считается от базовой цены товара, поэтому пустой список **не означает**, что у
|
|
110
|
+
* клиента нет скидочных цен по этому товару вовсе: у кратности своя база, и правило может
|
|
111
|
+
* снижать цену фасовки, не снижая цену штуки. Цена каждой фасовки — в её собственных
|
|
112
|
+
* `optionPriceWithDiscount` и `isDiscountApplicable`, там результат уже посчитан от нужной
|
|
113
|
+
* базы. Пример: прайс 50, фасовка 80, «себестоимость + наценка» 60 — список пуст, а
|
|
114
|
+
* фасовка идёт по 60.
|
|
115
|
+
*
|
|
116
|
+
* Порядок не зафиксирован — лучшую цену базового тарифа берите из `priceWithBestDiscount`.
|
|
117
|
+
*/
|
|
101
118
|
discountDataList: z
|
|
102
119
|
.object({
|
|
103
120
|
discountRulesUUID: z.string(),
|