protected override void Execute(CodeActivityContext context) { // Construct the Local plug-in context. LocalWorkflowContext localcontext = new LocalWorkflowContext(context); localcontext.Trace("started execution"); #region "Load CRM Service from context" objCommon = new SCII.Helper(context); localcontext.Trace("CreateContact activity:Load CRM Service from context --- OK"); #endregion #region "Create Execution" try { string jsonPayload = this.request.Get(context); SCII.UpdateContactRequest contactPayload = JsonConvert.DeserializeObject <SCII.UpdateContactRequest>(jsonPayload); Boolean duplicateRecordExist = false; Entity contact; var ValidationContext = new ValidationContext(contactPayload, serviceProvider: null, items: null); ICollection <ValidationResult> ValidationResults = null; var isValid = objCommon.Validate(contactPayload, out ValidationResults); localcontext.Trace("just after validation"); if (isValid) { if (_errorMessage == string.Empty) { //search contact record based on key named B2COBJECTID OrganizationServiceContext orgSvcContext = new OrganizationServiceContext(objCommon.service); var ContactWithUPN = from c in orgSvcContext.CreateQuery(SCS.Contact.ENTITY) where ((Guid)c["contactid"]).Equals((contactPayload.contactid)) select new { ContactId = c.Id, UniqueReference = c[SCS.Contact.UNIQUEREFERENCE] }; var contactRecordWithUPN = ContactWithUPN.FirstOrDefault() == null ? null : ContactWithUPN.FirstOrDefault(); if (contactRecordWithUPN != null) { _contactId = contactRecordWithUPN.ContactId; _uniqueReference = contactRecordWithUPN.UniqueReference.ToString(); //Search contact record based on key named emailaddress to prevent duplicates localcontext.Trace("before checking for data fields"); if (!string.IsNullOrEmpty(contactPayload.updates.email)) { localcontext.Trace("searching for contact ignoring current record"); //compare with record ignoring current record var ContactWithEmail = from c in orgSvcContext.CreateQuery(SCS.Contact.ENTITY) where ((string)c[SCS.Contact.EMAILADDRESS1]) == contactPayload.updates.email.Trim() && (string)c[SCS.Contact.UNIQUEREFERENCE] != _uniqueReference select new { ContactId = c.Id, UniqueReference = c[SCS.Contact.UNIQUEREFERENCE] }; var contactRecordWithEmail = ContactWithEmail.FirstOrDefault() == null ? null : ContactWithEmail.FirstOrDefault(); duplicateRecordExist = contactRecordWithEmail == null ? false : true; localcontext.Trace("duplicate check: " + duplicateRecordExist); } if (!duplicateRecordExist) { contact = new Entity(SCS.Contact.ENTITY, _contactId); localcontext.Trace("update activity:ContactRecordGuidWithUPN is empty started, update ReqContact.."); #region Cannot be cleared //Flag to check if the clearing of data is required for the selected OrganisationRequest fields if (contactPayload.updates.firstname != null) { contact[SCS.Contact.FIRSTNAME] = contactPayload.updates.firstname; } if (contactPayload.updates.lastname != null) { contact[SCS.Contact.LASTNAME] = contactPayload.updates.lastname; } if (contactPayload.updates.email != null) { contact[SCS.Contact.EMAILADDRESS1] = contactPayload.updates.email; } if (contactPayload.updates.tacsacceptedversion != null) { contact[SCS.Contact.TACSACCEPTEDVERSION] = contactPayload.updates.tacsacceptedversion; } if (!string.IsNullOrEmpty(contactPayload.updates.tacsacceptedon) && !string.IsNullOrWhiteSpace(contactPayload.updates.tacsacceptedon)) { localcontext.Trace("date accepted on in string" + contactPayload.updates.tacsacceptedon); DateTime resultDate; if (DateTime.TryParse(contactPayload.updates.tacsacceptedon, out resultDate)) { localcontext.Trace("date accepted on in dateformat" + resultDate); contact[SCS.Contact.TACSACCEPTEDON] = (resultDate); } } #endregion #region These fields can be cleared bool clearRequired = contactPayload.clearlist != null && contactPayload.clearlist.fields != null && contactPayload.clearlist.fields.Length > 0; localcontext.Trace(String.Format("printing clear required value: {0}", clearRequired)); localcontext.Trace(String.Format("title value: {0}", contactPayload.updates.title.HasValue)); if (clearRequired && contactPayload.clearlist.fields.Contains(SCII.ContactClearFields.title)) { contact[SCS.Contact.TITLE] = null; } else if (contactPayload.updates.title.HasValue && !String.IsNullOrEmpty(Enum.GetName(typeof(SCSE.defra_Title), contactPayload.updates.title))) { contact[SCS.Contact.TITLE] = new OptionSetValue(contactPayload.updates.title.Value); localcontext.Trace("assigning title"); } localcontext.Trace("setting contact date params:started.."); if (clearRequired && contactPayload.clearlist.fields.Contains(SCII.ContactClearFields.middlename)) { contact[SCS.Contact.MIDDLENAME] = null; } else if (contactPayload.updates.middlename != null) { contact[SCS.Contact.MIDDLENAME] = contactPayload.updates.middlename; } if (clearRequired && contactPayload.clearlist.fields.Contains(SCII.ContactClearFields.telephone1)) { contact[SCS.Contact.TELEPHONE1] = null; } else if (contactPayload.updates.telephone != null) { contact[SCS.Contact.TELEPHONE1] = contactPayload.updates.telephone; } //set birthdate if (clearRequired && contactPayload.clearlist.fields.Contains(SCII.ContactClearFields.dob)) { contact[SCS.Contact.GENDERCODE] = null; } else if (!string.IsNullOrEmpty(contactPayload.updates.dob) && !string.IsNullOrWhiteSpace(contactPayload.updates.dob)) { DateTime resultDob; if (DateTime.TryParse(contactPayload.updates.dob, out resultDob)) { contact[SCS.Contact.BIRTHDATE] = resultDob; } } if (clearRequired && contactPayload.clearlist.fields.Contains(SCII.ContactClearFields.dob)) { contact[SCS.Contact.GENDERCODE] = null; } else if (contactPayload.updates.gender.HasValue && !String.IsNullOrEmpty(Enum.GetName(typeof(SCSE.Contact_GenderCode), contactPayload.updates.gender))) { //Check whether the gendercode is found in GenderEnum mapping if (Enum.IsDefined(typeof(SCII.ContactGenderCodes), contactPayload.updates.gender)) { //Check whether gendercode is found in Dynamics GenderEnum mapping string genderCode = Enum.GetName(typeof(SCSE.Contact_GenderCode), contactPayload.updates.gender); { SCSE.Contact_GenderCode dynamicsGenderCode = (SCSE.Contact_GenderCode)Enum.Parse(typeof(SCSE.Contact_GenderCode), genderCode); contact[SCS.Contact.GENDERCODE] = new OptionSetValue((int)dynamicsGenderCode); } } #endregion } localcontext.Trace("contactid: " + _contactId); objCommon.service.Update(contact); if (contactPayload.updates.email != null) { localcontext.Trace("before memail upsert"); objCommon.UpsertContactDetails((int)SCII.EmailTypes.PrincipalEmailAddress, contactPayload.updates.email, new EntityReference(D365.Common.schema.Contact.ENTITY, _contactId), true, false); localcontext.Trace("after email upsert"); } //if phone is in clear list then deactivate the contact details record of principalphonenumber if (clearRequired && contactPayload.clearlist.fields.Contains(SCII.ContactClearFields.telephone1)) { localcontext.Trace("clear telephone1"); objCommon.UpsertContactDetails((int)SCII.PhoneTypes.PrincipalPhoneNumber, contactPayload.updates.telephone, new EntityReference(D365.Common.schema.Contact.ENTITY, _contactId), false, true); localcontext.Trace("after clear telephone1"); } else if (contactPayload.updates.telephone != null) { localcontext.Trace("before telephone1 update"); objCommon.UpsertContactDetails((int)SCII.PhoneTypes.PrincipalPhoneNumber, contactPayload.updates.telephone, new EntityReference(D365.Common.schema.Contact.ENTITY, _contactId), true, false); localcontext.Trace("after telephone1 update"); } _errorCode = 200;//Success localcontext.Trace("CreateContact activity:ended. " + _contactId.ToString()); } else { localcontext.Trace("CreateContact activity:ContactRecordGuidWithB2C/Email is found/duplicate."); _errorCode = 412;//Duplicate UPN _errorMessage = "Duplicate Record"; } } else { { localcontext.Trace("record does not exists"); _errorCode = 404;//record does not exists _errorMessage = "record does not exists."; } } } } else { localcontext.Trace("inside validation result"); StringBuilder ErrorMessage = new StringBuilder(); //this will throw an error foreach (ValidationResult vr in ValidationResults) { ErrorMessage.Append(vr.ErrorMessage + " "); } //if (contactPayload.updates.address != null) // foreach (ValidationResult vr in ValidationResultsAddress) // { // ErrorMessage.Append(vr.ErrorMessage + " "); // } _errorCode = 400; _errorMessage = ErrorMessage.ToString(); } localcontext.Trace("CreateContact activity:setting output params like error code etc.. started"); localcontext.Trace("CreateContact activity:setting output params like error code etc.. ended"); } catch (Exception ex) { _errorCode = 500;//Internal Error _errorMessage = "Error occured while processing request"; _errorMessageDetail = ex.Message; localcontext.Trace(ex.Message); //throw ex; } finally { localcontext.Trace("finally block start"); SCIIR.ContactResponse responsePayload = new SCIIR.ContactResponse() { code = _errorCode, message = _errorMessage, datetime = DateTime.UtcNow, version = "1.0.0.2", program = "UpdateContact", status = _errorCode == 200 || _errorCode == 412 ? "success" : "failure", data = new SCIIR.ContactData() { contactid = _contactId == Guid.Empty ? null : _contactId.ToString(), uniquereference = _uniqueReference == string.Empty ? null : _uniqueReference, error = new SCIIR.ResponseErrorBase() { details = _errorMessageDetail == string.Empty ? _errorMessage : _errorMessageDetail } } }; string resPayload = JsonConvert.SerializeObject(responsePayload); response.Set(context, resPayload); localcontext.Trace("finally block end"); } #endregion ExecuteCRMWorkFlowActivity(context, localcontext); }
public override void ExecuteCRMWorkFlowActivity(CodeActivityContext executionContext, LocalWorkflowContext crmWorkflowContext) { #region Local Properties SCII.Helper objCommon; //EntityReference _Contact; int _errorCode = 400; //Bad Request string _errorMessage = string.Empty; string _errorMessageDetail = string.Empty; Guid _contactId = Guid.Empty; string _uniqueReference = string.Empty; #endregion #region "Create Execution" objCommon = new SCII.Helper(executionContext); try { objCommon.tracingService.Trace("CreateContact activity:Load CRM Service from context --- OK"); string jsonPayload = Payload.Get(executionContext); SCII.ContactRequest contactPayload = JsonConvert.DeserializeObject <SCII.ContactRequest>(jsonPayload); Entity contact = new Entity(SCS.Contact.ENTITY);//,"defra_upn", _UPN); _errorMessage = FieldValidation(contactPayload); var ValidationContext = new ValidationContext(contactPayload, serviceProvider: null, items: null); ICollection <ValidationResult> ValidationResults = null; ICollection <ValidationResult> ValidationResultsAddress = null; var isValid = objCommon.Validate(contactPayload, out ValidationResults); Boolean isValidAddress = contactPayload.address == null ? true : objCommon.Validate(contactPayload.address, out ValidationResultsAddress); objCommon.tracingService.Trace("just after validation"); if (isValid && isValidAddress) { if (_errorMessage == string.Empty) { //search contact record based on key named B2COBJECTID to prevent duplicate contact OrganizationServiceContext orgSvcContext = new OrganizationServiceContext(objCommon.service); var ContactWithUPN = from c in orgSvcContext.CreateQuery(SCS.Contact.ENTITY) where ((string)c[SCS.Contact.B2COBJECTID]).Equals((contactPayload.b2cobjectid.Trim())) select new { ContactId = c.Id, UniqueReference = c[SCS.Contact.UNIQUEREFERENCE] }; var contactRecordWithUPN = ContactWithUPN.FirstOrDefault() == null ? null : ContactWithUPN.FirstOrDefault(); if (contactRecordWithUPN != null) { _contactId = contactRecordWithUPN.ContactId; _uniqueReference = contactRecordWithUPN.UniqueReference.ToString(); } //Search contact record based on key named emailaddress to prevent duplicates if (!string.IsNullOrEmpty(contactPayload.email)) { var ContactWithEmail = from c in orgSvcContext.CreateQuery(SCS.Contact.ENTITY) where ((string)c[SCS.Contact.EMAILADDRESS1]).Equals((contactPayload.email.Trim())) select new { ContactId = c.Id, UniqueReference = c[SCS.Contact.UNIQUEREFERENCE] }; var contactRecordWithEmail = ContactWithEmail.FirstOrDefault() == null ? null : ContactWithEmail.FirstOrDefault(); if (contactRecordWithEmail != null) { _contactId = contactRecordWithEmail.ContactId; _uniqueReference = contactRecordWithEmail.UniqueReference.ToString(); } } if (_contactId == Guid.Empty) { objCommon.tracingService.Trace("CreateContact activity:ContactRecordGuidWithUPN is empty started, Creating ReqContact.."); if (contactPayload.title != null) { contact[SCS.Contact.TITLE] = new OptionSetValue((int)contactPayload.title); } if (contactPayload.firstname != null) { contact[SCS.Contact.FIRSTNAME] = contactPayload.firstname; } if (contactPayload.lastname != null) { contact[SCS.Contact.LASTNAME] = contactPayload.lastname; } if (contactPayload.middlename != null) { contact[SCS.Contact.MIDDLENAME] = contactPayload.middlename; } if (contactPayload.email != null) { contact[SCS.Contact.EMAILADDRESS1] = contactPayload.email; } if (contactPayload.b2cobjectid != null) { contact[SCS.Contact.B2COBJECTID] = contactPayload.b2cobjectid; } if (contactPayload.tacsacceptedversion != null) { contact[SCS.Contact.TACSACCEPTEDVERSION] = contactPayload.tacsacceptedversion; } if (contactPayload.telephone != null) { contact[SCS.Contact.TELEPHONE1] = contactPayload.telephone; } objCommon.tracingService.Trace("setting contact date params:started.."); //set tcsaccepteddate if (!string.IsNullOrEmpty(contactPayload.tacsacceptedon) && !string.IsNullOrWhiteSpace(contactPayload.tacsacceptedon)) { objCommon.tracingService.Trace("date accepted on in string" + contactPayload.tacsacceptedon); DateTime resultDate; if (DateTime.TryParseExact(contactPayload.tacsacceptedon, "dd/MM/yyyy HH:mm tt", new CultureInfo("en-Uk"), DateTimeStyles.None, out resultDate)) { objCommon.tracingService.Trace("date accepted on in dateformat" + resultDate); contact[SCS.Contact.TACSACCEPTEDON] = (resultDate); } } //else if (contactPayload.tacsacceptedversion != null) //{ // contact[SCS.Contact.TACSACCEPTEDON] = DateTime.Now; //} //set birthdate if (!string.IsNullOrEmpty(contactPayload.dob) && !string.IsNullOrWhiteSpace(contactPayload.dob)) { DateTime resultDob; if (DateTime.TryParseExact(contactPayload.dob, "dd/MM/yyyy", new CultureInfo("en-Uk"), DateTimeStyles.None, out resultDob)) { contact[SCS.Contact.BIRTHDATE] = resultDob; } } if (contactPayload.gender != null) { contact[SCS.Contact.GENDERCODE] = new OptionSetValue((int)contactPayload.gender); } objCommon.tracingService.Trace("CreateContact activity:started.."); _contactId = objCommon.service.Create(contact); //create contactdetail record for primary contact details if (contactPayload.email != null) { objCommon.UpsertContactDetails((int)SCII.EmailTypes.PrincipalEmailAddress, contactPayload.email, new EntityReference(D365.Common.schema.Contact.ENTITY, _contactId), false, false); } if (contactPayload.telephone != null) { objCommon.UpsertContactDetails((int)SCII.PhoneTypes.PrincipalPhoneNumber, contactPayload.telephone, new EntityReference(D365.Common.schema.Contact.ENTITY, _contactId), false, false); } Entity contactRecord = objCommon.service.Retrieve(SCS.Contact.ENTITY, _contactId, new Microsoft.Xrm.Sdk.Query.ColumnSet(true));//Defra.CustMaster.D365.Common.schema.ReqContact.UNIQUEREFERENCE)); objCommon.tracingService.Trace((string)contactRecord[SCS.Contact.UNIQUEREFERENCE]); _uniqueReference = (string)contactRecord[SCS.Contact.UNIQUEREFERENCE]; _errorCode = 200;//Success objCommon.tracingService.Trace("CreateContact activity:ended. " + _contactId.ToString()); //create contact address and contact details if (contactPayload.address != null) { objCommon.CreateAddress(contactPayload.address, new EntityReference(D365.Common.schema.Contact.ENTITY, _contactId)); } } else { objCommon.tracingService.Trace("CreateContact activity:ContactRecordGuidWithB2C/Email is found/duplicate."); _errorCode = 412;//Duplicate UPN _errorMessage = "Duplicate Record"; } } } else { objCommon.tracingService.Trace("inside validation result"); StringBuilder ErrorMessage = new StringBuilder(); //this will throw an error foreach (ValidationResult vr in ValidationResults) { ErrorMessage.Append(vr.ErrorMessage + " "); } if (contactPayload.address != null) { foreach (ValidationResult vr in ValidationResultsAddress) { ErrorMessage.Append(vr.ErrorMessage + " "); } } _errorCode = 400; _errorMessage = ErrorMessage.ToString(); } objCommon.tracingService.Trace("CreateContact activity:setting output params like error code etc.. started"); objCommon.tracingService.Trace("CreateContact activity:setting output params like error code etc.. ended"); } catch (Exception ex) { _errorCode = 500;//Internal Error _errorMessage = "Error occured while processing request"; _errorMessageDetail = ex.Message; objCommon.tracingService.Trace(ex.Message); //throw ex; } finally { objCommon.tracingService.Trace("finally block start"); SCIIR.ContactResponse responsePayload = new SCIIR.ContactResponse() { code = _errorCode, message = _errorMessage, datetime = DateTime.UtcNow, version = "1.0.0.2", program = "CreateContact", status = _errorCode == 200 || _errorCode == 412 ? "success" : "failure", data = new SCIIR.ContactData() { contactid = _contactId == Guid.Empty ? null : _contactId.ToString(), uniquereference = _uniqueReference == string.Empty ? null : _uniqueReference, error = new SCIIR.ResponseErrorBase() { details = _errorMessageDetail == string.Empty ? _errorMessage : _errorMessageDetail } } }; string resPayload = JsonConvert.SerializeObject(responsePayload); Response.Set(executionContext, resPayload); objCommon.tracingService.Trace("finally block end"); } #endregion }