1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
WorkflowTemplateService.php
См. документацию.
1<?php
2
3namespace Bitrix\Bizproc\Api\Service;
4
5use Bitrix\Bizproc\FieldType;
6use Bitrix\Main\Config\Option;
7use Bitrix\Main\Localization\Loc;
8use Bitrix\Bizproc\Api\Response\Error;
9use Bitrix\Bizproc\Api\Enum\ErrorMessage;
10use Bitrix\Bizproc\Api\Data\WorkflowTemplateService\WorkflowTemplate;
11use Bitrix\Bizproc\Workflow\Template\WorkflowTemplateDraftTable;
12use Bitrix\Bizproc\Api\Request\WorkflowTemplateService as WorkflowTemplateRequest;
13use Bitrix\Bizproc\Api\Response\WorkflowTemplateService as WorkflowTemplateResponse;
14
16{
17 private const TRACK_ON_INTERVAL = 7 * 86400; // 7 days in seconds
18
19 private WorkflowAccessService $accessService;
20
21 public function __construct(?WorkflowAccessService $accessService = null)
22 {
23 $this->accessService = $accessService ?? new WorkflowAccessService();
24 }
25
26 public function prepareParameters(
27 WorkflowTemplateRequest\PrepareParametersRequest $request
28 ): WorkflowTemplateResponse\PrepareParametersResponse
29 {
30 try
31 {
32 \CBPHelper::parseDocumentId($request->complexDocumentType);
33 }
34 catch (\CBPArgumentNullException $e)
35 {
36 return WorkflowTemplateResponse\PrepareParametersResponse::createError(
38 );
39 }
40
41 $parameters = [];
42 foreach ($request->templateParameters as $key => $property)
43 {
44 $value = $request->requestParameters[$key] ?? null;
45
46 if ($property['Type'] === FieldType::FILE)
47 {
48 if (!empty($value) && isset($value['name']))
49 {
50 $parameters[$key] = $value;
51 if (is_array($value['name']))
52 {
53 $parameters[$key] = [];
54 \CFile::ConvertFilesToPost($value, $parameters[$key]);
55 }
56 }
57
58 continue;
59 }
60
61 $parameters[$key] = $value;
62 }
63
64 $errors = [];
65 $response =
66 (new WorkflowTemplateResponse\PrepareParametersResponse())
67 ->setRawParameters($parameters)
68 ->setParameters(
69 \CBPWorkflowTemplateLoader::checkWorkflowParameters(
70 $request->templateParameters, $parameters, $request->complexDocumentType, $errors
71 )
72 )
73 ;
74
75 if ($errors)
76 {
77 foreach ($errors as $error)
78 {
79 $response->addError(new \Bitrix\Bizproc\Error($error['message'], $error['code']));
80 }
81 }
82
83 return $response;
84 }
85
86 public function setConstants(
87 WorkflowTemplateRequest\SetConstantsRequest $request
88 ): WorkflowTemplateResponse\SetConstantsResponse
89 {
90 if ($request->templateId <= 0)
91 {
92 return WorkflowTemplateResponse\SetConstantsResponse::createError(new Error('negative template id'));
93 }
94
95 if ($request->userId <= 0)
96 {
97 return WorkflowTemplateResponse\SetConstantsResponse::createError(new Error('negative user id'));
98 }
99
100 try
101 {
102 \CBPHelper::parseDocumentId($request->complexDocumentType);
103 }
104 catch (\CBPArgumentNullException $e)
105 {
106 return WorkflowTemplateResponse\SetConstantsResponse::createError(Error::createFromThrowable($e));
107 }
108
109 if (
110 !\CBPDocument::canUserOperateDocumentType(
112 $request->userId,
113 $request->complexDocumentType
114 )
115 )
116 {
117 return WorkflowTemplateResponse\SetConstantsResponse::createError(new Error('access denied'));
118 }
119
120 $constants = \CBPWorkflowTemplateLoader::getTemplateConstants($request->templateId);
121 if (!is_array($constants) || !$constants)
122 {
123 return WorkflowTemplateResponse\SetConstantsResponse::createOk();
124 }
125
126 $preparedResult = $this->prepareParameters(
127 new WorkflowTemplateRequest\PrepareParametersRequest(
128 templateParameters: $constants,
129 requestParameters: $request->requestConstants,
130 complexDocumentType: $request->complexDocumentType,
131 )
132 );
133
134 if (!$preparedResult->isSuccess())
135 {
136 return (new WorkflowTemplateResponse\SetConstantsResponse())->addErrors($preparedResult->getErrors());
137 }
138
139 $preparedConstants = $preparedResult->getParameters();
140 foreach ($constants as $key => $constant)
141 {
142 $constants[$key]['Default'] = $preparedConstants[$key] ?? null;
143 }
144
145 try
146 {
147 \CBPWorkflowTemplateLoader::update($request->templateId, ['CONSTANTS' => $constants]);
148 }
149 catch (\Exception $e)
150 {
151 return WorkflowTemplateResponse\SetConstantsResponse::createError(
152 new Error('something go wrong, try again')
153 );
154 }
155
156 return WorkflowTemplateResponse\SetConstantsResponse::createOk();
157 }
158
159 public function prepareStartParameters(
160 WorkflowTemplateRequest\PrepareStartParametersRequest $request
161 ): WorkflowTemplateResponse\PrepareStartParametersResponse
162 {
163 if ($request->templateId <= 0)
164 {
165 return WorkflowTemplateResponse\PrepareStartParametersResponse::createError(
166 new Error('negative template id')
167 );
168 }
169
170 if ($request->targetUserId <= 0)
171 {
172 return WorkflowTemplateResponse\PrepareStartParametersResponse::createError(
173 new Error('negative target user id')
174 );
175 }
176
177 try
178 {
179 \CBPHelper::parseDocumentId($request->complexDocumentType);
180 }
181 catch (\CBPArgumentNullException $e)
182 {
183 return WorkflowTemplateResponse\PrepareStartParametersResponse::createError(Error::createFromThrowable($e));
184 }
185
186 $template =
187 \CBPWorkflowTemplateLoader::getList(
188 [],
189 [
190 'ID' => $request->templateId,
191 'DOCUMENT_TYPE' => $request->complexDocumentType,
192 'ACTIVE' => 'Y',
193 '<AUTO_EXECUTE' => \CBPDocumentEventType::Automation,
194 ],
195 false,
196 false,
197 ['ID', 'PARAMETERS']
198 )->fetch()
199 ;
200
201 if (!$template)
202 {
203 return WorkflowTemplateResponse\PrepareStartParametersResponse::createError(
204 new Error('template not found')
205 );
206 }
207
208 $workflowParameters = [];
209 if (is_array($template['PARAMETERS']) && $template['PARAMETERS'])
210 {
211 $preparedParameters = $this->prepareParameters(
212 new WorkflowTemplateRequest\PrepareParametersRequest(
213 $template['PARAMETERS'],
214 $request->requestParameters,
215 $request->complexDocumentType
216 )
217 );
218
219 if (!$preparedParameters->isSuccess())
220 {
221 return (new WorkflowTemplateResponse\PrepareStartParametersResponse())->addErrors(
222 $preparedParameters->getErrors()
223 );
224 }
225
226 $workflowParameters = $preparedParameters->getParameters();
227 }
228
229 $workflowParameters[\CBPDocument::PARAM_TAGRET_USER] = 'user_' . $request->targetUserId;
230 $workflowParameters[\CBPDocument::PARAM_DOCUMENT_EVENT_TYPE] = $request->eventType;
231
232 return (new WorkflowTemplateResponse\PrepareStartParametersResponse())->setParameters($workflowParameters);
233 }
234
235 public function saveTemplate(
236 WorkflowTemplateRequest\SaveTemplateRequest $request
237 ): WorkflowTemplateResponse\SaveTemplateResponse
238 {
239 $response = new WorkflowTemplateResponse\SaveTemplateResponse();
240
241 $documentType = $this->getDocumentType($request->parameters);
242 if (is_null($documentType))
243 {
244 $errorMsg = ErrorMessage::INVALID_PARAM_ARG->getError([
245 '#PARAM#' => 'DOCUMENT_TYPE',
246 '#VALUE#' => $documentType
247 ]);
248 $response->addError($errorMsg);
249
250 return $response;
251 }
252
253 if ($request->checkAccess && !$this->accessService->canCreateWorkflow($documentType, $request->user->getId()))
254 {
255 $response->addError(
256 ErrorMessage::ACCESS_DENIED->getError()
257 );
258
259 return $response;
260 }
261
262 try {
264 $templateId = $template->getTemplateId();
265 $fields = $template->getFields();
266 if ($templateId > 0)
267 {
268 \CBPWorkflowTemplateLoader::update($templateId, $fields);
269 $response->setTemplateId($templateId);
270 }
271 else
272 {
273 $response->setTemplateId(\CBPWorkflowTemplateLoader::add($fields));
274 }
275
276 $this->handleTrackOnOption($response->getTemplateId(), $template->getFields());
277 }
278 catch (\Throwable $exception)
279 {
280 if (method_exists($exception, 'getErrors'))
281 {
282 $errors = $exception->getErrors();
283 $response->setActivityErrors($errors);
284 foreach ($errors as $error)
285 {
286 $response->addError(new Error($error['message'], $error['code'] ?? 0));
287 }
288 }
289 else
290 {
291 $response->addError(new Error($exception->getMessage(), $exception->getCode()));
292 }
293 }
294
295 return $response;
296 }
297
298 private function handleTrackOnOption(int $templateId, array $fields): void
299 {
300 if (isset($fields['TRACK_ON']))
301 {
302 $optionName = 'tpl_track_on_' . $templateId;
303 if ($fields['TRACK_ON'] === 'Y')
304 {
305 $trackOn = (int)Option::get('bizproc', $optionName, 0);
306 if ((time() - self::TRACK_ON_INTERVAL) > $trackOn)
307 {
308 Option::set('bizproc', $optionName, time());
309 }
310 }
311 else
312 {
313 Option::delete('bizproc', ['name' => $optionName]);
314 }
315 }
316 }
317
318 public function importTemplate(
319 WorkflowTemplateRequest\ImportTemplateRequest $request
320 ): WorkflowTemplateResponse\ImportTemplateResponse
321 {
322 $response = new WorkflowTemplateResponse\ImportTemplateResponse();
323
324 $documentType = $this->getDocumentType($request->parameters);
325 if (is_null($documentType))
326 {
327 $errorMsg = ErrorMessage::INVALID_PARAM_ARG->getError([
328 '#PARAM#' => 'DOCUMENT_TYPE',
329 '#VALUE#' => $documentType
330 ]);
331 $response->addError($errorMsg);
332
333 return $response;
334 }
335
336 if ($request->checkAccess && !$this->accessService->canCreateWorkflow($documentType, $request->user->getId()))
337 {
338 $response->addError(
339 ErrorMessage::IMPORT_ACCESS_DENIED->getError()
340 );
341
342 return $response;
343 }
344
345 $newTemplateId = 0;
346 $file = $request->file;
347 if (is_uploaded_file($file['tmp_name']))
348 {
349 $fileHandle = fopen($file['tmp_name'], 'rb');
350 $data = fread($fileHandle, filesize($file['tmp_name']));
351 fclose($fileHandle);
352
353 try
354 {
355 $newTemplateId = \CBPWorkflowTemplateLoader::ImportTemplate(
356 $request->id,
357 $documentType,
358 $request->autostart,
359 $request->name,
360 $request->description,
361 $data
362 );
363 }
364 catch (\Throwable $exception)
365 {
366 $response->addError(new Error(preg_replace("#[\r\n]+#", " ", $exception->getMessage())));
367 }
368 }
369
370 if ($newTemplateId <= 0)
371 {
372 $response->addError(new Error(Loc::getMessage('BIZPROC_LIB_API_WORKFLOW_TEMPLATE_SERVICE_IMPORT_ERROR')));
373 }
374
375 $response->setTemplateId($newTemplateId);
376
377 return $response;
378 }
379
380 private function getDocumentType(array $parameters): ?array
381 {
382 if (!isset($parameters['MODULE_ID'], $parameters['ENTITY'], $parameters['DOCUMENT_TYPE']))
383 {
384 return null;
385 }
386
387 return [
388 $parameters['MODULE_ID'],
389 $parameters['ENTITY'],
390 $parameters['DOCUMENT_TYPE']
391 ];
392 }
393
394 public function exportTemplate(
395 WorkflowTemplateRequest\ExportTemplateRequest $request)
396 : WorkflowTemplateResponse\ExportTemplateResponse
397 {
398 $response = new WorkflowTemplateResponse\ExportTemplateResponse();
399
400 $documentType = $this->getDocumentType($request->parameters);
401 if (is_null($documentType))
402 {
403 $errorMsg = ErrorMessage::INVALID_PARAM_ARG->getError([
404 '#PARAM#' => 'DOCUMENT_TYPE',
405 '#VALUE#' => $documentType
406 ]);
407 $response->addError($errorMsg);
408
409 return $response;
410 }
411
412 if ($request->checkAccess && !$this->accessService->canCreateWorkflow($documentType, $request->user->getId()))
413 {
414 $response->addError(
415 ErrorMessage::EXPORT_ACCESS_DENIED->getError()
416 );
417
418 return $response;
419 }
420
421 $bp = \CBPWorkflowTemplateLoader::ExportTemplate($request->id);
422
423 if (!$bp)
424 {
425 $response->addError(new Error('Not found', 404));
426
427 return $response;
428 }
429
430 $response->setTemplateData((string) $bp);
431
432 return $response;
433 }
434
435 public function saveTemplateDraft(
436 WorkflowTemplateRequest\SaveTemplateRequest $request
437 ): WorkflowTemplateResponse\SaveTemplateDraftResponse
438 {
439 $response = new WorkflowTemplateResponse\SaveTemplateDraftResponse();
440
441 $documentType = $this->getDocumentType($request->parameters);
442 if (is_null($documentType))
443 {
444 $errorMsg = ErrorMessage::INVALID_PARAM_ARG->getError([
445 '#PARAM#' => 'DOCUMENT_TYPE',
446 '#VALUE#' => $documentType
447 ]);
448 $response->addError($errorMsg);
449
450 return $response;
451 }
452
453 if ($request->checkAccess && !$this->accessService->canCreateWorkflow($documentType, $request->user->getId()))
454 {
455 $response->addError(
456 ErrorMessage::ACCESS_DENIED->getError()
457 );
458
459 return $response;
460 }
461
462 try
463 {
465 $templateId = $template->getTemplateId() > 0 ? $template->getTemplateId() : null;
466 $fields = $template->getFields();
467
468 $tpl = \Bitrix\Bizproc\Workflow\Template\Entity\WorkflowTemplateTable::createObject();
469 $availableFields = [
470 'NAME',
471 'DESCRIPTION',
472 'TYPE',
473 'SORT',
474 'AUTO_EXECUTE',
475 'IS_SYSTEM',
476 'TEMPLATE',
477 ];
478
479 foreach ($availableFields as $field)
480 {
481 if (isset($fields[$field]))
482 {
483 $tpl->set($field, $fields[$field]);
484 }
485 }
486
487 [$moduleId, $entity, $documentType] = $template->getDocumentType();
488 $tpl->setModuleId($moduleId);
489 $tpl->setEntity($entity);
490 $tpl->setDocumentType($documentType);
491
493 'MODULE_ID' => $tpl->getModuleId(),
494 'ENTITY' => $tpl->getEntity(),
495 'DOCUMENT_TYPE' => $tpl->getDocumentType(),
496 'TEMPLATE_ID' => $templateId,
497 'TEMPLATE_DATA' => $tpl->collectValues(),
498 'USER_ID' => $request->user->getId(),
499 'CREATED' => new \Bitrix\Main\Type\DateTime()
500 ]);
501
502 if (!$result->isSuccess())
503 {
504 $response->addErrors($result->getErrors());
505
506 return $response;
507 }
508
509 $response->setTemplateDraftId((int)$result->getId());
510 }
511 catch (\Throwable $exception)
512 {
513 $response->addError(new Error($exception->getMessage(), $exception->getCode()));
514 }
515
516 return $response;
517 }
518
519 public function loadTemplateDraft(
520 WorkflowTemplateRequest\LoadTemplateDraftRequest $request
521 ): WorkflowTemplateResponse\LoadTemplateResponse
522 {
523 $response = new WorkflowTemplateResponse\LoadTemplateResponse();
524
525 if ($request->id <= 0)
526 {
527 $response->addError(new Error('incorrect draft id'));
528
529 return $response;
530 }
531
532 try
533 {
534 $draft = WorkflowTemplateDraftTable::getByPrimary($request->id)->fetchObject();
535 if (!$draft)
536 {
537 $response->addError(ErrorMessage::GET_DATA_ERROR->getError());
538 }
539
540 $response->setData($draft->collectValues());
541 }
542 catch (\Throwable $exception)
543 {
544 $response->addError(new Error($exception->getMessage(), $exception->getCode()));
545 }
546
547 return $response;
548 }
549}
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
Определения catalog_reindex.php:36
static createFromRequest(SaveTemplateRequest $request)
Определения WorkflowTemplate.php:19
exportTemplate(WorkflowTemplateRequest\ExportTemplateRequest $request)
Определения WorkflowTemplateService.php:394
loadTemplateDraft(WorkflowTemplateRequest\LoadTemplateDraftRequest $request)
Определения WorkflowTemplateService.php:519
prepareStartParameters(WorkflowTemplateRequest\PrepareStartParametersRequest $request)
Определения WorkflowTemplateService.php:159
setConstants(WorkflowTemplateRequest\SetConstantsRequest $request)
Определения WorkflowTemplateService.php:86
importTemplate(WorkflowTemplateRequest\ImportTemplateRequest $request)
Определения WorkflowTemplateService.php:318
prepareParameters(WorkflowTemplateRequest\PrepareParametersRequest $request)
Определения WorkflowTemplateService.php:26
saveTemplateDraft(WorkflowTemplateRequest\SaveTemplateRequest $request)
Определения WorkflowTemplateService.php:435
__construct(?WorkflowAccessService $accessService=null)
Определения WorkflowTemplateService.php:21
saveTemplate(WorkflowTemplateRequest\SaveTemplateRequest $request)
Определения WorkflowTemplateService.php:235
const FILE
Определения fieldtype.php:37
Определения error.php:15
static createFromThrowable(Throwable $exception)
Определения error.php:45
static add(array $data)
Определения datamanager.php:877
static getByPrimary($primary, array $parameters=array())
Определения datamanager.php:330
const CreateWorkflow
Определения constants.php:213
const Automation
Определения constants.php:156
$templateId
Определения component_props2.php:51
$data['IS_AVAILABLE']
Определения .description.php:13
$template
Определения file_edit.php:49
</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
$entity
$moduleId
$errors
Определения iblock_catalog_edit.php:74
Определения collection.php:2
if(empty($signedUserToken)) $key
Определения quickway.php:257
$errorMsg
Определения refund.php:16
$optionName
Определения options.php:1735
$response
Определения result.php:21
$error
Определения subscription_card_product.php:20
$fields
Определения yandex_run.php:501