Aracılığıyla paylaş


Gider Aracısını ayarlama (Önizleme)

Önemli

Üretim için ERP ve Dynamics 365 Project Operations ile entegre Dynamics 365 Project Operations için geçerlidir

Gider Aracısı, yapay zeka kullanarak gider işleme iş akışlarını otomatikleştirmek için Microsoft Dynamics 365 Project Operations, finans ve operasyon uygulamaları, Microsoft Copilot Studio, Power Automate ve Dataverse'den gelen yetenekleri bir araya getiriyor. Bu özellik, sisteminizin makbuzları işlemesine ve kullanıcılar için gider satırları ve gider raporları oluşturmasına olanak tanıyarak zamandan tasarruf etmeye ve el ile çabayı azaltmaya yardımcı olur. Dataverse sanal varlıkları aracılığıyla Outlook, Microsoft Teams, kullanıcı takvimleri ve finans ve operasyon uygulamaları ortamıyla tümleştirme için Microsoft Power Platform bağlayıcılarını kullanır.

Gider Aracısı, üçü temel düzenleyiciler olarak hizmet veren birden fazla akışı içerir:

  • E-postaları İşleme – Bu akış, yapılandırılmış bir posta kutusu klasörünü saatte bir tarar ve ekleri Dynamics 365 Finance'da eklenmemiş alındı bilgileri olarak depolar.
  • Makbuz Kimliklerini Ayıkla – Bu akış eklenmemiş makbuzları alır ve alındı bilgilerini ayıklamak ve eklenmemiş bir gider satırı oluşturmak için aracıyı tetikler.
  • İşlem Gider Raporu – Bu akış, eklenmemiş gider satırlarını dönüştürür ve her tüzel kişilik için uygulamada ayarladığınız Yapılandırmaya göre grup raporları temelinde gider raporları oluşturur.

Ayrıca, aracı Microsoft Teams ile tümleştirildiğinden gider raporu incelemesi ve gönderimi için uyarlamalı kartların kullanılmasına olanak tanır.

Aracı, birkaç Microsoft Power Platform bağlayıcısını kullanır. Bu bağlayıcılara, sağlanan Power Automate akışlarında otomatik olarak başvurulur.

  • Outlook (Office 365) – Bu bağlayıcı, alındı bilgilerini ayıklamak için paylaşılan posta kutusuna erişir.
  • Dataverse (Sanal Varlıklar) – Bu bağlayıcı, sanal varlıklar aracılığıyla finans ve operasyon uygulamalarıyla tümleşir.
  • Microsoft Copilot Studio – Bu bağlayıcı, makbuz bilgilerini ayıklamak için yapay zeka modellerini çağırır.
  • Microsoft Teams – Bu bağlayıcı kullanıcı etkileşimleri için uyarlamalı kartlar gönderir (Teams tümleştirmesi etkinleştirildiyse).
  • Microsoft 365 Kullanıcıları – Bu bağlayıcı, kullanıcı takvimi ayrıntılarını alır (makbuz ayrıştırma bağlama duyarlıysa isteğe bağlıdır).

Önkoşullar

  1. Finans ve operasyon ortamı: Aracıyı yüklemek için en az finans ve operasyon ortamının 10.0.44 (10.0.2263.175 ve üzeri) veya 10.0.45 (10.0.2345.115 ve üzeri) veya 10.0.46 (10.0.2428.69 ve üzeri) sürümüne ihtiyacınız vardır.
  2. Expense Agent kullanıcısını ayarlamak için gereken roller: Bu makaledeki adımları tamamlamak için kuruluşun sistem yöneticisi olmanız ve Gider Aracısı'nı yüklemek üzere gider aracısı kullanıcısını ayarlamak üzere aşağıdaki rollere sahip olmanız gerekir.
System Rol Comments
Power Platform yönetim merkezi Sistem yöneticisi
  1. Power Platform yönetim merkezi'ne gidin
  2. Sol bölmedeki Yönet'e gidin. Ortamlar'ı seçin ve ardından ortamınızı belirleyin.
  3. Erişim>Kullanıcılar bölümünde Tümünü gör seçeneğini belirleyin.
  4. Bir kullanıcı seçin, ardından Rolleri yönet'i seçin ve rolü ekleyin.
Finance and Operations Sistem yöneticisi
  1. Ortam ortamınız için finans ve operasyon URL'sini açın.
  2. Modül>SistemYönetim>Kullanıcılar'a gidin ve bir kullanıcı seçin.
  3. Rol ekle – Sistem yöneticisi'ni seçin.
Microsoft 365 Exchange Yöneticisi ve Kullanıcı Yöneticisi
  1. Microsoft 365 yönetim merkezine gidin.
  2. Kullanıcılar>Etkin kullanıcılar>'a gidin ve kullanıcı seçin.
  3. Rolleri Yönet'i seçin, ardından Roller'den Exchange Yöneticisi'ni seçin.
  4. Değişiklikleri kaydedin.
  5. Kullanıcı Yöneticisi rolünü eklemek için aynı adımları izleyin.
Teams yönetim merkezi Teams Yöneticisi Microsoft Teams tümleştirmesini etkinleştirmeyi planlıyorsanız gereklidir

Gider Aracısı'nı ayarlama adımları

Expense Agent'ı yüklemek ve ayarlamak için şu adımları izleyin:

  1. Finans ve operasyon uygulamaları için Copilot'ı yükleyin.
  2. Ortamınızdaki aracı özelliklerini etkinleştirin.
  3. Aracı yürütme için bir gider kullanıcısı oluşturun.
  4. Paylaşılan posta kutusu ayarlama.
  5. Gider Aracısını ayarlama.
  6. Microsoft Teams'de Gider Aracısı'nı etkinleştirme (İsteğe bağlı - Microsoft Teams tümleştirmesine ihtiyacınız varsa)

Aşağıdaki bölümlerde her adım ayrıntılı olarak açıklanmaktadır.

1. Adım: Finans ve operasyon uygulamaları için Copilot'ı yükleyin

Gider aracısı, Copilot for finans ve operasyonlar apps paketinin bir parçası olarak kullanılabilir. Bu paketi ortamınıza yükledikten sonra aracı, ortam değişkenleri ve Power Automate akışları dahil olmak üzere tüm gerekli varlıkları otomatik olarak alırsınız.

Gerekli uygulamayı yüklemek için şu adımları izleyin:

  1. Tarayıcınızda Power Platform yönetim merkezine gidin.
  2. Ortam listesinden uygulamayı yüklemek istediğiniz ortam adını seçin.
  3. Ortamın ayrıntılar sayfasında (sol gezintiden DEĞİl ) Kaynaklar bölümüne gidin ve Dynamics 365 uygulamaları'nı seçin.
  4. Dynamics 365 uygulamaları listesinde Finans ve operasyon uygulamaları için Copilot öğesini arayın. Zaten yüklüyse ve bir güncelleştirme varsa Güncelleştir düğmesini seçin.
  5. Uygulama Dynamics 365 uygulamaları altında listelenmiyorsa Uygulamayı yükle'yi seçin, finans ve operasyon uygulamaları için Copilot'u seçin ve yönergeleri izleyerek yüklemeyi tamamlayın.
  6. Finans ve operasyon uygulamaları için Copilot 1.0.3231.4 veya üzeri olmalıdır

Uyarı

Copilot'ı ortamınızda etkinleştirme hakkında daha fazla bilgi için bkz. Finans ve operasyon uygulamalarında Copilot özelliklerini etkinleştirme.

Tavsiye

Paketin başarıyla yüklenip yüklenmediğini doğrulamak için şu adımları izleyin:

  1. Power Apps Maker Portal'a gidin > ortamınızı seçin > Çözümler'i seçin > Geçmişi görüntüle > arayın ve msdyn_ExpenseAI > Ayrıntılar'ı seçin.
  2. Sonuç alanını denetleyin.
    1. Sonuç Başarılı'yı gösterirse paket doğru şekilde yüklenmiştir.
    2. Sonuç Başarılı'yı göstermezse yükleme başarısız olur.
  3. Yükleme başarısız olursa msdyn_FnOCopilotAnchor silin (kaldırma bölümüne bakın) ve finans ve operasyon uygulamaları için Copilot'u yeniden yükleyin.

Adım 2: Ortamınızdaki aracı özelliklerini etkinleştirin

Finans ve operasyon uygulamaları için Copilot paketini yükledikten sonra, Expense Agent'ı Dataverse ve finans ve operasyon ortamınızdan etkinleştirin.

Dataverse'te özellik etkinleştirme

Power Platform yönetim merkezinde Copilot özellik bayrağını açın. Copilot özellik bayrağını açmak için şu adımları izleyin:

  1. Power Platform yönetim merkezi'ne gidin.
  2. Ortamlar>'ı seçin, ortamınızı seçin >Ayarlar>Ürün>'ü seçin Özellikler'i seçin.
  3. Copilot özellik bayrağının açık olduğundan emin olun.

Finans ve operasyon ortamınızda özelliği etkinleştirme

Finans ve operasyon uygulamalarında aracıyı etkinleştirmek için şu adımları izleyin:

  1. Finans ve operasyon ortamınıza giriş yapın.
  2. Özellik Yönetimi'ne gidin ve Tam Ekran Giriş Sayfası özelliği ve Aracı Yönetimi özelliklerini etkinleştirin.
  3. Gider Aracısını yapılandırmak için (kurulum tüzel kişi başına yapılır), Gider Yönetimi>Kurulum>Genel>Gider Yönetimi parametreleri'ne gidin.
  4. Gider Girişi Aracısı sekmesinde, aşağıdaki tabloda gösterildiği gibi parametreleri yapılandırın.
Parametreler Değer Comments
Geçerli tüzel kişilik için Gider Aracısı'nı etkinleştirme Yes Aracıyı geçerli tüzel kişilik için etkinleştirmek için Evet'e geçin.
Sıklık Günlük veya Haftalık Kuruluşunuzda gider raporlarını otomatik olarak oluşturmak için sıklığı yapılandırın.
Raporları gruplandırma ölçütü Gezi veya Proje Giderleri bir projeye veya geziye göre gruplandıracak şekilde yapılandırın.

3. Adım: Aracı yürütmek için bir gider aracısı kullanıcısı oluşturun

Aracının herhangi bir çalışanın kimliğinden bağımsız olarak çalıştığından emin olmak için özel bir gider aracısı kullanıcısı oluşturun. Bu yaklaşım güvenlik, yönetilebilirlik ve uzun süreli bakım konusunda yardımcı olur. Gerekli ayrıcalıklara sahip mevcut bir kullanıcı hesabını kullanabilirsiniz ancak sisteme ait bir kimlik kullanın.

Microsoft Entra Id'de Expense Agent kullanıcısını oluşturma

  1. Azure portalınaoturum açın.
  2. Kullanılabilir Azure hizmetlerinden Microsoft Entra ID'yi seçin.
  3. Microsoft Entra ID altında yeni bir kullanıcı oluşturun.
  4. Ekle>Kullanıcı>Yeni kullanıcı oluştur öğesini seçin ve aşağıdaki bilgileri girin.
    • Kullanıcı asıl adı
    • Doğru alan adını seçme
    • Ekran adı
    • Şifre
    • Hesap etkinleştirildi işaretle
  5. Ayrıntıları görüntülemek ve kullanıcı oluşturma sürecini tamamlamak için İncele + oluştur'u seçin ve Oluştur'u seçin.
  6. Kullanıcı sayfasından (Yönet > Kullanıcılar) bir kullanıcı seçin ve ayrıntıları görüntüle sayfasını seçin.
  7. Özellikleri düzenle'yi seçin, Ayarlar sekmesine gidin ve uygun kullanım konumunu doldurun.

Uyarı

Kuruluş ilkenize bağlı olarak, parolanızı değiştirmeniz ve çok faktörlü kimlik doğrulaması (MFA) ayarlamanız gerekebilir. Parolayı değiştirmek ve MFA'yı ayarlamak için normalde yaptığınız adımları izleyin.

Gerekli lisansları Gider Aracısı kullanıcısına atama

Expense Agent'ı başarıyla yüklemek için gider aracısı kullanıcısına aşağıdaki lisansları atayın:

  • Dynamics 365 Teams Members lisansı
  • Microsoft 365 İş Temel veya Microsoft Teams ve Outlook'u kapsayan herhangi bir lisans (örneğin, Ekiplerle Office 365 E5)
  • Power Apps Premium (Premium Sürümü)

Lisans atamak için şu adımları izleyin:

  1. Lisans Yöneticisi veya daha üst düzey yetkiye sahip bir kullanıcıyla Microsoft 365 yönetim merkezine giriş yapın.
  2. Faturalandırma>Lisanslar>Dynamics 365 Teams Üyeleri lisansı'nı seçin.
  3. +Lisans ata'yı seçin.
  4. Önceki adımda kullanıcının oluşturduğu gider aracısı için arama yapın.
  5. Lisans atamasını tamamlamak için Ata'yı seçin.
  6. Microsoft 365 İş Temel ve Power Apps Premium gibi diğer lisanslar için 2- 5. adımları izleyin.

Uyarı

Lisansların nasıl kontrol edileceği ve atanacağı hakkında daha fazla bilgi edinmek için Lisansları atamak veya atamalarını kaldırmak için Etkin kullanıcılar sayfasını kullanın konusuna bakın.

Kullanıcıyı Power Platform ortamına ekleme

Kullanıcıyı Power Platform ortamına eklemek için şu adımları izleyin:

  1. Power Platform yönetim merkezine giriş yapın ve uygun ortamı seçin.

    Tavsiye

    Bu sayfa Dataverse için Ortam Kimliği, Dataverse için Ortam URL'si, finans ve operasyon URL'si ile ilgili bilgileri sağlar. Bu değerleri sonraki bölümlerde kullanmak üzere depolayın.

  2. Erişim > Kullanıcılar > Tümünü gör'e gidin.

  3. Kullanıcı ekle'yi seçin, yeni oluşturulan aracı kullanıcıyı girin ve Ekle'yi seçin.

  4. Güvenlik rollerini yönet sayfasında aşağıdaki rolleri ekleyin.

    • Gider AI Destekli Aracı Rolü
    • Finans ve Operasyonlar Temsilci Yapılandırma Yöneticisi
    • Sistem Özelleştirici
  5. Rol atamasını onaylamak için Kaydet'i seçin.

Bu roller, aracının çalışması için gereken Dataverse ve Power Automate bileşenlerine erişim sağlar.

Tavsiye

Kullanıcı zaten varsa ve yalnızca rol atamanız gerekiyorsa Power Platform yönetim merkezine gidin ve uygun ortamı seçin.

  1. Erişim > Kullanıcılar > Tümünü gör'e gidin.
  2. Oluşturulan aracı kullanıcısını seçin.
  3. Rolleri yönet'i seçin ve rolleri atayın.

Finans ve operasyon ortamında gerekli rolü atama

Finans ve operasyon ortamında ExpenseAgentRole rolünü atamak için şu adımları izleyin:

  1. Finans ve operasyon ortamında Sistem yönetimi>Kullanıcılar'a gidin.
  2. Aracı kullanıcı için bir kullanıcı kaydı oluşturun.
  3. Kullanıcıyı oluşturduktan sonra roller bölümüne gidin, Rol ata'yı seçin ve ExpenseAgentRole araması yapın.
  4. Kaydetseçeneğini seçin.

Uyarı

ExpenseAgentRole, 10.0.44 (10.0.2263.81) ve 10.0.45 (10.0.2345.6) sürümlerindeki finans ve operasyon uygulamaları sürümlerinde ve Finans ve operasyon uygulamaları için Copilot sürümünde 1.0.3121.1 ile kullanılabilir

Paylaşılan posta kutusu erişimine erişim atama

Aracı kullanıcısının Mail.Read.Shared Microsoft Graph izni olmalıdır. Bu izin, aracının akış yürütme sırasında yapılandırılmış paylaşılan posta kutusundan gelen alındı bilgilerini okumasına olanak tanır.

Paylaşılan posta kutusu erişimine erişim atamak için şu adımları izleyin:

  1. Microsoft Graph Gezgini'ne gidin ve oluşturulan aracı kullanıcısını kullanarak oturum açın.
  2. Sağ üst köşedeki kullanıcı simgesini seçin >İzinlere onay ver seçeneğini belirleyin.
  3. Posta> açılır menüsünü seçin, Mail.Read.Shared> öğesini arayın, İzin öğesini seçin ve Kabul Et öğesini seçin.

Oluşturulan Aracı Kullanıcısı için gerekli rollerin özeti

Çevre Görevler Comments
Dataverse
  • Gider AI Destekli Aracı Rolü
  • finans ve operasyonlar Aracı Yapılandırma Yöneticisi
  • Sistem Özelleştirici
  • Bahsedilen roller, aracının Dynamics 365 Finance'a bağlı Power Automate akışları, ortam değişkenleri ve sanal varlıklarla etkileşim kurmasını sağlar
    Finance and Operations
  • ExpenseAgentRole
  • Sistem kullanıcısı
  • Bu rol, aracının finans ve operasyon uygulamaları ortamında gider girişleri oluşturması ve yönetmesi için gereklidir.

    Not: ExpenseAgentRole, 10.0.44 (10.0.2263.81) ve 10.0.45 (10.0.2345.6) sürümlerindeki finans ve operasyon uygulamaları sürümlerinde ve Finans ve operasyon uygulamaları için Copilot sürümünde 1.0.3121.1 kullanılabilir
    Graph gezginini kullanarak paylaşılan posta kutusu erişimi Mail.Read.Shared Akış yürütme sırasında aracının yapılandırılmış paylaşılan posta kutusundan makbuzları okumasına olanak tanıyan Microsoft Graph izni

    4. Adım: Paylaşılan posta kutusunu ayarlama

    Gider Aracısı, makbuz e-postalarını almak ve işlemek için paylaşılan bir posta kutusu kullanır. Exchange Yöneticisi rolüne sahip bir kullanıcının Bu posta kutusunu Microsoft 365 Yönetim Merkezi'nde oluşturması ve yapılandırması gerekir.

    Paylaşılan posta kutusunu oluşturmak ve yapılandırmak için şu adımları izleyin:

    1. Exchange Yönetici hesabını kullanarak Microsoft 365 Yönetim Merkezi'nde oturum açın.

    2. Sol bölmede Teams & Gruplar>Paylaşılan posta kutuları'nı seçin

      Tavsiye

      Listenin tamamını genişletmek için Tümünü göster'i seçmeniz gerekebilir.

    3. Paylaşılan posta kutusu ekle'yi seçin.

    4. Paylaşılan posta kutusu için bir ad ve e-posta adresi girin.

    5. Değişiklikleri Kaydet'i seçin.

    6. Sonraki adımlar altında Bu paylaşılan posta kutusuna üye ekle seçeneğini belirleyin. (Üye yönetiminin kullanılabilir duruma gelmesi birkaç dakika sürebilir.)

    7. Üye ekle'yi seçin

    8. Oluşturulan aracı kullanıcısını ve posta kutusunu izlemesi gereken diğer kullanıcıları seçin ve Ekle'yi seçin.

    9. Kapat'ıseçin.

    Uyarı

    Sonraki adımda paylaşılan posta kutusunun e-posta adresini kullanacaksınız. Paylaşılan posta kutusunu ayarladıktan sonra, Zaman ve Gider Aracısı'nı yapılandırırken ortam değişkenleri olarak e-posta adresini ve klasör yolunu (varsayılan olarak Gelen Kutusu olarak ayarlanmıştır) sağlamanız gerekir. Daha fazla bilgi için bkz . 5. Adım: Gider Aracısı'nı ayarlama.

    Adım 5: Gider Aracısını ayarlama

    Gider Aracısı'nı ayarlamak için iki seçeneğiniz vardır:

    • Seçenek A: PowerShell betiği kullanma (önerilen)
    • B Seçeneği: Power Apps'te el ile kurulum yapma (PowerShell yok)

    Önemli

    Expense Agent'ın yüklenmesine devam etmeden önce aracının Microsoft Copilot Studio'da başarıyla sağlandığından emin olun.

    Aracının başarıyla sağlandığından emin olmak için aşağıdaki adımları izleyin:

    1. Microsoft Copilot Studio'da oturum açın ve ortamınızı seçin.
    2. Aracılar'a gidin ve ExpenseAgent-Line (Önizleme) arayın.
    3. Yayımla düğmesinin etkinleştirildiğini doğrulayın.
    4. Etkinleştirilirse yüklemeye devam edin. Devre dışı bırakılırsa aracı sağlanana kadar bekleyin.
    5. Gider Giriş Aracısı (Önizleme)'nin etkin olduğunu doğrulamak için bu adımları tekrarlayın.

    Tavsiye

    Copilot finans ve operasyon uygulamasının sağlanması 5-6 saatten uzun sürüyorsa, olası kurulum gecikmelerini çözmek için uygulamayı kaldırıp yeniden yükleyin. Daha fazla bilgi için bu makalenin sonundaki Gider Aracısını Kaldırma bölümüne bakın.

    Aracının el ile kurulumu, bağlantıların oluşturulmasını ve bağlanmasını, Power Automate akışlarını etkinleştirmeyi ve çözümü yayımlamayı içerir. Bu işlem zaman alabilir ve hatalara açıktır. Kurulumu otomatikleştirmek için gerekli parametreleri güncelleştirdikten sonra bir PowerShell betiği kullanın.

    PowerShell betiği aşağıdaki görevleri otomatikleştirir:

    • Gerekli ortam değişkenlerini güncelleştirir.
    • Microsoft Power Platform bağlantılarını çözüme ait bağlantı referansları ile ilişkilendirir.
    • Zaman ve Gider Aracısı'nın gerektirdiği tüm Power Automate akışlarını etkinleştirir.
    • Copilot aracılarını yayımlar.
    • Dataverse çözümünü yayımlar.

    Betiği çalıştırmadan önce, install.ps1 dosyasında her bağlayıcı için Bağlantı Kimliğini sağlamanız gerektiğinden bağlantılar oluşturmanız gerekir. Bu bağlantıları oluşturmak için, oluşturulan aracı kullanıcısını kullanarak bu adımları izleyin.

    1. Yeni oluşturulan aracı kullanıcısını kullanarak Power Apps oluşturucu portalında oturum açın ve ortamınızı seçin.
    2. Sol bölmede Daha Fazla'yı seçin ve Bağlantılar'ı seçin.
    3. Yeni bağlantı'yı seçin ve aşağıdaki tablodan Bağlantı Adı'nı (örneğin, Office 365 Outlook) kullanarak arama yapın.
    4. Listeden uygun bağlayıcıyı seçin ve oluşturun.
    5. Bağlantı oluşturulduktan sonra, bağlantının oluşturulduğu kullanıcıyı not edin. İdeal olarak oluşturulan aracı kullanıcı kimliği olmalıdır. Sonraki adımda oluşturduğunuz yükleme dosyasında bu kullanıcı kimliğini güncelleştirin.
    6. Aşağıdaki tabloda listelenen kalan gerekli bağlantıların her biri için 3. ve 4. adımları yineleyin.
    Bağlantı Adı Bağlantı URL Biçimleri
    Office 365 Outlook https://make.powerapps.com/environments/environmentID/connections
    / shared_office365/connectionID/details
    Office 365 Kullanıcıları https://make.powerapps.com/environments/environmentID/connections
    / shared_office365users/bağlantıID/detaylar
    Microsoft Ekipleri https://make.powerapps.com/environments/environmentID/connections
    / shared_teams/bağlantıID/detaylar
    Microsoft Dataverse https://make.powerapps.com/environments/environmentID/connections
    / shared_commondataserviceforapps/connectionID/details
    Microsoft Copilot Studio (önizleme) https://make.powerapps.com/environments/environmentID/connections
    / shared_microsoftcopilotstudio/connectionID/details

    Yükleme dosyasını oluşturmak için ihtiyacınız olan bilgiler

    - install.ps1yükleme dosyasını oluşturmak için aşağıdaki bilgilere sahip olun. (Başvuru için aşağıdaki tabloya başvurabilirsiniz.)

    Parametre Diğer ayrıntılar
    Dataverse ortamı kimliği Power Platform yönetim merkezinden edindiğiniz ortam kimliğini girin.
    Örnek değer: xxxx-xxxx-xxxx-xxx-xxxxxxxxxx
    Dataverse ortamı URL'si Power Platform yönetim merkezinden Ortam URL'sini girin.
    Not: Başında https:// olduğundan ve sonunda eğik çizgi '/' olmadığından emin olun.
    Örnek değer: https://org123.crm.contoso.com
    Finans ve operasyonlar kurulum URL'si Finans ve operasyon ortamı ayrıntılarını aşağıdaki biçimde girin.
    Örnek değer: https://org123.contoso.com
    Not: Başında https:// olduğundan ve sonunda eğik çizgi '/' olmadığından emin olun.
    OutlookFolderPath Paylaşılan posta kutusunda oluşturulan klasör yolunu girin. Başka klasör oluşturulmazsa, varsayılan olarak Gelen Kutusu olarak ayarlanır.
    Örnek değer: Gelen Kutusu
    En iyi yöntem olarak gider yönetimi için ayrı bir klasör oluşturun
    Posta Kutusu Adres Kimliği Yeni oluşturulan paylaşılan posta kutusunun posta adresini girin
    Örnek değer: expenseagent@contoso.com
    Microsoft Dataverse bağlantı adı
    Microsoft Copilot Studio bağlantı adı
    Microsoft Office Outlook bağlantı adı
    Microsoft Office 365 Kullanıcıları bağlantı adı
    Microsoft Teams bağlantı adı
    Tüm bağlantı adları için giriş aynı olup, oluşturulan aracı kullanıcısının hesap e-posta adresidir.

    Örnek değer: createdexpenseagentuser@contoso.com

    Yükleme betiği dosyasını oluşturma

    Aşağıdaki kodu kopyalayarak bir yükleme betiği dosyası oluşturun. Betike gerekli ortam değişkenlerini ekleyin, ardından PowerShell kullanarak betiği çalıştırın.

    Uyarı

    Yükleme betiği dosyasını yerel masaüstüne yerleştirin. One Drive'da depolamayın.

    Aşağıdaki kodla bir PowerShell betik dosyası oluşturun. Betiği çalıştırmadan önce belirtilen parametreleri güncelleştirin.

    Tavsiye

    Zorunlu = $true olduğunda, PowerShell parametreleri etkileşimli olarak girmenizi ister, böylece bunları doğrudan betik dosyasında güncelleştirmeniz gerekmez.

    El ile girişten kaçınmak ve yükleme betiğindeki parametreleri önceden belirlemek istiyorsanız, aşağıdaki örnek kodun Param bölümünde Zorunlu = $false değerini ayarlayın.

    Aşağıdaki kodu yükleme betiği dosyanıza kopyalayın ve 'Install.ps1' olarak kaydedin. param bölümündeki ilgili parametre alanlarındaki değişkenleri güncelleştirin. 10 değişkeni güncelleştirmeniz gerekir.

    Tavsiye

    Başvuru olarak önceki tabloyu kullanın ve tüm örnek değerleri ilgili ayrıntılarınızla değiştirin.

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

    PowerShell dosyasını tetikleme için şu adımları izleyin:

    1. PowerShell'i açın (gerekli en düşük sürüm - PowerShell 7).
    2. Dosyayı kaydettiğiniz konuma gidin. (cd <dosya konumu> komutunu kullanın).
    3. Yükleme betiğini tetikleme. (Şu komutu kullan: '.\Install.ps1').
    4. Azure'da oturum açmak için yönergeleri izleyin.
    5. Oturum açtığınızda bir kez daha yetkilendirmeniz gerekebilir. (Oluşturulan aracı kullanıcı kimliğini kullanın).

    Betiğin tamamen çalışmasını bekleyin ve Aracı kurulumu başarıyla tamamlandı iletisini arayın!

    Uyarı

    Yukarıdaki betik şu eylemleri gerçekleştirir:

    • Ortam değişkenlerini ayarlar.
    • Bağlantı başvurularını doğrular ve bağlar.
    • Power Automate akışlarını etkinleştirir.
    • Gerekli Copilot aracılarını yayımlar.
    • Dataverse çözümünü yayımlar.

    Betik başarıyla çalıştırıldıktan sonra Gider Aracısı tam olarak yapılandırılır ve kullanıma hazırdır.

    B Seçeneği: Power Apps'te el ile ayarlama (PowerShell yok)

    PowerShell betiğini kullanmak istemiyorsanız Gider Aracısı'nı Power Apps aracılığıyla el ile yapılandırabilirsiniz. Bu işlem, ortam değişkenlerini güncelleştirmeyi, Power Automate akışlarını etkinleştirmeyi ve çözümü yayımlamayı içerir.

    Ortam değişkenlerini güncelleştirme

    Ortam değişkenlerini güncelleştirmek için şu adımları izleyin:

    1. Power Apps'te oturum açın ve ortamınızı seçin.

    2. Çözümler'i seçin, ardından Varsayılan Çözüm'ü (veya aracının yüklü olduğu çözümü) açın.

    3. Ortam Değişkenleri'ne gidin ve aşağıdaki değerleri ayarlayın.

      Değişken adı Açıklama
      Gider Aracısı Outlook Klasör Yolu Paylaşılan posta kutusunda izlenecek klasör yolunu belirtin (varsayılan olarak Gelen Kutusu).
      Harcama aracısı paylaşılan posta kutusu adresi kimliği Paylaşılan posta kutusunun e-posta adresini belirtin. Oturum açmış kullanıcının posta kutusunu kullanmak için NA girin.
      Finance and Operations Örnek url'si Finans ve operasyon uygulamaları ortamının URL'sini belirtin (örneğin, https://org123.contoso.com).

    Power Automate akışlarını etkinleştirin

    Gider Aracısı aşağıdaki Power Automate akışlarına dayanır:

    • Gider girişi yeniden deneme denetimi
    • Gider yapılandırması
    • Outlook Gider Klasörünü al
    • Gider raporu oluşturma
    • Gider raporu uyarlamalı kartı gönder
    • Giderleri otomatik olarak eşleştir
    • E-postaları işle
    • Yardımcı pilot çağrısı için bağlantısız makbuz kimliklerini ayıkla
    • Dataverse eklentiyi kullanarak eklenmemiş alındı çıktısı ayıklama
    • Gider satırı oluşturma
    • Proje kimliği ve durum kimliği olmadan gider satırı oluşturma
    • Proje kimliklerini tanımlama
    • Kullanıcı takvimi etkinlikleri
    • Yardımcı pilot kullanarak gider raporunu işle
    • Makbuz işleme için gider aracısını çağırma

    Akışları etkinleştirmek için şu adımları izleyin:

    1. Power Automate'te oturum açın ve ortamınızı seçin.

    2. Akışlarım'ı seçin.

    3. Önceki listedeki 15 akışın her biri için şu adımları izleyin:

      1. Akışı bulun.
      2. Düzenle'yi seçin.
      3. Yeni Tasarımcı seçeneğini kapatarak Eski Tasarımcı görünümüne geçin.
      4. Gerekli bağlantıların kimliğini doğrula (yeşil onay işaretleri görünene kadar).
      5. Devam'ı seçin ve sonra Kaydet'i seçin.
      6. Akışı etkinleştirmek için Aç'ı seçin.

    Çözümü yayımlayın

    Tüm ortam değişkenlerini ve akışlarını yapılandırmayı tamamladıktan sonra, çözümü yayımlamak için bu adımları izleyin.

    1. Power Apps'te Çözümler'e gidin.
    2. Ortamınızı ve çözümünüzü seçin.
    3. Tüm Özelleştirmeleri Yayımla'yı seçin.

    Bu adımları tamamladığınızda Gider Aracısı tamamen yapılandırılır ve kullanıma hazırdır.

    6. Adım: Microsoft Teams'te Gider Aracısı'nı etkinleştirme (İsteğe bağlı)

    Gider Aracısı için Teams tabanlı iletişimi etkinleştirmek için Teams kanalını Power Apps'te aracıya ekleyin. Daha sonra temsilci, Teams aracılığıyla adaptive kartlar gönderebilir.

    Teams kanalını etkinleştirme

    Teams kanalını etkinleştirmek için şu adımları izleyin:

    1. Copilot Studio'ya giriş yapın ve doğru ortamı seçin.
    2. Aracılar sekmesinde Gider Girişi Aracısı'nı seçin.
    3. Aracı görünümünde, Kanallar sekmesinde Teams ve Microsoft 365 Copilot seçin.
    4. Teams entegrasyonunu etkinleştirmek için Kanal ekle öğesini seçin ve uygulamayı kiminle paylaşacağınızı yapılandırmak için Teams uygulama kullanılabilirliğini yapılandırma bölümündeki adımları izleyin.

    Daha fazla bilgi edinmek için Teams + Microsoft 365 kanalı için yapılandırma panelini açın bölümüne bakın.

    Teams uygulamasının kullanılabilirliğini yapılandırma

    Teams uygulamasının kullanılabilirliğini yapılandırmak için şu adımları izleyin:

    1. Teams uygulaması oluşturulduktan sonra Kullanılabilirlik Seçenekleri'ni seçin.

    2. Uygulamayı kiminle paylaşmak istediğinizi seçin:

      • Kuruluş içindeki belirli kullanıcılar
      • Kuruluşun tamamı
    3. Uygulamayı onay için gönderin.

    Uygulamayı Teams yönetim merkezinde yayımlama

    Uygulamayı Teams yönetim merkezinde yayımlamak için şu adımları izleyin:

    1. Teams yönetim merkezi'nde oturum açın.
    2. Teams uygulaması > Uygulamaları yönet'e gidin. "Gider" araması yapın ve Uygulama durumunun engellendiği Gider Girişi Aracısı uygulamasını seçin.
    3. Uygulamanın engelini kaldırmak için Yayımla öğesini seçin. Yayımlama eylemi başarıyla tamamlandıktan sonra Uygulama durumunun engeli kaldırıldı olarak değiştiğinden emin olun.

    Teams ve Microsoft 365 için bir aracı bağlama ve yapılandırma bölümünde daha fazla bilgi edinin.

    Bu adımları tamamladığınızda Expense Agent'ınız kullanıma hazırdır.

    Uyarı

    Dynamics 365 Finance ortamında başparmak yukarı ve başparmak aşağı simgelerini ve geri bildirim açılır penceresini kullanarak aracı tarafından oluşturulan gider satırları ve raporları hakkında geri bildirim de sağlayabilirsiniz.

    Gider Aracısının kaldırılması

    Expense Agent'ı kaldırmak için şu adımları izleyin:

    1. Microsoft Power Apps oluşturucu portalında oturum açın.
    2. Çözümler'i seçin, msdyn_ExpenseAI arayın, üç noktayı seçin ve Sil'i seçin.
    3. msdyn_FnOCopilotAnchor arayın ve çözümü silin.