- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/integration/crm/connectors/client.php
- Класс: Bitrix\Sender\Integration\Crm\Connectors\Client
- Вызов: Client::addNoPurchasesFilter
protected function addNoPurchasesFilter($query, $filterValue, $productSource)
{
$sqlHelper = Application::getConnection()->getSqlHelper();
$dealQuery = \Bitrix\Crm\DealTable::query();
if (is_array($productSource))
{
$semantics = [];
if (in_array(self::PRODUCT_SOURCE_DEALS_PROCESS, $productSource))
{
$semantics[] = \Bitrix\Crm\PhaseSemantics::PROCESS;
}
if (in_array(self::PRODUCT_SOURCE_DEALS_SUCCESS, $productSource))
{
$semantics[] = \Bitrix\Crm\PhaseSemantics::SUCCESS;
}
if (in_array(self::PRODUCT_SOURCE_DEALS_FAILURE, $productSource))
{
$semantics[] = \Bitrix\Crm\PhaseSemantics::FAILURE;
}
if ($semantics && count($semantics) < 3)
{
$dealQuery->whereIn('STAGE_SEMANTIC_ID', $semantics);
}
}
$dealsFilter = [];
foreach ($filterValue as $filterCode => $date)
{
$dealsFilter[str_replace('%PURCHASE_DATE%', 'DATE_CREATE', $filterCode)] =
new SqlExpression($sqlHelper->convertToDbDateTime(new DateTime($date)));
}
$dealQuery->setFilter($dealsFilter);
$orderQuery = null;
if (Helper::isCrmSaleEnabled())
{
$orderQuery = \Bitrix\Crm\Binding\OrderContactCompanyTable::query();
$orderQuery->addSelect('ENTITY_ID', 'EID');
if (is_array($productSource))
{
if (in_array(self::PRODUCT_SOURCE_ORDERS_PAID, $productSource) &&
!in_array(self::PRODUCT_SOURCE_ORDERS_UNPAID, $productSource))
{
$orderQuery->where('ORDER.PAYED', true);
}
if (!in_array(self::PRODUCT_SOURCE_ORDERS_PAID, $productSource) &&
in_array(self::PRODUCT_SOURCE_ORDERS_UNPAID, $productSource))
{
$orderQuery->where('ORDER.PAYED', false);
}
}
$orderQuery->whereNotNull('ENTITY_ID');
$ordersFilter = [];
foreach ($filterValue as $filterCode => $date)
{
$ordersFilter[str_replace('%PURCHASE_DATE%', 'ORDER.DATE_INSERT', $filterCode)] =
new SqlExpression($sqlHelper->convertToDbDateTime(new DateTime($date)));
}
$orderQuery->setFilter($ordersFilter);
}
if ($query->getEntity()->getName() === 'Contact')
{
$dealQuery->addSelect('CONTACT_ID', 'EID');
$dealQuery->whereNotNull('CONTACT_ID');
if ($orderQuery)
{
$orderQuery->where('ENTITY_TYPE_ID', \CCrmOwnerType::Contact);
}
}
elseif ($query->getEntity()->getName() === 'Company')
{
$dealQuery->addSelect('COMPANY_ID', 'EID');
$dealQuery->whereNotNull('COMPANY_ID');
if ($orderQuery)
{
$orderQuery->where('ENTITY_TYPE_ID', \CCrmOwnerType::Company);
}
}
$dealsAreRequired = empty($productSource) ||
array_intersect($productSource, [self::PRODUCT_SOURCE_DEALS_PROCESS, self::PRODUCT_SOURCE_DEALS_SUCCESS, self::PRODUCT_SOURCE_DEALS_FAILURE]);
$ordersAreRequired = empty($productSource) ||
array_intersect($productSource, [self::PRODUCT_SOURCE_ORDERS_PAID, self::PRODUCT_SOURCE_ORDERS_UNPAID]);
$idSubQuery = false;
if ($orderQuery && $dealsAreRequired && $ordersAreRequired)
{
$idSubQuery = new SqlExpression($dealQuery->getQuery() . ' UNION ALL ' . $orderQuery->getQuery());
}
elseif ($orderQuery && $ordersAreRequired)
{
$idSubQuery = $orderQuery;
}
elseif ($dealsAreRequired)
{
$idSubQuery = $dealQuery;
}
if ($idSubQuery)
{
$query->whereNotIn('ID', $idSubQuery);
}
}