@floristcloud/api-lib 1.2.156 → 1.2.158
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/consignment/analyze-consignment-product-update.command.js +42 -0
- package/build/commands/consignment/index.js +1 -0
- package/build/commands/order/create-order.command.js +1 -0
- package/build/commands/order/update-order.command.js +1 -0
- package/build/constant/error-i18n-key.js +1 -0
- package/build/constant/error.js +18 -1
- package/build/constant/index.js +1 -0
- package/build/constant/order-external-number.constant.js +6 -0
- package/build/enum/order-updated-field.enum.js +1 -0
- package/build/schemas/index.js +1 -0
- package/build/schemas/order/order-external-number.schema.js +9 -0
- package/build/schemas/order/order.schema.js +4 -1
- package/commands/consignment/analyze-consignment-product-update.command.ts +44 -0
- package/commands/consignment/index.ts +1 -0
- package/commands/order/create-order.command.ts +2 -1
- package/commands/order/update-order.command.ts +2 -1
- package/constant/error-i18n-key.ts +1 -0
- package/constant/error.ts +18 -1
- package/constant/index.ts +1 -0
- package/constant/order-external-number.constant.ts +3 -0
- package/enum/order-updated-field.enum.ts +1 -0
- package/package.json +1 -1
- package/schemas/index.ts +1 -0
- package/schemas/order/order-external-number.schema.ts +7 -0
- package/schemas/order/order.schema.ts +4 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AnalyzeConsignmentProductUpdateContractCommand = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const error_message_schema_1 = require("../../schemas/error-message.schema");
|
|
6
|
+
const AnalyzeMatchedRowSchema = zod_1.z.object({
|
|
7
|
+
uuid: zod_1.z.string(),
|
|
8
|
+
// Изменения позиции фронт не разбирает, а пересылает как есть в execute: там они и валидируются.
|
|
9
|
+
updates: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()),
|
|
10
|
+
rowIndex: zod_1.z.number(),
|
|
11
|
+
originalData: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()),
|
|
12
|
+
});
|
|
13
|
+
const AnalyzeUnmatchedRowSchema = zod_1.z.object({
|
|
14
|
+
// Индекс от первой строки данных; для показа пользователю — `row`.
|
|
15
|
+
rowIndex: zod_1.z.number(),
|
|
16
|
+
// Номер строки в Excel, как его видит пользователь.
|
|
17
|
+
row: zod_1.z.number(),
|
|
18
|
+
data: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()),
|
|
19
|
+
// Подробная причина по-английски, для логов и как запасной текст.
|
|
20
|
+
reason: zod_1.z.string(),
|
|
21
|
+
// Причина для перевода: `code` из ERRORS и параметры подстановки.
|
|
22
|
+
error: error_message_schema_1.ErrorMessageSchema,
|
|
23
|
+
});
|
|
24
|
+
const AnalyzeRowErrorSchema = error_message_schema_1.ErrorMessageSchema.extend({
|
|
25
|
+
row: zod_1.z.number(),
|
|
26
|
+
});
|
|
27
|
+
const AnalyzeConsignmentProductUpdateResponseSchema = zod_1.z.object({
|
|
28
|
+
data: zod_1.z.object({
|
|
29
|
+
success: zod_1.z.boolean(),
|
|
30
|
+
totalRows: zod_1.z.number(),
|
|
31
|
+
matchedCount: zod_1.z.number(),
|
|
32
|
+
unmatchedCount: zod_1.z.number(),
|
|
33
|
+
matched: zod_1.z.array(AnalyzeMatchedRowSchema),
|
|
34
|
+
unmatched: zod_1.z.array(AnalyzeUnmatchedRowSchema),
|
|
35
|
+
errors: zod_1.z.array(AnalyzeRowErrorSchema),
|
|
36
|
+
warnings: zod_1.z.array(AnalyzeRowErrorSchema),
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
var AnalyzeConsignmentProductUpdateContractCommand;
|
|
40
|
+
(function (AnalyzeConsignmentProductUpdateContractCommand) {
|
|
41
|
+
AnalyzeConsignmentProductUpdateContractCommand.ResponseSchema = AnalyzeConsignmentProductUpdateResponseSchema;
|
|
42
|
+
})(AnalyzeConsignmentProductUpdateContractCommand || (exports.AnalyzeConsignmentProductUpdateContractCommand = AnalyzeConsignmentProductUpdateContractCommand = {}));
|
|
@@ -31,3 +31,4 @@ __exportStar(require("./execute-consignment-product-update.command"), exports);
|
|
|
31
31
|
__exportStar(require("./determine-consignment-product-images.command"), exports);
|
|
32
32
|
__exportStar(require("./analyze-consignment-product-enrichment.query"), exports);
|
|
33
33
|
__exportStar(require("./execute-consignment-product-enrichment.command"), exports);
|
|
34
|
+
__exportStar(require("./analyze-consignment-product-update.command"), exports);
|
|
@@ -14,6 +14,7 @@ const CreateOrderRequestSchema = zod_1.z.object({
|
|
|
14
14
|
comment: zod_1.z.string().nullable(),
|
|
15
15
|
clientComment: zod_1.z.string().nullable(),
|
|
16
16
|
tag: zod_1.z.string().nullable(),
|
|
17
|
+
externalNumber: schemas_1.OrderExternalNumberRequestSchema,
|
|
17
18
|
// Дата отгрузки/выдачи — одна для самовывоза и доставки. Приоритет над устаревшим
|
|
18
19
|
// `delivery.deliveryDate`.
|
|
19
20
|
plannedShipmentDate: schemas_1.CalendarDaySchema.nullable().optional(),
|
|
@@ -13,6 +13,7 @@ const UpdateOrderRequestSchema = zod_1.z.object({
|
|
|
13
13
|
comment: zod_1.z.string().nullable(),
|
|
14
14
|
clientComment: zod_1.z.string().nullable(),
|
|
15
15
|
tag: zod_1.z.string().nullable(),
|
|
16
|
+
externalNumber: schemas_1.OrderExternalNumberRequestSchema,
|
|
16
17
|
status: zod_1.z.nativeEnum(enum_1.OrderStatusEnum),
|
|
17
18
|
isPaid: zod_1.z.coerce.boolean(),
|
|
18
19
|
deliveryVat: zod_1.z.coerce.number().nullable(),
|
|
@@ -12,6 +12,7 @@ exports.ErrorI18nKey = {
|
|
|
12
12
|
mergeOrderHasDistribution: 'mergeOrder.hasDistribution',
|
|
13
13
|
mergeOrderHasPaymentInvoice: 'mergeOrder.hasPaymentInvoice',
|
|
14
14
|
mergeOrderHasTransferDocument: 'mergeOrder.hasTransferDocument',
|
|
15
|
+
mergeOrderSourceHasExternalNumber: 'mergeOrder.sourceHasExternalNumber',
|
|
15
16
|
mergeOrderPaymentsTransfer: 'mergeOrder.paymentsTransfer',
|
|
16
17
|
mergeOrderDeliveryMerge: 'mergeOrder.deliveryMerge',
|
|
17
18
|
mergeOrderDeliveryTransfer: 'mergeOrder.deliveryTransfer',
|
package/build/constant/error.js
CHANGED
|
@@ -262,7 +262,16 @@ exports.ERRORS = {
|
|
|
262
262
|
CONSIGNMENT_PRODUCT_UPDATE_INVALID_CONFIG: { code: 'CON018', message: 'Invalid config format', httpCode: 400 },
|
|
263
263
|
CONSIGNMENT_PRODUCT_UPDATE_NO_DATA_ROWS: { code: 'CON019', message: 'File has no data rows', httpCode: 400 },
|
|
264
264
|
CONSIGNMENT_PRODUCT_UPDATE_TOO_MANY_ROWS: { code: 'CON020', message: 'Too many rows', httpCode: 400 },
|
|
265
|
-
|
|
265
|
+
// Причины, по которым строка файла не попала в обновление: `httpCode` 200 — это не ошибка запроса,
|
|
266
|
+
// а построчный результат анализа. Параметры для перевода — в `i18nParams` у строки.
|
|
267
|
+
CONSIGNMENT_PRODUCT_UPDATE_UUID_NOT_PROVIDED: { code: 'CON030', message: 'UUID not provided', httpCode: 200 },
|
|
268
|
+
CONSIGNMENT_PRODUCT_UPDATE_INVALID_CELL: { code: 'CON031', message: 'Invalid cell value', httpCode: 200 },
|
|
269
|
+
CONSIGNMENT_PRODUCT_UPDATE_UNRECOGNIZED_BOOLEAN_CELL: { code: 'CON032', message: 'Value is not recognized as yes/no', httpCode: 200 },
|
|
270
|
+
CONSIGNMENT_PRODUCT_UPDATE_CONSIGNMENT_EMPTY: { code: 'CON033', message: 'No products in consignment', httpCode: 200 },
|
|
271
|
+
CONSIGNMENT_PRODUCT_UPDATE_NO_MATCH_CRITERIA: { code: 'CON034', message: 'No matching criteria filled in the row', httpCode: 200 },
|
|
272
|
+
CONSIGNMENT_PRODUCT_UPDATE_NO_MATCH: { code: 'CON035', message: 'No product matches the row', httpCode: 200 },
|
|
273
|
+
CONSIGNMENT_PRODUCT_UPDATE_AMBIGUOUS_MATCH: { code: 'CON036', message: 'Several products match the row', httpCode: 200 },
|
|
274
|
+
CONSIGNMENT_PRODUCT_UPDATE_ROWS_SHARE_PRODUCT: { code: 'CON037', message: 'Several rows target the same product', httpCode: 200 },
|
|
266
275
|
CONSIGNMENT_PRODUCT_UPDATE_ANALYSIS_FAILED: { code: 'CON022', message: 'Update analysis failed', httpCode: 500 },
|
|
267
276
|
CONSIGNMENT_PRODUCT_UPDATE_BATCH_TOO_LARGE: { code: 'CON023', message: 'Batch size too large', httpCode: 400 },
|
|
268
277
|
CONSIGNMENT_IMPORT_TOO_MANY_ROWS: { code: 'CON024', message: 'Too many rows for this import mode', httpCode: 400 },
|
|
@@ -414,6 +423,12 @@ exports.ERRORS = {
|
|
|
414
423
|
message: 'The order is included in a transfer document and cannot be changed or deleted',
|
|
415
424
|
httpCode: 409,
|
|
416
425
|
},
|
|
426
|
+
// В data — номер заказа, за которым номер уже закреплён: UI пишет «привязан к заказу №…».
|
|
427
|
+
ORDER_EXTERNAL_NUMBER_TAKEN: {
|
|
428
|
+
code: 'O063',
|
|
429
|
+
message: 'The external number is already assigned to another order',
|
|
430
|
+
httpCode: 409,
|
|
431
|
+
},
|
|
417
432
|
ORDER_SPLIT_NOT_COMPLETELY_ERROR: { code: 'O019', message: 'Error splitting orders, not all orders were split', httpCode: 500 },
|
|
418
433
|
ORDER_TOTAL_COST_NEGATIVE: { code: 'O020', message: 'Order total cost is negative', httpCode: 400 },
|
|
419
434
|
ORDER_SUBTOTAL_NEGATIVE: { code: 'O021', message: 'Order subtotal is negative', httpCode: 400 },
|
|
@@ -437,6 +452,8 @@ exports.ERRORS = {
|
|
|
437
452
|
httpCode: 400,
|
|
438
453
|
},
|
|
439
454
|
ORDER_PLANNED_SHIPMENT_DATE_NOT_UPDATED: { code: 'O062', message: 'Failed to update order planned shipment date', httpCode: 500 },
|
|
455
|
+
// Источник объединения удаляется, и его связь с документом ERP пропала бы молча.
|
|
456
|
+
ORDER_MERGE_SOURCE_HAS_EXTERNAL_NUMBER: { code: 'O064', message: 'Source order has an external number', httpCode: 400 },
|
|
440
457
|
ORDER_MERGE_BALANCE_STATUS_NOT_ALLOWED: {
|
|
441
458
|
code: 'O033',
|
|
442
459
|
message: 'Order status is balance affecting, merge not allowed',
|
package/build/constant/index.js
CHANGED
|
@@ -30,3 +30,4 @@ __exportStar(require("./attribute-normalization.constant"), exports);
|
|
|
30
30
|
__exportStar(require("./product-image-merge.constant"), exports);
|
|
31
31
|
__exportStar(require("./client-group-actions.constant"), exports);
|
|
32
32
|
__exportStar(require("./standing-order-positions.constant"), exports);
|
|
33
|
+
__exportStar(require("./order-external-number.constant"), exports);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ORDER_EXTERNAL_NUMBER_MAX_LENGTH = void 0;
|
|
4
|
+
// Номера документов ERP/CRM короткие («ЗК-00123», GUID в 36 символов), 100 — с запасом. Колонка
|
|
5
|
+
// TEXT длину не держит, поэтому граница — только схема запроса.
|
|
6
|
+
exports.ORDER_EXTERNAL_NUMBER_MAX_LENGTH = 100;
|
|
@@ -21,4 +21,5 @@ var OrderUpdatedFieldEnum;
|
|
|
21
21
|
OrderUpdatedFieldEnum["COMPLETED_AT"] = "COMPLETED_AT";
|
|
22
22
|
OrderUpdatedFieldEnum["PAYMENT_DUE_AT"] = "PAYMENT_DUE_AT";
|
|
23
23
|
OrderUpdatedFieldEnum["PLANNED_SHIPMENT_DATE"] = "PLANNED_SHIPMENT_DATE";
|
|
24
|
+
OrderUpdatedFieldEnum["EXTERNAL_NUMBER"] = "EXTERNAL_NUMBER";
|
|
24
25
|
})(OrderUpdatedFieldEnum || (exports.OrderUpdatedFieldEnum = OrderUpdatedFieldEnum = {}));
|
package/build/schemas/index.js
CHANGED
|
@@ -33,6 +33,7 @@ __exportStar(require("./write-off/write-off-list.schema"), exports);
|
|
|
33
33
|
__exportStar(require("./write-off/write-off-archive-file.schema"), exports);
|
|
34
34
|
__exportStar(require("./write-off/write-off-export.schema"), exports);
|
|
35
35
|
__exportStar(require("./order/order.schema"), exports);
|
|
36
|
+
__exportStar(require("./order/order-external-number.schema"), exports);
|
|
36
37
|
__exportStar(require("./order-delivery/order-delivery.schema"), exports);
|
|
37
38
|
__exportStar(require("./order-product/order-product.schema"), exports);
|
|
38
39
|
__exportStar(require("./order-product/order-product-list.schema"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OrderExternalNumberRequestSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const order_external_number_constant_1 = require("../../constant/order-external-number.constant");
|
|
6
|
+
// Номер заказа в ERP/CRM компании на входе create/update. Поле не пришло — номер не меняется;
|
|
7
|
+
// null или строка из пробелов — номер снимается (пустую строку сервер сохраняет как null, иначе
|
|
8
|
+
// вторая пустая строка упрётся в уникальность номера в пределах компании).
|
|
9
|
+
exports.OrderExternalNumberRequestSchema = zod_1.z.string().trim().max(order_external_number_constant_1.ORDER_EXTERNAL_NUMBER_MAX_LENGTH).nullable().optional();
|
|
@@ -41,6 +41,8 @@ exports.OrderSchema = zod_1.z.object({
|
|
|
41
41
|
// ссылка, документ читается через GET /transfer-document/:uuid. Непустое значение означает, что
|
|
42
42
|
// заказ заморожен — состав, статус, доставка, дата отгрузки и скидка ему уже недоступны.
|
|
43
43
|
transferDocumentUUID: zod_1.z.uuid().nullable(),
|
|
44
|
+
// Номер заказа в ERP/CRM компании, которым сотрудники сверяют заказ со своей учётной системой.
|
|
45
|
+
externalNumber: zod_1.z.string().nullable(),
|
|
44
46
|
completedAt: zod_1.z.date().nullable(),
|
|
45
47
|
paymentDueAt: zod_1.z.date().nullable(),
|
|
46
48
|
// План отгрузки/выдачи — одна дата для самовывоза и доставки, календарный день `YYYY-MM-DD`.
|
|
@@ -51,12 +53,13 @@ exports.OrderSchema = zod_1.z.object({
|
|
|
51
53
|
deletedAt: zod_1.z.date().nullable(),
|
|
52
54
|
});
|
|
53
55
|
// Витрина клиента не показывает внутреннюю кухню документов, поэтому ссылки на счёт и на УПД
|
|
54
|
-
// сюда не попадают.
|
|
56
|
+
// сюда не попадают. Номер в ERP компании — тоже её внутренний учёт.
|
|
55
57
|
exports.OrderForClientSchema = exports.OrderSchema.omit({
|
|
56
58
|
comment: true,
|
|
57
59
|
tag: true,
|
|
58
60
|
paymentInvoiceUUID: true,
|
|
59
61
|
transferDocumentUUID: true,
|
|
62
|
+
externalNumber: true,
|
|
60
63
|
});
|
|
61
64
|
exports.OrderExtendedSchema = exports.OrderSchema.extend({
|
|
62
65
|
client: client_1.ClientSchema,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ErrorMessageSchema } from '../../schemas/error-message.schema';
|
|
3
|
+
|
|
4
|
+
const AnalyzeMatchedRowSchema = z.object({
|
|
5
|
+
uuid: z.string(),
|
|
6
|
+
// Изменения позиции фронт не разбирает, а пересылает как есть в execute: там они и валидируются.
|
|
7
|
+
updates: z.record(z.string(), z.unknown()),
|
|
8
|
+
rowIndex: z.number(),
|
|
9
|
+
originalData: z.record(z.string(), z.unknown()),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const AnalyzeUnmatchedRowSchema = z.object({
|
|
13
|
+
// Индекс от первой строки данных; для показа пользователю — `row`.
|
|
14
|
+
rowIndex: z.number(),
|
|
15
|
+
// Номер строки в Excel, как его видит пользователь.
|
|
16
|
+
row: z.number(),
|
|
17
|
+
data: z.record(z.string(), z.unknown()),
|
|
18
|
+
// Подробная причина по-английски, для логов и как запасной текст.
|
|
19
|
+
reason: z.string(),
|
|
20
|
+
// Причина для перевода: `code` из ERRORS и параметры подстановки.
|
|
21
|
+
error: ErrorMessageSchema,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const AnalyzeRowErrorSchema = ErrorMessageSchema.extend({
|
|
25
|
+
row: z.number(),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const AnalyzeConsignmentProductUpdateResponseSchema = z.object({
|
|
29
|
+
data: z.object({
|
|
30
|
+
success: z.boolean(),
|
|
31
|
+
totalRows: z.number(),
|
|
32
|
+
matchedCount: z.number(),
|
|
33
|
+
unmatchedCount: z.number(),
|
|
34
|
+
matched: z.array(AnalyzeMatchedRowSchema),
|
|
35
|
+
unmatched: z.array(AnalyzeUnmatchedRowSchema),
|
|
36
|
+
errors: z.array(AnalyzeRowErrorSchema),
|
|
37
|
+
warnings: z.array(AnalyzeRowErrorSchema),
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export namespace AnalyzeConsignmentProductUpdateContractCommand {
|
|
42
|
+
export const ResponseSchema = AnalyzeConsignmentProductUpdateResponseSchema;
|
|
43
|
+
export type Response = z.infer<typeof ResponseSchema>;
|
|
44
|
+
}
|
|
@@ -15,3 +15,4 @@ export * from './execute-consignment-product-update.command';
|
|
|
15
15
|
export * from './determine-consignment-product-images.command';
|
|
16
16
|
export * from './analyze-consignment-product-enrichment.query';
|
|
17
17
|
export * from './execute-consignment-product-enrichment.command';
|
|
18
|
+
export * from './analyze-consignment-product-update.command';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { OrderTypeEnum } from '../../enum';
|
|
3
|
-
import { CalendarDaySchema, OrderDeliverySchema, OrderSchema } from '../../schemas';
|
|
3
|
+
import { CalendarDaySchema, OrderDeliverySchema, OrderExternalNumberRequestSchema, OrderSchema } from '../../schemas';
|
|
4
4
|
import { MoneySchema } from '../../schemas/money.schema';
|
|
5
5
|
|
|
6
6
|
const CreateOrderRequestSchema = z.object({
|
|
@@ -12,6 +12,7 @@ const CreateOrderRequestSchema = z.object({
|
|
|
12
12
|
comment: z.string().nullable(),
|
|
13
13
|
clientComment: z.string().nullable(),
|
|
14
14
|
tag: z.string().nullable(),
|
|
15
|
+
externalNumber: OrderExternalNumberRequestSchema,
|
|
15
16
|
// Дата отгрузки/выдачи — одна для самовывоза и доставки. Приоритет над устаревшим
|
|
16
17
|
// `delivery.deliveryDate`.
|
|
17
18
|
plannedShipmentDate: CalendarDaySchema.nullable().optional(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { OrderStatusEnum, OrderTypeEnum } from '../../enum';
|
|
3
|
-
import { CalendarDaySchema, OrderSchema } from '../../schemas';
|
|
3
|
+
import { CalendarDaySchema, OrderExternalNumberRequestSchema, OrderSchema } from '../../schemas';
|
|
4
4
|
import { MoneySchema } from '../../schemas/money.schema';
|
|
5
5
|
|
|
6
6
|
const UpdateOrderRequestSchema = z.object({
|
|
@@ -11,6 +11,7 @@ const UpdateOrderRequestSchema = z.object({
|
|
|
11
11
|
comment: z.string().nullable(),
|
|
12
12
|
clientComment: z.string().nullable(),
|
|
13
13
|
tag: z.string().nullable(),
|
|
14
|
+
externalNumber: OrderExternalNumberRequestSchema,
|
|
14
15
|
status: z.nativeEnum(OrderStatusEnum),
|
|
15
16
|
isPaid: z.coerce.boolean(),
|
|
16
17
|
deliveryVat: z.coerce.number().nullable(),
|
|
@@ -9,6 +9,7 @@ export const ErrorI18nKey = {
|
|
|
9
9
|
mergeOrderHasDistribution: 'mergeOrder.hasDistribution',
|
|
10
10
|
mergeOrderHasPaymentInvoice: 'mergeOrder.hasPaymentInvoice',
|
|
11
11
|
mergeOrderHasTransferDocument: 'mergeOrder.hasTransferDocument',
|
|
12
|
+
mergeOrderSourceHasExternalNumber: 'mergeOrder.sourceHasExternalNumber',
|
|
12
13
|
mergeOrderPaymentsTransfer: 'mergeOrder.paymentsTransfer',
|
|
13
14
|
mergeOrderDeliveryMerge: 'mergeOrder.deliveryMerge',
|
|
14
15
|
mergeOrderDeliveryTransfer: 'mergeOrder.deliveryTransfer',
|
package/constant/error.ts
CHANGED
|
@@ -271,7 +271,16 @@ export const ERRORS = {
|
|
|
271
271
|
CONSIGNMENT_PRODUCT_UPDATE_INVALID_CONFIG: { code: 'CON018', message: 'Invalid config format', httpCode: 400 },
|
|
272
272
|
CONSIGNMENT_PRODUCT_UPDATE_NO_DATA_ROWS: { code: 'CON019', message: 'File has no data rows', httpCode: 400 },
|
|
273
273
|
CONSIGNMENT_PRODUCT_UPDATE_TOO_MANY_ROWS: { code: 'CON020', message: 'Too many rows', httpCode: 400 },
|
|
274
|
-
|
|
274
|
+
// Причины, по которым строка файла не попала в обновление: `httpCode` 200 — это не ошибка запроса,
|
|
275
|
+
// а построчный результат анализа. Параметры для перевода — в `i18nParams` у строки.
|
|
276
|
+
CONSIGNMENT_PRODUCT_UPDATE_UUID_NOT_PROVIDED: { code: 'CON030', message: 'UUID not provided', httpCode: 200 },
|
|
277
|
+
CONSIGNMENT_PRODUCT_UPDATE_INVALID_CELL: { code: 'CON031', message: 'Invalid cell value', httpCode: 200 },
|
|
278
|
+
CONSIGNMENT_PRODUCT_UPDATE_UNRECOGNIZED_BOOLEAN_CELL: { code: 'CON032', message: 'Value is not recognized as yes/no', httpCode: 200 },
|
|
279
|
+
CONSIGNMENT_PRODUCT_UPDATE_CONSIGNMENT_EMPTY: { code: 'CON033', message: 'No products in consignment', httpCode: 200 },
|
|
280
|
+
CONSIGNMENT_PRODUCT_UPDATE_NO_MATCH_CRITERIA: { code: 'CON034', message: 'No matching criteria filled in the row', httpCode: 200 },
|
|
281
|
+
CONSIGNMENT_PRODUCT_UPDATE_NO_MATCH: { code: 'CON035', message: 'No product matches the row', httpCode: 200 },
|
|
282
|
+
CONSIGNMENT_PRODUCT_UPDATE_AMBIGUOUS_MATCH: { code: 'CON036', message: 'Several products match the row', httpCode: 200 },
|
|
283
|
+
CONSIGNMENT_PRODUCT_UPDATE_ROWS_SHARE_PRODUCT: { code: 'CON037', message: 'Several rows target the same product', httpCode: 200 },
|
|
275
284
|
CONSIGNMENT_PRODUCT_UPDATE_ANALYSIS_FAILED: { code: 'CON022', message: 'Update analysis failed', httpCode: 500 },
|
|
276
285
|
CONSIGNMENT_PRODUCT_UPDATE_BATCH_TOO_LARGE: { code: 'CON023', message: 'Batch size too large', httpCode: 400 },
|
|
277
286
|
CONSIGNMENT_IMPORT_TOO_MANY_ROWS: { code: 'CON024', message: 'Too many rows for this import mode', httpCode: 400 },
|
|
@@ -428,6 +437,12 @@ export const ERRORS = {
|
|
|
428
437
|
message: 'The order is included in a transfer document and cannot be changed or deleted',
|
|
429
438
|
httpCode: 409,
|
|
430
439
|
},
|
|
440
|
+
// В data — номер заказа, за которым номер уже закреплён: UI пишет «привязан к заказу №…».
|
|
441
|
+
ORDER_EXTERNAL_NUMBER_TAKEN: {
|
|
442
|
+
code: 'O063',
|
|
443
|
+
message: 'The external number is already assigned to another order',
|
|
444
|
+
httpCode: 409,
|
|
445
|
+
},
|
|
431
446
|
ORDER_SPLIT_NOT_COMPLETELY_ERROR: { code: 'O019', message: 'Error splitting orders, not all orders were split', httpCode: 500 },
|
|
432
447
|
ORDER_TOTAL_COST_NEGATIVE: { code: 'O020', message: 'Order total cost is negative', httpCode: 400 },
|
|
433
448
|
ORDER_SUBTOTAL_NEGATIVE: { code: 'O021', message: 'Order subtotal is negative', httpCode: 400 },
|
|
@@ -451,6 +466,8 @@ export const ERRORS = {
|
|
|
451
466
|
httpCode: 400,
|
|
452
467
|
},
|
|
453
468
|
ORDER_PLANNED_SHIPMENT_DATE_NOT_UPDATED: { code: 'O062', message: 'Failed to update order planned shipment date', httpCode: 500 },
|
|
469
|
+
// Источник объединения удаляется, и его связь с документом ERP пропала бы молча.
|
|
470
|
+
ORDER_MERGE_SOURCE_HAS_EXTERNAL_NUMBER: { code: 'O064', message: 'Source order has an external number', httpCode: 400 },
|
|
454
471
|
ORDER_MERGE_BALANCE_STATUS_NOT_ALLOWED: {
|
|
455
472
|
code: 'O033',
|
|
456
473
|
message: 'Order status is balance affecting, merge not allowed',
|
package/constant/index.ts
CHANGED
package/package.json
CHANGED
package/schemas/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ export * from './write-off/write-off-list.schema';
|
|
|
17
17
|
export * from './write-off/write-off-archive-file.schema';
|
|
18
18
|
export * from './write-off/write-off-export.schema';
|
|
19
19
|
export * from './order/order.schema';
|
|
20
|
+
export * from './order/order-external-number.schema';
|
|
20
21
|
export * from './order-delivery/order-delivery.schema';
|
|
21
22
|
export * from './order-product/order-product.schema';
|
|
22
23
|
export * from './order-product/order-product-list.schema';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ORDER_EXTERNAL_NUMBER_MAX_LENGTH } from '../../constant/order-external-number.constant';
|
|
3
|
+
|
|
4
|
+
// Номер заказа в ERP/CRM компании на входе create/update. Поле не пришло — номер не меняется;
|
|
5
|
+
// null или строка из пробелов — номер снимается (пустую строку сервер сохраняет как null, иначе
|
|
6
|
+
// вторая пустая строка упрётся в уникальность номера в пределах компании).
|
|
7
|
+
export const OrderExternalNumberRequestSchema = z.string().trim().max(ORDER_EXTERNAL_NUMBER_MAX_LENGTH).nullable().optional();
|
|
@@ -43,6 +43,8 @@ export const OrderSchema = z.object({
|
|
|
43
43
|
// ссылка, документ читается через GET /transfer-document/:uuid. Непустое значение означает, что
|
|
44
44
|
// заказ заморожен — состав, статус, доставка, дата отгрузки и скидка ему уже недоступны.
|
|
45
45
|
transferDocumentUUID: z.uuid().nullable(),
|
|
46
|
+
// Номер заказа в ERP/CRM компании, которым сотрудники сверяют заказ со своей учётной системой.
|
|
47
|
+
externalNumber: z.string().nullable(),
|
|
46
48
|
|
|
47
49
|
completedAt: z.date().nullable(),
|
|
48
50
|
paymentDueAt: z.date().nullable(),
|
|
@@ -56,12 +58,13 @@ export const OrderSchema = z.object({
|
|
|
56
58
|
});
|
|
57
59
|
|
|
58
60
|
// Витрина клиента не показывает внутреннюю кухню документов, поэтому ссылки на счёт и на УПД
|
|
59
|
-
// сюда не попадают.
|
|
61
|
+
// сюда не попадают. Номер в ERP компании — тоже её внутренний учёт.
|
|
60
62
|
export const OrderForClientSchema = OrderSchema.omit({
|
|
61
63
|
comment: true,
|
|
62
64
|
tag: true,
|
|
63
65
|
paymentInvoiceUUID: true,
|
|
64
66
|
transferDocumentUUID: true,
|
|
67
|
+
externalNumber: true,
|
|
65
68
|
});
|
|
66
69
|
|
|
67
70
|
export const OrderExtendedSchema = OrderSchema.extend({
|