/// <summary> /// Execute method to write transaction to the database. /// </summary> public void Execute() { using ( var rockContext = new RockContext() ) { var docTypeService = new SignatureDocumentTemplateService( rockContext ); var docService = new SignatureDocumentService( rockContext ); var document = docService.Get( SignatureDocumentId ); if ( document != null ) { var status = document.Status; int? binaryFileId = document.BinaryFileId; string folderPath = System.Web.Hosting.HostingEnvironment.MapPath( "~/App_Data/Cache/SignNow" ); var updateErrorMessages = new List<string>(); if ( docTypeService.UpdateDocumentStatus( document, folderPath, out updateErrorMessages ) ) { if ( status != document.Status || !binaryFileId.Equals( document.BinaryFileId ) ) { rockContext.SaveChanges(); } } } } }
/// <summary> /// Handles the Delete event of the gSignatureDocumentTemplate control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RowEventArgs" /> instance containing the event data.</param> protected void gSignatureDocumentTemplate_Delete( object sender, RowEventArgs e ) { var rockContext = new RockContext(); var signatureDocumentService = new SignatureDocumentService( rockContext ); var signatureDocumentTemplateService = new SignatureDocumentTemplateService( rockContext ); SignatureDocumentTemplate type = signatureDocumentTemplateService.Get( e.RowKeyId ); if ( type != null ) { if ( !UserCanEdit && !type.IsAuthorized( Authorization.EDIT, CurrentPerson ) ) { mdGridWarning.Show( "Sorry, you're not authorized to delete this signature document template.", ModalAlertType.Alert ); return; } string errorMessage; if ( !signatureDocumentTemplateService.CanDelete( type, out errorMessage ) ) { mdGridWarning.Show( errorMessage, ModalAlertType.Information ); return; } signatureDocumentTemplateService.Delete( type ); rockContext.SaveChanges(); } BindGrid(); }
/// <summary> /// Binds the signature documents grid. /// </summary> protected void BindGrid() { var qry = new SignatureDocumentService( new RockContext() ) .Queryable().AsNoTracking(); if ( TargetPerson != null ) { qry = qry.Where( d => ( d.AppliesToPersonAlias != null && d.AppliesToPersonAlias.PersonId == TargetPerson.Id ) || ( d.AssignedToPersonAlias != null && d.AssignedToPersonAlias.PersonId == TargetPerson.Id ) || ( d.SignedByPersonAlias != null && d.SignedByPersonAlias.PersonId == TargetPerson.Id ) ); } else { int? documentTypeId = PageParameter( "SignatureDocumentTemplateId" ).AsIntegerOrNull(); if ( documentTypeId.HasValue ) { qry = qry.Where( d => d.SignatureDocumentTemplateId == documentTypeId.Value ); var typeColumn = gSignatureDocuments.ColumnsOfType<RockBoundField>().Where( f => f.HeaderText == "Document Type" ).First(); typeColumn.Visible = false; } } SortProperty sortProperty = gSignatureDocuments.SortProperty; if ( sortProperty != null ) { qry = qry.Sort( sortProperty ); } else { qry = qry.OrderByDescending( d => d.LastInviteDate ); } gSignatureDocuments.DataSource = qry.Select( d => new { d.Id, d.Name, d.DocumentKey, d.AppliesToPersonAlias, d.AssignedToPersonAlias, d.SignedByPersonAlias, d.Status, d.LastInviteDate, d.SignatureDocumentTemplate, FileText = d.BinaryFileId.HasValue ? "<i class='fa fa-file-text-o fa-lg'></i>" : "", FileId = d.BinaryFileId ?? 0 } ).ToList(); gSignatureDocuments.DataBind(); }
/// <summary> /// Execute method to write transaction to the database. /// </summary> public void Execute() { using ( var rockContext = new RockContext() ) { var documentService = new SignatureDocumentService( rockContext ); var personAliasService = new PersonAliasService( rockContext ); var appliesPerson = personAliasService.GetPerson( AppliesToPersonAliasId ); var assignedPerson = personAliasService.GetPerson( AssignedToPersonAliasId ); if ( !documentService.Queryable().Any( d => d.AppliesToPersonAliasId.HasValue && d.AppliesToPersonAliasId.Value == AppliesToPersonAliasId && d.Status == SignatureDocumentStatus.Signed ) ) { var documentTypeService = new SignatureDocumentTemplateService( rockContext ); var SignatureDocumentTemplate = documentTypeService.Get( SignatureDocumentTemplateId ); var errorMessages = new List<string>(); if ( documentTypeService.SendDocument( SignatureDocumentTemplate, appliesPerson, assignedPerson, DocumentName, Email, out errorMessages ) ) { rockContext.SaveChanges(); } } } }
/// <summary> /// Shows the detail. /// </summary> /// <param name="signatureDocumentId">The signature document type identifier.</param> public void ShowDetail( int signatureDocumentId ) { pnlDetails.Visible = true; SignatureDocument signatureDocument = null; using ( var rockContext = new RockContext() ) { if ( !signatureDocumentId.Equals( 0 ) ) { signatureDocument = new SignatureDocumentService( rockContext ).Get( signatureDocumentId ); } if ( signatureDocument == null ) { signatureDocument = new SignatureDocument { Id = 0 }; int? personId = PageParameter( "personId" ).AsIntegerOrNull(); if ( personId.HasValue ) { var person = new PersonService( rockContext ).Get( personId.Value ); if ( person != null ) { var personAlias = person.PrimaryAlias; if ( personAlias != null ) { signatureDocument.AppliesToPersonAlias = personAlias; signatureDocument.AppliesToPersonAliasId = personAlias.Id; signatureDocument.AssignedToPersonAlias = personAlias; signatureDocument.AssignedToPersonAliasId = personAlias.Id; } } } int? documentTypeId = PageParameter( "SignatureDocumentTemplateId" ).AsIntegerOrNull(); if ( documentTypeId.HasValue ) { var documentType = new SignatureDocumentTemplateService( rockContext ).Get( documentTypeId.Value ); if ( documentType != null ) { signatureDocument.SignatureDocumentTemplate = documentType; signatureDocument.SignatureDocumentTemplateId = documentType.Id; } } } hfSignatureDocumentId.SetValue( signatureDocument.Id ); // render UI based on Authorized and IsSystem bool readOnly = false; nbEditModeMessage.Text = string.Empty; bool canEdit = UserCanEdit || signatureDocument.IsAuthorized( Authorization.EDIT, CurrentPerson ); bool canView = canEdit || signatureDocument.IsAuthorized( Authorization.VIEW, CurrentPerson ); if ( !canView ) { pnlDetails.Visible = false; } else { pnlDetails.Visible = true; if ( !canEdit ) { readOnly = true; nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed( SignatureDocument.FriendlyTypeName ); } if ( readOnly ) { ShowReadonlyDetails( signatureDocument ); } else { ShowEditDetails( signatureDocument, false ); } } } }
/// <summary> /// Handles the Click event of the btnSend control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void btnSend_Click( object sender, EventArgs e ) { int? signatureDocumentId = hfSignatureDocumentId.Value.AsIntegerOrNull(); if ( signatureDocumentId.HasValue && signatureDocumentId.Value > 0 ) { using ( var rockContext = new RockContext() ) { var signatureDocument = new SignatureDocumentService( rockContext ).Get( signatureDocumentId.Value ); if ( signatureDocument != null ) { var errorMessages = new List<string>(); if ( new SignatureDocumentTemplateService( rockContext ).SendDocument( signatureDocument, string.Empty, out errorMessages ) ) { rockContext.SaveChanges(); ShowEditDetails( signatureDocument, true ); nbErrorMessage.Title = string.Empty; nbErrorMessage.Text = "Signature Invite Was Successfully Sent"; nbErrorMessage.NotificationBoxType = NotificationBoxType.Success; nbErrorMessage.Visible = true; } else { nbErrorMessage.Title = "Error Sending Signature Invite"; nbErrorMessage.Text = string.Format( "<ul><li>{0}</li></ul>", errorMessages.AsDelimited( "</li><li>" ) ); nbErrorMessage.NotificationBoxType = NotificationBoxType.Danger; nbErrorMessage.Visible = true; } } } } }
/// <summary> /// Handles the Click event of the btnSaveType control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { bool inviteCancelled = false; var rockContext = new RockContext(); int? documentTemplateId = ddlDocumentType.SelectedValueAsInt(); if ( !documentTemplateId.HasValue ) { nbErrorMessage.Title = string.Empty; nbErrorMessage.Text = "Document Template is Required!"; nbErrorMessage.NotificationBoxType = NotificationBoxType.Danger; nbErrorMessage.Visible = true; return; } SignatureDocument signatureDocument = null; SignatureDocumentService service = new SignatureDocumentService( rockContext ); int signatureDocumentId = hfSignatureDocumentId.ValueAsInt(); int? origBinaryFileId = null; if ( signatureDocumentId != 0 ) { signatureDocument = service.Get( signatureDocumentId ); } if ( signatureDocument == null ) { signatureDocument = new SignatureDocument(); service.Add( signatureDocument ); } signatureDocument.Name = tbName.Text; var newStatus = rbStatus.SelectedValueAsEnum<SignatureDocumentStatus>( SignatureDocumentStatus.None ); if ( signatureDocument.Status != newStatus ) { signatureDocument.Status = newStatus; signatureDocument.LastStatusDate = RockDateTime.Now; inviteCancelled = newStatus == SignatureDocumentStatus.Cancelled; } signatureDocument.AppliesToPersonAliasId = ppAppliesTo.PersonAliasId; signatureDocument.AssignedToPersonAliasId = ppAssignedTo.PersonAliasId; signatureDocument.SignedByPersonAliasId = ppSignedBy.PersonAliasId; signatureDocument.SignatureDocumentTemplateId = documentTemplateId.Value; origBinaryFileId = signatureDocument.BinaryFileId; signatureDocument.BinaryFileId = fuDocument.BinaryFileId; if ( !signatureDocument.IsValid ) { // Controls will render the error messages return; } BinaryFileService binaryFileService = new BinaryFileService( rockContext ); if ( origBinaryFileId.HasValue && origBinaryFileId.Value != signatureDocument.BinaryFileId ) { // if a new the binaryFile was uploaded, mark the old one as Temporary so that it gets cleaned up var oldBinaryFile = binaryFileService.Get( origBinaryFileId.Value ); if ( oldBinaryFile != null && !oldBinaryFile.IsTemporary ) { oldBinaryFile.IsTemporary = true; } } // ensure the IsTemporary is set to false on binaryFile associated with this document if ( signatureDocument.BinaryFileId.HasValue ) { var binaryFile = binaryFileService.Get( signatureDocument.BinaryFileId.Value ); if ( binaryFile != null && binaryFile.IsTemporary ) { binaryFile.IsTemporary = false; } } rockContext.SaveChanges(); if ( inviteCancelled && !string.IsNullOrWhiteSpace( signatureDocument.DocumentKey ) ) { var errorMessages = new List<string>(); if ( new SignatureDocumentTemplateService( rockContext ).CancelDocument( signatureDocument, out errorMessages ) ) { rockContext.SaveChanges(); } } ReturnToParent(); }
/// <summary> /// Saves the registration. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="hasPayment">if set to <c>true</c> [has payment].</param> /// <returns></returns> private Registration SaveRegistration( RockContext rockContext, bool hasPayment ) { var registrationService = new RegistrationService( rockContext ); var registrantService = new RegistrationRegistrantService( rockContext ); var registrantFeeService = new RegistrationRegistrantFeeService( rockContext ); var personService = new PersonService( rockContext ); var groupService = new GroupService( rockContext ); var documentService = new SignatureDocumentService( rockContext ); // variables to keep track of the family that new people should be added to int? singleFamilyId = null; var multipleFamilyGroupIds = new Dictionary<Guid, int>(); var dvcConnectionStatus = DefinedValueCache.Read( GetAttributeValue( "ConnectionStatus" ).AsGuid() ); var dvcRecordStatus = DefinedValueCache.Read( GetAttributeValue( "RecordStatus" ).AsGuid() ); var familyGroupType = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY ); var adultRoleId = familyGroupType.Roles .Where( r => r.Guid.Equals( Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT.AsGuid() ) ) .Select( r => r.Id ) .FirstOrDefault(); var childRoleId = familyGroupType.Roles .Where( r => r.Guid.Equals( Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_CHILD.AsGuid() ) ) .Select( r => r.Id ) .FirstOrDefault(); bool newRegistration = false; Registration registration = null; Person registrar = null; var registrationChanges = new List<string>(); if ( RegistrationState.RegistrationId.HasValue ) { registration = registrationService.Get( RegistrationState.RegistrationId.Value ); } if ( registration == null ) { newRegistration = true; registration = new Registration(); registrationService.Add( registration ); registrationChanges.Add( "Created Registration" ); } else { if ( registration.PersonAlias != null && registration.PersonAlias.Person != null ) { registrar = registration.PersonAlias.Person; } } registration.RegistrationInstanceId = RegistrationInstanceState.Id; // If the Registration Instance linkage specified a group, load it now Group group = null; if ( GroupId.HasValue ) { group = new GroupService( rockContext ).Get( GroupId.Value ); if ( group != null && ( !registration.GroupId.HasValue || registration.GroupId.Value != group.Id ) ) { registration.GroupId = group.Id; History.EvaluateChange( registrationChanges, "Group", string.Empty, group.Name ); } } bool newRegistrar = newRegistration || registration.FirstName == null || !registration.FirstName.Equals( RegistrationState.FirstName, StringComparison.OrdinalIgnoreCase ) || registration.LastName == null || !registration.LastName.Equals( RegistrationState.LastName, StringComparison.OrdinalIgnoreCase ); History.EvaluateChange( registrationChanges, "First Name", registration.FirstName, RegistrationState.FirstName ); registration.FirstName = RegistrationState.FirstName; History.EvaluateChange( registrationChanges, "Last Name", registration.LastName, RegistrationState.LastName ); registration.LastName = RegistrationState.LastName; History.EvaluateChange( registrationChanges, "Confirmation Email", registration.ConfirmationEmail, RegistrationState.ConfirmationEmail ); registration.ConfirmationEmail = RegistrationState.ConfirmationEmail; History.EvaluateChange( registrationChanges, "Discount Code", registration.DiscountCode, RegistrationState.DiscountCode ); registration.DiscountCode = RegistrationState.DiscountCode; History.EvaluateChange( registrationChanges, "Discount Percentage", registration.DiscountPercentage, RegistrationState.DiscountPercentage ); registration.DiscountPercentage = RegistrationState.DiscountPercentage; History.EvaluateChange( registrationChanges, "Discount Amount", registration.DiscountAmount, RegistrationState.DiscountAmount ); registration.DiscountAmount = RegistrationState.DiscountAmount; if ( newRegistrar ) { // Businesses have no first name. This resolves null reference issues downstream. if ( CurrentPerson != null && CurrentPerson.FirstName == null ) { CurrentPerson.FirstName = ""; } if ( CurrentPerson != null && CurrentPerson.NickName == null ) { CurrentPerson.NickName = CurrentPerson.FirstName; } // If the 'your name' value equals the currently logged in person, use their person alias id if ( CurrentPerson != null && ( CurrentPerson.NickName.Trim().Equals( registration.FirstName.Trim(), StringComparison.OrdinalIgnoreCase ) || CurrentPerson.FirstName.Trim().Equals( registration.FirstName.Trim(), StringComparison.OrdinalIgnoreCase ) ) && CurrentPerson.LastName.Trim().Equals( registration.LastName.Trim(), StringComparison.OrdinalIgnoreCase ) ) { registrar = CurrentPerson; registration.PersonAliasId = CurrentPerson.PrimaryAliasId; // If email that logged in user used is different than their stored email address, update their stored value if ( !string.IsNullOrWhiteSpace( registration.ConfirmationEmail ) && !registration.ConfirmationEmail.Trim().Equals( CurrentPerson.Email.Trim(), StringComparison.OrdinalIgnoreCase ) && ( !cbUpdateEmail.Visible || cbUpdateEmail.Checked ) ) { var person = personService.Get( CurrentPerson.Id ); if ( person != null ) { var personChanges = new List<string>(); History.EvaluateChange( personChanges, "Email", person.Email, registration.ConfirmationEmail ); person.Email = registration.ConfirmationEmail; HistoryService.SaveChanges( new RockContext(), typeof( Person ), Rock.SystemGuid.Category.HISTORY_PERSON_DEMOGRAPHIC_CHANGES.AsGuid(), person.Id, personChanges, true, CurrentPersonAliasId ); } } } else { // otherwise look for one and one-only match by name/email var personMatches = personService.GetByMatch( registration.FirstName, registration.LastName, registration.ConfirmationEmail ); if ( personMatches.Count() == 1 ) { registrar = personMatches.First(); registration.PersonAliasId = registrar.PrimaryAliasId; } else { registrar = null; registration.PersonAlias = null; registration.PersonAliasId = null; } } } // Set the family guid for any other registrants that were selected to be in the same family if ( registrar != null ) { var family = registrar.GetFamilies( rockContext ).FirstOrDefault(); if ( family != null ) { multipleFamilyGroupIds.AddOrIgnore( RegistrationState.FamilyGuid, family.Id ); if ( !singleFamilyId.HasValue ) { singleFamilyId = family.Id; } } } // Make sure there's an actual person associated to registration if ( !registration.PersonAliasId.HasValue ) { // If a match was not found, create a new person var person = new Person(); person.FirstName = registration.FirstName; person.LastName = registration.LastName; person.IsEmailActive = true; person.Email = registration.ConfirmationEmail; person.EmailPreference = EmailPreference.EmailAllowed; person.RecordTypeValueId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid() ).Id; if ( dvcConnectionStatus != null ) { person.ConnectionStatusValueId = dvcConnectionStatus.Id; } if ( dvcRecordStatus != null ) { person.RecordStatusValueId = dvcRecordStatus.Id; } registrar = SavePerson( rockContext, person, RegistrationState.FamilyGuid, CampusId, null, adultRoleId, childRoleId, multipleFamilyGroupIds, ref singleFamilyId ); registration.PersonAliasId = registrar != null ? registrar.PrimaryAliasId : (int?)null; History.EvaluateChange( registrationChanges, "Registrar", string.Empty, registrar.FullName ); } else { if ( newRegistration ) { History.EvaluateChange( registrationChanges, "Registrar", string.Empty, registration.ToString() ); } } // if this registration was marked as temporary (started from another page, then specified in the url), set IsTemporary to False now that we are done if ( registration.IsTemporary ) { registration.IsTemporary = false; } // Save the registration ( so we can get an id ) rockContext.SaveChanges(); RegistrationState.RegistrationId = registration.Id; try { Task.Run( () => HistoryService.SaveChanges( new RockContext(), typeof( Registration ), Rock.SystemGuid.Category.HISTORY_EVENT_REGISTRATION.AsGuid(), registration.Id, registrationChanges, true, CurrentPersonAliasId ) ); // Get each registrant foreach ( var registrantInfo in RegistrationState.Registrants.ToList() ) { var registrantChanges = new List<string>(); var personChanges = new List<string>(); var familyChanges = new List<string>(); RegistrationRegistrant registrant = null; Person person = null; string firstName = registrantInfo.GetFirstName( RegistrationTemplate ); string lastName = registrantInfo.GetLastName( RegistrationTemplate ); string email = registrantInfo.GetEmail( RegistrationTemplate ); if ( registrantInfo.Id > 0 ) { registrant = registration.Registrants.FirstOrDefault( r => r.Id == registrantInfo.Id ); if ( registrant != null ) { person = registrant.Person; if ( person != null && ( ( registrant.Person.FirstName.Equals( firstName, StringComparison.OrdinalIgnoreCase ) || registrant.Person.NickName.Equals( firstName, StringComparison.OrdinalIgnoreCase ) ) && registrant.Person.LastName.Equals( lastName, StringComparison.OrdinalIgnoreCase ) ) ) { // } else { person = null; registrant.PersonAlias = null; registrant.PersonAliasId = null; } } } else { if ( registrantInfo.PersonId.HasValue && RegistrationTemplate.ShowCurrentFamilyMembers ) { person = personService.Get( registrantInfo.PersonId.Value ); } } if ( person == null ) { // Try to find a matching person based on name and email address var personMatches = personService.GetByMatch( firstName, lastName, email ); if ( personMatches.Count() == 1 ) { person = personMatches.First(); } // Try to find a matching person based on name within same family as registrar if ( person == null && registrar != null && registrantInfo.FamilyGuid == RegistrationState.FamilyGuid ) { var familyMembers = registrar.GetFamilyMembers( true, rockContext ) .Where( m => ( m.Person.FirstName == firstName || m.Person.NickName == firstName ) && m.Person.LastName == lastName ) .Select( m => m.Person ) .ToList(); if ( familyMembers.Count() == 1 ) { person = familyMembers.First(); if ( !string.IsNullOrWhiteSpace( email ) ) { person.Email = email; } } if ( familyMembers.Count() > 1 && !string.IsNullOrWhiteSpace( email ) ) { familyMembers = familyMembers .Where( m => m.Email != null && m.Email.Equals( email, StringComparison.OrdinalIgnoreCase ) ) .ToList(); if ( familyMembers.Count() == 1 ) { person = familyMembers.First(); } } } } if ( person == null ) { // If a match was not found, create a new person person = new Person(); person.FirstName = firstName; person.LastName = lastName; person.IsEmailActive = true; person.Email = email; person.EmailPreference = EmailPreference.EmailAllowed; person.RecordTypeValueId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid() ).Id; if ( dvcConnectionStatus != null ) { person.ConnectionStatusValueId = dvcConnectionStatus.Id; } if ( dvcRecordStatus != null ) { person.RecordStatusValueId = dvcRecordStatus.Id; } } int? campusId = CampusId; Location location = null; // Set any of the template's person fields foreach ( var field in RegistrationTemplate.Forms .SelectMany( f => f.Fields .Where( t => t.FieldSource == RegistrationFieldSource.PersonField ) ) ) { // Find the registrant's value var fieldValue = registrantInfo.FieldValues .Where( f => f.Key == field.Id ) .Select( f => f.Value.FieldValue ) .FirstOrDefault(); if ( fieldValue != null ) { switch ( field.PersonFieldType ) { case RegistrationPersonFieldType.Campus: { if ( fieldValue != null ) { campusId = fieldValue.ToString().AsIntegerOrNull(); } break; } case RegistrationPersonFieldType.Address: { location = fieldValue as Location; break; } case RegistrationPersonFieldType.Birthdate: { var birthMonth = person.BirthMonth; var birthDay = person.BirthDay; var birthYear = person.BirthYear; person.SetBirthDate( fieldValue as DateTime? ); History.EvaluateChange( personChanges, "Birth Month", birthMonth, person.BirthMonth ); History.EvaluateChange( personChanges, "Birth Day", birthDay, person.BirthDay ); History.EvaluateChange( personChanges, "Birth Year", birthYear, person.BirthYear ); break; } case RegistrationPersonFieldType.Grade: { var newGraduationYear = fieldValue.ToString().AsIntegerOrNull(); History.EvaluateChange( personChanges, "Graduation Year", person.GraduationYear, newGraduationYear ); person.GraduationYear = newGraduationYear; break; } case RegistrationPersonFieldType.Gender: { var newGender = fieldValue.ToString().ConvertToEnumOrNull<Gender>() ?? Gender.Unknown; History.EvaluateChange( personChanges, "Gender", person.Gender, newGender ); person.Gender = newGender; break; } case RegistrationPersonFieldType.MaritalStatus: { if ( fieldValue != null ) { int? newMaritalStatusId = fieldValue.ToString().AsIntegerOrNull(); History.EvaluateChange( personChanges, "Marital Status", DefinedValueCache.GetName( person.MaritalStatusValueId ), DefinedValueCache.GetName( newMaritalStatusId ) ); person.MaritalStatusValueId = newMaritalStatusId; } break; } case RegistrationPersonFieldType.MobilePhone: { SavePhone( fieldValue, person, Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_MOBILE.AsGuid(), personChanges ); break; } case RegistrationPersonFieldType.HomePhone: { SavePhone( fieldValue, person, Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_HOME.AsGuid(), personChanges ); break; } case RegistrationPersonFieldType.WorkPhone: { SavePhone( fieldValue, person, Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_WORK.AsGuid(), personChanges ); break; } } } } // Save the person ( and family if needed ) SavePerson( rockContext, person, registrantInfo.FamilyGuid, campusId, location, adultRoleId, childRoleId, multipleFamilyGroupIds, ref singleFamilyId ); // Load the person's attributes person.LoadAttributes(); // Set any of the template's person fields foreach ( var field in RegistrationTemplate.Forms .SelectMany( f => f.Fields .Where( t => t.FieldSource == RegistrationFieldSource.PersonAttribute && t.AttributeId.HasValue ) ) ) { // Find the registrant's value var fieldValue = registrantInfo.FieldValues .Where( f => f.Key == field.Id ) .Select( f => f.Value.FieldValue ) .FirstOrDefault(); if ( fieldValue != null ) { var attribute = AttributeCache.Read( field.AttributeId.Value ); if ( attribute != null ) { string originalValue = person.GetAttributeValue( attribute.Key ); string newValue = fieldValue.ToString(); person.SetAttributeValue( attribute.Key, fieldValue.ToString() ); // DateTime values must be stored in ISO8601 format as http://www.rockrms.com/Rock/Developer/BookContent/16/16#datetimeformatting if ( attribute.FieldType.Guid.Equals( Rock.SystemGuid.FieldType.DATE.AsGuid() ) || attribute.FieldType.Guid.Equals( Rock.SystemGuid.FieldType.DATE_TIME.AsGuid() ) ) { DateTime aDateTime; if ( DateTime.TryParse( newValue, out aDateTime ) ) { newValue = aDateTime.ToString( "o" ); } } if ( ( originalValue ?? string.Empty ).Trim() != ( newValue ?? string.Empty ).Trim() ) { string formattedOriginalValue = string.Empty; if ( !string.IsNullOrWhiteSpace( originalValue ) ) { formattedOriginalValue = attribute.FieldType.Field.FormatValue( null, originalValue, attribute.QualifierValues, false ); } string formattedNewValue = string.Empty; if ( !string.IsNullOrWhiteSpace( newValue ) ) { formattedNewValue = attribute.FieldType.Field.FormatValue( null, newValue, attribute.QualifierValues, false ); } Helper.SaveAttributeValue( person, attribute, newValue, rockContext ); History.EvaluateChange( personChanges, attribute.Name, formattedOriginalValue, formattedNewValue ); } } } } string registrantName = person.FullName + ": "; personChanges.ForEach( c => registrantChanges.Add( c ) ); if ( registrant == null ) { registrant = new RegistrationRegistrant(); registrant.Guid = registrantInfo.Guid; registrantService.Add( registrant ); registrant.RegistrationId = registration.Id; } registrant.OnWaitList = registrantInfo.OnWaitList; registrant.PersonAliasId = person.PrimaryAliasId; registrant.Cost = registrantInfo.Cost; registrant.DiscountApplies = registrantInfo.DiscountApplies; // Remove fees // Remove/delete any registrant fees that are no longer in UI with quantity foreach ( var dbFee in registrant.Fees.ToList() ) { if ( !registrantInfo.FeeValues.Keys.Contains( dbFee.RegistrationTemplateFeeId ) || registrantInfo.FeeValues[dbFee.RegistrationTemplateFeeId] == null || !registrantInfo.FeeValues[dbFee.RegistrationTemplateFeeId] .Any( f => f.Option == dbFee.Option && f.Quantity > 0 ) ) { registrantChanges.Add( string.Format( "Removed '{0}' Fee (Quantity:{1:N0}, Cost:{2:C2}, Option:{3}", dbFee.RegistrationTemplateFee.Name, dbFee.Quantity, dbFee.Cost, dbFee.Option ) ); registrant.Fees.Remove( dbFee ); registrantFeeService.Delete( dbFee ); } } // Add or Update fees foreach ( var uiFee in registrantInfo.FeeValues.Where( f => f.Value != null ) ) { foreach ( var uiFeeOption in uiFee.Value ) { var dbFee = registrant.Fees .Where( f => f.RegistrationTemplateFeeId == uiFee.Key && f.Option == uiFeeOption.Option ) .FirstOrDefault(); if ( dbFee == null ) { dbFee = new RegistrationRegistrantFee(); dbFee.RegistrationTemplateFeeId = uiFee.Key; dbFee.Option = uiFeeOption.Option; registrant.Fees.Add( dbFee ); } var templateFee = dbFee.RegistrationTemplateFee; if ( templateFee == null ) { templateFee = RegistrationTemplate.Fees.Where( f => f.Id == uiFee.Key ).FirstOrDefault(); } string feeName = templateFee != null ? templateFee.Name : "Fee"; if ( !string.IsNullOrWhiteSpace( uiFeeOption.Option ) ) { feeName = string.Format( "{0} ({1})", feeName, uiFeeOption.Option ); } if ( dbFee.Id <= 0 ) { registrantChanges.Add( feeName + " Fee Added" ); } History.EvaluateChange( registrantChanges, feeName + " Quantity", dbFee.Quantity, uiFeeOption.Quantity ); dbFee.Quantity = uiFeeOption.Quantity; History.EvaluateChange( registrantChanges, feeName + " Cost", dbFee.Cost, uiFeeOption.Cost ); dbFee.Cost = uiFeeOption.Cost; } } rockContext.SaveChanges(); registrantInfo.Id = registrant.Id; // Set any of the templat's registrant attributes registrant.LoadAttributes(); foreach ( var field in RegistrationTemplate.Forms .SelectMany( f => f.Fields .Where( t => t.FieldSource == RegistrationFieldSource.RegistrationAttribute && t.AttributeId.HasValue ) ) ) { // Find the registrant's value var fieldValue = registrantInfo.FieldValues .Where( f => f.Key == field.Id ) .Select( f => f.Value.FieldValue ) .FirstOrDefault(); if ( fieldValue != null ) { var attribute = AttributeCache.Read( field.AttributeId.Value ); if ( attribute != null ) { string originalValue = registrant.GetAttributeValue( attribute.Key ); string newValue = fieldValue.ToString(); registrant.SetAttributeValue( attribute.Key, fieldValue.ToString() ); // DateTime values must be stored in ISO8601 format as http://www.rockrms.com/Rock/Developer/BookContent/16/16#datetimeformatting if ( attribute.FieldType.Guid.Equals( Rock.SystemGuid.FieldType.DATE.AsGuid() ) || attribute.FieldType.Guid.Equals( Rock.SystemGuid.FieldType.DATE_TIME.AsGuid() ) ) { DateTime aDateTime; if ( DateTime.TryParse( fieldValue.ToString(), out aDateTime ) ) { newValue = aDateTime.ToString( "o" ); } } if ( ( originalValue ?? string.Empty ).Trim() != ( newValue ?? string.Empty ).Trim() ) { string formattedOriginalValue = string.Empty; if ( !string.IsNullOrWhiteSpace( originalValue ) ) { formattedOriginalValue = attribute.FieldType.Field.FormatValue( null, originalValue, attribute.QualifierValues, false ); } string formattedNewValue = string.Empty; if ( !string.IsNullOrWhiteSpace( newValue ) ) { formattedNewValue = attribute.FieldType.Field.FormatValue( null, newValue, attribute.QualifierValues, false ); } Helper.SaveAttributeValue( registrant, attribute, newValue, rockContext ); History.EvaluateChange( registrantChanges, attribute.Name, formattedOriginalValue, formattedNewValue ); } } } } Task.Run( () => HistoryService.SaveChanges( new RockContext(), typeof( Registration ), Rock.SystemGuid.Category.HISTORY_EVENT_REGISTRATION.AsGuid(), registration.Id, registrantChanges, "Registrant: " + person.FullName, null, null, true, CurrentPersonAliasId ) ); // Clear this registran't family guid so it's not updated again registrantInfo.FamilyGuid = Guid.Empty; // Save the signed document try { if ( RegistrationTemplate.RequiredSignatureDocumentTemplateId.HasValue && !string.IsNullOrWhiteSpace( registrantInfo.SignatureDocumentKey ) ) { var document = new SignatureDocument(); document.SignatureDocumentTemplateId = RegistrationTemplate.RequiredSignatureDocumentTemplateId.Value; document.DocumentKey = registrantInfo.SignatureDocumentKey; document.Name = string.Format( "{0}_{1}", RegistrationInstanceState.Name.RemoveSpecialCharacters(), person.FullName.RemoveSpecialCharacters() ); ; document.AppliesToPersonAliasId = person.PrimaryAliasId; document.AssignedToPersonAliasId = registrar.PrimaryAliasId; document.SignedByPersonAliasId = registrar.PrimaryAliasId; document.Status = SignatureDocumentStatus.Signed; document.LastInviteDate = registrantInfo.SignatureDocumentLastSent; document.LastStatusDate = registrantInfo.SignatureDocumentLastSent; documentService.Add( document ); rockContext.SaveChanges(); var updateDocumentTxn = new Rock.Transactions.UpdateDigitalSignatureDocumentTransaction( document.Id ); Rock.Transactions.RockQueue.TransactionQueue.Enqueue( updateDocumentTxn ); } } catch( System.Exception ex ) { ExceptionLogService.LogException( ex, Context, this.RockPage.PageId, this.RockPage.Site.Id, CurrentPersonAlias ); } } rockContext.SaveChanges(); } catch ( Exception ex ) { using ( var newRockContext = new RockContext() ) { if ( newRegistration ) { var newRegistrationService = new RegistrationService( newRockContext ); var savedRegistration = new RegistrationService( newRockContext ).Get( registration.Id ); if ( savedRegistration != null ) { HistoryService.DeleteChanges( newRockContext, typeof( Registration ), savedRegistration.Id ); newRegistrationService.Delete( savedRegistration ); newRockContext.SaveChanges(); } } } throw ex; } return registration; }
/// <summary> /// Shows the detail. /// </summary> /// <param name="groupMemberId">The group member identifier.</param> /// <param name="groupId">The group id.</param> public void ShowDetail( int groupMemberId, int? groupId ) { // autoexpand the person picker if this is an add var personPickerStartupScript = @"Sys.Application.add_load(function () { // if the person picker is empty then open it for quick entry var personPicker = $('.js-authorizedperson'); var currentPerson = personPicker.find('.picker-selectedperson').html(); if (currentPerson != null && currentPerson.length == 0) { $(personPicker).find('a.picker-label').trigger('click'); } });"; this.Page.ClientScript.RegisterStartupScript( this.GetType(), "StartupScript", personPickerStartupScript, true ); var rockContext = new RockContext(); GroupMember groupMember = null; if ( !groupMemberId.Equals( 0 ) ) { groupMember = new GroupMemberService( rockContext ).Get( groupMemberId ); pdAuditDetails.SetEntity( groupMember, ResolveRockUrl( "~" ) ); } else { // only create a new one if parent was specified if ( groupId.HasValue ) { groupMember = new GroupMember { Id = 0 }; groupMember.GroupId = groupId.Value; groupMember.Group = new GroupService( rockContext ).Get( groupMember.GroupId ); groupMember.GroupRoleId = groupMember.Group.GroupType.DefaultGroupRoleId ?? 0; groupMember.GroupMemberStatus = GroupMemberStatus.Active; groupMember.DateTimeAdded = RockDateTime.Now; // hide the panel drawer that show created and last modified dates pdAuditDetails.Visible = false; } } if ( groupMember == null ) { if ( groupMemberId > 0 ) { nbErrorMessage.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Warning; nbErrorMessage.Title = "Warning"; nbErrorMessage.Text = "Group Member not found. Group Member may have been moved to another group or deleted."; } else { nbErrorMessage.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Danger; nbErrorMessage.Title = "Invalid Request"; nbErrorMessage.Text = "An incorrect querystring parameter was used. A valid GroupMemberId or GroupId parameter is required."; } pnlEditDetails.Visible = false; return; } pnlEditDetails.Visible = true; hfGroupId.Value = groupMember.GroupId.ToString(); hfGroupMemberId.Value = groupMember.Id.ToString(); if ( IsUserAuthorized( Authorization.ADMINISTRATE ) ) { cbIsNotified.Checked = groupMember.IsNotified; cbIsNotified.Visible = true; cbIsNotified.Help = "If this box is unchecked and a <a href=\"http://www.rockrms.com/Rock/BookContent/7/#servicejobsrelatingtogroups\">group leader notification job</a> is enabled then a notification will be sent to the group's leaders when this group member is saved."; } else { cbIsNotified.Visible = false; } // render UI based on Authorized and IsSystem bool readOnly = false; var group = groupMember.Group; if ( !string.IsNullOrWhiteSpace( group.GroupType.IconCssClass ) ) { lGroupIconHtml.Text = string.Format( "<i class='{0}' ></i>", group.GroupType.IconCssClass ); } else { lGroupIconHtml.Text = "<i class='fa fa-user' ></i>"; } if ( groupMember.Id.Equals( 0 ) ) { lReadOnlyTitle.Text = ActionTitle.Add( groupMember.Group.GroupType.GroupTerm + " " + groupMember.Group.GroupType.GroupMemberTerm ).FormatAsHtmlTitle(); btnSaveThenAdd.Visible = true; } else { lReadOnlyTitle.Text = groupMember.Person.FullName.FormatAsHtmlTitle(); btnSaveThenAdd.Visible = false; } if ( groupMember.DateTimeAdded.HasValue ) { hfDateAdded.Text = string.Format( "Added: {0}", groupMember.DateTimeAdded.Value.ToShortDateString() ); hfDateAdded.Visible = true; } else { hfDateAdded.Text = string.Empty; hfDateAdded.Visible = false; } // user has to have EDIT Auth to the Block OR the group nbEditModeMessage.Text = string.Empty; if ( !IsUserAuthorized( Authorization.EDIT ) && !group.IsAuthorized( Authorization.EDIT, this.CurrentPerson ) ) { readOnly = true; nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed( Group.FriendlyTypeName ); } if ( groupMember.IsSystem ) { readOnly = true; nbEditModeMessage.Text = EditModeMessage.ReadOnlySystem( Group.FriendlyTypeName ); } btnSave.Visible = !readOnly; if ( readOnly || groupMember.Id == 0) { // hide the ShowMoveDialog if this is readOnly or if this is a new group member (can't move a group member that doesn't exist yet) btnShowMoveDialog.Visible = false; } LoadDropDowns(); ShowRequiredDocumentStatus( rockContext, groupMember, group ); ppGroupMemberPerson.SetValue( groupMember.Person ); ppGroupMemberPerson.Enabled = !readOnly; if ( groupMember.Id != 0 ) { // once a group member record is saved, don't let them change the person ppGroupMemberPerson.Enabled = false; } ddlGroupRole.SetValue( groupMember.GroupRoleId ); ddlGroupRole.Enabled = !readOnly; tbNote.Text = groupMember.Note; tbNote.ReadOnly = readOnly; rblStatus.SetValue( (int)groupMember.GroupMemberStatus ); rblStatus.Enabled = !readOnly; rblStatus.Label = string.Format( "{0} Status", group.GroupType.GroupMemberTerm ); var registrations = new RegistrationRegistrantService( rockContext ) .Queryable().AsNoTracking() .Where( r => r.Registration != null && r.Registration.RegistrationInstance != null && r.GroupMemberId.HasValue && r.GroupMemberId.Value == groupMember.Id ) .Select( r => new { Id = r.Registration.Id, Name = r.Registration.RegistrationInstance.Name } ) .ToList(); if ( registrations.Any() ) { rcwLinkedRegistrations.Visible = true; rptLinkedRegistrations.DataSource = registrations; rptLinkedRegistrations.DataBind(); } else { rcwLinkedRegistrations.Visible = false; } if ( groupMember.Group.RequiredSignatureDocumentTemplate != null ) { fuSignedDocument.Label = groupMember.Group.RequiredSignatureDocumentTemplate.Name; if ( groupMember.Group.RequiredSignatureDocumentTemplate.BinaryFileType != null ) { fuSignedDocument.BinaryFileTypeGuid = groupMember.Group.RequiredSignatureDocumentTemplate.BinaryFileType.Guid; } var signatureDocument = new SignatureDocumentService( rockContext ) .Queryable().AsNoTracking() .Where( d => d.SignatureDocumentTemplateId == groupMember.Group.RequiredSignatureDocumentTemplateId.Value && d.AppliesToPersonAlias != null && d.AppliesToPersonAlias.PersonId == groupMember.PersonId && d.LastStatusDate.HasValue && d.Status == SignatureDocumentStatus.Signed && d.BinaryFile != null ) .OrderByDescending( d => d.LastStatusDate.Value ) .FirstOrDefault(); if ( signatureDocument != null ) { hfSignedDocumentId.Value = signatureDocument.Id.ToString(); fuSignedDocument.BinaryFileId = signatureDocument.BinaryFileId; } fuSignedDocument.Visible = true; } else { fuSignedDocument.Visible = false; } groupMember.LoadAttributes(); phAttributes.Controls.Clear(); Rock.Attribute.Helper.AddEditControls( groupMember, phAttributes, true, string.Empty, true ); if ( readOnly ) { Rock.Attribute.Helper.AddDisplayControls( groupMember, phAttributesReadOnly ); phAttributesReadOnly.Visible = true; phAttributes.Visible = false; } else { phAttributesReadOnly.Visible = false; phAttributes.Visible = true; } var groupHasRequirements = group.GroupRequirements.Any(); pnlRequirements.Visible = groupHasRequirements; btnReCheckRequirements.Visible = groupHasRequirements; ShowGroupRequirementsStatuses(); }
private void ShowRequiredDocumentStatus( RockContext rockContext, GroupMember groupMember, Group group ) { if ( groupMember.Person != null && group.RequiredSignatureDocumentTemplate != null ) { var documents = new SignatureDocumentService( rockContext ) .Queryable().AsNoTracking() .Where( d => d.SignatureDocumentTemplateId == group.RequiredSignatureDocumentTemplate.Id && d.AppliesToPersonAlias.PersonId == groupMember.Person.Id ) .ToList(); if ( !documents.Any( d => d.Status == SignatureDocumentStatus.Signed ) ) { var lastSent = documents.Any( d => d.Status == SignatureDocumentStatus.Sent ) ? documents.Where( d => d.Status == SignatureDocumentStatus.Sent ).Max( d => d.LastInviteDate ) : (DateTime?)null; pnlRequiredSignatureDocument.Visible = true; if ( lastSent.HasValue ) { lbResendDocumentRequest.Text = "Resend Signature Request"; lRequiredSignatureDocumentMessage.Text =string.Format("A signed {0} document has not yet been received for {1}. The last request was sent {2}.", group.RequiredSignatureDocumentTemplate.Name, groupMember.Person.NickName, lastSent.Value.ToElapsedString() ); } else { lbResendDocumentRequest.Text = "Send Signature Request"; lRequiredSignatureDocumentMessage.Text = string.Format("The required {0} document has not yet been sent to {1} for signing.", group.RequiredSignatureDocumentTemplate.Name, groupMember.Person.NickName ); } } else { pnlRequiredSignatureDocument.Visible = false; } } else { pnlRequiredSignatureDocument.Visible = false; } }
private void LoadState() { int? registrantId = PageParameter( "RegistrantId" ).AsIntegerOrNull(); int? registrationId = PageParameter( "RegistrationId" ).AsIntegerOrNull(); if ( RegistrantState == null ) { var rockContext = new RockContext(); RegistrationRegistrant registrant = null; if ( registrantId.HasValue && registrantId.Value != 0 ) { registrant = new RegistrationRegistrantService( rockContext ) .Queryable( "Registration.RegistrationInstance.RegistrationTemplate.Forms.Fields,Registration.RegistrationInstance.RegistrationTemplate.Fees,PersonAlias.Person,Fees" ).AsNoTracking() .Where( r => r.Id == registrantId.Value ) .FirstOrDefault(); if ( registrant != null && registrant.Registration != null && registrant.Registration.RegistrationInstance != null && registrant.Registration.RegistrationInstance.RegistrationTemplate != null ) { RegistrantState = new RegistrantInfo( registrant, rockContext ); TemplateState = registrant.Registration.RegistrationInstance.RegistrationTemplate; RegistrationInstanceId = registrant.Registration.RegistrationInstanceId; lWizardTemplateName.Text = registrant.Registration.RegistrationInstance.RegistrationTemplate.Name; lWizardInstanceName.Text = registrant.Registration.RegistrationInstance.Name; lWizardRegistrationName.Text = registrant.Registration.ToString(); lWizardRegistrantName.Text = registrant.ToString(); tglWaitList.Checked = !registrant.OnWaitList; } } if ( TemplateState == null && registrationId.HasValue && registrationId.Value != 0 ) { var registration = new RegistrationService( rockContext ) .Queryable( "RegistrationInstance.RegistrationTemplate.Forms.Fields,RegistrationInstance.RegistrationTemplate.Fees" ).AsNoTracking() .Where( r => r.Id == registrationId.Value ) .FirstOrDefault(); if ( registration != null && registration.RegistrationInstance != null && registration.RegistrationInstance.RegistrationTemplate != null ) { TemplateState = registration.RegistrationInstance.RegistrationTemplate; RegistrationInstanceId = registration.RegistrationInstanceId; lWizardTemplateName.Text = registration.RegistrationInstance.RegistrationTemplate.Name; lWizardInstanceName.Text = registration.RegistrationInstance.Name; lWizardRegistrationName.Text = registration.ToString(); lWizardRegistrantName.Text = "New Registrant"; } } if ( TemplateState != null ) { tglWaitList.Visible = TemplateState.WaitListEnabled; } if ( TemplateState != null && RegistrantState == null ) { RegistrantState = new RegistrantInfo(); RegistrantState.RegistrationId = registrationId ?? 0; if ( TemplateState.SetCostOnInstance.HasValue && TemplateState.SetCostOnInstance.Value ) { var instance = new RegistrationInstanceService( rockContext ).Get( RegistrationInstanceId ); if ( instance != null ) { RegistrantState.Cost = instance.Cost ?? 0.0m; } } else { RegistrantState.Cost = TemplateState.Cost; } } if ( registrant != null && registrant.PersonAlias != null && registrant.PersonAlias.Person != null ) { ppPerson.SetValue( registrant.PersonAlias.Person ); if ( TemplateState != null && TemplateState.RequiredSignatureDocumentTemplate != null ) { fuSignedDocument.Label = TemplateState.RequiredSignatureDocumentTemplate.Name; if ( TemplateState.RequiredSignatureDocumentTemplate.BinaryFileType != null ) { fuSignedDocument.BinaryFileTypeGuid = TemplateState.RequiredSignatureDocumentTemplate.BinaryFileType.Guid; } var signatureDocument = new SignatureDocumentService( rockContext ) .Queryable().AsNoTracking() .Where( d => d.SignatureDocumentTemplateId == TemplateState.RequiredSignatureDocumentTemplateId.Value && d.AppliesToPersonAlias != null && d.AppliesToPersonAlias.PersonId == registrant.PersonAlias.PersonId && d.LastStatusDate.HasValue && d.Status == SignatureDocumentStatus.Signed && d.BinaryFile != null ) .OrderByDescending( d => d.LastStatusDate.Value ) .FirstOrDefault(); if ( signatureDocument != null ) { hfSignedDocumentId.Value = signatureDocument.Id.ToString(); fuSignedDocument.BinaryFileId = signatureDocument.BinaryFileId; } fuSignedDocument.Visible = true; } else { fuSignedDocument.Visible = false; } } else { ppPerson.SetValue( null ); } if ( RegistrantState != null ) { cbCost.Text = RegistrantState.Cost.ToString( "N2" ); cbDiscountApplies.Checked = RegistrantState.DiscountApplies; } } }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { if ( RegistrantState != null ) { RockContext rockContext = new RockContext(); var personService = new PersonService( rockContext ); var registrantService = new RegistrationRegistrantService( rockContext ); var registrantFeeService = new RegistrationRegistrantFeeService( rockContext ); var registrationTemplateFeeService = new RegistrationTemplateFeeService( rockContext ); RegistrationRegistrant registrant = null; if ( RegistrantState.Id > 0 ) { registrant = registrantService.Get( RegistrantState.Id ); } bool newRegistrant = false; var registrantChanges = new List<string>(); if ( registrant == null ) { newRegistrant = true; registrant = new RegistrationRegistrant(); registrant.RegistrationId = RegistrantState.RegistrationId; registrantService.Add( registrant ); registrantChanges.Add( "Created Registrant" ); } if ( !registrant.PersonAliasId.Equals( ppPerson.PersonAliasId ) ) { string prevPerson = ( registrant.PersonAlias != null && registrant.PersonAlias.Person != null ) ? registrant.PersonAlias.Person.FullName : string.Empty; string newPerson = ppPerson.PersonName; History.EvaluateChange( registrantChanges, "Person", prevPerson, newPerson ); } int? personId = ppPerson.PersonId.Value; registrant.PersonAliasId = ppPerson.PersonAliasId.Value; // Get the name of registrant for history string registrantName = "Unknown"; if ( ppPerson.PersonId.HasValue ) { var person = personService.Get( ppPerson.PersonId.Value ); if ( person != null ) { registrantName = person.FullName; } } // set their status (wait list / registrant) registrant.OnWaitList = !tglWaitList.Checked; History.EvaluateChange( registrantChanges, "Cost", registrant.Cost, cbCost.Text.AsDecimal() ); registrant.Cost = cbCost.Text.AsDecimal(); History.EvaluateChange( registrantChanges, "Discount Applies", registrant.DiscountApplies, cbDiscountApplies.Checked ); registrant.DiscountApplies = cbDiscountApplies.Checked; if ( !Page.IsValid ) { return; } // Remove/delete any registrant fees that are no longer in UI with quantity foreach ( var dbFee in registrant.Fees.ToList() ) { if ( !RegistrantState.FeeValues.Keys.Contains( dbFee.RegistrationTemplateFeeId ) || RegistrantState.FeeValues[dbFee.RegistrationTemplateFeeId] == null || !RegistrantState.FeeValues[dbFee.RegistrationTemplateFeeId] .Any( f => f.Option == dbFee.Option && f.Quantity > 0 ) ) { registrantChanges.Add( string.Format( "Removed '{0}' Fee (Quantity:{1:N0}, Cost:{2:C2}, Option:{3}", dbFee.RegistrationTemplateFee.Name, dbFee.Quantity, dbFee.Cost, dbFee.Option ) ); registrant.Fees.Remove( dbFee ); registrantFeeService.Delete( dbFee ); } } // Add/Update any of the fees from UI foreach ( var uiFee in RegistrantState.FeeValues.Where( f => f.Value != null ) ) { foreach ( var uiFeeOption in uiFee.Value ) { var dbFee = registrant.Fees .Where( f => f.RegistrationTemplateFeeId == uiFee.Key && f.Option == uiFeeOption.Option ) .FirstOrDefault(); if ( dbFee == null ) { dbFee = new RegistrationRegistrantFee(); dbFee.RegistrationTemplateFeeId = uiFee.Key; dbFee.Option = uiFeeOption.Option; registrant.Fees.Add( dbFee ); } var templateFee = dbFee.RegistrationTemplateFee; if ( templateFee == null ) { templateFee = registrationTemplateFeeService.Get( uiFee.Key ); } string feeName = templateFee != null ? templateFee.Name : "Fee"; if ( !string.IsNullOrWhiteSpace( uiFeeOption.Option ) ) { feeName = string.Format( "{0} ({1})", feeName, uiFeeOption.Option ); } if ( dbFee.Id <= 0 ) { registrantChanges.Add( feeName + " Fee Added" ); } History.EvaluateChange( registrantChanges, feeName + " Quantity", dbFee.Quantity, uiFeeOption.Quantity ); dbFee.Quantity = uiFeeOption.Quantity; History.EvaluateChange( registrantChanges, feeName + " Cost", dbFee.Cost, uiFeeOption.Cost ); dbFee.Cost = uiFeeOption.Cost; } } if ( TemplateState.RequiredSignatureDocumentTemplate != null ) { var person = new PersonService( rockContext ).Get( personId.Value ); var documentService = new SignatureDocumentService( rockContext ); var binaryFileService = new BinaryFileService( rockContext ); SignatureDocument document = null; int? signatureDocumentId = hfSignedDocumentId.Value.AsIntegerOrNull(); int? binaryFileId = fuSignedDocument.BinaryFileId; if ( signatureDocumentId.HasValue ) { document = documentService.Get( signatureDocumentId.Value ); } if ( document == null && binaryFileId.HasValue ) { var instance = new RegistrationInstanceService( rockContext ).Get( RegistrationInstanceId ); document = new SignatureDocument(); document.SignatureDocumentTemplateId = TemplateState.RequiredSignatureDocumentTemplate.Id; document.AppliesToPersonAliasId = registrant.PersonAliasId.Value; document.AssignedToPersonAliasId = registrant.PersonAliasId.Value; document.Name = string.Format( "{0}_{1}", ( instance != null ? instance.Name : TemplateState.Name ), ( person != null ? person.FullName.RemoveSpecialCharacters() : string.Empty ) ); document.Status = SignatureDocumentStatus.Signed; document.LastStatusDate = RockDateTime.Now; documentService.Add( document ); } if ( document != null ) { int? origBinaryFileId = document.BinaryFileId; document.BinaryFileId = binaryFileId; if ( origBinaryFileId.HasValue && origBinaryFileId.Value != document.BinaryFileId ) { // if a new the binaryFile was uploaded, mark the old one as Temporary so that it gets cleaned up var oldBinaryFile = binaryFileService.Get( origBinaryFileId.Value ); if ( oldBinaryFile != null && !oldBinaryFile.IsTemporary ) { oldBinaryFile.IsTemporary = true; } } // ensure the IsTemporary is set to false on binaryFile associated with this document if ( document.BinaryFileId.HasValue ) { var binaryFile = binaryFileService.Get( document.BinaryFileId.Value ); if ( binaryFile != null && binaryFile.IsTemporary ) { binaryFile.IsTemporary = false; } } } } if ( !registrant.IsValid ) { // Controls will render the error messages return; } // use WrapTransaction since SaveAttributeValues does it's own RockContext.SaveChanges() rockContext.WrapTransaction( () => { rockContext.SaveChanges(); registrant.LoadAttributes(); foreach ( var field in TemplateState.Forms .SelectMany( f => f.Fields .Where( t => t.FieldSource == RegistrationFieldSource.RegistrationAttribute && t.AttributeId.HasValue ) ) ) { var attribute = AttributeCache.Read( field.AttributeId.Value ); if ( attribute != null ) { string originalValue = registrant.GetAttributeValue( attribute.Key ); var fieldValue = RegistrantState.FieldValues .Where( f => f.Key == field.Id ) .Select( f => f.Value.FieldValue ) .FirstOrDefault(); string newValue = fieldValue != null ? fieldValue.ToString() : string.Empty; if ( ( originalValue ?? string.Empty ).Trim() != ( newValue ?? string.Empty ).Trim() ) { string formattedOriginalValue = string.Empty; if ( !string.IsNullOrWhiteSpace( originalValue ) ) { formattedOriginalValue = attribute.FieldType.Field.FormatValue( null, originalValue, attribute.QualifierValues, false ); } string formattedNewValue = string.Empty; if ( !string.IsNullOrWhiteSpace( newValue ) ) { formattedNewValue = attribute.FieldType.Field.FormatValue( null, newValue, attribute.QualifierValues, false ); } History.EvaluateChange( registrantChanges, attribute.Name, formattedOriginalValue, formattedNewValue ); } if ( fieldValue != null ) { registrant.SetAttributeValue( attribute.Key, fieldValue.ToString() ); } } } registrant.SaveAttributeValues( rockContext ); } ); if ( newRegistrant && TemplateState.GroupTypeId.HasValue && ppPerson.PersonId.HasValue ) { using ( var newRockContext = new RockContext() ) { var reloadedRegistrant = new RegistrationRegistrantService( newRockContext ).Get( registrant.Id ); if ( reloadedRegistrant != null && reloadedRegistrant.Registration != null && reloadedRegistrant.Registration.Group != null && reloadedRegistrant.Registration.Group.GroupTypeId == TemplateState.GroupTypeId.Value ) { int? groupRoleId = TemplateState.GroupMemberRoleId.HasValue ? TemplateState.GroupMemberRoleId.Value : reloadedRegistrant.Registration.Group.GroupType.DefaultGroupRoleId; if ( groupRoleId.HasValue ) { var groupMemberService = new GroupMemberService( newRockContext ); var groupMember = groupMemberService .Queryable().AsNoTracking() .Where( m => m.GroupId == reloadedRegistrant.Registration.Group.Id && m.PersonId == reloadedRegistrant.PersonId && m.GroupRoleId == groupRoleId.Value ) .FirstOrDefault(); if ( groupMember == null ) { groupMember = new GroupMember(); groupMemberService.Add( groupMember ); groupMember.GroupId = reloadedRegistrant.Registration.Group.Id; groupMember.PersonId = ppPerson.PersonId.Value; groupMember.GroupRoleId = groupRoleId.Value; groupMember.GroupMemberStatus = TemplateState.GroupMemberStatus; newRockContext.SaveChanges(); registrantChanges.Add( string.Format( "Registrant added to {0} group", reloadedRegistrant.Registration.Group.Name ) ); } else { registrantChanges.Add( string.Format( "Registrant group member reference updated to existing person in {0} group", reloadedRegistrant.Registration.Group.Name ) ); } reloadedRegistrant.GroupMemberId = groupMember.Id; newRockContext.SaveChanges(); } } } } HistoryService.SaveChanges( rockContext, typeof( Registration ), Rock.SystemGuid.Category.HISTORY_EVENT_REGISTRATION.AsGuid(), registrant.RegistrationId, registrantChanges, "Registrant: " + registrantName, null, null ); } NavigateToRegistration(); }
/// <summary> /// Sends the document. /// </summary> /// <param name="document">The document.</param> /// <param name="signatureDocumentTemplate">Type of the signature document.</param> /// <param name="appliesToPerson">The person.</param> /// <param name="assignedToPerson">The assigned to person.</param> /// <param name="documentName">Name of the document.</param> /// <param name="alternateEmail">The alternate email.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> private bool SendDocument( SignatureDocument document, SignatureDocumentTemplate signatureDocumentTemplate, Person appliesToPerson, Person assignedToPerson, string documentName, string alternateEmail, out List<string> errorMessages ) { errorMessages = new List<string>(); // If document was passed and other values were not, set them from the document if ( document != null ) { signatureDocumentTemplate = signatureDocumentTemplate ?? document.SignatureDocumentTemplate; if ( document.AppliesToPersonAlias != null && document.AppliesToPersonAlias.Person != null ) { appliesToPerson = appliesToPerson ?? document.AppliesToPersonAlias.Person; } if ( document.AssignedToPersonAlias != null && document.AssignedToPersonAlias.Person != null ) { assignedToPerson = assignedToPerson ?? document.AppliesToPersonAlias.Person; alternateEmail = !string.IsNullOrWhiteSpace( alternateEmail ) ? alternateEmail : document.AppliesToPersonAlias.Person.Email; } documentName = !string.IsNullOrWhiteSpace( documentName ) ? documentName : document.Name; } if ( signatureDocumentTemplate == null ) { errorMessages.Add( "Invalid Document Type." ); } if ( appliesToPerson == null ) { errorMessages.Add( "Invalid Applies To Person." ); } if ( assignedToPerson == null ) { errorMessages.Add( "Invalid Assigned To Person." ); } if ( !errorMessages.Any() ) { var provider = DigitalSignatureContainer.GetComponent( signatureDocumentTemplate.ProviderEntityType.Name ); if ( provider == null || !provider.IsActive ) { errorMessages.Add( "Digital Signature provider was not found or is not active." ); } else { string email = string.IsNullOrWhiteSpace( alternateEmail ) ? assignedToPerson.Email : alternateEmail; if ( string.IsNullOrWhiteSpace( email ) ) { errorMessages.Add( string.Format( "There is no email address for {0}.", assignedToPerson.FullName ) ); } else { var sendErrors = new List<string>(); var rockContext = this.Context as RockContext; var documentService = new SignatureDocumentService( rockContext ); if ( document == null ) { document = documentService.Queryable() .Where( d => d.SignatureDocumentTemplateId == signatureDocumentTemplate.Id && d.AppliesToPersonAlias.PersonId == appliesToPerson.Id && d.AssignedToPersonAlias.PersonId == assignedToPerson.Id && d.Status != SignatureDocumentStatus.Signed ) .OrderByDescending( d => d.CreatedDateTime ) .FirstOrDefault(); } string documentKey = string.Empty; if ( document == null || string.IsNullOrWhiteSpace( documentKey ) ) { documentKey = provider.CreateDocument( signatureDocumentTemplate, appliesToPerson, assignedToPerson, documentName, out sendErrors, true ); } else { documentKey = document.DocumentKey; provider.ResendDocument( document, out sendErrors ); } if ( document == null ) { document = new SignatureDocument(); document.SignatureDocumentTemplate = signatureDocumentTemplate; document.SignatureDocumentTemplateId = signatureDocumentTemplate.Id; document.Name = documentName; document.AppliesToPersonAliasId = appliesToPerson.PrimaryAliasId; document.AssignedToPersonAliasId = assignedToPerson.PrimaryAliasId; documentService.Add( document ); } if ( !sendErrors.Any() ) { document.DocumentKey = documentKey; document.LastInviteDate = RockDateTime.Now; document.InviteCount = document.InviteCount + 1; if ( document.Status != SignatureDocumentStatus.Sent ) { document.LastStatusDate = document.LastInviteDate; } document.Status = SignatureDocumentStatus.Sent; return true; } else { errorMessages.AddRange( sendErrors ); } } } } return false; }
/// <summary> /// Shows the readonly details. /// </summary> /// <param name="registration">The group.</param> private void ShowReadonlyDetails( Registration registration ) { SetCostLabels( registration ); SetEditMode( false ); var rockContext = new RockContext(); if ( registration.PersonAlias != null && registration.PersonAlias.Person != null ) { lName.Text = registration.PersonAlias.Person.GetAnchorTag( ResolveRockUrl( "/" ) ); } else { lName.Text = string.Format( "{0} {1}", registration.FirstName, registration.LastName ); } lConfirmationEmail.Text = registration.ConfirmationEmail; lConfirmationEmail.Visible = !string.IsNullOrWhiteSpace( registration.ConfirmationEmail ); lbResendConfirmation.Visible = lConfirmationEmail.Visible; if ( registration.Group != null ) { var qryParams = new Dictionary<string, string>(); qryParams.Add( "GroupId", registration.Group.Id.ToString() ); string groupUrl = LinkedPageUrl( "GroupDetailPage", qryParams ); lGroup.Text = string.Format( "<a href='{0}'>{1}</a>", groupUrl, registration.Group.Name ); lGroup.Visible = true; } else { lGroup.Visible = false; } lDiscountCode.Visible = !string.IsNullOrWhiteSpace( registration.DiscountCode ); lDiscountCode.Text = registration.DiscountCode; lDiscountPercent.Visible = registration.DiscountPercentage > 0.0m; lDiscountPercent.Text = registration.DiscountPercentage.ToString("P0"); lDiscountAmount.Visible = registration.DiscountAmount > 0.0m; lDiscountAmount.Text = registration.DiscountAmount.FormatAsCurrency(); RegistrantsState = new List<RegistrantInfo>(); registration.Registrants.ToList().ForEach( r => RegistrantsState.Add( new RegistrantInfo( r, rockContext ) ) ); if ( registration.RegistrationInstance != null && registration.RegistrationInstance.RegistrationTemplate != null && registration.RegistrationInstance.RegistrationTemplate.RequiredSignatureDocumentTemplateId.HasValue ) { var personIds = RegistrantsState.Select( r => r.PersonId ).ToList(); var documents = new SignatureDocumentService( rockContext ) .Queryable().AsNoTracking() .Where( d => d.SignatureDocumentTemplateId == registration.RegistrationInstance.RegistrationTemplate.RequiredSignatureDocumentTemplateId.Value && d.Status == SignatureDocumentStatus.Signed && d.BinaryFileId.HasValue && d.AppliesToPersonAlias != null && personIds.Contains( d.AppliesToPersonAlias.PersonId ) ) .OrderByDescending( d => d.LastStatusDate ) .ToList(); foreach( var registrantInfo in RegistrantsState ) { var document = documents.Where( d => d.AppliesToPersonAlias.PersonId == registrantInfo.PersonId ).FirstOrDefault(); registrantInfo.SignatureDocumentId = document != null ? document.BinaryFileId : (int?)null; registrantInfo.SignatureDocumentLastSent = document != null ? document.LastInviteDate : (DateTime?)null; } } PercentageDiscountExists = registration.DiscountPercentage > 0.0m; BuildFeeTable( registration ); pnlPaymentDetails.Visible = false; pnlPaymentInfo.Visible = false; BuildRegistrationControls( true ); bool anyPayments = registration.Payments.Any(); hfHasPayments.Value = anyPayments.ToString(); foreach ( RockWeb.Blocks.Finance.TransactionList block in RockPage.RockBlocks.Where( a => a is RockWeb.Blocks.Finance.TransactionList ) ) { block.SetVisible( anyPayments ); } lbAddRegistrant.Visible = EditAllowed; BindPaymentsGrid(); }
private void SaveGroupMember() { if ( Page.IsValid ) { var rockContext = new RockContext(); // Verify valid group var groupService = new GroupService( rockContext ); var group = groupService.Get( hfGroupId.ValueAsInt() ); if ( group == null ) { nbErrorMessage.Title = "Please select a Role"; return; } // Check to see if a person was selected int? personId = ppGroupMemberPerson.PersonId; int? personAliasId = ppGroupMemberPerson.PersonAliasId; if ( !personId.HasValue || !personAliasId.HasValue ) { nbErrorMessage.Title = "Please select a Person"; return; } // check to see if the user selected a role var role = new GroupTypeRoleService( rockContext ).Get( ddlGroupRole.SelectedValueAsInt() ?? 0 ); if ( role == null ) { nbErrorMessage.Title = "Please select a Role"; return; } var groupMemberService = new GroupMemberService( rockContext ); var groupMemberRequirementService = new GroupMemberRequirementService( rockContext ); GroupMember groupMember; int groupMemberId = int.Parse( hfGroupMemberId.Value ); // if adding a new group member if ( groupMemberId.Equals( 0 ) ) { groupMember = new GroupMember { Id = 0 }; groupMember.GroupId = group.Id; } else { // load existing group member groupMember = groupMemberService.Get( groupMemberId ); } groupMember.PersonId = personId.Value; groupMember.GroupRoleId = role.Id; groupMember.Note = tbNote.Text; groupMember.GroupMemberStatus = rblStatus.SelectedValueAsEnum<GroupMemberStatus>(); if ( cbIsNotified.Visible ) { groupMember.IsNotified = cbIsNotified.Checked; } if ( pnlRequirements.Visible ) { foreach ( var checkboxItem in cblManualRequirements.Items.OfType<ListItem>() ) { int groupRequirementId = checkboxItem.Value.AsInteger(); var groupMemberRequirement = groupMember.GroupMemberRequirements.FirstOrDefault( a => a.GroupRequirementId == groupRequirementId ); bool metRequirement = checkboxItem.Selected; if ( metRequirement ) { if ( groupMemberRequirement == null ) { groupMemberRequirement = new GroupMemberRequirement(); groupMemberRequirement.GroupRequirementId = groupRequirementId; groupMember.GroupMemberRequirements.Add( groupMemberRequirement ); } // set the RequirementMetDateTime if it hasn't been set already groupMemberRequirement.RequirementMetDateTime = groupMemberRequirement.RequirementMetDateTime ?? RockDateTime.Now; groupMemberRequirement.LastRequirementCheckDateTime = RockDateTime.Now; } else { if ( groupMemberRequirement != null ) { // doesn't meets the requirement groupMemberRequirement.RequirementMetDateTime = null; groupMemberRequirement.LastRequirementCheckDateTime = RockDateTime.Now; } } } } if ( group.RequiredSignatureDocumentTemplate != null ) { var person = new PersonService( rockContext ).Get( personId.Value ); var documentService = new SignatureDocumentService( rockContext ); var binaryFileService = new BinaryFileService( rockContext ); SignatureDocument document = null; int? signatureDocumentId = hfSignedDocumentId.Value.AsIntegerOrNull(); int? binaryFileId = fuSignedDocument.BinaryFileId; if ( signatureDocumentId.HasValue ) { document = documentService.Get( signatureDocumentId.Value ); } if ( document == null && binaryFileId.HasValue ) { document = new SignatureDocument(); document.SignatureDocumentTemplateId = group.RequiredSignatureDocumentTemplate.Id; document.AppliesToPersonAliasId = personAliasId.Value; document.AssignedToPersonAliasId = personAliasId.Value; document.Name = string.Format( "{0}_{1}", group.Name.RemoveSpecialCharacters(), ( person != null ? person.FullName.RemoveSpecialCharacters() : string.Empty ) ); document.Status = SignatureDocumentStatus.Signed; document.LastStatusDate = RockDateTime.Now; documentService.Add( document ); } if ( document != null ) { int? origBinaryFileId = document.BinaryFileId; document.BinaryFileId = binaryFileId; if ( origBinaryFileId.HasValue && origBinaryFileId.Value != document.BinaryFileId ) { // if a new the binaryFile was uploaded, mark the old one as Temporary so that it gets cleaned up var oldBinaryFile = binaryFileService.Get( origBinaryFileId.Value ); if ( oldBinaryFile != null && !oldBinaryFile.IsTemporary ) { oldBinaryFile.IsTemporary = true; } } // ensure the IsTemporary is set to false on binaryFile associated with this document if ( document.BinaryFileId.HasValue ) { var binaryFile = binaryFileService.Get( document.BinaryFileId.Value ); if ( binaryFile != null && binaryFile.IsTemporary ) { binaryFile.IsTemporary = false; } } } } groupMember.LoadAttributes(); Rock.Attribute.Helper.GetEditValues( phAttributes, groupMember ); if ( !Page.IsValid ) { return; } // if the groupMember IsValid is false, and the UI controls didn't report any errors, it is probably because the custom rules of GroupMember didn't pass. // So, make sure a message is displayed in the validation summary cvGroupMember.IsValid = groupMember.IsValid; if ( !cvGroupMember.IsValid ) { cvGroupMember.ErrorMessage = groupMember.ValidationResults.Select( a => a.ErrorMessage ).ToList().AsDelimited( "<br />" ); return; } // using WrapTransaction because there are three Saves rockContext.WrapTransaction( () => { if ( groupMember.Id.Equals( 0 ) ) { groupMemberService.Add( groupMember ); } rockContext.SaveChanges(); groupMember.SaveAttributeValues( rockContext ); } ); groupMember.CalculateRequirements( rockContext, true ); if ( group.IsSecurityRole || group.GroupType.Guid.Equals( Rock.SystemGuid.GroupType.GROUPTYPE_SECURITY_ROLE.AsGuid() ) ) { Rock.Security.Role.Flush( group.Id ); } } }
/// <summary> /// Called by the <see cref="IScheduler" /> when a <see cref="ITrigger" /> /// fires that is associated with the <see cref="IJob" />. /// </summary> /// <param name="context">The execution context.</param> /// <remarks> /// The implementation may wish to set a result object on the /// JobExecutionContext before this method exits. The result itself /// is meaningless to Quartz, but may be informative to /// <see cref="IJobListener" />s or /// <see cref="ITriggerListener" />s that are watching the job's /// execution. /// </remarks> public virtual void Execute( IJobExecutionContext context ) { JobDataMap dataMap = context.JobDetail.JobDataMap; int resendDays = dataMap.GetString( "ResendInviteAfterNumberDays" ).AsIntegerOrNull() ?? 5; int maxInvites = dataMap.GetString( "MaxInvites" ).AsIntegerOrNull() ?? 2; int checkDays = dataMap.GetString( "CheckForSignatureDays" ).AsIntegerOrNull() ?? 30; string folderPath = System.Web.Hosting.HostingEnvironment.MapPath( "~/App_Data/Cache/SignNow" ); var errorMessages = new List<string>(); int signatureRequestsSent = 0; int documentsUpdated = 0; // Send documents using ( var rockContext = new RockContext() ) { var maxInviteDate = RockDateTime.Today.AddDays( 0 - resendDays ); var maxCheckDays = RockDateTime.Today.AddDays( 0 - checkDays ); var docTypeService = new SignatureDocumentTemplateService( rockContext ); var docService = new SignatureDocumentService( rockContext ); // Check for status updates foreach ( var document in new SignatureDocumentService( rockContext ).Queryable() .Where( d => ( d.Status == SignatureDocumentStatus.Sent || ( d.Status == SignatureDocumentStatus.Signed && !d.BinaryFileId.HasValue ) ) && d.LastInviteDate.HasValue && d.LastInviteDate.Value > maxCheckDays ) .ToList() ) { var updateErrorMessages = new List<string>(); var status = document.Status; int? binaryFileId = document.BinaryFileId; if ( docTypeService.UpdateDocumentStatus( document, folderPath, out updateErrorMessages ) ) { if ( status != document.Status || !binaryFileId.Equals( document.BinaryFileId ) ) { rockContext.SaveChanges(); documentsUpdated++; } } else { errorMessages.AddRange( updateErrorMessages ); } } // Send any needed signature requests var docsSent = new Dictionary<int, List<int>>(); foreach ( var gm in new GroupMemberService( rockContext ).Queryable() .Where( m => m.GroupMemberStatus == GroupMemberStatus.Active && m.Group.IsActive && m.Person.Email != null && m.Person.Email != "" && m.Group.RequiredSignatureDocumentTemplate != null && !m.Group.RequiredSignatureDocumentTemplate.Documents.Any( d => d.AppliesToPersonAlias.PersonId == m.PersonId && d.Status == SignatureDocumentStatus.Signed ) ) .Select( m => new { GroupName = m.Group.Name, Person = m.Person, DocumentType = m.Group.RequiredSignatureDocumentTemplate } ) .ToList() ) { if ( docsSent.ContainsKey( gm.Person.Id ) ) { if ( docsSent[gm.Person.Id].Contains( gm.DocumentType.Id ) ) { continue; } else { docsSent[gm.Person.Id].Add( gm.DocumentType.Id ); } } else { docsSent.Add( gm.Person.Id, new List<int> { gm.DocumentType.Id } ); } var document = docService.Queryable() .Where( d => d.SignatureDocumentTemplateId == gm.DocumentType.Id && d.AppliesToPersonAlias.PersonId == gm.Person.Id && d.AssignedToPersonAlias.PersonId == gm.Person.Id && d.Status != SignatureDocumentStatus.Signed ) .OrderByDescending( d => d.CreatedDateTime ) .FirstOrDefault(); if ( document == null || ( document.InviteCount < maxInvites && document.LastInviteDate < maxInviteDate ) ) { string documentName = string.Format( "{0}_{1}", gm.GroupName.RemoveSpecialCharacters(), gm.Person.FullName.RemoveSpecialCharacters() ); var sendErrorMessages = new List<string>(); if ( document != null ) { docTypeService.SendDocument( document, gm.Person.Email, out sendErrorMessages ); } else { docTypeService.SendDocument( gm.DocumentType, gm.Person, gm.Person, documentName, gm.Person.Email, out sendErrorMessages ); } if ( !errorMessages.Any() ) { rockContext.SaveChanges(); signatureRequestsSent++; } else { errorMessages.AddRange( sendErrorMessages ); } } } } if ( errorMessages.Any() ) { throw new Exception( "One or more exceptions occurred processing signature documents..." + Environment.NewLine + errorMessages.AsDelimited( Environment.NewLine ) ); } context.Result = string.Format( "{0} signature requests sent; {1} existing document's status updated", signatureRequestsSent, documentsUpdated ); }
/// <summary> /// Sends the document. /// </summary> /// <param name="document">The document.</param> /// <param name="signatureDocumentTemplate">Type of the signature document.</param> /// <param name="appliesToPerson">The person.</param> /// <param name="assignedToPerson">The assigned to person.</param> /// <param name="documentName">Name of the document.</param> /// <param name="alternateEmail">The alternate email.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> private bool SendDocument(SignatureDocument document, SignatureDocumentTemplate signatureDocumentTemplate, Person appliesToPerson, Person assignedToPerson, string documentName, string alternateEmail, out List <string> errorMessages) { errorMessages = new List <string>(); // If document was passed and other values were not, set them from the document if (document != null) { signatureDocumentTemplate = signatureDocumentTemplate ?? document.SignatureDocumentTemplate; if (document.AppliesToPersonAlias != null && document.AppliesToPersonAlias.Person != null) { appliesToPerson = appliesToPerson ?? document.AppliesToPersonAlias.Person; } if (document.AssignedToPersonAlias != null && document.AssignedToPersonAlias.Person != null) { assignedToPerson = assignedToPerson ?? document.AssignedToPersonAlias.Person; alternateEmail = !string.IsNullOrWhiteSpace(alternateEmail) ? alternateEmail : document.AssignedToPersonAlias.Person.Email; } documentName = !string.IsNullOrWhiteSpace(documentName) ? documentName : document.Name; } if (signatureDocumentTemplate == null) { errorMessages.Add("Invalid Document Type."); } if (appliesToPerson == null) { errorMessages.Add("Invalid Applies To Person."); } if (assignedToPerson == null) { errorMessages.Add("Invalid Assigned To Person."); } if (!errorMessages.Any()) { var provider = DigitalSignatureContainer.GetComponent(signatureDocumentTemplate.ProviderEntityType.Name); if (provider == null || !provider.IsActive) { errorMessages.Add("Digital Signature provider was not found or is not active."); } else { string email = string.IsNullOrWhiteSpace(alternateEmail) ? assignedToPerson.Email : alternateEmail; if (string.IsNullOrWhiteSpace(email)) { errorMessages.Add(string.Format("There is no email address for {0}.", assignedToPerson.FullName)); } else { var sendErrors = new List <string>(); var rockContext = this.Context as RockContext; var documentService = new SignatureDocumentService(rockContext); if (document == null) { document = documentService.Queryable() .Where(d => d.SignatureDocumentTemplateId == signatureDocumentTemplate.Id && d.AppliesToPersonAlias.PersonId == appliesToPerson.Id && d.AssignedToPersonAlias.PersonId == assignedToPerson.Id && d.Status != SignatureDocumentStatus.Signed) .OrderByDescending(d => d.CreatedDateTime) .FirstOrDefault(); } string documentKey = string.Empty; if (document == null) { documentKey = provider.CreateDocument(signatureDocumentTemplate, appliesToPerson, assignedToPerson, documentName, out sendErrors, true); } else { documentKey = document.DocumentKey; provider.ResendDocument(document, out sendErrors); } if (document == null) { document = new SignatureDocument(); document.SignatureDocumentTemplate = signatureDocumentTemplate; document.SignatureDocumentTemplateId = signatureDocumentTemplate.Id; document.Name = documentName; document.AppliesToPersonAliasId = appliesToPerson.PrimaryAliasId; document.AssignedToPersonAliasId = assignedToPerson.PrimaryAliasId; documentService.Add(document); } if (!sendErrors.Any()) { document.DocumentKey = documentKey; document.LastInviteDate = RockDateTime.Now; document.InviteCount = document.InviteCount + 1; if (document.Status != SignatureDocumentStatus.Sent) { document.LastStatusDate = document.LastInviteDate; } document.Status = SignatureDocumentStatus.Sent; return(true); } else { errorMessages.AddRange(sendErrors); } } } } return(false); }