Sample Workflow Acitivity C# code

 Sample Workflow Acitivity C# code

The following sample workflow activity returns the next birthday. Use this in a workflow that sends a birthday greeting to a customer.

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Workflow;
using System;
using System.Activities;

namespace PowerApps.Samples

{

  /// <summary>
  /// Activity will return the next upcoming birthday that has just passed
  /// If this year's birthday has not yet occurred, it will return this year's
  /// birthday
  /// Otherwise, it will return the birthday for next year
  /// A workflow can timeout when on this date
  /// </summary>

  [Persist]

  public sealed class UpdateNextBirthday : CodeActivity
  {
    protected override void Execute(CodeActivityContext executionContext)
    {
      IWorkflowContext context =
          executionContext.GetExtension<IWorkflowContext>();

      // Create an Organization Service

      IOrganizationServiceFactory serviceFactory =
          executionContext.GetExtension<IOrganizationServiceFactory>();

      IOrganizationService service =
          serviceFactory.CreateOrganizationService(context.InitiatingUserId);

      // Retrieve the contact id

      Guid contactId = this.Contact.Get(executionContext).Id;

      // Create the request

      RetrieveRequest request = new RetrieveRequest();

      request.ColumnSet = new ColumnSet(new string[]{"birthdate"});

      request.Target = new EntityReference(EntityName.Contact, contactId);

      // Retrieve the entity to determine what the birthdate is set at
      Entity entity =
          (Entity)((RetrieveResponse) service.Execute(request)).Entity;

      // Extract the date out of the entity
      DateTime? birthdate;

      if (entity.Contains(ContactAttributes.Birthdate))

      {
        birthdate = (DateTime?) entity[ContactAttributes.Birthdate];

      }

      else

      {
        birthdate = null;
      }

      // Check to see if the current birthday is set. We don't want the activity
      // to fail if the birthdate is not set

      if (birthdate == null)

      {
        return;
      }

      // Calculate the next birthdate. Encapsulated in a methdo so that the
      // method can be used in the test case for verification purposes

      DateTime nextBirthdate = CalculateNextBirthday(birthdate.Value);

      // Update the next birthday field on the entity

      Entity updateEntity = new Entity(EntityName.Contact);

      updateEntity.Id = contactId;

      updateEntity["new_nextbirthday"] = nextBirthdate;

      service.Update(updateEntity);
    }

    // Define the properties

    [RequiredArgument]

    [Input("Update Next Birthdate for")]

    [ReferenceTarget("contact")]

    public InArgument<EntityReference> Contact {
      get;
      set;
    }

    private DateTime CalculateNextBirthday(DateTime birthdate)

    {
      DateTime nextBirthday =
          new DateTime(birthdate.Year, birthdate.Month, birthdate.Day);

      // Check to see if this birthday occurred on a leap year

      bool leapYearAdjust = false;

      if (nextBirthday.Month == 2 && nextBirthday.Day == 29)

      {
        // Sanity check, was that year a leap year

        if (DateTime.IsLeapYear(nextBirthday.Year))

        {
          // Check to see if the current year is a leap year

          if (!DateTime.IsLeapYear(DateTime.Now.Year))

          {
            // Push the date to March 1st so that the date arithmetic will
            // function correctly

            nextBirthday = nextBirthday.AddDays(1);

            leapYearAdjust = true;
          }

        }

        else

        {
          throw new Exception("Invalid Birthdate specified",
                              new ArgumentException("Birthdate"));
        }
      }

      // Calculate the year difference

      nextBirthday =
          nextBirthday.AddYears(DateTime.Now.Year - nextBirthday.Year);

      // Check to see if the date was adjusted

      if (leapYearAdjust && DateTime.IsLeapYear(nextBirthday.Year))

      {
        nextBirthday = nextBirthday.AddDays(-1);
      }

      return nextBirthday;
    }
  }

}

No comments:

Post a Comment