Kuvitellaan organisaatio, jolla on toimipisteitä ympäri maata. Käyttäjille tulee usein eteen tilanteita, joissa heidän tulee saada kiinni työntekijä tietystä toimipisteestä. Organisaatio on kuitenkin sen kokoinen, etteivät käyttäjät voi mitenkään tietää keitä missäkin toimipisteessä työskentelee.

Kunpa olisi sovellus josta voi

  • valita toimipisteen
  • nähdä ketkä toimipisteen työntekijät ovat (Teamsin mukaan) vapaana

Tällä kertaa tietenkin tehdään sellainen sovellus.

Toimipisteet ja niiden käyttäjät

Ensimmäiseksi tulee tietää, ketkä toimipisteissä työskentelevät. Oletetaan että kullekin toimipisteelle löytyy sen käyttäjät sisältävä AAD tai Office 365 -ryhmä.

Luodaan SharePoint-lista, johon tallennetaan toimipisteet ja niitä vastaavien ryhmien id:t.

Näin käyttäjän ei tarvitse tietää mikä ryhmä vastaa mitäkin toimipistettä. Häntä kiinnostaa ainoastaan toimipisteet ja kuka missäkin toimipisteesä kulloinkin on vapaana.

Flow – Käyttäjien tilatiedot

Seuraavaksi selvitetään, ketkä valitun ryhmän käyttäjistä ovat Teamsissa vihreänä.

Luodaan Power Appsista käynnistyvä flow, joka saa PowerAppsista parametrina ryhmän id:n (GroupID). Sitten haetaan kyseisen ryhmän käyttäjät (List group members).

Ryhmän jäsenistä palautetaan vaikka mitä tietoja. Me tarvitsemme vain listan käyttäjien tunnisteista (id). Luodaan Select-toiminnolla sellainen.

Hyvältä näyttää!

Seuraavaksi selvitetään näiden käyttäjien tämän hetkinen tila Teamsissa. Miten?

Graph API:lla. Sieltä löytyy rajapinta, jolla voi selvittää usean käyttäjän tilatiedot.

POST https://graph.microsoft.com/v1.0/communications/getPresencesByUserId

Mutta voisiko kyselyn suorittaa jollain perus (standard) yhdistimellä? Esimerkiksi tällä

Tai tällä

Ei voi.

Error: URI path is not a valid Graph endpoint, path is neither absolute nor relative or resource/object is not supported for this connector. Resources: me,users,groups,sites,search,planner,teams,chat

Aavistettavissa, mutta olihan sitä pakko kokeilla.

Seuraavaksi yritetään tehdä kutsu HTTP with Azure AD -yhdistimen Invoke an HTTP request -toiminnolla. Näin välttyisimme oman Azure AD -sovelluksen rekisteröinniltä.

Mutta ei. Tilatiedon noutaminen ei sisälly tähänkään.

Jäljelle jää se perinteinen vaihtoehto. HTTP-kutsun tekeminen itse. Mutta suoritetaanko kutsu sovelluksena (application) vai käyttäjänä delegoiduin oikeuksin (delegated)?

Valinta on helppo, sillä sovellus ei voi tätä rajapintaa (ainakaan vielä) käyttää.

Rekisteröidään Azure AD -sovellus, jolle annetaan Graph API:in delegoidut Presence.Read.All oikeudet.

Tämän jälkeen voimme hakea käyttäjätunnuksella ja salasanalla tokenin. Käytetään luonnollisesti palvelutunnusta, ei kenenkään henkilökohtaista tunnusta.

Lopuksi tehdään varsinainen Graph API -kutsu käyttämällä saatua tokenia.

Meitä kiinnostaa työntekijät, jotka ovat Teamsin mukaan saatavilla (available). Suodatetaan (filter) joukosta ne.

Palautetaan Power Appsille lista henkilöistä Response-toiminnolla. Näin saamme mukaan JSON:in skeeman (schema).

Valmis flow näyttää kokonaisuudessaan seuraavalta.

Power Apps

Viimeisenä vaiheena tehdään Power Apps, joka näyttää valitun toimipisteen vapaana (Teamsin mielestä) olevat työntekijät.

Lisätään sovellukseen alasvetovalikko (Combobox), josta voi valita halutun toimipisteen. Toimipisteet haetaan SharePoint-listalta.

Seuraavaksi sovellukseen lisätään (Add flow) jutun alussa tehty flow.

Käyttäjän valitessa toimipisteen, haetaan flow’lla kokoelmaan (colAvailableUsers) toimipisteen vapaat käyttäjät.

OnChange: ClearCollect(colAvailableusers,'PA-Getgroupmembersavailability'.Run(Self.Selected.GroupId));

Kyseisessä toimipaikassa oli tällä kertaa vain yksi käyttäjä vapaana.

Lisätään näytölle galleria, jossa esitetään saatavilla olevat käyttäjät (colAvailableusers).

Haetaan Office365Users-yhdistimellä käyttäjien kuvat galleriaan.

Samaa yhdistintä hyödyntäen haemme käyttäjän profiilitiedot. Näytämme niistä nimen ja tittelin. Haluamme esittää nimen lihavoituna ja hakea käyttäjän tiedot ainoastaan kerran. Tämä onnistuu With-funktiolla ja html-kontrollilla.

HtmlText = With({varUser: Office365Users.UserProfileV2(ThisItem.id)},
                 "<div style=font-weight:600>"&varUser.displayName &"</div>
                 <div>"&varUser.jobTitle &"</div>"
                )

Vielä kevyt siistiminen ja sovellus näyttää tältä.

Soittaminen / keskustelun avaaminen

Sovelluksesta tulisi voida avata suoraan Teams-puhelu tai keskustelu vapaana olevan henkilön kanssa.

Lisätään galleriaan kuvakkeet näille toiminnoille.

Sovelluksen ainoan näytön avaamisen (OnVisible) yhteydessä haetaan talteen tieto siitä, käytetäänkö sovellusta selaimella vai jollain muulla (Teams-sovelluksen sisällä tai puhelimella).

UpdateContext({locIsHostClientWeb:Param("hostClientType")="web"})

Lopuksi lisätään ikonien OnSelect-tapahtumiin tarvittavat komennot.

Chatin avaaminen:

Select(Parent);
If(
    locIsHostClientWeb,
    Launch(
        "https://teams.microsoft.com/l/chat/0/0?users="& 
          Office365Users.UserProfileV2(ThisItem.id).mail,
        {},
        LaunchTarget.New
    ),
    Launch(
        "msteams://teams.microsoft.com/l/chat/0/0?users="& 
          Office365Users.UserProfileV2(ThisItem.id).mail,
        {},
        LaunchTarget.New
    )
)

Puhelun soittaminen:

Select(Parent);
If(
    locIsHostClientWeb,
    Launch(
        "https://teams.microsoft.com/l/call/0/0?users="& 
          Office365Users.UserProfileV2(ThisItem.id).mail,
        {},
        LaunchTarget.New
    ),
    Launch(
        "msteams://teams.microsoft.com/l/call/0/0?users="&
         Office365Users.UserProfileV2(ThisItem.id).mail,
        {},
        LaunchTarget.New
    )
)

Kätevää!

Mitä lisenssejä tämä edellyttää?

Ratkaisun Power Apps ei sisällä premium ominaisuuksia, mutta sen käynnistämä flow sisältää. Sovelluksen käyttöön ei siis pelkkä Office 365 -lisenssi riitä.

Käyttäjät voidaan lisensoida usealla eri tavalla.

  • Kaikille käyttäjille Power Apps per User -lisenssi (18,70€/kk/käyttäjä)
  • Kaikille käyttäjille Power Apps per App -lisenssi (4,70€/kk/käyttäjä)
  • Sovellus asennetaan Pay-as-you-go ympäristöön, jolloin lisenssiä ei sidota käyttäjiin vaan käytöstä laskutetaan kuukausittaisen käyttäjämäärän perusteella (9,40€/kk/käyttäjä)

Vaihtoehtoisesti voimme lisensoida sovelluksen käyttämän flow’n koko organisaation käyttöön. Tämä kustantaa 93,60€/kk. Tälle lisenssityypille minimiostos on 5 kpl.