Working with ticket information¶
Note
Please note that this is not a full command list, if you’re missing commands, feel free to ask over at the Community.
Get the RAW mail that Zammad fetched¶
The following command will help you to check on received emls Zamamd fetched. This comes in handy if you delete Mails upon fetching and you need to check the eml itself.
To get the first articles eml, you can use the following command. In our example the ticket number in question is 101234
>> Ticket.find_by(number:'101234').articles.first.as_raw.content
If needed, you can also get the raw content of later articles (you’ll need to find the correct article though). Again, we expect 101234
to be our ticket number.
In the first step we get all article IDs of the ticket, from the list we get, we can then get the articles content.
>> Ticket.find_by(number:'101234').article_ids
=> [4, 3, 2]
>> Ticket::Article.find(3).as_raw.content
Note
If you just use Ticket::Article.find(3)
you can see further information (like who sent the mail, when we fetched it, …).
Update all tickets of a specific customer¶
Warning
Please note that this action can be expensive in ressource terms, if you have many tickets, this might slow down Zammad.
>> Ticket.where(customer_id: 4).update_all(customer_id: 1)
Change priority¶
The following commands will enable you to change the naming of priorities. If you set .default_create
to true
you can manipulate what Zammad will use as default priority.
>> priority2 = Ticket::Priority.find(2)
>> priority2.name = '2-high'
>> priority2.default_create = true
>> priority2.save!
Get ticket state types¶
This will show all Ticket States needed for creating new states.
Note
Missing States you just created? You might want to use Ticket.State.all
to display all states for Tickets.
>> Ticket::StateType.all
Add new ticket state¶
Note
You can use ignore_escalation: true,
to ignore possible SLA escalations (pending reminder and pending close use that by default).
Non-Pending states¶
A state that’s not a pending state (e.g. open, closed). Just replace 'open'
by whatever you need (like closed).
>> Ticket::State.create_or_update(
name: 'Developing',
state_type: Ticket::StateType.find_by(name: 'open'),
created_by_id: 1,
updated_by_id: 1,
)
Pending reminders¶
A pending reminder state that will send a reminder notification to the agent if the time has been reached.
>> Ticket::State.create_or_update(
name: 'pending customer feedback',
state_type: Ticket::StateType.find_by(name: 'pending reminder'),
ignore_escalation: true,
created_by_id: 1,
updated_by_id: 1,
)
Pending Action¶
A pending action that will change to another state if “pending till” has been reached.
>> Ticket::State.create_or_update(
name: 'pending and reopen',
state_type: Ticket::StateType.find_by(name: 'pending action'),
ignore_escalation: true,
next_state: Ticket::State.find_by(name: 'open'),
created_by_id: 1,
updated_by_id: 1,
)
Add a date and time picker (pending till) for pending states¶
To add the time picker (pending till) to the new pending state, you’ll need to execute the following code:
>> attribute = ObjectManager::Attribute.get(
object: 'Ticket',
name: 'pending_time',
)
>> attribute.data_option[:required_if][:state_id] = Ticket::State.by_category(:pending).pluck(:id)
>> attribute.data_option[:shown_if][:state_id] = Ticket::State.by_category(:pending).pluck(:id)
>> attribute.save!
Note
In enhanced cases you might want do define the state_id
on your own. In this case just pick the returned state_id
from Ticket::State.by_category(:pending).pluck(:id)
and use them with attribute.data_option[:required_if][:state_id] = {state_id(s)}
and attribute.data_option[:shown_if][:state_id] = {state_id(s)}
directly. Don’t forget to save!
Make new states available to UI¶
Before being able to use the new states within the WebApp, you need to run the following commands to make them available.
Warning
Please do not replace anything below, state_id is a named attribute which is correct and shall not be replaced!
>> attribute = ObjectManager::Attribute.get(
object: 'Ticket',
name: 'state_id',
)
>> attribute.data_option[:filter] = Ticket::State.by_category(:viewable).pluck(:id)
>> attribute.screens[:create_middle]['ticket.agent'][:filter] = Ticket::State.by_category(:viewable_agent_new).pluck(:id)
>> attribute.screens[:create_middle]['ticket.customer'][:filter] = Ticket::State.by_category(:viewable_customer_new).pluck(:id)
>> attribute.screens[:edit]['ticket.agent'][:filter] = Ticket::State.by_category(:viewable_agent_edit).pluck(:id)
>> attribute.screens[:edit]['ticket.customer'][:filter] = Ticket::State.by_category(:viewable_customer_edit).pluck(:id)
>> attribute.save!
Limit available states for customers¶
By default Zammad allows customers to change Ticket states to open
and closed
.
If this does not meet your requirenments, you can adjust this at anytime.
The below example shows how to restrict your customer to only close tickets if needed:
>> attribute = ObjectManager::Attribute.get(
object: 'Ticket',
name: 'state_id',
)
>> attribute.screens['edit']['ticket.customer']['filter'] = Ticket::State.where(name: ['closed']).pluck(:id)
>> attribute.save!
Hint
If you want to allow several different states for customers, you need to provide the state names as array - like so: ['closed', 'open', 'my-amazing-state']
(instead of ['closed']
).
You can check the current active states that customers can set like so:
>> ObjectManager::Attribute.get(
object: 'Ticket',
name: 'state_id',
).screens['edit']['ticket.customer']['filter']
The above will return one or more IDs - if you’re not sure which state they belong to, you can check the state name with the following command. (Ensure to replace {ID}
with your returned ID(s))
>> Ticket::State.find({ID}).name