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...