Redmine is probably the best open source ticketing application. We have been using it for some years and had no problem at all.
Though you can define your own workflows and status transitions I miss a feature: automatically closing issues that have been solved during a certain number of days.
There exists a plugin to do so, but if you don’t want to deploy third-party plugins or you just want to customize the way you close the issues, here you have a couple of MySQL Scripts to automate this task (you can program a cron entry for that).
The first script retrieves all the issues ids that have been in solved status during more than the specified number of days
CREATE DEFINER=`root`@`%` PROCEDURE `sp_close_resolved_redmine`(
IN `in_days` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare v_id integer;
declare v_finished bool;
declare res_issues cursor for
SELECT id
FROM redmine.issues
WHERE status_id = 3
AND TIMESTAMPDIFF(DAY, updated_on, CURRENT_TIMESTAMP) > in_days;
declare continue handler for not found set v_finished = true;
open res_issues;
res_issues: loop
fetch res_issues into v_id;
if v_finished = true then
leave res_issues;
end if;
call sp_cierra_issue_redmine(v_id);
end loop res_issues;
close res_issues;
END
The second script is invoked by the one above passing the issue id to be closed
CREATE DEFINER=`root`@`%` PROCEDURE `sp_cierra_issue_redmine`(
IN `in_id` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare v_id integer;
declare v_author_id integer;
declare v_assigned_to integer;
declare v_status integer;
declare v_id_journal integer;
select author_id, assigned_to_id, status_id into v_author_id, v_assigned_to, v_status
from redmine.issues
where id = in_id;
#Update issue status and assign to author
update redmine.issues
set assigned_to_id = v_author_id,
status_id = 5,
updated_on = current_timestamp,
closed_on = current_timestamp
where id = in_id;
#Create a new journal for the issue
insert into redmine.journals (journalized_id, journalized_type, user_id, notes, created_on)
values (in_id, 'Issue', 1, 'Automatically closed after 7 days solved', current_timestamp);
#Get the journal id we have just inserted
select max(id) into v_id_journal
from redmine.journals
where id = in_id;
#Create two new entries in journal details, one for assigned_id and another one for status_id
insert into redmine.journal_details (journal_id, property, prop_key, old_value, `value`)
values (v_id_journal, 'attr', 'assigned_to_id', v_assigned_to, v_author_id);
insert into redmine.journal_details (journal_id, property, prop_key, old_value, `value`)
values (v_id_journal, 'attr', 'status_id', v_status, 5);
END