1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
helper.php
См. документацию.
1<?php
8
9namespace Bitrix\Sender\Integration\Crm\Connectors;
10
11use Bitrix\Crm\Service\Container;
12use Bitrix\Main\Application;
13use Bitrix\Main\Config\Option;
14use Bitrix\Main\DB\SqlExpression;
15use Bitrix\Main\Entity;
16use Bitrix\Main\Loader;
17use Bitrix\Main\Localization\Loc;
18use Bitrix\Main\Orm;
19use Bitrix\Main\UI\Filter\AdditionalDateType;
20use Bitrix\Main\UI\Filter\Type as UiFilterType;
21use Bitrix\Sender\Connector;
22use Bitrix\Sender\Integration;
23use Bitrix\Sender\Integration\Crm\Connectors\Personalize\BasePersonalize;
24use Bitrix\Sender\Integration\Crm\Connectors\Personalize\FactoryBased;
25use Bitrix\Sender\Recipient;
26
27Loc::loadMessages(__FILE__);
28
33class Helper
34{
35 public static $runtimeByEntity = [];
36 private const PERSONALIZE_NAMESPACE = "\\Bitrix\\Sender\\Integration\\Crm\\Connectors\\Personalize\\";
37
45 public static function createExpressionMultiField($entityName, $multiFieldTypeId)
46 {
47 $sqlHelper = Application::getConnection()->getSqlHelper();
48 return new Orm\Fields\ExpressionField(
49 $multiFieldTypeId,
50 '(' . $sqlHelper->getTopSql(
51 "
52 SELECT FM.VALUE
53 FROM b_crm_field_multi FM
54 WHERE FM.ENTITY_ID = '$entityName'
55 AND FM.ELEMENT_ID = %s
56 AND FM.TYPE_ID = '$multiFieldTypeId'
57 ORDER BY
58 CASE FM.VALUE_TYPE
59 WHEN 'MAILING' THEN 0
60 WHEN 'HOME' THEN 1
61 WHEN 'MOBILE' THEN 1
62 ELSE 2
63 END,
64 FM.ID
65 ",
66 1
67 ) . ')',
68 'ID'
69 );
70 }
71
77 public static function getPersonalizeList()
78 {
79 return array(
80 array('CODE' => 'CRM_ENTITY_TYPE'),
81 array('CODE' => 'CRM_ENTITY_TYPE_ID'),
82 array('CODE' => 'CRM_ENTITY_ID'),
83 );
84 }
85
86 public static function buildPersonalizeList($entityType)
87 {
88 $documentClass = self::PERSONALIZE_NAMESPACE.ucfirst($entityType);
89
90 if(!is_subclass_of($documentClass, BasePersonalize::class))
91 {
92 return [];
93 }
94
95 $fields = $documentClass::isFactoryBased($entityType)
97 : $documentClass::getEntityFields($entityType);
98
99 if(!$fields)
100 {
101 return [];
102 }
103
104 return static::preparePersonalizeList($entityType, $fields);
105 }
106
107 public static function preparePersonalizeList(string $entityType, array $fields): array
108 {
109 $result = [];
110 $items = [];
111
112 $counter = 0;
113 foreach ($fields as $fieldCode => $field)
114 {
115 $items[$counter++] = [
116 'CODE' => $entityType.'.'.$fieldCode,
117 'NAME' => $field['Name'],
118 'DESC' => $field['Name'],
119 ];
120 if(isset($field['personalizeCode']) && $field['personalizeCode'])
121 {
122 $items[$counter - 1]['CODE'] = implode(
123 "##",
125 );
126 }
127 }
128
129 $name = Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_'.$entityType);
130 if (Loader::includeModule('crm'))
131 {
132 $name = \CCrmOwnerType::GetDescription(\CCrmOwnerType::ResolveID($entityType));
133 }
134 $result[] = [
135 'CODE' => $entityType,
136 'NAME' => $name,
137 'ITEMS' => $items
138 ];
139
140 return $result;
141 }
142
143 public static function getData($entityType, $entityIds, $fields = ['*'])
144 {
145 $documentClass = self::PERSONALIZE_NAMESPACE.ucfirst($entityType);
146
147 if(!is_subclass_of($documentClass, BasePersonalize::class))
148 {
149 return [];
150 }
151
152 $fields = self::filterOnlyAllowedFields((string)$entityType, (array)$fields);
153 if (empty($fields))
154 {
155 return [];
156 }
157
158 return $documentClass::isFactoryBased($entityType)
159 ? FactoryBased::getData($entityType, $entityIds, $fields)
160 : $documentClass::getData($entityType, $entityIds, $fields)
161 ;
162 }
163
164 public static function getPersonalizeFieldsFromConnectors($isTrigger = false)
165 {
166 $connectors = Connector\Manager::getConnectorList();
167 $items = [];
168
169 foreach ($connectors as $connector)
170 {
171 if(!($connector instanceof Connector\BaseFilter))
172 {
173 continue;
174 }
175
176 if(method_exists($connector, 'getPersonalizeList'))
177 {
178 $list = $connector->getPersonalizeList();
179 if($isTrigger)
180 {
181 foreach ($list as $key => $data)
182 {
183 if(isset($data['ITEMS']) && in_array($data['CODE'], ['LEAD', 'CONTACT', 'COMPANY']))
184 {
185 unset($list[$key]);
186 }
187 }
188 }
189 if(!empty($list))
190 {
191 $items = array_merge($items, $list);
192 }
193 }
194 }
195 return $items;
196 }
197
206 public static function getFilterUserFields(int $entityTypeId, bool $checkAccessRights = true): array
207 {
208 $list = array();
209 $ufManager = is_object($GLOBALS['USER_FIELD_MANAGER']) ? $GLOBALS['USER_FIELD_MANAGER'] : null;
210 if (!$ufManager)
211 {
212 return $list;
213 }
214
215 $ufEntityId = \CCrmOwnerType::resolveUserFieldEntityID($entityTypeId);
216 $crmUserType = new \CCrmUserType($ufManager, $ufEntityId);
217 $logicFilter = array();
218 $fieldsParams = [];
219
220 if (!$checkAccessRights)
221 {
222 $fieldsParams = ['skipUserFieldVisibilityCheck' => true];
223 }
224 $crmUserType->prepareListFilterFields($list, $logicFilter, $fieldsParams);
225 $originalList = $crmUserType->getFields($fieldsParams);
226 $restrictedTypes = ['address', 'file', 'crm', 'resourcebooking'];
227
228 $list = array_filter(
229 $list,
230 function ($field) use ($originalList, $restrictedTypes)
231 {
232 if (empty($originalList[$field['id']]))
233 {
234 return false;
235 }
236
237 $type = $originalList[$field['id']]['USER_TYPE']['USER_TYPE_ID'];
238 return !in_array($type, $restrictedTypes);
239 }
240 );
241
242 foreach ($list as $index => $field)
243 {
244 if ($field['type'] === 'date')
245 {
246 $list[$index]['include'] = [
247 AdditionalDateType::CUSTOM_DATE,
248 AdditionalDateType::PREV_DAY,
249 AdditionalDateType::NEXT_DAY,
250 AdditionalDateType::MORE_THAN_DAYS_AGO,
251 AdditionalDateType::AFTER_DAYS,
252 ];
253 if (!isset($list[$index]['allow_years_switcher']))
254 {
255 $list[$index]['allow_years_switcher'] = true;
256 }
257 }
258 if ($originalList[$field['id']]['MULTIPLE'] == 'Y')
259 {
260 $list[$index]['multiple_uf'] = true;
261 }
262 }
263
264 return $list;
265 }
266
274 public static function prepareQuery(
276 $dataTypeId = null,
277 $entityDbName = null,
278 $entityName = null
279 )
280 {
281 $map = array(
282 Recipient\Type::EMAIL => [
283 'name' => 'HAS_EMAIL',
284 'operator' => '=',
285 'value' => 'Y'
286 ],
287 Recipient\Type::PHONE => [
288 'name' => 'HAS_PHONE',
289 'operator' => '=',
290 'value' => 'Y'
291 ],
292 Recipient\Type::IM => [
293 'name' => 'HAS_IMOL',
294 'operator' => '=',
295 'value' => 'Y'
296 ],
297 Recipient\Type::CRM_CONTACT_ID => [
298 'name' => 'CONTACT_ID',
299 'operator' => null,
300 'value' => null
301 ],
302 Recipient\Type::CRM_COMPANY_ID => [
303 'name' => 'COMPANY_ID',
304 'operator' => null,
305 'value' => null
306 ],
307 );
308
309 $entityName = $entityName ?? mb_strtoupper($query->getEntity()->getName());
310
311 if ($dataTypeId)
312 {
313 if (!isset($map[$dataTypeId]))
314 {
315 return $query;
316 }
317
318 $field = $map[$dataTypeId];
319
320 if($field['operator'] === null)
321 {
322 return $query;
323 }
324
325 if ($dataTypeId == Recipient\Type::CRM_COMPANY_ID && in_array($entityName, ['CONTACT']))
326 {
327 $field['name'] = 'CRM_COMPANY_ID';
328 }
329
330 $query->where($field['name'], $field['operator'], $field['value']);
331 if ($dataTypeId === Recipient\Type::IM)
332 {
333 $query->whereExists(self::getImSqlExpression($query, $entityDbName, $entityName));
334 }
335 }
336 else if (!in_array($entityName, ['CONTACT', 'COMPANY']))
337 {
338 $filter = Entity\Query::filter();
339 foreach ($map as $dataTypeId => $field)
340 {
341 if($field['operator'] === null)
342 {
343 continue;
344 }
345 if ($dataTypeId === Recipient\Type::IM)
346 {
347 $filter->where(
348 Entity\Query::filter()
349 ->where($field['name'], $field['operator'], $field['value'])
350 ->whereExists(self::getImSqlExpression($query, $entityDbName, $entityName))
351 );
352 }
353 else
354 {
355 $filter->where($field['name'], $field['operator'], $field['value']);
356 }
357 }
358
359 if (count($filter->getConditions()) > 0)
360 {
361 $filter->logic('or');
362 $query->where($filter);
363 }
364 }
365
366
367 return $query;
368 }
369
370 protected static function getImSqlExpression(
372 $entityDbName = null,
373 $entityName = null
374 )
375 {
377 if (empty($codes))
378 {
379 $codes = array('livechat', 'network');
380 }
381
382 $column = $entityDbName ? 'CRM_ENTITY_ID' : 'ID';
383
384 $entityTypeName = $entityName ?? mb_strtoupper($query->getEntity()->getName());
385
386 $sqlHelper = Application::getConnection()->getSqlHelper();
387 $regexp = "'^imol\\\\|(" . implode('|', $codes) . ")'";
388
389 $filterImolSql = "SELECT FM.VALUE " .
390 "FROM b_crm_field_multi FM " .
391 "WHERE FM.ENTITY_ID = '$entityTypeName' AND FM.ELEMENT_ID = ?#.{$column} " .
392 "AND FM.TYPE_ID = 'IM' " .
393 "AND NOT {$sqlHelper->getRegexpOperator('FM.VALUE', $regexp)} " .
394 "ORDER BY FM.ID LIMIT 1";
395
396 return new SqlExpression($filterImolSql, $query->getInitAlias());
397 }
398
405 public static function getRuntimeByEntity($entityTypeName = '')
406 {
407 if (isset(self::$runtimeByEntity[$entityTypeName]))
408 {
409 return self::$runtimeByEntity[$entityTypeName];
410 }
411
412 return [];
413 }
414
415 protected static function processRuntimeFilter(array &$filter, $entityTypeName = '')
416 {
417 foreach ($filter as $key => $item)
418 {
419 if (!($item instanceof Connector\Filter\RuntimeFilter))
420 {
421 continue;
422 }
423
424 unset($filter[$key]);
425 $filter[$item->getKey()] = $item->getValue();
426 if (empty(self::$runtimeByEntity[$entityTypeName]))
427 {
428 self::$runtimeByEntity[$entityTypeName] = [];
429 }
430 self::$runtimeByEntity[$entityTypeName] = array_merge(
431 self::$runtimeByEntity[$entityTypeName],
432 array_map(
433 function ($item) use ($entityTypeName)
434 {
435 $search = $entityTypeName ? $entityTypeName . '_' : '';
436 $runtimeName = $entityTypeName ? $entityTypeName . '.' : '';
437 $item['expression'] = str_replace(
438 $search,
439 $runtimeName,
440 $item['expression']
441 );
442 $item['buildFrom'] = array_map(
443 function ($from) use ($search, $runtimeName)
444 {
445 return str_replace($search, $runtimeName, $from);
446 },
447 $item['buildFrom']
448 );
449 return $item;
450 },
451 $item->getRuntime()
452 )
453 );
454 }
455 }
456
465 public static function getFilterByEntity(array $fields = array(), array $values = array(), array $entityTypeNames = array())
466 {
467 $map = array();
468 foreach ($entityTypeNames as $entityTypeName)
469 {
470 $map[$entityTypeName] = array($entityTypeName);
471 }
472 $map['CLIENT'] = array(\CCrmOwnerType::CompanyName, \CCrmOwnerType::ContactName);
473 $map[\CCrmOwnerType::CompanyName] = array(\CCrmOwnerType::CompanyName);
474 $map[\CCrmOwnerType::ContactName] = array(\CCrmOwnerType::ContactName);
475
476 $result = array();
477 foreach ($fields as $field)
478 {
479 if (!self::isFieldFilterable($field, $values))
480 {
481 continue;
482 }
483
484 $id = $field['id'];
485 foreach ($map as $prefix => $entityTypes)
486 {
487 $search = $prefix . '_';
488 if (mb_strpos($id, $search) !== 0)
489 {
490 continue;
491 }
492
493 foreach ($entityTypes as $entityTypeName)
494 {
495 $filterKey = "$entityTypeName.".mb_substr($id, mb_strlen($search));
496 if (!self::isFieldTypeFilter($field['type']))
497 {
498 $filterKey = "=$filterKey";
499 }
500 if ($field['multiple_uf'] ?? false)
501 {
502 $filterKey .= "_SINGLE";
503 }
504
505 $field['sender_segment_filter'] = $filterKey;
506 if (!isset($result[$entityTypeName]))
507 {
508 $result[$entityTypeName] = array();
509 }
510
511 $result[$entityTypeName][] = $field;
512 }
513
514 break;
515 }
516 }
517
518 self::$runtimeByEntity = [];
519 foreach ($result as $entityTypeName => $fields)
520 {
521 $items = self::getFilterByFields($fields, $values, $entityTypeName);
522
523 $result[$entityTypeName] = $items;
524 }
525
526 return $result;
527 }
528
529 private static function isFieldFilterable(array $field = array(), array $values = array())
530 {
531 $id = $field['id'];
532 $codeKey = 'sender_segment_filter';
533 if (isset($field[$codeKey]) && $field[$codeKey] === false)
534 {
535 return false;
536 }
537
538 if (!isset($values[$id]) || (!$values[$id] && !is_numeric($values[$id])))
539 {
540 return false;
541 }
542
543 return true;
544 }
545
554 public static function getFilterByFields(array $fields = array(), array $values = array(), $entityTypeName = '')
555 {
556 if ($entityTypeName)
557 {
558 if (!empty(self::$runtimeByEntity[$entityTypeName]))
559 {
560 self::$runtimeByEntity[$entityTypeName] = [];
561 }
562 }
563 else
564 {
565 self::$runtimeByEntity = [];
566 }
567
568 $filter = array();
569 foreach ($fields as $field)
570 {
571 if (!self::isFieldFilterable($field, $values))
572 {
573 continue;
574 }
575
576 $isMultiple = false;
577 if (isset($field['params']) && is_array($field['params']))
578 {
579 if (isset($field['params']['multiple']) && $field['params']['multiple'])
580 {
581 $isMultiple = true;
582 }
583 }
584
585 $id = $field['id'];
586 $value = $values[$id];
587 $value = $isMultiple && !is_array($value) ? array($value) :
588 ($value === "" ? null:$value);
589
590 if($isMultiple)
591 {
592 foreach($value as &$val)
593 {
594 if($val === "")
595 {
596 $val = null;
597 }
598 }
599 }
600
601 $field['value'] = $value;
602
603 if ($field['filter_callback'] ?? false)
604 {
605 $extraCallbackParams = [
606 'FIELD' => $field,
607 'ENTITY_TYPE_NAME' => $entityTypeName
608 ];
609 call_user_func_array($field['filter_callback'], [$value, &$filter, $extraCallbackParams]);
610 continue;
611 }
612
613 $filterKey = self::getFilterFieldKey($field);
614 if (is_array($filterKey))
615 {
616 foreach ($filterKey as $fieldValue => $fieldFilter)
617 {
618 if ($value !== $fieldValue)
619 {
620 continue;
621 }
622
623 $filter[$fieldFilter[0]] = $fieldFilter[1];
624 }
625 }
626 elseif (self::isFieldTypeFilter($field['type']))
627 {
628 self::setFieldTypeFilter($filterKey, $field, $filter);
629 self::processRuntimeFilter($filter, $entityTypeName);
630 }
631 else
632 {
633 $filter[$filterKey] = $value;
634 }
635 }
636
637 return $filter;
638 }
639
640 protected static function getFilterFieldKey(array $field)
641 {
642 $codeKey = 'sender_segment_filter';
643
644 $id = $field['id'];
645 if (isset($field[$codeKey]) && $field[$codeKey])
646 {
647 return $field[$codeKey];
648 }
649
650 if (self::isFieldTypeFilter($field['type']))
651 {
652 return "$id";
653 }
654
655 return "=$id";
656 }
657
658 protected static function isFieldTypeFilter($type)
659 {
660 $types = array(
661 UiFilterType::DATE,
662 UiFilterType::NUMBER,
663 UiFilterType::DEST_SELECTOR
664 );
665 return in_array(mb_strtoupper($type), $types);
666 }
667
668 protected static function setFieldTypeFilter($filterKey, array $fieldData, &$filter)
669 {
670 $fieldData['filter-key'] = $filterKey;
671 switch(mb_strtoupper($fieldData['type']))
672 {
673 case UiFilterType::DATE:
674 Connector\Filter\DateField::create($fieldData)->applyFilter($filter);
675 break;
676 case UiFilterType::NUMBER:
677 Connector\Filter\NumberField::create($fieldData)->applyFilter($filter);
678 break;
679 case UiFilterType::DEST_SELECTOR:
680 Connector\Filter\DestSelectorField::create($fieldData)->applyFilter($filter);
681 break;
682 }
683 }
684
685 protected static function getCommunicationTypeFilter(array $commTypes, &$filter, $extraCallbackParams = [])
686 {
687 if (in_array(\CCrmFieldMulti::PHONE, $commTypes))
688 {
689 $filter['=HAS_PHONE'] = 'Y';
690 }
691 if (in_array(\CCrmFieldMulti::EMAIL, $commTypes))
692 {
693 $filter['=HAS_EMAIL'] = 'Y';
694 }
695 if (in_array(\CCrmFieldMulti::IM, $commTypes))
696 {
697 $filter['=HAS_IMOL'] = 'Y';
698 }
699 }
700
701 protected static function getIdFilter($value, &$filter)
702 {
703 if (is_array($value))
704 {
705 $value = $value[0];
706 }
707
708 $filter['@CRM_ENTITY_ID'] = array_map('trim', explode(",", $value));
709 }
710
711 protected static function getNoPurchasesFilter($value, &$filter, $extraCallbackParams = [])
712 {
713 $entityTypeName = $extraCallbackParams['ENTITY_TYPE_NAME'];
714 $field = $extraCallbackParams['FIELD'];
715 if (!$entityTypeName)
716 return;
717
718 if ($value[$field['id'] . '_datesel'] != 'NONE')
719 {
720 $filter['NO_PURCHASES'] = [];
721 self::setFieldTypeFilter('%PURCHASE_DATE%', $field, $filter['NO_PURCHASES']);
722 self::processRuntimeFilter($filter['NO_PURCHASES'], $entityTypeName);
723 }
724 }
725
726 protected static function productSourceFilter($value, &$filter, $extraCallbackParams = [])
727 {
728 if ($filter['NO_PURCHASES'] || $filter['=COMPANY.PRODUCT_ID'] || $filter['=CONTACT.PRODUCT_ID'])
729 {
730 if (!is_array($value) || in_array("", $value)) // if PRODUCT_SOURCE wasn't set or has "everywhere" value
731 {
732 $value = [];
733 }
734 $filter['PRODUCT_SOURCE'] = $value;
735 }
736 }
737
738 protected static function getDealCategoryFilter($values, &$filter, $extraCallbackParams = [])
739 {
740 $filter['DEAL'] = [];
741 foreach ($values as $k => $value)
742 {
743 if(is_null($value))
744 {
745 $filter['DEAL'][] = ['SGT_DEAL.ID', '=', $value];
746 $filter['DEAL']['JOIN_TYPE'] = 'LEFT';
747 unset($values[$k]);
748 }
749 }
750 if(!empty($values))
751 {
752 $filter['DEAL'][] = ['SGT_DEAL.CATEGORY_ID', 'in', $values];
753 }
754 }
755
762 public function onResultViewDraw(array &$row)
763 {
764 switch ($row['CRM_ENTITY_TYPE_ID'])
765 {
766 case \CCrmOwnerType::Company:
767 $crmRow = \Bitrix\Crm\CompanyTable::getRowById($row['CRM_ENTITY_ID']);
768 $row['~NAME'] = self::getResultViewTitle(
769 $row['CRM_ENTITY_TYPE_ID'],
770 $row['CRM_ENTITY_ID'],
771 $row['NAME'],
772 \CCrmOwnerType::GetDescription($row['CRM_ENTITY_TYPE_ID']),
773 self::getCrmStatusName('COMPANY_TYPE', $crmRow['COMPANY_TYPE'])
774 );
775 break;
776 case \CCrmOwnerType::Contact:
777 $crmRow = \Bitrix\Crm\ContactTable::getRowById($row['CRM_ENTITY_ID']);
778 $row['~NAME'] = self::getResultViewTitle(
779 $row['CRM_ENTITY_TYPE_ID'],
780 $row['CRM_ENTITY_ID'],
781 $row['NAME'],
782 \CCrmOwnerType::GetDescription($row['CRM_ENTITY_TYPE_ID']),
783 self::getCrmStatusName('SOURCE', $crmRow['SOURCE_ID'])
784 );
785 break;
786 case \CCrmOwnerType::Lead:
787 $crmRow = \Bitrix\Crm\LeadTable::getRowById($row['CRM_ENTITY_ID']);
788 $row['CRM_LEAD'] = $row['~CRM_LEAD'] = self::getResultViewTitle(
789 $row['CRM_ENTITY_TYPE_ID'],
790 $row['CRM_ENTITY_ID'],
791 $crmRow['TITLE'],
792 self::getCrmStatusName('SOURCE', $crmRow['SOURCE_ID']),
793 $crmRow['IS_RETURN_CUSTOMER'] === 'Y' ? Loc::getMessage('SENDER_INTEGRATION_CRM_CONNECTOR_LEAD_FIELD_RC_LEAD') : null
794 );
795 break;
796 }
797 }
798
799 protected function getCrmStatusName($statusType, $statusId)
800 {
801 if (!$statusId)
802 {
803 return null;
804 }
805
806 $sources = \CCrmStatus::GetStatus($statusType);
807 if (empty($sources[$statusId]))
808 {
809 return $statusId;
810 }
811
812 return $sources[$statusId]['NAME'];
813 }
814
815 protected function getResultViewTitle($entityTypeId, $entityId, $title, $secondTitle = null, $thirdTitle = null)
816 {
817 $url = self::getPathToDetail($entityTypeId, $entityId);
819 if ($url && \CCrmAuthorizationHelper::checkReadPermission($entityTypeId, $entityId))
820 {
821 $title = '<a href="' . $url . '">' . $title . '</a>';
822 }
823
824 if ($secondTitle)
825 {
826 $title .= "<br><span style=\"color:grey; font-size: 12px;\">";
827 $title .= htmlspecialcharsbx($secondTitle);
828 $title .= "</span>";
829 }
830
831 if ($thirdTitle)
832 {
833 $title .= "<br><span style=\"color:grey; font-size: 12px;\">";
834 $title .= htmlspecialcharsbx($thirdTitle);
835 $title .= "</span>";
836 }
837
838 return $title;
839 }
840
841 protected function getPathToDetail($entityTypeId, $entityId)
842 {
843 if (Loader::includeModule('crm'))
844 {
845 return Container::getInstance()->getRouter()->getItemDetailUrl($entityTypeId, $entityId);
846 }
847 switch ($entityTypeId)
848 {
849 case \CCrmOwnerType::Company:
850 $optionName = 'path_to_company_details';
851 break;
852 case \CCrmOwnerType::Contact:
853 $optionName = 'path_to_contact_details';
854 break;
855 case \CCrmOwnerType::Lead:
856 $optionName = 'path_to_lead_details';
857 break;
858 default:
859 $optionName = null;
860 }
861
862 $url = $optionName ? Option::get('crm', $optionName) : null;
863 if ($url)
864 {
865 $url = str_replace(
866 ['#company_id#', '#contact_id#', '#lead_id#'],
867 $entityId,
868 $url
869 );
870 }
871
872 return $url;
873 }
874
875 public static function isCrmSaleEnabled()
876 {
877 return Loader::includeModule("sale") && (Option::get("crm", "crm_shop_enabled", "N") != 'N');
878 }
879
886 private static function filterOnlyAllowedFields(string $entityType, array $fields): array
887 {
888 $allowedFields = self::getPersonalizeFieldsFromConnectors();
889
890 return array_filter($fields, static function (string $field) use ($allowedFields, $entityType): bool
891 {
892 if ($field === '*')
893 {
894 return true;
895 }
896
897 $entityField = "$entityType.$field";
898
899 foreach ($allowedFields as $allowedField)
900 {
901 if (($allowedField['CODE'] ?? null) !== $entityType)
902 {
903 continue;
904 }
905
906 $items = (array)($allowedField['ITEMS'] ?? []);
907 foreach ($items as $item)
908 {
909 if (($item['CODE'] ?? null) === $entityField)
910 {
911 return true;
912 }
913 }
914 }
915
916 return false;
917 });
918 }
919}
$type
Определения options.php:106
$allowedFields
Определения push.php:9
static getConnection($name="")
Определения application.php:638
static includeModule($moduleName)
Определения loader.php:67
static create(array $data)
Определения abstractfield.php:27
getResultViewTitle($entityTypeId, $entityId, $title, $secondTitle=null, $thirdTitle=null)
Определения helper.php:815
static getPersonalizeFieldsFromConnectors($isTrigger=false)
Определения helper.php:164
static getCommunicationTypeFilter(array $commTypes, &$filter, $extraCallbackParams=[])
Определения helper.php:685
static setFieldTypeFilter($filterKey, array $fieldData, &$filter)
Определения helper.php:668
static productSourceFilter($value, &$filter, $extraCallbackParams=[])
Определения helper.php:726
static buildPersonalizeList($entityType)
Определения helper.php:86
static getFilterFieldKey(array $field)
Определения helper.php:640
static preparePersonalizeList(string $entityType, array $fields)
Определения helper.php:107
getCrmStatusName($statusType, $statusId)
Определения helper.php:799
static getFilterByFields(array $fields=array(), array $values=array(), $entityTypeName='')
Определения helper.php:554
static isFieldTypeFilter($type)
Определения helper.php:658
static processRuntimeFilter(array &$filter, $entityTypeName='')
Определения helper.php:415
static getDealCategoryFilter($values, &$filter, $extraCallbackParams=[])
Определения helper.php:738
static getImSqlExpression(Entity\Query $query, $entityDbName=null, $entityName=null)
Определения helper.php:370
static getData($entityType, $entityIds, $fields=[' *'])
Определения helper.php:143
static prepareQuery(Entity\Query $query, $dataTypeId=null, $entityDbName=null, $entityName=null)
Определения helper.php:274
static createExpressionMultiField($entityName, $multiFieldTypeId)
Определения helper.php:45
static getFilterByEntity(array $fields=array(), array $values=array(), array $entityTypeNames=array())
Определения helper.php:465
getPathToDetail($entityTypeId, $entityId)
Определения helper.php:841
static getIdFilter($value, &$filter)
Определения helper.php:701
onResultViewDraw(array &$row)
Определения helper.php:762
static getNoPurchasesFilter($value, &$filter, $extraCallbackParams=[])
Определения helper.php:711
static getRuntimeByEntity($entityTypeName='')
Определения helper.php:405
static getFilterUserFields(int $entityTypeId, bool $checkAccessRights=true)
Определения helper.php:206
static getData(string $entityType, array $entityIds, array $usedFields=[' *'], string $sortBy='id', string $sortOrder='asc')
Определения factorybased.php:74
static getExcludedChannelCodes()
Определения service.php:43
$data['IS_AVAILABLE']
Определения .description.php:13
</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
$query
Определения get_search.php:11
$filter
Определения iblock_catalog_list.php:54
$sources
Определения options.php:35
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
$name
Определения menu_edit.php:35
$map
Определения config.php:5
Определения ufield.php:9
Определения chain.php:3
$GLOBALS['____1690880296']
Определения license.php:1
Определения base.php:8
Определения agent.php:8
$entityId
Определения payment.php:4
$counter
Определения options.php:5
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$items
Определения template.php:224
$title
Определения pdf.php:123
$val
Определения options.php:1793
$optionName
Определения options.php:1735
$k
Определения template_pdf.php:567
$url
Определения iframe.php:7
$fields
Определения yandex_run.php:501