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);
 }
Exemple #4
0
        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();
     }
 }