Zammad bietet von Haus aus, ein sehr gute API. Mit dieser API möchte ich festhalten wie es möglich ist, einen eigenen Status einzufügen.

Statusse

Beim Status eines Tickets handelt es sich um den Stand eines Tickets. Bei der Installation von Zammad stehen folgende Statusse zur Verfügung

  • Open | Offen
  • New | Neu
  • Pending Reminder | warten auf Erinnerung
  • closed | Geschlossen
  • merged | Zusammengeführt
  • removed | gelöscht (inaktiv)
  • pending close | warten auf Schließen

Diese können im Frontend ausgewählt werden. Nun macht es eventuell Sinn weitere Statusse hinzuzufügen. Dies kann über die API gemacht werden. Allerdings mit einem (gar nicht so) kleinen Manko. Der neu eingeführte Status kann im Frontend nicht ausgewählt werden. 

Wir kümmern uns aber darum. Ziel des Beitrags ist es ja, genau das zu bewerkstelligen.

Status über die API einfügen

Im Ersten Schritt erstellen wir unseren Status. Über die API wird ein JSON Objekt erwartet das folgendermaßen aussehen kann.

{
	"id": 8,
	"state_type_id": 5,
	"name": "zur Info",
	"next_state_id": null,
	"ignore_escalation": true,
	"default_create": false,
	"default_follow_up": false,
	"note": "Zur Information",
	"active": true
}

Dieses Objekt muss an folgenden Endpoint übermittelt werden:

curl -u admin@zammad.com:test123 -H "Content-Type: application/json" -X POST -d '{"id": 8, "state_type_id": 5, "name": "zur Info", "next_state_id": null, "ignore_escalation": false, "default_create": false, "default_follow_up": false, "note": "Zur Information", "active": true }' https://xxx.zammad.com/api/v1/ticket_states

Nun ist der Status in der Datenbank verfügbar.

Status im Frontend verwenden

Wie eingangs erwähnt kann dieser (neue) Status im Frontend nicht ausgewählt werden. Hierzu muss man via der (mitgelieferten) rails Konsole folgenden „Befehl“ absetzen:

ObjectManager::Attribute.add(
  force: true,
  object: 'Ticket',
  name: 'state_id',
  display: 'State',
  data_type: 'select',
  data_option: {
    relation: 'TicketState',
    nulloption: true,
    multiple: false,
    null: false,
    default: Ticket::State.find_by(default_follow_up: true).id,
    translate: true,
    filter: Ticket::State.by_category(:viewable).pluck(:id),
  },
  editable: false,
  active: true,
  screens: {
    create_middle: {
      'ticket.agent' => {
        null: false,
        item_class: 'column',
        filter: Ticket::State.by_category(:viewable_agent_new).pluck(:id),
      },
      'ticket.customer' => {
        item_class: 'column',
        nulloption: false,
        null: true,
        filter: Ticket::State.by_category(:viewable_customer_new).pluck(:id),
        default: Ticket::State.find_by(default_create: true).id,
      },
    },
    edit: {
      'ticket.agent' => {
        nulloption: false,
        null: false,
        filter: Ticket::State.by_category(:viewable_agent_edit).pluck(:id),
      },
      'ticket.customer' => {
        nulloption: false,
        null: true,
        filter: Ticket::State.by_category(:viewable_customer_edit).pluck(:id),
        default: Ticket::State.find_by(default_follow_up: true).id,
      },
    },
  },
  to_create: false,
  to_migrate: false,
  to_delete: false,
  position: 40,
)

Das ganze Prozedere kann auch direkt im Issue Tracker von Zammad nachgelesen werden.