@floristcloud/api-lib 1.2.117 → 1.2.119
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/client/get-client-debt-list.query.js +7 -2
- package/build/commands/order/get-order-list.query.js +5 -0
- package/build/schemas/client/client-debt.schema.js +30 -1
- package/build/schemas/order/order.schema.js +7 -1
- package/commands/client/get-client-debt-list.query.ts +7 -2
- package/commands/order/get-order-list.query.ts +5 -0
- package/package.json +1 -1
- package/schemas/client/client-debt.schema.ts +30 -0
- package/schemas/order/order.schema.ts +7 -1
|
@@ -3,15 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.GetClientDebtListContractQuery = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const client_1 = require("../../schemas/client");
|
|
6
|
+
const query_boolean_helper_1 = require("../../helpers/query-boolean.helper");
|
|
6
7
|
const GetClientDebtListRequestSchema = zod_1.z.object({
|
|
7
8
|
page: zod_1.z.coerce.number().optional().default(1),
|
|
8
9
|
count: zod_1.z.coerce.number().optional().default(10),
|
|
9
10
|
responsibleUserUUID: zod_1.z.string().optional(),
|
|
10
11
|
searchQuery: zod_1.z.string().optional(),
|
|
11
12
|
group: zod_1.z.string().optional(),
|
|
12
|
-
sortBy: zod_1.z.enum(['debtAmount', 'name']).optional().default('debtAmount'),
|
|
13
|
+
sortBy: zod_1.z.enum(['debtAmount', 'name', 'payableAmount']).optional().default('debtAmount'),
|
|
13
14
|
sortOrder: zod_1.z.enum(['asc', 'desc']).optional().default('desc'),
|
|
14
|
-
|
|
15
|
+
// `queryBooleanSchema`, а не `z.coerce.boolean()`: в query всегда приходит текст, и
|
|
16
|
+
// `Boolean('false') === true`, то есть снятый на фронте чекбокс, отправленный явным
|
|
17
|
+
// `onlyWithDebt=false`, включал бы фильтр вместо того, чтобы его выключить.
|
|
18
|
+
onlyWithDebt: query_boolean_helper_1.queryBooleanSchema,
|
|
19
|
+
onlyOverdue: query_boolean_helper_1.queryBooleanSchema,
|
|
15
20
|
clientUUIDList: zod_1.z.array(zod_1.z.string().uuid()).optional(),
|
|
16
21
|
});
|
|
17
22
|
const GetClientDebtListResponseSchema = zod_1.z.object({
|
|
@@ -4,6 +4,7 @@ exports.GetOrderListContractQuery = void 0;
|
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const schemas_1 = require("../../schemas");
|
|
6
6
|
const date_helper_1 = require("../../helpers/date.helper");
|
|
7
|
+
const query_boolean_helper_1 = require("../../helpers/query-boolean.helper");
|
|
7
8
|
const enum_1 = require("../../enum");
|
|
8
9
|
const GetOrderListRequestSchema = zod_1.z
|
|
9
10
|
.object({
|
|
@@ -28,6 +29,10 @@ const GetOrderListRequestSchema = zod_1.z
|
|
|
28
29
|
// Только заказы, ещё не включённые ни в один счёт на оплату — список для пикера при
|
|
29
30
|
// выставлении счёта. Комбинируется с остальными критериями обычным AND.
|
|
30
31
|
withoutPaymentInvoice: zod_1.z.coerce.boolean().optional(),
|
|
32
|
+
// То же для передаточного документа — пикер заказов при выпуске УПД. Здесь `queryBooleanSchema`,
|
|
33
|
+
// а не `z.coerce.boolean()`: в query всегда приходит текст, и `Boolean('false') === true`,
|
|
34
|
+
// то есть флаг соседа невозможно выключить явным значением, только опустив параметр.
|
|
35
|
+
withoutTransferDocument: query_boolean_helper_1.queryBooleanSchema,
|
|
31
36
|
})
|
|
32
37
|
.refine(value => {
|
|
33
38
|
const { startDate, endDate } = value;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ClientDebtListSchema = exports.ClientDebtItemSchema = void 0;
|
|
3
|
+
exports.ClientDebtListSchema = exports.ClientDebtSummarySchema = exports.ClientDebtItemSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const money_schema_1 = require("../money.schema");
|
|
6
|
+
const non_negative_money_schema_1 = require("../non-negative-money.schema");
|
|
6
7
|
exports.ClientDebtItemSchema = zod_1.z.object({
|
|
7
8
|
clientUUID: zod_1.z.uuid(),
|
|
8
9
|
name: zod_1.z.string(),
|
|
@@ -10,16 +11,44 @@ exports.ClientDebtItemSchema = zod_1.z.object({
|
|
|
10
11
|
group: zod_1.z.string().nullable(),
|
|
11
12
|
city: zod_1.z.string().nullable(),
|
|
12
13
|
responsibleUserName: zod_1.z.string().nullable(),
|
|
14
|
+
// Сальдо клиента как оно лежит в `client.balance`: минус — клиент должен, плюс — переплата.
|
|
13
15
|
currentBalance: money_schema_1.MoneySchema,
|
|
16
|
+
// То же сальдо, отсечённое по нулю, — «сколько должен». У переплативших клиентов ноль,
|
|
17
|
+
// поэтому колонку можно суммировать, не рискуя погасить чужой долг чужой переплатой.
|
|
18
|
+
debtAmount: non_negative_money_schema_1.NonNegativeMoneySchema,
|
|
14
19
|
// Знаковые величины: сальдо транзакций и остатки по заказам законно уходят в минус
|
|
15
20
|
// (переплата клиента, возврат), поэтому ограничения на знак здесь нет и быть не должно.
|
|
16
21
|
transactionNet: money_schema_1.MoneySchema,
|
|
22
|
+
// Все завершённые заказы = просроченные + те, по которым срок оплаты ещё не наступил.
|
|
23
|
+
// Тождество выполняется построчно: completedOrdersBalance = completedOrdersBalanceWithDelay + withinGraceAmount.
|
|
17
24
|
completedOrdersBalance: money_schema_1.MoneySchema,
|
|
18
25
|
completedOrdersBalanceWithDelay: money_schema_1.MoneySchema,
|
|
26
|
+
withinGraceAmount: money_schema_1.MoneySchema,
|
|
19
27
|
nonCompletedBalance: money_schema_1.MoneySchema,
|
|
28
|
+
// Долг за вычетом заказов в работе и заказов в непросроченной отсрочке — то, что фактически к уплате.
|
|
29
|
+
// Уже отсечён по нулю: переплата даёт 0, а не отрицательную величину.
|
|
30
|
+
payableAmount: non_negative_money_schema_1.NonNegativeMoneySchema,
|
|
20
31
|
hasOverdueDebt: zod_1.z.boolean().nullable(),
|
|
21
32
|
});
|
|
33
|
+
/**
|
|
34
|
+
* Итоги по всей отфильтрованной выборке, а не по странице.
|
|
35
|
+
*
|
|
36
|
+
* Каждое поле — сумма ровно одной колонки строки, поэтому итог всегда сходится с тем, что
|
|
37
|
+
* пользователь видит в таблице. Складывать итоги между собой нельзя: `debt` и `payable`
|
|
38
|
+
* отсечены по нулю построчно, и вычитание одного из другого даёт не ту величину, что
|
|
39
|
+
* `payable`. Единственное тождество, которое выполняется и в строке, и в итогах, —
|
|
40
|
+
* `overdue + withinGrace = сумма completedOrdersBalance` (там нет отсечки).
|
|
41
|
+
*/
|
|
42
|
+
exports.ClientDebtSummarySchema = zod_1.z.object({
|
|
43
|
+
balance: money_schema_1.MoneySchema,
|
|
44
|
+
debt: non_negative_money_schema_1.NonNegativeMoneySchema,
|
|
45
|
+
nonCompleted: money_schema_1.MoneySchema,
|
|
46
|
+
overdue: money_schema_1.MoneySchema,
|
|
47
|
+
withinGrace: money_schema_1.MoneySchema,
|
|
48
|
+
payable: non_negative_money_schema_1.NonNegativeMoneySchema,
|
|
49
|
+
});
|
|
22
50
|
exports.ClientDebtListSchema = zod_1.z.object({
|
|
23
51
|
clientList: exports.ClientDebtItemSchema.array(),
|
|
24
52
|
total: zod_1.z.number(),
|
|
53
|
+
summary: exports.ClientDebtSummarySchema,
|
|
25
54
|
});
|
|
@@ -36,17 +36,23 @@ exports.OrderSchema = zod_1.z.object({
|
|
|
36
36
|
// Счёт на оплату, в который включён заказ. Сам счёт (номер, файл, статус оплаты) читается
|
|
37
37
|
// отдельным запросом GET /payment-invoice/:uuid — здесь только ссылка, чтобы не утяжелять список заказов.
|
|
38
38
|
paymentInvoiceUUID: zod_1.z.uuid().nullable(),
|
|
39
|
+
// Передаточный документ (УПД), в который включён заказ. Тем же приёмом, что и счёт: здесь только
|
|
40
|
+
// ссылка, документ читается через GET /transfer-document/:uuid. Непустое значение означает, что
|
|
41
|
+
// заказ заморожен — состав, статус, доставка, дата отгрузки и скидка ему уже недоступны.
|
|
42
|
+
transferDocumentUUID: zod_1.z.uuid().nullable(),
|
|
39
43
|
completedAt: zod_1.z.date().nullable(),
|
|
40
44
|
paymentDueAt: zod_1.z.date().nullable(),
|
|
41
45
|
createdAt: zod_1.z.date(),
|
|
42
46
|
updatedAt: zod_1.z.date(),
|
|
43
47
|
deletedAt: zod_1.z.date().nullable(),
|
|
44
48
|
});
|
|
45
|
-
// Витрина клиента не показывает внутреннюю кухню
|
|
49
|
+
// Витрина клиента не показывает внутреннюю кухню документов, поэтому ссылки на счёт и на УПД
|
|
50
|
+
// сюда не попадают.
|
|
46
51
|
exports.OrderForClientSchema = exports.OrderSchema.omit({
|
|
47
52
|
comment: true,
|
|
48
53
|
tag: true,
|
|
49
54
|
paymentInvoiceUUID: true,
|
|
55
|
+
transferDocumentUUID: true,
|
|
50
56
|
});
|
|
51
57
|
exports.OrderExtendedSchema = exports.OrderSchema.extend({
|
|
52
58
|
client: client_1.ClientSchema,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { ClientDebtListSchema } from '../../schemas/client';
|
|
3
|
+
import { queryBooleanSchema } from '../../helpers/query-boolean.helper';
|
|
3
4
|
|
|
4
5
|
const GetClientDebtListRequestSchema = z.object({
|
|
5
6
|
page: z.coerce.number().optional().default(1),
|
|
@@ -7,9 +8,13 @@ const GetClientDebtListRequestSchema = z.object({
|
|
|
7
8
|
responsibleUserUUID: z.string().optional(),
|
|
8
9
|
searchQuery: z.string().optional(),
|
|
9
10
|
group: z.string().optional(),
|
|
10
|
-
sortBy: z.enum(['debtAmount', 'name']).optional().default('debtAmount'),
|
|
11
|
+
sortBy: z.enum(['debtAmount', 'name', 'payableAmount']).optional().default('debtAmount'),
|
|
11
12
|
sortOrder: z.enum(['asc', 'desc']).optional().default('desc'),
|
|
12
|
-
|
|
13
|
+
// `queryBooleanSchema`, а не `z.coerce.boolean()`: в query всегда приходит текст, и
|
|
14
|
+
// `Boolean('false') === true`, то есть снятый на фронте чекбокс, отправленный явным
|
|
15
|
+
// `onlyWithDebt=false`, включал бы фильтр вместо того, чтобы его выключить.
|
|
16
|
+
onlyWithDebt: queryBooleanSchema,
|
|
17
|
+
onlyOverdue: queryBooleanSchema,
|
|
13
18
|
clientUUIDList: z.array(z.string().uuid()).optional(),
|
|
14
19
|
});
|
|
15
20
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { OrderExtendedSchema } from '../../schemas';
|
|
3
3
|
import { dateRangeCheck } from '../../helpers/date.helper';
|
|
4
|
+
import { queryBooleanSchema } from '../../helpers/query-boolean.helper';
|
|
4
5
|
import { OrderStatusEnum, OrderTypeEnum } from '../../enum';
|
|
5
6
|
|
|
6
7
|
const GetOrderListRequestSchema = z
|
|
@@ -26,6 +27,10 @@ const GetOrderListRequestSchema = z
|
|
|
26
27
|
// Только заказы, ещё не включённые ни в один счёт на оплату — список для пикера при
|
|
27
28
|
// выставлении счёта. Комбинируется с остальными критериями обычным AND.
|
|
28
29
|
withoutPaymentInvoice: z.coerce.boolean().optional(),
|
|
30
|
+
// То же для передаточного документа — пикер заказов при выпуске УПД. Здесь `queryBooleanSchema`,
|
|
31
|
+
// а не `z.coerce.boolean()`: в query всегда приходит текст, и `Boolean('false') === true`,
|
|
32
|
+
// то есть флаг соседа невозможно выключить явным значением, только опустив параметр.
|
|
33
|
+
withoutTransferDocument: queryBooleanSchema,
|
|
29
34
|
})
|
|
30
35
|
.refine(
|
|
31
36
|
value => {
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { MoneySchema } from '../money.schema';
|
|
3
|
+
import { NonNegativeMoneySchema } from '../non-negative-money.schema';
|
|
3
4
|
|
|
4
5
|
export const ClientDebtItemSchema = z.object({
|
|
5
6
|
clientUUID: z.uuid(),
|
|
@@ -8,17 +9,46 @@ export const ClientDebtItemSchema = z.object({
|
|
|
8
9
|
group: z.string().nullable(),
|
|
9
10
|
city: z.string().nullable(),
|
|
10
11
|
responsibleUserName: z.string().nullable(),
|
|
12
|
+
// Сальдо клиента как оно лежит в `client.balance`: минус — клиент должен, плюс — переплата.
|
|
11
13
|
currentBalance: MoneySchema,
|
|
14
|
+
// То же сальдо, отсечённое по нулю, — «сколько должен». У переплативших клиентов ноль,
|
|
15
|
+
// поэтому колонку можно суммировать, не рискуя погасить чужой долг чужой переплатой.
|
|
16
|
+
debtAmount: NonNegativeMoneySchema,
|
|
12
17
|
// Знаковые величины: сальдо транзакций и остатки по заказам законно уходят в минус
|
|
13
18
|
// (переплата клиента, возврат), поэтому ограничения на знак здесь нет и быть не должно.
|
|
14
19
|
transactionNet: MoneySchema,
|
|
20
|
+
// Все завершённые заказы = просроченные + те, по которым срок оплаты ещё не наступил.
|
|
21
|
+
// Тождество выполняется построчно: completedOrdersBalance = completedOrdersBalanceWithDelay + withinGraceAmount.
|
|
15
22
|
completedOrdersBalance: MoneySchema,
|
|
16
23
|
completedOrdersBalanceWithDelay: MoneySchema,
|
|
24
|
+
withinGraceAmount: MoneySchema,
|
|
17
25
|
nonCompletedBalance: MoneySchema,
|
|
26
|
+
// Долг за вычетом заказов в работе и заказов в непросроченной отсрочке — то, что фактически к уплате.
|
|
27
|
+
// Уже отсечён по нулю: переплата даёт 0, а не отрицательную величину.
|
|
28
|
+
payableAmount: NonNegativeMoneySchema,
|
|
18
29
|
hasOverdueDebt: z.boolean().nullable(),
|
|
19
30
|
});
|
|
20
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Итоги по всей отфильтрованной выборке, а не по странице.
|
|
34
|
+
*
|
|
35
|
+
* Каждое поле — сумма ровно одной колонки строки, поэтому итог всегда сходится с тем, что
|
|
36
|
+
* пользователь видит в таблице. Складывать итоги между собой нельзя: `debt` и `payable`
|
|
37
|
+
* отсечены по нулю построчно, и вычитание одного из другого даёт не ту величину, что
|
|
38
|
+
* `payable`. Единственное тождество, которое выполняется и в строке, и в итогах, —
|
|
39
|
+
* `overdue + withinGrace = сумма completedOrdersBalance` (там нет отсечки).
|
|
40
|
+
*/
|
|
41
|
+
export const ClientDebtSummarySchema = z.object({
|
|
42
|
+
balance: MoneySchema,
|
|
43
|
+
debt: NonNegativeMoneySchema,
|
|
44
|
+
nonCompleted: MoneySchema,
|
|
45
|
+
overdue: MoneySchema,
|
|
46
|
+
withinGrace: MoneySchema,
|
|
47
|
+
payable: NonNegativeMoneySchema,
|
|
48
|
+
});
|
|
49
|
+
|
|
21
50
|
export const ClientDebtListSchema = z.object({
|
|
22
51
|
clientList: ClientDebtItemSchema.array(),
|
|
23
52
|
total: z.number(),
|
|
53
|
+
summary: ClientDebtSummarySchema,
|
|
24
54
|
});
|
|
@@ -38,6 +38,10 @@ export const OrderSchema = z.object({
|
|
|
38
38
|
// Счёт на оплату, в который включён заказ. Сам счёт (номер, файл, статус оплаты) читается
|
|
39
39
|
// отдельным запросом GET /payment-invoice/:uuid — здесь только ссылка, чтобы не утяжелять список заказов.
|
|
40
40
|
paymentInvoiceUUID: z.uuid().nullable(),
|
|
41
|
+
// Передаточный документ (УПД), в который включён заказ. Тем же приёмом, что и счёт: здесь только
|
|
42
|
+
// ссылка, документ читается через GET /transfer-document/:uuid. Непустое значение означает, что
|
|
43
|
+
// заказ заморожен — состав, статус, доставка, дата отгрузки и скидка ему уже недоступны.
|
|
44
|
+
transferDocumentUUID: z.uuid().nullable(),
|
|
41
45
|
|
|
42
46
|
completedAt: z.date().nullable(),
|
|
43
47
|
paymentDueAt: z.date().nullable(),
|
|
@@ -47,11 +51,13 @@ export const OrderSchema = z.object({
|
|
|
47
51
|
deletedAt: z.date().nullable(),
|
|
48
52
|
});
|
|
49
53
|
|
|
50
|
-
// Витрина клиента не показывает внутреннюю кухню
|
|
54
|
+
// Витрина клиента не показывает внутреннюю кухню документов, поэтому ссылки на счёт и на УПД
|
|
55
|
+
// сюда не попадают.
|
|
51
56
|
export const OrderForClientSchema = OrderSchema.omit({
|
|
52
57
|
comment: true,
|
|
53
58
|
tag: true,
|
|
54
59
|
paymentInvoiceUUID: true,
|
|
60
|
+
transferDocumentUUID: true,
|
|
55
61
|
});
|
|
56
62
|
|
|
57
63
|
export const OrderExtendedSchema = OrderSchema.extend({
|