How to write a help desk custom ticket rule where an email is sent to summiteer if the title contains certain question.
Example question that a user would submit is "what is the wi-fi password"
The rule should add a responce(answer the question that we defined) to the resolution field and email to the user with the updated ticket information.
Answers (3)
Hmm. Would the user be choosing from a set of pre-defined questions? If not, then you'll need some pretty complicated logic to perform natural language processing on their question. Also, will this be in a custom service desk queue or would the rules be in place for your main service desk?
If you are making a custom service desk then it might be easier to make a drop down in either a custom field or just use the category field. This would ensure that the question is always asked exactly as you want. I have some rules that incorporate referencing assets that could be adapted to something like this and I'd be happy to share them.
If this isn't a custom service desk then I would be wary of creating rules that automatically close tickets unless you can be certain that the rule only matches specific tickets.
Here is my solution. This will search the title of a ticket and send response back as an email.
Query:
*********************
select HD_TICKET.*, DATE_FORMAT(HD_TICKET.CREATED,'%b %d %Y %I:%i:%s %p') as CREATED, DATE_FORMAT(HD_TICKET.MODIFIED,'%b %d %Y %I:%i:%s %p') as MODIFIED,
HD_STATUS.NAME AS STATUS_NAME,
HD_STATUS.ORDINAL as STATUS_ORDINAL,
HD_IMPACT.ORDINAL as IMPACT_ORDINAL,
HD_CATEGORY.ORDINAL as CATEGORY_ORDINAL,
HD_PRIORITY.ORDINAL as PRIORITY_NUMBER,
HD_TICKET.ID AS TICKNUM,
STATE,HD_TICKET.TITLE,
if((datediff(DUE_DATE, now()) = 0), 2, if((datediff(DUE_DATE, now())<0), 1, 3)) as SORT_OVERDUE_STATUS,
if(unix_timestamp(TIME_OPENED) > 0, TIME_OPENED, 1<<62) as SORT_TIME_OPENED,
if(unix_timestamp(TIME_STALLED) > 0, TIME_STALLED, 1<<62) as SORT_TIME_STALLED,
if(unix_timestamp(TIME_CLOSED) > 0, TIME_CLOSED, 1<<62) as SORT_TIME_CLOSED,
if(unix_timestamp(ESCALATED) > 0, ESCALATED, 1<<62) as SORT_ESCALATED,
if(unix_timestamp(HD_TICKET.CREATED) > 0, HD_TICKET.CREATED, 1<<62) as SORT_TIME_CREATED,
if(unix_timestamp(HD_TICKET.MODIFIED) > 0, HD_TICKET.MODIFIED, 1<<62) as SORT_MODIFIED,
if(unix_timestamp(HD_TICKET.DUE_DATE) > 0, HD_TICKET.DUE_DATE, 1<<62) as SORT_DUE_DATE,
case upper(STATE)
when 'CLOSED' then unix_timestamp(HD_TICKET.TIME_CLOSED) - unix_timestamp(HD_TICKET.TIME_OPENED)
when 'OPENED' then unix_timestamp(NOW()) - unix_timestamp(HD_TICKET.TIME_OPENED)
else unix_timestamp(NOW()) - unix_timestamp(HD_TICKET.CREATED) end as AGE,
if ((LENGTH(U1.FULL_NAME) = 0), U1.USER_NAME, U1.FULL_NAME) as OWNER_NAME,
U1.FULL_NAME as OWNER_FULLNAME,
U1.EMAIL as OWNER_EMAIL,
if (U1.ID is null, 'z', concat('a', if ((LENGTH(U1.FULL_NAME) = 0), U1.USER_NAME, U1.FULL_NAME))) as SORT_OWNER_NAME,
if ((LENGTH(U2.FULL_NAME) = 0), U2.USER_NAME, U2.FULL_NAME) as SUBMITTER_NAME,
U2.FULL_NAME as SUBMITTER_FULLNAME,
U2.EMAIL as SUBMITTER_EMAIL,
if (U2.ID is null, 'z', concat('a', if ((LENGTH(U2.FULL_NAME) = 0), U2.USER_NAME, U2.FULL_NAME))) as SORT_SUBMITTER_NAME,
if (U3.ID is null, 'z', concat('a', if ((LENGTH(U3.FULL_NAME) = 0), U3.USER_NAME, U3.FULL_NAME))) as SORT_APPROVER_NAME,
if(APPROVAL='rejected', 'Rejected', if(APPROVAL='info', 'More Info Needed', if(APPROVAL='approved', 'Approved', if(APPROVER_ID>0, 'Pending', '')))) as APPROVAL_STATUS,
Q.NAME as QUEUE_NAME
from (HD_TICKET, HD_PRIORITY, HD_STATUS, HD_IMPACT, HD_CATEGORY)
LEFT JOIN USER U1 on U1.ID = HD_TICKET.OWNER_ID
LEFT JOIN USER U2 on U2.ID = HD_TICKET.SUBMITTER_ID
LEFT JOIN USER U3 on U3.ID = HD_TICKET.APPROVER_ID
LEFT JOIN HD_QUEUE Q on Q.ID = HD_TICKET.HD_QUEUE_ID
LEFT JOIN MACHINE M1 on M1.ID = HD_TICKET.MACHINE_ID
where HD_PRIORITY.ID = HD_PRIORITY_ID
and HD_STATUS.ID = HD_STATUS_ID
and HD_IMPACT.ID = HD_IMPACT_ID
and HD_CATEGORY.ID = HD_CATEGORY_ID
and (( HD_TICKET.TITLE like '%Example String replace me!%' OR HD_TICKET.TITLE like '%Example String replace me!%') AND HD_STATUS.NAME like '%New%') /*Conditions are here you may add as many OR as you wish.*/
and HD_TICKET.HD_QUEUE_ID = 2
*********************
Select "Send an email for each result row"
subject: [TICK:$ticknum] NEW TICKET: $title
Email Column: OWNER_EMAIL
Email body: Whatever information you want to email the user based on the string your looking for in the query.("Example String replace me!")
Comments:
-
Depending on how many responses you want to have, this will get messy. If you wanted to get really complicated you could have the rule search the knowledge base for matching titles and grab the solution to be included in the message to the user. This way you would only have one rule in place.
Another question, does this rule run on ticket save? If so, you might want to consider having it change the status of the ticket to something other than New, otherwise it might send the solution to the user again when someone updates the ticket (assuming they don't change the status when the update it). - chucksteel 11 years ago
This seems like a lot of rules to create and ensure that the logic is correct. I would probably just create a KB article that has the information you are wanting to answer and then select it and have the comments appended to the ticket. This would mean you would have to have comments go out to the users.
I am sure there is a reason for wanting to do this but as chucksteel indicated, unless you predefine the choices, it would get very tricky.
Writing a rule to do the follow have a lot of variables from key words..
*********************
what is the wi-fi password?
what is the new wi-fi password?
what is the new wireless password?
Can I get the wireless pwd?
*******************************
There are so many variables to expect when you put the question in the users hand. You could do a custom category
Password::Reset::WiFi
Password::Unknown:WiFi <===this could trigger a rule to send an email with the password and also close the ticket. Also you control the question and answer.