Skip to content

About

Manage SLAs in Redmine!

Resources

Code of conduct

Contributing

Security policy

Stars

16 stars

Watchers

5 watching

Forks

Redmine SLA

Redmine Version Ruby Rails PostgreSQL MySQL MariaDB License

Redmine SLA - Issue Patch


Overview

Current version: 3.3.4. See the changelog for release details.


Digest

redmine_sla provides advanced Service Level Agreement management for Redmine.

It enables precise SLA computation based on:

  • Project trackers
  • Working calendars (HO / HNO)
  • SLA levels and priorities
  • Response and resolution terms
  • Database-native time-based procedures

SLA compliance is calculated directly at the database level using PostgreSQL or MySQL/MariaDB stored procedures, ensuring:

  • Deterministic computation
  • Accurate working-hours handling
  • High performance on large datasets

Why redmine_sla?

Many SLA implementations rely exclusively on Ruby time computations.

This plugin delegates SLA calculation to database stored procedures, allowing:

  • Accurate handling of working schedules
  • Holiday-aware deadlines
  • Efficient computation on large issue volumes
  • Predictable and reproducible results

The engine is designed for production environments.


Core Concepts

SLA
 ├── SLA Level
 │     └── SLA Terms (Response / Resolution)
 ├── SLA Calendar
 │     ├── Weekly Schedule
 │     └── Holidays
 └── SLA Status Mapping

An SLA is the top-level contract (e.g. "Gold Support", "Standard Support"). It is assigned to one or more project / tracker pairs, so the same SLA definition can be reused across several projects.

An SLA is broken down into one or more SLA Levels. Each level pairs the SLA with a single SLA Calendar and groups the actual SLA Terms: for every combination of SLA Type (e.g. Response, Resolution) and priority — either a native Redmine issue priority or a custom field value — a term defines the committed duration, in minutes.

An SLA Calendar describes when the clock actually runs:

  • Weekly Schedule: working hours per day of week (HO / HNO), used to suspend or resume the countdown outside business hours.
  • Holidays: non-working days shared across calendars. The match flag decides whether time is simply suspended on that day, or whether an SLA already running is allowed to continue through it.

SLA Status Mapping links each SLA Type to the Redmine issue statuses it should track — for instance "Response" usually maps to the "New" status only, while "Resolution" maps to every status prior to closure ("New", "Assigned", "Feedback", ...). This mapping tells the database procedures which time ranges to accumulate for each type of commitment, independently of any particular SLA, and is what the diagram's "SLA Status Mapping" branch and "SLA Calendar" branch stand for: both are reusable building blocks referenced by SLA Levels/Types rather than data private to a single SLA.

At runtime, the calculation engine combines Terms + Calendar + Status Mapping to compute compliance for every issue in scope — see SLA Compute Explanation for the underlying algorithm.


Features

Core Engine

  • PostgreSQL PL/pgSQL or MySQL/MariaDB SLA computation
  • Working calendar awareness (HO / HNO)
  • Response & resolution deadlines
  • SLA compliance percentage
  • Configurable update step
  • Configurable calculation time zone

Administration (Global Level)

Fully manageable through UI and REST API:

  • SLAs
  • SLA Types
  • SLA Statuses
  • SLA Holidays (with public holiday import)
  • SLA Calendars
  • Weekly schedules
  • Calendar-specific holidays
  • SLA Levels
  • SLA Terms

Project Integration

  • SLA assignment per tracker
  • Role-based permissions
  • SLA visibility control
  • SLA columns in issue list
  • SLA column and filter in the project lists (user and administration)
  • SLA filtering
  • SLA summary in issue view
  • Responsive display

Time Logs

  • SLA filtering
  • SLA columns in time log list

Automation

  • Manual SLA update task
  • Cron-based update support
  • CSV-based fixture builder

Localisations

  • English
  • French

Roadmap (Non-Prioritized)

UX Improvements

  • Graphical schedule editor
  • Tabular SLA term editor
  • Improved calendar visualization

Functional Extensions

  • Per-project time zone
  • Alert thresholds & notifications
  • SLA import (CSV export already available)
  • SLA summary in issue reports

Technical Improvements

  • Cache invalidation strategy
  • Full functional test coverage

Installation

Prerequisites

Name requirement
Redmine >= 5.0
Ruby >= 2.7
Rails >= 6.1
Database PostgreSQL >= 11, MySQL >= 8.0 or MariaDB >= 10.2

Version 3.3.3 has been checked on Redmine 5.1.13, 6.1.4 and 7.0.1, with unit, functional, API and Chromium tests on PostgreSQL, MariaDB and strict MySQL. See the compatibility matrix for exact runtime versions and results.


⚠ Database Requirement

This plugin relies on database-native views and stored procedures, and therefore requires the SQL schema format. In config/application.rb:

config.active_record.schema_format = :sql

This is mandatory for every supported database.

SQLite is not supported.


Database Configuration

PostgreSQL

Ensure PostgreSQL datestyle is set to ISO:

ALTER DATABASE "redmine_db" SET datestyle="ISO,MDY";

Recommended configuration:

config.active_record.default_timezone = :local

Prefer global timezone configuration set to:

Etc/UTC

MySQL / MariaDB

Before migrating the plugin:

  • Load the server time-zone tables, which are required by SLA timestamp conversions:

    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
  • If binary logging is enabled, allow the migration to create stored functions:

    SET GLOBAL log_bin_trust_function_creators = 1;

    The setting can be made persistent with log_bin_trust_function_creators = 1 under [mysqld].

Use Etc/UTC as the server-wide time zone where possible.


Install

  1. Copy redmine_sla into Redmine's plugins directory\
  2. Run:
bundle install
  1. Migrate:
rake redmine:plugins:migrate NAME=redmine_sla
  1. Restart application server

Plugin is ready to use.


Upgrade to 3.3.4

Version 3.3.4 appends the year to imported holiday names and offers English or the country's local names (French for France). Local names are selected by default and require access to date.nager.at through the legacy Nager.Date v3 API. Existing holidays keep their names. Update the plugin files and restart Redmine; no new migration relative to 3.3.3. See Public holiday import.

Upgrade to 3.3.3

Version 3.3.3 shows the SLA block of the issue page only for trackers with an SLA in the project. Update the plugin files and restart Redmine; there is no migration relative to 3.3.2.

Previous upgrade: 3.3.2

Version 3.3.2 only extends the test fixtures. Update the plugin files; there is no migration and no functional change relative to 3.3.1.

Previous upgrade: 3.3.1

Version 3.3.1 documents the SLA roles and permissions in the plugin settings. Update the plugin files; there is no migration and no functional change relative to 3.3.0.

Previous upgrade: 3.3.0

Version 3.3.0 imports public holidays from Nager.Date: from the SLA holiday list, administrators choose a year, a country and the name language, preview the holidays and import the selected dates. An optional default country can be set in the plugin settings. See Public holiday import. Update the plugin files and restart Redmine; this release introduces no new migration relative to 3.2.0. The Redmine server needs outbound HTTPS access to nagerholidays.com (and date.nager.at for local names) to use the import.

Previous upgrade: 3.2.0

Version 3.2.0 adds an SLA column and filter to the project lists (Projects in list mode and Administration > Projects) and an SLA icon in the project board view. Administrators see every project; other users only see the SLAs of projects where they have View SLA or Manage SLA. See Projects with SLA. Update the plugin files and restart Redmine; this release introduces no new migration relative to 3.1.5.

Previous upgrade: 3.1.5

Version 3.1.5 invalidates the SLA caches of levels using an issue custom field when that field or one of its enumeration values changes. Update the plugin files and restart Redmine; this release introduces no new migration relative to 3.1.4.

Previous upgrade: 3.1.4

Version 3.1.4 invalidates the SLA caches of competing levels in the same SLA when calendars, schedules or holiday rules change, including level creation and changes of SLA or calendar assignment. Calendar-holiday links are removed with their calendar or holiday. Update the plugin files and restart Redmine; this release introduces no new migration relative to 3.1.3. Calendar name/description and holiday name edits preserve caches. Calendar and holiday destruction invalidate once, covering their dependent records.

Previous upgrade: 3.1.3

Version 3.1.3 keeps counting SLA spent time once a closed issue is reopened. Redmine keeps the last closing date on reopening, and the calculation stopped there; it now uses it only while the issue is closed. Back up the database, update the plugin files, then run:

bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=production

Restart Redmine after migration (202111112021024). The spent-time cache of issues already reopened is purged and recalculated on demand, or at once with update_sla.

Previous upgrade: 3.1.2

Version 3.1.2 removes SQL functions nothing calls anymore: sla_get_level_overlap and, on PostgreSQL, sla_explain_level and sla_explain_spent. The "Explain" view uses the Ruby explanation service on every database. Back up the database, update the plugin files, then run:

bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=production

Restart Redmine after migration (202111112021023).

Previous upgrade: 3.1.1

Version 3.1.1 stops SLA calculation on projects whose SLA module is disabled: their SLA cache is purged and no longer rebuilt, while their project-tracker configuration is kept for a later re-enabling. The update_sla task now processes all projects, applies its scope option and gains a projects=[all,with_sla,without_sla] option.

Back up the database, update the plugin files, then run:

bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=production

Migration 202111112021021 makes the sla_get_level SQL function check the project's SLA module. Restart Redmine after migration, then run update_sla once to purge the cache left on projects without the SLA module.

Previous upgrade: 3.1.0

Version 3.1.0 adds optional wiki descriptions to SLAs, SLA types, calendars and levels, and fixes HTTP 500 errors in list block columns. Descriptions appear on detail pages and as plain-text name tooltips (up to 250 characters). The API reads and writes the original wiki text.

Back up the database, update the plugin files, then run:

bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=production

Restart Redmine after migration. Existing records retain their data and receive a nullable description. Rolling back the migration deletes description data; restore the previous plugin files as part of a downgrade.

Previous upgrade: 3.0.6

Update the plugin files and restart Redmine. This release introduces no new schema migration relative to 3.0.5. It fixes stale issue SLA values and native query filters, sorting and grouping, including time entries without an issue. See the validation results.

Previous upgrade: 3.0.5

Update the plugin files and restart Redmine. This release introduces no new schema migration relative to 3.0.4; when upgrading from an older version, run the plugin migration command from the installation instructions as usual.

This release enforces project-scoped manage_sla permission when creating or moving project-tracker assignments and fixes compatibility with Redmine 5.1 and 7.0. No new permission is introduced. See the compatibility matrix for the exact versions tested. Custom Ruby integrations that relied on implicit model joins should follow the query scope guide.


Uninstall

rake redmine:plugins:migrate NAME=redmine_sla VERSION=0

Then remove the plugin folder:

rm -r redmine_sla

Restart application server.


Documentation


Credits

Icons created by Magnific on Flaticon. See the image credits.

About

Manage SLAs in Redmine!

Resources

Code of conduct

Contributing

Security policy

Stars

16 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages