In den letzten Tagen und Wochen habe ich mich intensiv damit beschäftigt, wie man das Zusammenspiel zwischen Microsoft CRM und Skype for Business noch besser zusammen bekommen kann. Zwar gibt es Lösungen auf dem Markt – allerdings wollte ich wissen, wie gut die APIs und auch die Dokumentation zu den APIs sind. Nach vielem Suchen und Lesen habe ich es nun geschafft, aus einer Anwendung heraus, die das Lync SDK nutzt, um Telefonanrufe zu erkennen und die SIP-Adresse auszuwerten eine PhoneCall-Activity in Microsoft Dynamics CRM Online zu erstellen und einem Contact zuzuweisen. Grundsätzlich eigentlich kein großes Ding, aber wie immer liegt das Problem im Detail verborgen – ich bekam immer bei den Eigenschaften “From” und “To” einen Ausnahmefehler (System.InvalidCastException)…

Daraufhin begann die Suche – ich habe viele Artikel zum Thema, wie der Aufruf zum Eintrag einer PhoneCall-Activity aussehen sollte. Letztendlich bin ich bei 2 Artikeln hängen geblieben, die in der Summe zur Lösung beigetragen haben:

https://community.dynamics.com/crm/b/magnetismsolutionscrmblog/archive/2015/09/07/working-with-dynamics-crm-activity-party-lists-in-c-plugins

https://community.dynamics.com/crm/b/crmcondition/archive/2015/10/02/how-to-set-the-regarding-and-from-fields-on-a-phone-activity

Daraus entstand nun meine Lösung:

<csharp>

EntityReference _custRef = new EntityReference(“contact”, _id); // Entity-Refence des Kontaktes

Guid _userid = ((WhoAmIResponse)_service.Execute(new WhoAmIRequest())).UserId; // Systemuser ID auslesen

Entity _pcall = new Entity(“phonecall”); // neue Aktivität anlegen

Guid _pcID = _service.Create(_pcall);

</csharp>

In diesem Teil wurden eigentlich nur die entsprechend notwendigen GUIDs gelesen bzw. erzeugt.

Im nächsten – für mich spannenden Teil – werden nun die beiden EntityCollections erzeugt, die die Einträge für <From> und <To> (d.h. wer hat angerufen und wen hat er gesprochen) erzeugt werden.

In den unterschiedlichen Versuchen bekam ich immer einen Fehler bei den Eigenschaften <From> und <To>. Hier habe ich nun die Lösung von Magnetism  übernommen:

<csharp>

Entity _party1 = new Entity(“activityparty”);

_party1[“partyid”] = new EntityReference(“contact”, _id);

EntityCollection _from = new EntityCollection();

_from.Entities.Add(_party1);

Entity _party2 = new Entity(“activityparty”);

_party2[“partyid”] = new EntityReference(“systemuser”, _userid);

EntityCollection _to = new EntityCollection();

_to.Entities.Add(_party2);

</csharp>

Mit diesen Informationen war es nun möglich, eine PhoneCall-Activity anzulegen (https://msdn.microsoft.com/en-us/library/gg328416.aspx):

<csharp>

try

{

_pcall = _service.Retrieve(_pcall.LogicalName, _pcID, _attributes);   // bereits erstellen Call in den Activitäten des Kontakts suchen…

_pcall[“subject”] = “incoming Call from Customer”;

_pcall[“from”] = _from; // new ActivityParty[] { _from };

_pcall[“to”] = _to; // new ActivityParty[] { _to };

_pcall[“phonenumber”] = “+4984414006999”;

_pcall[“description”] = _stTextBox;

_pcall[“directioncode”] = false; // false for incoming, true for outging;

_pcall[“regardingobjectid”] = new EntityReference(_contact.LogicalName, _custRef.Id);

_service.Update(_pcall);

}

catch (Exception ex)

{

MessageBox.Show(“Failed to Update PhoneCall.” + ex.Message);

}

}

</csharp>

Zur Kontrolle die Ansicht in CRM – die beiden Einträge sind angekommen und dem richtigen Kontakt zugeordnet…