public async Task <ActionResult <RegistrationResult> > Create(AnonymousRegistration registration) { if (registration == null) { return(BadRequest()); } var referenceNumber = await registrationManager.CreateRegistrationAnonymous(registration); return(CreatedAtAction(nameof(Create), new RegistrationResult { ReferenceNumber = referenceNumber })); }
public async Task <string> CreateRegistrationAnonymous(AnonymousRegistration registration) { var now = DateTimeOffset.Now; #pragma warning disable CA5394 // Do not use insecure randomness var essFileNumber = new Random().Next(999999999); //temporary ESS file number random generator #pragma warning restore CA5394 // Do not use insecure randomness // evacuation file var file = new era_evacuationfile { era_evacuationfileid = Guid.NewGuid(), era_essfilenumber = essFileNumber, era_evacuationfiledate = now, era_addressline1 = registration.PreliminaryNeedsAssessment.EvacuatedFromAddress.AddressLine1, era_addressline2 = registration.PreliminaryNeedsAssessment.EvacuatedFromAddress.AddressLine2, era_city = registration.PreliminaryNeedsAssessment.EvacuatedFromAddress.AddressLine1, era_Jurisdiction = Lookup(registration.PreliminaryNeedsAssessment.EvacuatedFromAddress.Jurisdiction), era_province = registration.PreliminaryNeedsAssessment.EvacuatedFromAddress.StateProvince.StateProvinceCode, era_country = registration.PreliminaryNeedsAssessment.EvacuatedFromAddress.Country.CountryCode, era_collectionandauthorization = registration.RegistrationDetails.InformationCollectionConsent, era_sharingrestriction = registration.RegistrationDetails.RestrictedAccess, era_phonenumberrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Phone), era_emailrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Email), era_secrettext = registration.RegistrationDetails.SecretPhrase, }; // registrant var registrant = new contact { contactid = Guid.NewGuid(), era_registranttype = 174360000, era_authenticated = false, era_verified = false, era_registrationdate = now, firstname = registration.RegistrationDetails.PersonalDetails.FirstName, lastname = registration.RegistrationDetails.PersonalDetails.LastName, era_preferredname = registration.RegistrationDetails.PersonalDetails.PreferredName, era_initial = registration.RegistrationDetails.PersonalDetails.Initials, gendercode = LookupGender(registration.RegistrationDetails.PersonalDetails.Gender), birthdate = FromDateTime(DateTime.Parse(registration.RegistrationDetails.PersonalDetails.DateOfBirth)), era_collectionandauthorization = registration.RegistrationDetails.InformationCollectionConsent, era_sharingrestriction = registration.RegistrationDetails.RestrictedAccess, address1_line1 = registration.RegistrationDetails.PrimaryAddress.AddressLine1, address1_line2 = registration.RegistrationDetails.PrimaryAddress.AddressLine2, address1_city = registration.RegistrationDetails.PrimaryAddress.Jurisdiction.JurisdictionName, address1_country = registration.RegistrationDetails.PrimaryAddress.Country.CountryCode, era_City = Lookup(registration.RegistrationDetails.PrimaryAddress.Jurisdiction), era_ProvinceState = Lookup(registration.RegistrationDetails.PrimaryAddress.StateProvince), era_Country = Lookup(registration.RegistrationDetails.PrimaryAddress.Country), address1_postalcode = registration.RegistrationDetails.PrimaryAddress.PostalCode, address2_line1 = registration.RegistrationDetails.MailingAddress.AddressLine1, address2_line2 = registration.RegistrationDetails.MailingAddress.AddressLine2, address2_city = registration.RegistrationDetails.MailingAddress.Jurisdiction.JurisdictionName, address2_country = registration.RegistrationDetails.MailingAddress.Country.CountryName, era_MailingCity = Lookup(registration.RegistrationDetails.MailingAddress.Jurisdiction), era_MailingProvinceState = Lookup(registration.RegistrationDetails.MailingAddress.StateProvince), era_MailingCountry = Lookup(registration.RegistrationDetails.MailingAddress.Country), address2_postalcode = registration.RegistrationDetails.MailingAddress.PostalCode, emailaddress1 = registration.RegistrationDetails.ContactDetails.Email, address1_telephone1 = registration.RegistrationDetails.ContactDetails.Phone, era_phonenumberrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Phone), era_emailrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Email), era_secrettext = registration.RegistrationDetails.SecretPhrase }; // members var members = (registration.PreliminaryNeedsAssessment.FamilyMembers ?? Array.Empty <PersonDetails>()).Select(fm => new contact { contactid = Guid.NewGuid(), era_registranttype = 174360001, era_authenticated = false, era_verified = false, era_registrationdate = now, firstname = fm.FirstName, lastname = fm.LastName, era_preferredname = fm.PreferredName, era_initial = fm.Initials, gendercode = LookupGender(fm.Gender), birthdate = FromDateTime(DateTime.Parse(fm.DateOfBirth)), era_collectionandauthorization = registration.RegistrationDetails.InformationCollectionConsent, era_sharingrestriction = registration.RegistrationDetails.RestrictedAccess, address1_line1 = registration.RegistrationDetails.PrimaryAddress.AddressLine1, address1_line2 = registration.RegistrationDetails.PrimaryAddress.AddressLine2, address1_city = registration.RegistrationDetails.PrimaryAddress.Jurisdiction.JurisdictionName, address1_country = registration.RegistrationDetails.PrimaryAddress.Country.CountryCode, era_City = Lookup(registration.RegistrationDetails.PrimaryAddress.Jurisdiction), era_ProvinceState = Lookup(registration.RegistrationDetails.PrimaryAddress.StateProvince), era_Country = Lookup(registration.RegistrationDetails.PrimaryAddress.Country), address1_postalcode = registration.RegistrationDetails.PrimaryAddress.PostalCode, address2_line1 = registration.RegistrationDetails.MailingAddress.AddressLine1, address2_line2 = registration.RegistrationDetails.MailingAddress.AddressLine2, address2_city = registration.RegistrationDetails.MailingAddress.Jurisdiction.JurisdictionName, address2_country = registration.RegistrationDetails.MailingAddress.Country.CountryName, era_MailingCity = Lookup(registration.RegistrationDetails.MailingAddress.Jurisdiction), era_MailingProvinceState = Lookup(registration.RegistrationDetails.MailingAddress.StateProvince), era_MailingCountry = Lookup(registration.RegistrationDetails.MailingAddress.Country), address2_postalcode = registration.RegistrationDetails.MailingAddress.PostalCode, emailaddress1 = registration.RegistrationDetails.ContactDetails.Email, address1_telephone1 = registration.RegistrationDetails.ContactDetails.Phone, era_phonenumberrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Phone), era_emailrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Email), era_secrettext = registration.RegistrationDetails.SecretPhrase }); // needs assessment var needsAssessment = new era_needassessment { era_needassessmentid = Guid.NewGuid(), era_needsassessmentdate = now, era_EvacuationFile = file, era_needsassessmenttype = 174360000, era_foodrequirement = Lookup(registration.PreliminaryNeedsAssessment.RequiresFood), era_clothingrequirement = Lookup(registration.PreliminaryNeedsAssessment.RequiresClothing), era_dietaryrequirement = registration.PreliminaryNeedsAssessment.HaveSpecialDiet, era_incidentalrequirement = Lookup(registration.PreliminaryNeedsAssessment.RequiresIncidentals), era_lodgingrequirement = Lookup(registration.PreliminaryNeedsAssessment.RequiresLodging), era_transportationrequirement = Lookup(registration.PreliminaryNeedsAssessment.RequiresTransportation), era_medicationrequirement = registration.PreliminaryNeedsAssessment.HaveMedication, era_insurancecoverage = Lookup(registration.PreliminaryNeedsAssessment.Insurance), era_collectionandauthorization = registration.RegistrationDetails.InformationCollectionConsent, era_sharingrestriction = registration.RegistrationDetails.RestrictedAccess, era_phonenumberrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Phone), era_emailrefusal = string.IsNullOrEmpty(registration.RegistrationDetails.ContactDetails.Email) }; // pets var pets = (registration.PreliminaryNeedsAssessment.Pets ?? Array.Empty <Pet>()).Select(p => new era_evacuee { era_evacueeid = Guid.NewGuid(), era_needsassessment = needsAssessment, era_amountofpets = Convert.ToInt32(p.Quantity), era_typeofpet = p.Type }); // set enity data and entity links in Dynamics // save evacuation file to dynamics dynamicsClient.AddToera_evacuationfiles(file); // save needs assessment to dynamics dynamicsClient.AddToera_needassessments(needsAssessment); // link evacuation file to needs assessment dynamicsClient.AddLink(file, nameof(file.era_needsassessment_EvacuationFile), needsAssessment); // save registrant to dynamics dynamicsClient.AddTocontacts(registrant); var evacueeRegistrant = new era_evacuee { era_evacueeid = Guid.NewGuid(), era_needsassessment = needsAssessment, era_Registrant = registrant }; dynamicsClient.AddToera_evacuees(evacueeRegistrant); // link registrant and needs assessment to evacuee record dynamicsClient.AddLink(registrant, nameof(registrant.era_contact_evacuee_Registrant), evacueeRegistrant); dynamicsClient.AddLink(needsAssessment, nameof(needsAssessment.era_era_needassessment_era_evacuee_needsassessment), evacueeRegistrant); // save members to dynamics foreach (var member in members) { dynamicsClient.AddTocontacts(member); var evacueeMember = new era_evacuee { era_evacueeid = Guid.NewGuid(), era_needsassessment = needsAssessment, era_Registrant = member }; dynamicsClient.AddToera_evacuees(evacueeMember); // link members and needs assessment to evacuee record dynamicsClient.AddLink(member, nameof(member.era_contact_evacuee_Registrant), evacueeMember); dynamicsClient.AddLink(needsAssessment, nameof(needsAssessment.era_era_needassessment_era_evacuee_needsassessment), evacueeMember); } // save pets to dynamics foreach (var pet in pets) { var petMember = new era_evacuee { era_evacueeid = Guid.NewGuid(), era_needsassessment = needsAssessment, era_typeofpet = pet.era_typeofpet, era_amountofpets = pet.era_amountofpets }; dynamicsClient.AddToera_evacuees(petMember); try { // link pet to evacuee record dynamicsClient.AddLink(needsAssessment, nameof(needsAssessment.era_era_needassessment_era_evacuee_needsassessment), petMember); } catch (ArgumentNullException) { logger.LogError("ArgumentNullException linking entities"); throw; } catch (InvalidOperationException) { logger.LogError("InvalidOperationException linking entities"); throw; } } //post as batch is not accepted by SSG. Sending with default option (multiple requests to the server stopping on the first failure) //var results = await dynamicsClient.SaveChangesAsync(SaveChangesOptions.BatchWithSingleChangeset); var results = await dynamicsClient.SaveChangesAsync(SaveChangesOptions.ContinueOnError); //var newEvacuationFileId = ((era_evacuationfile)results // .Select(r => (EntityDescriptor)((ChangeOperationResponse)r).Descriptor) // .Single(ed => ed.Entity is era_evacuationfile).Entity).era_evacuationfileid; //var essFileNumber = dynamicsClient.era_evacuationfiles // .Where(ef => ef.era_evacuationfileid == newEvacuationFileId) // .Single().era_essfilenumber; return($"E{essFileNumber:D9}"); }