/// <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> /// Handles the Click event of the btnDelete 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 btnDelete_Click(object sender, EventArgs e) { RockContext rockContext = new RockContext(); SignatureDocumentTemplateService signatureDocumentTemplateService = new SignatureDocumentTemplateService(rockContext); SignatureDocumentTemplate signatureDocumentTemplate = signatureDocumentTemplateService.Get(int.Parse(hfSignatureDocumentTemplateId.Value)); if (signatureDocumentTemplate != null) { if (!signatureDocumentTemplate.IsAuthorized(Authorization.EDIT, this.CurrentPerson)) { mdDeleteWarning.Show("Sorry, You are not authorized to delete this document template.", ModalAlertType.Information); return; } string errorMessage; if (!signatureDocumentTemplateService.CanDelete(signatureDocumentTemplate, out errorMessage)) { mdDeleteWarning.Show(errorMessage, ModalAlertType.Information); return; } signatureDocumentTemplateService.Delete(signatureDocumentTemplate); rockContext.SaveChanges(); } NavigateToParentPage(); }
/// <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.SignatureDocumentTemplateId == SignatureDocumentTemplateId && 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> /// Handles the Click event of the btnEdit 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 btnEdit_Click(object sender, EventArgs e) { SignatureDocumentTemplateService signatureDocumentTemplateService = new SignatureDocumentTemplateService(new RockContext()); SignatureDocumentTemplate SignatureDocumentTemplate = signatureDocumentTemplateService.Get(hfSignatureDocumentTemplateId.ValueAsInt()); ShowEditDetails(SignatureDocumentTemplate); }
/// <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(); } } } } }
private void BindSttingControlls() { dpEndDate.Text = GetBlockUserPreference("dpEndDate"); RockContext rockContext = new RockContext(); SignatureDocumentTemplateService signatureDocumentTemplateService = new SignatureDocumentTemplateService(rockContext); var templates = signatureDocumentTemplateService.Queryable().ToList(); cblMinorDocuments.DataSource = templates; cblAdultDocuments.DataSource = templates; cblMinorDocuments.DataBind(); cblAdultDocuments.DataBind(); var minorValues = GetBlockUserPreference("cblMinorDocuments"); if (minorValues.IsNotNullOrWhiteSpace()) { cblMinorDocuments.SetValues(minorValues.Split(',')); } var adultValues = GetBlockUserPreference("cblAdultDocuments"); if (adultValues.IsNotNullOrWhiteSpace()) { cblAdultDocuments.SetValues(adultValues.Split(',')); } gpGroup.SetValue(GetBlockUserPreference("gpGroup").AsInteger()); }
/// <summary> /// Binds the grid for signature document templates. /// </summary> private void BindGrid() { var queryable = new SignatureDocumentTemplateService(new RockContext()).Queryable(); SortProperty sortProperty = gSignatureDocumentTemplate.SortProperty; if (sortProperty != null) { if (sortProperty.Property == "Documents") { if (sortProperty.Direction == SortDirection.Ascending) { queryable = queryable.OrderBy(a => a.Documents.Count()); } else { queryable = queryable.OrderByDescending(a => a.Documents.Count()); } } queryable = queryable.Sort(sortProperty); } else { queryable = queryable.OrderBy(a => a.Name); } var types = new List <SignatureDocumentTemplate>(); foreach (var type in queryable) { if (type.IsAuthorized(Authorization.VIEW, CurrentPerson)) { types.Add(type); } } gSignatureDocumentTemplate.DataSource = types .Select(a => new { a.Id, a.Name, a.Description, BinaryFileType = a.BinaryFileType.Name, a.ProviderTemplateKey, Documents = a.Documents.Count() }) .ToList(); gSignatureDocumentTemplate.DataBind(); }
/// <summary> /// Handles the Click event of the btnCancelType 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 btnCancelType_Click(object sender, EventArgs e) { if (hfSignatureDocumentTemplateId.IsZero()) { // Cancelling on Add. Return to Grid NavigateToParentPage(); } else { // Cancelling on Edit. Return to Details SignatureDocumentTemplateService signatureDocumentTemplateService = new SignatureDocumentTemplateService(new RockContext()); SignatureDocumentTemplate signatureDocumentTemplate = signatureDocumentTemplateService.Get(hfSignatureDocumentTemplateId.ValueAsInt()); ShowReadonlyDetails(signatureDocumentTemplate); } }
/// <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 btnSaveType_Click(object sender, EventArgs e) { var rockContext = new RockContext(); SignatureDocumentTemplate signatureDocumentTemplate = null; SignatureDocumentTemplateService typeService = new SignatureDocumentTemplateService(rockContext); int SignatureDocumentTemplateId = hfSignatureDocumentTemplateId.ValueAsInt(); if (SignatureDocumentTemplateId == 0) { signatureDocumentTemplate = new SignatureDocumentTemplate(); typeService.Add(signatureDocumentTemplate); } else { signatureDocumentTemplate = typeService.Get(SignatureDocumentTemplateId); } signatureDocumentTemplate.Name = tbTypeName.Text; signatureDocumentTemplate.Description = tbTypeDescription.Text; signatureDocumentTemplate.BinaryFileTypeId = bftpFileType.SelectedValueAsInt(); signatureDocumentTemplate.ProviderEntityTypeId = cpProvider.SelectedEntityTypeId; signatureDocumentTemplate.ProviderTemplateKey = ddlTemplate.SelectedValue; signatureDocumentTemplate.InviteSystemEmailId = ddlSystemEmail.SelectedValueAsInt(); if (!signatureDocumentTemplate.IsValid) { // Controls will render the error messages return; } rockContext.SaveChanges(); var qryParams = new Dictionary <string, string>(); qryParams["SignatureDocumentTemplateId"] = signatureDocumentTemplate.Id.ToString(); NavigateToCurrentPage(qryParams); }
/// <summary> /// Shows the detail. /// </summary> /// <param name="signatureDocumentTemplateId">The signature document type identifier.</param> public void ShowDetail(int signatureDocumentTemplateId) { pnlDetails.Visible = true; SignatureDocumentTemplate signatureDocumentTemplate = null; using (var rockContext = new RockContext()) { if (!signatureDocumentTemplateId.Equals(0)) { signatureDocumentTemplate = new SignatureDocumentTemplateService(rockContext).Get(signatureDocumentTemplateId); } if (signatureDocumentTemplate == null) { signatureDocumentTemplate = new SignatureDocumentTemplate { Id = 0 }; var components = DigitalSignatureContainer.Instance.Components; var entityType = components.Where(c => c.Value.Value.IsActive).OrderBy(c => c.Value.Value.Order).Select(c => c.Value.Value.EntityType).FirstOrDefault(); if (entityType != null) { signatureDocumentTemplate.ProviderEntityType = new EntityTypeService(rockContext).Get(entityType.Id); } Guid?fileTypeGuid = GetAttributeValue("DefaultFileType").AsGuidOrNull(); if (fileTypeGuid.HasValue) { var binaryFileType = new BinaryFileTypeService(rockContext).Get(fileTypeGuid.Value); if (binaryFileType != null) { signatureDocumentTemplate.BinaryFileType = binaryFileType; signatureDocumentTemplate.BinaryFileTypeId = binaryFileType.Id; } } Guid?inviteEmailGuid = GetAttributeValue("DefaultInviteEmail").AsGuidOrNull(); if (inviteEmailGuid.HasValue) { var systemEmail = new SystemEmailService(rockContext).Get(inviteEmailGuid.Value); if (systemEmail != null) { signatureDocumentTemplate.InviteSystemEmail = systemEmail; signatureDocumentTemplate.InviteSystemEmailId = systemEmail.Id; } } } hfSignatureDocumentTemplateId.SetValue(signatureDocumentTemplate.Id); // render UI based on Authorized and IsSystem bool readOnly = false; nbEditModeMessage.Text = string.Empty; bool canEdit = UserCanEdit || signatureDocumentTemplate.IsAuthorized(Authorization.EDIT, CurrentPerson); bool canView = canEdit || signatureDocumentTemplate.IsAuthorized(Authorization.VIEW, CurrentPerson); if (!canView) { pnlDetails.Visible = false; } else { pnlDetails.Visible = true; if (!canEdit) { readOnly = true; nbEditModeMessage.Text = EditModeMessage.ReadOnlyEditActionNotAllowed(SignatureDocumentTemplate.FriendlyTypeName); } if (readOnly) { btnEdit.Visible = false; btnDelete.Visible = false; ShowReadonlyDetails(signatureDocumentTemplate); } else { btnEdit.Visible = true; btnDelete.Visible = false; if (signatureDocumentTemplate.Id > 0) { ShowReadonlyDetails(signatureDocumentTemplate); } else { ShowEditDetails(signatureDocumentTemplate); } } } } }
/// <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.Group.IsArchived && 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> /// 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> /// Executes the action. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages) { errorMessages = new List <string>(); var documentTemplateId = GetAttributeValue(action, AttributeKeys.DocumentTemplate).AsIntegerOrNull(); Person person = null; DigitalSignatureComponent DigitalSignatureComponent = null; // get person Guid?personAttributeGuid = GetAttributeValue(action, AttributeKeys.Person).AsGuidOrNull(); if (personAttributeGuid.HasValue) { Guid?personAliasGuid = action.GetWorkflowAttributeValue(personAttributeGuid.Value).AsGuidOrNull(); if (personAliasGuid.HasValue) { var personAlias = new PersonAliasService(rockContext).Get(personAliasGuid.Value); if (personAlias != null) { person = personAlias.Person; } } } if (person == null) { errorMessages.Add("There is no person set on the attribute. Please try again."); return(false); } if (string.IsNullOrWhiteSpace(person.Email)) { errorMessages.Add("There is no valid email address set on the person."); return(false); } if (documentTemplateId.HasValue) { var signatureDocument = new SignatureDocumentService(rockContext) .Queryable().AsNoTracking() .Where(d => d.SignatureDocumentTemplateId == documentTemplateId.Value && d.AppliesToPersonAlias != null && d.AppliesToPersonAlias.PersonId == person.Id && d.LastStatusDate.HasValue && d.Status == SignatureDocumentStatus.Signed && d.BinaryFile != null) .OrderByDescending(d => d.LastStatusDate.Value) .FirstOrDefault(); var documentTemplate = new SignatureDocumentTemplateService(rockContext).Get(documentTemplateId.Value); if (documentTemplate.ProviderEntityType != null) { var provider = DigitalSignatureContainer.GetComponent(documentTemplate.ProviderEntityType.Name); if (provider != null && provider.IsActive) { DigitalSignatureComponent = provider; } } if (documentTemplate != null && signatureDocument != null) { // get the attribute to store the document/file guid var signatureDocumentAttributeGuid = GetAttributeValue(action, AttributeKeys.SignatureDocument).AsGuidOrNull(); if (signatureDocumentAttributeGuid.HasValue) { var signatureDocumentAttribute = AttributeCache.Get(signatureDocumentAttributeGuid.Value, rockContext); if (signatureDocumentAttribute != null) { if (signatureDocumentAttribute.FieldTypeId == FieldTypeCache.Get(Rock.SystemGuid.FieldType.FILE.AsGuid(), rockContext).Id) { SetWorkflowAttributeValue(action, signatureDocumentAttributeGuid.Value, signatureDocument.BinaryFile.Guid.ToString()); return(true); } else { errorMessages.Add("Invalid field type for signature document attribute set."); return(false); } } else { errorMessages.Add("Invalid signature document attribute set."); return(false); } } else { errorMessages.Add("Signature document attribute must be set."); return(false); } } else if (DigitalSignatureComponent != null) { var sendDocumentTxn = new Rock.Transactions.SendDigitalSignatureRequestTransaction(); sendDocumentTxn.SignatureDocumentTemplateId = documentTemplateId.Value; sendDocumentTxn.AppliesToPersonAliasId = person.PrimaryAliasId ?? 0; sendDocumentTxn.AssignedToPersonAliasId = person.PrimaryAliasId ?? 0; sendDocumentTxn.DocumentName = string.Format("{0}_{1}", action.Activity.Workflow.Name.RemoveSpecialCharacters(), person.FullName.RemoveSpecialCharacters()); sendDocumentTxn.Email = person.Email; Rock.Transactions.RockQueue.TransactionQueue.Enqueue(sendDocumentTxn); return(true); } else { errorMessages.Add("There was an error loading the Digital Signature component, please check your document template."); return(false); } } else { errorMessages.Add("There was no valid document template id set on this action"); return(false); } }