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 0zimbraCalResMaxNumConflictsAllowed задаёт максимально допустимое число конфликтующих дат в серии, а 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 подтверждает две встречи на одно и то же время?
Скорее всего, у ресурса выбрана политика 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, а не полагаться только на факт появления события в календаре.
Источники
- Zimbra 10 Administrator Guide — Managing Resources / Set Up the Scheduling Policy — Типы Location и Equipment; пять политик (Auto decline all recurring, Auto accept if available, Manual accept с tentative, Auto accept always без free/busy, No auto accept); Conflict Rules и условие ненулевых значений для частичного принятия серии; адрес пересылки при ручном принятии. https://zimbra.github.io/adminguide/latest/index.html
- Zimbra на GitHub — zimbra-attrs.xml (zm-mailbox) — zimbraCalResType (Location, Equipment); zimbraCalResAutoAcceptDecline и zimbraCalResAutoDeclineIfBusy — по умолчанию TRUE; zimbraCalResAutoDeclineRecurring — FALSE; zimbraCalResMaxNumConflictsAllowed и zimbraCalResMaxPercentConflictsAllowed — по умолчанию 0 (отказ при любом конфликте). https://github.com/Zimbra/zm-mailbox/blob/develop/store/conf/attrs/zimbra-attrs.xml
- Zimbra Administrator Guide (исходники на GitHub) — provisioning.adoc — Раздел о ресурсах и политиках планирования в исходном тексте документации. https://github.com/Zimbra/adminguide/blob/develop/provisioning.adoc
- Zimbra Forums — How to restrict double booking of location resources — Сценарий двойной брони ресурса и то, что отклонённая ресурсом встреча может оставаться в календаре организатора. https://forums.zimbra.org/viewtopic.php?t=28603


