►
Description
Reza Dorrani (@rezadorrani) walks through his expense report solution built leveraging Power Apps, Power Automate and Power Virtual Agents for Microsoft Teams with Project Oakdale. The solution also includes receipt scanning using Azure Cognitive Services. Project Oakdale is a built-in, low-code data platform for Microsoft Teams.
Expense Tracking Application package https://bit.ly/expensereportingsolution
Taken from the October Power Apps community call https://youtu.be/AxdFVpkAt5Q
Stay connected
Twitter https://twitter.com/microsoft365dev
YouTube https://aka.ms/M365DevYouTube
Blogs https://aka.ms/M365DevBlog
A
So
powerapps,
as
everyone
knows,
is
the
low
code
application
development
platform
can
come
here
and
build
a
wide
variety
of
apps
and
connect
to
number
of
data
sources
platform
in
itself.
The
power
platform
comes
with
a
data
layer
that
it
exposes,
which
is
called
the
common
data
service,
which
has
powerful
rich
data
types.
It's
a
relational
data
model
and
it's
built
for
scalability.
A
On
the
other
side
of
the
spectrum.
In
m365,
we
have
microsoft
teams,
which
is
our
hub
for
teamwork
and
in
teams
typically
for
building
applications.
You
need
to
probably
have
more
pro
dev
skills
in
order
to
build
apps
and
deploy
them
into
teams.
Now
powerapps
makes
that
really
easy
in
a
low
code,
no
code
experience.
A
So
would
it
not
be
great
if
we
could
merge
the
two
together,
whereas
we
can
leverage
the
power
platform
along
with
the
data
layer
which
is
cds
and
have
all
of
that
experience
directly
in
microsoft
teams,
and
that
is
exactly
what
project
oakdale
is
project.
Local
is
the
code
name.
For
now
this
name
is
going
to
change
in
future.
Basically,
this
is
a
low
code
data
platform
that
has
been
built
for
your
microsoft
teams
and
the
way
you
get
started
with
this
is
in
microsoft.
A
Of
course,
we
just
have
15
minutes,
so
I'm
going
to
be
respectful
of
that
time.
I
have
already
gone
ahead
and
created
certain
artifacts
with
respect
to
my
microsoft
team,
so
I
have
a
team
here
called
play
zone
and,
if
I
head
over
to
see
all
this
will
list
out
all
the
artifacts
associated
with
my
microsoft
team.
A
Now
the
key
thing
to
understand
about
project
oakdale
is
you
can
build
apps,
you
can
build
flows.
You
can
also
build
chat,
bots
using
power,
virtual
agents
and
all
of
these
three
things
can
leverage
the
low
code
data
platform,
which
is
embedded
directly
for
your
team.
It's
like
a
light
version
of
cds
and
right
here.
A
If
I
head
over
to
tables
these
are
all
the
data
tables
that
I
can
create
within
the
context
of
my
microsoft
team
and
all
of
this
at
no
additional
licensing
cost
your
standard
office
licenses
will
give
you
access
to
all
of
this
so
for
building
bots,
no
premium
licensing
for
building
apps
and
flows
that
talk
to
your
data
tables,
embedded
in
your
microsoft
team,
no
premium
licensing
required
whatsoever.
So
that's
the
beauty
of
project
oakdale.
A
Now,
in
my
scenario,
I
would
like
to
demo
an
application
that
I
built
leveraging
project
oakdale
and
the
idea
for
this
actually
came
up
with
one
of
the
templates
and
power
apps.
So
if
I
head
over
to
powerapps-
and
if
I
go
to
home
there
is
this
small
little
link
that
is
extremely
difficult
to
look
at
it's
right
here.
It
is
called
all
templates
and
if
I
head
over
here,
this
will
list
out
a
lot
of
the
templates
that
were
created
by
microsoft
for
the
powerapps.
A
Now,
of
course,
most
of
these
templates
are
pretty
old
and
some
of
the
patterns
in
them
are
also
outdated.
So
let
me
warn
you
before
starting
to
use
them,
but
right
here
there
is
a
template,
called
expense
reporting.
It's
called
the
my
expenses
template
and,
of
course,
this
template,
although
it
says,
connects
to
sharepoint
in
reality
it
does
not.
It
just
connects
to
a
very
simple
excel
file.
I
believe,
and-
and
it's
just
a
good
starter,
boilerplate
template
to
get
started
with.
A
B
A
A
A
I
can
give
this
a
start
date
and
an
end
date
notice,
the
usage
of
the
controls
and
the
theming
that
matches
the
theming
of
microsoft
teams.
So
I
will
pick
today's
date.
End
date
is
today's
date.
I
can
go
ahead
and
pick
a
cost
center
associated
with
my
expense.
I
will
pick
contoso
and
I
will
go
ahead
and
plug
in
a
few
commands
and
I
will
click
create
now
the
moment
I
do
this.
This
has
gone
ahead
and
created
an
expense
for
me
in
my
oakdale
environment.
A
Now
this
what
you're,
looking
at
right
now
is
leveraging
the
data
platform
for
teams
and
I'm
using
a
lighter
version
of
the
data
platform,
which
is
cds,
which
enables
a
relational
data
model.
So
right
here
for
an
expense,
I
can
add
multiple
line
items.
So
let
me
go
ahead
and
add
a
line
item.
A
line
item
basically
is
a
receipt
that
I
can
upload
related
to
my
expense.
A
Now
right
here
in
the
context
of
teams.
Once
again,
I
can
go
ahead
and
upload
a
receipt.
This
is
using
the
image
data
type
in
oakdale,
so
I'll
go
ahead
and
say
upload
a
receipt
and
because
I
am
on
my
mobile
device,
I
have
the
option
of
opening
my
camera.
So
let
me
go
ahead
and
do
this
and
right
here
on
my
desk,
I
have
a
fake
receipt
that
I
stole
from
the
web.
A
So
this
is
not
me
and
I'll
go
ahead
and
take
a
picture
so
I've,
basically
right
now
using
my
camera,
just
taken
the
picture
of
a
receipt
and
the
moment
I
do
this,
I'm
actually
leveraging
azure
cognitive
services
now
which
calls
in
the
receipt
scanning
component
and
that
will
go
ahead
and
process
the
receipt
and
get
the
information.
So
I
was
just
talking
to
waste
time
if
you
notice
right
there
on
the
bottom.
It
gives
me
the
name
of
the
merchant.
A
It
gives
me
the
total
cost
and
it
also
gives
me
the
transaction
date
all
of
this
leveraging
azure
cognitive
services.
Next,
I
can
go
and
pick
the
category
associated
with
my
expense.
This
is
food
and
beverage,
give
a
description
so
I'll
call
this
a
virtual
lunch,
and
then
I
will
click
on
save
and
just
like
that,
I
added
a
line
item
and
related
it
to
the
expense.
That's
the
relational
data
structure
right
here
in
action.
A
Is
this
data
gets
recorded
of
course,
however,
at
the
same
time,
I'm
leveraging
power
automate
to
start
an
approval
process.
So
let's
go
ahead
and
let's
go
back
to
my
schemes
now
what
has
happened
is
I
went
ahead.
I
created
an
expense
and
I
submitted
to
my
expense
and
the
moment
I
submit
my
expense.
What
it
does
is
it
basically
records
it
in
the
system
and
based
on
the
cost
center.
I
have
dynamically
defined
my
approvals.
A
I
will
show
you
how
I
did
that
in
the
data
layer,
when
I
show
you
the
tables
so
right
now,
what's
happening
is
a
flow
is
getting
triggered
and
that
flow
is
going
to
send
out
an
adaptive
card.
Why?
Because
I
want
to
stay
in
the
context
of
teams
to
my
approver
dynamically,
so
my
approver
can
go
and
approve
or
decline
the
request
now
and
it
takes
typically
10
to
15
minutes.
So
I
went
and
pre-created
something
as
you
can
see
here
is
the
adaptive
card
in
action
right
here.
A
So
this
is
the
adaptive
card
that
my
approval
will
receive
and
in
this
adaptive
card
I
have
a
link
directly
to
my
receipt
and
if
I
select
this,
this
will
actually
open
up
that
same
app
in
the
context
of
teams.
Well,
it's
just
opening
a
new
tab
and
not
just
that.
It
will
also
deep
link
me
directly
into
that
expense
item,
for
which
I
am
performing
the
approval
action,
and
I
can
see
the
same
details
right
here.
I
can
look
at
the
the
user
has
uploaded.
A
I
can
see
all
the
details
right
here
and
once
I
want
to
take
a
decision,
I
can
go
ahead
and
either
approve
this
or
reject
this
right
here
within
the
context
of
teams,
and
once
I
click
on
submit
my
approval
decision
is
recorded.
All
of
this
information
goes
back
into
my
data
layer,
which
is
my
oakdale
platform.
That
information
is
recorded
there
and
the
user,
who
created
the
expense,
is
notified
that
your
expense
is
currently
approved
in
the
system.
A
This
is
the
community
call
prep
that
I
just
approved,
and
this
is
the
approval
task
right
here
of
82.98,
so
you
can
build
apps,
you
can
build
flows,
you
can
use
the
relational
data
model,
but
there's
more,
you
can
also
use
power,
virtual
agents
to
build
chat
boards
and
all
of
this
at
no
additional
cost.
So
I
went
ahead
and
built
a
chat
bot
as
well
that
talks
to
the
same
data
platform
and
this
bot
is
something
that
I
can
interact
with
directly
in
microsoft
teams.
A
So
once
again,
on
my
left
hand,
navigation,
rail,
I
have
my
expense
reporting
board.
So
let
me
go
ahead
right
here
and
say
hello,
I'm
going
to
try
and
zoom
in
as
well.
So
I
just
said
hello
and
the
bot
responded
with
hi
reza
I'm
a
virtual
agent.
I
can
help
you
with
details
regarding
your
expense
reports.
Now
the
bot
is
contextually
aware
of
the
logged
in
user.
So
it
knows
that
it's
me
presidenti
and
I'm
gonna
say
I
need
details
of
my
expense
expense
report.
So
I
need
details
about
my
expense
report.
A
It
goes
ahead
and
tells
me
okay.
So
what
is
the
status
of
the
expense
you're
looking
out?
For?
Maybe
I'm
going
to
say
I
am
not
bothered
about
the
status.
Just
show
me
everything
related
to
a
status
and
the
next
question
is
enter
the
dollar
amount.
So
I'm
searching
for
expenses
greater
than
what
so,
maybe
I'm
going
to
say
what
you
know:
50
dollars
and
once
I
do
that
it
will
go
ahead
and
actually
trigger
a
flow.
A
The
flow
will
query
my
data
source
get
that
information,
pick
the
data
and
post
that
information
back
right
here
to
my
bot
and
as
you
can
see,
it's
gone
ahead
and
showed
me
all
those
expenses
that
are
above
50
dollars
and
at
the
same
time,
because
I
selected
status
as
all
it's
going
to
show
me
everything
whether
they
are
rejected
or
whether
they
are
approved
and
in
this
as
well.
This
is
doing
the
deep
linking
functionality.
So
if
I
pick
the
microsoft
ignite
related
expense
that
was
rejected.
A
A
Now,
if
I
head
back
to
my
microsoft
teams
and
if
I
head
over
to
powerapps
and
if
I
head
over
to
the
build
tab
once
again,
I
just
want
to
show
you
what
the
back
end
looks
like.
So
this
is
my
team
and
in
this
team,
if
I
head
over
to
apps,
you
can
build
multiple
apps
per
team,
so
you're
not
restricted
to
just
building
one
app.
So,
as
you
can
see
right
here,
I
have
an
expense
reporting
app.
I
have
a
help
desk
app
that
I've
built
for
this
specific
team.
A
A
The
key
here
is
in
the
tables
that
I'm
leveraging,
which
is
the
relational
data
model,
that's
baked
in
right
here
for
you
in
the
context
of
microsoft
teams.
Now,
in
my
scenario,
remember
I
created
expenses
with
line
items.
So
if
I
head
over
to
expenses-
and
if
I
go
to
quick
edit
they've
kind
of
given
a
sharepoint
like
experience
right
here,
which
is
very
cool,
as
you
can
see,
this
is
listing
out
all
the
expenses
that
are
being
logged
in
my
system
and
all
that
information
is
right
here
and
remember.
A
This
is
a
relational
data
model,
so
I
have
related
this
to
other
tables.
For
example,
I
have
a
table
called
line
items.
This
is
where
all
those
individual
line
items
are
mapped
and
they
are
related
to
an
expense,
and
here
is
that
lookup
column,
which
is
a
true
lookup,
because
it's
creating
the
relationship,
even
the
receipts
that
I
uploaded.
You
can
see
those
images
right
here
in
the
quick
edit
mode
and
finally,
I
have
my
third
table,
which
is
called
cost
center
and
when
the
user
picks
a
cost
center
when
they
are
creating
a
receipt.
A
This
is
where
I'm
dynamically,
defining
my
approvers.
So
in
my
scenario,
because
I
picked
the
cost
center
as
contoso
james
gets
the
approval
action.
If
I
picked
it
as
microsoft,
then
reza
would
get
it.
So
I
can
dynamically
define
my
approvers
as
well,
and
leverage
flow
to
talk
to
the
same
backend
data
source,
so
this
was
all
about
the
expense
reporting
solution.
I
think
this
is
something
that
is
pretty
cool
and
all
of
this.
What
I
built
by
the
way
is,
I
built
it
in
10
hours
flat.
Why?
A
Because
I
reused
a
lot
of
things.
I
I
reused
one
of
the
existing
templates.
I
use
project
oakdale
quickly,
build
these
tables
and
create
these
relationships.
Just
push
my
app
into
project
oakdale
copy
paste
stuff
in
there
and
connect
things,
build
a
flow,
build
approvals
and
the
chatbot
experience,
as
you
saw
it
in
action.
B
Rosa
daniel
had
a
quick
question
he
wants
to
know.
Could
that
could
that.
A
B
A
Nice,
I
would
just
like
to
give
one
one
shout
out
please
from
my
side,
I
would
like
to
give
a
shout
out
shout
out
to
that
api
guy
vivek
bavishi,
the
there
is
no
ai
builder
today
in
project
oakdale.
I
really
hope
it
comes
in
future.
Currently,
it's
not
available.
So
if
you
noticed
when
I
added
my
receipt,
it
went
ahead
and
scanned
the
receipt
for
me
using
the
receipt
scanning
component.
A
All
of
that,
I
used
one
of
the
videos
that
vivek
put
out
and
put
that
in
action
right
here
in
my
app,
because
I
just
wanted
to
use
the
receipt
scanning
component.
So
thank
you.
Vivek.