Sdílet prostřednictvím


Nastavení Agenta výdajů (Preview)

Důležité

Platí pro Dynamics 365 Project Operations integrované s ERP a projektovými operacemi Dynamics 365 pro výrobu.

Expense Agent spojuje funkce z Microsoft Dynamics 365 Project Operations, aplikací pro finance a provoz, Microsoft Copilot Studio, Power Automate a Dataverse k automatizaci pracovních postupů zpracování výdajů pomocí AI. Tato funkce pomáhá ušetřit čas a snížit ruční úsilí tím, že umožňuje systému zpracovávat účtenky a generovat řádky výdajů a sestavy výdajů pro uživatele. Používá konektory Microsoft Power Platform pro integraci s Outlookem, Microsoft Teams, uživatelskými kalendáři a prostředím aplikací pro finance a provoz prostřednictvím virtuálních entit Dataverse.

Agent výdajů zahrnuje více toků, z nichž tři slouží jako hlavní orchestrátory:

  • Zpracovat e-maily – tento tok kontroluje nakonfigurovanou složku poštovní schránky každou hodinu a ukládá přílohy jako nepřipojené účtenky v Dynamics 365 Finance.
  • Extrahování ID účtenek – tento tok převezme nepřipojené účtenky a aktivuje agenta k extrakci podrobností o účtech a vytvoření nepřipojeného řádku výdajů.
  • Sestava zpracování výdajů – Tento tok převádí nepřipojené řádky výdajů a generuje vyúčtování výdajů na základě sestav skupiny podle konfigurace, která je nastavena v aplikaci pro každou právnickou entitu.

Kromě toho se agent integruje s Microsoft Teams a umožňuje používat adaptivní karty pro kontrolu a odeslání vyúčtování výdajů.

Agent spoléhá na několik konektorů Microsoft Power Platform. Tyto konektory automaticky odkazují na toky Power Automate, které jsou k dispozici.

  • Outlook (Office 365) – Tento konektor přistupuje ke sdílené poštovní schránce a extrahuje potvrzení.
  • Dataverse (virtuální entity) – tento konektor se integruje s finančními a provozními operacemi prostřednictvím virtuálních entit.
  • Microsoft Copilot Studio – Tento konektor vyvolá modely AI k extrahování informací o příjmu.
  • Microsoft Teams – Tento konektor odesílá adaptivní karty pro interakce uživatelů (pokud je povolená integrace s Teams).
  • Uživatelé Microsoft 365 – Tento konektor načte podrobnosti o kalendáři uživatele (volitelné, pokud analýza příjmu využívá kontext).

Požadavky

  1. Finanční a provozní prostředí: Potřebujete aspoň verzi 10.0.44 (10.0.2263.175 a novější) nebo 10.0.45 (10.0.0.10.0. 2345.115 a novější) nebo 10.0.46 (10.0.2428.69 a novější) finančního a provozního prostředí pro instalaci agenta.
  2. Role vyžadované k nastavení uživatele Expense Agent: Abyste mohli dokončit kroky v tomto článku, musíte být správcem systému organizace a mít následující role k nastavení uživatele expense agenta pro instalaci expense Agenta.
Systém Role Comments
centrum pro správu Power Platform Správce systému
  1. Přejděte na Centrum pro správu Power Platform.
  2. V levém podokně přejděte na Správa. Vyberte Prostředí a pak vyberte prostředí.
  3. V části Uživatelé aplikace>Access vyberte Zobrazit vše.
  4. Vyberte uživatele a pak vyberte Spravovat role a přidejte roli.
Finance and Operations Správce systému
  1. Otevřete adresu URL pro finanční a provozní operace pro vaše prostředí.
  2. Přejděte na Modul>Systémspráva>Uživatelé a vyberte uživatele.
  3. Vyberte Přidat roli – správce systému.
Microsoft 365 Správce Exchange a správce uživatelů
  1. Přejděte na Centrum pro správu Microsoft 365.
  2. Přejděte na Uživatelé>Aktivní uživatelé> a vyberte uživatele.
  3. Vyberte Spravovat role, a pak v okně Role vyberte Správce Exchange.
  4. Uložte změny.
  5. Podle stejných kroků přidejte roli Správce uživatelů.
Centrum pro správu Teams Správce Teams Vyžaduje se, pokud plánujete povolit integraci Microsoft Teams.

Postup nastavení Agenta výdajů

Pokud chcete nainstalovat a nastavit agenta Expense Agent, postupujte takto:

  1. Nainstalujte aplikaci Copilot pro finanční a provozní aplikace.
  2. Povolte funkce agenta ve vašem prostředí.
  3. Vytvořte uživatele výdajů pro provádění agenta.
  4. Nastavte sdílenou poštovní schránku.
  5. Nastavte agenta výdajů.
  6. Povolení Agenta výdajů v Microsoft Teams (volitelné – pokud potřebujete integraci Microsoft Teams)

Následující části podrobně popisují jednotlivé kroky.

Krok 1: Instalace aplikace Copilot pro finanční a provozní aplikace

Agenta výdajů je k dispozici jako součást balíčku Copilot pro finanční a provozní aplikace. Po instalaci tohoto balíčku do vašeho prostředí automaticky získáte všechny požadované prostředky, včetně agenta, proměnných prostředí a toků Power Automate.

Pokud chcete nainstalovat požadovanou aplikaci, postupujte takto:

  1. V prohlížeči přejděte do Centra pro správu Power Platform.
  2. V seznamu prostředí vyberte název prostředí, do kterého chcete aplikaci nainstalovat.
  3. Na stránce podrobností prostředí (NE z levé navigace) přejděte do části Zdroje a vyberte aplikace Dynamics 365.
  4. V seznamu aplikací Dynamics 365 vyhledejte Copilot pro finanční a provozní aplikace. Pokud už je nainstalovaná a je k dispozici aktualizace, vyberte tlačítko Aktualizovat.
  5. Pokud aplikace není uvedená v sekci Aplikace Dynamics 365, vyberte Nainstalovat aplikaci, vyberte Copilot pro finanční a provozní aplikace a podle pokynů dokončete instalaci.
  6. Aplikace Copilot for Finance and Operations by měly být 1.0.3231.4 nebo novější.

Poznámka:

Další informace o tom, jak povolit Copilot ve vašem prostředí, najdete v části Povolení schopností Copilota ve finančních a provozních aplikacích.

Návod

Pokud chcete ověřit, jestli se balíček úspěšně nainstaloval, postupujte takto:

  1. Přejděte na portál > Power Apps Maker Portal a vyberte své prostředí >, vyberte Řešení > Zobrazit historii > vyhledávání a vyberte msdyn_ExpenseAI > Podrobnosti.
  2. Zaškrtněte políčko Výsledek .
    1. Pokud výsledek ukazuje úspěch, balíček se nainstaloval správně.
    2. Pokud se výsledek nezobrazí úspěch, instalace se nezdařila.
  3. Pokud instalace selže, odstraňte msdyn_FnOCopilotAnchor (viz část odinstalace) a znovu nainstalujte Copilot pro aplikace pro finance a operace.

2. krok: Povolte funkce agenta ve vašem prostředí

Po instalaci balíčku Copilot pro finanční a provozní aplikace aktivujte Agenta výdajů v rámci vašeho prostředí Dataverse a finančních a provozních aplikací.

Povolení klíče oprávnění v Dataverse

V Centru pro správu Power Platform zapněte příznak funkce Copilot. Pokud chcete zapnout příznak funkce Copilot, postupujte takto:

  1. Přejděte na Centrum pro správu Power Platform.
  2. Vyberte Prostředí> vyberte své prostředí >Nastavení>Produkt> vyberte Funkce.
  3. Ujistěte se, že je zapnutý příznak funkce Copilot.

Povolení funkce ve finančním a provozním prostředí

Pokud chcete agenta aktivovat v aplikacích pro finance a provoz, postupujte takto:

  1. Přihaste se do finančního a provozního prostředí.
  2. Přejděte na Správa funkcí a povolte funkci Imerzivní domovská stránka a funkce Správa agenta.
  3. Chcete-li nakonfigurovat agenta Expense Agent (nastavení je pro každou právnickou osobu), přejděte na Správa výdajů>Nastavení>Obecné>Parametry správy výdajů.
  4. Na kartě Agent výdajové položky nakonfigurujte parametry, jak je znázorněno v následující tabulce.
Parametry Hodnota Comments
Povolení Agenta výdajů pro aktuální právnickou osobu Ano Přepnutím na Ano povolíte agenta pro aktuální právnickou osobu.
Četnost Denně nebo týdně Nakonfigurujte frekvenci automatického vytváření sestav výdajů ve vaší organizaci.
Seskupovat sestavy podle Cesta nebo projekt Nakonfigurujte seskupení výdajů na základě projektu nebo cesty.

Krok 3: Vytvoření uživatele pro agenta výdajů pro provedení úkolů agenta

Vytvořte uživatele vyhrazeného agenta výdajů, abyste zajistili, že agent běží nezávisle na identitě libovolného zaměstnance. Tento přístup pomáhá se zabezpečením, spravovatelností a dlouhodobou udržovatelností. I když můžete použít existující uživatelský účet, který má požadovaná oprávnění, použijte identitu vlastněnou systémem.

Vytvoření uživatele Expense Agent v Microsoft Entra ID

  1. Přihlaste se do Azure Portalu.
  2. V dostupných službách Azure vyberte ID Microsoft Entra.
  3. V části Microsoft Entra ID vytvořte nového uživatele.
  4. Vyberte Přidat>User>Vytvořit nového uživatele a zadejte následující podrobnosti.
    • Hlavní název uživatele (UPN)
    • Volba správné domény
    • Zobrazované jméno
    • Heslo
    • Označit účet jako povolený
  5. Pokud chcete zobrazit podrobnosti a dokončit proces vytváření uživatelů, vyberte Zkontrolovat a vytvořit a vyberte Vytvořit.
  6. Na stránce Uživatel (Správa > Uživatelé) vyberte uživatele a stránku s podrobnostmi zobrazení.
  7. Vyberte Upravit vlastnosti, přejděte na kartu Nastavení a vyplňte příslušné umístění použití.

Poznámka:

V závislosti na zásadách vaší organizace může být potřeba změnit heslo a nastavit vícefaktorové ověřování (MFA). Postupujte podle běžných kroků pro změnu hesla a nastavení vícefaktorového ověřování.

Přiřazení požadovaných licencí uživateli Agent výdajů

Pokud chcete aplikaci Expense Agent úspěšně nainstalovat, přiřaďte uživateli expense agenta následující licence:

  • Členové licence Dynamics 365 Teams
  • Microsoft 365 Business Basic nebo libovolná licence, která pokrývá Microsoft Teams a Outlook (například Office 365 E5 s Teams)
  • Power Apps Premium

Pokud chcete přiřadit licence, postupujte takto:

  1. Přihlaste se do Centra pro správu Microsoft 365 jako uživatel, který má přístup k přiřazování licencí, který je uživatelem s rolí Správce licencí nebo novější.
  2. Vyberte Fakturace>Licence>licence Dynamics 365 Teams Members.
  3. Vyberte +Přiřadit licence.
  4. Vyhledejte uživatele agenta výdajů vytvořeného v předchozím kroku.
  5. Výběrem možnosti Přiřadit dokončete přiřazení licence.
  6. Postupujte podle kroků 2 až 5 pro ostatní licence – Microsoft 365 Business Basic a Power Apps Premium.

Poznámka:

Další informace o kontrole a přidělování licence najdete v tématu Použití stránky Aktivní uživatelé k přiřazení nebo odebrání licencí.

Přidání uživatele do prostředí Power Platform

Pokud chcete přidat uživatele do prostředí Power Platform, postupujte takto:

  1. Přihlaste se do Centra pro správu Power Platform a vyberte příslušné prostředí.

    Návod

    Tato stránka obsahuje informace týkající se ID prostředí pro Dataverse, adresu URL prostředí pro dataverse, adresu URL Finance and Operations. Tyto hodnoty uložte, abyste je mohli použít v pozdějších částech.

  2. Přejděte na Přístup > Uživatelé > Zobrazit vše.

  3. Vyberte Přidat uživatele, zadejte nově vytvořeného uživatele agenta a vyberte Přidat.

  4. Na stránce Spravovat role zabezpečení přidejte následující role.

    • Role agenta AI pro správu výdajů
    • Správce konfigurace pro Finance and Operations
    • Úpravce systému
  5. Pokud chcete potvrdit přiřazení role, vyberte Uložit.

Tyto role poskytují přístup k komponentám Dataverse a Power Automate, které agent potřebuje k fungování.

Návod

Pokud už uživatel existuje a potřebujete přiřadit jenom role, přejděte do Centra pro správu Power Platform a vyberte příslušné prostředí.

  1. Přejděte na Přístup > Uživatelé > Zobrazit vše.
  2. Vyberte vytvořeného uživatele agenta.
  3. Vyberte Spravovat role a přiřaďte role.

Přiřazení požadované role v prostředí Finance and Operations

Pokud chcete přiřadit roli ExpenseAgentRole v prostředí financí a provozu, postupujte takto:

  1. V prostředí Finance and Operations přejděte na Správa systému>Uživatelé.
  2. Vytvořte záznam uživatele pro uživatele agenta.
  3. Po vytvoření uživatele přejděte do části role uživatele, vyberte Přiřadit role a vyhledejte ExpenseAgentRole.
  4. Vyberte Uložit.

Poznámka:

ExpenseAgentRole je k dispozici ve verzi finančních a provozních operací od 10.0.44 (10.0.2263.81) a 10.0.45 (10.0.2345.6) a v rámci Copilota pro finanční a provozní aplikace verze 1.0.3121.1

Přiřazení přístupu ke sdílené poštovní schránce

Uživatel agenta musí mít oprávnění Mail.Read.Shared Microsoft Graph. Toto oprávnění umožňuje agentovi číst potvrzení z nakonfigurované sdílené poštovní schránky během provádění toku.

Přístup ke sdílené poštovní schránce přiřadíte takto:

  1. Přejděte do Microsoft Graph Exploreru a přihlaste se pomocí vytvořeného uživatele agenta.
  2. Vyberte ikonu uživatele v pravém horním rohu > a vyberte Souhlas s oprávněními.
  3. Vyberte rozevírací nabídku pro Pošta> vyhledejte Mail.Read.Shared> vyberte Souhlas a vyberte Přijmout.

Souhrn požadovaných rolí pro vytvořeného uživatele agenta

Životní prostředí Seznam rolí Comments
Dataverse
  • Role agenta AI pro správu výdajů
  • správce Agenta konfigurace pro Finance and Operations
  • Úpravce systému
  • Uvedené role umožňují agentovi komunikovat s toky Power Automate, proměnnými prostředí a virtuálními entitami, které jsou připojeny k Dynamics 365 Finance
    Finance and Operations
  • ExpenseAgentRole
  • Systémový uživatel
  • Tato role se vyžaduje, aby agent vytvořil a spravil položky výdajů v prostředí aplikací pro finance a provoz.

    Poznámka: ExpenseAgentRole je k dispozici ve verzi finančních a provozních operací od verzí 10.0.44 (10.0.2263.81) a 10.0.45 (10.0.2345.6) a v rámci Copilota pro finanční a provozní aplikace verze 1.0.3121.1
    Přístup ke sdílené poštovní schránce pomocí Graph Exploreru Mail.Read.Shared Oprávnění Microsoft Graph umožňuje agentovi číst potvrzení z nakonfigurované sdílené poštovní schránky během provádění toku

    Krok 4: Nastavení sdílené poštovní schránky

    Agent výdajů používá sdílenou poštovní schránku k přijímání a zpracování e-mailů s potvrzením příjmu. Uživatel s rolí správce Exchange musí vytvořit a nakonfigurovat tuto poštovní schránku v Centru pro správu Microsoftu 365.

    Pokud chcete vytvořit a nakonfigurovat sdílenou poštovní schránku, postupujte takto:

    1. Přihlaste se k Centru pro správu Microsoft 365 pomocí účtu správce Exchange.

    2. V levém podokně vyberte Týmy & skupiny>Sdílené poštovní schránky

      Návod

      Možná budete muset vybrat možnost Zobrazit vše a rozbalit celý seznam.

    3. Vyberte Přidat sdílenou poštovní schránku.

    4. Zadejte název a e-mailovou adresu sdílené poštovní schránky.

    5. Vyberte volbu Uložit změny.

    6. V části Další kroky vyberte Přidat členy do této sdílené poštovní schránky. (Může trvat několik minut, než bude správa členů k dispozici.)

    7. Vyberte Přidat členy.

    8. Vyberte vytvořeného uživatele agenta a všechny ostatní, kteří by měli poštovní schránku monitorovat, a vyberte Přidat.

    9. Vyberte Zavřít.

    Poznámka:

    V dalším kroku použijete e-mailovou adresu sdílené poštovní schránky. Po nastavení sdílené poštovní schránky musíte zadat její e-mailovou adresu a cestu ke složce (ve výchozím nastavení nastavenou na Doručenou poštu) jako proměnné prostředí při konfiguraci agenta Time and Expense Agent. Další informace najdete v kroku 5: Nastavení agenta pro výdaje.

    Krok 5: Nastavení agenta výdajů

    Pro nastavení Agenta výdajů máte dvě možnosti:

    • Možnost A: Použití skriptu PowerShellu (doporučeno)
    • Možnost B: Ruční nastavení v Power Apps (bez PowerShell)

    Důležité

    Než budete pokračovat v instalaci agenta Expense Agent, ujistěte se, že je agent úspěšně zřízený v nástroji Microsoft Copilot Studio.

    Pokud chcete ověřit úspěšné zřízení agenta, postupujte takto:

    1. Přihlaste se k aplikaci Microsoft Copilot Studio a vyberte své prostředí.
    2. Přejděte na Agenti a vyhledejte ExpenseAgent-Line (Preview).
    3. Ověřte, že je tlačítko Publikovat povolené.
    4. Pokud je aktivní, pokračujte v instalaci. Pokud je tato možnost zakázaná, počkejte na zřízení agenta.
    5. Opakováním tohoto postupu ověřte, že je povolen Agent výdajové položky (Preview).

    Návod

    Pokud zřizování aplikace Finance a Operations Copilot trvá déle než 5 až 6 hodin, odinstalujte a znovu nainstalujte aplikaci, abyste vyřešili potenciální zpoždění instalace. Další informace najdete v části Odinstalace Expense Agenta na konci tohoto článku.

    Ruční nastavení agenta zahrnuje vytváření a propojení připojení, povolení toků Power Automate a publikování řešení. Tento proces může být časově náročný a může být náchylný k chybám. K automatizaci instalace použijte skript PowerShellu po aktualizaci požadovaných parametrů.

    Skript PowerShellu automatizuje následující úlohy:

    • Aktualizuje požadované proměnné prostředí.
    • Propojte Microsoft Power Platform s informacemi o připojení řešení.
    • Umožňuje všechny toky Power Automate, které vyžaduje agent Time and Expense.
    • Publikuje agenty Copilot.
    • Publikuje řešení Dataverse.

    Před spuštěním skriptu musíte vytvořit připojení, protože potřebujete zadat ID připojení pro každý konektor v souboru install.ps1. Pokud chcete tato připojení vytvořit, postupujte podle těchto kroků pomocí vytvořeného uživatele agenta.

    1. Přihlaste se k portálu tvůrce Power Apps pomocí nově vytvořeného uživatele agenta a vyberte své prostředí.
    2. V levém podokně vyberte Více a pak vyberte Připojení.
    3. Vyberte Nové připojení a vyhledejte ho pomocí názvu připojení z následující tabulky (například Office 365 Outlook).
    4. Ze seznamu vyberte odpovídající konektor a vytvořte ho.
    5. Po vytvoření připojení si poznamenejte uživatele, se kterým se připojení vytvořilo. V ideálním případě by se mělo jednat o ID uživatele vytvořeného agenta. Aktualizujte toto ID uživatele v instalačním souboru, který vytvoříte v dalším kroku.
    6. Opakujte kroky 3 a 4 pro každé zbývající požadované připojení uvedené v následující tabulce.
    Název připojení Formáty adres URL připojení
    Office 365 Outlook https://make.powerapps.com/environments/environmentID/connections
    / shared_office365/connectionID/details
    Uživatelé Office 365 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 (Preview) https://make.powerapps.com/environments/environmentID/connections
    / shared_microsoftcopilotstudio/connectionID/details

    Informace, které potřebujete k vytvoření instalačního souboru

    Chcete-li vytvořit instalační soubor – install.ps1, máte k dispozici následující informace. (Referenční informace najdete v následující tabulce.)

    Parameter Další podrobnosti
    ID prostředí Dataverse Zadejte ID prostředí, které získáte z Centra pro správu Power Platform.
    Ukázková hodnota: xxxx-xxxx-xxxx-xxx-xxxxxxxxxx
    Adresa URL prostředí Dataverse Zadejte adresu URL prostředí z Centra pro správu Power Platform.
    Poznámka: Dbejte na to, aby na začátku bylo https:// a nikoli dopředné lomítko ‘/’.
    Ukázková hodnota: https://org123.crm.contoso.com
    Adresa URL instance Finance and operations Zadejte podrobnosti o finančním a provozním prostředí v následujícím formátu.
    Ukázková hodnota: https://org123.contoso.com
    Poznámka: Dbejte na to, abyste měli https:// na začátku a neměli dopředné lomítko ‘/’ na konci.
    OutlookFolderPath Zadejte cestu ke složce vytvořenou ve sdílené poštovní schránce. Pokud se nevytvořila žádná jiná složka, nastaví se ve výchozím nastavení jako Doručená pošta.
    Ukázková hodnota: Doručená pošta
    Osvědčeným postupem je vytvořit samostatnou složku pro správu výdajů.
    ID poštovní schránky Zadejte e-mailovou adresu nově vytvořené sdílené poštovní schránky.
    Ukázková hodnota: expenseagent@contoso.com
    Název připojení Microsoft Dataverse
    Název připojení Microsoft Copilot Studio
    Název připojení Microsoft Office Outlook
    Název připojení Uživatelé Microsoft Office 365
    Název připojení Microsoft Teams
    Vstupní údaje pro všechny názvy připojení jsou stejné a jde o e-mailovou adresu uživatele vytvořeného agenta.

    Ukázková hodnota: createdexpenseagentuser@contoso.com

    Vytvoření instalačního souboru skriptu

    Vytvořte instalační soubor skriptu zkopírováním následujícího kódu. Vložte požadované proměnné prostředí do skriptu a pak skript spusťte pomocí PowerShellu.

    Poznámka:

    Soubor instalačního skriptu umístěte na místní plochu. Neukládejte ho na One Drive.

    Vytvořte soubor skriptu PowerShellu s následujícím kódem. Před spuštěním skriptu aktualizujte uvedené parametry.

    Návod

    Když je povinný = $true, PowerShell vás vyzve k interaktivnímu zadání parametrů, takže je nemusíte aktualizovat přímo v souboru skriptu.

    Pokud se chcete vyhnout ručnímu zadávání a chcete předdefinovat parametry v instalačním skriptu, nastavte v části Param v následujícím vzorovém kódu Mandatory = $false.

    Zkopírujte následující kód do souboru instalačního skriptu a uložte ho jako Install.ps1. Aktualizujte proměnné v příslušných polích parametrů v části parametru. Potřebujete aktualizovat 10 proměnných.

    Návod

    Použijte předchozí tabulku jako odkaz a nahraďte všechny ukázkové hodnoty odpovídajícími podrobnostmi.

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

    Pokud chcete aktivovat soubor PowerShellu, postupujte takto:

    1. Otevřete PowerShell (vyžaduje se minimální verze – PowerShell 7).
    2. Přejděte do umístění, kam jste soubor uložili. (Použijte umístění souboru <příkazu cd>).
    3. Aktivujte instalační skript. (Použijte příkaz '.\Install.ps1').
    4. Podle pokynů se přihlaste k Azure.
    5. Po přihlášení možná budete muset autorizovat ještě jednou. (Použijte ID uživatele vytvořeného agenta).

    Počkejte, až se skript úplně spustí, a vyhledejte zprávu , že se instalace agenta úspěšně dokončila.

    Poznámka:

    Předchozí skript provede tyto akce:

    • Nastaví proměnné prostředí.
    • Ověřuje a propojuje odkazy na připojení.
    • Povolte toky Power Automate.
    • Publikuje požadované agenty Copilot.
    • Publikuje řešení Dataverse.

    Po úspěšném spuštění skriptu je Agent výdajů plně nakonfigurovaný a připravený k použití.

    Možnost B: Ruční nastavení v Power Apps (bez PowerShellu)

    Pokud nechcete používat skript PowerShellu, můžete pomocí Power Apps ručně nakonfigurovat expense agenta. Tento proces zahrnuje aktualizaci proměnných prostředí, povolení toků Power Automate a publikování řešení.

    Aktualizace proměnných prostředí

    Chcete-li aktualizovat proměnné prostředí, postupujte takto:

    1. Přihlaste se k Power Apps a vyberte své prostředí.

    2. Vyberte Řešení a pak otevřete výchozí řešení (nebo řešení, ve kterém je agent nainstalovaný).

    3. Přejděte do proměnných prostředí a nastavte následující hodnoty.

      Název proměnné Popis
      Cesta ke složce nástroje Agent pro výdaje v aplikaci Outlook Zadejte cestu ke složce, kterou chcete monitorovat ve sdílené poštovní schránce (ve výchozím nastavení Doručená pošta).
      ID adresy sdílené poštovní schránky agenta pro výdaje Zadejte e-mailovou adresu sdílené poštovní schránky. Pokud chcete použít poštovní schránku přihlášeného uživatele, zadejte NA.
      Adresa URL instance Finance and Operations Zadejte adresu URL prostředí finančních a provozních aplikací (například https://org123.contoso.com).

    Povolení toků Power Automate

    Expense Agent spoléhá na následující toky Power Automate:

    • Kontrola opakování výdajové položky
    • Konfigurace výdajů
    • Získání složky výhled výdajů
    • Generování vyúčtování výdajů
    • Odeslání adaptivní karty sestavy výdajů
    • Automatické porovnávání výdajů
    • Zpracovávat e-maily
    • Extrahujte nepřipojená ID potvrzení pro vyvolání kopilota
    • Extrahování nepřipojeného výstupu potvrzení pomocí modulu plug-in Dataverse
    • Generování řádku výdajů
    • Generování řádku výdajů bez ID projektu a ID stavu
    • Identifikace ID projektu
    • Události uživatelského kalendáře
    • Zpracování vyúčtování výdajů pomocí copilotu
    • Vyvolání agenta výdajů pro zpracování účtenek

    Toky povolíte takto:

    1. Přihlaste se k Power Automate a vyberte své prostředí.

    2. Vyberte Moje toky.

    3. Pro každý z 15 toků v předchozím seznamu postupujte takto:

      1. Vyhledejte tok.
      2. Vyberte Upravit.
      3. Přepněte na zobrazení Starý návrhář vypnutím možnosti Nový návrhář.
      4. Ověřte všechna požadovaná připojení (dokud se nezobrazí zelené značky zaškrtnutí).
      5. Vyberte Pokračovat a pak vyberte Uložit.
      6. Výběrem Zapnout povolíte tok.

    Řešení publikujte

    Jakmile dokončíte konfiguraci všech proměnných a toků prostředí, publikujte řešení pomocí těchto kroků.

    1. V Power Apps přejděte na Řešení.
    2. Vyberte své prostředí a řešení.
    3. Vyberte Publikovat všechna vlastní nastavení.

    Po dokončení těchto kroků je agent Expense Agent plně nakonfigurovaný a připravený k použití.

    Krok 6: Povolení Agenta výdajů v Microsoft Teams (volitelné)

    Pokud chcete povolit komunikaci založenou na Teams pro Expense agenta, přidejte k agentovi v Power Apps kanál Teams. Agent pak může odesílat adaptivní karty přes Teams.

    Povolení kanálu Teams

    Pokud chcete kanál Teams povolit, postupujte takto:

    1. Přihlaste se do Copilot Studio a vyberte správné prostředí.
    2. Na kartě Agenti vyberte Agent výdajové položky.
    3. V zobrazení agenta na kartě Kanály vyberte Teams a Microsoft 365 Copilot.
    4. Vyberte Přidat kanál k povolení integrace Teams a podle kroků v části Konfigurovat dostupnost aplikace Teams nakonfigurujte, s kým chcete sdílet aplikaci.

    Další informace najdete v části Otevření panelu konfigurace pro kanál Teams + Microsoft 365.

    Konfigurace dostupnosti aplikace Teams

    Dostupnost aplikace Teams nakonfigurujete takto:

    1. Po vytvoření aplikace Teams vyberte Možnosti dostupnosti.

    2. Vyberte, s kým chcete aplikaci sdílet:

      • Konkrétní uživatelé v rámci organizace
      • Celá organizace
    3. Odešlete aplikaci ke schválení.

    Publikování aplikace v Centru pro správu Teams

    Aplikaci publikujete v Centru pro správu Teams takto:

    1. Přihlaste se k Centru pro správu Teams.
    2. Přejděte do aplikace > Teams Správa aplikací. Vyhledejte „výdaje“ a vyberte aplikaci Agent zadání výdajů, ve které je stav aplikace blokovaný.
    3. Výběrem tlačítka Publikovat aplikaci odblokujte. Po úspěšném dokončení akce publikování se ujistěte, že se stav aplikace změní na odblokovaný.

    Další informace viz Připojení a konfigurace agenta pro Teams a Microsoft 365.

    Po dokončení těchto kroků je váš Expense Agent připraven k použití.

    Poznámka:

    Můžete také poskytnout zpětnou vazbu k řádkům výdajů a sestavám generovaným agentem pomocí ikon palce nahoru a palce dolů a automaticky otevíraných oken zpětné vazby v prostředí Dynamics 365 Finance.

    Odinstalace Agenta výdajů

    Chcete-li odinstalovat Expense Agent, postupujte takto:

    1. Přihlaste se k portálu pro tvůrce Microsoft Power Apps.
    2. Vyberte Řešení, vyhledejte msdyn_ExpenseAI, vyberte tři tečky a vyberte Odstranit.
    3. Vyhledejte msdyn_FnOCopilotAnchor a odstraňte řešení.