Bagikan melalui


Menyiapkan Agen Pengeluaran (Pratinjau)

Penting

Berlaku untuk Dynamics 365 Project Operations yang Terintegrasi dengan ERP dan Dynamics 365 Project Operations untuk manufaktur

Agen Pengeluaran menyatukan kemampuan dari Microsoft Dynamics 365 Project Operations, aplikasi keuangan dan operasi, Microsoft Copilot Studio, Power Automate, dan Dataverse untuk mengotomatiskan alur kerja pemrosesan pengeluaran dengan menggunakan AI. Fitur ini membantu menghemat waktu dan mengurangi upaya manual dengan memungkinkan sistem Anda memproses tanda terima dan menghasilkan baris pengeluaran dan laporan pengeluaran untuk pengguna. Ini menggunakan konektor Microsoft Power Platform untuk integrasi dengan Outlook, Microsoft Teams, kalender pengguna, dan lingkungan aplikasi keuangan dan operasi melalui entitas virtual Dataverse.

Agen Pengeluaran mencakup beberapa alur, tiga di antaranya berfungsi sebagai orkestrator inti:

  • Proses Email – Alur ini memindai folder kotak surat yang dikonfigurasi setiap jam dan menyimpan lampiran sebagai tanda terima yang tidak terlampir di Dynamics 365 Finance.
  • Ekstrak ID Tanda Terima – Alur ini mengambil tanda terima yang tidak terlampir dan memicu agen untuk mengekstrak detail tanda terima dan membuat baris pengeluaran yang tidak terlampir.
  • Proses Laporan Pengeluaran – Alur ini mengonversi baris pengeluaran yang tidak terlampir dan menghasilkan laporan pengeluaran, berdasarkan Grup laporan berdasarkan konfigurasi yang Anda tetapkan dalam aplikasi untuk setiap badan hukum.

Selain itu, agen terintegrasi dengan Microsoft Teams, memungkinkan penggunaan kartu adaptif untuk peninjauan dan pengiriman laporan pengeluaran.

Agen mengandalkan beberapa konektor Microsoft Power Platform. Konektor ini secara otomatis direferensikan dalam alur Power Automate yang disediakan.

  • Outlook (Office 365) – Konektor ini mengakses kotak surat bersama untuk mengekstrak tanda terima.
  • Dataverse (Entitas Virtual) – Konektor ini terintegrasi dengan aplikasi keuangan dan operasi melalui entitas virtual.
  • Microsoft Copilot Studio – Konektor ini memanggil model AI untuk mengekstrak informasi tanda terima.
  • Microsoft Teams – Konektor ini mengirimkan kartu adaptif untuk interaksi pengguna (jika integrasi Teams diaktifkan).
  • Pengguna Microsoft 365 – Konektor ini mengambil detail kalender pengguna (opsional, jika penguraian tanda terima sadar konteks).

Prasyarat

  1. Lingkungan keuangan dan operasional: Anda memerlukan setidaknya versi 10.0.44 (10.0.2263.175 dan yang lebih baru) atau 10.0.45 (10.0.2345.115 dan yang lebih baru) atau 10.0.46 (10.0.2428.69 dan yang lebih baru) dari lingkungan keuangan dan operasi untuk menginstal agen.
  2. Peran yang diperlukan untuk menyiapkan pengguna Agen Pengeluaran: Untuk menyelesaikan langkah-langkah dalam artikel ini, Anda harus menjadi administrator sistem organisasi dan memiliki peran berikut untuk menyiapkan pengguna agen pengeluaran untuk menginstal Agen Pengeluaran.
System Role Komentar
pusat admin Power Platform Administrator sistem
  1. Buka pusat admin Power Platform
  2. Buka Kelola di panel kiri. Pilih Lingkungan, lalu pilih lingkungan Anda.
  3. Pada bagian Akses>Pengguna , pilih Lihat semua.
  4. Pilih pengguna, lalu pilih Kelola peran, dan tambahkan peran.
Keuangan dan operasi Administrator sistem
  1. Buka URL keuangan dan operasi untuk lingkungan lingkungan Anda.
  2. Buka Modul>Pengguna administrasi>, dan pilih pengguna.
  3. Pilih Tambahkan peran – Administrator sistem.
Microsoft 365 Administrator Exchange dan Administrator Pengguna
  1. Buka Microsoft 365 pusat admin.
  2. Buka Pengguna>Aktif> , pilih pengguna.
  3. Pilih Kelola Peran, lalu dari Peran pilih Administrator Exchange.
  4. Simpan perubahan.
  5. Ikuti langkah yang sama untuk menambahkan peran Administrator Pengguna .
Pusat admin Teams Administrator Teams Diperlukan jika Anda berencana untuk mengaktifkan integrasi Microsoft Teams

Langkah-langkah untuk menyiapkan Agen Pengeluaran

Untuk menginstal dan menyiapkan Agen Pengeluaran, ikuti langkah-langkah berikut:

  1. Instal Copilot untuk aplikasi keuangan dan operasi.
  2. Aktifkan fitur agen di lingkungan Anda.
  3. Buat pengguna pengeluaran untuk eksekusi agen.
  4. Menyiapkan kotak surat bersama.
  5. Siapkan Agen Pengeluaran.
  6. Aktifkan Agen Pengeluaran di Microsoft Teams (Opsional - jika Anda memerlukan integrasi Microsoft Teams)

Bagian berikut menjelaskan setiap langkah secara rinci.

Langkah 1: Instal Copilot untuk aplikasi keuangan dan operasi

Agen Pengeluaran tersedia sebagai bagian dari paket aplikasi Copilot untuk keuangan dan operasi. Setelah menginstal paket ini di lingkungan Anda, Anda secara otomatis mendapatkan semua aset yang diperlukan, termasuk agen, variabel lingkungan, dan alur Power Automate.

Untuk menginstal aplikasi yang diperlukan, ikuti langkah-langkah berikut:

  1. Buka pusat admin Power Platform di browser Anda.
  2. Dari daftar lingkungan, pilih nama lingkungan tempat Anda ingin menginstal aplikasi.
  3. Pada halaman detail lingkungan (BUKAN dari navigasi sebelah kiri), buka bagian Sumber Daya dan pilih aplikasi Dynamics 365.
  4. Cari aplikasi Copilot untuk keuangan dan operasi dalam daftar aplikasi Dynamics 365. Jika sudah diinstal dan pembaruan tersedia, pilih tombol Perbarui .
  5. Jika aplikasi tidak tercantum di bawah aplikasi Dynamics 365, pilih Instal aplikasi, pilih Copilot untuk aplikasi keuangan dan operasi, dan ikuti petunjuk untuk menyelesaikan penginstalan.
  6. Copilot untuk aplikasi Keuangan dan Operasi harus 1.0.3231.4 atau lebih baru

Nota

Pelajari selengkapnya tentang cara mengaktifkan Copilot di lingkungan Anda di Mengaktifkan kemampuan Copilot di aplikasi keuangan dan operasi.

Petunjuk / Saran

Untuk memverifikasi apakah paket berhasil diinstal, ikuti langkah-langkah berikut:

  1. Buka portal > pembuat Power Apps, pilih lingkungan > Anda, pilih Solusi > , Lihat riwayat > , pencarian dan pilih msdyn_ExpenseAI > Detail.
  2. Periksa bidang Hasil .
    1. Jika hasilnya menunjukkan Berhasil, paket telah diinstal dengan benar.
    2. Jika hasilnya tidak menunjukkan Berhasil, penginstalan gagal.
  3. Jika penginstalan gagal, hapus msdyn_FnOCopilotAnchor (lihat bagian penghapusan pemasangan) dan instal aplikasi Copilot untuk keuangan dan operasi lagi.

Langkah 2: Aktifkan fitur agen di lingkungan Anda

Setelah Anda menginstal paket aplikasi Copilot untuk keuangan dan operasi, aktifkan Agen Pengeluaran dari dalam lingkungan Dataverse dan keuangan dan operasi Anda.

Aktifkan fitur di Dataverse

Nyalakan bendera fitur Copilot di pusat admin Power Platform. Untuk mengaktifkan bendera fitur Copilot, ikuti langkah-langkah berikut:

  1. Buka pusat admin Power Platform.
  2. Pilih Lingkungan>, pilih lingkungan > Anda, Pengaturan>Produk>, pilih Fitur.
  3. Konfirmasikan bahwa bendera fitur Copilot diaktifkan.

Aktifkan fitur di lingkungan keuangan dan operasi Anda

Untuk mengaktifkan agen di aplikasi keuangan dan operasi, ikuti langkah-langkah berikut:

  1. Masuk ke lingkungan keuangan dan operasi Anda.
  2. Buka Manajemen Fitur, dan aktifkan fitur Beranda Imersif dan fitur Manajemen Agen .
  3. Untuk mengonfigurasi Agen Pengeluaran (penyiapan per badan hukum), bukaParameter Manajemen Pengeluaran>>Pengeluaran>.
  4. Pada tab Agen Entri Pengeluaran , konfigurasikan parameter seperti yang ditunjukkan pada tabel berikut.
Parameter-parameternya Nilai Komentar
Aktifkan Agen Pengeluaran untuk badan hukum saat ini Yes Beralih ke Ya untuk mengaktifkan agen untuk badan hukum saat ini.
Frekuensi Harian atau Mingguan Konfigurasikan frekuensi untuk membuat laporan pengeluaran secara otomatis di organisasi Anda.
Laporan Grup berdasarkan Perjalanan atau Proyek Konfigurasikan untuk mengelompokkan pengeluaran berdasarkan proyek atau perjalanan.

Langkah 3: Membuat pengguna agen pengeluaran untuk eksekusi agen

Buat pengguna agen pengeluaran khusus untuk memastikan bahwa agen berjalan secara independen dari identitas karyawan mana pun. Pendekatan ini membantu keamanan, pengelolaan, dan pemeliharaan jangka panjang. Meskipun Anda dapat menggunakan akun pengguna yang ada yang memiliki hak istimewa yang diperlukan, gunakan identitas milik sistem.

Membuat pengguna Agen Pengeluaran di ID Microsoft Entra

  1. Masuk ke portal Azure.
  2. Dari layanan Azure yang tersedia, pilih ID Microsoft Entra.
  3. Di bawah ID Microsoft Entra, buat pengguna baru.
  4. Pilih Tambahkan>Pengguna>Buat pengguna baru, dan masukkan detail berikut.
    • Nama utama pengguna
    • Pilih domain yang tepat
    • Nama tampilan
    • Kata sandi
    • Tandai Akun diaktifkan
  5. Untuk melihat detail dan menyelesaikan proses pembuatan pengguna, pilih Tinjau + buat, lalu pilih Buat.
  6. Dari halaman Pengguna (Kelola > Pengguna), pilih pengguna, dan halaman tampilan detail.
  7. Pilih Edit properti, navigasikan ke tab Pengaturan , dan isi lokasi penggunaan yang sesuai.

Nota

Bergantung pada kebijakan organisasi Anda, Anda mungkin diminta untuk mengubah kata sandi dan menyiapkan autentikasi multifaktor (MFA). Ikuti langkah-langkah seperti biasa untuk mengubah kata sandi dan menyiapkan MFA.

Menetapkan lisensi yang diperlukan ke pengguna Agen Pengeluaran

Agar berhasil menginstal Agen Pengeluaran, tetapkan lisensi berikut ke pengguna agen pengeluaran:

  • Lisensi Anggota Dynamics 365 Teams
  • Microsoft 365 Business Basic atau lisensi apa pun yang mencakup Microsoft Teams dan Outlook (misalnya, Office 365 E5 dengan tim)
  • Power Apps Premium

Untuk menetapkan lisensi, ikuti langkah-langkah berikut:

  1. Masuk ke pusat admin Microsoft 365 dengan pengguna yang memiliki akses untuk menetapkan lisensi yang merupakan pengguna dengan Administrator Lisensi atau lebih tinggi.
  2. PilihLisensi>>Lisensi Anggota Dynamics 365 Teams.
  3. Pilih +Tetapkan lisensi.
  4. Cari pengguna agen pengeluaran yang dibuat pada langkah sebelumnya.
  5. Pilih Tetapkan untuk menyelesaikan penetapan lisensi.
  6. Ikuti langkah 2 hingga 5 untuk lisensi lainnya – Microsoft 365 Business Basic dan Power Apps Premium juga.

Nota

Pelajari lebih lanjut cara memeriksa dan menetapkan lisensi di halaman Menggunakan halaman Pengguna aktif untuk menetapkan atau membatalkan penetapan lisensi.

Menambahkan pengguna ke lingkungan Power Platform

Untuk menambahkan pengguna ke lingkungan Power Platform, ikuti langkah-langkah berikut:

  1. Masuk ke pusat admin Power Platform, dan pilih lingkungan yang sesuai.

    Petunjuk / Saran

    Halaman ini memberikan informasi terkait ID Lingkungan untuk Dataverse, URL Lingkungan untuk Dataverse, URL keuangan dan operasi. Simpan nilai-nilai ini untuk digunakan di bagian selanjutnya.

  2. Buka Akses > Pengguna > Lihat semua.

  3. Pilih Tambahkan pengguna, masukkan pengguna agen yang baru dibuat, dan pilih Tambahkan.

  4. Pada halaman Kelola peran keamanan , tambahkan peran berikut.

    • Peran Agen AI Pengeluaran
    • Manajer Konfigurasi Agen Keuangan dan Operasi
    • Penyesuai Sistem
  5. Untuk mengonfirmasi penetapan peran, pilih Simpan.

Peran ini menyediakan akses ke komponen Dataverse dan Power Automate yang diperlukan agen untuk berfungsi.

Petunjuk / Saran

Jika pengguna sudah ada dan Anda hanya perlu menetapkan peran, buka pusat admin Power Platform, dan pilih lingkungan yang sesuai.

  1. Buka Akses > Pengguna > Lihat semua.
  2. Pilih pengguna agen yang dibuat.
  3. Pilih Kelola peran, dan tetapkan peran.

Tetapkan peran yang diperlukan dalam lingkungan keuangan dan operasi

Untuk menetapkan peran ExpenseAgentRole di lingkungan keuangan dan operasi, ikuti langkah-langkah berikut:

  1. Di lingkungan keuangan dan operasi, buka Pengguna administrasi> sistem.
  2. Buat rekaman pengguna untuk pengguna agen.
  3. Setelah membuat pengguna, buka bagian peran pengguna, pilih Tetapkan peran, dan cari ExpenseAgentRole.
  4. Pilih Simpan.

Nota

ExpenseAgentRole tersedia dalam versi aplikasi keuangan dan operasi dari 10.0.44 (10.0.2263.81) dan 10.0.45 (10.0.2345.6) dan dengan Copilot untuk aplikasi keuangan dan operasi versi 1.0.3121.1

Menetapkan akses ke akses kotak pesan bersama

Pengguna agen harus memiliki izin Microsoft Graph Mail.Read.Shared. Izin ini memungkinkan agen untuk membaca tanda terima dari kotak pesan bersama yang dikonfigurasi selama eksekusi alur.

Untuk menetapkan akses ke akses kotak pesan bersama, ikuti langkah-langkah berikut:

  1. Buka Microsoft Graph Explorer dan masuk dengan menggunakan pengguna agen yang dibuat.
  2. Pilih ikon pengguna di sudut > kanan atas, pilih Izin izin.
  3. Pilih menu drop-down untuk Mail> , cari Mail.Read.Shared,> pilih Consent, dan pilih Terima.

Ringkasan peran yang diperlukan untuk Pengguna Agen yang Dibuat

Lingkungan Peran Komentar
Dataverse
  • Peran Agen AI Pengeluaran
  • keuangan dan operasi Manajer Konfigurasi Agen
  • Penyesuai Sistem
  • Peran yang disebutkan memungkinkan agen untuk berinteraksi dengan alur Power Automate, variabel lingkungan, dan entitas virtual yang terhubung ke Dynamics 365 Finance
    Keuangan dan operasi
  • ExpenseAgentRole
  • Pengguna Sistem
  • Peran ini diperlukan bagi agen untuk membuat dan mengelola entri pengeluaran di lingkungan aplikasi keuangan dan operasi.

    Catatan: ExpenseAgentRole tersedia dalam versi aplikasi keuangan dan operasi dari 10.0.44 (10.0.2263.81) dan 10.0.45 (10.0.2345.6) dan dengan aplikasi Copilot untuk aplikasi keuangan dan operasi versi 1.0.3121.1
    Akses kotak pesan bersama menggunakan penjelajah Graph Mail.Baca.Dibagikan Izin Microsoft Graph yang memungkinkan agen membaca tanda terima dari kotak pesan bersama yang dikonfigurasi selama eksekusi alur

    Langkah 4: Siapkan kotak surat bersama

    Agen Pengeluaran menggunakan kotak surat bersama untuk menerima dan memproses email tanda terima. Pengguna dengan peran Administrator Exchange perlu membuat dan mengonfigurasi kotak pesan ini di Pusat Admin Microsoft 365.

    Untuk membuat dan mengonfigurasi kotak pesan bersama, ikuti langkah-langkah berikut:

    1. Masuk ke Pusat Admin Microsoft 365 dengan menggunakan akun Admin Exchange.

    2. Di panel kiri, pilihKotak pesan bersama>.

      Petunjuk / Saran

      Anda mungkin perlu memilih Tampilkan semua untuk memperluas daftar lengkap.

    3. Pilih Tambahkan kotak pesan bersama.

    4. Masukkan nama dan alamat email untuk kotak surat bersama.

    5. Pilih Simpan perubahan.

    6. Di bawah Langkah berikutnya, pilih Tambahkan anggota ke kotak pesan bersama ini. (Manajemen anggota mungkin membutuhkan waktu beberapa menit untuk tersedia.)

    7. Pilih Tambahkan anggota

    8. Pilih pengguna agen yang dibuat dan orang lain yang harus memantau kotak pesan, dan pilih Tambahkan.

    9. Pilih Tutup.

    Nota

    Anda menggunakan alamat email kotak surat bersama di langkah berikutnya. Setelah menyiapkan kotak pesan bersama, Anda harus memberikan alamat email dan jalur folder (secara default diatur ke Kotak Masuk) sebagai variabel lingkungan saat Anda mengonfigurasi Agen Waktu dan Pengeluaran. Untuk informasi selengkapnya, lihat Langkah 5: Menyiapkan Agen Pengeluaran.

    Langkah 5: Siapkan Agen Pengeluaran

    Anda memiliki dua opsi untuk menyiapkan Agen Pengeluaran:

    • Opsi A: Menggunakan skrip PowerShell (disarankan)
    • Opsi B: Lakukan penyiapan manual di Power Apps (tanpa PowerShell)

    Penting

    Sebelum melanjutkan penginstalan Agen Pengeluaran, pastikan agen berhasil disediakan di Microsoft Copilot Studio.

    Untuk memverifikasi agen berhasil disediakan, ikuti langkah-langkah berikut:

    1. Masuk ke Microsoft Copilot Studio dan pilih lingkungan Anda.
    2. Buka Agen dan cari ExpenseAgent-Line (Pratinjau).
    3. Pastikan tombol Terbitkan diaktifkan.
    4. Jika diaktifkan, lanjutkan dengan instalasi. Jika dinonaktifkan, tunggu hingga agen disediakan.
    5. Ulangi langkah-langkah ini untuk memverifikasi Agen Entri Pengeluaran (Pratinjau) diaktifkan.

    Petunjuk / Saran

    Jika penyediaan aplikasi keuangan dan operasi Copilot membutuhkan waktu lebih dari 5-6 jam, hapus instalan dan instal ulang aplikasi untuk mengatasi potensi penundaan penyiapan. Untuk informasi selengkapnya, lihat bagian Menghapus Pemasangan Agen Pengeluaran di akhir artikel ini.

    Penyiapan agen secara manual melibatkan pembuatan dan penautan koneksi, mengaktifkan alur Power Automate, dan menerbitkan solusi. Proses ini bisa memakan waktu dan rentan terhadap kesalahan. Untuk mengotomatiskan penyiapan, gunakan skrip PowerShell setelah memperbarui parameter yang diperlukan.

    Skrip PowerShell mengotomatiskan tugas-tugas berikut:

    • Memperbarui variabel lingkungan yang diperlukan.
    • Menautkan koneksi Microsoft Power Platform dengan referensi koneksi solusi.
    • Mengaktifkan semua alur Power Automate yang diperlukan Agen Waktu dan Pengeluaran.
    • Menerbitkan agen Copilot.
    • Memublikasikan solusi Dataverse.

    Sebelum menjalankan skrip, Anda perlu membuat koneksi karena Anda perlu memberikan ID Koneksi untuk setiap konektor dalam file install.ps1. Untuk membuat koneksi ini, ikuti langkah-langkah ini menggunakan pengguna agen yang dibuat.

    1. Masuk ke portal pembuat Power Apps dengan menggunakan pengguna agen yang baru dibuat, dan pilih lingkungan Anda.
    2. Di panel kiri, pilih Lainnya dan pilih Koneksi.
    3. Pilih Koneksi baru dan cari dengan menggunakan Nama Koneksi dari tabel berikut (misalnya, Office 365 Outlook).
    4. Pilih konektor yang sesuai dari daftar dan buat.
    5. Setelah koneksi dibuat, perhatikan pengguna yang membuat koneksi. Idealnya ID pengguna agen yang dibuat. Perbarui ID pengguna ini dalam file penginstalan yang Anda buat di langkah berikutnya.
    6. Ulangi langkah 3 dan 4 untuk masing-masing sambungan yang diperlukan yang tersisa yang tercantum dalam tabel berikut.
    Nama Koneksi Format URL Koneksi
    Office 365 Outlook https://make.powerapps.com/environments/environmentID/connections
    / shared_office365/connectionID/detail
    Pengguna Office 365 https://make.powerapps.com/environments/environmentID/connections
    / shared_office365users/connectionID/detail
    Microsoft Teams https://make.powerapps.com/environments/environmentID/connections
    / shared_teams/connectionID/detail
    Microsoft Dataverse https://make.powerapps.com/environments/environmentID/connections
    / shared_commondataserviceforapps/connectionID/detail
    Microsoft Copilot Studio (pratinjau) https://make.powerapps.com/environments/environmentID/connections
    / shared_microsoftcopilotstudio/connectionID/detail

    Informasi yang Anda perlukan untuk membuat file instalasi

    Untuk membuat file instalasi - install.ps1, miliki informasi berikut yang tersedia. (Anda dapat merujuk ke tabel berikut untuk referensi.)

    Pengaturan Detail lainnya
    ID lingkungan Dataverse Masukkan ID lingkungan yang Anda dapatkan dari pusat admin Power Platform.
    Nilai sampel: xxxx-xxxx-xxxx-xxxxxx-xxxxxxx
    URL lingkungan Dataverse Masukkan URL Lingkungan dari pusat admin Power Platform.
    Catatan: Pastikan https:// di awal dan tidak ada garis miring ke depan '/' di akhir.
    Nilai sampel: https://org123.crm.contoso.com
    URL instans keuangan dan operasi Masukkan detail lingkungan keuangan dan operasi dalam format berikut.
    Nilai sampel: https://org123.contoso.com
    Catatan: Pastikan https:// di awal dan tidak ada garis miring ke depan '/' di akhir.
    OutlookFolderPath Masukkan jalur folder yang dibuat di kotak surat bersama. Jika tidak ada folder lain yang dibuat, folder tersebut ditetapkan sebagai Kotak Masuk secara default.
    Nilai sampel: Kotak masuk
    Sebagai praktik terbaik, buat folder terpisah untuk pengelolaan pengeluaran
    ID Alamat Kotak Surat Masukkan alamat email kotak pesan bersama yang baru dibuat
    Nilai sampel: expenseagent@contoso.com
    Nama koneksi Microsoft Dataverse
    Nama koneksi Microsoft Copilot Studio
    Nama koneksi Microsoft Office Outlook
    Nama koneksi Pengguna Microsoft Office 365
    Nama koneksi Microsoft Teams
    Input ke semua nama koneksi sama dan merupakan ID email pengguna dari pengguna agen yang dibuat.

    Nilai sampel: createdexpenseagentuser@contoso.com

    Buat file skrip instalasi

    Buat file skrip instalasi dengan menyalin kode berikut. Sisipkan variabel lingkungan yang diperlukan ke dalam skrip, lalu jalankan skrip menggunakan PowerShell.

    Nota

    Tempatkan file skrip instalasi di desktop lokal. Jangan simpan di One Drive.

    Buat file skrip PowerShell dengan kode berikut. Perbarui parameter yang disebutkan sebelum menjalankan skrip.

    Petunjuk / Saran

    Saat Wajib = $true, PowerShell meminta Anda untuk memasukkan parameter secara interaktif, sehingga Anda tidak perlu memperbaruinya secara langsung dalam file skrip.

    Jika Anda ingin menghindari input manual dan ingin menentukan parameter dalam skrip penginstalan, atur Wajib = $false di bagian Param dari kode sampel berikut.

    Salin kode berikut ke dalam file skrip instalasi Anda dan simpan sebagai 'Install.ps1'. Perbarui variabel di bidang parameter masing-masing di bagian param. Anda perlu memperbarui 10 variabel.

    Petunjuk / Saran

    Gunakan tabel sebelumnya sebagai referensi dan ganti semua nilai sampel dengan detail Anda masing-masing.

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

    Untuk memicu file PowerShell, ikuti langkah-langkah berikut:

    1. Buka PowerShell (versi minimum diperlukan - PowerShell 7).
    2. Buka lokasi tempat Anda menyimpan file. (Gunakan perintah cd <file lokasi>).
    3. Picu skrip instalasi. (Gunakan perintah '.\Install.ps1').
    4. Ikuti petunjuk untuk masuk ke Azure.
    5. Setelah masuk, Anda mungkin perlu mengotorisasi sekali lagi. (Gunakan id pengguna agen yang dibuat.).

    Tunggu hingga skrip berjalan sepenuhnya dan cari pesan Penyiapan agen berhasil diselesaikan!

    Nota

    Skrip sebelumnya melakukan tindakan berikut:

    • Mengatur variabel lingkungan.
    • Memverifikasi dan menautkan referensi koneksi.
    • Mengaktifkan aliran Power Automate.
    • Menerbitkan agen Copilot yang diperlukan.
    • Memublikasikan solusi Dataverse.

    Setelah skrip berhasil berjalan, Expense Agent sepenuhnya dikonfigurasi dan siap digunakan.

    Opsi B: Menyiapkan secara manual di Power Apps (tanpa PowerShell)

    Jika Anda tidak ingin menggunakan skrip PowerShell, Anda dapat mengonfigurasi Agen Pengeluaran secara manual melalui Power Apps. Proses ini melibatkan pembaruan variabel lingkungan, mengaktifkan alur Power Automate, dan menerbitkan solusi.

    Memperbarui variabel lingkungan

    Untuk memperbarui variabel lingkungan, ikuti langkah-langkah berikut:

    1. Masuk Power Apps, dan pilih lingkungan Anda.

    2. Pilih Solusi, lalu buka Solusi Default (atau solusi tempat agen diinstal).

    3. Buka Variabel Lingkungan, dan atur nilai berikut.

      Nama variabel Deskripsi
      Jalur Folder Outlook Agen Pengeluaran Tentukan jalur folder yang akan dipantau di kotak pesan bersama (secara default, Kotak Masuk).
      ID Alamat Kotak Surat Bersama Agen Pengeluaran Tentukan alamat email kotak surat bersama. Untuk menggunakan kotak pesan pengguna yang masuk, masukkan NA.
      URL Instans Keuangan dan Operasi Tentukan URL lingkungan aplikasi keuangan dan operasi (misalnya, https://org123.contoso.com).

    Mengaktifkan Power Automate alur

    Agen Pengeluaran mengandalkan alur Power Automate berikut:

    • Pemeriksaan coba ulang entri pengeluaran
    • Konfigurasi pengeluaran
    • Dapatkan folder outlook pengeluaran
    • Hasilkan laporan pengeluaran
    • Kartu adaptif kirim laporan pengeluaran
    • Biaya pencocokan otomatis
    • Memproses email
    • Mengekstrak ID tanda terima yang tidak terlampir untuk pemanggilan copilot
    • Mengekstrak output tanda terima yang tidak terlampir menggunakan plugin Dataverse
    • Hasilkan baris pengeluaran
    • Hasilkan baris pengeluaran tanpa ID proyek dan ID status
    • Mengidentifikasi ID proyek
    • Acara kalender pengguna
    • Memproses laporan pengeluaran menggunakan copilot
    • Memanggil agen pengeluaran untuk pemrosesan tanda terima

    Untuk mengaktifkan alur, ikuti langkah-langkah berikut:

    1. Masuk ke Power Automate, dan pilih lingkungan Anda.

    2. Pilih Alur Saya.

    3. Untuk masing-masing dari 15 alur dalam daftar sebelumnya, ikuti langkah-langkah berikut:

      1. Temukan alurnya.
      2. Pilih Edit.
      3. Beralih ke tampilan Desainer Lama dengan menonaktifkan opsi Desainer Baru .
      4. Autentikasi koneksi yang diperlukan (hingga tanda centang hijau muncul).
      5. Pilih Lanjutkan lalu pilih Simpan.
      6. Pilih Aktifkan untuk mengaktifkan alur.

    Publikasikan solusi

    Setelah Anda selesai mengonfigurasi semua variabel dan alur lingkungan, ikuti langkah-langkah ini untuk menerbitkan solusi.

    1. Di Power Apps, buka Solusi.
    2. Pilih lingkungan dan solusi Anda.
    3. Pilih Publikasikan semua penyesuaian.

    Saat Anda menyelesaikan langkah-langkah ini, Agen Pengeluaran sepenuhnya dikonfigurasi dan siap digunakan.

    Langkah 6: Aktifkan Agen Pengeluaran di Microsoft Teams (Opsional)

    Untuk mengaktifkan komunikasi berbasis Teams untuk Agen Pengeluaran, tambahkan saluran Teams ke agen di Power Apps. Agen kemudian dapat mengirim kartu adaptif melalui Teams.

    Mengaktifkan saluran Teams

    Untuk mengaktifkan saluran Teams, ikuti langkah-langkah berikut:

    1. Masuk ke Copilot Studio dan pilih lingkungan yang benar.
    2. Pada tab Agen , pilih Agen Entri Pengeluaran.
    3. Dalam tampilan agen, pada tab Saluran , pilih Teams dan Microsoft 365 Copilot.
    4. Pilih Tambahkan saluran untuk mengaktifkan integrasi Teams dan ikuti langkah-langkah di bagian Konfigurasikan ketersediaan aplikasi Teams untuk mengonfigurasi siapa yang ingin Anda bagikan aplikasi.

    Pelajari selengkapnya di Buka panel konfigurasi untuk saluran Teams + Microsoft 365.

    Mengonfigurasi ketersediaan aplikasi Teams

    Untuk mengonfigurasi ketersediaan aplikasi Teams, ikuti langkah-langkah berikut:

    1. Setelah aplikasi Teams dibuat, pilih Opsi Ketersediaan.

    2. Pilih dengan siapa Anda ingin berbagi aplikasi:

      • Pengguna tertentu dalam organisasi
      • Seluruh organisasi
    3. Kirim aplikasi untuk disetujui.

    Menerbitkan aplikasi di pusat admin Teams

    Untuk menerbitkan aplikasi di pusat admin Teams, ikuti langkah-langkah berikut:

    1. Masuk ke pusat admin Teams.
    2. Buka aplikasi > teams Kelola aplikasi. Cari "pengeluaran" dan pilih aplikasi Agen Entri Pengeluaran tempat status aplikasi diblokir.
    3. Pilih Terbitkan untuk membuka blokir aplikasi. Setelah tindakan publikasi berhasil diselesaikan, pastikan status Aplikasi berubah menjadi tidak diblokir.

    Pelajari selengkapnya di Connect dan konfigurasikan agen untuk Teams dan Microsoft 365.

    Setelah Anda menyelesaikan langkah-langkah ini, Agen Pengeluaran Anda siap digunakan.

    Nota

    Anda juga dapat memberikan umpan balik tentang baris dan laporan pengeluaran yang dihasilkan agen dengan menggunakan ikon jempol ke atas dan jempol ke bawah dan pop-up umpan balik dalam lingkungan Dynamics 365 Finance.

    Menghapus Pemasangan Agen Pengeluaran

    Untuk menghapus instalan Agen Pengeluaran, ikuti langkah-langkah berikut:

    1. Masuk ke portal pembuat Microsoft Power Apps.
    2. Pilih Solusi, cari msdyn_ExpenseAI, pilih tiga titik, dan pilih Hapus.
    3. Cari msdyn_FnOCopilotAnchor dan hapus solusinya.