26 Temmuz 2012 Perşembe

CRM 2011-PLUGIN YAZMA


Bugünkü makalemizde Microsoft Dynamics Crm 2011 içerisindeki bir entity'e pre plug-in yazmasını öğreneceğiz. Plug-in mimarisini Microsoft Dynamics Crm 4.0 mimarisinden bildiginiz gibi iki çeşiti vardır. ( Pre Plugin ve Post Plugin )
İsterseniz ilk önce pre plugin ile post plugin arasındaki farkları anlatalım.
Pre-Plugin : Kayıt içerisinde kayıt edilmeden hemen önce çalışan yapıdır. Bu yapıda biz ilgili kayıt henuz kayıt edilmeden istersek gerekli kontrollerimizi yapar ve kaydı engelleriz istersek kayıt henuz kayıt edilmeden önce ilgili kayıt üzerinde bazı değerler ekleyebilir veya çıkartabiliriz.
Post Plugin : Kayıt içerisinde kayıt edildikten sonra çalışan yapıdır. Post pluginler ile yapabiliceklerimiz örnek olarak bir kayıt oluştuktan sonra bir başka entity de farklı bir kayıt oluşturmak olabilir.
Biz makalemizde pre plugin yapısını inceleyeceğiz.
Seneryomuzda kişi kartı üzerinde çalışan bir pre plugin yapımızın olduğunu varsayalım. Microsoft Dynamics Crm 2011 sisteminde bir kişi eklendiği zaman ilgili kişiye bir kişi seri numarası atayalım.
  • İlk önce kişi kartı üzerinde kişi  seri numarası adında bir field oluşturalım . new_kisiserinumarasi.
  • Visual Studio 2010 üzerinde  yeni bir class library projesi açalım.
Class ımızın adına KisiSeriUpdate adını verdim. Plug-in işlemlerimizi gerçekleştirmek için ihtiyacımız olan referansları ve dll leri sırası ile ekleyelim.
microsoft.xrm.sdk.dll
Microsoft.Crm.Sdk.Proxy.dll
Yukarıdaki ilgili dll leri Crm server ımızın kurulu olduğu makina üzerinde bin klasörünün altında bulabilirsiniz.
System.Runtime.Serialization referansımızıda projemize ekleyelim.
Uygulamamız içerisindeki referanslarımız aşağıdaki şekilde olmalıdır.
Kod yazımına başlamadan önce projemize son olarak bir key file ekleyelim. bunun için gerekli olan adımlar aşağıdaki gibidir.
  • Projemiz üzerinde sağ tuş özellikler ekranına ulaşalım . Karşımıza aşağıdaki gibi bir ekran gelecektir.
Dikkat etmemiz gereken noktalardan biri uygulamamızın .net framework 4.0 olmasıdır.
Signing kısmından yeni bir key file ekleyelim.
Yukarıdaki adımlarımızı tamamladıktan sonra artık plugin yazma işlemlerimize başlayabiliriz.
using Microsoft.Xrm.Sdk;

namespace PrePlugin
{
    public class KisiSeriUpdate:IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            throw new NotImplementedException();
        }
    }
}
Uygulama içerisinde oluşturduğumuz KisiSeriUpdate class ımıza IPlugin interface ini implement edelim. IPlug in interface i Microsoft.Xrm.Sdk içerisinde bulunmaktadır.
İnterface imizi implement ettikten sonra Execute method unun geldiğini göreceksiniz. Plugin işleyişi Execute metot'u içerisinde olur.  Şimdi Execute method u içerisinde ilgili işlemlerimizi yapalım.
 public void Execute(IServiceProvider serviceProvider)
        {
            try
            {
                // Plug-in imizi yakalamak için serviceprovider nesnesi üzerinden gelen asagıdaki adımlarımızı tamamlayalm.  
Asagıdaki kod blogunda plug-in imizi çalıstırmak için gerekli olan servislerimizi ve ilgili servisi çalıstırmamız için gerekli olan kullanıcımızı 
yakalamaktayız. ( Plug-in imizi hangi kullanıcı çalıstırdıgı ise o kullanıcının bilgileri bize context.UserId degeri ile birlikte gelecektir.  
Dolayısı ile islemlerimiz de ilgili kullanıcının yetkisi dahilinde olacaktır. 


                 Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
                
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

                // if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) context nesnesinin içerisindeki 
parmetrelerde Target parametresini olup olmadıgına ve ilgili parametrenin entity olup olmadıgına bakalım. 


                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"is Entity)
                {
                    // Son olarak kendi olusturmus oldugumuz entity nesnesi içerisine yukarıda kontrol ettigimiz context nesneinin 
Target input parametresini verelim. 

                    Entity entity = (Entity)context.InputParameters["Target"];

                    // entity nesnesi içerisinde bizim kisi kartı üzerinde girdigimiz degerler bulunmaktadır. 
                }
            }
            catch (Exception ex)
            {
                // Plug-in içerisinde herhangi bir hata ile karsılasır isek bunu kullanıcıya mesaj olarak çıkartalım. 
                throw new InvalidPluginExecutionException("Genel Hata : " + ex.Message);
            }
        }
Yukarıda yapmış olduğumuz işlemler aslında bir plug-in yazımı aşamasındaki kalıp işlerimizdir. Servis ayarlarımızı aldık servise hangi kullanıcı ile baglanıcağımızın bilgilerini aldık . Kişi kartı içerisinde kullanıcının girdiği değerleri yakaladık.
Şimdi kişi kartı içerisine kisi seri numarası alanına değerimizi yazalım.
entity.Attributes.Add("new_kisiserinumarasi", 123456);
entity nesnesi içerisindeki Attributes listesine Add method u ile yeni bir değer ekleyelim. Eklemek istediğimiz field ın sistemsel adını verelim. new_kisiserinumarasi , field değerini belirttikten sonra ilgili alana değerimizi yazalım ben burda 123456 değerlerini yazdım bu değerler istenirse bir xml dosyasından da çekilebilir.
Plug-in işlemlerimiz bitmiştir. Şimdi uygulamamızı derleyelim ve dll çıktımızı alalım.
PrePlugin.dll dosyamızı Crm server ımıza plugin registration tool ile yukleyip test edebiliriz.

19 Temmuz 2012 Perşembe

CRM de Güvenlik Rolleri (Security Roles)



Microsoft CRM, entityleriniz içindeki yetkileri yönetebilmenizi sağlamak adına bir rol sistemi sunar. ERP veya CRM gibi bir tool kullanıyorsanız, bu da mutlaka olması gereken özelliklerdendir zaten.
Microsoft CRM’in rol yetilerini maddeler halinde ifade edersek aşağıdaki 7 maddeyi sayabiliriz.
  • 1. Yetkiler rol merkezlidir. Yani roller oluşturulur ve kullanıcılara atanırlar.
  • 2. Roller arasında NxN bir ilişki vardır yani bir kullanıcı birden fazla role sahip olabileceği gibi bir rolü birden fazla kullanıcı da kullanıyor olabilir.
  • 3. Rol Kavramı sadece ürünün kendi entityleri için değil. Sonradan eklemiş olduğunuz bütün entityler için de kullanılabilirdir.
  • 4. Bir rol tanımlarken ilgili entity için o kişiye, okuma, yazma, silme,assign etme (atama) ,paylaşma(sharing) gibi yetkiler verebilirsiniz.
  • 5. Bu bahsettiğimiz yetkileri de kısıtlayabilirsiniz. Mesela Okuma yetkisini bütün organizasyondaki bütün kayıtlar için verebileceğiniz gibi yazma yetkisini sadece sahibi (owner) kendisinin olduğu kayıtlarda verebilirsiniz.
  • 6. Her kullanıcının en az bir rolü olmak zorundadır. Eğer kullanıcı bir role sahipse CRM ekranını açmaya çalıştığında rolü olmadığına dair hata mesajı alacaktır.
  • 7. Kullanıcı rollerine göre CRM ana ekranı da şekillenir. Mesela bir kullanıcının Contact Ekranını okumak için yetkisi yoksa, Ana CRM Ekranında Contact linkini dahi görmez. Dolayısıyla buradan da şu sonuç çıkıyor ki bir kullancı CRM sistemini açtığında bütün yapıları görmez. Sadece kendisine işiyle alakalı verilmiş rollerin izin verdiği yapıları görür.
Bir Kullanıcının sahip olduğu rolleri görmek için kullanıcı ekranın sol tarafındaki navigasyon barında bulunan Roles bağlantısını kullanabilirsiniz. Kullanıcıların bulunduğu listeye ise Settings --> Administration --> Users yolundan erişebilirsiniz.
Rollerin listesine ulaşmak için ise Settings --> Administration --> Security Roles yolunu kullanabilirsiniz. Bir Role tıkladığınızda Farklı tablar altında hem sistem hem de custom olmak üzere bütün entitylerinizi görebilirsiniz.
Burada entity karşısındaki kutucuklara tıklayarak rolün özelliğini değiştirebilirsiniz. Mesela Account Ekranındaki Read kutusuna tıklayarak tam yeşil hale yani Organization durumuna getiriseniz, o kullanıcı bütün account kayıtlarını görebilir. Ama aynı kullanıcı için accountda write yetkisini çeyrek sarı daire yani User durumuna getirirseniz Sadece Sahibinin kendi olduğu müşterilerde güncelleme yapabilir. Bu rollerin hangi anlama geldiğini yukarıdaki ekran görüntüsünde de olduğu gibi sayfanın altında görebilirsiniz.
Bu noktada Append ve Append To kavramından da bahsetmek önemlidir. Biribiriyle ilişkili entity’lerde Append ilgili entity’nin Append To ise ilişkilendirlecek entitynin yetkisi ile alakalıdır. Mesela Account ve Teklif ekranlarında Tekliflerin account içine ilişkilendirilebilmesi için rolde Teklif’in Append, account’un ise append to yetkilerinin olması gerekir. Mesela bir kişinin sadece kendi tekliflerini kendi account’larına entegre etmek isterseniz account için append to ve teklif için append haklarını user bazında vermeniz gerekir. Eğer kullanıcının kendi tekliflerini herhangi bir account’a ilişkilendirmesini isteseydiniz, o zaman Teklif’in append hakkına user ve account’un append to hakkında organization vermeniz gerekirdi.
Benim tavsiyem rolleri oluştururken kullanıcıların görevlerini ayırmak ve her görev için ayrı bir rol oluşturmak olacaktır. Bu durumu şöyle açıklayayım. Mesela bir çalışımız, hem Fırsatları hem de Accountları yönetiyor olabilir. Bu durumda tek bir rol altında iki entity’ye birlikte rol vermektense. İki ayrı rol tanımlayarak birinde Account diğerinde de Fırsat (Opportunity) ekranı üzerinde yetkiye sahip rol tanımlayabilirsiniz. Böylece Bu iki rolü o kişiye atadığınızda iki entity üzerinde de işlemlerini yapabilecektir.
Microsoft CRM’in rol sisteminin eksik yapısı yetkiyi kayıt bazında yönetmesi yani alan bazında olmamasıdır. Mesela bir kullancıya bu entity’deki bütün alanlara güncelleyebilirsin diyebilirsiniz, ama sadece şu ve şu alanları güncelleme diyemezsiniz.Daha doğrusu bunu CRM’in “out of box” diye tabir edilen kutudan çıktığı haliyle diyemezsiniz. Bir takım javascript özelleştirmesi yapmanız gerekir. CRM 2011 alan bazlı bu güvenlik özelliğini getirmiştir. Javscript gibi ek kodlama yapmaya gerek bırakmaz.

18 Temmuz 2012 Çarşamba

CRM 4.0 - CRM de İlişkiler ve Mapping (N - N ilişki)


Bu blümde N:N ilişki anlatılacaktır.Bir önceki makalede 1:N ve N:1 anlatılmaktadır.

N:N ilişki birbirine bağlı iki entiy’nin ikisinin de biribirine birden fazla kayıt içerek şekilde bağlanabilmesidir. Örnek vermek gerekirse CRM kullanıcılarının tutulduğu User entity’si ile güvenlik rollerinin tanımlandığı Roles Entity’si birbirine böyle bağlıdır. Bir kullanıcının birden fazla rolü olabileceği gibi bir rolü kullanan birden fazla kullanıcı da olabilir. Iki entity’de biribirine çoğullayacak şekilde bağlıdır. N:N ilişkilerde bağlı alanlar LookUp olarak görünmezler. Her iki entity de sol tarafta navbar üzerinde görüntülenirler.
Şimdi Örnek bir N:N ilişki tanımlaması yapalım. Fırsat (Opportunity) ekranı ile Muhatap Kişi (Contact) ekranı arasında bu tanımlamayı yapalım. Settings --> Customization --> Customize Entitties komutunu vererek Opportunity(Fırsat)’I seçin.

N:N RelationShips kısmından “New Many to Many Relationship” düğmesine tıklayın.

Other Entity kısmından bağlamayı yapacağımız entity seçilir. Burada Contact Entity’sini seçin. Bağlantının görüntülenebilmesi için Display Option kısmından “UsePlural Name” seçeneğini de seçin. “Save and Close” düğmesine basın. CRM arka planda ilişkiyi tanımlayacak ve web servise gerekli bildirimleri de ekleyecektir. Buradaki new_opportunity_contact ismine dikkat etmek gerekir. Çünkü her N:N ilişki veritabanında yeni bir tablo demektir. Ve bu tablonun adı budur. Veri tabanında aşağıdaki gibi bir sorgu yaptığınızda bu kayıtları görebilirsiniz.

Şimdi Opportunity ekranını açın sol tarafta navbar üzerinde Contacts bağlantısını görebilirsiniz. Buradan “Add Existing Contact” komutunu vererek contact’ları Opportunity ile ilişkilendirebilirsiniz.

Aynı matık Contact Ekranında da geçerlidir.

Mapping Kavramı
CRM’de Mapping ilişkilerle ilgili bir olaydır. Mesela 1:N ilişki kurarak iki entity’yi bağladınız. Biri içinden diğerini oluşturmaya kalktığınızda ana entity’deki istediğiniz alanları yavru entity’deki alanlarla eşleştirip otomatik kopyalanmasını sağlayabilirsiniz. Mesela Opportunity ekranı içindeyken Quotes bağlantısını kullanarak New Quote dediğinizde Opportunity’deki istediğiniz alanların yeni quote entitysine de kopyalanmasını sağlayabilirsiniz.
Örnek üzerine konuşalım. Fırsat entity’sini açın ve 1:N Relationships kısmına gelin.

Quote ile olan ilişkiyi çift tıklayarak açın.Burada Mapping bağlantısı altında mevcut eşleştirmeleri görebilirsiniz.

Mesela Opportunity’deki Topic alanı ile Quote’daki Name alanı eşleştirilmiştir. Gerçekten de Fırsat içinden bir teklif oluşturmaya çalıştığınızda ismi aynı kalacaktır. Benzer şekilde Campaignid alanı da eşleştirilmiştir. Yani fırsat’dan Teklif ürettiğinizde Source Campaign alanı otomatik olarak quote üzerinde campaignid alanına kopyalanacaktır.
Şimdi bir tane de biz ekleyelim. New Komutunu verin.

Soldaki alan Source Entity yani Opportunity entity’sinin alanlarını verir.Sağ taraf ise Target Entity yani Teklif entity’sinin alanlarını içerir. Eşleştirmek istediğimiz alanları karşılık seçip OK düğmesine tıklamamız gereklidir. Iki Taraftan da Descirption alanını seçin ve OK tuşuna basın. İşte Mapping işlemi tamamdır. Artık bir fırsat içinden teklif oluşturmaya çalıştırdığınızda description alanı da otomatik olarak taşınacaktır.

CRM 4.0 - CRM de İlişkiler --RelationShips


Relationship kavramını entityler arasında bağlantı kurmak diye özetleyebiliriz. Daha programcı görüşü bir ifade ile de entity tabloları içinde foreign, primary key ilişkileri tanımlayarak, tablolar arasında bağlantı kurmak diye tanımlayabiliriz. Bu makalemizde CRM içinde bunun nasıl yapıldığından, arka planda veritabanında hangi işlemlerin yapıldığını ve ilişkiler ile ilgili konfigürasyonları inceleyeceğiz.
CRM’de İlişki Türleri
CRM’de 3 tip ilişki vardır. 1:N,N:1,N:N. N’e N olan ilişki CRM 4.0 ile gelen yeniliklerden biridir.
İlişkiler entiy’ler arasında kurulur ve ilişkinin adı hangi entitynin diğerine nasıl bağlı olduğunu açıklar. Mesela Fırsat(Opportunity) ve Teklif(Quote) entitylerini düşünün. Teklif Ekranında iken Fırsat ekranı ile yapacağınız N:1 bir ilişki şu anlama gelir. N tane yani birden fazla teklif sadece 1 fırsata bağlı olabilir. Bu da teklif ekranından fırsat’ın gösterildiği bir lookup alana işaret eder. Aşağıdaki ekran görüntüsünde Teklif ekranında ona bağlı Fırsat Lookup’I gösterilmiştir.

O zaman buradan şu sonuç da çıkıyor. Eğer, Forma Lookup alan eklemek istiyorsanız Attributes ekranında “New Attribute” diyerek bunu yapmazsınız. Bunun yerine N:1 ilişki kurmanız gerekir. Daha sonra Form görünümü açıp Add Fileds diyerek Lookup alanınızı forma ekleyebilirsiniz.

Şimdi N:1 ilişkinin nasıl ekleneceğine bakalım. Settings --> Customizations -->Customize Entities komutunu vererek istediğiniz entity’yi açın. Örneğin Fırsat entity’si olabilir.
N:1 Relationships bağlantısını tıklayın. Aşağıdaki ekran görüntüsünde de görebileceğiniz gibi Fırsat ekranında zaten kurulmuş olan N:1 ilişkileri yada başka bir deyişle Look up’ları görebilirsiniz.

New Many-to-1 Relationship komutunu vererek ilişki tanımlama penceresini açın. Primary Entity alanından ilişki kuracağınız Entity seçilir. Örneğimizde Contact entity’si ile ilişki kurmak istiyoruz. Contact’I seçin. Daha Sonra Display Name alanından Lookup’ın yanında belirecek açıklamayı yazın. Formda bu açıklama görünecektir. Ben “İlgili Kişi” diye yazıyorum. CRM “Name” alanına otomatik bir isim verecektir ama bunu değiştirebilirsiniz. Projeniz içinde sitematik ve kolay ulaşılır olması açısından buraya isim olarak bağladığınız entity’nin adını sonuna id koyarak vermenizi tavsiye ederim. Mesela Bu örnekte Contact entitysini bağladığımız için new_contactid ismini vermek iyi bir yaklaşım olacaktır.

Buradaki önemli diğer konuda “RelationShip Behaviour” kısmıdır. Bu ilişkinin konfigurasyon ayarlarının yapıldığı kısımdır.
“Type of Behaviour” kısmı, hazır bazı tipler sunar. Mesela Delete Seçeneği kayıt seçildiğinde ilişki tanımlanmış kayıtların ne olacağını belirler. Yada Assign edildiğinde bağlı kayıtların da sahibinin değiştirilip değiştirlmeyeceğini belirler.
Save tuşuna basmanız ile bilrikte CRM ilişkiyi kuracaktır.
Eğer eklediğimiz Contact bağlantısını form üzerinde de görmek istiyorsak, Form görünümünde Add Fileds diyerek “İlgili Kişi” isimli alanı bulup eklememiz gerekir.

Formu kaydedip entity’yi publish ettiğimizde artık Fırsat ekranı içinde ilgili Kişi alanı lookup olarak gözükecektir.

Peki her Fırsat için bir tane Contact bağlayabiliyoruz ve bunu ekranda görüyoruz. Peki Bu Contact’a bağlı fırsatların neler olduğunu nasıl göreceğiz diye sorabilirsiniz. Contact Ekranını açtığınızda sol tarafta Opportunities bağlantısı belirmiştir. Buraya tıklayarak bu Contact’ın bağlı olduğu Fırsatları görebilirsiniz.

İşte Contact ekranındaki bu bağlantı da 1:N ilişki olarak tanımlanır. Ve aslında Fırsat ekranında N:1 ilişki tanımlarken 1:N ilişki de Contact ekranında otomatik olarak tanımlanmış oldu. 1:N ilişki mantığında da örneğimizde 1 contact birden fazla fırsata bağlı olabilir. Nitekim yukarıdaki ekran görüntüsünde de görebileceğiniz gibi “New Opportunity” düğmesine tıklayarak bu ekrandan Contact’a ait yeni bir fırsat oluşturabilir veya “Add Existing Opportunity” düğmesine tıklayarak mevcut fırsatlardan birini Contact ile ilişkilendirebilirsiniz.
Nitekim Contact ekranında 1:N Relationships bağlantısına tıkladığınızda ilişkiyi de görebilirsiniz.

Olaya Veritabanı açısından baktığımızda new_contactid isimli bir alan opportunity entity tablosuna eklenmiştir. Contact entity tablosunda ise Kolon ekleme gibi bir işlem olmamıştır.

Duplicate Detection Araçları ile Veri Temizliği

Bu makalede CRM'in çift kayıtları bulmak için kullandığı araçları inceliyor olacağız. Böylece aynı telefon numarası yada eposta adresine sahip müşteriler ayırt edilebilmektedir.

Bir çok sistem çok hızlı bilgi biriktirirler. Bir CRM uygulamasında da hızla artan kayıt sayısında verinin kalitesini sağlamak da önemlidir. CRM’in veri kalitesini artırmak adına hazır gelen araçları mevcuttur. Amaç çoklanmış kayıtları bulmak içinse CRM başka araçlar da sunar. Mesela İsimleri benzer yazılmış ama aynı müşterileri belli kurallar tanımlayarak bulabilirsiniz. Ve hatta daha kayıt oluşturulmadan bu kontrolün çalışarak sisteme hiç kayıt düşülmemesini de sağlayabilirsiniz. Bütün bu işleri yöneteceğiniz alan Settings sekmesi altındaki Data Management alanıdır.



Kuralları Tanımlamak
Önce çoklayanları bulmak kurallarını tanımlamalıyız. Bunun yapıldığı yer Duplicate Detection Rules kısmıdır. Buraya tıkladığınızda CRM’in kurulumuyla birlikte gelen bir çok hazır tanımlı kural gelir. Mesela aynı eposta adresine sahip account ve contact kayıtları gibi. Bu kurallar tanımlanırken publish kavramı vardır. Yani tanımladığınız bir kuralın geçerli olup olmamasını publish veya unpublish ederek değiştirebilirsiniz.
Bir örnek üzerinden gidelim. İki aynı contact içinde birbirinin aynı iki cep telefon numarası olamasın. New diyerek Kuralı açın ve aşağıdaki gibi doldurun.


Base Record Type ve Matching Record Type karşılaştırdığımız ve karşılaştırılan entityleri ifade eder. Biz Contact kayıtları içinde aynı cep numaralarını aradığımız için ikisinde de Contact ifadesini seçtik. Ama bu entityler farklı da olabilir. Mesela, Account ekranındaki eposta adresinin Contact kayıtlarındaki bir eposta ile aynı olup olmadığını kontrol edebilirsiniz. Farklı entitylerin benzer alanlarını birbirine kıyaslayarak çiftleri bulabilmesi CRM’in güçlü bir özelliğidir. Çiftleri ayırmak için alanların birebir aynı olması gerekmez. Criteria alanından baştan itibaren şu kadar karakterin uyuşması veya sondan itibaren bu kadar karakterin uyuşması yeterlidir de diyebilirsiniz.


Telefon örneğimizden gidecek olursak mesela aynı telefon 505 111 11 11 olarak da veya 0505 111 11 11 şeklinde de yazılmış olabilir. Bu durumda sondan itibaran belli sayıda karakteri karşılaştırmak isteyebilirsiniz. Kaydedip Publish ettikten sonra artık bu kural aktif olarak işleyecektir. İki tane aynı cep telefonuna sahip Contact oluşturmaya veya güncellemeye çalıştığınızda aşağıda gibi bir pencere açılacak ve hangi kayıtla benzeştiğini gösterecektir.



CRM ne kadar çiftlemeyi bulsa da Save Record düğmesine tıklayarak gene kaydedebilirsiniz.
Mevcut Kayıtlar İçinde Sorgulamak
Yukarıdaki yöntem ile kaydetme veya güncelleme anında çiftlemeleri yakalayabiliyorduk. Benzer işlemi zaten sistemde bulunan kayıtlar üzerinde de yapmanız mümkündür. Bunun için Duplicate Detection Jobs linkini tıklayarak yeni bir Job oluşturmanız gerekir. Karşınıza çıkan pencerede Look For alanından içinde arama yapmak istediğiniz entity’yi seçebilirsiniz. Bizim örneğimiz için Contact’ı seçip şart olarak da Cep numarasının verilen numara olmasını istedik.

İsterseniz Preview records düğmesine tıklayarak bu kayıtların neler olduğunu da görebilirsiniz. Bu basit bir örnektir. Bunları çoğaltmak mümkündür. Mesela vergi no’su olmayan müşterileri bul gibi bir sorgu da tanımlayabilirsiniz.
Bir sonraki ekranda işin ne zaman başlatılıp ne kadar sık aralıklarla çalışacağını da belirterek,işlemi bitirebilirsiniz.

Tanımladığınız işlem Duplicate Detection Jobs altında gözükecektir

İşlem belirli aralıklar çalışacak ve istediyseniz durumu size bildiren bir de eposta gönderecektir.

Bu Jobı açıp View Duplicates bağlantısına tıkladığınızda sistem çiftlemeleri gösterecektir.

Bu kontrollerinin hangi durumlarda kontrol edileceğini belirleyeceğiniz yer ise gene CRM’da Data Management sayfası altındaki Duplicate Detection Settings alanıdır.

CRM 2011 de Kampanya OLuşturma (Quick Campaigns)

Bir CRM uygulamasının olmazsa olmaz özelliklerinden biri elbette kampanya yönetimidir. TDK sözlüğünde Kampanya kelimesi “Tüketiciyi özendirmek için belli sürelerde düzenlenen indirimli veya taksitli satış. “ şeklinde geçmektedir. Bir CRM uygulamasında da kampanyayı gerçekleştirmek adına yapılan işlemler kampanya yönetimi olarak düşünülür. Bir kampanyada ana amaç hedef kitle olan müşterileri seçmek ve bunlara bir çok farklı yolla mesela Eposta,kısa mesaj veya telefonla ulaşmaktır. Böyle yapılan indirim veya taksitli satış bu kullanıcılara ulaştırılır. CRM uygulmasının işi burada bitmemekte tabi. Bu kampanyadan yararlanan müşterilerin raporlanabilmesi de kampanyanın başarısını ölçümleyebilmek adına gerekli bir özelliktir.
Microsoft CRM gelişmiş bir kampanya yönetimi sunar. Bir başka makalede bunu detaylıca yazabiliriz veya video serisinde bahsedebiliriz. Ama asıl bu makalede işlemek istediğim konu Hızlı Kampanyalar konusudur.CRM’deki karşılığı quick campaigns olan bu yapı müşterilere hızlıca ulaşmak istediğini bir durumda kullanılmak üzere tasarlanmış asıl kampanya modülünün daha sade bir halidir. Dolayısıyla normal Campaign modülünde yapabileceğiniz bazı özellikler burada kısıtlanmıştır.
Hızlı kampanyanın en büyük avantajı ise lead,account,contact ve Advanced Find ekranlarından hızlıca kullanıcıları seçerek adlarına kampanya düzenleyebilmenizdir. Tabiki oluşturulmuş bir pazarlama listesi üzerinde de hızlı kampanya uygulayabilmek mümkündür.
Account,contact ve Lead ekranlarının üzerinde aşağıdaki gibi bir düğme bulunur. İstediğiniz kayıtları seçip Bu düğmeye tıklayarak hızlı kampanya penceresini açabilirsiniz.



Bunun yanında bir pazarlama listesi veya Advenced Find’da bir arama yaptığınızda çıkan pencerede de bu düğme görünecektir.
Şimdi Contact ekranında bir kaç kullanıcı seçelim ve Quick Campaign menüsünden For Selected Records seçeneği ile örnek bir hızlı kampanya oluşturalım.
Hızlı kampanya için bir isim belirleyip Next tuşuyla ilerleyin.


Sıradaki basamakta müşterilere hangi kanallardan ulaşacağımız belirlenir. Burada Phone Call, Appointment,Letter,Fax ve Email olmak üzere 5 seçenek mevcuttur. Normal kampanya modülünde ek bazı tipler daha vardır mesela şablon kullananan eposta gibi..



Burada seçilen tipe göre CRM ilgili aktiviteleri oluşturacaktır. Mesela Phone Call seçerseniz Telefonla arama görevi oluşturacak, Appointment seçerseniz appointment kaydı oluşturacak, eposta seçerseniz Eposta oluşturup atacaktır gibi. Mesela kampanyayı çağrı merkezi düzenliyor ve tek tek müşterilere telefonla ulaşılacaksa Phone Call seçilebilir bu durumda Çağrı merkezi görevlileri önlerine düşen görevleri görürler ve kampnayadaki müşterileri arayarak pazarlamayı yaparlar. Biz daha sık kullanılan bir yol olan e-mail’i seçelim.
Hemen altındaki “select who will own these new activities” alanından bu aktivitelerin kimin üzerine atanacağını belirlersiniz. Hepsine kendinize atayabileceğiniz gibi başka bir kullanıcıya , queue denen havuzlara veya sahiplerine de atayabilirsiniz. Havuza atanmış aktivitelerin havuzdan gene ilgili kişilere atanması gereklidir. Özellikle Çağrı merkezi için hazırlanan telefon aktivitelerinde önce havuza atıp oradan call center görevlilerine atamak bir seçim olabilir.
Eğer Aktiviete olarak E-mail seçeneğini seçerseniz, en alttaki “Send e-mail messages automatically and close corresponding e-mail activities” seçeneği aktifleşecektir. Varsayılan durumda seçilidir. Ve hızlı kampnya oluşturulduktan sonra Epostaların gönderilmesini sağlar. Eğer Epostaları göndermeden önce bir bakayım olmadı metnini değiştireyim gibi bir durumunuz varsa bu seçeneği kaldırabilirsiniz ki bu durumda Epostalar oluşacak ama gönderilmeyecektir.
Next düğmesine tıklayıp ilerlediğinizde Email seçeneğini seçtiğimiz için mail içeriğini hazırlamanız gerekir.


Bu aşamadan sonra Kampanyayı oluşturabilirsiniz. Oluşturulmuş aktivitelerin listesini Activities ekranından görebilirsiniz.
Oluşturduğunuz Hızlı kampanyaların listesini ise Service Modülü altındaki Quick Campaigns linki altından görebilirsiniz. Burada Kaç müşteriye kaç aktivite gönderildi gibi istatistiki bilgilere ulaşabilirsiniz.


Bunun yanında gene bu ekrandan Göndermiş olduğunuz epostaları ve hangi müşterilere gönderdiğinizi görebilirsiniz.


Bu ekran için önemli bir konu ise kampanya cevaplarının girilebilmesidir. Campaign Responses kısmından kampanyasına yapılan dönüşleri sisteme girebilirsiniz.


Veya bu işlem daha kolay yapmak için , gönderdiğiniz eposta aktivitesini açıp Actions menüsünden “Promote to Response” komutunu verebilirsiniz
.
Bu durumda bir çok alan hazır dolu olarak kampanya cevabı ekranı açılacaktır.
Şimdi de kampanyalar ile ilgili bir kaç önemli noktadan bahsetmek istiyorum. Birincisi SMS gönderimi. CRM direkt sms gönderme özelliğine sahip değildir. Fakat sms getaway hizmeti veren bir firmadan sms satın alarak (öyle ki sms göndermek eposta gibi değildir. Gönderdiğiniz her sms için az da olsa bir ücreti ödemeniz gerekir.) ve biraz da custom kod yazarak Letter tipi aktivitilerin sms gibi çalışmasını sağlayabilirsiniz.
Konu eposta göndermek olunca da bir konudan bahsetmek istiyorum. Az sayıda eposta yollayacaksanız sorun olmayabilir ama bir kampanya için göndereceğiniz posta sayısı yükseldikçe bunların alıcı eposta kutuları tarafında spama düşme ihtimali vardır. Bu durumda da 3. Parti eposta hizmeti veren firmalar devreye girer. Bu tarz bir firmadan hizmet satın alarak epostaların CRM’de oluşturulmasını ama gönderme işleminin hizmeti aldığınız firma tarafından atılmasını sağlayabilirsiniz. Bu firmalar belli kurallar uygulayarak epostaların spama düşmesini engelleyebilirler. Mesela belli sayıda postayı belli aralıklarla atmak veya farklı domainlerdeki sunucular üzerinden atmak gibi yöntemlerle bu işlemi gerçekleştirirler.. Bu tarz firmalardan hizmet almanın bir avantajı da kampanya cevaplarını da toplayıp raporlayabilmeleridir. Hatta direkt crm içine Campaign response olarak kayıt düşebilen de vardır.
Hızlı kampanayalar ile ilgili son bahsetmek istediğim konu ise müşterinin izin vermemesi olayıdır. Öyle ki müşteriniz kendisine telefonla, epostayla, sms gibi kanllalarla ulaşılmasını istemiyor olabilir. Bu durumda zorla bu mesajları kendisine atmak pek hoş bir durum olamaybilir. Eğer bir account veya contact kendi ekranında bana epostayla ulaşmayın gibi bir seçenek ile işaretlenmişse bu kullanıcıyı içeren bir kampanya düzenlediğinizde eposta görevi oluşturulmaz.

Dynamics/CRM 4.0  Web Servisini Kullanmak

Dynamics CRM’in belki de en güçlü yönü ve ona bu kadar esneklik sağlayan özelliği SOAP mimarisi dediğimiz web servisler üzerine kurulu yapısıdır. Özellikle geliştiriciler açısından web servislerin kullanılmadığı bir CRM projesi çok azdır.
CRM sistemi 3 web servisle gelir. Birincisi ve en sık kullanılan ana web servisidir. Bunun özelliklerinden şimdi bahsedeceğiz. Diğeri CRM’in yapısı ile iligli metotların bulunduğu metadata web servistir. Bu servisi kullanarak CRM dışından CRM’a ait entityler ve alanlar açabilir ve bunları modifiye edebilirsiniz. Son web servisi Discovery servisidir. Bu servisin amacı CRM’in kuruluğu olduğu system ile ilgili bilgileri vermesidir. Mesela  hangi klasöre kuruldu gibi bilgiler bu web servis ile öğrenilebilir. CRM’in kurulum bilgileri şu sebeple önemlidir. Eğer 3. Parti bir yazılım hazırladıysanız ve bir setup dosyası ile bu geliştirmenizi dağıtıyorsunuz. İligli dosyalarınızın CRM’de nereye yazılacağını bilmeniz için bu tip bilgilere ihtiycınız olacaktır. Bu bir örnek, çoğaltabiliriz. Mesela bir program yazarak CRM sisteminin yedeğini almak istiyorsunuz. Nereye kurulduğu hangi veritabaını kullandığı gibi bilgiler gene önem kazanacaktır.
Şimdi asıl işlevimizi gören ana web servisinin detayına girebiliriz. CRM sisteminde gördüğünüz bütün ekranları-entityleri düşünün buralardaki her alandan tutun da yeni bir kayıt oluşturmak yada güncellemek için gereken kodlar, sorgular çekmek için kullanılan yapılar hepsi bu web servisin içinde vardır. Öyle ki Custom bir entity oluşturduğunuzda yada yeni bir alan eklediğinizde dahi ilgili bilgiler hemen bu Web servisi’in içine de yazılır ve kullanılmaya hazır olur.
Şimdi bu web servis ne işimize yarar sorusunun cevebını biraz irdeleyelim. Bu web servisi kullanarak CRM dışından aynı CRM’in yaptığı işlevleri yaptırabilirsiniz. İş hayatından bir kaç örnek vermek istiyorum. Mesela Internet üzerinden kullanıcıların çağrı isteklerini alıp bunu bir case olarak sisteme kaydetmek istiyorsunuz.Asp.Net’de bir form tasarladınız. Bir Case açılması için gerekli alanları koydunuz. Ve altına bir düğme yerleştirdiniz. İşte bu web sitesine dışardan giren biri ilgili alanları doldurup düğmeye tıkladığında bu web servis ile bilgileri bir çağrı şeklinde CRM sistemine kaydedebilir. Burada önemli olan konu dışarıdaki kullanıcının bir CRM kullanıcısı olmamasına rağmen direkt sistem içinde kayıt oluşturabilmesidir. Bunun ne kadar geniş bir kullanım alanı olabileceğini düşünün. Mesela dışarıdan müşteri adayları(lead) girilen bir yapı kurabilirsiniz.ve kullanıclar gene bir CRM kullanıcısı olmadan siteme kayıt girişi yapabilirler. Yada mesela o günkü servis kayıtlarınızı web’den yayınlayabilirsiniz. Böylece kullanıcılar internet üzerinden ve gene bir CRM kullanıcı olmamalarına rağmen o günkü servis yoğunluğunu görüp gelip gelmeme konusunda karar verebilirler. Bu örnekleri çoğaltmak mümkün.
Buraya kadar güzel hoş anlattık da hiç örnek göstermedik. Bu iş nasıl olur diye sorarsanız çok haklısınız. Şimdi bir örnek ile bu konuştuklarımızı gerçeğe dönüştürelim. Basit bir web formu hazırlayalım ve buradan aldığımız bilgileri CRM web servisini kullarak bir lead olarak sisteme girelim.
Lead ekranında bir çok alan vardır. Bunların hepsini formumuza koymamıza gerek yok sadece ihtiyacımız olanları eklesek yeterli olacaktır.


Bir Lead ekranında varsayılan durumda zorunlu olan 3 alan vardır Topic, Last Name ve Company Name. Bu alanların sistemde tutuldukları isimleri de benzer olarak sırasıyla subject,lastname ve companyname’dir bu isimleri bilmek önemlidir. Çünkü web serviste bu alanlara bu isimleriyle ulaşacağız. Farklı bir tipte alan olması açısından bir de Rating isimli alanı da formumuza koyalım bu alanın CRM sistemindeki ismi ise leadqualitycode’dur. Bu alanların gerçek isimlerini Settings-- > Customizations -- > Customize Entities yolunu kunnarak buradan Lead entity’sini seçerek öğrenebilirsiniz.
Forms and Views alanında Form’u seçtikten sonra aşağıdaki gibi bir ekran gelecektir.



Adını öğrenmek istediğiniz alana çift tıklayarak gelen özellikleri penceresinin Name sekmesinde görebilirsiniz.



Visual Studio 2008’de bir ASP.NET uygulaması açın. ASP.NET seçmeniz şart değildir. Bir windows form uygulması yada konsol uygulaması da seçebilirsiniz. Benzer şekilde ASP.NET’in 2008 verisyonunu kullanmak da zorunda değilsiniz.2005 yada başka bir sürümde olabilir ve hatta Visual Studio yerine Microsoft’un Express Edition yazılım geliştirme araçlarından birni de pek ala kullanabilirsiniz. Forma aşağıdaki gibi 4 alanı ekleyin. HTML kodu ve görünümü aşağıdaki gibi olacaktır.

<table class="style1">
  <tr>
    <td>
       Konu:</td>
     <td>
     <asp:TextBox ID="txtSubject" runat="server"></asp:TextBox>
       </td>
        </tr>
        <tr>
          <td>
            Soyad:</td>
          <td>
       <asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>
                    Firma:</td>
                <td>
                    <asp:TextBox ID="txtCompanyName" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>
                    Önem Derecesi</td>
                <td>
        <asp:DropDownList ID="ddlLeadQualityCode" runat="server">
                        <asp:ListItem Value="1">Hot</asp:ListItem>
                        <asp:ListItem Value="2">Warm</asp:ListItem>
                        <asp:ListItem Value="3">Cold</asp:ListItem>
        </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td>
     <asp:Button ID="btnSave" runat="server" Text="Kaydet" />
                </td>
             
            </tr>

</table> 


Sıradaki aşama CRM web servisini projemize dahil etmektir. Solution Exploer üzerinde References üzerine sağ tıklayın ve Add Web Reference… komutunu verin.


Çıkan kutuya  http://<sunucu_adi>/mscrmservices/2007/CrmServiceWsdl.aspx yazın. Biraz bekledikten sonra servis ile ilgilii tanım dosyaları gelecektir. Buradaki CRM’in kurulduğu sunucuyu belirtirken 5555 portuna kurulum yaptıysanız ki varsayılan durumda bu porta kurulacaktır bunu belirtmeyi unutmayın. Örnek bir adres şöyle verilebilir. http://Bizimsunucu:5555/mscrmservices/2007/CrmServiceWsdl.aspx Bu noktada dikkatinizi 2007 ifadesine çekmek istiyorum. Bu web servisi’in CRM 4.0 sürümüne ait olduğunu gösterir. CRM 3.0 kullnıyorsanız o zaman 2007 yerine 2006 kullanmanız gerekirdi. CRM 4.0 sürümünde 2006’li olan halini de kullanmanız mümkündür.
Web Reference name: alanında servisniz için crmservice ismini verdikten sonra Add Reference komutunu vererek servisi projenize dahil edin.



Default.aspx.cs içine using crmservis.crmservice; referansını ekleyin. Buradaki crmservis projemizin adıdır. Eğer uygulamayı açarken farklı bir ad belirtmişseniz burada onu yazmalısınız. Ikinci crmservice ise az önce ismini verdiğimiz servisin adıdır.
Şimdi Default.aspx.cs içine yazılacak tam kodu veriyorum. Daha sonra açıklamasını yapacağız.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using crmservis.crmservice;
using System.Net;

namespace crmservis
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
       }
        protected void btnSave_Click(object sender, EventArgs e)
        {
            CrmService srv = GetCrmService();
            lead l = new lead();
            l.subject = txtSubject.Text;
            l.lastname = txtLastName.Text;
            l.companyname = txtCompanyName.Text;
            l.leadqualitycode = new Picklist();
            l.leadqualitycode.Value = Convert.ToInt32(ddlLeadQualityCode.SelectedValue);
            srv.Create(l);
        }

        private static CrmService GetCrmService()
        {
            CrmService service = new CrmService();
            service.Url = "http://<sunucu:5555>//mscrmservices/2007/crmservice.asmx";
            service.Credentials =
                   System.Net.CredentialCache.DefaultCredentials;
            service.Timeout = 1000 * 1000;
            return service;
         }
    }
}

GetCRMService Metodu ile servisi çağırmış olursunuz. Yeni bir lead sınıfı örneği oluşturuktan sonra yukarıda olduğu gibi formadan okuduğunuz değerleri iligli alanlara yazabilirsiniz. Metinsel alanlarda direkt yazabilir ama picklist,lookup gibi özel alanlarda yazacağınız alanın tipini de belirtmeniz gerekir. Mesela Picklist alan için l.leadqualitycode = new Picklist(); diye belirtmeniz gerekir.daha sonra DataValue özelliğini kullanarak picklist’e de değer atayabilirsiniz.
Burada dikket çekmek isteiğim bir konu da
service.Credentials = System.Net.CredentialCache.DefaultCredentials;

satırıdır. Böylece web servisin uygulamayı çalıştıran kullanıcının hakları ile web servise bağlanmasını sağlamış olursunuz. Eğer kullanıcının hakları yeterli değilse bağlanma gerçekleşmez. Bunun önüne geçmek ve her daim bağlanmayı sağlanmak açısından yetkileri olan özel bir kullanıcıyı bağlamak isteyebilirsiniz. O zaman yukarıdaki satırı aşağıdaki gibi değiştirmeniz gerekir.

ICredentials myCredentials = new NetworkCredential("kullanici""sifre""domain");
 service.Credentials = myCredentials;
service.PreAuthenticate = true;

Uygulamayı çalıştırıp Formu doldurun ve Düğmeye Tıklayın lead kaydının sistemde oluşturulduğunu göreceksiniz.



Bu noktada önemli bir hatırlatma yapmak istiyorum. CRM’in web serivisini, kullanmak uygulamayı bir nevi herkese açmak olduğu için ek bir lisans bedeli ister.  connector Lisansı diye tabir ettiğimiz bu lisansın fiyatlamasıyla ilgili Microsoft'dan detaylı bilgi alabilirsiniz.