Приветствую. Разрабатываю вывод статистики для каждого сотрудника из CRM Bitrix. Требуется взять количество звонков, его продуктивность, сумму сделок и т.п.
Вопрос в том как сделать более удобные методы для обработки данных. У меня есть функция, которая запрашивает данные о звонках. При том запрос строится с помощью указания фильтров для API битрикс, например, CALL_DURATION > 20. И мне нужно получить в одном случае все звонки всех сотрудников, а в другом звонки только определенных пользователей(по их ID). Получается мне нужно указать несколько разных параметров фильтров для одной функции. Проблема в том, что в эту функцию приходится добавлять кучу аргументов: длительность звонка, дата выборки, айди юзеров, типа сортировки, пагинация
getCallsHistory($callDuration=0, $dateStart=0, $dateEnd=0, array $usersID=[], $sort=null, &$result = array(), $nextPagination=0);
Для большего удобства я подумал использовать один массив куда будут передаваться все параметры для фильтрации. Таким образом функция становится значительно чище в аргументах, но мне кажется что я не очень удобно строю этот массив фильтров. У меня никак не контролируется заполнение значений и названия ключей. Может есть какой-то более лучший способ создавать этот массив? Или может вообще идея с массивом плохая? Привожу ниже весь код
<?php
class bitrix24 extends BaseObject {
//Как бы общая функция для выдачи звонков по разным фильтрам
private static function getCallsHistorySource($filterData, &$result = array(), $nextPagination=0)
{
//Тут попытка создать дефолтные значения для фильтров
$defaultFilterData = [
'callDuration' => 0,
'dateStart' => 0,
'dateEnd' => 0,
'usersID' => '',
'sort' => 'CALL_START_DATE'
];
$filterData = array_merge($defaultFilterData, $filterData);
//Тут я уже формирую фильтр для запроса в битрикс
$filter = array(
">=CALL_DURATION" => $filterData['callDuration'],
"CALL_TYPE" => 1,
">CALL_START_DATE" => $filterData['dateStart'],
"<CALL_START_DATE" => $filterData['dateEnd'],
'PORTAL_USER_ID' => $filterData['usersID']
);
// Получаем данные
$callsHistory = Yii::$app->bitrix24->Send("voximplant.statistic.get", 'POST', array(
"FILTER" => $filter,
"SORT" => $filterData['sort'],
"ORDER" => "DESC",
"start" => $nextPagination,
));
// Рекурсией обрабатываем оставшившиеся данные
if(isset($callsHistory['nextPagination']) && $callsHistory['nextPagination'] > 0) {
self::getCallsHistorySource($filterData,$result, $callsHistory['nextPagination']);
}
return $callsHistory['result'];
}
//Это как бы обертка-функция. Хочется, чтобы было видно какие нужно указать аргументы и какие-то сделать обязательными
//Фунукция для получения звонков по айди сотрудников
public static function getCallsHistoryByUsersID(array $usersID, $callDuration=0, $dateStart=0, $dateEnd=0, $sort='')
{
//Вот тут я формирую массив для фильтрации запроса
$filterData = [
'usersID' => $usersID,
'callDuration' => $callDuration,
'dateStart' => $dateStart,
'dateEnd' => $dateEnd,
'sort' => $sort
];
//Вызываю общую функцию
return self::getCallsHistorySource($filterData);
}
//Тут тоже обертка-функция, но уже получаю все звонки по всем пользователям и с другой сортировкой
public static function getCallsHistory($callDuration=0, $dateStart=0, $dateEnd=0, $sort='')
{
//Опять формирую массив фильтров
$filterData = [
'callDuration' => $callDuration,
'dateStart' => $dateStart,
'dateEnd' => $dateEnd,
'sort' => $sort
];
//Вызываю общую функцию
return self::getCallsHistorySource($filterData);
}
}
И дополнительный вопрос. Это нормально использовать такие функции обертки, чтобы сформировать разный прозрачный набор аргументов? А это ведь по сути можно просто в одну функцию передавать массив с разными фильтрами
Заранее благодарю за любые советы и критику