@floristcloud/api-lib 1.2.143 → 1.2.145
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/category/create-category.command.js +2 -7
- package/build/commands/category/get-category-list.query.js +4 -18
- package/build/commands/category/update-category-command.js +2 -9
- package/build/commands/category-template/create-category-template.command.js +5 -0
- package/build/commands/category-template/update-category-template.command.js +9 -1
- package/build/commands/product/webshop/get-product-list-for-client.query.js +6 -0
- package/build/commands/type/create-type.command.js +2 -4
- package/build/commands/type/update-type.command.js +2 -4
- package/build/enum/index.js +1 -0
- package/build/enum/product-client-sort-by.enum.js +17 -0
- package/build/helpers/index.js +1 -0
- package/build/helpers/resolve-localized-name.helper.js +15 -0
- package/build/schemas/category/category-create.schema.js +15 -0
- package/build/schemas/category/category-list-filter.schema.js +25 -0
- package/build/schemas/category/category-list.schema.js +10 -0
- package/build/schemas/category/category-update.schema.js +17 -0
- package/build/schemas/category/category.schema.js +4 -0
- package/build/schemas/category-template/category-template.schema.js +5 -0
- package/build/schemas/i18n/localized-name.schema.js +13 -0
- package/build/schemas/index.js +7 -0
- package/build/schemas/product/product.schema.js +3 -0
- package/build/schemas/type/type-create.schema.js +11 -0
- package/build/schemas/type/type-update.schema.js +12 -0
- package/build/schemas/type/type.schema.js +3 -0
- package/commands/category/create-category.command.ts +2 -7
- package/commands/category/get-category-list.query.ts +4 -18
- package/commands/category/update-category-command.ts +2 -9
- package/commands/category-template/create-category-template.command.ts +5 -0
- package/commands/category-template/update-category-template.command.ts +9 -1
- package/commands/product/webshop/get-product-list-for-client.query.ts +7 -1
- package/commands/type/create-type.command.ts +2 -4
- package/commands/type/update-type.command.ts +2 -4
- package/enum/index.ts +1 -0
- package/enum/product-client-sort-by.enum.ts +13 -0
- package/helpers/index.ts +1 -0
- package/helpers/resolve-localized-name.helper.ts +15 -0
- package/package.json +1 -1
- package/schemas/category/category-create.schema.ts +13 -0
- package/schemas/category/category-list-filter.schema.ts +23 -0
- package/schemas/category/category-list.schema.ts +8 -0
- package/schemas/category/category-update.schema.ts +15 -0
- package/schemas/category/category.schema.ts +4 -0
- package/schemas/category-template/category-template.schema.ts +5 -0
- package/schemas/i18n/localized-name.schema.ts +13 -0
- package/schemas/index.ts +7 -0
- package/schemas/product/product.schema.ts +3 -0
- package/schemas/type/type-create.schema.ts +9 -0
- package/schemas/type/type-update.schema.ts +10 -0
- package/schemas/type/type.schema.ts +3 -0
|
@@ -3,13 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CreateCategoryContractCommand = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const schemas_1 = require("../../schemas");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
multiplicity: zod_1.z.number(),
|
|
9
|
-
isSizeSeparate: zod_1.z.coerce.boolean(),
|
|
10
|
-
typeUUID: zod_1.z.string(),
|
|
11
|
-
isSaveCategoryName: zod_1.z.coerce.boolean(),
|
|
12
|
-
});
|
|
6
|
+
const category_create_schema_1 = require("../../schemas/category/category-create.schema");
|
|
7
|
+
const CreateCategoryRequestSchema = category_create_schema_1.CategoryCreateSchema;
|
|
13
8
|
const CreateCategoryResponseSchema = zod_1.z.object({
|
|
14
9
|
message: zod_1.z.string().optional(),
|
|
15
10
|
data: schemas_1.CategorySchema,
|
|
@@ -2,26 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GetCategoryListContractQuery = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const GetCategoryListRequestSchema = zod_1.z.object({
|
|
9
|
-
page: zod_1.z.coerce.number().optional().default(1),
|
|
10
|
-
count: zod_1.z.coerce.number().optional().default(10),
|
|
11
|
-
searchQuery: zod_1.z
|
|
12
|
-
.string()
|
|
13
|
-
.optional()
|
|
14
|
-
.refine(val => !val || val.length < Math.pow(10, 6)),
|
|
15
|
-
typeUUID: zod_1.z.uuid().optional(),
|
|
16
|
-
statuses: zod_1.z.array(zod_1.z.nativeEnum(enum_1.CategoryStatusEnum)).default([]),
|
|
17
|
-
orderByType: zod_1.z.nativeEnum(order_by_enum_1.OrderByEnum).default(order_by_enum_1.OrderByEnum.ASC),
|
|
18
|
-
});
|
|
5
|
+
const category_list_filter_schema_1 = require("../../schemas/category/category-list-filter.schema");
|
|
6
|
+
const category_list_schema_1 = require("../../schemas/category/category-list.schema");
|
|
7
|
+
const GetCategoryListRequestSchema = category_list_filter_schema_1.CategoryListFilterSchema;
|
|
19
8
|
const GetCategoryResponseSchema = zod_1.z.object({
|
|
20
9
|
message: zod_1.z.string().optional(),
|
|
21
|
-
data:
|
|
22
|
-
categoryList: category_schema_1.CategoryExtendedSchema.array(),
|
|
23
|
-
total: zod_1.z.number(),
|
|
24
|
-
}),
|
|
10
|
+
data: category_list_schema_1.CategoryListSchema,
|
|
25
11
|
});
|
|
26
12
|
var GetCategoryListContractQuery;
|
|
27
13
|
(function (GetCategoryListContractQuery) {
|
|
@@ -3,15 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UpdateCategoryContractCommand = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const schemas_1 = require("../../schemas");
|
|
6
|
-
const
|
|
7
|
-
const UpdateCategoryRequestSchema =
|
|
8
|
-
name: zod_1.z.string(),
|
|
9
|
-
typeUUID: zod_1.z.string(),
|
|
10
|
-
multiplicity: zod_1.z.number(),
|
|
11
|
-
isSizeSeparate: zod_1.z.coerce.boolean(),
|
|
12
|
-
isSaveCategoryName: zod_1.z.coerce.boolean(),
|
|
13
|
-
status: zod_1.z.nativeEnum(enum_1.CategoryStatusEnum),
|
|
14
|
-
});
|
|
6
|
+
const category_update_schema_1 = require("../../schemas/category/category-update.schema");
|
|
7
|
+
const UpdateCategoryRequestSchema = category_update_schema_1.CategoryUpdateSchema;
|
|
15
8
|
const UpdateCategoryResponseSchema = zod_1.z.object({
|
|
16
9
|
message: zod_1.z.string().optional(),
|
|
17
10
|
data: schemas_1.CategorySchema.nullable(),
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CreateCategoryTemplateContractCommand = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const schemas_1 = require("../../schemas");
|
|
6
|
+
const localized_name_schema_1 = require("../../schemas/i18n/localized-name.schema");
|
|
7
|
+
// Переводы необязательны: без них шаблон живёт на каноническом имени, как и раньше.
|
|
6
8
|
const CreateCategoryTemplateRequestSchema = schemas_1.CategoryTemplateSchema.pick({
|
|
7
9
|
name: true,
|
|
8
10
|
alias: true,
|
|
@@ -11,6 +13,9 @@ const CreateCategoryTemplateRequestSchema = schemas_1.CategoryTemplateSchema.pic
|
|
|
11
13
|
multiplicity: true,
|
|
12
14
|
isSizeSeparate: true,
|
|
13
15
|
isSaveCategoryName: true,
|
|
16
|
+
}).extend({
|
|
17
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
18
|
+
typeNameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
14
19
|
});
|
|
15
20
|
const CreateCategoryTemplateResponseSchema = zod_1.z.object({
|
|
16
21
|
message: zod_1.z.string().optional(),
|
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UpdateCategoryTemplateContractCommand = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const schemas_1 = require("../../schemas");
|
|
6
|
+
const localized_name_schema_1 = require("../../schemas/i18n/localized-name.schema");
|
|
7
|
+
// Переводы вынесены из `pick`: `.partial()` сделал бы их только необязательными, а очистка словаря
|
|
8
|
+
// должна быть выразима явно — как у категории и типа, через `null` или пустой объект.
|
|
6
9
|
const UpdateCategoryTemplateRequestSchema = schemas_1.CategoryTemplateSchema.pick({
|
|
7
10
|
name: true,
|
|
8
11
|
alias: true,
|
|
@@ -11,7 +14,12 @@ const UpdateCategoryTemplateRequestSchema = schemas_1.CategoryTemplateSchema.pic
|
|
|
11
14
|
multiplicity: true,
|
|
12
15
|
isSizeSeparate: true,
|
|
13
16
|
isSaveCategoryName: true,
|
|
14
|
-
})
|
|
17
|
+
})
|
|
18
|
+
.partial()
|
|
19
|
+
.extend({
|
|
20
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
21
|
+
typeNameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
22
|
+
});
|
|
15
23
|
const UpdateCategoryTemplateResponseSchema = zod_1.z.object({
|
|
16
24
|
message: zod_1.z.string().optional(),
|
|
17
25
|
data: schemas_1.CategoryTemplateSchema.optional(),
|
|
@@ -20,6 +20,12 @@ const GetProductListForClientRequestSchema = zod_1.z.object({
|
|
|
20
20
|
typeUUID: zod_1.z.string().optional(),
|
|
21
21
|
searchQuery: zod_1.z.string().optional(),
|
|
22
22
|
marks: zod_1.z.nativeEnum(enum_1.ProductMarkEnum).array().optional(),
|
|
23
|
+
// Без `sortBy` порядок остаётся прежним — по категории, названию и размеру. Сортировка по цене
|
|
24
|
+
// идёт по базовому прайсу, скидки клиента её не двигают: см. ProductClientSortByEnum.
|
|
25
|
+
sortBy: zod_1.z.nativeEnum(enum_1.ProductClientSortByEnum).optional(),
|
|
26
|
+
// Без `.default()`: он уезжает в `_output`, а значит и в опубликованный `Request`, делая поле
|
|
27
|
+
// обязательным для клиентов. Отсутствующее направление билдер и так читает как ASC.
|
|
28
|
+
sortOrder: zod_1.z.nativeEnum(enum_1.OrderByEnum).optional(),
|
|
23
29
|
});
|
|
24
30
|
const GetProductListForClientResponseSchema = zod_1.z.object({
|
|
25
31
|
message: zod_1.z.string().optional(),
|
|
@@ -3,10 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CreateTypeContractCommand = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const type_schema_1 = require("../../schemas/type/type.schema");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
rank: zod_1.z.number(),
|
|
9
|
-
});
|
|
6
|
+
const type_create_schema_1 = require("../../schemas/type/type-create.schema");
|
|
7
|
+
const CreateTypeRequestSchema = type_create_schema_1.TypeCreateSchema;
|
|
10
8
|
const CreateTypeResponseSchema = zod_1.z.object({
|
|
11
9
|
message: zod_1.z.string().optional(),
|
|
12
10
|
data: type_schema_1.TypeSchema,
|
|
@@ -3,10 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UpdateTypeContractCommand = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const schemas_1 = require("../../schemas");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
rank: zod_1.z.number(),
|
|
9
|
-
});
|
|
6
|
+
const type_update_schema_1 = require("../../schemas/type/type-update.schema");
|
|
7
|
+
const UpdateTypeRequestSchema = type_update_schema_1.TypeUpdateSchema;
|
|
10
8
|
const UpdateTypeResponseSchema = zod_1.z.object({
|
|
11
9
|
message: zod_1.z.string().optional(),
|
|
12
10
|
data: schemas_1.CategorySchema.nullable(),
|
package/build/enum/index.js
CHANGED
|
@@ -65,6 +65,7 @@ __exportStar(require("./position-report-type.enum"), exports);
|
|
|
65
65
|
__exportStar(require("./discount-price-routing.enum"), exports);
|
|
66
66
|
__exportStar(require("./sales-unit.enum"), exports);
|
|
67
67
|
__exportStar(require("./product-mark.enum"), exports);
|
|
68
|
+
__exportStar(require("./product-client-sort-by.enum"), exports);
|
|
68
69
|
__exportStar(require("./sales-by-position-group-by.enum"), exports);
|
|
69
70
|
__exportStar(require("./client-import-entity-property.enum"), exports);
|
|
70
71
|
__exportStar(require("./client-import-errors.enum"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProductClientSortByEnum = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Поле сортировки списка товаров витрины. Значение совпадает с именем поля ответа, чтобы клиент
|
|
6
|
+
* сортировал «по тому, что видит».
|
|
7
|
+
*
|
|
8
|
+
* `PRICE` — это базовый прайс товара, без скидок клиента. Порядок задаётся в SQL до пагинации, а
|
|
9
|
+
* скидки накладываются уже на выбранную страницу, поэтому сортировать по цене со скидкой значило бы
|
|
10
|
+
* либо считать её для всей выборки в памяти, либо продублировать цепочку правил в SQL. У клиента со
|
|
11
|
+
* сквозным процентом порядок от этого не меняется; расходится он там, где действует правило от
|
|
12
|
+
* себестоимости (COST_PLUS_MARKUP) или точечный ITEM_DISCOUNT.
|
|
13
|
+
*/
|
|
14
|
+
var ProductClientSortByEnum;
|
|
15
|
+
(function (ProductClientSortByEnum) {
|
|
16
|
+
ProductClientSortByEnum["PRICE"] = "price";
|
|
17
|
+
})(ProductClientSortByEnum || (exports.ProductClientSortByEnum = ProductClientSortByEnum = {}));
|
package/build/helpers/index.js
CHANGED
|
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./date.helper"), exports);
|
|
18
18
|
__exportStar(require("./pagination.helper"), exports);
|
|
19
19
|
__exportStar(require("./query-boolean.helper"), exports);
|
|
20
|
+
__exportStar(require("./resolve-localized-name.helper"), exports);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveLocalizedName = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Название сущности на запрошенном языке.
|
|
6
|
+
*
|
|
7
|
+
* Один резолвер на бэкенд и оба фронта, чтобы одна и та же категория нигде не подписывалась
|
|
8
|
+
* по-разному. Перевода нет, он пустой или состоит из пробелов — показываем канон: пустая подпись
|
|
9
|
+
* хуже подписи на чужом языке.
|
|
10
|
+
*/
|
|
11
|
+
const resolveLocalizedName = (name, translations, language) => {
|
|
12
|
+
const translated = language ? translations === null || translations === void 0 ? void 0 : translations[language] : undefined;
|
|
13
|
+
return translated && translated.trim() ? translated : name;
|
|
14
|
+
};
|
|
15
|
+
exports.resolveLocalizedName = resolveLocalizedName;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CategoryCreateSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
6
|
+
// Поля новой категории. Название на дополнительных языках необязательно: без переводов
|
|
7
|
+
// категория живёт на каноническом имени.
|
|
8
|
+
exports.CategoryCreateSchema = zod_1.z.object({
|
|
9
|
+
name: zod_1.z.string(),
|
|
10
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
11
|
+
multiplicity: zod_1.z.number(),
|
|
12
|
+
isSizeSeparate: zod_1.z.coerce.boolean(),
|
|
13
|
+
typeUUID: zod_1.z.string(),
|
|
14
|
+
isSaveCategoryName: zod_1.z.coerce.boolean(),
|
|
15
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CategoryListFilterSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const enum_1 = require("../../enum");
|
|
6
|
+
const language_enum_1 = require("../../enum/language.enum");
|
|
7
|
+
const order_by_enum_1 = require("../../enum/order-by.enum");
|
|
8
|
+
// Условия выборки справочника категорий.
|
|
9
|
+
exports.CategoryListFilterSchema = zod_1.z.object({
|
|
10
|
+
page: zod_1.z.coerce.number().optional().default(1),
|
|
11
|
+
count: zod_1.z.coerce.number().optional().default(10),
|
|
12
|
+
searchQuery: zod_1.z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.refine(val => !val || val.length < Math.pow(10, 6)),
|
|
16
|
+
typeUUID: zod_1.z.uuid().optional(),
|
|
17
|
+
statuses: zod_1.z.array(zod_1.z.nativeEnum(enum_1.CategoryStatusEnum)).default([]),
|
|
18
|
+
orderByType: zod_1.z.nativeEnum(order_by_enum_1.OrderByEnum).default(order_by_enum_1.OrderByEnum.ASC),
|
|
19
|
+
/**
|
|
20
|
+
* Язык, на котором подписывается список. Передан — справочник сортируется по отображаемому
|
|
21
|
+
* названию: страницу из двадцати строк клиент пересортировать не может, а порядок «по русскому
|
|
22
|
+
* алфавиту с английскими подписями» выглядит случайным. Не передан — сортировка по канону.
|
|
23
|
+
*/
|
|
24
|
+
language: zod_1.z.nativeEnum(language_enum_1.LanguageEnum).optional(),
|
|
25
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CategoryListSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const category_schema_1 = require("./category.schema");
|
|
6
|
+
// Страница справочника категорий вместе с общим числом строк по фильтру.
|
|
7
|
+
exports.CategoryListSchema = zod_1.z.object({
|
|
8
|
+
categoryList: category_schema_1.CategoryExtendedSchema.array(),
|
|
9
|
+
total: zod_1.z.number(),
|
|
10
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CategoryUpdateSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const enum_1 = require("../../enum");
|
|
6
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
7
|
+
// Поля редактируемой категории. Переводы отсутствуют в теле — остаются прежними;
|
|
8
|
+
// `null` и пустой объект их очищают.
|
|
9
|
+
exports.CategoryUpdateSchema = zod_1.z.object({
|
|
10
|
+
name: zod_1.z.string(),
|
|
11
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
12
|
+
typeUUID: zod_1.z.string(),
|
|
13
|
+
multiplicity: zod_1.z.number(),
|
|
14
|
+
isSizeSeparate: zod_1.z.coerce.boolean(),
|
|
15
|
+
isSaveCategoryName: zod_1.z.coerce.boolean(),
|
|
16
|
+
status: zod_1.z.nativeEnum(enum_1.CategoryStatusEnum),
|
|
17
|
+
});
|
|
@@ -3,10 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CategoryExtendedSchema = exports.CategorySchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const category_status_enum_1 = require("../../enum/category-status.enum");
|
|
6
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
6
7
|
const type_schema_1 = require("../type/type.schema");
|
|
7
8
|
exports.CategorySchema = zod_1.z.object({
|
|
8
9
|
uuid: zod_1.z.uuid(),
|
|
10
|
+
// Канон, по нему сходятся импорт, отчёты и выгрузки.
|
|
9
11
|
name: zod_1.z.string(),
|
|
12
|
+
// Переопределения названия по языкам; какое показать — решает клиент через resolveLocalizedName.
|
|
13
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema,
|
|
10
14
|
multiplicity: zod_1.z.number().nullable(),
|
|
11
15
|
isSizeSeparate: zod_1.z.boolean(),
|
|
12
16
|
isSaveCategoryName: zod_1.z.boolean(),
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CategoryTemplateListSchema = exports.CategoryTemplateSchema = exports.CategoryTemplateTypeSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const language_enum_1 = require("../../enum/language.enum");
|
|
6
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
6
7
|
exports.CategoryTemplateTypeSchema = zod_1.z.object({
|
|
7
8
|
name: zod_1.z.string(),
|
|
8
9
|
rank: zod_1.z.number(),
|
|
@@ -10,6 +11,10 @@ exports.CategoryTemplateTypeSchema = zod_1.z.object({
|
|
|
10
11
|
exports.CategoryTemplateSchema = zod_1.z.object({
|
|
11
12
|
uuid: zod_1.z.uuid(),
|
|
12
13
|
name: zod_1.z.string(),
|
|
14
|
+
// Переводы шаблона наследуют категории и типы новой компании, поэтому правка справочника
|
|
15
|
+
// здесь доезжает до всех, кто зарегистрируется после неё.
|
|
16
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema,
|
|
17
|
+
typeNameTranslations: localized_name_schema_1.LocalizedNameSchema,
|
|
13
18
|
alias: zod_1.z.string().array(),
|
|
14
19
|
type: exports.CategoryTemplateTypeSchema,
|
|
15
20
|
language: zod_1.z.nativeEnum(language_enum_1.LanguageEnum),
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalizedNameSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const language_enum_1 = require("../../enum/language.enum");
|
|
6
|
+
/**
|
|
7
|
+
* Переопределения названия по языкам.
|
|
8
|
+
*
|
|
9
|
+
* Канон живёт в поле `name` и остаётся ключом сущности — по нему матчится импорт, сходятся отчёты
|
|
10
|
+
* и совпадают выгрузки. Сюда кладутся только отличия от канона, поэтому основной язык компании
|
|
11
|
+
* здесь не хранится: иначе `name` и перевод на тот же язык начали бы расходиться.
|
|
12
|
+
*/
|
|
13
|
+
exports.LocalizedNameSchema = zod_1.z.partialRecord(zod_1.z.enum(language_enum_1.LanguageEnum), zod_1.z.string().trim().max(255));
|
package/build/schemas/index.js
CHANGED
|
@@ -14,6 +14,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./i18n/localized-name.schema"), exports);
|
|
18
|
+
__exportStar(require("./category/category-create.schema"), exports);
|
|
19
|
+
__exportStar(require("./category/category-update.schema"), exports);
|
|
20
|
+
__exportStar(require("./category/category-list-filter.schema"), exports);
|
|
21
|
+
__exportStar(require("./category/category-list.schema"), exports);
|
|
22
|
+
__exportStar(require("./type/type-create.schema"), exports);
|
|
23
|
+
__exportStar(require("./type/type-update.schema"), exports);
|
|
17
24
|
__exportStar(require("./company/company.schema"), exports);
|
|
18
25
|
__exportStar(require("./client/client.schema"), exports);
|
|
19
26
|
__exportStar(require("./user/user.schema"), exports);
|
|
@@ -4,6 +4,7 @@ exports.ProductExtendedForAdminWithStatistic = exports.ProductExtendedForAdminSc
|
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const product_image_schema_1 = require("../product-image/product-image.schema");
|
|
6
6
|
const category_schema_1 = require("../category/category.schema");
|
|
7
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
7
8
|
const type_schema_1 = require("../type/type.schema");
|
|
8
9
|
const consignment_schema_1 = require("../consignment/consignment.schema");
|
|
9
10
|
const enum_1 = require("../../enum");
|
|
@@ -73,12 +74,14 @@ exports.ProductExtendedForClientSchema = exports.ProductForClientSchema.merge(zo
|
|
|
73
74
|
.object({
|
|
74
75
|
uuid: zod_1.z.string(),
|
|
75
76
|
name: zod_1.z.string(),
|
|
77
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema,
|
|
76
78
|
})
|
|
77
79
|
.nullable(),
|
|
78
80
|
type: zod_1.z
|
|
79
81
|
.object({
|
|
80
82
|
uuid: zod_1.z.string(),
|
|
81
83
|
name: zod_1.z.string(),
|
|
84
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema,
|
|
82
85
|
})
|
|
83
86
|
.nullable(),
|
|
84
87
|
image: zod_1.z
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypeCreateSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
6
|
+
// Поля нового типа номенклатуры.
|
|
7
|
+
exports.TypeCreateSchema = zod_1.z.object({
|
|
8
|
+
name: zod_1.z.string(),
|
|
9
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
10
|
+
rank: zod_1.z.number(),
|
|
11
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypeUpdateSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
6
|
+
// Поля редактируемого типа номенклатуры. Переводы отсутствуют в теле — остаются прежними;
|
|
7
|
+
// `null` и пустой объект их очищают.
|
|
8
|
+
exports.TypeUpdateSchema = zod_1.z.object({
|
|
9
|
+
name: zod_1.z.string(),
|
|
10
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema.nullish(),
|
|
11
|
+
rank: zod_1.z.number(),
|
|
12
|
+
});
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TypeInCategorySchema = exports.TypeSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
+
const localized_name_schema_1 = require("../i18n/localized-name.schema");
|
|
5
6
|
exports.TypeSchema = zod_1.z.object({
|
|
6
7
|
uuid: zod_1.z.uuid(),
|
|
7
8
|
name: zod_1.z.string(),
|
|
9
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema,
|
|
8
10
|
rank: zod_1.z.number(),
|
|
9
11
|
deletedAt: zod_1.z.date().nullable(),
|
|
10
12
|
createdAt: zod_1.z.date(),
|
|
@@ -13,5 +15,6 @@ exports.TypeSchema = zod_1.z.object({
|
|
|
13
15
|
exports.TypeInCategorySchema = zod_1.z.object({
|
|
14
16
|
uuid: zod_1.z.uuid(),
|
|
15
17
|
name: zod_1.z.string(),
|
|
18
|
+
nameTranslations: localized_name_schema_1.LocalizedNameSchema,
|
|
16
19
|
rank: zod_1.z.number(),
|
|
17
20
|
});
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { CategorySchema } from '../../schemas';
|
|
3
|
+
import { CategoryCreateSchema } from '../../schemas/category/category-create.schema';
|
|
3
4
|
|
|
4
|
-
const CreateCategoryRequestSchema =
|
|
5
|
-
name: z.string(),
|
|
6
|
-
multiplicity: z.number(),
|
|
7
|
-
isSizeSeparate: z.coerce.boolean(),
|
|
8
|
-
typeUUID: z.string(),
|
|
9
|
-
isSaveCategoryName: z.coerce.boolean(),
|
|
10
|
-
});
|
|
5
|
+
const CreateCategoryRequestSchema = CategoryCreateSchema;
|
|
11
6
|
|
|
12
7
|
const CreateCategoryResponseSchema = z.object({
|
|
13
8
|
message: z.string().optional(),
|
|
@@ -1,26 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { CategoryStatusEnum } from '../../enum';
|
|
2
|
+
import { CategoryListFilterSchema } from '../../schemas/category/category-list-filter.schema';
|
|
3
|
+
import { CategoryListSchema } from '../../schemas/category/category-list.schema';
|
|
5
4
|
|
|
6
|
-
const GetCategoryListRequestSchema =
|
|
7
|
-
page: z.coerce.number().optional().default(1),
|
|
8
|
-
count: z.coerce.number().optional().default(10),
|
|
9
|
-
searchQuery: z
|
|
10
|
-
.string()
|
|
11
|
-
.optional()
|
|
12
|
-
.refine(val => !val || val.length < Math.pow(10, 6)),
|
|
13
|
-
typeUUID: z.uuid().optional(),
|
|
14
|
-
statuses: z.array(z.nativeEnum(CategoryStatusEnum)).default([]),
|
|
15
|
-
orderByType: z.nativeEnum(OrderByEnum).default(OrderByEnum.ASC),
|
|
16
|
-
});
|
|
5
|
+
const GetCategoryListRequestSchema = CategoryListFilterSchema;
|
|
17
6
|
|
|
18
7
|
const GetCategoryResponseSchema = z.object({
|
|
19
8
|
message: z.string().optional(),
|
|
20
|
-
data:
|
|
21
|
-
categoryList: CategoryExtendedSchema.array(),
|
|
22
|
-
total: z.number(),
|
|
23
|
-
}),
|
|
9
|
+
data: CategoryListSchema,
|
|
24
10
|
});
|
|
25
11
|
|
|
26
12
|
export namespace GetCategoryListContractQuery {
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { CategorySchema } from '../../schemas';
|
|
3
|
-
import {
|
|
3
|
+
import { CategoryUpdateSchema } from '../../schemas/category/category-update.schema';
|
|
4
4
|
|
|
5
|
-
const UpdateCategoryRequestSchema =
|
|
6
|
-
name: z.string(),
|
|
7
|
-
typeUUID: z.string(),
|
|
8
|
-
multiplicity: z.number(),
|
|
9
|
-
isSizeSeparate: z.coerce.boolean(),
|
|
10
|
-
isSaveCategoryName: z.coerce.boolean(),
|
|
11
|
-
status: z.nativeEnum(CategoryStatusEnum),
|
|
12
|
-
});
|
|
5
|
+
const UpdateCategoryRequestSchema = CategoryUpdateSchema;
|
|
13
6
|
|
|
14
7
|
const UpdateCategoryResponseSchema = z.object({
|
|
15
8
|
message: z.string().optional(),
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { CategoryTemplateSchema } from '../../schemas';
|
|
3
|
+
import { LocalizedNameSchema } from '../../schemas/i18n/localized-name.schema';
|
|
3
4
|
|
|
5
|
+
// Переводы необязательны: без них шаблон живёт на каноническом имени, как и раньше.
|
|
4
6
|
const CreateCategoryTemplateRequestSchema = CategoryTemplateSchema.pick({
|
|
5
7
|
name: true,
|
|
6
8
|
alias: true,
|
|
@@ -9,6 +11,9 @@ const CreateCategoryTemplateRequestSchema = CategoryTemplateSchema.pick({
|
|
|
9
11
|
multiplicity: true,
|
|
10
12
|
isSizeSeparate: true,
|
|
11
13
|
isSaveCategoryName: true,
|
|
14
|
+
}).extend({
|
|
15
|
+
nameTranslations: LocalizedNameSchema.nullish(),
|
|
16
|
+
typeNameTranslations: LocalizedNameSchema.nullish(),
|
|
12
17
|
});
|
|
13
18
|
|
|
14
19
|
const CreateCategoryTemplateResponseSchema = z.object({
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { CategoryTemplateSchema } from '../../schemas';
|
|
3
|
+
import { LocalizedNameSchema } from '../../schemas/i18n/localized-name.schema';
|
|
3
4
|
|
|
5
|
+
// Переводы вынесены из `pick`: `.partial()` сделал бы их только необязательными, а очистка словаря
|
|
6
|
+
// должна быть выразима явно — как у категории и типа, через `null` или пустой объект.
|
|
4
7
|
const UpdateCategoryTemplateRequestSchema = CategoryTemplateSchema.pick({
|
|
5
8
|
name: true,
|
|
6
9
|
alias: true,
|
|
@@ -9,7 +12,12 @@ const UpdateCategoryTemplateRequestSchema = CategoryTemplateSchema.pick({
|
|
|
9
12
|
multiplicity: true,
|
|
10
13
|
isSizeSeparate: true,
|
|
11
14
|
isSaveCategoryName: true,
|
|
12
|
-
})
|
|
15
|
+
})
|
|
16
|
+
.partial()
|
|
17
|
+
.extend({
|
|
18
|
+
nameTranslations: LocalizedNameSchema.nullish(),
|
|
19
|
+
typeNameTranslations: LocalizedNameSchema.nullish(),
|
|
20
|
+
});
|
|
13
21
|
|
|
14
22
|
const UpdateCategoryTemplateResponseSchema = z.object({
|
|
15
23
|
message: z.string().optional(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { ProductMarkEnum } from '../../../enum';
|
|
2
|
+
import { OrderByEnum, ProductClientSortByEnum, ProductMarkEnum } from '../../../enum';
|
|
3
3
|
import { ProductListExtendedForClientSchema } from '../../../schemas';
|
|
4
4
|
|
|
5
5
|
const GetProductListForClientRequestSchema = z.object({
|
|
@@ -18,6 +18,12 @@ const GetProductListForClientRequestSchema = z.object({
|
|
|
18
18
|
typeUUID: z.string().optional(),
|
|
19
19
|
searchQuery: z.string().optional(),
|
|
20
20
|
marks: z.nativeEnum(ProductMarkEnum).array().optional(),
|
|
21
|
+
// Без `sortBy` порядок остаётся прежним — по категории, названию и размеру. Сортировка по цене
|
|
22
|
+
// идёт по базовому прайсу, скидки клиента её не двигают: см. ProductClientSortByEnum.
|
|
23
|
+
sortBy: z.nativeEnum(ProductClientSortByEnum).optional(),
|
|
24
|
+
// Без `.default()`: он уезжает в `_output`, а значит и в опубликованный `Request`, делая поле
|
|
25
|
+
// обязательным для клиентов. Отсутствующее направление билдер и так читает как ASC.
|
|
26
|
+
sortOrder: z.nativeEnum(OrderByEnum).optional(),
|
|
21
27
|
});
|
|
22
28
|
|
|
23
29
|
const GetProductListForClientResponseSchema = z.object({
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { TypeSchema } from '../../schemas/type/type.schema';
|
|
3
|
+
import { TypeCreateSchema } from '../../schemas/type/type-create.schema';
|
|
3
4
|
|
|
4
|
-
const CreateTypeRequestSchema =
|
|
5
|
-
name: z.string(),
|
|
6
|
-
rank: z.number(),
|
|
7
|
-
});
|
|
5
|
+
const CreateTypeRequestSchema = TypeCreateSchema;
|
|
8
6
|
|
|
9
7
|
const CreateTypeResponseSchema = z.object({
|
|
10
8
|
message: z.string().optional(),
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { CategorySchema } from '../../schemas';
|
|
3
|
+
import { TypeUpdateSchema } from '../../schemas/type/type-update.schema';
|
|
3
4
|
|
|
4
|
-
const UpdateTypeRequestSchema =
|
|
5
|
-
name: z.string(),
|
|
6
|
-
rank: z.number(),
|
|
7
|
-
});
|
|
5
|
+
const UpdateTypeRequestSchema = TypeUpdateSchema;
|
|
8
6
|
|
|
9
7
|
const UpdateTypeResponseSchema = z.object({
|
|
10
8
|
message: z.string().optional(),
|
package/enum/index.ts
CHANGED
|
@@ -49,6 +49,7 @@ export * from './position-report-type.enum';
|
|
|
49
49
|
export * from './discount-price-routing.enum';
|
|
50
50
|
export * from './sales-unit.enum';
|
|
51
51
|
export * from './product-mark.enum';
|
|
52
|
+
export * from './product-client-sort-by.enum';
|
|
52
53
|
export * from './sales-by-position-group-by.enum';
|
|
53
54
|
export * from './client-import-entity-property.enum';
|
|
54
55
|
export * from './client-import-errors.enum';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Поле сортировки списка товаров витрины. Значение совпадает с именем поля ответа, чтобы клиент
|
|
3
|
+
* сортировал «по тому, что видит».
|
|
4
|
+
*
|
|
5
|
+
* `PRICE` — это базовый прайс товара, без скидок клиента. Порядок задаётся в SQL до пагинации, а
|
|
6
|
+
* скидки накладываются уже на выбранную страницу, поэтому сортировать по цене со скидкой значило бы
|
|
7
|
+
* либо считать её для всей выборки в памяти, либо продублировать цепочку правил в SQL. У клиента со
|
|
8
|
+
* сквозным процентом порядок от этого не меняется; расходится он там, где действует правило от
|
|
9
|
+
* себестоимости (COST_PLUS_MARKUP) или точечный ITEM_DISCOUNT.
|
|
10
|
+
*/
|
|
11
|
+
export enum ProductClientSortByEnum {
|
|
12
|
+
PRICE = 'price',
|
|
13
|
+
}
|
package/helpers/index.ts
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LanguageEnum } from '../enum/language.enum';
|
|
2
|
+
import { LocalizedName } from '../schemas/i18n/localized-name.schema';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Название сущности на запрошенном языке.
|
|
6
|
+
*
|
|
7
|
+
* Один резолвер на бэкенд и оба фронта, чтобы одна и та же категория нигде не подписывалась
|
|
8
|
+
* по-разному. Перевода нет, он пустой или состоит из пробелов — показываем канон: пустая подпись
|
|
9
|
+
* хуже подписи на чужом языке.
|
|
10
|
+
*/
|
|
11
|
+
export const resolveLocalizedName = (name: string, translations?: LocalizedName | null, language?: LanguageEnum | null): string => {
|
|
12
|
+
const translated = language ? translations?.[language] : undefined;
|
|
13
|
+
|
|
14
|
+
return translated && translated.trim() ? translated : name;
|
|
15
|
+
};
|
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
3
|
+
|
|
4
|
+
// Поля новой категории. Название на дополнительных языках необязательно: без переводов
|
|
5
|
+
// категория живёт на каноническом имени.
|
|
6
|
+
export const CategoryCreateSchema = z.object({
|
|
7
|
+
name: z.string(),
|
|
8
|
+
nameTranslations: LocalizedNameSchema.nullish(),
|
|
9
|
+
multiplicity: z.number(),
|
|
10
|
+
isSizeSeparate: z.coerce.boolean(),
|
|
11
|
+
typeUUID: z.string(),
|
|
12
|
+
isSaveCategoryName: z.coerce.boolean(),
|
|
13
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CategoryStatusEnum } from '../../enum';
|
|
3
|
+
import { LanguageEnum } from '../../enum/language.enum';
|
|
4
|
+
import { OrderByEnum } from '../../enum/order-by.enum';
|
|
5
|
+
|
|
6
|
+
// Условия выборки справочника категорий.
|
|
7
|
+
export const CategoryListFilterSchema = z.object({
|
|
8
|
+
page: z.coerce.number().optional().default(1),
|
|
9
|
+
count: z.coerce.number().optional().default(10),
|
|
10
|
+
searchQuery: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.refine(val => !val || val.length < Math.pow(10, 6)),
|
|
14
|
+
typeUUID: z.uuid().optional(),
|
|
15
|
+
statuses: z.array(z.nativeEnum(CategoryStatusEnum)).default([]),
|
|
16
|
+
orderByType: z.nativeEnum(OrderByEnum).default(OrderByEnum.ASC),
|
|
17
|
+
/**
|
|
18
|
+
* Язык, на котором подписывается список. Передан — справочник сортируется по отображаемому
|
|
19
|
+
* названию: страницу из двадцати строк клиент пересортировать не может, а порядок «по русскому
|
|
20
|
+
* алфавиту с английскими подписями» выглядит случайным. Не передан — сортировка по канону.
|
|
21
|
+
*/
|
|
22
|
+
language: z.nativeEnum(LanguageEnum).optional(),
|
|
23
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CategoryExtendedSchema } from './category.schema';
|
|
3
|
+
|
|
4
|
+
// Страница справочника категорий вместе с общим числом строк по фильтру.
|
|
5
|
+
export const CategoryListSchema = z.object({
|
|
6
|
+
categoryList: CategoryExtendedSchema.array(),
|
|
7
|
+
total: z.number(),
|
|
8
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CategoryStatusEnum } from '../../enum';
|
|
3
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
4
|
+
|
|
5
|
+
// Поля редактируемой категории. Переводы отсутствуют в теле — остаются прежними;
|
|
6
|
+
// `null` и пустой объект их очищают.
|
|
7
|
+
export const CategoryUpdateSchema = z.object({
|
|
8
|
+
name: z.string(),
|
|
9
|
+
nameTranslations: LocalizedNameSchema.nullish(),
|
|
10
|
+
typeUUID: z.string(),
|
|
11
|
+
multiplicity: z.number(),
|
|
12
|
+
isSizeSeparate: z.coerce.boolean(),
|
|
13
|
+
isSaveCategoryName: z.coerce.boolean(),
|
|
14
|
+
status: z.nativeEnum(CategoryStatusEnum),
|
|
15
|
+
});
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { CategoryStatusEnum } from '../../enum/category-status.enum';
|
|
3
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
3
4
|
import { TypeSchema } from '../type/type.schema';
|
|
4
5
|
|
|
5
6
|
export const CategorySchema = z.object({
|
|
6
7
|
uuid: z.uuid(),
|
|
8
|
+
// Канон, по нему сходятся импорт, отчёты и выгрузки.
|
|
7
9
|
name: z.string(),
|
|
10
|
+
// Переопределения названия по языкам; какое показать — решает клиент через resolveLocalizedName.
|
|
11
|
+
nameTranslations: LocalizedNameSchema,
|
|
8
12
|
multiplicity: z.number().nullable(),
|
|
9
13
|
isSizeSeparate: z.boolean(),
|
|
10
14
|
isSaveCategoryName: z.boolean(),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { LanguageEnum } from '../../enum/language.enum';
|
|
3
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
3
4
|
|
|
4
5
|
export const CategoryTemplateTypeSchema = z.object({
|
|
5
6
|
name: z.string(),
|
|
@@ -9,6 +10,10 @@ export const CategoryTemplateTypeSchema = z.object({
|
|
|
9
10
|
export const CategoryTemplateSchema = z.object({
|
|
10
11
|
uuid: z.uuid(),
|
|
11
12
|
name: z.string(),
|
|
13
|
+
// Переводы шаблона наследуют категории и типы новой компании, поэтому правка справочника
|
|
14
|
+
// здесь доезжает до всех, кто зарегистрируется после неё.
|
|
15
|
+
nameTranslations: LocalizedNameSchema,
|
|
16
|
+
typeNameTranslations: LocalizedNameSchema,
|
|
12
17
|
alias: z.string().array(),
|
|
13
18
|
type: CategoryTemplateTypeSchema,
|
|
14
19
|
language: z.nativeEnum(LanguageEnum),
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { LanguageEnum } from '../../enum/language.enum';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Переопределения названия по языкам.
|
|
6
|
+
*
|
|
7
|
+
* Канон живёт в поле `name` и остаётся ключом сущности — по нему матчится импорт, сходятся отчёты
|
|
8
|
+
* и совпадают выгрузки. Сюда кладутся только отличия от канона, поэтому основной язык компании
|
|
9
|
+
* здесь не хранится: иначе `name` и перевод на тот же язык начали бы расходиться.
|
|
10
|
+
*/
|
|
11
|
+
export const LocalizedNameSchema = z.partialRecord(z.enum(LanguageEnum), z.string().trim().max(255));
|
|
12
|
+
|
|
13
|
+
export type LocalizedName = z.infer<typeof LocalizedNameSchema>;
|
package/schemas/index.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
export * from './i18n/localized-name.schema';
|
|
2
|
+
export * from './category/category-create.schema';
|
|
3
|
+
export * from './category/category-update.schema';
|
|
4
|
+
export * from './category/category-list-filter.schema';
|
|
5
|
+
export * from './category/category-list.schema';
|
|
6
|
+
export * from './type/type-create.schema';
|
|
7
|
+
export * from './type/type-update.schema';
|
|
1
8
|
export * from './company/company.schema';
|
|
2
9
|
export * from './client/client.schema';
|
|
3
10
|
export * from './user/user.schema';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { ProductImageSchema } from '../product-image/product-image.schema';
|
|
3
3
|
import { CategorySchema } from '../category/category.schema';
|
|
4
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
4
5
|
import { TypeSchema } from '../type/type.schema';
|
|
5
6
|
import { ConsignmentSchema } from '../consignment/consignment.schema';
|
|
6
7
|
import { DiscountRulesTypeEnum, ProductMarkEnum, SalesUnitEnum } from '../../enum';
|
|
@@ -80,12 +81,14 @@ export const ProductExtendedForClientSchema = ProductForClientSchema.merge(
|
|
|
80
81
|
.object({
|
|
81
82
|
uuid: z.string(),
|
|
82
83
|
name: z.string(),
|
|
84
|
+
nameTranslations: LocalizedNameSchema,
|
|
83
85
|
})
|
|
84
86
|
.nullable(),
|
|
85
87
|
type: z
|
|
86
88
|
.object({
|
|
87
89
|
uuid: z.string(),
|
|
88
90
|
name: z.string(),
|
|
91
|
+
nameTranslations: LocalizedNameSchema,
|
|
89
92
|
})
|
|
90
93
|
.nullable(),
|
|
91
94
|
image: z
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
3
|
+
|
|
4
|
+
// Поля нового типа номенклатуры.
|
|
5
|
+
export const TypeCreateSchema = z.object({
|
|
6
|
+
name: z.string(),
|
|
7
|
+
nameTranslations: LocalizedNameSchema.nullish(),
|
|
8
|
+
rank: z.number(),
|
|
9
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
3
|
+
|
|
4
|
+
// Поля редактируемого типа номенклатуры. Переводы отсутствуют в теле — остаются прежними;
|
|
5
|
+
// `null` и пустой объект их очищают.
|
|
6
|
+
export const TypeUpdateSchema = z.object({
|
|
7
|
+
name: z.string(),
|
|
8
|
+
nameTranslations: LocalizedNameSchema.nullish(),
|
|
9
|
+
rank: z.number(),
|
|
10
|
+
});
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { LocalizedNameSchema } from '../i18n/localized-name.schema';
|
|
2
3
|
|
|
3
4
|
export const TypeSchema = z.object({
|
|
4
5
|
uuid: z.uuid(),
|
|
5
6
|
name: z.string(),
|
|
7
|
+
nameTranslations: LocalizedNameSchema,
|
|
6
8
|
rank: z.number(),
|
|
7
9
|
deletedAt: z.date().nullable(),
|
|
8
10
|
createdAt: z.date(),
|
|
@@ -12,5 +14,6 @@ export const TypeSchema = z.object({
|
|
|
12
14
|
export const TypeInCategorySchema = z.object({
|
|
13
15
|
uuid: z.uuid(),
|
|
14
16
|
name: z.string(),
|
|
17
|
+
nameTranslations: LocalizedNameSchema,
|
|
15
18
|
rank: z.number(),
|
|
16
19
|
});
|