1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
TaskService.php
См. документацию.
1<?php
2
3namespace Bitrix\Bizproc\Api\Service;
4
5use Bitrix\Bizproc\Api\Data\TaskService\TasksToGet;
6use Bitrix\Bizproc\Api\Data\TaskService\TasksToBeDelegated;
7use Bitrix\Bizproc\Api\Request\TaskService\DelegateTasksRequest;
8use Bitrix\Bizproc\Api\Request\TaskService\DoInlineTasksRequest;
9use Bitrix\Bizproc\Api\Request\TaskService\DoTaskRequest;
10use Bitrix\Bizproc\Api\Request\TaskService\GetUserTaskRequest;
11use Bitrix\Bizproc\Api\Request\TaskService\GetUserTaskListRequest;
12use Bitrix\Bizproc\Api\Request\TaskService\GetUserTaskByWorkflowIdRequest;
13use Bitrix\Bizproc\Api\Response;
14use Bitrix\Bizproc\Api\Response\TaskService\DelegateTasksResponse;
15use Bitrix\Bizproc\Api\Response\TaskService\GetUserTaskListResponse;
16use Bitrix\Bizproc\Api\Response\TaskService\GetUserTaskByWorkflowIdResponse;
17use Bitrix\Bizproc\Result;
18use Bitrix\Bizproc\Workflow\Task\TaskTable;
19use Bitrix\Main\ArgumentException;
20use Bitrix\Main\ArgumentOutOfRangeException;
21use Bitrix\Main\Error;
22use Bitrix\Main\Localization\Loc;
23
25{
26 private const TASK_ALREADY_DONE_ERROR_CODE = 'TASK_ALREADY_DONE';
27 private const TASK_USER_NOT_MEMBER_ERROR_CODE = 'TASK_USER_NOT_MEMBER';
28 private const TASK_NOT_FOUND_ERROR_CODE = 'TASK_NOT_FOUND';
29
30 public function __construct(
31 private TaskAccessService $accessService
32 )
33 {}
34
36 {
37 $delegateResponse = new DelegateTasksResponse();
38
39 $tasksToDelegate = null;
40 try
41 {
43 }
45 {
47 in_array($e->getParameter(), ['fromUserId', 'toUserId'], true)
48 ? Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_DELEGATE_TASK_ERROR_INCORRECT_USER_ID')
49 : $e->getMessage()
50 ;
51 $delegateResponse->addError(new Error($errorMessage));
52 }
53 catch (ArgumentException $e)
54 {
55 $delegateResponse->addError(
56 new Error(Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_DELEGATE_TASK_ERROR_NO_TASKS'))
57 );
58 }
59 if (!$tasksToDelegate || !$delegateResponse->isSuccess())
60 {
61 return $delegateResponse;
62 }
63
64 $checkAccessResult = $this->accessService->checkDelegateTask(
65 $tasksToDelegate->getToUserId(),
66 $tasksToDelegate->getFromUserId()
67 );
68 if (!$checkAccessResult->isSuccess())
69 {
70 return $delegateResponse->addErrors($checkAccessResult->getErrors());
71 }
72
73 $allowedDelegationType = $checkAccessResult->getAllowedDelegationTypes();
74
75 $errors = [];
76 $isDelegated = \CBPDocument::delegateTasks(
77 $tasksToDelegate->getFromUserId(),
78 $tasksToDelegate->getToUserId(),
79 $tasksToDelegate->getTaskIds(),
80 $errors,
81 $allowedDelegationType
82 );
83
84 if (!$isDelegated && !$errors)
85 {
86 $errors = [Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_DELEGATE_TASK_ERROR_TASKS_NOT_FOUND')];
87 }
88 foreach ($errors as $errorMessage)
89 {
90 $delegateResponse->addError(new Error($errorMessage));
91 }
92
93 if ($delegateResponse->isSuccess())
94 {
95 $delegateResponse->setData([
96 'successMessage' => Loc::getMessage(
97 'BIZPROC_LIB_API_TASK_SERVICE_DELEGATE_TASK_SUCCESS_MESSAGE',
98 ['#USER_NAME#' => \CBPHelper::convertUserToPrintableForm($tasksToDelegate->getToUserId(), '', false)]
99 ),
100 ]);
101 }
102
103 return $delegateResponse;
104 }
105
107 {
108 $getTasksResponse = new GetUserTaskListResponse();
109
110 $tasksToGet = null;
111 try
112 {
114 }
115 catch (ArgumentOutOfRangeException $exception)
116 {
117 // todo: user friendly error message
118 // use ::createError?
119 $getTasksResponse->addError(new Error($exception->getMessage()));
120 }
121 if (!$tasksToGet || !$getTasksResponse->isSuccess())
122 {
123 return $getTasksResponse;
124 }
125
126 $checkAccessResult = $this->accessService->checkViewTasks($tasksToGet->getTargetUserId());
127 if (!$checkAccessResult->isSuccess())
128 {
129 return $getTasksResponse->addErrors($checkAccessResult->getErrors());
130 }
131
132 $tasksIterator = \CBPTaskService::getList(
133 $tasksToGet->getSort(),
134 $tasksToGet->getFilter(),
135 false,
136 [
137 'nPageSize' => $tasksToGet->getLimit(),
138 'iNumPage' => (int)($tasksToGet->getOffset() / $tasksToGet->getLimit()) + 1,
139 ],
140 $tasksToGet->buildSelectFields()
141 );
142 $taskList = [];
143 while ($task = $tasksIterator->fetch())
144 {
145 $taskList[] = $this->prepareTaskInfo($task, $tasksToGet->getTargetUserId());
146 }
147
148 return $getTasksResponse->setData(['tasks' => $taskList]);
149 }
150
152 {
154 $task = false;
155
156 $checkAccessResult = $this->accessService->checkDoTasks($request->userId);
157 if (!$checkAccessResult->isSuccess())
158 {
159 return $result->addErrors($checkAccessResult->getErrors());
160 }
161
162 if ($request->taskId > 0)
163 {
165 [],
166 [
167 'ID' => $request->taskId,
168 'USER_ID' => $request->userId
169 ],
170 false,
171 false,
172 [
173 'ID',
174 'WORKFLOW_ID',
175 'ACTIVITY',
176 'ACTIVITY_NAME',
177 'MODIFIED',
178 'OVERDUE_DATE',
179 'NAME',
180 'DESCRIPTION',
181 'PARAMETERS',
182 'USER_STATUS',
183 ]
184 )->fetch();
185 }
186
187 if (!$task)
188 {
189 $this->addUserTaskNotFoundError($result, $request->taskId, $request->userId);
190
191 return $result;
192 }
193
194 if ((int)$task['USER_STATUS'] !== \CBPTaskUserStatus::Waiting)
195 {
196 return $result->addError(
197 new Error(
198 Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_DO_TASK_ERROR_ALREADY_DONE'),
199 self::TASK_ALREADY_DONE_ERROR_CODE
200 )
201 );
202 }
203
204 $task['PARAMETERS']['DOCUMENT_ID'] = \CBPStateService::GetStateDocumentId($task['WORKFLOW_ID']);
205 $task['MODULE_ID'] = $task['PARAMETERS']['DOCUMENT_ID'][0];
206 $task['ENTITY'] = $task['PARAMETERS']['DOCUMENT_ID'][1];
207 $task['DOCUMENT_ID'] = $task['PARAMETERS']['DOCUMENT_ID'][2];
208
209 if (!\CBPDocument::PostTaskForm($task, $request->userId, $request->taskRequest, $errors))
210 {
211 $error = reset($errors);
212 if ($task['MODULE_ID'] === 'rpa' && $error['code'] === \CBPRuntime::EXCEPTION_CODE_INSTANCE_TERMINATED)
213 {
214 return $result;
215 }
216
217 if (!empty($error['customData']))
218 {
219 foreach ($errors as $error)
220 {
221 $result->addError(new Error($error['message'], 0, $error['customData']));
222 }
223
224 return $result;
225 }
226
227 $result->addError(new Error($error['message']));
228 }
229
230 return $result;
231 }
232
233 public function doInlineTasks(DoInlineTasksRequest $request): Response\TaskService\DoInlineTaskResponse
234 {
235 $taskIds = [];
236 foreach ($request->taskIds as $id)
237 {
238 // TODO - throw argument or return error if $id not integer?
239 if (is_int($id))
240 {
241 $taskIds[] = $id;
242 }
243 }
244
246 if ($taskIds)
247 {
248 $errors = [];
249 \CBPDocument::setTasksUserStatus($request->userId, $request->newTaskStatusId, $taskIds, $errors);
250
251 if ($errors)
252 {
253 foreach ($errors as $errorMessage)
254 {
255 $result->addError(new \Bitrix\Bizproc\Error($errorMessage));
256 }
257 }
258 }
259
260 return $result;
261 }
262
263 public function getUserTask(GetUserTaskRequest $request): Response\TaskService\GetUserTaskResponse
264 {
266
267 if ($request->taskId <= 0 || $request->userId <= 0)
268 {
269 $this->addUserTaskNotFoundError($response, 0, $request->userId);
270
271 return $response;
272 }
273
274 $checkAccessResult = $this->accessService->checkViewTasks($request->userId);
275 if (!$checkAccessResult->isSuccess())
276 {
277 return $response->addErrors($checkAccessResult->getErrors());
278 }
279
281 [],
282 ['ID' => $request->taskId, 'USER_ID' => $request->userId],
283 false,
284 false,
285 [
286 'ID',
287 'USER_ID',
288 'NAME',
289 'DESCRIPTION',
290 'WORKFLOW_ID',
291 'ACTIVITY',
292 'STATUS',
293 'USER_STATUS',
294 'IS_INLINE',
295 'PARAMETERS',
296 'DELEGATION_TYPE',
297 ],
298 )->fetch();
299
300 if (!$task)
301 {
302 $this->addUserTaskNotFoundError($response, $request->taskId, $request->userId);
303
304 return $response;
305 }
306
307 $task = $this->prepareTaskInfo($task, $request->userId);
308
309 return $response->setTask($task);
310 }
311
313 {
315 $renderer = new \Bitrix\Bizproc\Controller\Response\RenderControlCollectionContent();
316 $task = false;
317 $taskQuery = null;
318
319 if ($request->workflowId)
320 {
321 $taskQuery =
323 ->setSelect([
324 'ID',
325 'ACTIVITY',
326 'ACTIVITY_NAME',
327 'NAME',
328 'DESCRIPTION',
329 'PARAMETERS',
330 'TEMPLATE_ID' => 'WORKFLOW_STATE.WORKFLOW_TEMPLATE_ID',
331 ])
332 ->setFilter([
333 '=WORKFLOW_ID' => $request->workflowId,
334 '=TASK_USERS.USER_ID' => $request->userId,
335 '=TASK_USERS.STATUS' => \CBPTaskUserStatus::Waiting,
336 ])
337 ->setOrder(['ID' => 'DESC'])
338 ->exec()
339 ;
340 $task = $taskQuery->fetch();
341 }
342
343 if (!$task)
344 {
345 $response->setContent($renderer);
346
347 return $response;
348 }
349
350 $task['saveVariables'] = $task['PARAMETERS']['SaveVariables'] ?? false;
351 $controls = \CBPDocument::getTaskControls($task, $request->userId);
352
353 $task['BUTTONS'] = $controls['BUTTONS'] ?? null;
354 $task['FIELDS'] = $controls['FIELDS'] ?? null;
355 if (isset($task['DESCRIPTION']))
356 {
357 $task['DESCRIPTION'] = \CBPViewHelper::prepareTaskDescription(
358 \CBPHelper::convertBBtoText(
359 preg_replace('|\n+|', "\n", trim($task['DESCRIPTION']))
360 )
361 );
362 }
363
364 if ($taskQuery?->fetch())
365 {
366 $task['IS_LAST_TASK_FOR_USER'] = false;
367 }
368 else
369 {
370 $task['IS_LAST_TASK_FOR_USER'] = \CBPTaskService::isLastTaskForUserByActivity(
371 $task['ACTIVITY_NAME'],
372 $request->userId,
373 $task['TEMPLATE_ID'],
374 $task['ACTIVITY']
375 );
376 }
377 $response->setTask($task);
378
379 $documentService = \CBPRuntime::getRuntime()->getDocumentService();
380 $documentType = $documentService->getDocumentType($task['PARAMETERS']['DOCUMENT_ID']);
381 if (isset($task['FIELDS']) && is_array($task['FIELDS']))
382 {
383 foreach ($task['FIELDS'] as $parameter)
384 {
385 $params['Field'] = $parameter['FieldId'] ?? $parameter['Id'];
386 $params['Value'] = $parameter['Default'] ?? null;
387 $params['Als'] = false;
388 $params['RenderMode'] = 'public';
389
390 $renderer->addProperty($documentType, $parameter, $params);
391 }
392 }
393 $response->setContent($renderer);
394
395 return $response;
396 }
397
398 private function addUserTaskNotFoundError(Result $response, int $taskId, int $userId): void
399 {
400 if ($taskId > 0)
401 {
402 $task = TaskTable::getByPrimary($taskId)->fetch();
403 if ($task)
404 {
405 if ((int)$task['STATUS'] !== \CBPTaskStatus::Running)
406 {
407 $response->addError(
408 new Error(
409 Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_ERROR_TASK_ALREADY_DONE'),
410 self::TASK_ALREADY_DONE_ERROR_CODE
411 )
412 );
413 }
414 elseif ($this->accessService->isCurrentUser($userId))
415 {
416 $response->addError(
417 new Error(
418 Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_ERROR_CURRENT_USER_NOT_MEMBER'),
419 self::TASK_USER_NOT_MEMBER_ERROR_CODE,
420 )
421 );
422 }
423 else
424 {
425 $response->addError(
426 new Error(
427 Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_ERROR_TARGET_USER_NOT_MEMBER'),
428 self::TASK_USER_NOT_MEMBER_ERROR_CODE,
429 )
430 );
431 }
432
433 return;
434 }
435 }
436
437 $response->addError(
438 new Error(
439 Loc::getMessage('BIZPROC_LIB_API_TASK_SERVICE_DO_TASK_ERROR_NO_TASK'),
440 self::TASK_NOT_FOUND_ERROR_CODE
441 )
442 );
443 }
444
445 private function prepareTaskInfo(array $task, int $userId = 0): array
446 {
447 $task['STATUS'] = (int)$task['STATUS'];
448
449 if (isset($task['MODIFIED']))
450 {
451 $task['MODIFIED'] = FormatDateFromDB($task['MODIFIED']);
452 }
453
454 $documentId =
455 is_array($task['PARAMETERS']['DOCUMENT_ID'] ?? null)
456 ? $task['PARAMETERS']['DOCUMENT_ID']
457 : null
458 ;
459 $task['DOCUMENT_URL'] = $documentId ? \CBPDocument::getDocumentAdminPage($documentId) : '';
460
461 $task['MODULE_ID'] = $documentId ? $documentId[0] : '';
462 $task['ENTITY'] = $documentId ? $documentId[1] : '';
463 $task['DOCUMENT_ID'] = $documentId ? $documentId[2] : '';
464 $task['COMPLEX_DOCUMENT_ID'] = $documentId;
465
466 if (isset($task['WORKFLOW_TEMPLATE_NAME']))
467 {
468 $task['WORKFLOW_NAME'] = $task['WORKFLOW_TEMPLATE_NAME']; // compatibility
469 }
470 if (isset($task['WORKFLOW_STARTED']))
471 {
472 $task['WORKFLOW_STARTED'] = FormatDateFromDB($task['WORKFLOW_STARTED']);
473 }
474
475 $controls = \CBPDocument::getTaskControls($task, $userId);
476
477 $task['BUTTONS'] = $controls['BUTTONS'] ?? null;
478 $task['FIELDS'] = $controls['FIELDS'] ?? null;
479
480 if (isset($task['DELEGATION_TYPE']))
481 {
482 $task['DELEGATION_TYPE'] = (int)$task['DELEGATION_TYPE'];
483 }
484
485 return $task;
486 }
487}
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
Определения catalog_reindex.php:36
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static createFromRequest(DelegateTasksRequest $request)
Определения TasksToBeDelegated.php:33
static createFromRequest(GetUserTaskListRequest $request)
Определения TasksToGet.php:24
getUserTask(GetUserTaskRequest $request)
Определения TaskService.php:263
delegateTasks(DelegateTasksRequest $request)
Определения TaskService.php:35
__construct(private TaskAccessService $accessService)
Определения TaskService.php:30
doInlineTasks(DoInlineTasksRequest $request)
Определения TaskService.php:233
getUserTaskByWorkflowId(GetUserTaskByWorkflowIdRequest $request)
Определения TaskService.php:312
doTask(DoTaskRequest $request)
Определения TaskService.php:151
getTasks(GetUserTaskListRequest $request)
Определения TaskService.php:106
Определения error.php:15
static isLastTaskForUserByActivity(string $activityName, int $userId, int $templateId, ?string $activity=null)
Определения taskservice.php:939
static GetList($arOrder=array("ID"=> "DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения taskservice.php:138
static getList($arOrder=array("ID"=> "DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения taskservice.php:831
const Running
Определения constants.php:258
const Waiting
Определения constants.php:273
static prepareTaskDescription($description)
Определения viewhelper.php:254
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$errors
Определения iblock_catalog_edit.php:74
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
FormatDateFromDB($date, $format='FULL', $phpFormat=false)
Определения tools.php:1875
trait Error
Определения error.php:11
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$response
Определения result.php:21
$error
Определения subscription_card_product.php:20