Ticket rule to synchronize status of referrers tickets with current ticket.
When we get multiple similar tickets about one problem, we use the 'see also' to refer to the first ticket of this problem. So we see al the tickets for which we used the 'see also' field to this ticket in the 'Refferers' field.
With a ticket rule we want to change the status of al these similar tickets to the satus of the first, every time the satus of this ticket changes ( on save). I know that is is nearly possible with the parent ticket. But then you can only share a resolution with the child tickets on closing the parent ticket and close the childeren.
I want the status always the same as the parent.
If I start the ticket rule wizard I can't select the 'referrers' or the 'parent ticket' field, so it is not easy to build the needed query for this ticket rule. Can anybody help me with this ticket rule?
Answers (5)
The following select statement will return the tickets referred to (note that jverbosk uses a different select statement that is more complicated): select FROM_ID as ID FROM HD_TICKET_RELATED, HD_TICKET JOIN HD_STATUS on HD_STATUS.ID = HD_TICKET.HD_STATUS_ID WHERE TO_ID = (select HD_TICKET_ID from HD_TICKET_CHANGE WHERE ID = <CHANGE_ID>) Then use this update query (credit to jverbosk): UPDATE HD_TICKET T JOIN HD_STATUS S on (S.ID = T.HD_STATUS_ID) JOIN HD_TICKET_RELATED R on (R.FROM_ID = T.ID) JOIN (SELECT T.ID, T.TITLE, S.NAME FROM HD_TICKET T JOIN HD_STATUS S on (S.ID = T.HD_STATUS_ID) JOIN HD_TICKET_RELATED R on (R.TO_ID = T.ID)) SOURCE on (SOURCE.ID = R.TO_ID) SET S.NAME = SOURCE.NAME WHERE (S.NAME != SOURCE.NAME AND T.ID in (<TICKET_IDS>))
OK, got this working as requested, should work for all statuses and only require one rule. This will get the statuses from the first ticket (SOURCE) and the referring ticket, then set the referring ticket's status (name) to match the source ticket's status. Setup the ticket rule to run on ticket save and it should do what you need. You can pop the Select query in a report or the MySQL Query Browser to see how the tickets correspond.
John
__________________________________________________
*Title*
Synch Ticket Status With Reference Ticket Status
*Order*
50
*Frequency*
on Ticket Save
*Enabled*
<checked>
*Select Query*
SELECT DISTINCT SOURCE.ID as SID, SOURCE.TITLE as STITLE,
SOURCE.NAME as SNAME, SOURCE.HD_STATUS_ID,
HD_TICKET.ID, HD_TICKET.TITLE, S.NAME, HD_TICKET.HD_STATUS_ID
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.FROM_ID = HD_TICKET.ID)
JOIN
(SELECT HD_TICKET.ID, HD_TICKET.TITLE, S.NAME,
HD_TICKET.HD_STATUS_ID
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.TO_ID = HD_TICKET.ID))
SOURCE on (SOURCE.ID = R.TO_ID)
WHERE HD_TICKET.HD_STATUS_ID != SOURCE.HD_STATUS_ID
ORDER BY HD_TICKET.ID
*Update Query*
UPDATE HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.FROM_ID = HD_TICKET.ID)
JOIN
(SELECT HD_TICKET.ID, HD_TICKET.TITLE, HD_TICKET.HD_STATUS_ID, S.NAME
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.TO_ID = HD_TICKET.ID))
SOURCE on (SOURCE.ID = R.TO_ID)
SET HD_TICKET.HD_STATUS_ID = SOURCE.HD_STATUS_ID
WHERE HD_TICKET.ID in (<TICKET_IDS>)
Comments:
-
The update query works successfully, that's great! Your select statement is giving me problems, however, so I had to use mine (without the "and HD_STATUS.NAME = "Closed"" line. - chucksteel 12 years ago
-
Hold that thought, upon further review the update query is not quite there....
John - jverbosk 12 years ago -
Arg... it works when run manually but not on ticket save, reviewing further...
John - jverbosk 12 years ago -
OK, it's working now. I forgot the ticket rules aren't a fan of aliasing the table that is getting updated, hence the error with the previous query:
08:24> Executing Select Query...
08:24> mysql error: [1054: Unknown column 'HD_TICKET.ID' in 'on clause'] in EXECUTE("SELECT.... etc, etc
Removing the HD_TICKET alias (i.e. FROM HD_TICKET T) from everything and typing it out everywhere addressed it.
Chuck - I remembered this from a while back after you said something, but it has been a while since I've done any ticket rules. Was working fine in the query browser and when running the ticket rule manually, but not on ticket save... but I've fixed it and it should work just fine now. Let me know if you get any further errors, but it's working fine here now. ^_^
John - jverbosk 12 years ago -
Did one last tweak so the SELECT query will only select tickets where the HD_STATUS_ID column in the referring ticket doesn't match the source (referenced) ticket. I had this in the UPDATE query initially, as I wanted to be able to see *all* of the tickets with this relationship initially.
To view all tickets that reference, use this SELECT query (in the query browser or a report):
SELECT DISTINCT SOURCE.ID as SID, SOURCE.TITLE as STITLE,
SOURCE.NAME as SNAME, SOURCE.HD_STATUS_ID,
HD_TICKET.ID, HD_TICKET.TITLE, S.NAME, HD_TICKET.HD_STATUS_ID
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.FROM_ID = HD_TICKET.ID)
JOIN
(SELECT HD_TICKET.ID, HD_TICKET.TITLE, S.NAME,
HD_TICKET.HD_STATUS_ID
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.TO_ID = HD_TICKET.ID))
SOURCE on (SOURCE.ID = R.TO_ID)
ORDER BY HD_TICKET.ID - jverbosk 12 years ago-
I would like to adjust this query to get the email addresses of the owners of the see-also tickets
i tried this
SELECT DISTINCT SOURCE.ID as SID, SOURCE.TITLE as STITLE,
SOURCE.NAME as SNAME, SOURCE.HD_STATUS_ID,
HD_TICKET.ID, HD_TICKET.TITLE, S.NAME, HD_TICKET.HD_STATUS_ID
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.FROM_ID = HD_TICKET.ID)
JOIN
(SELECT HD_TICKET.ID, HD_TICKET.TITLE, S.NAME,
HD_TICKET.HD_STATUS_ID, OWNER.EMAIL as OWNER_EMAIL
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
LEFT JOIN USER OWNER on OWNER.ID = HD_TICKET.OWNER_ID)
JOIN HD_TICKET_RELATED R on (R.TO_ID = HD_TICKET.ID))
SOURCE on (SOURCE.ID = R.TO_ID)
ORDER BY HD_TICKET.ID
i expected a column 'owner_email' (just like SID) when i view the sql report but i'm kind of stuck here... could you help me? - petervdw 10 years ago -
I would like to alter this query to retrieve the owner email addresses of the see-also tickets. I've tried the following
SELECT DISTINCT SOURCE.ID as SID, SOURCE.TITLE as STITLE,
SOURCE.NAME as SNAME, SOURCE.HD_STATUS_ID,
HD_TICKET.ID, HD_TICKET.TITLE, S.NAME, HD_TICKET.HD_STATUS_ID
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.FROM_ID = HD_TICKET.ID)
JOIN
(SELECT HD_TICKET.ID, HD_TICKET.TITLE, S.NAME,
HD_TICKET.HD_STATUS_ID, OWNER.EMAIL as OWNER_EMAIL
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
LEFT JOIN USER OWNER on OWNER.ID = HD_TICKET.OWNER_ID
JOIN HD_TICKET_RELATED R on (R.TO_ID = HD_TICKET.ID))
SOURCE on (SOURCE.ID = R.TO_ID)
ORDER BY HD_TICKET.ID
this doesn't work at all. Could you help me, please? - petervdw 10 years ago
-
-
We made an extension to the update query, so the owner of the ticket is also synchronized.
UPDATE HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.FROM_ID = HD_TICKET.ID)
JOIN
(SELECT HD_TICKET.ID, HD_TICKET.TITLE, HD_TICKET.HD_STATUS_ID, S.NAME, HD_TICKET.OWNER_ID
FROM HD_TICKET
JOIN HD_STATUS S on (S.ID = HD_TICKET.HD_STATUS_ID)
JOIN HD_TICKET_RELATED R on (R.TO_ID = HD_TICKET.ID))
SOURCE on (SOURCE.ID = R.TO_ID)
SET HD_TICKET.HD_STATUS_ID = SOURCE.HD_STATUS_ID, HD_TICKET.OWNER_ID = SOURCE.OWNER_ID
WHERE HD_TICKET.ID in (<TICKET_IDS>)
Danny - dvrijsen 12 years ago -
Nice! Adjustments aren't too bad once you see how things work. ^_^
Also, see my other answer for a very short SELECT query, if you are looking for the shortest one possible.
John - jverbosk 12 years ago
I'm close but probably not exactly what you want. I can create a rule that will close tickets referred to but not other statuses. I'll explain as we go. First you'll need to create a generic custom rule using the wizard, you can specify whatever criteria you want, we'll just change it later. Once you have the rule, replace the select query with the following:
select FROM_ID as ID FROM HD_TICKET_RELATED, HD_TICKET JOIN HD_STATUS on HD_STATUS.ID = HD_TICKET.HD_STATUS_ID WHERE TO_ID = (select HD_TICKET_ID from HD_TICKET_CHANGE WHERE ID = <CHANGE_ID>) and HD_STATUS.NAME = "Closed"
update HD_TICKET, HD_STATUS as T5 set HD_TICKET.HD_STATUS_ID = T5.ID, HD_TICKET.TIME_OPENED = IF(T5.STATE = 'opened', NOW(), HD_TICKET.TIME_OPENED), HD_TICKET.TIME_CLOSED = IF(T5.STATE = 'closed', NOW(), HD_TICKET.TIME_CLOSED), HD_TICKET.TIME_STALLED = IF(T5.STATE = 'stalled', NOW(), HD_TICKET.TIME_STALLED), HD_TICKET.SATISFACTION_RATING = IF(T5.STATE = 'closed', NULL, HD_TICKET.SATISFACTION_RATING), HD_TICKET.SATISFACTION_COMMENT = IF(T5.STATE = 'closed', NULL, HD_TICKET.SATISFACTION_COMMENT) where T5.NAME = 'Closed' and HD_TICKET.HD_QUEUE_ID = T5.HD_QUEUE_ID and (HD_TICKET.ID in (<TICKET_IDS>))
If you want the simplest SELECT query possible, use this:
SELECT HD_TICKET.ID
FROM HD_TICKET
JOIN HD_TICKET_RELATED R on (R.FROM_ID = HD_TICKET.ID)
Just be sure to include this line in the UPDATE query (note that I put this in the SELECT query earlier):
WHERE HD_TICKET.HD_STATUS_ID != SOURCE.HD_STATUS_ID
I originally provided a more detailed SELECT query so you could see more info and also use it in a SQL Report (or in the MySQL Query Browser). Either should work fine, but I'm personally a fan of more info (which is where the extra columns and JOINs are necessary).
John
This could be a complicate rule. I'm also not sure if you're asking about parent/child tickets or just tickets with the See Also relationship defined. I'm pretty sure it's just See Also but you mention child tickets as well. They are setup differently in the database so the SQL will be different.
Comments:
-
We want IT for 'see also' tickets. Thanks - dvrijsen 12 years ago