Управление бюджетами и контрактами в GLPI

Пошаговое руководство по контрактам, бюджетам, поставщикам и амортизации в GLPI: как вести учёт, как добиться, чтобы оповещения об окончании срока действительно срабатывали (cron + glpi_alerts), как диагностировать истекающие контракты через SQL и выбрать правильный метод амортизации.

В этой статьеРазделов: 8

Управлять ИТ без финансового контроля — всё равно что плыть без компаса. В GLPI есть встроенные модули для контрактов, бюджетов, поставщиков и амортизации, интегрированные с активами и заявками. Но на практике ломается не ввод данных, а то, чтобы оповещения срабатывали, а цифры сходились.

Контракты: что регистрировать (и чего обычно не хватает)

В Управление > Контракты каждый контракт должен содержать:

  • Идентификацию: номер, тип (поддержка, обслуживание, аренда, лицензия) и привязанного поставщика.
  • Срок действия: дату начала и длительность в месяцах. GLPI не хранит дату окончания; она вычисляется из даты начала плюс длительность.
  • Предупреждение (notice): в месяцах. Это то, насколько заранее должно прийти оповещение о продлении.
  • Продление: никогда, автоматическое или явное.
  • Затраты: на вкладке затрат, с периодичностью (ежемесячно, ежегодно), чтобы расход сходился с бюджетом.
  • Охватываемые активы: привяжите компьютеры, серверы и прочие элементы, чтобы знать, что останется без покрытия по окончании срока.

Классическая ловушка: зарегистрировать контракт с длительностью 0 (бессрочный). Без длительности нельзя вычислить дату окончания, и оповещение об окончании срока просто никогда не срабатывает.

Как добиться, чтобы оповещения действительно срабатывали

Одновременно должны быть включены три уровня, иначе не уйдёт ни одно письмо:

  1. Глобальные уведомления включены в Настройки > Уведомления, с настроенным реальным получателем.
  2. Оповещение включено в самом контракте (окончание контракта и/или предупреждение). Значение по умолчанию берётся из ключа default_contract_alert.
  3. Автоматическое действие выполняется. Задача contract отправляет письма, только если cron GLPI действительно вызывается.

В средах клиентов неисправность номер один — остановленный cron. Убедитесь, что GLPI запускается операционной системой, а не только тогда, когда кто-то заходит в интерфейс:

# /etc/cron.d/glpi - dispara as ações automáticas do GLPI a cada minuto
* * * * * www-data /usr/bin/php /var/www/html/glpi/front/cron.php >/dev/null 2>&1

Затем в Настройки > Автоматические действия откройте задачу contract и проверьте: режим CLI/внешний, частоту (по умолчанию ежедневно) и дату последнего запуска. Если режим установлен как «GLPI» (внутренний), задача зависит от того, что кто-то работает в системе в нужное время, а это ненадёжно.

Настроенное оповещение, которое не отправляется повторно

Это деталь, которая проявляется только в сопровождении: GLPI записывает в glpi_alerts каждое уже отправленное уведомление, чтобы не дублировать его. Если письмо не ушло (неверный SMTP, переполненный ящик), а запись создана, GLPI считает, что «уже уведомил», и не отправляет повторно, даже после того как вы исправите SMTP. Чтобы принудительно отправить оповещение по конкретному контракту, удалите отметку оповещения:

-- Descobrir o id do contrato pelo nome
SELECT id, name FROM glpi_contracts WHERE name LIKE '%Suporte Datacenter%';

-- Remover o marcador de alerta já enviado (ex.: contrato 42)
DELETE FROM glpi_alerts
WHERE itemtype = 'Contract' AND items_id = 42;

При следующем запуске cron задача contract заново оценит срок и отправит оповещение. То же касается гарантий, только с itemtype = 'Infocom'.

Быстрая диагностика: истекающие контракты

Прежде чем доверять панели, прямой SELECT в базе подтвердит, что действительно истекает в ближайшие 90 дней, с поставщиком и оставшимися днями:

SELECT c.id,
       c.name                                            AS contrato,
       s.name                                            AS fornecedor,
       c.begin_date,
       DATE_ADD(c.begin_date, INTERVAL c.duration MONTH) AS fim,
       DATEDIFF(DATE_ADD(c.begin_date, INTERVAL c.duration MONTH),
                CURDATE())                               AS dias_restantes
FROM glpi_contracts c
LEFT JOIN glpi_contracts_suppliers cs ON cs.contracts_id = c.id
LEFT JOIN glpi_suppliers s            ON s.id = cs.suppliers_id
WHERE c.is_deleted  = 0
  AND c.is_template = 0
  AND c.duration    > 0
  AND DATE_ADD(c.begin_date, INTERVAL c.duration MONTH)
      BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 90 DAY)
ORDER BY fim ASC;

Запускайте как запрос только на чтение. Это тот же расчёт, что выполняет интерфейс; полезно для проверки перед массовым продлением.

Бюджеты, связанные с контрактами и закупками

В Управление > Бюджеты задайте сумму, период (год, полугодие или проект) и тип. Момент, который многие упускают: бюджет в GLPI — это ориентир для отслеживания, а не блокировка. Он не мешает проводить расходы сверх лимита; он показывает план против факта, когда вы привязываете к этому бюджету затраты по контрактам и финансовую информацию активов (Infocom). Без этой привязки расход остаётся нулевым, и отчёт вводит в заблуждение.

Амортизация активов

У каждого актива есть вкладка Управление (Infocom) со стоимостью покупки, датой приобретения, гарантией и амортизацией. GLPI автоматически вычисляет балансовую стоимость по типу и сроку. Правильный выбор метода позволяет избежать искажений в TCO:

СценарийТип (sink_type)Типичный срок (лет)Примечание
Ноутбуки и настольные ПКЛинейная4–5Постоянная потеря; легко проверять.
Серверы и СХДЛинейная5–7Отслеживайте вместе с расширенной гарантией.
Оборудование с ускоренной потерей в началеДегрессивная3–5Требует согласованного коэффициента (sink_coeff).
Лицензия или актив без существенной остаточной стоимостиЛинейная1–3Согласуйте срок со сроком действия контракта.

Задайте значения по умолчанию в Настройки > Общие > вкладка Активы, чтобы не заполнять каждый элемент отдельно. Типичная ошибка здесь — оставить пустой дату ввода в эксплуатацию: без неё GLPI не знает, с какого момента начислять амортизацию, и балансовая стоимость навсегда остаётся равной стоимости покупки.

Отчёты и стоимость обслуживания

  • Активы по стоимости: сколько вложено по местоположениям или организациям.
  • Истекающие контракты: тот же список, что в SELECT выше, теперь на панели.
  • Амортизация: балансовая стоимость парка во времени.
  • Стоимость обслуживания: сумма контракта, делённая на число заявок, обработанных этим поставщиком, — отличное обоснование для пересмотра условий.

Чек-лист сопровождения NexTool

При сопровождении сред клиентов, прежде чем доверять финансовому учёту в GLPI, мы всегда проверяем одну и ту же последовательность: cron вызывает front/cron.php через операционную систему (а не через браузер); задача contract во внешнем режиме с недавним последним запуском; глобальные уведомления активны, а в оповещении указан реальный получатель; у контрактов нет ошибочной duration = 0; и проверка glpi_alerts, когда клиент говорит, что «перестали приходить письма». Девять из десяти случаев «GLPI не предупреждает об окончании срока» сводятся к одному из этих пяти пунктов, а не к ошибке продукта.

Нужно, чтобы контракты, бюджеты и оповещения GLPI работали от начала до конца? NexTool внедряет и сопровождает эти процессы в средах B2B-клиентов: узнайте о сопровождении NexTool.


Проверено командой NexTool Solutions.

Часто задаваемые вопросы

Почти всегда причина одна из трёх: отключены глобальные уведомления, оповещение не включено в самом контракте или автоматическое действие «contract» не выполняется, потому что системный cron (front/cron.php) не запланирован. Проверьте все три, прежде чем подозревать ошибку.

Нигде. Дата окончания вычисляется из begin_date плюс duration (в месяцах). Поэтому контракт с длительностью 0 (бессрочный) никогда не создаёт оповещение об окончании срока.

GLPI записывает каждое отправленное оповещение в glpi_alerts, чтобы не дублировать его. Удалите соответствующую строку (itemtype, равный 'Contract' или 'Infocom', и items_id объекта), и при следующем запуске cron оповещение будет переоценено и отправлено снова.

Линейная распределяет потерю стоимости равными частями на весь срок (sink_time). Дегрессивная концентрирует потерю в начале, используя коэффициент (sink_coeff). Для стандартного ИТ-парка линейную проще проверять.

Нет. Бюджет — это ориентир для отслеживания (план против факта), а не механизм блокировки. Расход появляется только тогда, когда вы привязываете к бюджету затраты по контрактам и финансовую информацию активов.

Нужна помощь?