Del via


Konfigurer Udgiftsagent (prøveversion)

Vigtigt!

Gælder for Dynamics 365 Project Operations integreret med ERP og Dynamics 365 Project Operations til produktion

Udgiftsagenten samler funktioner fra Microsoft Dynamics 365 Project Operations-, programmer til finans og drift, Microsoft Copilot Studio, Power Automate og Dataverse for at automatisere arbejdsprocesser til udgiftsbehandling ved hjælp af AI. Funktionen hjælper med at spare tid og reducere den manuelle indsats ved at gøre det muligt for dit system at behandle kvitteringer og generere udgiftslinjer og udgiftsrapporter for brugerne. Den bruger Microsoft Power Platform-connectorer til integration med Outlook, Microsoft Teams, brugerkalendere og miljøet med programmer til finans og drift via virtuelle Dataverse-objekter.

Udgiftsagenten indeholder flere flow, hvoraf tre fungerer som kerneorganiseringsfunktioner:

  • Behandl mails – Dette flow scanner en konfigureret postkassemappe hver time og gemmer de vedhæftede filer som ikke-tilknyttede kvitteringer i Dynamics 365 Finance.
  • Udtræk kvitterings-id'er – Dette flow henter ikke-vedhæftede kvitteringer og udløser agenten til at udtrække kvitteringsoplysninger og oprette en ikke-tilknyttet udgiftslinje.
  • Behandl udgiftsrapport – Dette flow konverterer ikke-tilknyttede udgiftslinjer og genererer udgiftsrapporter baseret på de grupperapporter efter konfiguration, der er angivet i programmet for hver juridisk enhed.

Derudover kan agenten integreres med Microsoft Teams, hvilket gør det muligt at bruge adaptive kort til gennemsyn og indsendelse af udgiftsrapporter.

Agenten er afhængig af flere Microsoft Power Platform-connectorer. Der refereres automatisk til disse connectorer i de Power Automate-flow, der er angivet.

  • Outlook (Office 365) – Denne connector åbner den delte postkasse for at udtrække kvitteringer.
  • Dataverse (virtuelle objekter) – Denne connector integreres med programmer til finans og drift via virtuelle objekter.
  • Microsoft Copilot Studio – Denne connector aktiverer AI-modeller for at udtrække kvitteringsoplysninger.
  • Microsoft Teams – Denne connector sender adaptive kort til brugerinteraktioner (hvis Teams-integration er aktiveret).
  • Microsoft 365-brugere – Denne connector henter oplysninger om brugerkalenderen (valgfrit, hvis fortolkning af kvitteringer er kontekstafhængig).

Forudsætninger

  1. Økonomi- og driftsmiljø: Du skal bruge mindst version 10.0.44 (10.0.2263.167 eller nyere) eller 10.0.45 (10.0.2345.102 og nyere) af økonomi- og driftsmiljøet for at installere agenten.
  2. Roller, der kræves for at konfigurere brugeren Udgiftsagent: Hvis du vil fuldføre trinnene i denne artikel, skal du være systemadministrator af organisationen og have følgende roller for at konfigurere udgiftsagentbrugeren til installation af Udgiftsagent.
System Rolle Kommentarer
Power Platform Administration Systemadministrator
  1. Gå til Power Platform Administration
  2. Gå til Administrer i ruden til venstre. Vælg Miljøer, og vælg derefter dit miljø.
  3. I sektionen Adgang>Brugere skal du vælge Se alle.
  4. Vælg en bruger, vælg Administrer roller, og tilføj derefter rollen.
Finans og drift Systemadministrator
  1. Åbn URL-adressen til økonomi og drift for dit miljø.
  2. Gå til Modul>Systemadministration>Brugere, og vælg en bruger.
  3. Vælg Tilføj rolle – Systemadministrator.
Microsoft 365 Exchange-administrator og brugeradministrator
  1. Gå til Microsoft 365 Administration.
  2. Gå til Brugere>Aktive brugere>, og vælg brugeren.
  3. Vælg Administrer roller, gå til Roller, og vælg derefter Exchange-administrator.
  4. Gem ændringerne.
  5. Følg de samme trin for at tilføje rollen Brugeradministrator.
Teams Administration Teams-administrator Påkrævet, hvis du planlægger at aktivere Microsoft Teams-integration

Trin til konfiguration af udgiftsagenten

Hvis du vil installere og konfigurere Udgiftsagent, skal du følge disse trin:

  1. Installer Copilot til programmer til finans og drift.
  2. Aktivér agentfunktionerne i dit miljø.
  3. Opret en udgiftsbruger til udførelse af agent.
  4. Konfigurer en delt postkasse.
  5. Konfigurer udgiftsagenten.
  6. Aktivér udgiftsagenten i Microsoft Teams (valgfrit – hvis du har brug for Microsoft Teams-integration)

I følgende afsnit beskrives hvert trin i detaljer.

Trin 1: Installer Copilot til programmer til finans og drift

Udgiftsagenten er tilgængelig som en del af pakken med Copilot til programmer til finans og drift. Når du har installeret denne pakke i dit miljø, får du automatisk alle nødvendige aktiver, herunder agenten, miljøvariabler og Power Automate-flow.

Hvis du vil installere den påkrævede app, skal du følge disse trin:

  1. Gå til Power Platform Administration i din browser.
  2. Vælg det miljønavn, hvor du vil installere appen, på listen over miljøer.
  3. På siden med oplysninger om miljøet (IKKE fra navigationen til venstre) skal du gå til sektionen Ressourcer og vælge Dynamics 365-apps.
  4. Søg efter Copilot til programmer til finans og drift på listen over Dynamics 365-apps. Hvis den allerede er installeret, og en opdatering er tilgængelig, skal du vælge knappen Opdater.
  5. Hvis appen ikke vises under Dynamics 365-apps, skal du vælge Installér app, vælge Copilot til programmer til finans og drift og derefter følge prompterne for at fuldføre installationen.

Notat

Få mere at vide om, hvordan du aktiverer Copilot i dit miljø, under Aktivere Copilot-funktioner i programmer til finans og drift.

Tips

Følg disse trin for at kontrollere, om pakken blev installeret:

  1. Gå til Power Apps Maker Portal > vælg dit miljø > vælg Løsninger > Se historik > søg efter og vælg msdyn_ExpenseAI > Detaljer.
  2. Kontrollér feltet Resultat.
    1. Hvis resultatet viser Udført, blev pakken installeret korrekt.
    2. Hvis resultatet ikke viser Udført, mislykkedes installationen.
  3. Hvis installationen mislykkes, skal du slette msdyn_FnOCopilotAnchor (få mere at vide i afinstallationsafsnittet) og installere Copilot til programmer til finans og drift igen.

Trin 2: Aktivér agentfunktionerne i dit miljø

Når du har installeret pakken Medpilot til økonomi- og driftsapps, skal du aktivere Udgiftsagent fra dit dataverse- og økonomi- og driftsmiljø.

Aktivér funktion i Dataverse

Slå funktionsflaget Copilot til i Power Platform Administration. Hvis du vil aktivere funktionsflaget Copilot, skal du følge disse trin:

  1. Gå til Power Platform Administration.
  2. Vælg Miljøer> vælg dit miljø >Indstillinger>Produkt> vælg Funktioner.
  3. Bekræft, at funktionsflaget Copilot er slået til.

Aktivér funktionen i dit finans- og driftsmiljø

Hvis du vil aktivere agenten i finance and operations-apps, skal du følge disse trin:

  1. Log på dit finans- og driftsmiljø.
  2. Gå til Funktionsstyring, og aktivér funktionen Administration af funktion og funktioner til Agentstyring.
  3. Hvis du vil konfigurere udgiftsagenten (opsætningen er pr. juridisk enhed), skal du gå til Konfiguration af>udgiftsstyring>Generelt>Parametre for Udgiftsstyring.
  4. Konfigurer parametrene som vist i følgende tabel under fanen Udgiftspostagent.
Parametre Værdi Kommentarer
Aktivér Udgiftsagent for den aktuelle juridiske enhed Ja Skift til Ja for at aktivere agenten for den aktuelle juridiske enhed.
Hyppighed Dagligt eller ugentligt Konfigurer hyppigheden for automatisk oprettelse af udgiftsrapporter i din organisation.
Gruppér rapporter efter Rejse eller projekt Konfigurer for at gruppere udgifter baseret på et projekt eller en rejse.

Trin 3: Opret en udgiftsagent-bruger til agentudførelse

Opret en dedikeret bruger af udgiftsagenten for at sikre, at agenten kører uafhængigt af en medarbejders identitet. Denne fremgangsmåde hjælper med sikkerhed, administration og langsigtet vedligeholdelse. Selvom du kan bruge en eksisterende brugerkonto, der har de nødvendige rettigheder, skal du bruge en systemejet identitet.

Opret udgiftsagentbrugeren i Microsoft Entra-id

  1. Log på Azure-portalen.
  2. Vælg Microsoft Entra-id i de tilgængelige Azure-tjenester.
  3. Opret en ny bruger under Microsoft Entra-id.
  4. Vælg Tilføj>Bruger>Create new user, og angiv følgende oplysninger.
    • Brugerens hovednavn
    • Vælg det rette domæne
    • Vist navn
    • Adgangskode
    • Markér konto aktiveret
  5. Hvis du vil have vist detaljerne og fuldføre brugeroprettelsesprocessen, skal du vælge Gennemse + opret og vælge Opret.
  6. Vælg en bruger og siden med visningsoplysninger på siden Bruger (Administrer > Brugere).
  7. Vælg Rediger egenskaber, gå til fanen Indstillinger, og udfyld den relevante brugsplacering.

Notat

Afhængigt af din organisations politik skal du muligvis ændre din adgangskode og konfigurere multifaktorgodkendelse (MFA). Følg de trin, du normalt gør for at ændre adgangskode og konfigurere multifaktorgodkendelse.

Tildel de påkrævede licenser til brugeren af udgiftsagenten

Hvis du vil installere Udgiftsagent, skal du tildele følgende licenser til brugeren af udgiftsagenten:

  • Dynamics 365 Teams-medlemslicens
  • Microsoft 365 Business Basic eller en hvilken som helst licens, der dækker Microsoft Teams og Outlook (f.eks. Office 365 E5 med Teams)
  • Power Apps Premium

Følg disse trin for at tildele licenser:

  1. Log på Microsoft 365 Administration med en bruger, der har adgang til at tildele licenser, som er en bruger med Licensadministrator eller højere.
  2. Vælg Fakturering>Licenser>Dynamics 365 Teams-medlemslicens.
  3. Vælg +Tildel licenser.
  4. Søg efter den bruger af udgiftsagenten, der blev oprettet i forrige trin.
  5. Vælg Tildel for at fuldføre licenstildelingen.
  6. Følg trin 2-5 for de andre licenser – også Microsoft 365 Business Basic og Power Apps Premium.

Notat

Få mere at vide om, hvordan du kontrollerer og tildeler licenser, under Brug siden Aktive brugere til at tildele eller fjerne tildeling af licenser.

Føj brugeren til Power Platform-miljøet

Hvis du vil føje brugeren til Power Platform-miljøet, skal du følge disse trin:

  1. Log på Power Platform Administration, og vælg derefter det rette miljø.

    Tips

    Denne side indeholder oplysninger, der er relateret til miljø-id'et for Dataverse, URL-adressen til miljøet for Dataverse, URL-adressen til finans og drift. Gem disse værdier, der skal bruges i senere afsnit.

  2. Gå til Adgang > Brugere > Se alle.

  3. Vælg Tilføj bruger, angiv den nyoprettede agentbruger, og vælg Tilføj.

  4. Tilføj følgende roller på siden Administrer sikkerhedsroller .

    • Rolle som udgift til AI-agent
    • Finans og drift Agent Configuration Manager
    • Systemtilpasser
  5. Vælg Gem for at bekræfte rolletildelingerne.

Disse roller giver adgang til Dataverse- og Power Automate-komponenter, som agenten skal bruge for at fungere.

Tips

Hvis brugeren allerede findes, og du kun skal tildele roller, skal du gå til Power Platform Administration og vælge det relevante miljø.

  1. Gå til Adgang > Brugere > Se alle.
  2. Vælg den oprettede agentbruger.
  3. Vælg Administrer roller, og tildel rollerne.

Tildel den påkrævede rolle i finans- og driftsmiljøet

Hvis du vil tildele rollen ExpenseAgentRole i økonomi- og driftsmiljøet, skal du følge disse trin:

  1. I finans- og driftsmiljøet skal du gå til Systemadministration>Brugere.
  2. Opret en brugerpost for agentbrugeren.
  3. Når du har oprettet brugeren, skal du gå til sektionen brugerens roller, vælge Tildel roller og søge efter ExpenseAgentRole.
  4. Vælg Gem.

Notat

ExpenseAgentRole er tilgængelig i programmer til finans og drift version fra 10.0.44 (10.0.2263.81) og 10.0.45 (10.0.2345.6) og med Copilot til programmer til finans og drift version 1.0.3121.1

Tildel adgang til den delte postkasseadgang

Agentbrugeren skal have Microsoft Graph-tilladelsen Mail.Read.Shared. Denne tilladelse gør det muligt for agenten at læse kvitteringer fra den konfigurerede delte postkasse under udførelse af flowet.

Følg disse trin for at tildele adgang til den delte postkasse:

  1. Gå til Microsoft Graph Explorer, og log på med den oprettede agentbruger.
  2. Vælg ikonet bruger i øverste højre hjørne > vælg Samtykke til tilladelser.
  3. Vælg rullemenuen for Mail> søg efter Mail.Read.Shared> vælg Samtykke, og vælg Acceptér.

Oversigt over påkrævede roller for den oprettede agentbruger

Miljø Roller Kommentarer
Dataverse
  • Rollen AI-udgiftsagent
  • Finans og drift Agentkonfigurationsmanager
  • Systemtilpasser
  • De nævnte roller gør det muligt for agenten at interagere med Power Automate-flow, miljøvariabler og virtuelle objekter, der er knyttet til Dynamics 365 Finance
    Finans og drift
  • ExpenseAgentRole
  • Systembruger
  • Denne rolle er påkrævet, for at agenten kan oprette og administrere udgiftsposter i miljøet for programmer til finans og drift.

    Bemærk! ExpenseAgentRole er tilgængelig i programmer til finans og drift version fra 10.0.44 (10.0.2263.81) og 10.0.45 (10.0.2345.6) og med Copilot til programmer til finans og drift version 1.0.3121.1
    Adgang til delt postkasse ved hjælp af Graph-tester Mail.Read.Shared Microsoft Graph-tilladelse, der gør det muligt for agenten at læse kvitteringer fra den konfigurerede delte postkasse under udførelse af flowet

    Trin 4: Konfigurer den delte postkasse

    Udgiftsagenten bruger en delt postkasse til at modtage og behandle kvitteringsmails. En bruger med rollen Exchange-administrator skal oprette og konfigurere denne postkasse i Microsoft 365 Administration.

    Følg disse trin for at oprette og konfigurere den delte postkasse:

    1. Log på Microsoft 365 Administration ved hjælp af en Exchange-administratorkonto.

    2. Vælg Teams & Grupper>Delte postkasser i ruden til venstre.

      Tips

      Du skal muligvis vælge Vis alle for at udvide hele listen.

    3. Vælg Tilføj en delt postkasse.

    4. Angiv et navn og en mailadresse til den delte postkasse.

    5. Vælg Gem ændringer.

    6. Under Næste trin skal du vælge Føj medlemmer til denne delte postkasse. (Der kan gå et par minutter, før medlemsadministration bliver tilgængelig).

    7. Vælg Tilføj medlemmer

    8. Vælg den oprettede agentbruger og andre, der skal overvåge postkassen, og vælg Tilføj.

    9. Vælg Luk.

    Notat

    Du bruger mailadressen på den delte postkasse i næste trin. Når du har konfigureret den delte postkasse, skal du angive dens mailadresse og mappestien (som standard angivet til Indbakke) som miljøvariabler, når du konfigurerer Time og Expense Agent. Du kan få flere oplysninger under Trin 5: Konfigurer Udgiftsagent.

    Trin 5: Konfigurer udgiftsagenten

    Du har to muligheder for at konfigurere udgiftsagenten:

    • Mulighed A: Brug et PowerShell-script (anbefales)
    • Mulighed B: Konfigurer manuelt i Power Apps (ingen PowerShell)

    Vigtigt!

    Før du fortsætter med installationen af Expense Agent, skal du sikre dig, at agenten er klargjort korrekt i Microsoft Copilot Studio.

    Følg følgende vejledning for at bekræfte, at agenten er klargjort succesfuldt.

    1. Log på Microsoft Copilot Studio, og vælg dit miljø.
    2. Gå til Agenter, og søg efter ExpenseAgent-Line (forhåndsversion).
    3. Kontrollér, at knappen Publicer er aktiveret.
    4. Hvis den er aktiveret, skal du fortsætte med installationen. Hvis den er deaktiveret, skal du vente, indtil agenten er klargjort.
    5. Gentag disse trin for at bekræfte, at Udgiftspostagent (forhåndsversion) er aktiveret.

    Tips

    Hvis klargøring af Copilot-økonomi- og driftsappen tager mere end 5-6 timer, skal du fjerne og geninstallere appen for at løse potentielle installationsforsinkelser. Du kan få flere oplysninger i afsnittet Fjern Udgiftsagent i slutningen af denne artikel.

    Manuel konfiguration af agenten omfatter oprettelse og sammenkædning af forbindelser, aktivering af Power Automate-flow og publicering af løsningen. Denne proces kan være tidskrævende, og der kan opstå fejl. Hvis du vil automatisere installationen, kan du bruge et PowerShell-script, når du har opdateret de påkrævede parametre.

    PowerShell-scriptet automatiserer følgende opgaver:

    • Opdaterer de påkrævede miljøvariabler.
    • Sammenkæder Microsoft Power Platform-forbindelser med løsningsforbindelsesreferencer.
    • Aktiverer alle Power Automate-flow, som Tids- og Udgiftsagent kræver.
    • Udgiver copilotagenterne.
    • Publicerer Dataverse-løsningen.

    Før du kører scriptet, skal du oprette forbindelser, da du skal angive forbindelses-id'et for hver connector i install.ps1-filen. Hvis du vil oprette disse forbindelser, skal du følge disse trin ved hjælp af den oprettede agentbruger.

    1. Log på Power Apps Maker Portal ved hjælp af den nyoprettede agentbruger, og vælg dit miljø.
    2. Vælg Mere i ruden til venstre, og vælg derefter Forbindelser.
    3. Vælg Ny forbindelse , og søg ved hjælp af Forbindelsesnavn i følgende tabel (f.eks . Office 365 Outlook).
    4. Vælg den relevante connector på listen, og opret den.
    5. Når forbindelsen er oprettet, skal du notere den bruger, som forbindelsen blev oprettet med. Det skal ideelt set være det oprettede agentbruger-id. Dette bruger-id skal opdateres i den installationsfil, du opretter i næste trin.
    6. Gentag trin 3 og 4 for hver af de resterende nødvendige forbindelser, der er angivet i følgende tabel.
    Forbindelsesnavn URL-adresseformater for forbindelser
    Office 365 Outlook https://make.powerapps.com/environments/environmentID/connections
    / shared_office365/connectionID/details
    Office 365-brugere https://make.powerapps.com/environments/environmentID/connections
    / shared_office365users/connectionID/details
    Microsoft Teams https://make.powerapps.com/environments/environmentID/connections
    / shared_teams/connectionID/details
    Microsoft Dataverse https://make.powerapps.com/environments/environmentID/connections
    / shared_commondataserviceforapps/connectionID/details
    Microsoft Copilot Studio (forhåndsversion) https://make.powerapps.com/environments/environmentID/connections
    / shared_microsoftcopilotstudio/connectionID/details

    Oplysninger, du skal bruge for at oprette installationsfilen

    Hvis du vil oprette installationsfilen, install.ps1, skal følgende oplysninger være tilgængelige. Du kan bruge følgende tabel som reference.

    Parameter Andre detaljer
    Dataverse-miljø-id Angiv det miljø-id, du får fra Power Platform Administration.
    Eksempelværdi: xxxx-xxxx-xxxx-xxxxxx
    URL-adresse til Dataverse-miljø Angiv URL-adressen til miljøet fra Power Platform Administration.
    Bemærk! Sørg for, at der står https:// i starten og ingen skråstreg '/' i slutningen.
    Eksempelværdi: https://org123.crm.contoso.com
    URL-adresse til finans- og driftsforekomst Angiv oplysningerne om finans- og driftsmiljøet i følgende format.
    Eksempelværdi: https://org123.contoso.com
    Bemærk!Sørg for, at der står https:// i starten og ingen skråstreg ‘/’ i slutningen.
    OutlookFolderPath Angiv den mappesti, der er oprettet i den delte postkasse. Hvis der ikke er oprettet en anden mappe, angives den som standard som Indbakke.
    Eksempelværdi: Indbakke
    Som bedste praksis skal du oprette en separat mappe til udgiftsstyring
    Id for postkasseadresse Angiv mailadressen på den delte postkasse, der er oprettet for nylig
    Eksempelværdi: expenseagent@contoso.com
    Navn på Microsoft Dataverse-forbindelse
    Navn på Microsoft Copilot Studio-forbindelse
    Navn på Microsoft Office Outlook-forbindelses
    Navn på Microsoft Office 365-brugerforbindelse
    Navn på Microsoft Teams-forbindelse
    Input til alle forbindelsesnavnene er det samme og er brugermail-id'et for den oprettede agentbruger.

    Eksempelværdi: createdexpenseagentuser@contoso.com

    Opret installationsscriptfilen

    Opret en installationsscriptfil ved at kopiere følgende kode. Indsæt de påkrævede miljøvariabler i scriptet, og kør derefter scriptet ved hjælp af PowerShell.

    Notat

    Placer installationsscriptfilen på det lokale skrivebord. Gem den ikke i One Drive.

    Opret en PowerShell-scriptfil med følgende kode. Opdater de nævnte parametre, før du kører scriptet.

    Tips

    Når Obligatorisk = $true, beder PowerShell dig om at angive parametrene interaktivt, så du ikke behøver at opdatere dem direkte i scriptfilen.

    Hvis du vil undgå manuel input og vil foruddefinere parametrene i installationsscriptet, skal du angive Obligatorisk = $false i afsnittet Param i følgende eksempelkode.

    Kopiér følgende kode til installationsscriptfilen, og gem den som 'Install.ps1'. Opdater variablerne i de respektive parameterfelter i afsnittet param. Du skal opdatere 10 variabler.

    Tips

    Brug den forrige tabel som reference, og erstat alle eksempelværdierne med dine respektive detaljer.

    #requires -Version 7
    Param(
    
       [Parameter(Mandatory=$true, HelpMessage="Dataverse environment id")]
       [string]$DataverseEnvironmentId = "xxxx-xxxx-xxxx-xxx-xxxxxxxxxx", 
    
       [Parameter(Mandatory=$true, HelpMessage="Dataverse environment URL")]
       [string]$DataverseUrl = "https://org123.crm.dynamics.com",
    
       [Parameter(Mandatory=$true, HelpMessage="Finance and Operations instance URL")]
       [string]$D365FinanceAndOperationsUrl = "https://org123.operations.dynamics.com",
    
       [Parameter(Mandatory=$true, HelpMessage="OutlookFolderPath")]
       [string]$OutlookFolderPath = "Inbox",
    
       [Parameter(Mandatory=$true, HelpMessage="Mailbox Address Id")]
       [string]$MailboxAddressId = "expenseagent@contoso.com",
    
       [Parameter(Mandatory=$true, HelpMessage="Microsoft Dataverse connection name")]
       [string]$MicrosoftDataverseConnectionName = "createdexpenseagentuser@contoso.com",
    
       [Parameter(Mandatory=$true, HelpMessage="Microsoft Copilot Studio connection name")]
       [string]$MicrosoftCopilotStudioConnectionName = "createdexpenseagentuser@contoso.com",
       
       [Parameter(Mandatory=$true, HelpMessage="Microsoft Office Outlook connection name")]
       [string]$Office365OutlookConnectionName = "createdexpenseagentuser@contoso.com",
    
       [Parameter(Mandatory=$true, HelpMessage="Microsoft Office 365 Users connection name")]
       [string]$Office365UsersConnectionName = "createdexpenseagentuser@contoso.com",
    
       [Parameter(Mandatory=$true, HelpMessage="Microsoft Teams connection name")]
       [string]$MicrosoftTeamsConnectionName = "createdexpenseagentuser@contoso.com",
    
       [Parameter(Mandatory=$false, HelpMessage="Checks for bot Sync Errors and if there is provisioning required before Agent publish step")]
       [boolean]$CheckBotSyncStatusAndProvisionBots = $false
    
    )
    
    $flows = @(
        "expense entry retry check",
        "expense configuration",
        "get expense outlook folder",
        "generate expense report",
        "send expense report adaptive card",
        "auto match expenses",
        "process emails",
        "extract unattached receipt ids for copilot invocation",
        "extract unattached receipt output using dataverse plugin",
        "generate expense line",
        "generate expense line without project id and status id",
        "identify project ids",
        "user calendar events",
        "process expense report using copilot",
        "invoke expense agent for receipt processing"
    )
    
    
    $agents = @(
        "msdyn_ExpenseEntryAgent",
        "msdyn_ExpenseReportAgent"
    )
    
    
    # Check PS version
    if ($PSVersionTable.PSVersion.Major -lt 7) {
        Write-Error 'This script requires at least PowerShell version 7' -ErrorAction Stop
    }
    
    # Install the required modules if not already installed or if the version is not 1.0.40
    if (-not (Get-Module -ListAvailable -Name Microsoft.PowerApps.PowerShell | Where-Object { $_.Version -ge [Version]"1.0.40" })) {
        Write-Host "Microsoft.PowerApps.PowerShell version 1.0.40 not found. Installing..." -ForegroundColor Yellow
        Install-Module -Name Microsoft.PowerApps.PowerShell -RequiredVersion 1.0.40 -Force -AllowClobber -Scope CurrentUser
    } else {
        Write-Host "Microsoft.PowerApps.PowerShell version 1.0.40 is already installed." -ForegroundColor Green
    }
    
    if (-not (Get-Module -ListAvailable -Name Microsoft.PowerApps.Administration.PowerShell | Where-Object { $_.Version -ge [Version]"2.0.147" })) {
        Install-Module -Name Microsoft.PowerApps.Administration.PowerShell -RequiredVersion 2.0.147 -Force -AllowClobber -Scope CurrentUser
    }
    
    # Install the required modules if not already installed
    if (-not (Get-Module -ListAvailable -Name Az.Accounts | Where-Object { $_.Version -ge [Version]"5.0.1"})) {
        Install-Module -Name Az.Accounts -RequiredVersion 5.0.1 -Force -AllowClobber -Scope CurrentUser
    }
    
    # Import required modulesds
    Import-Module Az.Accounts
    Import-Module Microsoft.PowerApps.PowerShell
    Import-Module Microsoft.PowerApps.Administration.PowerShell
    
    # global variable declaration
    $filter = '$filter'
    
    
    function Get-AccessToken {
        # Retrieve the access token for the Dataverse environment
        $accessToken = (Get-AzAccessToken -ResourceUrl "$DataverseUrl" -AsSecureString).Token
        Write-Host "Access token for $userId retrieved successfully." -ForegroundColor Green
        return $accessToken
    }
    
    function Get-AccessTokenPlainText {
        param(
            [Parameter(Mandatory=$true, HelpMessage="Access token for authentication")]
            [securestring]$accessToken
        )
        # Retrieve the access token for the PVA environment
        $token = [Runtime.InteropServices.Marshal]::PtrToStringAuto(
        [Runtime.InteropServices.Marshal]::SecureStringToBSTR($accessToken))
        return $token
    }
    
    function update-EnvironmentVaribleValue {
            param (
            [string]$accessToken,
            [string]$env_key,
            [string]$env_value   # Access token for authentication
        )
    
        try 
        {
            # Get the environment variable definition
            $envVarDefinition = Invoke-RestMethod -Method Get -Uri "$DataverseUrl/api/data/v9.2/environmentvariabledefinitions?$filter=schemaname eq '$env_key'" -Headers @{
                Authorization = "Bearer $accessToken"
            }
    
            if ($envVarDefinition.value -ne $null) {
                $envVarDefId = $envVarDefinition.value[0].environmentvariabledefinitionid
    
                # Get the environment variable value record
                $filterValue = [System.Web.HttpUtility]::UrlEncode("_environmentvariabledefinitionid_value eq $envVarDefId")
                $envVarValue = Invoke-RestMethod -Method Get -Uri "$DataverseUrl/api/data/v9.2/environmentvariablevalues?$filter=$filterValue" -Headers @{
                    Authorization = "Bearer $accessToken"
                }
    
                if ($envVarValue.value -ne $null) {
                    $envVarValueId = $envVarValue.value[0].environmentvariablevalueid
                    # Update the environment variable value
                    Invoke-RestMethod -Method Patch -Uri "$DataverseUrl/api/data/v9.2/environmentvariablevalues($envVarValueId)" -Headers @{
                        Authorization = "Bearer $accessToken"
                        "Content-Type" = "application/json"
                    } -Body (@{ value = $env_value } | ConvertTo-Json -Depth 1)
                    Write-Host "Environment variable updated with name $env_key and value $env_value" -ForegroundColor Green
                } else {
                    Write-Host "Environment variable value not found for $env_key. Skipping..." -ForegroundColor Red
                }
            } 
            else {
                Write-Host "Environment variable definition not found for $env_key. Skipping..." -ForegroundColor Yellow
            }
      }
      catch {
            Write-Host "Failed to update environment variable $env_key. Error: $($_)" -ForegroundColor Red
            throw $_  # Re-throw the error to stop the script if this step is critical
        }
    
    }
    
    function update_EnvironmentVariablesForExpense {
            param (
            [string]$accessToken   # Access token for authentication
        )
    
        write-host "Updating environment variables..." -ForegroundColor Yellow
    
        try 
        {
            update-EnvironmentVaribleValue -accessToken $accessToken -env_key "msdyn_ExpenseFnoInstanceUrl" -env_value $D365FinanceAndOperationsUrl
            update-EnvironmentVaribleValue -accessToken $accessToken -env_key "msdyn_ExpenseAgentOutlookFolderPath" -env_value $OutlookFolderPath
            update-EnvironmentVaribleValue -accessToken $accessToken -env_key "msdyn_ExpenseAgentMailboxAddressId" -env_value $MailboxAddressId
            
        }
        Catch {
            Write-Host "Failed to update environment variables. Error: $($_)" -ForegroundColor Red -ErrorAction Stop
        }
    }
    
    # Function to publish the solution
    function Publish-Solution {
        param (
            [string]$accessToken
        )
    
        Write-Host "Publishing All" -ForegroundColor Yellow
    
        # Construct the API endpoint for publishing the solution
        $uri = "$DataverseUrl/api/data/v9.2/PublishAllXml"
    
    
        # Make the API call
        try {
            Invoke-RestMethod -Method Post `
                -Uri $uri `
                -Headers @{
                    Authorization = "Bearer $accessToken"
                    "Content-Type" = "application/json"
                }
    
            Write-Host "Publish All - Success!" -ForegroundColor Green
        } catch {
            Write-Host "Failed to publish. Error: $($_.Exception)" -ForegroundColor Red
            
        }
    }
    
    function Get-FlowGuidByName {
        param (
            [string]$accessToken,   # Access token for authentication
            [string]$flowName       # Name of the flow to search for
        )
    
        #Write-Host "Retrieving GUID for flow: $flowName" -ForegroundColor Yellow
    
        # Construct the API endpoint with a filter for the flow name
        $encodedFlowName = [System.Web.HttpUtility]::UrlEncode($flowName)
        $uri = "$DataverseUrl/api/data/v9.2/workflows?$filter=name eq '$encodedFlowName'"
    
        try {
            # Make the API call
            $response = Invoke-RestMethod -Method Get `
                -Uri $uri `
                -Headers @{
                    Authorization = "Bearer $accessToken"
                    "Content-Type" = "application/json"
                }
    
            # Check if the flow was found
            if ($response.value.Count -gt 0) {
                $flow = $response.value[0]
                Write-Host "Flow found: $($flow.name) with GUID: $($flow.workflowid)" -ForegroundColor Green
                return $flow.workflowid
            } else {
                Write-Host "No flow found with the name: $flowName" -ForegroundColor Red
                return $null
            }
        } catch {
            Write-Host "Failed to retrieve flow GUID. Error: $($_.Exception.Message)" -ForegroundColor Red
            return $null
        }
    }
    
    
    # Function to activate a Power Automate flow
    function Activate-Flow {
        param (
            [string]$DataverseUrl,  # Dataverse environment URL
            [string]$accessToken,   # Access token for authentication
            [string]$flowId         # GUID of the flow to activate
        )
    
        # Construct the request body
        $body = @{
            "statecode" = 1  # Activated
            "statuscode" = 2 # Activated
        } | ConvertTo-Json -Depth 1 -Compress
    
        # Construct the API endpoint
        $uri = "$DataverseUrl/api/data/v9.2/workflows($flowId)"
    
        # Make the API call
        try {
            Invoke-RestMethod -Method Patch `
                -Uri $uri `
                -Headers @{
                    Authorization = "Bearer $accessToken"
                    "Content-Type" = "application/json"
                } `
                -Body $body
    
            Write-Host "Flow activated successfully." -ForegroundColor Green
        } catch {
            Write-Host "Failed to activate flow. Error: $($_.Exception.Message)" -ForegroundColor Red
        }
    }
    
    function Get-ConnectionRefIdFromLogicalName  {
        param (
            [string]$accessToken,
            [string]$connectionRefLogicalName
        )
        $uri = "$DataverseUrl/api/data/v9.2/connectionreferences?$filter=connectionreferencelogicalname eq '$connectionRefLogicalName'"
        $response = Invoke-RestMethod -Method Get `
        -Uri $uri `
        -Headers @{
            Authorization = "Bearer $accessToken"
            "Content-Type" = "application/json"
        }
    
        if ($response -ne $null) {
            write-host "Connection reference id found: $($response.value[0].connectionreferenceid) " -ForegroundColor Green
            return $response.value[0].connectionreferenceid
        }
        else {
            Write-Host "No connection reference found for logical name: $connectionRefLogicalName" -ForegroundColor Red
            return $null
        }
    }
    
    function Get-ConnectionId {
        param (
            [string]$userProvidedName,
            [string]$providerName
        )
    
        try {
            $matchedConnectionId = $null
            # Added -ErrorAction Stop to ensure the catch block is triggered on failure
            $connections = Get-PowerAppConnection -EnvironmentName $DataverseEnvironmentId -ConnectorNameFilter $providerName -ErrorAction Stop
            
            foreach ($con in $connections) {
                if (($con.ConnectionName -eq $userProvidedName) -or ($con.DisplayName -eq $userProvidedName)) {
                    $matchedConnectionId = $con.ConnectionName
                    break
                }
            }
    
            if ($null -eq $matchedConnectionId) {
                # Use 'throw' to create a terminating error that the calling function can catch
                throw "Unable to find connection '$userProvidedName' for provider '$providerName'."
            }
    
            return $matchedConnectionId
        }
        catch {
            # Catch any errors from Get-PowerAppConnection or the 'throw' statement above
            Write-Error "Failed to get connection ID for '$userProvidedName'. Error: $_"
            throw # Re-throw the error to stop the script if this step is critical
        }
    }
    
    function Get-ConnectionReferenceId {
        param(
            [string]$connectionReferenceLogicalName,
            [securestring]$accessToken
        )
    
        try {
            $uri = "$DataverseUrl/api/data/v9.2/connectionreferences?$filter=connectionreferencelogicalname eq '$connectionReferenceLogicalName'"
            
            # Added -ErrorAction Stop for clarity, though Invoke-RestMethod often terminates on HTTP errors
            $response = Invoke-RestMethod -Method Get -Uri $uri -Authentication Bearer -Token $accessToken -ContentType 'application/json' -ErrorAction Stop
                
            if ($null -eq $response -or $response.value.Count -eq 0) {
                throw "Connection reference not found for logical name '$connectionReferenceLogicalName'."
            }
    
            $connectionReferenceDisplayName = $response.value[0].connectionreferencedisplayname
            $connectionReferenceId = $response.value[0].connectionreferenceid
    
            Write-Host "updating connection $connectionReferenceDisplayName for logical name $connectionReferenceLogicalName)"
            return $connectionReferenceId
        }
        catch {
            Write-Error "Failed to get connection reference ID for '$connectionReferenceLogicalName'. Error: $_"
            throw # Re-throw to notify the calling function
        }
    }
    
    function Set-ConnectionReferenceConnection {
        param (
            [string]$connectionReferenceLogicalName,
            [string]$userProvidedConnectionName,
            [string]$providerName,
            [securestring]$accessToken
        )
    
        try {
    
            # These functions will now throw terminating errors if they fail
            $connectionReferenceId = Get-ConnectionReferenceId -connectionReferenceLogicalName $connectionReferenceLogicalName -accessToken $accessToken
            $connectionId = Get-ConnectionId -userProvidedName $userProvidedConnectionName -providerName $providerName
    
            $body = @{
                "connectionid" = "$connectionId"
            } | ConvertTo-Json -Depth 1
    
            $uri = "$DataverseUrl/api/data/v9.2/connectionreferences($connectionReferenceId)"
            # Write-Host "Updating connection reference URI: $uri with connection id $connectionId"
    
            Invoke-RestMethod -Method Patch -Uri $uri -Authentication Bearer -Token $accessToken -ContentType 'application/json' -Body $body -ErrorAction Stop
        
            Write-Host "Connection reference updated successfully." -ForegroundColor Green
        }
        catch {
            # This block will catch errors from any of the functions called within the try block
            Write-Error "Failed to set connection reference for '$connectionReferenceLogicalName'. Error: $_"
            throw
        }
    }
    
    function Activate-Flows {
        param (
            [string]$accessToken,
            [array]$expenseAIFlows
        )
    
        foreach ($flowName in $expenseAIFlows) {
             Write-Host "Activating flow: $flowName" -ForegroundColor Yellow
    
            # Call the Get-FlowGuidByName function to get the flow GUID
            $flowGuid = Get-FlowGuidByName -dataverseUrl $DataverseUrl -accessToken $accessToken -flowName $flowName
    
            if ($flowGuid -ne $null) {
                # Write-Host "Flow Name: $flowName, Flow GUID: $flowGuid" -ForegroundColor Green
                Activate-Flow -dataverseUrl $DataverseUrl -accessToken $accessToken -flowId $flowGuid
                # Write-Host "Flow Name: $flowName, Flow GUID: $flowGuid Activated" -ForegroundColor Green
            } else {
                Write-Host "Flow Name: $flowName not found." -ForegroundColor Red
            }
        }
    }
    
    
    # Function to retrieve the Agent ID by name
    function Get-AgentIdBySchemaName {
        param (
            [string]$DataverseUrl,
            [string]$accessToken,
            [string]$agentSchemaName
        )
    
        Write-Host "Retrieving agent ID for agent schema: $agentSchemaName" -ForegroundColor Yellow
    
        # Construct the API endpoint to retrieve the bot
        $uri = "$DataverseUrl/api/data/v9.2/bots?$filter=schemaname eq '$agentSchemaName'"
    
        try {
            # Make the API call
            $response = Invoke-RestMethod -Method Get -Uri $uri -Headers @{
                Authorization = "Bearer $accessToken"
                "Content-Type" = "application/json"
            }
    
            if ($response.value.Count -gt 0) {
                $agentId = $response.value[0].botid
                return $agentId
            } else {
                Write-Host "No agent found with the name: $agentSchemaName" -ForegroundColor Red
                return $null
            }
        } catch {
            Write-Host "Failed to retrieve agent ID. Error: $($_)" -ForegroundColor Red
            return $null
        }
    }
    
    function Check-BotSyncErrors {
            param (
            [string]$DataverseUrl,
            [string]$accessToken,
            [string]$botId
        )
    
        Write-Host "Retrieving Sync Status for bot ID: $botId" -ForegroundColor Yellow
    
        # Construct the API endpoint to retrieve the bot
        $uri = "$DataverseUrl/api/data/v9.2/bots($botId)"
        try {
            # Make the API call
            $response = Invoke-RestMethod -Method Get -Uri $uri -Headers @{
                Authorization = "Bearer $accessToken"
                "Content-Type" = "application/json"
            }
    
            if ($null -ne $response.synchronizationstatus) {
                # Parse the JSON string in synchronizationstatus
                $syncStatusObj = $response.synchronizationstatus | ConvertFrom-Json
                $state = $syncStatusObj.currentSynchronizationState.state
                $provisioningStatus = $syncStatusObj.currentSynchronizationState.provisioningStatus
    
                Write-Host "Synchronization State: $state" -ForegroundColor Green
                Write-Host "Provisioning Status: $provisioningStatus" -ForegroundColor Green
    
                if ( $state -contains "Error" -or $provisioningStatus -contains "Error") {
                    Write-Host "Bot has synchronization errors." -ForegroundColor Red
                    return 0
                } else {
                    if ( $state -eq "Synchronized" -or $state -eq 'Synchronizing' -and ($provisioningStatus -eq  "Provisioned" -or $provisioningStatus -eq  "ProvisionedWithoutRegistration")) {
                        Write-Host "Bot synchronization is done." -ForegroundColor Yellow
                        return 1
                    } else {
                        Write-Host "Bot synchronization is in progress." -ForegroundColor Green
                        return 2
                    }
                }
            } else {
                Write-Host "No synchronization status found for bot ID: $botId" -ForegroundColor Red
                return $null
            }
        } catch {
            Write-Host "Failed to retrieve agent ID. Error: $($_)" -ForegroundColor Red
            return $null
        }
    }
    
    
    # Function to provision a PVA bot
    function Provision-Agent {
        param (
            [string]$DataverseUrl,
            [string]$accessToken,
            [string]$agentId
        )
    
        # Construct the API endpoint for publishing the bot
        $uri = "$DataverseUrl/api/data/v9.2/bots($agentId)/Microsoft.Dynamics.CRM.PvaProvision"
    
        try {
            # Make the API call
            Invoke-RestMethod -Method Post -Uri $uri -Headers @{
                Authorization = "Bearer $accessToken"
                "Content-Type" = "application/json"
            }
    
            Write-Host "Agent Provisioning successfully!" -ForegroundColor Green
            # Add 30 second delay to allow the publish process to complete
            Start-Sleep -Seconds 30
            return $true
        } catch {
            Write-Host "Failed to Provision Agent. Error: $($_.Exception.Message)" -ForegroundColor Red
        }
        return $false
    }
    
    
    # Function to publish a PVA bot
    function Publish-Agent {
        param (
            [string]$DataverseUrl,
            [string]$accessToken,
            [string]$agentId
        )
    
        Write-Host "Publishing agent with ID: $agentId" -ForegroundColor Yellow
    
        # Construct the API endpoint for publishing the bot
        $uri = "$DataverseUrl/api/data/v9.2/bots($agentId)/Microsoft.Dynamics.CRM.PvaPublish"
    
        try {
            # Make the API call
            Invoke-RestMethod -Method Post -Uri $uri -Headers @{
                Authorization = "Bearer $accessToken"
                "Content-Type" = "application/json"
            }
    
            Write-Host "Agent published successfully!" -ForegroundColor Green
            # Add 30 second delay to allow the publish process to complete
            Start-Sleep -Seconds 30
        } catch {
            Write-Host "Failed to publish Agent. Error: $($_.Exception.Message)" -ForegroundColor Red
        }
    }
    
    function Publish-Agents {
        param (
            [string]$accessToken,
            [array]$agentSchemas
        )
    
        if (-not $agentSchemas -or $agentSchemas.Count -eq 0) {
            Write-Host "No agent schemas provided. Skipping agent publishing." -ForegroundColor Yellow
            return
        }
    
        foreach ($agentSchema in $agentSchemas) {
            #Write-Host "Publishing agent schema: $agentSchema" -ForegroundColor Yellow
    
            try {
                    # Construct the API endpoint for publishing the agent schema
                    $agentId = Get-AgentIdBySchemaName -dataverseUrl $DataverseUrl -accessToken $accessToken -agentSchemaName $agentSchema
    
                    if ($agentId -ne $null) {
                        # check for sync errors
                        if ($CheckBotSyncStatusAndProvisionBots) {
                            $syncStatus = Check-BotSyncErrors -dataverseUrl $DataverseUrl -accessToken $accessToken -botId $agentId
                            if (0 -eq $syncStatus) {
                                Write-Host "Agent has sync errors. Skipping the publish process. Please check the bot: $agentId details" -ForegroundColor Red
                                continue
                            } elseif (2 -eq $syncStatus) {
                                Write-Host "Agent synchronization is still in progress. reprovisioning the agent." -ForegroundColor Yellow
                                if (Provision-Agent -dataverseUrl $DataverseUrl -accessToken $accessToken -agentId $agentId -eq $false) {
                                    Write-Host "Agent reprovisioning failed. Skipping the publish process. Please check the bot: $agentId details" -ForegroundColor Red
                                    continue
                                }
                            } else {
                                Write-Host "Agent synchronization is done. Proceeding to publish." -ForegroundColor Green
                            }
                        }
                        # Step 4: Publish the bot
                        Publish-Agent -dataverseUrl $DataverseUrl -accessToken $accessToken -agentId $agentId
                    } else {
                        Write-Host "Agent not found. Cannot proceed with publishing.Skipping the step" -ForegroundColor Yellow
                    }
            }
            catch {
                Write-Host "An error occurred while publishing agent schema: $agentSchema. Error: $_" -ForegroundColor Red
            }
        }
    
    }
    
    
    # Main script execution
    try {
    
        $expenseAIFlows = $flows
        $agentSchemas = $agents
    
        # Step 1: Interactive login to Azure
        Connect-AzAccount -UseDeviceAuthentication
        $accessToken = Get-AccessToken
        $accessTokenPlainText = Get-AccessTokenPlainText -accessToken $accessToken
    
        # Step 2: Setup ennviornment variables
        update_EnvironmentVariablesForExpense -accessToken $accessTokenPlainText 
        Write-Host "Environment variables updated successfully!" -ForegroundColor Green
    
        # Step 3: Check active connections
        Set-ConnectionReferenceConnection -userProvidedConnectionName $MicrosoftDataverseConnectionName -providerName "/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps" -connectionReferenceLogicalName "msdyn_sharedcommondataserviceforapps_2c2d4" -accessToken $accessToken
    
        Set-ConnectionReferenceConnection -userProvidedConnectionName $MicrosoftCopilotStudioConnectionName -providerName "/providers/Microsoft.PowerApps/apis/shared_microsoftcopilotstudio" -connectionReferenceLogicalName "msdyn_sharedmicrosoftcopilotstudio_26d9d" -accessToken $accessToken
    
        Set-ConnectionReferenceConnection -userProvidedConnectionName $Office365OutlookConnectionName -providerName "/providers/Microsoft.PowerApps/apis/shared_office365" -connectionReferenceLogicalName "msdyn_sharedoffice365_9b471" -accessToken $accessToken
    
        Set-ConnectionReferenceConnection -userProvidedConnectionName $MicrosoftTeamsConnectionName -providerName "/providers/Microsoft.PowerApps/apis/shared_teams" -connectionReferenceLogicalName "msdyn_sharedteams_8ea9c" -accessToken $accessToken
    
        Set-ConnectionReferenceConnection -userProvidedConnectionName $Office365UsersConnectionName -providerName "/providers/Microsoft.PowerApps/apis/shared_office365users" -connectionReferenceLogicalName "msdyn_sharedoffice365users_909b9" -accessToken $accessToken
        
    
        # Step 4: Activate flows
        Activate-Flows -accessToken $accessTokenPlainText -expenseAIFlows $expenseAIFlows
    
        # step 5: publish the agents
        Publish-Agents -accessToken $accessTokenPlainText -agentSchemas $agentSchemas
    
        # Step 6: Publish the solution 
        Publish-Solution -accessToken $accessTokenPlainText
    
        Write-Host "Agent setup completed successfully!" -ForegroundColor Green
    
    } catch {
        Write-Host "An error occurred: $_" -ForegroundColor Red
    }
    
    

    Følg disse trin for at udløse PowerShell-filen:

    1. Åbn PowerShell (minimumversion kræves – PowerShell 7).
    2. Gå til den placering, hvor du gemte filen. (Brug kommandoen cd-<filplacering>).
    3. Udløs installationsscriptet. (Brug kommandoen '.\Install.ps1').
    4. Følg vejledningen for at logge på Azure.
    5. Når du har logget på, skal du muligvis godkende igen. Brug bruger-id'et for den oprettede agent.

    Vent på, at scriptet kører helt, og se efter, om konfigurationen af agenten blev fuldført!

    Notat

    Følgende handlinger udføres i det foregående script:

    • Angiver miljøvariabler.
    • Kontrollerer og linker forbindelsesreferencer.
    • Aktiverer Power Automate-flow.
    • Udgiver de nødvendige Copilot-agenter.
    • Publicerer Dataverse-løsningen.

    Når scriptet er kørt, er udgiftsagenten fuldt ud konfigureret og klar til brug.

    Mulighed B: Konfigurer manuelt i Power Apps (ingen PowerShell)

    Hvis du ikke vil bruge PowerShell-scriptet, kan du konfigurere Udgiftsagent manuelt via Power Apps. Denne proces omfatter opdatering af miljøvariabler, aktivering af Power Automate-flow og publicering af løsningen.

    Opdater miljøvariabler

    Følg disse trin for at opdatere miljøvariabler:

    1. Log på Power Apps, og vælg miljøet.

    2. Vælg Løsninger, og åbn derefter Standardløsning (eller den løsning, hvor agenten er installeret).

    3. Gå til Miljøvariabler, og angiv følgende værdier.

      Variabelt navn Beskrivelse
      Sti til Outlook-mappe for omkostningsagent Angiv den mappesti, der skal overvåges i den delte postkasse (som standard Indbakke).
      Adresse-id til Udgiftsagent med delt postkasse Angiv mailadressen for den delte postkasse. Hvis du vil bruge postkassen for den bruger, der er logget på, skal du angive NA.
      URL-adresse til forekomst for finans og drift Angiv URL-adressen til miljøet for programmer til finans og drift (f.eks. https://org123.contoso.com).

    Aktivér Power Automate-flow

    Udgiftsagenten er afhængig af følgende Power Automate-flow:

    • Kontrol af nyt forsøg på udgiftspost
    • Udgiftskonfiguration
    • Hent Outlook-udgiftsmappe
    • Generér udgiftsrapport
    • Send udgiftsrapport som adaptivt kort
    • Tilpas automatisk udgifter
    • Behandling af e-mails
    • Udtræk ikke-vedhæftede kvitterings-id'er til aktivering af copilot
    • Udtræk ikke-tilknyttet kvitteringsoutput ved hjælp af Dataverse-plug-in
    • Generér udgiftslinje
    • Generér udgiftslinje uden projekt-id og status-id
    • Identificer projekt-id'er
    • Brugerens kalenderbegivenheder
    • Behandl udgiftsrapport ved hjælp af copilot
    • Aktivér udgiftsagent til modtagelsesbehandling

    Følg disse trin for at aktivere flowene:

    1. Log på Power Automate, og vælg miljøet.

    2. Vælg Mine flows.

    3. Følg disse trin for hvert af de 15 flow på den forrige liste:

      1. Find flowet.
      2. Vælg Rediger.
      3. Skift til visningen Gammel designer ved at deaktivere indstillingen Ny designer.
      4. Godkend alle påkrævede forbindelser (indtil der vises grønne markeringer).
      5. Vælg Fortsæt, og vælg derefter Gem.
      6. Vælg Slå til for at aktivere flowet.

    Publicer løsningen

    Når du er færdig med at konfigurere alle miljøvariabler og flow, skal du følge disse trin for at publicere løsningen.

    1. I Power Apps skal du gå til Løsninger.
    2. Vælg dit miljø og din løsning.
    3. Vælg Publicer alle tilpasninger.

    Når du har fuldført disse trin, er Udgiftsagent fuldt konfigureret og klar til brug.

    Trin 6: Aktivér udgiftsagenten i Microsoft Teams (valgfrit)

    Hvis du vil aktivere Teams-baseret kommunikation for Udgiftsagent, skal du føje Teams-kanalen til agenten i Power Apps. Agenten kan derefter sende adaptive kort via Teams.

    Aktivér Teams-kanalen

    Følg disse trin for at aktivere Teams-kanalen:

    1. Log på Copilot Studio, og vælg det korrekte miljø.
    2. Under fanen Agenter skal du vælge Udgiftspostagent.
    3. I agentvisningen under fanen Kanaler skal du vælge Teams og Microsoft 365 Copilot.
    4. Vælg Tilføj kanal for at aktivere Teams-integration, og følg trinnene i afsnittet Konfigurere tilgængelighed af Teams-appen for at konfigurere, hvem du vil dele appen med.

    Få mere at vide i Åbne konfigurationspanelet for Teams + Microsoft 365-kanalen.

    Konfigurer tilgængelighed af Teams-app

    Hvis du vil konfigurere tilgængeligheden af Teams-appen, skal du følge disse trin:

    1. Når Teams-appen er oprettet, skal du vælge Tilgængelighedsindstillinger.

    2. Vælg, hvem du vil dele appen med:

      • Specifikke brugere i organisationen
      • Hele organisationen
    3. Send appen til godkendelse.

    Publicer appen i Teams Administration

    Hvis du vil publicere appen i Teams Administration, skal du følge disse trin:

    1. Log på Teams Administration.
    2. Gå til Teams-appen > Administrer apps. Søg efter "udgift", og vælg appen Udgiftsindtastningsagent, hvor appstatus er blokeret.
    3. Vælg Udgiv for at fjerne blokeringen af appen. Når publiceringshandlingen er fuldført, skal du sikre dig, at appstatus ændres til ikke-blokeret.

    Få mere at vide i Opret forbindelse og konfigurer en agent til Teams og Microsoft 365.

    Når disse trin er fuldført, er din Udgiftsagent nu fuldt konfigureret og klar til brug.

    Notat

    Du kan også give feedback om agentoprettede udgiftslinjer og rapporter ved hjælp af ikonerne for tommelfinger op/ned og pop op-vinduet feedback i Dynamics 365 Finance-miljøet.

    Fjern udgiftsagent

    Hvis du vil fjerne Udgiftsagent, skal du følge disse trin:

    1. Log på Microsoft Power Apps-udviklerportalen.
    2. Vælg Løsninger, søg efter msdyn_ExpenseAI, vælg de tre prikker, og vælg Slet.
    3. Søg efter msdyn_FnOCopilotAnchor , og slet løsningen.