@floristcloud/api-lib 1.2.118 → 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.
|
@@ -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({
|
|
@@ -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
|
});
|
|
@@ -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
|
|
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
|
});
|