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

Dynamics CRM 2011 Workflow(İş Akışı) ve Dialog(İletişim Kutusu)

 

 

Bu webinerimde Dynamics CRM 2011 Workflow(İş Akışı) ve Dialog(İletişim Kutusu) konusunu anlatıyorum.

27 Aralık 2011 Salı günü saat 21:00'da olacak bu webinere herkes davetlidir.

Webiner linki aşağıdaki gibidir.

 

Konu : Dynamics CRM 2011 – Workflow ve Dialog Mimarisi
Konuşmacı : Barış KANLICA
Zaman : 27.12.2011 21:00
Link : https://www.livemeeting.com/cc/mvp/join?id=MVP4025099&role=attend&pw=Bfp%22F73%5ET

 

Microsoft Dynamics CRM 2011 Yeni Workflow ve Dialogs Mimarisi

Güncelleme : Bu akşam vereceğim webineri şehirdışında olmam nedeniyle ileri bir tarihe ertelemek zorunda kaldım. Yeni tarihi buradan paylaşıyor olurum.

Arkadaşlar bu ayki web seminerim CRM 2011 üzerinde yeni process mimarisi ile ilgili. Katılırsanız sevinirim. CRM 2011 RTM üzerinden anlatacağım.

Konu : Dynamics CRM 2011 – Yeni Workflow ve Dialogs Mimarisi
Konuşmacı : Barış KANLICA
Zaman : 22.03.2011 21:00
Link : http://nedirtv.com/webiner/40

If you get an exception when you register a CRM 4.0 plug-in or custom workflow

Eğer CRM 4.0'a yeni bir plug-in ya da custom workflow eklemek istiyorsanız CRM 4.0 SDK içinden çıkan Plug-in Registration Tool for CRM 4.0'ı kullanmalısınız. Plug-in ya da custom workflow'umuzu bu uygulama ile sisteme kaydettiriyoruz. Bu işlem sırasında şu Soap Hatasını alabilirsiniz "Not have enough privilege to complete Create operation for an Sdk entity".

Unhandled Exception: System.Web.Services.Protocols.SoapException: Server was unable to process request.

Detail:

<detail>

<error>

                        <code>0x80040256</code>

                        <description>Not have enough privilege to complete Create operation for an Sdk entity.</description>

                        <type>Platform</type>

</error>

</detail>


Bu problemi çözmek için şu adımları uygulayabilirsiniz:

1.      CRM 4.0 Deployment Manager Console'u açın (Start -> All Programs -> Microsoft Dynamics CRM -> Deployment Manager).

2.       “Deployment Administrators” düğümüne gidin ve “New Deployment Administrator…” seçeneğine tıklayın.

 

 

3.       Uygun kullanıcıyı ekleyin ve şeçim kutusunda "Tamam"'a basın.

Bu adımları tamamladıktan sonra, eklenmiş kullanıcılar sorunsuz çalışacaktır.

 

------------------

If we want to deploy new plug-in or custom workflow assembly into CRM 4.0 we used Plug-in Registration Tool for CRM 4.0 (it is delivered with CRM 4.0 SDK). We were trying to register plug-in or custom workflow assembly with this application. In this process, you can get the Soap Exception "Not have enough privilege to complete Create operation for an Sdk entity".

 

Unhandled Exception: System.Web.Services.Protocols.SoapException: Server was unable to process request.

Detail:

<detail>

<error>

                        <code>0x80040256</code>

                        <description>Not have enough privilege to complete Create operation for an Sdk entity.</description>

                        <type>Platform</type>

</error>

</detail>  

 

For solve this situation, you have to do these steps: 

1.       Open CRM 4.0 Deployment Manager Console (Start -> All Programs -> Microsoft Dynamics CRM -> Deployment Manager).

2.       Go to “Deployment Administrators” node and choose “New Deployment Administrator…” option.

 

 

3.       Insert appropriate user and confirm selection by clicking “OK” button.

 

After completing this step, both users were able to register and deploy the assembly successfully.

CRM workflow date update includes saturdays/sundays

Boş zamanlarımda genellikle forumlarda soru cevaplamaya çalışıyorum. Geçenlerde Dynamics Community Forum'da bir sorunla karşılaştım ve çözüm tekniği olarak Mayank Pujara bir kod yazdı ve forumda yayınladı. Kodu ve sorunu sitemde yayınlıyorum.

" Merhaba, öncelik sırasına göre şikayet takip gününü güncelleyecek bir workflow oluşturmak istiyorum. Eğer öncelik yüksek ise şikayet gününden 24 saat sonra takip tarihi atansın. Eğer öncelik normal ise şikayet gününden 72 saat sonra takip tarihi atansın. Problem ise, CRM haftasonunu (Cumartesi,Pazar)'�� da sayarak hesaplama yapıyor. Benim istediğim ise işgünü olmayan günlerin sayılmasını engellemek."

Bu problem workflow ile çözülemeyince aşağıdaki JavaScipt kodu ile istenen işlenim gerçekleşmesi sağlandı.

---

When I have time, I'm answering the technical question in forums. A couple days ago I see a problem in the  Dynamics Community Forum. Mayank Pujara developed a code for this problem. I want share this problem and JavaScript code.

" Hi, I want to create CRM workflow which updates the case follow up date based on priority. If priority is high --> follow up date would be 24 hrs (1 day) after the case create date. If priority is normal --> follow up date would be 72 hrs (1 day) after the case create date. Now the problem is that CRM includes (or counts) the weekends (Saturday/Sundays) while calculating the days after 3 days. I want to exclude these non business days to be counted in workflow. Is there any ways we can avoid saturdays/sundays while dynamically setting date values in CRM 4.0 workflow? Any idea?? "

JavaScript code is solved problem when workflow didn't work.

The code:

 if(crmForm.FormType == 1)
{
   
crmForm.all.followupby.DataValue = new Date();
    //alert(crmForm.all.followupby.DataValue);

    //high
   
if(crmForm.all.prioritycode.DataValue ==1)
   
{
       
crmForm.all.followupby.DataValue = crmForm.all.followupby.DataValue.setDate(crmForm.all.followupby.DataValue.getDate() + 1);
   
}
   
else if (crmForm.all.prioritycode.DataValue ==2)
   
{
       
crmForm.all.followupby.DataValue = crmForm.all.followupby.DataValue.setDate(crmForm.all.followupby.DataValue.getDate() + 3);
   
}
   
else if (crmForm.all.prioritycode.DataValue ==3)
   
{
       
crmForm.all.followupby.DataValue = crmForm.all.followupby.DataValue.setDate(crmForm.all.followupby.DataValue.getDate() + 5);
   
}

    //alert(crmForm.all.followupby.DataValue);

    if(String (crmForm.all.followupby.DataValue).substr(0,3) == "Sat")
    {
       
crmForm.all.followupby.DataValue = crmForm.all.followupby.DataValue.setDate(crmForm.all.followupby.DataValue.getDate() + 2)
   
}
   
else if (String (crmForm.all.followupby.DataValue).substr(0,3) == "Sun")
   
{
       
crmForm.all.followupby.DataValue = crmForm.all.followupby.DataValue.setDate(crmForm.all.followupby.DataValue.getDate() + 1)
   
}
   
//alert(crmForm.all.followupby.DataValue);

}

 

Use JavaScript execute/call/launch Dynamics CRM 4.0 Workflow

CRM 3.0 içinde Mitch Milam JavaScript ile nasıl workflow çalıştırabileceğimizi bize göstermişti. Fakat ExecuteWFProcessRequest sınıfı CRM 4.0'dan kaldırılmış, bu yüzden bu kod CRM 4.0'da çalışmıyor. Ama bu bizim için bir sorun değil bunu kullanabileceğimiz bir sürü yöntem var işte bunlardan birisi:

----

In CRM 3.0, Mitch Milam has described how to Launching a Workflow Rule from JavaScript, it works great. However, in CRM 4.0, the class: ExecuteWFProcessRequest has been deprecated, so it won’t work in CRM 4.0. Although there are many ways to launch a workflow, if you want to run it through JavaScript, here’s the trick:

/* the function */
ExecuteWorkflow = function(entityId, workflowId)
{
    
var xml = "" + 
    
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
    
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + 
    
GenerateAuthenticationHeader() +
    
"  <soap:Body>" + 
    
"    <Execute xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" + 
    
"      <Request xsi:type=\"ExecuteWorkflowRequest\">" + 
    
"        <EntityId>" + entityId + "</EntityId>" + 
    
"        <WorkflowId>" + workflowId + "</WorkflowId>" + 
    
"      </Request>" + 
    
"    </Execute>" + 
    
"  </soap:Body>" + 
    
"</soap:Envelope>" + 
    
"";  

     var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
    
xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Execute");
    
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
    
xmlHttpRequest.send(xml);
    
var resultXml = xmlHttpRequest.responseXML;
    
return(resultXml.xml);
} 

/* call */ 

var theWorkflowId = "3FD2DD58-4708-43D7-A21B-F0F90A0AA9F2";
//change to your workflow Id 

ExecuteWorkflow(crmForm.ObjectId, theWorkflowId);

 

Microsoft Dynamics CRM 4.0 Software Development Kit - Yazılım Geliştirme Aracı

Rapor oluşturucular, yazılım ve içerik geliştiriciler için olan Microsoft Dynamics CRM 4.0 Software Development Kit (SDK) güncellenmiştir.
Plug-in oluşturmanın yeni yöntemleri, workflow aktiviteleri ile çalıştırma, yeni web servislerini kullanma, veri yönetimi ve daha birçok konuda yeni yazılar ve örnekler içermektedir.

Adres : http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&displaylang=en

----

The Microsoft Dynamics CRM 4.0 Software Development Kit (SDK) is for developers, system customizers, and report writers.
It contains all new information about creating plug-ins, working with custom workflow activities, using the new Web services, using new data management features, and much more.

This SDK contains information for developers writing server side code, custom business logic, integration modules, workflow assemblies, and more. It provides an architectural overview of Microsoft Dynamics CRM, the entity model, security model, and Web services. Sample code and walkthroughs guide you through the new features.

The SDK also contains information for developers customizing the Web client or Microsoft Dynamics CRM for Microsoft Office Outlook, including scripting, integration of custom Web pages, sample code, and a detailed user interface style guide.

Look for regular updates to this SDK. Future releases will include the ISV Guide and Report Writers Guide.

link: http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&displaylang=en