ACDC 2023 Final Delivery – Reidars danseorkester

Wow, what a journey this has been. Our team arrived with an idea and a dream of being able to successfully create an app that has value. The result of this has been amazing (personal opinion), and we are proud to present what we have completed.

This is our presentation of Matey Finder

Basic Idea and preparations

The basic idea was to create a booking system for pirates and raids. The only preparations that were made, were creating a basic task board of practical tasks before the event and some user stories we might take into account.

Personas – Captain

We identified three main personas for use of the app/system.

Captains own ships around the world and are dependent on correct staffing for the raid to be successful. Once the raid has been staffed, he can set sail and take to the seas. The captain is considered an external user and uses a Power Pages portal to access the system data.

Personas – Harbor Master

The harbor master is responsible for being updated on all the local pirates. His main value is the local knowledge he has about all the talent that can be booked for raids. This is why the Captains are very dependent on a good port master.

The harbor master is the main user of the system keeping tabs on Captains, Ships, Raids, Pirates, and the Economy. He staffs raids based on pirate skills and the needs of the captain. He is defined as an internal user and admin of the system.

Personas – Pirate

A pirate has skills and is part of raids as a crew on ships. A pirate lives by the harbor and has access to M365 and Teams as an internal user of the Harbor system.

Business Case

The Harbor Master is drowning in emails and trying his best to keep all of his knowledge up to date. Without local knowledge, the Captains and Pirates will find other ports to source their needs.

He is in desperate need to solve the following issues:

  1. Too many raid requests via email
  2. Challenging to keep updated Pirate Profiles
  3. Ship Overview
  4. Raid succession and Pirate feedback

The Harbor Master needs to invest in the digital age quickly so he doesn’t lose important customers in the future. This is why we are introducing the Matey Finder solution to assist the Harbor Master scalability and automation.

User Stories and interfaces

“As a Captain I would like to request staffing for a raid.”

The Captain registers his ships and raids via Power Pages. The captain includes requirements for the raid including minimum skillset and the number of pirates that are needed. The estimated loot has to be included because the harbor master then can decide whether or not to staff the raid.

Figur 1 The Captain registers his raid

As a Captain I would like an overview of my raids

The Captain also has his own overview of raids being staffed or raids that have been staffed, departed or completed.

As a Captain I would like to embark on a raid.

The Captain can embark on the raid when the raid is fully staffed by changing the status for the raid via Power Pages.

“As a Harbor Master i would like to review my pirates

The Harbor Master needs to take a look at all his pirates. The list of pirates is shown in the Teams App.

As a Harbor Master i would like to view my personal digital loot that is secured.

The Harbor Master has the option to upload his own digital loot to an Azure Storage Account. The content of this loot is accessible through the Teams App.

As a Harbor Master i would like to staff a raid with my pirates.

The Harbor Master staffs a raid via an app in Teams. He can browse all available pirates and automatically staff a given raid by pressing a button. The system then allocates the raid based on the skills required by the captain and pirate availability.

As an inhabitant of the harbor I would like the possibility to see common information and raid statistics

We are utilizing Teams and VIVA for pirates and the Harbor Master. There they can access the staffing app, PowerBI reports for raid and loot statistics. It also has a small VIVA Connections adaptive card that shows an inspirational quote from Monkey Island.

As a pirate I would like to edit my skills

The pirates have their own Canvas App for different purposes. If they have trained themselves to a better score within a skill It is possible to update their own score via the canvas app.

Under Capabilities, the user has can update their skills as they get older and stronger.

Solution parts and architecture

This drawing shows the basic architecture of our app. We have implemented 4 different workspaces for the personas to do their work depending on their role and whether they are external or internal users

Dataverse

Dataverse is the chosen space for storing data because it’s a great relationship database. For this application, we have a fairly simple, but effective model.

Captains control ships, and order raids.

Pirates are booked into raids with the help of our staffing engine, and the Crew Member entity is the link between the Raid and the Pirate. For all purposes of reporting, Crew Member contains the most data and therefore the most interesting table.

Power Pages

Power Pages was chosen as the best technology to expose the Dataverse data to external users (Captains). It offered a low code approach that made it possible to publish a functioning page within the course of 2,5 days. Pretty impressive that it is up and running with no prior knowledge of using Power Pages. We might owe Nick a beer for this one!🍺💖

The Power Page is mainly intended for the Captains, but it offers full functionality for the Harbor Master as well if he would want this.

Teams App

The Teams App helps the Harbor Master keep track of ongoing raids, provides suggested crew combinations based on a raid’s requirements, and gives an overview of the Harbor Master’s digital loot.

The app is an SPFx that uses React and Fluent UI to style its functional components. The app uses tabs to structure the layout into Pirates, Raids, and Profile. Each of these three pages is comprised of smaller reusable components, like the PirateTable component. The PirateTable component takes a list of pirates as props and displays the availability and skills of each pirate.

For CI/CD the app uses Azure Pipelines to build and ship the SPFx with gulp and publish it to the Sharepoint AppCatalog. The Azure Pipelines are triggered by pushing a new feature to the Devops Repository.  

Custom connector

We added a Custom connector to the OpenAI API that is used for the OpenAI API requests that our Power Automat cloud flows do.

Read more below on what this connector is used for

Power Automate

There are three active Power Automate cloud flows in use

  1. When a pirate registers, they can write a personal description and we call a Custom connector to OpenAI that forwards the description to OpenAI and returns a suggested Pirate name. We store the name in a column in the Contact table.

2. The second flow triggers when a Raid – Status Reason is modified to Staffed. It notifies the Captain and calls a webhook that plays a song on SONOS

3. A third Flow writes Location history to a Location history table in Dataverse when the location is modified on a Ship

Classic workflow in Dataverse

To make a Button available on Power Pages for the Harbor Master to depart a ship we use a classic real-time workflow to change the Status reason on a Raid to Departed.

Power BI

We use Power BI to present KPI and raid results from Dataverse to a Harbor Master dashboard. The App is added to our Teams app (see above).  Default currency in Dataverse is USD. We have connected to an external web page (ratesfx.com) to fetch currency data with Power Query. NOK amounts are calculated based on that. The visuals are clickable and interactive.

Field Service

Having the CRM Keeper on the team (Thomas Sandsør) it was impossible to not touch on one of the First Party applications. To display the Raids and availability, we chose to add booking elements to the Field Service Dispatch calendar. This is a great way for the Harbor Master to view all of his Pirate’s bookings for the future.

Small Devices big Power

To queue up all of our sound elements we installed a Raspberry PI with IOT sensors. The judges were equipped with proximity sensors that would represent a sensor that a Ship could have when docking/leaving port.

We also use the same device to connect via HTTP triggers from Dataverse with the Flow to play sounds when the Raids update status for booking etc. With this technology, the Harbor Master is able to get audio updates when triggers in the systems happen.

Web API

The Web API is the brains of the operation and where that business value is really to be utilized. It gives the option to implement more machine learning with regard to staffing the raids. For now, it selects the best possible crew based on the requirements of the raid.

The API runs in an V4 Azure Function App which mainly utilizes HttpTriggers to expose endpoints to our other applications. The Function App runs on a .NET 6 project which utilizes dependency injection. The DataverseService supports generic retrieval, creation, and updates of Dataverse entities by using CRM’s REST API using odata search syntax. The requests are authenticated with a token representing the application identity which is granted the necessary API permissions in Azure Active Directory.

New features are easily deployed to the API using best practices for infrastructure as code and CI/CD. The only required step is to push the feature to the main branch. The Azure Pipeline is triggered and executes three jobs.

  • The first job builds the .NET 6 project to a deployable package
  • The second job deploys the application infrastructure with resources like Function App, Key Vault, Application Insights, Storage Account) with Azure Bicep
  • The final job deploys the deployable package to the function app using output from the previous job

Business value and killer app

Our delivery is an end-to-end solution suitable for businesses working with staff resources and work management. We considered building on top of the Dynamics 365 Field Service app but decided to create a much lighter solution. For D365 Field Service to work properly a lot of added information need to be added, such as incident types, resources, resource types, work order types….. Work Orders require a lot of info too and plugins/scripts out-of-the-box may interfere. Our approach and solution are therefore based on Power Apps and necessary Custom tables, columns, forms, etc.

There are several apps involved. Daily work for the Harbour Master and other staff will be done from the Model Driven Apps. Captains (could be external users) have access to create new missions/raids from Power Pages (Self-service portal). Power Pages can easily be visually redesigned per customer needs with CSS etc.

We have aimed to create an architecture that supports scaling and suits real needs. The decision to put business logic in web APIs will support the scaling of a platform within different customers and systems.

We believe our complete solution can be used for several real-world scenarios and the building blocks reduces  “time-to-market” significantly. The components are replaceable and adaptive.

Lessons learned

•Power Pages is «simple» but sometimes cumbersome

•Power Pages was new to several people on our team. Team productive in a short time

•Always do continuous deployment, makes things productive after a while

•Things always take longer than expected

•Limiting the scope is really smart and important

•The Dataverse API is simple, flexible, and very suitable for Azure services-integration

•Canvas Apps are harder than it looks.

Finaly Delivery – Evidi Sabeltann’s Pirates 365

Evidi Sabeltann’s Pirates 365 is a complete and automate Pirate Management System

We follow the lifecycle of a Pirate employment from early screening and recruitment to onboarding, training and at last offboarding.

Pirates 365 recruitment frontend: Pirates 365 Recruitment Terminal (PRT)

The Pirates 365 Recruitment Terminal (PRT) is an important part of the solution, and the first things the potential pirates meet.

It have several features

  • Attract pirates so they can sign up to be a pirate
  • Send in applications to the recruitment backend
  • Scare pirates

The PTR is described more here:

On change from the original submission is that done more work in the attraction part of the application. We now use the result of the object detection to trigger music and animation to get more potential pirates to sign up.

We have also implemented a function to filter our easily scared pirates:

Pirates 365 recruitment backend

The recruitment backend is build arond Microsoft Teams – a familiar interface for many pirates

An AI mode built on Stable Diffusion is used to “pirateify” images. – thanks to Mikael and the Bastards for borrowing his installationd and API.

These images are used in the system for profile pictures etc.

Adaptive card in teams for easily accepting or declining a recruit
Working with recruits in Dataverse / Dynamics 365 through Leads
Automatically creationg Azure AD users, assigning group membership, licenses and permissions for newly hired pirates

In the recruitment backend a lot of things are happening

  • generation of Pirate Names
  • generation of Pirate images based on images taken in recruitment terminal
  • creating leads in dataverse
  • by popular request send out the pirate images to the pirate’s email
  • creation of azure ad users for new pirates
  • assigning of licenses to new pirates
  • sending out SMS to new pirates with information about how to log in and link to the Pirate simulator
  • PowerBI dashboards for learning status
  • Offboarding of pirates

These components are described more in detail in the following posts:

Pirates 365 Enhance – training for newly recruited pirates

When new pirates are hired they are automatically been giving access to the Pirates 365 Enhance – the training system

Here the pirates can train before they get assigned to duty on the ships

Pirates need to complete several levels to become proper pirates, and if they fail to early the offboarding proccess is executed

Points are logged back to the recruitment backend, and based on score pirates are either onboarded to a ship or offboarded…into the water

Categories and more 👑

We believe that our solutions give much value in several of the categories, and we have written separate blog posts for these

We havent written a separate post for The “Killer app” category, but believe that this post summarizes much what is needed in a complete solution

Summary

Our idea this year was to create a complete solution for lifecycle of a Pirate employment from early screening and recruitment to onboarding, training and at last offboarding.

We have focused on learning new things, and we have learned a lot in several areas like

  • frontend development in vue.js,
  • different AI moules like tensorflow, gpt and stable diffusion.
  • game development in Power Apps (fun but maybe not recommended)
  • Streaming real time data in PowerBI

ACDC Craftsman

Keeping track of what badges, you (and you teammates) are working on. Which one you have sent to the judges and the ones you have won is an important task when competing in ACDC.

The proper way of doing this is of cause to use Azure DevOps 🤓

Importing the tasks

From the website we created .csv files for the badges. We added coluns for the work item type (User story), Tags, Title and Description:

When the .csv files were done, we imported them using the import from CSV function:

Arranging the Epics, Features and User stories

We created Epics for each of our Pirates 365 modules and features for the applications inside each module. We then added the different badges as user stories on each application (feature):

Working with the board

We could then keep track, and work on the user stories using the board view:

Badges we are working on goes into the active column and is assigned to the correct teammate. Badges sent do judgeing are set to “Ready for tesing”, and the one we have won goes into the Closed column🏆

Retrospect

This is the first year we have kept track of the badges in DevOps, earlier years we have used OneNote. My personal opinion is that it worked out fantastic!  After doing a retrospect with the team the we got the following quote:

“As the Head of Development at Evidi, I’ve had the opportunity to work with a variety of project management tools and systems, but I must say that incorporating badges and points into our Azure DevOps board has truly transformed the way we approach project management.

First and foremost, badges and points add a level of gamification to our workflow, which has greatly increased motivation and engagement among our team members. This has not only led to higher quality work, but also a more positive and collaborative working environment.

In addition, the ability to earn and display badges for achievements such as completing tasks on time or going above and beyond on a project has led to a more competitive and driven team. This has resulted in faster project completion times and higher overall productivity.

But perhaps most importantly, the use of badges and points has provided us with a clear and tangible way to track and reward individual contributions and accomplishments. This has helped us to recognize and reward our team members for their hard work, which has in turn led to higher job satisfaction and employee retention.

Overall, incorporating badges and points into our Azure DevOps board has been a game-changer for Evidi, and I highly recommend it to any team looking to improve their project management process.”

Brage Tukkensæter, Head of Development at Evidi

Category king: Extreme Business Value

Pirates 365 is a complete HR and recruitment system we believe provide the most extreme business value

Our value proposition concists of multiple elements

Cost savings by not needing external pirate recruiters 🪙🪙🪙🪙🪙

More pirates will apply for job as a pirate when the Pirate Recruitment Terminal is deployed. With sounds, fancy 3D animations and a fun theme the pirates. A typically Pirate Consultancy wants to hire 50 pirate a year, and if external recruiters are needed the cost for each new employment is around 1000 gold coins which gives cost savings

Estimated cost savings: 1000 gold coins x 50 employments = 50 000 gold coins each years

Smaller recruitment team and IT staff needed 🪙🪙

Since the recruitment proccess is now fully automated it is possible to have a smaller recruitment team

2 less recruitment and IT staff needed with 10 000 gold coins in payment = 20 000 gold coins saved

Better screening of candidates 🪙🪙

The Pirate Recruitment Terminal have several features that attract the “right” pirates – easily scared pirates can be rejected

It is known that recruiting the wrong candidates have i high cost, and if this system avoids two bad candidates which is estimated to cost 10 000 gold coins each 20 000 gold coins is saved

Better pirate training -> more plunder and theft 🪙🪙🪙🪙🪙

With better pirate training through the pirate simulator it is belived that the pirates is able to find more threasures and plunder more

An ordinary pirate organisation plunder for 500 000 gold coins each tear, and with an estimated 10% increase 50 000 more gold coins are earned

Avoiding very very expensive GDPR fines 🤑🤑🤑🤑🤑🤑🤑

With automated handling of recruitment, onboarding and offboarding process Pirates 365 ensures that the Pirate organisation comply to all the Pirate GDPR regulations. User accounts are deleted automatically when pirates are offboarded – ensuring no personal information is left in the system.

Estimated value: priceless

Summary

With all these value propositions a pirate ortganisation is believed to have a value if 140 000 gold coins

Category king: Excellent user experience

This blog post describes how we think that Pirates 365 a whole provide excellent user experience

We asked our new favourite souce of truth what defines good user experience

We think our solutions delivers many of these areas

Pirate-centric

The Pirate attractor is created to make it easy to use for (drunken) pirates with possible limited computer knowledge.

The animated parrot is moving based on the pirate actions, and responds whetere it can see pirates or not.

It is easy to apply to be a pirate – only 3 fields have to be filled, and the picture is taken automatically

After the application is sent in the next point of contact is a SMS sent automatically with information on how to log on to the system.

Easy to use for HR Recruitment team

Good automated processes is important for solutions with focus on great user experience.

For the recruitment team it is really easy to accept a new candidate – just with the click of a button

Many things are automated which HR often uses a lot of time doing – most of these tasks will often be done manually and error-prone by HR an IT staff

  • Getting images automatically taken when the pirate recruit applies
  • Lead generated in Dataverse for candidate collaboration
  • Azure AD user created with correct UPN name and email address
  • Licenses and permissions are added automatically for the newly hired pirate
  • Candidate are automatically getting information about login

All tasks for the HR team is done in Teams – giving a single point of contact for all tasks regarding recruitment, onboarding and offboarding of the pirate

Accepting recruits directly in Teams
Working with leads
Seeing learning progress for pirates

Piratebays utilize Dynamics Crm

With the new groundbreaking back office system for the modern pirate PiRisk. Piratebays have taken full advantage of the tighter inventory management that you can find in Dynamics CRM

With full control over your own inventory and especially your raiding targets, you will see their full inventory of valuable loot: Gold, Silver, Perls ………….

End users – The reason for why we are doing this!💰😀

We have mentioned little about our front end web solution so far. But here is some info.
The interface is made in React.js built with Vite. It is faster than Webpack.⏩

This is a page to be used by authorities, the coast guard or separate centers for shipping companies.
The website is used to scan areas on the map for ships. If a pirate ship is detected, an alarm can be sent to all other ships in the area.
In order to be able to be used on all surfaces, it is of course responsive 😉

Big Screen
Small screen

Sending an alarm from the web interface will trigger an alarm in Teams clients over on the ships, as well as cause the light on the bridge to flash red.

Meet Capt’n Clawdius

Every pirate ship has to have a cat to ensure rodents are effectively ridden off the ship. Our trusty old LEGO EV3 seems to the job with sensors to ensure he paws around where suitable.

Then again, he likely cannot kill the rodents as the batteries ran out, and his trusted running mate, Marius Bluetooth, had to walk the plank, so we cannot seem to make him spin much 🙁

Badges

Embedding numbnut – Any ship cat is an integrated member of the ship

Retro – EV3 is a decade old, almost a lifetime in tech