Zimbra: двойная бронь переговорной и отказ повтора
АйТи Фреш
Прочее

Zimbra позволяет забронировать занятую переговорную: настраиваем отказы для повторяющихся встреч

Автор: , директор ООО «АйТи-Фреш» · · ~12 мин чтения
Переговорная в Zimbra одновременно подтвердила две встречи на одно и то же время из-за политики автоматического принятия всех заявок
Двойная бронь — это не сбой календаря, а выбранная политика ресурса, которая принимает всё подряд без проверки занятости.

Если два сотрудника видят в своих календарях подтверждённую бронь одной и той же переговорной на одно время, причина почти всегда в политике планирования ресурса, а не в самом календаре. Разбираю, чем Location отличается от Equipment, какие пять политик принятия заявок есть у ресурса и как ограничить конфликты повторяющихся встреч.

Location и Equipment — разные типы ресурсов с разной логикой

В Zimbra переговорная и, например, проектор — это два формально разных типа ресурса: Location и Equipment. Технически оба создаются как отдельная учётная запись календарного ресурса (тип хранится в обязательном атрибуте zimbraCalResType со значениями Location или Equipment), но семантически Location описывает место, а Equipment — оборудование, которое можно взять с собой или использовать одновременно с несколькими бронированиями в разных сценариях. Когда я настраиваю переговорные для клиента как часть корпоративной почты на Zimbra, ресурс переговорной всегда создаю как Location — именно этот тип по умолчанию корректно обрабатывается клиентами при поиске свободного места на встречу.

У каждого ресурса есть собственная политика планирования, которая определяет, что происходит при получении приглашения: ресурс либо принимает всё подряд, либо сверяется с занятостью, либо ждёт ручного решения. Эта политика настраивается один раз при создании ресурса или позже через консоль администратора и от неё зависит абсолютно всё дальнейшее поведение — включая то, может ли переговорная вообще оказаться забронированной дважды.

Отдельная деталь, которую часто упускают: политика ресурса не имеет отношения к тому, что видит в своём календаре организатор встречи. Организатор создаёт приглашение, ресурс на него отвечает — и то, что происходит после этого ответа с точки зрения интерфейса пользователя, зависит от версии клиента и от того, как обрабатывается сам ответ, а не от факта его отправки.

Пять политик принятия заявок и где там дыра для двойной брони

Admin Guide перечисляет пять политик планирования ресурса, и я разбираю их так, как объясняю клиентам на внедрении. Auto accept always — ресурс принимает абсолютно все приглашения без проверки занятости, то есть может подтвердить сколько угодно встреч на одно и то же время: документация прямо предупреждает, что free/busy в этом режиме не ведётся и на ресурс может встать больше одной встречи одновременно. Это самый простой режим и прямая причина двойной брони, если администратор выбрал его для переговорной ради простоты настройки.

Auto accept if available, auto-decline on conflict — ресурс сверяется с собственным расписанием: если время свободно, приглашение принимается автоматически; если конфликтует с уже принятой встречей, отклоняется автоматически. Manual accept, auto decline on conflict — конфликты отклоняются автоматически, а заявки на свободное время помечаются в календаре ресурса как tentative (под вопросом) и ждут ручного подтверждения того, кому пересылаются приглашения. Auto decline all recurring appointments — для ресурса, который можно занять только разовой встречей: любые повторяющиеся приглашения он отклоняет. No auto accept or decline — ресурсом управляют вручную полностью, заходя в его собственный почтовый ящик.

Дыра для двойной брони закрывается выбором любой политики, кроме Auto accept always: как только ресурс начинает реально сверяться с занятостью, а не штампует «принято» на автомате, повторное бронирование того же времени получает отказ, а не тихое согласие. Важная деталь из схемы атрибутов: по умолчанию zimbraCalResAutoAcceptDecline и zimbraCalResAutoDeclineIfBusy равны TRUE — то есть «из коробки» ресурс работает как Auto accept if available. Если переговорная принимает всё подряд, значит, кто-то когда-то явно выбрал Auto accept always или выключил отказ при занятости — чаще всего «чтобы бронь проходила без задержек» или при массовом переносе ресурсов со старого сервера.

Как ограничить конфликты для повторяющихся встреч

С разовой встречей политика Auto accept if available работает предсказуемо: либо время свободно, либо нет. С повторяющейся серией — «планёрка каждый понедельник в 10:00» — сложнее: часть дат из серии может конфликтовать с уже занятым временем, а часть быть полностью свободной. Здесь в игру вступают два атрибута ресурса, которые определяют порог терпимости к таким конфликтам внутри одной повторяющейся серии.

zmprov mcr peregovornaya-1@example.com zimbraCalResMaxNumConflictsAllowed 0
zmprov mcr peregovornaya-1@example.com zimbraCalResMaxPercentConflictsAllowed 0

zimbraCalResMaxNumConflictsAllowed задаёт максимально допустимое число конфликтующих дат в серии, а zimbraCalResMaxPercentConflictsAllowed — максимальную долю конфликтующих дат в процентах. По схеме атрибутов у обоих значение по умолчанию — 0, что означает отказ на всю серию при любом конфликте хотя бы одной даты. Это жёсткий, но предсказуемый режим для переговорной, где двойная бронь недопустима в принципе, — и явная команда выше нужна скорее для того, чтобы вернуть его после чьих-то экспериментов. Если бизнесу нужна гибкость — например, разрешить серии пройти, даже если один день из двенадцати занят, — значения задают выше нуля: ресурс принимает серию, пока число конфликтов не достигнет максимума или их доля не превысит заданный процент.

Этот момент стоит проговаривать с заказчиком до внедрения. Admin Guide называет такой режим частичным принятием серии и ставит условие: чтобы оно работало, оба поля должны быть ненулевыми. Тогда ресурс принимает повторяющуюся встречу, а конфликтующие даты в неё не попадают — организатору нужно смотреть, на какие именно дни переговорная не подтвердилась. Если хотя бы одно из полей равно 0, серия с конфликтом отклоняется целиком. Для переговорной с высокой загрузкой я чаще оставляю 0: предсказуемость важнее гибкости, а сотрудник, получивший отказ, просто выбирает другое время.

Почему отклонённая ресурсом встреча остаётся в календаре организатора

Отдельная и, пожалуй, самая обманчивая часть проблемы: сотрудники доверяют собственному календарю и не всегда проверяют, что ответил ресурс. Если организатор видит встречу в своём календаре, он считает бронь состоявшейся — но появление события в личном календаре организатора происходит в момент создания приглашения, а не в момент подтверждения ресурсом. Ответ ресурса — отдельное письмо и отдельное обновление статуса участника «переговорная», за которым нужно следить осознанно, особенно при работе через старые версии клиента или мобильные приложения, синхронизирующие календарь с задержкой.

На форумах администраторов Zimbra описан именно такой сценарий double booking: ресурс отклоняет заявку на конфликтующее время, но встреча в календаре организатора остаётся видна как запланированная, если пользователь не открыл её заново и не увидел статус ресурса как declined. Для повторяющейся серии эффект усиливается: если ресурс отклонил всю серию целиком из-за конфликта в одной дате, а организатор не заметил письмо об отказе, в его личном календаре может провисеть регулярная встреча, которую переговорная фактически никогда не подтверждала.

Практический вывод для администратора: обучать пользователей смотреть на статус ресурса в приглашении, а не только на факт появления события в своём календаре, — не менее важная часть внедрения, чем сама настройка политики. Я обычно добавляю в шаблон приглашения на встречу явную инструкцию проверить, что переговорная ответила Accepted, а не просто создать событие и закрыть окно. Этот пункт я добавил и в IT-чек-лист онбординга: новый сотрудник в первый же день узнаёт, как бронировать переговорную и где смотреть ответ ресурса.

Дерево решений: событие в личном календаре появляется сразу при создании приглашения независимо от реального ответа ресурса
Появление события в своём календаре не значит, что переговорная его подтвердила — нужен статус ресурса, а не факт записи.

Как посмотреть и сменить политику уже существующей переговорной

Пересоздавать ресурс, чтобы сменить политику, не нужно — атрибуты меняются на уже действующей учётной записи ресурса командой zmprov modifyCalendarResource (mcr). Перед изменением полезно посмотреть, что реально настроено сейчас, а не полагаться на память или на то, что записано в старой документации внедрения, которая могла устареть после очередного администратора. Если консоль администратора при этом открывается через раз, сначала разберитесь с ней — например, с ошибкой 502 на всей веб-почте Zimbra, — а атрибуты ресурса надёжнее менять из CLI.

zmprov gcr peregovornaya-1@example.com zimbraCalResType zimbraCalResAutoAcceptDecline zimbraCalResAutoDeclineIfBusy zimbraCalResAutoDeclineRecurring zimbraCalResMaxNumConflictsAllowed zimbraCalResMaxPercentConflictsAllowed

Политика в консоли — это комбинация трёх булевых атрибутов. Auto accept if available: zimbraCalResAutoAcceptDecline TRUE и zimbraCalResAutoDeclineIfBusy TRUE. Auto accept always: первый TRUE, второй FALSE. Manual accept, auto decline on conflict: первый FALSE, второй TRUE. No auto accept or decline: оба FALSE. Отдельно zimbraCalResAutoDeclineRecurring TRUE отклоняет любые повторяющиеся встречи. Поэтому переключить переговорную на «принимать только свободное время» — это zmprov mcr peregovornaya-1@example.com zimbraCalResAutoAcceptDecline TRUE zimbraCalResAutoDeclineIfBusy TRUE. Если gcr какой-то атрибут не вывел, у ресурса действует значение по умолчанию. Изменение применяется для новых входящих приглашений, но не задним числом: если переговорная успела подтвердить конфликтующие брони до смены политики, их придётся разбирать и отменять вручную.

Отдельно стоит проверить адрес пересылки приглашений в настройках ресурса (атрибут zimbraPrefCalendarForwardInvitesTo) — Admin Guide прямо советует задать его при политике Manual accept, чтобы копия заявки уходила тому, кто может принять её вручную. Если адрес в этом поле устарел (например, сотрудник, отвечавший за переговорную, уволился), заявки на бронирование будут накапливаться без ответа, и переговорная фактически перестанет работать для новых встреч, хотя формально политика настроена правильно.

Кейс: автосервис «МоторСервис», 10 рабочих мест

Условный клиент — автосервис «МоторСервис», 10 рабочих мест: приёмка, два поста ремонта, отдел запчастей и небольшой административный блок. В компании одна переговорная, которую использовали для встреч с поставщиками и для еженедельной планёрки мастеров по понедельникам. Ресурс переговорной создали при первоначальной настройке почты несколько лет назад, и тогдашний подрядчик выбрал в мастере Auto accept always — «чтобы бронь проходила без задержек». zmprov gcr это подтвердил: zimbraCalResAutoDeclineIfBusy стоял в FALSE, хотя по умолчанию он TRUE.

Проблема вскрылась, когда владелец сервиса и представитель поставщика запчастей одновременно забронировали переговорную на одно и то же время в четверг: оба получили в своих календарях подтверждённую встречу, оба пришли, и выяснилось это только на месте. Отдельно страдала регулярная планёрка мастеров по понедельникам: раз в несколько недель кто-то из административного блока бронировал переговорную на то же утро под встречу с клиентом, и обе встречи формально оказывались приняты рядом.

Перенастроили политику переговорной на Auto accept if available, auto-decline on conflict — разовые встречи с этого момента либо подтверждались автоматически при свободном времени, либо сразу отклонялись при конфликте, без двойных подтверждений. Лимиты конфликтов для серий у ресурса заданы не были, то есть действовало значение по умолчанию 0; мы всё равно прописали оба атрибута явно, чтобы следующий администратор видел их в выводе gcr. Любой конфликт хотя бы одного понедельника из серии теперь теперь отклоняет новую серию целиком, а разовая встреча на время планёрки получает автоотказ — административный блок сразу видит письмо об отказе вместо того, чтобы случайно перекрыть планёрку одной точечной встречей.

Отдельно провели короткий инструктаж для сотрудников, которые чаще всего бронируют переговорную: показали, как выглядит статус Accepted и Declined у ресурса в приглашении, и попросили не считать бронь состоявшейся до этого статуса. За два месяца после изменений двойных броней не повторилось ни разу, а планёрка по понедельникам ни разу не оказалась случайно перекрыта другой встречей.

Отдельно стоит сказать, чего в этом кейсе не делали. Не стали заводить вторую переговорную ради разделения нагрузки — при десяти рабочих местах и умеренной загрузке помещения это было бы избыточным расходом, а сама по себе двойная переговорная не решает проблему автоматического принятия конфликтующих заявок, если политика ресурса остаётся неверной. Не стали и жёстко закрывать ручное согласование на владельца сервиса — с политикой Auto accept if available основную массу простых бронирований ресурс обрабатывает сам, а человек нужен только там, где действительно возникает конфликт.

Было и стало после смены политики ресурса переговорной в Zimbra автосервиса «МоторСервис»
Смена политики ресурса и лимит конфликтов для серии — два отдельных, но одинаково нужных изменения.

Частые вопросы

Почему переговорная в Zimbra подтверждает две встречи на одно и то же время?

Скорее всего, у ресурса выбрана политика Auto accept always (zimbraCalResAutoDeclineIfBusy = FALSE) — она принимает любое приглашение без проверки занятости. Двойная бронь пропадает при переключении на Auto accept if available, auto-decline on conflict, которая, кстати, является значением по умолчанию.

Чем Location отличается от Equipment при создании ресурса переговорной?

Это два разных типа календарного ресурса в Zimbra: Location описывает место, Equipment — оборудование. Для переговорной корректный тип — Location, он ожидаемо обрабатывается клиентами при поиске свободного времени и места.

Как ограничить, сколько дат повторяющейся встречи может конфликтовать с занятостью переговорной?

Атрибутами ресурса zimbraCalResMaxNumConflictsAllowed (число дат) и zimbraCalResMaxPercentConflictsAllowed (доля дат в процентах). По умолчанию оба равны 0 — отказ всей серии при первом же конфликте.

Ресурс может принять часть дат повторяющейся серии и отклонить остальные?

Да, но только если оба атрибута — zimbraCalResMaxNumConflictsAllowed и zimbraCalResMaxPercentConflictsAllowed — ненулевые. Тогда ресурс принимает серию, пока конфликтов меньше лимитов, а конфликтующие даты не подтверждаются. При значении 0 хотя бы у одного атрибута серия с конфликтом отклоняется целиком.

Почему встреча выглядит подтверждённой в моём календаре, хотя ресурс её отклонил?

Событие появляется в личном календаре организатора в момент создания приглашения, а не после ответа ресурса. Нужно отдельно проверить статус переговорной в самом приглашении — Accepted или Declined, а не полагаться только на факт появления события в календаре.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи