Quelltext des aktuellen Standes
-- Migration 231: Wiederkehrende Tickets
--
-- Regelmäßige Arbeiten – der monatliche Rückspiel-Test, die Quartalsprüfung –
-- entstehen bisher von Hand oder gar nicht. Eine Vorlage beschreibt das Ticket
-- und den Takt; der Scheduler legt es zum Termin an.
--
-- `next_run` ist der Tag, an dem das nächste Ticket entstehen soll. Nach jedem
-- Lauf rückt er um den Takt weiter – damit steht der Zustand in der Zeile
-- selbst und nicht in der Laufhistorie.
CREATE TABLE IF NOT EXISTS `ticket_recurrences` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR(500) NOT NULL COMMENT 'Betreff des entstehenden Tickets',
`description` TEXT NULL,
`category_id` INT UNSIGNED NULL,
`location_id` INT UNSIGNED NULL,
`assignee_id` BIGINT UNSIGNED NULL COMMENT 'Bearbeiter des entstehenden Tickets',
`priority` TINYINT UNSIGNED NOT NULL DEFAULT 2 COMMENT '1 kritisch, 2 normal, 3 niedrig',
`interval_unit` ENUM('daily','weekly','monthly','quarterly','yearly') NOT NULL DEFAULT 'monthly',
`interval_count` SMALLINT UNSIGNED NOT NULL DEFAULT 1 COMMENT 'jede N-te Einheit',
`next_run` DATE NOT NULL COMMENT 'Tag, an dem das nächste Ticket entsteht',
`due_days` SMALLINT UNSIGNED NULL COMMENT 'Fälligkeit des Tickets in Tagen nach seiner Entstehung',
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`last_run_at` DATETIME NULL,
`last_ticket_id` INT UNSIGNED NULL COMMENT 'zuletzt daraus entstandenes Ticket',
`created_by` BIGINT UNSIGNED NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_ticket_recurrences_due` (`is_active`, `next_run`),
INDEX `idx_ticket_recurrences_title` (`title`(100)),
CONSTRAINT `fk_trec_category` FOREIGN KEY (`category_id`) REFERENCES `ticket_categories`(`id`) ON DELETE SET NULL,
CONSTRAINT `fk_trec_location` FOREIGN KEY (`location_id`) REFERENCES `ticket_locations`(`id`) ON DELETE SET NULL,
CONSTRAINT `fk_trec_assignee` FOREIGN KEY (`assignee_id`) REFERENCES `users`(`id`) ON DELETE SET NULL,
CONSTRAINT `fk_trec_ticket` FOREIGN KEY (`last_ticket_id`) REFERENCES `tickets`(`id`) ON DELETE SET NULL,
CONSTRAINT `fk_trec_user` FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Der Scheduler-Task. Einmal täglich genügt: Der Takt der Vorlagen ist
-- tagesgenau, nicht stundengenau.
INSERT IGNORE INTO `cron_tasks`
(`name`, `label`, `description`, `handler_class`, `frequency_minutes`, `enabled`, `run_in_background`, `max_runtime_seconds`)
VALUES
('recurring_tickets', 'Wiederkehrende Tickets',
'Legt Tickets aus den Vorlagen für regelmäßige Arbeiten an, sobald ihr Termin erreicht ist.',
'OpenNIT\\Cron\\Handlers\\RecurringTicketHandler', 1440, 1, 0, 120);