@hubex/mcp 0.5.0 → 0.5.20260909

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.
@@ -21,8 +21,59 @@
21
21
  "AssetAssignments"
22
22
  ],
23
23
  "summary": "Возвращает список назначений объектов.",
24
- "description": "## Пример запроса:\r\n`GET /AssetAssignments?userID=101&assetID=5001&validOn=2026-08-19T00:00:00Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"user\": {\r\n \"id\": 101,\r\n \"firstName\": \"Иван\",\r\n \"lastName\": \"Иванов\",\r\n \"deleted\": false\r\n },\r\n \"asset\": {\r\n \"id\": 5001,\r\n \"name\": \"Сканер штрихкодов\",\r\n \"deleted\": false\r\n },\r\n \"validityPeriod\": {\r\n \"from\": \"2026-08-01T00:00:00Z\",\r\n \"till\": \"2026-08-31T23:59:59Z\"\r\n },\r\n \"notes\": \"Назначено на период инвентаризации.\"\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть списка в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: по заданным условиям назначения не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
24
+ "description": "## Пример запроса:\r\n`GET /AssetAssignments?userID=101&assetID=5001&validOn=2026-08-19T00:00:00Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"user\": {\r\n \"id\": 101,\r\n \"firstName\": \"Иван\",\r\n \"lastName\": \"Иванов\",\r\n \"deleted\": false\r\n },\r\n \"asset\": {\r\n \"id\": 5001,\r\n \"name\": \"Сканер штрихкодов\",\r\n \"deleted\": false\r\n },\r\n \"validityPeriod\": {\r\n \"from\": \"2026-08-01T00:00:00Z\",\r\n \"till\": \"2026-08-31T23:59:59Z\"\r\n },\r\n \"notes\": \"Назначено на период инвентаризации.\"\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть списка в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: по заданным условиям назначения не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `AssetAssignmentList`.",
25
25
  "parameters": [
26
+ {
27
+ "name": "Range",
28
+ "in": "header",
29
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
30
+ "schema": {
31
+ "type": "string"
32
+ }
33
+ },
34
+ {
35
+ "name": "offset",
36
+ "in": "query",
37
+ "description": "количество элементов, которое нобходимо пропустить",
38
+ "schema": {
39
+ "type": "string"
40
+ }
41
+ },
42
+ {
43
+ "name": "fetch",
44
+ "in": "query",
45
+ "description": "количество элементов, которое необходимо вернуть",
46
+ "schema": {
47
+ "type": "string"
48
+ }
49
+ },
50
+ {
51
+ "name": "userID",
52
+ "in": "query",
53
+ "description": "Идентификаторы пользователей, по которым будет отфильтрован результат",
54
+ "schema": {
55
+ "type": "integer",
56
+ "format": "int32"
57
+ }
58
+ },
59
+ {
60
+ "name": "assetID",
61
+ "in": "query",
62
+ "description": "Идентификаторы объектов, по которым будет отфильтрован результат",
63
+ "schema": {
64
+ "type": "integer",
65
+ "format": "int32"
66
+ }
67
+ },
68
+ {
69
+ "name": "validOn",
70
+ "in": "query",
71
+ "description": "Даты валидности назначения, для которых будут получены назначения. Если не указан, применяется текущая дата по UTC.",
72
+ "schema": {
73
+ "type": "string",
74
+ "format": "date-time"
75
+ }
76
+ },
26
77
  {
27
78
  "name": "X-Application-ID",
28
79
  "in": "header",
@@ -116,7 +167,7 @@
116
167
  "description": "Отсутствует или некорректен Bearer-токен."
117
168
  },
118
169
  "403": {
119
- "description": "Forbidden"
170
+ "description": "Недостаточно прав `AssetAssignmentList`."
120
171
  }
121
172
  },
122
173
  "security": [
@@ -130,7 +181,7 @@
130
181
  "AssetAssignments"
131
182
  ],
132
183
  "summary": "Добавляет или изменяет назначение объекта для пользователя.",
133
- "description": "## Пример запроса:\r\n`POST /AssetAssignments`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"assetID\": 5001,\r\n \"dateFrom\": \"2026-08-19T08:00:00Z\",\r\n \"dateTill\": \"2026-08-19T18:00:00Z\"\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\nТело ответа отсутствует. Код `201` возвращается, когда для переданных данных создаётся новое назначение.\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует. Код `202` возвращается, когда хотя бы одно из переданных назначений было обновлено.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
184
+ "description": "## Пример запроса:\r\n`POST /AssetAssignments`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"assetID\": 5001,\r\n \"dateFrom\": \"2026-08-19T08:00:00Z\",\r\n \"dateTill\": \"2026-08-19T18:00:00Z\"\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\nТело ответа отсутствует. Код `201` возвращается, когда для переданных данных создаётся новое назначение.\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует. Код `202` возвращается, когда хотя бы одно из переданных назначений было обновлено.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `AssetAssignmentMerge`.",
134
185
  "parameters": [
135
186
  {
136
187
  "name": "X-Application-ID",
@@ -206,7 +257,7 @@
206
257
  "description": "Отсутствует или некорректен Bearer-токен."
207
258
  },
208
259
  "403": {
209
- "description": "Forbidden"
260
+ "description": "Недостаточно прав `AssetAssignmentMerge`."
210
261
  }
211
262
  },
212
263
  "security": [
@@ -220,7 +271,7 @@
220
271
  "AssetAssignments"
221
272
  ],
222
273
  "summary": "Удаляет назначение объекта для пользователя.",
223
- "description": "## Пример запроса:\r\n`DELETE /AssetAssignments`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"assetID\": 5001\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
274
+ "description": "## Пример запроса:\r\n`DELETE /AssetAssignments`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"assetID\": 5001\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `AssetAssignmentDelete`.",
224
275
  "parameters": [
225
276
  {
226
277
  "name": "X-Application-ID",
@@ -293,7 +344,7 @@
293
344
  "description": "Отсутствует или некорректен Bearer-токен."
294
345
  },
295
346
  "403": {
296
- "description": "Forbidden"
347
+ "description": "Недостаточно прав `AssetAssignmentDelete`."
297
348
  }
298
349
  },
299
350
  "security": [
@@ -321,6 +372,48 @@
321
372
  "format": "int32"
322
373
  }
323
374
  },
375
+ {
376
+ "name": "Range",
377
+ "in": "header",
378
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
379
+ "schema": {
380
+ "type": "string"
381
+ }
382
+ },
383
+ {
384
+ "name": "offset",
385
+ "in": "query",
386
+ "description": "количество элементов, которое нобходимо пропустить",
387
+ "schema": {
388
+ "type": "string"
389
+ }
390
+ },
391
+ {
392
+ "name": "fetch",
393
+ "in": "query",
394
+ "description": "количество элементов, которое необходимо вернуть",
395
+ "schema": {
396
+ "type": "string"
397
+ }
398
+ },
399
+ {
400
+ "name": "validFrom",
401
+ "in": "query",
402
+ "description": "Начало действия периода трудоустройства",
403
+ "schema": {
404
+ "type": "string",
405
+ "format": "date-time"
406
+ }
407
+ },
408
+ {
409
+ "name": "validTill",
410
+ "in": "query",
411
+ "description": "Окончание действия периода трудоустройства",
412
+ "schema": {
413
+ "type": "string",
414
+ "format": "date-time"
415
+ }
416
+ },
324
417
  {
325
418
  "name": "X-Application-ID",
326
419
  "in": "header",
@@ -414,7 +507,7 @@
414
507
  "description": "Отсутствует или некорректен Bearer-токен."
415
508
  },
416
509
  "403": {
417
- "description": "Недостаточно прав для просмотра трудоустройств."
510
+ "description": "Недостаточно прав `EmploymentList`."
418
511
  }
419
512
  },
420
513
  "security": [
@@ -521,7 +614,7 @@
521
614
  "description": "Отсутствует или некорректен Bearer-токен."
522
615
  },
523
616
  "403": {
524
- "description": "Недостаточно прав для добавления трудоустройств."
617
+ "description": "Недостаточно прав `EmploymentAdd`."
525
618
  }
526
619
  },
527
620
  "security": [
@@ -600,7 +693,7 @@
600
693
  "description": "Отсутствует или некорректен Bearer-токен."
601
694
  },
602
695
  "403": {
603
- "description": "Недостаточно прав для изменения трудоустройств."
696
+ "description": "Недостаточно прав `EmploymentUpdate`."
604
697
  }
605
698
  },
606
699
  "security": [
@@ -679,7 +772,7 @@
679
772
  "description": "Отсутствует или некорректен Bearer-токен."
680
773
  },
681
774
  "403": {
682
- "description": "Недостаточно прав для удаления трудоустройств."
775
+ "description": "Недостаточно прав `EmploymentRemove`."
683
776
  }
684
777
  },
685
778
  "security": [
@@ -695,8 +788,32 @@
695
788
  "GeoTrackingModes"
696
789
  ],
697
790
  "summary": "Возвращает список режимов геотрекинга.",
698
- "description": "## Пример запроса:\r\n`GET /GeoTrackingModes`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Отключен\"\r\n },\r\n \"2\": {\r\n \"name\": \"Периодический\"\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть словаря в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: режимы геотрекинга не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
791
+ "description": "## Пример запроса:\r\n`GET /GeoTrackingModes`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Отключен\"\r\n },\r\n \"2\": {\r\n \"name\": \"Периодический\"\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть словаря в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: режимы геотрекинга не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `GeoTrackingModesList`.",
699
792
  "parameters": [
793
+ {
794
+ "name": "Range",
795
+ "in": "header",
796
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
797
+ "schema": {
798
+ "type": "string"
799
+ }
800
+ },
801
+ {
802
+ "name": "offset",
803
+ "in": "query",
804
+ "description": "количество элементов, которое нобходимо пропустить",
805
+ "schema": {
806
+ "type": "string"
807
+ }
808
+ },
809
+ {
810
+ "name": "fetch",
811
+ "in": "query",
812
+ "description": "количество элементов, которое необходимо вернуть",
813
+ "schema": {
814
+ "type": "string"
815
+ }
816
+ },
700
817
  {
701
818
  "name": "X-Application-ID",
702
819
  "in": "header",
@@ -790,7 +907,142 @@
790
907
  "description": "Отсутствует или некорректен Bearer-токен."
791
908
  },
792
909
  "403": {
793
- "description": "Forbidden"
910
+ "description": "Недостаточно прав `GeoTrackingModesList`."
911
+ }
912
+ },
913
+ "security": [
914
+ {
915
+ "Bearer": [ ]
916
+ }
917
+ ]
918
+ }
919
+ },
920
+ "/Mobilities": {
921
+ "get": {
922
+ "tags": [
923
+ "Mobilities"
924
+ ],
925
+ "summary": "Возвращает список мобильностей тенанта.",
926
+ "description": "## Пример запроса:\r\n`GET /Mobilities`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Пешая\",\r\n \"maxDistanceFromDefaultLocation\": 10,\r\n \"maxDistanceFromActualLocation\": 3\r\n },\r\n \"2\": {\r\n \"name\": \"На автомобиле\",\r\n \"maxDistanceFromDefaultLocation\": 50,\r\n \"maxDistanceFromActualLocation\": 15\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть словаря в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для текущего тенанта не найдено ни одной мобильности.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `MobilitiesList`.",
927
+ "parameters": [
928
+ {
929
+ "name": "Range",
930
+ "in": "header",
931
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
932
+ "schema": {
933
+ "type": "string"
934
+ }
935
+ },
936
+ {
937
+ "name": "offset",
938
+ "in": "query",
939
+ "description": "количество элементов, которое нобходимо пропустить",
940
+ "schema": {
941
+ "type": "string"
942
+ }
943
+ },
944
+ {
945
+ "name": "fetch",
946
+ "in": "query",
947
+ "description": "количество элементов, которое необходимо вернуть",
948
+ "schema": {
949
+ "type": "string"
950
+ }
951
+ },
952
+ {
953
+ "name": "X-Application-ID",
954
+ "in": "header",
955
+ "description": "Идентификатор приложения. EngineerMobile - 1, CustomerMobile - 2, MainWeb - 3, AdminWeb - 4, Api - 5, PlateWeb - 6",
956
+ "schema": {
957
+ "enum": [
958
+ 1,
959
+ 2,
960
+ 3,
961
+ 4,
962
+ 5,
963
+ 6
964
+ ],
965
+ "type": "integer",
966
+ "format": "int32",
967
+ "default": 3,
968
+ "x-enumNames": [
969
+ "EngineerMobile",
970
+ "CustomerMobile",
971
+ "MainWeb",
972
+ "AdminWeb",
973
+ "Api",
974
+ "PlateWeb"
975
+ ]
976
+ }
977
+ }
978
+ ],
979
+ "responses": {
980
+ "200": {
981
+ "description": "Список мобильностей успешно сформирован.",
982
+ "content": {
983
+ "text/plain": {
984
+ "schema": {
985
+ "type": "object",
986
+ "additionalProperties": {
987
+ "$ref": "#/components/schemas/RMListResult"
988
+ }
989
+ }
990
+ },
991
+ "application/json": {
992
+ "schema": {
993
+ "type": "object",
994
+ "additionalProperties": {
995
+ "$ref": "#/components/schemas/RMListResult"
996
+ }
997
+ }
998
+ },
999
+ "text/json": {
1000
+ "schema": {
1001
+ "type": "object",
1002
+ "additionalProperties": {
1003
+ "$ref": "#/components/schemas/RMListResult"
1004
+ }
1005
+ }
1006
+ }
1007
+ }
1008
+ },
1009
+ "206": {
1010
+ "description": "Возвращена часть списка мобильностей в соответствии с заголовком Range.",
1011
+ "content": {
1012
+ "text/plain": {
1013
+ "schema": {
1014
+ "type": "object",
1015
+ "additionalProperties": {
1016
+ "$ref": "#/components/schemas/RMListResult"
1017
+ }
1018
+ }
1019
+ },
1020
+ "application/json": {
1021
+ "schema": {
1022
+ "type": "object",
1023
+ "additionalProperties": {
1024
+ "$ref": "#/components/schemas/RMListResult"
1025
+ }
1026
+ }
1027
+ },
1028
+ "text/json": {
1029
+ "schema": {
1030
+ "type": "object",
1031
+ "additionalProperties": {
1032
+ "$ref": "#/components/schemas/RMListResult"
1033
+ }
1034
+ }
1035
+ }
1036
+ }
1037
+ },
1038
+ "204": {
1039
+ "description": "Для тенанта не найдено ни одной мобильности."
1040
+ },
1041
+ "401": {
1042
+ "description": "Отсутствует или некорректен Bearer-токен."
1043
+ },
1044
+ "403": {
1045
+ "description": "Недостаточно прав `MobilitiesList`."
794
1046
  }
795
1047
  },
796
1048
  "security": [
@@ -803,11 +1055,35 @@
803
1055
  "/Moblities": {
804
1056
  "get": {
805
1057
  "tags": [
806
- "Moblities"
1058
+ "Mobilities"
807
1059
  ],
808
1060
  "summary": "Возвращает список мобильностей тенанта.",
809
- "description": "## Пример запроса:\r\n`GET /Moblities`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Пешая\",\r\n \"maxDistanceFromDefaultLocation\": 10,\r\n \"maxDistanceFromActualLocation\": 3\r\n },\r\n \"2\": {\r\n \"name\": \"На автомобиле\",\r\n \"maxDistanceFromDefaultLocation\": 50,\r\n \"maxDistanceFromActualLocation\": 15\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть словаря в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для текущего тенанта не найдено ни одной мобильности.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
1061
+ "description": "## Пример запроса:\r\n`GET /Mobilities`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Пешая\",\r\n \"maxDistanceFromDefaultLocation\": 10,\r\n \"maxDistanceFromActualLocation\": 3\r\n },\r\n \"2\": {\r\n \"name\": \"На автомобиле\",\r\n \"maxDistanceFromDefaultLocation\": 50,\r\n \"maxDistanceFromActualLocation\": 15\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть словаря в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для текущего тенанта не найдено ни одной мобильности.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `MobilitiesList`.",
810
1062
  "parameters": [
1063
+ {
1064
+ "name": "Range",
1065
+ "in": "header",
1066
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
1067
+ "schema": {
1068
+ "type": "string"
1069
+ }
1070
+ },
1071
+ {
1072
+ "name": "offset",
1073
+ "in": "query",
1074
+ "description": "количество элементов, которое нобходимо пропустить",
1075
+ "schema": {
1076
+ "type": "string"
1077
+ }
1078
+ },
1079
+ {
1080
+ "name": "fetch",
1081
+ "in": "query",
1082
+ "description": "количество элементов, которое необходимо вернуть",
1083
+ "schema": {
1084
+ "type": "string"
1085
+ }
1086
+ },
811
1087
  {
812
1088
  "name": "X-Application-ID",
813
1089
  "in": "header",
@@ -901,7 +1177,7 @@
901
1177
  "description": "Отсутствует или некорректен Bearer-токен."
902
1178
  },
903
1179
  "403": {
904
- "description": "Forbidden"
1180
+ "description": "Недостаточно прав `MobilitiesList`."
905
1181
  }
906
1182
  },
907
1183
  "security": [
@@ -917,7 +1193,7 @@
917
1193
  "RatingCriteria"
918
1194
  ],
919
1195
  "summary": "Возвращает список критериев рейтинга.",
920
- "description": "## Пример запроса:\r\n`GET /RatingCriteria`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Скорость реагирования\",\r\n \"weight\": 1.25,\r\n \"isSystem\": true\r\n }\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
1196
+ "description": "## Пример запроса:\r\n`GET /RatingCriteria`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Скорость реагирования\",\r\n \"weight\": 1.25,\r\n \"isSystem\": true\r\n }\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `RatingCriteriaList`.",
921
1197
  "parameters": [
922
1198
  {
923
1199
  "name": "X-Application-ID",
@@ -980,7 +1256,7 @@
980
1256
  "description": "Отсутствует или некорректен Bearer-токен."
981
1257
  },
982
1258
  "403": {
983
- "description": "Forbidden"
1259
+ "description": "Недостаточно прав `RatingCriteriaList`."
984
1260
  }
985
1261
  },
986
1262
  "security": [
@@ -994,7 +1270,7 @@
994
1270
  "RatingCriteria"
995
1271
  ],
996
1272
  "summary": "Создаёт новые критерии рейтинга.",
997
- "description": "## Пример запроса:\r\n`POST /RatingCriteria`\r\n \r\n```json\r\n[\r\n {\r\n \"name\": \"Скорость реагирования\",\r\n \"weight\": 1.25,\r\n \"isSystem\": false\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n[\r\n 1\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: создание не выполнено из-за конфликта данных.",
1273
+ "description": "## Пример запроса:\r\n`POST /RatingCriteria`\r\n \r\n```json\r\n[\r\n {\r\n \"name\": \"Скорость реагирования\",\r\n \"weight\": 1.25,\r\n \"isSystem\": false\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n[\r\n 1\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `RatingCriteriaAdd`.\r\n- 409 Conflict: создание не выполнено из-за конфликта данных.",
998
1274
  "parameters": [
999
1275
  {
1000
1276
  "name": "X-Application-ID",
@@ -1096,6 +1372,9 @@
1096
1372
  "401": {
1097
1373
  "description": "Отсутствует или некорректен Bearer-токен."
1098
1374
  },
1375
+ "403": {
1376
+ "description": "Недостаточно прав `RatingCriteriaAdd`."
1377
+ },
1099
1378
  "409": {
1100
1379
  "description": "Создание не выполнено из-за конфликта данных.",
1101
1380
  "content": {
@@ -1124,9 +1403,6 @@
1124
1403
  }
1125
1404
  }
1126
1405
  }
1127
- },
1128
- "403": {
1129
- "description": "Forbidden"
1130
1406
  }
1131
1407
  },
1132
1408
  "security": [
@@ -1140,7 +1416,7 @@
1140
1416
  "RatingCriteria"
1141
1417
  ],
1142
1418
  "summary": "Обновляет критерии рейтинга.",
1143
- "description": "## Пример запроса:\r\n`PUT /RatingCriteria`\r\n \r\n```json\r\n[\r\n {\r\n \"id\": 1,\r\n \"name\": \"Скорость реакции\",\r\n \"weight\": 1.5,\r\n \"isSystem\": false\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: обновление не выполнено из-за конфликта данных.",
1419
+ "description": "## Пример запроса:\r\n`PUT /RatingCriteria`\r\n \r\n```json\r\n[\r\n {\r\n \"id\": 1,\r\n \"name\": \"Скорость реакции\",\r\n \"weight\": 1.5,\r\n \"isSystem\": false\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `RatingCriteriaUpdate`.\r\n- 409 Conflict: обновление не выполнено из-за конфликта данных.",
1144
1420
  "parameters": [
1145
1421
  {
1146
1422
  "name": "X-Application-ID",
@@ -1213,6 +1489,9 @@
1213
1489
  "401": {
1214
1490
  "description": "Отсутствует или некорректен Bearer-токен."
1215
1491
  },
1492
+ "403": {
1493
+ "description": "Недостаточно прав `RatingCriteriaUpdate`."
1494
+ },
1216
1495
  "409": {
1217
1496
  "description": "Обновление не выполнено из-за конфликта данных.",
1218
1497
  "content": {
@@ -1241,9 +1520,6 @@
1241
1520
  }
1242
1521
  }
1243
1522
  }
1244
- },
1245
- "403": {
1246
- "description": "Forbidden"
1247
1523
  }
1248
1524
  },
1249
1525
  "security": [
@@ -1257,7 +1533,7 @@
1257
1533
  "RatingCriteria"
1258
1534
  ],
1259
1535
  "summary": "Помечает критерии рейтинга как удалённые.",
1260
- "description": "## Пример запроса:\r\n`DELETE /RatingCriteria`\r\n \r\n```json\r\n[\r\n 1,\r\n 2\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: удаление не выполнено из-за конфликта данных.",
1536
+ "description": "## Пример запроса:\r\n`DELETE /RatingCriteria`\r\n \r\n```json\r\n[\r\n 1,\r\n 2\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `RatingCriteriaDelete`.\r\n- 409 Conflict: удаление не выполнено из-за конфликта данных.",
1261
1537
  "parameters": [
1262
1538
  {
1263
1539
  "name": "X-Application-ID",
@@ -1334,6 +1610,9 @@
1334
1610
  "401": {
1335
1611
  "description": "Отсутствует или некорректен Bearer-токен."
1336
1612
  },
1613
+ "403": {
1614
+ "description": "Недостаточно прав `RatingCriteriaDelete`."
1615
+ },
1337
1616
  "409": {
1338
1617
  "description": "Удаление не выполнено из-за конфликта данных.",
1339
1618
  "content": {
@@ -1362,9 +1641,6 @@
1362
1641
  }
1363
1642
  }
1364
1643
  }
1365
- },
1366
- "403": {
1367
- "description": "Forbidden"
1368
1644
  }
1369
1645
  },
1370
1646
  "security": [
@@ -1380,7 +1656,7 @@
1380
1656
  "RatingCriteria"
1381
1657
  ],
1382
1658
  "summary": "Возвращает критерий рейтинга по идентификатору.",
1383
- "description": "## Пример запроса:\r\n`GET /RatingCriteria/1`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"id\": 1,\r\n \"name\": \"Скорость реагирования\",\r\n \"weight\": 1.25,\r\n \"isSystem\": true\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: критерий рейтинга с указанным идентификатором не найден.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
1659
+ "description": "## Пример запроса:\r\n`GET /RatingCriteria/1`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"id\": 1,\r\n \"name\": \"Скорость реагирования\",\r\n \"weight\": 1.25,\r\n \"isSystem\": true\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: критерий рейтинга с указанным идентификатором не найден.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `RatingCriteriaGet`.",
1384
1660
  "parameters": [
1385
1661
  {
1386
1662
  "name": "id",
@@ -1447,7 +1723,7 @@
1447
1723
  "description": "Отсутствует или некорректен Bearer-токен."
1448
1724
  },
1449
1725
  "403": {
1450
- "description": "Forbidden"
1726
+ "description": "Недостаточно прав `RatingCriteriaGet`."
1451
1727
  }
1452
1728
  },
1453
1729
  "security": [
@@ -1461,7 +1737,7 @@
1461
1737
  "RatingCriteria"
1462
1738
  ],
1463
1739
  "summary": "Помечает критерий рейтинга как удалённый.",
1464
- "description": "## Пример запроса:\r\n`DELETE /RatingCriteria/1`\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: удаление не выполнено из-за конфликта данных.",
1740
+ "description": "## Пример запроса:\r\n`DELETE /RatingCriteria/1`\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `RatingCriteriaDelete`.\r\n- 409 Conflict: удаление не выполнено из-за конфликта данных.",
1465
1741
  "parameters": [
1466
1742
  {
1467
1743
  "name": "id",
@@ -1507,6 +1783,9 @@
1507
1783
  "401": {
1508
1784
  "description": "Отсутствует или некорректен Bearer-токен."
1509
1785
  },
1786
+ "403": {
1787
+ "description": "Недостаточно прав `RatingCriteriaDelete`."
1788
+ },
1510
1789
  "409": {
1511
1790
  "description": "Удаление не выполнено из-за конфликта данных.",
1512
1791
  "content": {
@@ -1535,9 +1814,6 @@
1535
1814
  }
1536
1815
  }
1537
1816
  }
1538
- },
1539
- "403": {
1540
- "description": "Forbidden"
1541
1817
  }
1542
1818
  },
1543
1819
  "security": [
@@ -1553,8 +1829,32 @@
1553
1829
  "Sexes"
1554
1830
  ],
1555
1831
  "summary": "Возвращает список полов.",
1556
- "description": "## Пример запроса:\r\n`GET /Sexes`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Мужской\"\r\n },\r\n \"2\": {\r\n \"name\": \"Женский\"\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только записи из запрошенного диапазона `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: справочник полов не содержит записей.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
1832
+ "description": "## Пример запроса:\r\n`GET /Sexes`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Мужской\"\r\n },\r\n \"2\": {\r\n \"name\": \"Женский\"\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только записи из запрошенного диапазона `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: справочник полов не содержит записей.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `SexList`.",
1557
1833
  "parameters": [
1834
+ {
1835
+ "name": "Range",
1836
+ "in": "header",
1837
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
1838
+ "schema": {
1839
+ "type": "string"
1840
+ }
1841
+ },
1842
+ {
1843
+ "name": "offset",
1844
+ "in": "query",
1845
+ "description": "количество элементов, которое нобходимо пропустить",
1846
+ "schema": {
1847
+ "type": "string"
1848
+ }
1849
+ },
1850
+ {
1851
+ "name": "fetch",
1852
+ "in": "query",
1853
+ "description": "количество элементов, которое необходимо вернуть",
1854
+ "schema": {
1855
+ "type": "string"
1856
+ }
1857
+ },
1558
1858
  {
1559
1859
  "name": "X-Application-ID",
1560
1860
  "in": "header",
@@ -1648,7 +1948,7 @@
1648
1948
  "description": "Отсутствует или некорректен Bearer-токен."
1649
1949
  },
1650
1950
  "403": {
1651
- "description": "Forbidden"
1951
+ "description": "Недостаточно прав `SexList`."
1652
1952
  }
1653
1953
  },
1654
1954
  "security": [
@@ -1666,6 +1966,38 @@
1666
1966
  "summary": "Возвращает список навыков тенанта.",
1667
1967
  "description": "## Пример запроса:\r\n`GET /Skills?isDeleted=false`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"10\": {\r\n \"id\": 10,\r\n \"name\": \"Монтаж\",\r\n \"isOptional\": false,\r\n \"counters\": {\r\n \"tasks\": 12,\r\n \"assets\": 4,\r\n \"users\": 15\r\n }\r\n }\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть диапазона.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для заданных условий навыки не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `SkillList`.",
1668
1968
  "parameters": [
1969
+ {
1970
+ "name": "Range",
1971
+ "in": "header",
1972
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
1973
+ "schema": {
1974
+ "type": "string"
1975
+ }
1976
+ },
1977
+ {
1978
+ "name": "offset",
1979
+ "in": "query",
1980
+ "description": "количество элементов, которое нобходимо пропустить",
1981
+ "schema": {
1982
+ "type": "string"
1983
+ }
1984
+ },
1985
+ {
1986
+ "name": "fetch",
1987
+ "in": "query",
1988
+ "description": "количество элементов, которое необходимо вернуть",
1989
+ "schema": {
1990
+ "type": "string"
1991
+ }
1992
+ },
1993
+ {
1994
+ "name": "isDeleted",
1995
+ "in": "query",
1996
+ "description": "Если true, результат будет содержать только удаленные навыки, если false - только неудаленные",
1997
+ "schema": {
1998
+ "type": "boolean"
1999
+ }
2000
+ },
1669
2001
  {
1670
2002
  "name": "X-Application-ID",
1671
2003
  "in": "header",
@@ -1759,36 +2091,7 @@
1759
2091
  "description": "Отсутствует или некорректен Bearer-токен."
1760
2092
  },
1761
2093
  "403": {
1762
- "description": "Недостаточно прав для просмотра списка навыков."
1763
- },
1764
- "500": {
1765
- "description": "Internal Server Error",
1766
- "content": {
1767
- "text/plain": {
1768
- "schema": {
1769
- "type": "array",
1770
- "items": {
1771
- "$ref": "#/components/schemas/ErrorModel"
1772
- }
1773
- }
1774
- },
1775
- "application/json": {
1776
- "schema": {
1777
- "type": "array",
1778
- "items": {
1779
- "$ref": "#/components/schemas/ErrorModel"
1780
- }
1781
- }
1782
- },
1783
- "text/json": {
1784
- "schema": {
1785
- "type": "array",
1786
- "items": {
1787
- "$ref": "#/components/schemas/ErrorModel"
1788
- }
1789
- }
1790
- }
1791
- }
2094
+ "description": "Недостаточно прав `SkillList`."
1792
2095
  }
1793
2096
  },
1794
2097
  "security": [
@@ -1904,7 +2207,7 @@
1904
2207
  "description": "Отсутствует или некорректен Bearer-токен."
1905
2208
  },
1906
2209
  "403": {
1907
- "description": "Недостаточно прав для добавления навыков."
2210
+ "description": "Недостаточно прав `SkillAdd`."
1908
2211
  }
1909
2212
  },
1910
2213
  "security": [
@@ -1991,7 +2294,7 @@
1991
2294
  "description": "Отсутствует или некорректен Bearer-токен."
1992
2295
  },
1993
2296
  "403": {
1994
- "description": "Недостаточно прав для изменения навыков."
2297
+ "description": "Недостаточно прав `SkillUpdate`."
1995
2298
  }
1996
2299
  },
1997
2300
  "security": [
@@ -2083,7 +2386,7 @@
2083
2386
  "description": "Отсутствует или некорректен Bearer-токен."
2084
2387
  },
2085
2388
  "403": {
2086
- "description": "Недостаточно прав для удаления навыков."
2389
+ "description": "Недостаточно прав `SkillDelete`."
2087
2390
  }
2088
2391
  },
2089
2392
  "security": [
@@ -2166,7 +2469,7 @@
2166
2469
  "description": "Отсутствует или некорректен Bearer-токен."
2167
2470
  },
2168
2471
  "403": {
2169
- "description": "Недостаточно прав для просмотра навыка."
2472
+ "description": "Недостаточно прав `SkillGet`."
2170
2473
  }
2171
2474
  },
2172
2475
  "security": [
@@ -2226,7 +2529,7 @@
2226
2529
  "description": "Отсутствует или некорректен Bearer-токен."
2227
2530
  },
2228
2531
  "403": {
2229
- "description": "Недостаточно прав для удаления навыка."
2532
+ "description": "Недостаточно прав `SkillDelete`."
2230
2533
  },
2231
2534
  "409": {
2232
2535
  "description": "Навык не может быть удалён из-за конфликта связанных данных.",
@@ -2271,7 +2574,7 @@
2271
2574
  "Technicians"
2272
2575
  ],
2273
2576
  "summary": "Возвращает статистику рейтинга мобильного инженера.",
2274
- "description": "## Пример запроса:\r\n`GET /Technicians/101/rating`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"total\": { \"rating\": 4.9, \"trend\": 1 },\r\n \"lastYear\": { \"rating\": 4.8, \"trend\": 1 },\r\n \"lastFourMonths\": { \"rating\": 4.7, \"trend\": 0 },\r\n \"lastMonth\": { \"rating\": 4.8, \"trend\": 1 },\r\n \"lastWeek\": { \"rating\": 5.0, \"trend\": 1 },\r\n \"lastTenTasks\": { \"rating\": 4.9, \"trend\": 1 },\r\n \"lastFiftyTasks\": { \"rating\": 4.8, \"trend\": 0 },\r\n \"lastHundredTasks\": { \"rating\": 4.7, \"trend\": -1 },\r\n \"timestamp\": \"2026-08-19T09:30:00Z\"\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста статистика рейтинга отсутствует.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
2577
+ "description": "## Пример запроса:\r\n`GET /Technicians/101/rating`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"total\": { \"rating\": 4.9, \"trend\": 1 },\r\n \"lastYear\": { \"rating\": 4.8, \"trend\": 1 },\r\n \"lastFourMonths\": { \"rating\": 4.7, \"trend\": 0 },\r\n \"lastMonth\": { \"rating\": 4.8, \"trend\": 1 },\r\n \"lastWeek\": { \"rating\": 5.0, \"trend\": 1 },\r\n \"lastTenTasks\": { \"rating\": 4.9, \"trend\": 1 },\r\n \"lastFiftyTasks\": { \"rating\": 4.8, \"trend\": 0 },\r\n \"lastHundredTasks\": { \"rating\": 4.7, \"trend\": -1 },\r\n \"timestamp\": \"2026-08-19T09:30:00Z\"\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста статистика рейтинга отсутствует.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `TechnicianRatingGet`.",
2275
2578
  "parameters": [
2276
2579
  {
2277
2580
  "name": "userID",
@@ -2338,7 +2641,7 @@
2338
2641
  "description": "Отсутствует или некорректен Bearer-токен."
2339
2642
  },
2340
2643
  "403": {
2341
- "description": "Forbidden"
2644
+ "description": "Недостаточно прав `TechnicianRatingGet`."
2342
2645
  }
2343
2646
  },
2344
2647
  "security": [
@@ -2354,7 +2657,7 @@
2354
2657
  "Technicians"
2355
2658
  ],
2356
2659
  "summary": "Возвращает оценки инженера по заявкам.",
2357
- "description": "## Пример запроса:\r\n`GET /Technicians/101/taskRatings`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"taskID\": 50001,\r\n \"taskNumber\": \"SR-50001\",\r\n \"taskCompleted\": \"2026-08-18T15:30:00Z\",\r\n \"ratingCriteria\": { \"id\": 1, \"name\": \"Скорость реагирования\" },\r\n \"rating\": 5,\r\n \"comment\": \"Работа выполнена вовремя\",\r\n \"isIgnore\": false,\r\n \"ignoreReason\": null\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста оценки по заявкам отсутствуют.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
2660
+ "description": "## Пример запроса:\r\n`GET /Technicians/101/taskRatings`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"taskID\": 50001,\r\n \"taskNumber\": \"SR-50001\",\r\n \"taskCompleted\": \"2026-08-18T15:30:00Z\",\r\n \"ratingCriteria\": { \"id\": 1, \"name\": \"Скорость реагирования\" },\r\n \"rating\": 5,\r\n \"comment\": \"Работа выполнена вовремя\",\r\n \"isIgnore\": false,\r\n \"ignoreReason\": null\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста оценки по заявкам отсутствуют.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `TaskTechnicianRatingList`.",
2358
2661
  "parameters": [
2359
2662
  {
2360
2663
  "name": "userID",
@@ -2430,7 +2733,7 @@
2430
2733
  "description": "Отсутствует или некорректен Bearer-токен."
2431
2734
  },
2432
2735
  "403": {
2433
- "description": "Forbidden"
2736
+ "description": "Недостаточно прав `TaskTechnicianRatingList`."
2434
2737
  }
2435
2738
  },
2436
2739
  "security": [
@@ -2446,7 +2749,7 @@
2446
2749
  "Technicians"
2447
2750
  ],
2448
2751
  "summary": "Возвращает рабочее расписание специалиста.",
2449
- "description": "## Пример запроса:\r\n`GET /Technicians/101/workSchedules?validFrom=2026-08-19T00:00:00Z&validTill=2026-08-25T23:59:59Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"2026-08-19\": {\r\n \"workPeriod\": {\r\n \"from\": \"2026-08-19T08:00:00Z\",\r\n \"till\": \"2026-08-19T17:00:00Z\"\r\n },\r\n \"plannedWorkMinutes\": 480,\r\n \"taskWorkMinutes\": 240,\r\n \"isNightShift\": false\r\n }\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста расписание не найдено.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
2752
+ "description": "## Пример запроса:\r\n`GET /Technicians/101/workSchedules?validFrom=2026-08-19T00:00:00Z&validTill=2026-08-25T23:59:59Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"2026-08-19\": {\r\n \"workPeriod\": {\r\n \"from\": \"2026-08-19T08:00:00Z\",\r\n \"till\": \"2026-08-19T17:00:00Z\"\r\n },\r\n \"plannedWorkMinutes\": 480,\r\n \"taskWorkMinutes\": 240,\r\n \"isNightShift\": false\r\n }\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста расписание не найдено.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `TechnicianWorkScheduleListForTenantMember`.",
2450
2753
  "parameters": [
2451
2754
  {
2452
2755
  "name": "userID",
@@ -2458,6 +2761,42 @@
2458
2761
  "format": "int32"
2459
2762
  }
2460
2763
  },
2764
+ {
2765
+ "name": "validOn",
2766
+ "in": "query",
2767
+ "description": "Дата расписания работы пользователя с заявками",
2768
+ "schema": {
2769
+ "type": "string",
2770
+ "format": "date-time"
2771
+ }
2772
+ },
2773
+ {
2774
+ "name": "userID",
2775
+ "in": "query",
2776
+ "description": "Идентификатор пользователя, по которому будет отфильтрован результат",
2777
+ "schema": {
2778
+ "type": "integer",
2779
+ "format": "int32"
2780
+ }
2781
+ },
2782
+ {
2783
+ "name": "validFrom",
2784
+ "in": "query",
2785
+ "description": "Начало периода расписаний пользователя",
2786
+ "schema": {
2787
+ "type": "string",
2788
+ "format": "date-time"
2789
+ }
2790
+ },
2791
+ {
2792
+ "name": "validTill",
2793
+ "in": "query",
2794
+ "description": "Окончание периода расписаний пользователя",
2795
+ "schema": {
2796
+ "type": "string",
2797
+ "format": "date-time"
2798
+ }
2799
+ },
2461
2800
  {
2462
2801
  "name": "X-Application-ID",
2463
2802
  "in": "header",
@@ -2522,7 +2861,7 @@
2522
2861
  "description": "Отсутствует или некорректен Bearer-токен."
2523
2862
  },
2524
2863
  "403": {
2525
- "description": "Forbidden"
2864
+ "description": "Недостаточно прав `TechnicianWorkScheduleListForTenantMember`."
2526
2865
  }
2527
2866
  },
2528
2867
  "security": [
@@ -2538,7 +2877,7 @@
2538
2877
  "Technicians"
2539
2878
  ],
2540
2879
  "summary": "Возвращает расписание специалиста на дату вместе с назначенными заявками.",
2541
- "description": "## Пример запроса:\r\n`GET /Technicians/101/workSchedules/appointments?validOn=2026-08-19T00:00:00Z&showTransitionalAppointments=true&showWholeDayEvents=true`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"period\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T11:30:00Z\"\r\n },\r\n \"taskPeriod\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T12:00:00Z\"\r\n },\r\n \"isContinuedOnTheNextDay\": false,\r\n \"task\": {\r\n \"id\": 50001,\r\n \"number\": \"SR-50001\",\r\n \"notes\": \"Диагностика оборудования\",\r\n \"asset\": { \"id\": 7001, \"name\": \"Терминал\", \"deleted\": false },\r\n \"criticality\": { \"id\": 2, \"name\": \"Средняя\", \"color\": \"#FFA500\" },\r\n \"isClosed\": false,\r\n \"isCompleted\": false\r\n },\r\n \"coordinate\": \"55.751244:37.618423\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста назначения в расписании не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
2880
+ "description": "## Пример запроса:\r\n`GET /Technicians/101/workSchedules/appointments?validOn=2026-08-19T00:00:00Z&showTransitionalAppointments=true&showWholeDayEvents=true`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"period\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T11:30:00Z\"\r\n },\r\n \"taskPeriod\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T12:00:00Z\"\r\n },\r\n \"isContinuedOnTheNextDay\": false,\r\n \"task\": {\r\n \"id\": 50001,\r\n \"number\": \"SR-50001\",\r\n \"notes\": \"Диагностика оборудования\",\r\n \"asset\": { \"id\": 7001, \"name\": \"Терминал\", \"deleted\": false },\r\n \"criticality\": { \"id\": 2, \"name\": \"Средняя\", \"color\": \"#FFA500\" },\r\n \"isClosed\": false,\r\n \"isCompleted\": false\r\n },\r\n \"coordinate\": \"55.751244:37.618423\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного специалиста назначения в расписании не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `ScheduleTaskListForTenantMember`.",
2542
2881
  "parameters": [
2543
2882
  {
2544
2883
  "name": "userID",
@@ -2566,6 +2905,59 @@
2566
2905
  "type": "boolean"
2567
2906
  }
2568
2907
  },
2908
+ {
2909
+ "name": "validOn",
2910
+ "in": "query",
2911
+ "description": "Дата расписания работы пользователя с заявками",
2912
+ "schema": {
2913
+ "type": "string",
2914
+ "format": "date-time"
2915
+ }
2916
+ },
2917
+ {
2918
+ "name": "userID",
2919
+ "in": "query",
2920
+ "description": "Идентификатор пользователя, по которому будет отфильтрован результат",
2921
+ "schema": {
2922
+ "type": "integer",
2923
+ "format": "int32"
2924
+ }
2925
+ },
2926
+ {
2927
+ "name": "taskID",
2928
+ "in": "query",
2929
+ "description": "Идентификатор заявки, по которой будет отфильтрован результат",
2930
+ "schema": {
2931
+ "type": "integer",
2932
+ "format": "int32"
2933
+ }
2934
+ },
2935
+ {
2936
+ "name": "validFrom",
2937
+ "in": "query",
2938
+ "description": "Начало периода расписаний пользователя",
2939
+ "schema": {
2940
+ "type": "string",
2941
+ "format": "date-time"
2942
+ }
2943
+ },
2944
+ {
2945
+ "name": "validTill",
2946
+ "in": "query",
2947
+ "description": "Окончание периода расписаний пользователя",
2948
+ "schema": {
2949
+ "type": "string",
2950
+ "format": "date-time"
2951
+ }
2952
+ },
2953
+ {
2954
+ "name": "isCompleted",
2955
+ "in": "query",
2956
+ "description": "Признак, возвращения закрытых заявок(если true)",
2957
+ "schema": {
2958
+ "type": "boolean"
2959
+ }
2960
+ },
2569
2961
  {
2570
2962
  "name": "X-Application-ID",
2571
2963
  "in": "header",
@@ -2630,7 +3022,7 @@
2630
3022
  "description": "Отсутствует или некорректен Bearer-токен."
2631
3023
  },
2632
3024
  "403": {
2633
- "description": "Forbidden"
3025
+ "description": "Недостаточно прав `ScheduleTaskListForTenantMember`."
2634
3026
  }
2635
3027
  },
2636
3028
  "security": [
@@ -2646,8 +3038,61 @@
2646
3038
  "Technicians"
2647
3039
  ],
2648
3040
  "summary": "Возвращает расписание заявок для диаграммы Ганта.",
2649
- "description": "## Пример запроса:\r\n`GET /Technicians/taskSchedules?validFrom=2026-08-19T00:00:00Z&validTill=2026-08-19T23:59:59Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"period\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T13:00:00Z\"\r\n },\r\n \"taskPeriod\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T13:00:00Z\"\r\n },\r\n \"taskAssignmentPeriod\": {\r\n \"from\": \"2026-08-19T09:30:00Z\",\r\n \"till\": \"2026-08-19T13:30:00Z\"\r\n },\r\n \"description\": \"Монтаж оборудования и проверка подключения.\",\r\n \"assignedTo\": {\r\n \"id\": 101,\r\n \"firstName\": \"Иван\",\r\n \"lastName\": \"Иванов\",\r\n \"deleted\": false\r\n },\r\n \"listAssignedTo\": [\r\n {\r\n \"id\": 101,\r\n \"firstName\": \"Иван\",\r\n \"lastName\": \"Иванов\",\r\n \"deleted\": false\r\n }\r\n ],\r\n \"task\": {\r\n \"id\": 50001,\r\n \"number\": \"SR-50001\",\r\n \"notes\": \"Проверить оборудование на объекте.\",\r\n \"asset\": { \"id\": 7001, \"name\": \"Терминал\", \"deleted\": false },\r\n \"criticality\": { \"id\": 1, \"name\": \"Высокая\", \"color\": \"#FF0000\" },\r\n \"isClosed\": false,\r\n \"isCompleted\": false,\r\n \"deadline\": \"2026-08-20T18:00:00Z\",\r\n \"taskType\": { \"id\": 3, \"name\": \"Выезд\" },\r\n \"workType\": { \"id\": 5, \"name\": \"Монтаж\" }\r\n },\r\n \"company\": { \"id\": 3, \"name\": \"ООО Хабэкс\", \"deleted\": null },\r\n \"location\": {\r\n \"id\": 15,\r\n \"address\": \"г. Москва, ул. Тверская, д. 1\",\r\n \"coordinate\": \"55.751244:37.618423\",\r\n \"description\": \"Центральный вход, 2 этаж.\",\r\n \"deleted\": null\r\n }\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: по указанным параметрам данные для диаграммы Ганта не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
3041
+ "description": "## Пример запроса:\r\n`GET /Technicians/taskSchedules?validFrom=2026-08-19T00:00:00Z&validTill=2026-08-19T23:59:59Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"period\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T13:00:00Z\"\r\n },\r\n \"taskPeriod\": {\r\n \"from\": \"2026-08-19T10:00:00Z\",\r\n \"till\": \"2026-08-19T13:00:00Z\"\r\n },\r\n \"taskAssignmentPeriod\": {\r\n \"from\": \"2026-08-19T09:30:00Z\",\r\n \"till\": \"2026-08-19T13:30:00Z\"\r\n },\r\n \"description\": \"Монтаж оборудования и проверка подключения.\",\r\n \"assignedTo\": {\r\n \"id\": 101,\r\n \"firstName\": \"Иван\",\r\n \"lastName\": \"Иванов\",\r\n \"deleted\": false\r\n },\r\n \"listAssignedTo\": [\r\n {\r\n \"id\": 101,\r\n \"firstName\": \"Иван\",\r\n \"lastName\": \"Иванов\",\r\n \"deleted\": false\r\n }\r\n ],\r\n \"task\": {\r\n \"id\": 50001,\r\n \"number\": \"SR-50001\",\r\n \"notes\": \"Проверить оборудование на объекте.\",\r\n \"asset\": { \"id\": 7001, \"name\": \"Терминал\", \"deleted\": false },\r\n \"criticality\": { \"id\": 1, \"name\": \"Высокая\", \"color\": \"#FF0000\" },\r\n \"isClosed\": false,\r\n \"isCompleted\": false,\r\n \"deadline\": \"2026-08-20T18:00:00Z\",\r\n \"taskType\": { \"id\": 3, \"name\": \"Выезд\" },\r\n \"workType\": { \"id\": 5, \"name\": \"Монтаж\" }\r\n },\r\n \"company\": { \"id\": 3, \"name\": \"ООО Хабэкс\", \"deleted\": null },\r\n \"location\": {\r\n \"id\": 15,\r\n \"address\": \"г. Москва, ул. Тверская, д. 1\",\r\n \"coordinate\": \"55.751244:37.618423\",\r\n \"description\": \"Центральный вход, 2 этаж.\",\r\n \"deleted\": null\r\n }\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: по указанным параметрам данные для диаграммы Ганта не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `ScheduleTaskListForTenantMember`.",
2650
3042
  "parameters": [
3043
+ {
3044
+ "name": "validOn",
3045
+ "in": "query",
3046
+ "description": "Дата расписания работы пользователя с заявками",
3047
+ "schema": {
3048
+ "type": "string",
3049
+ "format": "date-time"
3050
+ }
3051
+ },
3052
+ {
3053
+ "name": "userID",
3054
+ "in": "query",
3055
+ "description": "Идентификатор пользователя, по которому будет отфильтрован результат",
3056
+ "schema": {
3057
+ "type": "integer",
3058
+ "format": "int32"
3059
+ }
3060
+ },
3061
+ {
3062
+ "name": "taskID",
3063
+ "in": "query",
3064
+ "description": "Идентификатор заявки, по которой будет отфильтрован результат",
3065
+ "schema": {
3066
+ "type": "integer",
3067
+ "format": "int32"
3068
+ }
3069
+ },
3070
+ {
3071
+ "name": "validFrom",
3072
+ "in": "query",
3073
+ "description": "Начало периода расписаний пользователя",
3074
+ "schema": {
3075
+ "type": "string",
3076
+ "format": "date-time"
3077
+ }
3078
+ },
3079
+ {
3080
+ "name": "validTill",
3081
+ "in": "query",
3082
+ "description": "Окончание периода расписаний пользователя",
3083
+ "schema": {
3084
+ "type": "string",
3085
+ "format": "date-time"
3086
+ }
3087
+ },
3088
+ {
3089
+ "name": "isCompleted",
3090
+ "in": "query",
3091
+ "description": "Признак, возвращения закрытых заявок(если true)",
3092
+ "schema": {
3093
+ "type": "boolean"
3094
+ }
3095
+ },
2651
3096
  {
2652
3097
  "name": "X-Application-ID",
2653
3098
  "in": "header",
@@ -2712,7 +3157,7 @@
2712
3157
  "description": "Отсутствует или некорректен Bearer-токен."
2713
3158
  },
2714
3159
  "403": {
2715
- "description": "Forbidden"
3160
+ "description": "Недостаточно прав `ScheduleTaskListForTenantMember`."
2716
3161
  }
2717
3162
  },
2718
3163
  "security": [
@@ -2728,7 +3173,7 @@
2728
3173
  "TenantSettings"
2729
3174
  ],
2730
3175
  "summary": "Возвращает настройки тенанта для модуля PA.",
2731
- "description": "## Пример запроса:\r\n`GET /TenantSettings`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"maxRatingMark\": 5\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
3176
+ "description": "## Пример запроса:\r\n`GET /TenantSettings`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"maxRatingMark\": 5\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: доступ запрещён (пользователь не является членом тенанта).",
2732
3177
  "parameters": [
2733
3178
  {
2734
3179
  "name": "X-Application-ID",
@@ -2782,7 +3227,7 @@
2782
3227
  "description": "Отсутствует или некорректен Bearer-токен."
2783
3228
  },
2784
3229
  "403": {
2785
- "description": "Forbidden"
3230
+ "description": "Доступ запрещён (пользователь не является членом тенанта)."
2786
3231
  }
2787
3232
  },
2788
3233
  "security": [
@@ -2798,7 +3243,7 @@
2798
3243
  "UserGroups"
2799
3244
  ],
2800
3245
  "summary": "Возвращает список групп пользователей.",
2801
- "description": "## Пример запроса:\r\n`GET /UserGroups`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Сервисные инженеры\"\r\n },\r\n \"2\": {\r\n \"name\": \"Супервайзеры\"\r\n }\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
3246
+ "description": "## Пример запроса:\r\n`GET /UserGroups`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"1\": {\r\n \"name\": \"Сервисные инженеры\"\r\n },\r\n \"2\": {\r\n \"name\": \"Супервайзеры\"\r\n }\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserGroupsList`.",
2802
3247
  "parameters": [
2803
3248
  {
2804
3249
  "name": "X-Application-ID",
@@ -2861,7 +3306,7 @@
2861
3306
  "description": "Отсутствует или некорректен Bearer-токен."
2862
3307
  },
2863
3308
  "403": {
2864
- "description": "Forbidden"
3309
+ "description": "Недостаточно прав `UserGroupsList`."
2865
3310
  }
2866
3311
  },
2867
3312
  "security": [
@@ -2877,8 +3322,35 @@
2877
3322
  "Users"
2878
3323
  ],
2879
3324
  "summary": "Возвращает структурированный график рабочих смен пользователей.",
2880
- "description": "## Пример запроса:\r\n`GET /Users/onshift/schedules?userID=101&validFrom=2026-08-19T00:00:00Z&validTill=2026-08-19T23:59:59Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"101\": [\r\n {\r\n \"isDayOff\": false,\r\n \"isCustomSchedule\": true,\r\n \"isPublicHoliday\": false,\r\n \"id\": 15,\r\n \"isNightShift\": false,\r\n \"dateWork\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"2026-08-19T09:00:00\",\r\n \"timeTill\": \"2026-08-19T18:00:00\"\r\n }\r\n ]\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: по указанным фильтрам смены не найдены.\r\n- 400 BadRequest: параметры фильтрации не прошли валидацию.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
3325
+ "description": "## Пример запроса:\r\n`GET /Users/onshift/schedules?userID=101&validFrom=2026-08-19T00:00:00Z&validTill=2026-08-19T23:59:59Z`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"101\": [\r\n {\r\n \"isDayOff\": false,\r\n \"isCustomSchedule\": true,\r\n \"isPublicHoliday\": false,\r\n \"id\": 15,\r\n \"isNightShift\": false,\r\n \"dateWork\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"2026-08-19T09:00:00\",\r\n \"timeTill\": \"2026-08-19T18:00:00\"\r\n }\r\n ]\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: по указанным фильтрам смены не найдены.\r\n- 400 BadRequest: параметры фильтрации не прошли валидацию.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkShiftList`.",
2881
3326
  "parameters": [
3327
+ {
3328
+ "name": "userID",
3329
+ "in": "query",
3330
+ "description": "Пользователи для которых запрашивается раписание",
3331
+ "schema": {
3332
+ "type": "integer",
3333
+ "format": "int32"
3334
+ }
3335
+ },
3336
+ {
3337
+ "name": "validFrom",
3338
+ "in": "query",
3339
+ "description": "Начальный период фильтрации по рабочему расписанию",
3340
+ "schema": {
3341
+ "type": "string",
3342
+ "format": "date-time"
3343
+ }
3344
+ },
3345
+ {
3346
+ "name": "validTill",
3347
+ "in": "query",
3348
+ "description": "Конечный период фильтрации по рабочему расписанию",
3349
+ "schema": {
3350
+ "type": "string",
3351
+ "format": "date-time"
3352
+ }
3353
+ },
2882
3354
  {
2883
3355
  "name": "X-Application-ID",
2884
3356
  "in": "header",
@@ -2955,7 +3427,7 @@
2955
3427
  "description": "Отсутствует или некорректен Bearer-токен."
2956
3428
  },
2957
3429
  "403": {
2958
- "description": "Forbidden"
3430
+ "description": "Недостаточно прав `UserWorkShiftList`."
2959
3431
  }
2960
3432
  },
2961
3433
  "security": [
@@ -2971,8 +3443,17 @@
2971
3443
  "Users"
2972
3444
  ],
2973
3445
  "summary": "Возвращает текущие статусы пользователей \"на смене\".",
2974
- "description": "## Пример запроса:\r\n`GET /Users/onshift/status?userID=101`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"onShift\": true,\r\n \"timeFrom\": \"2026-08-19T08:00:00\",\r\n \"timeTill\": \"2026-08-19T17:00:00\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: статусы по указанным пользователям не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
3446
+ "description": "## Пример запроса:\r\n`GET /Users/onshift/status?userID=101`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"onShift\": true,\r\n \"timeFrom\": \"2026-08-19T08:00:00\",\r\n \"timeTill\": \"2026-08-19T17:00:00\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: статусы по указанным пользователям не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkShiftList`.",
2975
3447
  "parameters": [
3448
+ {
3449
+ "name": "userID",
3450
+ "in": "query",
3451
+ "description": "Идентификатор пользователя",
3452
+ "schema": {
3453
+ "type": "integer",
3454
+ "format": "int32"
3455
+ }
3456
+ },
2976
3457
  {
2977
3458
  "name": "X-Application-ID",
2978
3459
  "in": "header",
@@ -3037,7 +3518,7 @@
3037
3518
  "description": "Отсутствует или некорректен Bearer-токен."
3038
3519
  },
3039
3520
  "403": {
3040
- "description": "Forbidden"
3521
+ "description": "Недостаточно прав `UserWorkShiftList`."
3041
3522
  }
3042
3523
  },
3043
3524
  "security": [
@@ -3053,7 +3534,7 @@
3053
3534
  "Users"
3054
3535
  ],
3055
3536
  "summary": "Создает произвольный график рабочих смен пользователя.",
3056
- "description": "## Пример запроса:\r\n`POST /Users/onshift/101`\r\n \r\n```json\r\n[\r\n {\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"isDayOff\": false,\r\n \"workShifts\": [\r\n {\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"17:00:00\"\r\n }\r\n ]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n[\r\n {\r\n \"id\": 15,\r\n \"isDayOff\": false,\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"17:00:00\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит данные графика рабочих смен.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: создание графика не выполнено из-за конфликтующих данных.",
3537
+ "description": "## Пример запроса:\r\n`POST /Users/onshift/101`\r\n \r\n```json\r\n[\r\n {\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"isDayOff\": false,\r\n \"workShifts\": [\r\n {\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"17:00:00\"\r\n }\r\n ]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n[\r\n {\r\n \"id\": 15,\r\n \"isDayOff\": false,\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"17:00:00\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит данные графика рабочих смен.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkShiftAdd`.\r\n- 409 Conflict: создание графика не выполнено из-за конфликтующих данных.",
3057
3538
  "parameters": [
3058
3539
  {
3059
3540
  "name": "userID",
@@ -3165,6 +3646,9 @@
3165
3646
  "401": {
3166
3647
  "description": "Отсутствует или некорректен Bearer-токен."
3167
3648
  },
3649
+ "403": {
3650
+ "description": "Недостаточно прав `UserWorkShiftAdd`."
3651
+ },
3168
3652
  "409": {
3169
3653
  "description": "Создание графика не выполнено из-за конфликтующих данных.",
3170
3654
  "content": {
@@ -3193,9 +3677,6 @@
3193
3677
  }
3194
3678
  }
3195
3679
  }
3196
- },
3197
- "403": {
3198
- "description": "Forbidden"
3199
3680
  }
3200
3681
  },
3201
3682
  "security": [
@@ -3209,7 +3690,7 @@
3209
3690
  "Users"
3210
3691
  ],
3211
3692
  "summary": "Удаляет пользовательский график рабочих смен для списка дат.",
3212
- "description": "## Пример запроса:\r\n`DELETE /Users/onshift/101`\r\n \r\n```json\r\n[\r\n \"2026-08-19T00:00:00Z\"\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: удаление графика не выполнено из-за конфликтующих данных.",
3693
+ "description": "## Пример запроса:\r\n`DELETE /Users/onshift/101`\r\n \r\n```json\r\n[\r\n \"2026-08-19T00:00:00Z\"\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkShiftDelete`.\r\n- 409 Conflict: удаление графика не выполнено из-за конфликтующих данных.",
3213
3694
  "parameters": [
3214
3695
  {
3215
3696
  "name": "userID",
@@ -3296,6 +3777,9 @@
3296
3777
  "401": {
3297
3778
  "description": "Отсутствует или некорректен Bearer-токен."
3298
3779
  },
3780
+ "403": {
3781
+ "description": "Недостаточно прав `UserWorkShiftDelete`."
3782
+ },
3299
3783
  "409": {
3300
3784
  "description": "Удаление графика не выполнено из-за конфликтующих данных.",
3301
3785
  "content": {
@@ -3324,9 +3808,6 @@
3324
3808
  }
3325
3809
  }
3326
3810
  }
3327
- },
3328
- "403": {
3329
- "description": "Forbidden"
3330
3811
  }
3331
3812
  },
3332
3813
  "security": [
@@ -3342,7 +3823,7 @@
3342
3823
  "Users"
3343
3824
  ],
3344
3825
  "summary": "Запускает новую смену пользователя.",
3345
- "description": "## Пример запроса:\r\n`PUT /Users/onshift/start/101`\r\n \r\n```json\r\n{\r\n \"from\": \"2026-08-19T08:00:00Z\",\r\n \"till\": \"2026-08-19T17:00:00Z\"\r\n}\r\n```\r\n \r\n## Пример успешного ответа (202):\r\n```json\r\n[\r\n {\r\n \"id\": 15,\r\n \"isDayOff\": false,\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"17:00:00\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит корректные данные для старта смены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: старт смены не выполнен из-за конфликтующих данных.",
3826
+ "description": "## Пример запроса:\r\n`PUT /Users/onshift/start/101`\r\n \r\n```json\r\n{\r\n \"from\": \"2026-08-19T08:00:00Z\",\r\n \"till\": \"2026-08-19T17:00:00Z\"\r\n}\r\n```\r\n \r\n## Пример успешного ответа (202):\r\n```json\r\n[\r\n {\r\n \"id\": 15,\r\n \"isDayOff\": false,\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"17:00:00\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит корректные данные для старта смены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkShiftOnShift`.\r\n- 409 Conflict: старт смены не выполнен из-за конфликтующих данных.",
3346
3827
  "parameters": [
3347
3828
  {
3348
3829
  "name": "userID",
@@ -3442,6 +3923,9 @@
3442
3923
  "401": {
3443
3924
  "description": "Отсутствует или некорректен Bearer-токен."
3444
3925
  },
3926
+ "403": {
3927
+ "description": "Недостаточно прав `UserWorkShiftOnShift`."
3928
+ },
3445
3929
  "409": {
3446
3930
  "description": "Старт смены не выполнен из-за конфликтующих данных.",
3447
3931
  "content": {
@@ -3470,9 +3954,6 @@
3470
3954
  }
3471
3955
  }
3472
3956
  }
3473
- },
3474
- "403": {
3475
- "description": "Forbidden"
3476
3957
  }
3477
3958
  },
3478
3959
  "security": [
@@ -3488,7 +3969,7 @@
3488
3969
  "Users"
3489
3970
  ],
3490
3971
  "summary": "Досрочно завершает смену пользователя.",
3491
- "description": "## Пример запроса:\r\n`PUT /Users/onshift/end/101`\r\n \r\n```json\r\n\"2026-08-19T16:30:00Z\"\r\n```\r\n \r\n## Пример успешного ответа (202):\r\n```json\r\n{\r\n \"id\": 15,\r\n \"isDayOff\": false,\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"16:30:00\"\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 409 Conflict: завершение смены не выполнено из-за конфликтующих данных.",
3972
+ "description": "## Пример запроса:\r\n`PUT /Users/onshift/end/101`\r\n \r\n```json\r\n\"2026-08-19T16:30:00Z\"\r\n```\r\n \r\n## Пример успешного ответа (202):\r\n```json\r\n{\r\n \"id\": 15,\r\n \"isDayOff\": false,\r\n \"date\": \"2026-08-19T00:00:00\",\r\n \"timeFrom\": \"08:00:00\",\r\n \"timeTill\": \"16:30:00\"\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkShiftOnShift`.\r\n- 409 Conflict: завершение смены не выполнено из-за конфликтующих данных.",
3492
3973
  "parameters": [
3493
3974
  {
3494
3975
  "name": "userID",
@@ -3580,6 +4061,9 @@
3580
4061
  "401": {
3581
4062
  "description": "Отсутствует или некорректен Bearer-токен."
3582
4063
  },
4064
+ "403": {
4065
+ "description": "Недостаточно прав `UserWorkShiftOnShift`."
4066
+ },
3583
4067
  "409": {
3584
4068
  "description": "Завершение смены не выполнено из-за конфликтующих данных.",
3585
4069
  "content": {
@@ -3608,9 +4092,6 @@
3608
4092
  }
3609
4093
  }
3610
4094
  }
3611
- },
3612
- "403": {
3613
- "description": "Forbidden"
3614
4095
  }
3615
4096
  },
3616
4097
  "security": [
@@ -3626,7 +4107,7 @@
3626
4107
  "Users"
3627
4108
  ],
3628
4109
  "summary": "Возвращает список видов работ пользователя.",
3629
- "description": "## Пример запроса:\r\n`GET /Users/101/workTypes`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"101\": [\r\n {\r\n \"workType\": {\r\n \"id\": 7,\r\n \"name\": \"Монтаж\",\r\n \"description\": null\r\n },\r\n \"workClass\": {\r\n \"id\": 2,\r\n \"name\": \"Электромонтаж\"\r\n }\r\n }\r\n ]\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть результата в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного пользователя виды работ не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
4110
+ "description": "## Пример запроса:\r\n`GET /Users/101/workTypes`\r\n \r\n## Пример успешного ответа (200):\r\n```json\r\n{\r\n \"101\": [\r\n {\r\n \"workType\": {\r\n \"id\": 7,\r\n \"name\": \"Монтаж\",\r\n \"description\": null\r\n },\r\n \"workClass\": {\r\n \"id\": 2,\r\n \"name\": \"Электромонтаж\"\r\n }\r\n }\r\n ]\r\n}\r\n```\r\n \r\n## Пример успешного ответа (206):\r\nТело ответа имеет тот же формат, что и для `200`, но содержит только часть результата в пределах заголовка `Range`.\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: для указанного пользователя виды работ не найдены.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkTypeList`.",
3630
4111
  "parameters": [
3631
4112
  {
3632
4113
  "name": "userID",
@@ -3638,6 +4119,30 @@
3638
4119
  "format": "int32"
3639
4120
  }
3640
4121
  },
4122
+ {
4123
+ "name": "Range",
4124
+ "in": "header",
4125
+ "description": "Формат: items=FROM-TILL , где FROM - начальный элемент (включая), TILL - конечный элемент (включая)",
4126
+ "schema": {
4127
+ "type": "string"
4128
+ }
4129
+ },
4130
+ {
4131
+ "name": "offset",
4132
+ "in": "query",
4133
+ "description": "количество элементов, которое нобходимо пропустить",
4134
+ "schema": {
4135
+ "type": "string"
4136
+ }
4137
+ },
4138
+ {
4139
+ "name": "fetch",
4140
+ "in": "query",
4141
+ "description": "количество элементов, которое необходимо вернуть",
4142
+ "schema": {
4143
+ "type": "string"
4144
+ }
4145
+ },
3641
4146
  {
3642
4147
  "name": "X-Application-ID",
3643
4148
  "in": "header",
@@ -3749,7 +4254,7 @@
3749
4254
  "description": "Отсутствует или некорректен Bearer-токен."
3750
4255
  },
3751
4256
  "403": {
3752
- "description": "Forbidden"
4257
+ "description": "Недостаточно прав `UserWorkTypeList`."
3753
4258
  }
3754
4259
  },
3755
4260
  "security": [
@@ -3763,7 +4268,7 @@
3763
4268
  "Users"
3764
4269
  ],
3765
4270
  "summary": "Добавляет пользователю виды работ.",
3766
- "description": "## Пример запроса:\r\n`POST /Users/101/workTypes`\r\n \r\n```json\r\n[\r\n 7,\r\n 9\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n{\r\n \"101\": [\r\n 7,\r\n 9\r\n ]\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит список видов работ.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
4271
+ "description": "## Пример запроса:\r\n`POST /Users/101/workTypes`\r\n \r\n```json\r\n[\r\n 7,\r\n 9\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n{\r\n \"101\": [\r\n 7,\r\n 9\r\n ]\r\n}\r\n```\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит список видов работ.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkTypeAdd`.",
3767
4272
  "parameters": [
3768
4273
  {
3769
4274
  "name": "userID",
@@ -3892,7 +4397,7 @@
3892
4397
  "description": "Отсутствует или некорректен Bearer-токен."
3893
4398
  },
3894
4399
  "403": {
3895
- "description": "Forbidden"
4400
+ "description": "Недостаточно прав `UserWorkTypeAdd`."
3896
4401
  }
3897
4402
  },
3898
4403
  "security": [
@@ -3906,7 +4411,7 @@
3906
4411
  "Users"
3907
4412
  ],
3908
4413
  "summary": "Удаляет у пользователя виды работ.",
3909
- "description": "## Пример запроса:\r\n`DELETE /Users/101/workTypes`\r\n \r\n```json\r\n[\r\n 7,\r\n 9\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит список видов работ.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
4414
+ "description": "## Пример запроса:\r\n`DELETE /Users/101/workTypes`\r\n \r\n```json\r\n[\r\n 7,\r\n 9\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 400 BadRequest: тело запроса не содержит список видов работ.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserWorkTypeDelete`.",
3910
4415
  "parameters": [
3911
4416
  {
3912
4417
  "name": "userID",
@@ -3997,7 +4502,7 @@
3997
4502
  "description": "Отсутствует или некорректен Bearer-токен."
3998
4503
  },
3999
4504
  "403": {
4000
- "description": "Forbidden"
4505
+ "description": "Недостаточно прав `UserWorkTypeDelete`."
4001
4506
  }
4002
4507
  },
4003
4508
  "security": [
@@ -4013,7 +4518,7 @@
4013
4518
  "UserSkills"
4014
4519
  ],
4015
4520
  "summary": "Добавляет навыки пользователям.",
4016
- "description": "## Пример запроса:\r\n`POST /UserSkills`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"data\": [\r\n {\r\n \"skillID\": 10,\r\n \"dateFrom\": \"2026-01-01T00:00:00Z\",\r\n \"dateTill\": \"2026-12-31T23:59:59Z\"\r\n }\r\n ]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n[\r\n {\r\n \"skillID\": 10,\r\n \"userID\": 101,\r\n \"dateTill\": \"2026-12-31T23:59:59Z\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: в результате обработки не было создано ни одной связи.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
4521
+ "description": "## Пример запроса:\r\n`POST /UserSkills`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"data\": [\r\n {\r\n \"skillID\": 10,\r\n \"dateFrom\": \"2026-01-01T00:00:00Z\",\r\n \"dateTill\": \"2026-12-31T23:59:59Z\"\r\n }\r\n ]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (201):\r\n```json\r\n[\r\n {\r\n \"skillID\": 10,\r\n \"userID\": 101,\r\n \"dateTill\": \"2026-12-31T23:59:59Z\"\r\n }\r\n]\r\n```\r\n \r\n## Негативные сценарии:\r\n- 204 NoContent: в результате обработки не было создано ни одной связи.\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserSkillAdd`.",
4017
4522
  "parameters": [
4018
4523
  {
4019
4524
  "name": "X-Application-ID",
@@ -4115,7 +4620,7 @@
4115
4620
  "description": "Отсутствует или некорректен Bearer-токен."
4116
4621
  },
4117
4622
  "403": {
4118
- "description": "Forbidden"
4623
+ "description": "Недостаточно прав `UserSkillAdd`."
4119
4624
  }
4120
4625
  },
4121
4626
  "security": [
@@ -4129,7 +4634,7 @@
4129
4634
  "UserSkills"
4130
4635
  ],
4131
4636
  "summary": "Обновляет навыки пользователей.",
4132
- "description": "## Пример запроса:\r\n`PUT /UserSkills`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"data\": [\r\n {\r\n \"skillID\": 10,\r\n \"dateFrom\": \"2026-01-01T00:00:00Z\",\r\n \"sourceDateTill\": \"2026-12-31T23:59:59Z\",\r\n \"dateTill\": \"2027-06-30T23:59:59Z\"\r\n }\r\n ]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
4637
+ "description": "## Пример запроса:\r\n`PUT /UserSkills`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"data\": [\r\n {\r\n \"skillID\": 10,\r\n \"dateFrom\": \"2026-01-01T00:00:00Z\",\r\n \"sourceDateTill\": \"2026-12-31T23:59:59Z\",\r\n \"dateTill\": \"2027-06-30T23:59:59Z\"\r\n }\r\n ]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserSkillUpdate`.",
4133
4638
  "parameters": [
4134
4639
  {
4135
4640
  "name": "X-Application-ID",
@@ -4202,7 +4707,7 @@
4202
4707
  "description": "Отсутствует или некорректен Bearer-токен."
4203
4708
  },
4204
4709
  "403": {
4205
- "description": "Forbidden"
4710
+ "description": "Недостаточно прав `UserSkillUpdate`."
4206
4711
  }
4207
4712
  },
4208
4713
  "security": [
@@ -4216,7 +4721,7 @@
4216
4721
  "UserSkills"
4217
4722
  ],
4218
4723
  "summary": "Удаляет навыки пользователей.",
4219
- "description": "## Пример запроса:\r\n`DELETE /UserSkills`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"data\": [10]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.",
4724
+ "description": "## Пример запроса:\r\n`DELETE /UserSkills`\r\n \r\n```json\r\n[\r\n {\r\n \"userID\": 101,\r\n \"data\": [10]\r\n }\r\n]\r\n```\r\n \r\n## Пример успешного ответа (202):\r\nТело ответа отсутствует.\r\n \r\n## Негативные сценарии:\r\n- 401 Unauthorized: отсутствует или некорректен Bearer-токен.\r\n- 403 Forbidden: недостаточно прав `UserSkillDelete`.",
4220
4725
  "parameters": [
4221
4726
  {
4222
4727
  "name": "X-Application-ID",
@@ -4289,7 +4794,7 @@
4289
4794
  "description": "Отсутствует или некорректен Bearer-токен."
4290
4795
  },
4291
4796
  "403": {
4292
- "description": "Forbidden"
4797
+ "description": "Недостаточно прав `UserSkillDelete`."
4293
4798
  }
4294
4799
  },
4295
4800
  "security": [
@@ -5894,7 +6399,7 @@
5894
6399
  "description": "Контроллер для управления режимами геотрекинга"
5895
6400
  },
5896
6401
  {
5897
- "name": "Moblities",
6402
+ "name": "Mobilities",
5898
6403
  "description": "Контроллер для управления мобильностями"
5899
6404
  },
5900
6405
  {
@@ -5903,7 +6408,7 @@
5903
6408
  },
5904
6409
  {
5905
6410
  "name": "Sexes",
5906
- "description": "Контроллер, управляющий назначениями (трудоустройством) пользователя"
6411
+ "description": "Контроллер для управления справочником полов"
5907
6412
  },
5908
6413
  {
5909
6414
  "name": "Skills",
@@ -5942,7 +6447,7 @@
5942
6447
  "description": "Контроллер для управления режимами геотрекинга"
5943
6448
  },
5944
6449
  {
5945
- "name": "Moblities",
6450
+ "name": "Mobilities",
5946
6451
  "description": "Контроллер для управления мобильностями"
5947
6452
  },
5948
6453
  {
@@ -5951,7 +6456,7 @@
5951
6456
  },
5952
6457
  {
5953
6458
  "name": "Sexes",
5954
- "description": "Контроллер, управляющий назначениями (трудоустройством) пользователя"
6459
+ "description": "Контроллер для управления справочником полов"
5955
6460
  },
5956
6461
  {
5957
6462
  "name": "Skills",