Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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
        }