Google Anlatics

Sunday, December 25, 2022

How to Become a CRM Developer for Microsoft Dynamics 365 Online

The demand for Microsoft Dynamics 365 Online developers continues to grow as more organizations adopt cloud-based CRM solutions. This comprehensive guide will help you navigate your journey to becoming a successful Dynamics 365 developer.

Essential Programming Foundation

Start by mastering core programming concepts and languages:

Dynamics 365 Expertise

Develop specialized knowledge in:

  1. Core CRM concepts
  2. Dynamics 365 platform architecture
  3. Power Platform capabilities
  4. Common Data Service (Dataverse)
  5. Business process automation

Resources for Dynamics 365:

Practical Experience

Gain hands-on experience through:

  1. Setting up a free trial environment
  2. Building sample applications
  3. Contributing to open-source projects
  4. Participating in hackathons
  5. Taking on freelance projects

Professional Development

Enhance your career prospects by:

  1. Earning Microsoft certifications:
    • Microsoft Certified: Dynamics 365 Developer Associate
    • Power Platform Developer Associate
  2. Joining professional communities:
  3. Following industry resources:

Setting Up Your Development Environment

Get started with a trial version:

  1. Visit dynamics.microsoft.com
  2. Click "Try it now"
  3. Choose "Try Dynamics 365 for free"
  4. Complete registration with Microsoft account
  5. Access development tools and resources

Personal Experience Building a CRM Solution

Here's my journey developing a custom CRM solution for a real estate agency:

The project involved creating a property management module within Dynamics 365. I started by analyzing the client's requirements and designing custom entities for properties, listings, and transactions. Using C#, I developed custom plugins for automated workflow triggers when properties changed status.

Key challenges included:

  • Integrating with third-party property listing APIs
  • Implementing complex business rules for commission calculations
  • Building a custom Power BI dashboard for sales analytics

This experience taught me the importance of understanding both technical aspects and business processes in CRM development.

Stay Current

The Dynamics 365 ecosystem evolves rapidly. Stay updated through:

  1. Microsoft Release Plans
  2. Technical documentation updates
  3. Community events and webinars
  4. Industry conferences
  5. Online training platforms

Remember that becoming a successful Dynamics 365 developer requires continuous learning and practical application of skills. Start with small projects and gradually take on more complex challenges as you build your expertise.

Non-Technical Skills for CRM Developers

While technical expertise is crucial for a Microsoft Dynamics 365 developer, non-technical skills are equally important for long-term success. These skills enable developers to collaborate effectively, understand business needs, and deliver solutions that drive value.

1. Business Analysis Skills

Understanding the business processes and objectives of clients is key to building effective CRM solutions.

  • Learn to gather and analyze requirements.

  • Develop process flow diagrams.

  • Understand business workflows and automation needs.

  • Recommended resource: Business Analysis Fundamentals on Udemy (https://www.udemy.com/)

2. Problem-Solving Mindset

Every CRM project comes with unique challenges.

  • Develop critical thinking skills.

  • Learn to troubleshoot complex issues.

  • Approach problems systematically.

3. Communication Skills

Clear communication bridges the gap between technical teams and stakeholders.

  • Practice active listening.

  • Learn to explain technical concepts to non-technical audiences.

  • Improve documentation skills for requirements and technical designs.

4. Project Management Basics

Familiarity with project management methodologies ensures smooth project delivery.

  • Understand Agile and Scrum methodologies.

  • Learn to use tools like Jira, Trello, or Microsoft Project.

  • Recommended resource: Agile Fundamentals on Pluralsight (https://www.pluralsight.com/)

5. Time Management and Organization

CRM projects often involve multiple tasks and deadlines.

  • Prioritize tasks effectively.

  • Use tools like Microsoft To-Do or Asana for task management.

  • Set realistic timelines and track progress.

6. Customer Focus

Understanding end-users' needs helps in building user-friendly solutions.

  • Develop empathy for user challenges.

  • Gather feedback through user testing.

  • Prioritize customer satisfaction.

7. Adaptability and Continuous Learning

The tech landscape evolves quickly.

  • Stay open to learning new tools and updates.

  • Adapt to changing project requirements.

  • Attend webinars, training sessions, and conferences.

Becoming a Microsoft Power Platform Developer

The Microsoft Power Platform is a suite of low-code tools that enables the rapid development of custom business applications, automation of workflows, and insightful data analysis. As a CRM developer, proficiency in the Power Platform is invaluable for creating integrated and efficient solutions.

Understanding the Power Platform

The Power Platform comprises several key components:

  • Power Apps: Develop custom applications with minimal coding.

  • Power Automate: Automate workflows and business processes.

  • Power BI: Analyze data and create interactive reports.

  • Power Pages: Build low-code, responsive websites.

These tools are built on Microsoft Dataverse, providing a unified data platform for seamless integration.

Steps to Become a Power Platform Developer

  1. Learn the Fundamentals:

    • Microsoft Learn: Offers comprehensive modules on Power Platform basics.

    • Introduction to Microsoft Power Platform for Developers: Provides an overview tailored for developers.

  2. Set Up a Developer Environment:

    • Power Platform Developer Plan: Access free development environments to build and test solutions.

    • How-To Guide: Instructions on creating a developer environment.

  3. Master Dataverse:

    • Dataverse Developer Guide: Learn about the underlying data platform for Power Apps.
  4. Explore Fusion Development:

    • Fusion Development: Combines low-code tools with traditional coding for enhanced solutions.

    • Fusion Development eBook: In-depth resource on fusion development practices.

  5. Enhance Application Lifecycle Management (ALM) Skills:

    • Power Platform ALM Basics: Understand the essentials of managing application lifecycles.

    • Power Platform CLI: Command-line interface for efficient development and deployment.

  6. Stay Updated with Official Documentation:

    • Power Platform Developer Documentation: Regularly updated resources and guides.

Additional Resources

  • Training Modules: Interactive learning paths for hands-on experience.

  • Community Forums: Engage with other developers to share knowledge and solutions.

By following these steps and utilizing the available resources, you can develop the skills necessary to become a proficient Microsoft Power Platform developer, enhancing your ability to create robust CRM solutions.

For a visual overview and additional insights, you might find the following video helpful:

Final Thoughts

A successful Dynamics 365 developer combines technical proficiency with strong interpersonal and analytical skills. By developing these non-technical competencies, you will not only build better CRM solutions but also foster stronger relationships with clients and team members.

Security Features in Microsoft Dynamics 365 (CRM) Online

Microsoft Dynamics 365 (CRM) Online is a cloud-based customer relationship management platform that helps businesses manage their sales, marketing, and customer service activities. To ensure the security of the platform and the data stored on it, Dynamics 365 (CRM) Online offers a variety of security features.


1. Encryption: Dynamics 365 (CRM) Online uses SQL Transparent Data Encryption (TDE) to encrypt and decrypt data and log files in real time, helping to protect customer databases at rest. As of December 2017, Microsoft recommends securing the encryption keys used for TDE on the Azure Secure Vault (HSM). This allows you to generate and manage your own encryption keys, and upload them to an Azure Key Vault controlled by Microsoft.

2. Multi-Factor Authentication (MFA) or Two-Factor Authentication (2FA): MFA or 2FA is a security measure that requires an additional method of verifying your identity, such as a one-time code sent to your phone or a security app, in addition to your password. Dynamics 365 (CRM) Online includes basic MFA, but you may need to purchase Azure AD Premium licenses for additional MFA options.

3. Pen testing: Microsoft conducts server-level penetration testing to ensure the security of Dynamics 365 (CRM) Online. These tests are designed to identify and exploit vulnerabilities in the system, and the results are used to improve the security of the platform.

4. Data center security: Dynamics 365 (CRM) Online is hosted on Microsoft Azure, which has a number of security measures in place to protect the data centers that host the platform. These measures include physical security, network security, and data protection. Azure also undergoes regular security audits and assessments to ensure that it meets industry standards and regulations.

5. Compliance: Dynamics 365 (CRM) Online meets a number of industry and government standards and regulations, including GDPR, HIPAA, and ISO 27001. This helps to ensure that the platform is secure and compliant with relevant laws and regulations.

6. Data backup and recovery: Dynamics 365 (CRM) Online includes data backup and recovery capabilities to help protect against data loss. In the event of a data loss or disaster, you can restore your data from a backup to minimize the impact on your business.

7. Access control: Dynamics 365 (CRM) Online includes access control features to help you manage who has access to your data and what they can do with it. This includes role-based security, which allows you to assign different levels of access to different users or groups, and data visibility controls, which allow you to specify which data is visible to which users.

8. Activity logging: Dynamics 365 (CRM) Online includes activity logging to help you track changes to your data and identify any potential security issues. You can view the logs to see who made changes to your data and when, and use this information to help detect and prevent security breaches.

9. Security updates: It is important to keep your Dynamics 365 (CRM) Online instance and any associated apps up to date with the latest security updates to protect against vulnerabilities and threats. Microsoft regularly releases security updates for Dynamics 365 (CRM) Online to help protect against new threats and vulnerabilities.

For more information on the security of Microsoft Dynamics 365 (CRM) Online, visit the following links:

Migrate Dynamics CRM 365 Online to Dynamics CRM 365 On-Premise — Summary

Migrating from Dynamics CRM 365 Online to Dynamics CRM 365 On-Premise can be a complex process, but it is often necessary for organizations that need to access data offline or comply with certain regulations. The migration process involves transferring data, configurations, and customizations from the cloud-based version to the on-premise version, which is installed and run on a local server.

The first step in the migration process is to prepare the on-premise environment by installing and configuring the Dynamics CRM server, setting up Active Directory, and preparing the SQL Server database. Next, data must be exported from the online version of Dynamics CRM using the Dynamics CRM Data Migration Manager. This tool allows users to select the data they want to export and specify a location for the exported files.

Once the data has been exported, it can be imported into the on-premise version of Dynamics CRM using the Import Data Wizard. This tool guides users through the process of mapping the data from the exported files to the appropriate fields in the on-premise version.

After the migration is complete, it is important to test the migrated data to ensure that it has been transferred correctly and that the on-premise version of Dynamics CRM is functioning properly. By following the steps outlined in this blog post and carefully planning and executing the migration process, organizations can successfully migrate from Dynamics CRM 365 Online to Dynamics CRM 365 On-Premise.

chamara iresh's Blog: Migrate Dynamics CRM 365 Online to Dynamics CRM 365 On-Premise

Migrate Dynamics Dynamics CRM 365 On-Premise to CRM 365 Online - Summary

 There are several key differences between Dynamics 365 on-premises and Dynamics 365 online that organizations should consider when deciding which option is best for their needs. Some of the main differences include:


1. Deployment: Dynamics 365 on-premises is installed on an organization's own servers, while Dynamics 365 online is hosted in the cloud.


2. Maintenance and upgrades: With Dynamics 365 on-premises, organizations are responsible for managing and maintaining the system, including installing updates and patches. With Dynamics 365 online, Microsoft handles these tasks.


3. Scalability and performance: Dynamics 365 online is built on Azure, a cloud platform with a global network of data centers, which allows for better scalability and performance compared to on-premises systems.


4. Customization: With Dynamics 365 on-premises, organizations have more flexibility to customize the system to meet their specific needs. However, this customization can also increase the complexity and maintenance required for the system. Dynamics 365 online is more limited in terms of customization, but this can also make it easier to maintain and use.


5. Integration: Dynamics 365 online offers integration with other Microsoft cloud services such as Office 365 and Azure, which can be beneficial for organizations already using these services. Dynamics 365 on-premises can also be integrated with other systems, but this requires additional effort and resources.


6. Cost: The cost of Dynamics 365 on-premises depends on the number of users and the amount of customization required. In general, Dynamics 365 online is likely to be more cost-effective, especially for organizations with a large number of users.


When deciding whether to migrate to Dynamics 365 online, organizations should carefully consider their specific needs and requirements, including the level of customization required, the complexity of the system, and the resources available for maintenance and support. It may be helpful to consult with a Dynamics 365 partner or consultant to determine the best solution for your organization.


Refer below link for details information: 

chamara iresh's Blog: Migrate Dynamics Dynamics CRM 365 On-Premise to CRM 365 Online

Friday, December 2, 2022

Unit Testing with FakeXrmEasy

Making Unit Testing Easy with FakeXrmEasy

Hey there! Let's talk about making your Dataverse testing life easier with FakeXrmEasy. If you've been wrestling with unit tests for your Dynamics 365/Dataverse projects, you're in for a treat.

Why You'll Love FakeXrmEasy

Think of FakeXrmEasy as your personal Dataverse simulator. Instead of mocking every single service call (we've all been there, it's not fun), FakeXrmEasy gives you an in-memory database that just works. No more endless mocking – just write your tests and go!

Key Features

  1. Complete simulation of Dataverse backend with in-memory database
  2. Support for all query types:
    • FetchXML
    • QueryExpress
    • QueryByAttribute
    • CRM LINQ provider
  3. Compatible with major test runners (xUnit, MSTest, NUnit)

Real-World Testing Example

Let's look at a practical example. Say you're updating contact records:

public class ContactTests : FakeXrmEasyTestsBase { private readonly Contact _contact; public ContactTests() { // Create a test contact - just like you would in real life _contact = new Contact { Id = Guid.NewGuid(), FirstName = "John", LastName = "Smith", EmailAddress1 = "john.smith@email.com" }; } [Fact] public async Task Can_Update_Contact_Name_And_Email() { // Start with our test contact context.Initialize(_contact); // Let's update John's details var command = new UpdateContactCommand(service) { ContactId = _contact.Id, FirstName = "Jonathan", EmailAddress1 = "jonathan.smith@email.com" }; await command.ExecuteAsync(); // Did it work? Let's check! var updatedContact = context.CreateQuery<Contact>() .Where(c => c.Id == _contact.Id) .FirstOrDefault(); Assert.Equal("Jonathan", updatedContact.FirstName); Assert.Equal("jonathan.smith@email.com", updatedContact.EmailAddress1); } }

Here's the command that makes it happen:

public class UpdateContactCommand { private readonly IOrganizationService _service; public Guid ContactId { get; set; } public string FirstName { get; set; } public string EmailAddress1 { get; set; } public UpdateContactCommand(IOrganizationService service) { _service = service ?? throw new ArgumentNullException(nameof(service)); } public async Task ExecuteAsync() { var contact = new Contact { Id = ContactId, FirstName = FirstName, EmailAddress1 = EmailAddress1 }; await _service.UpdateAsync(contact); } }

Quick Tips for Better Tests

  1. Keep it simple - test one thing at a time
  2. Only set up the data you need
  3. Give your tests clear, descriptive names
  4. Check the results right after your operation

Testing Queries Made Easy

Here's how you might test a query to find active contacts:


[Fact] public void Find_Active_Contacts() { // Set up some test contacts var contacts = new List<Contact> { new Contact { Id = Guid.NewGuid(), FirstName = "Active", StateCode = ContactState.Active }, new Contact { Id = Guid.NewGuid(), FirstName = "Inactive", StateCode = ContactState.Inactive } }; context.Initialize(contacts); // Find active contacts var activeContacts = context.CreateQuery<Contact>() .Where(c => c.StateCode == ContactState.Active) .ToList(); // Make sure we found the right one Assert.Single(activeContacts); Assert.Equal("Active", activeContacts[0].FirstName); }


Basic CRUD Testing

[Fact] public async Task Create_And_Update_Account_With_Related_Contacts() { // Setup test data var account = new Account { Id = Guid.NewGuid(), Name = "Test Corp" }; var contact = new Contact { Id = Guid.NewGuid(), FirstName = "John", LastName = "Doe", ParentCustomerId = account.ToEntityReference() }; context.Initialize(new Entity[] { account, contact }); // Test update logic var updateCmd = new UpdateAccountCommand(service) { AccountId = account.Id, NewName = "Test Corp International", Revenue = new Money(1000000) }; await updateCmd.ExecuteAsync(); // Verify results var updatedAccount = context.CreateQuery<Account>() .Include(a => a.Contact_Customer) // Related contacts .FirstOrDefault(a => a.Id == account.Id); Assert.Equal("Test Corp International", updatedAccount.Name); Assert.Equal(1000000, updatedAccount.Revenue.Value); }

Plugin Testing

public class AccountPostCreatePlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); var service = ((IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))) .CreateOrganizationService(context.UserId); var account = context.InputParameters["Target"] as Entity; // Create associated task var task = new Task { Subject = $"Review new account: {account.GetAttributeValue<string>("name")}", RegardingObjectId = account.ToEntityReference() }; service.Create(task); } } public void Plugin_Creates_Task_On_Account_Creation() { // Setup plugin context var plugin = new AccountPostCreatePlugin(); var account = new Account { Id = Guid.NewGuid(), Name = "New Account" }; // Setup execution context var pluginContext = context.GetDefaultPluginContext(); pluginContext.InputParameters = new ParameterCollection { { "Target", account } }; pluginContext.Stage = 40; // Post-operation // Execute plugin plugin.Execute(context.GetDefaultServiceProvider(pluginContext)); // Verify task creation var createdTask = context.CreateQuery<Task>() .FirstOrDefault(t => t.RegardingObjectId.Id == account.Id); Assert.NotNull(createdTask); Assert.Contains("Review new account", createdTask.Subject); }

Custom Action Testing


public class CloseOpportunityRequest : OrganizationRequest { public CloseOpportunityRequest() : base("new_CloseOpportunity") { } public Guid OpportunityId { get { return (Guid)Parameters["OpportunityId"]; } set { Parameters["OpportunityId"] = value; } } public int Status { get { return (int)Parameters["Status"]; } set { Parameters["Status"] = value; } } } [Fact] public void Test_Close_Opportunity_Action() { // Setup var opportunity = new Opportunity { Id = Guid.NewGuid(), Name = "Test Deal", StatusCode = new OptionSetValue(1) }; context.Initialize(opportunity); // Register custom action context.AddExecutionMock("new_CloseOpportunity", (req) => { var opportunityId = (Guid)req.Parameters["OpportunityId"]; var status = (int)req.Parameters["Status"]; // Update opportunity var opp = new Opportunity { Id = opportunityId, StateCode = new OptionSetValue(1), StatusCode = new OptionSetValue(status) }; context.GetOrganizationService().Update(opp); return new OrganizationResponse(); }); // Execute action var request = new CloseOpportunityRequest { OpportunityId = opportunity.Id, Status = 2 // Won }; context.GetOrganizationService().Execute(request); // Verify var updatedOpp = context.CreateQuery<Opportunity>() .FirstOrDefault(o => o.Id == opportunity.Id); Assert.Equal(2, updatedOpp.StatusCode.Value); }

Workflow Testing

public class CreateFollowUpTaskActivity : CodeActivity { [Input("Account")] [ReferenceTarget("account")] public InArgument<EntityReference> Account { get; set; } protected override void Execute(CodeActivityContext executionContext) { var workflowContext = executionContext.GetExtension<IWorkflowContext>(); var serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); var service = serviceFactory.CreateOrganizationService(workflowContext.UserId); var task = new Task { Subject = "Follow up with account", RegardingObjectId = Account.Get(executionContext) }; service.Create(task); } } [Fact] public void Workflow_Creates_Follow_Up_Task() { // Setup var account = new Account { Id = Guid.NewGuid(), Name = "Test Account" }; context.Initialize(account); // Setup workflow var workflow = new CreateFollowUpTaskActivity(); var workflowInvoker = new WorkflowInvoker(workflow); // Execute workflow var inputs = new Dictionary<string, object> { { "Account", account.ToEntityReference() } }; workflowInvoker.Invoke(inputs); // Verify var createdTask = context.CreateQuery<Task>() .FirstOrDefault(t => t.RegardingObjectId.Id == account.Id); Assert.NotNull(createdTask); Assert.Equal("Follow up with account", createdTask.Subject); }

Testing Complex Scenarios

Business Rules Testing

[Fact] public void Contact_Business_Rules_Test() { // Setup business rules context.EnableBusinessRules(); var contact = new Contact { Id = Guid.NewGuid(), EmailAddress1 = "invalid-email" }; // Should throw due to business rule violation Assert.Throws<InvalidPluginExecutionException>(() => context.GetOrganizationService().Create(contact)); }

Multi-Entity Operations


[Fact] public async Task Create_Account_With_Primary_Contact() { var data = new AccountWithContactCommand(service) { AccountName = "Enterprise Corp", ContactFirstName = "Jane", ContactLastName = "Smith", ContactEmail = "jane.smith@enterprise.com" }; var result = await data.ExecuteAsync(); // Verify account creation var account = context.CreateQuery<Account>() .FirstOrDefault(a => a.Id == result.AccountId); Assert.NotNull(account); // Verify contact creation and association var contact = context.CreateQuery<Contact>() .FirstOrDefault(c => c.Id == result.ContactId); Assert.NotNull(contact); Assert.Equal(account.Id, contact.ParentCustomerId.Id); }

Best Practices Summary

  1. Initialize minimal test data
  2. Test business logic isolation
  3. Use meaningful test names
  4. One assertion concept per test
  5. Mock external services when needed
  6. Handle async operations properly
  7. Test error scenarios

Common Pitfalls

  1. Not clearing context between tests
  2. Testing too many scenarios in one test
  3. Not handling plugin context properly
  4. Forgetting to register custom actions
  5. Not testing negative scenarios

Remember, FakeXrmEasy handles all the heavy lifting of simulating Dataverse. You just focus on writing clean, meaningful tests. No more mock setup headaches!



Sri Lanka .NET 
                Forum Member