# Зачем это все и с чего началось
Когда команда начала расти и появилось необходимость, чтобы об отпуске сотрудника знали все, а не только их руководитель, то мы начали вести календарь отпусков в виде wiki-документа в Confluence.
Просто несколько таблиц по кварталам с фамилиями сотрудников, датами начала и окончания отпуска и вероятностью отпуска. То есть заранее можно было сообщить в начале года всем, что ты собираешься в отпуске в конце декабря с вероятностью 50%.
Потом появился Team Calendar внутри Confluence, но он был воспомогательным средством т.к. не представлял наглядного отображения на одном экране всей картинки. На изменения в нем как-то сложнее было подписаться, чем на wiki-страницу. Хотя при всем этом по нему было удобнее видеть пересечения по отпускам, текущую картинку на сегодняшний день, а так же соединить несколько таких календарей в один.
Желание чтобы из календаря внутри Confluence все попадало прямо в телефон было давно. И свежие изменения в регламенте отпусков, которые сделали Team Calendar более приоритетным, а wiki-документ оставили только для "обратной совместимости", побудили меня воплотить это желание в реальность.
Team Calendar в Confluence отлично поддерживает экспорт в iCal.
Однако из-за того что по соображениям безопасности сервер живет в локальной сети, то никак связать его с внешним телефоном было нельзя.
# Подключаем на телефоне
Но во внутренней сети есть мой рабочий компьютер! Я могу экспортировать календарь на него и просто выгружать его на внешний сервис откуда его уже будет забирать iPhone.
Написал очень простой bat-файл:
call dropbox_set.bat
;wt team vacations
call wget https://wiki.********/rest/calendar-services/1.0/calendar/export/subcalendar/private/********.ics --no-check-certificate -O %DROPBOX_LOCATION%Wiki\Calendar\wt_team_vacations.ics
Который выгружает файл в нужный мне каталог в Dropbox. Через Dropbox получил публичную ссылку на этот файл:
https://www.dropbox.com/s/********/wt_team_vacations.ics?dl=1
Но вбивать ее в телефон долго и неприятно поэтому я сократил ее через bitly.com и полученную короткую ссылку уже без особого труда вбил руками в настройках телефона по первой подсказке из Google:
Осталось сделать так чтобы файл в Dropbox обновлялся. Оказывается у старого замечательного nnCron под Windows появилась вторая жизнь на github. Установил его и с помощью простого nnCron скрипта сделал запуск bat-файла каждый час:
Time: 0 * * * * *
Action:
SWHide NormalPriority
START-APP: D:\BAT\wikicalendar2dropbox.bat
Одна проблема. В телефоне в этом календаре события показываются как "Отпуск", а не имя и фамилия сотрудника.
Это легко исправляется небольшой заменой в тексте например таким вот некрасивым кодом, однако работающем в конкретной моей ситуации:
<?php
$content = file_get_contents( DIR . '/wt_team_vacations.ics');
// vdm: main replace
$content = preg_replace('/SUMMARY:([^\r\n]+)([\r\n]+.+?ATTENDEE;.+?;CN=)([^;]+)?/ums','SUMMARY:$1 $3$2$3', $content);
// vdm: new line cleanup
$content = preg_replace('/SUMMARY:(.+?)[\r\n]+\s(.+?[A-Z])/ums','SUMMARY:$1$2', $content);
file_put_contents( DIR . '/wt_team_vacations.ics', $content);
В результате календарь начинается выглядеть уже корректно:
За время дебагинга выяснилось, что Dropbox удаляет ссылку на расшаренный файл если сам файл был удален, даже если вместо него загружен новый с таким же именем. Но если файл был отредактирован, то ссылка остается.
Еще выяснилось что магию с php-скриптом пришлось делать из-за того что тип события в Team Calendar был выбран общим Event. Если создавать событие как Leave, то ничего этого не нужно и информация о том, чей это отпуск в SUMMARY в iCal добавляется автоматически.
И еще выяснилось, что хоть я и указывал в настройках телефона ссылку на iCal через bitly.com, телефон в итоге сохранил целевую ссылку на Dropbox. То есть идея отдебажить через просмотр количества переходов по ссылке обновляется календарь или нет не сработала. Пришлось убедиться в этом вручную просто добавив информацию о прошедшем отпуске.
Все работает отлично!!!
# Подключаем на компьютере
В какой-то момент времени основным рабочим компьютером стал Mac и календарь захотелось иметь не только в телефоне, а еще и на компьютере. Для этого пришлось удалить интеграцию на телефоне т.к. она была локальной и на компьютере настроить эту подписку на календарь как iCloud после чего она становится доступной для всех связанных аккаунтов, в том числе и на телефоне. Делается это очень просто по первой инструкции в интернете.
Теперь можно пользоваться любимым приложением календарем как на компьютере так и на телефоне и видеть там всю необходимую информацию.