cub-e.net

just coding...

Dynamics CRM'e saatinizden erisin :)

Akilli saatler de akilli telefonlar kadar hizli bir sekilde hayatimiza girdi. Su anda sektördeki buyuk firmalar ve hatta kickstarter grisimleri bile akilli saat projeleriyle karsimiza cikmakta. Ben de bir Pebble kullanicisiyim ve ozellikle 1 hafta dayanan pili ile diğer akilli saatlerden ayrilmakta.

Bugun Dynamics CRM ile akilli saatlerin nasil birleştirileceğini inceleyeceğiz. Akilli saatler genel itibariyle telefon üzerindeki notificationlari gösterebilme yeteneğine sahipler. Telefon üzerinde notification oluşturmak için ben bugun Pushover sistemini kullanacagim.

Soyle bir senaryomuz olsun; sistem üzerinde oluşturduğumuz bir is akisi ile CRM uzerinde servis talepleri oluştuğu anda push notification isimli bir entity üzerinde bir kayit oluşturuyoruz. Bu kayit varsayilanda gönderilmeyi bekliyor durumunda olacak. Uygulamamiz bu kayitlari okuyacak ve Push Notification’in servisine gönderecek. Boylece notification telefonumuza orada da saatimize gelecek.

Sizin oluşturduğunuz sistemlerde farkli is akislari ile yine push notification isimli entity’e kayit oluşturabilir böylece degisik senaryolar içinde bu sistemi kullanabilirsiniz. Ornegin sistem üzerinde değeri 50.000 tl üzerinde bir firsat oluşturulduğunda bu sistemi tetikleyebilirsiniz.

Sisteme uye olmak için telefonunuza Pushover uygulamasini indirmeniz gerekmekte. Daha sonrasinda ise https://pushover.net sitesinden kendinize bir hesap oluşturuyorsunuz.

Bu sistem üzerinden notification gönderebilmek için 2 bilgiye ihtiyamiz bulunmakta

1.       Sizin User Key’iniz. Her bir kullanicinin bir key’i var sistemde.



2.       Create New Application linkine tıklayarak olusturacaginiz Application Key’i.



Bu sekilde elde ettiğimiz key’ler ile sistem üzerinden notification gönderebilir hale geldik. Bu bilgilerin CRM’de saklanacagi en uygun yer bence Kullanici Kartiydi ve bende bu nedenle kullanici nesnesi üzerine PushOverToken ve PushOverUserKey isimli iki alan actim ve bilgileri buraya girdim.



Daha sonra Push Notification isimli aktivite turunde bir entity oluşturdum ve asagidaki alanlari actim. Buradaki önemli nokta böyle bir entity’i nasil kullanacagimiz. Yazinin basinda da belirttiğim gibi cok farkli senaryolar için bu nesne üzerinde kayitlar oluşturabilirsiniz.


Olusturdugum alanlari incelersek;

Subject : Ekran görüntülenecek baslik bilgisi

To : Mesajlarin kimlere gönderileceği bilgisi

Regarding : Kaydin bagli bulunduğu ana entity. Burada bu bilgiyi telefon üzerinden kullanici bu kayda ulaşmak isterse tek tiklama ile bu bilgiye ulassin diye tutuyorum.

Status Reason : Varsayilanda “Waiting To Send” yani bekliyor konumunda oluşturuluyor kayitlar. Gondeme işlemi tamamlandiktan sonra bu alani “Sent” yani gönderildi olarak değiştiriyorum.

Description : Detayli bilgi vermek için bu alani kullaniyorum.

 

static string URL = "https://xxx.contoso.com";

        private static IOrganizationService ServiseBaglan()

        {

            try

            {

                Uri organizationUri = new Uri(String.Format("{0}/XRMServices/2011/Organization.svc", URL));

                ClientCredentials clientcred = new ClientCredentials();

                clientcred.UserName.UserName = "kullanici adi";

                clientcred.UserName.Password = "sifre";

                OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(organizationUri, null, clientcred, null);

                IOrganizationService _service = (IOrganizationService)_serviceproxy;

                return _service; ;

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.Message);

                return null;

            }

        }

 

        private static void changeStatus(IOrganizationService service, Guid Id)

        {

            // Create the Request Object

            SetStateRequest state = new SetStateRequest();

 

            // Set the Request Object's Properties

            state.State = new OptionSetValue(0);

            state.Status = new OptionSetValue(100000000);

 

            // Point the Request to the case whose state is being changed

            state.EntityMoniker = new EntityReference("new_pushnotification", Id);

 

            // Execute the Request

            SetStateResponse stateSet = (SetStateResponse)service.Execute(state);

        }

        static void Main(string[] args)

        {

            try

            {

                string fetchXml = @"<fetch mapping='logical'>

                                 <entity name='new_pushnotification'>

                                    <attribute name='activityid' />

                                    <attribute name='subject' />

                                    <attribute name='description' /> 

                                     <filter type='and'>

                                        <condition attribute='statuscode' operator='eq' value='1'/>

                                     </filter>

                                    <link-entity name='activityparty' from='activityid' to='activityid' alias='ac'>

                                        <link-entity name='systemuser' from='systemuserid' to='partyid' alias='ad'>

                                            <attribute name='new_pushovertoken' />

                                            <attribute name='new_pushoveruserkey' />

                                        </link-entity>

                                    </link-entity>

                                 </entity>

                             </fetch>";

 

                IOrganizationService service = ServiseBaglan();

               

                if (service != null)

                {

                    Console.WriteLine("Servise Baglanildi");

 

                    EntityCollection entCollection = (EntityCollection)service.RetrieveMultiple(new FetchExpression(fetchXml));

                    foreach (var item in entCollection.Entities)

                    {

                        Console.WriteLine("Aktarilacak kayitlar bulundu");

 

                        if (item.Contains("ad.new_pushovertoken") && item.Contains("ad.new_pushoveruserkey") && item.Contains("subject") && item.Contains("description"))

                        {

                            string PushOverToken = ((AliasedValue)item["ad.new_pushovertoken"]).Value.ToString();

                            string PushOverUserKey = ((AliasedValue)item["ad.new_pushoveruserkey"]).Value.ToString();

                            string subject = item["subject"].ToString();

                            string description = item["description"].ToString();

                            Guid activityid = new Guid(item["activityid"].ToString());

                            string url = String.Format("{0}/main.aspx?etn=new_pushnotification&pagetype=entityrecord&id=%7B{1}%7D", URL, activityid.ToString());

 

                            dynamic Parameters = new NameValueCollection() {

                        {

                            "token",

                            PushOverToken

                        },

                        {

                            "user",

                            PushOverUserKey

                        },

                        {

                            "message",

                            description

                        },

                        {

                            "url",

                            url

                        },

                        {

                            "url_title",

                            "Open Record"

                        },

                        {

                            "title",

                            subject

                        }

                        };

 

                            WebClient client = new WebClient();

                            Console.WriteLine("Kayitlar gonderiliyor");

                            client.UploadValues("https://api.pushover.net/1/messages.json", Parameters);

                            Console.WriteLine("CRM guncelleniyor");

                            changeStatus(service, activityid);

                        }

                    }

                }

 

                Console.WriteLine("Tamamlandi");

                Console.ReadLine();

}

            catch (Exception ex)

            {

                Console.WriteLine(ex.Message);

                return null;

            }

        }

 

Kodda da görebileceğiniz uzere Ilk olarak CRM Servisine baglaniyoruz. Ben IFD enabled bir organizasyon kullandigim için benim servis baglantim bu sekilde Office 365 ya da on premise sistemlerde farkli sekillerde CRM servise bağlanma yöntemleri mevcut. Bu konuda sorun yasarsaniz benimle iletişime geçebilirsiniz.

 

Daha sonra ise fetchXML sorgumuz ile sistem üzerinde bekleyen notification’larin bilgisini aliyoruz ama bu işlemi yaparken ayni zamanda systemuser nesnesine de dallanarak ihtiyacim olan pushovertoken ve pushoveruserkey bilgilerini de aliyorum. Boylece her bir kullanici için teker teker veri sorgulayarak servisi meşgul etmiyorum.

 

@"<fetch mapping='logical'>

                                 <entity name='new_pushnotification'>

                                    <attribute name='activityid' />

                                    <attribute name='subject' />

                                    <attribute name='description' /> 

                                     <filter type='and'>

                                        <condition attribute='statuscode' operator='eq' value='1'/>

                                     </filter>

                                    <link-entity name='activityparty' from='activityid' to='activityid' alias='ac'>

                                        <link-entity name='systemuser' from='systemuserid' to='partyid' alias='ad'>

                                            <attribute name='new_pushovertoken' />

                                            <attribute name='new_pushoveruserkey' />

                                        </link-entity>

                                    </link-entity>

                                 </entity>

                             </fetch>";

 

 

Verileri aldiktan sonra ise bunlari istediğim gibi düzenleyip string veriler haline getiriyorum. Sonunda ise asagidaki bolum ile servise Push Notification servisine gönderiyorum;

 

                            dynamic Parameters = new NameValueCollection() {

                        {

                            "token",

                            PushOverToken

                        },

                        {

                            "user",

                            PushOverUserKey

                        },

                        {

                            "message",

                            description

                        },

                        {

                            "url",

                            url

                        },

                        {

                            "url_title",

                            "Open Record"

                        },

                        {

                            "title",

                            subject

                        }

                        };

 

                            WebClient client = new WebClient();

                            Console.WriteLine("Kayitlar gonderiliyor");

                            client.UploadValues("https://api.pushover.net/1/messages.json", Parameters);

                            Console.WriteLine("CRM guncelleniyor");

                            changeStatus(service, activityid);

 

 

Burada dikkat edilmesi gerekn nokta URL kisminda gerçekten sistemdeki nesnenin acilacagi URL’i buraya getiriyorum ki telefondan kullanici direkt kayda ulassin.

Gonderme işleminden sonra ise kayitlari gönderildi diye güncelliyorum ki tekrar tekrar ayni kayitlari göndermeyelim.

 

Sonuc olarak once telefonda sonra ise saatimde gelen verilere ulaşıyorum :)

PushOver'in ana ekraninda gelen notification.




Notification'i acinca detaylara ulasiyorum. 



Open Record isimli linke tiklayinca da direkt ilgili kayda ulasiyorum.



Ve sonuc Pebble ekraninda CRM'den gelen Notification'i goruyorum :) iste mutlu son...

Microsoft Dynamics CRM için Mobile Express

Daha önce Microsoft'a yakın Online Topluluklar üzerinden yürütülen Mobile Express projesini Microsoft sahiplenerek kendi yeniden tasarladı. Artık Mobile Express Microsoft CRM'in Microsoft tarafından desteklenen bir parçası oldu.

Mobile Express HTML 4.0 destekleyen bütün cep telefonları ile çalışabiliyor. Bu bize CRM'i mobil hale getirirken sadece Windows Mobile ile çalışan cihaz yatırımı yapma sıkıntısından kurtarıyor. Buradan da anlayabileceğiniz gibi Mobile Express bie web uygulaması aslında ama Dynamics CRM Platformunun altındaki entity (nesne), view (görünüm), customization (özelleştirme) ve security (güvenlik) mimarisini tamamiyle desteklemekte. Hatta bununla da kalmıyor MS CRM'in Multi Tenancy (birden çok şirket ile çalışma) mimarisini de destekliyor. Üstelik kullanımı ve yönetilmesi de çok kolay.

Mobile Express for Microsoft Dynamics CRM ürünü linke tıklayarak ücretsiz kendi serverınıza yükleyebilirsiniz.

Yukarıdaki linkten ürünü yükledikten sonra ürünün 2 aşamadan oluştuğunu göreceksiniz.

  1. Mobile Console
  2. Mobile Application

Mobile Console

  1. CRM uygulamanızı çalıştırın
  2. Settings (Ayarlar) > Customization (Özelleştirmeler) > Customize Mobile Express tıklayarak Mobile Console'a erişebilirsiniz.

 

Tıkladıktan sonra özelleştirmeleri yapabileceğiniz aşağıdaki ekran açılacaktır. 

Burada görebileceğiniz gibi 2 bölüm vardır:

Available Entities
- Mobile Application tarafından görüntülenebilir entity(nesne)'lerin listesidir. Eğer bir nesnenin Mobile Application'da görüntülenmesini istemiyorsanız onu bu listede bırakın.
Selected Entities
- Mobile Application'da görüntülenen entity(nesne)'lerin listesidir.

Desteklenen Entityler:

•    Custom Entities (Bizim oluşturduğumuz tğm custom entityler)
•    Invoice Product
•    Account
•    Lead
•    Annotation
•    Letter
•    Address
•    Marketing List
•    Appointment
•    Opportunity
•    Case
•    Order
•    Campaign
•    Order Product
•    Contact
•    Phone Call
•    Competitor
•    Quote
•    E-mail
•    Quote Product
•    Fax
•    Task
•    Invoice
•    User

Bir nesneyi sol taraftan sağ tarafa eklemek için ya üzerinde çift tıklamanız ya da "Add" düğmesine tıklamanız gerekmektedir. Bundan sonra sağ tarafa atılan nesneye çift tıkladığınızda ya da "Edit" düğmesine tıkladığınızda o nesnenin hangi alanlarının  Mobile Application'da görünüp görünmeyeceğini seçebileceğiniz bir ekran gelecektir.



Bu ekran yardımıyla görünmesini istediğimiz alanları seçtikten sonra "Save and Close" düğmesine basarak seçimlerimizi kaydediyoruz.
Eğer istediğimiz gibi özelleştirmemizi tamamladıysak yaptıklarımızın Mobile Application'da görüntülenmesi için Publish(Yayınlamak) etmek zorundayız.
Publish : Sadece seçtiğiniz nesnedei değişiklikleri yayınlar.
Publish All : Bütün değişiklikleri yayınlar.


Mobile Application

Bu bölüm ise son kullanıcının gördüğü ve uygulamayı kullandığı kısımdır. Varsayılan olarak http://CRM_Server_Name/OrgName/M bu adresten Mobile Application'a ulaşabilirsiniz. Kullanıcı adı ve şifre bölümünden sonra karşınza erişebildiğiniz nesnelerin listesi çıkacaktır.(1. resim) Bu nesnelerden birini seçtiğimizde CRM'de olduğu gibi seçtiğimiz View(Görünüm)'e göre kayıtlar listelenecektir. Bu noktada yeni kayıt girişi yapabiliriz.(2. resim) Listenen kayıtlardan birine tıkladığımızda ise kaydın bilgileri ve ilişkili olduğu diğer nesnelerin listesi ekrana gelecektir. Bu noktada mevcut kaydı güncelleyebilir ya da silebiliriz.(3. resim)



Mobile Application HTML 4.0 teknolojisine sahip bütün cihazlardan erişilebilir demiştim. İşte IPhone ekran görüntüleri

 

Erişimi Engellemek

Mobile Application'a sadece belli bir kullanıcı grubunun erişmesini istiyorsanız yetkilendirmeden bunu kolaylıkla halledebilirsiniz.



Erişimi engellemek istediğiniz güvenlik rolünden "Go Mobile" seçimini kaldırabilirsiniz.

Notlar

  1. Şu an için sadece kurulum dili 1033 yani İngilizce olan CRM'ler üzerine kurulabilmektedir. Diğer dil paketleri üzerine kurulum çalışmaları devam etmektedir. Eğer İngilizce CRM üzerine kurulum yaparsanız dil paketi olarak Türkçe'yi yüklerseniz Mobile Application Türkçe çalışacaktır.
  2. Dışarıdaki bir adresten CRM'e erişmek için IFDTool'u kurmanız gerekebilir. Bu adreste gerekli bilgiyi bulabilirsiniz. (http://support.microsoft.com/kb/948779)


Bir makalemizin daha sonuna geldik. Umarım anlattıklarım faydalı olmuştur. Hepinize iyi çalışmalar.

Barış KANLICA | Dynamics CRM MVP
Microsoft Certified Business Management Solution Specialist

brsk@e-kolay.net | www.cub-e.net |