Compartir a través de


Configuración del Asistente de Gastos (Versión Preliminar)

Importante

  • Esta es una característica en vista previa lista para producción.
  • Las versiones preliminares listas para producción están sujetas a condiciones de uso complementarias.

Se aplica a Dynamics 365 Project Operations integrado con ERP y Dynamics 365 Project Operation para fabricación

El Agente de gastos reúne funcionalidades de Microsoft Dynamics 365 Project Operations, aplicaciones de finanzas y operaciones, Microsoft Copilot Studio, Power Automate y Dataverse para automatizar los flujos de trabajo de procesamiento de gastos mediante IA. La característica ayuda a ahorrar tiempo y reducir el esfuerzo manual al permitir que el sistema procese recibos y genere líneas de gastos e informes de gastos para los usuarios. Usa conectores de Microsoft Power Platform para la integración con Outlook, Microsoft Teams, calendarios de usuario y el entorno de aplicaciones de finanzas y operaciones a través de entidades virtuales de Dataverse.

El Agente de gastos incluye varios flujos, tres de los cuales sirven como orquestadores principales:

  • Procesar correos electrónicos: este flujo examina una carpeta de buzón configurada cada hora y almacena los datos adjuntos como recibos no conectados en Dynamics 365 Finance.
  • Extraer id. de recibo: este flujo recoge recibos no conectados y desencadena al agente para extraer los detalles del recibo y crear una línea de gastos no asociada.
  • Informe de gastos de proceso: este flujo convierte líneas de gastos no asociadas y genera informes de gastos, en función de la configuración de Agrupar informes por que se establece en la aplicación para cada entidad jurídica.

Además, el agente se integra con Microsoft Teams, lo que permite el uso de tarjetas adaptables para la revisión y envío de informes de gastos.

El agente se basa en varios conectores de Microsoft Power Platform. A estos conectores se hace referencia automáticamente en los flujos de Power Automate que se proporcionan.

  • Outlook (Office 365):: este conector accede al buzón compartido para extraer recibos.
  • Dataverse (entidades virtuales): este conector se integra con las aplicaciones de finanzas y operaciones a través de entidades virtuales.
  • Microsoft Copilot Studio : este conector invoca modelos de IA para extraer información de recibos.
  • Microsoft Teams : este conector envía tarjetas adaptables para las interacciones del usuario (si la integración de Teams está habilitada).
  • Usuarios de Microsoft 365: este conector recupera los detalles del calendario del usuario (opcional, si el análisis de recibos es contextual).

Prerrequisitos

  1. Entorno financiero y de operaciones: Necesita al menos la versión 10.0.44 (10.0.2263.167 y versiones posteriores) o 10.0.45 (10.0.2345.102 y versiones posteriores) del entorno de finanzas y operaciones para instalar el agente.
  2. Roles necesarios para configurar el usuario del Agente de gastos: Para completar los pasos de este artículo, debe ser el administrador del sistema de la organización y tener los siguientes roles para configurar el usuario del agente de gastos para instalar el Agente de gastos.
System Rol Comentarios
Centro de administración de Power Platform Administrador del sistema
  1. Vaya al Centro de administración de Power Platform
  2. Vaya a Administrar en el panel izquierdo. Seleccione Entornos y, a continuación, seleccione su entorno.
  3. En la sección Acceso>Usuarios, seleccione Ver todo.
  4. Seleccione un usuario y, a continuación, Administrar roles, y luego agregue el rol.
Finance and Operations Administrador del sistema
  1. Abra la dirección URL de finanzas y operaciones del entorno.
  2. Vaya a Módulo>Administracióndel sistema>Usuarios y seleccione un usuario.
  3. Seleccione Agregar rol: Administrador del sistema.
Microsoft 365 Administrador de Exchange y Administrador de usuarios
  1. Vaya al Centro de administración de Microsoft 365.
  2. Vaya a Usuarios>Usuarios activos> seleccione el usuario.
  3. Seleccione Administrar roles y, a continuación, en Roles , seleccione Administrador de Exchange.
  4. Guarde los cambios.
  5. Siga los mismos pasos para agregar el rol Administrador de usuarios.
Centro de administración de Teams Administrador de Teams Obligatorio si planea habilitar la integración de Microsoft Teams

Pasos para configurar el Agente de gastos

Para instalar y configurar el Agente de gastos, siga estos pasos:

  1. Instale Copilot para aplicaciones de finanzas y operaciones.
  2. Habilite las características del agente en su entorno.
  3. Cree un usuario de gastos para la ejecución del agente.
  4. Configure un buzón compartido.
  5. Configure el Agente de gastos.
  6. Habilitar el Agente de gastos en Microsoft Teams (opcional: si necesita la integración de Microsoft Teams)

En las secciones siguientes se describe cada paso con detalle.

Paso 1: Instalar Copilot para aplicaciones de finanzas y operaciones

El Agente de gastos está disponible como parte del paquete de Copilot para aplicaciones de finanzas y operaciones. Después de instalar este paquete en el entorno, obtendrá automáticamente todos los recursos necesarios, incluidos los flujos de agente, variables de entorno y Power Automate.

Para instalar la aplicación necesaria, siga estos pasos:

  1. Vaya al Centro de administración de Power Platform en el explorador.
  2. En la lista de entornos, seleccione el nombre del entorno donde desea instalar la aplicación.
  3. En la página de detalles del entorno (NO en el panel de navegación izquierdo), vaya a la sección Recursos y seleccione Aplicaciones de Dynamics 365.
  4. Busque Copilot para aplicaciones de finanzas y operaciones en la lista de aplicaciones de Dynamics 365. Si ya está instalado y hay disponible una actualización, seleccione el botón Actualizar.
  5. Si la aplicación no aparece en Aplicaciones de Dynamics 365, seleccione Instalar aplicación, seleccione Copilot para aplicaciones de finanzas y operaciones y siga las indicaciones para completar la instalación.

Nota:

Obtenga más información sobre cómo habilitar Copilot en su entorno en Habilitar funcionalidades de Copilot en aplicaciones de finanzas y operaciones.

Sugerencia

Para comprobar si el paquete se instaló correctamente, siga estos pasos:

  1. Vaya a Power Apps Maker Portal >, seleccione su entorno > , seleccione Soluciones, la búsqueda de > Ver historial > y seleccione Detalles de msdyn_ExpenseAI >.
  2. Compruebe el campo Resultado.
    1. Si el resultado muestra Correcto, el paquete se ha instalado correctamente.
    2. Si el resultado no muestra Correcto, se ha producido un error en la instalación.
  3. Si se produce un error en la instalación, elimine msdyn_FnOCopilotAnchor (obtenga más información en la sección de desinstalación) e instale Copilot para aplicaciones de finanzas y operaciones de nuevo.

Paso 2: Habilitar las características del agente en su entorno

Después de instalar el paquete de aplicaciones Copilot para finanzas y operaciones, active el agente de gastos desde el entorno de Dataverse y finanzas y operaciones.

Habilitar característica en Dataverse

Active la bandera de funciones de Copilot en el centro de administración de Power Platform. Para activar la bandera de funciones de Copilot, siga estos pasos:

  1. Vaya al Centro de administración de Power Platform.
  2. Seleccione Entornos> seleccione el entorno >Configuración>Producto> seleccione Características.
  3. Confirme que la marca de característica de Copilot esté activada.

Habilitar la característica en el entorno de finanzas y operaciones

Para activar el agente en aplicaciones de finanzas y operaciones, siga estos pasos:

  1. Inicie sesión en su entorno de finanzas y operaciones.
  2. Vaya a Administración de características y habilite la característica Inicio inmersivo y las características Administración de agentes.
  3. Para configurar el Agente de gastos (el programa de instalación es por entidad jurídica), vaya a Gestión de gastos>Configuración>General>Parámetros de administración de gastos.
  4. En la pestaña Agente de entrada de gastos, configure los parámetros como se muestra en la tabla siguiente.
Parámetros Importancia Comentarios
Habilitar el Agente de gastos para la entidad jurídica actual Cambie a para habilitar el agente para la entidad jurídica actual.
Frecuencia Diario o Semanal Configure la frecuencia para crear automáticamente informes de gastos en su organización.
Agrupar informes por Viaje o Proyecto Configure para agrupar los gastos en función de un proyecto o un viaje.

Paso 3: Crear un usuario de agente de gastos para la ejecutar del agente

Cree un usuario de agente de gastos dedicado para asegurarse de que el agente se ejecuta independientemente de la identidad de cualquier empleado. Este enfoque ayuda con la seguridad, la manejabilidad y el mantenimiento a largo plazo. Aunque puede usar una cuenta de usuario existente que tenga los privilegios necesarios, use una identidad propiedad del sistema.

Cree el usuario del Agente de gastos en la Microsoft Entra ID

  1. Inicie sesión en Azure Portal.
  2. En los servicios de Azure disponibles, seleccione Microsoft Entra ID.
  3. En Microsoft Entra ID, cree un nuevo usuario.
  4. Seleccione Agregar>Usuario>Crear nuevo usuario e introduzca los siguientes detalles.
    • Nombre principal de usuario
    • Seleccionar el dominio adecuado
    • Nombre
    • Contraseña
    • Marcar cuenta habilitada
  5. Para ver los detalles y completar el proceso de creación de usuarios, seleccione Revisar y crear y seleccione Crear.
  6. En la página Usuario (Administrar > Usuarios), seleccione un usuario y la página de ver detalles.
  7. Seleccione Editar propiedades, vaya a la pestaña Configuración y rellene la ubicación de uso adecuada.

Nota:

En función de la directiva de la organización, es posible que tenga que cambiar la contraseña y configurar la autenticación multifactor (MFA). Siga los pasos que se realizan normalmente para cambiar la contraseña y configurar MFA.

Asignar las licencias requeridas para el usuario del Agente de gastos

Para instalar correctamente Expense Agent, asigne las siguientes licencias al usuario del agente de gastos:

  • Licencia de miembros de Teams de Dynamics 365
  • Microsoft 365 Business Basic o cualquier licencia que abarque Microsoft Teams y Outlook (por ejemplo, Office 365 E5 con equipos)
  • Power Apps Premium (Versión Premium)

Para asignar licencias, siga estos pasos:

  1. Inicie sesión en el Centro de administración de Microsoft 365 con un usuario que tenga acceso para asignar licencias que sea un usuario con administrador de licencias o superior.
  2. Seleccione Facturación>Licencias>Licencia de miembros de Teams de Dynamics 365.
  3. Seleccione +Asignar licencias.
  4. Busque el usuario del agente de gastos creado en el paso anterior.
  5. Seleccione Asignar para completar la asignación de licencias.
  6. Siga los pasos del 2 al 5 para las demás licencias: Microsoft 365 Empresa Basic y Power Apps Premium, también.

Nota:

Obtenga más información sobre cómo comprobar y asignar licencias en Usar la página de usuarios activos para asignar o cancelar la asignación de licencias.

Agregar el usuario al entorno de Power Platform

Para agregar el usuario al entorno de Power Platform, siga estos pasos:

  1. Inicie sesión en el Centro de administración de Power Platform y, a continuación, seleccione el entorno adecuado.

    Sugerencia

    En esta página se proporciona información relacionada con el id. de entorno de Dataverse, la dirección URL del entorno para Dataverse, la dirección URL de finanzas y operaciones. Almacene estos valores para usarlos en secciones posteriores.

  2. Vaya a Acceso > Usuarios > Ver todo.

  3. Seleccione Agregar usuario, escriba el usuario del agente recién creado y seleccione Agregar.

  4. En la página Administrar roles de seguridad, agregue los siguientes roles.

    • Rol de agente de IA de gastos
    • Administrador de configuración del agente de finanzas y operaciones
    • Personalizador del sistema
  5. Para confirmar las asignaciones de roles, seleccione Guardar.

Estos roles proporcionan acceso a los componentes de Dataverse y Power Automate que el agente necesita para funcionar.

Sugerencia

Si el usuario ya existe y solo necesita asignar roles, vaya al Centro de administración de Power Platform y seleccione el entorno adecuado.

  1. Vaya a Acceso > Usuarios > Ver todo.
  2. Seleccione el usuario del agente creado.
  3. Seleccione Administrar roles y asigne los roles.

Asignar el rol necesario en el entorno de finanzas y operaciones

Para asignar el rol ExpenseAgentRole en el entorno de finanzas y operaciones, siga estos pasos:

  1. En el entorno de finanzas y operaciones, vaya a Administración del sistema>Usuarios.
  2. Cree un registro de usuario para el usuario de agente.
  3. Después de crear el usuario, vaya a la sección roles del usuario, seleccione Asignar roles y busque ExpenseAgentRole.
  4. Haga clic en Guardar.

Nota:

ExpenseAgentRole está disponible en la versión de las aplicaciones de finanzas y operaciones de 10.0.44 (10.0.2263.81) y 10.0.45 (10.0.2345.6) y con Copilot para aplicaciones de finanzas y operaciones versión 1.0.3121.1

Asignar el acceso al acceso de buzón compartido

El usuario de agente debe tener el permiso de Microsoft Graph de Mail.Read.Shared. Este permiso permite al agente leer recibos del buzón compartido configurado durante la ejecución del flujo.

Para asignar acceso al acceso de buzón compartido, siga estos pasos:

  1. Vaya al Explorador de Microsoft Graph e inicie sesión con el usuario de agente creado.
  2. Seleccione el icono de usuario en la esquina superior derecha y > seleccione Consentimiento para permisos.
  3. Seleccione el menú desplegable para Correo>, busque Mail.Read.Shared>, seleccione Consentimiento y seleccione Aceptar.

Resumen de los roles requeridos para el usuario de agente creado

Medio ambiente Funciones Comentarios
Dataverse
  • Rol de agente de IA de gastos
  • Gestor de Configuración de Agentes de Finanzas y Operaciones
  • Personalizador del sistema
  • Los roles mencionados permiten al agente interactuar con variables de entorno, entidades virtuales y flujos de Power Automate que están conectadas a Dynamics 365 Finance.
    Finance and Operations
  • ExpenseAgentRole
  • Usuario del sistema
  • Este rol es necesario para que el agente cree y administre entradas de gastos en el entorno de aplicaciones de finanzas y operaciones.

    Nota: ExpenseAgentRole está disponible en la versión de las aplicaciones de finanzas y operaciones de 10.0.44 (10.0.2263.81) y 10.0.45 (10.0.2345.6) y con las aplicaciones de finanzas y operaciones de Copilot versión 1.0.3121.1
    Acceso al buzón compartido mediante el Explorador de gráficos Mail.Read.Shared Permiso de permite Microsoft Graph que permite al agente leer recibos del buzón compartido configurado durante la ejecución del flujo

    Paso 4: Configurar el buzón compartido

    El Agente de gastos usa un buzón compartido para recibir y procesar correos electrónicos de recibo. Un usuario con el rol Administrador de Exchange debe crear y configurar este buzón en el Centro de administración de Microsoft 365.

    Para crear y configurar el buzón compartido, siga estos pasos:

    1. Inicie sesión en el Centro de administración de Microsoft 365 con una cuenta de Administrador de Exchange.

    2. En el panel izquierdo, seleccione Equipos y grupos>Buzones compartidos.

      Sugerencia

      Es posible que tenga que seleccionar Mostrar todo para expandir la lista completa.

    3. Seleccione Agregar un buzón compartido.

    4. Escriba un nombre y una dirección de correo electrónico para el buzón compartido.

    5. Seleccione Guardar cambios.

    6. En Pasos siguientes, seleccione Agregar miembros a este buzón compartido. (La administración de miembros puede tardar unos minutos en estar disponible.)

    7. Seleccione Agregar miembros.

    8. Seleccione el usuario del agente creado y cualquier otro usuario que deba supervisar el buzón y seleccione Agregar.

    9. Selecciona Cerrar.

    Nota:

    Use la dirección de correo electrónico del buzón compartido en el paso siguiente. Después de configurar el buzón compartido, debe proporcionar su dirección de correo electrónico y la ruta de acceso de la carpeta (de forma predeterminada establecida en Bandeja de Entrada) como variables de entorno al configurar el Agente de Tiempo y Gastos. Para obtener más información, vea Paso 5: Configurar el agente de gastos.

    Paso 5: Configurar el Agente de gastos

    Tiene dos opciones para configurar el Agente de gastos:

    • Opción A: Usar un script de PowerShell (recomendado)
    • Opción B: Realizar la configuración manual en Power Apps (sin PowerShell)

    Importante

    Antes de continuar con la instalación del Agente de Gastos, asegúrese de que el agente se aprovisione correctamente en Microsoft Copilot Studio.

    Para comprobar que el agente se ha aprovisionado correctamente, siga estos pasos:

    1. Inicie sesión en Microsoft Copilot Studio y seleccione su entorno.
    2. Vaya a Agentes y busque ExpenseAgent-Line (versión preliminar).
    3. Compruebe que el botón Publicar está habilitado.
    4. Si está habilitado, continúe con la instalación. Si está deshabilitado, espere hasta que se aprovisione el agente.
    5. Repita estos pasos para comprobar que el Agente de entrada de gastos (versión preliminar) está habilitado.

    Sugerencia

    Si el aprovisionamiento de la aplicación de finanzas y operaciones de Copilot tarda más de 5 a 6 horas, desinstale y vuelva a instalar la aplicación para resolver posibles retrasos en la configuración. Para obtener más información, consulte la sección Uninstall Expense Agent al final de este artículo.

    La configuración manual del agente implica crear y vincular conexiones, habilitar flujos de Power Automate y publicar la solución. Este proceso puede llevar mucho tiempo y es susceptible a errores. Para automatizar la instalación, puede usar un script de PowerShell después de actualizar los parámetros necesarios.

    El script de PowerShell automatiza las siguientes tareas:

    • Actualiza las variables de entorno necesarias.
    • Vincula las conexiones de Microsoft Power Platform con referencias de conexión de soluciones.
    • Habilita todos los flujos de Power Automate que requiere el Agente de Tiempo y Gastos.
    • Publica los agentes de Copilot.
    • Publica la solución Dataverse.

    Antes de ejecutar el script, debe crear conexiones según sea necesario para proporcionar el id. de conexión para cada conector del archivo install.ps1. Para crear estas conexiones, siga estos pasos mediante el usuario del agente creado.

    1. Inicie sesión en Power Apps Maker Portal con el usuario del agente recién creado y seleccione su entorno.
    2. En el panel izquierdo, seleccione Más y Conexiones.
    3. Seleccione Nueva conexión y busque con el nombre de conexión de la tabla siguiente (por ejemplo, Office 365 Outlook).
    4. Seleccione el conector adecuado en la lista y créelo.
    5. Una vez creada la conexión, anote el usuario con el que se creó la conexión. Lo ideal es que sea el id. de usuario de agente creado. Este identificador de usuario debe actualizarse en el archivo de instalación que cree en el paso siguiente.
    6. Repita los pasos 3 y 4 para cada una de las conexiones necesarias restantes enumeradas en la tabla siguiente.
    Nombre de conexión Formatos de dirección URL de conexión
    Office 365 Outlook https://make.powerapps.com/environments/environmentID/connections
    / shared_office365/connectionID/details
    Usuarios de Office 365 https://make.powerapps.com/environments/environmentID/connections
    / shared_office365users/ID de conexión/detalles
    Equipos de Microsoft https://make.powerapps.com/environments/environmentID/connections
    / shared_teams/connectionID/detalles
    Microsoft Dataverse https://make.powerapps.com/environments/environmentID/connections
    / shared_commondataserviceforapps/connectionID/details
    Microsoft Copilot Studio (versión preliminar) https://make.powerapps.com/environments/environmentID/connections
    / shared_microsoftcopilotstudio/connectionID/details

    Información que necesita para crear el archivo de instalación

    Para crear el archivo de instalación, install.ps1, tenga la siguiente información disponible. (Puede hacer referencia a la tabla siguiente para obtener referencia).

    Parámetro Otros detalles
    Id. de entorno de Dataverse Escriba el id. de entorno que obtiene del Centro de administración de Power Platform.
    Valor de ejemplo: xxxx-xxxx-xxxx-xxx-xxxxxxxxxx
    URL de entorno de Dataverse Escriba la dirección URL del entorno desde el Centro de administración de Power Platform.
    Nota: Asegúrese de tener https:// al principio y ninguna barra diagonal "/" al final.
    Valor de ejemplo: https://org123.crm.contoso.com
    Dirección URL de instancia de finanzas y operaciones Escriba los detalles del entorno de finanzas y operaciones en el formato siguiente.
    Valor de ejemplo: https://org123.contoso.com
    Nota: Asegúrese de tener https:// al principio y ninguna barra diagonal ‘/’ al final.
    OutlookFolderPath Escriba la ruta de acceso de carpeta creada en el buzón compartido. Si no se crea ninguna otra carpeta, se establece como Bandeja de entrada de forma predeterminada.
    Valor de ejemplo: Bandeja de entrada
    Como procedimiento recomendado, cree una carpeta independiente para la administración de gastos.
    Id. de dirección de buzón Escriba la dirección de correo del buzón de recurso compartido recién creado.
    Valor de ejemplo: expenseagent@contoso.com
    Nombre de conexión de Microsoft Dataverse
    Nombre de conexión de Microsoft Copilot Studio
    Nombre de conexión de Microsoft Office Outlook
    Nombre de conexión de usuarios de Microsoft Office 365
    Nombre de conexión de Microsoft Teams
    La entrada para todos los nombres de conexión es la misma y corresponde al id. de correo electrónico del usuario de agente creado.

    Valor de ejemplo: createdexpenseagentuser@contoso.com

    Crear el archivo de script de instalación

    Cree un archivo de script de instalación copiando el código siguiente. Inserte las variables de entorno necesarias en el script y, a continuación, ejecute el script mediante PowerShell.

    Nota:

    Coloque el archivo de script de instalación en el escritorio local. No lo almacenes en One Drive.

    Cree un archivo de script de PowerShell con el código siguiente. Actualice los parámetros mencionados antes de ejecutar el script.

    Sugerencia

    Cuando Obligatorio = $true, PowerShell le pide que escriba los parámetros de forma interactiva, por lo que no es necesario actualizarlos directamente en el archivo de script.

    Si desea evitar la entrada manual y desea predefinir los parámetros dentro del script de instalación, establezca Obligatorio = $false en la sección Parámetros del código de ejemplo siguiente.

    Copie el código siguiente en el archivo de script de instalación y guárdelo como "Install.ps1". Actualice las variables en los campos de parámetro correspondientes de la sección param. Debe actualizar 10 variables.

    Sugerencia

    Use la tabla anterior como referencia y reemplace todos los valores de ejemplo por sus respectivos detalles.

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

    Para desencadenar el archivo de PowerShell, siga estos pasos:

    1. Abra PowerShell (versión mínima necesaria: PowerShell 7).
    2. Vaya a la ubicación donde guardó el archivo. (Use la <ubicación de archivo >cd de comando).
    3. Desencadene el script de instalación. (Use el comando '.\Install.ps1').
    4. Siga las instrucciones para iniciar sesión en Azure.
    5. Después de iniciar sesión, es posible que tenga que autorizar una vez más. (Use el id. de usuario dl agente creado.)

    Espere a que el script se ejecute completamente y busque el mensaje ¡Configuración del agente completada con éxito!

    Nota:

    El script anterior realiza estas acciones:

    • Establece variables de entorno.
    • Comprueba y vincula las referencias de conexión.
    • Habilita los flujos de Power Automate.
    • Publica los agentes de Copilot necesarios.
    • Publica la solución Dataverse.

    Una vez que el script se ejecuta correctamente, el Agente de gastos está completamente configurado y listo para usarse.

    Opción B: configuración manual en Power Apps (sin PowerShell)

    Si no desea usar el script de PowerShell, puede configurar manualmente el Agente de gastos mediante Power Apps. Este proceso implica la actualización de las variables de entorno, la habilitación de los flujos de Power Automate y la publicación de la solución.

    Actualizar variables de entorno

    Para actualizar las variables de entorno, siga estos pasos:

    1. Inicie sesión en Power Apps y seleccione el entorno que prefiera.

    2. Seleccione Soluciones y, a continuación, abra Solución predeterminada (o la solución donde está instalado el agente).

    3. Vaya a Variables de entorno y establezca los valores siguientes.

      Nombre de la variable Descripción
      Ruta de la carpeta de Outlook del gestor de gastos Especifique la ruta de acceso a carpeta que se supervisará en el buzón compartido (de forma predeterminada, Bandeja de entrada).
      ID de dirección de buzón compartido del agente de gastos Especifique la dirección de correo electrónico del buzón compartido. Para usar el buzón del usuario que ha iniciado sesión, escriba NA.
      URL de la instancia de Finanzas y Operaciones Especifique la dirección URL del entorno de aplicaciones de finanzas y operaciones (por ejemplo, https://org123.contoso.com).

    Habilitar flujos de Power Automate

    El Agente de gastos se basa en los siguientes flujos de Power Automate:

    • Comprobación de reintentos de entrada de gastos
    • Configuración de gastos
    • Obtener carpeta de previsión de gastos
    • Generar informe de gastos
    • Enviar tarjeta adaptable de informe de gastos
    • Coincidencia automática de gastos
    • Procesar correos electrónicos
    • Extraer identificadores de recibos no vinculados para invocación de Copilot
    • Extraer salida de recibos no vinculados mediante el complemento de Dataverse
    • Generar línea de gastos
    • Generar línea de gastos sin id. de proyecto ni id. de estado
    • Identificar id. de proyecto
    • Eventos de calendario de usuario
    • Procesar informe de gastos mediante copiloto
    • Invocación del agente de gastos para el procesamiento de recibos

    Para habilitar los flujos, siga estos pasos:

    1. Inicie sesión en Power Automate y seleccione el entorno.

    2. Seleccione Mis flujos.

    3. Para cada uno de los 15 flujos de la lista anterior, siga estos pasos:

      1. Encontrar el flujo.
      2. Seleccione Editar.
      3. Cambie a la vista Diseñador anterior desactivando la opción Nuevo diseñador.
      4. Autentique las conexiones necesarias (hasta que aparezcan marcas de verificación verdes).
      5. Seleccione Continuar y, después, Guardar.
      6. Seleccione Activar para habilitar el flujo.

    Publicar la solución

    Después de terminar de configurar todas las variables de entorno y los flujos, siga estos pasos para publicar la solución.

    1. En Power Apps, vaya a Soluciones.
    2. Seleccione el entorno y la solución.
    3. Seleccione Publicar todas las personalizaciones.

    Cuando complete estos pasos, el Agente de gastos está completamente configurado y listo para usarse.

    Paso 6: Habilitar el Agente de gastos en Microsoft Teams (opcional)

    Para habilitar la comunicación a través de Teams para el Agente de Gastos, agregue el canal de Teams al agente en Power Apps. Después, el agente puede enviar tarjetas adaptables a través de Teams.

    Habilitar el canal de Teams

    Para habilitar el canal de Teams, siga estos pasos:

    1. Inicie sesión en Copilot Studio y seleccione el entorno correcto.
    2. En la pestaña Agentes , seleccione Agente de entrada de gastos.
    3. En la vista del agente, en la pestaña Canales, seleccione Teams y Microsoft 365 Copilot.
    4. Seleccione Agregar canal para habilitar la integración de Teams y siga los pasos descritos en la sección Configurar la disponibilidad de aplicaciones de Teams para configurar quién desea compartir la aplicación.

    Obtenga más información en Abrir el panel de configuración para el canal de Teams y Microsoft 365.

    Configurar la disponibilidad de la aplicación de Teams

    Para configurar la disponibilidad de aplicaciones de Teams, siga estos pasos:

    1. Una vez creada la aplicación Teams, seleccione Opciones de disponibilidad.

    2. Seleccione con quién desea compartir la aplicación:

      • Usuarios específicos dentro de la organización
      • La organización entera
    3. Envíe la aplicación para su aprobación.

    Publicar la aplicación en el Centro de administración de Teams

    Para publicar la aplicación en el Centro de administración de Teams, siga estos pasos:

    1. Inicie sesión en el Centro de administración de Teams.
    2. Vaya a la aplicación Teams> Administrar aplicaciones. Busque "gastos" y seleccione Agente de entrada de gastos cuando el estado de la aplicación esté bloqueado.
    3. Seleccione Publicar para desbloquear la aplicación. Una vez completada correctamente la acción de publicación, asegúrese de que el estado de la aplicación cambia a desbloqueado.

    Obtenga más información en Conectar y configurar un agente para Teams y Microsoft 365.

    Con estos pasos completados, su Agente de gastos ya está totalmente configurado y listo para usarse.

    Nota:

    También puede proporcionar comentarios sobre las líneas de gastos e informes generados por el agente mediante los iconos de pulgares arriba y abajo y la ventana emergente de comentarios dentro del entorno de Dynamics 365 Finance.

    Desinstalar Agente de gastos

    Para desinstalar expense Agent, siga estos pasos:

    1. Inicie sesión en el portal de Creadores de Microsoft Power Apps.
    2. Seleccione Soluciones, busque msdyn_ExpenseAI, seleccione los tres puntos y seleccione Eliminar.
    3. Busque msdyn_FnOCopilotAnchor y elimine la solución.