private void EditComplete(TicketComment comment) { if (TicketEditCompleted != null) { TicketEditCompleted(comment); } }
private void ActivityComplete(TicketComment comment) { if (TicketActivityCompleted != null) { TicketActivityCompleted(comment); } }
partial void UpdateTicketComment(TicketComment instance) { string user = HttpContext.Current.User.Identity.GetFormattedUserName(); DateTime dt = DateTime.Now; instance.CommentedBy = user; instance.CommentedDate = dt; instance.Ticket.LastUpdateBy = user; instance.Ticket.LastUpdateDate = dt; ExecuteDynamicUpdate(instance); }
partial void InsertTicketComment(TicketComment instance) { string user = HttpContext.Current.User.Identity.GetFormattedUserName(); DateTime dt = DateTime.Now; instance.CommentedBy = user; instance.CommentedDate = dt; instance.Ticket.LastUpdateBy = user; instance.Ticket.LastUpdateDate = dt; ExecuteDynamicInsert(instance); }
/// <summary> /// Queues the ticket event notification. /// </summary> /// <param name="comment">The comment associated with the event.</param> public static void QueueTicketEventNotification(TicketComment comment) { lock (registerLock) { string enabled = ConfigurationManager.AppSettings["EnableEmailNotifications"]; if (!string.IsNullOrEmpty(enabled) && Convert.ToBoolean(enabled)) { TicketDataDataContext ctx = new TicketDataDataContext(); var ticket = comment.Ticket; var newNotes = ticket.CreateTicketEventNotificationsForComment(comment.CommentId, comment.CommentedBy); foreach (var note in newNotes) { note.CreatedDate = DateTime.Now; note.DeliveryAttempts = 0; if (note.NotifyEmail == "invalid")//notes with invalid email still added to table, but squash delivery schedule. { note.Status = "invalid"; note.NextDeliveryAttemptDate = null; note.LastDeliveryAttemptDate = DateTime.Now; } else { note.Status = "queued"; var now = DateTime.Now; note.NextDeliveryAttemptDate = now; if (note.NotifyUserReason != "HelpDesk")// for non-broadcasts to helpdesk schedule on the delay { string delay = ConfigurationManager.AppSettings["EmailNotificationInitialDelayMinutes"]; if (!string.IsNullOrEmpty(delay)) { note.NextDeliveryAttemptDate = now.AddMinutes(Convert.ToDouble(delay)); } } } } ctx.TicketEventNotifications.InsertAllOnSubmit(newNotes); ctx.SubmitChanges(); //Deliver helpdesk broadcasts NOW! New ticket notifications for help desk only // happen for brand-new tickets. These users aren't included on further changes // to the ticket either so there is no reason to wait for consolidations. // // Since the creation of notes ensures that tickets with a reason of "HelpDesk" // are only for tickets where the recipient is not the owner/assigned user we // don't have to worry about suppressions or consolidations; we can directly // send without worrying about the pre-processing that happens with timer // triggered mechanism. foreach (var note in newNotes) { if (note.NotifyUserReason == "HelpDesk" && note.NextDeliveryAttemptDate != null) { SendTicketEventNotificationEmail(ctx, note, new List<TicketEventNotification>()); } } } } }
partial void DeleteTicketComment(TicketComment instance);
partial void UpdateTicketComment(TicketComment instance);
partial void InsertTicketComment(TicketComment instance);
private TicketComment PerformActivity() { List<string> eventDetailItems = null; string eventText = null; if (CheckIsActivityAllowed()) { switch (Activity) { case "NoChanges": break; case "EditTicket": eventText = "has edited ticket fields"; break; case "AddComment": if (EnforceRequiredComment()) { if (ResolvedCheckBoxContainer.Visible && ResolveCheckBox.Checked) { eventText = ResolveTicket(eventText); } else { eventText = "added comment"; } } break; case "AddAttachments": eventDetailItems = new List<string>(); HttpFileCollection uploadedFiles = Request.Files; var newFiles = 0; var updatedFiles = 0; var removedFiles = 0; for (int i = 0; i < uploadedFiles.Count; i++) { HttpPostedFile userPostedFile = uploadedFiles[i]; if (userPostedFile.ContentLength > 0) { newFiles++; TicketAttachment attachment = new TicketAttachment(); string fName = Path.GetFileName(userPostedFile.FileName);//FileUploader.FileName; attachment.FileName = fName; var description = Page.Request.Form[fName]; if (!string.IsNullOrEmpty(description)) { if (description.Length > 500) { attachment.FileDescription = description.Substring(0, 500); } else { attachment.FileDescription = description; } } attachment.FileSize = userPostedFile.ContentLength;//FileUploader.PostedFile.ContentLength; string mtype = userPostedFile.ContentType; attachment.FileType = (string.IsNullOrEmpty(mtype) ? "application/octet-stream" : mtype); byte[] fileContent = new byte[userPostedFile.ContentLength]; userPostedFile.InputStream.Read(fileContent, 0, userPostedFile.ContentLength);//FileUploader.FileBytes; attachment.FileContents = fileContent; TicketToDisplay.TicketAttachments.Add(attachment); eventDetailItems.Add(string.Format("New attachment: {0}", attachment.FileName)); } foreach (RepeaterItem item in AttachmentsRepeater.Items) { if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem) { var AttachmentUpdateId = (HiddenField)item.FindControl("AttachmentUpdateId"); var AttachmentDescription = (TextBox)item.FindControl("AttachmentDescription"); var DeleteAttachmentCheckBox = (CheckBox)item.FindControl("DeleteAttachmentCheckBox"); var modAttachment = TicketToDisplay.TicketAttachments.SingleOrDefault(ta => ta.FileId == Convert.ToInt32(AttachmentUpdateId.Value)); if (DeleteAttachmentCheckBox.Checked) { eventDetailItems.Add(string.Format("Removed attachment: {0}", modAttachment.FileName)); removedFiles++; DeleteTicketAttachment(modAttachment.FileId); //TicketToDisplay.TicketAttachments.Remove(modAttachment); eventText = "removed attachment"; } else if (modAttachment.FileDescription != AttachmentDescription.Text) { eventDetailItems.Add(string.Format("Updated attachment: {0}", modAttachment.FileName)); updatedFiles++; modAttachment.FileDescription = AttachmentDescription.Text; eventText = "updated attachment description"; } } } if ((newFiles + removedFiles + updatedFiles) > 0) { eventText = "modified ticket attachments"; } } break; case "SupplyInfo": if (EnforceRequiredComment()) { if (SupplyInfoActivateTicketCheckBox.Checked) { eventText = "has provided more information"; TicketToDisplay.CurrentStatus = "Active"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } else { eventText = "added comment"; } } break; case "Resolve": if (EnforceRequiredComment()) { eventText = ResolveTicket(eventText); } break; case "RequestMoreInfo": if (EnforceRequiredComment()) { eventText = "has requested more information"; TicketToDisplay.CurrentStatus = "More Info"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } break; case "CancelMoreInfo": eventText = GetOptionalCommentEventText("has cancelled the request for more information"); TicketToDisplay.CurrentStatus = "Active"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; break; case "CloseTicket": eventText = GetOptionalCommentEventText("has closed the ticket"); TicketToDisplay.CurrentStatus = "Closed"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; break; case "ReopenTicket": if (EnforceRequiredComment()) { eventText = "has re-opened the ticket"; if ((SecurityManager.IsStaff && Page.User.Identity.GetFormattedUserName() != TicketToDisplay.Owner && ReopenOwnedByMe.Checked) || (!SecurityManager.IsStaff && Page.User.Identity.GetFormattedUserName() != TicketToDisplay.Owner)) { TicketToDisplay.Owner = Page.User.Identity.GetFormattedUserName(); eventText = eventText + " as the owner"; } if (SecurityManager.IsStaff && ReopenAssignToMe.Checked) { TicketToDisplay.AssignedTo = Page.User.Identity.GetFormattedUserName(); eventText = eventText + " and assigned it to themself"; } else { TicketToDisplay.AssignedTo = null; } TicketToDisplay.CurrentStatus = "Active"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } break; case "TakeOver": string oldAssigned = TicketToDisplay.AssignedTo; if (!string.IsNullOrEmpty(oldAssigned)) { eventText = GetOptionalCommentEventText(string.Format("has taken over the ticket from {0}", SecurityManager.GetUserDisplayName(oldAssigned))); } else { eventText = GetOptionalCommentEventText("has taken over the ticket"); } TicketToDisplay.AssignedTo = Page.User.Identity.GetFormattedUserName(); break; case "Assign": string oldAssignedDisplay = SecurityManager.GetUserDisplayName(TicketToDisplay.AssignedTo); string newAssignedDisplay = SecurityManager.GetUserDisplayName(AssignDropDownList.SelectedValue); if (string.IsNullOrEmpty(TicketToDisplay.AssignedTo)) { eventText = string.Format("assigned the ticket to {0}", newAssignedDisplay); } else if (TicketToDisplay.AssignedTo == Page.User.Identity.Name) { eventText = string.Format("passed the ticket to {0}", newAssignedDisplay); } else { eventText = string.Format("reassigned the ticket from {0} to {1}", oldAssignedDisplay, newAssignedDisplay); } if (TicketToDisplay.Priority != PriorityEdit.SelectedValue) { TicketToDisplay.Priority = PriorityEdit.SelectedValue; eventText = string.Format("{0} at a priority of {1}", eventText, TicketToDisplay.Priority); } eventText = GetOptionalCommentEventText(eventText); TicketToDisplay.AssignedTo = AssignDropDownList.SelectedValue; break; case "GiveUp": if (EnforceRequiredComment()) { eventText = "has given up on the ticket"; TicketToDisplay.AssignedTo = null; } break; case "ForceClose": if (EnforceRequiredComment()) { eventText = "has closed the ticket by force"; TicketToDisplay.CurrentStatus = "Closed"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } break; } } TicketComment comment = null; if (eventText != null) { comment = new TicketComment(); comment.IsHtml = false; comment.CommentEvent = eventText; StringBuilder sb = new StringBuilder(); if (eventDetailItems != null) { foreach (var v in eventDetailItems) { sb.Append("<div class='MultiFieldEditContainer'>"); sb.Append("<div class='MultiFieldEditFactsContainer'>"); sb.Append(v); sb.Append("</div>"); sb.Append("</div>"); } } var commentText = Request.Form["comments"]; if (!string.IsNullOrEmpty(commentText)) { commentText = commentText.Trim(); } if (sb.Length > 1 && !string.IsNullOrEmpty(commentText)) { sb.Append("\n\n------------\n\n"); } if (!string.IsNullOrEmpty(commentText)) { sb.Append(commentText); } comment.Comment = sb.ToString(); } return comment; }
public bool Save(TicketComment eventComment) { var details = Request.Form["details"]; Dictionary<string, KeyValuePair<string, string>> fieldEventTextList = new Dictionary<string, KeyValuePair<string, string>>();//key is simple event test, value is full event text; if (TicketTitleEdit.Text != TicketToDisplay.Title) { fieldEventTextList.Add("изменить название", GetFieldEventValues(TicketToDisplay.Title, TicketTitleEdit.Text)); TicketToDisplay.Title = TicketTitleEdit.Text; } if (details != TicketToDisplay.Details) { fieldEventTextList.Add("изменить описание", GetFieldEventValues(string.Empty,string.Empty)); TicketToDisplay.IsHtml = false; TicketToDisplay.Details = details; } if (CategoryEdit.Enabled && CategoryEdit.SelectedValue != TicketToDisplay.Category) { fieldEventTextList.Add("изменить присвоенную категорию", GetFieldEventValues(TicketToDisplay.Category, CategoryEdit.SelectedValue)); TicketToDisplay.Category = CategoryEdit.SelectedValue; } if (PriorityEdit.Enabled && PriorityEdit.SelectedValue != TicketToDisplay.Priority && !string.IsNullOrEmpty(PriorityEdit.SelectedValue)) { fieldEventTextList.Add("сменить приоритет", GetFieldEventValues(TicketToDisplay.Priority, PriorityEdit.SelectedValue)); TicketToDisplay.Priority = PriorityEdit.SelectedValue; } if (OwnerEdit.Enabled && OwnerEdit.SelectedValue != TicketToDisplay.Owner) { fieldEventTextList.Add("назначить другого владельца", GetFieldEventValues(TicketToDisplay.Owner, OwnerEdit.SelectedValue)); TicketToDisplay.Owner = OwnerEdit.SelectedValue; } if (AffectsCustomerEdit.Checked != TicketToDisplay.AffectsCustomer) { KeyValuePair<string,string> e = GetFieldEventValues(((TicketToDisplay.AffectsCustomer) ? "Да" : "Нет"), ((AffectsCustomerEdit.Checked) ? "Да" : "Нет")); fieldEventTextList.Add("снять флажок влияния на администратора", e); TicketToDisplay.AffectsCustomer = AffectsCustomerEdit.Checked; } string[] tags = TagManager.GetTagsFromString(TagPickerEdit.TagList); string newTagList = string.Join(",", tags); if (newTagList != TicketToDisplay.TagList) { fieldEventTextList.Add("редактировать тэги", GetFieldEventValues(TicketToDisplay.TagList, newTagList)); TicketToDisplay.TicketTags.Clear(); foreach (string tag in tags) { TicketTag tTag = new TicketTag(); tTag.TagName = tag; TicketToDisplay.TicketTags.Add(tTag); } TicketToDisplay.TagList = newTagList; } if (fieldEventTextList.Count > 0) { if (fieldEventTextList.Count > 1) { eventComment.CommentEvent = "было отредактировано несколько полей,"; } else { foreach (var v in fieldEventTextList)//lazy, using foreach even though only one element... just a more convienient way to get at the content { if (v.Key == "изменить описание") { eventComment.CommentEvent = v.Key; } else { eventComment.CommentEvent = string.Format("{0} из {1} в {2}", v.Key, v.Value.Key, v.Value.Value); } } } if (string.IsNullOrEmpty(eventComment.Comment)) { eventComment.CommentEvent = eventComment.CommentEvent + " без комментариев"; } StringBuilder sb = new StringBuilder(); foreach (var v in fieldEventTextList) { sb.Append("<div class='MultiFieldEditContainer'>"); sb.Append("<div class='MiltiFieldEditFieldName'>"); string fromtoString = GetFieldEventValuesHtml(v.Value.Key, v.Value.Value); sb.Append(v.Key.Substring(0, 1).ToUpper() + v.Key.Substring(1)); sb.Append("</div>"); if (v.Key != "изменить выбранное описание") { sb.Append(fromtoString); } sb.Append("</div>"); } if (!string.IsNullOrEmpty(eventComment.Comment)) { sb.Append("\n\n------------\n\n"); sb.Append(eventComment.Comment); } eventComment.Comment = sb.ToString(); EditComplete(eventComment); return true; } else { return false; } }
void TicketActivityEditorControl_TicketActivityCompleted(TicketComment eventComment) { if (TicketActivityEditorControl.Activity == "EditTicket") { if (!TicketEditorControl.Save(eventComment)) { TicketActivityEditorControl.Activity = "NoChanges"; CloseTicketEditor(); return; } } TicketToDisplay.TicketComments.Add(eventComment); TicketPropertyChanged(eventComment); CloseActivityPanel(); PopulateDisplay(); }
void TicketEditorControl_TicketEditCompleted(TicketComment eventComment) { CloseTicketEditor(); }
void TicketPropertyChanged(TicketComment eventComment) { if (TicketChanged != null) { TicketChanged(eventComment); } PopulateDisplay(); }
private TicketComment PerformActivity() { List<string> eventDetailItems = null; string eventText = null; if (CheckIsActivityAllowed()) { switch (Activity) { case "NoChanges": break; case "EditTicket": eventText = "заявка отредактирована"; break; case "AddComment": if (EnforceRequiredComment()) { if (ResolvedCheckBoxContainer.Visible && ResolveCheckBox.Checked) { eventText = ResolveTicket(eventText); } else { eventText = "комментарий добавлен"; } } break; case "AddAttachments": eventDetailItems = new List<string>(); HttpFileCollection uploadedFiles = Request.Files; var newFiles = 0; var updatedFiles = 0; var removedFiles = 0; for (int i = 0; i < uploadedFiles.Count; i++) { HttpPostedFile userPostedFile = uploadedFiles[i]; if (userPostedFile.ContentLength > 0) { newFiles++; TicketAttachment attachment = new TicketAttachment(); string fName = Path.GetFileName(userPostedFile.FileName);//FileUploader.FileName; attachment.FileName = fName; var description = Page.Request.Form[fName]; if (!string.IsNullOrEmpty(description)) { if (description.Length > 500) { attachment.FileDescription = description.Substring(0, 500); } else { attachment.FileDescription = description; } } attachment.FileSize = userPostedFile.ContentLength;//FileUploader.PostedFile.ContentLength; string mtype = userPostedFile.ContentType; attachment.FileType = (string.IsNullOrEmpty(mtype) ? "application/octet-stream" : mtype); byte[] fileContent = new byte[userPostedFile.ContentLength]; userPostedFile.InputStream.Read(fileContent, 0, userPostedFile.ContentLength);//FileUploader.FileBytes; attachment.FileContents = fileContent; TicketToDisplay.TicketAttachments.Add(attachment); eventDetailItems.Add(string.Format("Новое приложение: {0}", attachment.FileName)); } foreach (RepeaterItem item in AttachmentsRepeater.Items) { if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem) { var AttachmentUpdateId = (HiddenField)item.FindControl("AttachmentUpdateId"); var AttachmentDescription = (TextBox)item.FindControl("AttachmentDescription"); var DeleteAttachmentCheckBox = (CheckBox)item.FindControl("DeleteAttachmentCheckBox"); var modAttachment = TicketToDisplay.TicketAttachments.SingleOrDefault(ta => ta.FileId == Convert.ToInt32(AttachmentUpdateId.Value)); if (DeleteAttachmentCheckBox.Checked) { eventDetailItems.Add(string.Format("Removed attachment: {0}", modAttachment.FileName)); removedFiles++; DeleteTicketAttachment(modAttachment.FileId); //TicketToDisplay.TicketAttachments.Remove(modAttachment); eventText = "приложение удалено"; } else if (modAttachment.FileDescription != AttachmentDescription.Text) { eventDetailItems.Add(string.Format("Updated attachment: {0}", modAttachment.FileName)); updatedFiles++; modAttachment.FileDescription = AttachmentDescription.Text; eventText = "изменения сохранены"; } } } if ((newFiles + removedFiles + updatedFiles) > 0) { eventText = "изменить приложение к заявке"; } } break; case "SupplyInfo": if (EnforceRequiredComment()) { if (SupplyInfoActivateTicketCheckBox.Checked) { eventText = "дополнительная информация предоставлена"; TicketToDisplay.CurrentStatus = "Active"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } else { eventText = "комментарий добавлен"; } } break; case "Resolve": if (EnforceRequiredComment()) { eventText = ResolveTicket(eventText); } break; case "RequestMoreInfo": if (EnforceRequiredComment()) { eventText = "запрос дополнительной информации отправлен"; TicketToDisplay.CurrentStatus = "More Info"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } break; case "CancelMoreInfo": eventText = GetOptionalCommentEventText("запрос дополнительной информации отменен"); TicketToDisplay.CurrentStatus = "Active"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; break; case "CloseTicket": eventText = GetOptionalCommentEventText("заявка закрыта"); TicketToDisplay.CurrentStatus = "Closed"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; break; case "ReopenTicket": if (EnforceRequiredComment()) { eventText = "заявка снова открыта"; if ((SecurityManager.IsStaff && Page.User.Identity.GetFormattedUserName() != TicketToDisplay.Owner && ReopenOwnedByMe.Checked) || (!SecurityManager.IsStaff && Page.User.Identity.GetFormattedUserName() != TicketToDisplay.Owner)) { TicketToDisplay.Owner = Page.User.Identity.GetFormattedUserName(); eventText = eventText + " как владелец"; } if (SecurityManager.IsStaff && ReopenAssignToMe.Checked) { TicketToDisplay.AssignedTo = Page.User.Identity.GetFormattedUserName(); eventText = eventText + "назначить на себя"; } else { TicketToDisplay.AssignedTo = null; } TicketToDisplay.CurrentStatus = "Active"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } break; case "TakeOver": TicketToDisplay.CurrentStatus = "Active"; string oldAssigned = TicketToDisplay.AssignedTo; if (!string.IsNullOrEmpty(oldAssigned)) { eventText = GetOptionalCommentEventText(string.Format("заявку принял от - {0}", SecurityManager.GetUserDisplayName(oldAssigned))); } else { eventText = GetOptionalCommentEventText("принял заявку на себя"); } TicketToDisplay.AssignedTo = Page.User.Identity.GetFormattedUserName(); break; case "Assign": TicketToDisplay.CurrentStatus = "Active"; string oldAssignedDisplay = SecurityManager.GetUserDisplayName(TicketToDisplay.AssignedTo); string newAssignedDisplay = SecurityManager.GetUserDisplayName(AssignDropDownList.SelectedValue); if (string.IsNullOrEmpty(TicketToDisplay.AssignedTo)) { eventText = string.Format("заявка назначена - {0}", newAssignedDisplay); } else if (TicketToDisplay.AssignedTo == Page.User.Identity.Name) { eventText = string.Format("заявка пришла от {0}", newAssignedDisplay); } else { eventText = string.Format("заявка переназначена от {0} - {1}", oldAssignedDisplay, newAssignedDisplay); } if (TicketToDisplay.Priority != PriorityEdit.SelectedValue) { TicketToDisplay.Priority = PriorityEdit.SelectedValue; eventText = string.Format("{0} с приоритетом {1}", eventText, TicketToDisplay.Priority); } eventText = GetOptionalCommentEventText(eventText); TicketToDisplay.AssignedTo = AssignDropDownList.SelectedValue; break; case "GiveUp": if (EnforceRequiredComment()) { eventText = "отказался от заявки"; TicketToDisplay.AssignedTo = null; } break; case "ForceClose": if (EnforceRequiredComment()) { eventText = "заявка закрыта принудительно"; TicketToDisplay.CurrentStatus = "Closed"; TicketToDisplay.CurrentStatusSetBy = Page.User.Identity.GetFormattedUserName(); TicketToDisplay.CurrentStatusDate = DateTime.Now; } break; } } TicketComment comment = null; if (eventText != null) { comment = new TicketComment(); comment.IsHtml = false; comment.CommentEvent = eventText; StringBuilder sb = new StringBuilder(); if (eventDetailItems != null) { foreach (var v in eventDetailItems) { sb.Append("<div class='MultiFieldEditContainer'>"); sb.Append("<div class='MultiFieldEditFactsContainer'>"); sb.Append(v); sb.Append("</div>"); sb.Append("</div>"); } } var commentText = Request.Form["comments"]; if (!string.IsNullOrEmpty(commentText)) { commentText = commentText.Trim(); } if (sb.Length > 1 && !string.IsNullOrEmpty(commentText)) { sb.Append("\n\n------------\n\n"); } if (!string.IsNullOrEmpty(commentText)) { sb.Append(commentText); } comment.Comment = sb.ToString(); } return comment; }
public Ticket GetNewTicket() { string details = Page.Request.Form["details"]; Ticket ticket = null; if (Page.IsValid) { if (!string.IsNullOrEmpty(details)) { DateTime now = DateTime.Now; string user = Page.User.Identity.GetFormattedUserName(); ticket = new Ticket(); ticket.Type = TypeDropDownList.SelectedValue; ticket.Category = CategoryDropDownList.SelectedValue; ticket.Title = TitleTextBox.Text; ticket.IsHtml = false; ticket.Details = details; if (!string.IsNullOrEmpty(PriorityDropDownList.SelectedValue)) { ticket.Priority = PriorityDropDownList.SelectedValue; } string[] tags = TagManager.GetTagsFromString(TagPickerControl.TagList); ticket.TagList = string.Join(",", tags); ticket.AffectsCustomer = AffectsCustomerCheckBox.Checked; ticket.PublishedToKb = false; ticket.CreatedBy = user; ticket.CreatedDate = now; if (CreateOnBehalfTextBox.Checked) { ticket.Owner = OwnerDropDownList.SelectedValue; } else { ticket.Owner = user; } ticket.CurrentStatus = "Active"; ticket.CurrentStatusSetBy = user; ticket.CurrentStatusDate = now; TicketComment openingComment = new TicketComment(); if (CreateOnBehalfTextBox.Checked) { openingComment.CommentEvent = string.Format("created the ticket on behalf of {0}", SecurityManager.GetUserDisplayName(ticket.Owner)); } else { openingComment.CommentEvent = string.Format("created the ticket"); } openingComment.CommentedBy = user; openingComment.CommentedDate = now; HttpFileCollection uploadedFiles = Request.Files; for (int i = 0; i < uploadedFiles.Count; i++) { HttpPostedFile userPostedFile = uploadedFiles[i]; if (userPostedFile.ContentLength > 0) { TicketAttachment attachment = new TicketAttachment(); string fName = Path.GetFileName(userPostedFile.FileName);//FileUploader.FileName; attachment.FileName = fName; var description = Page.Request.Form[fName]; if (!string.IsNullOrEmpty(description)) { if (description.Length > 500) { attachment.FileDescription = description.Substring(0, 500); } else { attachment.FileDescription = description; } } attachment.FileSize = userPostedFile.ContentLength;//FileUploader.PostedFile.ContentLength; string mtype = userPostedFile.ContentType; attachment.FileType = (string.IsNullOrEmpty(mtype) ? "application/octet-stream" : mtype); byte[] fileContent = new byte[userPostedFile.ContentLength]; userPostedFile.InputStream.Read(fileContent, 0, userPostedFile.ContentLength);//FileUploader.FileBytes; attachment.FileContents = fileContent; ticket.TicketAttachments.Add(attachment); } } ticket.TicketComments.Add(openingComment); foreach (string tag in tags) { TicketTag tTag = new TicketTag(); tTag.TagName = tag; ticket.TicketTags.Add(tTag); } } else { lblDetailsRequired.Visible = true; } } return ticket; }
private void attach_TicketComments(TicketComment entity) { this.SendPropertyChanging(); entity.Ticket = this; }
public bool Save(TicketComment eventComment) { var details = Request.Form["details"]; Dictionary<string, KeyValuePair<string, string>> fieldEventTextList = new Dictionary<string, KeyValuePair<string, string>>();//key is simple event test, value is full event text; if (TicketTitleEdit.Text != TicketToDisplay.Title) { fieldEventTextList.Add("changed ticket's title", GetFieldEventValues(TicketToDisplay.Title, TicketTitleEdit.Text)); TicketToDisplay.Title = TicketTitleEdit.Text; } if (details != TicketToDisplay.Details) { fieldEventTextList.Add("changed ticket's details", GetFieldEventValues(string.Empty,string.Empty)); TicketToDisplay.IsHtml = false; TicketToDisplay.Details = details; } if (CategoryEdit.Enabled && CategoryEdit.SelectedValue != TicketToDisplay.Category) { fieldEventTextList.Add("changed ticket's category", GetFieldEventValues(TicketToDisplay.Category, CategoryEdit.SelectedValue)); TicketToDisplay.Category = CategoryEdit.SelectedValue; } if (PriorityEdit.Enabled && PriorityEdit.SelectedValue != TicketToDisplay.Priority && !string.IsNullOrEmpty(PriorityEdit.SelectedValue)) { fieldEventTextList.Add("changed ticket's priority", GetFieldEventValues(TicketToDisplay.Priority, PriorityEdit.SelectedValue)); TicketToDisplay.Priority = PriorityEdit.SelectedValue; } if (OwnerEdit.Enabled && OwnerEdit.SelectedValue != TicketToDisplay.Owner) { fieldEventTextList.Add("changed ticket's owner", GetFieldEventValues(TicketToDisplay.Owner, OwnerEdit.SelectedValue)); TicketToDisplay.Owner = OwnerEdit.SelectedValue; } if (AffectsCustomerEdit.Checked != TicketToDisplay.AffectsCustomer) { KeyValuePair<string,string> e = GetFieldEventValues(((TicketToDisplay.AffectsCustomer) ? "Yes" : "No"), ((AffectsCustomerEdit.Checked) ? "Yes" : "No")); fieldEventTextList.Add("changed ticket's affects customer flag", e); TicketToDisplay.AffectsCustomer = AffectsCustomerEdit.Checked; } string[] tags = TagManager.GetTagsFromString(TagPickerEdit.TagList); string newTagList = string.Join(",", tags); if (newTagList != TicketToDisplay.TagList) { fieldEventTextList.Add("changed ticket's tags", GetFieldEventValues(TicketToDisplay.TagList, newTagList)); TicketToDisplay.TicketTags.Clear(); foreach (string tag in tags) { TicketTag tTag = new TicketTag(); tTag.TagName = tag; TicketToDisplay.TicketTags.Add(tTag); } TicketToDisplay.TagList = newTagList; } if (fieldEventTextList.Count > 0) { if (fieldEventTextList.Count > 1) { eventComment.CommentEvent = "has edited multiple fields"; } else { foreach (var v in fieldEventTextList)//lazy, using foreach even though only one element... just a more convienient way to get at the content { if (v.Key == "changed ticket's details") { eventComment.CommentEvent = v.Key; } else { eventComment.CommentEvent = string.Format("{0} from {1} to {2}", v.Key, v.Value.Key, v.Value.Value); } } } if (string.IsNullOrEmpty(eventComment.Comment)) { eventComment.CommentEvent = eventComment.CommentEvent + " without comment"; } StringBuilder sb = new StringBuilder(); foreach (var v in fieldEventTextList) { sb.Append("<div class='MultiFieldEditContainer'>"); sb.Append("<div class='MiltiFieldEditFieldName'>"); string fromtoString = GetFieldEventValuesHtml(v.Value.Key, v.Value.Value); sb.Append(v.Key.Substring(0, 1).ToUpper() + v.Key.Substring(1)); sb.Append("</div>"); if (v.Key != "changed ticket's details") { sb.Append(fromtoString); } sb.Append("</div>"); } if (!string.IsNullOrEmpty(eventComment.Comment)) { sb.Append("\n\n------------\n\n"); sb.Append(eventComment.Comment); } eventComment.Comment = sb.ToString(); EditComplete(eventComment); return true; } else { return false; } }
private void detach_TicketComments(TicketComment entity) { this.SendPropertyChanging(); entity.Ticket = null; }
void TicketChanged(TicketComment eventComment) { //DisplayTicketView.EnableEditControls = (DisplayTicketView.TicketToDisplay.CurrentStatus != "Closed"); ctx.SubmitChanges(); NotificationService.QueueTicketEventNotification(eventComment); }
private static void SaveRenamedTicketTypes(string[] newSettings, string oldTypeName, string newTypeName, bool commitChanges) { string user = HttpContext.Current.User.Identity.GetUserDisplayName(); string evt = string.Format("renamed the ticket type from {0} to {1} globally.", oldTypeName, newTypeName); var tickets = ctx.Tickets.Where(t => t.Type == oldTypeName); foreach(Ticket ticket in tickets) { ticket.Type = newTypeName; TicketComment comment = new TicketComment(); comment.IsHtml = false; comment.CommentedBy = user; comment.CommentEvent = evt; ticket.TicketComments.Add(comment); } if(commitChanges) { ctx.SubmitChanges(); } }