Мигратор из Asana в Битрикс24: перенос данных из архива Asana
О заказчике
Заказчиком этой интеграции стала крупная финтех-компания, назвать которую мы не можем из-за NDA. Компания больше 10 лет работает на российском рынке.
Задача проекта
У заказчика достаточно большой штат сотрудников, и для управления всеми командами и подразделениями долгое время использовался сервис Asana. Однако возникла необходимость перенести все данные в Битрикс24, чтобы затем продолжить работу с задачами и проектами здесь.
В Маркете Битрикс24 есть штатный мигратор из Asana в Битрикс24, но он не смог решить все задачи заказчика, так что потребовались доработки. По сути нашей задачей была разработка мигратора из Asana в Битрикс24 на основе решения из Маркета.
Если говорить более детально, то требовалось организовать корректный перенос всех задач из архива, выгруженного из Asana в Битрикс24. При этом в задачах должны были сохраниться все комментарии разного уровня вложенности со всеми приложенными файлами, а также привязки задач к проектам и их связи между собой.
Реализация
Основные трудности при разработке мигратора были вызваны, как это часто бывает, политикой безопасности. Все разработки должны были вестись на сервере заказчика, так что для решения задачи мы выбрали скрипты на вебхуках с использованием собственной клиентской базы данных mysql.
Но еще большей сложностью оказалось отсутствие технической документации по структуре архива в Asana. Пришлось разбираться в нем самостоятельно, изучая все от и до. Особенно интересно было видеть, как со временем менялся подход к разработке Asana. Например, если для самых первых появившихся в ней кастомных полей задач разные типы были размещены в архивах с однотипными именами и структурами, то появившиеся позже типы были размещены совершенно по другому принципу, который оказался неожиданным.
Однажды пришлось запускать поиск одного единственного идентификатора в тексте по всему архиву, чтобы сопоставить привязанное к задаче кастомное поле с директорией, в которой будет лежать соответствующий ей файл - заняло это около пяти часов, однако, после того, как искомая директория была идентифицирована, дальше дело пошло значительно быстрее.
Также в процессе работы возникла проблема с переносом задач, принадлежащих к разным проектам в Asana. Чтобы все корректно перенести в Битрикс24 и не потерять все связи между задачами и проектами, было решено использовать такой алгоритм: одну из задач делали "главной" и прикрепляли к первому по списку проекту, а к ней уже впоследствии привязывались все дочерние задачи, комментарии и файлы. А привязанные к остальным проектам задачи просто содержали текст вида "Это дубликат задачи N из проекта M, она доступна по ссылке L" и описание главной задачи.
К слову, многие процессы, например, экспорт задач, длились настолько долго, что для удобства приходилось добавлять в код индикаторы процесса. Так хотя бы раз в час можно было получать информацию о том, сколько еще дней нужно на перенос данных или другой процесс.
Вот пример кода такого индикатора:
// Получаем все имена файлов на обработку из директории.
$allTasks = scandir($tasksDir);
// Для индикации прогресса.
$fivePercent = (int)(count($allTasks) / 20);
$counter = 0;
$indicator = 5;
foreach ($allTasks as $json) {
// Проверка прогресса.
$counter += 1;
if ($counter == $fivePercent) {
echo 'Done: ' . $indicator . "% at " . getCurrentTime() . "\n";
$indicator += 5;
$counter = 0;
}
...
Некоторые стадии приходилось запускать дважды. Связано это было с тем, что за условную неделю непрерывной работы скрипта целевой портал успевал пережить несколько обновлений, что приводило к неизбежным ошибкам. Приходилось откатывать записи с пометкой EXPORTED = E в изначальное состояние, вставлять в код очередные обработчики непредвиденных ситуаций и перезапускать стадию для этих записей персонально. В результате код стал значительно более отказоустойчив, чем в стандартном приложении из маркета.
Так же в процессе разработки были обнаружены некоторые критические недоработки REST API Битрикс24. Их довольно оперативно исправили, в результате чего, например, при некоторых специфических ситуациях вместо 500-х ошибок REST стал отдавать корректные и понятные описания этих ошибок.
В итоге, несмотря на все трудности, которые преследовали нас на протяжении всего проекта, мы выполнили задачу и разработали для заказчика мигратор из Asana в Битрикс24, закрывающий все потребности конкретной компании. По сути у нас получилось сразу два продукта: один осуществляет онлайн экспорт данных через API Asana, а второй импортирует данные из полученного от Asana архива в Битрикс24. Код этого мигратора еще можно улучшить, но уже сейчас он выполняет свои функции и помогает заказчику в работе.