Partajați prin


Configurarea Agentului de Cheltuieli (Previzualizare)

Importantă

Se aplică la Dynamics 365 Project Operations integrat cu ERP și Dynamics 365 Project Operations pentru producție

Expense Agent reunește capabilități din Microsoft Dynamics 365 Project Operations, aplicații financiare și operațiuni, Microsoft Copilot Studio, Power Automate și Dataverse pentru a automatiza fluxurile de lucru de procesare a cheltuielilor utilizând AI. Această funcție ajută la economisirea timpului și la reducerea efortului manual, permițând sistemului tău să proceseze chitanțe și să genereze linii de cheltuieli și rapoarte de cheltuieli pentru utilizatori. Utilizează conectori Microsoft Power Platform pentru integrarea cu Outlook, Microsoft Teams, calendarele utilizatorilor și mediul aplicațiilor financiare și operaționale prin entități virtuale Dataverse.

Agentul de cheltuieli include mai multe fluxuri, dintre care trei servesc ca orchestratori de bază:

  • Procesare e-mailuri – Acest flux scanează un folder de cutie poștală configurat la fiecare oră și stochează atașările ca chitanțe neatașate în Dynamics 365 Finance.
  • Extrageți ID-urile de chitanțe – Acest flux preia chitanțele neatașate și declanșează agentul să extragă detaliile chitanței și să creeze o linie de cheltuieli neatașată.
  • Raport de cheltuieli de proces – Acest flux convertește liniile de cheltuieli neatașate și generează rapoarte de cheltuieli, bazate pe rapoartele grupului pe configurație , pe care le setați în aplicație pentru fiecare entitate juridică.

În plus, agentul se integrează cu Microsoft Teams, permițând utilizarea cardurilor adaptive pentru revizuirea și trimiterea rapoartelor de cheltuieli.

Agentul se bazează pe mai mulți conectori Microsoft Power Platform. Acești conectori sunt menționați automat în fluxurile Power Automate furnizate.

  • Outlook (Office 365) – Acest conector accesează cutia poștală partajată pentru a extrage chitanțele.
  • Dataverse (Entități virtuale) – Acest conector se integrează cu aplicațiile financiare și operaționale prin entități virtuale.
  • Microsoft Copilot Studio – Acest conector invocă modele AI pentru a extrage informațiile de primire.
  • Microsoft Teams – Acest conector trimite carduri adaptive pentru interacțiunile utilizatorului (dacă integrarea Teams este activată).
  • Utilizatori Microsoft 365 – Acest conector preia detaliile calendarului utilizatorului (opțional, dacă analizarea chitanțelor este conștientă de context).

Cerințe preliminare

  1. Mediul financiar și operațional: Ai nevoie de cel puțin versiunea 10.0.44 (10.0.2263.167 și ulterioare) sau 10.0.45 (10.0.2345.102 și ulterioare) a mediului financiar și operațional pentru a instala agentul.
  2. Roluri necesare pentru a configura utilizatorul Excost Agent: Pentru a finaliza pașii din acest articol, trebuie să fii administratorul de sistem al organizației și să ai următoarele roluri pentru a configura utilizatorul agentului de cheltuieli pentru instalarea agentului de cheltuieli.
Sistemul Role Comentarii
Centrul de administrare Power Platform Administrator de sistem
  1. Accesați centrul de administrare Power Platform
  2. Accesați Gestionare în panoul din stânga. Selectați Medii, apoi selectați mediul dvs.
  3. În secțiunea Accesați>utilizatori , selectați Vedeți tot.
  4. Selectați un utilizator, apoi selectați Gestionare roluri și adăugați rolul.
Finanțe și operațiuni Administrator de sistem
  1. Deschideți URL-ul de finanțe și operațiuni pentru mediul de mediu.
  2. Accesați Modul>Utilizatori de administrare>a sistemului și selectați un utilizator.
  3. Selectați Adăugare rol – Administrator de sistem.
Microsoft 365 Administrator Exchange și administrator utilizator
  1. Accesați Microsoft 365 centrul de administrare.
  2. Accesați Utilizatori>activi Utilizatori> selectați utilizatorul.
  3. Selectați Gestionare roluri, apoi din Roluri selectați Administrator Exchange.
  4. Salvați modificările.
  5. Urmați aceiași pași pentru a adăuga rolul de administrator utilizator .
Centrul de administrare Teams Administratorul echipelor Necesar dacă intenționați să activați integrarea Microsoft Teams

Pași pentru configurarea agentului de cheltuieli

Pentru a instala și configura Excost Agent, urmează acești pași:

  1. Instalați Copilot pentru aplicații financiare și operaționale.
  2. Activați caracteristicile agentului în mediul dvs.
  3. Creați un utilizator de cheltuieli pentru execuția agentului.
  4. Configurați o cutie poștală partajată.
  5. Configurați Expense Agent.
  6. Activați Expense Agent în Microsoft Teams (opțional - dacă aveți nevoie de integrare Microsoft Teams)

Secțiunile următoare descriu fiecare pas în detaliu.

Pasul 1: Instalați Copilot pentru aplicații financiare și operaționale

Expense Agent este disponibil ca parte a pachetului de aplicații Copilot pentru finanțe și operațiuni. După ce instalezi acest pachet în mediul tău, primești automat toate resursele necesare, inclusiv agentul, variabilele de mediu și fluxurile Power Automate.

Pentru a instala aplicația necesară, urmează acești pași:

  1. Accesați centrul de administrare Power Platform din browser.
  2. Din lista de medii, selectați numele mediului în care doriți să instalați aplicația.
  3. Pe pagina de detalii a mediului (NU din navigarea din stânga), mergi la secțiunea Resurse și selectează aplicații Dynamics 365.
  4. Căutați Copilot pentru aplicații de finanțe și operațiuni în lista de aplicații Dynamics 365. Dacă este deja instalat și este disponibilă o actualizare, selectați butonul Actualizare .
  5. Dacă aplicația nu este listată sub Aplicații Dynamics 365, selectați Instalare aplicație, selectați Copilot pentru aplicații financiare și operațiuni și urmați instrucțiunile pentru a finaliza instalarea.

Notă

Aflați mai multe despre cum să activați Copilot în mediul dvs., în Activarea capacităților Copilot în aplicațiile financiare și de operațiuni.

Sfat

Pentru a verifica dacă pachetul a fost instalat cu succes, urmează acești pași:

  1. Accesați portalul > de creare Power Apps, selectați mediul > , selectați Soluții > Vedeți istoricul > , căutați și selectați msdyn_ExpenseAI > Detalii.
  2. Verifică câmpul Rezultat .
    1. Dacă rezultatul arată Succes, pachetul a fost instalat corect.
    2. Dacă rezultatul nu afișează Succes, instalarea a eșuat.
  3. Dacă instalarea eșuează, ștergeți msdyn_FnOCopilotAnchor (vezi secțiunea de dezinstalare) și instalează din nou Copilot pentru aplicațiile de finanțe și operațiuni.

Pasul 2: Activați caracteristicile agentului în mediul dvs.

După ce instalezi pachetul Copilot pentru aplicații de finanțe și operațiuni, activează Agentul de Cheltuieli din interiorul Dataverse și din mediul tău financiar și operațional.

Activați funcția în Dataverse

Activează flag-ul de funcție Copilot în centrul de administrare Power Platform. Pentru a activa flag-ul caracteristicii Copilot, urmează acești pași:

  1. Accesați centrul de administrare Power Platform.
  2. Selectați Medii,> selectați mediul dvs.>, Setări,>Produs>, selectați Caracteristici.
  3. Confirmați că indicatorul caracteristicii Copilot este activat.

Activați funcția în mediul financiar și operațional

Pentru a activa agentul în aplicațiile de finanțe și operațiuni, urmează acești pași:

  1. Conectați-vă la mediul financiar și operațional.
  2. Accesați Gestionarea caracteristicilor și activați funcția Pornire imersivă și Gestionarea agenților .
  3. Pentru a configura Expense Agent (configurarea este pentru fiecare entitate juridică), accesați Setări de gestionare> a cheltuielilorParametrii>generali>de gestionare a cheltuielilor.
  4. Pe fila Agent de intrare a cheltuielilor , configurați parametrii așa cum se arată în tabelul următor.
Parametri Valoare Comentarii
Activați Expense Agent pentru entitatea juridică curentă Da Comutați la Da pentru a activa agentul pentru entitatea juridică curentă.
Frecvență Zilnic sau săptămânal Configurați frecvența pentru crearea automată a rapoartelor de cheltuieli în organizația dvs.
Rapoarte de grup de Călătorie sau proiect Configurați pentru a grupa cheltuielile în funcție de un proiect sau o călătorie.

Pasul 3: Creează un utilizator de agent de cheltuieli pentru execuția agentului

Creați un utilizator dedicat agentului de cheltuieli pentru a vă asigura că agentul funcționează independent de identitatea oricărui angajat. Această abordare ajută la securitate, gestionabilitate și întreținere pe termen lung. Deși poți folosi un cont de utilizator existent care are privilegiile necesare, folosește o identitate deținută de sistem.

Creează utilizatorul Expense Agent în Microsoft Entra ID

  1. Conectați-vă la portalul Azure.
  2. Din serviciile Azure disponibile, selectați Microsoft Entra ID.
  3. Sub Microsoft Entra ID, creați un utilizator nou.
  4. Selectați Adăugare>utilizator>Creați un utilizator nou și introduceți următoarele detalii.
    • Nume principal utilizator
    • Alegeți domeniul potrivit
    • Nume afișat
    • Parolă
    • Marcați contul activat
  5. Pentru a vizualiza detaliile și a finaliza procesul de creare a utilizatorului, selectați Revizuire + creare și selectați Creare.
  6. Din pagina Utilizator (Gestionare > utilizatori), selectați un utilizator și vizualizați pagina cu detalii.
  7. Selectați Editare proprietăți, navigați la fila Setări și completați locația de utilizare corespunzătoare.

Notă

În funcție de politica organizației dvs., poate fi necesar să vă schimbați parola și să configurați autentificarea multifactor (MFA). Urmați pașii ca în mod normal pentru schimbarea parolei și configurarea MFA.

Atribuirea licențelor necesare utilizatorului Expense Agent

Pentru a instala cu succes Expoint Agent, atribuiți următoarele licențe utilizatorului agentului de cheltuieli:

  • Licență Dynamics 365 Teams Members
  • Microsoft 365 Business Basic sau orice licență care acoperă Microsoft Teams și Outlook (de exemplu, Office 365 E5 cu echipe)
  • Power Apps Premium

Pentru a atribui licențe, urmează acești pași:

  1. Conectați-vă la Centrul de administrare Microsoft 365 cu un utilizator care are acces pentru a atribui licențe care este un utilizator cu Administrator de licențe sau o versiune ulterioară.
  2. Selectați Licențe de facturare>licență>Dynamics 365 Teams Members.
  3. Selectați +Atribuire licențe.
  4. Căutați utilizatorul agentului de cheltuieli creat la pasul anterior.
  5. Selectați Atribuire pentru a finaliza atribuirea licenței.
  6. Urmați pașii de la 2 la 5 pentru celelalte licențe – Microsoft 365 Business Basic și Power Apps Premium, de asemenea.

Notă

Aflați mai multe despre cum să verificați și să atribuiți licențe în Utilizați pagina Utilizatori activi pentru a atribui sau anula atribuirea licențelor.

Adăugarea utilizatorului la mediul Power Platform

Pentru a adăuga utilizatorul în mediul Power Platform, urmează acești pași:

  1. Conectați-vă la centrul de administrare Power Platform și selectați mediul corespunzător.

    Sfat

    Această pagină oferă informații legate de ID-ul de mediu pentru Dataverse, URL-ul de mediu pentru Dataverse, URL-ul de finanțe și operațiuni. Stocați aceste valori pentru a le utiliza în secțiunile ulterioare.

  2. Accesați Accesați > utilizatorii > Vedeți tot.

  3. Selectați Adăugare utilizator, introduceți utilizatorul agent nou creat și selectați Adăugare.

  4. Pe pagina Gestionează rolurile de securitate, adaugă următoarele roluri.

    • Rolul agentului AI de cheltuieli
    • Manager de configurare a agentului de finanțe și operațiuni
    • Persoană care particularizează sistemul
  5. Pentru a confirma atribuirea rolurilor, selectați Salvare.

Aceste roluri oferă acces la componentele Dataverse și Power Automate de care agentul are nevoie pentru a funcționa.

Sfat

Dacă utilizatorul există deja și trebuie doar să atribui roluri, mergi la centrul de administrare Power Platform și selectează mediul potrivit.

  1. Accesați Accesați > utilizatorii > Vedeți tot.
  2. Selectați utilizatorul agent creat.
  3. Selectați Gestionare roluri și atribuiți rolurile.

Atribuiți rolul necesar în mediul financiar și operațional

Pentru a atribui rolul ExpenseAgentRole în mediul financiar și operațional, urmează următorii pași:

  1. În mediul financiar și operațiuni, accesați Utilizatori de administrare> sistem.
  2. Creați o înregistrare de utilizator pentru utilizatorul agent.
  3. După ce creezi utilizatorul, mergi la secțiunea rolurilor utilizatorului, selectează Atribuie roluri și caută ExpenseAgentRole.
  4. Selectați Salvați.

Notă

ExpenseAgentRole este disponibil în versiunea aplicațiilor de finanțe și operațiuni de la 10.0.44 (10.0.2263.81) și 10.0.45 (10.0.2345.6) și cu Copilot pentru aplicații financiare și operațiuni versiunea 1.0.3121.1

Atribuirea accesului la accesul la cutia poștală partajată

Utilizatorul agent trebuie să aibă permisiunea Microsoft Graph Mail.Read.Shared. Această permisiune permite agentului să citească confirmările din cutia poștală partajată configurată în timpul execuției fluxului.

Pentru a atribui accesul la cutia poștală partajată, urmează acești pași:

  1. Mergi la Microsoft Graph Explorer și autentifică-te folosind utilizatorul agent creat.
  2. Selectați pictograma utilizatorului din colțul din dreapta > sus, selectați Consimțământul pentru permisiuni.
  3. Selectați meniul vertical pentru Mail> , căutați Mail.Read.Shared> , selectați Consimțământ și selectați Acceptare.

Rezumatul rolurilor necesare pentru utilizatorul agent creat

Mediu Roluri Comentarii
Dataverse
  • Rolul agentului AI de cheltuieli
  • Agent Configuration Manager pentru finanțe și operațiuni
  • Persoană care particularizează sistemul
  • Rolurile menționate permit agentului să interacționeze cu fluxurile Power Automate, variabilele de mediu și entitățile virtuale care sunt conectate la Dynamics 365 Finance
    Finanțe și operațiuni
  • ExpenseAgentRole
  • Utilizator sistem
  • Acest rol este necesar pentru ca agentul să creeze și să gestioneze înregistrările de cheltuieli în mediul aplicațiilor financiare și operaționale.

    Notă: ExpenseAgentRole este disponibil în versiunea aplicațiilor financiare și operaționale de la 10.0.44 (10.0.2263.81) și 10.0.45 (10.0.2345.6) și cu Copilot pentru aplicații financiare și operațiuni versiunea 1.0.3121.1
    Accesul la cutia poștală partajată utilizând Exploratorul grafic Mail.Read.Shared Permisiunea Microsoft Graph care permite agentului să citească confirmările din cutia poștală partajată configurată în timpul execuției fluxului

    Pasul 4: Configurați cutia poștală partajată

    Agentul de cheltuieli utilizează o cutie poștală partajată pentru a primi și procesa e-mailurile de primire. Un utilizator cu rolul de Administrator Exchange trebuie să creeze și să configureze această cutie poștală în Microsoft 365 Admin Center.

    Pentru a crea și configura cutia poștală partajată, urmează acești pași:

    1. Conectați-vă la Centrul de administrare Microsoft 365 utilizând un cont de administrator Exchange.

    2. În panoul din stânga, selectați Echipe și grupuri>cutii poștale partajate.

      Sfat

      S-ar putea să fie nevoie să selectezi Arată totul pentru a extinde lista completă.

    3. Selectați Adăugați o cutie poștală partajată.

    4. Introduceți un nume și o adresă de e-mail pentru cutia poștală partajată.

    5. Selectați Salvați modificările.

    6. Sub Pașii următori, selectați Adăugare membri la această cutie poștală partajată. (Managementul membrilor poate dura câteva minute pentru a deveni disponibil.)

    7. Selectați Adăugați membri

    8. Selectați utilizatorul agent creat și orice alte persoane care ar trebui să monitorizeze cutia poștală și selectați Adăugare.

    9. Selectați Închidere.

    Notă

    Folosești adresa de email a cutiei poștale partajate în pasul următor. După ce configurezi căsuța poștală partajată, trebuie să furnizezi adresa de email și calea folderului (implicit setată pe Inbox) ca variabile de mediu atunci când configurezi Agentul de Timp și Cheltuieli. Pentru mai multe informații, vezi Pasul 5: Configurarea Agentului de Cheltuieli.

    Pasul 5: Configurarea agentului de cheltuieli

    Aveți două opțiuni pentru configurarea agentului de cheltuieli:

    • Opțiunea A: Folosește un script PowerShell (recomandat)
    • Opțiunea B: Efectuați configurarea manuală în Power Apps (fără PowerShell)

    Importantă

    Înainte de a continua instalarea Excost Agent, asigurați-vă că agentul este aprovizionat cu succes în Microsoft Copilot Studio.

    Pentru a verifica că agentul este aprovizionat cu succes, urmează acești pași:

    1. Conectați-vă la Microsoft Copilot Studio și selectați mediul dvs.
    2. Accesați Agenți și căutați ExpenseAgent-Line (Previzualizare).
    3. Verifică dacă butonul Publish este activat.
    4. Dacă este activat, continuați cu instalarea. Dacă este dezactivat, așteptați până când agentul este furnizat.
    5. Repetați acești pași pentru a verifica dacă Expense Entry Agent (Previzualizare) este activat.

    Sfat

    Dacă aprovizionarea aplicației Copilot finance and operations durează mai mult de 5-6 ore, dezinstalează și reinstalează aplicația pentru a rezolva eventualele întârzieri în configurare. Pentru mai multe informații, consultați secțiunea Uninstall Expoint Agent la finalul acestui articol.

    Configurarea manuală a agentului implică crearea și conectarea conexiunilor, activarea fluxurilor Power Automate și publicarea soluției. Acest proces poate consuma mult timp și este susceptibil la erori. Pentru a automatiza configurarea, folosește un script PowerShell după actualizarea parametrilor necesari.

    Scriptul PowerShell automatizează următoarele activități:

    • Actualizează variabilele de mediu necesare.
    • Leagă conexiunile Microsoft Power Platform cu referințele conexiunii soluției.
    • Activează toate fluxurile Power Automate de care Agentul de Timp și Cheltuieli are nevoie.
    • Publică agenții Copilot.
    • Publică soluția Dataverse.

    Înainte de a rula scriptul, trebuie să creați conexiuni , deoarece trebuie să furnizați ID-ul conexiunii pentru fiecare conector din fișierul install.ps1. Pentru a crea aceste conexiuni, urmează acești pași folosind utilizatorul agent creat.

    1. Conectează-te la portalul Power Apps Maker folosind noul utilizator agent creat și selectează mediul tău.
    2. În panoul din stânga, selectați Mai multe și selectați Conexiuni.
    3. Selectează Conexiune nouă și caută folosind Numele Conexiunii din tabelul următor (de exemplu, Office 365 Outlook).
    4. Selectați conectorul corespunzător din listă și creați-l.
    5. Odată ce conexiunea este creată, notați utilizatorul cu care a fost creată conexiunea. În mod ideal, ar trebui să fie ID-ul de utilizator al agentului creat. Actualizează acest ID de utilizator în fișierul de instalare pe care îl creezi în pasul următor.
    6. Repetați pașii 3 și 4 pentru fiecare dintre conexiunile necesare rămase enumerate în tabelul următor.
    Nume conexiune Formate URL de conexiune
    Perspectiva Office 365 https://make.powerapps.com/environments/environmentID/connections
    / shared_office365/connectionID/detalii
    Utilizatorii Office 365 https://make.powerapps.com/environments/environmentID/connections
    / shared_office365users/connectionID/detalii
    Echipe Microsoft https://make.powerapps.com/environments/environmentID/connections
    / shared_teams/connectionID/detalii
    Microsoft Dataverse https://make.powerapps.com/environments/environmentID/connections
    / shared_commondataserviceforapps/connectionID/detalii
    Microsoft Copilot Studio (previzualizare) https://make.powerapps.com/environments/environmentID/connections
    / shared_microsoftcopilotstudio/connectionID/detalii

    Informații de care aveți nevoie pentru a crea fișierul de instalare

    Pentru a crea fișierul de instalare -install.ps1, aveți la dispoziție următoarele informații. (Puteți consulta următorul tabel pentru referință.)

    Parametru Alte detalii
    ID-ul mediului Dataverse Introduceți ID-ul de mediu pe care îl obțineți de la centrul de administrare Power Platform.
    Valoarea eșantionului: xxxx-xxxx-xxxx-xxx-xxxxxxxxxx
    URL-ul mediului Dataverse Introduceți adresa URL a mediului din centrul de administrare Power Platform.
    Notă: Asigurați-vă că aveți https:// la început și fără bară oblică "/" la sfârșit.
    Valoarea eșantionului: https://org123.crm.contoso.com
    Adresa URL a instanței de finanțe și operațiuni Introduceți detaliile mediului financiar și operațional în următorul format.
    Valoarea eșantionului: https://org123.contoso.com
    Notă: Asigurați-vă că aveți https:// la început și fără bară oblică "/" la sfârșit.
    OutlookFolderPath Introduceți calea folderului creată în cutia poștală partajată. Dacă nu este creat niciun alt folder, acesta este setat ca Inbox în mod implicit.
    Valoare eșantion: Inbox
    Ca o bună practică, creează un folder separat pentru gestionarea cheltuielilor
    ID adresă cutie poștală Introduceți adresa de e-mail a noului cutii poștale partajate create
    Valoarea eșantionului: expenseagent@contoso.com
    Numele conexiunii Microsoft Dataverse
    Numele conexiunii Microsoft Copilot Studio
    Numele conexiunii Microsoft Office Outlook
    Numele conexiunii utilizatorilor Microsoft Office 365
    Numele conexiunii Microsoft Teams
    Introducerea tuturor numelor de conexiune este aceeași și reprezintă ID-ul de email al utilizatorului agent creat.

    Valoarea eșantionului: createdexpenseagentuser@contoso.com

    Creați fișierul script de instalare

    Creează un fișier de script de instalare copiind următorul cod. Introdu variabilele de mediu necesare în script, apoi rulează scriptul folosind PowerShell.

    Notă

    Pune fișierul scriptului de instalare pe desktopul local. Nu-l stoca în One Drive.

    Creează un fișier script PowerShell cu următorul cod. Actualizează parametrii menționați înainte de a rula scriptul.

    Sfat

    Când Mandatory = $true, PowerShell îți cere să introduci parametrii interactiv, astfel încât să nu fie nevoie să-i actualizezi direct în fișierul script.

    Dacă doriți să evitați introducerea manuală și să predefiniți parametrii în cadrul scriptului de instalare, setați Mandatory = $false în secțiunea Param a următorului cod exemplu.

    Copiază codul următor în fișierul tău de script de instalare și salvează-l ca 'Install.ps1'. Actualizează variabilele din câmpurile parametrilor corespunzători din secțiunea param. Trebuie să actualizezi 10 variabile.

    Sfat

    Utilizați tabelul anterior ca referință și înlocuiți toate valorile eșantionului cu detaliile respective.

    #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
    }
    
    

    Pentru a declanșa fișierul PowerShell, urmează acești pași:

    1. Open PowerShell (versiune minimă necesară - PowerShell 7).
    2. Mergi la locația unde ai salvat fișierul. (Utilizați comanda cd <file location>).
    3. Declanșați scriptul de instalare. (Utilizați comanda '.\Install.ps1').
    4. Urmează instrucțiunile pentru a te conecta pe Azure.
    5. După ce te autentifizi, s-ar putea să fie nevoie să autorizezi încă o dată. (Utilizați ID-ul de utilizator al agentului creat.).

    Așteaptă ca scriptul să ruleze complet și caută mesajul Configurarea agentului finalizată cu succes!

    Notă

    Scriptul precedent efectuează următoarele acțiuni:

    • Setează variabilele de mediu.
    • Verifică și leagă referințele de conexiune.
    • Activează fluxurile Power Automate.
    • Publică agenții Copilot necesari.
    • Publică soluția Dataverse.

    După ce scriptul rulează cu succes, Expense Agent este complet configurat și gata de utilizare.

    Opțiunea B: Configurare manuală în Power Apps (fără PowerShell)

    Dacă nu vrei să folosești scriptul PowerShell, poți configura manual Expense Agent prin Power Apps. Acest proces implică actualizarea variabilelor de mediu, activarea fluxurilor Power Automate și publicarea soluției.

    Actualizarea variabilelor de mediu

    Pentru a actualiza variabilele de mediu, urmează acești pași:

    1. conectați-vă la Power Apps și selectați mediul dvs.

    2. Selectați Soluții, apoi deschideți Soluție implicită (sau soluția în care este instalat agentul).

    3. Accesați Variabile de mediu și setați următoarele valori.

      Nume variabilă Descriere
      Calea folderului Outlook Expense Agent Specificați calea folderului de monitorizat în cutia poștală partajată (în mod implicit, Inbox).
      ID adresă cutie poștală partajată agent de cheltuieli Specificați adresa de e-mail a cutiei poștale partajate. Pentru a utiliza cutia poștală a utilizatorului conectat, introduceți NA.
      Adresa URL a instanței Finance and Operations Specificați adresa URL a mediului aplicațiilor financiare și operaționale (de exemplu, https://org123.contoso.com).

    Activați Power Automate fluxurile

    Agentul de cheltuieli se bazează pe următoarele fluxuri Power Automate:

    • Verificarea reîncercării de intrare a cheltuielilor
    • Configurarea cheltuielilor
    • Obțineți folderul Outlook de cheltuieli
    • Generați raportul de cheltuieli
    • Trimiterea cardului adaptiv pentru raportul de cheltuieli
    • Cheltuielile pentru potrivirea auto
    • Procesați e-mailurile
    • Extragerea ID-urilor de primire neatașate pentru invocarea copilot
    • Extrageți ieșirea chitanțelor neatașate folosind pluginul Dataverse
    • Generați linie de cheltuieli
    • Generați linie de cheltuieli fără ID de proiect și ID de stare
    • Identificarea ID-urilor de proiect
    • Evenimente din calendarul utilizatorilor
    • Procesați raportul de cheltuieli folosind copilot
    • Invocați agentul de cheltuieli pentru procesarea chitanțelor

    Pentru a permite fluxurile, urmează acești pași:

    1. Conectați-vă la Power Automate și selectați mediul dvs.

    2. Selectați Fluxurile mele.

    3. Pentru fiecare dintre cele 15 fluxuri din lista anterioară, urmează acești pași:

      1. Găsiți fluxul.
      2. Selectați Editare.
      3. Comutați la vizualizarea Proiectant vechi dezactivând opțiunea Proiectant nou .
      4. Autentificați toate conexiunile necesare (până când apar bife verzi).
      5. Selectați Continuare, apoi selectați Salvare.
      6. Selectați Activare pentru a activa fluxul.

    Publicarea soluției

    După ce terminați de configurat toate variabilele și fluxurile de mediu, urmați acești pași pentru a publica soluția.

    1. În Power Apps, accesați Soluții.
    2. Selectați mediul și soluția.
    3. Selectați Publicați toate personalizările.

    Când finalizezi acești pași, Agentul de Cheltuieli este complet configurat și gata de utilizare.

    Pasul 6: Activați agentul de cheltuieli în Microsoft Teams (opțional)

    Pentru a permite comunicarea bazată pe Teams pentru Excost Agent, adăugați canalul Teams la agent în Power Apps. Agentul poate apoi trimite carduri adaptive prin Teams.

    Activarea canalului Teams

    Pentru a activa canalul Teams, urmează acești pași:

    1. Conectați-vă la Copilot Studio și selectați mediul corect.
    2. Pe fila Agenți , selectați Agent de introducere a cheltuielilor.
    3. În vizualizarea agentului, pe fila Canale , selectați Teams și Microsoft 365 Copilot.
    4. Selectați Adăugare canal pentru a activa integrarea Teams și urmați pașii din secțiunea Configurați disponibilitatea aplicației Teams pentru a configura cine doriți să partajeze aplicația.

    Aflați mai multe în Deschideți panoul de configurare pentru canalul Teams + Microsoft 365.

    Configurarea disponibilității aplicației Teams

    Pentru a configura disponibilitatea aplicațiilor Teams, urmează acești pași:

    1. După crearea aplicației Teams, selectați Opțiuni de disponibilitate.

    2. Selectați cu cine doriți să partajați aplicația:

      • Utilizatori specifici din cadrul organizației
      • Întreaga organizație
    3. Trimiteți aplicația pentru aprobare.

    Publicarea aplicației în centrul de administrare Teams

    Pentru a publica aplicația în centrul de administrare Teams, urmează acești pași:

    1. conectați-vă la Centrul de administrare Teams.
    2. Mergi la aplicația > Teams Gestionează aplicațiile. Caută "cheltuială" și selectează aplicația Exper Entry Agent unde starea aplicației este blocată.
    3. Selectați Publicare pentru a debloca aplicația. Odată ce acțiunea de publicare se finalizează cu succes, asigură-te că starea aplicației se schimbă în neblocată.

    Aflați mai multe în Conectați și configurați un agent pentru Teams și Microsoft 365.

    Când finalizezi acești pași, agentul tău de cheltuieli este gata de utilizare.

    Notă

    De asemenea, puteți oferi feedback asupra liniilor de cheltuieli generate de agenți și rapoartelor folosind pictogramele cu degetul mare în sus și în jos și fereastra pop-up de feedback din mediul Dynamics 365 Finance.

    Dezinstalați Expense Agent

    Pentru a dezinstala Excost Agent, urmează acești pași:

    1. Conectează-te la portalul Microsoft Power Apps Maker.
    2. Selectați Soluții, căutați msdyn_ExpenseAI, selectați cele trei puncte și selectați Ștergere.
    3. Caută msdyn_FnOCopilotAnchor și șterge soluția.