Kuluvat kevät on ollut monelle 100% etätyötä. Nyt toimistoja aletaan varovaisesti avaamaan. Useat työnantajat rajoittavat aluksi toimistolla olevien työntekijöiden määrää. Näin turvaväleistä on helpompi huolehtia.

Miten ihmeessä toimistolla olevien määrää rajoitetaan?

Yksi tapa on ilmoittaa paljonko toimistorakennuksessa, tai sen osassa, sallitaan kerrallaan olevan ihmisiä ja luodaan järjestelmä jonka avulla työntekijät

  • ilmoittavat minä päivinä ovat toimistolla
  • näkevät onko toimistolla kyseisinä päivinä vielä tilaa

Tällä kertaa tehdään tähän tarkoitukseen soveltuva Power Apps.

Tietojen tallennus – SharePoint

Common Data Service olisi useastakin syystä tässä esimerkissä se järkevin tietojen tallennuspaikka. Tehdään ratkaisu kuitenkin SharePoint -listoja hyödyntäen, koska viimeiset jutut ovat kaikki nojanneet CDS:ään.

Toimistot yhteenveto -lista

Aloitetaan luomalla lista, johon tallennetaan toimistot halutulla tarkkuudella. Kukin toimisto sisältää

  • Nimen (Title)
  • Paljonko toimistolle otetaan väkeä (Capacity)
  • Paljonko kullekin viikonpäivälle on tulossa työntekijöitä paikalle (Monday, Tuesday, Wednesday...)
  • Tarkasteltavan viikon ensimmäisen päivän (First day of week)

Aluksi kaikki päivät näyttävät nollaa.

Yksi rivi voi edustaa rakennusta, rakennuksen kerrosta tai vaikkapa lohkoa kerroksessa.

Toimiston käyttö -lista

Seuraavaksi luodaan lista, joka sisältää rivin kullekin sovelluksen käyttäjälle. Rivi kertoo miten ko työntekijä aikooo kuluvalla viikolla olla toimistolla.

Listan kenttinä ovat

  • Otsikko (Title), käytännössä työntekijän sähköpostiosoite
  • Viikonpäivittäin (Monday, Tuesday, Wednesday..) tieto siitä mille toimistolle työntekijä on tulossa. Kentän arvo on viittaus toimistot yhteenveto -listaan. Nolla merkitsee etäpäivää.
  • Toimisto jolla työntekijä tyypillisesti työskentelee (Own location)
  • Tarkasteltavan viikon ensimmäinen päivä (First day of week)

Työntekijöiden ei ole tarve nähdä toistensa vastauksia. Tämä hoituu listan vakio-ominaisuuksilla.

Nyt kenenkään yksityisyyttä ei loukata.

Samalla rajaamme ratkaisun käyttäjämäärän 5000:een.

Power Apps

Tällä kertaa emme käy kaikkia toteutuksen yksityiskohtia läpi, ainoastaan pääkohdat.

Tavoitteena on saada aikaiseksi jotain tämän näköistä.

  • Käyttäjän tiedot, tärkeimpänä sijainti jossa oletuksena käydään
  • Lista viikon työpäivistä. Kunkin päivän kohdalla merkitään onko kotona vai toimistolla

App OnStart

Sovelluksen käynnistyessä (App OnStart) tehdään seuraavaa

  • Haetaan muuttujaan (varCurrentItem) toimiston käyttö -listasta käyttäjän tiedot sisältävä rivi
  • Haetaan kokoelmaan (colOffices) toimistot yhteenveto -listan sisältö
  • Mikäli käyttäjä käyttää sovellusta ensimmäistä kertaa, luodaan hänelle rivi toimiston viikottainen käyttö -listaan.
  • Määritellään käyttäjän oletustoimisto (varCurrentBuilding).
  • Mikäli viikko on vaihtunut, alustetaan työntekijälista (kaikkina päivinä työskennellään kotona)

Käyttäjäkohtainen viikkosuunnitelma on tallennettuna yhdelle SharePoint-listan riville. Eli loogisesti näin.

Esitämme viikonpäivät galleriassa, joten kyseinen rivi tulee muuttaa kokoelmaksi. Eli näin.

Käännös tehdään käsin.

ClearCollect(colWeekLocations,
 {
  DayID: 1,
  day: varCurrentItem.'First date of week',
  locationCurrentValue: varCurrentItem.Monday,
  preferredlocation: If(varCurrentItem.Monday = 0,varCurrentBuilding.ID, varCurrentItem.Monday),
  locationNewValue: -1
 },
 {
  DayID: 2,
  day: DateAdd(varCurrentItem.'First date of week',1),
  locationCurrentValue: varCurrentItem.Tuesday,
  preferredlocation: If( varCurrentItem.Tuesday = 0,varCurrentBuilding.ID,varCurrentItem.Tuesday),
  locationNewValue: -1
 })

Nyt kaikki on valmiina varsinaista sovellusta varten.

Viikonpäivät – Galleria

Sovelluksen keskeinen osa on galleria, jossa kukin viikonpäivä esitetään omana rivinään. Viikonpäivän kohdalta voi

  • valita onko kotona vai toimistolla
  • mikäli on toimistolla, valitaan millä toimistolla tarkalleenottaen. Oletusarvona on aina käyttäjän valitsema oletustoimisto

Käyttäjän valinnat tallennetaan gallerian taustalla olevaan kokoelmaan. Esimerkiksi ”Home”-painiketta painettaessa:

Patch(colWeekLocations, ThisItem, {locationNewValue:0})

Lopuksi käyttäjä tallentaa muutokset Submit-painikkeella.

Käyttöliittymään on hyvä toteuttaa pieniä yksityiskohtia, kuten

  • Galleriassa näytetään ainoastaan päiviä kuluvasta päivästä etenpäin.
  • Submit -painike on aktiivinen ainoastaan mikäli jotain valintoja on muutettu

Toimiston valinta

Sovelluksen toisella näytöllä voi valita toimiston. Galleria on kiinni toimistot yhteenveto -listassa, eli voimme näyttää samalla toimistojen kapasiteetit sekä päiväkohtaiset tulijamäärät.

Tallennus

Tietojen tallennus on kaksivaiheinen.

  • Tallennetaan käyttäjän antamat tiedot toimiston käyttö -listan käyttäjäkohtaiselle riville
  • Päivitetään toimistot yhteenveto -listaan kunkin toimiston kohdalle uudet päiväkohtaiset tulijamäärät.

Ensimmäinen tallennus on suoraviivainen. Patch-toiminnolla päivitetään käyttäjän riviä. Mikäli päivän kohdalla toimiston uusi arvo on erisuuri kuin -1 (=ei muutoksia), tallennetaan uusi arvo.

Toimistot yhteenveto -listan päivittäminen onkin sitten hieman kinkkisempää.

Kun käyttäjä ilmoittaa tulevansa toimistolle x päivänä y, tulee kyseisen päivän tulijamäärää lisätä yhdellä. Mikäli käyttäjä oli aiemmin ilmoittanut olevansa päivänä y toimistolla z, tulee toimistolta z vähentää yksi tulija.

Helpointa olisi käydä gallerian viikonpäivät läpi ja suorittaa tarvittavat lisäykset. Ja heti perään käydä ne läpi toisen kerran ja tehdä tarvittavat vähennykset.

Pahimmillaan 10 päivitystä SharePointiin. Mikä kamalinta, useita kertoja samoille riveille. Ei käy.

Jos käyttäjä ilmoittaa viikon alussa tulevansa joka päivä toimistolle X, generoisi tämä logiikka viisi peräkkäistä päivitystä samaan SharePoint-listan riviin. Yhden jokaiselle viikonpäivälle.

Tähän on pakko olla fiksumpi tapa.

Yhteenveto-rivin päivittävä Flow

Luodaan Power Appsista käynnistettävä Flow, joka saa parametrinaan

  • Päivitettävän toimiston Id:n
  • Kustakin (ma-pe) päivästä tiedon, paljonko tulijamäärää korjataan (-1, 0 tai 1)

Flow hakee toimistoa vastaavan yhteenveto rivin ja muokkaa päiväkohtaisia määriä halutulla tavalla

add(body('Get_item')?['Monday'], int(triggerBody()['Updateitem_Monday']))

Huom! Usea käyttäjä voi päivittää kävijämääriä samanaikaisesti. Tällöin Flow:n suoritusta tulee rajoittaa siten, että sitä suoritetaan yksi kerrallaan. Muuten luvut voivat päivittyä väärin.

Siispä Flow:n käynnistimen (trigger) asetuksista rinnakkaisuuden hallinta (Concurrency control) päälle ja sallitaan vain samanaikainen suoritus (Degree of Paralleism).

Flow:n kutsuminen Power Appsista

Välttääksemme turhat tallennukset, selvitämme ensin toimistot joiden kävijämäärää tulee lisätä yhdellä.

ClearCollect(colLocationsToSave,
  Distinct(
    Filter(colWeekLocations, locationNewValue <> locationCurrentValue And locationNewValue > 0
          ),
    locationNewValue)
)

Tämän jälkeen käymme läpi nämä päivitystä kaipaavat toimistot läpi ja tallennamme kaikki toimistoon liittyvät muutokset yhdellä keralla.

ForAll(colLocationsToSave,
  updateweeklyofficeusageinformation.Run(
     Value(Result),
     With(
       {curItem: LookUp(colWeekLocations, DayID = 1)},
       If(curItem.locationNewValue = Result And curItem.locationNewValue <> curItem.locationCurrentValue,1,0)
),
     With(
       {curItem: LookUp(colWeekLocations,DayID = 2)},
       If(curItem.locationNewValue = Result And curItem.locationNewValue <> curItem.locationCurrentValue,1, 0)
),...

Lopuksi sama temppu tehdään toimistoille, joiden kävijämäärää tulee vähentää yhdellä.

Nyt käyttäjän ilmoittaessa viikon alussa tulevansa joka päivä toimistolle X, suoritetaan ainoastaan yksi SharePoint listan päivityskomento. Viiden sijasta.

Olen tyytyväinen.

Viikon vaihtuminen – Flow

Lopuksi teemme Flow:n, joka perjantaisin klo 11 tyhjentää toimistojen kävijämäärät ja päivittää viikon ensimmäiseksi päiväksi ensi viikon maanantain.

Näin käyttäjät pääsevät täyttämään seuraavan viikon lähipäiviä.

Raportointi

Tällaisenaan ratkaisusta ei saa tuotettua mitään järkevää raportointia. Mutta jos viikon vaihtumisen yhteydessä tallennettaisiin viikon läsnäolijoiden määrä omalle SharePoint-listalle (tai SQL -kantaan), niin aineistosta voisi muodostaa kiinnostavia käppyröitä.

  • Miten nopeasti työntekiät palaavat konttoreille?
  • Millä toimistoilla käy eniten väkeä? Millä vähiten?
  • Minä viikonpäivinä toimistolla käydään eniten?

Yhteenveto

Toteutettu sovellus on logiikaltaan yksinkertainen. Haasteena oli toimistojen kävijämäärien päivittäminen ilman turhia API-kutsuja.

Halusin kuitenkin optimoida ratkaisua, sillä sovellusta todennäköisesti käytetään paljon samaan aikaan (maanantai aamuisin ja perjantai ilta-päivisin), joka johtaa helposti SharePoint-yhdistimen rajojen paukkumiseen.

Lataa toteutus (GitHub)

Voit ladata jutun Power Appsin ja siihen liittyvät Flow:t GitHub:sta.

Huom! Sovellus on esimerkinomainen. Se saattaa sisältää virheitä, eikä sitä ole tarkoitettu tuotantokäyttöön sellaisenaan.