15.12.2022

Automatisiert schneller in den Urlaub

Zebragumminente auf einem Stein, im Hintergrund Meer

Automatische Abwesenheitsnotizen für unseren Urlaub per Microbot und Microsoft Office

Wer arbeitet, macht natürlich auch mal Urlaub. Bevor sich ein Kollege oder eine Kollegin in den wohlverdienten Urlaub verabschiedet, arbeiten wir bereits mit einer automatisierten Urlaubsübergabe, die uns unterstützt, unsere Themen für den Urlaub zu übergeben. Das betrifft beispielsweise die Vertretung in unseren Kundenprojekten, aber auch offene To-Do’s, die noch erledigt werden müssen. Damit eine während des Urlaubs eingehende E-Mail nicht ins Leere läuft, haben wir ebenfalls eine Abwesenheitsnotiz. Allerdings kann bei aller Vorfreude dieses nette Feature schnell vergessen werden. Damit hier keine Probleme entstehen, haben wir uns entschieden, dieses Thema an unsere Microbots abzugeben.

Die Voraussetzungen für eine automatisierte Abwesenheitsnotiz sind gegeben. Die Verwaltung von unseren Mitarbeiter:innen und Urlauben erfolgt in MOCO und bei unseren E-Mails setzen wir auf Microsoft Office. Beide Anbieter stellen eine gut dokumentierte API zur Verfügung, sodass diese Herausforderung ohne große Hindernisse gelöst werden kann. Das grobe technische Konzept sieht daher wie folgt aus:

  1. Abfrage an MOCO, welche:r Mitarbeiter:in demnächst im Urlaub ist

  2. Abfrage an Microsoft Office um gewünschte: Mitarbeiter:in zu ermitteln

  3. Abwesenheitsnotiz für den Urlaubszeitraum der/des jeweiligen Mitarbeiter:in setzen

  4. Slack-Benachrichtigung, als Bestätigung, dass die Abwesenheitsnotiz gesetzt ist

Bei vorherigen Automatisierungen haben wir bereits sehr gute Erfahrungen mit der MOCO API gemacht. Entsprechend schnell war die Abfrage, welche:r Mitarbeiter:in demnächst im Urlaub ist, schnell erledigt.
Microsoft Office nutzen wir viel über die Weboberfläche. Hier war etwas mehr Recherchearbeit nötig

Microsoft Office steuern mittels Microsoft Graph

Um Informationen in Microsoft Office ändern zu können, werden aus Sicherheitsgründen natürlich entsprechende Berechtigungen benötigt. Das funktioniert bei Microsoft über eine eigene Anwendung in Azure Active Directory (Azure AD). Wenn eine Anwendung in einem Azure AD-Mandanten registriert ist, können zugewiesene Benutzer - in unserem Fall unser Microbot - sicher darauf zugreifen.

architecture overview(Source: https://learn.microsoft.com/de-de/azure/active-directory/manage-apps/what-is-application-management)

Die Anwendung ist mit wenigen Klicks erstellt. Lediglich ein Name und der unterstützte Accounttyp müssen gesetzt werden: in unserem Fall also "Single Tenant", da die Anwendung intern in unserer Organisation ist.

menu register an application

Im nächsten Schritt musste unter dem Reiter "Certificates & secrets" ein Client Secret, also eine Art Account, für die Anwendung angelegt werden. Der Client Secret besteht aus einer ID und einem Value, dem Passwort. Die Berechtigungen lassen sich unter dem Reiter "API permissions" entsprechend vergeben. Hier sind wir auf knifflige Berechtigungen gestoßen, da das ganze System sehr fein granular funktioniert. Generell gibt es zwei Typen von Berechtigungen: Delegated und Application. In unserem Fall war der Typ Application erforderlich und mit User.ReadWrite.All können alle Userprofile (wozu auch die Maileinstellungen gehören) gelesen und beschrieben werden. Die Client-ID wird als letzte Information noch benötigt, man findet sie unter "Overview".

microsoft azure menuDie Vorarbeit ist nun geleistet und wir können uns unserem MicroBot widmen. Damit der Bot die Nutzer abfragen und später die automatische Abwesenheitsnotiz setzen kann, benötigt er zuerst einen Security-Token. Diesen bekam er mit folgendem POST-Request:

const TOKEN_ENDPOINT = https://login.microsoftonline.com/${MICROSOFT_TOKEN}/oauth2/v2.0/token;
const postData = {
  client_id: MICROSOFT_CLIENT_ID,
  client_secret: MICROSOFT_CLIENT_SECRET,
  scope: "https://graph.microsoft.com/.default",
  grant_type: "client_credentials",
};

export function getAzureAccessToken(): Promise<AzureAccessType> {
  return axios
    .post(TOKEN_ENDPOINT, qs.stringify(postData), {
      headers: { "Content-Type": application/x-www-form-urlencoded },
    })
    .then((response) => {
      return response.data;
    })
    .catch((error) => {
      console.log(error);
    });
}

Der MICROSOFT_TOKEN ist die ID, welche wir unter dem Reiter "Certificates & secrets" bekamen. MICROSOFT_CLIENT_SECRET ist das dazugehörige Passwort und MICROSOFT_CLIENT_ID ist die Client-ID der Anwendung. Mit dem Azure Access Token waren wir nun in der Lage, die Benutzer abzufragen.

export async function getUsers(): Promise<MicrosoftUsersType> {
  const azureAccessToken = await getAzureAccessToken();
 
  return axios
    .get(`https://graph.microsoft.com/v1.0/users/`, {
     headers: { Authorization: Bearer ${azureAccessToken.access_token} },
   })
    .then((response) => {
      return response.data;
    })
    .catch((error) => {
      console.log(error);
    });
}

Nachdem alle Mitarbeiter:innen von MOCO abgefragt wurden, die demnächst in den Urlaub gehen, mussten diese nur noch mit den Benutzeraccounts von Microsoft abgeglichen werden. Anschließend konnten wir für jede:n Mitarbeiter:in nun den Zeitraum seines/ihres Urlaubs mit einer passenden Abwesenheitsnotiz setzen.

export async function changeMailRespondForUser(microsoftUserId, message, startDate, endDate) {
  const azureAccessToken = await getAzureAccessToken();
  const mailData = {
    "@odata.context": https://graph.microsoft.com/v1.0/$metadata#users('${microsoftUserId}')/mailboxSettings,
    automaticRepliesSetting: {
      status: "scheduled",
      externalAudience: "all",
      internalReplyMessage: message,
      scheduledStartDateTime: {
        dateTime: dayjs(startDate).utc().format(),
        timeZone: "UTC",
      },
      scheduledEndDateTime: {
        dateTime: dayjs(endDate).add(1, "day").utc().format(),
        timeZone: "UTC",
      },
    },
  };
  return axios
    .patch(`https://graph.microsoft.com/v1.0/users/${microsoftUserId}/mailboxSettings`, mailData, {
      headers: { Authorization: Bearer ${azureAccessToken.access_token} },
    })
    .then((response) => {
      return response.data;
    })
    .catch((error) => {
      console.log(error);
    });
}

Zum Schluss wird der/die entsprechende Mitarbeiter:in in Slack kurz benachrichtigt, dass die Abwesenheitsnotiz gesetzt wurde. So startet der Urlaub angenehm!

Links: MOCO APP, MOCO APP API, Microsoft Office 360, Microsoft Office 360 API, Blogartikel von Jan Vidar Elven


Zurück zum Blog

Interesse geweckt?

Ich bin Jörg Herbst. Hier unverbindlich Kontakt mit mir aufnehmen!


* Pflichtfeld

Standort Hannover

newcubator GmbH
Bödekerstraße 22
30161 Hannover

Standort Dortmund

newcubator GmbH
Westenhellweg 85-89
44137 Dortmund